From 68ac70dd4f852601f6e7094feab94cd1201f46c7 Mon Sep 17 00:00:00 2001 From: Dominika Zemanovicova <xzemanov@fi.muni.cz> Date: Sun, 16 Apr 2023 06:42:12 +0200 Subject: [PATCH] Change UserControllerTest --- .../user/UserControllerTest.java | 172 ++++++++++-------- 1 file changed, 101 insertions(+), 71 deletions(-) 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 59f5032b..2bd4c267 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()); -- GitLab