add user service

This commit is contained in:
Timur Kh.
2025-12-17 12:09:25 +03:00
parent 843c50a103
commit 6f21e895f0
9 changed files with 596 additions and 0 deletions
@@ -0,0 +1,100 @@
// Code generated by MockGen. DO NOT EDIT.
// Source: internal/user/service/service.go
//
// Generated by this command:
//
// mockgen -source=internal/user/service/service.go -destination=internal/user/service/mocks/mock_repository.go -package=mocks
//
// Package mocks is a generated GoMock package.
package mocks
import (
context "context"
user "datarush/pkg/api/user"
reflect "reflect"
gomock "go.uber.org/mock/gomock"
)
// MockUserRepository is a mock of UserRepository interface.
type MockUserRepository struct {
ctrl *gomock.Controller
recorder *MockUserRepositoryMockRecorder
isgomock struct{}
}
// MockUserRepositoryMockRecorder is the mock recorder for MockUserRepository.
type MockUserRepositoryMockRecorder struct {
mock *MockUserRepository
}
// NewMockUserRepository creates a new mock instance.
func NewMockUserRepository(ctrl *gomock.Controller) *MockUserRepository {
mock := &MockUserRepository{ctrl: ctrl}
mock.recorder = &MockUserRepositoryMockRecorder{mock}
return mock
}
// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockUserRepository) EXPECT() *MockUserRepositoryMockRecorder {
return m.recorder
}
// GetProfile mocks base method.
func (m *MockUserRepository) GetProfile(ctx context.Context, userID string) (*user.User, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetProfile", ctx, userID)
ret0, _ := ret[0].(*user.User)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetProfile indicates an expected call of GetProfile.
func (mr *MockUserRepositoryMockRecorder) GetProfile(ctx, userID any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetProfile", reflect.TypeOf((*MockUserRepository)(nil).GetProfile), ctx, userID)
}
// ListUserCompetitions mocks base method.
func (m *MockUserRepository) ListUserCompetitions(ctx context.Context, userID string) ([]string, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ListUserCompetitions", ctx, userID)
ret0, _ := ret[0].([]string)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// ListUserCompetitions indicates an expected call of ListUserCompetitions.
func (mr *MockUserRepositoryMockRecorder) ListUserCompetitions(ctx, userID any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ListUserCompetitions", reflect.TypeOf((*MockUserRepository)(nil).ListUserCompetitions), ctx, userID)
}
// RegisterForCompetition mocks base method.
func (m *MockUserRepository) RegisterForCompetition(ctx context.Context, userID, competitionID string) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "RegisterForCompetition", ctx, userID, competitionID)
ret0, _ := ret[0].(error)
return ret0
}
// RegisterForCompetition indicates an expected call of RegisterForCompetition.
func (mr *MockUserRepositoryMockRecorder) RegisterForCompetition(ctx, userID, competitionID any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RegisterForCompetition", reflect.TypeOf((*MockUserRepository)(nil).RegisterForCompetition), ctx, userID, competitionID)
}
// UnregisterFromCompetition mocks base method.
func (m *MockUserRepository) UnregisterFromCompetition(ctx context.Context, userID, competitionID string) error {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "UnregisterFromCompetition", ctx, userID, competitionID)
ret0, _ := ret[0].(error)
return ret0
}
// UnregisterFromCompetition indicates an expected call of UnregisterFromCompetition.
func (mr *MockUserRepositoryMockRecorder) UnregisterFromCompetition(ctx, userID, competitionID any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "UnregisterFromCompetition", reflect.TypeOf((*MockUserRepository)(nil).UnregisterFromCompetition), ctx, userID, competitionID)
}
+57
View File
@@ -0,0 +1,57 @@
package service
import (
"context"
"errors"
"datarush/internal/user/middleware"
pb "datarush/pkg/api/user"
"google.golang.org/protobuf/types/known/emptypb"
)
type UserRepository interface {
GetProfile(ctx context.Context, userID string) (*pb.User, error)
RegisterForCompetition(ctx context.Context, userID, competitionID string) error
UnregisterFromCompetition(ctx context.Context, userID, competitionID string) error
ListUserCompetitions(ctx context.Context, userID string) ([]string, error)
}
type UserService struct {
repo UserRepository
}
func NewUserService(repo UserRepository) *UserService {
return &UserService{repo: repo}
}
func (s *UserService) GetProfile(ctx context.Context, req *pb.GetProfileRequest) (*pb.User, error) {
return s.repo.GetProfile(ctx, req.UserId)
}
func (s *UserService) RegisterForCompetition(ctx context.Context, req *pb.RegisterForCompetitionRequest) (*emptypb.Empty, error) {
userID, ok := ctx.Value(middleware.UserIDKey{}).(string)
if !ok {
return nil, errors.New("user ID not found in context")
}
err := s.repo.RegisterForCompetition(ctx, userID, req.CompetitionId)
return &emptypb.Empty{}, err
}
func (s *UserService) UnregisterFromCompetition(ctx context.Context, req *pb.UnregisterFromCompetitionRequest) (*emptypb.Empty, error) {
userID, ok := ctx.Value(middleware.UserIDKey{}).(string)
if !ok {
return nil, errors.New("user ID not found in context")
}
err := s.repo.UnregisterFromCompetition(ctx, userID, req.CompetitionId)
return &emptypb.Empty{}, err
}
func (s *UserService) ListUserCompetitions(ctx context.Context, req *pb.ListUserCompetitionsRequest) (*pb.ListUserCompetitionsResponse, error) {
competitionIDs, err := s.repo.ListUserCompetitions(ctx, req.UserId)
if err != nil {
return nil, err
}
return &pb.ListUserCompetitionsResponse{CompetitionIds: competitionIDs}, nil
}
+102
View File
@@ -0,0 +1,102 @@
package service
import (
"context"
"errors"
"testing"
"datarush/internal/user/middleware"
"datarush/internal/user/service/mocks"
pb "datarush/pkg/api/user"
"go.uber.org/mock/gomock"
"github.com/stretchr/testify/assert"
"google.golang.org/protobuf/types/known/emptypb"
)
func TestUserService(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockRepo := mocks.NewMockUserRepository(ctrl)
service := NewUserService(mockRepo)
ctx := context.Background()
userID := "test-user-id"
ctx = context.WithValue(ctx, middleware.UserIDKey{}, userID)
t.Run("GetProfile", func(t *testing.T) {
req := &pb.GetProfileRequest{UserId: userID}
expectedUser := &pb.User{
Id: userID,
Username: "testuser",
Email: "test@example.com",
}
mockRepo.EXPECT().GetProfile(ctx, userID).Return(expectedUser, nil)
user, err := service.GetProfile(ctx, req)
assert.NoError(t, err)
assert.Equal(t, expectedUser, user)
})
t.Run("RegisterForCompetition", func(t *testing.T) {
competitionID := "comp1"
req := &pb.RegisterForCompetitionRequest{CompetitionId: competitionID}
mockRepo.EXPECT().RegisterForCompetition(ctx, userID, competitionID).Return(nil)
_, err := service.RegisterForCompetition(ctx, req)
assert.NoError(t, err)
})
t.Run("RegisterForCompetition - No UserID in context", func(t *testing.T) {
competitionID := "comp1"
req := &pb.RegisterForCompetitionRequest{CompetitionId: competitionID}
_, err := service.RegisterForCompetition(context.Background(), req)
assert.Error(t, err)
assert.Equal(t, "user ID not found in context", err.Error())
})
t.Run("UnregisterFromCompetition", func(t *testing.T) {
competitionID := "comp1"
req := &pb.UnregisterFromCompetitionRequest{CompetitionId: competitionID}
mockRepo.EXPECT().UnregisterFromCompetition(ctx, userID, competitionID).Return(nil)
_, err := service.UnregisterFromCompetition(ctx, req)
assert.NoError(t, err)
})
t.Run("UnregisterFromCompetition - No UserID in context", func(t *testing.T) {
competitionID := "comp1"
req := &pb.UnregisterFromCompetitionRequest{CompetitionId: competitionID}
_, err := service.UnregisterFromCompetition(context.Background(), req)
assert.Error(t, err)
assert.Equal(t, "user ID not found in context", err.Error())
})
t.Run("ListUserCompetitions", func(t *testing.T) {
req := &pb.ListUserCompetitionsRequest{UserId: userID}
expectedCompetitionIDs := []string{"comp1", "comp2"}
mockRepo.EXPECT().ListUserCompetitions(ctx, userID).Return(expectedCompetitionIDs, nil)
resp, err := service.ListUserCompetitions(ctx, req)
assert.NoError(t, err)
assert.Equal(t, expectedCompetitionIDs, resp.CompetitionIds)
})
t.Run("ListUserCompetitions - Error", func(t *testing.T) {
req := &pb.ListUserCompetitionsRequest{UserId: userID}
expectedError := errors.New("repository error")
mockRepo.EXPECT().ListUserCompetitions(ctx, userID).Return(nil, expectedError)
_, err := service.ListUserCompetitions(ctx, req)
assert.Error(t, err)
assert.Equal(t, expectedError, err)
})
}