From c7d9ae65fc85fe2fef8034819c6a08dc685f5911 Mon Sep 17 00:00:00 2001 From: Igor Dianov Date: Fri, 31 Jan 2025 12:25:59 -0800 Subject: [PATCH] Fix NPE when parsing invalid timestamp variable inputs --- .../graphql/jpa/query/schema/JavaScalars.java | 3 +-- .../jpa/query/schema/JavaScalarsTest.java | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/scalars/src/main/java/com/introproventures/graphql/jpa/query/schema/JavaScalars.java b/scalars/src/main/java/com/introproventures/graphql/jpa/query/schema/JavaScalars.java index f18a8b332..99140370b 100644 --- a/scalars/src/main/java/com/introproventures/graphql/jpa/query/schema/JavaScalars.java +++ b/scalars/src/main/java/com/introproventures/graphql/jpa/query/schema/JavaScalars.java @@ -741,8 +741,7 @@ private Timestamp doConvert(Object input) { if (input instanceof Long longInput) { return new Timestamp(longInput); } else if (input instanceof String stringInput) { - Instant instant = DateTimeHelper.parseDate(stringInput); - return Timestamp.from(instant); + return Optional.of(stringInput).map(DateTimeHelper::parseDate).map(Timestamp::from).orElse(null); } else if (input instanceof Timestamp timestampInput) { return timestampInput; } else if (input instanceof Date dateInput) { diff --git a/scalars/src/test/java/com/introproventures/graphql/jpa/query/schema/JavaScalarsTest.java b/scalars/src/test/java/com/introproventures/graphql/jpa/query/schema/JavaScalarsTest.java index 0b43a3451..c0e21c7af 100644 --- a/scalars/src/test/java/com/introproventures/graphql/jpa/query/schema/JavaScalarsTest.java +++ b/scalars/src/test/java/com/introproventures/graphql/jpa/query/schema/JavaScalarsTest.java @@ -273,7 +273,7 @@ public void string2ZonedDateTime() { ZonedDateTime resultLDT = (ZonedDateTime) result; - assert resultLDT.getDayOfMonth() == 05; + assert resultLDT.getDayOfMonth() == 5; assert resultLDT.getMonth() == Month.AUGUST; assert resultLDT.getYear() == 2019; assert resultLDT.getHour() == 13; @@ -365,6 +365,20 @@ public void testTimestampParseDateValue() { .isEqualTo(expected); } + @Test + public void testTimestampParseInvalidValue() { + //given + Coercing coercing = JavaScalars.of(Timestamp.class).getCoercing(); + + //when + var throwable = catchThrowable(() -> coercing.parseValue("foobar")); + + //then + assertThat(throwable) + .isInstanceOf(CoercingParseValueException.class) + .hasMessageContaining("Invalid value 'foobar' for Timestamp"); + } + @Test public void testTimestampSerializeDateValue() { //given