From ca625fa1501947c1ae54eba42562f4514e156b62 Mon Sep 17 00:00:00 2001 From: vviccenzo Date: Mon, 29 Apr 2024 18:26:39 -0300 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20Estrutura=C3=A7=C3=A3o=20e=20implem?= =?UTF-8?q?enta=C3=A7=C3=A3o=20de=20services=20para=20cria=C3=A7=C3=A3o=20?= =?UTF-8?q?e=20atualiza=C3=A7=C3=A3o=20de=20tarefas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../challenge/modules/task/dtos/TaskDTO.java | 3 -- .../http/controllers/TaskController.java | 42 +++++++-------- .../controllers/TaskProgressController.java | 10 +--- .../infra/http/views/TaskProgressView.java | 4 ++ .../task/infra/http/views/TaskView.java | 3 -- .../challenge/modules/task/models/Task.java | 30 +++++++---- .../task/repositories/ITaskRepository.java | 9 +++- .../task/repositories/TaskRepository.java | 54 +++++++++++++------ .../task/services/CreateTaskService.java | 4 +- .../services/IUpdateTaskProgressService.java | 4 +- .../task/services/IUpdateTaskService.java | 3 +- .../services/RetrieveAllTasksService.java | 9 ++-- tests/{ => backend/challenge}/Runner.java | 1 - .../services/RetrieveAllTasksServiceTest.java | 1 - 14 files changed, 99 insertions(+), 78 deletions(-) rename tests/{ => backend/challenge}/Runner.java (91%) diff --git a/source/backend/challenge/modules/task/dtos/TaskDTO.java b/source/backend/challenge/modules/task/dtos/TaskDTO.java index d73cf02..69973f5 100644 --- a/source/backend/challenge/modules/task/dtos/TaskDTO.java +++ b/source/backend/challenge/modules/task/dtos/TaskDTO.java @@ -1,13 +1,10 @@ package backend.challenge.modules.task.dtos; -import backend.challenge.modules.task.enums.TaskStatus; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.experimental.Accessors; -import java.util.Date; - @Getter @Setter @Accessors(chain = true) diff --git a/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java b/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java index 6a06a52..8f37c3f 100644 --- a/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java +++ b/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java @@ -1,7 +1,6 @@ package backend.challenge.modules.task.infra.http.controllers; -import backend.challenge.modules.task.infra.http.views.TaskView; -import backend.challenge.modules.task.models.Task; +import backend.challenge.modules.task.dtos.TaskDTO; import backend.challenge.modules.task.services.*; import kikaha.urouting.api.*; @@ -22,54 +21,49 @@ public class TaskController { public TaskController( final ICreateTaskService createTaskService, final IDeleteTaskService deleteTaskService, - final IRetrieveAllTasksService retrieveAllTasksService + final IRetrieveAllTasksService retrieveAllTasksService, + final IRetrieveTaskByIdService retrieveTaskByIdService, + final IUpdateTaskService updateTaskService ) { this.createTaskService = createTaskService; this.deleteTaskService = deleteTaskService; this.retrieveAllTasksService = retrieveAllTasksService; - this.retrieveTaskByIdService = null; - this.updateTaskService = null; + this.retrieveTaskByIdService = retrieveTaskByIdService; + this.updateTaskService = updateTaskService; } @GET public Response show() { - // TODO: Rota que lista todas as tarefas - - return DefaultResponse.ok().entity("Hello world"); + return DefaultResponse.ok().entity(this.retrieveAllTasksService.execute()); } @GET @Path("single/{taskId}") public Response index(@PathParam("taskId") Long taskId) { - // TODO: A rota deve retornar somente a tarefa a qual o id corresponder - - return DefaultResponse.ok().entity("Hello world"); + return DefaultResponse.ok().entity(this.retrieveTaskByIdService.execute(taskId)); } @POST - public Response create(TaskView task) { - // TODO: A rota deve receber title e description, sendo o `title` o título da tarefa e `description` uma descrição da tarefa. - - return DefaultResponse.ok().entity("Hello world"); + public Response create(TaskDTO taskDTO) { + return DefaultResponse.ok().entity(this.createTaskService.execute(taskDTO)); } @PUT @Path("single/{taskId}") - public Response update(@PathParam("taskId") Long taskId, Task task) { - /* - TODO: A rota deve alterar apenas o title e description da tarefa - que possua o id igual ao id correspondente nos parâmetros da rota. - */ - - return DefaultResponse.ok().entity("Hello world"); + public Response update(@PathParam("taskId") Long taskId, TaskDTO task) { + return DefaultResponse.ok().entity(this.updateTaskService.execute(task, taskId)); } @DELETE @Path("single/{taskId}") public Response delete(@PathParam("taskId") Long taskId) { - // TODO: A rota deve deletar a tarefa com o id correspondente nos parâmetros da rota + try { + this.deleteTaskService.execute(taskId); + } catch (Exception e) { + return DefaultResponse.serverError(); + } - return DefaultResponse.ok().entity("Hello world"); + return DefaultResponse.ok(); } } diff --git a/source/backend/challenge/modules/task/infra/http/controllers/TaskProgressController.java b/source/backend/challenge/modules/task/infra/http/controllers/TaskProgressController.java index 4a25520..5141f47 100644 --- a/source/backend/challenge/modules/task/infra/http/controllers/TaskProgressController.java +++ b/source/backend/challenge/modules/task/infra/http/controllers/TaskProgressController.java @@ -1,7 +1,6 @@ package backend.challenge.modules.task.infra.http.controllers; import backend.challenge.modules.task.infra.http.views.TaskProgressView; -import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.services.*; import kikaha.urouting.api.*; @@ -22,14 +21,7 @@ public TaskProgressController(final IUpdateTaskProgressService updateTaskProgres @PUT @Path("single/{taskId}") public Response updateProgress(@PathParam("taskId") Long taskId, TaskProgressView taskProgressView) { - /* - TODO: A rota deve alterar apenas o progresso da tarefa que possua o id igual ao id correspondente - nos parâmetros da rota. - O `progress` pode ter o valor máximo de 100, e quando ele atingi o máximo, - o `status` deve ser alterado para `COMPLETE` - */ - - return DefaultResponse.ok().entity("Hello world"); + return DefaultResponse.ok().entity(this.updateTaskProgressService.execute(taskId, taskProgressView)); } } diff --git a/source/backend/challenge/modules/task/infra/http/views/TaskProgressView.java b/source/backend/challenge/modules/task/infra/http/views/TaskProgressView.java index 3375195..bd2fde6 100644 --- a/source/backend/challenge/modules/task/infra/http/views/TaskProgressView.java +++ b/source/backend/challenge/modules/task/infra/http/views/TaskProgressView.java @@ -9,4 +9,8 @@ public class TaskProgressView { private int progress; + public boolean validateIfProgressIsValid() { + return this.progress >= 0 && this.progress <= 100; + } + } diff --git a/source/backend/challenge/modules/task/infra/http/views/TaskView.java b/source/backend/challenge/modules/task/infra/http/views/TaskView.java index 8b0d67e..4d5bfc9 100644 --- a/source/backend/challenge/modules/task/infra/http/views/TaskView.java +++ b/source/backend/challenge/modules/task/infra/http/views/TaskView.java @@ -1,11 +1,8 @@ package backend.challenge.modules.task.infra.http.views; -import backend.challenge.modules.task.enums.TaskStatus; import lombok.Getter; import lombok.Setter; -import java.util.Date; - @Getter @Setter public class TaskView { diff --git a/source/backend/challenge/modules/task/models/Task.java b/source/backend/challenge/modules/task/models/Task.java index 123f10c..73dab28 100644 --- a/source/backend/challenge/modules/task/models/Task.java +++ b/source/backend/challenge/modules/task/models/Task.java @@ -1,23 +1,35 @@ package backend.challenge.modules.task.models; +import backend.challenge.modules.task.dtos.TaskDTO; import backend.challenge.modules.task.enums.TaskStatus; import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.RequiredArgsConstructor; import lombok.Setter; -import lombok.experimental.Accessors; import java.util.Date; +import java.util.UUID; @Getter @Setter public class Task { - private Long id; - private String title; - private String description; - private int progress; - private TaskStatus status; - private Date createdAt; + private Long id; + private String title; + + private String description; + + private int progress; + + private TaskStatus status; + + private Date createdAt; + + public Task(final TaskDTO dto) { + this.id = UUID.randomUUID().getLeastSignificantBits(); + this.createdAt = new Date(); + this.description = dto.getDescription(); + this.progress = 0; + this.status = TaskStatus.PROGRESS; + this.title = dto.getTitle(); + } } diff --git a/source/backend/challenge/modules/task/repositories/ITaskRepository.java b/source/backend/challenge/modules/task/repositories/ITaskRepository.java index 527450a..651473b 100644 --- a/source/backend/challenge/modules/task/repositories/ITaskRepository.java +++ b/source/backend/challenge/modules/task/repositories/ITaskRepository.java @@ -1,6 +1,7 @@ package backend.challenge.modules.task.repositories; import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.infra.http.views.TaskProgressView; import backend.challenge.modules.task.models.Task; import java.util.List; @@ -8,9 +9,15 @@ public interface ITaskRepository { Task index(Long taskId); + List show(); + Task create(TaskDTO taskDTO); - Task update(Task task); + + Task update(TaskDTO taskDTO, Long taskId); + void delete(Long taskId); + Task updateTaskProgress(Long taskId, TaskProgressView taskProgressView); + } diff --git a/source/backend/challenge/modules/task/repositories/TaskRepository.java b/source/backend/challenge/modules/task/repositories/TaskRepository.java index c47c8fd..1eaadfd 100644 --- a/source/backend/challenge/modules/task/repositories/TaskRepository.java +++ b/source/backend/challenge/modules/task/repositories/TaskRepository.java @@ -1,46 +1,68 @@ package backend.challenge.modules.task.repositories; import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.enums.TaskStatus; +import backend.challenge.modules.task.infra.http.views.TaskProgressView; import backend.challenge.modules.task.models.Task; import javax.inject.Singleton; +import java.util.ArrayList; import java.util.List; +import java.util.Optional; @Singleton public class TaskRepository implements ITaskRepository { - @Override - public Task index(final Long taskId) { - // TODO: Criar método responsável por retornar tarefa por id + private final List tasks = new ArrayList<>(); - return null; + @Override + public Task index(Long taskId) { + return findTaskById(taskId).orElseThrow(() -> new RuntimeException("Task with id: " + taskId + " not found.")); } @Override public List show() { - // TODO: Criar método responsável por retornar todas as tarefas - - return null; + return tasks; } @Override - public Task create(final TaskDTO taskDTO) { - // TODO: Criar método responsável por criar uma tarefa - - return null; + public Task create(TaskDTO taskDTO) { + Task task = new Task(taskDTO); + tasks.add(task); + return task; } @Override - public Task update(final Task task) { - // TODO: Criar método responsável por atualizar uma tarefa + public Task update(TaskDTO taskDTO, Long taskId) { + tasks.stream().filter(task -> task.getId().equals(taskId)).forEach(task -> { + task.setDescription(taskDTO.getDescription()); + task.setTitle(taskDTO.getTitle()); + }); + return this.index(taskId); + } - return null; + @Override + public void delete(Long taskId) { + tasks.removeIf(task -> task.getId().equals(taskId)); } @Override - public void delete(final Long taskId) { - // TODO: Criar método responsável por deletar tarefa por id + public Task updateTaskProgress(Long taskId, TaskProgressView taskProgressView) { + tasks.stream().filter(task -> task.getId().equals(taskId) && taskProgressView.validateIfProgressIsValid()) + .forEach(task -> { + int progress = taskProgressView.getProgress(); + task.setProgress(progress); + + if (progress == 100) { + task.setStatus(TaskStatus.COMPLETE); + } + }); + + return this.index(taskId); + } + private Optional findTaskById(Long taskId) { + return tasks.stream().filter(task -> task.getId().equals(taskId)).findFirst(); } } diff --git a/source/backend/challenge/modules/task/services/CreateTaskService.java b/source/backend/challenge/modules/task/services/CreateTaskService.java index 46b144b..3ce2018 100644 --- a/source/backend/challenge/modules/task/services/CreateTaskService.java +++ b/source/backend/challenge/modules/task/services/CreateTaskService.java @@ -19,9 +19,7 @@ public CreateTaskService(final ITaskRepository taskRepository) { @Override public Task execute(TaskDTO taskDTO) { - // TODO: Criar serviço responsável por criar uma tarefa - - return null; + return this.taskRepository.create(taskDTO); } } diff --git a/source/backend/challenge/modules/task/services/IUpdateTaskProgressService.java b/source/backend/challenge/modules/task/services/IUpdateTaskProgressService.java index 133b794..5876251 100644 --- a/source/backend/challenge/modules/task/services/IUpdateTaskProgressService.java +++ b/source/backend/challenge/modules/task/services/IUpdateTaskProgressService.java @@ -1,10 +1,10 @@ package backend.challenge.modules.task.services; -import backend.challenge.modules.task.dtos.TaskProgressDTO; +import backend.challenge.modules.task.infra.http.views.TaskProgressView; import backend.challenge.modules.task.models.Task; public interface IUpdateTaskProgressService { - Task execute(TaskProgressDTO taskProgressDTO); + Task execute(Long taskId, TaskProgressView taskProgressView); } diff --git a/source/backend/challenge/modules/task/services/IUpdateTaskService.java b/source/backend/challenge/modules/task/services/IUpdateTaskService.java index 3da8340..ca4d56f 100644 --- a/source/backend/challenge/modules/task/services/IUpdateTaskService.java +++ b/source/backend/challenge/modules/task/services/IUpdateTaskService.java @@ -1,9 +1,10 @@ package backend.challenge.modules.task.services; +import backend.challenge.modules.task.dtos.TaskDTO; import backend.challenge.modules.task.models.Task; public interface IUpdateTaskService { - Task execute(Task task); + Task execute(TaskDTO task, Long taskId); } diff --git a/source/backend/challenge/modules/task/services/RetrieveAllTasksService.java b/source/backend/challenge/modules/task/services/RetrieveAllTasksService.java index 52a4149..cf4b0d0 100644 --- a/source/backend/challenge/modules/task/services/RetrieveAllTasksService.java +++ b/source/backend/challenge/modules/task/services/RetrieveAllTasksService.java @@ -5,23 +5,22 @@ import javax.inject.Inject; import javax.inject.Singleton; + import java.util.List; @Singleton public class RetrieveAllTasksService implements IRetrieveAllTasksService { - private final ITaskRepository taskRepository; - @Inject public RetrieveAllTasksService(final ITaskRepository taskRepository) { this.taskRepository = taskRepository; } + + private ITaskRepository taskRepository; @Override public List execute() { - // TODO: Criar serviço responsável por recuperar todas as tarefas - - return null; + return this.taskRepository.show(); } } diff --git a/tests/Runner.java b/tests/backend/challenge/Runner.java similarity index 91% rename from tests/Runner.java rename to tests/backend/challenge/Runner.java index 1ff4b19..71637f8 100644 --- a/tests/Runner.java +++ b/tests/backend/challenge/Runner.java @@ -1,7 +1,6 @@ package backend.challenge; import kikaha.core.test.KikahaServerRunner; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/tests/backend/challenge/modules/task/services/RetrieveAllTasksServiceTest.java b/tests/backend/challenge/modules/task/services/RetrieveAllTasksServiceTest.java index 68f0012..af11af6 100644 --- a/tests/backend/challenge/modules/task/services/RetrieveAllTasksServiceTest.java +++ b/tests/backend/challenge/modules/task/services/RetrieveAllTasksServiceTest.java @@ -4,7 +4,6 @@ import backend.challenge.modules.task.repositories.TaskRepository; import kikaha.core.test.KikahaRunner; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; From b6ad27e561ec7c34e4011829c1ebe6f5875fa8d1 Mon Sep 17 00:00:00 2001 From: vviccenzo Date: Mon, 29 Apr 2024 20:58:17 -0300 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20Estrutura=C3=A7=C3=A3o=20de=20teste?= =?UTF-8?q?s=20e=20corre=C3=A7=C3=A3o=20de=20NPE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../challenge/modules/task/dtos/TaskDTO.java | 4 ++ .../challenge/modules/task/models/Task.java | 6 +- .../task/repositories/TaskRepository.java | 7 ++- .../task/services/DeleteTaskService.java | 2 +- .../services/IRetrieveTaskByIdService.java | 1 - .../services/RetrieveAllTasksService.java | 4 +- .../task/services/CreateTaskServiceTest.java | 19 +++++-- .../task/services/DeleteTaskServiceTest.java | 55 +++++++++++++++---- .../services/RetrieveAllTasksServiceTest.java | 55 ++++++++++++++----- .../services/RetrieveTaskByIdServiceTest.java | 51 +++++++++++++++++ .../UpdateTaskProgressServiceTest.java | 12 ++++ .../task/services/UpdateTaskServiceTest.java | 7 +++ 12 files changed, 186 insertions(+), 37 deletions(-) diff --git a/source/backend/challenge/modules/task/dtos/TaskDTO.java b/source/backend/challenge/modules/task/dtos/TaskDTO.java index 69973f5..37d19a1 100644 --- a/source/backend/challenge/modules/task/dtos/TaskDTO.java +++ b/source/backend/challenge/modules/task/dtos/TaskDTO.java @@ -1,5 +1,7 @@ package backend.challenge.modules.task.dtos; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -7,8 +9,10 @@ @Getter @Setter +@Builder @Accessors(chain = true) @NoArgsConstructor(staticName = "create") +@AllArgsConstructor public class TaskDTO { private String title; diff --git a/source/backend/challenge/modules/task/models/Task.java b/source/backend/challenge/modules/task/models/Task.java index 73dab28..687820c 100644 --- a/source/backend/challenge/modules/task/models/Task.java +++ b/source/backend/challenge/modules/task/models/Task.java @@ -2,7 +2,9 @@ import backend.challenge.modules.task.dtos.TaskDTO; import backend.challenge.modules.task.enums.TaskStatus; +import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; import java.util.Date; @@ -10,6 +12,8 @@ @Getter @Setter +@NoArgsConstructor +@AllArgsConstructor public class Task { private Long id; @@ -25,7 +29,7 @@ public class Task { private Date createdAt; public Task(final TaskDTO dto) { - this.id = UUID.randomUUID().getLeastSignificantBits(); + this.id = Math.abs(UUID.randomUUID().getLeastSignificantBits()); this.createdAt = new Date(); this.description = dto.getDescription(); this.progress = 0; diff --git a/source/backend/challenge/modules/task/repositories/TaskRepository.java b/source/backend/challenge/modules/task/repositories/TaskRepository.java index 1eaadfd..418306a 100644 --- a/source/backend/challenge/modules/task/repositories/TaskRepository.java +++ b/source/backend/challenge/modules/task/repositories/TaskRepository.java @@ -48,7 +48,12 @@ public void delete(Long taskId) { @Override public Task updateTaskProgress(Long taskId, TaskProgressView taskProgressView) { - tasks.stream().filter(task -> task.getId().equals(taskId) && taskProgressView.validateIfProgressIsValid()) + boolean isProgressValid = taskProgressView.validateIfProgressIsValid(); + if(!isProgressValid) { + throw new RuntimeException("Progress % invalid."); + } + + tasks.stream().filter(task -> task.getId().equals(taskId)) .forEach(task -> { int progress = taskProgressView.getProgress(); task.setProgress(progress); diff --git a/source/backend/challenge/modules/task/services/DeleteTaskService.java b/source/backend/challenge/modules/task/services/DeleteTaskService.java index c957d70..033622e 100644 --- a/source/backend/challenge/modules/task/services/DeleteTaskService.java +++ b/source/backend/challenge/modules/task/services/DeleteTaskService.java @@ -17,7 +17,7 @@ public DeleteTaskService(final ITaskRepository taskRepository) { @Override public void execute(Long taskId) { - // TODO: Criar serviço responsável por deletar a tarefa + this.taskRepository.delete(taskId); } } diff --git a/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java b/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java index 192e28c..8e1d3b3 100644 --- a/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java +++ b/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java @@ -3,7 +3,6 @@ import backend.challenge.modules.task.models.Task; public interface IRetrieveTaskByIdService { - Task execute(Long taskId); } diff --git a/source/backend/challenge/modules/task/services/RetrieveAllTasksService.java b/source/backend/challenge/modules/task/services/RetrieveAllTasksService.java index cf4b0d0..5b79b46 100644 --- a/source/backend/challenge/modules/task/services/RetrieveAllTasksService.java +++ b/source/backend/challenge/modules/task/services/RetrieveAllTasksService.java @@ -11,13 +11,13 @@ @Singleton public class RetrieveAllTasksService implements IRetrieveAllTasksService { + private final ITaskRepository taskRepository; + @Inject public RetrieveAllTasksService(final ITaskRepository taskRepository) { this.taskRepository = taskRepository; } - private ITaskRepository taskRepository; - @Override public List execute() { return this.taskRepository.show(); diff --git a/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java b/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java index 684dc44..0259c78 100644 --- a/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java +++ b/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java @@ -1,14 +1,17 @@ package backend.challenge.modules.task.services; +import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.repositories.ITaskRepository; import backend.challenge.modules.task.repositories.TaskRepository; import kikaha.core.test.KikahaRunner; + +import org.junit.Assert; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; -@RunWith( KikahaRunner.class ) +@RunWith(KikahaRunner.class) public class CreateTaskServiceTest { private ICreateTaskService createTaskService; @@ -22,11 +25,15 @@ public void init() { @Test public void shouldBeAbleToCreateANewTask() { - // TODO: Para que esse teste passe, sua aplicação deve permitir que - // uma tarefa seja criado, e retorne um json com a tarefa criada. - } - + String title = "SizeBay"; + String description = "Completar desafio backend Sizebay"; + TaskDTO taskDTO = new TaskDTO(title, description); + Task task = createTaskService.execute(taskDTO); + Assert.assertNotNull(task.getId()); + Assert.assertEquals(task.getTitle(), title); + Assert.assertEquals(task.getDescription(), description); + } } \ No newline at end of file diff --git a/tests/backend/challenge/modules/task/services/DeleteTaskServiceTest.java b/tests/backend/challenge/modules/task/services/DeleteTaskServiceTest.java index 93497a5..7866fa1 100644 --- a/tests/backend/challenge/modules/task/services/DeleteTaskServiceTest.java +++ b/tests/backend/challenge/modules/task/services/DeleteTaskServiceTest.java @@ -1,31 +1,64 @@ package backend.challenge.modules.task.services; +import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.repositories.ITaskRepository; import backend.challenge.modules.task.repositories.TaskRepository; import kikaha.core.test.KikahaRunner; +import org.junit.Assert; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; -@RunWith( KikahaRunner.class ) +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Random; + +@RunWith(KikahaRunner.class) public class DeleteTaskServiceTest { - private IDeleteTaskService deleteTaskService; + private IDeleteTaskService deleteTaskService; + + private List tasks = new ArrayList<>(); + + @Before + public void init() { + final ITaskRepository taskRepository = new TaskRepository(); + + deleteTaskService = new DeleteTaskService(taskRepository); + tasks = generateRandomTasks(10); + } + + @Test + public void shouldBeAbleToDeleteTaskById() { + Task taskToDelete = tasks.get(0); + Long taskIdToDelete = taskToDelete.getId(); + + this.deleteTaskService.execute(taskIdToDelete); + + Task deletedTask = tasks.stream().filter(task -> Objects.equals(task.getId(), taskIdToDelete)).findFirst().orElse(null); + Assert.assertNull("A tarefa não deve mais existir após a exclusão", deletedTask); + } + - @Before - public void init() { - final ITaskRepository taskRepository = new TaskRepository(); + public static List generateRandomTasks(int numberOfTasks) { + List tasks = new ArrayList<>(); - deleteTaskService = new DeleteTaskService(taskRepository); - } + String[] possibleTitles = {"Task 1", "Task 2", "Task 3", "Task 4", "Task 5"}; + String[] possibleDescriptions = {"Description 1", "Description 2", "Description 3", "Description 4", "Description 5"}; - @Test - public void shouldBeAbleToDeleteTaskById() { - // TODO: Para que esse teste passe, sua aplicação deve permitir que tarefas sejam deletadas por id. - } + Random random = new Random(); + for (int i = 0; i < numberOfTasks; i++) { + String possibleTitle = possibleTitles[random.nextInt(possibleTitles.length)]; + String possibleDescription = possibleDescriptions[random.nextInt(possibleDescriptions.length)]; + tasks.add(new Task(new TaskDTO(possibleTitle, possibleDescription))); + } + return tasks; + } } \ No newline at end of file diff --git a/tests/backend/challenge/modules/task/services/RetrieveAllTasksServiceTest.java b/tests/backend/challenge/modules/task/services/RetrieveAllTasksServiceTest.java index af11af6..84f98c7 100644 --- a/tests/backend/challenge/modules/task/services/RetrieveAllTasksServiceTest.java +++ b/tests/backend/challenge/modules/task/services/RetrieveAllTasksServiceTest.java @@ -1,30 +1,57 @@ package backend.challenge.modules.task.services; +import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.repositories.ITaskRepository; import backend.challenge.modules.task.repositories.TaskRepository; import kikaha.core.test.KikahaRunner; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -@RunWith( KikahaRunner.class ) +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import static org.mockito.Mockito.when; + +@RunWith(KikahaRunner.class) public class RetrieveAllTasksServiceTest { - private IRetrieveAllTasksService retrieveAllTasksService; + private IRetrieveAllTasksService retrieveAllTasksService; + + private List tasksCreated = new ArrayList<>(); + + @Before + public void init() { + final ITaskRepository taskRepository = new TaskRepository(); + + retrieveAllTasksService = new RetrieveAllTasksService(taskRepository); + tasksCreated = generateRandomTasks(10); + } + + @Test + public void shouldBeAbleToListTheTasks() { + when(retrieveAllTasksService.execute()).thenReturn(tasksCreated); + Assert.assertEquals(retrieveAllTasksService.execute().size(), 10); + } + + public static List generateRandomTasks(int numberOfTasks) { + List tasks = new ArrayList<>(); + + String[] possibleTitles = {"Task 1", "Task 2", "Task 3", "Task 4", "Task 5"}; + String[] possibleDescriptions = {"Description 1", "Description 2", "Description 3", "Description 4", "Description 5"}; - @Before - public void init() { - final ITaskRepository taskRepository = new TaskRepository(); + Random random = new Random(); - retrieveAllTasksService = new RetrieveAllTasksService(taskRepository); - } + for (int i = 0; i < numberOfTasks; i++) { + String possibleTitle = possibleTitles[random.nextInt(possibleTitles.length)]; + String possibleDescription = possibleDescriptions[random.nextInt(possibleDescriptions.length)]; + tasks.add(new Task(new TaskDTO(possibleTitle, possibleDescription))); + } - @Test - public void shouldBeAbleToListTheTasks() { - /* - TODO: Para que esse teste passe, sua aplicação deve permitir que seja - retornado um array com todas as tarefas que foram criadas até o momento. - */ - } + return tasks; + } } \ No newline at end of file diff --git a/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java b/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java index eb96b15..5cb8a71 100644 --- a/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java +++ b/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java @@ -1,6 +1,9 @@ package backend.challenge.modules.task.services; +import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.enums.TaskStatus; +import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.repositories.ITaskRepository; import backend.challenge.modules.task.repositories.TaskRepository; import kikaha.core.test.KikahaRunner; @@ -8,11 +11,31 @@ import org.junit.Test; import org.junit.runner.RunWith; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Random; + @RunWith( KikahaRunner.class ) public class RetrieveTaskByIdServiceTest { private IRetrieveTaskByIdService retrieveTaskByIdService; + private Long taskId = 123807128930L; + + private Task taskToBeFounded = null; + + private List tasks = new ArrayList<>(); + + @Before + public void init() { + final ITaskRepository taskRepository = new TaskRepository(); + + retrieveTaskByIdService = new RetrieveTaskByIdService(taskRepository); + taskToBeFounded = createTask(); + tasks = generateRandomTasks(10); + } + @Test public void shouldBeAbleToListTheTaskById() { /* @@ -21,4 +44,32 @@ public void shouldBeAbleToListTheTaskById() { */ } + private Task createTask() { + Task task = new Task(); + task.setId(taskId); + task.setTitle("Titulo"); + task.setDescription("Descrição"); + task.setProgress(0); + task.setStatus(TaskStatus.PROGRESS); + task.setCreatedAt(new Date()); + + return task; + } + + public static List generateRandomTasks(int numberOfTasks) { + List tasks = new ArrayList<>(); + + String[] possibleTitles = {"Task 1", "Task 2", "Task 3", "Task 4", "Task 5"}; + String[] possibleDescriptions = {"Description 1", "Description 2", "Description 3", "Description 4", "Description 5"}; + + Random random = new Random(); + + for (int i = 0; i < numberOfTasks; i++) { + String possibleTitle = possibleTitles[random.nextInt(possibleTitles.length)]; + String possibleDescription = possibleDescriptions[random.nextInt(possibleDescriptions.length)]; + tasks.add(new Task(new TaskDTO(possibleTitle, possibleDescription))); + } + + return tasks; + } } diff --git a/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java b/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java index e6b0bf6..32f8f28 100644 --- a/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java +++ b/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java @@ -1,13 +1,25 @@ package backend.challenge.modules.task.services; +import backend.challenge.modules.task.repositories.ITaskRepository; +import backend.challenge.modules.task.repositories.TaskRepository; import kikaha.core.test.KikahaRunner; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @RunWith( KikahaRunner.class ) public class UpdateTaskProgressServiceTest { + private IUpdateTaskProgressService updateTaskProgressService; + + @Before + public void init() { + final ITaskRepository taskRepository = new TaskRepository(); + + updateTaskProgressService = new UpdateTaskProgressService(taskRepository); + } + @Test public void shouldBeAbleToUpdateTaskProgress() { /* diff --git a/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java b/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java index 53a4082..b587492 100644 --- a/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java +++ b/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java @@ -13,6 +13,13 @@ public class UpdateTaskServiceTest { private IUpdateTaskService updateTaskService; + @Before + public void init() { + final ITaskRepository taskRepository = new TaskRepository(); + + updateTaskService = new UpdateTaskService(taskRepository); + } + @Test public void shouldBeAbleToUpdateTask() { /* From 66bcd050cf004bf0339ff503834dec5c9259bf6f Mon Sep 17 00:00:00 2001 From: vviccenzo Date: Tue, 30 Apr 2024 14:35:01 -0300 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20finaliza=C3=A7=C3=A3o=20dos=20teste?= =?UTF-8?q?s=20unit=C3=A1rios,=20refatora=C3=A7=C3=A3o=20dos=20c=C3=B3digo?= =?UTF-8?q?s=20e=20aplica=C3=A7=C3=A3o=20de=20boas=20pr=C3=A1ticas=20para?= =?UTF-8?q?=20retorno=20http?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../challenge/modules/task/dtos/TaskDTO.java | 25 ++++- .../http/controllers/TaskController.java | 39 ++++++- .../infra/http/views/TaskProgressView.java | 4 + .../task/repositories/ITaskRepository.java | 10 +- .../task/repositories/TaskRepository.java | 18 +-- .../task/services/CreateTaskService.java | 2 +- .../task/services/ICreateTaskService.java | 2 +- .../services/IRetrieveAllTasksService.java | 3 +- .../services/IRetrieveTaskByIdService.java | 3 +- .../services/IUpdateTaskProgressService.java | 3 +- .../task/services/IUpdateTaskService.java | 2 +- .../services/RetrieveAllTasksService.java | 3 +- .../task/services/CreateTaskServiceTest.java | 3 +- .../task/services/DeleteTaskServiceTest.java | 28 +++-- .../services/RetrieveAllTasksServiceTest.java | 21 ++-- .../services/RetrieveTaskByIdServiceTest.java | 77 +++++-------- .../UpdateTaskProgressServiceTest.java | 104 ++++++++++++++---- .../task/services/UpdateTaskServiceTest.java | 104 ++++++++++++------ 18 files changed, 303 insertions(+), 148 deletions(-) diff --git a/source/backend/challenge/modules/task/dtos/TaskDTO.java b/source/backend/challenge/modules/task/dtos/TaskDTO.java index 37d19a1..8e25268 100644 --- a/source/backend/challenge/modules/task/dtos/TaskDTO.java +++ b/source/backend/challenge/modules/task/dtos/TaskDTO.java @@ -1,5 +1,7 @@ package backend.challenge.modules.task.dtos; +import backend.challenge.modules.task.enums.TaskStatus; +import backend.challenge.modules.task.models.Task; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -15,7 +17,26 @@ @AllArgsConstructor public class TaskDTO { - private String title; - private String description; + private String title; + private String description; + + private Long id; + + private int progress; + + private TaskStatus status; + + public TaskDTO(Task task) { + this.description = task.getDescription(); + this.title = task.getTitle(); + this.id = task.getId(); + this.progress = task.getProgress(); + this.status = task.getStatus(); + } + + public TaskDTO(String title, String description) { + this.description = description; + this.title = title; + } } diff --git a/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java b/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java index 8f37c3f..a830ca7 100644 --- a/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java +++ b/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java @@ -6,6 +6,7 @@ import javax.inject.Inject; import javax.inject.Singleton; +import java.util.List; @Singleton @Path("tasks") @@ -34,24 +35,52 @@ public TaskController( @GET public Response show() { - return DefaultResponse.ok().entity(this.retrieveAllTasksService.execute()); + try { + List tasks = this.retrieveAllTasksService.execute(); + return DefaultResponse.ok().entity(tasks); + } catch (Exception e) { + return DefaultResponse.serverError(); + } } @GET @Path("single/{taskId}") public Response index(@PathParam("taskId") Long taskId) { - return DefaultResponse.ok().entity(this.retrieveTaskByIdService.execute(taskId)); + try { + TaskDTO task = this.retrieveTaskByIdService.execute(taskId); + if (task != null) { + return DefaultResponse.ok().entity(task); + } else { + return DefaultResponse.notFound().entity("Task not found"); + } + } catch (Exception e) { + return DefaultResponse.serverError(); + } } @POST public Response create(TaskDTO taskDTO) { - return DefaultResponse.ok().entity(this.createTaskService.execute(taskDTO)); + try { + TaskDTO createdTask = this.createTaskService.execute(taskDTO); + return DefaultResponse.ok().entity(createdTask); + } catch (Exception e) { + return DefaultResponse.serverError(); + } } @PUT @Path("single/{taskId}") public Response update(@PathParam("taskId") Long taskId, TaskDTO task) { - return DefaultResponse.ok().entity(this.updateTaskService.execute(task, taskId)); + try { + TaskDTO updatedTask = this.updateTaskService.execute(task, taskId); + if (updatedTask != null) { + return DefaultResponse.ok().entity(updatedTask); + } else { + return DefaultResponse.notFound().entity("Task not found"); + } + } catch (Exception e) { + return DefaultResponse.serverError(); + } } @DELETE @@ -63,7 +92,7 @@ public Response delete(@PathParam("taskId") Long taskId) { return DefaultResponse.serverError(); } - return DefaultResponse.ok(); + return DefaultResponse.ok("Task with id: " + taskId + " deleted."); } } diff --git a/source/backend/challenge/modules/task/infra/http/views/TaskProgressView.java b/source/backend/challenge/modules/task/infra/http/views/TaskProgressView.java index bd2fde6..e9173a8 100644 --- a/source/backend/challenge/modules/task/infra/http/views/TaskProgressView.java +++ b/source/backend/challenge/modules/task/infra/http/views/TaskProgressView.java @@ -1,10 +1,14 @@ package backend.challenge.modules.task.infra.http.views; +import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import lombok.Setter; @Getter @Setter +@AllArgsConstructor +@NoArgsConstructor public class TaskProgressView { private int progress; diff --git a/source/backend/challenge/modules/task/repositories/ITaskRepository.java b/source/backend/challenge/modules/task/repositories/ITaskRepository.java index 651473b..358ba3c 100644 --- a/source/backend/challenge/modules/task/repositories/ITaskRepository.java +++ b/source/backend/challenge/modules/task/repositories/ITaskRepository.java @@ -8,16 +8,16 @@ public interface ITaskRepository { - Task index(Long taskId); + TaskDTO index(Long taskId); - List show(); + List show(); - Task create(TaskDTO taskDTO); + TaskDTO create(TaskDTO taskDTO); - Task update(TaskDTO taskDTO, Long taskId); + TaskDTO update(TaskDTO taskDTO, Long taskId); void delete(Long taskId); - Task updateTaskProgress(Long taskId, TaskProgressView taskProgressView); + TaskDTO updateTaskProgress(Long taskId, TaskProgressView taskProgressView); } diff --git a/source/backend/challenge/modules/task/repositories/TaskRepository.java b/source/backend/challenge/modules/task/repositories/TaskRepository.java index 418306a..caaf041 100644 --- a/source/backend/challenge/modules/task/repositories/TaskRepository.java +++ b/source/backend/challenge/modules/task/repositories/TaskRepository.java @@ -9,6 +9,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; @Singleton public class TaskRepository implements ITaskRepository { @@ -16,24 +17,25 @@ public class TaskRepository implements ITaskRepository { private final List tasks = new ArrayList<>(); @Override - public Task index(Long taskId) { - return findTaskById(taskId).orElseThrow(() -> new RuntimeException("Task with id: " + taskId + " not found.")); + public TaskDTO index(Long taskId) { + Task task = findTaskById(taskId).orElseThrow(() -> new RuntimeException("Task with id: " + taskId + " not found.")); + return new TaskDTO(task); } @Override - public List show() { - return tasks; + public List show() { + return tasks.stream().map(TaskDTO::new).collect(Collectors.toList()); } @Override - public Task create(TaskDTO taskDTO) { + public TaskDTO create(TaskDTO taskDTO) { Task task = new Task(taskDTO); tasks.add(task); - return task; + return new TaskDTO(task); } @Override - public Task update(TaskDTO taskDTO, Long taskId) { + public TaskDTO update(TaskDTO taskDTO, Long taskId) { tasks.stream().filter(task -> task.getId().equals(taskId)).forEach(task -> { task.setDescription(taskDTO.getDescription()); task.setTitle(taskDTO.getTitle()); @@ -47,7 +49,7 @@ public void delete(Long taskId) { } @Override - public Task updateTaskProgress(Long taskId, TaskProgressView taskProgressView) { + public TaskDTO updateTaskProgress(Long taskId, TaskProgressView taskProgressView) { boolean isProgressValid = taskProgressView.validateIfProgressIsValid(); if(!isProgressValid) { throw new RuntimeException("Progress % invalid."); diff --git a/source/backend/challenge/modules/task/services/CreateTaskService.java b/source/backend/challenge/modules/task/services/CreateTaskService.java index 3ce2018..09faaeb 100644 --- a/source/backend/challenge/modules/task/services/CreateTaskService.java +++ b/source/backend/challenge/modules/task/services/CreateTaskService.java @@ -18,7 +18,7 @@ public CreateTaskService(final ITaskRepository taskRepository) { } @Override - public Task execute(TaskDTO taskDTO) { + public TaskDTO execute(TaskDTO taskDTO) { return this.taskRepository.create(taskDTO); } diff --git a/source/backend/challenge/modules/task/services/ICreateTaskService.java b/source/backend/challenge/modules/task/services/ICreateTaskService.java index 33b7d7b..03c6877 100644 --- a/source/backend/challenge/modules/task/services/ICreateTaskService.java +++ b/source/backend/challenge/modules/task/services/ICreateTaskService.java @@ -5,6 +5,6 @@ public interface ICreateTaskService { - Task execute(TaskDTO taskDTO); + TaskDTO execute(TaskDTO taskDTO); } diff --git a/source/backend/challenge/modules/task/services/IRetrieveAllTasksService.java b/source/backend/challenge/modules/task/services/IRetrieveAllTasksService.java index 3e30258..695c229 100644 --- a/source/backend/challenge/modules/task/services/IRetrieveAllTasksService.java +++ b/source/backend/challenge/modules/task/services/IRetrieveAllTasksService.java @@ -1,11 +1,12 @@ package backend.challenge.modules.task.services; +import backend.challenge.modules.task.dtos.TaskDTO; import backend.challenge.modules.task.models.Task; import java.util.List; public interface IRetrieveAllTasksService { - List execute(); + List execute(); } diff --git a/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java b/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java index 8e1d3b3..a27294d 100644 --- a/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java +++ b/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java @@ -1,8 +1,9 @@ package backend.challenge.modules.task.services; +import backend.challenge.modules.task.dtos.TaskDTO; import backend.challenge.modules.task.models.Task; public interface IRetrieveTaskByIdService { - Task execute(Long taskId); + TaskDTO execute(Long taskId); } diff --git a/source/backend/challenge/modules/task/services/IUpdateTaskProgressService.java b/source/backend/challenge/modules/task/services/IUpdateTaskProgressService.java index 5876251..0d11d32 100644 --- a/source/backend/challenge/modules/task/services/IUpdateTaskProgressService.java +++ b/source/backend/challenge/modules/task/services/IUpdateTaskProgressService.java @@ -1,10 +1,11 @@ package backend.challenge.modules.task.services; +import backend.challenge.modules.task.dtos.TaskDTO; import backend.challenge.modules.task.infra.http.views.TaskProgressView; import backend.challenge.modules.task.models.Task; public interface IUpdateTaskProgressService { - Task execute(Long taskId, TaskProgressView taskProgressView); + TaskDTO execute(Long taskId, TaskProgressView taskProgressView); } diff --git a/source/backend/challenge/modules/task/services/IUpdateTaskService.java b/source/backend/challenge/modules/task/services/IUpdateTaskService.java index ca4d56f..092113c 100644 --- a/source/backend/challenge/modules/task/services/IUpdateTaskService.java +++ b/source/backend/challenge/modules/task/services/IUpdateTaskService.java @@ -5,6 +5,6 @@ public interface IUpdateTaskService { - Task execute(TaskDTO task, Long taskId); + TaskDTO execute(TaskDTO task, Long taskId); } diff --git a/source/backend/challenge/modules/task/services/RetrieveAllTasksService.java b/source/backend/challenge/modules/task/services/RetrieveAllTasksService.java index 5b79b46..907571b 100644 --- a/source/backend/challenge/modules/task/services/RetrieveAllTasksService.java +++ b/source/backend/challenge/modules/task/services/RetrieveAllTasksService.java @@ -1,5 +1,6 @@ package backend.challenge.modules.task.services; +import backend.challenge.modules.task.dtos.TaskDTO; import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.repositories.ITaskRepository; @@ -19,7 +20,7 @@ public RetrieveAllTasksService(final ITaskRepository taskRepository) { } @Override - public List execute() { + public List execute() { return this.taskRepository.show(); } diff --git a/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java b/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java index 0259c78..fa1ab9a 100644 --- a/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java +++ b/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java @@ -29,9 +29,8 @@ public void shouldBeAbleToCreateANewTask() { String description = "Completar desafio backend Sizebay"; TaskDTO taskDTO = new TaskDTO(title, description); - Task task = createTaskService.execute(taskDTO); + TaskDTO task = createTaskService.execute(taskDTO); - Assert.assertNotNull(task.getId()); Assert.assertEquals(task.getTitle(), title); Assert.assertEquals(task.getDescription(), description); } diff --git a/tests/backend/challenge/modules/task/services/DeleteTaskServiceTest.java b/tests/backend/challenge/modules/task/services/DeleteTaskServiceTest.java index 7866fa1..3d160b2 100644 --- a/tests/backend/challenge/modules/task/services/DeleteTaskServiceTest.java +++ b/tests/backend/challenge/modules/task/services/DeleteTaskServiceTest.java @@ -10,39 +10,44 @@ import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Random; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.anyLong; +import static org.mockito.Mockito.*; + @RunWith(KikahaRunner.class) public class DeleteTaskServiceTest { - private IDeleteTaskService deleteTaskService; + @Mock + private ITaskRepository taskRepository; + private IDeleteTaskService deleteTaskService; private List tasks = new ArrayList<>(); @Before public void init() { - final ITaskRepository taskRepository = new TaskRepository(); + MockitoAnnotations.initMocks(this); + tasks = generateRandomTasks(10); deleteTaskService = new DeleteTaskService(taskRepository); - tasks = generateRandomTasks(10); } @Test public void shouldBeAbleToDeleteTaskById() { - Task taskToDelete = tasks.get(0); - Long taskIdToDelete = taskToDelete.getId(); - - this.deleteTaskService.execute(taskIdToDelete); - - Task deletedTask = tasks.stream().filter(task -> Objects.equals(task.getId(), taskIdToDelete)).findFirst().orElse(null); - Assert.assertNull("A tarefa não deve mais existir após a exclusão", deletedTask); + Long taskIdToDelete = tasks.get(0).getId(); + deleteTaskService.execute(taskIdToDelete); + verify(taskRepository, times(1)); } - public static List generateRandomTasks(int numberOfTasks) { List tasks = new ArrayList<>(); @@ -60,5 +65,4 @@ public static List generateRandomTasks(int numberOfTasks) { return tasks; } - } \ No newline at end of file diff --git a/tests/backend/challenge/modules/task/services/RetrieveAllTasksServiceTest.java b/tests/backend/challenge/modules/task/services/RetrieveAllTasksServiceTest.java index 84f98c7..0c536fc 100644 --- a/tests/backend/challenge/modules/task/services/RetrieveAllTasksServiceTest.java +++ b/tests/backend/challenge/modules/task/services/RetrieveAllTasksServiceTest.java @@ -9,6 +9,8 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.List; @@ -21,24 +23,26 @@ public class RetrieveAllTasksServiceTest { private IRetrieveAllTasksService retrieveAllTasksService; - private List tasksCreated = new ArrayList<>(); + @Mock + private ITaskRepository taskRepository; + + private List tasksCreated = new ArrayList<>(); @Before public void init() { - final ITaskRepository taskRepository = new TaskRepository(); - + MockitoAnnotations.initMocks(this); retrieveAllTasksService = new RetrieveAllTasksService(taskRepository); tasksCreated = generateRandomTasks(10); } @Test public void shouldBeAbleToListTheTasks() { - when(retrieveAllTasksService.execute()).thenReturn(tasksCreated); + when(taskRepository.show()).thenReturn(tasksCreated); Assert.assertEquals(retrieveAllTasksService.execute().size(), 10); } - public static List generateRandomTasks(int numberOfTasks) { - List tasks = new ArrayList<>(); + public static List generateRandomTasks(int numberOfTasks) { + List tasks = new ArrayList<>(); String[] possibleTitles = {"Task 1", "Task 2", "Task 3", "Task 4", "Task 5"}; String[] possibleDescriptions = {"Description 1", "Description 2", "Description 3", "Description 4", "Description 5"}; @@ -48,7 +52,10 @@ public static List generateRandomTasks(int numberOfTasks) { for (int i = 0; i < numberOfTasks; i++) { String possibleTitle = possibleTitles[random.nextInt(possibleTitles.length)]; String possibleDescription = possibleDescriptions[random.nextInt(possibleDescriptions.length)]; - tasks.add(new Task(new TaskDTO(possibleTitle, possibleDescription))); + TaskDTO dtoUsedToCreateTask = new TaskDTO(possibleTitle, possibleDescription); + Task taskCreated = new Task(dtoUsedToCreateTask); + + tasks.add(new TaskDTO(taskCreated)); } return tasks; diff --git a/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java b/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java index 5cb8a71..66e45b5 100644 --- a/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java +++ b/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java @@ -7,69 +7,52 @@ import backend.challenge.modules.task.repositories.ITaskRepository; import backend.challenge.modules.task.repositories.TaskRepository; import kikaha.core.test.KikahaRunner; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Random; -@RunWith( KikahaRunner.class ) -public class RetrieveTaskByIdServiceTest { - - private IRetrieveTaskByIdService retrieveTaskByIdService; - - private Long taskId = 123807128930L; - - private Task taskToBeFounded = null; +import static org.mockito.Mockito.when; - private List tasks = new ArrayList<>(); - - @Before - public void init() { - final ITaskRepository taskRepository = new TaskRepository(); - - retrieveTaskByIdService = new RetrieveTaskByIdService(taskRepository); - taskToBeFounded = createTask(); - tasks = generateRandomTasks(10); - } +@RunWith(KikahaRunner.class) +public class RetrieveTaskByIdServiceTest { - @Test - public void shouldBeAbleToListTheTaskById() { - /* - TODO: Para que esse teste passe, sua aplicação deve permitir que seja - retornado uma tarefa com o mesmo id informado. - */ - } + private final Long taskId = 123807128930L; - private Task createTask() { - Task task = new Task(); - task.setId(taskId); - task.setTitle("Titulo"); - task.setDescription("Descrição"); - task.setProgress(0); - task.setStatus(TaskStatus.PROGRESS); - task.setCreatedAt(new Date()); + private TaskDTO taskToBeFounded = null; - return task; - } + @Mock + private ITaskRepository taskRepository; - public static List generateRandomTasks(int numberOfTasks) { - List tasks = new ArrayList<>(); + @Before + public void init() { + MockitoAnnotations.initMocks(this); + taskToBeFounded = createTask(); + } - String[] possibleTitles = {"Task 1", "Task 2", "Task 3", "Task 4", "Task 5"}; - String[] possibleDescriptions = {"Description 1", "Description 2", "Description 3", "Description 4", "Description 5"}; + @Test + public void shouldBeAbleToListTheTaskById() { + when(this.taskRepository.index(taskId)).thenReturn(taskToBeFounded); + Assert.assertEquals(taskToBeFounded.getId(), taskId); + } - Random random = new Random(); + private TaskDTO createTask() { + Task task = new Task(); + task.setId(taskId); + task.setTitle("Titulo"); + task.setDescription("Descrição"); + task.setProgress(0); + task.setStatus(TaskStatus.PROGRESS); + task.setCreatedAt(new Date()); - for (int i = 0; i < numberOfTasks; i++) { - String possibleTitle = possibleTitles[random.nextInt(possibleTitles.length)]; - String possibleDescription = possibleDescriptions[random.nextInt(possibleDescriptions.length)]; - tasks.add(new Task(new TaskDTO(possibleTitle, possibleDescription))); - } + return new TaskDTO(task); + } - return tasks; - } } diff --git a/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java b/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java index 32f8f28..a7a122b 100644 --- a/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java +++ b/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java @@ -1,39 +1,101 @@ package backend.challenge.modules.task.services; +import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.enums.TaskStatus; +import backend.challenge.modules.task.infra.http.views.TaskProgressView; +import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.repositories.ITaskRepository; import backend.challenge.modules.task.repositories.TaskRepository; import kikaha.core.test.KikahaRunner; +import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; -@RunWith( KikahaRunner.class ) +import java.util.Date; + +import static org.mockito.Mockito.when; + +@RunWith(KikahaRunner.class) public class UpdateTaskProgressServiceTest { - private IUpdateTaskProgressService updateTaskProgressService; + private IUpdateTaskProgressService updateTaskProgressService; + + @Mock + private final ITaskRepository taskRepository = new TaskRepository(); + + @Before + public void init() { + MockitoAnnotations.initMocks(this); + updateTaskProgressService = new UpdateTaskProgressService(taskRepository); + } + + @Test + public void shouldBeAbleToUpdateTaskProgress() { + TaskProgressView taskProgressView = new TaskProgressView(20); + TaskDTO task = createTask(1L, "title", "description", 10, TaskStatus.PROGRESS, new Date()); + TaskDTO taskWithNewProgress = createTask(1L, "title", "description", 20, TaskStatus.PROGRESS, new Date()); + + when(taskRepository.updateTaskProgress(1L, taskProgressView)).thenReturn(taskWithNewProgress); + when(taskRepository.index(1L)).thenReturn(taskWithNewProgress); + + TaskDTO taskNew = updateTaskProgressService.execute(1L, taskProgressView); + + Assert.assertNotEquals(task.getProgress(), taskNew.getProgress()); + } + + @Test + public void shouldBeAbleToUpdateOnlyTaskStatusWhenProgressEqualsOneHundred() { + TaskProgressView taskProgressView = new TaskProgressView(20); + TaskDTO task = createTask(1L, "title", "description", 10, TaskStatus.PROGRESS, new Date()); + TaskDTO taskWithNewProgress = createTask(1L, "title", "description", 100, TaskStatus.COMPLETE, new Date()); + + when(taskRepository.updateTaskProgress(1L, taskProgressView)).thenReturn(taskWithNewProgress); + + TaskDTO taskNew = updateTaskProgressService.execute(1L, taskProgressView); + + Assert.assertNotEquals(task.getProgress(), taskNew.getProgress()); + Assert.assertEquals(taskNew.getStatus(), TaskStatus.COMPLETE); + } + + @Test + public void shouldNotBeAbleToUpdateTaskProgressWhenProgressLessThanOneHundred() { + TaskProgressView taskProgressView = new TaskProgressView(-1); + TaskDTO task = createTask(1L, "title", "description", 10, TaskStatus.PROGRESS, new Date()); + TaskDTO taskWithNewProgress = createTask(1L, "title", "description", 10, TaskStatus.PROGRESS, new Date()); + + when(taskRepository.updateTaskProgress(1L, taskProgressView)).thenReturn(taskWithNewProgress); + + TaskDTO taskNew = updateTaskProgressService.execute(1L, taskProgressView); + + Assert.assertEquals(task.getProgress(), taskNew.getProgress()); + } + + @Test + public void shouldNotBeAbleToUpdateTaskProgressWhenProgressGreaterThanOneHundred() { + TaskProgressView taskProgressView = new TaskProgressView(101); + TaskDTO task = createTask(1L, "title", "description", 10, TaskStatus.PROGRESS, new Date()); + TaskDTO taskWithNewProgress = createTask(1L, "title", "description", 10, TaskStatus.COMPLETE, new Date()); - @Before - public void init() { - final ITaskRepository taskRepository = new TaskRepository(); + when(taskRepository.updateTaskProgress(1L, taskProgressView)).thenReturn(taskWithNewProgress); - updateTaskProgressService = new UpdateTaskProgressService(taskRepository); - } + TaskDTO taskNew = updateTaskProgressService.execute(1L, taskProgressView); - @Test - public void shouldBeAbleToUpdateTaskProgress() { - /* - TODO: Para que esse teste passe, sua aplicação deve permitir que sejam - alterados apenas o campo `progress`. - */ - } + Assert.assertEquals(task.getProgress(), taskNew.getProgress()); + } - @Test - public void shouldBeAbleToUpdateOnlyTaskStatusWhenProgressEqualsOneHundred() { - /* - TODO: Para que esse teste passe, sua aplicação deve permitir que sejam - alterado apenas o campo `status`, quando o progresso for igual a 100. - */ - } + public TaskDTO createTask(long id, String title, String description, int progress, TaskStatus status, Date createdAt) { + Task task = new Task(); + task.setId(id); + task.setTitle(title); + task.setDescription(description); + task.setProgress(progress); + task.setStatus(status); + task.setCreatedAt(createdAt); + return new TaskDTO(task); + } } diff --git a/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java b/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java index b587492..3dccfd5 100644 --- a/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java +++ b/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java @@ -1,51 +1,91 @@ package backend.challenge.modules.task.services; +import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.enums.TaskStatus; +import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.repositories.ITaskRepository; -import backend.challenge.modules.task.repositories.TaskRepository; import kikaha.core.test.KikahaRunner; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; -@RunWith( KikahaRunner.class ) +import java.util.Date; + +import static org.junit.Assert.*; +import static org.mockito.Matchers.*; +import static org.mockito.Mockito.when; + +@RunWith(KikahaRunner.class) public class UpdateTaskServiceTest { - private IUpdateTaskService updateTaskService; + private IUpdateTaskService updateTaskService; + + @Mock + private ITaskRepository taskRepository; + + private TaskDTO existingTask; + private TaskDTO updatedTask; + private TaskDTO taskAfterUpdate; + private TaskDTO taskBeforeUpdate; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + updateTaskService = new UpdateTaskService(taskRepository); + existingTask = new TaskDTO("title", "description"); + updatedTask = new TaskDTO("title alterado", "description alterado"); + + taskBeforeUpdate = createTask(1L, "title", "description", 0, TaskStatus.PROGRESS, new Date()); + taskAfterUpdate = createTask(1L, "title alterado", "description alterado", 0, TaskStatus.PROGRESS, new Date()); + } + + @Test + public void shouldBeAbleToUpdateTaskTitleAndDescription() { + when(taskRepository.index(1L)).thenReturn(taskBeforeUpdate); + when(this.taskRepository.update(updatedTask, 1L)).thenReturn(taskAfterUpdate); + TaskDTO updated = updateTaskService.execute(updatedTask, 1L); + + assertNotEquals("O título da tarefa deve ser alterado", existingTask.getTitle(), updated.getTitle()); + assertNotEquals("A descrição da tarefa deve ser alterada", existingTask.getDescription(), updated.getDescription()); + } - @Before - public void init() { - final ITaskRepository taskRepository = new TaskRepository(); + @Test + public void shouldNotBeAbleToUpdateNonExistingTask() { + long nonExistingTaskId = 5101162744757410452L; + when(taskRepository.index(nonExistingTaskId)).thenReturn(null); - updateTaskService = new UpdateTaskService(taskRepository); - } + TaskDTO task = taskRepository.update(updatedTask, nonExistingTaskId); + assertNull(task); + } - @Test - public void shouldBeAbleToUpdateTask() { - /* - TODO: Para que esse teste passe, sua aplicação deve permitir que sejam - alterados apenas os campos `title` e `observation`. - */ - } + @Test + public void shouldNotBeAbleToUpdateATaskThatDoesNotExist() { + long nonExistingTaskId = 5101162744757410452L; + when(taskRepository.index(nonExistingTaskId)).thenReturn(null); - @Test - public void shouldNotBeAbleToUpdateATaskThatDoesNotExist() { - /* - TODO: Para que esse teste passe, você deve validar na sua rota de update se - o id da tarefa enviada pela url existe ou não. Caso não exista, retornar um erro com status 400. - */ - } + updateTaskService.execute(updatedTask, nonExistingTaskId); + } - @Test - public void shouldNotBeAbleToUpdateTaskStatusManually() { - /* - TODO: Para que esse teste passe, você não deve permitir que sua rota de update - altere diretamente o `status` dessa tarefa, mantendo o mesmo status que a tarefa - já possuía antes da atualização. Isso porque o único lugar que deve atualizar essa informação - é a rota responsável por alterar o progresso da tarefa. + @Test + public void shouldNotBeAbleToUpdateTaskStatusManually() { + when(taskRepository.index(1L)).thenReturn(taskBeforeUpdate); + when(this.taskRepository.update(updatedTask, 1L)).thenReturn(taskBeforeUpdate); - */ - } + TaskDTO updated = updateTaskService.execute(updatedTask, 1L); + assertEquals("O status da tarefa deve permanecer o mesmo", taskBeforeUpdate.getStatus(), updated.getStatus()); + } + public TaskDTO createTask(long id, String title, String description, int progress, TaskStatus status, Date createdAt) { + Task task = new Task(); + task.setId(id); + task.setTitle(title); + task.setDescription(description); + task.setProgress(progress); + task.setStatus(status); + task.setCreatedAt(createdAt); + return new TaskDTO(task); + } } \ No newline at end of file