Skip to content

Commit

Permalink
Merge pull request #12902 from machi1990/fix/12898
Browse files Browse the repository at this point in the history
Fix RedisClientName and MongoClientName can't be applied to parameters
  • Loading branch information
gsmet authored Oct 24, 2020
2 parents 2fa3e6e + 1a7cbe4 commit 8840799
Show file tree
Hide file tree
Showing 12 changed files with 343 additions and 119 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
* MongoClient client;
* </pre>
*/
@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.FIELD })
@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
@Retention(RUNTIME)
@Documented
@Qualifier
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
* RedisClient client;
* </pre>
*/
@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.FIELD })
@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
@Retention(RUNTIME)
@Documented
@Qualifier
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package io.quarkus.it.mongodb;

import static com.mongodb.client.model.Filters.eq;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;

import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;

import io.quarkus.mongodb.MongoClientName;

@Path("/books-with-parameter-injection")
public class BookResourceWithParameterInjection {
private MongoClient client;
private MongoCollection<Book> collection;

@Inject
public BookResourceWithParameterInjection(@MongoClientName("parameter-injection") MongoClient client) {
this.client = client;
}

@PostConstruct
public void init() {
MongoDatabase database = client.getDatabase("books-with-parameter-injection");
collection = database.getCollection("my-collection", Book.class);
}

@GET
public List<Book> getBooks() {
FindIterable<Book> iterable = collection.find();
List<Book> books = new ArrayList<>();
for (Book doc : iterable) {
books.add(doc);
}
return books;
}

@POST
public Response addBook(Book book) {
collection.insertOne(book);
return Response.accepted().build();
}

@GET
@Path("/{author}")
public List<Book> getBooksByAuthor(@PathParam("author") String author) {
FindIterable<Book> iterable = collection.find(eq("author", author));
List<Book> books = new ArrayList<>();
for (Book doc : iterable) {
String title = doc.getTitle();
books.add(new Book().setTitle(title).setAuthor(author));
}
return books;
}

}
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
quarkus.mongodb.connection-string=mongodb://localhost:27018
quarkus.mongodb.write-concern.journal=false
quarkus.mongodb.write-concern.journal=false
quarkus.mongodb.parameter-injection.connection-string=mongodb://localhost:27018
quarkus.mongodb.parameter-injection.write-concern.journal=false
Original file line number Diff line number Diff line change
Expand Up @@ -5,54 +5,25 @@
import static org.hamcrest.Matchers.hasKey;
import static org.hamcrest.Matchers.is;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;

import javax.json.bind.Jsonb;
import javax.json.bind.JsonbBuilder;

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import io.quarkus.it.mongodb.discriminator.Car;
import io.quarkus.it.mongodb.discriminator.Moto;
import io.quarkus.it.mongodb.pojo.Pojo;
import io.quarkus.mongodb.health.MongoHealthCheck;
import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;
import io.restassured.RestAssured;
import io.restassured.common.mapper.TypeRef;
import io.restassured.config.ObjectMapperConfig;
import io.restassured.mapper.ObjectMapper;
import io.restassured.mapper.ObjectMapperDeserializationContext;
import io.restassured.mapper.ObjectMapperSerializationContext;
import io.restassured.response.Response;

