1414
1515import static com .google .common .truth .Truth .assertThat ;
1616import static io .vertx .tests .ResourceHelper .getRelatedTestResourcePath ;
17- import static io .vertx .tests .ResourceHelper .loadJson ;
1817
1918import io .netty .handler .codec .http .HttpHeaderValues ;
2019import io .vertx .core .Future ;
2120import io .vertx .core .http .HttpClientRequest ;
22- import io .vertx .core .http .HttpClientResponse ;
2321import io .vertx .core .http .HttpHeaders ;
2422import io .vertx .core .http .HttpMethod ;
2523import io .vertx .core .json .JsonArray ;
2624import io .vertx .core .json .JsonObject ;
2725import io .vertx .junit5 .Timeout ;
2826import io .vertx .junit5 .VertxTestContext ;
29- import io .vertx .openapi .contract .OpenAPIContract ;
30- import io .vertx .openapi .validation .RequestValidator ;
31- import io .vertx .openapi .validation .ResponseValidator ;
3227import io .vertx .openapi .validation .ValidatableResponse ;
33- import io .vertx .openapi .validation .ValidatedRequest ;
34- import io .vertx .tests .test .base .HttpServerTestBase ;
28+ import io .vertx .tests .test .base .ContractTestBase ;
3529import java .nio .file .Path ;
3630import java .util .concurrent .TimeUnit ;
37- import java .util .function .Consumer ;
38- import java .util .function .Function ;
3931import org .junit .jupiter .api .DisplayName ;
4032import org .junit .jupiter .api .Test ;
41- import org .junit .jupiter .api .parallel .Execution ;
42- import org .junit .jupiter .api .parallel .ExecutionMode ;
4333import org .junit .jupiter .params .ParameterizedTest ;
4434import org .junit .jupiter .params .provider .ValueSource ;
4535
46- // We need to enforce sequential execution, because the tests are manipulating fields
47- @ Execution (ExecutionMode .SAME_THREAD )
48- class E2ETest extends HttpServerTestBase {
49-
50- private OpenAPIContract contract ;
51- private RequestValidator requestValidator ;
52- private ResponseValidator responseValidator ;
53-
54- Future <Void > setupContract (String basePath , VertxTestContext testContext ) {
55- JsonObject contractJson = loadJson (vertx , getRelatedTestResourcePath (E2ETest .class ).resolve ("petstore.json" ));
56- // Modify base path
57- JsonObject server = contractJson .getJsonArray ("servers" ).getJsonObject (0 );
58- server .put ("url" , server .getString ("url" ) + basePath );
59- return OpenAPIContract .from (vertx , contractJson ).onComplete (testContext .succeeding (contract -> {
60- this .contract = contract ;
61- this .requestValidator = RequestValidator .create (vertx , contract );
62- this .responseValidator = ResponseValidator .create (vertx , contract );
63- })).mapEmpty ();
64- }
36+ class E2ETest extends ContractTestBase {
37+ private Path CONTRACT_FILE = getRelatedTestResourcePath (E2ETest .class ).resolve ("petstore.json" );
6538
6639 @ Timeout (value = 2 , timeUnit = TimeUnit .SECONDS )
6740 @ ParameterizedTest (name = "{index} Test with base path: {0}" )
@@ -70,16 +43,16 @@ void testExtractPath(String basePath, VertxTestContext testContext) {
7043 int expectedPetId = 1 ;
7144 JsonObject expectedPet = new JsonObject ().put ("id" , 1 ).put ("name" , "FooBar" );
7245
73- setupContract ( basePath , testContext ).compose (v -> createValidationHandler (req -> {
46+ loadContract ( CONTRACT_FILE , basePath , testContext ).compose (v -> createServerWithRequestProcessor (req -> {
7447 testContext .verify (() -> {
7548 int petId = req .getPathParameters ().get ("petId" ).getInteger ();
7649 assertThat (petId ).isEqualTo (expectedPetId );
7750 });
7851 return ValidatableResponse .create (200 , expectedPet .toBuffer (), HttpHeaderValues .APPLICATION_JSON .toString ());
79- }, contract . operation ( "showPetById" ). getOperationId () , testContext )).compose (v -> {
52+ }, "showPetById" , testContext )).compose (v -> {
8053 String bp = basePath .endsWith ("/" ) ? basePath .substring (0 , basePath .length () - 1 ) : basePath ;
8154 Future <HttpClientRequest > req = createRequest (HttpMethod .GET , bp + "/pets/" + expectedPetId );
82- return request (req , resp -> resp .body ().onComplete (testContext .succeeding (
55+ return sendAndVerifyRequest (req , resp -> resp .body ().onComplete (testContext .succeeding (
8356 body -> testContext .verify (() -> {
8457 assertThat (resp .statusCode ()).isEqualTo (200 );
8558 assertThat (body .toJsonObject ()).isEqualTo (expectedPet );
@@ -104,7 +77,7 @@ public void sendMultipartFormDataRequest(VertxTestContext testContext) {
10477 .
put (
"email" ,
"[email protected] " )
10578 .put ("phone" , "5555555555" ));
10679
107- setupContract ( "" , testContext ).compose (v -> createValidationHandler (req -> {
80+ loadContract ( CONTRACT_FILE , testContext ).compose (v -> createServerWithRequestProcessor (req -> {
10881 testContext .verify (() -> {
10982 assertThat (req .getBody ()).isNotNull ();
11083 JsonObject jsonReq = req .getBody ().getJsonObject ();
@@ -114,7 +87,7 @@ public void sendMultipartFormDataRequest(VertxTestContext testContext) {
11487 testContext .completeNow ();
11588 });
11689 return ValidatableResponse .create (201 );
117- }, contract . operation ( "uploadPet" ). getOperationId () , testContext ))
90+ }, "uploadPet" , testContext ))
11891 .compose (v -> createRequest (HttpMethod .POST , "/pets/upload" ))
11992 .map (request -> request .putHeader (HttpHeaders .CONTENT_TYPE , "multipart/form-data; boundary=4ad8accc990e99c2" ))
12093 .map (request -> request .putHeader (HttpHeaders .CONTENT_DISPOSITION , "" ))
@@ -129,28 +102,13 @@ public void sendMultipartFormDataRequest(VertxTestContext testContext) {
129102 void testLessRestrictiveContentType (String requestContentType , VertxTestContext testContext ) {
130103 JsonObject expectedPet = new JsonObject ().put ("id" , 1 ).put ("name" , "FooBar" );
131104
132- setupContract ( "" , testContext ).compose (v -> createValidationHandler (req -> {
105+ loadContract ( CONTRACT_FILE , testContext ).compose (v -> createServerWithRequestProcessor (req -> {
133106 testContext .completeNow ();
134107 return ValidatableResponse .create (201 );
135- }, contract . operation ( "createPets" ). getOperationId () , testContext ))
108+ }, "createPets" , testContext ))
136109 .compose (v -> createRequest (HttpMethod .POST , "/pets" ))
137110 .map (request -> request .putHeader (HttpHeaders .CONTENT_TYPE , requestContentType ))
138111 .compose (request -> request .send (expectedPet .toBuffer ()))
139112 .onFailure (testContext ::failNow );
140113 }
141-
142- private Future <Void > request (Future <HttpClientRequest > request , Consumer <HttpClientResponse > verifier ,
143- VertxTestContext testContext ) {
144- return request .compose (HttpClientRequest ::send )
145- .onSuccess (response -> testContext .verify (() -> verifier .accept (response ))).onFailure (testContext ::failNow )
146- .mapEmpty ();
147- }
148-
149- private Future <Void > createValidationHandler (Function <ValidatedRequest , ValidatableResponse > processor ,
150- String operationId , VertxTestContext testContext ) {
151- return createServer (request -> requestValidator .validate (request , operationId )
152- .map (processor ).compose (validatableResponse -> responseValidator .validate (validatableResponse , operationId ))
153- .compose (validatedResponse -> validatedResponse .send (request .response ()))
154- .onFailure (testContext ::failNow )).onFailure (testContext ::failNow );
155- }
156114}
0 commit comments