add user service
This commit is contained in:
@@ -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)
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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)
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user