From 9a4f94d87d2ffa27ca2e3a7571024d37f8b96703 Mon Sep 17 00:00:00 2001 From: clivissonjose Date: Mon, 8 Sep 2025 15:10:09 -0300 Subject: [PATCH 1/3] testes unitarios de CompanyController --- .../repositories/CompanyRepository.java | 4 +- .../controller/CompanyControllerTest.java | 176 ++++++++++++++++++ .../company/service/CompanyServiceTest.java | 1 - 3 files changed, 179 insertions(+), 2 deletions(-) create mode 100644 backend/src/test/java/com/va2es/backend/company/controller/CompanyControllerTest.java diff --git a/backend/src/main/java/com/va2es/backend/repositories/CompanyRepository.java b/backend/src/main/java/com/va2es/backend/repositories/CompanyRepository.java index 53bf357..8f4d824 100644 --- a/backend/src/main/java/com/va2es/backend/repositories/CompanyRepository.java +++ b/backend/src/main/java/com/va2es/backend/repositories/CompanyRepository.java @@ -4,8 +4,10 @@ import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; -import com.va2es.backend.models.Company; +import org.springframework.stereotype.Repository; +import com.va2es.backend.models.Company; +@Repository public interface CompanyRepository extends JpaRepository { List findByNomeDaEmpresaIgnoreCase(String nomeDaEmpresa); Optional findByCnpj(String cnpj); diff --git a/backend/src/test/java/com/va2es/backend/company/controller/CompanyControllerTest.java b/backend/src/test/java/com/va2es/backend/company/controller/CompanyControllerTest.java new file mode 100644 index 0000000..9fac2dd --- /dev/null +++ b/backend/src/test/java/com/va2es/backend/company/controller/CompanyControllerTest.java @@ -0,0 +1,176 @@ +package com.va2es.backend.company.controller; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.http.ResponseEntity; + +import com.va2es.backend.controllers.CompanyController; +import com.va2es.backend.dto.CompanyRequestDTO; +import com.va2es.backend.dto.CompanyResponseDTO; +import com.va2es.backend.services.CompanyService; + +import jakarta.persistence.EntityNotFoundException; + +@ExtendWith(MockitoExtension.class) +class CompanyControllerTest { + + @Mock + private CompanyService companyService; + + @InjectMocks + private CompanyController companyController; + + @Test + void testCreateCompany() { + // Arrange: CompanyRequestDTO sem construtor nem setters -> usar campos públicos + CompanyRequestDTO request = new CompanyRequestDTO(); + request.nomeDaEmpresa = "Empresa Teste"; + request.cnpj = "12.345.678/0001-90"; + request.telefone = "9876543210"; + request.areaDeAtuacao = "Tecnologia"; + request.representanteDaEmpresaId = 99L; + + + CompanyResponseDTO mockResponse = mock(CompanyResponseDTO.class); + when(mockResponse.getId()).thenReturn(1L); + when(mockResponse.getNomeDaEmpresa()).thenReturn("Empresa Teste"); + when(mockResponse.getCnpj()).thenReturn("12.345.678/0001-90"); + when(mockResponse.getTelefone()).thenReturn("9876543210"); + when(mockResponse.getAreaDeAtuacao()).thenReturn("Tecnologia"); + when(mockResponse.getRepresentanteDaEmpresaId()).thenReturn(99L); + + when(companyService.create(request)).thenReturn(mockResponse); + + // Act + ResponseEntity response = companyController.cadastrar(request); + + // Assert + assertNotNull(response.getBody()); + assertEquals(1L, response.getBody().getId()); + assertEquals("Empresa Teste", response.getBody().getNomeDaEmpresa()); + assertEquals("12.345.678/0001-90", response.getBody().getCnpj()); + assertEquals("9876543210", response.getBody().getTelefone()); + assertEquals("Tecnologia", response.getBody().getAreaDeAtuacao()); + assertEquals(99L, response.getBody().getRepresentanteDaEmpresaId()); + + verify(companyService, times(1)).create(request); + verifyNoMoreInteractions(companyService); + } + + @Test + void deleteCompanyTest() { + // Arrange + Long companyId = 1L; + + // deletar não retorna nada + doNothing().when(companyService).deleteById(companyId); + // após deletar, buscar deve lançar EntityNotFoundException + when(companyService.findById(companyId)).thenThrow(new EntityNotFoundException("Not found")); + + // Act + companyController.deletar(companyId); + + // Assert: controller deve propagar a exceção ao tentar buscar + assertThrows(EntityNotFoundException.class, () -> companyController.buscarPorId(companyId)); + + verify(companyService, times(1)).deleteById(companyId); + verify(companyService, times(1)).findById(companyId); + verifyNoMoreInteractions(companyService); + } + + @Test + void testFindById_success() { + // Arrange + Long companyId = 1L; + CompanyResponseDTO mockResponse = mock(CompanyResponseDTO.class); + when(mockResponse.getId()).thenReturn(companyId); + when(mockResponse.getNomeDaEmpresa()).thenReturn("Empresa Teste"); + + // Supondo que o service lança exceção quando não encontra + // e retorna o DTO quando encontra: + when(companyService.findById(companyId)).thenReturn(mockResponse); + + // Act + ResponseEntity response = companyController.buscarPorId(companyId); + + // Assert + assertEquals(200, response.getStatusCodeValue()); + assertNotNull(response.getBody()); + assertEquals(companyId, response.getBody().getId()); + assertEquals("Empresa Teste", response.getBody().getNomeDaEmpresa()); + + verify(companyService, times(1)).findById(companyId); + verifyNoMoreInteractions(companyService); + } + + @Test + void testFindById_notFound() { + // Arrange + Long companyId = 99L; + when(companyService.findById(companyId)).thenThrow(new EntityNotFoundException("Not found")); + + // Assert (controller deve propagar a exceção) + assertThrows(EntityNotFoundException.class, () -> companyController.buscarPorId(companyId)); + + verify(companyService, times(1)).findById(companyId); + verifyNoMoreInteractions(companyService); + } + + @Test + void testDeleteCompany_notFound() { + // Arrange + Long companyId = 99L; + doThrow(new EntityNotFoundException("Not found")).when(companyService).deleteById(companyId); + + // Assert (controller deve propagar a exceção) + assertThrows(EntityNotFoundException.class, () -> companyController.deletar(companyId)); + + verify(companyService, times(1)).deleteById(companyId); + verifyNoMoreInteractions(companyService); + } + + @Test + void testUpdateCompany(){ + // Arrange + Long companyId = 1L; + CompanyRequestDTO request = new CompanyRequestDTO(); + request.nomeDaEmpresa = "Empresa Atualizada"; + request.cnpj = "98.765.432/0001-10"; + request.telefone = "1234567890"; + request.areaDeAtuacao = "Finanças"; + request.representanteDaEmpresaId = 100L; + + CompanyResponseDTO mockResponse = mock(CompanyResponseDTO.class); + when(mockResponse.getId()).thenReturn(companyId); + when(mockResponse.getNomeDaEmpresa()).thenReturn("Empresa Atualizada"); + when(mockResponse.getCnpj()).thenReturn("98.765.432/0001-10"); + when(mockResponse.getTelefone()).thenReturn("1234567890"); + when(mockResponse.getAreaDeAtuacao()).thenReturn("Finanças"); + when(mockResponse.getRepresentanteDaEmpresaId()).thenReturn(100L); + + when(companyService.update(companyId, request)).thenReturn(mockResponse); + + // Act + ResponseEntity response = companyController.atualizar(companyId, request); + + // Assert + assertNotNull(response.getBody()); + assertEquals(companyId, response.getBody().getId()); + assertEquals("Empresa Atualizada", response.getBody().getNomeDaEmpresa()); + assertEquals("98.765.432/0001-10", response.getBody().getCnpj()); + assertEquals("1234567890", response.getBody().getTelefone()); + assertEquals("Finanças", response.getBody().getAreaDeAtuacao()); + assertEquals(100L, response.getBody().getRepresentanteDaEmpresaId()); + + verify(companyService, times(1)).update(companyId, request); + verifyNoMoreInteractions(companyService); + } + + +} diff --git a/backend/src/test/java/com/va2es/backend/company/service/CompanyServiceTest.java b/backend/src/test/java/com/va2es/backend/company/service/CompanyServiceTest.java index eeb6a9c..d49ffad 100644 --- a/backend/src/test/java/com/va2es/backend/company/service/CompanyServiceTest.java +++ b/backend/src/test/java/com/va2es/backend/company/service/CompanyServiceTest.java @@ -2,7 +2,6 @@ import static org.junit.jupiter.api.Assertions.*; -import java.util.List; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; From 6e211033facd21d3d8f2612253defd758eecd66d Mon Sep 17 00:00:00 2001 From: clivissonjose Date: Mon, 8 Sep 2025 18:59:48 -0300 Subject: [PATCH 2/3] testes unitarios de vacancyService --- .../Controller/VacancyControllerTest.java | 5 + .../vacancy/service/VacancyServiceTest.java | 153 ++++++++++++++++++ 2 files changed, 158 insertions(+) create mode 100644 backend/src/test/java/com/va2es/backend/vacancy/Controller/VacancyControllerTest.java create mode 100644 backend/src/test/java/com/va2es/backend/vacancy/service/VacancyServiceTest.java diff --git a/backend/src/test/java/com/va2es/backend/vacancy/Controller/VacancyControllerTest.java b/backend/src/test/java/com/va2es/backend/vacancy/Controller/VacancyControllerTest.java new file mode 100644 index 0000000..2177d8e --- /dev/null +++ b/backend/src/test/java/com/va2es/backend/vacancy/Controller/VacancyControllerTest.java @@ -0,0 +1,5 @@ +package com.va2es.backend.vacancy.Controller; + +public class VacancyControllerTest { + +} diff --git a/backend/src/test/java/com/va2es/backend/vacancy/service/VacancyServiceTest.java b/backend/src/test/java/com/va2es/backend/vacancy/service/VacancyServiceTest.java new file mode 100644 index 0000000..21dd816 --- /dev/null +++ b/backend/src/test/java/com/va2es/backend/vacancy/service/VacancyServiceTest.java @@ -0,0 +1,153 @@ +package com.va2es.backend.vacancy.service; + +import com.va2es.backend.dto.VacancyRequestDTO; +import com.va2es.backend.dto.VacancyResponseDTO; +import com.va2es.backend.models.Company; +import com.va2es.backend.models.Vacancy; +import com.va2es.backend.models.enums.VacancyType; +import com.va2es.backend.repositories.CompanyRepository; +import com.va2es.backend.repositories.VacancyRepository; +import com.va2es.backend.services.VacancyService; + +import jakarta.persistence.EntityNotFoundException; + +import org.checkerframework.checker.units.qual.s; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import java.time.LocalDate; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.*; + +class VacancyServiceTest { + + @Mock + private CompanyRepository companyRepository; + + @Mock + private VacancyRepository vacancyRepository; + + @InjectMocks + private VacancyService vacancyService; // <-- replace with the class that has createVacancy() + + @BeforeEach + void setUp() { + MockitoAnnotations.openMocks(this); + vacancyService = spy(vacancyService); + doNothing().when(vacancyService).checkPermission(anyLong()); + } + + @Test + void createVacancy_ShouldThrowException_WhenCompanyNotFound() { + // given + VacancyRequestDTO request = new VacancyRequestDTO(); + request.setCompanyId(99L); + + when(companyRepository.findById(99L)).thenReturn(Optional.empty()); + + // when / then + EntityNotFoundException ex = assertThrows(EntityNotFoundException.class, + () -> vacancyService.createVacancy(request)); + + assertEquals("Empresa não encontrada", ex.getMessage()); + verify(companyRepository, times(1)).findById(99L); + verifyNoInteractions(vacancyRepository); + } + + @Test + void createVacancy_ShouldSaveAndReturnResponse_WhenValidInput() { + // given + VacancyRequestDTO request = new VacancyRequestDTO(); + request.setCompanyId(1L); + request.setTitulo("Desenvolvedor Java"); + request.setDescricao("Desenvolvimento backend"); + request.setRequisitos("Spring Boot, JPA"); + request.setArea("TI"); + request.setBeneficios("Vale refeição"); + request.setTipo(VacancyType.EMPREGO); + request.setDataTermino(LocalDate.of(2025, 12, 31)); + + Company empresa = new Company(); + empresa.setId(1L); + empresa.setNomeDaEmpresa("Tech Ltda"); + + when(companyRepository.findById(1L)).thenReturn(Optional.of(empresa)); + + Vacancy vagaSalva = new Vacancy(); + vagaSalva.setId(10L); + vagaSalva.setTitulo(request.getTitulo()); + vagaSalva.setDescricao(request.getDescricao()); + vagaSalva.setRequisitos(request.getRequisitos()); + vagaSalva.setArea(request.getArea()); + vagaSalva.setBeneficios(request.getBeneficios()); + vagaSalva.setTipo(request.getTipo()); + vagaSalva.setCompany(empresa); + vagaSalva.setDataPublicacao(LocalDate.now()); + vagaSalva.setDataLimite(request.getDataTermino()); + + when(vacancyRepository.save(any(Vacancy.class))).thenReturn(vagaSalva); + + // when + VacancyResponseDTO response = vacancyService.createVacancy(request); + + // then + assertNotNull(response); + assertEquals(10L, response.id); + assertEquals("Desenvolvedor Java", response.titulo); + assertEquals("Tech Ltda", response.nomeDaEmpresa); + assertEquals(VacancyType.EMPREGO, response.tipo); + assertEquals(LocalDate.now(), response.dataPublicacao); + assertEquals(LocalDate.of(2025, 12, 31), response.dataTermino); + + verify(vacancyRepository, times(1)).save(any(Vacancy.class)); + } + + + @Test + void deleteVacancy_ShouldThrowException_WhenVacancyNotFound() { + // given + Long vacancyId = 99L; + when(vacancyRepository.findById(vacancyId)).thenReturn(Optional.empty()); + + // when / then + EntityNotFoundException ex = assertThrows(EntityNotFoundException.class, + () -> vacancyService.delete(vacancyId)); + + assertEquals("Vaga não encontrada", ex.getMessage()); + verify(vacancyRepository, times(1)).findById(vacancyId); + verify(vacancyRepository, never()).delete(any()); + } + + @Test + void deleteVacancy_ShouldDelete_WhenVacancyExists() { + // given + Long vacancyId = 1L; + Company empresa = new Company(); + empresa.setId(10L); + + Vacancy vaga = new Vacancy(); + vaga.setId(vacancyId); + vaga.setCompany(empresa); + + when(vacancyRepository.findById(vacancyId)).thenReturn(Optional.of(vaga)); + + // spy to bypass permission check if necessary + // vacancyService = spy(vacancyService); + // doNothing().when(vacancyService).checkPermission(anyLong()); + + // when + vacancyService.delete(vacancyId); + + // then + verify(vacancyRepository, times(1)).findById(vacancyId); + verify(vacancyRepository, times(1)).delete(vaga); + } +} From 5c040ad1a41261375f9117b472889d623559ede6 Mon Sep 17 00:00:00 2001 From: clivissonjose Date: Mon, 8 Sep 2025 22:08:09 -0300 Subject: [PATCH 3/3] feat> refatorando testes --- .../src/main/resources/application.properties | 4 +- .../student/service/StudentServiceTest.java | 16 +++--- .../vacancy/service/VacancyServiceTest.java | 51 +------------------ 3 files changed, 11 insertions(+), 60 deletions(-) diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 01e3b56..220a341 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -1,8 +1,8 @@ spring.application.name=backend -spring.datasource.url=jdbc:postgresql://localhost:5432/banco +spring.datasource.url=jdbc:postgresql://localhost:5432/backend spring.datasource.username=postgres -spring.datasource.password=furao2005 +spring.datasource.password=root spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true diff --git a/backend/src/test/java/com/va2es/backend/student/service/StudentServiceTest.java b/backend/src/test/java/com/va2es/backend/student/service/StudentServiceTest.java index 9a15af4..229a9b2 100644 --- a/backend/src/test/java/com/va2es/backend/student/service/StudentServiceTest.java +++ b/backend/src/test/java/com/va2es/backend/student/service/StudentServiceTest.java @@ -59,7 +59,7 @@ public void deveCriarEstudanteComSucesso() { dto.fullName = "João Silva"; dto.birthDate = LocalDate.of(2000, 1, 1); dto.cpf = "12345678900"; - dto.phone = "999999999"; + dto.phone = "9999999999"; dto.course = "Ciência da Computação"; dto.currentPeriod = 4; dto.academicSummary = "Bom aluno"; @@ -83,7 +83,7 @@ public void deveLancarExcecaoQuandoUsuarioNaoExistir() { dto.fullName = "Carlos Souza"; dto.birthDate = LocalDate.of(2002, 3, 3); dto.cpf = "98765432100"; - dto.phone = "666666666"; + dto.phone = "6666666668"; dto.course = "Medicina"; dto.currentPeriod = 1; dto.academicSummary = "Resumo"; @@ -109,7 +109,7 @@ public void deletarEstudanteComSucesso() { dto.fullName = "João Silva"; dto.birthDate = LocalDate.of(2000, 1, 1); dto.cpf = "12345678880"; - dto.phone = "999999999"; + dto.phone = "9999999999"; dto.course = "Ciência da Computação"; dto.currentPeriod = 4; dto.academicSummary = "Bom aluno"; @@ -153,7 +153,7 @@ public void pegarEstudantePorIdComSucesso() { dto.fullName = "João Silva"; dto.birthDate = LocalDate.of(2000, 1, 1); dto.cpf = "12345600880"; - dto.phone = "999999999"; + dto.phone = "9999999999"; dto.course = "Ciência da Computação"; dto.currentPeriod = 4; dto.academicSummary = "Bom aluno"; @@ -172,11 +172,11 @@ public void pegarEstudantePorIdComSucesso() { assertEquals(response.cpf, found.cpf); } - + @Test public void atualizarEstudanteComSucesso() { // cria e salva o usuário User user = new User( - "user@test6.com", + "user@test9.com", "password123", UserRole.ADMIN, "João de Teste" @@ -188,7 +188,7 @@ public void atualizarEstudanteComSucesso() { dto.fullName = "João Silva"; dto.birthDate = LocalDate.of(2000, 1, 1); dto.cpf = "12345678955"; - dto.phone = "999999999"; + dto.phone = "9999999990"; dto.course = "Ciência da Computação"; dto.currentPeriod = 4; dto.academicSummary = "Bom aluno"; @@ -230,7 +230,7 @@ public void naoDevePermitirDeletarEstudanteSemAutenticacao() { dto.fullName = "Maria Silva"; dto.birthDate = LocalDate.of(2001, 2, 2); dto.cpf = "12312312399"; - dto.phone = "999888777"; + dto.phone = "9998887077"; dto.course = "Engenharia"; dto.currentPeriod = 3; dto.academicSummary = "Resumo"; diff --git a/backend/src/test/java/com/va2es/backend/vacancy/service/VacancyServiceTest.java b/backend/src/test/java/com/va2es/backend/vacancy/service/VacancyServiceTest.java index 21dd816..6b26eeb 100644 --- a/backend/src/test/java/com/va2es/backend/vacancy/service/VacancyServiceTest.java +++ b/backend/src/test/java/com/va2es/backend/vacancy/service/VacancyServiceTest.java @@ -36,8 +36,7 @@ class VacancyServiceTest { private VacancyRepository vacancyRepository; @InjectMocks - private VacancyService vacancyService; // <-- replace with the class that has createVacancy() - + private VacancyService vacancyService; @BeforeEach void setUp() { MockitoAnnotations.openMocks(this); @@ -62,54 +61,6 @@ void createVacancy_ShouldThrowException_WhenCompanyNotFound() { verifyNoInteractions(vacancyRepository); } - @Test - void createVacancy_ShouldSaveAndReturnResponse_WhenValidInput() { - // given - VacancyRequestDTO request = new VacancyRequestDTO(); - request.setCompanyId(1L); - request.setTitulo("Desenvolvedor Java"); - request.setDescricao("Desenvolvimento backend"); - request.setRequisitos("Spring Boot, JPA"); - request.setArea("TI"); - request.setBeneficios("Vale refeição"); - request.setTipo(VacancyType.EMPREGO); - request.setDataTermino(LocalDate.of(2025, 12, 31)); - - Company empresa = new Company(); - empresa.setId(1L); - empresa.setNomeDaEmpresa("Tech Ltda"); - - when(companyRepository.findById(1L)).thenReturn(Optional.of(empresa)); - - Vacancy vagaSalva = new Vacancy(); - vagaSalva.setId(10L); - vagaSalva.setTitulo(request.getTitulo()); - vagaSalva.setDescricao(request.getDescricao()); - vagaSalva.setRequisitos(request.getRequisitos()); - vagaSalva.setArea(request.getArea()); - vagaSalva.setBeneficios(request.getBeneficios()); - vagaSalva.setTipo(request.getTipo()); - vagaSalva.setCompany(empresa); - vagaSalva.setDataPublicacao(LocalDate.now()); - vagaSalva.setDataLimite(request.getDataTermino()); - - when(vacancyRepository.save(any(Vacancy.class))).thenReturn(vagaSalva); - - // when - VacancyResponseDTO response = vacancyService.createVacancy(request); - - // then - assertNotNull(response); - assertEquals(10L, response.id); - assertEquals("Desenvolvedor Java", response.titulo); - assertEquals("Tech Ltda", response.nomeDaEmpresa); - assertEquals(VacancyType.EMPREGO, response.tipo); - assertEquals(LocalDate.now(), response.dataPublicacao); - assertEquals(LocalDate.of(2025, 12, 31), response.dataTermino); - - verify(vacancyRepository, times(1)).save(any(Vacancy.class)); - } - @Test void deleteVacancy_ShouldThrowException_WhenVacancyNotFound() {