diff --git a/src/main/java/com/amihaiemil/docker/Images.java b/src/main/java/com/amihaiemil/docker/Images.java index 76cbd371..d2dae2c3 100644 --- a/src/main/java/com/amihaiemil/docker/Images.java +++ b/src/main/java/com/amihaiemil/docker/Images.java @@ -28,6 +28,7 @@ import java.io.IOException; import java.io.Reader; import java.net.URL; +import java.util.Map; /** * Images API. @@ -37,10 +38,6 @@ * @since 0.0.1 * @todo #98:30min Continue implementing the rest of the operations for the * Images interface. See the docs referenced above for more details. - * @todo #144:30min Add the filter(Map) method which will - * filter the given instance of Images. If filter() is called more times, - * all of the specified filters should amount and be applied to the last - * resulting Images instance. * @todo #152:30min Add Fake implementations of Images and Image, in order to * unit test method save() and other future methods which may require more * than 1 HTTP request. Currently, the unit testing infrastructure does @@ -94,6 +91,14 @@ Image importImage( */ Reader save() throws IOException, UnexpectedResponseException; + /** + * Filter these images. + * @param filters Filters to apply. + * @return Filtered images. + * @see Docker API Docs + */ + Images filter(Map> filters); + /** * Return the Docker engine where these Images came from. * @return Docker. diff --git a/src/main/java/com/amihaiemil/docker/ListedImages.java b/src/main/java/com/amihaiemil/docker/ListedImages.java index 40bcf7b2..e932344c 100644 --- a/src/main/java/com/amihaiemil/docker/ListedImages.java +++ b/src/main/java/com/amihaiemil/docker/ListedImages.java @@ -29,6 +29,7 @@ import org.apache.http.client.methods.HttpGet; import java.net.URI; import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; import java.util.Map; import javax.json.Json; @@ -107,4 +108,18 @@ public Iterator iterator() { ) ); } + + @Override + public Images filter(final Map> fltrs) { + final Map> merged = new HashMap<>( + this.filters + ); + merged.putAll(fltrs); + return new ListedImages( + super.client(), + this.baseUri(), + this.docker(), + merged + ); + } } diff --git a/src/test/java/com/amihaiemil/docker/ListedImagesTestCase.java b/src/test/java/com/amihaiemil/docker/ListedImagesTestCase.java index 54d6951b..b3e9c674 100644 --- a/src/test/java/com/amihaiemil/docker/ListedImagesTestCase.java +++ b/src/test/java/com/amihaiemil/docker/ListedImagesTestCase.java @@ -128,4 +128,49 @@ public void includeFiltersInRequest() { ).iterator(); } + /** + * {@link ListedImages} can include filters added in filter(), in addition + * to those provided via ctor, in request to fetch images. + */ + @Test + public void includeAddedFiltersInRequest() { + final Map> initial = new HashMap<>(); + initial.put( + "label", + Arrays.asList( + "maintainer=john@doe.org", + "randomLabel=test" + ) + ); + final Map> added = new HashMap<>(); + added.put("dangling", Arrays.asList("true")); + new ListedImages( + new AssertRequest( + new Response( + HttpStatus.SC_OK, + "[{\"Id\": \"abc1\"}, {\"Id\":\"cde2\"}]" + ), + new Condition( + // @checkstyle LineLength (12 lines) + "iterate() query parameters must include the filters provided", + req -> { + final List params = new UncheckedUriBuilder( + req.getRequestLine().getUri() + ).getQueryParams(); + // @checkstyle BooleanExpressionComplexity (6 lines) + return params.size() == 1 + && "filters".equals(params.get(0).getName()) + && params.get(0).getValue().contains("label") + && params.get(0).getValue().contains("\"maintainer=john@doe.org\"") + && params.get(0).getValue().contains("\"randomLabel=test\"") + && params.get(0).getValue().contains("\"dangling\":[\"true\"]"); + } + ) + ), + URI.create("http://localhost/images"), + Mockito.mock(Docker.class), + initial + ).filter(added).iterator(); + } + } diff --git a/src/test/java/com/amihaiemil/docker/RtImagesITCase.java b/src/test/java/com/amihaiemil/docker/RtImagesITCase.java index 63660423..c6413034 100644 --- a/src/test/java/com/amihaiemil/docker/RtImagesITCase.java +++ b/src/test/java/com/amihaiemil/docker/RtImagesITCase.java @@ -35,6 +35,7 @@ * @author Mihai Andronache (amihaiemil@gmail.com) * @version $Id$ * @since 0.0.1 + * @todo #153:30min Add integration tests for filters. */ public final class RtImagesITCase {