package usecase import ( "app-cloudep-member-server/pkg/domain/entity" "app-cloudep-member-server/pkg/domain/member" "app-cloudep-member-server/pkg/domain/usecase" mockRepo "app-cloudep-member-server/pkg/mock/repository" "context" "errors" "fmt" "testing" "code.30cm.net/digimon/library-go/errs" "github.com/stretchr/testify/assert" "go.uber.org/mock/gomock" ) func TestGenerateRefreshCode(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() mockVerifyCodeModel := mockRepo.NewMockVerifyCodeRepository(mockCtrl) uc := MustMemberUseCase(MemberUseCaseParam{ VerifyCodeModel: mockVerifyCodeModel, }) tests := []struct { name string param usecase.GenerateRefreshCodeRequest mockSetup func() wantErr bool }{ { name: "Successful code generation", param: usecase.GenerateRefreshCodeRequest{ LoginID: "testLoginID", CodeType: member.GenerateCodeTypeEmail, }, mockSetup: func() { mockVerifyCodeModel.EXPECT().IsVerifyCodeExist(gomock.Any(), "testLoginID", "email").Return("", nil) mockVerifyCodeModel.EXPECT().SetVerifyCode(gomock.Any(), "testLoginID", "email", gomock.Any()).Return(nil) }, wantErr: false, }, { name: "Code type not found", param: usecase.GenerateRefreshCodeRequest{ LoginID: "testLoginID", CodeType: -999, // Invalid code type }, mockSetup: func() {}, wantErr: true, }, { name: "Existing code retrieval", param: usecase.GenerateRefreshCodeRequest{ LoginID: "testLoginID", CodeType: member.GenerateCodeTypeEmail, }, mockSetup: func() { mockVerifyCodeModel.EXPECT().IsVerifyCodeExist(gomock.Any(), "testLoginID", "email").Return("123456", nil) }, wantErr: false, }, { name: "Set verify code failure", param: usecase.GenerateRefreshCodeRequest{ LoginID: "testLoginID", CodeType: member.GenerateCodeTypeEmail, }, mockSetup: func() { mockVerifyCodeModel.EXPECT().IsVerifyCodeExist(gomock.Any(), "testLoginID", "email").Return("", nil) mockVerifyCodeModel.EXPECT().SetVerifyCode(gomock.Any(), "testLoginID", "email", gomock.Any()).Return(errors.New("redis error")) }, wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { tt.mockSetup() resp, err := uc.GenerateRefreshCode(context.Background(), tt.param) if tt.wantErr { assert.Error(t, err) assert.Empty(t, resp) } else { assert.NoError(t, err) assert.NotEmpty(t, resp.Data.VerifyCode) } }) } } func TestCheckRefreshCode(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() mockVerifyCodeModel := mockRepo.NewMockVerifyCodeRepository(mockCtrl) uc := MustMemberUseCase(MemberUseCaseParam{ VerifyCodeModel: mockVerifyCodeModel, }) tests := []struct { name string param usecase.VerifyRefreshCodeRequest mockSetup func() wantErr bool }{ { name: "Successful verification", param: usecase.VerifyRefreshCodeRequest{ LoginID: "testLoginID", CodeType: member.GenerateCodeTypeEmail, VerifyCode: "123456", }, mockSetup: func() { mockVerifyCodeModel.EXPECT().IsVerifyCodeExist(gomock.Any(), "testLoginID", "email").Return("123456", nil) }, wantErr: false, }, { name: "Code type not found", param: usecase.VerifyRefreshCodeRequest{ LoginID: "testLoginID", CodeType: -1, // Invalid CodeType VerifyCode: "123456", }, mockSetup: func() {}, wantErr: true, }, { name: "Code not found in Redis", param: usecase.VerifyRefreshCodeRequest{ LoginID: "testLoginID", CodeType: member.GenerateCodeTypeEmail, VerifyCode: "123456", }, mockSetup: func() { mockVerifyCodeModel.EXPECT().IsVerifyCodeExist(gomock.Any(), "testLoginID", "email").Return("", nil) }, wantErr: true, }, { name: "Verification code mismatch", param: usecase.VerifyRefreshCodeRequest{ LoginID: "testLoginID", CodeType: member.GenerateCodeTypeEmail, VerifyCode: "654321", // Mismatch }, mockSetup: func() { mockVerifyCodeModel.EXPECT().IsVerifyCodeExist(gomock.Any(), "testLoginID", "email").Return("123456", nil) }, wantErr: true, }, { name: "Redis retrieval error", param: usecase.VerifyRefreshCodeRequest{ LoginID: "testLoginID", CodeType: member.GenerateCodeTypeEmail, VerifyCode: "123456", }, mockSetup: func() { mockVerifyCodeModel.EXPECT().IsVerifyCodeExist(gomock.Any(), "testLoginID", "email").Return("", errors.New("redis error")) }, wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { tt.mockSetup() err := uc.CheckRefreshCode(context.Background(), tt.param) if tt.wantErr { assert.Error(t, err) } else { assert.NoError(t, err) } }) } } func TestVerifyPlatformAuthResult(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish() mockAccountRepo := mockRepo.NewMockAccountRepository(mockCtrl) uc := MustMemberUseCase(MemberUseCaseParam{ Account: mockAccountRepo, }) token, err := HashPassword("password", 10) assert.NoError(t, err) fmt.Println(token) tests := []struct { name string param usecase.VerifyAuthResultRequest mockSetup func() wantResp usecase.VerifyAuthResultResponse wantErr bool }{ { name: "Successful verification", param: usecase.VerifyAuthResultRequest{ Account: "testAccount", Token: "password", }, mockSetup: func() { mockAccountRepo.EXPECT().FindOneByAccount(gomock.Any(), "testAccount").Return(&entity.Account{ Token: token, }, nil) }, wantResp: usecase.VerifyAuthResultResponse{ Status: true, }, wantErr: false, }, { name: "Invalid token verification", param: usecase.VerifyAuthResultRequest{ Account: "testAccount", Token: "invalidToken", }, mockSetup: func() { mockAccountRepo.EXPECT().FindOneByAccount(gomock.Any(), "testAccount").Return(&entity.Account{ Token: "validToken", }, nil) }, wantResp: usecase.VerifyAuthResultResponse{ Status: false, }, wantErr: false, }, { name: "Account not found", param: usecase.VerifyAuthResultRequest{ Account: "nonExistentAccount", Token: "someToken", }, mockSetup: func() { mockAccountRepo.EXPECT().FindOneByAccount(gomock.Any(), "nonExistentAccount").Return(nil, errs.ResourceNotFound("account not found")) }, wantResp: usecase.VerifyAuthResultResponse{}, wantErr: true, }, { name: "Database error", param: usecase.VerifyAuthResultRequest{ Account: "testAccount", Token: "someToken", }, mockSetup: func() { mockAccountRepo.EXPECT().FindOneByAccount(gomock.Any(), "testAccount").Return(nil, errors.New("database error")) }, wantResp: usecase.VerifyAuthResultResponse{}, wantErr: true, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { tt.mockSetup() resp, err := uc.VerifyPlatformAuthResult(context.Background(), tt.param) if tt.wantErr { assert.Error(t, err) } else { assert.NoError(t, err) assert.Equal(t, tt.wantResp, resp) } }) } }