From c91f58978b5f9a8760ba42a65ad3c2c0f69cabe3 Mon Sep 17 00:00:00 2001 From: Jesper Zedlitz <jesper@zedlitz.de> Date: Mon, 7 Feb 2022 14:54:47 +0100 Subject: [PATCH] =?UTF-8?q?Test=20f=C3=BCr=20FilterController?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 199 +++++++++++------- .../catalogproxy/FilterController.java | 22 +- .../catalogproxy/FilterControllerTest.java | 105 +++++++++ 3 files changed, 239 insertions(+), 87 deletions(-) create mode 100644 src/test/java/de/landsh/opendata/catalogproxy/FilterControllerTest.java diff --git a/pom.xml b/pom.xml index 9330731..36be6af 100644 --- a/pom.xml +++ b/pom.xml @@ -1,78 +1,125 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> +<?xml version="1.0" encoding="utf-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-parent</artifactId> + <version>2.6.3</version> + <relativePath /> + </parent> + <groupId>de.landsh.opendata</groupId> + <artifactId>dcat-catalog-proxy</artifactId> + <version>1.2</version> + <name>dcat-catalog-proxy</name> + <description>DCAT catalog proxy</description> + <properties> + <java.version>1.8</java.version> + <jena.version>4.4.0</jena.version> + </properties> + <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + <exclusions> + <exclusion> + <groupId>org.junit.vintage</groupId> + <artifactId>junit-vintage-engine</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.apache.jena</groupId> + <artifactId>jena-core</artifactId> + <version>${jena.version}</version> + <exclusions> + <exclusion> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.apache.jena</groupId> + <artifactId>jena-arq</artifactId> + <version>${jena.version}</version> + <exclusions> + <exclusion> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.mock-server</groupId> + <artifactId>mockserver-netty</artifactId> + <version>5.11.2</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.mock-server</groupId> + <artifactId>mockserver-client-java</artifactId> + <version>5.11.2</version> + <scope>test</scope> + </dependency> + </dependencies> + <build> + <plugins> + <plugin> <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-parent</artifactId> - <version>2.6.3</version> - <relativePath/> - </parent> - - <groupId>de.landsh.opendata</groupId> - <artifactId>dcat-catalog-proxy</artifactId> - <version>1.2</version> - <name>dcat-catalog-proxy</name> - <description>DCAT catalog proxy</description> - - <properties> - <java.version>1.8</java.version> - <jena.version>4.4.0</jena.version> - </properties> - - <dependencies> - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter</artifactId> - </dependency> - - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-web</artifactId> - </dependency> - - <dependency> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-test</artifactId> - <scope>test</scope> - <exclusions> - <exclusion> - <groupId>org.junit.vintage</groupId> - <artifactId>junit-vintage-engine</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>org.apache.jena</groupId> - <artifactId>jena-core</artifactId> - <version>${jena.version}</version> - <exclusions> - <exclusion> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-log4j12</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>org.apache.jena</groupId> - <artifactId>jena-arq</artifactId> - <version>${jena.version}</version> - <exclusions> - <exclusion> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-log4j12</artifactId> - </exclusion> - </exclusions> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-maven-plugin</artifactId> - </plugin> - </plugins> - </build> - + <artifactId>spring-boot-maven-plugin</artifactId> + </plugin> + <plugin> + <groupId>org.jacoco</groupId> + <artifactId>jacoco-maven-plugin</artifactId> + <version>0.8.7</version> + <executions> + <execution> + <id>coverage-initialize</id> + <goals> + <goal>prepare-agent</goal> + </goals> + </execution> + <execution> + <id>coverage-report</id> + <phase>post-integration-test</phase> + <goals> + <goal>report</goal> + </goals> + </execution> + <execution> + <id>coverage-check</id> + <goals> + <goal>check</goal> + </goals> + <configuration> + <rules> + <rule> + <element>CLASS</element> + <excludes> + <exclude>de.landsh.opendata.catalogproxy.DcatCatalogProxyApplication</exclude> + </excludes> + <limits> + <limit> + <counter>LINE</counter> + <value>COVEREDRATIO</value> + <minimum>80%</minimum> + </limit> + </limits> + </rule> + </rules> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> </project> diff --git a/src/main/java/de/landsh/opendata/catalogproxy/FilterController.java b/src/main/java/de/landsh/opendata/catalogproxy/FilterController.java index 4b171c5..2434b5c 100644 --- a/src/main/java/de/landsh/opendata/catalogproxy/FilterController.java +++ b/src/main/java/de/landsh/opendata/catalogproxy/FilterController.java @@ -4,7 +4,6 @@ import org.apache.commons.lang3.StringUtils; import org.apache.jena.rdf.model.Model; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @@ -20,18 +19,19 @@ import java.net.URLEncoder; @Controller public class FilterController { private static final Logger log = LoggerFactory.getLogger(FilterController.class); - + private final CatalogFilter catalogFilter; @Value("${remoteURL:https://opendata.schleswig-holstein.de/}") - private String remoteURL; + String remoteURL; - @Autowired - private CatalogFilter catalogFilter; + public FilterController(CatalogFilter filter) { + this.catalogFilter = filter; + } @RequestMapping(value = "/catalog.xml", produces = "application/rdf+xml") public void catalog(@RequestParam(required = false) Integer page, - @RequestParam(required = false) String q, - @RequestParam(required = false) String fq, - @RequestParam(required = false, name="modified_since") String modifiedSince, + @RequestParam(required = false) String q, + @RequestParam(required = false) String fq, + @RequestParam(required = false, name = "modified_since") String modifiedSince, HttpServletResponse response) throws IOException { if (page == null) page = 1; @@ -41,15 +41,15 @@ public class FilterController { final StringBuilder url = new StringBuilder(remoteURL); url.append("catalog.xml?page="); url.append(page); - if(StringUtils.isNotBlank(modifiedSince)) { + if (StringUtils.isNotBlank(modifiedSince)) { url.append("&modified_since="); url.append(URLEncoder.encode(modifiedSince, "utf-8")); } - if(StringUtils.isNotBlank(q)) { + if (StringUtils.isNotBlank(q)) { url.append("&q="); url.append(URLEncoder.encode(q, "utf-8")); } - if(StringUtils.isNotBlank(fq)) { + if (StringUtils.isNotBlank(fq)) { url.append("&fq="); url.append(URLEncoder.encode(fq, "utf-8")); } diff --git a/src/test/java/de/landsh/opendata/catalogproxy/FilterControllerTest.java b/src/test/java/de/landsh/opendata/catalogproxy/FilterControllerTest.java new file mode 100644 index 0000000..561e774 --- /dev/null +++ b/src/test/java/de/landsh/opendata/catalogproxy/FilterControllerTest.java @@ -0,0 +1,105 @@ +package de.landsh.opendata.catalogproxy; + +import org.apache.jena.rdf.model.ModelFactory; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.mockserver.client.MockServerClient; +import org.mockserver.integration.ClientAndServer; +import org.mockserver.model.Header; +import org.mockserver.model.HttpStatusCode; +import org.springframework.mock.web.MockHttpServletResponse; + +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockserver.integration.ClientAndServer.startClientAndServer; +import static org.mockserver.matchers.Times.unlimited; +import static org.mockserver.model.HttpRequest.request; +import static org.mockserver.model.HttpResponse.response; + +public class FilterControllerTest { + private static ClientAndServer mockServer; + CatalogFilter catalogFilter = Mockito.mock(CatalogFilter.class); + MockHttpServletResponse response = new MockHttpServletResponse(); + FilterController controller = new FilterController(catalogFilter); + + @BeforeAll + public static void startServer() throws IOException { + mockServer = startClientAndServer(1080); + + + } + + @AfterAll + public static void stopServer() { + mockServer.stop(); + } + + @BeforeEach + public void setUp() { + Mockito.when(catalogFilter.work(any())).thenReturn(ModelFactory.createDefaultModel()); + + controller.remoteURL = "http://localhost:" + mockServer.getPort() + "/"; + } + + @Test + public void catalog_all_parameters() throws IOException { + byte[] rawdata = "<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:dcat=\"http://www.w3.org/ns/dcat#\"><dcat:Catalog rdf:about=\"https://opendata.schleswig-holstein.de\"></dcat:Catalog></rdf:RDF>".getBytes(); + + new MockServerClient("127.0.0.1", mockServer.getPort()) + .when( + request() + .withMethod("GET") + .withPath("/catalog.xml") + .withQueryStringParameter("page", "5") + .withQueryStringParameter("q", "myquery") + .withQueryStringParameter("modified_since","2022-02-07") + .withQueryStringParameter("fq", "org:zit"), + unlimited()) + .respond( + response() + .withStatusCode(HttpStatusCode.OK_200.code()) + .withHeaders( + new Header("Content-Type", "application/xml")) + .withBody(rawdata) + ); + + controller.catalog(5, "myquery", "org:zit", "2022-02-07", response); + + assertEquals("<rdf:RDF\n" + + " xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n" + + "</rdf:RDF>\n", response.getContentAsString()); + } + + @Test + public void catalog_all_null() throws IOException { + byte[] rawdata = "<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:dcat=\"http://www.w3.org/ns/dcat#\"><dcat:Catalog rdf:about=\"https://opendata.schleswig-holstein.de\"></dcat:Catalog></rdf:RDF>".getBytes(); + + new MockServerClient("127.0.0.1", mockServer.getPort()) + .when( + request() + .withMethod("GET") + .withPath("/catalog.xml") + .withQueryStringParameter("page", "1"), + unlimited()) + .respond( + response() + .withStatusCode(HttpStatusCode.OK_200.code()) + .withHeaders( + new Header("Content-Type", "application/xml")) + .withBody(rawdata) + ); + + + controller.catalog(null, null, null, null, response); + + assertEquals("application/rdf+xml;charset=utf-8", response.getContentType()); + assertEquals("<rdf:RDF\n" + + " xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\">\n" + + "</rdf:RDF>\n", response.getContentAsString()); + } +} -- GitLab