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

Bugfix: Allow JSON Documents with DateTime scalars to be deserialized to Objects #271

Merged
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 @@ -18,6 +18,7 @@ package com.netflix.graphql.dgs.internal

import com.fasterxml.jackson.databind.DeserializationFeature
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.jayway.jsonpath.*
import com.jayway.jsonpath.spi.json.JacksonJsonProvider
Expand Down Expand Up @@ -64,6 +65,7 @@ class DefaultDgsQueryExecutor(
.mappingProvider(
JacksonMappingProvider(
jacksonObjectMapper()
.registerModule(JavaTimeModule())
.enable(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE)
.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import com.jayway.jsonpath.spi.mapper.MappingException
import com.netflix.graphql.dgs.DgsComponent
import com.netflix.graphql.dgs.DgsData
import com.netflix.graphql.dgs.DgsScalar
import com.netflix.graphql.dgs.LocalDateTimeScalar
import com.netflix.graphql.dgs.exceptions.DgsQueryExecutionDataExtractionException
import com.netflix.graphql.dgs.exceptions.QueryException
import graphql.execution.AsyncExecutionStrategy
Expand All @@ -36,6 +37,7 @@ import org.junit.jupiter.api.Test
import org.junit.jupiter.api.assertThrows
import org.junit.jupiter.api.extension.ExtendWith
import org.springframework.context.ApplicationContext
import java.time.LocalDateTime
import java.util.*
import java.util.function.Supplier

Expand Down Expand Up @@ -70,7 +72,7 @@ internal class DefaultDgsQueryExecutorTest {
val moviesFetcher = object : Any() {
@DgsData(parentType = "Query", field = "movies")
fun movies(): List<Movie> {
return listOf(Movie("Extraction"), Movie("Da 5 Bloods"))
return listOf(Movie("Extraction", LocalDateTime.MIN), Movie("Da 5 Bloods", LocalDateTime.MAX))
}
}

Expand All @@ -82,7 +84,7 @@ internal class DefaultDgsQueryExecutorTest {
}

every { applicationContextMock.getBeansWithAnnotation(DgsComponent::class.java) } returns mapOf(Pair("helloFetcher", fetcher), Pair("numbersFetcher", numbersFetcher), Pair("moviesFetcher", moviesFetcher), Pair("withErrorFetcher", fetcherWithError))
every { applicationContextMock.getBeansWithAnnotation(DgsScalar::class.java) } returns emptyMap()
every { applicationContextMock.getBeansWithAnnotation(DgsScalar::class.java) } returns mapOf(Pair("DateTimeScalar", LocalDateTimeScalar()))
every { dgsDataLoaderProvider.buildRegistryWithContextSupplier(any<Supplier<Any>>()) } returns DataLoaderRegistry()

val provider = DgsSchemaProvider(
Expand All @@ -103,11 +105,14 @@ internal class DefaultDgsQueryExecutorTest {

type Movie {
title: String
releaseDate: DateTime
}

type Person {
name: String
}

scalar DateTime
""".trimIndent()
)

Expand Down Expand Up @@ -147,49 +152,52 @@ internal class DefaultDgsQueryExecutorTest {
val movies = dgsQueryExecutor!!.executeAndExtractJsonPath<List<Map<String, Any>>>(
"""
{
movies { title }
movies { title releaseDate }
}
""".trimIndent(),
"data.movies"
)

assertThat(movies[0]["title"]).isEqualTo("Extraction")
assertThat(LocalDateTime.parse(movies[0]["releaseDate"] as CharSequence)).isEqualTo(LocalDateTime.MIN)
}

@Test
fun extractJsonAsObjectAsMap() {
val movie = dgsQueryExecutor!!.executeAndExtractJsonPath<Map<String, Any>>(
"""
{
movies { title }
movies { title releaseDate }
}
""".trimIndent(),
"data.movies[0]"
)

assertThat(movie["title"]).isEqualTo("Extraction")
assertThat(LocalDateTime.parse(movie["releaseDate"] as CharSequence)).isEqualTo(LocalDateTime.MIN)
}

@Test
fun extractJsonAsObject() {
val movie = dgsQueryExecutor!!.executeAndExtractJsonPathAsObject(
"""
{
movies { title }
movies { title releaseDate }
}
""".trimIndent(),
"data.movies[0]", Movie::class.java
)

assertThat(movie.title).isEqualTo("Extraction")
assertThat(movie.releaseDate).isEqualTo(LocalDateTime.MIN)
}

@Test
fun extractJsonAsObjectWithTypeRef() {
val person = dgsQueryExecutor!!.executeAndExtractJsonPathAsObject(
"""
{
movies { title }
movies { title releaseDate }
}
""".trimIndent(),
"data.movies", object : TypeRef<List<Movie>>() {}
Expand Down Expand Up @@ -260,7 +268,7 @@ internal class DefaultDgsQueryExecutorTest {
val context = dgsQueryExecutor!!.executeAndGetDocumentContext(
"""
{
movies { title }
movies { title releaseDate }
}
""".trimIndent()
)
Expand All @@ -285,6 +293,7 @@ internal class DefaultDgsQueryExecutorTest {
assertThat(movie).isNotNull
}

@Test
fun withFieldNamedErrors() {

val context = dgsQueryExecutor!!.executeAndGetDocumentContext(
Expand All @@ -300,4 +309,4 @@ internal class DefaultDgsQueryExecutorTest {
}
}

data class Movie(val title: String)
data class Movie(val title: String, val releaseDate: LocalDateTime?)