Skip to content

Commit

Permalink
add tests for federation batch resolving
Browse files Browse the repository at this point in the history
  • Loading branch information
Robert Pospisil committed Sep 7, 2023
1 parent edd9d72 commit 159e391
Show file tree
Hide file tree
Showing 10 changed files with 394 additions and 1 deletion.
2 changes: 1 addition & 1 deletion bom/application/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@
<smallrye-health.version>4.0.4</smallrye-health.version>
<smallrye-metrics.version>4.0.0</smallrye-metrics.version>
<smallrye-open-api.version>3.5.1</smallrye-open-api.version>
<smallrye-graphql.version>2.4.0</smallrye-graphql.version>
<smallrye-graphql.version>2.4.1-SNAPSHOT</smallrye-graphql.version>
<smallrye-opentracing.version>3.0.3</smallrye-opentracing.version>
<smallrye-fault-tolerance.version>6.2.6</smallrye-fault-tolerance.version>
<smallrye-jwt.version>4.3.0</smallrye-jwt.version>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.quarkus.smallrye.graphql.deployment.federation.batch;

import io.smallrye.graphql.api.federation.Extends;
import io.smallrye.graphql.api.federation.External;
import io.smallrye.graphql.api.federation.Key;

@Key(fields = "id")
@Extends
public class Foo {

@External
public int id;

public String name;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package io.quarkus.smallrye.graphql.deployment.federation.batch;

import java.util.List;
import java.util.stream.Collectors;

import org.eclipse.microprofile.graphql.GraphQLApi;
import org.eclipse.microprofile.graphql.Query;

@GraphQLApi
public class FooApi {
@Query
public List<Foo> foos(List<Integer> id) {
return id.stream().map(this::foo).collect(Collectors.toList());
}

private Foo foo(int id) {
var foo = new Foo();
foo.id = id;
foo.name = "Name of " + id;
return foo;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package io.quarkus.smallrye.graphql.deployment.federation.batch;

import static org.hamcrest.Matchers.containsString;

import org.hamcrest.CoreMatchers;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.smallrye.graphql.deployment.AbstractGraphQLTest;
import io.quarkus.test.QuarkusUnitTest;
import io.restassured.RestAssured;

public class GraphQLFederationBatchTest extends AbstractGraphQLTest {

@RegisterExtension
static QuarkusUnitTest test = new QuarkusUnitTest()
.withApplicationRoot((jar) -> jar
.addClasses(FooApi.class, Foo.class)
.addAsResource(new StringAsset("quarkus.smallrye-graphql.schema-include-directives=true\n" +
"smallrye.graphql.federation.batchResolving.enabled=true"),
"application.properties")
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"));

@Test
public void checkServiceDeclarationInSchema() {
RestAssured.given()
.get("/graphql/schema.graphql")
.then()
.body(containsString("type _Service {"));
}

@Test
public void checkFederationDirectivesInSchema() {
RestAssured.given()
.get("/graphql/schema.graphql")
.then()
.body(containsString("id: Int! @external"))
.body(containsString("type Foo @extends @key(fields : \"id\")"));
;
}

@Test
public void resolvePerFederation() {
String query = "query federation($representations: [_Any!]!) {\n" +
" _entities(representations: $representations) {\n" +
" ... on Foo {\n" +
" id\n" +
" name\n" +
" }\n" +
" }\n" +
"}";
String variables = "{\n" +
" \"representations\": [\n" +
" {\n" +
" \"__typename\": \"Foo\",\n" +
" \"id\": 1\n" +
" },\n" +
" {\n" +
" \"__typename\": \"Foo\",\n" +
" \"id\": 2\n" +
" }\n" +
" ]\n" +
"}";

String request = getPayload(query, variables);
RestAssured.given().when()
.accept(MEDIATYPE_JSON)
.contentType(MEDIATYPE_JSON)
.body(request)
.post("/graphql")
.then()
.assertThat()
.statusCode(200)
.and()
.body(CoreMatchers.is(
"{\"data\":{\"_entities\":[{\"id\":1,\"name\":\"Name of 1\"},{\"id\":2,\"name\":\"Name of 2\"}]}}"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package io.quarkus.smallrye.graphql.deployment.federation.batch.uni;

import java.util.List;
import java.util.stream.Collectors;

import org.eclipse.microprofile.graphql.GraphQLApi;
import org.eclipse.microprofile.graphql.Query;

import io.quarkus.smallrye.graphql.deployment.federation.base.Foo;
import io.smallrye.mutiny.Uni;

@GraphQLApi
public class FooApiUni {

@Query
public Uni<List<Foo>> foos(List<Integer> id) {
return Uni.join().all(id.stream().map(this::foo).collect(Collectors.toList())).andFailFast();
}

private Uni<Foo> foo(int id) {
var foo = new Foo();
foo.id = id;
foo.name = "Name of " + id;
return Uni.createFrom().item(foo);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package io.quarkus.smallrye.graphql.deployment.federation.batch.uni;

import static org.hamcrest.Matchers.containsString;

import org.hamcrest.CoreMatchers;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.smallrye.graphql.deployment.AbstractGraphQLTest;
import io.quarkus.smallrye.graphql.deployment.federation.batch.Foo;
import io.quarkus.test.QuarkusUnitTest;
import io.restassured.RestAssured;

public class GraphQLFederationBatchUniTest extends AbstractGraphQLTest {

@RegisterExtension
static QuarkusUnitTest test = new QuarkusUnitTest()
.withApplicationRoot((jar) -> jar
.addClasses(FooApiUni.class, Foo.class)
.addAsResource(new StringAsset("quarkus.smallrye-graphql.schema-include-directives=true\n" +
"smallrye.graphql.federation.batchResolving.enabled=true"),
"application.properties")
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml"));

@Test
public void checkServiceDeclarationInSchema() {
RestAssured.given()
.get("/graphql/schema.graphql")
.then()
.body(containsString("type _Service {"));
}

@Test
public void checkFederationDirectivesInSchema() {
RestAssured.given()
.get("/graphql/schema.graphql")
.then()
.body(containsString("id: Int! @external"))
.body(containsString("type Foo @extends @key(fields : \"id\")"));
;
}

@Test
public void resolvePerFederation() {
String query = "query federation($representations: [_Any!]!) {\n" +
" _entities(representations: $representations) {\n" +
" ... on Foo {\n" +
" id\n" +
" name\n" +
" }\n" +
" }\n" +
"}";
String variables = "{\n" +
" \"representations\": [\n" +
" {\n" +
" \"__typename\": \"Foo\",\n" +
" \"id\": 1\n" +
" },\n" +
" {\n" +
" \"__typename\": \"Foo\",\n" +
" \"id\": 2\n" +
" }\n" +
" ]\n" +
"}";

String request = getPayload(query, variables);
RestAssured.given().when()
.accept(MEDIATYPE_JSON)
.contentType(MEDIATYPE_JSON)
.body(request)
.post("/graphql")
.then()
.assertThat()
.statusCode(200)
.and()
.body(CoreMatchers.is(
"{\"data\":{\"_entities\":[{\"id\":1,\"name\":\"Name of 1\"},{\"id\":2,\"name\":\"Name of 2\"}]}}"));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package io.quarkus.smallrye.graphql.deployment.federation.complex;

import io.smallrye.graphql.api.federation.Extends;
import io.smallrye.graphql.api.federation.External;
import io.smallrye.graphql.api.federation.Key;

@Key(fields = "id")
@Key(fields = "otherId")
@Extends
public class Bar {

@External
public int id;
@External
public String otherId;

public String name;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.quarkus.smallrye.graphql.deployment.federation.complex;

import io.smallrye.graphql.api.federation.Extends;
import io.smallrye.graphql.api.federation.External;
import io.smallrye.graphql.api.federation.Key;

@Key(fields = "id")
@Extends
public class Foo {

@External
public int id;

public String name;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package io.quarkus.smallrye.graphql.deployment.federation.complex;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import org.eclipse.microprofile.graphql.GraphQLApi;
import org.eclipse.microprofile.graphql.Query;

import io.smallrye.mutiny.Uni;

@GraphQLApi
public class FooApi {
@Query
public Foo foo(int id) {
var foo = new Foo();
foo.id = id;
foo.name = "Name of " + id;
return foo;
}

@Query
public Uni<List<Bar>> bars(List<Integer> id, List<String> otherId) {
return Uni.join().all(
IntStream.range(0, id.size()).boxed().map(i -> bar(id.get(i), otherId.get(i))).collect(Collectors.toList()))
.andFailFast();
}

private Uni<Bar> bar(int id, String otherId) {
var bar = new Bar();
bar.id = id;
bar.otherId = otherId;
bar.name = id + otherId;
return Uni.createFrom().item(bar);
}
}
Loading

0 comments on commit 159e391

Please sign in to comment.