package org.togglz.core.activation;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import org.junit.Test;
import org.togglz.core.Feature;
import org.togglz.core.repository.FeatureState;
import org.togglz.core.user.SimpleFeatureUser;
public class ScriptEngineActivationStrategyTest {
private static final String JAVASCRIPT = "ECMAScript";
private static final String UNKNOWN_LANGUAGE = "some language that doesn't exist";
private static final String SOME_SCRIPT = "some content";
private static final String INVALID_JAVASCRIPT = " = ,;";
@Test
public void shouldReturnFalseForUnsupportedLanguage() {
ScriptEngineActivationStrategy strategy = new ScriptEngineActivationStrategy();
FeatureState state = aScriptState(UNKNOWN_LANGUAGE, SOME_SCRIPT);
boolean active = strategy.isActive(state, aFeatureUser("john"));
assertThat(active).isFalse();
}
@Test
public void shouldReturnFalseForInvalidJavaScript() {
ScriptEngineActivationStrategy strategy = new ScriptEngineActivationStrategy();
FeatureState state = aScriptState(JAVASCRIPT, INVALID_JAVASCRIPT);
boolean active = strategy.isActive(state, aFeatureUser("john"));
assertThat(active).isFalse();
}
@Test
public void shouldReturnSameResultAsScriptForLiterals() {
ScriptEngineActivationStrategy strategy = new ScriptEngineActivationStrategy();
FeatureState stateAlwaysTrue = aScriptState(JAVASCRIPT, "1 == 1");
assertThat(strategy.isActive(stateAlwaysTrue, aFeatureUser("john"))).isTrue();
FeatureState stateAlwaysFalse = aScriptState(JAVASCRIPT, "0 == 1");
assertThat(strategy.isActive(stateAlwaysFalse, aFeatureUser("john"))).isFalse();
}
@Test
public void scriptCanAccessCurrentUser() {
ScriptEngineActivationStrategy strategy = new ScriptEngineActivationStrategy();
FeatureState state = aScriptState(JAVASCRIPT, "user.name == 'john'");
assertThat(strategy.isActive(state, aFeatureUser("john"))).isTrue();
assertThat(strategy.isActive(state, aFeatureUser("jim"))).isFalse();
}
@Test
public void scriptCanAccessUserAttributes() {
ScriptEngineActivationStrategy strategy = new ScriptEngineActivationStrategy();
FeatureState ageCheck = aScriptState(JAVASCRIPT, "user.getAttribute('age') >= 21");
SimpleFeatureUser child = aFeatureUser("john");
child.setAttribute("age", 12);
assertThat(strategy.isActive(ageCheck, child)).isFalse();
SimpleFeatureUser adult = aFeatureUser("peter");
adult.setAttribute("age", 25);
assertThat(strategy.isActive(ageCheck, adult)).isTrue();
}
@Test
public void scriptCanAccessCurrentDate() {
ScriptEngineActivationStrategy strategy = new ScriptEngineActivationStrategy();
// date.getYear() is a two-digit year
int currentYear = Calendar.getInstance().get(GregorianCalendar.YEAR) - 1900;
FeatureState trueForCurrentYear = aScriptState(JAVASCRIPT, "date.year == " + currentYear);
assertThat(strategy.isActive(trueForCurrentYear, aFeatureUser("john"))).isTrue();
FeatureState trueForNextYear = aScriptState(JAVASCRIPT, "date.year > " + currentYear);
assertThat(strategy.isActive(trueForNextYear, aFeatureUser("john"))).isFalse();
}
@Test
public void shouldSupportMultilineScripts() {
ScriptEngineActivationStrategy strategy = new ScriptEngineActivationStrategy();
FeatureState state = aScriptState(JAVASCRIPT,
"var len = user.name.length();\r\n len % 2 == 0;\n");
assertThat(strategy.isActive(state, aFeatureUser("john"))).isTrue();
assertThat(strategy.isActive(state, aFeatureUser("jim"))).isFalse();
}
@Test
public void shouldSupportScriptWithFunction() {
ScriptEngineActivationStrategy strategy = new ScriptEngineActivationStrategy();
FeatureState state = aScriptState(JAVASCRIPT,
"function isJohn(name) { return name == 'john' }; isJohn(user.name);");
assertThat(strategy.isActive(state, aFeatureUser("john"))).isTrue();
assertThat(strategy.isActive(state, aFeatureUser("jim"))).isFalse();
}
private FeatureState aScriptState(String lang, String script) {
return new FeatureState(ScriptFeature.FEATURE)
.setStrategyId(ScriptEngineActivationStrategy.ID)
.setParameter(ScriptEngineActivationStrategy.PARAM_LANG, lang)
.setParameter(ScriptEngineActivationStrategy.PARAM_SCRIPT, script);
}
private SimpleFeatureUser aFeatureUser(String string) {
return new SimpleFeatureUser(string);
}
private enum ScriptFeature implements Feature {
FEATURE;
}
}