From dfb3305c9ea04ef672dc08760f5534cc41c29013 Mon Sep 17 00:00:00 2001 From: Marek Skacelik Date: Thu, 10 Aug 2023 09:43:40 +0200 Subject: [PATCH] Added union directive tests --- .../schema/creator/type/UnionCreator.java | 1 - .../smallrye/graphql/schema/SchemaTest.java | 20 +++++++++++ .../graphql/schema/UnionDirective.java | 22 +++++++++++++ .../smallrye/graphql/schema/UnionTestApi.java | 33 +++++++++++++++++++ 4 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 server/implementation/src/test/java/io/smallrye/graphql/schema/UnionDirective.java create mode 100644 server/implementation/src/test/java/io/smallrye/graphql/schema/UnionTestApi.java diff --git a/common/schema-builder/src/main/java/io/smallrye/graphql/schema/creator/type/UnionCreator.java b/common/schema-builder/src/main/java/io/smallrye/graphql/schema/creator/type/UnionCreator.java index d79256aff..1cbbadc1a 100644 --- a/common/schema-builder/src/main/java/io/smallrye/graphql/schema/creator/type/UnionCreator.java +++ b/common/schema-builder/src/main/java/io/smallrye/graphql/schema/creator/type/UnionCreator.java @@ -52,7 +52,6 @@ public UnionType create(ClassInfo classInfo, Reference reference) { } - // TODO: create feature that allows adding UNION directives (graphql.schema) @Override public String getDirectiveLocation() { return "UNION"; diff --git a/server/implementation/src/test/java/io/smallrye/graphql/schema/SchemaTest.java b/server/implementation/src/test/java/io/smallrye/graphql/schema/SchemaTest.java index dbff14f39..a93cffd8f 100644 --- a/server/implementation/src/test/java/io/smallrye/graphql/schema/SchemaTest.java +++ b/server/implementation/src/test/java/io/smallrye/graphql/schema/SchemaTest.java @@ -6,6 +6,7 @@ import static java.util.Objects.requireNonNull; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -20,6 +21,7 @@ import java.util.Arrays; import java.util.EnumSet; import java.util.HashSet; +import java.util.List; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -124,6 +126,24 @@ void schemaWithEnumDirectives() { "Enum value EnumWithDirectives.B should not have directive @enumDirective"); } + @Test + void schemaWithUnionDirectives() { + GraphQLSchema graphQLSchema = createGraphQLSchema(UnionDirective.class, UnionTestApi.class, + UnionTestApi.SomeUnion.class, UnionTestApi.SomeClass.class); + + GraphQLUnionType unionWithDirectives = graphQLSchema.getTypeAs("SomeUnion"); + List unionDirectives = unionWithDirectives.getDirectives("unionDirective"); + assertFalse(unionDirectives.isEmpty(), + "Union SomeUnion should have directive @unionDirective"); + assertEquals(3, unionDirectives.size(), "Union SomeUnion should have 3 @unionDirective instances"); + Set expectedDirectivesArgValues = new HashSet<>(Arrays.asList("A", "B", "C")); + unionDirectives.forEach(directive -> directive.getArguments() + .forEach(argument -> assertFalse(expectedDirectivesArgValues.add(argument.toAppliedArgument().getValue()), + "Unexpected directive argument value"))); + assertTrue(unionWithDirectives.getDirectives("InputDirective").isEmpty(), + "Union SomeUnion should not have a directive @inputDirective"); + } + @Test void schemaWithInputDirectives() { GraphQLSchema graphQLSchema = createGraphQLSchema(InputDirective.class, OutputDirective.class, InputTestApi.class, diff --git a/server/implementation/src/test/java/io/smallrye/graphql/schema/UnionDirective.java b/server/implementation/src/test/java/io/smallrye/graphql/schema/UnionDirective.java new file mode 100644 index 000000000..e94a7a782 --- /dev/null +++ b/server/implementation/src/test/java/io/smallrye/graphql/schema/UnionDirective.java @@ -0,0 +1,22 @@ +package io.smallrye.graphql.schema; + +import static io.smallrye.graphql.api.DirectiveLocation.UNION; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Repeatable; +import java.lang.annotation.Retention; + +import io.smallrye.graphql.api.Directive; + +@Retention(RUNTIME) +@Directive(on = { UNION }) +@Repeatable(UnionDirective.UnionDirectives.class) +public @interface UnionDirective { + String value(); + + @Retention(RUNTIME) + @interface UnionDirectives { + UnionDirective[] value(); + } + +} diff --git a/server/implementation/src/test/java/io/smallrye/graphql/schema/UnionTestApi.java b/server/implementation/src/test/java/io/smallrye/graphql/schema/UnionTestApi.java new file mode 100644 index 000000000..25b49f1e7 --- /dev/null +++ b/server/implementation/src/test/java/io/smallrye/graphql/schema/UnionTestApi.java @@ -0,0 +1,33 @@ +package io.smallrye.graphql.schema; + +import org.eclipse.microprofile.graphql.GraphQLApi; +import org.eclipse.microprofile.graphql.Query; + +import io.smallrye.graphql.api.Union; + +@GraphQLApi +public class UnionTestApi { + + @Query + public SomeUnion query() { + return null; + } + + static class SomeClass implements SomeUnion { + private int number; + + public int getNumber() { + return number; + } + + } + + @Union + @UnionDirective(value = "C") + @UnionDirective(value = "A") + @InputDirective // should be ignored + @UnionDirective(value = "B") + interface SomeUnion { + } + +}