From 54742f8374cbf1552a96a671639a8d472ec0b724 Mon Sep 17 00:00:00 2001 From: Joshua Sajeev Date: Sun, 21 Sep 2025 14:35:15 +0530 Subject: [PATCH] refactory(mock): add user handler test cases and organise files - added user handler test case - changed the position of mock files from place of implementaion to respective folders --- internal/handler/task/task_handler_mock.go | 35 ------ internal/handler/task/task_handler_test.go | 103 +++++++++--------- internal/handler/user/user_handler.go | 2 + .../handler/user/user_handler_interface.go | 10 ++ .../gorm/gorm_task/task_repository_mock.go} | 5 +- internal/service/task/task_service_mock.go | 35 ++++++ internal/service/task/task_service_test.go | 71 ++++++------ internal/service/user/user_service_mock.go | 34 +++--- internal/service/user/user_service_test.go | 31 +++--- 9 files changed, 168 insertions(+), 158 deletions(-) create mode 100644 internal/handler/user/user_handler_interface.go rename internal/{service/task/tasks_mock.go => repository/gorm/gorm_task/task_repository_mock.go} (87%) create mode 100644 internal/service/task/task_service_mock.go diff --git a/internal/handler/task/task_handler_mock.go b/internal/handler/task/task_handler_mock.go index 61f716b..805a361 100644 --- a/internal/handler/task/task_handler_mock.go +++ b/internal/handler/task/task_handler_mock.go @@ -1,36 +1 @@ package task_handler - -import ( - "taskflow/internal/dto" - task_service "taskflow/internal/service/task" - - "github.com/stretchr/testify/mock" -) - -type TaskServiceMock struct { - mock.Mock -} - -var _ task_service.TaskServiceInterface = (*TaskServiceMock)(nil) - -func (m *TaskServiceMock) CreateTask(taskRequest *dto.CreateTaskRequest) error { - - args := m.Called(taskRequest) - return args.Error(0) -} -func (m *TaskServiceMock) GetTask(id int) (dto.GetTaskResponse, error) { - args := m.Called(id) - return args.Get(0).(dto.GetTaskResponse), args.Error(1) -} -func (m *TaskServiceMock) ListTasks() (dto.ListTasksResponse, error) { - args := m.Called() - return args.Get(0).(dto.ListTasksResponse), args.Error(1) -} -func (m *TaskServiceMock) UpdateStatus(id int, status string) error { - args := m.Called(id, status) - return args.Error(0) -} -func (m *TaskServiceMock) Delete(id int) error { - args := m.Called(id) - return args.Error(0) -} diff --git a/internal/handler/task/task_handler_test.go b/internal/handler/task/task_handler_test.go index 06deefe..9508c6e 100644 --- a/internal/handler/task/task_handler_test.go +++ b/internal/handler/task/task_handler_test.go @@ -9,6 +9,7 @@ import ( "taskflow/internal/auth" "taskflow/internal/common" "taskflow/internal/dto" + task_service "taskflow/internal/service/task" "testing" "github.com/gin-gonic/gin" @@ -25,7 +26,7 @@ func TestTaskHandler_CreateTask(t *testing.T) { tests := []struct { name string requestBody any - setupMock func() *TaskServiceMock + setupMock func() *task_service.TaskServiceMock expectedStatus int expectedBody any }{ @@ -34,8 +35,8 @@ func TestTaskHandler_CreateTask(t *testing.T) { requestBody: dto.CreateTaskRequest{ Task: "Buy Milk", }, - setupMock: func() *TaskServiceMock { - mockService := new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + mockService := new(task_service.TaskServiceMock) mockService.On("CreateTask", mock.MatchedBy(func(req *dto.CreateTaskRequest) bool { return req.Task == "Buy Milk" })).Return(nil) @@ -49,8 +50,8 @@ func TestTaskHandler_CreateTask(t *testing.T) { { name: "failure case - invalid JSON", requestBody: `{"task": }`, // malformed JSON - setupMock: func() *TaskServiceMock { - return new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + return new(task_service.TaskServiceMock) }, expectedStatus: http.StatusBadRequest, expectedBody: common.ErrorResponse{ @@ -62,8 +63,8 @@ func TestTaskHandler_CreateTask(t *testing.T) { requestBody: dto.CreateTaskRequest{ Task: "", // empty task }, - setupMock: func() *TaskServiceMock { - return new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + return new(task_service.TaskServiceMock) }, expectedStatus: http.StatusBadRequest, expectedBody: common.ErrorResponse{ @@ -75,8 +76,8 @@ func TestTaskHandler_CreateTask(t *testing.T) { requestBody: dto.CreateTaskRequest{ Task: "Buy Milk", }, - setupMock: func() *TaskServiceMock { - mockService := new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + mockService := new(task_service.TaskServiceMock) mockService.On("CreateTask", mock.Anything).Return(errors.New("service error")) return mockService }, @@ -142,15 +143,15 @@ func TestTaskHandler_GetTask(t *testing.T) { tests := []struct { name string taskID string - setupMock func() *TaskServiceMock + setupMock func() *task_service.TaskServiceMock expectedStatus int expectedBody any }{ { name: "success case", taskID: "1", - setupMock: func() *TaskServiceMock { - mockService := new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + mockService := new(task_service.TaskServiceMock) mockService.On("GetTask", 1).Return(dto.GetTaskResponse{ ID: 1, Task: "Buy Milk", @@ -168,8 +169,8 @@ func TestTaskHandler_GetTask(t *testing.T) { { name: "failure case - invalid ID", taskID: "invalid", - setupMock: func() *TaskServiceMock { - return new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + return new(task_service.TaskServiceMock) }, expectedStatus: http.StatusBadRequest, expectedBody: common.ErrorResponse{ @@ -179,8 +180,8 @@ func TestTaskHandler_GetTask(t *testing.T) { { name: "failure case - ID less than 1", taskID: "0", - setupMock: func() *TaskServiceMock { - return new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + return new(task_service.TaskServiceMock) }, expectedStatus: http.StatusBadRequest, expectedBody: common.ErrorResponse{ @@ -190,8 +191,8 @@ func TestTaskHandler_GetTask(t *testing.T) { { name: "failure case - task not found", taskID: "999", - setupMock: func() *TaskServiceMock { - mockService := new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + mockService := new(task_service.TaskServiceMock) mockService.On("GetTask", 999).Return(dto.GetTaskResponse{}, errors.New("not found")) return mockService }, @@ -238,14 +239,14 @@ func TestTaskHandler_GetTask(t *testing.T) { func TestTaskHandler_ListTasks(t *testing.T) { tests := []struct { name string - setupMock func() *TaskServiceMock + setupMock func() *task_service.TaskServiceMock expectedStatus int expectedBody any }{ { name: "success case - with tasks", - setupMock: func() *TaskServiceMock { - mockService := new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + mockService := new(task_service.TaskServiceMock) mockService.On("ListTasks").Return(dto.ListTasksResponse{ Tasks: []dto.GetTaskResponse{ {ID: 1, Task: "Buy Milk", Status: "pending"}, @@ -264,8 +265,8 @@ func TestTaskHandler_ListTasks(t *testing.T) { }, { name: "success case - empty list", - setupMock: func() *TaskServiceMock { - mockService := new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + mockService := new(task_service.TaskServiceMock) mockService.On("ListTasks").Return(dto.ListTasksResponse{ Tasks: []dto.GetTaskResponse{}, }, nil) @@ -278,8 +279,8 @@ func TestTaskHandler_ListTasks(t *testing.T) { }, { name: "failure case - service error", - setupMock: func() *TaskServiceMock { - mockService := new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + mockService := new(task_service.TaskServiceMock) mockService.On("ListTasks").Return(dto.ListTasksResponse{}, errors.New("database error")) return mockService }, @@ -328,7 +329,7 @@ func TestTaskHandler_UpdateStatus(t *testing.T) { name string taskID string requestBody any - setupMock func() *TaskServiceMock + setupMock func() *task_service.TaskServiceMock expectedStatus int expectedBody any }{ @@ -338,8 +339,8 @@ func TestTaskHandler_UpdateStatus(t *testing.T) { requestBody: dto.UpdateStatusRequest{ Status: "completed", }, - setupMock: func() *TaskServiceMock { - mockService := new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + mockService := new(task_service.TaskServiceMock) mockService.On("UpdateStatus", 1, "completed").Return(nil) return mockService }, @@ -354,8 +355,8 @@ func TestTaskHandler_UpdateStatus(t *testing.T) { requestBody: dto.UpdateStatusRequest{ Status: "completed", }, - setupMock: func() *TaskServiceMock { - return new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + return new(task_service.TaskServiceMock) }, expectedStatus: http.StatusBadRequest, expectedBody: common.ErrorResponse{ @@ -368,8 +369,8 @@ func TestTaskHandler_UpdateStatus(t *testing.T) { requestBody: dto.UpdateStatusRequest{ Status: "completed", }, - setupMock: func() *TaskServiceMock { - return new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + return new(task_service.TaskServiceMock) }, expectedStatus: http.StatusBadRequest, expectedBody: common.ErrorResponse{ @@ -380,8 +381,8 @@ func TestTaskHandler_UpdateStatus(t *testing.T) { name: "failure case - invalid JSON", taskID: "1", requestBody: `{"status": }`, // malformed JSON - setupMock: func() *TaskServiceMock { - return new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + return new(task_service.TaskServiceMock) }, expectedStatus: http.StatusBadRequest, expectedBody: common.ErrorResponse{ @@ -394,8 +395,8 @@ func TestTaskHandler_UpdateStatus(t *testing.T) { requestBody: dto.UpdateStatusRequest{ Status: "invalid-status", }, - setupMock: func() *TaskServiceMock { - return new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + return new(task_service.TaskServiceMock) }, expectedStatus: http.StatusBadRequest, }, @@ -405,8 +406,8 @@ func TestTaskHandler_UpdateStatus(t *testing.T) { requestBody: dto.UpdateStatusRequest{ Status: "completed", }, - setupMock: func() *TaskServiceMock { - mockService := new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + mockService := new(task_service.TaskServiceMock) mockService.On("UpdateStatus", 999, "completed").Return(gorm.ErrRecordNotFound) return mockService }, @@ -421,8 +422,8 @@ func TestTaskHandler_UpdateStatus(t *testing.T) { requestBody: dto.UpdateStatusRequest{ Status: "completed", }, - setupMock: func() *TaskServiceMock { - mockService := new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + mockService := new(task_service.TaskServiceMock) mockService.On("UpdateStatus", 1, "completed").Return(errors.New("service error")) return mockService }, @@ -491,15 +492,15 @@ func TestTaskHandler_Delete(t *testing.T) { tests := []struct { name string taskID string - setupMock func() *TaskServiceMock + setupMock func() *task_service.TaskServiceMock expectedStatus int expectedBody any }{ { name: "success case", taskID: "1", - setupMock: func() *TaskServiceMock { - mockService := new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + mockService := new(task_service.TaskServiceMock) mockService.On("Delete", 1).Return(nil) return mockService }, @@ -511,8 +512,8 @@ func TestTaskHandler_Delete(t *testing.T) { { name: "failure case - invalid ID", taskID: "invalid", - setupMock: func() *TaskServiceMock { - return new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + return new(task_service.TaskServiceMock) }, expectedStatus: http.StatusBadRequest, expectedBody: common.ErrorResponse{ @@ -522,8 +523,8 @@ func TestTaskHandler_Delete(t *testing.T) { { name: "failure case - ID less than 1", taskID: "0", - setupMock: func() *TaskServiceMock { - return new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + return new(task_service.TaskServiceMock) }, expectedStatus: http.StatusBadRequest, expectedBody: common.ErrorResponse{ @@ -533,8 +534,8 @@ func TestTaskHandler_Delete(t *testing.T) { { name: "failure case - task not found", taskID: "999", - setupMock: func() *TaskServiceMock { - mockService := new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + mockService := new(task_service.TaskServiceMock) mockService.On("Delete", 999).Return(gorm.ErrRecordNotFound) return mockService }, @@ -546,8 +547,8 @@ func TestTaskHandler_Delete(t *testing.T) { { name: "failure case - service error", taskID: "1", - setupMock: func() *TaskServiceMock { - mockService := new(TaskServiceMock) + setupMock: func() *task_service.TaskServiceMock { + mockService := new(task_service.TaskServiceMock) mockService.On("Delete", 1).Return(errors.New("database error")) return mockService }, diff --git a/internal/handler/user/user_handler.go b/internal/handler/user/user_handler.go index f184c23..25f0e2c 100644 --- a/internal/handler/user/user_handler.go +++ b/internal/handler/user/user_handler.go @@ -21,6 +21,8 @@ func NewUserHandler(s user_service.UserServiceInterface, ua auth.UserAuthInterfa return &UserHandler{service: s, userAuth: ua} } +var _ UserHandlerInterface = (*UserHandler)(nil) + // Register godoc // @Summary Register a new user // @Description Create a new user account diff --git a/internal/handler/user/user_handler_interface.go b/internal/handler/user/user_handler_interface.go new file mode 100644 index 0000000..72fd954 --- /dev/null +++ b/internal/handler/user/user_handler_interface.go @@ -0,0 +1,10 @@ +package user_handler + +import "github.com/gin-gonic/gin" + +type UserHandlerInterface interface { + Register(c *gin.Context) + Login(c *gin.Context) + UpdatePassword(c *gin.Context) + DeleteUser(c *gin.Context) +} diff --git a/internal/service/task/tasks_mock.go b/internal/repository/gorm/gorm_task/task_repository_mock.go similarity index 87% rename from internal/service/task/tasks_mock.go rename to internal/repository/gorm/gorm_task/task_repository_mock.go index c589919..a63edc2 100644 --- a/internal/service/task/tasks_mock.go +++ b/internal/repository/gorm/gorm_task/task_repository_mock.go @@ -1,17 +1,16 @@ -package task_service +package gorm_task import ( "taskflow/internal/domain/task" "github.com/stretchr/testify/mock" - gg "taskflow/internal/repository/gorm/gorm_task" ) type TaskRepoMock struct { mock.Mock } -var _ gg.TaskRepositoryInterface = (*TaskRepoMock)(nil) +var _ TaskRepositoryInterface = (*TaskRepoMock)(nil) func (m *TaskRepoMock) Create(task *task.Task) error { args := m.Called(task) diff --git a/internal/service/task/task_service_mock.go b/internal/service/task/task_service_mock.go new file mode 100644 index 0000000..e4c4071 --- /dev/null +++ b/internal/service/task/task_service_mock.go @@ -0,0 +1,35 @@ +package task_service + +import ( + "taskflow/internal/dto" + + "github.com/stretchr/testify/mock" +) + +type TaskServiceMock struct { + mock.Mock +} + +var _ TaskServiceInterface = (*TaskServiceMock)(nil) + +func (m *TaskServiceMock) CreateTask(taskRequest *dto.CreateTaskRequest) error { + + args := m.Called(taskRequest) + return args.Error(0) +} +func (m *TaskServiceMock) GetTask(id int) (dto.GetTaskResponse, error) { + args := m.Called(id) + return args.Get(0).(dto.GetTaskResponse), args.Error(1) +} +func (m *TaskServiceMock) ListTasks() (dto.ListTasksResponse, error) { + args := m.Called() + return args.Get(0).(dto.ListTasksResponse), args.Error(1) +} +func (m *TaskServiceMock) UpdateStatus(id int, status string) error { + args := m.Called(id, status) + return args.Error(0) +} +func (m *TaskServiceMock) Delete(id int) error { + args := m.Called(id) + return args.Error(0) +} diff --git a/internal/service/task/task_service_test.go b/internal/service/task/task_service_test.go index 9f92704..c143a33 100644 --- a/internal/service/task/task_service_test.go +++ b/internal/service/task/task_service_test.go @@ -4,6 +4,7 @@ import ( "errors" "taskflow/internal/domain/task" "taskflow/internal/dto" + "taskflow/internal/repository/gorm/gorm_task" "testing" "time" @@ -15,7 +16,7 @@ func TestTaskService_CreateTask(t *testing.T) { tests := []struct { name string taskRequest *dto.CreateTaskRequest - setupMock func() *TaskRepoMock + setupMock func() *gorm_task.TaskRepoMock wantErr bool }{ { @@ -23,8 +24,8 @@ func TestTaskService_CreateTask(t *testing.T) { taskRequest: &dto.CreateTaskRequest{ Task: "Buy Milk", }, - setupMock: func() *TaskRepoMock { - mockRepo := new(TaskRepoMock) + setupMock: func() *gorm_task.TaskRepoMock { + mockRepo := new(gorm_task.TaskRepoMock) mockRepo.On("Create", mock.MatchedBy(func(tk *task.Task) bool { return tk.Task == "Buy Milk" })).Return(nil) @@ -37,8 +38,8 @@ func TestTaskService_CreateTask(t *testing.T) { taskRequest: &dto.CreateTaskRequest{ Task: "", }, - setupMock: func() *TaskRepoMock { - return new(TaskRepoMock) + setupMock: func() *gorm_task.TaskRepoMock { + return new(gorm_task.TaskRepoMock) }, wantErr: true, }, @@ -47,8 +48,8 @@ func TestTaskService_CreateTask(t *testing.T) { taskRequest: &dto.CreateTaskRequest{ Task: "Buy Eggs", }, - setupMock: func() *TaskRepoMock { - mockRepo := new(TaskRepoMock) + setupMock: func() *gorm_task.TaskRepoMock { + mockRepo := new(gorm_task.TaskRepoMock) mockRepo.On("Create", mock.MatchedBy(func(tk *task.Task) bool { return tk.Task == "Buy Eggs" })).Return(errors.New("db error")) @@ -80,15 +81,15 @@ func TestTaskService_GetTask(t *testing.T) { tests := []struct { name string // description of this test case id int - setupMock func() *TaskRepoMock + setupMock func() *gorm_task.TaskRepoMock want dto.GetTaskResponse wantErr bool }{ { name: "success case", id: 1, - setupMock: func() *TaskRepoMock { - mockRepo := new(TaskRepoMock) + setupMock: func() *gorm_task.TaskRepoMock { + mockRepo := new(gorm_task.TaskRepoMock) mockRepo.On("GetByID", 1).Return(&task.Task{ ID: 1, Task: "Buy Milk", @@ -106,8 +107,8 @@ func TestTaskService_GetTask(t *testing.T) { { name: "failure case - task not found", id: 2, - setupMock: func() *TaskRepoMock { - mockRepo := new(TaskRepoMock) + setupMock: func() *gorm_task.TaskRepoMock { + mockRepo := new(gorm_task.TaskRepoMock) mockRepo.On("GetByID", 2).Return((*task.Task)(nil), errors.New("not found")) return mockRepo }, @@ -140,14 +141,14 @@ func TestTaskService_ListTasks(t *testing.T) { tests := []struct { name string // description of this test case // Named input parameters for receiver constructor. - setupMock func() *TaskRepoMock + setupMock func() *gorm_task.TaskRepoMock want dto.ListTasksResponse wantErr bool }{ { name: "success", - setupMock: func() *TaskRepoMock { - mockRepo := new(TaskRepoMock) + setupMock: func() *gorm_task.TaskRepoMock { + mockRepo := new(gorm_task.TaskRepoMock) mockRepo.On("List").Return([]task.Task{ { ID: 1, Task: "Buy milk", Status: "pending", CreatedAt: time.Now(), @@ -164,8 +165,8 @@ func TestTaskService_ListTasks(t *testing.T) { }, { name: "success - multiple tasks", - setupMock: func() *TaskRepoMock { - mockRepo := new(TaskRepoMock) + setupMock: func() *gorm_task.TaskRepoMock { + mockRepo := new(gorm_task.TaskRepoMock) mockRepo.On("List").Return([]task.Task{ {ID: 1, Task: "Buy Milk", Status: "pending", CreatedAt: time.Now()}, {ID: 2, Task: "Buy Eggs", Status: "completed", CreatedAt: time.Now()}, @@ -182,8 +183,8 @@ func TestTaskService_ListTasks(t *testing.T) { }, { name: "failure - db error", - setupMock: func() *TaskRepoMock { - mockRepo := new(TaskRepoMock) + setupMock: func() *gorm_task.TaskRepoMock { + mockRepo := new(gorm_task.TaskRepoMock) mockRepo.On("List").Return(([]task.Task)(nil), errors.New("db error")) return mockRepo }, @@ -213,7 +214,7 @@ func TestTaskService_ListTasks(t *testing.T) { func TestTaskService_UpdateStatus(t *testing.T) { tests := []struct { name string - setupMock func() *TaskRepoMock + setupMock func() *gorm_task.TaskRepoMock id int status string wantErr bool @@ -222,8 +223,8 @@ func TestTaskService_UpdateStatus(t *testing.T) { name: "success - pending", id: 1, status: "pending", - setupMock: func() *TaskRepoMock { - mockRepo := new(TaskRepoMock) + setupMock: func() *gorm_task.TaskRepoMock { + mockRepo := new(gorm_task.TaskRepoMock) mockRepo.On("UpdateStatus", mock.MatchedBy(func(id int) bool { return id > 0 }), mock.MatchedBy(func(status string) bool { return status == "pending" || status == "completed" }), @@ -236,8 +237,8 @@ func TestTaskService_UpdateStatus(t *testing.T) { name: "success - completed", id: 2, status: "completed", - setupMock: func() *TaskRepoMock { - mockRepo := new(TaskRepoMock) + setupMock: func() *gorm_task.TaskRepoMock { + mockRepo := new(gorm_task.TaskRepoMock) mockRepo.On("UpdateStatus", mock.Anything, mock.Anything, @@ -250,8 +251,8 @@ func TestTaskService_UpdateStatus(t *testing.T) { name: "failure - invalid status", id: 3, status: "invalid", - setupMock: func() *TaskRepoMock { - return new(TaskRepoMock) + setupMock: func() *gorm_task.TaskRepoMock { + return new(gorm_task.TaskRepoMock) }, wantErr: true, }, @@ -259,8 +260,8 @@ func TestTaskService_UpdateStatus(t *testing.T) { name: "failure - repo error", id: 4, status: "pending", - setupMock: func() *TaskRepoMock { - mockRepo := new(TaskRepoMock) + setupMock: func() *gorm_task.TaskRepoMock { + mockRepo := new(gorm_task.TaskRepoMock) mockRepo.On("UpdateStatus", mock.Anything, mock.Anything).Return(errors.New("db error")) return mockRepo }, @@ -292,15 +293,15 @@ func TestTaskService_UpdateStatus(t *testing.T) { func TestTaskService_Delete(t *testing.T) { tests := []struct { name string - setupMock func() *TaskRepoMock + setupMock func() *gorm_task.TaskRepoMock id int wantErr bool }{ { name: "success", id: 1, - setupMock: func() *TaskRepoMock { - mockRepo := new(TaskRepoMock) + setupMock: func() *gorm_task.TaskRepoMock { + mockRepo := new(gorm_task.TaskRepoMock) mockRepo.On("Delete", 1).Return(nil) return mockRepo }, @@ -310,8 +311,8 @@ func TestTaskService_Delete(t *testing.T) { { name: "failure - repo error", id: 2, - setupMock: func() *TaskRepoMock { - mockRepo := new(TaskRepoMock) + setupMock: func() *gorm_task.TaskRepoMock { + mockRepo := new(gorm_task.TaskRepoMock) mockRepo.On("Delete", 2).Return(errors.New("db error")) return mockRepo }, @@ -321,8 +322,8 @@ func TestTaskService_Delete(t *testing.T) { { name: "failure - delete non-existing task", id: 3, - setupMock: func() *TaskRepoMock { - mockRepo := new(TaskRepoMock) + setupMock: func() *gorm_task.TaskRepoMock { + mockRepo := new(gorm_task.TaskRepoMock) mockRepo.On("Delete", 3).Return(errors.New("not found")) return mockRepo }, diff --git a/internal/service/user/user_service_mock.go b/internal/service/user/user_service_mock.go index 569d1cd..369317f 100644 --- a/internal/service/user/user_service_mock.go +++ b/internal/service/user/user_service_mock.go @@ -1,37 +1,33 @@ package user_service import ( - "taskflow/internal/domain/user" + "taskflow/internal/dto" "github.com/stretchr/testify/mock" ) -// MockUserRepository implements gorm_user.UserRepositoryInterface -type MockUserRepository struct { +type UserServiceMock struct { mock.Mock } -func (m *MockUserRepository) Create(u *user.User) error { - args := m.Called(u) - return args.Error(0) -} +var _ UserServiceInterface = (*UserServiceMock)(nil) -func (m *MockUserRepository) GetByEmail(email string) (*user.User, error) { - args := m.Called(email) - return args.Get(0).(*user.User), args.Error(1) +func (m *UserServiceMock) CreateUser(req *dto.CreateUserRequest) (*dto.CreateUserResponse, error) { + args := m.Called(req) + return args.Get(0).(*dto.CreateUserResponse), nil } -func (m *MockUserRepository) GetByID(id int) (*user.User, error) { - args := m.Called(id) - return args.Get(0).(*user.User), args.Error(1) +func (m *UserServiceMock) AuthenticateUser(req *dto.AuthRequest) (*dto.AuthResponse, error) { + args := m.Called(req) + return args.Get(0).(*dto.AuthResponse), nil } -func (m *MockUserRepository) Update(u *user.User) error { - args := m.Called(u) - return args.Error(0) +func (m *UserServiceMock) UpdatePassword(req *dto.UpdatePasswordRequest) (*dto.UpdatePasswordResponse, error) { + args := m.Called(req) + return args.Get(0).(*dto.UpdatePasswordResponse), nil } -func (m *MockUserRepository) Delete(id int) error { - args := m.Called(id) - return args.Error(0) +func (m *UserServiceMock) DeleteUser(req *dto.DeleteUserRequest) (*dto.DeleteUserResponse, error) { + args := m.Called(req) + return args.Get(0).(*dto.DeleteUserResponse), nil } diff --git a/internal/service/user/user_service_test.go b/internal/service/user/user_service_test.go index 5d9ae58..e2e8d22 100644 --- a/internal/service/user/user_service_test.go +++ b/internal/service/user/user_service_test.go @@ -6,6 +6,7 @@ import ( "taskflow/internal/domain/user" "taskflow/internal/dto" + "taskflow/internal/repository/gorm/gorm_user" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -15,13 +16,13 @@ func TestCreateUser(t *testing.T) { tests := []struct { name string req *dto.CreateUserRequest - mockSetup func(m *MockUserRepository) + mockSetup func(m *gorm_user.MockUserRepository) wantErr bool }{ { name: "success", req: &dto.CreateUserRequest{Email: "test@example.com", Password: "secret123"}, - mockSetup: func(m *MockUserRepository) { + mockSetup: func(m *gorm_user.MockUserRepository) { m.On("Create", mock.Anything).Return(nil).Once() }, wantErr: false, @@ -29,7 +30,7 @@ func TestCreateUser(t *testing.T) { { name: "duplicate email", req: &dto.CreateUserRequest{Email: "dup@example.com", Password: "secret123"}, - mockSetup: func(m *MockUserRepository) { + mockSetup: func(m *gorm_user.MockUserRepository) { m.On("Create", mock.Anything).Return(errors.New("duplicate key")).Once() }, wantErr: true, @@ -38,7 +39,7 @@ func TestCreateUser(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - mockRepo := new(MockUserRepository) + mockRepo := new(gorm_user.MockUserRepository) svc := NewUserService(mockRepo) if tt.mockSetup != nil { @@ -64,13 +65,13 @@ func TestAuthenticateUser(t *testing.T) { tests := []struct { name string req *dto.AuthRequest - mockSetup func(m *MockUserRepository) + mockSetup func(m *gorm_user.MockUserRepository) wantErr bool }{ { name: "success", req: &dto.AuthRequest{Email: "user@example.com", Password: "mypassword"}, - mockSetup: func(m *MockUserRepository) { + mockSetup: func(m *gorm_user.MockUserRepository) { u := &user.User{ID: 1, Email: "user@example.com", Password: hashedPass} m.On("GetByEmail", "user@example.com").Return(u, nil).Once() }, @@ -79,7 +80,7 @@ func TestAuthenticateUser(t *testing.T) { { name: "invalid password", req: &dto.AuthRequest{Email: "user2@example.com", Password: "wrongpass"}, - mockSetup: func(m *MockUserRepository) { + mockSetup: func(m *gorm_user.MockUserRepository) { u := &user.User{ID: 2, Email: "user2@example.com", Password: hashedPass} m.On("GetByEmail", "user2@example.com").Return(u, nil).Once() }, @@ -89,7 +90,7 @@ func TestAuthenticateUser(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - mockRepo := new(MockUserRepository) + mockRepo := new(gorm_user.MockUserRepository) svc := NewUserService(mockRepo) if tt.mockSetup != nil { @@ -116,7 +117,7 @@ func TestUpdatePassword(t *testing.T) { tests := []struct { name string req *dto.UpdatePasswordRequest - mockSetup func(m *MockUserRepository) + mockSetup func(m *gorm_user.MockUserRepository) wantErr bool }{ { @@ -126,7 +127,7 @@ func TestUpdatePassword(t *testing.T) { OldPassword: "oldpass", NewPassword: "newpass123", }, - mockSetup: func(m *MockUserRepository) { + mockSetup: func(m *gorm_user.MockUserRepository) { u := &user.User{ID: 1, Email: "x@example.com", Password: oldHash} m.On("GetByID", 1).Return(u, nil).Once() m.On("Update", mock.Anything).Return(nil).Once() @@ -140,7 +141,7 @@ func TestUpdatePassword(t *testing.T) { OldPassword: "wrongpass", NewPassword: "newpass", }, - mockSetup: func(m *MockUserRepository) { + mockSetup: func(m *gorm_user.MockUserRepository) { u := &user.User{ID: 2, Email: "y@example.com", Password: oldHash} m.On("GetByID", 2).Return(u, nil).Once() }, @@ -150,7 +151,7 @@ func TestUpdatePassword(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - mockRepo := new(MockUserRepository) + mockRepo := new(gorm_user.MockUserRepository) svc := NewUserService(mockRepo) if tt.mockSetup != nil { @@ -174,13 +175,13 @@ func TestDeleteUser(t *testing.T) { tests := []struct { name string req *dto.DeleteUserRequest - mockSetup func(m *MockUserRepository) + mockSetup func(m *gorm_user.MockUserRepository) wantErr bool }{ { name: "success", req: &dto.DeleteUserRequest{ID: 1}, - mockSetup: func(m *MockUserRepository) { + mockSetup: func(m *gorm_user.MockUserRepository) { m.On("Delete", 1).Return(nil).Once() }, wantErr: false, @@ -194,7 +195,7 @@ func TestDeleteUser(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - mockRepo := new(MockUserRepository) + mockRepo := new(gorm_user.MockUserRepository) svc := NewUserService(mockRepo) if tt.mockSetup != nil {