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