package org.molgenis.data.validation.meta; import org.mockito.ArgumentCaptor; import org.molgenis.data.Repository; import org.molgenis.data.meta.model.Tag; import org.molgenis.data.validation.MolgenisValidationException; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import java.util.stream.Stream; import static java.util.Arrays.asList; import static java.util.stream.Collectors.toList; import static org.mockito.Mockito.*; import static org.testng.Assert.assertEquals; /** * Created by Dennis on 11/24/2016. */ public class TagRepositoryValidationDecoratorTest { private TagRepositoryValidationDecorator tagRepositoryValidationDecorator; private Repository<Tag> decoratedRepo; private TagValidator tagValidator; @SuppressWarnings("unchecked") @BeforeMethod public void setUpBeforeMethod() { decoratedRepo = mock(Repository.class); tagValidator = mock(TagValidator.class); tagRepositoryValidationDecorator = new TagRepositoryValidationDecorator(decoratedRepo, tagValidator); } @Test(expectedExceptions = NullPointerException.class) public void tagRepositoryValidationDecorator() { new TagRepositoryValidationDecorator(null, null); } @Test public void testDelegate() throws Exception { assertEquals(tagRepositoryValidationDecorator.delegate(), decoratedRepo); } @Test public void testUpdateValid() throws Exception { Tag tag = mock(Tag.class); doNothing().when(tagValidator).validate(tag); tagRepositoryValidationDecorator.update(tag); verify(tagValidator).validate(tag); verify(decoratedRepo).update(tag); } @Test(expectedExceptions = MolgenisValidationException.class) public void testUpdateInvalid() throws Exception { Tag tag = mock(Tag.class); doThrow(mock(MolgenisValidationException.class)).when(tagValidator).validate(tag); tagRepositoryValidationDecorator.update(tag); } @Test public void testAddValid() throws Exception { Tag tag = mock(Tag.class); doNothing().when(tagValidator).validate(tag); tagRepositoryValidationDecorator.add(tag); verify(tagValidator).validate(tag); verify(decoratedRepo).add(tag); } @Test(expectedExceptions = MolgenisValidationException.class) public void testAddInValid() throws Exception { Tag tag = mock(Tag.class); doThrow(mock(MolgenisValidationException.class)).when(tagValidator).validate(tag); tagRepositoryValidationDecorator.add(tag); } @Test public void testUpdateStreamValid() throws Exception { Tag tag0 = mock(Tag.class); Tag tag1 = mock(Tag.class); doNothing().when(tagValidator).validate(tag0); doNothing().when(tagValidator).validate(tag1); tagRepositoryValidationDecorator.update(Stream.of(tag0, tag1)); @SuppressWarnings("unchecked") ArgumentCaptor<Stream<Tag>> tagCaptor = ArgumentCaptor.forClass((Class) Stream.class); verify(decoratedRepo).update(tagCaptor.capture()); assertEquals(tagCaptor.getValue().collect(toList()), asList(tag0, tag1)); verify(tagValidator).validate(tag0); verify(tagValidator).validate(tag1); } @Test(expectedExceptions = MolgenisValidationException.class) public void testUpdateStreamInvalid() throws Exception { Tag tag0 = mock(Tag.class); Tag tag1 = mock(Tag.class); doNothing().when(tagValidator).validate(tag0); doThrow(mock(MolgenisValidationException.class)).when(tagValidator).validate(tag1); tagRepositoryValidationDecorator.update(Stream.of(tag0, tag1)); @SuppressWarnings("unchecked") ArgumentCaptor<Stream<Tag>> tagCaptor = ArgumentCaptor.forClass((Class) Stream.class); verify(decoratedRepo).update(tagCaptor.capture()); tagCaptor.getValue().count(); // consume stream } @Test public void testAddStreamValid() throws Exception { Tag tag0 = mock(Tag.class); Tag tag1 = mock(Tag.class); doNothing().when(tagValidator).validate(tag0); doNothing().when(tagValidator).validate(tag1); tagRepositoryValidationDecorator.add(Stream.of(tag0, tag1)); @SuppressWarnings("unchecked") ArgumentCaptor<Stream<Tag>> tagCaptor = ArgumentCaptor.forClass((Class) Stream.class); verify(decoratedRepo).add(tagCaptor.capture()); assertEquals(tagCaptor.getValue().collect(toList()), asList(tag0, tag1)); verify(tagValidator).validate(tag0); verify(tagValidator).validate(tag1); } @Test(expectedExceptions = MolgenisValidationException.class) public void testAddStreamInvalid() throws Exception { Tag tag0 = mock(Tag.class); Tag tag1 = mock(Tag.class); doNothing().when(tagValidator).validate(tag0); doThrow(mock(MolgenisValidationException.class)).when(tagValidator).validate(tag1); tagRepositoryValidationDecorator.add(Stream.of(tag0, tag1)); @SuppressWarnings("unchecked") ArgumentCaptor<Stream<Tag>> tagCaptor = ArgumentCaptor.forClass((Class) Stream.class); verify(decoratedRepo).add(tagCaptor.capture()); tagCaptor.getValue().count(); // consume stream } }