GraphQLCodegenAnnotationsTest.java 13.2 KB
Newer Older
1 2
package com.kobylynskyi.graphql.codegen;

3
import com.kobylynskyi.graphql.codegen.java.JavaGraphQLCodegen;
4 5 6 7 8 9 10
import com.kobylynskyi.graphql.codegen.model.MappingConfig;
import com.kobylynskyi.graphql.codegen.utils.Utils;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.io.File;
11
import java.util.Arrays;
12
import java.util.HashMap;
13
import java.util.List;
14 15 16 17
import java.util.Map;
import java.util.Objects;

import static com.kobylynskyi.graphql.codegen.TestUtils.assertFileContainsElements;
18 19
import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent;
import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName;
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
import static java.util.Collections.singletonList;
import static java.util.Collections.singletonMap;

class GraphQLCodegenAnnotationsTest {

    private final File outputBuildDir = new File("build/generated");
    private final File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/test1");

    private MappingConfig mappingConfig;

    @BeforeEach
    void init() {
        mappingConfig = new MappingConfig();
        mappingConfig.setPackageName("com.kobylynskyi.graphql.test1");
        mappingConfig.setGenerateParameterizedFieldsResolvers(false);
    }

    @AfterEach
    void cleanup() {
        Utils.deleteDir(outputBuildDir);
    }

    @Test
    void generate_CustomAnnotationMappings() throws Exception {
44 45
        mappingConfig.setCustomTypesMapping(new HashMap<>(
                singletonMap("Event.createdDateTime", "org.joda.time.DateTime")));
46
        mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("Event.createdDateTime",
47 48
                singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
                        "using = com.example.json.DateTimeScalarDeserializer.class)"))));
49

50
        new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"),
51 52 53 54
                outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate();

        File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
        assertFileContainsElements(files, "Event.java",
55 56
                "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
                        "using = com.example.json.DateTimeScalarDeserializer.class)"
57 58 59 60 61 62 63
                        + System.lineSeparator() + "    private org.joda.time.DateTime createdDateTime;");
    }

    @Test
    void generate_CustomAnnotationMappings_Type() throws Exception {
        mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("DateTime", "org.joda.time.DateTime")));
        mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("DateTime",
64 65
                singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
                        "using = com.example.json.DateTimeScalarDeserializer.class)"))));
66

67
        new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"),
68 69 70 71
                outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate();

        File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
        assertFileContainsElements(files, "Event.java",
72 73
                "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
                        "using = com.example.json.DateTimeScalarDeserializer.class)"
74 75 76 77 78 79 80
                        + System.lineSeparator() + "    private org.joda.time.DateTime createdDateTime;");
    }

    @Test
    void generate_CustomAnnotationMappings_FieldType() throws Exception {
        mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("DateTime", "org.joda.time.DateTime")));
        mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("Event.createdDateTime",
81 82
                singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
                        "using = com.example.json.DateTimeScalarDeserializer.class)"))));
83

84
        new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"),
85 86 87 88
                outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate();

        File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
        assertFileContainsElements(files, "Event.java",
89 90
                "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
                        "using = com.example.json.DateTimeScalarDeserializer.class)"
91 92 93 94 95
                        + System.lineSeparator() + "    private org.joda.time.DateTime createdDateTime;");
    }

    @Test
    void generate_CustomAnnotationMappings_Class() throws Exception {
96
        Map<String, List<String>> customAnnotationsMapping = new HashMap<>();
97
        // input
98 99 100
        customAnnotationsMapping.put("AcceptTopicSuggestionInput",
                singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
                        "using = AcceptTopicSuggestionInputDeserializer.class)"));
101
        // type
102 103 104
        customAnnotationsMapping.put("AcceptTopicSuggestionPayload",
                singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
                        "using = AcceptTopicSuggestionPayloadDeserializer.class)"));
105
        // interface
106 107 108
        customAnnotationsMapping.put("Actor",
                singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
                        "using = ActorDeserializer.class)"));
109
        // union
110 111 112
        customAnnotationsMapping.put("Assignee",
                singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
                        "using = AssigneeDeserializer.class)"));
113
        // enum
114 115 116
        customAnnotationsMapping.put("DeploymentOrderField",
                singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
                        "using = DeploymentOrderFieldDeserializer.class)"));
117 118
        mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping);

119
        new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"),
120 121 122 123
                outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate();

        File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
        assertFileContainsElements(files, "AcceptTopicSuggestionInput.java",
124 125
                "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
                        "using = AcceptTopicSuggestionInputDeserializer.class)"
126 127
                        + System.lineSeparator() + "public class AcceptTopicSuggestionInput ");
        assertFileContainsElements(files, "AcceptTopicSuggestionPayload.java",
128 129
                "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
                        "using = AcceptTopicSuggestionPayloadDeserializer.class)"
130 131
                        + System.lineSeparator() + "public class AcceptTopicSuggestionPayload ");
        assertFileContainsElements(files, "Actor.java",
132 133
                "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
                        "using = ActorDeserializer.class)"
134 135
                        + System.lineSeparator() + "public interface Actor ");
        assertFileContainsElements(files, "Assignee.java",
136 137
                "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
                        "using = AssigneeDeserializer.class)"
138 139
                        + System.lineSeparator() + "public interface Assignee ");
        assertFileContainsElements(files, "DeploymentOrderField.java",
140 141
                "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
                        "using = DeploymentOrderFieldDeserializer.class)"
142 143 144
                        + System.lineSeparator() + "public enum DeploymentOrderField ");
    }

