package org.molgenis.data.validation.meta; import org.mockito.ArgumentCaptor; import org.molgenis.data.Repository; import org.molgenis.data.meta.model.Attribute; import org.molgenis.data.validation.MolgenisValidationException; import org.molgenis.data.validation.meta.AttributeValidator.ValidationMode; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.util.stream.Stream; import static org.mockito.Mockito.*; import static org.testng.Assert.assertEquals; public class AttributeRepositoryValidationDecoratorTest { private AttributeRepositoryValidationDecorator attributeRepoValidationDecorator; private Repository<Attribute> decoratedRepo; private AttributeValidator attributeValidator; @SuppressWarnings("unchecked") @BeforeMethod public void setUpBeforeMethod() { decoratedRepo = mock(Repository.class); attributeValidator = mock(AttributeValidator.class); attributeRepoValidationDecorator = new AttributeRepositoryValidationDecorator(decoratedRepo, attributeValidator); } @Test(expectedExceptions = NullPointerException.class) public void attributeRepositoryValidationDecorator() { new AttributeRepositoryValidationDecorator(null, null); } @Test public void delegate() { assertEquals(attributeRepoValidationDecorator.delegate(), decoratedRepo); } @Test public void updateAttributeValid() { Attribute attribute = mock(Attribute.class); doNothing().when(attributeValidator).validate(attribute, ValidationMode.UPDATE); attributeRepoValidationDecorator.update(attribute); verify(attributeValidator, times(1)).validate(attribute, ValidationMode.UPDATE); verify(decoratedRepo, times(1)).update(attribute); } @Test(expectedExceptions = MolgenisValidationException.class) public void updateEntityInvalid() throws Exception { Attribute attribute = mock(Attribute.class); doThrow(mock(MolgenisValidationException.class)).when(attributeValidator) .validate(attribute, ValidationMode.UPDATE); attributeRepoValidationDecorator.update(attribute); verify(attributeValidator, times(1)).validate(attribute, ValidationMode.UPDATE); } @Test public void updateEntityStreamValid() { Attribute attribute0 = mock(Attribute.class); Attribute attribute1 = mock(Attribute.class); doNothing().when(attributeValidator).validate(attribute0, ValidationMode.UPDATE); doNothing().when(attributeValidator).validate(attribute1, ValidationMode.UPDATE); attributeRepoValidationDecorator.update(Stream.of(attribute0, attribute1)); @SuppressWarnings("unchecked") ArgumentCaptor<Stream<Attribute>> captor = ArgumentCaptor.forClass((Class) Stream.class); verify(decoratedRepo).update(captor.capture()); captor.getValue().count(); // process all entities in stream verify(attributeValidator, times(2)).validate(any(Attribute.class), eq(ValidationMode.UPDATE)); } @Test(expectedExceptions = MolgenisValidationException.class) public void updateEntityStreamInvalid() { Attribute attribute0 = mock(Attribute.class); Attribute attribute1 = mock(Attribute.class); doNothing().when(attributeValidator).validate(attribute0, ValidationMode.UPDATE); doThrow(mock(MolgenisValidationException.class)).when(attributeValidator) .validate(attribute1, ValidationMode.UPDATE); attributeRepoValidationDecorator.update(Stream.of(attribute0, attribute1)); @SuppressWarnings("unchecked") ArgumentCaptor<Stream<Attribute>> captor = ArgumentCaptor.forClass((Class) Stream.class); verify(decoratedRepo).update(captor.capture()); captor.getValue().count(); // process all entities in stream verify(attributeValidator, times(1)).validate(any(Attribute.class), ValidationMode.UPDATE); } @Test public void addEntityValid() { Attribute attribute = mock(Attribute.class); doNothing().when(attributeValidator).validate(attribute, ValidationMode.ADD); attributeRepoValidationDecorator.add(attribute); verify(attributeValidator, times(1)).validate(attribute, ValidationMode.ADD); } @Test(expectedExceptions = MolgenisValidationException.class) public void addEntityInvalid() { Attribute attribute = mock(Attribute.class); doThrow(mock(MolgenisValidationException.class)).when(attributeValidator) .validate(attribute, ValidationMode.ADD); attributeRepoValidationDecorator.add(attribute); verify(attributeValidator, times(1)).validate(attribute, ValidationMode.ADD); } @Test public void addEntityStreamValid() { Attribute attribute0 = mock(Attribute.class); Attribute attribute1 = mock(Attribute.class); doNothing().when(attributeValidator).validate(attribute0, ValidationMode.ADD); doNothing().when(attributeValidator).validate(attribute1, ValidationMode.ADD); attributeRepoValidationDecorator.add(Stream.of(attribute0, attribute1)); @SuppressWarnings("unchecked") ArgumentCaptor<Stream<Attribute>> captor = ArgumentCaptor.forClass((Class) Stream.class); verify(decoratedRepo).add(captor.capture()); captor.getValue().count(); // process all entities in stream verify(attributeValidator, times(2)).validate(any(Attribute.class), eq(ValidationMode.ADD)); } @Test(expectedExceptions = MolgenisValidationException.class) public void addEntityStreamInvalid() { Attribute attribute0 = mock(Attribute.class); Attribute attribute1 = mock(Attribute.class); doNothing().when(attributeValidator).validate(attribute0, ValidationMode.ADD); doThrow(mock(MolgenisValidationException.class)).when(attributeValidator) .validate(attribute1, ValidationMode.ADD); attributeRepoValidationDecorator.add(Stream.of(attribute0, attribute1)); @SuppressWarnings("unchecked") ArgumentCaptor<Stream<Attribute>> captor = ArgumentCaptor.forClass((Class) Stream.class); verify(decoratedRepo).add(captor.capture()); captor.getValue().count(); // process all entities in stream verify(attributeValidator, times(1)).validate(any(Attribute.class), ValidationMode.ADD); } }