From Mammoth Plover, 5 Years ago, written in Plain Text.
Embed
  1. package com.fosspowered.peist.service;
  2.  
  3. import static org.assertj.core.api.Assertions.assertThat;
  4. import static org.junit.jupiter.api.Assertions.assertThrows;
  5. import static org.mockito.Mockito.any;
  6. import static org.mockito.Mockito.anyString;
  7. import static org.mockito.Mockito.times;
  8. import static org.mockito.Mockito.verify;
  9. import static org.mockito.Mockito.when;
  10.  
  11. import com.fosspowered.peist.model.dao.Paste;
  12. import com.fosspowered.peist.model.exceptions.PeistInvalidRequestException;
  13. import com.fosspowered.peist.model.exceptions.PeistNotFoundException;
  14. import com.fosspowered.peist.model.json.PasteRequest;
  15. import com.fosspowered.peist.model.json.PasteResponse;
  16. import com.fosspowered.peist.repository.PasteRepository;
  17.  
  18. import java.util.Calendar;
  19. import java.util.Date;
  20. import java.util.List;
  21. import java.util.Optional;
  22. import org.apache.commons.lang3.RandomStringUtils;
  23. import org.junit.jupiter.api.BeforeEach;
  24. import org.junit.jupiter.api.Test;
  25. import org.junit.jupiter.api.extension.ExtendWith;
  26. import org.junit.jupiter.params.ParameterizedTest;
  27. import org.junit.jupiter.params.provider.NullAndEmptySource;
  28. import org.mockito.Mockito;
  29. import org.mockito.stubbing.Answer;
  30. import org.springframework.boot.test.mock.mockito.MockBean;
  31. import org.springframework.test.context.junit.jupiter.SpringExtension;
  32.  
  33. @ExtendWith(SpringExtension.class)
  34. class CRUDServiceTest {
  35.   private static final String INVALID_ID = "invalidId";
  36.  
  37.   @MockBean private PasteRepository pasteRepository;
  38.  
  39.   private CRUDService CRUDService;
  40.  
  41.   @BeforeEach
  42.   void setUp() {
  43.     CRUDService = new CRUDService(pasteRepository, "password");
  44.     when(pasteRepository.findByUrlId(anyString()))
  45.         .thenAnswer(
  46.             (Answer<Optional<Paste>>)
  47.                 invocationOnMock -> {
  48.                   Object[] args = invocationOnMock.getArguments();
  49.                   String urlId = (String) args[0];
  50.                   if (INVALID_ID.equals(urlId)) {
  51.                     return Optional.empty();
  52.                   }
  53.                   Paste paste = new Paste();
  54.                   paste.setUrlId(urlId);
  55.                   return Optional.of(paste);
  56.                 });
  57.     when(pasteRepository.findAll()).thenReturn(List.of(new Paste(), new Paste(), new Paste()));
  58.     when(pasteRepository.save(Mockito.any(Paste.class))).thenReturn(new Paste());
  59.   }
  60.  
  61.   @Test
  62.   void whenAddPaste_ValidRequest_SavesPaste() {
  63.     String author = "author";
  64.     String language = "language";
  65.     String title = "title";
  66.     int ttl = 3600;
  67.  
  68.     Calendar calendar = Calendar.getInstance();
  69.     Date currentDate = new Date(calendar.getTime().getTime());
  70.     calendar.add(Calendar.SECOND, ttl);
  71.     Date expiryDate = new Date(calendar.getTime().getTime());
  72.  
  73.     String pasteData = RandomStringUtils.randomAlphabetic(100);
  74.     PasteRequest pasteRequest =
  75.         PasteRequest.builder()
  76.             .title(title)
  77.             .language(language)
  78.             .author(author)
  79.             .secretKey(null)
  80.             .ttl(ttl)
  81.             .pasteData(pasteData)
  82.             .build();
  83.     PasteResponse pasteResponse = CRUDService.addPaste(pasteRequest);
  84.     verify(pasteRepository, times(1)).save(any(Paste.class));
  85.     assertThat(pasteResponse).isNotNull();
  86.     assertThat(pasteResponse.getUrlId()).isNotEmpty();
  87.     assertThat(pasteResponse.getTitle()).isEqualTo(title);
  88.     assertThat(pasteResponse.getAuthor()).isEqualTo(author);
  89.     assertThat(pasteResponse.getCreationDate()).isCloseTo(currentDate, 60);
  90.     assertThat(pasteResponse.getExpiryDate()).isCloseTo(expiryDate, 60);
  91.     assertThat(pasteResponse.getPasteData()).isNotEmpty().isEqualTo(pasteData);
  92.   }
  93.  
  94.   @Test
  95.   void whenFetchPaste_ExistingId_ReturnsPaste() {
  96.     PasteResponse pasteResponse = CRUDService.fetchPaste("id");
  97.     assertThat(pasteResponse).isNotNull();
  98.   }
  99.  
  100.   @Test
  101.   void whenFetchPaste_NonExistingId_ThrowsException() {
  102.     assertThrows(PeistNotFoundException.class, () -> CRUDService.fetchPaste(INVALID_ID));
  103.   }
  104.  
  105.   @ParameterizedTest(name = "run #{index} with [{arguments}]")
  106.   @NullAndEmptySource
  107.   void whenFetchPaste_InvalidId_ThrowsException(String id) {
  108.     assertThrows(PeistInvalidRequestException.class, () -> CRUDService.fetchPaste(id));
  109.   }
  110.  
  111.   @Test
  112.   void whenFetchRecentPastes_Any_RetrievesAll() {
  113.     List<PasteResponse> pasteResponses = CRUDService.fetchRecentPastes();
  114.     assertThat(pasteResponses).isNotEmpty();
  115.     assertThat(pasteResponses).hasSize(3);
  116.   }
  117. }
  118.