From dc3aece665786382e83318cd53fa2e26c039c9a5 Mon Sep 17 00:00:00 2001 From: Carlos Silva Date: Sat, 27 Apr 2024 20:09:53 -0300 Subject: [PATCH 01/13] =?UTF-8?q?Implementa=C3=A7=C3=A3o=20de=20cria=C3=A7?= =?UTF-8?q?=C3=A3o=20das=20tarefas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/task/dtos/ITaskDtoFactory.java | 5 +++ .../modules/task/dtos/TaskDtoFactory.java | 12 +++++++ .../http/controllers/TaskController.java | 12 +++++-- .../modules/task/models/ITaskFactory.java | 8 +++++ .../modules/task/models/TaskFactory.java | 22 +++++++++++++ .../task/repositories/ITaskRepository.java | 3 +- .../task/repositories/TaskRepository.java | 18 ++++++++-- .../task/services/CreateTaskException.java | 8 +++++ .../task/services/CreateTaskService.java | 6 ++-- .../task/services/ICreateTaskService.java | 2 +- .../task/services/CreateTaskServiceTest.java | 33 ++++++++++++++++--- 11 files changed, 113 insertions(+), 16 deletions(-) create mode 100644 source/backend/challenge/modules/task/dtos/ITaskDtoFactory.java create mode 100644 source/backend/challenge/modules/task/dtos/TaskDtoFactory.java create mode 100644 source/backend/challenge/modules/task/models/ITaskFactory.java create mode 100644 source/backend/challenge/modules/task/models/TaskFactory.java create mode 100644 source/backend/challenge/modules/task/services/CreateTaskException.java diff --git a/source/backend/challenge/modules/task/dtos/ITaskDtoFactory.java b/source/backend/challenge/modules/task/dtos/ITaskDtoFactory.java new file mode 100644 index 0000000..8fd5273 --- /dev/null +++ b/source/backend/challenge/modules/task/dtos/ITaskDtoFactory.java @@ -0,0 +1,5 @@ +package backend.challenge.modules.task.dtos; + +public interface ITaskDtoFactory { + public TaskDTO build(String title, String description); +} diff --git a/source/backend/challenge/modules/task/dtos/TaskDtoFactory.java b/source/backend/challenge/modules/task/dtos/TaskDtoFactory.java new file mode 100644 index 0000000..9a4ae81 --- /dev/null +++ b/source/backend/challenge/modules/task/dtos/TaskDtoFactory.java @@ -0,0 +1,12 @@ +package backend.challenge.modules.task.dtos; + +public class TaskDtoFactory implements ITaskDtoFactory{ + + @Override + public TaskDTO build(String title, String description) { + TaskDTO taskDTO = TaskDTO.create(); + taskDTO.setTitle(title); + taskDTO.setDescription(description); + return taskDTO; + } +} 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..8518ad2 100644 --- a/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java +++ b/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java @@ -1,5 +1,6 @@ package backend.challenge.modules.task.infra.http.controllers; +import backend.challenge.modules.task.dtos.TaskDtoFactory; import backend.challenge.modules.task.infra.http.views.TaskView; import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.services.*; @@ -7,6 +8,7 @@ import javax.inject.Inject; import javax.inject.Singleton; +import java.net.http.HttpRequest; @Singleton @Path("tasks") @@ -49,8 +51,14 @@ public Response index(@PathParam("taskId") Long 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"); + Task createdTask = null; + try { + createdTask = createTaskService.execute(new TaskDtoFactory().build(task.getTitle(), task.getDescription())); + } catch (CreateTaskException e) { + DefaultResponse.badRequest().entity(e.getMessage()); + throw new RuntimeException(e); + } + return DefaultResponse.ok().entity(createdTask); } @PUT diff --git a/source/backend/challenge/modules/task/models/ITaskFactory.java b/source/backend/challenge/modules/task/models/ITaskFactory.java new file mode 100644 index 0000000..a7871a4 --- /dev/null +++ b/source/backend/challenge/modules/task/models/ITaskFactory.java @@ -0,0 +1,8 @@ +package backend.challenge.modules.task.models; + +import backend.challenge.modules.task.dtos.TaskDTO; + +public interface ITaskFactory { + + public Task build(TaskDTO taskDTO); +} diff --git a/source/backend/challenge/modules/task/models/TaskFactory.java b/source/backend/challenge/modules/task/models/TaskFactory.java new file mode 100644 index 0000000..c34a86e --- /dev/null +++ b/source/backend/challenge/modules/task/models/TaskFactory.java @@ -0,0 +1,22 @@ +package backend.challenge.modules.task.models; + +import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.enums.TaskStatus; + +import java.util.Date; +import java.util.UUID; + +public class TaskFactory implements ITaskFactory{ + + @Override + public Task build(TaskDTO taskDTO) { + Task task = new Task(); + task.setId(Math.abs(UUID.randomUUID().getLeastSignificantBits())); + task.setTitle(taskDTO.getTitle()); + task.setDescription(taskDTO.getDescription()); + task.setProgress(0); + task.setStatus(TaskStatus.PROGRESS); + task.setCreatedAt(new Date()); + return task; + } +} diff --git a/source/backend/challenge/modules/task/repositories/ITaskRepository.java b/source/backend/challenge/modules/task/repositories/ITaskRepository.java index 527450a..d4ed771 100644 --- a/source/backend/challenge/modules/task/repositories/ITaskRepository.java +++ b/source/backend/challenge/modules/task/repositories/ITaskRepository.java @@ -2,6 +2,7 @@ import backend.challenge.modules.task.dtos.TaskDTO; import backend.challenge.modules.task.models.Task; +import backend.challenge.modules.task.services.CreateTaskException; import java.util.List; @@ -9,7 +10,7 @@ public interface ITaskRepository { Task index(Long taskId); List show(); - Task create(TaskDTO taskDTO); + Task create(TaskDTO taskDTO) throws CreateTaskException; Task update(Task task); void delete(Long taskId); diff --git a/source/backend/challenge/modules/task/repositories/TaskRepository.java b/source/backend/challenge/modules/task/repositories/TaskRepository.java index c47c8fd..6702477 100644 --- a/source/backend/challenge/modules/task/repositories/TaskRepository.java +++ b/source/backend/challenge/modules/task/repositories/TaskRepository.java @@ -2,13 +2,18 @@ import backend.challenge.modules.task.dtos.TaskDTO; import backend.challenge.modules.task.models.Task; +import backend.challenge.modules.task.models.TaskFactory; +import backend.challenge.modules.task.services.CreateTaskException; import javax.inject.Singleton; +import java.util.ArrayList; import java.util.List; @Singleton public class TaskRepository implements ITaskRepository { + List taskList = new ArrayList<>(); + @Override public Task index(final Long taskId) { // TODO: Criar método responsável por retornar tarefa por id @@ -24,10 +29,12 @@ public List show() { } @Override - public Task create(final TaskDTO taskDTO) { + public Task create(final TaskDTO taskDTO) throws CreateTaskException { // TODO: Criar método responsável por criar uma tarefa - - return null; + validate(taskDTO); + Task task = new TaskFactory().build(taskDTO); + taskList.add(task); + return task; } @Override @@ -43,4 +50,9 @@ public void delete(final Long taskId) { } + private static void validate(TaskDTO taskDTO) throws CreateTaskException { + if (taskDTO.getTitle().trim().isEmpty()) { + throw new CreateTaskException("Title cannot be empty"); + } + } } diff --git a/source/backend/challenge/modules/task/services/CreateTaskException.java b/source/backend/challenge/modules/task/services/CreateTaskException.java new file mode 100644 index 0000000..53e2a22 --- /dev/null +++ b/source/backend/challenge/modules/task/services/CreateTaskException.java @@ -0,0 +1,8 @@ +package backend.challenge.modules.task.services; + +public class CreateTaskException extends Exception{ + + public CreateTaskException(String message) { + super(message); + } +} diff --git a/source/backend/challenge/modules/task/services/CreateTaskService.java b/source/backend/challenge/modules/task/services/CreateTaskService.java index 46b144b..05f9651 100644 --- a/source/backend/challenge/modules/task/services/CreateTaskService.java +++ b/source/backend/challenge/modules/task/services/CreateTaskService.java @@ -18,10 +18,8 @@ public CreateTaskService(final ITaskRepository taskRepository) { } @Override - public Task execute(TaskDTO taskDTO) { + public Task execute(TaskDTO taskDTO) throws CreateTaskException { // TODO: Criar serviço responsável por criar uma tarefa - - return null; + return 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..abbcd16 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); + Task execute(TaskDTO taskDTO) throws CreateTaskException; } diff --git a/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java b/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java index 684dc44..81f7393 100644 --- a/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java +++ b/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java @@ -1,13 +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; +import static org.junit.Assert.assertThrows; + @RunWith( KikahaRunner.class ) public class CreateTaskServiceTest { @@ -21,12 +25,31 @@ public void init() { } @Test - public void shouldBeAbleToCreateANewTask() { + public void shouldBeAbleToCreateANewTask() throws CreateTaskException { // TODO: Para que esse teste passe, sua aplicação deve permitir que // uma tarefa seja criado, e retorne um json com a tarefa criada. + final String expectedTitle = "Compras"; + final String expectedDescription = "Comprar presente para minha esposa"; + TaskDTO taskDTO = TaskDTO.create(); + taskDTO.setTitle(expectedTitle); + taskDTO.setDescription(expectedDescription); + Task task = createTaskService.execute(taskDTO); + Assert.assertNotNull(task.getId()); + Assert.assertEquals(task.getTitle(), expectedTitle); + Assert.assertEquals(task.getDescription(), expectedDescription); } - - - + @Test + public void ShouldNotBeAbleToCreateNewTaskWithEmptyTitle() throws CreateTaskException { + final String expectedTitle = ""; + final String expectedDescription = "Comprar presente para minha esposa"; + TaskDTO taskDTO = TaskDTO.create(); + taskDTO.setTitle(expectedTitle); + taskDTO.setDescription(expectedDescription); + Exception exception = assertThrows(CreateTaskException.class, () ->{ + createTaskService.execute(taskDTO); + }); + final String expectedMessage = "Title cannot be empty"; + Assert.assertTrue(exception.getMessage().contains(expectedMessage)); + } } \ No newline at end of file From 1a80a942e68088cdc9b18984d7aff90b89f86b57 Mon Sep 17 00:00:00 2001 From: Carlos Silva Date: Sat, 27 Apr 2024 22:03:27 -0300 Subject: [PATCH 02/13] =?UTF-8?q?Implementa=C3=A7=C3=A3o=20para=20buscar?= =?UTF-8?q?=20tarefa=20pelo=20ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 ++++ .../http/controllers/TaskController.java | 18 ++++++++--- .../challenge/modules/task/models/Task.java | 2 ++ .../task/repositories/ITaskRepository.java | 5 +-- .../task/repositories/TaskRepository.java | 15 ++++++--- .../task/services/CreateTaskService.java | 1 + .../task/services/ICreateTaskService.java | 1 + .../services/IRetrieveTaskByIdService.java | 3 +- .../task/services/RetriveTaskByIdService.java | 24 ++++++++++++++ .../{ => exceptions}/CreateTaskException.java | 2 +- .../exceptions/RetriveTaskException.java | 7 +++++ .../task/services/CreateTaskServiceTest.java | 1 + .../services/RetrieveTaskByIdServiceTest.java | 31 ++++++++++++++++++- 13 files changed, 101 insertions(+), 15 deletions(-) create mode 100644 source/backend/challenge/modules/task/services/RetriveTaskByIdService.java rename source/backend/challenge/modules/task/services/{ => exceptions}/CreateTaskException.java (69%) create mode 100644 source/backend/challenge/modules/task/services/exceptions/RetriveTaskException.java diff --git a/pom.xml b/pom.xml index 53ab393..f304050 100644 --- a/pom.xml +++ b/pom.xml @@ -66,6 +66,12 @@ ${version.junit} test + + org.mockito + mockito-core + ${version.mockito} + test + org.projectlombok 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 8518ad2..1e7fc64 100644 --- a/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java +++ b/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java @@ -4,11 +4,12 @@ import backend.challenge.modules.task.infra.http.views.TaskView; import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.services.*; +import backend.challenge.modules.task.services.exceptions.CreateTaskException; +import backend.challenge.modules.task.services.exceptions.RetriveTaskException; import kikaha.urouting.api.*; import javax.inject.Inject; import javax.inject.Singleton; -import java.net.http.HttpRequest; @Singleton @Path("tasks") @@ -24,12 +25,13 @@ public class TaskController { public TaskController( final ICreateTaskService createTaskService, final IDeleteTaskService deleteTaskService, - final IRetrieveAllTasksService retrieveAllTasksService + final IRetrieveAllTasksService retrieveAllTasksService, + final IRetrieveTaskByIdService retrieveTaskByIdService ) { this.createTaskService = createTaskService; this.deleteTaskService = deleteTaskService; this.retrieveAllTasksService = retrieveAllTasksService; - this.retrieveTaskByIdService = null; + this.retrieveTaskByIdService = retrieveTaskByIdService; this.updateTaskService = null; } @@ -44,8 +46,14 @@ public Response show() { @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"); + Task retrivedTask = null; + try { + retrivedTask = retrieveTaskByIdService.execute(taskId); + } catch (RetriveTaskException e) { + DefaultResponse.notFound().entity(e.getMessage()); + throw new RuntimeException(e); + } + return DefaultResponse.ok().entity(retrivedTask); } @POST diff --git a/source/backend/challenge/modules/task/models/Task.java b/source/backend/challenge/modules/task/models/Task.java index 123f10c..f1d750e 100644 --- a/source/backend/challenge/modules/task/models/Task.java +++ b/source/backend/challenge/modules/task/models/Task.java @@ -1,6 +1,7 @@ package backend.challenge.modules.task.models; import backend.challenge.modules.task.enums.TaskStatus; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.RequiredArgsConstructor; @@ -18,6 +19,7 @@ public class Task { private String description; private int progress; private TaskStatus status; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") private Date createdAt; } diff --git a/source/backend/challenge/modules/task/repositories/ITaskRepository.java b/source/backend/challenge/modules/task/repositories/ITaskRepository.java index d4ed771..ad020f9 100644 --- a/source/backend/challenge/modules/task/repositories/ITaskRepository.java +++ b/source/backend/challenge/modules/task/repositories/ITaskRepository.java @@ -2,13 +2,14 @@ import backend.challenge.modules.task.dtos.TaskDTO; import backend.challenge.modules.task.models.Task; -import backend.challenge.modules.task.services.CreateTaskException; +import backend.challenge.modules.task.services.exceptions.CreateTaskException; +import backend.challenge.modules.task.services.exceptions.RetriveTaskException; import java.util.List; public interface ITaskRepository { - Task index(Long taskId); + Task index(Long taskId) throws RetriveTaskException; List show(); Task create(TaskDTO taskDTO) throws CreateTaskException; Task update(Task task); diff --git a/source/backend/challenge/modules/task/repositories/TaskRepository.java b/source/backend/challenge/modules/task/repositories/TaskRepository.java index 6702477..0e778d4 100644 --- a/source/backend/challenge/modules/task/repositories/TaskRepository.java +++ b/source/backend/challenge/modules/task/repositories/TaskRepository.java @@ -3,11 +3,13 @@ import backend.challenge.modules.task.dtos.TaskDTO; import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.models.TaskFactory; -import backend.challenge.modules.task.services.CreateTaskException; +import backend.challenge.modules.task.services.exceptions.CreateTaskException; +import backend.challenge.modules.task.services.exceptions.RetriveTaskException; import javax.inject.Singleton; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; @Singleton public class TaskRepository implements ITaskRepository { @@ -15,10 +17,13 @@ public class TaskRepository implements ITaskRepository { List taskList = new ArrayList<>(); @Override - public Task index(final Long taskId) { + public Task index(final Long taskId) throws RetriveTaskException { // TODO: Criar método responsável por retornar tarefa por id - - return null; + List retrivedtask = taskList.stream().filter(task -> task.getId().equals(taskId)).collect(Collectors.toList()); + if (retrivedtask.isEmpty()) { + throw new RetriveTaskException("Tarefa não encontrada"); + } + return retrivedtask.get(0); } @Override @@ -52,7 +57,7 @@ public void delete(final Long taskId) { private static void validate(TaskDTO taskDTO) throws CreateTaskException { if (taskDTO.getTitle().trim().isEmpty()) { - throw new CreateTaskException("Title cannot be empty"); + throw new CreateTaskException("Titulo não pode ser vazio"); } } } diff --git a/source/backend/challenge/modules/task/services/CreateTaskService.java b/source/backend/challenge/modules/task/services/CreateTaskService.java index 05f9651..acaebd9 100644 --- a/source/backend/challenge/modules/task/services/CreateTaskService.java +++ b/source/backend/challenge/modules/task/services/CreateTaskService.java @@ -3,6 +3,7 @@ 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.services.exceptions.CreateTaskException; import javax.inject.Inject; import javax.inject.Singleton; diff --git a/source/backend/challenge/modules/task/services/ICreateTaskService.java b/source/backend/challenge/modules/task/services/ICreateTaskService.java index abbcd16..bc5436f 100644 --- a/source/backend/challenge/modules/task/services/ICreateTaskService.java +++ b/source/backend/challenge/modules/task/services/ICreateTaskService.java @@ -2,6 +2,7 @@ import backend.challenge.modules.task.dtos.TaskDTO; import backend.challenge.modules.task.models.Task; +import backend.challenge.modules.task.services.exceptions.CreateTaskException; public interface ICreateTaskService { diff --git a/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java b/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java index 192e28c..d35b2e8 100644 --- a/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java +++ b/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java @@ -1,9 +1,10 @@ package backend.challenge.modules.task.services; import backend.challenge.modules.task.models.Task; +import backend.challenge.modules.task.services.exceptions.RetriveTaskException; public interface IRetrieveTaskByIdService { - Task execute(Long taskId); + Task execute(Long taskId) throws RetriveTaskException; } diff --git a/source/backend/challenge/modules/task/services/RetriveTaskByIdService.java b/source/backend/challenge/modules/task/services/RetriveTaskByIdService.java new file mode 100644 index 0000000..55d31d8 --- /dev/null +++ b/source/backend/challenge/modules/task/services/RetriveTaskByIdService.java @@ -0,0 +1,24 @@ +package backend.challenge.modules.task.services; + +import backend.challenge.modules.task.models.Task; +import backend.challenge.modules.task.repositories.ITaskRepository; +import backend.challenge.modules.task.services.exceptions.RetriveTaskException; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +public class RetriveTaskByIdService implements IRetrieveTaskByIdService { + + private final ITaskRepository taskRepository; + + @Inject + public RetriveTaskByIdService(ITaskRepository taskRepository) { + this.taskRepository = taskRepository; + } + + @Override + public Task execute(Long taskId) throws RetriveTaskException { + return taskRepository.index(taskId); + } +} diff --git a/source/backend/challenge/modules/task/services/CreateTaskException.java b/source/backend/challenge/modules/task/services/exceptions/CreateTaskException.java similarity index 69% rename from source/backend/challenge/modules/task/services/CreateTaskException.java rename to source/backend/challenge/modules/task/services/exceptions/CreateTaskException.java index 53e2a22..baa92fa 100644 --- a/source/backend/challenge/modules/task/services/CreateTaskException.java +++ b/source/backend/challenge/modules/task/services/exceptions/CreateTaskException.java @@ -1,4 +1,4 @@ -package backend.challenge.modules.task.services; +package backend.challenge.modules.task.services.exceptions; public class CreateTaskException extends Exception{ diff --git a/source/backend/challenge/modules/task/services/exceptions/RetriveTaskException.java b/source/backend/challenge/modules/task/services/exceptions/RetriveTaskException.java new file mode 100644 index 0000000..8a3c9f3 --- /dev/null +++ b/source/backend/challenge/modules/task/services/exceptions/RetriveTaskException.java @@ -0,0 +1,7 @@ +package backend.challenge.modules.task.services.exceptions; + +public class RetriveTaskException extends Exception{ + public RetriveTaskException(String message) { + super(message); + } +} diff --git a/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java b/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java index 81f7393..4df82c4 100644 --- a/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java +++ b/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java @@ -4,6 +4,7 @@ import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.repositories.ITaskRepository; import backend.challenge.modules.task.repositories.TaskRepository; +import backend.challenge.modules.task.services.exceptions.CreateTaskException; import kikaha.core.test.KikahaRunner; import org.junit.Assert; import org.junit.Before; diff --git a/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java b/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java index eb96b15..f24322f 100644 --- a/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java +++ b/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java @@ -1,24 +1,53 @@ package backend.challenge.modules.task.services; +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 backend.challenge.modules.task.services.exceptions.RetriveTaskException; +import com.sun.source.tree.AssertTree; 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.Date; + +import static org.mockito.Mockito.when; @RunWith( KikahaRunner.class ) public class RetrieveTaskByIdServiceTest { private IRetrieveTaskByIdService retrieveTaskByIdService; + @Mock + final ITaskRepository taskRepository = new TaskRepository(); + private final Task task = new Task(); + private final Long TASK_ID = 6679377763735439322L; + + @Before + public void Iinit() { + MockitoAnnotations.initMocks(this); + retrieveTaskByIdService = new RetriveTaskByIdService(taskRepository); + task.setId(TASK_ID); + task.setTitle("Compras"); + task.setDescription("Comprar presente para minha esposa"); + task.setProgress(0); + task.setStatus(TaskStatus.PROGRESS); + task.setCreatedAt(new Date()); + } @Test - public void shouldBeAbleToListTheTaskById() { + public void shouldBeAbleToListTheTaskById() throws RetriveTaskException { /* TODO: Para que esse teste passe, sua aplicação deve permitir que seja retornado uma tarefa com o mesmo id informado. */ + when(taskRepository.index(TASK_ID)).thenReturn(task); + Assert.assertEquals(retrieveTaskByIdService.execute(TASK_ID), task); } } From a2eeac3bcee0f2ee82be124122ffe5252207b57a Mon Sep 17 00:00:00 2001 From: Carlos Silva Date: Sat, 27 Apr 2024 23:03:20 -0300 Subject: [PATCH 03/13] =?UTF-8?q?Implementa=C3=A7=C3=A3o=20para=20buscar?= =?UTF-8?q?=20todas=20as=20tarefas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../http/controllers/TaskController.java | 3 +-- .../task/repositories/TaskRepository.java | 3 +-- .../services/RetrieveAllTasksService.java | 3 +-- .../services/RetrieveAllTasksServiceTest.java | 26 ++++++++++++++++--- 4 files changed, 26 insertions(+), 9 deletions(-) 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 1e7fc64..7cfa85f 100644 --- a/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java +++ b/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java @@ -38,8 +38,7 @@ public TaskController( @GET public Response show() { // TODO: Rota que lista todas as tarefas - - return DefaultResponse.ok().entity("Hello world"); + return DefaultResponse.ok().entity(retrieveAllTasksService.execute()); } @GET diff --git a/source/backend/challenge/modules/task/repositories/TaskRepository.java b/source/backend/challenge/modules/task/repositories/TaskRepository.java index 0e778d4..90d36b2 100644 --- a/source/backend/challenge/modules/task/repositories/TaskRepository.java +++ b/source/backend/challenge/modules/task/repositories/TaskRepository.java @@ -29,8 +29,7 @@ public Task index(final Long taskId) throws RetriveTaskException { @Override public List show() { // TODO: Criar método responsável por retornar todas as tarefas - - return null; + return taskList; } @Override diff --git a/source/backend/challenge/modules/task/services/RetrieveAllTasksService.java b/source/backend/challenge/modules/task/services/RetrieveAllTasksService.java index 52a4149..db6a388 100644 --- a/source/backend/challenge/modules/task/services/RetrieveAllTasksService.java +++ b/source/backend/challenge/modules/task/services/RetrieveAllTasksService.java @@ -20,8 +20,7 @@ public RetrieveAllTasksService(final ITaskRepository taskRepository) { @Override public List execute() { // TODO: Criar serviço responsável por recuperar todas as tarefas - - return null; + return taskRepository.show(); } } diff --git a/tests/backend/challenge/modules/task/services/RetrieveAllTasksServiceTest.java b/tests/backend/challenge/modules/task/services/RetrieveAllTasksServiceTest.java index 68f0012..9589b4e 100644 --- a/tests/backend/challenge/modules/task/services/RetrieveAllTasksServiceTest.java +++ b/tests/backend/challenge/modules/task/services/RetrieveAllTasksServiceTest.java @@ -1,23 +1,41 @@ package backend.challenge.modules.task.services; +import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.dtos.TaskDtoFactory; +import backend.challenge.modules.task.models.Task; +import backend.challenge.modules.task.models.TaskFactory; 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; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.ArrayList; +import java.util.List; + +import static org.mockito.Mockito.when; @RunWith( KikahaRunner.class ) public class RetrieveAllTasksServiceTest { private IRetrieveAllTasksService retrieveAllTasksService; + @Mock + final ITaskRepository taskRepository = new TaskRepository(); + List taskList = new ArrayList<>(); + @Before public void init() { - final ITaskRepository taskRepository = new TaskRepository(); - + MockitoAnnotations.initMocks(this); retrieveAllTasksService = new RetrieveAllTasksService(taskRepository); + for (int i = 0; i < 5; i++) { + TaskDTO taskDTO = new TaskDtoFactory().build("tarefa"+i, ""); + taskList.add(new TaskFactory().build(taskDTO)); + } } @Test @@ -26,6 +44,8 @@ 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. */ + when(taskRepository.show()).thenReturn(taskList); + Assert.assertEquals(retrieveAllTasksService.execute().size(), 5); } } \ No newline at end of file From 8a6a71ebf3c836e25887137bf50804ad0499fc6b Mon Sep 17 00:00:00 2001 From: Carlos Silva Date: Sun, 28 Apr 2024 01:16:26 -0300 Subject: [PATCH 04/13] =?UTF-8?q?Implementa=C3=A7=C3=A3o=20da=20atualiza?= =?UTF-8?q?=C3=A7=C3=A3o=20das=20tarefas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../http/controllers/TaskController.java | 17 ++++-- .../task/repositories/TaskRepository.java | 9 ++- .../task/services/IUpdateTaskService.java | 3 +- .../task/services/UpdateTaskService.java | 27 +++++++++ .../task/services/UpdateTaskServiceTest.java | 60 ++++++++++++++++++- 5 files changed, 107 insertions(+), 9 deletions(-) create mode 100644 source/backend/challenge/modules/task/services/UpdateTaskService.java 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 7cfa85f..d26a042 100644 --- a/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java +++ b/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java @@ -26,13 +26,14 @@ public TaskController( final ICreateTaskService createTaskService, final IDeleteTaskService deleteTaskService, final IRetrieveAllTasksService retrieveAllTasksService, - final IRetrieveTaskByIdService retrieveTaskByIdService + final IRetrieveTaskByIdService retrieveTaskByIdService, + final IUpdateTaskService updateTaskService ) { this.createTaskService = createTaskService; this.deleteTaskService = deleteTaskService; this.retrieveAllTasksService = retrieveAllTasksService; this.retrieveTaskByIdService = retrieveTaskByIdService; - this.updateTaskService = null; + this.updateTaskService = updateTaskService; } @GET @@ -75,9 +76,15 @@ 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"); - } + Task updatedTask = null; + try { + updatedTask = updateTaskService.execute(taskId, task); + } catch (RetriveTaskException e) { + DefaultResponse.badRequest().entity(e.getMessage()); + throw new RuntimeException(e); + } + return DefaultResponse.ok().entity(updatedTask); + } @DELETE @Path("single/{taskId}") diff --git a/source/backend/challenge/modules/task/repositories/TaskRepository.java b/source/backend/challenge/modules/task/repositories/TaskRepository.java index 90d36b2..32956e2 100644 --- a/source/backend/challenge/modules/task/repositories/TaskRepository.java +++ b/source/backend/challenge/modules/task/repositories/TaskRepository.java @@ -44,8 +44,13 @@ public Task create(final TaskDTO taskDTO) throws CreateTaskException { @Override public Task update(final Task task) { // TODO: Criar método responsável por atualizar uma tarefa - - return null; + taskList.forEach(rawTask -> { + if (rawTask.getId().equals(task.getId())){ + rawTask.setTitle(task.getTitle()); + rawTask.setDescription(task.getDescription()); + } + }); + return task; } @Override diff --git a/source/backend/challenge/modules/task/services/IUpdateTaskService.java b/source/backend/challenge/modules/task/services/IUpdateTaskService.java index 3da8340..4b4c79d 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.models.Task; +import backend.challenge.modules.task.services.exceptions.RetriveTaskException; public interface IUpdateTaskService { - Task execute(Task task); + Task execute(Long taskId, Task task) throws RetriveTaskException; } diff --git a/source/backend/challenge/modules/task/services/UpdateTaskService.java b/source/backend/challenge/modules/task/services/UpdateTaskService.java new file mode 100644 index 0000000..86b32ec --- /dev/null +++ b/source/backend/challenge/modules/task/services/UpdateTaskService.java @@ -0,0 +1,27 @@ +package backend.challenge.modules.task.services; + +import backend.challenge.modules.task.models.Task; +import backend.challenge.modules.task.repositories.ITaskRepository; +import backend.challenge.modules.task.services.exceptions.RetriveTaskException; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +public class UpdateTaskService implements IUpdateTaskService { + + private final ITaskRepository taskRepository; + + @Inject + public UpdateTaskService(ITaskRepository taskRepository) { + this.taskRepository = taskRepository; + } + + @Override + public Task execute(Long taskId, Task task) throws RetriveTaskException { + final Task retrivedTask = taskRepository.index(taskId); + retrivedTask.setTitle(task.getTitle()); + retrivedTask.setDescription(task.getDescription()); + return taskRepository.update(retrivedTask); + } +} diff --git a/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java b/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java index 53a4082..2043d2d 100644 --- a/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java +++ b/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java @@ -1,24 +1,82 @@ package backend.challenge.modules.task.services; +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 backend.challenge.modules.task.services.exceptions.RetriveTaskException; 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; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.Date; + +import static org.mockito.Matchers.anyLong; +import static org.mockito.Matchers.anyObject; +import static org.mockito.Mockito.when; @RunWith( KikahaRunner.class ) public class UpdateTaskServiceTest { private IUpdateTaskService updateTaskService; + @Mock + private ITaskRepository taskRepository = new TaskRepository(); + private final Task retrivedTask = new Task(); + private final Task taskChanges = new Task(); + private final Task updatedTask = new Task(); + private final Long TASK_ID = 8567032865818388301L; + private final String OLD_TASk_TITLE = "Trabalho"; + private final String OLD_TASk_DESCRIPTION = "Capinar meu terreno"; + + @Before + public void init() { + MockitoAnnotations.initMocks(this); + updateTaskService = new UpdateTaskService(taskRepository); + + retrivedTask.setId(TASK_ID); + retrivedTask.setTitle(OLD_TASk_TITLE); + retrivedTask.setDescription(OLD_TASk_DESCRIPTION); + retrivedTask.setProgress(50); + retrivedTask.setStatus(TaskStatus.PROGRESS); + retrivedTask.setCreatedAt(new Date()); + + taskChanges.setId(6714351139364770828L); + taskChanges.setTitle("Compras"); + taskChanges.setDescription("Comprar presente pra minha esposa"); + taskChanges.setProgress(0); + taskChanges.setStatus(TaskStatus.PROGRESS); + taskChanges.setCreatedAt(new Date()); + + updatedTask.setId(TASK_ID); + updatedTask.setTitle("Compras"); + updatedTask.setDescription("Comprar presente pra minha esposa"); + updatedTask.setProgress(50); + updatedTask.setStatus(TaskStatus.PROGRESS); + updatedTask.setCreatedAt(new Date()); + } + @Test - public void shouldBeAbleToUpdateTask() { + public void shouldBeAbleToUpdateTask() throws RetriveTaskException { /* TODO: Para que esse teste passe, sua aplicação deve permitir que sejam alterados apenas os campos `title` e `observation`. */ + when(taskRepository.index(anyLong())).thenReturn(retrivedTask); + when(taskRepository.update(anyObject())).thenReturn(updatedTask); + final Task task = updateTaskService.execute(TASK_ID, taskChanges); + Assert.assertEquals(task.getId(), retrivedTask.getId()); + Assert.assertEquals(task.getProgress(), retrivedTask.getProgress()); + Assert.assertEquals(task.getStatus(), retrivedTask.getStatus()); + Assert.assertEquals(task.getCreatedAt(), retrivedTask.getCreatedAt()); + Assert.assertNotEquals(task.getTitle(), OLD_TASk_TITLE); + Assert.assertNotEquals(task.getDescription(), OLD_TASk_DESCRIPTION); + } @Test From d6fda4135560551de28319c3aa8ec8fa18eb5648 Mon Sep 17 00:00:00 2001 From: Carlos Silva Date: Sun, 28 Apr 2024 02:36:48 -0300 Subject: [PATCH 05/13] =?UTF-8?q?Implementa=C3=A7=C3=A3o=20para=20retornar?= =?UTF-8?q?=20404=20quando=20n=C3=A3o=20encrar=20a=20tarefa=20pelo=20ID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../http/controllers/TaskController.java | 20 +++++-------------- .../task/repositories/ITaskRepository.java | 2 +- .../task/repositories/TaskRepository.java | 9 +++++---- .../services/IRetrieveTaskByIdService.java | 2 +- .../task/services/IUpdateTaskService.java | 3 ++- .../task/services/RetriveTaskByIdService.java | 2 +- .../task/services/UpdateTaskService.java | 10 ++++++---- .../exceptions/RetriveTaskException.java | 1 + .../services/RetrieveTaskByIdServiceTest.java | 2 +- .../task/services/UpdateTaskServiceTest.java | 11 ++++++++-- 10 files changed, 32 insertions(+), 30 deletions(-) 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 d26a042..784d541 100644 --- a/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java +++ b/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java @@ -46,13 +46,10 @@ public Response show() { @Path("single/{taskId}") public Response index(@PathParam("taskId") Long taskId) { // TODO: A rota deve retornar somente a tarefa a qual o id corresponder - Task retrivedTask = null; - try { - retrivedTask = retrieveTaskByIdService.execute(taskId); - } catch (RetriveTaskException e) { - DefaultResponse.notFound().entity(e.getMessage()); - throw new RuntimeException(e); - } + Task retrivedTask = retrieveTaskByIdService.execute(taskId); + if(retrivedTask == null) { + return DefaultResponse.notFound().statusCode(404); + } return DefaultResponse.ok().entity(retrivedTask); } @@ -76,14 +73,7 @@ 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. */ - Task updatedTask = null; - try { - updatedTask = updateTaskService.execute(taskId, task); - } catch (RetriveTaskException e) { - DefaultResponse.badRequest().entity(e.getMessage()); - throw new RuntimeException(e); - } - return DefaultResponse.ok().entity(updatedTask); + return updateTaskService.execute(taskId, task); } @DELETE diff --git a/source/backend/challenge/modules/task/repositories/ITaskRepository.java b/source/backend/challenge/modules/task/repositories/ITaskRepository.java index ad020f9..84a97f0 100644 --- a/source/backend/challenge/modules/task/repositories/ITaskRepository.java +++ b/source/backend/challenge/modules/task/repositories/ITaskRepository.java @@ -9,7 +9,7 @@ public interface ITaskRepository { - Task index(Long taskId) throws RetriveTaskException; + Task index(Long taskId); List show(); Task create(TaskDTO taskDTO) throws CreateTaskException; Task update(Task task); diff --git a/source/backend/challenge/modules/task/repositories/TaskRepository.java b/source/backend/challenge/modules/task/repositories/TaskRepository.java index 32956e2..a72a4a6 100644 --- a/source/backend/challenge/modules/task/repositories/TaskRepository.java +++ b/source/backend/challenge/modules/task/repositories/TaskRepository.java @@ -17,13 +17,14 @@ public class TaskRepository implements ITaskRepository { List taskList = new ArrayList<>(); @Override - public Task index(final Long taskId) throws RetriveTaskException { + public Task index(final Long taskId){ // TODO: Criar método responsável por retornar tarefa por id List retrivedtask = taskList.stream().filter(task -> task.getId().equals(taskId)).collect(Collectors.toList()); - if (retrivedtask.isEmpty()) { - throw new RetriveTaskException("Tarefa não encontrada"); + Task task = null; + if (!retrivedtask.isEmpty()) { + task = retrivedtask.get(0); } - return retrivedtask.get(0); + return task; } @Override diff --git a/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java b/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java index d35b2e8..b9c8e0c 100644 --- a/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java +++ b/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java @@ -5,6 +5,6 @@ public interface IRetrieveTaskByIdService { - Task execute(Long taskId) throws RetriveTaskException; + Task execute(Long taskId); } diff --git a/source/backend/challenge/modules/task/services/IUpdateTaskService.java b/source/backend/challenge/modules/task/services/IUpdateTaskService.java index 4b4c79d..eac03b8 100644 --- a/source/backend/challenge/modules/task/services/IUpdateTaskService.java +++ b/source/backend/challenge/modules/task/services/IUpdateTaskService.java @@ -2,9 +2,10 @@ import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.services.exceptions.RetriveTaskException; +import kikaha.urouting.api.DefaultResponse; public interface IUpdateTaskService { - Task execute(Long taskId, Task task) throws RetriveTaskException; + DefaultResponse execute(Long taskId, Task task); } diff --git a/source/backend/challenge/modules/task/services/RetriveTaskByIdService.java b/source/backend/challenge/modules/task/services/RetriveTaskByIdService.java index 55d31d8..117d9d3 100644 --- a/source/backend/challenge/modules/task/services/RetriveTaskByIdService.java +++ b/source/backend/challenge/modules/task/services/RetriveTaskByIdService.java @@ -18,7 +18,7 @@ public RetriveTaskByIdService(ITaskRepository taskRepository) { } @Override - public Task execute(Long taskId) throws RetriveTaskException { + public Task execute(Long taskId) { return taskRepository.index(taskId); } } diff --git a/source/backend/challenge/modules/task/services/UpdateTaskService.java b/source/backend/challenge/modules/task/services/UpdateTaskService.java index 86b32ec..4549d2d 100644 --- a/source/backend/challenge/modules/task/services/UpdateTaskService.java +++ b/source/backend/challenge/modules/task/services/UpdateTaskService.java @@ -3,6 +3,7 @@ import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.repositories.ITaskRepository; import backend.challenge.modules.task.services.exceptions.RetriveTaskException; +import kikaha.urouting.api.DefaultResponse; import javax.inject.Inject; import javax.inject.Singleton; @@ -18,10 +19,11 @@ public UpdateTaskService(ITaskRepository taskRepository) { } @Override - public Task execute(Long taskId, Task task) throws RetriveTaskException { + public DefaultResponse execute(Long taskId, Task task) { final Task retrivedTask = taskRepository.index(taskId); - retrivedTask.setTitle(task.getTitle()); - retrivedTask.setDescription(task.getDescription()); - return taskRepository.update(retrivedTask); + if(retrivedTask == null) { + return DefaultResponse.notFound().statusCode(404); + } + return DefaultResponse.ok().entity(taskRepository.update(retrivedTask)); } } diff --git a/source/backend/challenge/modules/task/services/exceptions/RetriveTaskException.java b/source/backend/challenge/modules/task/services/exceptions/RetriveTaskException.java index 8a3c9f3..3e8a593 100644 --- a/source/backend/challenge/modules/task/services/exceptions/RetriveTaskException.java +++ b/source/backend/challenge/modules/task/services/exceptions/RetriveTaskException.java @@ -1,6 +1,7 @@ package backend.challenge.modules.task.services.exceptions; public class RetriveTaskException extends Exception{ + public RetriveTaskException(String message) { super(message); } diff --git a/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java b/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java index f24322f..f3e4e14 100644 --- a/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java +++ b/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java @@ -41,7 +41,7 @@ public void Iinit() { } @Test - public void shouldBeAbleToListTheTaskById() throws RetriveTaskException { + public void shouldBeAbleToListTheTaskById(){ /* TODO: Para que esse teste passe, sua aplicação deve permitir que seja retornado uma tarefa com o mesmo id informado. diff --git a/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java b/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java index 2043d2d..6046eb4 100644 --- a/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java +++ b/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java @@ -4,8 +4,10 @@ import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.repositories.ITaskRepository; import backend.challenge.modules.task.repositories.TaskRepository; +import backend.challenge.modules.task.services.exceptions.CreateTaskException; import backend.challenge.modules.task.services.exceptions.RetriveTaskException; import kikaha.core.test.KikahaRunner; +import kikaha.urouting.api.DefaultResponse; import org.junit.Assert; import org.junit.Before; import org.junit.Ignore; @@ -16,6 +18,7 @@ import java.util.Date; +import static org.junit.Assert.assertThrows; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.anyObject; import static org.mockito.Mockito.when; @@ -62,14 +65,15 @@ public void init() { } @Test - public void shouldBeAbleToUpdateTask() throws RetriveTaskException { + public void shouldBeAbleToUpdateTask() { /* TODO: Para que esse teste passe, sua aplicação deve permitir que sejam alterados apenas os campos `title` e `observation`. */ when(taskRepository.index(anyLong())).thenReturn(retrivedTask); when(taskRepository.update(anyObject())).thenReturn(updatedTask); - final Task task = updateTaskService.execute(TASK_ID, taskChanges); + final DefaultResponse defaultResponse = updateTaskService.execute(TASK_ID, taskChanges); + final Task task = (Task) defaultResponse.entity(); Assert.assertEquals(task.getId(), retrivedTask.getId()); Assert.assertEquals(task.getProgress(), retrivedTask.getProgress()); Assert.assertEquals(task.getStatus(), retrivedTask.getStatus()); @@ -85,6 +89,9 @@ 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. */ + final DefaultResponse defaultResponse = updateTaskService.execute(5101162744757410452L, taskChanges); + DefaultResponse expectedResponse = DefaultResponse.notFound().statusCode(404); + Assert.assertEquals(expectedResponse.statusCode(), defaultResponse.statusCode()); } @Test From 890e9a83e215f7b2ecc620d5babed93a1183bef5 Mon Sep 17 00:00:00 2001 From: Carlos Silva Date: Sun, 28 Apr 2024 02:48:08 -0300 Subject: [PATCH 06/13] =?UTF-8?q?Refatora=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/infra/http/controllers/TaskController.java | 7 +------ .../modules/task/repositories/TaskRepository.java | 1 - .../modules/task/services/IRetrieveTaskByIdService.java | 3 ++- .../modules/task/services/RetriveTaskByIdService.java | 9 +++++++-- .../modules/task/services/UpdateTaskService.java | 1 - .../task/services/RetrieveTaskByIdServiceTest.java | 5 ++++- .../modules/task/services/UpdateTaskServiceTest.java | 6 ++---- 7 files changed, 16 insertions(+), 16 deletions(-) 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 784d541..34042be 100644 --- a/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java +++ b/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java @@ -5,7 +5,6 @@ import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.services.*; import backend.challenge.modules.task.services.exceptions.CreateTaskException; -import backend.challenge.modules.task.services.exceptions.RetriveTaskException; import kikaha.urouting.api.*; import javax.inject.Inject; @@ -46,11 +45,7 @@ public Response show() { @Path("single/{taskId}") public Response index(@PathParam("taskId") Long taskId) { // TODO: A rota deve retornar somente a tarefa a qual o id corresponder - Task retrivedTask = retrieveTaskByIdService.execute(taskId); - if(retrivedTask == null) { - return DefaultResponse.notFound().statusCode(404); - } - return DefaultResponse.ok().entity(retrivedTask); + return retrieveTaskByIdService.execute(taskId); } @POST diff --git a/source/backend/challenge/modules/task/repositories/TaskRepository.java b/source/backend/challenge/modules/task/repositories/TaskRepository.java index a72a4a6..f2dc01f 100644 --- a/source/backend/challenge/modules/task/repositories/TaskRepository.java +++ b/source/backend/challenge/modules/task/repositories/TaskRepository.java @@ -4,7 +4,6 @@ import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.models.TaskFactory; import backend.challenge.modules.task.services.exceptions.CreateTaskException; -import backend.challenge.modules.task.services.exceptions.RetriveTaskException; import javax.inject.Singleton; import java.util.ArrayList; diff --git a/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java b/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java index b9c8e0c..dec07ef 100644 --- a/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java +++ b/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java @@ -2,9 +2,10 @@ import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.services.exceptions.RetriveTaskException; +import kikaha.urouting.api.DefaultResponse; public interface IRetrieveTaskByIdService { - Task execute(Long taskId); + DefaultResponse execute(Long taskId); } diff --git a/source/backend/challenge/modules/task/services/RetriveTaskByIdService.java b/source/backend/challenge/modules/task/services/RetriveTaskByIdService.java index 117d9d3..c59c88d 100644 --- a/source/backend/challenge/modules/task/services/RetriveTaskByIdService.java +++ b/source/backend/challenge/modules/task/services/RetriveTaskByIdService.java @@ -3,6 +3,7 @@ import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.repositories.ITaskRepository; import backend.challenge.modules.task.services.exceptions.RetriveTaskException; +import kikaha.urouting.api.DefaultResponse; import javax.inject.Inject; import javax.inject.Singleton; @@ -18,7 +19,11 @@ public RetriveTaskByIdService(ITaskRepository taskRepository) { } @Override - public Task execute(Long taskId) { - return taskRepository.index(taskId); + public DefaultResponse execute(Long taskId) { + final Task retrivedTask = taskRepository.index(taskId); + if(retrivedTask == null) { + return DefaultResponse.notFound().statusCode(404); + } + return DefaultResponse.ok().entity(retrivedTask); } } diff --git a/source/backend/challenge/modules/task/services/UpdateTaskService.java b/source/backend/challenge/modules/task/services/UpdateTaskService.java index 4549d2d..d291ba0 100644 --- a/source/backend/challenge/modules/task/services/UpdateTaskService.java +++ b/source/backend/challenge/modules/task/services/UpdateTaskService.java @@ -2,7 +2,6 @@ import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.repositories.ITaskRepository; -import backend.challenge.modules.task.services.exceptions.RetriveTaskException; import kikaha.urouting.api.DefaultResponse; import javax.inject.Inject; diff --git a/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java b/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java index f3e4e14..5510f9c 100644 --- a/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java +++ b/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java @@ -8,6 +8,7 @@ import backend.challenge.modules.task.services.exceptions.RetriveTaskException; import com.sun.source.tree.AssertTree; import kikaha.core.test.KikahaRunner; +import kikaha.urouting.api.DefaultResponse; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -47,7 +48,9 @@ public void shouldBeAbleToListTheTaskById(){ retornado uma tarefa com o mesmo id informado. */ when(taskRepository.index(TASK_ID)).thenReturn(task); - Assert.assertEquals(retrieveTaskByIdService.execute(TASK_ID), task); + final DefaultResponse defaultResponse = retrieveTaskByIdService.execute(TASK_ID); + Task retrivedTask = (Task) defaultResponse.entity(); + Assert.assertEquals(task.getId(), retrivedTask.getId()); } } diff --git a/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java b/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java index 6046eb4..e2f029e 100644 --- a/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java +++ b/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java @@ -4,13 +4,12 @@ import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.repositories.ITaskRepository; import backend.challenge.modules.task.repositories.TaskRepository; -import backend.challenge.modules.task.services.exceptions.CreateTaskException; -import backend.challenge.modules.task.services.exceptions.RetriveTaskException; + import kikaha.core.test.KikahaRunner; import kikaha.urouting.api.DefaultResponse; import org.junit.Assert; import org.junit.Before; -import org.junit.Ignore; + import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -18,7 +17,6 @@ import java.util.Date; -import static org.junit.Assert.assertThrows; import static org.mockito.Matchers.anyLong; import static org.mockito.Matchers.anyObject; import static org.mockito.Mockito.when; From d26504cfb363c3a91c151ac798acbf6a1ad1f295 Mon Sep 17 00:00:00 2001 From: Carlos Silva Date: Sun, 28 Apr 2024 03:18:12 -0300 Subject: [PATCH 07/13] Ajustes nos testes unitarios --- .../task/services/UpdateTaskService.java | 2 ++ .../task/services/UpdateTaskServiceTest.java | 26 ++++++++++--------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/source/backend/challenge/modules/task/services/UpdateTaskService.java b/source/backend/challenge/modules/task/services/UpdateTaskService.java index d291ba0..6567138 100644 --- a/source/backend/challenge/modules/task/services/UpdateTaskService.java +++ b/source/backend/challenge/modules/task/services/UpdateTaskService.java @@ -23,6 +23,8 @@ public DefaultResponse execute(Long taskId, Task task) { if(retrivedTask == null) { return DefaultResponse.notFound().statusCode(404); } + retrivedTask.setTitle(task.getTitle()); + retrivedTask.setDescription(task.getDescription()); return DefaultResponse.ok().entity(taskRepository.update(retrivedTask)); } } diff --git a/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java b/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java index e2f029e..1f42d54 100644 --- a/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java +++ b/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java @@ -32,6 +32,9 @@ public class UpdateTaskServiceTest { private final Task taskChanges = new Task(); private final Task updatedTask = new Task(); private final Long TASK_ID = 8567032865818388301L; + private final int TASK_PROGRESS = 50; + private final TaskStatus TASK_STATUS = TaskStatus.PROGRESS; + private final Date CREATE_AT = new Date(2024, 4, 28); private final String OLD_TASk_TITLE = "Trabalho"; private final String OLD_TASk_DESCRIPTION = "Capinar meu terreno"; @@ -43,23 +46,23 @@ public void init() { retrivedTask.setId(TASK_ID); retrivedTask.setTitle(OLD_TASk_TITLE); retrivedTask.setDescription(OLD_TASk_DESCRIPTION); - retrivedTask.setProgress(50); - retrivedTask.setStatus(TaskStatus.PROGRESS); - retrivedTask.setCreatedAt(new Date()); + retrivedTask.setProgress(TASK_PROGRESS); + retrivedTask.setStatus(TASK_STATUS); + retrivedTask.setCreatedAt(CREATE_AT); taskChanges.setId(6714351139364770828L); taskChanges.setTitle("Compras"); taskChanges.setDescription("Comprar presente pra minha esposa"); taskChanges.setProgress(0); taskChanges.setStatus(TaskStatus.PROGRESS); - taskChanges.setCreatedAt(new Date()); + taskChanges.setCreatedAt(CREATE_AT); updatedTask.setId(TASK_ID); updatedTask.setTitle("Compras"); updatedTask.setDescription("Comprar presente pra minha esposa"); updatedTask.setProgress(50); updatedTask.setStatus(TaskStatus.PROGRESS); - updatedTask.setCreatedAt(new Date()); + updatedTask.setCreatedAt(CREATE_AT); } @Test @@ -71,13 +74,12 @@ public void shouldBeAbleToUpdateTask() { when(taskRepository.index(anyLong())).thenReturn(retrivedTask); when(taskRepository.update(anyObject())).thenReturn(updatedTask); final DefaultResponse defaultResponse = updateTaskService.execute(TASK_ID, taskChanges); - final Task task = (Task) defaultResponse.entity(); - Assert.assertEquals(task.getId(), retrivedTask.getId()); - Assert.assertEquals(task.getProgress(), retrivedTask.getProgress()); - Assert.assertEquals(task.getStatus(), retrivedTask.getStatus()); - Assert.assertEquals(task.getCreatedAt(), retrivedTask.getCreatedAt()); - Assert.assertNotEquals(task.getTitle(), OLD_TASk_TITLE); - Assert.assertNotEquals(task.getDescription(), OLD_TASk_DESCRIPTION); + Assert.assertEquals(retrivedTask.getId(), TASK_ID); + Assert.assertEquals(retrivedTask.getProgress(), TASK_PROGRESS); + Assert.assertEquals(retrivedTask.getStatus(), TASK_STATUS); + Assert.assertEquals(retrivedTask.getCreatedAt(), CREATE_AT); + Assert.assertNotEquals(retrivedTask.getTitle(), OLD_TASk_TITLE); + Assert.assertNotEquals(retrivedTask.getDescription(), OLD_TASk_DESCRIPTION); } From facca80d9fd62e9a746f74d3a4f0f36949448859 Mon Sep 17 00:00:00 2001 From: Carlos Silva Date: Sun, 28 Apr 2024 03:24:47 -0300 Subject: [PATCH 08/13] =?UTF-8?q?Implementa=C3=A7=C3=A3o=20para=20que=20n?= =?UTF-8?q?=C3=A3o=20seja=20alterado=20o=20status=20da=20tarefa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/task/services/UpdateTaskServiceTest.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java b/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java index 1f42d54..18ebe0b 100644 --- a/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java +++ b/tests/backend/challenge/modules/task/services/UpdateTaskServiceTest.java @@ -74,13 +74,8 @@ public void shouldBeAbleToUpdateTask() { when(taskRepository.index(anyLong())).thenReturn(retrivedTask); when(taskRepository.update(anyObject())).thenReturn(updatedTask); final DefaultResponse defaultResponse = updateTaskService.execute(TASK_ID, taskChanges); - Assert.assertEquals(retrivedTask.getId(), TASK_ID); - Assert.assertEquals(retrivedTask.getProgress(), TASK_PROGRESS); - Assert.assertEquals(retrivedTask.getStatus(), TASK_STATUS); - Assert.assertEquals(retrivedTask.getCreatedAt(), CREATE_AT); Assert.assertNotEquals(retrivedTask.getTitle(), OLD_TASk_TITLE); Assert.assertNotEquals(retrivedTask.getDescription(), OLD_TASk_DESCRIPTION); - } @Test @@ -103,6 +98,10 @@ public void shouldNotBeAbleToUpdateTaskStatusManually() { é a rota responsável por alterar o progresso da tarefa. */ + when(taskRepository.index(anyLong())).thenReturn(retrivedTask); + when(taskRepository.update(anyObject())).thenReturn(updatedTask); + final DefaultResponse defaultResponse = updateTaskService.execute(TASK_ID, taskChanges); + Assert.assertEquals(retrivedTask.getStatus(), TASK_STATUS); } From 3e7612fb9bd5e632862daa16d89487168f78decb Mon Sep 17 00:00:00 2001 From: Carlos Silva Date: Sun, 28 Apr 2024 15:12:40 -0300 Subject: [PATCH 09/13] =?UTF-8?q?Implementa=C3=A7=C3=A3o=20para=20atualiza?= =?UTF-8?q?r=20o=20progresso=20da=20tarefa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../task/dtos/ITaskProgressDtoFactory.java | 6 ++ .../task/dtos/TaskProgressDtoFactory.java | 12 ++++ .../http/controllers/TaskController.java | 29 +++++++--- .../task/repositories/ITaskRepository.java | 2 +- .../task/repositories/TaskRepository.java | 10 ++++ .../services/IRetrieveTaskByIdService.java | 2 - .../services/IUpdateTaskProgressService.java | 4 +- .../task/services/IUpdateTaskService.java | 1 - .../task/services/RetriveTaskByIdService.java | 1 - .../services/UpdateTaskProgressService.java | 31 ++++++++++ .../exceptions/RetriveTaskException.java | 8 --- .../task/services/CreateTaskServiceTest.java | 2 +- .../services/RetrieveTaskByIdServiceTest.java | 2 - .../UpdateTaskProgressServiceTest.java | 56 +++++++++++++++++++ 14 files changed, 141 insertions(+), 25 deletions(-) create mode 100644 source/backend/challenge/modules/task/dtos/ITaskProgressDtoFactory.java create mode 100644 source/backend/challenge/modules/task/dtos/TaskProgressDtoFactory.java create mode 100644 source/backend/challenge/modules/task/services/UpdateTaskProgressService.java delete mode 100644 source/backend/challenge/modules/task/services/exceptions/RetriveTaskException.java diff --git a/source/backend/challenge/modules/task/dtos/ITaskProgressDtoFactory.java b/source/backend/challenge/modules/task/dtos/ITaskProgressDtoFactory.java new file mode 100644 index 0000000..c39a528 --- /dev/null +++ b/source/backend/challenge/modules/task/dtos/ITaskProgressDtoFactory.java @@ -0,0 +1,6 @@ +package backend.challenge.modules.task.dtos; + +public interface ITaskProgressDtoFactory { + + public TaskProgressDTO build(Long taskId, int progress); +} diff --git a/source/backend/challenge/modules/task/dtos/TaskProgressDtoFactory.java b/source/backend/challenge/modules/task/dtos/TaskProgressDtoFactory.java new file mode 100644 index 0000000..53e775c --- /dev/null +++ b/source/backend/challenge/modules/task/dtos/TaskProgressDtoFactory.java @@ -0,0 +1,12 @@ +package backend.challenge.modules.task.dtos; + +public class TaskProgressDtoFactory implements ITaskProgressDtoFactory{ + + @Override + public TaskProgressDTO build(Long taskId, int progress) { + TaskProgressDTO taskProgressDTO = TaskProgressDTO.create(); + taskProgressDTO.setId(taskId); + taskProgressDTO.setProgress(progress); + return taskProgressDTO; + } +} 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 34042be..83c373f 100644 --- a/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java +++ b/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java @@ -1,6 +1,8 @@ package backend.challenge.modules.task.infra.http.controllers; import backend.challenge.modules.task.dtos.TaskDtoFactory; +import backend.challenge.modules.task.dtos.TaskProgressDtoFactory; +import backend.challenge.modules.task.infra.http.views.TaskProgressView; import backend.challenge.modules.task.infra.http.views.TaskView; import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.services.*; @@ -19,21 +21,24 @@ public class TaskController { private final IRetrieveAllTasksService retrieveAllTasksService; private final IRetrieveTaskByIdService retrieveTaskByIdService; private final IUpdateTaskService updateTaskService; + private final IUpdateTaskProgressService updateTaskProgressService; @Inject public TaskController( - final ICreateTaskService createTaskService, - final IDeleteTaskService deleteTaskService, - final IRetrieveAllTasksService retrieveAllTasksService, - final IRetrieveTaskByIdService retrieveTaskByIdService, - final IUpdateTaskService updateTaskService - ) { + final ICreateTaskService createTaskService, + final IDeleteTaskService deleteTaskService, + final IRetrieveAllTasksService retrieveAllTasksService, + final IRetrieveTaskByIdService retrieveTaskByIdService, + final IUpdateTaskService updateTaskService, + final IUpdateTaskProgressService updateTaskProgressService + ) { this.createTaskService = createTaskService; this.deleteTaskService = deleteTaskService; this.retrieveAllTasksService = retrieveAllTasksService; this.retrieveTaskByIdService = retrieveTaskByIdService; this.updateTaskService = updateTaskService; - } + this.updateTaskProgressService = updateTaskProgressService; + } @GET public Response show() { @@ -71,6 +76,16 @@ public Response update(@PathParam("taskId") Long taskId, Task task) { return updateTaskService.execute(taskId, task); } + @PUT + @Path("progress/single/{taskId}") + public Response updateProgress(@PathParam("taskId") Long taskId, TaskProgressView taskProgressView) { + /* + 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 updateTaskProgressService.execute(new TaskProgressDtoFactory().build(taskId, taskProgressView.getProgress())); + } + @DELETE @Path("single/{taskId}") public Response delete(@PathParam("taskId") Long taskId) { diff --git a/source/backend/challenge/modules/task/repositories/ITaskRepository.java b/source/backend/challenge/modules/task/repositories/ITaskRepository.java index 84a97f0..b4afd05 100644 --- a/source/backend/challenge/modules/task/repositories/ITaskRepository.java +++ b/source/backend/challenge/modules/task/repositories/ITaskRepository.java @@ -3,7 +3,6 @@ import backend.challenge.modules.task.dtos.TaskDTO; import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.services.exceptions.CreateTaskException; -import backend.challenge.modules.task.services.exceptions.RetriveTaskException; import java.util.List; @@ -13,6 +12,7 @@ public interface ITaskRepository { List show(); Task create(TaskDTO taskDTO) throws CreateTaskException; Task update(Task task); + Task updateProgress(Task task); void delete(Long taskId); } diff --git a/source/backend/challenge/modules/task/repositories/TaskRepository.java b/source/backend/challenge/modules/task/repositories/TaskRepository.java index f2dc01f..5eb522a 100644 --- a/source/backend/challenge/modules/task/repositories/TaskRepository.java +++ b/source/backend/challenge/modules/task/repositories/TaskRepository.java @@ -53,6 +53,16 @@ public Task update(final Task task) { return task; } + @Override + public Task updateProgress(Task task) { + taskList.forEach(rawTask -> { + if (rawTask.getId().equals(task.getId())){ + rawTask.setProgress(task.getProgress()); + } + }); + return task; + } + @Override public void delete(final Long taskId) { // TODO: Criar método responsável por deletar tarefa por id diff --git a/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java b/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java index dec07ef..333760c 100644 --- a/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java +++ b/source/backend/challenge/modules/task/services/IRetrieveTaskByIdService.java @@ -1,7 +1,5 @@ package backend.challenge.modules.task.services; -import backend.challenge.modules.task.models.Task; -import backend.challenge.modules.task.services.exceptions.RetriveTaskException; import kikaha.urouting.api.DefaultResponse; public interface IRetrieveTaskByIdService { diff --git a/source/backend/challenge/modules/task/services/IUpdateTaskProgressService.java b/source/backend/challenge/modules/task/services/IUpdateTaskProgressService.java index 133b794..fb80de9 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.models.Task; +import kikaha.urouting.api.DefaultResponse; public interface IUpdateTaskProgressService { - Task execute(TaskProgressDTO taskProgressDTO); + DefaultResponse execute(TaskProgressDTO taskProgressDTO); } diff --git a/source/backend/challenge/modules/task/services/IUpdateTaskService.java b/source/backend/challenge/modules/task/services/IUpdateTaskService.java index eac03b8..5a953fd 100644 --- a/source/backend/challenge/modules/task/services/IUpdateTaskService.java +++ b/source/backend/challenge/modules/task/services/IUpdateTaskService.java @@ -1,7 +1,6 @@ package backend.challenge.modules.task.services; import backend.challenge.modules.task.models.Task; -import backend.challenge.modules.task.services.exceptions.RetriveTaskException; import kikaha.urouting.api.DefaultResponse; public interface IUpdateTaskService { diff --git a/source/backend/challenge/modules/task/services/RetriveTaskByIdService.java b/source/backend/challenge/modules/task/services/RetriveTaskByIdService.java index c59c88d..44aff39 100644 --- a/source/backend/challenge/modules/task/services/RetriveTaskByIdService.java +++ b/source/backend/challenge/modules/task/services/RetriveTaskByIdService.java @@ -2,7 +2,6 @@ import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.repositories.ITaskRepository; -import backend.challenge.modules.task.services.exceptions.RetriveTaskException; import kikaha.urouting.api.DefaultResponse; import javax.inject.Inject; diff --git a/source/backend/challenge/modules/task/services/UpdateTaskProgressService.java b/source/backend/challenge/modules/task/services/UpdateTaskProgressService.java new file mode 100644 index 0000000..f0d9ac8 --- /dev/null +++ b/source/backend/challenge/modules/task/services/UpdateTaskProgressService.java @@ -0,0 +1,31 @@ +package backend.challenge.modules.task.services; + +import backend.challenge.modules.task.dtos.TaskProgressDTO; +import backend.challenge.modules.task.models.Task; +import backend.challenge.modules.task.repositories.ITaskRepository; +import kikaha.urouting.api.DefaultResponse; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +public class UpdateTaskProgressService implements IUpdateTaskProgressService{ + + private final ITaskRepository taskRepository; + + @Inject + public UpdateTaskProgressService(ITaskRepository taskRepository) { + this.taskRepository = taskRepository; + } + + @Override + public DefaultResponse execute(TaskProgressDTO taskProgressDTO) { + final Task retrivedTask = taskRepository.index(taskProgressDTO.getId()); + if(retrivedTask == null) { + return DefaultResponse.notFound().statusCode(404); + } + retrivedTask.setProgress(taskProgressDTO.getProgress()); + Task updatedTask = taskRepository.updateProgress(retrivedTask); + return DefaultResponse.ok().entity(updatedTask); + } +} diff --git a/source/backend/challenge/modules/task/services/exceptions/RetriveTaskException.java b/source/backend/challenge/modules/task/services/exceptions/RetriveTaskException.java deleted file mode 100644 index 3e8a593..0000000 --- a/source/backend/challenge/modules/task/services/exceptions/RetriveTaskException.java +++ /dev/null @@ -1,8 +0,0 @@ -package backend.challenge.modules.task.services.exceptions; - -public class RetriveTaskException extends Exception{ - - public RetriveTaskException(String message) { - super(message); - } -} diff --git a/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java b/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java index 4df82c4..0f33412 100644 --- a/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java +++ b/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java @@ -50,7 +50,7 @@ public void ShouldNotBeAbleToCreateNewTaskWithEmptyTitle() throws CreateTaskExce Exception exception = assertThrows(CreateTaskException.class, () ->{ createTaskService.execute(taskDTO); }); - final String expectedMessage = "Title cannot be empty"; + final String expectedMessage = "Titulo não pode ser vazio"; Assert.assertTrue(exception.getMessage().contains(expectedMessage)); } } \ 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 5510f9c..9111cab 100644 --- a/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java +++ b/tests/backend/challenge/modules/task/services/RetrieveTaskByIdServiceTest.java @@ -5,8 +5,6 @@ import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.repositories.ITaskRepository; import backend.challenge.modules.task.repositories.TaskRepository; -import backend.challenge.modules.task.services.exceptions.RetriveTaskException; -import com.sun.source.tree.AssertTree; import kikaha.core.test.KikahaRunner; import kikaha.urouting.api.DefaultResponse; import org.junit.Assert; diff --git a/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java b/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java index e6b0bf6..5151fd8 100644 --- a/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java +++ b/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java @@ -1,19 +1,75 @@ package backend.challenge.modules.task.services; +import backend.challenge.modules.task.dtos.TaskProgressDTO; +import backend.challenge.modules.task.dtos.TaskProgressDtoFactory; +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 kikaha.urouting.api.DefaultResponse; +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.Date; + +import static org.mockito.Matchers.anyLong; +import static org.mockito.Matchers.anyObject; +import static org.mockito.Mockito.when; @RunWith( KikahaRunner.class ) public class UpdateTaskProgressServiceTest { + private IUpdateTaskProgressService updateTaskProgressService; + + @Mock + private ITaskRepository taskRepository = new TaskRepository(); + + private final Task retrivedTask = new Task(); + private final Task updatedTask = new Task(); + private final Long TASK_ID = 8567032865818388301L; + private final int OLD_TASK_PROGRESS = 0; + private final TaskStatus TASK_STATUS = TaskStatus.PROGRESS; + private final Date CREATE_AT = new Date(2024, 4, 28); + private final String TASk_TITLE = "Projeto"; + private final String TASk_DESCRIPTION = "Implementar chat com llama3"; + + @Before + public void init() { + MockitoAnnotations.initMocks(this); + updateTaskProgressService = new UpdateTaskProgressService(taskRepository); + retrivedTask.setId(TASK_ID); + retrivedTask.setTitle(TASk_TITLE); + retrivedTask.setDescription(TASk_DESCRIPTION); + retrivedTask.setProgress(OLD_TASK_PROGRESS); + retrivedTask.setStatus(TASK_STATUS); + retrivedTask.setCreatedAt(CREATE_AT); + + updatedTask.setId(TASK_ID); + updatedTask.setTitle(TASk_TITLE); + updatedTask.setDescription(TASk_DESCRIPTION); + updatedTask.setProgress(50); + updatedTask.setStatus(TASK_STATUS); + updatedTask.setCreatedAt(CREATE_AT); + } + @Test public void shouldBeAbleToUpdateTaskProgress() { /* TODO: Para que esse teste passe, sua aplicação deve permitir que sejam alterados apenas o campo `progress`. */ + final int expectedProgress = 50; + when(taskRepository.index(anyLong())).thenReturn(retrivedTask); + when(taskRepository.updateProgress(anyObject())).thenReturn(updatedTask); + DefaultResponse defaultResponse = updateTaskProgressService.execute(new TaskProgressDtoFactory().build(TASK_ID, expectedProgress)); + Task task = (Task) defaultResponse.entity(); + Assert.assertNotEquals(task.getProgress(), OLD_TASK_PROGRESS); } @Test From 5bdf74864f14ae4acf0ac9e78a1563b9df365d71 Mon Sep 17 00:00:00 2001 From: Carlos Silva Date: Sun, 28 Apr 2024 15:42:35 -0300 Subject: [PATCH 10/13] =?UTF-8?q?Implementa=C3=A7=C3=A3o=20para=20atualiza?= =?UTF-8?q?r=20o=20status=20da=20tarefa=20quando=20atingir=20o=20limite=20?= =?UTF-8?q?de=20100?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/task/repositories/TaskRepository.java | 1 + .../task/services/UpdateTaskProgressService.java | 5 +++++ .../services/UpdateTaskProgressServiceTest.java | 15 +++++++++++++++ 3 files changed, 21 insertions(+) diff --git a/source/backend/challenge/modules/task/repositories/TaskRepository.java b/source/backend/challenge/modules/task/repositories/TaskRepository.java index 5eb522a..f46c459 100644 --- a/source/backend/challenge/modules/task/repositories/TaskRepository.java +++ b/source/backend/challenge/modules/task/repositories/TaskRepository.java @@ -58,6 +58,7 @@ public Task updateProgress(Task task) { taskList.forEach(rawTask -> { if (rawTask.getId().equals(task.getId())){ rawTask.setProgress(task.getProgress()); + rawTask.setStatus(task.getStatus()); } }); return task; diff --git a/source/backend/challenge/modules/task/services/UpdateTaskProgressService.java b/source/backend/challenge/modules/task/services/UpdateTaskProgressService.java index f0d9ac8..5a38d9d 100644 --- a/source/backend/challenge/modules/task/services/UpdateTaskProgressService.java +++ b/source/backend/challenge/modules/task/services/UpdateTaskProgressService.java @@ -1,6 +1,7 @@ package backend.challenge.modules.task.services; import backend.challenge.modules.task.dtos.TaskProgressDTO; +import backend.challenge.modules.task.enums.TaskStatus; import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.repositories.ITaskRepository; import kikaha.urouting.api.DefaultResponse; @@ -12,6 +13,7 @@ public class UpdateTaskProgressService implements IUpdateTaskProgressService{ private final ITaskRepository taskRepository; + private int LIMIT_PROGRESS = 100; @Inject public UpdateTaskProgressService(ITaskRepository taskRepository) { @@ -24,6 +26,9 @@ public DefaultResponse execute(TaskProgressDTO taskProgressDTO) { if(retrivedTask == null) { return DefaultResponse.notFound().statusCode(404); } + if(taskProgressDTO.getProgress() == LIMIT_PROGRESS) { + retrivedTask.setStatus(TaskStatus.COMPLETE); + } retrivedTask.setProgress(taskProgressDTO.getProgress()); Task updatedTask = taskRepository.updateProgress(retrivedTask); return DefaultResponse.ok().entity(updatedTask); diff --git a/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java b/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java index 5151fd8..6af43b7 100644 --- a/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java +++ b/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java @@ -32,6 +32,7 @@ public class UpdateTaskProgressServiceTest { private final Task retrivedTask = new Task(); private final Task updatedTask = new Task(); + private final Task completedTask = new Task(); private final Long TASK_ID = 8567032865818388301L; private final int OLD_TASK_PROGRESS = 0; private final TaskStatus TASK_STATUS = TaskStatus.PROGRESS; @@ -56,6 +57,13 @@ public void init() { updatedTask.setProgress(50); updatedTask.setStatus(TASK_STATUS); updatedTask.setCreatedAt(CREATE_AT); + + completedTask.setId(TASK_ID); + completedTask.setTitle(TASk_TITLE); + completedTask.setDescription(TASk_DESCRIPTION); + completedTask.setProgress(100); + completedTask.setStatus(TaskStatus.COMPLETE); + completedTask.setCreatedAt(CREATE_AT); } @Test @@ -78,6 +86,13 @@ 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. */ + + final int progress = 100; + when(taskRepository.index(anyLong())).thenReturn(retrivedTask); + when(taskRepository.updateProgress(anyObject())).thenReturn(completedTask); + DefaultResponse defaultResponse = updateTaskProgressService.execute(new TaskProgressDtoFactory().build(TASK_ID, progress)); + Task task = (Task) defaultResponse.entity(); + Assert.assertEquals(task.getStatus(), TaskStatus.COMPLETE); } } From 6f58d0cd33d6cce5bb9d2c4ef2fa0a17b967c541 Mon Sep 17 00:00:00 2001 From: Carlos Silva Date: Sun, 28 Apr 2024 16:38:16 -0300 Subject: [PATCH 11/13] =?UTF-8?q?Implementa=C3=A7=C3=A3o=20para=20n=C3=A3o?= =?UTF-8?q?=20deixar=20atualizar=20o=20progresso=20a=20baixo=20do=20progre?= =?UTF-8?q?sso=20inicial=20ZERO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../services/UpdateTaskProgressService.java | 26 +++++++-- .../UpdateTaskProgressServiceTest.java | 55 +++++++++++++++---- 2 files changed, 67 insertions(+), 14 deletions(-) diff --git a/source/backend/challenge/modules/task/services/UpdateTaskProgressService.java b/source/backend/challenge/modules/task/services/UpdateTaskProgressService.java index 5a38d9d..a3b2429 100644 --- a/source/backend/challenge/modules/task/services/UpdateTaskProgressService.java +++ b/source/backend/challenge/modules/task/services/UpdateTaskProgressService.java @@ -14,6 +14,7 @@ public class UpdateTaskProgressService implements IUpdateTaskProgressService{ private final ITaskRepository taskRepository; private int LIMIT_PROGRESS = 100; + private int INITIAL_PROGRESS = 0; @Inject public UpdateTaskProgressService(ITaskRepository taskRepository) { @@ -26,11 +27,28 @@ public DefaultResponse execute(TaskProgressDTO taskProgressDTO) { if(retrivedTask == null) { return DefaultResponse.notFound().statusCode(404); } - if(taskProgressDTO.getProgress() == LIMIT_PROGRESS) { - retrivedTask.setStatus(TaskStatus.COMPLETE); - } - retrivedTask.setProgress(taskProgressDTO.getProgress()); + this.changeProgress(retrivedTask, taskProgressDTO.getProgress()); + this.changeStatus(retrivedTask, taskProgressDTO.getProgress()); Task updatedTask = taskRepository.updateProgress(retrivedTask); return DefaultResponse.ok().entity(updatedTask); } + + private void changeProgress(Task task, int progress) { + int taskProgress = 0; + if (progress > INITIAL_PROGRESS) { + taskProgress = progress; + } + if (progress > LIMIT_PROGRESS) { + taskProgress = LIMIT_PROGRESS; + } + task.setProgress(taskProgress); + } + + private void changeStatus(Task task, int progress) { + if(progress == LIMIT_PROGRESS) { + task.setStatus(TaskStatus.COMPLETE); + }else { + task.setStatus(TaskStatus.PROGRESS); + } + } } diff --git a/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java b/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java index 6af43b7..17b0b08 100644 --- a/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java +++ b/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java @@ -1,7 +1,6 @@ package backend.challenge.modules.task.services; -import backend.challenge.modules.task.dtos.TaskProgressDTO; import backend.challenge.modules.task.dtos.TaskProgressDtoFactory; import backend.challenge.modules.task.enums.TaskStatus; import backend.challenge.modules.task.models.Task; @@ -32,9 +31,8 @@ public class UpdateTaskProgressServiceTest { private final Task retrivedTask = new Task(); private final Task updatedTask = new Task(); - private final Task completedTask = new Task(); private final Long TASK_ID = 8567032865818388301L; - private final int OLD_TASK_PROGRESS = 0; + private final int OLD_TASK_PROGRESS = 10; private final TaskStatus TASK_STATUS = TaskStatus.PROGRESS; private final Date CREATE_AT = new Date(2024, 4, 28); private final String TASk_TITLE = "Projeto"; @@ -57,13 +55,6 @@ public void init() { updatedTask.setProgress(50); updatedTask.setStatus(TASK_STATUS); updatedTask.setCreatedAt(CREATE_AT); - - completedTask.setId(TASK_ID); - completedTask.setTitle(TASk_TITLE); - completedTask.setDescription(TASk_DESCRIPTION); - completedTask.setProgress(100); - completedTask.setStatus(TaskStatus.COMPLETE); - completedTask.setCreatedAt(CREATE_AT); } @Test @@ -86,6 +77,13 @@ 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. */ + final Task completedTask = new Task(); + completedTask.setId(TASK_ID); + completedTask.setTitle(TASk_TITLE); + completedTask.setDescription(TASk_DESCRIPTION); + completedTask.setProgress(100); + completedTask.setStatus(TaskStatus.COMPLETE); + completedTask.setCreatedAt(CREATE_AT); final int progress = 100; when(taskRepository.index(anyLong())).thenReturn(retrivedTask); @@ -95,4 +93,41 @@ public void shouldBeAbleToUpdateOnlyTaskStatusWhenProgressEqualsOneHundred() { Assert.assertEquals(task.getStatus(), TaskStatus.COMPLETE); } + @Test + public void shouldNotBeAbleToUpdateTaskProgressWhenProgressLessThanOneHundred() { + /* + TODO: Não deve ser capaz de atualizar o progresso da tarefa quando o progresso for inferior a cem. + */ + + final int progress = 99; + when(taskRepository.index(anyLong())).thenReturn(retrivedTask); + when(taskRepository.updateProgress(anyObject())).thenReturn(updatedTask); + DefaultResponse defaultResponse = updateTaskProgressService.execute(new TaskProgressDtoFactory().build(TASK_ID, progress)); + Task task = (Task) defaultResponse.entity(); + Assert.assertNotEquals(task.getStatus(), TaskStatus.COMPLETE); + } + + @Test + public void shouldNotBeAbleToUpdateTaskProgressWhenProgressLessThanZero() { + /* + TODO: Para que esse teste passe, você não deve permitir + que sua rota de update de progresso de tarefa altere o progresso para menor que 0. + */ + final Task updatedTaskWithZeroProgress = new Task(); + updatedTaskWithZeroProgress.setId(TASK_ID); + updatedTaskWithZeroProgress.setTitle(TASk_TITLE); + updatedTaskWithZeroProgress.setDescription(TASk_DESCRIPTION); + updatedTaskWithZeroProgress.setProgress(0); + updatedTaskWithZeroProgress.setStatus(TASK_STATUS); + updatedTaskWithZeroProgress.setCreatedAt(CREATE_AT); + + when(taskRepository.index(anyLong())).thenReturn(retrivedTask); + when(taskRepository.updateProgress(anyObject())).thenReturn(updatedTaskWithZeroProgress); + final int progress = -3; + DefaultResponse defaultResponse = updateTaskProgressService.execute(new TaskProgressDtoFactory().build(TASK_ID, progress)); + Task task = (Task) defaultResponse.entity(); + Assert.assertEquals(task.getProgress(), 0); + } + + } From c7a26f65365b8aef204a3e298528e4a1548e80b5 Mon Sep 17 00:00:00 2001 From: Carlos Silva Date: Sun, 28 Apr 2024 16:43:52 -0300 Subject: [PATCH 12/13] =?UTF-8?q?Implementa=C3=A7=C3=A3o=20para=20n=C3=A3o?= =?UTF-8?q?=20permitir=20atualiza=C3=A7=C3=A3o=20do=20progresso=20acima=20?= =?UTF-8?q?de=20100?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UpdateTaskProgressServiceTest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java b/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java index 17b0b08..8efccaa 100644 --- a/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java +++ b/tests/backend/challenge/modules/task/services/UpdateTaskProgressServiceTest.java @@ -129,5 +129,26 @@ public void shouldNotBeAbleToUpdateTaskProgressWhenProgressLessThanZero() { Assert.assertEquals(task.getProgress(), 0); } + @Test + public void shouldNotBeAbleToUpdateTaskProgressWhenProgressGreaterThanOneHundred() { + /* + TODO: Para que esse teste passe, você não deve permitir + que sua rota de update de progresso de tarefa altere o progresso para maior que 100. + */ + final Task updatedTaskWithZeroProgress = new Task(); + updatedTaskWithZeroProgress.setId(TASK_ID); + updatedTaskWithZeroProgress.setTitle(TASk_TITLE); + updatedTaskWithZeroProgress.setDescription(TASk_DESCRIPTION); + updatedTaskWithZeroProgress.setProgress(100); + updatedTaskWithZeroProgress.setStatus(TASK_STATUS); + updatedTaskWithZeroProgress.setCreatedAt(CREATE_AT); + + when(taskRepository.index(anyLong())).thenReturn(retrivedTask); + when(taskRepository.updateProgress(anyObject())).thenReturn(updatedTaskWithZeroProgress); + final int progress = 200; + DefaultResponse defaultResponse = updateTaskProgressService.execute(new TaskProgressDtoFactory().build(TASK_ID, progress)); + Task task = (Task) defaultResponse.entity(); + Assert.assertEquals(task.getProgress(), 100); + } } From a9658b1acede4eacacae506fb757bcf042b52351 Mon Sep 17 00:00:00 2001 From: Carlos Silva Date: Sun, 28 Apr 2024 18:09:51 -0300 Subject: [PATCH 13/13] =?UTF-8?q?Implementa=C3=A7=C3=A3o=20para=20deletar?= =?UTF-8?q?=20tarefas=20e=20refatora=C3=A7=C3=A3o=20do=20processo=20de=20c?= =?UTF-8?q?riar=C3=A7=C3=A3o=20de=20uma=20tarefa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../http/controllers/TaskController.java | 14 ++---- .../task/repositories/ITaskRepository.java | 3 +- .../task/repositories/TaskRepository.java | 43 ++++++++----------- .../task/services/CreateTaskService.java | 10 +++-- .../task/services/DeleteTaskService.java | 1 + .../task/services/ICreateTaskService.java | 5 +-- .../services/UpdateTaskProgressService.java | 6 +-- .../exceptions/CreateTaskException.java | 8 ---- .../task/services/CreateTaskServiceTest.java | 27 +++++------- .../task/services/DeleteTaskServiceTest.java | 20 ++++++++- 10 files changed, 62 insertions(+), 75 deletions(-) delete mode 100644 source/backend/challenge/modules/task/services/exceptions/CreateTaskException.java 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 83c373f..28f2a39 100644 --- a/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java +++ b/source/backend/challenge/modules/task/infra/http/controllers/TaskController.java @@ -6,7 +6,6 @@ import backend.challenge.modules.task.infra.http.views.TaskView; import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.services.*; -import backend.challenge.modules.task.services.exceptions.CreateTaskException; import kikaha.urouting.api.*; import javax.inject.Inject; @@ -56,14 +55,7 @@ public Response index(@PathParam("taskId") Long 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. - Task createdTask = null; - try { - createdTask = createTaskService.execute(new TaskDtoFactory().build(task.getTitle(), task.getDescription())); - } catch (CreateTaskException e) { - DefaultResponse.badRequest().entity(e.getMessage()); - throw new RuntimeException(e); - } - return DefaultResponse.ok().entity(createdTask); + return createTaskService.execute(new TaskDtoFactory().build(task.getTitle(), task.getDescription())); } @PUT @@ -90,8 +82,8 @@ public Response updateProgress(@PathParam("taskId") Long taskId, TaskProgressVie @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 - - return DefaultResponse.ok().entity("Hello world"); + deleteTaskService.execute(taskId); + return DefaultResponse.ok().entity("Tarefa removida com sucesso"); } } diff --git a/source/backend/challenge/modules/task/repositories/ITaskRepository.java b/source/backend/challenge/modules/task/repositories/ITaskRepository.java index b4afd05..ea46385 100644 --- a/source/backend/challenge/modules/task/repositories/ITaskRepository.java +++ b/source/backend/challenge/modules/task/repositories/ITaskRepository.java @@ -2,7 +2,6 @@ import backend.challenge.modules.task.dtos.TaskDTO; import backend.challenge.modules.task.models.Task; -import backend.challenge.modules.task.services.exceptions.CreateTaskException; import java.util.List; @@ -10,7 +9,7 @@ public interface ITaskRepository { Task index(Long taskId); List show(); - Task create(TaskDTO taskDTO) throws CreateTaskException; + Task create(TaskDTO taskDTO); Task update(Task task); Task updateProgress(Task task); void delete(Long taskId); diff --git a/source/backend/challenge/modules/task/repositories/TaskRepository.java b/source/backend/challenge/modules/task/repositories/TaskRepository.java index f46c459..f0451b7 100644 --- a/source/backend/challenge/modules/task/repositories/TaskRepository.java +++ b/source/backend/challenge/modules/task/repositories/TaskRepository.java @@ -3,7 +3,6 @@ import backend.challenge.modules.task.dtos.TaskDTO; import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.models.TaskFactory; -import backend.challenge.modules.task.services.exceptions.CreateTaskException; import javax.inject.Singleton; import java.util.ArrayList; @@ -33,46 +32,38 @@ public List show() { } @Override - public Task create(final TaskDTO taskDTO) throws CreateTaskException { + public Task create(final TaskDTO taskDTO) { // TODO: Criar método responsável por criar uma tarefa - validate(taskDTO); - Task task = new TaskFactory().build(taskDTO); + Task task = null; + if (taskDTO.getTitle().trim().isEmpty()) { + return task; + } + task = new TaskFactory().build(taskDTO); taskList.add(task); return task; } @Override public Task update(final Task task) { - // TODO: Criar método responsável por atualizar uma tarefa - taskList.forEach(rawTask -> { - if (rawTask.getId().equals(task.getId())){ - rawTask.setTitle(task.getTitle()); - rawTask.setDescription(task.getDescription()); - } - }); - return task; + // TODO: Criar método responsável por atualizar progresso e status da tarefa + Task retrivedTask = this.index(task.getId()); + retrivedTask.setTitle(task.getTitle()); + retrivedTask.setDescription(task.getDescription()); + return retrivedTask; } @Override public Task updateProgress(Task task) { - taskList.forEach(rawTask -> { - if (rawTask.getId().equals(task.getId())){ - rawTask.setProgress(task.getProgress()); - rawTask.setStatus(task.getStatus()); - } - }); - return task; + Task retrivedTask = this.index(task.getId()); + retrivedTask.setProgress(task.getProgress()); + retrivedTask.setStatus(task.getStatus()); + return retrivedTask; } @Override public void delete(final Long taskId) { // TODO: Criar método responsável por deletar tarefa por id - - } - - private static void validate(TaskDTO taskDTO) throws CreateTaskException { - if (taskDTO.getTitle().trim().isEmpty()) { - throw new CreateTaskException("Titulo não pode ser vazio"); - } + Task task = this.index(taskId); + taskList.remove(task); } } diff --git a/source/backend/challenge/modules/task/services/CreateTaskService.java b/source/backend/challenge/modules/task/services/CreateTaskService.java index acaebd9..8c505a2 100644 --- a/source/backend/challenge/modules/task/services/CreateTaskService.java +++ b/source/backend/challenge/modules/task/services/CreateTaskService.java @@ -3,7 +3,7 @@ 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.services.exceptions.CreateTaskException; +import kikaha.urouting.api.DefaultResponse; import javax.inject.Inject; import javax.inject.Singleton; @@ -19,8 +19,12 @@ public CreateTaskService(final ITaskRepository taskRepository) { } @Override - public Task execute(TaskDTO taskDTO) throws CreateTaskException { + public DefaultResponse execute(TaskDTO taskDTO) { // TODO: Criar serviço responsável por criar uma tarefa - return taskRepository.create(taskDTO); + Task task = taskRepository.create(taskDTO); + if (task == null) { + return DefaultResponse.notModified().entity("Titulo não pode ser vazio"); + } + return DefaultResponse.ok().entity(task); } } diff --git a/source/backend/challenge/modules/task/services/DeleteTaskService.java b/source/backend/challenge/modules/task/services/DeleteTaskService.java index c957d70..e3118d8 100644 --- a/source/backend/challenge/modules/task/services/DeleteTaskService.java +++ b/source/backend/challenge/modules/task/services/DeleteTaskService.java @@ -18,6 +18,7 @@ public DeleteTaskService(final ITaskRepository taskRepository) { @Override public void execute(Long taskId) { // TODO: Criar serviço responsável por deletar a tarefa + taskRepository.delete(taskId); } } diff --git a/source/backend/challenge/modules/task/services/ICreateTaskService.java b/source/backend/challenge/modules/task/services/ICreateTaskService.java index bc5436f..0cde901 100644 --- a/source/backend/challenge/modules/task/services/ICreateTaskService.java +++ b/source/backend/challenge/modules/task/services/ICreateTaskService.java @@ -1,11 +1,10 @@ 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.services.exceptions.CreateTaskException; +import kikaha.urouting.api.DefaultResponse; public interface ICreateTaskService { - Task execute(TaskDTO taskDTO) throws CreateTaskException; + DefaultResponse execute(TaskDTO taskDTO); } diff --git a/source/backend/challenge/modules/task/services/UpdateTaskProgressService.java b/source/backend/challenge/modules/task/services/UpdateTaskProgressService.java index a3b2429..4795b5d 100644 --- a/source/backend/challenge/modules/task/services/UpdateTaskProgressService.java +++ b/source/backend/challenge/modules/task/services/UpdateTaskProgressService.java @@ -28,7 +28,7 @@ public DefaultResponse execute(TaskProgressDTO taskProgressDTO) { return DefaultResponse.notFound().statusCode(404); } this.changeProgress(retrivedTask, taskProgressDTO.getProgress()); - this.changeStatus(retrivedTask, taskProgressDTO.getProgress()); + this.changeStatus(retrivedTask); Task updatedTask = taskRepository.updateProgress(retrivedTask); return DefaultResponse.ok().entity(updatedTask); } @@ -44,8 +44,8 @@ private void changeProgress(Task task, int progress) { task.setProgress(taskProgress); } - private void changeStatus(Task task, int progress) { - if(progress == LIMIT_PROGRESS) { + private void changeStatus(Task task) { + if(task.getProgress() == LIMIT_PROGRESS) { task.setStatus(TaskStatus.COMPLETE); }else { task.setStatus(TaskStatus.PROGRESS); diff --git a/source/backend/challenge/modules/task/services/exceptions/CreateTaskException.java b/source/backend/challenge/modules/task/services/exceptions/CreateTaskException.java deleted file mode 100644 index baa92fa..0000000 --- a/source/backend/challenge/modules/task/services/exceptions/CreateTaskException.java +++ /dev/null @@ -1,8 +0,0 @@ -package backend.challenge.modules.task.services.exceptions; - -public class CreateTaskException extends Exception{ - - public CreateTaskException(String message) { - super(message); - } -} diff --git a/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java b/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java index 0f33412..6fa9132 100644 --- a/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java +++ b/tests/backend/challenge/modules/task/services/CreateTaskServiceTest.java @@ -1,18 +1,17 @@ package backend.challenge.modules.task.services; import backend.challenge.modules.task.dtos.TaskDTO; +import backend.challenge.modules.task.dtos.TaskDtoFactory; import backend.challenge.modules.task.models.Task; import backend.challenge.modules.task.repositories.ITaskRepository; import backend.challenge.modules.task.repositories.TaskRepository; -import backend.challenge.modules.task.services.exceptions.CreateTaskException; import kikaha.core.test.KikahaRunner; +import kikaha.urouting.api.DefaultResponse; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import static org.junit.Assert.assertThrows; - @RunWith( KikahaRunner.class ) public class CreateTaskServiceTest { @@ -21,36 +20,30 @@ public class CreateTaskServiceTest { @Before public void init() { final ITaskRepository taskRepository = new TaskRepository(); - createTaskService = new CreateTaskService(taskRepository); } @Test - public void shouldBeAbleToCreateANewTask() throws CreateTaskException { + 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. final String expectedTitle = "Compras"; final String expectedDescription = "Comprar presente para minha esposa"; - TaskDTO taskDTO = TaskDTO.create(); - taskDTO.setTitle(expectedTitle); - taskDTO.setDescription(expectedDescription); - Task task = createTaskService.execute(taskDTO); + TaskDTO taskDTO = new TaskDtoFactory().build(expectedTitle, expectedDescription); + DefaultResponse defaultResponse = createTaskService.execute(taskDTO); + Task task = (Task) defaultResponse.entity(); Assert.assertNotNull(task.getId()); Assert.assertEquals(task.getTitle(), expectedTitle); Assert.assertEquals(task.getDescription(), expectedDescription); } @Test - public void ShouldNotBeAbleToCreateNewTaskWithEmptyTitle() throws CreateTaskException { + public void ShouldNotBeAbleToCreateNewTaskWithEmptyTitle() { final String expectedTitle = ""; final String expectedDescription = "Comprar presente para minha esposa"; - TaskDTO taskDTO = TaskDTO.create(); - taskDTO.setTitle(expectedTitle); - taskDTO.setDescription(expectedDescription); - Exception exception = assertThrows(CreateTaskException.class, () ->{ - createTaskService.execute(taskDTO); - }); + TaskDTO taskDTO = new TaskDtoFactory().build(expectedTitle, expectedDescription); + DefaultResponse defaultResponse = createTaskService.execute(taskDTO); final String expectedMessage = "Titulo não pode ser vazio"; - Assert.assertTrue(exception.getMessage().contains(expectedMessage)); + Assert.assertTrue(defaultResponse.entity().toString().contains(expectedMessage)); } } \ 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..59cc390 100644 --- a/tests/backend/challenge/modules/task/services/DeleteTaskServiceTest.java +++ b/tests/backend/challenge/modules/task/services/DeleteTaskServiceTest.java @@ -1,5 +1,7 @@ package backend.challenge.modules.task.services; +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; @@ -7,22 +9,36 @@ 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.Date; + +import static org.mockito.Matchers.anyLong; +import static org.mockito.Matchers.anyObject; +import static org.mockito.Mockito.*; @RunWith( KikahaRunner.class ) public class DeleteTaskServiceTest { private IDeleteTaskService deleteTaskService; + @Mock + private ITaskRepository taskRepository = new TaskRepository(); + @Before public void init() { - final ITaskRepository taskRepository = new TaskRepository(); - + MockitoAnnotations.initMocks(this); deleteTaskService = new DeleteTaskService(taskRepository); } @Test public void shouldBeAbleToDeleteTaskById() { // TODO: Para que esse teste passe, sua aplicação deve permitir que tarefas sejam deletadas por id. + final Long taskId = 8567032865818388301L; + deleteTaskService.execute(taskId); + Mockito.verify(taskRepository, times(1)).delete(taskId); }