package com.hubspot.jinjava.lib.filter;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import com.hubspot.jinjava.Jinjava;
import com.hubspot.jinjava.interpret.JinjavaInterpreter;
public class AdvancedFilterTest {
Jinjava jinjava;
@Test
public void testOnlyArgs() {
jinjava = new Jinjava();
Object[] expectedArgs = new Object[] {3L, 1L};
Map<String, Object> expectedKwargs = new HashMap<>();
jinjava.getGlobalContext().registerFilter(new MyMirrorFilter(expectedArgs, expectedKwargs));
assertThat(jinjava.render("{{ 'test'|mirror(3, 1) }}", new HashMap<>())).isEqualTo("test");
}
@Test
public void testOnlyKwargs() {
jinjava = new Jinjava();
Object[] expectedArgs = new Object[] {};
Map<String, Object> expectedKwargs = new HashMap<String, Object>() {{
put("named10", "str");
put("named2", 3L);
put("namedB", true);
}};
jinjava.getGlobalContext().registerFilter(new MyMirrorFilter(expectedArgs, expectedKwargs));
assertThat(jinjava.render("{{ 'test'|mirror(named2=3, named10='str', namedB=true) }}", new HashMap<>())).isEqualTo("test");
}
@Test
public void itTestsNullKwargs() {
jinjava = new Jinjava();
Object[] expectedArgs = new Object[] {};
Map<String, Object> expectedKwargs = new HashMap<String, Object>() {{
put("named1", null);
}};
jinjava.getGlobalContext().registerFilter(new MyMirrorFilter(expectedArgs, expectedKwargs));
assertThat(jinjava.render("{{ 'test'|divide(named1) }}", new HashMap<>())).isEqualTo("test");
}
@Test
public void testMixedArgsAndKwargs() {
jinjava = new Jinjava();
Object[] expectedArgs = new Object[] {1L, 2L};
Map<String, Object> expectedKwargs = new HashMap<String, Object>() {{
put("named", "test");
}};
jinjava.getGlobalContext().registerFilter(new MyMirrorFilter(expectedArgs, expectedKwargs));
assertThat(jinjava.render("{{ 'test'|mirror(1, 2, named='test') }}", new HashMap<>())).isEqualTo("test");
}
@Test
public void testUnorderedArgsAndKwargs() {
jinjava = new Jinjava();
Object[] expectedArgs = new Object[] {"1", 2L};
Map<String, Object> expectedKwargs = new HashMap<String, Object>() {{
put("named", "test");
}};
jinjava.getGlobalContext().registerFilter(new MyMirrorFilter(expectedArgs, expectedKwargs));
assertThat(jinjava.render("{{ 'test'|mirror('1', named='test', 2) }}", new HashMap<>())).isEqualTo("test");
}
@Test
public void testRepeatedKwargs() {
jinjava = new Jinjava();
Object[] expectedArgs = new Object[] {true};
Map<String, Object> expectedKwargs = new HashMap<String, Object>() {{
put("named", "overwrite");
}};
jinjava.getGlobalContext().registerFilter(new MyMirrorFilter(expectedArgs, expectedKwargs));
assertThat(jinjava.render("{{ 'test'|mirror(true, named='test', named='overwrite') }}", new HashMap<>())).isEqualTo("test");
}
private static class MyMirrorFilter implements AdvancedFilter {
private Object[] expectedArgs;
private Map<String, Object> expectedKwargs;
MyMirrorFilter(Object[] args, Map<String, Object> kwargs) {
this.expectedArgs = args;
this.expectedKwargs = kwargs;
}
@Override
public String getName() {
return "mirror";
}
@Override
public Object filter(Object var, JinjavaInterpreter interpreter, Object[] args, Map<String, Object> kwargs) {
if (!Arrays.equals(expectedArgs, args)) {
throw new RuntimeException(
"Args are different than expected: " +
Arrays.toString(args) +
" to " +
Arrays.toString(expectedArgs)
);
}
if (!expectedKwargs.equals(kwargs)) {
throw new RuntimeException(
"Kwargs are different than expected: " +
Arrays.toString(kwargs.entrySet().toArray()) +
" to " +
Arrays.toString(expectedKwargs.entrySet().toArray())
);
}
return var;
}
}
}