/*
* Copyright (c) 2017 OBiBa. All rights reserved.
*
* This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.obiba.magma.filter;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.obiba.magma.MagmaEngine;
import org.obiba.magma.ValueSet;
import org.obiba.magma.ValueTable;
import org.obiba.magma.Variable;
import org.obiba.magma.VariableEntity;
import org.obiba.magma.VariableValueSource;
import org.obiba.magma.js.MagmaJsExtension;
import org.obiba.magma.support.ValueSetBean;
import org.obiba.magma.support.VariableEntityBean;
import org.obiba.magma.type.BooleanType;
import org.obiba.magma.type.TextType;
import static org.fest.assertions.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class JavaScriptFilterTest {
private ValueSet valueSetMock;
@Before
public void setUp() throws Exception {
new MagmaEngine().extend(new MagmaJsExtension());
valueSetMock = mock(ValueSet.class);
when(valueSetMock.getValueTable()).thenReturn(mock(ValueTable.class));
when(valueSetMock.getVariableEntity()).thenReturn(mock(VariableEntity.class));
}
@After
public void cleanUp() throws Exception {
MagmaEngine.get().shutdown();
}
@SuppressWarnings("ConstantConditions")
@Test(expected = IllegalArgumentException.class)
public void testJavaScriptNotAllowed() throws Exception {
new JavaScriptFilter(null);
}
@Test
public void testAttributeAndValueAllowed() throws Exception {
new JavaScriptFilter("1;");
}
@Test
public void testSimpleScriptReturnsTrue() throws Exception {
JavaScriptFilter filter = JavaScriptFilter.Builder.newFilter().javascript("4 > 3;").include().build();
assertThat(filter.runFilter(valueSetMock)).isTrue();
}
@Test
public void testSimpleScriptReturnsFalse() throws Exception {
JavaScriptFilter filter = JavaScriptFilter.Builder.newFilter().javascript("2 > 3;").include().build();
assertThat(filter.runFilter(valueSetMock)).isFalse();
}
@Test
public void testNullReturnValueSameAsFalse() throws Exception {
JavaScriptFilter filter = JavaScriptFilter.Builder.newFilter().javascript("null;").exclude().build();
assertThat(filter.runFilter(valueSetMock)).isNull();
}
@Test
public void testScriptAnyReturnsTrue() throws Exception {
JavaScriptFilter filter = JavaScriptFilter.Builder.newFilter()
.javascript("$('Admin.Interview.exported').any('TRUE')").include().build();
Variable variable = Variable.Builder.newVariable("Admin.Interview.exported", BooleanType.get(), "Participant")
.build();
VariableValueSource mockSource = mock(VariableValueSource.class);
when(mockSource.getVariable()).thenReturn(variable);
when(mockSource.getValue((ValueSet) any())).thenReturn(BooleanType.get().valueOf("TRUE"));
ValueTable tableMock = mock(ValueTable.class);
ValueSet valueSet = new ValueSetBean(tableMock, new VariableEntityBean("Participant", "1234"));
when(tableMock.getName()).thenReturn("collectionName");
when(tableMock.getVariableValueSource("Admin.Interview.exported")).thenReturn(mockSource);
when(tableMock.getValueSet((VariableEntity) any())).thenReturn(valueSet);
assertThat(filter.runFilter(valueSet)).isTrue();
}
@Test
public void testScriptAnyReturnsFalse() throws Exception {
JavaScriptFilter filter = JavaScriptFilter.Builder.newFilter()
.javascript("$('Admin.Interview.exported').any('FALSE')").include().build();
Variable variable = Variable.Builder.newVariable("Admin.Interview.exported", BooleanType.get(), "Participant")
.build();
VariableValueSource mockSource = mock(VariableValueSource.class);
when(mockSource.getVariable()).thenReturn(variable);
when(mockSource.getValue((ValueSet) any())).thenReturn(BooleanType.get().valueOf("TRUE"));
ValueTable tableMock = mock(ValueTable.class);
ValueSet valueSet = new ValueSetBean(tableMock, new VariableEntityBean("Participant", "1234"));
when(tableMock.getName()).thenReturn("collectionName");
when(tableMock.getVariableValueSource("Admin.Interview.exported")).thenReturn(mockSource);
when(tableMock.getValueSet((VariableEntity) any())).thenReturn(valueSet);
assertThat(filter.runFilter(valueSet)).isFalse();
}
@Test
public void testScriptAnyMultipleReturnsTrue() throws Exception {
JavaScriptFilter filter = JavaScriptFilter.Builder.newFilter()
.javascript("$('Participant.Interview.status').any('CANCELED','CLOSED')").include().build();
Variable variable = Variable.Builder.newVariable("Admin.Interview.exported", BooleanType.get(), "Participant")
.build();
VariableValueSource mockSource = mock(VariableValueSource.class);
when(mockSource.getVariable()).thenReturn(variable);
when(mockSource.getValue((ValueSet) any())).thenReturn(TextType.get().valueOf("CLOSED"));
ValueTable tableMock = mock(ValueTable.class);
ValueSet valueSet = new ValueSetBean(tableMock, new VariableEntityBean("Participant", "1234"));
when(tableMock.getName()).thenReturn("collectionName");
when(tableMock.getVariableValueSource("Participant.Interview.status")).thenReturn(mockSource);
when(tableMock.getValueSet((VariableEntity) any())).thenReturn(valueSet);
assertThat(filter.runFilter(valueSet)).isTrue();
}
@Test
public void testScriptAnyMultipleReturnsFalse() throws Exception {
JavaScriptFilter filter = JavaScriptFilter.Builder.newFilter()
.javascript("$('Participant.Interview.status').any('CANCELED','CLOSED')").include().build();
Variable variable = Variable.Builder.newVariable("Admin.Interview.exported", BooleanType.get(), "Participant")
.build();
VariableValueSource mockSource = mock(VariableValueSource.class);
when(mockSource.getVariable()).thenReturn(variable);
when(mockSource.getValue((ValueSet) any())).thenReturn(TextType.get().valueOf("IN_PROGRESS"));
ValueTable tableMock = mock(ValueTable.class);
ValueSet valueSet = new ValueSetBean(tableMock, new VariableEntityBean("Participant", "1234"));
when(tableMock.getName()).thenReturn("collectionName");
when(tableMock.getVariableValueSource("Participant.Interview.status")).thenReturn(mockSource);
when(tableMock.getValueSet((VariableEntity) any())).thenReturn(valueSet);
assertThat(filter.runFilter(valueSet)).isFalse();
}
@Test
public void testScriptNotEqualReturnsTrue() throws Exception {
JavaScriptFilter filter = JavaScriptFilter.Builder.newFilter()
.javascript("$('Participant.Interview.status').not('CANCELED')").include().build();
Variable variable = Variable.Builder.newVariable("Admin.Interview.exported", BooleanType.get(), "Participant")
.build();
VariableValueSource mockSource = mock(VariableValueSource.class);
when(mockSource.getVariable()).thenReturn(variable);
when(mockSource.getValue((ValueSet) any())).thenReturn(TextType.get().valueOf("IN_PROGRESS"));
ValueTable tableMock = mock(ValueTable.class);
ValueSet valueSet = new ValueSetBean(tableMock, new VariableEntityBean("Participant", "1234"));
when(tableMock.getName()).thenReturn("collectionName");
when(tableMock.getVariableValueSource("Participant.Interview.status")).thenReturn(mockSource);
when(tableMock.getValueSet((VariableEntity) any())).thenReturn(valueSet);
assertThat(filter.runFilter(valueSet)).isTrue();
}
@Test
public void testScriptNotEqualReturnsFalse() throws Exception {
JavaScriptFilter filter = JavaScriptFilter.Builder.newFilter()
.javascript("$('Participant.Interview.status').not('IN_PROGRESS')").include().build();
Variable variable = Variable.Builder.newVariable("Admin.Interview.exported", BooleanType.get(), "Participant")
.build();
VariableValueSource mockSource = mock(VariableValueSource.class);
when(mockSource.getVariable()).thenReturn(variable);
when(mockSource.getValue((ValueSet) any())).thenReturn(TextType.get().valueOf("IN_PROGRESS"));
ValueTable tableMock = mock(ValueTable.class);
ValueSet valueSet = new ValueSetBean(tableMock, new VariableEntityBean("Participant", "1234"));
when(tableMock.getName()).thenReturn("collectionName");
when(tableMock.getVariableValueSource("Participant.Interview.status")).thenReturn(mockSource);
when(tableMock.getValueSet((VariableEntity) any())).thenReturn(valueSet);
assertThat(filter.runFilter(valueSet)).isFalse();
}
}