diff --git a/taskflow-service/src/application/consumers/create_task_history_consumer.go b/taskflow-service/src/application/consumers/create_task_history_consumer.go index 42ac514..b19bab9 100644 --- a/taskflow-service/src/application/consumers/create_task_history_consumer.go +++ b/taskflow-service/src/application/consumers/create_task_history_consumer.go @@ -4,9 +4,7 @@ import ( "context" "github.com/colibriproject-dev/colibri-sdk-go/pkg/messaging" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/models" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/usecases" - "github.com/google/uuid" ) type CreateTaskHistoryConsumer struct { @@ -22,13 +20,7 @@ func NewCreateTaskHistoryConsumer() messaging.QueueConsumer { } func (c *CreateTaskHistoryConsumer) Consume(ctx context.Context, message *messaging.ProviderMessage) error { - var model models.TaskHistoryCreate - if err := message.DecodeAndValidateMessage(&model); err != nil { - return err - } - - model.TenantID = uuid.MustParse(message.AuthContext.GetTenantID()) - return c.CreateTaskHistoryUsecase.Execute(ctx, &model) + return nil } func (c *CreateTaskHistoryConsumer) QueueName() string { diff --git a/taskflow-service/src/application/controllers/tasks_v1_controller.go b/taskflow-service/src/application/controllers/tasks_v1_controller.go index fb74c4b..dd7e83b 100644 --- a/taskflow-service/src/application/controllers/tasks_v1_controller.go +++ b/taskflow-service/src/application/controllers/tasks_v1_controller.go @@ -1,14 +1,10 @@ package controllers import ( - "errors" "net/http" "github.com/colibriproject-dev/colibri-sdk-go/pkg/web/restserver" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/exceptions" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/models" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/usecases" - "github.com/google/uuid" ) type TasksV1Controller struct { @@ -84,20 +80,7 @@ func (c *TasksV1Controller) Routes() []restserver.Route { // @Param title query string false "título da tarefa" // @Router /api/v1/tasks [get] func (c *TasksV1Controller) GetAllTask(wctx restserver.WebContext) { - var params models.TaskListParams - if err := wctx.DecodeQueryParams(¶ms); err != nil { - wctx.ErrorResponse(http.StatusBadRequest, err) - return - } - - params.TenantID = uuid.MustParse(wctx.AuthenticationContext().GetTenantID()) - tasks, err := c.GetAllTaskUsecase.Execute(wctx.Context(), ¶ms) - if err != nil { - wctx.ErrorResponse(http.StatusInternalServerError, err) - return - } - - wctx.JsonResponse(http.StatusOK, tasks) + wctx.EmptyResponse(http.StatusNotImplemented) } // @Summary Criar uma nova tarefa @@ -110,20 +93,7 @@ func (c *TasksV1Controller) GetAllTask(wctx restserver.WebContext) { // @Param task body models.TaskCreate true "Dados da tarefa a ser criada" // @Router /api/v1/tasks [post] func (c *TasksV1Controller) CreateTask(wctx restserver.WebContext) { - var taskCreate models.TaskCreate - if err := wctx.DecodeBody(&taskCreate); err != nil { - wctx.ErrorResponse(http.StatusBadRequest, err) - return - } - - taskCreate.TenantID = uuid.MustParse(wctx.AuthenticationContext().GetTenantID()) - createdTask, err := c.CreateTaskUsecase.Execute(wctx.Context(), &taskCreate) - if err != nil { - wctx.ErrorResponse(http.StatusInternalServerError, err) - return - } - - wctx.JsonResponse(http.StatusCreated, createdTask) + wctx.EmptyResponse(http.StatusNotImplemented) } // @Summary Atualizar uma tarefa @@ -137,34 +107,7 @@ func (c *TasksV1Controller) CreateTask(wctx restserver.WebContext) { // @Param task body models.TaskUpdate true "Dados da tarefa a serem atualizados" // @Router /api/v1/tasks/{id} [put] func (c *TasksV1Controller) UpdateTask(wctx restserver.WebContext) { - var paramId uuid.UUID - paramId, err := uuid.Parse(wctx.PathParam("id")) - if err != nil { - wctx.ErrorResponse(http.StatusBadRequest, errors.New(exceptions.ErrInvalidTaskId)) - return - } - - var taskUpdate models.TaskUpdate - if err := wctx.DecodeBody(&taskUpdate); err != nil { - wctx.ErrorResponse(http.StatusBadRequest, err) - return - } - - taskUpdate.TaskID = paramId - taskUpdate.TenantID = uuid.MustParse(wctx.AuthenticationContext().GetTenantID()) - - err = c.UpdateTaskUsecase.Execute(wctx.Context(), &taskUpdate) - if err != nil { - if err.Error() == exceptions.ErrTaskNotExists { - wctx.ErrorResponse(http.StatusBadRequest, err) - return - } - - wctx.ErrorResponse(http.StatusInternalServerError, err) - return - } - - wctx.EmptyResponse(http.StatusNoContent) + wctx.EmptyResponse(http.StatusNotImplemented) } // @Summary Atualizar o status de uma tarefa @@ -178,34 +121,7 @@ func (c *TasksV1Controller) UpdateTask(wctx restserver.WebContext) { // @Param taskStatus body models.TaskStatusUpdate true "Dados do status da tarefa a serem atualizados" // @Router /api/v1/tasks/{id}/status [patch] func (c *TasksV1Controller) UpdateTaskStatus(wctx restserver.WebContext) { - var paramId uuid.UUID - paramId, err := uuid.Parse(wctx.PathParam("id")) - if err != nil { - wctx.ErrorResponse(http.StatusBadRequest, errors.New(exceptions.ErrInvalidTaskId)) - return - } - - var taskStatusUpdate models.TaskStatusUpdate - if err := wctx.DecodeBody(&taskStatusUpdate); err != nil { - wctx.ErrorResponse(http.StatusBadRequest, err) - return - } - - taskStatusUpdate.TaskID = paramId - taskStatusUpdate.TenantID = uuid.MustParse(wctx.AuthenticationContext().GetTenantID()) - - err = c.UpdateTaskStatusUsecase.Execute(wctx.Context(), &taskStatusUpdate) - if err != nil { - if err.Error() == exceptions.ErrTaskNotExists { - wctx.ErrorResponse(http.StatusBadRequest, err) - return - } - - wctx.ErrorResponse(http.StatusInternalServerError, err) - return - } - - wctx.EmptyResponse(http.StatusNoContent) + wctx.EmptyResponse(http.StatusNotImplemented) } // @Summary Deletar uma tarefa @@ -218,24 +134,7 @@ func (c *TasksV1Controller) UpdateTaskStatus(wctx restserver.WebContext) { // @Param id path string true "ID da tarefa a ser deletada" // @Router /api/v1/tasks/{id} [delete] func (c *TasksV1Controller) DeleteTask(wctx restserver.WebContext) { - var paramId uuid.UUID - paramId, err := uuid.Parse(wctx.PathParam("id")) - if err != nil { - wctx.ErrorResponse(http.StatusBadRequest, errors.New(exceptions.ErrInvalidTaskId)) - return - } - - err = c.DeleteTaskUsecase.Execute(wctx.Context(), paramId, uuid.MustParse(wctx.AuthenticationContext().GetTenantID())) - if err != nil { - if err.Error() == exceptions.ErrTaskNotExists { - wctx.ErrorResponse(http.StatusBadRequest, err) - return - } - wctx.ErrorResponse(http.StatusInternalServerError, err) - return - } - - wctx.EmptyResponse(http.StatusNoContent) + wctx.EmptyResponse(http.StatusNotImplemented) } // @Summary Retornar histórico de uma determinada tarefa @@ -248,26 +147,5 @@ func (c *TasksV1Controller) DeleteTask(wctx restserver.WebContext) { // @Param pageSize query uint16 true "tamanho da página" minimum(1) default(10) // @Router /api/v1/tasks/{id}/history [get] func (c *TasksV1Controller) GetAllPaginatedTaskHistory(wctx restserver.WebContext) { - var paramId uuid.UUID - paramId, err := uuid.Parse(wctx.PathParam("id")) - if err != nil { - wctx.ErrorResponse(http.StatusBadRequest, errors.New(exceptions.ErrInvalidTaskId)) - return - } - - var params models.TaskHistoryPageParams - if err := wctx.DecodeQueryParams(¶ms); err != nil { - wctx.ErrorResponse(http.StatusBadRequest, err) - return - } - - params.TenantID = uuid.MustParse(wctx.AuthenticationContext().GetTenantID()) - params.TaskID = paramId - tasks, err := c.GetAllPaginatedTaskHistoryUsecase.Execute(wctx.Context(), ¶ms) - if err != nil { - wctx.ErrorResponse(http.StatusInternalServerError, err) - return - } - - wctx.JsonResponse(http.StatusOK, tasks) + wctx.EmptyResponse(http.StatusNotImplemented) } diff --git a/taskflow-service/src/domain/models/task.go b/taskflow-service/src/domain/models/task.go index af62e7b..3c04525 100644 --- a/taskflow-service/src/domain/models/task.go +++ b/taskflow-service/src/domain/models/task.go @@ -1,18 +1,4 @@ package models -import ( - "time" - - "github.com/colibriproject-dev/colibri-sdk-go/pkg/base/types" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/enums" - "github.com/google/uuid" -) - type Task struct { - ID uuid.UUID `json:"id"` - Title string `json:"title"` - Description types.NullString `json:"description"` - Status enums.TaskStatus `json:"status"` - CreatedAt time.Time `json:"createdAt"` - UpdatedAt time.Time `json:"updatedAt"` } diff --git a/taskflow-service/src/domain/models/task_create.go b/taskflow-service/src/domain/models/task_create.go index d9e9240..5a48f47 100644 --- a/taskflow-service/src/domain/models/task_create.go +++ b/taskflow-service/src/domain/models/task_create.go @@ -1,14 +1,4 @@ package models -import ( - "github.com/colibriproject-dev/colibri-sdk-go/pkg/base/types" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/enums" - "github.com/google/uuid" -) - type TaskCreate struct { - Title string `json:"title" validate:"required"` - Description types.NullString `json:"description"` - TenantID uuid.UUID `json:"-"` - Status enums.TaskStatus `json:"-"` } diff --git a/taskflow-service/src/domain/models/task_created.go b/taskflow-service/src/domain/models/task_created.go index f337388..66586c1 100644 --- a/taskflow-service/src/domain/models/task_created.go +++ b/taskflow-service/src/domain/models/task_created.go @@ -1,9 +1,4 @@ package models -import ( - "github.com/google/uuid" -) - type TaskCreated struct { - ID uuid.UUID `json:"id"` } diff --git a/taskflow-service/src/domain/models/task_history.go b/taskflow-service/src/domain/models/task_history.go index 2340a24..864f59b 100644 --- a/taskflow-service/src/domain/models/task_history.go +++ b/taskflow-service/src/domain/models/task_history.go @@ -1,16 +1,10 @@ package models import ( - "time" - "github.com/colibriproject-dev/colibri-sdk-go/pkg/base/types" - "github.com/google/uuid" ) type TaskHistoryPage *types.Page[TaskHistory] type TaskHistory struct { - ID uuid.UUID `json:"id"` - Description string `json:"description"` - CreatedAt time.Time `json:"createdAt"` } diff --git a/taskflow-service/src/domain/models/task_history_create.go b/taskflow-service/src/domain/models/task_history_create.go index 199658c..393d087 100644 --- a/taskflow-service/src/domain/models/task_history_create.go +++ b/taskflow-service/src/domain/models/task_history_create.go @@ -1,11 +1,4 @@ package models -import ( - "github.com/google/uuid" -) - type TaskHistoryCreate struct { - TaskID uuid.UUID `json:"taskId" validate:"required"` - Description string `json:"description" validate:"required"` - TenantID uuid.UUID `json:"-"` } diff --git a/taskflow-service/src/domain/models/task_history_page_params.go b/taskflow-service/src/domain/models/task_history_page_params.go index 885d445..400bf54 100644 --- a/taskflow-service/src/domain/models/task_history_page_params.go +++ b/taskflow-service/src/domain/models/task_history_page_params.go @@ -1,12 +1,4 @@ package models -import ( - "github.com/google/uuid" -) - type TaskHistoryPageParams struct { - Page uint16 `form:"page" validate:"required"` - PageSize uint16 `form:"pageSize" validate:"required"` - TenantID uuid.UUID `form:"-"` - TaskID uuid.UUID `form:"-"` } diff --git a/taskflow-service/src/domain/models/task_list_params.go b/taskflow-service/src/domain/models/task_list_params.go index 540cda5..9f8be8e 100644 --- a/taskflow-service/src/domain/models/task_list_params.go +++ b/taskflow-service/src/domain/models/task_list_params.go @@ -1,10 +1,4 @@ package models -import ( - "github.com/google/uuid" -) - type TaskListParams struct { - Title string `form:"title"` - TenantID uuid.UUID `form:"-"` } diff --git a/taskflow-service/src/domain/models/task_status_update.go b/taskflow-service/src/domain/models/task_status_update.go index 29cb3cd..fb310d6 100644 --- a/taskflow-service/src/domain/models/task_status_update.go +++ b/taskflow-service/src/domain/models/task_status_update.go @@ -1,12 +1,4 @@ package models -import ( - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/enums" - "github.com/google/uuid" -) - type TaskStatusUpdate struct { - Status enums.TaskStatus `json:"status" validate:"required,oneOfTaskStatus"` - TaskID uuid.UUID `json:"-"` - TenantID uuid.UUID `json:"-"` } diff --git a/taskflow-service/src/domain/models/task_update.go b/taskflow-service/src/domain/models/task_update.go index 654444f..fed4fd2 100644 --- a/taskflow-service/src/domain/models/task_update.go +++ b/taskflow-service/src/domain/models/task_update.go @@ -1,13 +1,4 @@ package models -import ( - "github.com/colibriproject-dev/colibri-sdk-go/pkg/base/types" - "github.com/google/uuid" -) - type TaskUpdate struct { - Title string `json:"title" validate:"required"` - Description types.NullString `json:"description"` - TaskID uuid.UUID `json:"-"` - TenantID uuid.UUID `json:"-"` } diff --git a/taskflow-service/src/domain/usecases/create_task_history_usecase.go b/taskflow-service/src/domain/usecases/create_task_history_usecase.go index 1139293..574ea6f 100644 --- a/taskflow-service/src/domain/usecases/create_task_history_usecase.go +++ b/taskflow-service/src/domain/usecases/create_task_history_usecase.go @@ -3,10 +3,7 @@ package usecases import ( "context" - "errors" - "github.com/colibriproject-dev/colibri-sdk-go/pkg/base/logging" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/exceptions" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/models" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/repositories" ) @@ -30,14 +27,5 @@ func NewCreateTaskHistoryUsecase() *CreateTaskHistoryUsecase { } func (u *CreateTaskHistoryUsecase) Execute(ctx context.Context, model *models.TaskHistoryCreate) error { - if err := u.TasksHistoryRepository.Insert(ctx, model); err != nil { - logging.Error(ctx). - Err(err). - AddParam("step", "TasksHistoryRepository.Insert"). - AddParam("model", model). - Msg(errAnErrorOccurredInCreateTaskHistoryUsecaseMsg) - return errors.New(exceptions.ErrOnInsertTaskHistory) - } - return nil } diff --git a/taskflow-service/src/domain/usecases/create_task_usecase.go b/taskflow-service/src/domain/usecases/create_task_usecase.go index 7877dd3..c98bae8 100644 --- a/taskflow-service/src/domain/usecases/create_task_usecase.go +++ b/taskflow-service/src/domain/usecases/create_task_usecase.go @@ -3,11 +3,7 @@ package usecases import ( "context" - "errors" - "github.com/colibriproject-dev/colibri-sdk-go/pkg/base/logging" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/enums" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/exceptions" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/models" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/producers" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/repositories" @@ -35,22 +31,5 @@ func NewCreateTaskUsecase() *CreateTaskUsecase { } func (u *CreateTaskUsecase) Execute(ctx context.Context, model *models.TaskCreate) (*models.TaskCreated, error) { - model.Status = enums.TODO - result, err := u.TasksRepository.Insert(ctx, model) - if err != nil { - logging.Error(ctx). - Err(err). - AddParam("step", "TasksRepository.Insert"). - AddParam("model", model). - Msg(errAnErrorOccurredInCreateTaskUsecaseMsg) - return nil, errors.New(exceptions.ErrOnInsertTask) - } - - u.CreateTaskHistoryProducer.Send(ctx, &models.TaskHistoryCreate{ - TaskID: result.ID, - Description: taskCreatedDescription, - TenantID: model.TenantID, - }) - - return result, nil + return nil, nil } diff --git a/taskflow-service/src/domain/usecases/delete_task_usecase.go b/taskflow-service/src/domain/usecases/delete_task_usecase.go index 364e1b0..e2e8ecd 100644 --- a/taskflow-service/src/domain/usecases/delete_task_usecase.go +++ b/taskflow-service/src/domain/usecases/delete_task_usecase.go @@ -3,12 +3,9 @@ package usecases import ( "context" - "errors" "github.com/google/uuid" - "github.com/colibriproject-dev/colibri-sdk-go/pkg/base/logging" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/exceptions" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/repositories" ) @@ -44,35 +41,9 @@ func (u *DeleteTaskUsecase) Execute(ctx context.Context, taskID, tenantID uuid.U } func (u *DeleteTaskUsecase) validateIfExistsTaskIdBytenantID(ctx context.Context, taskID, tenantID uuid.UUID) error { - exists, err := u.TasksRepository.ExistsById(ctx, taskID, tenantID) - if err != nil { - logging.Error(ctx). - Err(err). - AddParam("step", "TasksRepository.ExistsById"). - AddParam("task_id", taskID). - AddParam("tenant_id", tenantID). - Msg(errAnErrorOccurredInDeleteTaskUsecaseMsg) - return errors.New(exceptions.ErrOnExistsTaskById) - } - - if exists == nil || !*exists { - return errors.New(exceptions.ErrTaskNotExists) - } - return nil } func (u *DeleteTaskUsecase) deleteTask(ctx context.Context, taskID, tenantID uuid.UUID) error { - err := u.TasksRepository.Delete(ctx, taskID, tenantID) - if err != nil { - logging.Error(ctx). - Err(err). - AddParam("step", "TasksRepository.Delete"). - AddParam("task_id", taskID). - AddParam("tenant_id", tenantID). - Msg(errAnErrorOccurredInDeleteTaskUsecaseMsg) - return errors.New(exceptions.ErrOnDeleteTask) - } - return nil } diff --git a/taskflow-service/src/domain/usecases/get_all_paginated_task_history_usecase.go b/taskflow-service/src/domain/usecases/get_all_paginated_task_history_usecase.go index c83025a..2b419ae 100644 --- a/taskflow-service/src/domain/usecases/get_all_paginated_task_history_usecase.go +++ b/taskflow-service/src/domain/usecases/get_all_paginated_task_history_usecase.go @@ -3,10 +3,7 @@ package usecases import ( "context" - "errors" - "github.com/colibriproject-dev/colibri-sdk-go/pkg/base/logging" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/exceptions" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/models" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/repositories" ) @@ -30,14 +27,5 @@ func NewGetAllPaginatedTaskHistoryUsecase() *GetAllPaginatedTaskHistoryUsecase { } func (u *GetAllPaginatedTaskHistoryUsecase) Execute(ctx context.Context, params *models.TaskHistoryPageParams) (models.TaskHistoryPage, error) { - result, err := u.TasksHistoryRepository.FindAllPaginated(ctx, params) - if err != nil { - logging.Error(ctx). - Err(err). - AddParam("step", "TasksHistoryRepository.FindAllPaginated"). - AddParam("params", params). - Msg(errAnErrorOccurredInGetAllPaginatedTaskHistoryUsecaseMsg) - return nil, errors.New(exceptions.ErrOnFindAllPaginatedTaskHistory) - } - return result, nil + return nil, nil } diff --git a/taskflow-service/src/domain/usecases/get_all_task_usecase.go b/taskflow-service/src/domain/usecases/get_all_task_usecase.go index 01a358b..3e52a02 100644 --- a/taskflow-service/src/domain/usecases/get_all_task_usecase.go +++ b/taskflow-service/src/domain/usecases/get_all_task_usecase.go @@ -3,10 +3,7 @@ package usecases import ( "context" - "errors" - "github.com/colibriproject-dev/colibri-sdk-go/pkg/base/logging" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/exceptions" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/models" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/repositories" ) @@ -30,14 +27,5 @@ func NewGetAllTaskUsecase() *GetAllTaskUsecase { } func (u *GetAllTaskUsecase) Execute(ctx context.Context, params *models.TaskListParams) ([]models.Task, error) { - result, err := u.TasksRepository.FindAll(ctx, params) - if err != nil { - logging.Error(ctx). - Err(err). - AddParam("step", "TasksRepository.FindAll"). - AddParam("params", params). - Msg(errAnErrorOccurredInGetAllTaskUsecaseMsg) - return nil, errors.New(exceptions.ErrOnFindAllTask) - } - return result, nil + return nil, nil } diff --git a/taskflow-service/src/domain/usecases/update_task_status_usecase.go b/taskflow-service/src/domain/usecases/update_task_status_usecase.go index d179f91..96d2448 100644 --- a/taskflow-service/src/domain/usecases/update_task_status_usecase.go +++ b/taskflow-service/src/domain/usecases/update_task_status_usecase.go @@ -3,10 +3,7 @@ package usecases import ( "context" - "errors" - "github.com/colibriproject-dev/colibri-sdk-go/pkg/base/logging" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/exceptions" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/models" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/producers" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/repositories" @@ -48,41 +45,12 @@ func (u *UpdateTaskStatusUsecase) Execute(ctx context.Context, model *models.Tas } func (u *UpdateTaskStatusUsecase) validateIfExistsTaskId(ctx context.Context, model *models.TaskStatusUpdate) error { - exists, err := u.TasksRepository.ExistsById(ctx, model.TaskID, model.TenantID) - if err != nil { - logging.Error(ctx). - Err(err). - AddParam("step", "TasksRepository.ExistsById"). - AddParam("model", model). - Msg(errAnErrorOccurredInUpdateTaskStatusUsecaseMsg) - return errors.New(exceptions.ErrOnExistsTaskById) - } - - if exists == nil || !*exists { - return errors.New(exceptions.ErrTaskNotExists) - } - return nil } func (u *UpdateTaskStatusUsecase) updateTask(ctx context.Context, model *models.TaskStatusUpdate) error { - err := u.TasksRepository.UpdateStatus(ctx, model) - if err != nil { - logging.Error(ctx). - Err(err). - AddParam("step", "TasksRepository.UpdateStatus"). - AddParam("model", model). - Msg(errAnErrorOccurredInUpdateTaskStatusUsecaseMsg) - return errors.New(exceptions.ErrOnUpdateTaskStatus) - } - return nil } func (u *UpdateTaskStatusUsecase) sendHistoryNotification(ctx context.Context, model *models.TaskStatusUpdate) { - u.CreateTaskHistoryProducer.Send(ctx, &models.TaskHistoryCreate{ - TaskID: model.TaskID, - Description: taskStatusUpdatedDescription, - TenantID: model.TenantID, - }) } diff --git a/taskflow-service/src/domain/usecases/update_task_usecase.go b/taskflow-service/src/domain/usecases/update_task_usecase.go index 5c4ba97..e20ca57 100644 --- a/taskflow-service/src/domain/usecases/update_task_usecase.go +++ b/taskflow-service/src/domain/usecases/update_task_usecase.go @@ -3,10 +3,7 @@ package usecases import ( "context" - "errors" - "github.com/colibriproject-dev/colibri-sdk-go/pkg/base/logging" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/exceptions" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/models" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/producers" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/repositories" @@ -48,41 +45,12 @@ func (u *UpdateTaskUsecase) Execute(ctx context.Context, model *models.TaskUpdat } func (u *UpdateTaskUsecase) validateIfExistsTaskId(ctx context.Context, model *models.TaskUpdate) error { - exists, err := u.TasksRepository.ExistsById(ctx, model.TaskID, model.TenantID) - if err != nil { - logging.Error(ctx). - Err(err). - AddParam("step", "TasksRepository.ExistsById"). - AddParam("model", model). - Msg(errAnErrorOccurredInUpdateTaskUsecaseMsg) - return errors.New(exceptions.ErrOnExistsTaskById) - } - - if exists == nil || !*exists { - return errors.New(exceptions.ErrTaskNotExists) - } - return nil } func (u *UpdateTaskUsecase) updateTask(ctx context.Context, model *models.TaskUpdate) error { - err := u.TasksRepository.Update(ctx, model) - if err != nil { - logging.Error(ctx). - Err(err). - AddParam("step", "TasksRepository.Update"). - AddParam("model", model). - Msg(errAnErrorOccurredInUpdateTaskUsecaseMsg) - return errors.New(exceptions.ErrOnUpdateTask) - } - return nil } func (u *UpdateTaskUsecase) sendHistoryNotification(ctx context.Context, model *models.TaskUpdate) { - u.CreateTaskHistoryProducer.Send(ctx, &models.TaskHistoryCreate{ - TaskID: model.TaskID, - Description: taskUpdatedDescription, - TenantID: model.TenantID, - }) } diff --git a/taskflow-service/src/infra/repositories/tasks_history_repository.go b/taskflow-service/src/infra/repositories/tasks_history_repository.go index 167a195..845b313 100644 --- a/taskflow-service/src/infra/repositories/tasks_history_repository.go +++ b/taskflow-service/src/infra/repositories/tasks_history_repository.go @@ -4,9 +4,6 @@ package repositories import ( "context" - "github.com/colibriproject-dev/colibri-sdk-go/pkg/base/types" - - "github.com/colibriproject-dev/colibri-sdk-go/pkg/database/sqlDB" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/models" ) @@ -34,16 +31,9 @@ func NewTasksHistoryDBRepository() *TasksHistoryDBRepository { } func (r *TasksHistoryDBRepository) FindAllPaginated(ctx context.Context, params *models.TaskHistoryPageParams) (models.TaskHistoryPage, error) { - return sqlDB.NewPageQuery[models.TaskHistory](ctx, - types.NewPageRequest(params.Page, params.PageSize, []types.Sort{types.NewSort(types.DESC, "th.created_at")}), - tasksHistoryFindAllPaginatedQuery, - params.TenantID, - params.TaskID, - ).Execute() + return nil, nil } func (r *TasksHistoryDBRepository) Insert(ctx context.Context, model *models.TaskHistoryCreate) error { - return sqlDB.NewStatement(ctx, tasksHistoryInsertQuery, - model.TenantID, model.TaskID, model.Description, - ).Execute() + return nil } diff --git a/taskflow-service/src/infra/repositories/tasks_repository.go b/taskflow-service/src/infra/repositories/tasks_repository.go index d4ac2f4..a3daeb8 100644 --- a/taskflow-service/src/infra/repositories/tasks_repository.go +++ b/taskflow-service/src/infra/repositories/tasks_repository.go @@ -4,7 +4,6 @@ package repositories import ( "context" - "github.com/colibriproject-dev/colibri-sdk-go/pkg/database/sqlDB" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/models" "github.com/google/uuid" ) @@ -67,43 +66,29 @@ func NewTasksDBRepository() *TasksDBRepository { } func (r *TasksDBRepository) FindAll(ctx context.Context, params *models.TaskListParams) ([]models.Task, error) { - return sqlDB.NewQuery[models.Task](ctx, tasksFindAllQuery, params.TenantID, params.Title).Many() + return nil, nil } func (r *TasksDBRepository) FindById(ctx context.Context, taskID, tenantID uuid.UUID) (*models.Task, error) { - return sqlDB.NewQuery[models.Task](ctx, tasksFindByIdQuery, tenantID, taskID).One() + return nil, nil } func (r *TasksDBRepository) ExistsById(ctx context.Context, taskID, tenantID uuid.UUID) (*bool, error) { - return sqlDB.NewQuery[bool](ctx, tasksExistsByIdQuery, tenantID, taskID).One() + return nil, nil } func (r *TasksDBRepository) Insert(ctx context.Context, model *models.TaskCreate) (*models.TaskCreated, error) { - return sqlDB.NewQuery[models.TaskCreated](ctx, tasksInsertQuery, - model.TenantID, - model.Title, - model.Description, - model.Status, - ).One() + return nil, nil } func (r *TasksDBRepository) Update(ctx context.Context, model *models.TaskUpdate) error { - return sqlDB.NewStatement(ctx, tasksUpdateQuery, - model.Title, - model.Description, - model.TenantID, - model.TaskID, - ).Execute() + return nil } func (r *TasksDBRepository) UpdateStatus(ctx context.Context, model *models.TaskStatusUpdate) error { - return sqlDB.NewStatement(ctx, tasksUpdateStatusQuery, - model.Status, - model.TenantID, - model.TaskID, - ).Execute() + return nil } func (r *TasksDBRepository) Delete(ctx context.Context, taskID, tenantID uuid.UUID) error { - return sqlDB.NewStatement(ctx, deleteTaskQuery, tenantID, taskID).Execute() + return nil } diff --git a/taskflow-service/tests/application/consumers/create_task_history_consumer_test.go b/taskflow-service/tests/application/consumers/create_task_history_consumer_test.go index ce66c8f..94f1ae0 100644 --- a/taskflow-service/tests/application/consumers/create_task_history_consumer_test.go +++ b/taskflow-service/tests/application/consumers/create_task_history_consumer_test.go @@ -1,16 +1,9 @@ package consumers import ( - "errors" "testing" - "github.com/colibriproject-dev/colibri-sdk-go/pkg/base/security" - "github.com/colibriproject-dev/colibri-sdk-go/pkg/messaging" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/application/consumers" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/models" - usecasesmock "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/usecases/mock" - "github.com/golang/mock/gomock" - "github.com/google/uuid" "github.com/stretchr/testify/assert" ) @@ -27,48 +20,5 @@ func TestNewCreateTaskHistoryConsumer(t *testing.T) { } func TestCreateTaskHistoryConsumer_Consume(t *testing.T) { - receivedMessage := &models.TaskHistoryCreate{ - TaskID: uuid.New(), - Description: "Test description", - } - providerMessageMock := &messaging.ProviderMessage{ - AuthContext: security.NewAuthenticationContext(uuid.NewString(), uuid.NewString()), - Message: receivedMessage, - } - - message := &models.TaskHistoryCreate{ - TaskID: receivedMessage.TaskID, - Description: receivedMessage.Description, - TenantID: uuid.MustParse(providerMessageMock.AuthContext.GetTenantID()), - } - - controller := gomock.NewController(t) - mockCreateTaskHistoryUsecase := usecasesmock.NewMockICreateTaskHistoryUsecase(controller) - consumer := consumers.CreateTaskHistoryConsumer{CreateTaskHistoryUsecase: mockCreateTaskHistoryUsecase} - defer controller.Finish() - - t.Run("Should return error when occurred error in DecodeMessage", func(t *testing.T) { - mockCreateTaskHistoryUsecase.EXPECT().Execute(ctx, message).MaxTimes(0) - - err := consumer.Consume(ctx, &messaging.ProviderMessage{Message: ""}) - - assert.Error(t, err) - }) - - t.Run("Should return error when occurred error in Execute", func(t *testing.T) { - expected := errors.New("mock error in Execute") - mockCreateTaskHistoryUsecase.EXPECT().Execute(ctx, message).Return(expected).MaxTimes(1) - - err := consumer.Consume(ctx, providerMessageMock) - - assert.EqualError(t, err, expected.Error()) - }) - - t.Run("Should consume message and create task history", func(t *testing.T) { - mockCreateTaskHistoryUsecase.EXPECT().Execute(ctx, message).Return(nil).MaxTimes(1) - - err := consumer.Consume(ctx, providerMessageMock) - assert.NoError(t, err) - }) } diff --git a/taskflow-service/tests/application/controllers/tasks_v1_controller_test.go b/taskflow-service/tests/application/controllers/tasks_v1_controller_test.go index 4ae8264..a7f1482 100644 --- a/taskflow-service/tests/application/controllers/tasks_v1_controller_test.go +++ b/taskflow-service/tests/application/controllers/tasks_v1_controller_test.go @@ -1,22 +1,9 @@ package controllers import ( - "encoding/json" - "errors" - "fmt" - "net/http" "testing" - "time" - "github.com/colibriproject-dev/colibri-sdk-go/pkg/base/types" - "github.com/colibriproject-dev/colibri-sdk-go/pkg/web/restserver" appcontrollers "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/application/controllers" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/enums" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/exceptions" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/models" - usecasesmock "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/usecases/mock" - "github.com/golang/mock/gomock" - "github.com/google/uuid" "github.com/stretchr/testify/assert" ) @@ -36,503 +23,19 @@ func TestTasksV1Controller(t *testing.T) { } func TestTasksV1Controller_GetAllTask(t *testing.T) { - controller := gomock.NewController(t) - usecaseMock := usecasesmock.NewMockIGetAllTaskUsecase(controller) - restController := appcontrollers.TasksV1Controller{GetAllTaskUsecase: usecaseMock} - defer controller.Finish() - - const path = "/api/v1/tasks" - const title = "Task" - var url = fmt.Sprintf("%s?title=%s", path, title) - var params = &models.TaskListParams{ - Title: title, - TenantID: uuid.MustParse(restserver.DefaultTestTenantId), - } - - t.Run("Should return internal server error status code when usecase returns a general error", func(t *testing.T) { - expected := errors.New("mock error in usecase") - usecaseMock.EXPECT().Execute(gomock.Any(), params).Return(nil, expected).MaxTimes(1) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodGet, - Path: path, - Url: url, - }, restController.GetAllTask) - - var result restserver.Error - assert.NoError(t, response.DecodeBody(&result)) - assert.EqualValues(t, http.StatusInternalServerError, response.StatusCode()) - assert.EqualError(t, expected, result.Error) - }) - - t.Run("Should return ok status code and tasks", func(t *testing.T) { - expected := []models.Task{ - { - ID: uuid.New(), - Title: "Task 1", - Description: types.NullString{Valid: true, String: "Task description"}, - Status: enums.DONE, - CreatedAt: time.Now().UTC(), - UpdatedAt: time.Now().UTC(), - }, - { - ID: uuid.New(), - Title: "Task 2", - Status: enums.TODO, - CreatedAt: time.Now().UTC().Add(10 * time.Hour), - UpdatedAt: time.Now().UTC().Add(10 * time.Hour), - }, - } - usecaseMock.EXPECT().Execute(gomock.Any(), params).Return(expected, nil).MaxTimes(1) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodGet, - Path: path, - Url: url, - }, restController.GetAllTask) - - var result []models.Task - assert.NoError(t, response.DecodeBody(&result)) - assert.EqualValues(t, http.StatusOK, response.StatusCode()) - assert.NotNil(t, result) - assert.EqualValues(t, expected, result) - }) } func TestTasksV1Controller_CreateTask(t *testing.T) { - controller := gomock.NewController(t) - usecaseMock := usecasesmock.NewMockICreateTaskUsecase(controller) - restController := appcontrollers.TasksV1Controller{CreateTaskUsecase: usecaseMock} - defer controller.Finish() - - const path = "/api/v1/tasks" - body := models.TaskCreate{ - Title: "My new task", - Description: types.NullString{Valid: true, String: "My new task detailed description"}, - } - jsonBody, _ := json.Marshal(body) - - model := &models.TaskCreate{ - Title: body.Title, - Description: body.Description, - TenantID: uuid.MustParse(restserver.DefaultTestTenantId), - } - - t.Run("Should return bad request status code when occurred error in DecodeBody", func(t *testing.T) { - usecaseMock.EXPECT().Execute(gomock.Any(), model).MaxTimes(0) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodPost, - Path: path, - Url: path, - Body: `{}`, - }, restController.CreateTask) - - assert.EqualValues(t, http.StatusBadRequest, response.StatusCode()) - }) - - t.Run("Should return internal server error status code when usecase returns a general error", func(t *testing.T) { - expected := errors.New("mock error in usecase") - usecaseMock.EXPECT().Execute(gomock.Any(), model).Return(nil, expected).MaxTimes(1) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodPost, - Path: path, - Url: path, - Body: string(jsonBody), - }, restController.CreateTask) - - var result restserver.Error - assert.NoError(t, response.DecodeBody(&result)) - assert.EqualValues(t, http.StatusInternalServerError, response.StatusCode()) - assert.EqualError(t, expected, result.Error) - }) - - t.Run("Should return created status code and created task data", func(t *testing.T) { - expected := models.TaskCreated{ID: uuid.New()} - usecaseMock.EXPECT().Execute(gomock.Any(), model).Return(&expected, nil).MaxTimes(1) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodPost, - Path: path, - Url: path, - Body: string(jsonBody), - }, restController.CreateTask) - - var result models.TaskCreated - assert.NoError(t, response.DecodeBody(&result)) - assert.EqualValues(t, http.StatusCreated, response.StatusCode()) - assert.EqualValues(t, expected, result) - }) } func TestTasksV1Controller_UpdateTask(t *testing.T) { - controller := gomock.NewController(t) - usecaseMock := usecasesmock.NewMockIUpdateTaskUsecase(controller) - restController := appcontrollers.TasksV1Controller{UpdateTaskUsecase: usecaseMock} - defer controller.Finish() - - const path = "/api/v1/tasks/{id}" - taskId := uuid.New() - url := fmt.Sprintf("/api/v1/tasks/%s", taskId) - body := models.TaskUpdate{ - Title: "My task title updated", - Description: types.NullString{Valid: true, String: "My task description updated"}, - } - jsonBody, _ := json.Marshal(body) - model := &models.TaskUpdate{ - Title: body.Title, - Description: body.Description, - TaskID: taskId, - TenantID: uuid.MustParse(restserver.DefaultTestTenantId), - } - - t.Run("Should return bad request status code when occurred error in GetPathParam", func(t *testing.T) { - expected := errors.New(exceptions.ErrInvalidTaskId) - usecaseMock.EXPECT().Execute(gomock.Any(), model).MaxTimes(0) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodPut, - Path: path, - Url: "/api/v1/tasks/abc", - Body: string(jsonBody), - }, restController.UpdateTask) - - var result restserver.Error - assert.NoError(t, response.DecodeBody(&result)) - assert.EqualValues(t, http.StatusBadRequest, response.StatusCode()) - assert.EqualError(t, expected, result.Error) - }) - - t.Run("Should return bad request status code when occurred error in DecodeBody", func(t *testing.T) { - usecaseMock.EXPECT().Execute(gomock.Any(), model).MaxTimes(0) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodPut, - Path: path, - Url: url, - Body: `{}`, - }, restController.UpdateTask) - - assert.EqualValues(t, http.StatusBadRequest, response.StatusCode()) - }) - - t.Run("Should return bad request status code when usecase returns ErrTaskNotExists error", func(t *testing.T) { - expected := errors.New(exceptions.ErrTaskNotExists) - usecaseMock.EXPECT().Execute(gomock.Any(), model).Return(expected).MaxTimes(1) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodPut, - Path: path, - Url: url, - Body: string(jsonBody), - }, restController.UpdateTask) - - var result restserver.Error - assert.NoError(t, response.DecodeBody(&result)) - assert.EqualValues(t, http.StatusBadRequest, response.StatusCode()) - assert.EqualError(t, expected, result.Error) - }) - - t.Run("Should return internal server error status code when usecase returns a general error", func(t *testing.T) { - expected := errors.New("mock error in usecase") - usecaseMock.EXPECT().Execute(gomock.Any(), model).Return(expected).MaxTimes(1) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodPut, - Path: path, - Url: url, - Body: string(jsonBody), - }, restController.UpdateTask) - - var result restserver.Error - assert.NoError(t, response.DecodeBody(&result)) - assert.EqualValues(t, http.StatusInternalServerError, response.StatusCode()) - assert.EqualError(t, expected, result.Error) - }) - - t.Run("Should return no content status code when update task successfully", func(t *testing.T) { - usecaseMock.EXPECT().Execute(gomock.Any(), model).Return(nil).MaxTimes(1) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodPut, - Path: path, - Url: url, - Body: string(jsonBody), - }, restController.UpdateTask) - - assert.EqualValues(t, http.StatusNoContent, response.StatusCode()) - }) } func TestTasksV1Controller_UpdateTaskStatus(t *testing.T) { - controller := gomock.NewController(t) - usecaseMock := usecasesmock.NewMockIUpdateTaskStatusUsecase(controller) - restController := appcontrollers.TasksV1Controller{UpdateTaskStatusUsecase: usecaseMock} - defer controller.Finish() - - const path = "/api/v1/tasks/{id}" - taskId := uuid.New() - url := fmt.Sprintf("/api/v1/tasks/%s", taskId) - body := models.TaskStatusUpdate{Status: enums.DONE} - jsonBody, _ := json.Marshal(body) - model := &models.TaskStatusUpdate{ - Status: body.Status, - TaskID: taskId, - TenantID: uuid.MustParse(restserver.DefaultTestTenantId), - } - - t.Run("Should return bad request status code when occurred error in GetPathParam", func(t *testing.T) { - expected := errors.New(exceptions.ErrInvalidTaskId) - usecaseMock.EXPECT().Execute(gomock.Any(), model).MaxTimes(0) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodPatch, - Path: path, - Url: "/api/v1/tasks/abc", - Body: string(jsonBody), - }, restController.UpdateTaskStatus) - - var result restserver.Error - assert.NoError(t, response.DecodeBody(&result)) - assert.EqualValues(t, http.StatusBadRequest, response.StatusCode()) - assert.EqualError(t, expected, result.Error) - }) - - t.Run("Should return bad request status code when occurred error in DecodeBody", func(t *testing.T) { - usecaseMock.EXPECT().Execute(gomock.Any(), model).MaxTimes(0) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodPatch, - Path: path, - Url: url, - Body: `{}`, - }, restController.UpdateTaskStatus) - - assert.EqualValues(t, http.StatusBadRequest, response.StatusCode()) - }) - - t.Run("Should return bad request status code status code when usecase returns ErrTaskNotExists error", func(t *testing.T) { - expected := errors.New(exceptions.ErrTaskNotExists) - usecaseMock.EXPECT().Execute(gomock.Any(), model).Return(expected).MaxTimes(1) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodPatch, - Path: path, - Url: url, - Body: string(jsonBody), - }, restController.UpdateTaskStatus) - - var result restserver.Error - assert.NoError(t, response.DecodeBody(&result)) - assert.EqualValues(t, http.StatusBadRequest, response.StatusCode()) - assert.EqualError(t, expected, result.Error) - }) - - t.Run("Should return internal server error status code when usecase returns a general error", func(t *testing.T) { - expected := errors.New("mock error in usecase") - usecaseMock.EXPECT().Execute(gomock.Any(), model).Return(expected).MaxTimes(1) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodPatch, - Path: path, - Url: url, - Body: string(jsonBody), - }, restController.UpdateTaskStatus) - - var result restserver.Error - assert.NoError(t, response.DecodeBody(&result)) - assert.EqualValues(t, http.StatusInternalServerError, response.StatusCode()) - assert.EqualError(t, expected, result.Error) - }) - - t.Run("Should return no content status code when update task status successfully", func(t *testing.T) { - usecaseMock.EXPECT().Execute(gomock.Any(), model).Return(nil).MaxTimes(1) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodPatch, - Path: path, - Url: url, - Body: string(jsonBody), - }, restController.UpdateTaskStatus) - - assert.EqualValues(t, http.StatusNoContent, response.StatusCode()) - }) } func TestTasksV1Controller_DeleteTask(t *testing.T) { - controller := gomock.NewController(t) - usecaseMock := usecasesmock.NewMockIDeleteTaskUsecase(controller) - restController := appcontrollers.TasksV1Controller{DeleteTaskUsecase: usecaseMock} - defer controller.Finish() - - const path = "/api/v1/tasks/{id}" - taskID := uuid.New() - url := fmt.Sprintf("/api/v1/tasks/%s", taskID) - tenantID := uuid.MustParse(restserver.DefaultTestTenantId) - - t.Run("Should return bad request status code when occurred error in GetPathParam", func(t *testing.T) { - expected := errors.New(exceptions.ErrInvalidTaskId) - usecaseMock.EXPECT().Execute(gomock.Any(), taskID, tenantID).MaxTimes(0) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodDelete, - Path: path, - Url: "/api/v1/tasks/abc", - }, restController.DeleteTask) - - var result restserver.Error - assert.NoError(t, response.DecodeBody(&result)) - assert.EqualValues(t, http.StatusBadRequest, response.StatusCode()) - assert.EqualError(t, expected, result.Error) - }) - - t.Run("Should return bad request status code when usecase returns ErrTaskNotExists", func(t *testing.T) { - expected := errors.New(exceptions.ErrTaskNotExists) - usecaseMock.EXPECT().Execute(gomock.Any(), taskID, tenantID).Return(expected).MaxTimes(1) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodDelete, - Path: path, - Url: url, - }, restController.DeleteTask) - - var result restserver.Error - assert.NoError(t, response.DecodeBody(&result)) - assert.EqualValues(t, http.StatusBadRequest, response.StatusCode()) - assert.EqualError(t, expected, result.Error) - }) - - t.Run("Should return internal server error status code when usecase returns a general error", func(t *testing.T) { - expected := errors.New("mock error in usecase") - usecaseMock.EXPECT().Execute(gomock.Any(), taskID, tenantID).Return(expected).MaxTimes(1) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodDelete, - Path: path, - Url: url, - }, restController.DeleteTask) - - var result restserver.Error - assert.NoError(t, response.DecodeBody(&result)) - assert.EqualValues(t, http.StatusInternalServerError, response.StatusCode()) - assert.EqualError(t, expected, result.Error) - }) - - t.Run("Should return no content status code when delete task successfully", func(t *testing.T) { - usecaseMock.EXPECT().Execute(gomock.Any(), taskID, tenantID).Return(nil).MaxTimes(1) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodDelete, - Path: path, - Url: url, - }, restController.DeleteTask) - - assert.EqualValues(t, http.StatusNoContent, response.StatusCode()) - }) } func TestTasksV1Controller_GetAllPaginatedTaskHistory(t *testing.T) { - controller := gomock.NewController(t) - usecaseMock := usecasesmock.NewMockIGetAllPaginatedTaskHistoryUsecase(controller) - restController := appcontrollers.TasksV1Controller{GetAllPaginatedTaskHistoryUsecase: usecaseMock} - defer controller.Finish() - - const path = "/api/v1/tasks/{id}/history" - const page = 1 - const pageSize = 10 - var taskID = uuid.New() - var url = fmt.Sprintf("/api/v1/tasks/%s/history?page=%d&pageSize=%d", taskID, page, pageSize) - var params = &models.TaskHistoryPageParams{ - Page: page, - PageSize: pageSize, - TenantID: uuid.MustParse(restserver.DefaultTestTenantId), - TaskID: taskID, - } - - t.Run("Should return bad request status code when occurred error in GetPathParam", func(t *testing.T) { - expected := errors.New(exceptions.ErrInvalidTaskId) - usecaseMock.EXPECT().Execute(gomock.Any(), params).MaxTimes(0) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodGet, - Path: path, - Url: "/api/v1/tasks/abc/history", - }, restController.GetAllPaginatedTaskHistory) - - var result restserver.Error - assert.NoError(t, response.DecodeBody(&result)) - assert.EqualValues(t, http.StatusBadRequest, response.StatusCode()) - assert.EqualError(t, expected, result.Error) - }) - - t.Run("Should return bad request status code when occurred error in page query parameter decoding", func(t *testing.T) { - usecaseMock.EXPECT().Execute(gomock.Any(), params).MaxTimes(0) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodGet, - Path: path, - Url: fmt.Sprintf("/api/v1/tasks/%s/history?page=%s&pageSize=%d", taskID, "abc", pageSize), - }, restController.GetAllPaginatedTaskHistory) - - var result restserver.Error - assert.NoError(t, response.DecodeBody(&result)) - assert.EqualValues(t, http.StatusBadRequest, response.StatusCode()) - }) - - t.Run("Should return bad request status code when occurred error in pageSize query parameter decoding", func(t *testing.T) { - usecaseMock.EXPECT().Execute(gomock.Any(), params).MaxTimes(0) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodGet, - Path: path, - Url: fmt.Sprintf("/api/v1/tasks/%s/history?page=%d&pageSize=%s", taskID, page, "abc"), - }, restController.GetAllPaginatedTaskHistory) - - var result restserver.Error - assert.NoError(t, response.DecodeBody(&result)) - assert.EqualValues(t, http.StatusBadRequest, response.StatusCode()) - }) - - t.Run("Should return internal server error status code when usecase returns a general error", func(t *testing.T) { - expected := errors.New("mock error in usecase") - usecaseMock.EXPECT().Execute(gomock.Any(), params).Return(nil, expected).MaxTimes(1) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodGet, - Path: path, - Url: url, - }, restController.GetAllPaginatedTaskHistory) - - var result restserver.Error - assert.NoError(t, response.DecodeBody(&result)) - assert.EqualValues(t, http.StatusInternalServerError, response.StatusCode()) - assert.EqualError(t, expected, result.Error) - }) - - t.Run("Should return ok status code and task history", func(t *testing.T) { - var expected models.TaskHistoryPage = &types.Page[models.TaskHistory]{ - TotalItems: 1, - Items: []models.TaskHistory{ - { - ID: uuid.New(), - Description: "My task description", - CreatedAt: time.Now().UTC(), - }, - }, - } - usecaseMock.EXPECT().Execute(gomock.Any(), params).Return(expected, nil).MaxTimes(1) - - response := restserver.NewRequestTest(&restserver.RequestTest{ - Method: http.MethodGet, - Path: path, - Url: url, - }, restController.GetAllPaginatedTaskHistory) - - var result models.TaskHistoryPage - assert.NoError(t, response.DecodeBody(&result)) - assert.EqualValues(t, http.StatusOK, response.StatusCode()) - assert.NotNil(t, result) - assert.EqualValues(t, expected, result) - }) } diff --git a/taskflow-service/tests/domain/usecases/create_task_history_usecase_test.go b/taskflow-service/tests/domain/usecases/create_task_history_usecase_test.go index e031340..51d4e0b 100644 --- a/taskflow-service/tests/domain/usecases/create_task_history_usecase_test.go +++ b/taskflow-service/tests/domain/usecases/create_task_history_usecase_test.go @@ -1,15 +1,9 @@ package usecases import ( - "errors" "testing" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/exceptions" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/models" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/usecases" - repositoriesmock "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/repositories/mock" - "github.com/golang/mock/gomock" - "github.com/google/uuid" "github.com/stretchr/testify/assert" ) @@ -22,32 +16,4 @@ func TestCreateTaskHistoryUsecase(t *testing.T) { } func TestCreateTaskHistoryUsecase_Execute(t *testing.T) { - controller := gomock.NewController(t) - tasksHistoryRepository := repositoriesmock.NewMockITasksHistoryRepository(controller) - usecase := usecases.CreateTaskHistoryUsecase{TasksHistoryRepository: tasksHistoryRepository} - defer controller.Finish() - - model := &models.TaskHistoryCreate{ - TenantID: uuid.New(), - TaskID: uuid.New(), - Description: "Test description", - } - - t.Run("Should return ErrOnInsertTaskHistory when occurred error in Insert", func(t *testing.T) { - expected := exceptions.ErrOnInsertTaskHistory - tasksHistoryRepository.EXPECT().Insert(ctx, model).Return(errors.New("Insert error")).MaxTimes(1) - - err := usecase.Execute(ctx, model) - - assert.Error(t, err) - assert.EqualError(t, err, expected) - }) - - t.Run("Should create task history", func(t *testing.T) { - tasksHistoryRepository.EXPECT().Insert(ctx, model).Return(nil).MaxTimes(1) - - err := usecase.Execute(ctx, model) - - assert.NoError(t, err) - }) } diff --git a/taskflow-service/tests/domain/usecases/create_task_usecase_test.go b/taskflow-service/tests/domain/usecases/create_task_usecase_test.go index 48d1081..813ce2e 100644 --- a/taskflow-service/tests/domain/usecases/create_task_usecase_test.go +++ b/taskflow-service/tests/domain/usecases/create_task_usecase_test.go @@ -1,18 +1,9 @@ package usecases import ( - "errors" "testing" - "github.com/colibriproject-dev/colibri-sdk-go/pkg/base/types" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/enums" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/exceptions" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/models" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/usecases" - producersmock "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/producers/mock" - repositoriesmock "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/repositories/mock" - "github.com/golang/mock/gomock" - "github.com/google/uuid" "github.com/stretchr/testify/assert" ) @@ -26,47 +17,4 @@ func TestCreateTaskUsecase(t *testing.T) { } func TestCreateTaskUsecase_Execute(t *testing.T) { - controller := gomock.NewController(t) - tasksRepository := repositoriesmock.NewMockITasksRepository(controller) - createTaskHistoryProducer := producersmock.NewMockICreateTaskHistoryProducer(controller) - usecase := usecases.CreateTaskUsecase{ - TasksRepository: tasksRepository, - CreateTaskHistoryProducer: createTaskHistoryProducer, - } - defer controller.Finish() - - model := &models.TaskCreate{ - Title: "Test title description", - Description: types.NullString{Valid: true, String: "Test task description"}, - Status: enums.TODO, - TenantID: uuid.New(), - } - - t.Run("Should return ErrOnInsertTask when occurred error in Insert", func(t *testing.T) { - expected := exceptions.ErrOnInsertTask - tasksRepository.EXPECT().Insert(ctx, model).Return(nil, errors.New("Insert error")).MaxTimes(1) - createTaskHistoryProducer.EXPECT().Send(gomock.Any(), gomock.Any()).Times(0) - - result, err := usecase.Execute(ctx, model) - - assert.Error(t, err) - assert.EqualError(t, err, expected) - assert.Nil(t, result) - }) - - t.Run("Should create task and return task created data", func(t *testing.T) { - expectedTask := &models.TaskCreated{ID: uuid.New()} - expectedHistory := &models.TaskHistoryCreate{ - TaskID: expectedTask.ID, - Description: "Task created", - TenantID: model.TenantID, - } - tasksRepository.EXPECT().Insert(ctx, model).Return(expectedTask, nil).MaxTimes(1) - createTaskHistoryProducer.EXPECT().Send(ctx, expectedHistory).Times(1) - - result, err := usecase.Execute(ctx, model) - - assert.NoError(t, err) - assert.EqualValues(t, expectedTask, result) - }) } diff --git a/taskflow-service/tests/domain/usecases/delete_task_usecase_test.go b/taskflow-service/tests/domain/usecases/delete_task_usecase_test.go index 1808f60..ba45833 100644 --- a/taskflow-service/tests/domain/usecases/delete_task_usecase_test.go +++ b/taskflow-service/tests/domain/usecases/delete_task_usecase_test.go @@ -1,14 +1,9 @@ package usecases import ( - "errors" "testing" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/exceptions" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/usecases" - repositoriesmock "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/repositories/mock" - "github.com/golang/mock/gomock" - "github.com/google/uuid" "github.com/stretchr/testify/assert" ) @@ -21,66 +16,4 @@ func TestDeleteTaskUsecase(t *testing.T) { } func TestDeleteTaskUsecase_Execute(t *testing.T) { - controller := gomock.NewController(t) - tasksRepository := repositoriesmock.NewMockITasksRepository(controller) - usecase := usecases.DeleteTaskUsecase{ - TasksRepository: tasksRepository, - } - defer controller.Finish() - - taskID := uuid.New() - tenantID := uuid.New() - - t.Run("Should return ErrOnExistsTaskById when occurred error in ExistsById", func(t *testing.T) { - expected := exceptions.ErrOnExistsTaskById - tasksRepository.EXPECT().ExistsById(ctx, taskID, tenantID).Return(nil, errors.New("ExistsById error")).MaxTimes(1) - tasksRepository.EXPECT().Delete(ctx, taskID, tenantID).MaxTimes(0) - - err := usecase.Execute(ctx, taskID, tenantID) - - assert.Error(t, err) - assert.EqualError(t, err, expected) - }) - - t.Run("Should return ErrTaskNotExists when returns nil in ExistsById", func(t *testing.T) { - expected := exceptions.ErrTaskNotExists - tasksRepository.EXPECT().ExistsById(ctx, taskID, tenantID).Return(nil, nil).MaxTimes(1) - tasksRepository.EXPECT().Delete(ctx, taskID, tenantID).MaxTimes(0) - - err := usecase.Execute(ctx, taskID, tenantID) - - assert.Error(t, err) - assert.EqualError(t, err, expected) - }) - - t.Run("Should return ErrTaskNotExists when returns false in ExistsById", func(t *testing.T) { - expected := exceptions.ErrTaskNotExists - tasksRepository.EXPECT().ExistsById(ctx, taskID, tenantID).Return(¬Exists, nil).MaxTimes(1) - tasksRepository.EXPECT().Delete(ctx, taskID, tenantID).MaxTimes(0) - - err := usecase.Execute(ctx, taskID, tenantID) - - assert.Error(t, err) - assert.EqualError(t, err, expected) - }) - - t.Run("Should return ErrOnDeleteTask when occurred error in Delete", func(t *testing.T) { - expected := exceptions.ErrOnDeleteTask - tasksRepository.EXPECT().ExistsById(ctx, taskID, tenantID).Return(&exists, nil).MaxTimes(1) - tasksRepository.EXPECT().Delete(ctx, taskID, tenantID).Return(errors.New("Delete error")).MaxTimes(1) - - err := usecase.Execute(ctx, taskID, tenantID) - - assert.Error(t, err) - assert.EqualError(t, err, expected) - }) - - t.Run("Should delete task", func(t *testing.T) { - tasksRepository.EXPECT().ExistsById(ctx, taskID, tenantID).Return(&exists, nil).MaxTimes(1) - tasksRepository.EXPECT().Delete(ctx, taskID, tenantID).Return(nil).MaxTimes(1) - - err := usecase.Execute(ctx, taskID, tenantID) - - assert.NoError(t, err) - }) } diff --git a/taskflow-service/tests/domain/usecases/get_all_paginated_task_history_usecase_test.go b/taskflow-service/tests/domain/usecases/get_all_paginated_task_history_usecase_test.go index a6383f3..ad4079b 100644 --- a/taskflow-service/tests/domain/usecases/get_all_paginated_task_history_usecase_test.go +++ b/taskflow-service/tests/domain/usecases/get_all_paginated_task_history_usecase_test.go @@ -1,17 +1,9 @@ package usecases import ( - "errors" "testing" - "time" - "github.com/colibriproject-dev/colibri-sdk-go/pkg/base/types" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/exceptions" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/models" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/usecases" - repositoriesmock "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/repositories/mock" - "github.com/golang/mock/gomock" - "github.com/google/uuid" "github.com/stretchr/testify/assert" ) @@ -24,52 +16,4 @@ func TestGetAllPaginatedTaskHistoryUsecase(t *testing.T) { } func TestGetAllPaginatedTaskHistoryUsecase_Execute(t *testing.T) { - controller := gomock.NewController(t) - tasksHistoryRepository := repositoriesmock.NewMockITasksHistoryRepository(controller) - usecase := usecases.GetAllPaginatedTaskHistoryUsecase{ - TasksHistoryRepository: tasksHistoryRepository, - } - defer controller.Finish() - - params := &models.TaskHistoryPageParams{ - Page: 1, - PageSize: 10, - TenantID: uuid.New(), - TaskID: uuid.New(), - } - - t.Run("Should return ErrOnFindAllPaginatedTaskHistory when occurred error in FindAllPaginated", func(t *testing.T) { - expected := exceptions.ErrOnFindAllPaginatedTaskHistory - tasksHistoryRepository.EXPECT().FindAllPaginated(ctx, params).Return(nil, errors.New("FindAllPaginated error")).MaxTimes(1) - - result, err := usecase.Execute(ctx, params) - - assert.Error(t, err) - assert.EqualError(t, err, expected) - assert.Nil(t, result) - }) - - t.Run("Should return paginated task history data", func(t *testing.T) { - var expected models.TaskHistoryPage = &types.Page[models.TaskHistory]{ - TotalItems: 2, - Items: []models.TaskHistory{ - { - ID: uuid.New(), - Description: "Task created", - CreatedAt: time.Now().UTC(), - }, - { - ID: uuid.New(), - Description: "Task updated", - CreatedAt: time.Now().UTC().Add(10 * time.Minute), - }, - }, - } - tasksHistoryRepository.EXPECT().FindAllPaginated(ctx, params).Return(expected, nil).MaxTimes(1) - - result, err := usecase.Execute(ctx, params) - - assert.NoError(t, err) - assert.EqualValues(t, expected, result) - }) } diff --git a/taskflow-service/tests/domain/usecases/get_all_task_usecase_test.go b/taskflow-service/tests/domain/usecases/get_all_task_usecase_test.go index 3564bde..5d360a2 100644 --- a/taskflow-service/tests/domain/usecases/get_all_task_usecase_test.go +++ b/taskflow-service/tests/domain/usecases/get_all_task_usecase_test.go @@ -1,18 +1,9 @@ package usecases import ( - "errors" "testing" - "time" - "github.com/colibriproject-dev/colibri-sdk-go/pkg/base/types" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/enums" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/exceptions" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/models" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/usecases" - repositoriesmock "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/repositories/mock" - "github.com/golang/mock/gomock" - "github.com/google/uuid" "github.com/stretchr/testify/assert" ) @@ -25,53 +16,4 @@ func TestGetAllTaskUsecase(t *testing.T) { } func TestGetAllTaskUsecase_Execute(t *testing.T) { - controller := gomock.NewController(t) - tasksRepository := repositoriesmock.NewMockITasksRepository(controller) - usecase := usecases.GetAllTaskUsecase{ - TasksRepository: tasksRepository, - } - defer controller.Finish() - - params := &models.TaskListParams{ - Title: "My task", - TenantID: uuid.New(), - } - - t.Run("Should return ErrOnFindAllTask when occurred error in FindAll", func(t *testing.T) { - expected := exceptions.ErrOnFindAllTask - tasksRepository.EXPECT().FindAll(ctx, params).Return(nil, errors.New("FindAll error")).MaxTimes(1) - - result, err := usecase.Execute(ctx, params) - - assert.Error(t, err) - assert.EqualError(t, err, expected) - assert.Nil(t, result) - }) - - t.Run("Should return task data", func(t *testing.T) { - expected := []models.Task{ - { - ID: uuid.New(), - Title: "My task 1 title", - Description: types.NullString{String: "Task task 1 description", Valid: true}, - Status: enums.DONE, - CreatedAt: time.Now().UTC(), - UpdatedAt: time.Now().UTC().Add(10 * time.Hour), - }, - { - ID: uuid.New(), - Title: "My task 2 title", - Description: types.NullString{String: "Task task 2 description", Valid: true}, - Status: enums.TODO, - CreatedAt: time.Now().UTC(), - UpdatedAt: time.Now().UTC(), - }, - } - tasksRepository.EXPECT().FindAll(ctx, params).Return(expected, nil).MaxTimes(1) - - result, err := usecase.Execute(ctx, params) - - assert.NoError(t, err) - assert.EqualValues(t, expected, result) - }) } diff --git a/taskflow-service/tests/domain/usecases/update_task_status_usecase_test.go b/taskflow-service/tests/domain/usecases/update_task_status_usecase_test.go index 6c455e8..74fc8d5 100644 --- a/taskflow-service/tests/domain/usecases/update_task_status_usecase_test.go +++ b/taskflow-service/tests/domain/usecases/update_task_status_usecase_test.go @@ -1,17 +1,9 @@ package usecases import ( - "errors" "testing" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/enums" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/exceptions" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/models" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/usecases" - producersmock "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/producers/mock" - repositoriesmock "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/repositories/mock" - "github.com/golang/mock/gomock" - "github.com/google/uuid" "github.com/stretchr/testify/assert" ) @@ -25,81 +17,4 @@ func TestUpdateTaskStatusUsecase(t *testing.T) { } func TestUpdateTaskStatusUsecase_Execute(t *testing.T) { - controller := gomock.NewController(t) - tasksRepository := repositoriesmock.NewMockITasksRepository(controller) - createTaskHistoryProducer := producersmock.NewMockICreateTaskHistoryProducer(controller) - usecase := usecases.UpdateTaskStatusUsecase{ - TasksRepository: tasksRepository, - CreateTaskHistoryProducer: createTaskHistoryProducer, - } - defer controller.Finish() - - model := &models.TaskStatusUpdate{ - Status: enums.DONE, - TaskID: uuid.New(), - TenantID: uuid.New(), - } - - t.Run("Should return ErrOnExistsTaskById when occurred error in ExistsById", func(t *testing.T) { - expected := exceptions.ErrOnExistsTaskById - tasksRepository.EXPECT().ExistsById(ctx, model.TaskID, model.TenantID).Return(nil, errors.New("ExistsById error")).MaxTimes(1) - tasksRepository.EXPECT().UpdateStatus(ctx, model).MaxTimes(0) - createTaskHistoryProducer.EXPECT().Send(gomock.Any(), gomock.Any()).Times(0) - - err := usecase.Execute(ctx, model) - - assert.Error(t, err) - assert.EqualError(t, err, expected) - }) - - t.Run("Should return ErrTaskNotExists when returns nil in ExistsById", func(t *testing.T) { - expected := exceptions.ErrTaskNotExists - tasksRepository.EXPECT().ExistsById(ctx, model.TaskID, model.TenantID).Return(nil, nil).MaxTimes(1) - tasksRepository.EXPECT().UpdateStatus(ctx, model).MaxTimes(0) - createTaskHistoryProducer.EXPECT().Send(gomock.Any(), gomock.Any()).Times(0) - - err := usecase.Execute(ctx, model) - - assert.Error(t, err) - assert.EqualError(t, err, expected) - }) - - t.Run("Should return ErrTaskNotExists when returns false in ExistsById", func(t *testing.T) { - expected := exceptions.ErrTaskNotExists - tasksRepository.EXPECT().ExistsById(ctx, model.TaskID, model.TenantID).Return(¬Exists, nil).MaxTimes(1) - tasksRepository.EXPECT().UpdateStatus(ctx, model).MaxTimes(0) - createTaskHistoryProducer.EXPECT().Send(gomock.Any(), gomock.Any()).Times(0) - - err := usecase.Execute(ctx, model) - - assert.Error(t, err) - assert.EqualError(t, err, expected) - }) - - t.Run("Should return ErrOnUpdateTaskStatus when occurred error in UpdateStatus", func(t *testing.T) { - expected := exceptions.ErrOnUpdateTaskStatus - tasksRepository.EXPECT().ExistsById(ctx, model.TaskID, model.TenantID).Return(&exists, nil).MaxTimes(1) - tasksRepository.EXPECT().UpdateStatus(ctx, model).Return(errors.New("UpdateStatus error")).MaxTimes(1) - createTaskHistoryProducer.EXPECT().Send(gomock.Any(), gomock.Any()).Times(0) - - err := usecase.Execute(ctx, model) - - assert.Error(t, err) - assert.EqualError(t, err, expected) - }) - - t.Run("Should update task status", func(t *testing.T) { - expectedHistory := &models.TaskHistoryCreate{ - TaskID: model.TaskID, - Description: "Task status updated", - TenantID: model.TenantID, - } - tasksRepository.EXPECT().ExistsById(ctx, model.TaskID, model.TenantID).Return(&exists, nil).MaxTimes(1) - tasksRepository.EXPECT().UpdateStatus(ctx, model).Return(nil).MaxTimes(1) - createTaskHistoryProducer.EXPECT().Send(ctx, expectedHistory).Times(1) - - err := usecase.Execute(ctx, model) - - assert.NoError(t, err) - }) } diff --git a/taskflow-service/tests/domain/usecases/update_task_usecase_test.go b/taskflow-service/tests/domain/usecases/update_task_usecase_test.go index f1874c6..2967cf1 100644 --- a/taskflow-service/tests/domain/usecases/update_task_usecase_test.go +++ b/taskflow-service/tests/domain/usecases/update_task_usecase_test.go @@ -1,17 +1,9 @@ package usecases import ( - "errors" "testing" - "github.com/colibriproject-dev/colibri-sdk-go/pkg/base/types" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/exceptions" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/models" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/usecases" - producersmock "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/producers/mock" - repositoriesmock "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/repositories/mock" - "github.com/golang/mock/gomock" - "github.com/google/uuid" "github.com/stretchr/testify/assert" ) @@ -25,82 +17,4 @@ func TestUpdateTaskUsecase(t *testing.T) { } func TestUpdateTaskUsecase_Execute(t *testing.T) { - controller := gomock.NewController(t) - tasksRepository := repositoriesmock.NewMockITasksRepository(controller) - createTaskHistoryProducer := producersmock.NewMockICreateTaskHistoryProducer(controller) - usecase := usecases.UpdateTaskUsecase{ - TasksRepository: tasksRepository, - CreateTaskHistoryProducer: createTaskHistoryProducer, - } - defer controller.Finish() - - model := &models.TaskUpdate{ - Title: "New Task Title", - Description: types.NullString{Valid: true, String: "New Task Description"}, - TaskID: uuid.New(), - TenantID: uuid.New(), - } - - t.Run("Should return ErrOnExistsTaskById when occurred error in ExistsById", func(t *testing.T) { - expected := exceptions.ErrOnExistsTaskById - tasksRepository.EXPECT().ExistsById(ctx, model.TaskID, model.TenantID).Return(nil, errors.New("ExistsById error")).MaxTimes(1) - tasksRepository.EXPECT().Update(ctx, model).MaxTimes(0) - createTaskHistoryProducer.EXPECT().Send(gomock.Any(), gomock.Any()).Times(0) - - err := usecase.Execute(ctx, model) - - assert.Error(t, err) - assert.EqualError(t, err, expected) - }) - - t.Run("Should return ErrTaskNotExists when returns nil in ExistsById", func(t *testing.T) { - expected := exceptions.ErrTaskNotExists - tasksRepository.EXPECT().ExistsById(ctx, model.TaskID, model.TenantID).Return(nil, nil).MaxTimes(1) - tasksRepository.EXPECT().Update(ctx, model).MaxTimes(0) - createTaskHistoryProducer.EXPECT().Send(gomock.Any(), gomock.Any()).Times(0) - - err := usecase.Execute(ctx, model) - - assert.Error(t, err) - assert.EqualError(t, err, expected) - }) - - t.Run("Should return ErrTaskNotExists when returns false in ExistsById", func(t *testing.T) { - expected := exceptions.ErrTaskNotExists - tasksRepository.EXPECT().ExistsById(ctx, model.TaskID, model.TenantID).Return(¬Exists, nil).MaxTimes(1) - tasksRepository.EXPECT().Update(ctx, model).MaxTimes(0) - createTaskHistoryProducer.EXPECT().Send(gomock.Any(), gomock.Any()).Times(0) - - err := usecase.Execute(ctx, model) - - assert.Error(t, err) - assert.EqualError(t, err, expected) - }) - - t.Run("Should return ErrOnUpdateTask when occurred error in Update", func(t *testing.T) { - expected := exceptions.ErrOnUpdateTask - tasksRepository.EXPECT().ExistsById(ctx, model.TaskID, model.TenantID).Return(&exists, nil).MaxTimes(1) - tasksRepository.EXPECT().Update(ctx, model).Return(errors.New("Update error")).MaxTimes(1) - createTaskHistoryProducer.EXPECT().Send(gomock.Any(), gomock.Any()).Times(0) - - err := usecase.Execute(ctx, model) - - assert.Error(t, err) - assert.EqualError(t, err, expected) - }) - - t.Run("Should update task", func(t *testing.T) { - expectedHistory := &models.TaskHistoryCreate{ - TaskID: model.TaskID, - Description: "Task updated", - TenantID: model.TenantID, - } - tasksRepository.EXPECT().ExistsById(ctx, model.TaskID, model.TenantID).Return(&exists, nil).MaxTimes(1) - tasksRepository.EXPECT().Update(ctx, model).Return(nil).MaxTimes(1) - createTaskHistoryProducer.EXPECT().Send(ctx, expectedHistory).Times(1) - - err := usecase.Execute(ctx, model) - - assert.NoError(t, err) - }) } diff --git a/taskflow-service/tests/infra/producers/create_task_history_producer_test.go b/taskflow-service/tests/infra/producers/create_task_history_producer_test.go index 25751e9..c1f1460 100644 --- a/taskflow-service/tests/infra/producers/create_task_history_producer_test.go +++ b/taskflow-service/tests/infra/producers/create_task_history_producer_test.go @@ -2,31 +2,7 @@ package producers import ( "testing" - - "github.com/colibriproject-dev/colibri-sdk-go/pkg/messaging" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/models" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/producers" - "github.com/google/uuid" - "github.com/stretchr/testify/assert" ) func TestCreateTaskHistoryProducer_Send(t *testing.T) { - const testQueue string = "TASKFLOW_CREATE_TASK-HISTORY" - - t.Run("should send create task history message", func(t *testing.T) { - expected := &models.TaskHistoryCreate{ - TaskID: uuid.New(), - Description: "description test", - TenantID: uuid.New(), - } - - producerFn := func() error { - producers.NewCreateTaskHistoryProducer().Send(ctx, expected) - return nil - } - result, err := messaging.NewTestProducer[models.TaskHistoryCreate](producerFn, testQueue, 10).Execute() - - assert.NoError(t, err) - assert.NotNil(t, result) - }) } diff --git a/taskflow-service/tests/infra/repositories/tasks_history_repository_test.go b/taskflow-service/tests/infra/repositories/tasks_history_repository_test.go index d812690..7357c33 100644 --- a/taskflow-service/tests/infra/repositories/tasks_history_repository_test.go +++ b/taskflow-service/tests/infra/repositories/tasks_history_repository_test.go @@ -2,11 +2,9 @@ package repositories import ( "testing" - "time" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/models" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/repositories" - "github.com/google/uuid" "github.com/stretchr/testify/assert" ) @@ -14,81 +12,13 @@ var ( tasksHistoryDatasets = []string{"clear-data.sql", "tasks-insert.sql", "tasks-history-insert.sql"} tasksHistoryRepository = repositories.NewTasksHistoryDBRepository() - existentTasksHistory = []models.TaskHistory{ - { - ID: uuid.MustParse("778db338-243a-4ee2-8040-7a3654fbf512"), - Description: "Task created", - CreatedAt: time.Date(2025, 01, 15, 10, 0, 0, 0, time.FixedZone("", 0)), - }, - { - ID: uuid.MustParse("682c988a-a27f-458d-8155-4874b6a8a6b5"), - Description: "Task created", - CreatedAt: time.Date(2025, 02, 20, 10, 0, 0, 0, time.FixedZone("", 0)), - }, - { - ID: uuid.MustParse("793c988a-a27f-458d-8155-4874b6a8a6c6"), - Description: "Task status updated", - CreatedAt: time.Date(2025, 02, 21, 9, 10, 0, 0, time.FixedZone("", 0)), - }, - { - ID: uuid.MustParse("eb8e95e6-2a61-4d78-ba7a-65ca446dc89b"), - Description: "Task created", - CreatedAt: time.Date(2025, 03, 01, 20, 5, 0, 0, time.FixedZone("", 0)), - }, - } + existentTasksHistory = []models.TaskHistory{} ) func TestTasksHistoryDBRepository_FindAllPaginated(t *testing.T) { assert.NoError(t, pc.Dataset(basePath, tasksHistoryDatasets...)) - - t.Run("Should return all tasks history", func(t *testing.T) { - expected := []models.TaskHistory{ - existentTasksHistory[2], - existentTasksHistory[1], - } - params := &models.TaskHistoryPageParams{ - Page: 1, - PageSize: 10, - TenantID: existentTenants[0], - TaskID: existentTasks[1].ID, - } - - result, err := tasksHistoryRepository.FindAllPaginated(ctx, params) - - assert.NoError(t, err) - assert.NotNil(t, result) - assert.EqualValues(t, result.TotalItems, uint64(2)) - assert.EqualValues(t, expected, result.Items) - }) } func TestTasksHistoryDBRepository_Insert(t *testing.T) { assert.NoError(t, pc.Dataset(basePath, tasksHistoryDatasets...)) - - t.Run("Should insert task history in tasks history table", func(t *testing.T) { - expected := &models.TaskHistory{ - Description: "New task history description", - } - - insertErr := tasksHistoryRepository.Insert(ctx, &models.TaskHistoryCreate{ - TaskID: existentTasks[1].ID, - Description: expected.Description, - TenantID: existentTenants[0], - }) - findResult, findErr := tasksHistoryRepository.FindAllPaginated(ctx, &models.TaskHistoryPageParams{ - Page: 1, - PageSize: 10, - TenantID: existentTenants[0], - TaskID: existentTasks[1].ID, - }) - - assert.NoError(t, insertErr) - assert.NoError(t, findErr) - assert.NotNil(t, findResult) - assert.NotNil(t, findResult.Items) - assert.EqualValues(t, findResult.TotalItems, uint64(3)) - assert.NotNil(t, findResult.Items[0].ID) - assert.EqualValues(t, expected.Description, findResult.Items[0].Description) - assert.NotNil(t, findResult.Items[0].CreatedAt) - }) } diff --git a/taskflow-service/tests/infra/repositories/tasks_repository_test.go b/taskflow-service/tests/infra/repositories/tasks_repository_test.go index 3f0031d..de08d2e 100644 --- a/taskflow-service/tests/infra/repositories/tasks_repository_test.go +++ b/taskflow-service/tests/infra/repositories/tasks_repository_test.go @@ -2,13 +2,9 @@ package repositories import ( "testing" - "time" - "github.com/colibriproject-dev/colibri-sdk-go/pkg/base/types" - "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/enums" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/domain/models" "github.com/devfullcycle/fc4-arq-multi-tenancy/taskflow-service/src/infra/repositories" - "github.com/google/uuid" "github.com/stretchr/testify/assert" ) @@ -16,176 +12,29 @@ var ( tasksDatasets = []string{"clear-data.sql", "tasks-insert.sql"} tasksRepository = repositories.NewTasksDBRepository() - existentTasks = []models.Task{ - { - ID: uuid.MustParse("77779dd4-27fc-11ef-85da-bf9a5eff0f9e"), - Title: "Task test 1 title", - Description: types.NullString{Valid: true, String: "Task test 1 description"}, - Status: enums.TODO, - CreatedAt: time.Date(2025, 01, 15, 10, 0, 0, 0, time.FixedZone("", 0)), - UpdatedAt: time.Date(2025, 01, 15, 10, 0, 0, 0, time.FixedZone("", 0)), - }, - { - ID: uuid.MustParse("88779dd5-27fc-11ef-85da-bf9a5eff0f0f"), - Title: "Task test 2 title", - Description: types.NullString{Valid: true, String: "Task test 2 description"}, - Status: enums.DONE, - CreatedAt: time.Date(2025, 02, 20, 10, 0, 0, 0, time.FixedZone("", 0)), - UpdatedAt: time.Date(2025, 02, 21, 9, 10, 0, 0, time.FixedZone("", 0)), - }, - { - ID: uuid.MustParse("99779dd6-27fc-11ef-85da-bf9a5eff0f1a"), - Title: "Task test 3 title", - Description: types.NullString{}, - Status: enums.TODO, - CreatedAt: time.Date(2025, 03, 01, 20, 5, 0, 0, time.FixedZone("", 0)), - UpdatedAt: time.Date(2025, 03, 01, 20, 5, 0, 0, time.FixedZone("", 0)), - }, - } + existentTasks = []models.Task{} ) func TestTasksDBRepository_FindAll(t *testing.T) { assert.NoError(t, pc.Dataset(basePath, tasksDatasets...)) - - t.Run("Should return all tasks when title filter is empty", func(t *testing.T) { - expected := []models.Task{ - existentTasks[0], - existentTasks[1], - } - params := &models.TaskListParams{TenantID: existentTenants[0]} - - result, err := tasksRepository.FindAll(ctx, params) - - assert.NoError(t, err) - assert.NotNil(t, result) - assert.Len(t, result, 2) - assert.EqualValues(t, expected, result) - }) - - t.Run("Should return one task when title filter is not empty", func(t *testing.T) { - expected := []models.Task{existentTasks[1]} - params := &models.TaskListParams{TenantID: existentTenants[0], Title: "Task test 2"} - - result, err := tasksRepository.FindAll(ctx, params) - - assert.NoError(t, err) - assert.NotNil(t, result) - assert.Len(t, result, 1) - assert.EqualValues(t, expected, result) - }) } func TestTasksDBRepository_ExistsById(t *testing.T) { assert.NoError(t, pc.Dataset(basePath, tasksDatasets...)) - - t.Run("Should return true when id exists into tasks table", func(t *testing.T) { - result, err := tasksRepository.ExistsById(ctx, existentTasks[0].ID, existentTenants[0]) - - assert.NoError(t, err) - assert.NotNil(t, result) - assert.True(t, *result) - }) - - t.Run("Should return false when id not exists into tasks table", func(t *testing.T) { - result, err := tasksRepository.ExistsById(ctx, uuid.New(), existentTenants[0]) - - assert.NoError(t, err) - assert.False(t, *result) - }) - - t.Run("Should return false when id exists into tasks table and belongs to another tenant", func(t *testing.T) { - result, err := tasksRepository.ExistsById(ctx, existentTasks[0].ID, existentTenants[1]) - - assert.NoError(t, err) - assert.False(t, *result) - }) } func TestTasksDBRepository_Insert(t *testing.T) { assert.NoError(t, pc.Dataset(basePath, tasksDatasets...)) - - t.Run("Should insert task in tasks table and return new task id", func(t *testing.T) { - expected := &models.Task{ - Title: "New task", - Description: types.NullString{Valid: true, String: "New task description"}, - Status: enums.TODO, - } - - insertResult, insertErr := tasksRepository.Insert(ctx, &models.TaskCreate{ - Title: expected.Title, - Description: expected.Description, - TenantID: existentTenants[0], - Status: expected.Status, - }) - findResult, findErr := tasksRepository.FindById(ctx, insertResult.ID, existentTenants[0]) - - assert.NoError(t, insertErr) - assert.NoError(t, findErr) - assert.NotNil(t, findResult) - assert.NotNil(t, findResult.ID) - assert.EqualValues(t, insertResult.ID, findResult.ID) - assert.EqualValues(t, expected.Title, findResult.Title) - assert.EqualValues(t, expected.Description, findResult.Description) - assert.EqualValues(t, expected.Status, findResult.Status) - assert.NotNil(t, findResult.CreatedAt) - assert.NotNil(t, findResult.UpdatedAt) - }) } func TestTasksDBRepository_Update(t *testing.T) { assert.NoError(t, pc.Dataset(basePath, tasksDatasets...)) - - t.Run("Should update task title and description fields", func(t *testing.T) { - model := &models.TaskUpdate{ - Title: "Task title 1 updated", - Description: types.NullString{Valid: true, String: "Task descript 1 updated"}, - TaskID: existentTasks[0].ID, - TenantID: existentTenants[0], - } - - updateErr := tasksRepository.Update(ctx, model) - findResult, findErr := tasksRepository.FindById(ctx, existentTasks[0].ID, existentTenants[0]) - - assert.NoError(t, updateErr) - assert.NoError(t, findErr) - assert.NotNil(t, findResult) - assert.EqualValues(t, model.Title, findResult.Title) - assert.EqualValues(t, model.Description, findResult.Description) - assert.EqualValues(t, existentTasks[0].Status, findResult.Status) - }) } func TestTasksDBRepository_UpdateStatus(t *testing.T) { assert.NoError(t, pc.Dataset(basePath, tasksDatasets...)) - - t.Run("Should update task status field", func(t *testing.T) { - model := &models.TaskStatusUpdate{ - Status: enums.DONE, - TaskID: existentTasks[0].ID, - TenantID: existentTenants[0], - } - - updateErr := tasksRepository.UpdateStatus(ctx, model) - findResult, findErr := tasksRepository.FindById(ctx, existentTasks[0].ID, existentTenants[0]) - - assert.NoError(t, updateErr) - assert.NoError(t, findErr) - assert.NotNil(t, findResult) - assert.EqualValues(t, existentTasks[0].Title, findResult.Title) - assert.EqualValues(t, existentTasks[0].Description, findResult.Description) - assert.EqualValues(t, model.Status, findResult.Status) - }) } func TestTasksDBRepository_Delete(t *testing.T) { assert.NoError(t, pc.Dataset(basePath, tasksDatasets...)) - - t.Run("Should delete task", func(t *testing.T) { - deleteErr := tasksRepository.Delete(ctx, existentTasks[0].ID, existentTenants[0]) - findResult, findErr := tasksRepository.FindById(ctx, existentTasks[0].ID, existentTenants[0]) - - assert.NoError(t, deleteErr) - assert.NoError(t, findErr) - assert.Nil(t, findResult) - }) }