From 10f7966fa3a8a4155347ea48e1b0b0116df6205a Mon Sep 17 00:00:00 2001 From: maxhov <14804474+maxhov@users.noreply.github.com> Date: Mon, 3 Jan 2022 20:21:00 +0100 Subject: [PATCH 1/2] Add support for java.time.Instant in DateTimeScalar --- src/main/java/graphql/scalars/datetime/DateTimeScalar.java | 6 ++++++ .../graphql/scalars/datetime/DateTimeScalarTest.groovy | 4 ++++ src/test/groovy/graphql/scalars/util/TestKit.groovy | 6 ++++++ 3 files changed, 16 insertions(+) diff --git a/src/main/java/graphql/scalars/datetime/DateTimeScalar.java b/src/main/java/graphql/scalars/datetime/DateTimeScalar.java index 631c611..bfa6051 100644 --- a/src/main/java/graphql/scalars/datetime/DateTimeScalar.java +++ b/src/main/java/graphql/scalars/datetime/DateTimeScalar.java @@ -10,7 +10,9 @@ import graphql.schema.GraphQLScalarType; import java.time.DateTimeException; +import java.time.Instant; import java.time.OffsetDateTime; +import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; @@ -35,6 +37,8 @@ public String serialize(Object input) throws CoercingSerializeException { offsetDateTime = (OffsetDateTime) input; } else if (input instanceof ZonedDateTime) { offsetDateTime = ((ZonedDateTime) input).toOffsetDateTime(); + } else if (input instanceof Instant) { + offsetDateTime = ((Instant) input).atOffset(ZoneOffset.UTC); } else if (input instanceof String) { offsetDateTime = parseOffsetDateTime(input.toString(), CoercingSerializeException::new); } else { @@ -58,6 +62,8 @@ public OffsetDateTime parseValue(Object input) throws CoercingParseValueExceptio offsetDateTime = (OffsetDateTime) input; } else if (input instanceof ZonedDateTime) { offsetDateTime = ((ZonedDateTime) input).toOffsetDateTime(); + } else if (input instanceof Instant) { + offsetDateTime = ((Instant) input).atOffset(ZoneOffset.UTC); } else if (input instanceof String) { offsetDateTime = parseOffsetDateTime(input.toString(), CoercingParseValueException::new); } else { diff --git a/src/test/groovy/graphql/scalars/datetime/DateTimeScalarTest.groovy b/src/test/groovy/graphql/scalars/datetime/DateTimeScalarTest.groovy index 8184cf7..54eef52 100644 --- a/src/test/groovy/graphql/scalars/datetime/DateTimeScalarTest.groovy +++ b/src/test/groovy/graphql/scalars/datetime/DateTimeScalarTest.groovy @@ -7,6 +7,7 @@ import graphql.schema.CoercingSerializeException import spock.lang.Specification import spock.lang.Unroll +import static graphql.scalars.util.TestKit.mkInstant import static graphql.scalars.util.TestKit.mkLocalDT import static graphql.scalars.util.TestKit.mkOffsetDT import static graphql.scalars.util.TestKit.mkStringValue @@ -30,6 +31,7 @@ class DateTimeScalarTest extends Specification { "1937-01-01T12:00:27.87+00:20" | mkOffsetDT("1937-01-01T12:00:27.87+00:20") mkOffsetDT(year: 1980, hour: 3) | mkOffsetDT("1980-08-08T03:10:09+10:00") mkZonedDT(year: 1980, hour: 3) | mkOffsetDT("1980-08-08T03:10:09+10:00") + mkInstant(year: 1980, hour: 3) | mkOffsetDT("1980-08-08T03:10:09Z") } @Unroll @@ -46,6 +48,7 @@ class DateTimeScalarTest extends Specification { "1937-01-01T12:00:27.87+00:20" | mkStringValue("1937-01-01T12:00:27.87+00:20") mkOffsetDT(year: 1980, hour: 3) | mkStringValue("1980-08-08T03:10:09+10:00") mkZonedDT(year: 1980, hour: 3) | mkStringValue("1980-08-08T03:10:09+10:00") + mkInstant(year: 1980, hour: 3) | mkStringValue("1980-08-08T03:10:09Z") } @Unroll @@ -86,6 +89,7 @@ class DateTimeScalarTest extends Specification { "1937-01-01T12:00:27.87+00:20" | "1937-01-01T12:00:27.87+00:20" mkOffsetDT(year: 1980, hour: 3) | "1980-08-08T03:10:09+10:00" mkZonedDT(year: 1980, hour: 3) | "1980-08-08T03:10:09+10:00" + mkInstant(year: 1980, hour: 3) | "1980-08-08T03:10:09Z" } def "datetime serialisation bad inputs"() { diff --git a/src/test/groovy/graphql/scalars/util/TestKit.groovy b/src/test/groovy/graphql/scalars/util/TestKit.groovy index 213a863..f623305 100644 --- a/src/test/groovy/graphql/scalars/util/TestKit.groovy +++ b/src/test/groovy/graphql/scalars/util/TestKit.groovy @@ -4,6 +4,7 @@ import graphql.language.FloatValue import graphql.language.IntValue import graphql.language.StringValue +import java.time.Instant import java.time.LocalDate import java.time.LocalDateTime import java.time.OffsetDateTime @@ -45,6 +46,11 @@ class TestKit { args.min ?: 10, args.secs ?: 9, args.nanos ?: 0, ZoneId.ofOffset("", ZoneOffset.ofHours(10))) } + static Instant mkInstant(args) { + OffsetDateTime.of(args.year ?: 1969, args.month ?: 8, args.day ?: 8, args.hour ?: 11, + args.min ?: 10, args.secs ?: 9, args.nanos ?: 0, ZoneOffset.UTC).toInstant() + } + static assertValueOrException(result, expectedResult) { if (result instanceof Exception) { From 61c573fe6fc7d8fd35187bb917de851627ddc62b Mon Sep 17 00:00:00 2001 From: maxhov <14804474+maxhov@users.noreply.github.com> Date: Mon, 3 Jan 2022 20:28:38 +0100 Subject: [PATCH 2/2] Add support for java.util.Date in DateTimeScalar --- src/main/java/graphql/scalars/datetime/DateTimeScalar.java | 5 +++++ .../graphql/scalars/datetime/DateTimeScalarTest.groovy | 4 ++++ src/test/groovy/graphql/scalars/util/TestKit.groovy | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/src/main/java/graphql/scalars/datetime/DateTimeScalar.java b/src/main/java/graphql/scalars/datetime/DateTimeScalar.java index bfa6051..5bf256f 100644 --- a/src/main/java/graphql/scalars/datetime/DateTimeScalar.java +++ b/src/main/java/graphql/scalars/datetime/DateTimeScalar.java @@ -16,6 +16,7 @@ import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; +import java.util.Date; import java.util.function.Function; import static graphql.scalars.util.Kit.typeName; @@ -39,6 +40,8 @@ public String serialize(Object input) throws CoercingSerializeException { offsetDateTime = ((ZonedDateTime) input).toOffsetDateTime(); } else if (input instanceof Instant) { offsetDateTime = ((Instant) input).atOffset(ZoneOffset.UTC); + } else if (input instanceof Date) { + offsetDateTime = ((Date) input).toInstant().atOffset(ZoneOffset.UTC); } else if (input instanceof String) { offsetDateTime = parseOffsetDateTime(input.toString(), CoercingSerializeException::new); } else { @@ -64,6 +67,8 @@ public OffsetDateTime parseValue(Object input) throws CoercingParseValueExceptio offsetDateTime = ((ZonedDateTime) input).toOffsetDateTime(); } else if (input instanceof Instant) { offsetDateTime = ((Instant) input).atOffset(ZoneOffset.UTC); + } else if (input instanceof Date) { + offsetDateTime = ((Date) input).toInstant().atOffset(ZoneOffset.UTC); } else if (input instanceof String) { offsetDateTime = parseOffsetDateTime(input.toString(), CoercingParseValueException::new); } else { diff --git a/src/test/groovy/graphql/scalars/datetime/DateTimeScalarTest.groovy b/src/test/groovy/graphql/scalars/datetime/DateTimeScalarTest.groovy index 54eef52..2537d68 100644 --- a/src/test/groovy/graphql/scalars/datetime/DateTimeScalarTest.groovy +++ b/src/test/groovy/graphql/scalars/datetime/DateTimeScalarTest.groovy @@ -7,6 +7,7 @@ import graphql.schema.CoercingSerializeException import spock.lang.Specification import spock.lang.Unroll +import static graphql.scalars.util.TestKit.mkDate import static graphql.scalars.util.TestKit.mkInstant import static graphql.scalars.util.TestKit.mkLocalDT import static graphql.scalars.util.TestKit.mkOffsetDT @@ -32,6 +33,7 @@ class DateTimeScalarTest extends Specification { mkOffsetDT(year: 1980, hour: 3) | mkOffsetDT("1980-08-08T03:10:09+10:00") mkZonedDT(year: 1980, hour: 3) | mkOffsetDT("1980-08-08T03:10:09+10:00") mkInstant(year: 1980, hour: 3) | mkOffsetDT("1980-08-08T03:10:09Z") + mkDate(year: 1980, hour: 3) | mkOffsetDT("1980-08-08T03:10:09Z") } @Unroll @@ -49,6 +51,7 @@ class DateTimeScalarTest extends Specification { mkOffsetDT(year: 1980, hour: 3) | mkStringValue("1980-08-08T03:10:09+10:00") mkZonedDT(year: 1980, hour: 3) | mkStringValue("1980-08-08T03:10:09+10:00") mkInstant(year: 1980, hour: 3) | mkStringValue("1980-08-08T03:10:09Z") + mkDate(year: 1980, hour: 3) | mkStringValue("1980-08-08T03:10:09Z") } @Unroll @@ -90,6 +93,7 @@ class DateTimeScalarTest extends Specification { mkOffsetDT(year: 1980, hour: 3) | "1980-08-08T03:10:09+10:00" mkZonedDT(year: 1980, hour: 3) | "1980-08-08T03:10:09+10:00" mkInstant(year: 1980, hour: 3) | "1980-08-08T03:10:09Z" + mkDate(year: 1980, hour: 3) | "1980-08-08T03:10:09Z" } def "datetime serialisation bad inputs"() { diff --git a/src/test/groovy/graphql/scalars/util/TestKit.groovy b/src/test/groovy/graphql/scalars/util/TestKit.groovy index f623305..905a370 100644 --- a/src/test/groovy/graphql/scalars/util/TestKit.groovy +++ b/src/test/groovy/graphql/scalars/util/TestKit.groovy @@ -51,6 +51,10 @@ class TestKit { args.min ?: 10, args.secs ?: 9, args.nanos ?: 0, ZoneOffset.UTC).toInstant() } + static Date mkDate(args) { + Date.from(mkInstant(args)) + } + static assertValueOrException(result, expectedResult) { if (result instanceof Exception) {