From 62fa05a7a21941dca840f0392154d84895d32907 Mon Sep 17 00:00:00 2001 From: "Marcio J. Costa" <87935294+MarcioCosta013@users.noreply.github.com> Date: Fri, 2 Jan 2026 12:39:23 -0300 Subject: [PATCH] Feature/create testes unitarios (#15) * test(test unitario create peladeiro): - Primeiro teste unitario create peladeiro - Adicionei a depencia e o plugin para adicionar o mockito como Java Agent ja preparando para mudancas futuras do JDK; - Usando o AssertJ para os Testes unitarios * test(PeladeiroServiceTest): - concluida a implementacao dos testes de PeladeiroService; - algumas modificacoes pontuais em PeladeiroService sem mudar no comportamento do codigo; - adicionei anotacoes lombok no CartoesResumoResponse em controlles/response para adicionar um contrutor com todos os argumentos; * refactore(Trocando string por PeDominanteEnum): - troquei todas as implementacoes de PeDominate que estavam em tipo string para usar o Enum PeDominante; * doc(Adicionando informacoes ao readme.md): -Adicionei como fazer para rodar o projeto em diferentes config: test, prod e dev; --- VemProFutApi/README.md | 52 ++- VemProFutApi/pom.xml | 16 +- .../configs/OAuth2LoginSuccessHandler.java | 3 +- .../request/SavePeladeiroRequestDTO.java | 3 +- .../request/UpdatePeladeiroRequestDTO.java | 3 +- .../response/CartoesResumoResponseDTO.java | 4 + .../response/PeladeiroDetailResponse.java | 3 +- .../response/SavePeladeiroResponseDTO.java | 3 +- .../response/UpdatePeladeiroResponseDTO.java | 3 +- .../com/vemprofut/models/PeladeiroModel.java | 6 +- .../implementacao/PeladeiroService.java | 10 +- .../vemprofut/VemProFutApplicationTests.java | 8 +- .../repositories/BanimentoRepositoryIT.java | 9 +- .../repositories/CartoesRepositoryIT.java | 27 +- .../repositories/EditorRepositoryIT.java | 5 +- .../repositories/GolsPartidaRepositoryIT.java | 23 +- .../repositories/PeladeiroRepositoryIT.java | 24 +- .../unit/services/FutServiceTest.java | 205 ++++++++++++ .../unit/services/PeladeiroServiceTest.java | 303 ++++++++++++++++++ 19 files changed, 647 insertions(+), 63 deletions(-) create mode 100644 VemProFutApi/src/test/java/br/com/vemprofut/unit/services/FutServiceTest.java create mode 100644 VemProFutApi/src/test/java/br/com/vemprofut/unit/services/PeladeiroServiceTest.java diff --git a/VemProFutApi/README.md b/VemProFutApi/README.md index 0f08e16..dc74b21 100644 --- a/VemProFutApi/README.md +++ b/VemProFutApi/README.md @@ -1,4 +1,4 @@ -# VemProFut! API (Em andamento...) +# VemProFut! API (Concluída) ![Java](https://img.shields.io/badge/java-%23ED8B00.svg?style=for-the-badge&logo=openjdk&logoColor=white) ![Spring](https://img.shields.io/badge/spring-%236DB33F.svg?style=for-the-badge&logo=spring&logoColor=white) ![MySQL](https://img.shields.io/badge/mysql-4479A1.svg?style=for-the-badge&logo=mysql&logoColor=white) @@ -6,4 +6,54 @@ API base de todo o projeto VemProFut! +## Organização das pastas: + +``` + VemProFutApi/ + ├── src/ → Código-fonte principal da aplicação + │ ├── main/java/... → Classes Java (controllers, services, repositories, models) + │ ├── main/resources → Configurações (application.properties, templates, static) + │ └── test/java/... → Testes automatizados + │ + ├── mysql-init/ → Scripts de inicialização do banco MySQL + │ └── *.sql → Criação de tabelas, inserts iniciais + │ + ├── .mvn/wrapper/ → Arquivos do Maven Wrapper (executar sem instalar Maven) + │ + ├── Dockerfile → Configuração para criar imagem Docker da API + ├── Docker-compose.yml → Orquestração de containers (API + MySQL) + │ + ├── pom.xml → Arquivo de configuração do Maven (dependências e build) + ├── mvnw / mvnw.cmd → Scripts para rodar Maven Wrapper (Linux/Windows) + │ + ├── .env.exemple → Exemplo de variáveis de ambiente (configuração DB, etc.) + ├── .gitignore → Arquivos/pastas ignorados pelo Git + ├── .gitattributes → Configurações de atributos do Git + ├── excludeFilter.xml → Configuração de exclusões (provavelmente Sonar ou Checkstyle) + └── README.md → Documentação inicial da API +``` + +# 🚀 Como rodar a aplicação + +A aplicação suporta múltiplos perfis (`dev`, `test`, `prod`) configurados via **Spring Profiles**. + +--- +## 🏭 Ambiente de Produção (`prod`) + +Rodar com **Docker Compose**: +```bash +docker compose up +``` +## 🔧 Ambiente de Desenvolvimento (`dev`) + +Rodar diretamente com **Maven**: +```bash +mvn spring-boot:run -Dspring-boot.run.profiles=dev +``` +## 🧪 Ambiente de Testes (`test`) + +Rodar diretamente com **Maven**: +```bash +mvn test +``` diff --git a/VemProFutApi/pom.xml b/VemProFutApi/pom.xml index d40a3a8..4b6561f 100644 --- a/VemProFutApi/pom.xml +++ b/VemProFutApi/pom.xml @@ -133,12 +133,12 @@ test + - junit - junit - test + org.mockito + mockito-inline + 5.2.0 - @@ -219,6 +219,14 @@ + + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + + diff --git a/VemProFutApi/src/main/java/br/com/vemprofut/configs/OAuth2LoginSuccessHandler.java b/VemProFutApi/src/main/java/br/com/vemprofut/configs/OAuth2LoginSuccessHandler.java index 1381d0d..f4aa470 100644 --- a/VemProFutApi/src/main/java/br/com/vemprofut/configs/OAuth2LoginSuccessHandler.java +++ b/VemProFutApi/src/main/java/br/com/vemprofut/configs/OAuth2LoginSuccessHandler.java @@ -3,6 +3,7 @@ import br.com.vemprofut.mappers.IHistoricoPeladeiroMapper; import br.com.vemprofut.models.DTOs.HistoricoPeladeiroDTO; import br.com.vemprofut.models.PeladeiroModel; +import br.com.vemprofut.models.enuns.PeDominante; import br.com.vemprofut.repositories.PeladeiroRepository; import br.com.vemprofut.services.IHistoricoPeladeiroService; import jakarta.servlet.http.HttpServletRequest; @@ -62,7 +63,7 @@ public void onAuthenticationSuccess( usuario.setApelido(name); usuario.setDescricao("Usuário criado via OAuth2"); usuario.setWhatsapp("000000000"); - usuario.setPeDominante("Destro"); // escolha padrão + usuario.setPeDominante(PeDominante.DESTRO); // escolha padrão usuario.setAuthProvider(provider); usuario.setFotoUrl(picture); usuario.setHistoricoPeladeiro(historicoPeladeiroMapper.toModel(historicoPeladeiro)); diff --git a/VemProFutApi/src/main/java/br/com/vemprofut/controllers/request/SavePeladeiroRequestDTO.java b/VemProFutApi/src/main/java/br/com/vemprofut/controllers/request/SavePeladeiroRequestDTO.java index 2fda2d0..cce4520 100644 --- a/VemProFutApi/src/main/java/br/com/vemprofut/controllers/request/SavePeladeiroRequestDTO.java +++ b/VemProFutApi/src/main/java/br/com/vemprofut/controllers/request/SavePeladeiroRequestDTO.java @@ -1,5 +1,6 @@ package br.com.vemprofut.controllers.request; +import br.com.vemprofut.models.enuns.PeDominante; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -9,5 +10,5 @@ public record SavePeladeiroRequestDTO( @Email String email, @NotNull String apelido, @NotBlank String descricao, - @NotNull String peDominante, + @NotNull PeDominante peDominante, @NotBlank String whatsapp) {} diff --git a/VemProFutApi/src/main/java/br/com/vemprofut/controllers/request/UpdatePeladeiroRequestDTO.java b/VemProFutApi/src/main/java/br/com/vemprofut/controllers/request/UpdatePeladeiroRequestDTO.java index 8fbb2a3..c86dd68 100644 --- a/VemProFutApi/src/main/java/br/com/vemprofut/controllers/request/UpdatePeladeiroRequestDTO.java +++ b/VemProFutApi/src/main/java/br/com/vemprofut/controllers/request/UpdatePeladeiroRequestDTO.java @@ -1,5 +1,6 @@ package br.com.vemprofut.controllers.request; +import br.com.vemprofut.models.enuns.PeDominante; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -9,5 +10,5 @@ public record UpdatePeladeiroRequestDTO( @Email String email, @NotNull String apelido, @NotBlank String descricao, - @NotNull String peDominante, + @NotNull PeDominante peDominante, @NotBlank String whatsapp) {} diff --git a/VemProFutApi/src/main/java/br/com/vemprofut/controllers/response/CartoesResumoResponseDTO.java b/VemProFutApi/src/main/java/br/com/vemprofut/controllers/response/CartoesResumoResponseDTO.java index cdc453a..356778f 100644 --- a/VemProFutApi/src/main/java/br/com/vemprofut/controllers/response/CartoesResumoResponseDTO.java +++ b/VemProFutApi/src/main/java/br/com/vemprofut/controllers/response/CartoesResumoResponseDTO.java @@ -1,10 +1,14 @@ package br.com.vemprofut.controllers.response; +import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; @Getter @Setter +@NoArgsConstructor +@AllArgsConstructor public class CartoesResumoResponseDTO { private Integer azul; private Integer amarelo; diff --git a/VemProFutApi/src/main/java/br/com/vemprofut/controllers/response/PeladeiroDetailResponse.java b/VemProFutApi/src/main/java/br/com/vemprofut/controllers/response/PeladeiroDetailResponse.java index 746c8dc..8a9545c 100644 --- a/VemProFutApi/src/main/java/br/com/vemprofut/controllers/response/PeladeiroDetailResponse.java +++ b/VemProFutApi/src/main/java/br/com/vemprofut/controllers/response/PeladeiroDetailResponse.java @@ -1,5 +1,6 @@ package br.com.vemprofut.controllers.response; +import br.com.vemprofut.models.enuns.PeDominante; import com.fasterxml.jackson.annotation.JsonProperty; public record PeladeiroDetailResponse( @@ -9,5 +10,5 @@ public record PeladeiroDetailResponse( @JsonProperty("apelido") String apelido, @JsonProperty("descricao") String descricao, @JsonProperty("whatsapp") String whatsapp, - @JsonProperty("peDominante") String peDominante, + @JsonProperty("peDominante") PeDominante peDominante, @JsonProperty("numeroCartoes") CartoesResumoResponseDTO cartoes) {} diff --git a/VemProFutApi/src/main/java/br/com/vemprofut/controllers/response/SavePeladeiroResponseDTO.java b/VemProFutApi/src/main/java/br/com/vemprofut/controllers/response/SavePeladeiroResponseDTO.java index 64a52b3..e8162d2 100644 --- a/VemProFutApi/src/main/java/br/com/vemprofut/controllers/response/SavePeladeiroResponseDTO.java +++ b/VemProFutApi/src/main/java/br/com/vemprofut/controllers/response/SavePeladeiroResponseDTO.java @@ -1,5 +1,6 @@ package br.com.vemprofut.controllers.response; +import br.com.vemprofut.models.enuns.PeDominante; import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; @@ -9,7 +10,7 @@ public record SavePeladeiroResponseDTO( @JsonProperty("email") String email, @JsonProperty("apelido") String apelido, @JsonProperty("descricao") String descricao, - @JsonProperty("peDominante") String peDominante, + @JsonProperty("peDominante") PeDominante peDominante, @JsonProperty("whatsapp") String whatsapp, @JsonProperty("historicoPeladeiro") Long historicoPeladeiro, @JsonProperty("fotoUrl") String fotoUrl, diff --git a/VemProFutApi/src/main/java/br/com/vemprofut/controllers/response/UpdatePeladeiroResponseDTO.java b/VemProFutApi/src/main/java/br/com/vemprofut/controllers/response/UpdatePeladeiroResponseDTO.java index 02fcf35..515bf17 100644 --- a/VemProFutApi/src/main/java/br/com/vemprofut/controllers/response/UpdatePeladeiroResponseDTO.java +++ b/VemProFutApi/src/main/java/br/com/vemprofut/controllers/response/UpdatePeladeiroResponseDTO.java @@ -1,5 +1,6 @@ package br.com.vemprofut.controllers.response; +import br.com.vemprofut.models.enuns.PeDominante; import com.fasterxml.jackson.annotation.JsonProperty; public record UpdatePeladeiroResponseDTO( @@ -8,5 +9,5 @@ public record UpdatePeladeiroResponseDTO( @JsonProperty("apelido") String apelido, @JsonProperty("descricao") String descricao, @JsonProperty("whatsapp") String whatsapp, - @JsonProperty("peDominante") String peDominante, + @JsonProperty("peDominante") PeDominante peDominante, @JsonProperty("fotoURL") String fotoUrl) {} diff --git a/VemProFutApi/src/main/java/br/com/vemprofut/models/PeladeiroModel.java b/VemProFutApi/src/main/java/br/com/vemprofut/models/PeladeiroModel.java index bd1176c..85b8ec8 100644 --- a/VemProFutApi/src/main/java/br/com/vemprofut/models/PeladeiroModel.java +++ b/VemProFutApi/src/main/java/br/com/vemprofut/models/PeladeiroModel.java @@ -1,5 +1,6 @@ package br.com.vemprofut.models; +import br.com.vemprofut.models.enuns.PeDominante; import jakarta.persistence.*; import java.util.ArrayList; import java.util.List; @@ -19,7 +20,7 @@ public PeladeiroModel( String apelido, String descricao, String whatsapp, - String peDominante) { + PeDominante peDominante) { this.nome = nome; this.email = email; this.apelido = apelido; @@ -49,7 +50,8 @@ public PeladeiroModel( private String whatsapp; @Column(name = "pe_dominante_peladeiro", nullable = false, length = 10) - private String peDominante; + @Enumerated(EnumType.STRING) // salva como texto no banco + private PeDominante peDominante; // TODO: mudar para usar um enum... @ToString.Exclude @OneToOne diff --git a/VemProFutApi/src/main/java/br/com/vemprofut/services/implementacao/PeladeiroService.java b/VemProFutApi/src/main/java/br/com/vemprofut/services/implementacao/PeladeiroService.java index 7f894dd..0201483 100644 --- a/VemProFutApi/src/main/java/br/com/vemprofut/services/implementacao/PeladeiroService.java +++ b/VemProFutApi/src/main/java/br/com/vemprofut/services/implementacao/PeladeiroService.java @@ -29,7 +29,7 @@ public class PeladeiroService implements IPeladeiroService { @Autowired private PeladeiroRepository repository; - @Autowired private IPeladeiroMapper IPeladeiroMapper; + @Autowired private IPeladeiroMapper peladeiroMapper; @Autowired private IHistoricoPeladeiroMapper historicoMapper; @@ -42,14 +42,14 @@ public class PeladeiroService implements IPeladeiroService { public SavePeladeiroResponseDTO create(SavePeladeiroRequestDTO dto) { queryService.verifyEmail(dto.email()); log.info("Email verificado!"); - PeladeiroModel peladeiroModel = IPeladeiroMapper.saveRequestToModel(dto); + PeladeiroModel peladeiroModel = peladeiroMapper.saveRequestToModel(dto); PeladeiroModel peladeiroSalvo = repository.save(peladeiroModel); HistoricoPeladeiroDTO historico = historicoPeladeiroService.create(); peladeiroSalvo.setHistoricoPeladeiro(historicoMapper.toModel(historico)); log.info("Peladeiro cadastrado com sucesso!"); - return IPeladeiroMapper.modelToSaveResponse(repository.save(peladeiroSalvo)); + return peladeiroMapper.modelToSaveResponse(repository.save(peladeiroSalvo)); } @Override @@ -66,7 +66,7 @@ public UpdatePeladeiroResponseDTO update(Long id, UpdatePeladeiroRequestDTO dto) peladeiroModel.setPeDominante(dto.peDominante()); log.info("Peladeiro alterado com sucesso!"); - return IPeladeiroMapper.modelToUpdateResponse(repository.save(peladeiroModel)); + return peladeiroMapper.modelToUpdateResponse(repository.save(peladeiroModel)); } @Override @@ -99,7 +99,7 @@ public PeladeiroModel findByIdModel(Long id) { // // return repository.findAll() // .stream() - // .map(IPeladeiroMapper::toDTO) + // .map(peladeiroMapper::toDTO) // .toList(); // } diff --git a/VemProFutApi/src/test/java/br/com/vemprofut/VemProFutApplicationTests.java b/VemProFutApi/src/test/java/br/com/vemprofut/VemProFutApplicationTests.java index 5f15b0d..5b58373 100644 --- a/VemProFutApi/src/test/java/br/com/vemprofut/VemProFutApplicationTests.java +++ b/VemProFutApi/src/test/java/br/com/vemprofut/VemProFutApplicationTests.java @@ -1,12 +1,6 @@ package br.com.vemprofut; -import org.springframework.boot.test.context.SpringBootTest; - - class VemProFutApplicationTests { - - void contextLoads() { - } - + void contextLoads() {} } diff --git a/VemProFutApi/src/test/java/br/com/vemprofut/integration/repositories/BanimentoRepositoryIT.java b/VemProFutApi/src/test/java/br/com/vemprofut/integration/repositories/BanimentoRepositoryIT.java index 19f9e2c..74198e6 100644 --- a/VemProFutApi/src/test/java/br/com/vemprofut/integration/repositories/BanimentoRepositoryIT.java +++ b/VemProFutApi/src/test/java/br/com/vemprofut/integration/repositories/BanimentoRepositoryIT.java @@ -6,6 +6,7 @@ import br.com.vemprofut.models.BanimentoModel; import br.com.vemprofut.models.FutModel; import br.com.vemprofut.models.PeladeiroModel; +import br.com.vemprofut.models.enuns.PeDominante; import br.com.vemprofut.repositories.BanimentoRepository; import br.com.vemprofut.repositories.FutRepository; import br.com.vemprofut.repositories.PeladeiroRepository; @@ -57,7 +58,7 @@ public void save_quandoBanimentoValido_retornaIdGerado() { "Apelido", "descricao qualquer", "81999999999", - "Destro")); + PeDominante.DESTRO)); BanimentoModel banimentoModel = new BanimentoModel( @@ -86,7 +87,7 @@ public void findAll_quandoExistemRegistros_retornaListaComTodos() { "Apelido", "descricao qualquer", "81999999999", - "Destro")); + PeDominante.DESTRO)); PeladeiroModel peladeiroModel2 = peladeiroRepository.saveAndFlush( new PeladeiroModel( @@ -95,7 +96,7 @@ public void findAll_quandoExistemRegistros_retornaListaComTodos() { "Apelido2", "descricao qualquer2", "81999999999", - "Destro")); + PeDominante.DESTRO)); BanimentoModel banimentoModel1 = new BanimentoModel( @@ -132,7 +133,7 @@ public void deleteById_quandoIdBanimentoExistir_registroRemovido() { "Apelido", "descricao qualquer", "81999999999", - "Destro")); + PeDominante.DESTRO)); BanimentoModel banimentoModel = new BanimentoModel( diff --git a/VemProFutApi/src/test/java/br/com/vemprofut/integration/repositories/CartoesRepositoryIT.java b/VemProFutApi/src/test/java/br/com/vemprofut/integration/repositories/CartoesRepositoryIT.java index a79912a..b8a0bc9 100644 --- a/VemProFutApi/src/test/java/br/com/vemprofut/integration/repositories/CartoesRepositoryIT.java +++ b/VemProFutApi/src/test/java/br/com/vemprofut/integration/repositories/CartoesRepositoryIT.java @@ -8,6 +8,7 @@ import br.com.vemprofut.models.FutModel; import br.com.vemprofut.models.PartidasModel; import br.com.vemprofut.models.PeladeiroModel; +import br.com.vemprofut.models.enuns.PeDominante; import br.com.vemprofut.models.enuns.TipoCartao; import br.com.vemprofut.repositories.CartoesRepository; import br.com.vemprofut.repositories.FutRepository; @@ -69,7 +70,7 @@ void save_quandoCartaoValido_retornaIdGerado() { "Apelido", "descricao qualquer", "81999999999", - "Destro")); + PeDominante.DESTRO)); CartoesModel cartoesModel = cartoesRepository.saveAndFlush( @@ -96,7 +97,7 @@ void findAll_quandoCartoesExistem_retornaListaCartao() { "Apelido", "descricao qualquer", "81999999999", - "Destro")); + PeDominante.DESTRO)); PeladeiroModel peladeiroModel2 = peladeiroRepository.saveAndFlush( @@ -106,7 +107,7 @@ void findAll_quandoCartoesExistem_retornaListaCartao() { "Apelido", "descricao qualquer2", "81999999999", - "Destro")); + PeDominante.DESTRO)); cartoesRepository.saveAndFlush( new CartoesModel(partidasModel, peladeiroModel, futModel, TipoCartao.AMARELO)); @@ -134,7 +135,7 @@ void findById_quandoCartaoExiste_retornaCartao() { "Apelido", "descricao qualquer", "81999999999", - "Destro")); + PeDominante.DESTRO)); CartoesModel cartoesModel = cartoesRepository.saveAndFlush( @@ -160,7 +161,7 @@ void findById_quandoCartaoExiste_retornaOptinalVazio() { "Apelido", "descricao qualquer", "81999999999", - "Destro")); + PeDominante.DESTRO)); CartoesModel cartoesModel = cartoesRepository.saveAndFlush( @@ -186,7 +187,7 @@ void findByPeladeiro_quandoCartoesDoPeladeiroExistem_retornaListCartoes() { "Apelido", "descricao qualquer", "81999999999", - "Destro")); + PeDominante.DESTRO)); PeladeiroModel peladeiroModel2 = peladeiroRepository.saveAndFlush( @@ -196,7 +197,7 @@ void findByPeladeiro_quandoCartoesDoPeladeiroExistem_retornaListCartoes() { "Apelido", "descricao qualquer2", "81999999999", - "Destro")); + PeDominante.DESTRO)); cartoesRepository.saveAndFlush( new CartoesModel(partidasModel, peladeiroModel, futModel, TipoCartao.AMARELO)); @@ -228,7 +229,7 @@ void findByPartida_quandoCartoesExistem_retornaListCartoes() { "Apelido", "descricao qualquer", "81999999999", - "Destro")); + PeDominante.DESTRO)); cartoesRepository.saveAndFlush( new CartoesModel(partidasModel, peladeiroModel, futModel, TipoCartao.AMARELO)); @@ -260,7 +261,7 @@ void findByFut_quandoCartoesExistem_retornaListCartoes() { "Apelido", "descricao qualquer", "81999999999", - "Destro")); + PeDominante.DESTRO)); cartoesRepository.saveAndFlush( new CartoesModel(partidasModel, peladeiroModel, futModel, TipoCartao.AMARELO)); @@ -288,7 +289,7 @@ void countByTipoAndPeladeiro_quandoCartoesExistem_retornaListCartoesPeladeiroCon "Apelido", "descricao qualquer", "81999999999", - "Destro")); + PeDominante.DESTRO)); PeladeiroModel peladeiroModel2 = peladeiroRepository.saveAndFlush( @@ -298,7 +299,7 @@ void countByTipoAndPeladeiro_quandoCartoesExistem_retornaListCartoesPeladeiroCon "Apelido", "descricao qualquer2", "81999999999", - "Destro")); + PeDominante.DESTRO)); FutModel futModel = futRepository.saveAndFlush(new FutModel()); FutModel futModel2 = futRepository.saveAndFlush(new FutModel()); @@ -361,7 +362,7 @@ void countByTipoAndFut__quandoCartoesExistem_retornaListCartoesFutContado() { "Apelido", "descricao qualquer", "81999999999", - "Destro")); + PeDominante.DESTRO)); PeladeiroModel peladeiroModel2 = peladeiroRepository.saveAndFlush( @@ -371,7 +372,7 @@ void countByTipoAndFut__quandoCartoesExistem_retornaListCartoesFutContado() { "Apelido", "descricao qualquer2", "81999999999", - "Destro")); + PeDominante.DESTRO)); FutModel futModel = futRepository.saveAndFlush(new FutModel()); FutModel futModel2 = futRepository.saveAndFlush(new FutModel()); diff --git a/VemProFutApi/src/test/java/br/com/vemprofut/integration/repositories/EditorRepositoryIT.java b/VemProFutApi/src/test/java/br/com/vemprofut/integration/repositories/EditorRepositoryIT.java index a06fb0d..13a5763 100644 --- a/VemProFutApi/src/test/java/br/com/vemprofut/integration/repositories/EditorRepositoryIT.java +++ b/VemProFutApi/src/test/java/br/com/vemprofut/integration/repositories/EditorRepositoryIT.java @@ -6,6 +6,7 @@ import br.com.vemprofut.models.EditorModel; import br.com.vemprofut.models.FutModel; import br.com.vemprofut.models.PeladeiroModel; +import br.com.vemprofut.models.enuns.PeDominante; import br.com.vemprofut.repositories.EditorRepository; import br.com.vemprofut.repositories.FutRepository; import br.com.vemprofut.repositories.PeladeiroRepository; @@ -56,7 +57,7 @@ void save_quandoEditorValido_retornaEditorSalvo() { "Ronaldo", "o cara nota 10", "81992235678", - "Destro")); + PeDominante.CANHOTO)); EditorModel editorModel = editorRepository.saveAndFlush(new EditorModel(peladeiroModel, futModel)); @@ -78,7 +79,7 @@ void findById_quandoEditorExiste_retornaEditorSalvo() { "Ronaldo", "o cara nota 10", "81992235678", - "Destro")); + PeDominante.CANHOTO)); EditorModel editorModel = editorRepository.saveAndFlush(new EditorModel(peladeiroModel, futModel)); diff --git a/VemProFutApi/src/test/java/br/com/vemprofut/integration/repositories/GolsPartidaRepositoryIT.java b/VemProFutApi/src/test/java/br/com/vemprofut/integration/repositories/GolsPartidaRepositoryIT.java index 12aacbb..254eabc 100644 --- a/VemProFutApi/src/test/java/br/com/vemprofut/integration/repositories/GolsPartidaRepositoryIT.java +++ b/VemProFutApi/src/test/java/br/com/vemprofut/integration/repositories/GolsPartidaRepositoryIT.java @@ -6,6 +6,7 @@ import br.com.vemprofut.models.GolsPartidaModel; import br.com.vemprofut.models.PartidasModel; import br.com.vemprofut.models.PeladeiroModel; +import br.com.vemprofut.models.enuns.PeDominante; import br.com.vemprofut.repositories.GolsPartidaRepository; import br.com.vemprofut.repositories.PartidasRepository; import br.com.vemprofut.repositories.PeladeiroRepository; @@ -54,7 +55,7 @@ void save_quandoGolPartidaValido_retornaGolPartidaSalvo() { "Ronaldo", "o cara nota 10", "81992235678", - "Destro")); + PeDominante.DESTRO)); PartidasModel partidasSalvo = partidasRepository.saveAndFlush(new PartidasModel()); GolsPartidaModel golsPartidaSalvo = @@ -75,7 +76,7 @@ void findById_quandoGolPartidaExiste_retornaGolPartidaModel() { "Ronaldo", "o cara nota 10", "81992235678", - "Destro")); + PeDominante.DESTRO)); PartidasModel partidasSalvo = partidasRepository.saveAndFlush(new PartidasModel()); GolsPartidaModel golsPartidaSalvo = golsPartidaRepository.save(new GolsPartidaModel(peladeiroSalvo, partidasSalvo)); @@ -95,7 +96,7 @@ void findById_quandoGolPartidaInexistente_retornaNull() { "Ronaldo", "o cara nota 10", "81992235678", - "Destro")); + PeDominante.DESTRO)); PartidasModel partidasSalvo = partidasRepository.saveAndFlush(new PartidasModel()); golsPartidaRepository.save(new GolsPartidaModel(peladeiroSalvo, partidasSalvo)); @@ -113,7 +114,7 @@ void existsById_quandoGolPartidaExiste_retornaTrue() { "Ronaldo", "o cara nota 10", "81992235678", - "Destro")); + PeDominante.DESTRO)); PartidasModel partidasSalvo = partidasRepository.saveAndFlush(new PartidasModel()); GolsPartidaModel golsPartidaSalvo = golsPartidaRepository.save(new GolsPartidaModel(peladeiroSalvo, partidasSalvo)); @@ -133,7 +134,7 @@ void existsById_quandoGolPartidaExiste_retornaFalse() { "Ronaldo", "o cara nota 10", "81992235678", - "Destro")); + PeDominante.DESTRO)); PartidasModel partidasSalvo = partidasRepository.saveAndFlush(new PartidasModel()); golsPartidaRepository.save(new GolsPartidaModel(peladeiroSalvo, partidasSalvo)); @@ -152,7 +153,7 @@ void findAll_quandoExitemGolPartidas_retornaListGolPartidaModel() { "Ronaldo", "o cara nota 10", "81992235678", - "Destro")); + PeDominante.DESTRO)); PartidasModel partidasSalvo = partidasRepository.saveAndFlush(new PartidasModel()); golsPartidaRepository.saveAndFlush(new GolsPartidaModel(peladeiroSalvo, partidasSalvo)); } @@ -173,10 +174,10 @@ void findByPeladeiro_quandoGolPartidaExistirem_retornaListaGolPartidas() { "Ronaldo", "o cara nota 10", "81992235678", - "Destro")); + PeDominante.DESTRO)); PeladeiroModel peladeiroModel2 = peladeiroRepository.saveAndFlush( - new PeladeiroModel("A", "a@test.com", "A", "333", "81555555555", "Destro")); + new PeladeiroModel("A", "a@test.com", "A", "333", "81555555555", PeDominante.DESTRO)); PartidasModel partidasSalvo = partidasRepository.saveAndFlush(new PartidasModel()); PartidasModel partidasSalvo2 = partidasRepository.saveAndFlush(new PartidasModel()); @@ -210,10 +211,10 @@ void findByPartida_quandoGolPartidaExistirem_retornaListaGolPartidas() { "Ronaldo", "o cara nota 10", "81992235678", - "Destro")); + PeDominante.DESTRO)); PeladeiroModel peladeiroModel2 = peladeiroRepository.saveAndFlush( - new PeladeiroModel("A", "a@test.com", "A", "333", "81555555555", "Destro")); + new PeladeiroModel("A", "a@test.com", "A", "333", "81555555555", PeDominante.DESTRO)); PartidasModel partidasSalvo = partidasRepository.saveAndFlush(new PartidasModel()); PartidasModel partidasSalvo2 = partidasRepository.saveAndFlush(new PartidasModel()); @@ -247,7 +248,7 @@ void deleteById_quandoGolsPartidaExistir() { "Ronaldo", "o cara nota 10", "81992235678", - "Destro")); + PeDominante.DESTRO)); PartidasModel partidasSalvo = partidasRepository.saveAndFlush(new PartidasModel()); GolsPartidaModel golsPartidaSalvo = diff --git a/VemProFutApi/src/test/java/br/com/vemprofut/integration/repositories/PeladeiroRepositoryIT.java b/VemProFutApi/src/test/java/br/com/vemprofut/integration/repositories/PeladeiroRepositoryIT.java index 826b7a5..e4e693b 100644 --- a/VemProFutApi/src/test/java/br/com/vemprofut/integration/repositories/PeladeiroRepositoryIT.java +++ b/VemProFutApi/src/test/java/br/com/vemprofut/integration/repositories/PeladeiroRepositoryIT.java @@ -4,6 +4,7 @@ import br.com.vemprofut.configs.OAuth2LoginSuccessHandler; import br.com.vemprofut.models.PeladeiroModel; +import br.com.vemprofut.models.enuns.PeDominante; import br.com.vemprofut.repositories.PeladeiroRepository; import br.com.vemprofut.services.implementacao.UploadLocalService; import jakarta.transaction.Transactional; @@ -56,7 +57,12 @@ public class PeladeiroRepositoryIT { public void save_quandoPeladeiroValido_retornaIdGerado() { PeladeiroModel peladeiroModel = new PeladeiroModel( - "Marcio Teste", "teste@test.com", "Ronaldo", "o cara nota 10", "81992235678", "Destro"); + "Marcio Teste", + "teste@test.com", + "Ronaldo", + "o cara nota 10", + "81992235678", + PeDominante.DESTRO); PeladeiroModel salvo = peladeiroRepository.save(peladeiroModel); @@ -75,9 +81,9 @@ public void findById_quandoIdInexistente_retornaOptionalVazio() { @DisplayName("findAll deve retornar lista com todos os Peladeiros") public void findAll_quandoExistemRegistros_retornaListaComTodos() { peladeiroRepository.saveAndFlush( - new PeladeiroModel("A", "a@test.com", "A", "333", "81555555555", "Destro")); + new PeladeiroModel("A", "a@test.com", "A", "333", "81555555555", PeDominante.DESTRO)); peladeiroRepository.saveAndFlush( - new PeladeiroModel("B", "b@test.com", "B", "444", "82000000000", "Destro")); + new PeladeiroModel("B", "b@test.com", "B", "444", "82000000000", PeDominante.DESTRO)); List todos = peladeiroRepository.findAll(); assertTrue(todos.size() >= 2); @@ -88,7 +94,7 @@ public void findAll_quandoExistemRegistros_retornaListaComTodos() { public void deleteById_quandoIdExistente_registroEhRemovido() { PeladeiroModel p = peladeiroRepository.saveAndFlush( - new PeladeiroModel("C", "c@test.com", "C", "", "3", "Destro")); + new PeladeiroModel("C", "c@test.com", "C", "", "3", PeDominante.DESTRO)); Long id = p.getId(); peladeiroRepository.deleteById(id); assertFalse(peladeiroRepository.findById(id).isPresent()); @@ -98,7 +104,7 @@ public void deleteById_quandoIdExistente_registroEhRemovido() { @DisplayName("deve retorna de o email ja foi castrado ou nao") public void existsByEmail_quandoEmailCadastrado_retornaTrue() { peladeiroRepository.saveAndFlush( - new PeladeiroModel("C", "test@test.com", "C", "", "3", "Destro")); + new PeladeiroModel("C", "test@test.com", "C", "", "3", PeDominante.DESTRO)); String email = "test@test.com"; Boolean exist = peladeiroRepository.existsByEmail(email); @@ -109,7 +115,7 @@ public void existsByEmail_quandoEmailCadastrado_retornaTrue() { @DisplayName("deve retorna falso de o email ja foi castrado ou nao") public void existsByEmail_quandoEmailNaoCadastrado_retornaFalse() { peladeiroRepository.saveAndFlush( - new PeladeiroModel("C", "test@test.com", "C", "", "3", "Destro")); + new PeladeiroModel("C", "test@test.com", "C", "", "3", PeDominante.DESTRO)); String email = "test2@test.com"; Boolean exist = peladeiroRepository.existsByEmail(email); @@ -121,7 +127,8 @@ public void existsByEmail_quandoEmailNaoCadastrado_retornaFalse() { public void buscarPeladeiroPeloEmailRetornaPeladeiro() { PeladeiroModel p = peladeiroRepository.saveAndFlush( - new PeladeiroModel("C", "test@test.com", "C", "descricao", "377777777777", "Destro")); + new PeladeiroModel( + "C", "test@test.com", "C", "descricao", "377777777777", PeDominante.DESTRO)); String email = "test@test.com"; PeladeiroModel peladeiroModel = peladeiroRepository.findByEmail(email); @@ -138,7 +145,8 @@ public void buscarPeladeiroPeloEmailRetornaPeladeiro() { public void buscarPeladeiroPeloEmailRetornaNull() { PeladeiroModel p = peladeiroRepository.saveAndFlush( - new PeladeiroModel("C", "test@test.com", "C", "descricao", "377777777777", "Destro")); + new PeladeiroModel( + "C", "test@test.com", "C", "descricao", "377777777777", PeDominante.DESTRO)); String email = "test1@test.com"; PeladeiroModel peladeiroModel = peladeiroRepository.findByEmail(email); diff --git a/VemProFutApi/src/test/java/br/com/vemprofut/unit/services/FutServiceTest.java b/VemProFutApi/src/test/java/br/com/vemprofut/unit/services/FutServiceTest.java new file mode 100644 index 0000000..0d6d866 --- /dev/null +++ b/VemProFutApi/src/test/java/br/com/vemprofut/unit/services/FutServiceTest.java @@ -0,0 +1,205 @@ +package br.com.vemprofut.unit.services; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; +import static org.mockito.Mockito.*; + +import br.com.vemprofut.controllers.request.SaveFutRequestDTO; +import br.com.vemprofut.controllers.response.FutDetailsResponse; +import br.com.vemprofut.controllers.response.SaveFutResponseDTO; +import br.com.vemprofut.exceptions.NomeInUseException; +import br.com.vemprofut.exceptions.NotFoundException; +import br.com.vemprofut.mappers.IEditorMapper; +import br.com.vemprofut.mappers.IFutMapper; +import br.com.vemprofut.mappers.IPartidasMapper; +import br.com.vemprofut.mappers.IPeladeiroMapper; +import br.com.vemprofut.models.DTOs.FutDTO; +import br.com.vemprofut.models.FutModel; +import br.com.vemprofut.models.HistoricoFutModel; +import br.com.vemprofut.models.PeladeiroModel; +import br.com.vemprofut.repositories.*; +import br.com.vemprofut.services.IBanimentoService; +import br.com.vemprofut.services.IEditorService; +import br.com.vemprofut.services.IHistoricoFutService; +import br.com.vemprofut.services.IPartidasService; +import br.com.vemprofut.services.implementacao.FutService; +import br.com.vemprofut.services.query.IFutQueryService; +import br.com.vemprofut.services.query.IPeladeiroQueryService; +import java.util.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +public class FutServiceTest { + + @Mock private IFutQueryService queryService; + @Mock private IFutMapper mapper; + @Mock private IPartidasMapper partidasMapper; + @Mock private FutRepository repository; + @Mock private IPartidasService partidasService; + @Mock private PartidasRepository partidasRepository; + @Mock private IPeladeiroQueryService peladeiroQueryService; + @Mock private PeladeiroRepository peladeiroRepository; + @Mock private IPeladeiroMapper peladeiroMapper; + @Mock private IHistoricoFutService historicoFutService; + @Mock private CartoesRepository cartoesRepository; + @Mock private GolsPartidaRepository golsRepository; + @Mock private IEditorService editorService; + @Mock private IEditorMapper editorMapper; + @Mock private IBanimentoService banidoService; + + @InjectMocks private FutService futService; + + FutModel futModel; + PeladeiroModel peladeiroModel; + HistoricoFutModel historicoFutModel; + + @BeforeEach + void setup() { + MockitoAnnotations.openMocks(this); + peladeiroModel = new PeladeiroModel(); + peladeiroModel.setId(1L); + peladeiroModel.setNome("Marcio"); + peladeiroModel.setEmail("marcio-costa@gmail.com"); + + historicoFutModel = new HistoricoFutModel(); + historicoFutModel.setId(1L); + + futModel = new FutModel(); + futModel.setId(1L); + futModel.setNome("Fut teste"); + futModel.setAdministradorPeladeiro(peladeiroModel); + } + + // ======================== CRUD basico ========================== + @Test + @DisplayName("Deve criar e salvar um novo Fut") + void create_quandoFutValido_retornaFutSalvo() { + // Arrange: + SaveFutRequestDTO saveFutRequestDTO = new SaveFutRequestDTO("Fut teste", 4, 10, 2, 1L); + + SaveFutResponseDTO saveFutResponseDTO = + new SaveFutResponseDTO( + 1L, "Fut teste", 4, 10, 2, historicoFutModel.getId(), peladeiroModel.getId()); + + doNothing().when(queryService).verifyNomeFutExist(futModel.getNome()); + when(peladeiroQueryService.verifyPeladeiroExist(saveFutRequestDTO.administradorPeladeiro())) + .thenReturn(peladeiroModel); + when(mapper.saveRequestToModel(saveFutRequestDTO)).thenReturn(futModel); + when(repository.save(futModel)).thenReturn(futModel); + when(historicoFutService.create()).thenReturn(historicoFutModel); + when(mapper.toSaveResponse(futModel)).thenReturn(saveFutResponseDTO); + + // Act: + SaveFutResponseDTO response = futService.create(saveFutRequestDTO); + + // Assert: + assertThat(response.id()).isNotNull().isEqualTo(1L); + assertThat(response.nome()).isEqualTo("Fut teste"); + assertThat(response.historicoFutId()).isEqualTo(historicoFutModel.getId()); + assertThat(response.administradorPeladeiro()).isEqualTo(peladeiroModel.getId()); + + verify(queryService).verifyNomeFutExist(saveFutRequestDTO.nome()); + verify(peladeiroQueryService).verifyPeladeiroExist(saveFutRequestDTO.administradorPeladeiro()); + verify(mapper).saveRequestToModel(saveFutRequestDTO); + verify(mapper).toSaveResponse(futModel); + verify(repository, times(2)).save(futModel); + verify(historicoFutService).create(); + } + + @Test + @DisplayName("Deve retornar erro ao tentar criar um fut") + void create_quandoFutInvalido() { + // Arrange: + SaveFutRequestDTO saveFutRequestDTO = new SaveFutRequestDTO("Fut teste", 4, 10, 2, 1L); + + doThrow(new NomeInUseException("O nome '" + saveFutRequestDTO.nome() + "' já está cadastrado!")) + .when(queryService) + .verifyNomeFutExist(saveFutRequestDTO.nome()); + + // Act + Assert: + assertThatThrownBy(() -> futService.create(saveFutRequestDTO)) + .isInstanceOf(NomeInUseException.class) + .hasMessage("O nome '" + saveFutRequestDTO.nome() + "' já está cadastrado!"); + + verify(queryService).verifyNomeFutExist(saveFutRequestDTO.nome()); + verifyNoInteractions(repository); + } + + @Test + @DisplayName("Deve retornar FutDetailsResponse buscando pelo ID") + void findById_quandoFutExiste_retornaFutDetailsResponse() { + + // Arrange: + FutDetailsResponse futDetailsResponse = + new FutDetailsResponse(1L, "Fut teste", 4, 10, 2, 1L, 1L); + + when(queryService.verifyFutExistRetorn(1L)).thenReturn(futModel); + when(mapper.modelToDetailsResponse(futModel)).thenReturn(futDetailsResponse); + + // Act: + FutDetailsResponse response = futService.findById(1L); + + // Assert + assertThat(response.id()).isNotNull().isEqualTo(1L); + assertThat(response.nome()).isEqualTo("Fut teste"); + + verify(queryService).verifyFutExistRetorn(1L); + verify(mapper).modelToDetailsResponse(futModel); + } + + @Test + @DisplayName("Deve retorna NotFoundException ao buscar pelo ID") + void findById_quandoFutInexistente_retornaNotFoundException() { + + // Arrange: + FutDetailsResponse futDetailsResponse = + new FutDetailsResponse(1L, "Fut teste", 4, 10, 2, 1L, 1L); + + when(queryService.verifyFutExistRetorn(99L)) + .thenThrow(new NotFoundException("Não foi encontrado o Fut de id " + 99L)); + + // Act + Assert + assertThatThrownBy(() -> futService.findById(99L)) + .isInstanceOf(NotFoundException.class) + .hasMessage("Não foi encontrado o Fut de id " + 99L); + verify(queryService).verifyFutExistRetorn(99L); + } + + @Test + @DisplayName("Deve buscar Fut pelo Nome") + void findByNome_quandoFutExiste_retornaFutDTO() { + // Arrange + List editores = List.of(3L, 6L, 7L); + List peladeiros = List.of(2L, 8L, 3L, 6L, 7L); + List cartoes = List.of(1L, 2L, 3L, 5L); + FutDTO futDTO = new FutDTO(1L, "Fut Test", 4, 10, 2, 1L, 1L, editores, peladeiros, cartoes); + + when(queryService.verifyNomeFutExistRetorn("Fut Test")).thenReturn(futModel); + when(mapper.toDTO(futModel)).thenReturn(futDTO); + + // Act + FutDTO response = futService.findByNome("Fut Test"); + + // Assert + assertThat(response).isNotNull(); + assertThat(response.id()).isEqualTo(futDTO.id()); + assertThat(response.nome()).isEqualTo("Fut Test"); + assertThat(response.editores().size()).isEqualTo(3); + assertThat(response.peladeiros().size()).isEqualTo(5); + assertThat(response.cartoes().size()).isEqualTo(4); + + verify(queryService).verifyNomeFutExistRetorn("Fut Test"); + verify(mapper).toDTO(futModel); + } + + @Test + @DisplayName("Deve buscar um nome de Fut que nao existe e retornar ") + void findByNome_quandoFutInexistente_retornaEntityNotFoundException() {} +} diff --git a/VemProFutApi/src/test/java/br/com/vemprofut/unit/services/PeladeiroServiceTest.java b/VemProFutApi/src/test/java/br/com/vemprofut/unit/services/PeladeiroServiceTest.java new file mode 100644 index 0000000..ef9d681 --- /dev/null +++ b/VemProFutApi/src/test/java/br/com/vemprofut/unit/services/PeladeiroServiceTest.java @@ -0,0 +1,303 @@ +package br.com.vemprofut.unit.services; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.Mockito.*; + +import br.com.vemprofut.controllers.request.SavePeladeiroRequestDTO; +import br.com.vemprofut.controllers.request.UpdatePeladeiroRequestDTO; +import br.com.vemprofut.controllers.response.CartoesResumoResponseDTO; +import br.com.vemprofut.controllers.response.PeladeiroDetailResponse; +import br.com.vemprofut.controllers.response.SavePeladeiroResponseDTO; +import br.com.vemprofut.controllers.response.UpdatePeladeiroResponseDTO; +import br.com.vemprofut.exceptions.EmailInUseException; +import br.com.vemprofut.exceptions.NotFoundException; +import br.com.vemprofut.mappers.IHistoricoPeladeiroMapper; +import br.com.vemprofut.mappers.IPeladeiroMapper; +import br.com.vemprofut.models.PeladeiroModel; +import br.com.vemprofut.models.enuns.PeDominante; +import br.com.vemprofut.repositories.PeladeiroRepository; +import br.com.vemprofut.services.ICartoesService; +import br.com.vemprofut.services.IHistoricoPeladeiroService; +import br.com.vemprofut.services.implementacao.PeladeiroService; +import br.com.vemprofut.services.query.IPeladeiroQueryService; +import java.util.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +public class PeladeiroServiceTest { + + @Mock private IPeladeiroQueryService queryService; + @Mock private PeladeiroRepository repository; + @Mock private IPeladeiroMapper peladeiroMapper; + @Mock private IHistoricoPeladeiroMapper historicoMapper; + @Mock private IHistoricoPeladeiroService historicoPeladeiroService; + @Mock private ICartoesService cartoesService; + + @InjectMocks private PeladeiroService peladeiroService; + + PeladeiroModel peladeiroModel; + + @BeforeEach + void setup() { + MockitoAnnotations.openMocks(this); + peladeiroModel = new PeladeiroModel(); + peladeiroModel.setId(1L); + peladeiroModel.setNome("Marcio"); + peladeiroModel.setEmail("marcio-costa@gmail.com"); + } + + @Test + @DisplayName("Deve Salvar um novo Peladeiro") + void create_quandoPeladeiroValido() { + // Arrange + SavePeladeiroRequestDTO savePeladeiroRequestDTO = + new SavePeladeiroRequestDTO( + "Marcio", + "marcio-costa@gmail.com", + "ronaldinho", + "o cara forte", + PeDominante.DESTRO, + "81999999999"); + + // cria listas simuladas + List partidas = List.of(10L, 20L); + List futs = List.of(30L); + List cartoes = List.of(40L, 50L); + + doNothing().when(queryService).verifyEmail(savePeladeiroRequestDTO.email()); + when(peladeiroMapper.saveRequestToModel(savePeladeiroRequestDTO)).thenReturn(peladeiroModel); + when(repository.save(peladeiroModel)).thenReturn(peladeiroModel); + when(peladeiroMapper.modelToSaveResponse(peladeiroModel)) + .thenReturn( + new SavePeladeiroResponseDTO( + 1L, + "Marcio", + "marcio-costa@gmail.com", + "ronaldinho", + "o cara forte", + PeDominante.DESTRO, + "81999999999", + 1L, + "foto.com/url", + partidas, + futs, + cartoes)); + // Act + SavePeladeiroResponseDTO response = peladeiroService.create(savePeladeiroRequestDTO); + + // Assert + assertThat(response.nome()).isEqualTo("Marcio"); + + verify(queryService).verifyEmail(savePeladeiroRequestDTO.email()); + verify(repository, times(2)).save(peladeiroModel); + verify(peladeiroMapper).saveRequestToModel(savePeladeiroRequestDTO); + verify(peladeiroMapper).modelToSaveResponse(peladeiroModel); + } + + @Test + @DisplayName("Deve retornar um EmailInUseException por email ja existente") + void create_quandoEmailJaCadastrado_retornaEmailInUseException() { + // Arrange + SavePeladeiroRequestDTO savePeladeiroRequestDTO = + new SavePeladeiroRequestDTO( + "Marcio", + "marcio-costa@gmail.com", + "ronaldinho", + "o cara forte", + PeDominante.DESTRO, + "81999999999"); + + // cria listas simuladas + List partidas = List.of(10L, 20L); + List futs = List.of(30L); + List cartoes = List.of(40L, 50L); + + doThrow( + new EmailInUseException( + "O e-mail " + savePeladeiroRequestDTO.email() + " já está em uso")) + .when(queryService) + .verifyEmail(savePeladeiroRequestDTO.email()); + + // Act + Assert + assertThatThrownBy(() -> peladeiroService.create(savePeladeiroRequestDTO)) + .isInstanceOf(EmailInUseException.class) + .hasMessage("O e-mail " + savePeladeiroRequestDTO.email() + " já está em uso"); + + verify(queryService).verifyEmail(savePeladeiroRequestDTO.email()); + verifyNoInteractions(repository); + } + + @Test + @DisplayName("Deve fazer uma Alteracao em um Peladeiro ja cadastrado") + void update_quandoPeladeiroExiste_retornaPeladeiroAlterado() { + // Arrange + UpdatePeladeiroRequestDTO requestDTO = + new UpdatePeladeiroRequestDTO( + "maria", + "maria@gmail.com", + "mari", + "mulher que joga", + PeDominante.CANHOTO, + "81999993332"); + + when(queryService.verifyPeladeiroExist(1L)).thenReturn(peladeiroModel); + when(repository.save(peladeiroModel)).thenReturn(peladeiroModel); + when(peladeiroMapper.modelToUpdateResponse(peladeiroModel)) + .thenReturn( + new UpdatePeladeiroResponseDTO( + "maria", + "maria@gmail.com", + "mari", + "mulher que joga", + "81999993332", + PeDominante.DESTRO, + "foto.com/url")); + + // Act + UpdatePeladeiroResponseDTO responseDTO = peladeiroService.update(1L, requestDTO); + + // Assert + assertThat(responseDTO).isNotNull(); + assertThat(responseDTO.nome()).isEqualTo("maria"); + assertThat(responseDTO.email()).isEqualTo("maria@gmail.com"); + + verify(queryService).verifyPeladeiroExist(1L); + verify(repository).save(peladeiroModel); + } + + @Test + @DisplayName("Deve retornar NotFoundException por nao encontrar o Peladeiro pelo ID") + void update_quandoPeladeiroInexistente_retornaNotFoundException() { + // Arrange + UpdatePeladeiroRequestDTO requestDTO = + new UpdatePeladeiroRequestDTO( + "maria", + "maria@gmail.com", + "mari", + "mulher que joga", + PeDominante.CANHOTO, + "81999993332"); + + when(queryService.verifyPeladeiroExist(99L)) + .thenThrow(new NotFoundException("Não foi encontrado o Peladeiro de id" + 99L)); + + // Act + Assert + assertThatThrownBy(() -> peladeiroService.update(99L, requestDTO)) + .isInstanceOf(NotFoundException.class) + .hasMessage("Não foi encontrado o Peladeiro de id" + 99L); + verify(queryService).verifyPeladeiroExist(99L); + verifyNoInteractions(repository); + } + + @Test + @DisplayName("Deve buscar um peladeiro pelo ID") + void findById_quandoPeladeiroExiste_retornaPeladeiroDetailResponse() { + // Arrange + CartoesResumoResponseDTO cartoesResumoResponseDTO = new CartoesResumoResponseDTO(2, 3, 2); + when(queryService.verifyPeladeiroExist(1L)).thenReturn(peladeiroModel); + when(cartoesService.contarCartoesPeladeiro(1L)).thenReturn(cartoesResumoResponseDTO); + + // Act + PeladeiroDetailResponse peladeiroDetailResponse = peladeiroService.findById(1L); + + // Assert + assertThat(peladeiroDetailResponse).isNotNull(); + assertThat(peladeiroDetailResponse.id()).isEqualTo(1L); + assertThat(peladeiroDetailResponse.cartoes().getAzul()).isEqualTo(2); + assertThat(peladeiroDetailResponse.cartoes().getAmarelo()).isEqualTo(3); + assertThat(peladeiroDetailResponse.cartoes().getVermelho()).isEqualTo(2); + assertThat(peladeiroDetailResponse.nome()).isEqualTo("Marcio"); + assertThat(peladeiroDetailResponse.email()).isEqualTo("marcio-costa@gmail.com"); + + verify(queryService).verifyPeladeiroExist(1L); + verify(cartoesService).contarCartoesPeladeiro(1L); + } + + @Test + @DisplayName("Deve buscar um peladeiro pelo ID") + void findById_quandoPeladeiroInexistente_retornaNotFoundException() { + // Arrange + when(queryService.verifyPeladeiroExist(99L)) + .thenThrow(new NotFoundException("Não foi encontrado o Peladeiro de id " + 99L)); + + // Act + Assert + assertThatThrownBy(() -> peladeiroService.findById(99L)) + .isInstanceOf(NotFoundException.class) + .hasMessage("Não foi encontrado o Peladeiro de id " + 99L); + + verify(queryService).verifyPeladeiroExist(99L); + verifyNoInteractions( + repository); // é usando em verifyPeladeiroExist, mas como ele está mockado nao detecta... + } + + @Test + @DisplayName("") + void findByIdModel_quandoPeladeiroExiste_retornaPeladeiroModel() { + // Arrenge + when(queryService.verifyPeladeiroExist(1L)).thenReturn(peladeiroModel); + + // Act + PeladeiroModel response = peladeiroService.findByIdModel(1L); + + // Assert + assertThat(response.getId()).isEqualTo(1L); + assertThat(response.getNome()).isEqualTo("Marcio"); + assertThat(response.getEmail()).isEqualTo("marcio-costa@gmail.com"); + + verify(queryService).verifyPeladeiroExist(1L); + } + + @Test + @DisplayName("") + void findByIdModel_quandoPeladeiroInexistente_retornaNotFoundException() { + // Arrenge + when(queryService.verifyPeladeiroExist(99L)) + .thenThrow(new NotFoundException("Não foi encontrado o Peladeiro de id " + 99L)); + + // Act + Assert + assertThatThrownBy(() -> peladeiroService.findByIdModel(99L)) + .isInstanceOf(NotFoundException.class) + .hasMessage("Não foi encontrado o Peladeiro de id " + 99L); + + verify(queryService).verifyPeladeiroExist(99L); + } + + @Test + @DisplayName("Deve apagar o Peladeiro indicado pelo numero do ID") + void delete_quandoPeladeiroExiste() { + // Arrenge + when(queryService.verifyPeladeiroExist(1L)).thenReturn(peladeiroModel); + doNothing().when(repository).deleteById(1L); + + // Act + peladeiroService.delete(1L); + + // Assert + verify(queryService).verifyPeladeiroExist(1L); + verify(repository).deleteById(1L); + } + + @Test + @DisplayName("Deve apagar o Peladeiro indicado pelo numero do ID") + void delete_quandoPeladeiroInexistente() { + // Arrenge + when(queryService.verifyPeladeiroExist(99L)) + .thenThrow(new NotFoundException("Não foi encontrado o Peladeiro de id " + 99L)); + + // Act + Assert + + assertThatThrownBy(() -> peladeiroService.delete(99L)) + .isInstanceOf(NotFoundException.class) + .hasMessage("Não foi encontrado o Peladeiro de id " + 99L); + + verify(queryService).verifyPeladeiroExist(99L); + } +}