package service import ( "context" "testing" "datarush/internal/task/service/mocks" pb "datarush/pkg/api/task" "github.com/stretchr/testify/assert" "go.uber.org/mock/gomock" "google.golang.org/protobuf/types/known/timestamppb" ) func TestTaskService(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() mockRepo := mocks.NewMockTaskRepository(ctrl) service := NewTaskService(mockRepo) ctx := context.Background() t.Run("CreateTask", func(t *testing.T) { task := &pb.Task{ CompetitionId: "comp1", Title: "Test Task", Description: "This is a test task", InCompetitionPosition: 1, MaxPoints: 100, MaxAttempts: 10, Type: pb.TaskType_TASK_TYPE_INPUT, } mockRepo.EXPECT().CreateTask(ctx, task).Return(task, nil) createdTask, err := service.CreateTask(ctx, task) assert.NoError(t, err) assert.Equal(t, task, createdTask) }) t.Run("GetTask", func(t *testing.T) { taskID := "task1" req := &pb.GetTaskRequest{TaskId: taskID} expectedTask := &pb.Task{ Id: taskID, CompetitionId: "comp1", Title: "Test Task", Description: "This is a test task", InCompetitionPosition: 1, MaxPoints: 100, MaxAttempts: 10, Type: pb.TaskType_TASK_TYPE_INPUT, CreatedAt: timestamppb.Now(), UpdatedAt: timestamppb.Now(), } mockRepo.EXPECT().GetTask(ctx, taskID).Return(expectedTask, nil) task, err := service.GetTask(ctx, req) assert.NoError(t, err) assert.Equal(t, expectedTask, task) }) t.Run("EditTask", func(t *testing.T) { task := &pb.Task{ Id: "task1", CompetitionId: "comp1", Title: "Updated Test Task", Description: "This is an updated test task", InCompetitionPosition: 1, MaxPoints: 150, MaxAttempts: 5, Type: pb.TaskType_TASK_TYPE_CHECKER, } mockRepo.EXPECT().EditTask(ctx, task).Return(task, nil) updatedTask, err := service.EditTask(ctx, task) assert.NoError(t, err) assert.Equal(t, task, updatedTask) }) t.Run("DeleteTask", func(t *testing.T) { taskID := "task1" req := &pb.DeleteTaskRequest{TaskId: taskID} mockRepo.EXPECT().DeleteTask(ctx, taskID).Return(nil) _, err := service.DeleteTask(ctx, req) assert.NoError(t, err) }) t.Run("ListCompetitionTasks", func(t *testing.T) { competitionID := "comp1" req := &pb.ListCompetitionTasksRequest{CompetitionId: competitionID} expectedTasks := []*pb.Task{ {Id: "task1", CompetitionId: competitionID, Title: "Task 1"}, {Id: "task2", CompetitionId: competitionID, Title: "Task 2"}, } mockRepo.EXPECT().ListCompetitionTasks(ctx, competitionID).Return(expectedTasks, nil) resp, err := service.ListCompetitionTasks(ctx, req) assert.NoError(t, err) assert.Equal(t, expectedTasks, resp.Tasks) }) t.Run("GetTaskAttachments", func(t *testing.T) { taskID := "task1" showPrivate := true req := &pb.GetTaskAttachmentsRequest{TaskId: taskID, ShowPrivate: &showPrivate} expectedAttachments := []*pb.TaskAttachment{ {Id: "att1", FileUrl: "url1", IsPublic: true}, {Id: "att2", FileUrl: "url2", IsPublic: false}, } mockRepo.EXPECT().GetTaskAttachments(ctx, taskID, showPrivate).Return(expectedAttachments, nil) resp, err := service.GetTaskAttachments(ctx, req) assert.NoError(t, err) assert.Equal(t, expectedAttachments, resp.Attachments) }) t.Run("GetTaskAttachments - show public only", func(t *testing.T) { taskID := "task1" showPrivate := false req := &pb.GetTaskAttachmentsRequest{TaskId: taskID, ShowPrivate: &showPrivate} expectedAttachments := []*pb.TaskAttachment{ {Id: "att1", FileUrl: "url1", IsPublic: true}, } mockRepo.EXPECT().GetTaskAttachments(ctx, taskID, showPrivate).Return(expectedAttachments, nil) resp, err := service.GetTaskAttachments(ctx, req) assert.NoError(t, err) assert.Equal(t, expectedAttachments, resp.Attachments) }) }