package com.plexobject.rbac.eval.js;
import org.junit.Assert;
import org.junit.Test;
import com.plexobject.rbac.eval.PredicateEvaluator;
import com.plexobject.rbac.utils.IDUtils;
public class JavascriptEvaluatorTest {
PredicateEvaluator evaluator = new JavascriptEvaluator();
@Test
public void testGetSetContext() {
String expr = "var time=new Date(2010, 0, 1, 12, 0, 0, 0);\namount <= 500 && dept == 'SALES' && time.getHours() >= 8 && time.getHours() <= 17";
Assert.assertTrue(evaluator.evaluate(expr, IDUtils.toMap("amount",
"100", "dept", "SALES")));
}
@Test
public void testBadGetSetContext() {
String expr = "var time=new Date(2010, 0, 1, 18, 0, 0, 0);\namount <= 500 && dept == 'SALES' && time.getHours() >= 8 && time.getHours() <= 17";
Assert.assertFalse(evaluator.evaluate(expr, IDUtils.toMap("amount",
"100", "dept", "SALES")));
expr = "var time=new Date(2010, 0, 1, 12, 0, 0, 0);\namount <= 500 && dept == 'SALES' && time.getHours() >= 8 && time.getHours() <= 17";
Assert.assertTrue(evaluator.evaluate(expr, IDUtils.toMap("amount",
"500", "dept", "SALES")));
Assert.assertFalse(evaluator.evaluate(expr, IDUtils.toMap("amount",
"501", "dept", "SALES")));
Assert.assertFalse(evaluator.evaluate(expr, IDUtils.toMap("amount",
"100", "dept", "sales")));
}
@Test
public void testContains() {
String expr = "dept.search(/sale?/i) != -1";
Assert.assertTrue(evaluator.evaluate(expr, IDUtils
.toMap("dept", "SALE")));
Assert.assertTrue(evaluator.evaluate(expr, IDUtils.toMap("dept",
"SALES")));
}
@Test
public void testEquals() {
String expr = "dept.search(/sale. dept/i) != -1";
Assert.assertTrue(evaluator.evaluate(expr, IDUtils.toMap("dept",
"SALEs dept")));
Assert.assertFalse(evaluator.evaluate(expr, IDUtils.toMap("dept",
"SALEs dept")));
}
@Test
public void testLessThan() {
String expr = "amount < 1000";
Assert.assertTrue(evaluator.evaluate(expr, IDUtils.toMap("amount",
"100")));
Assert.assertFalse(evaluator.evaluate(expr, IDUtils.toMap("amount",
"1000")));
}
@Test
public void testLessThanOrEquals() {
String expr = "amount <= 1000";
Assert.assertTrue(evaluator.evaluate(expr, IDUtils.toMap("amount",
"1000")));
Assert.assertFalse(evaluator.evaluate(expr, IDUtils.toMap("amount",
"1001")));
}
@Test
public void testGreaterThan() {
String expr = "amount > 1000";
Assert.assertTrue(evaluator.evaluate(expr, IDUtils.toMap("amount",
"1001")));
Assert.assertFalse(evaluator.evaluate(expr, IDUtils.toMap("amount",
"1000")));
}
@Test
public void testGreaterThanOrEquals() {
String expr = "amount >= 1000";
Assert.assertTrue(evaluator.evaluate(expr, IDUtils.toMap("amount",
"1000")));
Assert.assertFalse(evaluator.evaluate(expr, IDUtils.toMap("amount",
"999")));
}
@Test
public void testNotEquals() {
String expr = "dept != 'sales'";
Assert.assertTrue(evaluator.evaluate(expr, IDUtils.toMap("dept",
"SALEs dept")));
Assert.assertFalse(evaluator.evaluate(expr, IDUtils.toMap("dept",
"sales")));
}
@Test
public void testRange() {
String expr = "amount >= 10 && amount <= 20";
Assert.assertTrue(evaluator.evaluate(expr, IDUtils
.toMap("amount", "10")));
Assert.assertTrue(evaluator.evaluate(expr, IDUtils
.toMap("amount", "10")));
Assert.assertTrue(evaluator.evaluate(expr, IDUtils
.toMap("amount", "20")));
Assert.assertFalse(evaluator.evaluate(expr, IDUtils.toMap("amount",
"21")));
Assert.assertFalse(evaluator.evaluate(expr, IDUtils
.toMap("amount", "9")));
}
@Test
public void testOr() {
String expr = "amount < 1000 || approver == 'shahbhat'";
Assert.assertTrue(evaluator.evaluate(expr, IDUtils.toMap("amount",
"100")));
Assert.assertTrue(evaluator.evaluate(expr, IDUtils.toMap("amount",
"1000", "approver", "shahbhat")));
Assert.assertFalse(evaluator.evaluate(expr, IDUtils.toMap("amount",
"1000", "approver", "bhatsha")));
}
}