package be.drissamri.service; import be.drissamri.LinkEntityBuilder; import be.drissamri.entity.LinkEntity; import be.drissamri.repository.LinkRepository; import be.drissamri.service.exception.InvalidURLException; import be.drissamri.service.exception.LinkNotFoundException; import be.drissamri.service.impl.LinkServiceImpl; import be.drissamri.service.verifier.UrlVerifiers; import org.assertj.core.util.Lists; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.given; import static org.mockito.Matchers.any; import static org.mockito.Mockito.times; public class LinkServiceImplTest { private static final String HASH = "AZERTY"; private static final String LONG_URL = "http://www.drissamri.be"; private static final String LONG_PHISHING_URL = "http://www.drissamri.be/phishing"; private LinkService linkService; @Mock private LinkRepository linkRepository; @Mock private HashService shortenService; @Mock private UrlVerifiers urlVerifiers; @Before public void setUp() { MockitoAnnotations.initMocks(this); linkService = new LinkServiceImpl(shortenService, urlVerifiers, linkRepository); } @Test public void findShouldReturnLinks() { Page<LinkEntity> links = new PageImpl<>(Lists.newArrayList(new LinkEntity(), new LinkEntity())); given(linkRepository.findAll(any(Pageable.class))).willReturn(links); List<LinkEntity> result = linkService.find(1, 10); assertThat(result).hasSize(2); } @Test public void deleteShouldSucceed() { LinkEntity existingLink = new LinkEntityBuilder().hash(HASH).url(LONG_URL).build(); given(linkRepository.findByHash(HASH)).willReturn(existingLink); linkService.deleteByHash(HASH); Mockito.verify(linkRepository, times(1)).delete(existingLink); } @Test(expected = LinkNotFoundException.class) public void deleteUnknownLinkShouldThrowError() { given(linkRepository.findByHash(HASH)).willReturn(null); linkService.deleteByHash(HASH); } @Test public void createShouldReturnCreatedLink() { LinkEntity link = new LinkEntityBuilder().hash(HASH).url(LONG_URL).build(); given(linkRepository.save(link)).willReturn(link); given(shortenService.shorten(LONG_URL)).willReturn(HASH); given(urlVerifiers.isSafe(LONG_URL)).willReturn(true); LinkEntity result = linkService.create(LONG_URL); assertThat(result).isNotNull(); assertThat(result.getUrl()).isEqualTo(LONG_URL); assertThat(result.getHash()).isEqualTo(HASH); } @Test public void shouldReturnExistingHashForExistingLink() { LinkEntity link = new LinkEntityBuilder().hash(HASH).url(LONG_URL).build(); given(linkRepository.findByUrl(LONG_URL)).willReturn(link); given(urlVerifiers.isSafe(LONG_URL)).willReturn(true); LinkEntity result = linkService.create(LONG_URL); assertThat(result.getHash()).isEqualTo(HASH); } @Test(expected = InvalidURLException.class) public void shouldThrowExceptionWhenUnsecureLinkIsProcessed() { LinkEntity link = new LinkEntityBuilder().hash(HASH).url(LONG_URL).build(); given(linkRepository.save(link)).willReturn(link); given(shortenService.shorten(LONG_URL)).willReturn(HASH); given(urlVerifiers.isSafe(LONG_PHISHING_URL)).willReturn(false); linkService.create(LONG_URL); } @Test public void shouldReturnNullWhenHashNotFound() { given(linkRepository.findByHash(HASH)).willReturn(null); String result = linkService.findUrlByHash(HASH); assertThat(result).isNull(); } @Test public void shouldReturnUrlForExistingHash() { LinkEntity link = new LinkEntityBuilder().hash(HASH).url(LONG_URL).build(); given(linkRepository.findByHash(HASH)).willReturn(link); String result = linkService.findUrlByHash(HASH); assertThat(result).isEqualTo(LONG_URL); } }