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)



@@ -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);
+ }
+}