diff --git a/core/src/test/java/org/opensearch/sql/expression/datetime/ExtractTest.java b/core/src/test/java/org/opensearch/sql/expression/datetime/ExtractTest.java index 600a365a96..d7635de610 100644 --- a/core/src/test/java/org/opensearch/sql/expression/datetime/ExtractTest.java +++ b/core/src/test/java/org/opensearch/sql/expression/datetime/ExtractTest.java @@ -5,7 +5,7 @@ package org.opensearch.sql.expression.datetime; -import static java.time.temporal.ChronoField.DAY_OF_WEEK; +import static java.time.temporal.ChronoField.ALIGNED_WEEK_OF_YEAR; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.opensearch.sql.data.type.ExprCoreType.LONG; @@ -92,19 +92,23 @@ private void datePartWithTimeArgQuery(String part, String time, long expected) { @Test public void testExtractDatePartWithTimeType() { - datePartWithTimeArgQuery( - "DAY", timeInput, LocalDate.now(functionProperties.getQueryStartClock()).getDayOfMonth()); + LocalDate now = LocalDate.now(functionProperties.getQueryStartClock()); - datePartWithTimeArgQuery( - "WEEK", - timeInput, - LocalDate.now(functionProperties.getQueryStartClock()).get(DAY_OF_WEEK)); + datePartWithTimeArgQuery("DAY", timeInput, now.getDayOfMonth()); - datePartWithTimeArgQuery( - "MONTH", timeInput, LocalDate.now(functionProperties.getQueryStartClock()).getMonthValue()); + // To avoid flaky test, skip the testing in December and January because the WEEK is ISO 8601 + // week-of-week-based-year which is considered to start on a Monday and week 1 is the first week + // with >3 days. it is possible for early-January dates to be part of the 52nd or 53rd week of + // the previous year, and for late-December dates to be part of the first week of the next year. + // For example, 2005-01-02 is part of the 53rd week of year 2004, while 2012-12-31 is part of + // the first week of 2013 + if (now.getMonthValue() != 1 && now.getMonthValue() != 12) { + datePartWithTimeArgQuery("WEEK", datetimeInput, now.get(ALIGNED_WEEK_OF_YEAR)); + } - datePartWithTimeArgQuery( - "YEAR", timeInput, LocalDate.now(functionProperties.getQueryStartClock()).getYear()); + datePartWithTimeArgQuery("MONTH", timeInput, now.getMonthValue()); + + datePartWithTimeArgQuery("YEAR", timeInput, now.getYear()); } @ParameterizedTest(name = "{0}")