From ade0b657205b87223d7c85a5901039213cc845cb Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Sat, 20 Jan 2018 00:28:32 +0100 Subject: [PATCH] Fixed some tests and broken dependencies --- pom.xml | 2 +- .../webclient/http-server/build.gradle | 2 +- .../sampleJerseyProject/build.gradle | 4 +- .../functionalTest/sampleProject/build.gradle | 2 +- .../scenarioProject/build.gradle | 2 +- .../sampleJerseyProject/build.gradle | 17 ++---- .../out/production/resources/application.yml | 1 + .../cloud/frauddetection/Application.java | 24 -------- .../frauddetection/FraudRestApplication.java | 13 ----- .../org/springframework/cloud/MvcSpec.groovy | 52 +++++++++--------- .../org/springframework/cloud/MvcTest.java | 50 ++++++++--------- .../gradle/wrapper/gradle-wrapper.jar | Bin 52928 -> 54208 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- .../shouldMarkClientAsFraud.json | 26 +++++++++ .../shouldMarkClientAsNotFraud.json | 26 +++++++++ .../shouldMarkClientAsFraud.json | 23 -------- .../shouldMarkClientAsNotFraud.json | 23 -------- .../functionalTest/sampleProject/build.gradle | 2 +- .../scenarioProject/build.gradle | 2 +- 19 files changed, 121 insertions(+), 154 deletions(-) create mode 100644 spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/fraudDetectionService/out/production/resources/application.yml delete mode 100644 spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/fraudDetectionService/src/main/java/org/springframework/cloud/frauddetection/Application.java delete mode 100644 spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/fraudDetectionService/src/main/java/org/springframework/cloud/frauddetection/FraudRestApplication.java create mode 100644 spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/loanApplicationService/src/test/resources/mappings/META-INF/com.example.jersey/fraudDetectionService/unspecified/mappings/contracts/com/example/jersey/fraudDetectionService/shouldMarkClientAsFraud.json create mode 100644 spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/loanApplicationService/src/test/resources/mappings/META-INF/com.example.jersey/fraudDetectionService/unspecified/mappings/contracts/com/example/jersey/fraudDetectionService/shouldMarkClientAsNotFraud.json delete mode 100644 spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/loanApplicationService/src/test/resources/mappings/fraudDetectionService/shouldMarkClientAsFraud.json delete mode 100644 spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/loanApplicationService/src/test/resources/mappings/fraudDetectionService/shouldMarkClientAsNotFraud.json diff --git a/pom.xml b/pom.xml index ad304aff5f..52d4351e53 100644 --- a/pom.xml +++ b/pom.xml @@ -83,7 +83,7 @@ org.springframework.amqp spring-rabbit - 2.0.0.M4 + 2.0.0.BUILD-SNAPSHOT org.mockito diff --git a/samples/standalone/webclient/http-server/build.gradle b/samples/standalone/webclient/http-server/build.gradle index 7e25104e70..dee33d22da 100644 --- a/samples/standalone/webclient/http-server/build.gradle +++ b/samples/standalone/webclient/http-server/build.gradle @@ -43,7 +43,7 @@ dependencies { compile("org.springframework.boot:spring-boot-starter-actuator") testCompile 'org.springframework.boot:spring-boot-starter-test' - testCompile 'org.springframework.restdocs:spring-restdocs-mockmvc' + testCompile 'org.springframework.restdocs:spring-restdocs-webtestclient' testCompile 'org.springframework.cloud:spring-cloud-contract-wiremock' } diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/out/test/resources/functionalTest/sampleJerseyProject/build.gradle b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/out/test/resources/functionalTest/sampleJerseyProject/build.gradle index 0f9de2c136..5105616b15 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/out/test/resources/functionalTest/sampleJerseyProject/build.gradle +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/out/test/resources/functionalTest/sampleJerseyProject/build.gradle @@ -23,7 +23,7 @@ buildscript { maven { url "http://repo.spring.io/release" } } dependencies { - classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.0.M3") + classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.0.BUILD-SNAPSHOT") } } @@ -149,4 +149,4 @@ configure(project(':loanApplicationService')) { wrapper { gradleVersion '3.5' -} \ No newline at end of file +} diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/out/test/resources/functionalTest/sampleProject/build.gradle b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/out/test/resources/functionalTest/sampleProject/build.gradle index 1a63d36f7e..cf55cbe6ea 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/out/test/resources/functionalTest/sampleProject/build.gradle +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/out/test/resources/functionalTest/sampleProject/build.gradle @@ -23,7 +23,7 @@ buildscript { maven { url "http://repo.spring.io/release" } } dependencies { - classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.0.M3") + classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.0.BUILD-SNAPSHOT") } } diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/out/test/resources/functionalTest/scenarioProject/build.gradle b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/out/test/resources/functionalTest/scenarioProject/build.gradle index 6921a6f2ab..97fddcb286 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/out/test/resources/functionalTest/scenarioProject/build.gradle +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/out/test/resources/functionalTest/scenarioProject/build.gradle @@ -23,7 +23,7 @@ buildscript { maven { url "http://repo.spring.io/release" } } dependencies { - classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.0.M3") + classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.0.BUILD-SNAPSHOT") } } diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/build.gradle b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/build.gradle index fa95aa24ce..827ee5fd53 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/build.gradle +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/build.gradle @@ -23,7 +23,7 @@ buildscript { maven { url "http://repo.spring.io/release" } } dependencies { - classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.0.M3") + classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.0.BUILD-SNAPSHOT") } } @@ -65,28 +65,24 @@ configure([project(':fraudDetectionService'), project(':loanApplicationService') apply plugin: 'io.spring.dependency-management' apply plugin: 'maven-publish' - ext['jetty.version'] = '9.2.17.v20160517' - jar { version = '0.0.1' } + bootJar { + enabled = false + } + configurations { compile.exclude module: "spring-boot-starter-tomcat" } dependencies { - compile('org.glassfish.jersey.containers:jersey-container-jetty-http:2.23.2') { - exclude group: 'org.eclipse.jetty' - } compile 'org.springframework.boot:spring-boot-starter-jersey' compile 'org.springframework.boot:spring-boot-starter-jetty' testRuntime "org.spockframework:spock-spring:$spockVersion" - compile('org.glassfish.jersey.connectors:jersey-apache-connector:2.23.2') { - exclude group: 'org.eclipse.jetty' - } testCompile "org.mockito:mockito-core" testCompile "org.springframework:spring-test" testCompile "org.springframework.boot:spring-boot-test" @@ -118,7 +114,6 @@ configure(project(':fraudDetectionService')) { contractsDir = file("mappings") stubsOutputDirRoot = file("${project.buildDir}/production/${project.name}-stubs/") } - ext['jetty.version'] = '9.2.17.v20160517' contracts { stubsMode = "REMOTE" @@ -149,5 +144,5 @@ configure(project(':loanApplicationService')) { } wrapper { - gradleVersion '3.5' + gradleVersion '4.0.2' } \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/fraudDetectionService/out/production/resources/application.yml b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/fraudDetectionService/out/production/resources/application.yml new file mode 100644 index 0000000000..1c421cf2b7 --- /dev/null +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/fraudDetectionService/out/production/resources/application.yml @@ -0,0 +1 @@ +server.port=0 \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/fraudDetectionService/src/main/java/org/springframework/cloud/frauddetection/Application.java b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/fraudDetectionService/src/main/java/org/springframework/cloud/frauddetection/Application.java deleted file mode 100644 index e671a56892..0000000000 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/fraudDetectionService/src/main/java/org/springframework/cloud/frauddetection/Application.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.springframework.cloud.frauddetection; - -import org.glassfish.jersey.server.ResourceConfig; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; - -@Configuration -@EnableAutoConfiguration -@ComponentScan -public class Application { - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } - - @Bean - ResourceConfig resourceConfig() { - return ResourceConfig.forApplication(new FraudRestApplication()); - } - -} diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/fraudDetectionService/src/main/java/org/springframework/cloud/frauddetection/FraudRestApplication.java b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/fraudDetectionService/src/main/java/org/springframework/cloud/frauddetection/FraudRestApplication.java deleted file mode 100644 index 064e59196b..0000000000 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/fraudDetectionService/src/main/java/org/springframework/cloud/frauddetection/FraudRestApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.springframework.cloud.frauddetection; - -import java.util.Collections; -import java.util.Set; - -public class FraudRestApplication extends javax.ws.rs.core.Application { - - @Override - public Set> getClasses() { - return Collections.>singleton(FraudDetectionController.class); - } - -} \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/fraudDetectionService/src/test/groovy/org/springframework/cloud/MvcSpec.groovy b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/fraudDetectionService/src/test/groovy/org/springframework/cloud/MvcSpec.groovy index 64055ec4fc..56b4561ad4 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/fraudDetectionService/src/test/groovy/org/springframework/cloud/MvcSpec.groovy +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/fraudDetectionService/src/test/groovy/org/springframework/cloud/MvcSpec.groovy @@ -1,7 +1,7 @@ /* * Copyright 2013-2017 the original author or authors. * - * Licensed under the Apache License, Version 2.0 (the "License"); + * Licensed under the Apache License, Version 2.0 (the "License") * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * @@ -15,22 +15,21 @@ */ package org.springframework.cloud -import org.springframework.cloud.frauddetection.Application -import org.springframework.cloud.frauddetection.FraudRestApplication -import org.eclipse.jetty.server.Server -import org.glassfish.jersey.apache.connector.ApacheConnectorProvider -import org.glassfish.jersey.client.ClientConfig -import org.glassfish.jersey.jetty.JettyHttpContainerFactory -import org.glassfish.jersey.server.ResourceConfig -import org.springframework.context.annotation.AnnotationConfigApplicationContext -import spock.lang.Shared -import spock.lang.Specification import javax.ws.rs.client.Client import javax.ws.rs.client.ClientBuilder import javax.ws.rs.client.WebTarget import javax.ws.rs.core.UriBuilder +import org.eclipse.jetty.server.Server +import org.eclipse.jetty.servlet.ServletContextHandler +import org.eclipse.jetty.servlet.ServletHolder +import org.glassfish.jersey.client.ClientConfig +import spock.lang.Shared +import spock.lang.Specification + +import org.springframework.cloud.frauddetection.FraudDetectionController + import static org.springframework.util.SocketUtils.findAvailableTcpPort abstract class MvcSpec extends Specification { @@ -45,21 +44,24 @@ abstract class MvcSpec extends Specification { private Client client def setupSpec() { - - URI baseUri = UriBuilder.fromUri("http://localhost").port(findAvailableTcpPort(8000)).build() - - - ResourceConfig resourceConfig = ResourceConfig.forApplication(new FraudRestApplication()) - resourceConfig.property("contextConfig", new AnnotationConfigApplicationContext(Application)) - server = JettyHttpContainerFactory.createServer(baseUri, resourceConfig, true) - - ClientConfig clientConfig = new ClientConfig() - clientConfig.connectorProvider(new ApacheConnectorProvider()) - client = ClientBuilder.newClient(clientConfig) - - webTarget = client.target(baseUri) - + int port = findAvailableTcpPort(8000) + URI baseUri = UriBuilder.fromUri("http://localhost").port(port).build() + // Create Server + Server server = new Server(port) + // Configure ServletContextHandler + ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS) + context.setContextPath("/") + server.setHandler(context) + // Create Servlet Container + ServletHolder jerseyServlet = context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/*") + jerseyServlet.setInitOrder(0) + // Tells the Jersey Servlet which REST service/class to load. + jerseyServlet.setInitParameter("jersey.config.server.provider.classnames", FraudDetectionController.class.getCanonicalName()) + // Start the server server.start() + ClientConfig clientConfig = new ClientConfig() + client = ClientBuilder.newClient(clientConfig) + webTarget = client.target(baseUri) } def cleanupSpec() { diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/fraudDetectionService/src/test/java/org/springframework/cloud/MvcTest.java b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/fraudDetectionService/src/test/java/org/springframework/cloud/MvcTest.java index 93c9209621..815d5fae43 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/fraudDetectionService/src/test/java/org/springframework/cloud/MvcTest.java +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/fraudDetectionService/src/test/java/org/springframework/cloud/MvcTest.java @@ -1,21 +1,18 @@ package org.springframework.cloud; -import org.springframework.cloud.frauddetection.Application; -import org.springframework.cloud.frauddetection.FraudRestApplication; -import org.eclipse.jetty.server.Server; -import org.glassfish.jersey.apache.connector.ApacheConnectorProvider; -import org.glassfish.jersey.client.ClientConfig; -import org.glassfish.jersey.jetty.JettyHttpContainerFactory; -import org.glassfish.jersey.server.ResourceConfig; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; - +import java.net.URI; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.UriBuilder; -import java.net.URI; + +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; +import org.glassfish.jersey.client.ClientConfig; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.springframework.cloud.frauddetection.FraudDetectionController; import static org.springframework.util.SocketUtils.findAvailableTcpPort; @@ -24,25 +21,28 @@ public abstract class MvcTest { public static WebTarget webTarget; private static Server server; - private static Client client; @BeforeClass - public static void setupTest() { - - URI baseUri = UriBuilder.fromUri("http://localhost").port(findAvailableTcpPort(8000)).build(); - - - ResourceConfig resourceConfig = ResourceConfig.forApplication(new FraudRestApplication()); - resourceConfig.property("contextConfig", new AnnotationConfigApplicationContext(Application.class)); - server = JettyHttpContainerFactory.createServer(baseUri, resourceConfig, true); - + public static void setupTest() throws Exception { + int port = findAvailableTcpPort(8000); + URI baseUri = UriBuilder.fromUri("http://localhost").port(port).build(); + // Create Server + Server server = new Server(port); + // Configure ServletContextHandler + ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); + context.setContextPath("/"); + server.setHandler(context); + // Create Servlet Container + ServletHolder jerseyServlet = context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, "/*"); + jerseyServlet.setInitOrder(0); + // Tells the Jersey Servlet which REST service/class to load. + jerseyServlet.setInitParameter("jersey.config.server.provider.classnames", FraudDetectionController.class.getCanonicalName()); + // Start the server + server.start(); ClientConfig clientConfig = new ClientConfig(); - clientConfig.connectorProvider(new ApacheConnectorProvider()); client = ClientBuilder.newClient(clientConfig); - webTarget = client.target(baseUri); - try { server.start(); } catch (Exception e) { diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/gradle/wrapper/gradle-wrapper.jar b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/gradle/wrapper/gradle-wrapper.jar index 6ffa237849ef3607e39c3b334a92a65367962071..96d36c23c86687e8c46a94a1eb0be9628b80422e 100644 GIT binary patch delta 17813 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 delta 16532 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 QXc7$t3*vZ5Ex&vJKUMeMMF0Q* diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/gradle/wrapper/gradle-wrapper.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/gradle/wrapper/gradle-wrapper.properties index 1534560008..64ffcab3bf 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/gradle/wrapper/gradle-wrapper.properties +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Apr 28 10:55:26 CEST 2017 +#Mon Jul 31 11:13:36 CEST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.0.2-bin.zip diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/loanApplicationService/src/test/resources/mappings/META-INF/com.example.jersey/fraudDetectionService/unspecified/mappings/contracts/com/example/jersey/fraudDetectionService/shouldMarkClientAsFraud.json b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/loanApplicationService/src/test/resources/mappings/META-INF/com.example.jersey/fraudDetectionService/unspecified/mappings/contracts/com/example/jersey/fraudDetectionService/shouldMarkClientAsFraud.json new file mode 100644 index 0000000000..5b79cbf571 --- /dev/null +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/loanApplicationService/src/test/resources/mappings/META-INF/com.example.jersey/fraudDetectionService/unspecified/mappings/contracts/com/example/jersey/fraudDetectionService/shouldMarkClientAsFraud.json @@ -0,0 +1,26 @@ +{ + "id" : "856bd753-2488-4549-b84f-512e851958a9", + "request" : { + "url" : "/fraudcheck", + "method" : "PUT", + "headers" : { + "Content-Type" : { + "equalTo" : "application/vnd.fraud.v1+json" + } + }, + "bodyPatterns" : [ { + "matchesJsonPath" : "$[?(@.['loanAmount'] == 99999)]" + }, { + "matchesJsonPath" : "$[?(@.['clientPesel'] =~ /[0-9]{10}/)]" + } ] + }, + "response" : { + "status" : 200, + "body" : "{\"fraudCheckStatus\":\"FRAUD\",\"rejectionReason\":\"Amount too high\"}", + "headers" : { + "Content-Type" : "application/vnd.fraud.v1+json" + }, + "transformers" : [ "response-template" ] + }, + "uuid" : "856bd753-2488-4549-b84f-512e851958a9" +} \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/loanApplicationService/src/test/resources/mappings/META-INF/com.example.jersey/fraudDetectionService/unspecified/mappings/contracts/com/example/jersey/fraudDetectionService/shouldMarkClientAsNotFraud.json b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/loanApplicationService/src/test/resources/mappings/META-INF/com.example.jersey/fraudDetectionService/unspecified/mappings/contracts/com/example/jersey/fraudDetectionService/shouldMarkClientAsNotFraud.json new file mode 100644 index 0000000000..6bf3033026 --- /dev/null +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/loanApplicationService/src/test/resources/mappings/META-INF/com.example.jersey/fraudDetectionService/unspecified/mappings/contracts/com/example/jersey/fraudDetectionService/shouldMarkClientAsNotFraud.json @@ -0,0 +1,26 @@ +{ + "id" : "263aac46-1534-497d-9cc6-114a29ffa0de", + "request" : { + "url" : "/fraudcheck", + "method" : "PUT", + "headers" : { + "Content-Type" : { + "equalTo" : "application/vnd.fraud.v1+json" + } + }, + "bodyPatterns" : [ { + "matchesJsonPath" : "$[?(@.['loanAmount'] == 123.123)]" + }, { + "matchesJsonPath" : "$[?(@.['clientPesel'] =~ /[0-9]{10}/)]" + } ] + }, + "response" : { + "status" : 200, + "body" : "{\"fraudCheckStatus\":\"OK\",\"rejectionReason\":null}", + "headers" : { + "Content-Type" : "application/vnd.fraud.v1+json" + }, + "transformers" : [ "response-template" ] + }, + "uuid" : "263aac46-1534-497d-9cc6-114a29ffa0de" +} \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/loanApplicationService/src/test/resources/mappings/fraudDetectionService/shouldMarkClientAsFraud.json b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/loanApplicationService/src/test/resources/mappings/fraudDetectionService/shouldMarkClientAsFraud.json deleted file mode 100644 index 7229872299..0000000000 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/loanApplicationService/src/test/resources/mappings/fraudDetectionService/shouldMarkClientAsFraud.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "request": { - "method": "PUT", - "headers": { - "Content-Type": { - "equalTo": "application/vnd.fraud.v1+json" - } - }, - "url": "/fraudcheck", - "bodyPatterns": [ - { - "matches": "\\s*\\{\\s*\"clientPesel\"\\s*:\\s*\"?[0-9]{10}\"?\\s*,\\s*\"loanAmount\"\\s*:\\s*\"?99999\"?\\s*\\}\\s*" - } - ] - }, - "response": { - "status": 200, - "headers": { - "Content-Type": "application/vnd.fraud.v1+json" - }, - "body": "{\"fraudCheckStatus\":\"FRAUD\",\"rejectionReason\":\"Amount too high\"}" - } -} \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/loanApplicationService/src/test/resources/mappings/fraudDetectionService/shouldMarkClientAsNotFraud.json b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/loanApplicationService/src/test/resources/mappings/fraudDetectionService/shouldMarkClientAsNotFraud.json deleted file mode 100644 index 5a251171c7..0000000000 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleJerseyProject/loanApplicationService/src/test/resources/mappings/fraudDetectionService/shouldMarkClientAsNotFraud.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "request": { - "method": "PUT", - "headers": { - "Content-Type": { - "equalTo": "application/vnd.fraud.v1+json" - } - }, - "url": "/fraudcheck", - "bodyPatterns": [ - { - "matches": "\\s*\\{\\s*\"clientPesel\"\\s*:\\s*\"?[0-9]{10}\"?\\s*,\\s*\"loanAmount\"\\s*:\\s*\"?123.123\"?\\s*\\}\\s*" - } - ] - }, - "response": { - "status": 200, - "headers": { - "Content-Type": "application/vnd.fraud.v1+json" - }, - "body": "{\"fraudCheckStatus\":\"OK\",\"rejectionReason\":null}" - } -} \ No newline at end of file diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleProject/build.gradle b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleProject/build.gradle index d38fe284e0..9607a4ecb5 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleProject/build.gradle +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/sampleProject/build.gradle @@ -23,7 +23,7 @@ buildscript { maven { url "http://repo.spring.io/release" } } dependencies { - classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.0.M3") + classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.0.BUILD-SNAPSHOT") } } diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProject/build.gradle b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProject/build.gradle index 7e5bb8ec9c..fc70bf974e 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProject/build.gradle +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProject/build.gradle @@ -23,7 +23,7 @@ buildscript { maven { url "http://repo.spring.io/release" } } dependencies { - classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.0.M3") + classpath("org.springframework.boot:spring-boot-gradle-plugin:2.0.0.BUILD-SNAPSHOT") } }