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