package service import ( "context" "errors" "testing" "datarush/internal/user/middleware" "datarush/internal/user/service/mocks" pb "datarush/pkg/api/user" "github.com/stretchr/testify/assert" "go.uber.org/mock/gomock" ) 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) }) }