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