@QuarkusTest
@QuarkusTestResource(MongoTestResource.class)
public class BookResourceTest {

private static Jsonb jsonb;

@BeforeAll
public static void giveMeAMapper() {
jsonb = JsonbBuilder.create();
ObjectMapper mapper = new ObjectMapper() {
@Override
public Object deserialize(ObjectMapperDeserializationContext context) {
return jsonb.fromJson(context.getDataToDeserialize().asString(), context.getType());
}

@Override
public Object serialize(ObjectMapperSerializationContext context) {
return jsonb.toJson(context.getObjectToSerialize());
}
};
RestAssured.config().objectMapperConfig(ObjectMapperConfig.objectMapperConfig().defaultObjectMapper(mapper));
jsonb = Utils.initialiseJsonb();
}

@AfterAll
Expand All @@ -62,63 +33,12 @@ public static void releaseMapper() throws Exception {

@Test
public void testBlockingClient() {
callTheEndpoint("/books");
}

private void callTheEndpoint(String endpoint) {
List<Book> list = get(endpoint).as(new TypeRef<List<Book>>() {
});
Assertions.assertEquals(0, list.size());

Book book1 = new Book().setAuthor("Victor Hugo").setTitle("Les Misérables")
.setCategories(Arrays.asList("long", "very long"))
.setDetails(new BookDetail().setRating(3).setSummary("A very long book"));
Response response = RestAssured
.given()
.header("Content-Type", "application/json")
.body(book1)
.post(endpoint)
.andReturn();
Assertions.assertEquals(202, response.statusCode());

Book book2 = new Book().setAuthor("Victor Hugo").setTitle("Notre-Dame de Paris")
.setCategories(Arrays.asList("long", "quasimodo"))
.setDetails(new BookDetail().setRating(4).setSummary("quasimodo and esmeralda"));
response = RestAssured
.given()
.header("Content-Type", "application/json")
.body(book2)
.post(endpoint)
.andReturn();
Assertions.assertEquals(202, response.statusCode());

list = get(endpoint).as(new TypeRef<List<Book>>() {
});
Assertions.assertEquals(2, list.size());

Book book3 = new Book().setAuthor("Charles Baudelaire").setTitle("Les fleurs du mal")
.setCategories(Collections.singletonList("poem"))
.setDetails(new BookDetail().setRating(2).setSummary("Les Fleurs du mal is a volume of poetry."));
response = RestAssured
.given()
.header("Content-Type", "application/json")
.body(book3)
.post(endpoint)
.andReturn();
Assertions.assertEquals(202, response.statusCode());

list = get(endpoint).as(new TypeRef<List<Book>>() {
});
Assertions.assertEquals(3, list.size());

list = get(endpoint + "/Victor Hugo").as(new TypeRef<List<Book>>() {
});
Assertions.assertEquals(2, list.size());
Utils.callTheEndpoint("/books");
}

@Test
public void testReactiveClients() {
callTheEndpoint("/reactive-books");
Utils.callTheEndpoint("/reactive-books");
}

@Test
Expand All @@ -131,36 +51,4 @@ public void health() throws Exception {
"checks.name", containsInAnyOrder("MongoDB connection health check"));
}

@Test
public void testVehicleEndpoint() {
Car car = new Car();
car.name = "Renault Clio";
car.type = "CAR";
car.seatNumber = 5;
RestAssured.given().header("Content-Type", "application/json").body(car)
.when().post("/vehicles")
.then().statusCode(201);

Moto moto = new Moto();
moto.name = "Harley Davidson Sportster";
moto.type = "MOTO";
RestAssured.given().header("Content-Type", "application/json").body(moto)
.when().post("/vehicles")
.then().statusCode(201);

get("/vehicles").then().statusCode(200).body("size()", is(2));
}

@Test
public void testPojoEndpoint() {
Pojo pojo = new Pojo();
pojo.description = "description";
pojo.optionalString = Optional.of("optional");
RestAssured.given().header("Content-Type", "application/json").body(pojo)
.when().post("/pojos")
.then().statusCode(201);

get("/pojos").then().statusCode(200).body("size()", is(1));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package io.quarkus.it.mongodb;

import static org.hamcrest.Matchers.*;

import javax.json.bind.Jsonb;

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;

@QuarkusTest
@QuarkusTestResource(MongoTestResource.class)
public class BookResourceWithParameterInjectionTest {

private static Jsonb jsonb;

@BeforeAll
public static void giveMeAMapper() {
jsonb = Utils.initialiseJsonb();
}

@AfterAll
public static void releaseMapper() throws Exception {
jsonb.close();
}

@Test
public void testInjectedClient() {
Utils.callTheEndpoint("/books-with-parameter-injection");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package io.quarkus.it.mongodb;

import io.quarkus.test.junit.NativeImageTest;

@NativeImageTest
class NativeBookResourceWithParameterInjectionIT extends BookResourceWithParameterInjectionTest {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package io.quarkus.it.mongodb;

import static io.restassured.RestAssured.get;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import javax.json.bind.Jsonb;
import javax.json.bind.JsonbBuilder;

import org.junit.jupiter.api.Assertions;

import io.restassured.RestAssured;
import io.restassured.common.mapper.TypeRef;
import io.restassured.config.ObjectMapperConfig;
import io.restassured.mapper.ObjectMapper;
import io.restassured.mapper.ObjectMapperDeserializationContext;
import io.restassured.mapper.ObjectMapperSerializationContext;
import io.restassured.response.Response;

class Utils {
static Jsonb initialiseJsonb() {
Jsonb jsonb = JsonbBuilder.create();
ObjectMapper mapper = new ObjectMapper() {
@Override
public Object deserialize(ObjectMapperDeserializationContext context) {
return jsonb.fromJson(context.getDataToDeserialize().asString(), context.getType());
}

@Override
public Object serialize(ObjectMapperSerializationContext context) {
return jsonb.toJson(context.getObjectToSerialize());
}
};
RestAssured.config().objectMapperConfig(ObjectMapperConfig.objectMapperConfig().defaultObjectMapper(mapper));

return jsonb;
}

static void callTheEndpoint(String endpoint) {
List<Book> list = get(endpoint).as(new TypeRef<List<Book>>() {
});
Assertions.assertEquals(0, list.size());

Book book1 = new Book().setAuthor("Victor Hugo").setTitle("Les Misérables")
.setCategories(Arrays.asList("long", "very long"))
.setDetails(new BookDetail().setRating(3).setSummary("A very long book"));
Response response = RestAssured
.given()
.header("Content-Type", "application/json")
.body(book1)
.post(endpoint)
.andReturn();
Assertions.assertEquals(202, response.statusCode());

Book book2 = new Book().setAuthor("Victor Hugo").setTitle("Notre-Dame de Paris")
.setCategories(Arrays.asList("long", "quasimodo"))
.setDetails(new BookDetail().setRating(4).setSummary("quasimodo and esmeralda"));
response = RestAssured
.given()
.header("Content-Type", "application/json")
.body(book2)
.post(endpoint)
.andReturn();
Assertions.assertEquals(202, response.statusCode());

list = get(endpoint).as(new TypeRef<List<Book>>() {
});
Assertions.assertEquals(2, list.size());

Book book3 = new Book().setAuthor("Charles Baudelaire").setTitle("Les fleurs du mal")
.setCategories(Collections.singletonList("poem"))
.setDetails(new BookDetail().setRating(2).setSummary("Les Fleurs du mal is a volume of poetry."));
response = RestAssured
.given()
.header("Content-Type", "application/json")
.body(book3)
.post(endpoint)
.andReturn();
Assertions.assertEquals(202, response.statusCode());

list = get(endpoint).as(new TypeRef<List<Book>>() {
});
Assertions.assertEquals(3, list.size());

list = get(endpoint + "/Victor Hugo").as(new TypeRef<List<Book>>() {
});
Assertions.assertEquals(2, list.size());
}

}
Loading

0 comments on commit 8840799

Please sign in to comment.