diff --git a/application/module-certificate/src/main/java/org/fuseri/modulecertificate/service/CertificateController.java b/application/module-certificate/src/main/java/org/fuseri/modulecertificate/service/CertificateController.java index d0643d2529989fed6a1bd9a671d27df285cb2d2b..38853d761e343dbec8e495dea6b7d097c433858d 100644 --- a/application/module-certificate/src/main/java/org/fuseri/modulecertificate/service/CertificateController.java +++ b/application/module-certificate/src/main/java/org/fuseri/modulecertificate/service/CertificateController.java @@ -92,7 +92,7 @@ public class CertificateController { * @return a Result object containing a list of CertificateDto objects and pagination information */ @GetMapping("/findAll") - public Page<CertificateSimpleDto> findAllCertificates(@RequestBody Pageable pageable) { + public Page<CertificateSimpleDto> findAllCertificates(Pageable pageable) { return certificateFacade.findAll(pageable); } } diff --git a/application/module-certificate/src/test/java/org/fuseri/modulecertificate/CertificateControllerTests.java b/application/module-certificate/src/test/java/org/fuseri/modulecertificate/CertificateControllerTests.java index 20a1ec68448a8b0d97f6373a006c25708151a01e..23f381d2fed50ce0999d72f6971195914e8af769 100644 --- a/application/module-certificate/src/test/java/org/fuseri/modulecertificate/CertificateControllerTests.java +++ b/application/module-certificate/src/test/java/org/fuseri/modulecertificate/CertificateControllerTests.java @@ -2,21 +2,27 @@ package org.fuseri.modulecertificate; import com.fasterxml.jackson.databind.ObjectMapper; import org.fuseri.model.dto.certificate.CertificateCreateDto; -import org.fuseri.model.dto.certificate.CertificateDto; +import org.fuseri.model.dto.certificate.CertificateSimpleDto; import org.fuseri.model.dto.course.CourseDto; import org.fuseri.model.dto.course.LanguageTypeDto; import org.fuseri.model.dto.course.ProficiencyLevelDto; import org.fuseri.model.dto.user.AddressDto; import org.fuseri.model.dto.user.UserDto; +import org.fuseri.modulecertificate.service.CertificateController; import org.junit.jupiter.api.Test; -import org.springdoc.core.converters.models.Pageable; +import org.mockito.ArgumentMatchers; +import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; +import java.time.Instant; import java.util.List; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; @@ -27,23 +33,42 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @AutoConfigureMockMvc class CertificateControllerTests { - @Autowired - private ObjectMapper objectMapper; - - @Autowired - private MockMvc mockMvc; - private final UserDto USER = new UserDto("novakovat", "novakova@gamil.com", "Tereza", "Nováková", new AddressDto()); private final CourseDto COURSE = new CourseDto("AJ1", 10, LanguageTypeDto.ENGLISH, ProficiencyLevelDto.A1); + private final CertificateCreateDto certificateCreateDto = new CertificateCreateDto(USER, COURSE); + private final CertificateSimpleDto certificateDto = new CertificateSimpleDto(0L, USER.getId(), + Instant.now(), COURSE.getId(), "", ""); + @Autowired + private MockMvc mockMvc; + @MockBean + private CertificateController certificateController; + + private static String asJsonString(final Object obj) { + try { + return new ObjectMapper().writeValueAsString(obj); + } catch (Exception e) { + throw new RuntimeException(e); + } + } @Test void generateCertificate() throws Exception { + Mockito.when(certificateController.generate(ArgumentMatchers.any(CertificateCreateDto.class))) + .thenReturn(certificateDto); + mockMvc.perform(post("/certificates/generate") - .content(asJsonString(new CertificateCreateDto(USER, COURSE))) + .content(asJsonString(certificateCreateDto)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()); + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id").value(certificateDto.getId())) + .andExpect(jsonPath("$.userId").value(certificateDto.getUserId())) + .andExpect(jsonPath("$.generatedAt").value(certificateDto.getGeneratedAt().toString())) + .andExpect(jsonPath("$.courseId").value(certificateDto.getCourseId())) + .andExpect(jsonPath("$.certificateFile").value(certificateDto.getCertificateFile())) + .andExpect(jsonPath("$.certificateFileName").value(certificateDto.getCertificateFileName())); + } @Test @@ -71,16 +96,11 @@ class CertificateControllerTests { @Test void findCertificate() throws Exception { - String response = mockMvc.perform(post("/certificates/generate") - .content(asJsonString(new CertificateCreateDto(USER, COURSE))) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); + Mockito.when(certificateController.find(ArgumentMatchers.anyLong())).thenReturn(certificateDto); - Long id = objectMapper.readValue(response, CertificateDto.class).getId(); - - mockMvc.perform(get("/certificates/find").param("id", id.toString())) + mockMvc.perform(get("/certificates/find").param("id", certificateDto.getId().toString())) .andExpect(status().isOk()) - .andExpect(jsonPath("$.id").value(id)); + .andExpect(jsonPath("$.id").value(certificateDto.getId())); } @Test @@ -91,6 +111,8 @@ class CertificateControllerTests { @Test void findCertificatesForUser() throws Exception { + Mockito.when(certificateController.findForUser(ArgumentMatchers.anyLong())).thenReturn(List.of(certificateDto)); + mockMvc.perform(get("/certificates/findForUser").param("userId", "0")) .andExpect(status().isOk()) .andExpect(jsonPath("$").isArray()) @@ -105,11 +127,16 @@ class CertificateControllerTests { @Test void findCertificateIdForUserAndCourse() throws Exception { + Mockito.when(certificateController.findForUserAndCourse(ArgumentMatchers.anyLong(), + ArgumentMatchers.anyLong())) + .thenReturn(List.of(certificateDto)); + mockMvc.perform(get("/certificates/findForUserAndCourse") .param("userId", "0") .param("courseId", "0")) .andExpect(status().isOk()) - .andExpect(content().string("[]")); + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$").isNotEmpty()); } @Test @@ -134,8 +161,10 @@ class CertificateControllerTests { @Test void deleteCertificate() throws Exception { + Mockito.doNothing().when(certificateController).delete(ArgumentMatchers.anyLong()); + mockMvc.perform(delete("/certificates/delete") - .param("id", "0")) + .param("id", String.valueOf(0L))) .andExpect(status().isOk()); } @@ -145,31 +174,27 @@ class CertificateControllerTests { .andExpect(status().is4xxClientError()); } - @Test void findAllCertificates() throws Exception { - mockMvc.perform(post("/certificates/generate") - .content(asJsonString(new CertificateCreateDto(USER, COURSE))) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()); + Mockito.when(certificateController.findAllCertificates(ArgumentMatchers.any(Pageable.class))) + .thenReturn(Page.empty(PageRequest.of(0, 1))); mockMvc.perform(get("/certificates/findAll") - .content("{ \"page\": 0, \"size\": 1, \"sort\": []}") - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()); + .param("page", "0") + .param("size", "10")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$.content").isEmpty()); } @Test void findAllCertificatesWithoutParam() throws Exception { - mockMvc.perform(get("/certificates/findAll")) - .andExpect(status().is4xxClientError()); - } + Mockito.when(certificateController.findAllCertificates(ArgumentMatchers.any(Pageable.class))) + .thenReturn(Page.empty(PageRequest.of(0, 1))); - private static String asJsonString(final Object obj) { - try { - return new ObjectMapper().writeValueAsString(obj); - } catch (Exception e) { - throw new RuntimeException(e); - } + mockMvc.perform(get("/certificates/findAll")) + .andExpect(status().isOk()) + .andExpect(content().contentType(MediaType.APPLICATION_JSON)) + .andExpect(jsonPath("$.content").isEmpty()); } } diff --git a/application/module-certificate/src/test/java/org/fuseri/modulecertificate/CertificateFacadeTests.java b/application/module-certificate/src/test/java/org/fuseri/modulecertificate/CertificateFacadeTests.java new file mode 100644 index 0000000000000000000000000000000000000000..4a32b5143717c2b81de648eef5481fa7e7be341e --- /dev/null +++ b/application/module-certificate/src/test/java/org/fuseri/modulecertificate/CertificateFacadeTests.java @@ -0,0 +1,122 @@ +package org.fuseri.modulecertificate; + +import org.fuseri.model.dto.certificate.CertificateCreateDto; +import org.fuseri.model.dto.certificate.CertificateSimpleDto; +import org.fuseri.model.dto.course.CourseDto; +import org.fuseri.model.dto.course.LanguageTypeDto; +import org.fuseri.model.dto.course.ProficiencyLevelDto; +import org.fuseri.model.dto.user.AddressDto; +import org.fuseri.model.dto.user.UserDto; +import org.fuseri.modulecertificate.service.CertificateFacade; +import org.fuseri.modulecertificate.service.CertificateMapper; +import org.fuseri.modulecertificate.service.CertificateService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; + +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@SpringBootTest +@AutoConfigureMockMvc +final class CertificateFacadeTests { + private final UserDto USER = new UserDto("novakovat", + "novakova@gamil.com", "Tereza", "Nováková", new AddressDto()); + private final CourseDto COURSE = new CourseDto("AJ1", 10, + LanguageTypeDto.ENGLISH, ProficiencyLevelDto.A1); + private final CertificateCreateDto certificateCreateDto = new CertificateCreateDto(USER, COURSE); + private final CertificateSimpleDto certificateDto = new CertificateSimpleDto(0L, USER.getId(), + Instant.now(), COURSE.getId(), "", ""); + + private final Certificate certificate = new Certificate(); + private final List<Certificate> certificateList = List.of(certificate); + + @Autowired + private CertificateFacade certificateFacade; + + @MockBean + private CertificateService certificateService; + + @MockBean + private CertificateMapper certificateMapper; + + @Test + void generateCertificate() { + when(certificateMapper.mapToCertificate(certificateCreateDto)).thenReturn(certificate); + when(certificateService.save(certificate)).thenReturn(certificate); + when(certificateMapper.mapToSimpleDto(certificate)).thenReturn(certificateDto); + + CertificateSimpleDto actualDto = certificateFacade.generate(certificateCreateDto); + + assertEquals(certificateDto, actualDto); + } + + @Test + public void testFindById() { + Long id = 0L; + when(certificateService.findById(id)).thenReturn(certificate); + when(certificateMapper.mapToSimpleDto(certificate)).thenReturn(certificateDto); + + CertificateSimpleDto actualDto = certificateFacade.findById(id); + + assertNotNull(actualDto); + assertEquals(certificateDto, actualDto); + } + + @Test + public void testFindForUser() { + List<CertificateSimpleDto> expectedDtos = List.of(certificateDto); + + when(certificateService.findByUserId(USER.getId())).thenReturn(certificateList); + when(certificateMapper.mapToList(certificateList)).thenReturn(expectedDtos); + + List<CertificateSimpleDto> actualDtos = certificateFacade.findByUserId(USER.getId()); + + assertEquals(expectedDtos, actualDtos); + } + + @Test + public void testFindForUserAndCourse() { + List<CertificateSimpleDto> expectedDtos = List.of(certificateDto); + + when(certificateService.findByUserIdAndCourseId(USER.getId(), COURSE.getId())).thenReturn(certificateList); + when(certificateMapper.mapToList(certificateList)).thenReturn(expectedDtos); + + List<CertificateSimpleDto> actualDtos = certificateFacade.findByUserIdAndCourseId(USER.getId(), COURSE.getId()); + + assertEquals(expectedDtos, actualDtos); + } + + @Test + public void testDelete() { + Long certificateId = 1L; + certificateFacade.deleteCertificate(certificateId); + verify(certificateService).delete(certificateId); + } + + @Test + public void testFindAll() { + Pageable pageable = PageRequest.of(0, 10); + Page<Certificate> certificatePage = new PageImpl<>(List.of(certificate), pageable, 0); + Page<CertificateSimpleDto> expectedPageDto = new PageImpl<>(List.of(certificateDto), pageable, 0); + + when(certificateService.findAll(pageable)).thenReturn(certificatePage); + when(certificateMapper.mapToPageDto(certificatePage)).thenReturn(expectedPageDto); + + Page<CertificateSimpleDto> actualPageDto = certificateFacade.findAll(pageable); + + assertEquals(expectedPageDto, actualPageDto); + } +} diff --git a/application/module-certificate/src/test/java/org/fuseri/modulecertificate/CertificateMapperTests.java b/application/module-certificate/src/test/java/org/fuseri/modulecertificate/CertificateMapperTests.java new file mode 100644 index 0000000000000000000000000000000000000000..bc816f6942b335c173d29cea0101e68b490f5ae9 --- /dev/null +++ b/application/module-certificate/src/test/java/org/fuseri/modulecertificate/CertificateMapperTests.java @@ -0,0 +1,132 @@ +package org.fuseri.modulecertificate; + +import org.fuseri.model.dto.certificate.CertificateCreateDto; +import org.fuseri.model.dto.certificate.CertificateSimpleDto; +import org.fuseri.model.dto.course.CourseDto; +import org.fuseri.model.dto.course.LanguageTypeDto; +import org.fuseri.model.dto.course.ProficiencyLevelDto; +import org.fuseri.model.dto.user.AddressDto; +import org.fuseri.model.dto.user.UserDto; +import org.fuseri.modulecertificate.service.CertificateMapper; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; + +import java.time.Instant; +import java.util.Collections; +import java.util.List; + +@SpringBootTest +final class CertificateMapperTests { + + private final UserDto USER = new UserDto("novakovat", + "novakova@gamil.com", "Tereza", "Nováková", new AddressDto()); + private final CourseDto COURSE = new CourseDto("AJ1", 10, + LanguageTypeDto.ENGLISH, ProficiencyLevelDto.A1); + private final Instant instant = Instant.now(); + private final String fileName = "fileName"; + private final String file = "file"; + private final CertificateSimpleDto certificateDto = new CertificateSimpleDto(0L, USER.getId(), + instant, COURSE.getId(), file, fileName); + private final Certificate certificate = new Certificate(USER.getId(), + instant, COURSE.getId(), file, fileName); + private final CertificateCreateDto certificateCreateDto = new CertificateCreateDto(USER, COURSE); + @Autowired + private CertificateMapper certificateMapper; + + @Test + void mapNullToSimpleDto() { + var createdSimpleDto = certificateMapper.mapToSimpleDto(null); + + Assertions.assertNull(createdSimpleDto); + } + + @Test + void mapToSimpleDto() { + var createdSimpleDto = certificateMapper.mapToSimpleDto(certificate); + + Assertions.assertEquals(createdSimpleDto.getUserId(), certificateDto.getUserId()); + Assertions.assertEquals(createdSimpleDto.getGeneratedAt(), certificateDto.getGeneratedAt()); + Assertions.assertEquals(createdSimpleDto.getCourseId(), certificateDto.getCourseId()); + Assertions.assertEquals(createdSimpleDto.getCertificateFile(), certificateDto.getCertificateFile()); + Assertions.assertEquals(createdSimpleDto.getCertificateFileName(), certificateDto.getCertificateFileName()); + } + + @Test + void mapNullToCertificate() { + var createdCertificate = certificateMapper.mapToCertificate(null); + + Assertions.assertNull(createdCertificate); + } + + @Test + void mapToCertificate() { + var createdCertificate = certificateMapper.mapToCertificate(certificateCreateDto); + + Assertions.assertEquals(createdCertificate.getUserId(), certificateDto.getUserId()); + Assertions.assertTrue(createdCertificate.getGeneratedAt().isBefore(Instant.now())); + Assertions.assertEquals(createdCertificate.getCourseId(), certificateDto.getCourseId()); + Assertions.assertNull(createdCertificate.getCertificateFile()); + Assertions.assertNull(createdCertificate.getCertificateFileName()); + } + + @Test + void mapNullToList() { + var certificateSimpleDtos = certificateMapper.mapToList(null); + + Assertions.assertNull(certificateSimpleDtos); + } + + @Test + void mapToEmptyList() { + var certificateSimpleDtos = certificateMapper.mapToList(Collections.emptyList()); + + Assertions.assertEquals(certificateSimpleDtos.size(), 0); + } + + @Test + void mapToList() { + var certificateSimpleDtos = certificateMapper.mapToList(Collections.singletonList(certificate)); + + Assertions.assertEquals(certificateSimpleDtos.size(), 1); + Assertions.assertEquals(certificateSimpleDtos.get(0).getUserId(), certificateDto.getUserId()); + Assertions.assertEquals(certificateSimpleDtos.get(0).getGeneratedAt(), certificateDto.getGeneratedAt()); + Assertions.assertEquals(certificateSimpleDtos.get(0).getCourseId(), certificateDto.getCourseId()); + Assertions.assertEquals(certificateSimpleDtos.get(0).getCertificateFile(), certificateDto.getCertificateFile()); + Assertions.assertEquals(certificateSimpleDtos.get(0).getCertificateFileName(), certificateDto.getCertificateFileName()); + + + } + + @Test + void mapToEmptyPageDto() { + Page<CertificateSimpleDto> pageDto = certificateMapper.mapToPageDto(Page.empty()); + + Assertions.assertEquals(1, pageDto.getTotalPages()); + } + + @Test + void mapToPageDto() { + List<Certificate> certificates = List.of(certificate); + Page<Certificate> page = new PageImpl<>(certificates, PageRequest.of(0, 1), certificates.size()); + Page<CertificateSimpleDto> pageDto = certificateMapper.mapToPageDto(page); + + Assertions.assertEquals(page.getTotalPages(), pageDto.getTotalPages()); + Assertions.assertEquals(page.getNumber(), pageDto.getNumber()); + Assertions.assertEquals(page.getNumberOfElements(), pageDto.getNumberOfElements()); + Assertions.assertEquals(page.getSize(), pageDto.getSize()); + Assertions.assertEquals(page.getTotalElements(), pageDto.getTotalElements()); + + Assertions.assertEquals(certificate.getId(), pageDto.getContent().get(0).getId()); + Assertions.assertEquals(certificate.getGeneratedAt(), pageDto.getContent().get(0).getGeneratedAt()); + Assertions.assertEquals(certificate.getUserId(), pageDto.getContent().get(0).getUserId()); + Assertions.assertEquals(certificate.getCourseId(), pageDto.getContent().get(0).getCourseId()); + Assertions.assertEquals(certificate.getCertificateFile(), pageDto.getContent().get(0).getCertificateFile()); + Assertions.assertEquals(certificate.getCertificateFileName(), pageDto.getContent().get(0).getCertificateFileName()); + } + +} diff --git a/application/module-certificate/src/test/java/org/fuseri/modulecertificate/CertificateRepositoryTests.java b/application/module-certificate/src/test/java/org/fuseri/modulecertificate/CertificateRepositoryTests.java new file mode 100644 index 0000000000000000000000000000000000000000..34ca57badbed1ae6a79c31b20ef4f810e40fc14c --- /dev/null +++ b/application/module-certificate/src/test/java/org/fuseri/modulecertificate/CertificateRepositoryTests.java @@ -0,0 +1,101 @@ +package org.fuseri.modulecertificate; + +import org.fuseri.modulecertificate.service.CertificateRepository; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; + +import java.util.Arrays; +import java.util.List; + +@DataJpaTest +class CertificateRepositoryTests { + + @Autowired + private TestEntityManager entityManager; + + @Autowired + private CertificateRepository certificateRepository; + + @Test + void saveCertificate() { + Certificate certificate = new Certificate(); + certificate.setUserId(1L); + certificate.setCourseId(2L); + + Certificate saved = certificateRepository.save(certificate); + + Assertions.assertNotNull(saved); + Assertions.assertEquals(certificate, saved); + } + + @Test + void findCertificate() { + Certificate certificate = new Certificate(); + certificate.setUserId(1L); + entityManager.persist(certificate); + entityManager.flush(); + + Certificate found = certificateRepository.findById(certificate.getId()).orElse(null); + + Assertions.assertNotNull(found); + Assertions.assertEquals(found, certificate); + } + + @Test + void findCertificateByUserId() { + Certificate certificate = new Certificate(); + certificate.setUserId(1L); + entityManager.persist(certificate); + entityManager.flush(); + + List<Certificate> found = certificateRepository.findCertificateByUserId(1L); + + Assertions.assertEquals(1, found.size()); + Assertions.assertEquals(found.get(0), certificate); + } + + @Test + void findCertificateByUserIdAndCourseId() { + Certificate certificate = new Certificate(); + certificate.setUserId(1L); + certificate.setCourseId(2L); + entityManager.persist(certificate); + entityManager.flush(); + + List<Certificate> found = certificateRepository.findCertificateByUserIdAndCourseId(1L, 2L); + + Assertions.assertEquals(1, found.size()); + Assertions.assertEquals(found.get(0), certificate); + } + + @Test + public void testFindAllCertificates() { + Certificate certificate1 = new Certificate(); + Certificate certificate2 = new Certificate(); + + certificateRepository.save(certificate1); + certificateRepository.save(certificate2); + + Page<Certificate> certificatePage = certificateRepository.findAll(PageRequest.of(0, 42)); + + Assertions.assertEquals(2, certificatePage.getTotalElements()); + Assertions.assertEquals(certificatePage.getContent(), Arrays.asList(certificate1, certificate2)); + } + + @Test + public void testDeleteCertificate() { + Long certificateId = entityManager.persist(new Certificate()).getId(); + entityManager.flush(); + + certificateRepository.deleteById(certificateId); + + Assertions.assertTrue(certificateRepository.findById(certificateId).isEmpty()); + } + + +} diff --git a/application/module-certificate/src/test/java/org/fuseri/modulecertificate/CertificateServiceTests.java b/application/module-certificate/src/test/java/org/fuseri/modulecertificate/CertificateServiceTests.java new file mode 100644 index 0000000000000000000000000000000000000000..6d3302fa62d6c52eb5e0b7e713be40be9d73b1ce --- /dev/null +++ b/application/module-certificate/src/test/java/org/fuseri/modulecertificate/CertificateServiceTests.java @@ -0,0 +1,118 @@ +package org.fuseri.modulecertificate; + +import org.fuseri.model.dto.course.CourseDto; +import org.fuseri.model.dto.course.LanguageTypeDto; +import org.fuseri.model.dto.course.ProficiencyLevelDto; +import org.fuseri.model.dto.user.AddressDto; +import org.fuseri.model.dto.user.UserDto; +import org.fuseri.modulecertificate.service.CertificateRepository; +import org.fuseri.modulecertificate.service.CertificateService; +import org.fuseri.modulecertificate.service.ResourceNotFoundException; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.mockito.stubbing.OngoingStubbing; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; + +import java.time.Instant; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +import static org.mockito.Mockito.*; + +@SpringBootTest +final class CertificateServiceTests { + + @MockBean + private CertificateRepository certificateRepository; + + @Autowired + private CertificateService certificateService; + + private final UserDto USER = new UserDto("novakovat", + "novakova@gamil.com", "Tereza", "Nováková", new AddressDto()); + private final CourseDto COURSE = new CourseDto("AJ1", 10, + LanguageTypeDto.ENGLISH, ProficiencyLevelDto.A1); + private final Certificate certificate = new Certificate(USER.getId(), + Instant.now(), COURSE.getId(), "file", "fileName"); + private final List<Certificate> certificates = List.of(certificate, certificate); + + @Test + void save() { + when(certificateRepository.save(certificate)).thenReturn(certificate); + + Certificate result = certificateService.save(certificate); + + Assertions.assertEquals(certificate, result); + verify(certificateRepository).save(certificate); + } + + @Test + void notFoundById() { + when(certificateRepository.findById(certificate.getId())).thenReturn(Optional.empty()); + + Assertions.assertThrows(ResourceNotFoundException.class, () -> certificateService.findById(certificate.getId())); + + } + + @Test + void findById() { + when(certificateRepository.findById(certificate.getId())).thenReturn(Optional.of(certificate)); + + Certificate result = certificateService.findById(certificate.getId()); + + Assertions.assertEquals(certificate, result); + verify(certificateRepository).findById(certificate.getId()); + } + + + + @Test + void findByUserId() { + when(certificateRepository.findCertificateByUserId(USER.getId())).thenReturn(certificates); + + List<Certificate> result = certificateService.findByUserId(USER.getId()); + + Assertions.assertEquals(certificates, result); + verify(certificateRepository).findCertificateByUserId(USER.getId()); + } + + @Test + void findByUserIdAndCourseId() { + when(certificateRepository.findCertificateByUserIdAndCourseId(USER.getId(), COURSE.getId())).thenReturn(certificates); + + List<Certificate> result = certificateService.findByUserIdAndCourseId(USER.getId(), COURSE.getId()); + + Assertions.assertEquals(certificates, result); + verify(certificateRepository).findCertificateByUserIdAndCourseId(USER.getId(), COURSE.getId()); + + } + + @Test + void delete() { + certificateService.delete(certificate.getId()); + + verify(certificateRepository).deleteById(certificate.getId()); + } + + @Test + void findAll() { + Pageable pageable = PageRequest.of(0, 10); + Page<Certificate> page = new PageImpl<>(Collections.emptyList(), pageable, 0); + + when(certificateRepository.findAll(pageable)).thenReturn(page); + + Page<Certificate> result = certificateService.findAll(pageable); + + Assertions.assertEquals(page, result); + verify(certificateRepository).findAll(pageable); + + } + +}