diff --git a/src/main/java/com/hubspot/jinjava/lib/tag/ImportTag.java b/src/main/java/com/hubspot/jinjava/lib/tag/ImportTag.java index 8fbc7a83a..4ce3c9d27 100644 --- a/src/main/java/com/hubspot/jinjava/lib/tag/ImportTag.java +++ b/src/main/java/com/hubspot/jinjava/lib/tag/ImportTag.java @@ -211,9 +211,19 @@ public static void handleDeferredNodesDuringImport( interpreter.getContext().addGlobalMacro(macro); } childBindings.remove(Context.GLOBAL_MACROS_SCOPE_KEY); - childBindings - .keySet() - .forEach(key -> interpreter.getContext().put(key, DeferredValue.instance())); + childBindings.forEach((key, value) -> { + Object originalValue = value instanceof DeferredValue + ? ((DeferredValue) value).getOriginalValue() + : null; + interpreter + .getContext() + .put( + key, + originalValue != null + ? DeferredValue.instance(originalValue) + : DeferredValue.instance() + ); + }); } else { for (Map.Entry macroEntry : child .getContext() diff --git a/src/test/java/com/hubspot/jinjava/lib/tag/eager/EagerImportTagTest.java b/src/test/java/com/hubspot/jinjava/lib/tag/eager/EagerImportTagTest.java index 58de257ed..6e082e9e8 100644 --- a/src/test/java/com/hubspot/jinjava/lib/tag/eager/EagerImportTagTest.java +++ b/src/test/java/com/hubspot/jinjava/lib/tag/eager/EagerImportTagTest.java @@ -219,6 +219,34 @@ public void itHandlesMultiLayerDeferred() { .isEqualTo("bar val"); } + @Test + public void itPreservesOriginalValueOfDeferredImportedBindings() { + JinjavaInterpreter child = getChildInterpreter(interpreter, ""); + Map childBindings = new HashMap<>(); + childBindings.put("request", DeferredValue.instance("the real request")); + childBindings.put("valueless", DeferredValue.instance()); + + ImportTag.handleDeferredNodesDuringImport( + interpreter.parse(""), + "", + childBindings, + child, + interpreter + ); + + assertThat(interpreter.getContext().get("request")).isInstanceOf(DeferredValue.class); + assertThat( + ((DeferredValue) interpreter.getContext().get("request")).getOriginalValue() + ) + .isEqualTo("the real request"); + assertThat(interpreter.getContext().get("valueless")) + .isInstanceOf(DeferredValue.class); + assertThat( + ((DeferredValue) interpreter.getContext().get("valueless")).getOriginalValue() + ) + .isNull(); + } + @Test @SuppressWarnings("unchecked") public void itHandlesMultiLayerSomeAliased() {