diff --git a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/user/UserControllerTest.java b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/user/UserControllerTest.java index 59f5032bf8a1fe520fa1160415230843c3d2850f..2bd4c2678bb31a9148039b28ca36ab937d348d19 100644 --- a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/user/UserControllerTest.java +++ b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/user/UserControllerTest.java @@ -2,22 +2,36 @@ package org.fuseri.modulelanguageschool.user; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; +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.*; +import org.fuseri.model.dto.user.AddressDto; +import org.fuseri.model.dto.user.UserAddLanguageDto; +import org.fuseri.model.dto.user.UserCreateDto; +import org.fuseri.model.dto.user.UserDto; +import org.fuseri.model.dto.user.UserLoginDto; +import org.fuseri.model.dto.user.UserType; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; +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.PageImpl; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.stream.Stream; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasSize; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; @@ -32,9 +46,15 @@ class UserControllerTest { @Autowired private MockMvc mockMvc; + @MockBean + private UserFacade userFacade; + private static final AddressDto ADDRESS_TO_CREATE = new AddressDto( "Czechia", "Brno", "Masarykova", "45", "90033"); + private static final Map<LanguageTypeDto, ProficiencyLevelDto> languageProficiency = + Map.of(LanguageTypeDto.ENGLISH, ProficiencyLevelDto.A1); + private static final List<AddressDto> INVALID_ADDRESSES = List.of( new AddressDto("", "Brno", "Masarykova", "45", "90033"), new AddressDto("Czechia", "", "Masarykova", "45", "90033"), @@ -47,43 +67,52 @@ class UserControllerTest { new AddressDto("Czechia", "Brno", "Masarykova", null, "90033") ); - private static final UserCreateDto USER_TO_CREATE = new UserCreateDto( + private final UserCreateDto USER_CREATE_DTO = new UserCreateDto( "xnovak", "1c1bbf66-6585-4978-886b-b126335ff3af", - "xnovak@emample.com", "Peter", "Novak", ADDRESS_TO_CREATE); + "xnovak@emample.com", "Peter", "Novak", ADDRESS_TO_CREATE, UserType.STUDENT, languageProficiency); - private static final UserLoginDto USER_TO_LOGIN = new UserLoginDto( + private static final UserLoginDto USER_LOGIN_DTO = new UserLoginDto( "xnovak", "1c1bbf66-6585-4978-886b-b126335ff3af"); + private final UserDto USER_DTO = new UserDto( + "xnovak", "xnovak@emample.com", "Peter", "Novak", ADDRESS_TO_CREATE, UserType.STUDENT); + private static Stream<UserCreateDto> invalidUsers() { var invalidUsers = Stream.of( new UserCreateDto("", "1c1bbf66-6585-4978-886b-b126335ff3af", - "xnovak@emample.com", "Peter", "Novak", ADDRESS_TO_CREATE), + "xnovak@emample.com", "Peter", "Novak", ADDRESS_TO_CREATE, UserType.STUDENT, languageProficiency), new UserCreateDto("xnovak", "", - "xnovak@emample.com", "Peter", "Novak", ADDRESS_TO_CREATE), + "xnovak@emample.com", "Peter", "Novak", ADDRESS_TO_CREATE, UserType.STUDENT, languageProficiency), new UserCreateDto("xnovak", "1c1bbf66-6585-4978-886b-b126335ff3af", - "", "Peter", "Novak", ADDRESS_TO_CREATE), + "", "Peter", "Novak", ADDRESS_TO_CREATE, UserType.STUDENT, languageProficiency), new UserCreateDto("xnovak", "1c1bbf66-6585-4978-886b-b126335ff3af", - "xnovak@emample.com", "", "Novak", ADDRESS_TO_CREATE), + "xnovak@emample.com", "", "Novak", ADDRESS_TO_CREATE, UserType.STUDENT, languageProficiency), new UserCreateDto("xnovak", "1c1bbf66-6585-4978-886b-b126335ff3af", - "xnovak@emample.com", "Peter", "", ADDRESS_TO_CREATE), + "xnovak@emample.com", "Peter", "", ADDRESS_TO_CREATE, UserType.STUDENT, languageProficiency), new UserCreateDto(null, "1c1bbf66-6585-4978-886b-b126335ff3af", - "xnovak@emample.com", "Peter", "Novak", ADDRESS_TO_CREATE), + "xnovak@emample.com", "Peter", "Novak", ADDRESS_TO_CREATE, UserType.STUDENT, languageProficiency), new UserCreateDto("xnovak", null, - "xnovak@emample.com", "Peter", "Novak", ADDRESS_TO_CREATE), + "xnovak@emample.com", "Peter", "Novak", ADDRESS_TO_CREATE, UserType.STUDENT, languageProficiency), new UserCreateDto("xnovak", "1c1bbf66-6585-4978-886b-b126335ff3af", - null, "Peter", "Novak", ADDRESS_TO_CREATE), + null, "Peter", "Novak", ADDRESS_TO_CREATE, UserType.STUDENT, languageProficiency), new UserCreateDto("xnovak", "1c1bbf66-6585-4978-886b-b126335ff3af", - "xnovak@emample.com", null, "Novak", ADDRESS_TO_CREATE), + "xnovak@emample.com", null, "Novak", ADDRESS_TO_CREATE, UserType.STUDENT, languageProficiency), new UserCreateDto("xnovak", "1c1bbf66-6585-4978-886b-b126335ff3af", - "xnovak@emample.com", "Peter", null, ADDRESS_TO_CREATE), + "xnovak@emample.com", "Peter", null, ADDRESS_TO_CREATE, UserType.STUDENT, languageProficiency), new UserCreateDto("xnovak", "1c1bbf66-6585-4978-886b-b126335ff3af", - "xnovak@emample.com", "Peter", "Novak", null) + "xnovak@emample.com", "Peter", "Novak", null, UserType.STUDENT, languageProficiency), + new UserCreateDto( + "xnovak", "1c1bbf66-6585-4978-886b-b126335ff3af", + "xnovak@emample.com", "Peter", "Novak", ADDRESS_TO_CREATE, null, languageProficiency), + new UserCreateDto( + "xnovak", "1c1bbf66-6585-4978-886b-b126335ff3af", + "xnovak@emample.com", "Peter", "Novak", ADDRESS_TO_CREATE, UserType.STUDENT, null) ); var invalidAddressUsers = new ArrayList<UserCreateDto>(); for (var invalidAddress : INVALID_ADDRESSES) { invalidAddressUsers.add(new UserCreateDto("xnovak", "1c1bbf66-6585-4978-886b-b126335ff3af", - "xnovak@emample.com", "Peter", "Novak", invalidAddress)); + "xnovak@emample.com", "Peter", "Novak", invalidAddress, UserType.STUDENT, languageProficiency)); } return Stream.concat(invalidUsers, invalidAddressUsers.stream()); @@ -98,16 +127,18 @@ class UserControllerTest { } @Test - void create() throws Exception { + void createUser() throws Exception { + Mockito.when(userFacade.create(ArgumentMatchers.isA(UserCreateDto.class))).thenReturn(USER_DTO); mockMvc.perform(post("/users") - .content(asJsonString(USER_TO_CREATE)) + .content(asJsonString(USER_CREATE_DTO)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()); + .andExpect(status().isCreated()); } @ParameterizedTest @MethodSource("invalidUsers") void createInvalidUser(UserCreateDto user) throws Exception { + Mockito.when(userFacade.create(ArgumentMatchers.isA(UserCreateDto.class))).thenReturn(USER_DTO); mockMvc.perform(post("/users") .content(asJsonString(user)) .contentType(MediaType.APPLICATION_JSON)) @@ -116,65 +147,47 @@ class UserControllerTest { @Test void findUser() throws Exception { - String response = mockMvc.perform(post("/users") - .content(asJsonString(USER_TO_CREATE)) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); - - Long id = objectMapper.readValue(response, UserDto.class).getId(); - + long id = 1; + Mockito.when(userFacade.find(id)).thenReturn(USER_DTO); mockMvc.perform(get("/users/{id}", id)) .andExpect(status().isOk()) - .andExpect(jsonPath("$.id").value(id)); + .andExpect(jsonPath("$.username").value(USER_DTO.getUsername())); } @Test void findAll() throws Exception { - mockMvc.perform(get("/users/all") - .param("page", "0")) - .andExpect(status().isOk()); + int page = 0; + Page<UserDto> pageUserDto = new PageImpl<>(List.of(USER_DTO)); + Mockito.when(userFacade.findAll(page)).thenReturn(pageUserDto); + + mockMvc.perform(get("/users") + .param("page", Integer.toString(page))) + .andExpect(status().isOk()) + .andExpect(content().string(objectMapper.writeValueAsString(pageUserDto))); } @Test void deleteUser() throws Exception { - String response = mockMvc.perform(post("/users") - .content(asJsonString(USER_TO_CREATE)) + mockMvc.perform(delete("/users/{id}", 1L) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); - - Long id = objectMapper.readValue(response, UserDto.class).getId(); - - mockMvc.perform(delete("/users/{id}", id) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()); + .andExpect(status().isNoContent()); } @Test void update() throws Exception { - String response = mockMvc.perform(post("/users") - .content(asJsonString(USER_TO_CREATE)) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); - - Long id = objectMapper.readValue(response, UserDto.class).getId(); + Long id = 1L; + Mockito.when(userFacade.update(id, USER_CREATE_DTO)).thenReturn(USER_DTO); - var updatedUsername = "novak"; - var userToUpdate = new UserCreateDto( - USER_TO_CREATE.getUsername(), USER_TO_CREATE.getPassword(), USER_TO_CREATE.getEmail(), - USER_TO_CREATE.getFirstName(), USER_TO_CREATE.getLastName(), USER_TO_CREATE.getAddress()); - userToUpdate.setUsername(updatedUsername); - - mockMvc.perform(put("/users/update/{id}", id) - .content(asJsonString(userToUpdate)) + mockMvc.perform(put("/users/{id}", id) + .content(asJsonString(USER_CREATE_DTO)) .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.username").value(updatedUsername)); + .andExpect(status().isOk()); } @Test void login() throws Exception { mockMvc.perform(post("/users/login") - .content(asJsonString(USER_TO_LOGIN)) + .content(asJsonString(USER_LOGIN_DTO)) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()); } @@ -190,32 +203,49 @@ class UserControllerTest { @Test void logout() throws Exception { - String response = mockMvc.perform(post("/users") - .content(asJsonString(USER_TO_CREATE)) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); - - Long id = objectMapper.readValue(response, UserDto.class).getId(); - - mockMvc.perform(post("/users/logout/{id}", id)) + mockMvc.perform(post("/users/{id}/logout", 1L)) .andExpect(status().isOk()); } @Test - void getFinished() throws Exception { - mockMvc.perform(get("/users/finished/1", "1c1bbf66-6585-4978-886b-b126335ff3af")) - .andExpect(status().isOk()); + void getFinishedCourses() throws Exception { + Long id = 1L; + String name = "History Spanish"; + List<CourseDto> courses = List.of( + new CourseDto(1L, name, 10, LanguageTypeDto.SPANISH, ProficiencyLevelDto.B2) + ); + Mockito.when(userFacade.getFinished(id)).thenReturn(courses); + mockMvc.perform(get("/users/{id}/finished-courses", 1L)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$", hasSize(1))) + .andExpect(jsonPath("$[0].name", equalTo(name))); } @Test - void getEnrolled() throws Exception { - mockMvc.perform(get("/users/enrolled/1", "1c1bbf66-6585-4978-886b-b126335ff3af")) - .andExpect(status().isOk()); + void getEnrolledCourses() throws Exception { + Long id = 1L; + String name = "History Spanish"; + List<CourseDto> courses = List.of( + new CourseDto(1L, name, 10, LanguageTypeDto.SPANISH, ProficiencyLevelDto.B2) + ); + Mockito.when(userFacade.getEnrolled(id)).thenReturn(courses); + mockMvc.perform(get("/users/{id}/courses", id)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$", hasSize(1))) + .andExpect(jsonPath("$[0].name", equalTo(name))); } @Test void addLanguage() throws Exception { - mockMvc.perform(put("/users/addLanguage/1", "1c1bbf66-6585-4978-886b-b126335ff3af") + Long id = 1L; + var language = LanguageTypeDto.ENGLISH; + var proficiency = ProficiencyLevelDto.B2; + UserAddLanguageDto languageDto = new UserAddLanguageDto(language, proficiency); + UserDto userWithLanguages = USER_DTO; + userWithLanguages.setLanguageProficiency(Map.of(language, proficiency)); + + Mockito.when(userFacade.addLanguageProficiency(id, languageDto)).thenReturn(userWithLanguages); + mockMvc.perform(put("/users/{id}/languages", id) .content(asJsonString(new UserAddLanguageDto(LanguageTypeDto.ENGLISH, ProficiencyLevelDto.B2))) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()); diff --git a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/user/UserFacadeTest.java b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/user/UserFacadeTest.java new file mode 100644 index 0000000000000000000000000000000000000000..8d66a851981e3d27af0aaede977eab45cc0324bc --- /dev/null +++ b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/user/UserFacadeTest.java @@ -0,0 +1,159 @@ +package org.fuseri.modulelanguageschool.user; + +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.UserAddLanguageDto; +import org.fuseri.model.dto.user.UserCreateDto; +import org.fuseri.model.dto.user.UserDto; +import org.fuseri.modulelanguageschool.course.Course; +import org.fuseri.modulelanguageschool.course.CourseMapper; +import org.fuseri.modulelanguageschool.course.Language; +import org.fuseri.modulelanguageschool.course.ProficiencyLevel; +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.util.List; +import java.util.Map; +import java.util.Set; + +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 UserFacadeTest { + + @Autowired + private UserFacade userFacade; + + @MockBean + private UserService userService; + + @MockBean + private UserMapper userMapper; + + @MockBean + private CourseMapper courseMapper; + + private static final LanguageTypeDto LANGUAGE_DTO = LanguageTypeDto.ENGLISH; + private static final ProficiencyLevelDto PROFICIENCY_DTO = ProficiencyLevelDto.B2; + private static final Map<LanguageTypeDto, ProficiencyLevelDto> LANGUAGE_PROFICIENCY_DTO = + Map.of(LANGUAGE_DTO, PROFICIENCY_DTO); + private final static List<CourseDto> COURSE_DTO_LIST = List.of(new CourseDto(1L, "AJ1", 10, + LANGUAGE_DTO, PROFICIENCY_DTO)); + private static final List<Course> COURSE_LIST = List.of(new Course("AJ1", 10, + Language.valueOf(LANGUAGE_DTO.name()), ProficiencyLevel.valueOf(PROFICIENCY_DTO.name()))); + private static final Address ADDRESS = new Address( + "Czechia", "Brno", "Masarykova", "45", "90033"); + private static final AddressDto ADDRESS_DTO = new AddressDto( + "Czechia", "Brno", "Masarykova", "45", "90033"); + private final UserCreateDto USER_CREATE_DTO = new UserCreateDto( + "xnovak", "1c1bbf66-6585-4978-886b-b126335ff3af", + "xnovak@emample.com", "Peter", "Novak", ADDRESS_DTO, org.fuseri.model.dto.user.UserType.STUDENT, LANGUAGE_PROFICIENCY_DTO); + private final UserDto USER_DTO = new UserDto("xnovak", "xnovak@emample.com", "Peter", "Novak", ADDRESS_DTO, org.fuseri.model.dto.user.UserType.STUDENT); + private final User USER = new User( + "xnovak", UserType.STUDENT, "1234fak", "xnovak@emample.com", "Peter", "Novak", ADDRESS, Set.of(), Map.of()); + + @Test + void find() { + long id = 1L; + when(userService.find(id)).thenReturn(USER); + when(userMapper.toDto(USER)).thenReturn(USER_DTO); + + UserDto actualDto = userFacade.find(id); + assertNotNull(actualDto); + assertEquals(USER_DTO, actualDto); + } + + @Test + void create() { + when(userMapper.fromCreateDto(USER_CREATE_DTO)).thenReturn(USER); + when(userService.create(USER)).thenReturn(USER); + when(userMapper.toDto(USER)).thenReturn(USER_DTO); + + UserDto actualDto = userFacade.create(USER_CREATE_DTO); + assertEquals(USER_DTO, actualDto); + } + + @Test + void delete() { + long id = 1L; + userFacade.delete(id); + verify(userService).delete(id); + } + + @Test + void update() { + long id = 1L; + when(userMapper.fromCreateDto(USER_CREATE_DTO)).thenReturn(USER); + when(userService.update(id, USER)).thenReturn(USER); + when(userMapper.toDto(USER)).thenReturn(USER_DTO); + + UserDto actualDto = userFacade.update(id, USER_CREATE_DTO); + + assertEquals(USER_DTO, actualDto); + } + + @Test + void findAll() { + Pageable pageable = PageRequest.of(0, 10); + Page<User> userPage = new PageImpl<>(List.of(USER), pageable, 1); + Page<UserDto> expectedPageDto = new PageImpl<>(List.of(USER_DTO), pageable, 1); + + when(userService.findAll(pageable)).thenReturn(userPage); + when(userMapper.toDtoPage(userPage)).thenReturn(expectedPageDto); + + Page<UserDto> actualPageDto = userFacade.findAll(0); + + assertEquals(expectedPageDto, actualPageDto); + } + + @Test + void addLanguage() { + long id = 1L; + UserAddLanguageDto dto = new UserAddLanguageDto(LANGUAGE_DTO, PROFICIENCY_DTO); + when(userService.addLanguageProficiency( + id, Language.valueOf(LANGUAGE_DTO.name()), ProficiencyLevel.valueOf(PROFICIENCY_DTO.name()))) + .thenReturn(USER); + when(userMapper.toDto(USER)).thenReturn(USER_DTO); + + UserDto actualDto = userFacade.addLanguageProficiency(id, dto); + + assertNotNull(actualDto); + assertEquals(USER_DTO, actualDto); + } + + @Test + void getEnrolled() { + long id = 1L; + when(courseMapper.mapToList(COURSE_LIST)).thenReturn(COURSE_DTO_LIST); + when(userService.getEnrolled(id)).thenReturn(COURSE_LIST); + List<CourseDto> actualDtos = userFacade.getEnrolled(id); + + assertNotNull(actualDtos); + assertEquals(COURSE_DTO_LIST, actualDtos); + } + + @Test + void getFinished() { + long id = 1L; + when(courseMapper.mapToList(COURSE_LIST)).thenReturn(COURSE_DTO_LIST); + when(userService.getFinished(id)).thenReturn(COURSE_LIST); + List<CourseDto> actualDtos = userFacade.getFinished(id); + + assertNotNull(actualDtos); + assertEquals(COURSE_DTO_LIST, actualDtos); + } +} diff --git a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/user/UserMapperTest.java b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/user/UserMapperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..88eaeabaf0c4b61af264536090004f021f26bc95 --- /dev/null +++ b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/user/UserMapperTest.java @@ -0,0 +1,116 @@ +package org.fuseri.modulelanguageschool.user; + +import org.fuseri.model.dto.user.AddressDto; +import org.fuseri.model.dto.user.UserCreateDto; +import org.fuseri.model.dto.user.UserDto; +import org.fuseri.model.dto.user.UserType; +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.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +class UserMapperTest { + + @Autowired + private UserMapper userMapper; + + private final UserDto userDto = new UserDto( + "xnovak", "xnovak@emample.com", "Peter", "Novak", + new AddressDto(), UserType.STUDENT); + private final UserCreateDto userCreateDto = new UserCreateDto( + "xnovak", "akfksobg", + "xnovak@emample.com", "Peter", "Novak", new AddressDto(), UserType.STUDENT, Map.of()); + + private final User userFromCreateDto = new User( + "xnovak", org.fuseri.modulelanguageschool.user.UserType.STUDENT, "akfksobg", + "xnovak@emample.com", "Peter", "Novak", new Address(), null, new HashMap<>()); + + private final User userFromDto = new User( + "xnovak", org.fuseri.modulelanguageschool.user.UserType.STUDENT, null, + "xnovak@emample.com", "Peter", "Novak", new Address(), null, null); + + @Test + void nullFromCreateDto() { + User mappedUser = userMapper.fromCreateDto(null); + assertNull(mappedUser); + } + + @Test + void fromCreateDto() { + User mappedUser = userMapper.fromCreateDto(userCreateDto); + assertEquals(userFromCreateDto, mappedUser); + } + + @Test + void nullFromDto() { + User mappedUser = userMapper.fromDto(null); + assertNull(mappedUser); + } + + @Test + void fromDto() { + User mappedUser = userMapper.fromDto(userDto); + assertEquals(userFromDto, mappedUser); + } + + @Test + void nullToDto() { + var createdDto = userMapper.toDto(null); + assertNull(createdDto); + } + + @Test + void toDto() { + var mappedDto = userMapper.toDto(userFromDto); + assertEquals(userDto, mappedDto); + } + + @Test + void nullToDtoList() { + var mappedDtos = userMapper.toDtoList(null); + assertNull(mappedDtos); + } + + @Test + void toEmptyDtoList() { + var mappedDtos = userMapper.toDtoList(Collections.emptyList()); + assertTrue(mappedDtos.isEmpty()); + } + + @Test + void toDtoList() { + var mappedDtos = userMapper.toDtoList(List.of(userFromDto)); + assertEquals(List.of(userDto), mappedDtos); + } + + @Test + void toEmptyDtoPage() { + Page<UserDto> pageDto = userMapper.toDtoPage(Page.empty()); + assertEquals(1, pageDto.getTotalPages()); + assertTrue(pageDto.getContent().isEmpty()); + } + + @Test + void toDtoPage() { + List<User> users = List.of(userFromDto); + Page<User> page = new PageImpl<>(users, PageRequest.of(0, 10), users.size()); + Page<UserDto> pageDto = userMapper.toDtoPage(page); + + assertEquals(page.getTotalPages(), pageDto.getTotalPages()); + assertEquals(page.getNumber(), pageDto.getNumber()); + assertEquals(page.getNumberOfElements(), pageDto.getNumberOfElements()); + assertEquals(page.getSize(), pageDto.getSize()); + assertEquals(page.getTotalElements(), pageDto.getTotalElements()); + assertEquals(List.of(userDto), pageDto.getContent()); + } +} \ No newline at end of file diff --git a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/user/UserRepositoryTest.java b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/user/UserRepositoryTest.java new file mode 100644 index 0000000000000000000000000000000000000000..3538aff2c95173f76d0cb2e67c78f86a39b601e5 --- /dev/null +++ b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/user/UserRepositoryTest.java @@ -0,0 +1,57 @@ +package org.fuseri.modulelanguageschool.user; + +import org.fuseri.modulelanguageschool.course.Course; +import org.fuseri.modulelanguageschool.course.Language; +import org.fuseri.modulelanguageschool.course.ProficiencyLevel; +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 java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@DataJpaTest +class UserRepositoryTest { + + @Autowired + private UserRepository userRepository; + + @Autowired + private TestEntityManager entityManager; + + private final Course course = new Course("AJ1", 10, Language.ENGLISH, ProficiencyLevel.B2); + private final Set<Course> COURSES = Set.of(course); + private final User user = new User( + "xnovak", UserType.STUDENT, + "1234fak", "xnovak@emample.com", "Peter", "Novak", + new Address(), COURSES, Map.of()); + + @Test + void getEnrolled() { + entityManager.persist(course); + entityManager.persist(user); + entityManager.flush(); + + List<Course> foundCourses = userRepository.getEnrolled(user.getId()); + assertNotNull(foundCourses); + assertEquals(new ArrayList<>(COURSES), foundCourses); + } + + @Test + void getFinished() { + course.setFinished(true); + entityManager.persist(course); + entityManager.persist(user); + entityManager.flush(); + + List<Course> foundCourses = userRepository.getFinished(user.getId()); + assertNotNull(foundCourses); + assertEquals(new ArrayList<>(COURSES), foundCourses); + } +} \ No newline at end of file diff --git a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/user/UserServiceTest.java b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/user/UserServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..062bc734f1a3e8778a951432eaf93f9b6b76e3fc --- /dev/null +++ b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/user/UserServiceTest.java @@ -0,0 +1,76 @@ +package org.fuseri.modulelanguageschool.user; + +import org.fuseri.modulelanguageschool.course.Course; +import org.fuseri.modulelanguageschool.course.Language; +import org.fuseri.modulelanguageschool.course.ProficiencyLevel; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + + +@SpringBootTest +class UserServiceTest { + + @Autowired + private UserService userService; + + @MockBean + private UserRepository userRepository; + + private static final User USER = new User( + "xnovak", UserType.STUDENT, "1234fak", "xnovak@emample.com", "Peter", "Novak", new Address(), Set.of(), new HashMap<>()); + private static final Course COURSE = new Course("AJ1", 10, Language.ENGLISH, ProficiencyLevel.B2); + private static final List<Course> COURSE_LIST = List.of(COURSE); + private static final User USER_WITH_ENROLLED_COURSE = new User( + "xnovak", UserType.STUDENT, "1234fak", "xnovak@emample.com", "Peter", "Novak", new Address(), Set.of(COURSE), Map.of()); + + @Test + void find() { + when(userRepository.findById(anyLong())).thenReturn(Optional.of(USER)); + User actualUser = userService.find(anyLong()); + assertEquals(USER, actualUser); + } + + @Test + void getEnrolled() { + Long id = 1L; + when(userRepository.getEnrolled(anyLong())).thenReturn(COURSE_LIST); + List<Course> actualCourses = userService.getEnrolled(id); + assertEquals(COURSE_LIST, actualCourses); + } + + @Test + void getFinished() { + long id = 1L; + when(userRepository.getFinished(anyLong())).thenReturn(COURSE_LIST); + List<Course> actualCourses = userService.getFinished(id); + assertEquals(COURSE_LIST, actualCourses); + } + + @Test + void addLanguageProficiency() { + long id = 1L; + Language language = Language.ENGLISH; + ProficiencyLevel proficiencyLevel = ProficiencyLevel.B2; + when(userRepository.findById(id)).thenReturn(Optional.of(USER)); + when(userRepository.save(any(User.class))).thenReturn(USER_WITH_ENROLLED_COURSE); + + User updatedUser = userService.addLanguageProficiency(id, language, proficiencyLevel); + assertEquals(USER_WITH_ENROLLED_COURSE, updatedUser); + verify(userRepository).findById(id); + verify(userRepository).save(any(User.class)); + } +} \ No newline at end of file