app-cloudep-member-server/pkg/usecase/generate_test.go

95 lines
2.3 KiB
Go
Raw Permalink Normal View History

2024-12-30 03:58:14 +00:00
package usecase
import (
"app-cloudep-member-server/pkg/domain/entity"
mockRepo "app-cloudep-member-server/pkg/mock/repository"
"context"
"errors"
"math"
"testing"
GIDLib "code.30cm.net/digimon/library-go/utils/invited_code"
"github.com/stretchr/testify/assert"
"go.uber.org/mock/gomock"
)
func TestMemberUseCase_Generate(t *testing.T) {
mockCtrl := gomock.NewController(t)
defer mockCtrl.Finish()
mockAutoIDRepository := mockRepo.NewMockAutoIDRepository(mockCtrl)
uc := MustMemberUseCase(MemberUseCaseParam{
GenerateUID: mockAutoIDRepository,
})
tests := []struct {
name string
mockSetup func()
wantErr bool
expected string
}{
{
name: "successful UID generation",
mockSetup: func() {
mockAutoIDRepository.EXPECT().Inc(gomock.Any(), gomock.Any()).DoAndReturn(
func(ctx context.Context, data *entity.AutoID) error {
data.Counter = 123
return nil
},
)
mockAutoIDRepository.EXPECT().GetUIDFromNum(int64(GIDLib.InitAutoID+123)).Return("generatedUID", nil)
},
wantErr: false,
expected: "generatedUID",
},
{
name: "increment error",
mockSetup: func() {
mockAutoIDRepository.EXPECT().Inc(gomock.Any(), gomock.Any()).Return(errors.New("increment error"))
},
wantErr: true,
},
{
name: "UID generation error",
mockSetup: func() {
mockAutoIDRepository.EXPECT().Inc(gomock.Any(), gomock.Any()).DoAndReturn(
func(ctx context.Context, data *entity.AutoID) error {
data.Counter = 123
return nil
},
)
mockAutoIDRepository.EXPECT().GetUIDFromNum(int64(GIDLib.InitAutoID+123)).Return("", errors.New("UID generation error"))
},
wantErr: true,
},
{
name: "sum exceeds int64",
mockSetup: func() {
mockAutoIDRepository.EXPECT().Inc(gomock.Any(), gomock.Any()).DoAndReturn(
func(ctx context.Context, data *entity.AutoID) error {
data.Counter = math.MaxInt64 // Force overflow
return nil
},
)
},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
tt.mockSetup()
result, err := uc.Generate(context.Background())
if tt.wantErr {
assert.Error(t, err)
assert.Empty(t, result)
} else {
assert.NoError(t, err)
assert.Equal(t, tt.expected, result)
}
})
}
}