package org.trimou.handlebars;
import static org.junit.Assert.assertEquals;
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.Test;
import org.trimou.AbstractTest;
import org.trimou.Hammer;
import org.trimou.Mustache;
import org.trimou.MustacheExceptionAssert;
import org.trimou.engine.MustacheEngine;
import org.trimou.engine.MustacheEngineBuilder;
import org.trimou.exception.MustacheProblem;
/**
*
* @author Martin Kouba
*/
public class CacheHelperTest extends AbstractTest {
@Test
public void testHelper() throws InterruptedException {
final MustacheEngine engine = MustacheEngineBuilder.newBuilder()
.registerHelpers(HelpersBuilder.empty().addCache().build())
.build();
CacheHelper cacheHelper = (CacheHelper) engine.getConfiguration()
.getHelpers().get(HelpersBuilder.CACHE);
final AtomicInteger hits = new AtomicInteger();
Mustache mustache = engine.compileMustache("cache_01",
"{{#cache}}{{this.age}}{{/cache}}");
Hammer hammer = new Hammer() {
@Override
public Integer getAge() {
hits.incrementAndGet();
return super.getAge();
}
};
assertEquals("10", mustache.render(hammer));
assertEquals("10", mustache.render(hammer));
hammer.setAge(11);
assertEquals("10", mustache.render(hammer));
assertEquals(1, hits.get());
// Test expiration
cacheHelper.invalidateFragments();
hammer.setAge(1);
mustache = engine.compileMustache("cache_02",
"{{#cache expire=1 unit='MILLISECONDS'}}{{this.age}}{{/cache}}");
assertEquals("1", mustache.render(hammer));
Thread.sleep(50);
hammer.setAge(2);
assertEquals("2", mustache.render(hammer));
// Test guard
cacheHelper.invalidateFragments();
hammer.setAge(5);
mustache = engine.compileMustache("cache_03",
"{{#cache guard=this.age}}{{this.age}}{{/cache}}");
assertEquals("5", mustache.render(hammer));
assertEquals("5", mustache.render(hammer));
hammer.setAge(50);
assertEquals("50", mustache.render(hammer));
// Test key
cacheHelper.invalidateFragments();
mustache = engine.compileMustache("cache_04",
"{{#cache key=this.id}}{{this.age}}{{/cache}}");
hammer.setAge(1000);
Hammer hammer2 = new Hammer(2000) {
@Override
public Integer getAge() {
hits.incrementAndGet();
return super.getAge();
}
};
Hammer hammer3 = new Hammer(3000) {
@Override
public Integer getAge() {
hits.incrementAndGet();
return super.getAge();
}
};
assertEquals("1000", mustache.render(hammer));
assertEquals("2000", mustache.render(hammer2));
assertEquals("3000", mustache.render(hammer3));
hammer.setAge(1001);
hammer2.setAge(2001);
hammer3.setAge(3001);
assertEquals("1000", mustache.render(hammer));
assertEquals("2000", mustache.render(hammer2));
assertEquals("3000", mustache.render(hammer3));
// Test invalidate
cacheHelper.invalidateFragments(hammer.getId());
assertEquals("1001", mustache.render(hammer));
assertEquals("2000", mustache.render(hammer2));
assertEquals("3000", mustache.render(hammer3));
}
@Test
public void testHelperConfiguration() throws InterruptedException {
final MustacheEngine engine = MustacheEngineBuilder.newBuilder()
.setProperty(CacheHelper.FRAGMENT_CACHE_MAX_SIZE_KEY, 0)
.registerHelpers(HelpersBuilder.empty().addCache().build())
.build();
Hammer hammer1 = new Hammer(1);
Hammer hammer2 = new Hammer(2);
Hammer hammer3 = new Hammer(3);
Mustache mustache = engine.compileMustache("cache_config_01",
"{{#cache key=this.id}}{{this.age}}{{/cache}}");
assertEquals("1", mustache.render(hammer1));
assertEquals("2", mustache.render(hammer2));
assertEquals("3", mustache.render(hammer3));
hammer1.setAge(11);
hammer2.setAge(22);
hammer3.setAge(33);
assertEquals("11", mustache.render(hammer1));
assertEquals("22", mustache.render(hammer2));
assertEquals("33", mustache.render(hammer3));
}
@Test
public void testValidation() {
MustacheExceptionAssert
.expect(MustacheProblem.COMPILE_HELPER_VALIDATION_FAILURE)
.check(() -> MustacheEngineBuilder.newBuilder()
.registerHelpers(
HelpersBuilder.empty().addCache().build())
.build()
.compileMustache("cache_validation_01", "{{cache}}"))
.check(() -> MustacheEngineBuilder.newBuilder()
.registerHelpers(
HelpersBuilder.empty().addCache().build())
.build().compileMustache("cache_validation_02",
"{{#cache expire='foo'}}{{/cache}}"))
.check(() -> MustacheEngineBuilder.newBuilder()
.registerHelpers(
HelpersBuilder.empty().addCache().build())
.build().compileMustache("cache_validation_03",
"{{#cache expire=1 unit='foo'}}{{/cache}}"));
}
}