Skip to content

Commit a65e215

Browse files
committed
use datetimeprovider in methods that get the current time
1 parent 1e2ac92 commit a65e215

File tree

6 files changed

+100
-14
lines changed

6 files changed

+100
-14
lines changed

src/main/java/com/hubspot/jinjava/lib/fn/Functions.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.hubspot.jinjava.interpret.TemplateError;
1414
import com.hubspot.jinjava.mode.ExecutionMode;
1515
import com.hubspot.jinjava.objects.Namespace;
16+
import com.hubspot.jinjava.objects.date.DateTimeProvider;
1617
import com.hubspot.jinjava.objects.date.PyishDate;
1718
import com.hubspot.jinjava.objects.date.StrftimeFormatter;
1819
import com.hubspot.jinjava.tree.Node;
@@ -245,7 +246,14 @@ public static ZonedDateTime getDateTimeArg(Object var, ZoneId zoneOffset) {
245246
JinjavaInterpreter.getCurrent().getPosition()
246247
);
247248
}
248-
d = ZonedDateTime.now(zoneOffset);
249+
long currentMillis = JinjavaInterpreter
250+
.getCurrentMaybe()
251+
.map(JinjavaInterpreter::getConfig)
252+
.map(JinjavaConfig::getDateTimeProvider)
253+
.map(DateTimeProvider::getCurrentTimeMillis)
254+
.orElse(System.currentTimeMillis());
255+
256+
d = ZonedDateTime.ofInstant(Instant.ofEpochMilli(currentMillis), zoneOffset);
249257
} else if (var instanceof Number) {
250258
d =
251259
ZonedDateTime.ofInstant(

src/main/java/com/hubspot/jinjava/objects/date/PyishDate.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.hubspot.jinjava.objects.date;
22

3+
import com.hubspot.jinjava.JinjavaConfig;
34
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
45
import com.hubspot.jinjava.objects.PyWrapper;
56
import com.hubspot.jinjava.objects.serialization.PyishObjectMapper;
@@ -50,7 +51,17 @@ public PyishDate(Long epochMillis) {
5051
this(
5152
ZonedDateTime.ofInstant(
5253
Instant.ofEpochMilli(
53-
Optional.ofNullable(epochMillis).orElseGet(System::currentTimeMillis)
54+
Optional
55+
.ofNullable(epochMillis)
56+
.orElseGet(
57+
() ->
58+
JinjavaInterpreter
59+
.getCurrentMaybe()
60+
.map(JinjavaInterpreter::getConfig)
61+
.map(JinjavaConfig::getDateTimeProvider)
62+
.map(DateTimeProvider::getCurrentTimeMillis)
63+
.orElse(System.currentTimeMillis())
64+
)
5465
),
5566
ZoneOffset.UTC
5667
)

src/test/java/com/hubspot/jinjava/lib/filter/UnixTimestampFilterTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ public void setup() {
2020
}
2121

2222
@After
23-
public void tearDown() throws Exception {
23+
public void tearDown() {
2424
assertThat(interpreter.getErrorsCopy()).isEmpty();
2525
}
2626

2727
@Test
28-
public void itRendersFromDate() throws Exception {
28+
public void itRendersFromDate() {
2929
assertThat(interpreter.renderFlat("{{ d|unixtimestamp }}")).isEqualTo(timestamp);
3030
}
3131
}

src/test/java/com/hubspot/jinjava/lib/fn/TodayFunctionTest.java

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,48 @@
1010
import com.hubspot.jinjava.interpret.InvalidArgumentException;
1111
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
1212
import com.hubspot.jinjava.mode.EagerExecutionMode;
13+
import com.hubspot.jinjava.objects.date.FixedDateTimeProvider;
1314
import java.time.ZoneId;
1415
import java.time.ZoneOffset;
1516
import java.time.ZonedDateTime;
1617
import org.junit.Test;
1718

1819
public class TodayFunctionTest extends BaseInterpretingTest {
20+
private static final String ZONE_NAME = "America/New_York";
21+
private static final ZoneId ZONE_ID = ZoneId.of(ZONE_NAME);
1922

2023
@Test
2124
public void itDefaultsToUtcTimezone() {
2225
ZonedDateTime zonedDateTime = Functions.today();
2326
assertThat(zonedDateTime.getZone()).isEqualTo(ZoneOffset.UTC);
2427
}
2528

29+
@Test
30+
public void itUsesFixedDateTimeProvider() {
31+
long ts = 1233333414223L;
32+
33+
JinjavaInterpreter.pushCurrent(
34+
new JinjavaInterpreter(
35+
new Jinjava(),
36+
new Context(),
37+
JinjavaConfig
38+
.newBuilder()
39+
.withDateTimeProvider(new FixedDateTimeProvider(ts))
40+
.build()
41+
)
42+
);
43+
try {
44+
assertThat(Functions.today(ZONE_NAME))
45+
.isEqualTo(ZonedDateTime.of(2009, 1, 30, 0, 0, 0, 0, ZONE_ID));
46+
} finally {
47+
JinjavaInterpreter.popCurrent();
48+
}
49+
}
50+
2651
@Test
2752
public void itParsesTimezones() {
28-
ZonedDateTime zonedDateTime = Functions.today("America/New_York");
29-
assertThat(zonedDateTime.getZone()).isEqualTo(ZoneId.of("America/New_York"));
53+
ZonedDateTime zonedDateTime = Functions.today(ZONE_NAME);
54+
assertThat(zonedDateTime.getZone()).isEqualTo(ZONE_ID);
3055
}
3156

3257
@Test(expected = InvalidArgumentException.class)
@@ -52,7 +77,7 @@ public void itDefersWhenExecutingEagerly() {
5277
)
5378
);
5479
try {
55-
Functions.today("America/New_York");
80+
Functions.today(ZONE_NAME);
5681
} finally {
5782
JinjavaInterpreter.popCurrent();
5883
}

src/test/java/com/hubspot/jinjava/lib/fn/UnixTimestampFunctionTest.java

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
import com.hubspot.jinjava.interpret.DeferredValueException;
99
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
1010
import com.hubspot.jinjava.mode.EagerExecutionMode;
11+
import com.hubspot.jinjava.objects.date.FixedDateTimeProvider;
1112
import java.time.ZonedDateTime;
13+
import org.assertj.core.data.Offset;
1214
import org.junit.Test;
1315

1416
public class UnixTimestampFunctionTest {
@@ -24,14 +26,29 @@ public void itGetsUnixTimestamps() {
2426
.isLessThanOrEqualTo(System.currentTimeMillis());
2527
assertThat(Functions.unixtimestamp(epochMilliseconds)).isEqualTo(epochMilliseconds);
2628
assertThat(Functions.unixtimestamp(d)).isEqualTo(epochMilliseconds);
27-
assertThat(
28-
Math.abs(
29-
Functions.unixtimestamp((Object) null) -
30-
ZonedDateTime.now().toEpochSecond() *
31-
1000
32-
)
29+
assertThat(Functions.unixtimestamp((Object) null))
30+
.isCloseTo(System.currentTimeMillis(), Offset.offset(1000L));
31+
}
32+
33+
@Test
34+
public void itUsesFixedDateTimeProvider() {
35+
long ts = 1233333414223L;
36+
37+
JinjavaInterpreter.pushCurrent(
38+
new JinjavaInterpreter(
39+
new Jinjava(),
40+
new Context(),
41+
JinjavaConfig
42+
.newBuilder()
43+
.withDateTimeProvider(new FixedDateTimeProvider(ts))
44+
.build()
3345
)
34-
.isLessThan(1000);
46+
);
47+
try {
48+
assertThat(Functions.unixtimestamp((Object) null)).isEqualTo(ts);
49+
} finally {
50+
JinjavaInterpreter.popCurrent();
51+
}
3552
}
3653

3754
@Test(expected = DeferredValueException.class)

src/test/java/com/hubspot/jinjava/objects/date/PyishDateTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
import static org.assertj.core.api.Assertions.assertThat;
44

55
import com.hubspot.jinjava.Jinjava;
6+
import com.hubspot.jinjava.JinjavaConfig;
7+
import com.hubspot.jinjava.interpret.Context;
68
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
79
import com.hubspot.jinjava.objects.serialization.PyishObjectMapper;
10+
import java.time.Instant;
811
import java.time.ZoneOffset;
912
import java.time.ZonedDateTime;
1013
import java.util.Date;
@@ -18,6 +21,28 @@ public void itUsesCurrentTimeWhenNoneProvided() {
1821
assertThat(d.toDate()).isCloseTo(new Date(), 10000);
1922
}
2023

24+
@Test
25+
public void itUsesDateTimeProviderWhenNoTimeProvided() {
26+
long ts = 123345414223L;
27+
28+
JinjavaInterpreter.pushCurrent(
29+
new JinjavaInterpreter(
30+
new Jinjava(),
31+
new Context(),
32+
JinjavaConfig
33+
.newBuilder()
34+
.withDateTimeProvider(new FixedDateTimeProvider(ts))
35+
.build()
36+
)
37+
);
38+
try {
39+
PyishDate d = new PyishDate((Long) null);
40+
assertThat(d.toDate()).isEqualTo(Date.from(Instant.ofEpochMilli(ts)));
41+
} finally {
42+
JinjavaInterpreter.popCurrent();
43+
}
44+
}
45+
2146
@Test
2247
public void testStrfmt() {
2348
PyishDate d = new PyishDate(ZonedDateTime.parse("2013-11-12T14:15:00+00:00"));

0 commit comments

Comments
 (0)