diff --git a/pom.xml b/pom.xml index d23aeb7..005240e 100644 --- a/pom.xml +++ b/pom.xml @@ -50,6 +50,13 @@ org.springframework.boot spring-boot-starter-validation + + + com.h2database + h2 + test + + diff --git a/src/main/java/com/example/demo/student/StudentService.java b/src/main/java/com/example/demo/student/StudentService.java index 282e376..5bd5791 100644 --- a/src/main/java/com/example/demo/student/StudentService.java +++ b/src/main/java/com/example/demo/student/StudentService.java @@ -3,6 +3,7 @@ import com.example.demo.student.exception.BadRequestException; import com.example.demo.student.exception.StudentNotFoundException; import lombok.AllArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.ResponseStatus; diff --git a/src/test/java/com/example/demo/student/StudentRepositoryTest.java b/src/test/java/com/example/demo/student/StudentRepositoryTest.java new file mode 100644 index 0000000..eb46625 --- /dev/null +++ b/src/test/java/com/example/demo/student/StudentRepositoryTest.java @@ -0,0 +1,48 @@ +package com.example.demo.student; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import static org.junit.jupiter.api.Assertions.*; + +@DataJpaTest +class StudentRepositoryTest { + + @Autowired + StudentRepository underTest; + + @AfterEach + void tearDown() { + underTest.deleteAll(); + } + + @Test + void shouldExistStudentsEmail() { + + String email = "fathiamir37@gmail.com"; + Student student = new Student("amir" + , email + , Gender.MALE); + + underTest.save(student); + boolean result = underTest.selectExistsEmail(email); + assertTrue(result); + } + + @Test + void shouldNotExistStudentsEmail() { + + String email = "fathiamir37@gmail.com"; + String email2 = "test@gmail.com"; + Student student = new Student("amir" + , email + , Gender.MALE); + + underTest.save(student); + boolean result = underTest.selectExistsEmail(email2); + assertFalse(result); + } + +} \ No newline at end of file diff --git a/src/test/java/com/example/demo/student/StudentServiceTest.java b/src/test/java/com/example/demo/student/StudentServiceTest.java new file mode 100644 index 0000000..2def53d --- /dev/null +++ b/src/test/java/com/example/demo/student/StudentServiceTest.java @@ -0,0 +1,108 @@ +package com.example.demo.student; + +import com.example.demo.student.exception.BadRequestException; +import com.example.demo.student.exception.StudentNotFoundException; +import net.bytebuddy.matcher.ElementMatchers; +import org.assertj.core.api.Assertions; +import org.hamcrest.CoreMatchers; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentCaptor; +import org.mockito.ArgumentMatchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Arrays; +import java.util.List; + +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +class StudentServiceTest { + + @Mock + private StudentRepository studentRepository; + private StudentService underTest; + private Student student; + + @BeforeEach + void setUp() { + underTest = new StudentService(studentRepository); + student = new Student("amir", "fathiamir37@gmail.com", Gender.MALE); + } + + + @Test + void canGetAllStudents() { + // Arrange + List studentList = Arrays.asList( + new Student("amir", "fathiamir37@gmail.com", Gender.MALE), + new Student("sara", "saraamir37@gmail.com", Gender.FEMALE)); + when(studentRepository.findAll()).thenReturn(studentList); + + // Act + List allStudents = underTest.getAllStudents(); + + // Assert + Assertions.assertThat(studentList.size()).isEqualTo(allStudents.size()); + + // Verify + Mockito.verify(studentRepository).findAll(); + } + + @Test + void shouldAddStudent() { + + underTest.addStudent(student); + + ArgumentCaptor studentArgumentCaptor = ArgumentCaptor.forClass(Student.class); + + Mockito.verify(studentRepository).save(studentArgumentCaptor.capture()); + + Student value = studentArgumentCaptor.getValue(); + + Assertions.assertThat(value).isEqualTo(student); + + + } + + @Test + void shouldGetExceptionWhenAddingStudent() { + + when(studentRepository.selectExistsEmail(ArgumentMatchers.any())).thenReturn(true); + + Assertions.assertThatThrownBy(() -> underTest.addStudent(student)) + .isInstanceOfAny(BadRequestException.class); + Mockito.verify(studentRepository, Mockito.never()).save(ArgumentMatchers.any()); + } + + @Test + void shouldBeAbleToDeleteStudent() { + Long studentId = 1L; + + when(studentRepository.existsById(studentId)).thenReturn(true); + + underTest.deleteStudent(studentId); + + verify(studentRepository, times(1)).deleteById(studentId); + + } + + @Test + void shouldGetExceptionWhenDeleteStudent() { + + when(studentRepository + .existsById(ArgumentMatchers.any())) + .thenReturn(false); + + Assertions + .assertThatThrownBy(() -> underTest.deleteStudent(121L)) + .isInstanceOf(StudentNotFoundException.class); + + Mockito + .verify(studentRepository, Mockito.never()).deleteById(ArgumentMatchers.any()); + } +} \ No newline at end of file diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties new file mode 100644 index 0000000..c1c8fa7 --- /dev/null +++ b/src/test/resources/application.properties @@ -0,0 +1,7 @@ +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.url=jdbc:h2:mem:testdb +spring.datasource.username=sa +spring.datasource.password= +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +spring.jpa.hibernate.ddl-auto=create-drop +spring.jpa.show-sql=true