Skip to content
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
2 changes: 2 additions & 0 deletions graphql-dgs-codegen-core/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ dependencies {
testImplementation 'com.google.guava:guava:33.4.+'
testImplementation 'com.google.testing.compile:compile-testing:0.+'
testImplementation 'org.jetbrains.kotlin:kotlin-compiler'

integTestImplementation 'com.fasterxml.jackson.module:jackson-module-kotlin'
}

application {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,13 @@

package com.netflix.graphql.dgs.codegen

import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import org.assertj.core.api.Assertions.assertThat
import org.assertj.core.api.Assertions.fail
import org.junit.jupiter.api.Test
import org.junit.jupiter.params.ParameterizedTest
import org.junit.jupiter.params.provider.MethodSource
import java.net.URLClassLoader
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths
Expand All @@ -35,6 +37,7 @@ import kotlin.io.path.readText
class Kotlin2CodeGenTest {
// set this to true to update all expected outputs instead of running tests
private val updateExpected = false
private val objectMapper = jacksonObjectMapper()

@ParameterizedTest
@MethodSource("listTestsToRun")
Expand Down Expand Up @@ -160,6 +163,109 @@ class Kotlin2CodeGenTest {
assertCompilesKotlin(codeGenResult)
}

@Test
fun `Jackson should deserialize input type with all optional fields without @JsonCreator annotation`() {
val schema =
"""
input PersonInput {
name: String
age: Int
email: String
}
""".trimIndent()

val result =
CodeGen(
CodeGenConfig(
schemas = setOf(schema),
packageName = "com.netflix.test.alloptional",
language = Language.KOTLIN,
generateKotlinNullableClasses = true,
generateKotlinClosureProjections = true,
),
).generate()

val buildDir = assertCompilesKotlin(result)
val classLoader = URLClassLoader(arrayOf(buildDir.toUri().toURL()), this.javaClass.classLoader)
val inputClass = classLoader.loadClass("com.netflix.test.alloptional.types.PersonInput")

val json = """{"name": "John", "age": 30, "email": "john@example.com"}"""
val instance = objectMapper.readValue(json, inputClass)
assertThat(instance).isNotNull
}

@Test
fun `Jackson should deserialize input type with required field`() {
val schema =
"""
input PersonInput {
name: String!
age: Int
email: String
}
""".trimIndent()

val result =
CodeGen(
CodeGenConfig(
schemas = setOf(schema),
packageName = "com.netflix.test.withrequired",
language = Language.KOTLIN,
generateKotlinNullableClasses = true,
generateKotlinClosureProjections = true,
),
).generate()

val buildDir = assertCompilesKotlin(result)
val classLoader = URLClassLoader(arrayOf(buildDir.toUri().toURL()), this.javaClass.classLoader)
val inputClass = classLoader.loadClass("com.netflix.test.withrequired.types.PersonInput")

// Test runtime Jackson deserialization
val json = """{"name": "John", "age": 30, "email": "john@example.com"}"""
val instance = objectMapper.readValue(json, inputClass)
assertThat(instance).isNotNull

val nameField = inputClass.getDeclaredField("name")
nameField.isAccessible = true
assertThat(nameField.get(instance)).isEqualTo("John")
}

@Test
fun `Input type with explicit defaults should deserialize without conflicting creators error`() {
val schema =
"""
input PersonInput {
name: String! = "Unknown"
age: Int! = 0
active: Boolean! = true
}
""".trimIndent()

val result =
CodeGen(
CodeGenConfig(
schemas = setOf(schema),
packageName = "com.netflix.test.alldefaults",
language = Language.KOTLIN,
generateKotlinNullableClasses = true,
generateKotlinClosureProjections = true,
),
).generate()

val buildDir = assertCompilesKotlin(result)
val classLoader = URLClassLoader(arrayOf(buildDir.toUri().toURL()), this.javaClass.classLoader)
val inputClass = classLoader.loadClass("com.netflix.test.alldefaults.types.PersonInput")

val json = """{"name": "John", "age": 30, "active": false}"""

val instance = objectMapper.readValue(json, inputClass)
assertThat(instance).isNotNull

val nameField = inputClass.getDeclaredField("name")
nameField.isAccessible = true
assertThat(nameField.get(instance)).isEqualTo("John")
}

companion object {
@Suppress("unused")
@JvmStatic
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package com.netflix.graphql.dgs.codegen.cases.constantsForInputTypes.expected.types

import com.fasterxml.jackson.`annotation`.JsonCreator
import com.fasterxml.jackson.`annotation`.JsonProperty
import com.netflix.graphql.dgs.codegen.GraphQLInput
import kotlin.Any
import kotlin.Pair
import kotlin.String
import kotlin.collections.List

public data class PersonFilter @JsonCreator constructor(
public data class PersonFilter(
@JsonProperty("email")
public val email: String? = default<PersonFilter, String?>("email", null),
) : GraphQLInput() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.netflix.graphql.dgs.codegen.cases.constantsWithExtendedInputTypes.expected.types

import com.fasterxml.jackson.`annotation`.JsonCreator
import com.fasterxml.jackson.`annotation`.JsonProperty
import com.netflix.graphql.dgs.codegen.GraphQLInput
import kotlin.Any
Expand All @@ -9,7 +8,7 @@ import kotlin.Pair
import kotlin.String
import kotlin.collections.List

public data class PersonFilter @JsonCreator constructor(
public data class PersonFilter(
@JsonProperty("email")
public val email: String? = default<PersonFilter, String?>("email", null),
@JsonProperty("birthYear")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.netflix.graphql.dgs.codegen.cases.dataClassDocs.expected.types

import com.fasterxml.jackson.`annotation`.JsonCreator
import com.fasterxml.jackson.`annotation`.JsonProperty
import com.netflix.graphql.dgs.codegen.GraphQLInput
import kotlin.Any
Expand All @@ -13,7 +12,7 @@ import kotlin.collections.List
*
* It takes a title and such.
*/
public data class MovieFilter @JsonCreator constructor(
public data class MovieFilter(
@JsonProperty("titleFilter")
public val titleFilter: String? = default<MovieFilter, String?>("titleFilter", null),
) : GraphQLInput() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package com.netflix.graphql.dgs.codegen.cases.dataClassFieldDocs.expected.types

import com.fasterxml.jackson.`annotation`.JsonCreator
import com.fasterxml.jackson.`annotation`.JsonProperty
import com.netflix.graphql.dgs.codegen.GraphQLInput
import kotlin.Any
import kotlin.Pair
import kotlin.String
import kotlin.collections.List

public data class MovieFilter @JsonCreator constructor(
public data class MovieFilter(
@JsonProperty("titleFilter")
public val titleFilter: String? = default<MovieFilter, String?>("titleFilter", null),
) : GraphQLInput() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package com.netflix.graphql.dgs.codegen.cases.input.expected.types

import com.fasterxml.jackson.`annotation`.JsonCreator
import com.fasterxml.jackson.`annotation`.JsonProperty
import com.netflix.graphql.dgs.codegen.GraphQLInput
import kotlin.Any
import kotlin.Pair
import kotlin.String
import kotlin.collections.List

public data class MovieFilter @JsonCreator constructor(
public data class MovieFilter(
@JsonProperty("genre")
public val genre: String? = default<MovieFilter, String?>("genre", null),
) : GraphQLInput() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.netflix.graphql.dgs.codegen.cases.inputWithDefaultBigDecimal.expected.types

import com.fasterxml.jackson.`annotation`.JsonCreator
import com.fasterxml.jackson.`annotation`.JsonProperty
import com.netflix.graphql.dgs.codegen.GraphQLInput
import java.math.BigDecimal
Expand All @@ -9,7 +8,7 @@ import kotlin.Pair
import kotlin.String
import kotlin.collections.List

public data class OrderFilter @JsonCreator constructor(
public data class OrderFilter(
@JsonProperty("min")
public val min: BigDecimal = default<OrderFilter, BigDecimal>("min", java.math.BigDecimal("1.1")),
@JsonProperty("avg")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.netflix.graphql.dgs.codegen.cases.inputWithDefaultCurrency.expected.types

import com.fasterxml.jackson.`annotation`.JsonCreator
import com.fasterxml.jackson.`annotation`.JsonProperty
import com.netflix.graphql.dgs.codegen.GraphQLInput
import java.util.Currency
Expand All @@ -9,7 +8,7 @@ import kotlin.Pair
import kotlin.String
import kotlin.collections.List

public data class OrderFilter @JsonCreator constructor(
public data class OrderFilter(
@JsonProperty("value")
public val `value`: Currency = default<OrderFilter, Currency>("value",
java.util.Currency.getInstance("USD")),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package com.netflix.graphql.dgs.codegen.cases.inputWithDefaultEnumValueForArray.expected.types

import com.fasterxml.jackson.`annotation`.JsonCreator
import com.fasterxml.jackson.`annotation`.JsonProperty
import com.netflix.graphql.dgs.codegen.GraphQLInput
import kotlin.Any
import kotlin.Pair
import kotlin.String
import kotlin.collections.List

public data class SomeType @JsonCreator constructor(
public data class SomeType(
@JsonProperty("colors")
public val colors: List<Color?>? = default<SomeType, List<Color?>?>("colors",
listOf(com.netflix.graphql.dgs.codegen.cases.inputWithDefaultEnumValueForArray.expected.types.Color.red)),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.netflix.graphql.dgs.codegen.cases.inputWithDefaultIntValueForArray.expected.types

import com.fasterxml.jackson.`annotation`.JsonCreator
import com.fasterxml.jackson.`annotation`.JsonProperty
import com.netflix.graphql.dgs.codegen.GraphQLInput
import kotlin.Any
Expand All @@ -9,7 +8,7 @@ import kotlin.Pair
import kotlin.String
import kotlin.collections.List

public data class SomeType @JsonCreator constructor(
public data class SomeType(
@JsonProperty("numbers")
public val numbers: List<Int?>? = default<SomeType, List<Int?>?>("numbers", listOf(1, 2, 3)),
) : GraphQLInput() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package com.netflix.graphql.dgs.codegen.cases.inputWithDefaultStringValueForArray.expected.types

import com.fasterxml.jackson.`annotation`.JsonCreator
import com.fasterxml.jackson.`annotation`.JsonProperty
import com.netflix.graphql.dgs.codegen.GraphQLInput
import kotlin.Any
import kotlin.Pair
import kotlin.String
import kotlin.collections.List

public data class SomeType @JsonCreator constructor(
public data class SomeType(
@JsonProperty("names")
public val names: List<String?>? = default<SomeType, List<String?>?>("names", listOf("A", "B")),
) : GraphQLInput() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package com.netflix.graphql.dgs.codegen.cases.inputWithDefaultValueForArray.expected.types

import com.fasterxml.jackson.`annotation`.JsonCreator
import com.fasterxml.jackson.`annotation`.JsonProperty
import com.netflix.graphql.dgs.codegen.GraphQLInput
import kotlin.Any
import kotlin.Pair
import kotlin.String
import kotlin.collections.List

public data class SomeType @JsonCreator constructor(
public data class SomeType(
@JsonProperty("names")
public val names: List<String?>? = default<SomeType, List<String?>?>("names", emptyList()),
) : GraphQLInput() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package com.netflix.graphql.dgs.codegen.cases.inputWithDefaultValueForEnum.expected.types

import com.fasterxml.jackson.`annotation`.JsonCreator
import com.fasterxml.jackson.`annotation`.JsonProperty
import com.netflix.graphql.dgs.codegen.GraphQLInput
import kotlin.Any
import kotlin.Pair
import kotlin.String
import kotlin.collections.List

public data class ColorFilter @JsonCreator constructor(
public data class ColorFilter(
@JsonProperty("color")
public val color: Color? = default<ColorFilter, Color?>("color",
com.netflix.graphql.dgs.codegen.cases.inputWithDefaultValueForEnum.expected.types.Color.red),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package com.netflix.graphql.dgs.codegen.cases.inputWithDefaultValueForNonNullableFields.expected.types

import com.fasterxml.jackson.`annotation`.JsonCreator
import com.fasterxml.jackson.`annotation`.JsonProperty
import com.netflix.graphql.dgs.codegen.GraphQLInput
import kotlin.Any
import kotlin.Pair
import kotlin.String
import kotlin.collections.List

public data class Car @JsonCreator constructor(
public data class Car(
@JsonProperty("brand")
public val brand: String = default<Car, String>("brand", "BMW"),
) : GraphQLInput() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.netflix.graphql.dgs.codegen.cases.inputWithDefaultValueForNonNullableFields.expected.types

import com.fasterxml.jackson.`annotation`.JsonCreator
import com.fasterxml.jackson.`annotation`.JsonProperty
import com.netflix.graphql.dgs.codegen.GraphQLInput
import kotlin.Any
Expand All @@ -10,7 +9,7 @@ import kotlin.Pair
import kotlin.String
import kotlin.collections.List

public data class Person @JsonCreator constructor(
public data class Person(
@JsonProperty("name")
public val name: String = default<Person, String>("name", "Damian"),
@JsonProperty("age")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package com.netflix.graphql.dgs.codegen.cases.inputWithDefaultValueForObject.expected.types

import com.fasterxml.jackson.`annotation`.JsonCreator
import com.fasterxml.jackson.`annotation`.JsonProperty
import com.netflix.graphql.dgs.codegen.GraphQLInput
import kotlin.Any
import kotlin.Pair
import kotlin.String
import kotlin.collections.List

public data class Car @JsonCreator constructor(
public data class Car(
@JsonProperty("brand")
public val brand: String = default<Car, String>("brand", "BMW"),
) : GraphQLInput() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package com.netflix.graphql.dgs.codegen.cases.inputWithDefaultValueForObject.expected.types

import com.fasterxml.jackson.`annotation`.JsonCreator
import com.fasterxml.jackson.`annotation`.JsonProperty
import com.netflix.graphql.dgs.codegen.GraphQLInput
import kotlin.Any
import kotlin.Pair
import kotlin.String
import kotlin.collections.List

public data class MovieFilter @JsonCreator constructor(
public data class MovieFilter(
@JsonProperty("director")
public val director: Person? = default<MovieFilter, Person?>("director",
com.netflix.graphql.dgs.codegen.cases.inputWithDefaultValueForObject.expected.types.Person(name
Expand Down
Loading
Loading