/*
* #%L
* Wisdom-Framework
* %%
* Copyright (C) 2013 - 2014 Wisdom Framework
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
package org.wisdom.template.thymeleaf.impl;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import org.junit.After;
import org.junit.Test;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.dialect.IDialect;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import org.wisdom.api.Controller;
import org.wisdom.api.asset.Assets;
import org.wisdom.api.http.Result;
import org.wisdom.api.templates.Template;
import org.wisdom.template.thymeleaf.dialect.Routes;
import org.wisdom.test.parents.Action;
import org.wisdom.test.parents.FakeContext;
import org.wisdom.test.parents.Invocation;
import java.io.File;
import java.net.MalformedURLException;
import java.util.Collections;
import java.util.Set;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.wisdom.api.http.Results.ok;
import static org.wisdom.test.parents.Action.action;
/**
* Check template processing.
*/
public class WisdomTemplateEngineTest {
@Test
public void testJavaScript() {
TemplateEngine engine = createWisdomEngine();
engine.initialize();
Context context = new Context();
context.setVariable("test", "test");
FakeRouter router = new FakeRouter();
Controller controller = new FakeController();
router.addController(controller);
Assets assets = mock(Assets.class);
context.setVariable(Routes.ROUTES_VAR, new Routes(router, assets, controller));
String processed = engine.process("templates/javascript.thl.html", context);
assertThat(processed).containsIgnoringCase("var t = 'test';");
assertThat(processed).containsIgnoringCase("var url = '/';");
assertThat(processed).containsIgnoringCase("$(document).ready(function () {");
}
@Test
public void testSessionScope() {
final WisdomTemplateEngine engine = createWisdomEngine();
engine.initialize();
final Template template = mock(Template.class);
when(template.fullName()).thenReturn("templates/var.thl.html");
final FakeRouter router = new FakeRouter();
final Controller controller = new FakeController();
router.addController(controller);
final Assets assets = mock(Assets.class);
Action.ActionResult result = action(new Invocation() {
@Override
public Result invoke() throws Throwable {
return ok(engine.process(template, controller, router, assets, ImmutableMap.<String, Object>of("key",
"test")));
}
}).with(new FakeContext().addToSession("key2", "session")).invoke();
String content = (String) result.getResult().getRenderable().content();
assertThat(content)
.contains("<span>KEY</span> = <span>test</span>")
.contains("<span>KEY2</span> = <span>session</span>");
}
@Test
public void testFlashScope() {
final WisdomTemplateEngine engine = createWisdomEngine();
engine.initialize();
final Template template = mock(Template.class);
when(template.fullName()).thenReturn("templates/var.thl.html");
final FakeRouter router = new FakeRouter();
final Controller controller = new FakeController();
router.addController(controller);
final Assets assets = mock(Assets.class);
Action.ActionResult result = action(new Invocation() {
@Override
public Result invoke() throws Throwable {
context().flash().put("key2", "ongoing");
return ok(engine.process(template, controller, router, assets, ImmutableMap.<String, Object>of()));
}
}).with(new FakeContext().addToFlash("key", "incoming")).invoke();
String content = (String) result.getResult().getRenderable().content();
assertThat(content)
.contains("<span>KEY</span> = <span>incoming</span>")
.contains("<span>KEY2</span> = <span>ongoing</span>");
}
@Test
public void testParameter() {
final WisdomTemplateEngine engine = createWisdomEngine();
engine.initialize();
final Template template = mock(Template.class);
when(template.fullName()).thenReturn("templates/var.thl.html");
final FakeRouter router = new FakeRouter();
final Controller controller = new FakeController();
router.addController(controller);
final Assets assets = mock(Assets.class);
Action.ActionResult result = action(new Invocation() {
@Override
public Result invoke() throws Throwable {
context().session().put("key2", "ongoing");
return ok(engine.process(template, controller, router, assets, ImmutableMap.<String, Object>of()));
}
}).parameter("key", "param").invoke();
String content = (String) result.getResult().getRenderable().content();
assertThat(content)
.contains("<span>KEY</span> = <span>param</span>")
.contains("<span>KEY2</span> = <span>ongoing</span>");
}
@Test
public void testCustomDialect() {
MyDialect dialect = new MyDialect();
final WisdomTemplateEngine engine = createWisdomEngine(ImmutableSet.<IDialect>of(dialect));
engine.initialize();
final Template template = mock(Template.class);
when(template.fullName()).thenReturn("templates/dialect.thl.html");
final FakeRouter router = new FakeRouter();
final Controller controller = new FakeController();
router.addController(controller);
final Assets assets = mock(Assets.class);
Action.ActionResult result = action(new Invocation() {
@Override
public Result invoke() throws Throwable {
return ok(engine.process(template, controller, router, assets, ImmutableMap.<String, Object>of()));
}
}).parameter("key", "param").invoke();
String content = (String) result.getResult().getRenderable().content();
assertThat(content).contains("Hello, World!");
}
@Test
public void testCustomDialectDynamics() throws MalformedURLException {
MyDialect dialect = new MyDialect();
MyFileTemplateResolver resolver = new MyFileTemplateResolver();
final WisdomTemplateEngine engine = createWisdomEngine(ImmutableSet.<IDialect>of(dialect));
engine.setTemplateResolver(resolver);
engine.initialize();
File file = new File("src/test/resources/templates/dialect.thl.html");
assertThat(file).exists();
final FakeRouter router = new FakeRouter();
final Controller controller = new FakeController();
final Assets assets = mock(Assets.class);
final ThymeLeafTemplateImplementation template = new ThymeLeafTemplateImplementation(engine, file, router,
assets, null);
router.addController(controller);
Action.ActionResult result = action(new Invocation() {
@Override
public Result invoke() throws Throwable {
return ok(template.render(controller));
}
}).invoke();
String content = (String) result.getResult().getRenderable().content();
assertThat(content).contains("Hello, World!");
final WisdomTemplateEngine engine2 = createWisdomEngine();
engine2.setTemplateResolver(resolver);
engine2.initialize();
template.updateEngine(engine2);
result = action(new Invocation() {
@Override
public Result invoke() throws Throwable {
return ok(template.render(controller));
}
}).invoke();
content = (String) result.getResult().getRenderable().content();
assertThat(content).doesNotContain("Hello, World!").contains("Hi ya!");
}
@After
public void tearDown() {
org.wisdom.api.http.Context.CONTEXT.remove();
}
@Test
public void testObjects() {
FakeContext http = new FakeContext();
http.session().put("value", "session");
http.flash().put("value", "flash");
http.request().data().put("value", "request");
org.wisdom.api.http.Context.CONTEXT.set(http);
TemplateEngine engine = createWisdomEngine();
engine.initialize();
Context context = new Context();
context.setVariable("test", "test");
FakeRouter router = new FakeRouter();
Controller controller = new FakeController();
router.addController(controller);
Assets assets = mock(Assets.class);
context.setVariable(Routes.ROUTES_VAR, new Routes(router, assets, controller));
String processed = engine.process("templates/objects.thl.html", context);
assertThat(processed)
.contains("<span>session</span>")
.contains("<span>flash</span>")
.contains("<span>request</span>");
}
private WisdomTemplateEngine createWisdomEngine(Set<IDialect> dialects) {
WisdomTemplateEngine engine = new WisdomTemplateEngine(dialects);
engine.setTemplateResolver(new ClassLoaderTemplateResolver());
return engine;
}
private WisdomTemplateEngine createWisdomEngine() {
return createWisdomEngine(Collections.<IDialect>emptySet());
}
}