add task service

This commit is contained in:
Timur Kh.
2025-12-17 10:40:23 +03:00
parent 843c50a103
commit 6537aded89
10 changed files with 697 additions and 3 deletions
@@ -0,0 +1,131 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: internal/task/service/service.go
//
// Generated by this command:
//
// mockgen -source=internal/task/service/service.go -destination=internal/task/service/mocks/mock_repository.go -package=mocks
//
// Package mocks is a generated GoMock package.
package mocks
import (
context "context"
task "datarush/pkg/api/task"
reflect "reflect"
gomock "go.uber.org/mock/gomock"
)
// MockTaskRepository is a mock of TaskRepository interface.
type MockTaskRepository struct {
ctrl *gomock.Controller
recorder *MockTaskRepositoryMockRecorder
isgomock struct{}
}
// MockTaskRepositoryMockRecorder is the mock recorder for MockTaskRepository.
type MockTaskRepositoryMockRecorder struct {
mock *MockTaskRepository
}
// NewMockTaskRepository creates a new mock instance.
func NewMockTaskRepository(ctrl *gomock.Controller) *MockTaskRepository {
mock := &MockTaskRepository{ctrl: ctrl}
mock.recorder = &MockTaskRepositoryMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockTaskRepository) EXPECT() *MockTaskRepositoryMockRecorder {
return m.recorder
}
// CreateTask mocks base method.
func (m *MockTaskRepository) CreateTask(ctx context.Context, t *task.Task) (*task.Task, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "CreateTask", ctx, t)
ret0, _ := ret[0].(*task.Task)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// CreateTask indicates an expected call of CreateTask.
func (mr *MockTaskRepositoryMockRecorder) CreateTask(ctx, t any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateTask", reflect.TypeOf((*MockTaskRepository)(nil).CreateTask), ctx, t)
}
// DeleteTask mocks base method.
func (m *MockTaskRepository) DeleteTask(ctx context.Context, id string) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "DeleteTask", ctx, id)
ret0, _ := ret[0].(error)
return ret0
}
// DeleteTask indicates an expected call of DeleteTask.
func (mr *MockTaskRepositoryMockRecorder) DeleteTask(ctx, id any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteTask", reflect.TypeOf((*MockTaskRepository)(nil).DeleteTask), ctx, id)
}
// EditTask mocks base method.
func (m *MockTaskRepository) EditTask(ctx context.Context, t *task.Task) (*task.Task, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "EditTask", ctx, t)
ret0, _ := ret[0].(*task.Task)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// EditTask indicates an expected call of EditTask.
func (mr *MockTaskRepositoryMockRecorder) EditTask(ctx, t any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EditTask", reflect.TypeOf((*MockTaskRepository)(nil).EditTask), ctx, t)
}
// GetTask mocks base method.
func (m *MockTaskRepository) GetTask(ctx context.Context, id string) (*task.Task, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetTask", ctx, id)
ret0, _ := ret[0].(*task.Task)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetTask indicates an expected call of GetTask.
func (mr *MockTaskRepositoryMockRecorder) GetTask(ctx, id any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTask", reflect.TypeOf((*MockTaskRepository)(nil).GetTask), ctx, id)
}
// GetTaskAttachments mocks base method.
func (m *MockTaskRepository) GetTaskAttachments(ctx context.Context, taskID string, showPrivate bool) ([]*task.TaskAttachment, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetTaskAttachments", ctx, taskID, showPrivate)
ret0, _ := ret[0].([]*task.TaskAttachment)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetTaskAttachments indicates an expected call of GetTaskAttachments.
func (mr *MockTaskRepositoryMockRecorder) GetTaskAttachments(ctx, taskID, showPrivate any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetTaskAttachments", reflect.TypeOf((*MockTaskRepository)(nil).GetTaskAttachments), ctx, taskID, showPrivate)
}
// ListCompetitionTasks mocks base method.
func (m *MockTaskRepository) ListCompetitionTasks(ctx context.Context, competitionID string) ([]*task.Task, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ListCompetitionTasks", ctx, competitionID)
ret0, _ := ret[0].([]*task.Task)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// ListCompetitionTasks indicates an expected call of ListCompetitionTasks.
func (mr *MockTaskRepositoryMockRecorder) ListCompetitionTasks(ctx, competitionID any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListCompetitionTasks", reflect.TypeOf((*MockTaskRepository)(nil).ListCompetitionTasks), ctx, competitionID)
}
+62
View File
@@ -0,0 +1,62 @@
package service
import (
"context"
pb "datarush/pkg/api/task"
"google.golang.org/protobuf/types/known/emptypb"
)
type TaskRepository interface {
CreateTask(ctx context.Context, t *pb.Task) (*pb.Task, error)
GetTask(ctx context.Context, id string) (*pb.Task, error)
EditTask(ctx context.Context, t *pb.Task) (*pb.Task, error)
DeleteTask(ctx context.Context, id string) error
ListCompetitionTasks(ctx context.Context, competitionID string) ([]*pb.Task, error)
GetTaskAttachments(ctx context.Context, taskID string, showPrivate bool) ([]*pb.TaskAttachment, error)
}
type TaskService struct {
repo TaskRepository
}
func NewTaskService(repo TaskRepository) *TaskService {
return &TaskService{repo: repo}
}
func (s *TaskService) CreateTask(ctx context.Context, req *pb.Task) (*pb.Task, error) {
return s.repo.CreateTask(ctx, req)
}
func (s *TaskService) GetTask(ctx context.Context, req *pb.GetTaskRequest) (*pb.Task, error) {
return s.repo.GetTask(ctx, req.TaskId)
}
func (s *TaskService) EditTask(ctx context.Context, req *pb.Task) (*pb.Task, error) {
return s.repo.EditTask(ctx, req)
}
func (s *TaskService) DeleteTask(ctx context.Context, req *pb.DeleteTaskRequest) (*emptypb.Empty, error) {
err := s.repo.DeleteTask(ctx, req.TaskId)
return &emptypb.Empty{}, err
}
func (s *TaskService) ListCompetitionTasks(ctx context.Context, req *pb.ListCompetitionTasksRequest) (*pb.ListCompetitionTasksResponse, error) {
tasks, err := s.repo.ListCompetitionTasks(ctx, req.CompetitionId)
if err != nil {
return nil, err
}
return &pb.ListCompetitionTasksResponse{Tasks: tasks}, nil
}
func (s *TaskService) GetTaskAttachments(ctx context.Context, req *pb.GetTaskAttachmentsRequest) (*pb.GetTaskAttachmentsResponse, error) {
showPrivate := false
if req.ShowPrivate != nil {
showPrivate = *req.ShowPrivate
}
attachments, err := s.repo.GetTaskAttachments(ctx, req.TaskId, showPrivate)
if err != nil {
return nil, err
}
return &pb.GetTaskAttachmentsResponse{Attachments: attachments}, nil
}
+140
View File
@@ -0,0 +1,140 @@
package service
import (
"context"
"testing"
"datarush/internal/task/service/mocks"
pb "datarush/pkg/api/task"
"go.uber.org/mock/gomock"
"github.com/stretchr/testify/assert"
"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)
})
}