Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix RedisClientName and MongoClientName can't be applied to parameters #12902

Merged
merged 2 commits into from
Oct 24, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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