145 146 147 148 149
    @Test
    void generate_CustomAnnotationMappings_Multiple() throws Exception {
        Map<String, List<String>> customAnnotationsMapping = new HashMap<>();
        // type
        customAnnotationsMapping.put("AcceptTopicSuggestionPayload", Arrays.asList(
150 151 152 153 154
                "@com.fasterxml.jackson.annotation.JsonTypeInfo(use = " +
                        "com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = \"__typename\")",
                "@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(" +
                        "io.github.kobylynskyi.order.external.starwars." +
                        "AcceptTopicSuggestionPayloadTypeResolver.class)"));
155 156
        mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping);

157
        new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"),
158 159 160 161
                outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate();

        File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
        assertFileContainsElements(files, "AcceptTopicSuggestionPayload.java", System.lineSeparator() +
162 163
                "@com.fasterxml.jackson.annotation.JsonTypeInfo(" +
                "use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = \"__typename\")"
164
                + System.lineSeparator() +
165 166
                "@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(" +
                "io.github.kobylynskyi.order.external.starwars.AcceptTopicSuggestionPayloadTypeResolver.class)"
167 168 169 170
                + System.lineSeparator() +
                "public class AcceptTopicSuggestionPayload ");
    }

171 172
    @Test
    void generate_CustomAnnotationMappings_RequestResponseClasses() throws Exception {
173
        Map<String, List<String>> customAnnotationsMapping = new HashMap<>();
174
        // request
175 176 177
        customAnnotationsMapping.put("CodeOfConductQueryRequest",
                singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
                        "using = CodeOfConductQueryRequestDeserializer.class)"));
178
        // response
179 180 181
        customAnnotationsMapping.put("CodeOfConductQueryResponse",
                singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
                        "using = CodeOfConductQueryResponseDeserializer.class)"));
182 183 184
        mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping);
        mappingConfig.setGenerateClient(true);

185
        new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"),
186 187 188 189
                outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate();

        File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
        assertFileContainsElements(files, "CodeOfConductQueryRequest.java",
190 191 192 193
                "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
                        "using = CodeOfConductQueryRequestDeserializer.class)"
                        + System.lineSeparator() +
                        "public class CodeOfConductQueryRequest implements GraphQLOperationRequest {");
194
        assertFileContainsElements(files, "CodeOfConductQueryResponse.java",
195 196 197 198
                "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" +
                        "using = CodeOfConductQueryResponseDeserializer.class)"
                        + System.lineSeparator() +
                        "public class CodeOfConductQueryResponse extends GraphQLResult<Map<String, CodeOfConduct>> {");
199 200
    }

201 202
    @Test
    void generate_Directives() throws Exception {
203
        Map<String, List<String>> directiveAnnotationsMapping = new HashMap<>();
204
        directiveAnnotationsMapping.put("auth",
205 206 207 208 209 210
                singletonList("@com.example.CustomAnnotation(" +
                        "roles={{roles?toArray}}, " +
                        "boo={{boo?toArray}}, " +
                        "float={{float?toArrayOfStrings}}, " +
                        "int={{int}}, " +
                        "n={{n?toString}})"));
211
        directiveAnnotationsMapping.put("valid", singletonList("@javax.validation.Valid"));
212
        directiveAnnotationsMapping.put("customResolver", singletonList("@com.example.CustomAnnotation"));
213 214
        directiveAnnotationsMapping.put("relationship",
                singletonList("@com.example.Relationship(type = {{type}}, direction = {{direction}})"));
215 216
        mappingConfig.setDirectiveAnnotationsMapping(directiveAnnotationsMapping);

217
        new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"),
218 219 220 221 222 223 224 225 226
                outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate();

        File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
        assertSameTrimmedContent(
                new File("src/test/resources/expected-classes/annotation/CreateEventMutationResolver.java.txt"),
                getFileByName(files, "CreateEventMutationResolver.java"));
        assertSameTrimmedContent(
                new File("src/test/resources/expected-classes/annotation/MutationResolver.java.txt"),
                getFileByName(files, "MutationResolver.java"));
227 228 229
        assertSameTrimmedContent(
            new File("src/test/resources/expected-classes/annotation/EventProperty.java.txt"),
            getFileByName(files, "EventProperty.java"));
230 231 232
        assertSameTrimmedContent(
            new File("src/test/resources/expected-classes/annotation/User.java.txt"),
            getFileByName(files, "User.java"));
233 234
    }

235
}