/* * 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.views; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Set; import org.fest.util.Sets; import org.junit.Test; import org.mockito.internal.matchers.Null; import org.obiba.magma.*; import org.obiba.magma.support.NullTimestamps; import org.obiba.magma.support.ValueSetBean; import org.obiba.magma.support.VariableEntityBean; import org.obiba.magma.test.AbstractMagmaTest; import org.obiba.magma.type.TextType; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import static org.fest.assertions.api.Assertions.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Mockito.anyObject; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @SuppressWarnings({ "PMD.NcssMethodCount", "OverlyLongMethod", "OverlyCoupledClass" }) public class ViewTest extends AbstractMagmaTest { @Test public void testHasValueSetWithDefaultWhereClause() { ValueTable valueTableMock = mock(ValueTable.class); VariableEntity variableEntity = new VariableEntityBean("type", "id1"); when(valueTableMock.hasValueSet(variableEntity)).thenReturn(true); when(valueTableMock.getVariableEntities()).thenReturn(Sets.newLinkedHashSet(variableEntity)); when(valueTableMock.getTimestamps()).thenReturn(NullTimestamps.get()); View view = View.Builder.newView("view", valueTableMock).build(); assertThat(view.hasValueSet(variableEntity)).isTrue(); } @Test public void testHasValueSetWithIncludingWhereClause() { ValueTable valueTableMock = mock(ValueTable.class); WhereClause whereClauseMock = mock(WhereClause.class); VariableEntity variableEntity = new VariableEntityBean("type", "id1"); ValueSet valueSet = new ValueSetBean(valueTableMock, variableEntity); when(valueTableMock.hasValueSet(variableEntity)).thenReturn(true); when(valueTableMock.getValueSet(variableEntity)).thenReturn(valueSet); when(valueTableMock.getVariableEntities()).thenReturn(Sets.newLinkedHashSet(variableEntity)); when(valueTableMock.getTimestamps()).thenReturn(NullTimestamps.get()); View view = View.Builder.newView("view", valueTableMock).where(whereClauseMock).build(); when(whereClauseMock.where(valueSet, view)).thenReturn(true); assertThat(view.hasValueSet(variableEntity)).isTrue(); } @Test public void testHasValueSetWithExcludingWhereClause() { ValueTable valueTableMock = mock(ValueTable.class); WhereClause whereClauseMock = mock(WhereClause.class); VariableEntity variableEntity = new VariableEntityBean("type", "id1"); ValueSet valueSet = new ValueSetBean(valueTableMock, variableEntity); when(valueTableMock.hasValueSet(variableEntity)).thenReturn(true); when(valueTableMock.getValueSet(variableEntity)).thenReturn(valueSet); when(valueTableMock.getTimestamps()).thenReturn(NullTimestamps.get()); when(whereClauseMock.where(valueSet)).thenReturn(false); View view = View.Builder.newView("view", valueTableMock).where(whereClauseMock).build(); assertThat(view.hasValueSet(variableEntity)).isFalse(); } @Test public void testGetValueSetReturnsValueSetThatRefersToView() { ValueTable valueTableMock = mock(ValueTable.class); VariableEntity variableEntity = new VariableEntityBean("type", "id1"); ValueSet valueSet = new ValueSetBean(valueTableMock, variableEntity); when(valueTableMock.getName()).thenReturn("wrappedTable"); when(valueTableMock.getValueSet(variableEntity)).thenReturn(valueSet); View view = View.Builder.newView("view", valueTableMock).build(); ValueSet viewValueSet = view.getValueSet(variableEntity); // Verify state. assertThat(viewValueSet).isNotNull(); assertThat(viewValueSet.getValueTable()).isNotNull(); assertThat(viewValueSet.getValueTable().getName()).isEqualTo("view"); } @Test public void testGetValueSetWithDefaultWhereClause() { ValueTable valueTableMock = mock(ValueTable.class); VariableEntity variableEntity = new VariableEntityBean("type", "id1"); ValueSet valueSet = new ValueSetBean(valueTableMock, variableEntity); when(valueTableMock.getName()).thenReturn("wrappedTable"); when(valueTableMock.getValueSet(variableEntity)).thenReturn(valueSet); View view = View.Builder.newView("view", valueTableMock).build(); assertThat(view.getValueSet(variableEntity)).isNotNull(); } @Test public void testGetValueSetWithIncludingWhereClause() { ValueTable valueTableMock = mock(ValueTable.class); WhereClause whereClauseMock = mock(WhereClause.class); VariableEntity variableEntity = new VariableEntityBean("type", "id1"); ValueSet valueSet = new ValueSetBean(valueTableMock, variableEntity); when(valueTableMock.getValueSet(variableEntity)).thenReturn(valueSet); View view = View.Builder.newView("view", valueTableMock).where(whereClauseMock).build(); when(whereClauseMock.where(valueSet, view)).thenReturn(true); assertThat(view.getValueSet(variableEntity)).isNotNull(); } @Test(expected = NoSuchValueSetException.class) public void testGetValueSetWithExcludingWhereClause() { ValueTable valueTableMock = mock(ValueTable.class); WhereClause whereClauseMock = mock(WhereClause.class); VariableEntity variableEntity = new VariableEntityBean("type", "id1"); ValueSet valueSet = new ValueSetBean(valueTableMock, variableEntity); when(valueTableMock.getValueSet(variableEntity)).thenReturn(valueSet); when(whereClauseMock.where(valueSet)).thenReturn(false); View view = View.Builder.newView("view", valueTableMock).where(whereClauseMock).build(); view.getValueSet(variableEntity); } @Test public void testGetValueSetsWithDefaultWhereClause() { ValueTable valueTableMock = mock(ValueTable.class); Collection<ValueSet> valueSets = new ArrayList<>(); VariableEntity variableEntityFoo = new VariableEntityBean("type", "foo"); VariableEntity variableEntityBar = new VariableEntityBean("type", "bar"); ValueSet valueSetFoo = new ValueSetBean(valueTableMock, variableEntityFoo); ValueSet valueSetBar = new ValueSetBean(valueTableMock, variableEntityBar); valueSets.add(valueSetFoo); valueSets.add(valueSetBar); Timestamps timestamps = NullTimestamps.get(); when(valueTableMock.getValueSets(any(Iterable.class))).thenReturn(valueSets); when(valueTableMock.getTimestamps()).thenReturn(timestamps); View view = View.Builder.newView("view", valueTableMock).build(); Iterable<ValueSet> result = view.getValueSets(); // Verify state. assertThat(result).isNotNull(); assertThat(result).hasSize(2); assertThat(containsValueSet(result, valueSetFoo)).isTrue(); assertThat(containsValueSet(result, valueSetBar)).isTrue(); } @Test public void testGetValueSetsWithIncludingWhereClause() { ValueTable valueTableMock = mock(ValueTable.class); WhereClause whereClauseMock = mock(WhereClause.class); Collection<ValueSet> valueSets = new ArrayList<>(); VariableEntity variableEntityFoo = new VariableEntityBean("type", "foo"); VariableEntity variableEntityBar = new VariableEntityBean("type", "bar"); ValueSet valueSetFoo = new ValueSetBean(valueTableMock, variableEntityFoo); ValueSet valueSetBar = new ValueSetBean(valueTableMock, variableEntityBar); valueSets.add(valueSetFoo); valueSets.add(valueSetBar); Timestamps timestamps = NullTimestamps.get(); when(valueTableMock.getValueSets(any(Iterable.class))).thenReturn(valueSets); when(valueTableMock.getTimestamps()).thenReturn(timestamps); when(whereClauseMock.where((ValueSet) anyObject(), (View) anyObject())).thenReturn(true); View view = View.Builder.newView("view", valueTableMock).where(whereClauseMock).build(); Iterable<ValueSet> result = view.getValueSets(); // Verify state. assertThat(result).isNotNull(); assertThat(result).hasSize(2); assertThat(containsValueSet(result, valueSetFoo)).isTrue(); assertThat(containsValueSet(result, valueSetBar)).isTrue(); } @Test public void testGetValueSetsWithExcludingWhereClause() { ValueTable valueTableMock = mock(ValueTable.class); WhereClause whereClauseMock = mock(WhereClause.class); VariableEntity variableEntityInclude = new VariableEntityBean("type", "include"); VariableEntity variableEntityExclude = new VariableEntityBean("type", "exclude"); Set<VariableEntity> entities = Sets.newLinkedHashSet(variableEntityInclude, variableEntityExclude); Collection<ValueSet> valueSets = new ArrayList<>(); Collection<ValueSet> valueSetsIncluded = new ArrayList<>(); ValueSet valueSetInclude = new ValueSetBean(valueTableMock, variableEntityInclude); ValueSet valueSetExclude = new ValueSetBean(valueTableMock, variableEntityExclude); valueSets.add(valueSetInclude); valueSets.add(valueSetExclude); valueSetsIncluded.add(valueSetInclude); when(valueTableMock.getValueSets()).thenReturn(valueSets); when(valueTableMock.getValueSets(any(Iterable.class))).thenReturn(valueSetsIncluded); when(valueTableMock.getVariableEntities()).thenReturn(entities); when(valueTableMock.hasValueSet(any(VariableEntity.class))).thenReturn(true); when(valueTableMock.getValueSet(variableEntityInclude)).thenReturn(valueSetInclude); when(valueTableMock.getValueSet(variableEntityExclude)).thenReturn(valueSetExclude); when(valueTableMock.getTimestamps()).thenReturn(NullTimestamps.get()); View view = View.Builder.newView("view", valueTableMock).where(whereClauseMock).build(); when(whereClauseMock.where(valueSetInclude, view)).thenReturn(true); when(whereClauseMock.where(valueSetExclude, view)).thenReturn(false); Iterable<ValueSet> result = view.getValueSets(); // Verify state. assertThat(result).isNotNull(); assertThat(result).hasSize(1); assertThat(containsValueSet(result, valueSetInclude)).isTrue(); } @Test public void testGetVariableWithDefaultSelectClause() { ValueTable valueTableMock = mock(ValueTable.class); Variable variable = new Variable.Builder("someVariable", TextType.get(), "type").build(); when(valueTableMock.getVariable(variable.getName())).thenReturn(variable); View view = View.Builder.newView("view", valueTableMock).build(); Variable foundVariable = view.getVariable(variable.getName()); assertThat(foundVariable).isNotNull(); assertThat(variable.getName()).isEqualTo(foundVariable.getName()); } @Test public void testGetVariableWithIncludingSelectClause() { ValueTable valueTableMock = mock(ValueTable.class); SelectClause selectClauseMock = mock(SelectClause.class); Variable variable = new Variable.Builder("someVariable", TextType.get(), "type").build(); when(valueTableMock.getVariable(variable.getName())).thenReturn(variable); when(selectClauseMock.select(variable)).thenReturn(true); View view = View.Builder.newView("view", valueTableMock).select(selectClauseMock).build(); Variable foundVariable = view.getVariable(variable.getName()); assertThat(foundVariable).isNotNull(); assertThat(variable.getName()).isEqualTo(foundVariable.getName()); } @Test(expected = NoSuchVariableException.class) public void testGetVariableWithExcludingSelectClause() { ValueTable valueTableMock = mock(ValueTable.class); SelectClause selectClauseMock = mock(SelectClause.class); Variable variable = new Variable.Builder("someVariable", TextType.get(), "type").build(); when(valueTableMock.getVariable(variable.getName())).thenReturn(variable); when(selectClauseMock.select(variable)).thenReturn(false); View view = View.Builder.newView("view", valueTableMock).select(selectClauseMock).build(); view.getVariable(variable.getName()); } @Test public void testGetVariablesWithDefaultSelectClause() { ValueTable valueTableMock = mock(ValueTable.class); Collection<Variable> variables = new ArrayList<>(); Variable variableFoo = new Variable.Builder("foo", TextType.get(), "type").build(); Variable variableBar = new Variable.Builder("bar", TextType.get(), "type").build(); variables.add(variableFoo); variables.add(variableBar); when(valueTableMock.getVariables()).thenReturn(variables); View view = View.Builder.newView("view", valueTableMock).build(); Iterable<Variable> result = view.getVariables(); // Verify state. assertThat(result).isNotNull(); assertThat(result).hasSize(2); assertThat(containsVariable(result, variableFoo)).isTrue(); assertThat(containsVariable(result, variableBar)).isTrue(); } @Test public void testGetVariablesWithIncludingSelectClause() { ValueTable valueTableMock = mock(ValueTable.class); SelectClause selectClauseMock = mock(SelectClause.class); Collection<Variable> variables = new ArrayList<>(); Variable variableFoo = new Variable.Builder("foo", TextType.get(), "type").build(); Variable variableBar = new Variable.Builder("bar", TextType.get(), "type").build(); variables.add(variableFoo); variables.add(variableBar); when(valueTableMock.getVariables()).thenReturn(variables); when(selectClauseMock.select((Variable) anyObject())).thenReturn(true); View view = View.Builder.newView("view", valueTableMock).select(selectClauseMock).build(); Iterable<Variable> result = view.getVariables(); // Verify state. assertThat(result).isNotNull(); assertThat(result).hasSize(2); assertThat(containsVariable(result, variableFoo)).isTrue(); assertThat(containsVariable(result, variableBar)).isTrue(); } @Test public void testGetVariablesWithExcludingSelectClause() { ValueTable valueTableMock = mock(ValueTable.class); SelectClause selectClauseMock = mock(SelectClause.class); Collection<Variable> variables = new ArrayList<>(); Variable variableInclude = new Variable.Builder("include", TextType.get(), "type").build(); Variable variableExclude = new Variable.Builder("exclude", TextType.get(), "type").build(); variables.add(variableInclude); variables.add(variableExclude); when(valueTableMock.getVariables()).thenReturn(variables); when(selectClauseMock.select(variableInclude)).thenReturn(true); when(selectClauseMock.select(variableExclude)).thenReturn(false); View view = View.Builder.newView("view", valueTableMock).select(selectClauseMock).build(); Iterable<Variable> result = view.getVariables(); // Verify state. assertThat(result).isNotNull(); assertThat(result).hasSize(1); assertThat(containsVariable(result, variableInclude)).isTrue(); } @Test public void testGetValueWithDefaultWhereClause() { ValueTable valueTableMock = mock(ValueTable.class); VariableEntity variableEntity = new VariableEntityBean("type", "id1"); Variable variable = new Variable.Builder("someVariable", TextType.get(), "type").build(); ValueSet valueSet = new ValueSetBean(valueTableMock, variableEntity); Value value = TextType.get().valueOf("someValue"); when(valueTableMock.getValue((Variable) anyObject(), (ValueSet) anyObject())).thenReturn(value); View view = View.Builder.newView("view", valueTableMock).build(); Value result = view.getValue(variable, new ValueSetWrapper(view, valueSet)); assertThat(result).isNotNull(); assertThat(result.getValue().toString()).isEqualTo("someValue"); } @Test public void testGetValueWithIncludingWhereClause() { ValueTable valueTableMock = mock(ValueTable.class); WhereClause whereClauseMock = mock(WhereClause.class); VariableEntity variableEntity = new VariableEntityBean("type", "id1"); Variable variable = new Variable.Builder("someVariable", TextType.get(), "type").build(); ValueSet valueSet = new ValueSetBean(valueTableMock, variableEntity); Value value = TextType.get().valueOf("someValue"); when(valueTableMock.getValue((Variable) anyObject(), (ValueSet) anyObject())).thenReturn(value); when(whereClauseMock.where((ValueSet) anyObject(), (View) anyObject())).thenReturn(true); View view = View.Builder.newView("view", valueTableMock).where(whereClauseMock).build(); Value result = view.getValue(variable, new ValueSetWrapper(view, valueSet)); assertThat(result).isNotNull(); assertThat(result.getValue().toString()).isEqualTo("someValue"); } @Test(expected = NoSuchValueSetException.class) public void testGetValueWithExcludingWhereClause() { ValueTable valueTableMock = mock(ValueTable.class); WhereClause whereClauseMock = mock(WhereClause.class); VariableEntity variableEntity = new VariableEntityBean("type", "id1"); Variable variable = new Variable.Builder("someVariable", TextType.get(), "type").build(); ValueSet valueSet = new ValueSetBean(valueTableMock, variableEntity); Value value = TextType.get().valueOf("someValue"); when(valueTableMock.getValue(variable, valueSet)).thenReturn(value); when(whereClauseMock.where(valueSet)).thenReturn(false); View view = View.Builder.newView("view", valueTableMock).where(whereClauseMock).build(); view.getValue(variable, valueSet); } @Test public void testGetVariablesWithListClause() { ValueTable valueTableMock = mock(ValueTable.class); ListClause listClauseMock = mock(ListClause.class); VariableValueSource variableValueSourceMock = mock(VariableValueSource.class); Collection<VariableValueSource> variableValueSourceList = new ArrayList<>(); variableValueSourceList.add(variableValueSourceMock); when(listClauseMock.getVariableValueSources()).thenReturn(variableValueSourceList); View view = View.Builder.newView("view", valueTableMock).list(listClauseMock).build(); Iterable<Variable> result = view.getVariables(); // Verify state. assertThat(result).isNotNull(); assertThat(result).hasSize(1); } @Test public void testGetVariableValueSourceWithListClause() { ValueTable valueTableMock = mock(ValueTable.class); ListClause listClauseMock = mock(ListClause.class); VariableValueSource variableValueSourceMock = mock(VariableValueSource.class); when(listClauseMock.getVariableValueSource("variable-name")).thenReturn(variableValueSourceMock); View view = View.Builder.newView("view", valueTableMock).list(listClauseMock).build(); assertThat(view.getVariableValueSource("variable-name")).isNotNull(); } @Test(expected = IncompatibleEntityTypeException.class) public void testCreateViewDifferentEntityType() { ValueTable valueTableMock = mock(ValueTable.class); ListClause listClauseMock = mock(ListClause.class); ViewPersistenceStrategy viewPersistenceMock = mock(ViewPersistenceStrategy.class); Datasource datasourceMock = mock(Datasource.class); ViewManager manager = new DefaultViewManagerImpl(viewPersistenceMock); Set<View> views = new HashSet<>(); View view = View.Builder.newView("view", valueTableMock).list(listClauseMock).build(); views.add(view); listClauseMock.setValueTable(view); Variable variable = Variable.Builder.newVariable("variable", ValueType.Factory.forName("text"), "Martian").build(); VariableValueSource vSourceMock = mock(VariableValueSource.class); Collection<VariableValueSource> variablesValueSource = new HashSet<>(); variablesValueSource.add(vSourceMock); when(viewPersistenceMock.readViews("datasource")).thenReturn(views); when(datasourceMock.getName()).thenReturn("datasource"); when(listClauseMock.getVariableValueSources()).thenReturn(variablesValueSource); when(vSourceMock.getVariable()).thenReturn(variable); when(valueTableMock.getEntityType()).thenReturn("NotMartian"); manager.decorate(datasourceMock); manager.addView("datasource", view, null, null); } // // Helper Methods // private boolean containsVariable(Iterable<Variable> iterable, final Variable variable) { return Iterables.any(iterable, new Predicate<Variable>() { @Override public boolean apply(Variable input) { return input.getName().equals(variable.getName()); } }); } private boolean containsValueSet(Iterable<ValueSet> iterable, final ValueSet valueSet) { return Iterables.any(iterable, new Predicate<ValueSet>() { @Override public boolean apply(ValueSet input) { return input.getVariableEntity().getIdentifier().equals(valueSet.getVariableEntity().getIdentifier()); } }); } }