diff --git a/application/model/src/main/java/org/fuseri/model/dto/course/CourseDto.java b/application/model/src/main/java/org/fuseri/model/dto/course/CourseDto.java index 15588e7e8fdfe8f4cd591a81949e324414771e17..c9d2d39ba344bc0d35337068691564323cb2217f 100644 --- a/application/model/src/main/java/org/fuseri/model/dto/course/CourseDto.java +++ b/application/model/src/main/java/org/fuseri/model/dto/course/CourseDto.java @@ -10,7 +10,6 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import org.fuseri.model.dto.common.DomainObjectDto; -import org.fuseri.model.dto.user.UserDto; import java.util.ArrayList; import java.util.List; @@ -21,15 +20,16 @@ import java.util.List; * It extends the DomainObjectDto class and includes additional Course-specific fields. */ @Schema(example = """ -{ - "id": 1, - "name": "english a1", - "capacity": 10, - "language": "ENGLISH", - "proficiency": "A1", - "students": [] -} - """) + { + "id": 1, + "name": "english a1", + "capacity": 10, + "language": "ENGLISH", + "proficiency": "A1", + "students": [], + "finished": false + } + """) @Getter @Setter @EqualsAndHashCode(callSuper = false) @@ -53,14 +53,26 @@ public class CourseDto extends DomainObjectDto { @NotNull(message = "Student's list is required") @Valid - private List<UserDto> students; + private List<Long> students; + + @NotNull(message = "Finished status required") + @Valid + private Boolean finished; - public CourseDto(String name, Integer capacity, LanguageTypeDto languageTypeDto, ProficiencyLevelDto proficiencyLevelDto) { + public CourseDto(String name, Integer capacity, LanguageTypeDto languageTypeDto, ProficiencyLevelDto proficiencyLevelDto, List<Long> students, Boolean finished) { this.name = name; this.capacity = capacity; this.language = languageTypeDto; this.proficiency = proficiencyLevelDto; - this.students = new ArrayList<>(); + this.students = students; + this.finished = finished; } + public CourseDto(String name, int capacity, LanguageTypeDto languageTypeDto, ProficiencyLevelDto proficiencyLevelDto) { + this.name = name; + this.capacity = capacity; + this.language = languageTypeDto; + this.proficiency = proficiencyLevelDto; + this.students = new ArrayList<>(); + } } diff --git a/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/Course.java b/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/Course.java index fd81844e735a953b1b07cf77678f3d2f48134da8..ba7635e8a6778ba84a71ba6641def530b9a4f806 100644 --- a/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/Course.java +++ b/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/Course.java @@ -5,8 +5,8 @@ import lombok.*; import org.fuseri.modulelanguageschool.common.DomainObject; import org.fuseri.modulelanguageschool.user.User; +import java.util.ArrayList; import java.util.List; -import java.util.Set; @Getter @Setter @@ -30,6 +30,15 @@ public class Course extends DomainObject { private List<User> students; private boolean finished = false; + + public Course(String name, int capacity, Language language, ProficiencyLevel proficiency) { + this.name = name; + this.capacity = capacity; + this.language = language; + this.proficiency = proficiency; + this.students = new ArrayList<>(); + } + public void enrolStudent(User student) { students.add(student); } @@ -38,13 +47,6 @@ public class Course extends DomainObject { students.remove(student); } - public Course(String name, Integer capacity, Language language, ProficiencyLevel proficiency) { - this.name = name; - this.capacity = capacity; - this.language = language; - this.proficiency = proficiency; - } - public void setFinished(boolean finished) { this.finished = finished; } diff --git a/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/CourseMapper.java b/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/CourseMapper.java index 9a5bf7c032fb11df53ef65ddad42b0e82230a7bf..89d3bbc90cf0ec35f564a73a78d6aba8d13b4c0d 100644 --- a/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/CourseMapper.java +++ b/application/module-language-school/src/main/java/org/fuseri/modulelanguageschool/course/CourseMapper.java @@ -2,26 +2,78 @@ package org.fuseri.modulelanguageschool.course; import org.fuseri.model.dto.course.CourseCreateDto; import org.fuseri.model.dto.course.CourseDto; +import org.fuseri.model.dto.course.LanguageTypeDto; +import org.fuseri.model.dto.course.ProficiencyLevelDto; +import org.fuseri.modulelanguageschool.user.User; +import org.fuseri.modulelanguageschool.user.UserService; import org.mapstruct.Mapper; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; +import java.util.ArrayList; import java.util.List; -@Mapper(componentModel = "spring") +@Mapper(componentModel = "spring", uses = {UserService.class}) public interface CourseMapper { - CourseDto mapToDto(Course course); + default CourseDto mapToDto(Course course) { + if (course == null) { + return null; + } - Course mapToCourse(CourseDto courseDto); + var dto = new CourseDto(course.getName(), + course.getCapacity(), + LanguageTypeDto.valueOf(course.getLanguage().name()), + ProficiencyLevelDto.valueOf(course.getProficiency().name()), + new ArrayList<>(), + course.isFinished()); + dto.setId(course.getId()); + var students = new ArrayList<Long>(); + for (User user : course.getStudents()) { + students.add(user.getId()); + } + dto.setStudents(students); + return dto; + } - List<CourseDto> mapToList(List<Course> persons); + default Course mapToCourse(CourseDto dto, UserService userService) { + if (dto == null) { + return null; + } + var course = new Course(dto.getName(), + dto.getCapacity(), + Language.valueOf(dto.getLanguage().name()), + ProficiencyLevel.valueOf(dto.getProficiency().name()), + new ArrayList<>(), + dto.getFinished()); + course.setId(dto.getId()); + for (Long userId : dto.getStudents()) { + course.enrolStudent(userService.find(userId)); + } + return course; + } + default List<CourseDto> mapToList(List<Course> courses) { + if (courses == null) { + return null; + } + return new ArrayList<>(courses.stream().map(this::mapToDto).toList()); + } default Page<CourseDto> mapToPageDto(Page<Course> courses) { return new PageImpl<>(mapToList(courses.getContent()), courses.getPageable(), courses.getTotalPages()); } - Course mapToCourse(CourseCreateDto dto); + default Course mapToCourse(CourseCreateDto createDto) { + if (createDto == null) { + return null; + } + return new Course(createDto.getName(), + createDto.getCapacity(), + Language.valueOf(createDto.getLanguage().name()), + ProficiencyLevel.valueOf(createDto.getProficiency().name()), + new ArrayList<>(), + false); + } } diff --git a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseControllerTest.java b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseControllerTest.java index 7e1cde9faa897cf91a0dd76b518b69431471d797..e2ea898bf6b3357b45dc4a914ce541bfed507b73 100644 --- a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseControllerTest.java +++ b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseControllerTest.java @@ -34,7 +34,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. public class CourseControllerTest { private final CourseCreateDto courseCreateDto = new CourseCreateDto("english b2 course", 10, LanguageTypeDto.ENGLISH, ProficiencyLevelDto.B2); - private final CourseDto courseDto = new CourseDto("english b2 course", 10, LanguageTypeDto.ENGLISH, ProficiencyLevelDto.B2); + private final CourseDto courseDto = new CourseDto("english b2 course", 10, LanguageTypeDto.ENGLISH, ProficiencyLevelDto.B2, new ArrayList<>(), false); @Autowired ObjectMapper objectMapper; @@ -210,7 +210,7 @@ public class CourseControllerTest { student.setId(1L); CourseDto courseDtoWithStudent = new CourseDto("english b2 course", 10, LanguageTypeDto.ENGLISH, ProficiencyLevelDto.B2); - courseDtoWithStudent.setStudents(new ArrayList<>(List.of(student))); + courseDtoWithStudent.setStudents(new ArrayList<>(List.of(student.getId()))); Mockito.when(courseFacade.enrol(ArgumentMatchers.anyLong(), ArgumentMatchers.anyLong())).thenReturn(courseDtoWithStudent); diff --git a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseFacadeTest.java b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseFacadeTest.java index 11cc6485699ed3653a64ae3d7458f34751cbce38..c1567d6765b46c33443ab09e94dce5a7c1d46fd6 100644 --- a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseFacadeTest.java +++ b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseFacadeTest.java @@ -5,9 +5,6 @@ import org.fuseri.model.dto.course.CourseCreateDto; 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.model.dto.user.UserType; import org.fuseri.modulelanguageschool.user.User; import org.fuseri.modulelanguageschool.user.UserService; import org.junit.jupiter.api.Test; @@ -20,6 +17,7 @@ import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import java.util.ArrayList; import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -34,10 +32,8 @@ import static org.mockito.Mockito.when; @AutoConfigureMockMvc final class CourseFacadeTest { - private final UserDto USER = new UserDto("novakovat", - "novakova@gamil.com", "Tereza", "Nováková", new AddressDto(), UserType.STUDENT); private final CourseDto courseDto = new CourseDto("AJ1", 10, - LanguageTypeDto.ENGLISH, ProficiencyLevelDto.A1); + LanguageTypeDto.ENGLISH, ProficiencyLevelDto.A1, new ArrayList<>(), false); private final CourseCreateDto courseCreateDto = new CourseCreateDto("AJ1", 10, LanguageTypeDto.ENGLISH, ProficiencyLevelDto.A1); private final Course course = new Course(); @@ -151,5 +147,4 @@ final class CourseFacadeTest { assertEquals(courseDto, actualDto); } - } diff --git a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseMapperTest.java b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseMapperTest.java index 8e87376603461ab9eb8362f365d0cdcd73659862..6dcc56d1937c2b7177732b64d61f8f29222fba55 100644 --- a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseMapperTest.java +++ b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseMapperTest.java @@ -4,6 +4,7 @@ import org.fuseri.model.dto.course.CourseCreateDto; import org.fuseri.model.dto.course.CourseDto; import org.fuseri.model.dto.course.LanguageTypeDto; import org.fuseri.model.dto.course.ProficiencyLevelDto; +import org.fuseri.modulelanguageschool.user.UserService; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -13,98 +14,102 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @SpringBootTest final class CourseMapperTest { - private final CourseDto courseDto = new CourseDto("AJ1", 10, - LanguageTypeDto.ENGLISH, ProficiencyLevelDto.A1); - private final CourseCreateDto courseCreateDto = new CourseCreateDto("AJ1", 10, + private final CourseDto courseDto = new CourseDto("AJ1", 10, + LanguageTypeDto.ENGLISH, ProficiencyLevelDto.A1, new ArrayList<>(), false); + private final CourseCreateDto courseCreateDto = new CourseCreateDto("AJ1", 10, LanguageTypeDto.ENGLISH, ProficiencyLevelDto.A1); - private final Course course = new Course("AJ1", 10, - Language.ENGLISH, ProficiencyLevel.A1); - @Autowired - private CourseMapper CourseMapper; + private final Course course = new Course("AJ1", 10, + Language.ENGLISH, ProficiencyLevel.A1); - @BeforeEach - void setUp() - { - course.setId(1L); - courseDto.setId(1L); - } + @Autowired + private CourseMapper CourseMapper; - @Test - void mapNullToDto() { - var createdDto = CourseMapper.mapToDto(null); + @Autowired + private UserService userService; - Assertions.assertNull(createdDto); - } + @BeforeEach + void setUp() { + course.setId(1L); + courseDto.setId(1L); + } - @Test - void mapToDto() { - var createdDto = CourseMapper.mapToDto(course); + @Test + void mapNullToDto() { + var createdDto = CourseMapper.mapToDto(null); - Assertions.assertNotNull(createdDto); - } + Assertions.assertNull(createdDto); + } - @Test - void mapNullToCourseCourseDto() { - var createdCourse = CourseMapper.mapToCourse((CourseDto) null); + @Test + void mapToDto() { + var createdDto = CourseMapper.mapToDto(course); - Assertions.assertNull(createdCourse); - } + Assertions.assertNotNull(createdDto); + } - @Test - void mapToCourseCourseDto() { - var createdCourse = CourseMapper.mapToCourse(courseDto); + @Test + void mapNullToCourseCourseDto() { + var createdCourse = CourseMapper.mapToCourse((CourseDto) null, null); - Assertions.assertNotNull(createdCourse); - } + Assertions.assertNull(createdCourse); + } - @Test - void mapNullToList() { - var courseDtos = CourseMapper.mapToList(null); + @Test + void mapToCourseCourseDto() { + var createdCourse = CourseMapper.mapToCourse(courseDto, userService); - Assertions.assertNull(courseDtos); - } + Assertions.assertNotNull(createdCourse); + } - @Test - void mapToEmptyList() { - var courseDtos = CourseMapper.mapToList(Collections.emptyList()); + @Test + void mapNullToList() { + var courseDtos = CourseMapper.mapToList(null); - Assertions.assertEquals(courseDtos.size(), 0); - } + Assertions.assertNull(courseDtos); + } - @Test - void mapToList() { - var courseDtos = CourseMapper.mapToList(Collections.singletonList(course)); + @Test + void mapToEmptyList() { + var courseDtos = CourseMapper.mapToList(Collections.emptyList()); - Assertions.assertEquals(1, courseDtos.size()); - } + Assertions.assertEquals(courseDtos.size(), 0); + } - @Test - void mapToEmptyPageDto() { - Page<CourseDto> pageDto = CourseMapper.mapToPageDto(Page.empty()); + @Test + void mapToList() { + var courseDtos = CourseMapper.mapToList(Collections.singletonList(course)); - Assertions.assertEquals(1, pageDto.getTotalPages()); - } + Assertions.assertEquals(1, courseDtos.size()); + } - @Test - void mapToPageDto() { - List<Course> courses = List.of(course); - Page<Course> page = new PageImpl<>(courses, PageRequest.of(0, 1), courses.size()); - Page<CourseDto> pageDto = CourseMapper.mapToPageDto(page); + @Test + void mapToEmptyPageDto() { + Page<CourseDto> pageDto = CourseMapper.mapToPageDto(Page.empty()); - 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(1, pageDto.getTotalPages()); + } + + @Test + void mapToPageDto() { + List<Course> courses = List.of(course); + Page<Course> page = new PageImpl<>(courses, PageRequest.of(0, 1), courses.size()); + Page<CourseDto> pageDto = CourseMapper.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(courseDto, pageDto.getContent().get(0)); - } + } @Test void mapNullToCourseCourseCreateDto() { @@ -119,5 +124,5 @@ final class CourseMapperTest { Assertions.assertEquals(course, createdCourse); } - + } diff --git a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseServiceTest.java b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseServiceTest.java index 5b952e05332fc5c8b49abb22479e4d131bc5a845..3d92ba1881bd3d3f1fec8087cd6e01fd04cb51bc 100644 --- a/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseServiceTest.java +++ b/application/module-language-school/src/test/java/org/fuseri/modulelanguageschool/course/CourseServiceTest.java @@ -21,22 +21,21 @@ import static org.mockito.Mockito.*; @SpringBootTest final class CourseServiceTest { - @MockBean - private CourseRepository courseRepository; - - @Autowired - private CourseService courseService; - - private final Course course = new Course("AJ1", 10, - Language.ENGLISH, ProficiencyLevel.A1, new ArrayList<>(), false); - + private final Course course = new Course("AJ1", 10, + Language.ENGLISH, ProficiencyLevel.A1); private final User user = new User("novakovat", UserType.STUDENT, - "novakova@gamil.com", "password", "Tereza", + "novakova@gamil.com", "password", "Tereza", "Nováková", new Address(), new HashSet<>(), new HashMap<>()); private final Course courseWithEnrolledStudent = new Course("AJ1", 10, Language.ENGLISH, ProficiencyLevel.A1, new ArrayList<>(List.of(user)), false); private final List<Course> courses = List.of(course, course); + @MockBean + private CourseRepository courseRepository; + + @Autowired + private CourseService courseService; + @Test void save() { when(courseRepository.save(course)).thenReturn(course);