| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- //go:build unit
- package service
- import (
- "context"
- "errors"
- "testing"
- "github.com/Wei-Shaw/sub2api/internal/config"
- "github.com/stretchr/testify/require"
- )
- func TestAdminService_CreateUser_Success(t *testing.T) {
- repo := &userRepoStub{nextID: 10}
- svc := &adminServiceImpl{userRepo: repo}
- balance := 12.5
- input := &CreateUserInput{
- Email: "user@test.com",
- Password: "strong-pass",
- Username: "tester",
- Notes: "note",
- Balance: &balance,
- Concurrency: 7,
- AllowedGroups: []int64{3, 5},
- }
- user, err := svc.CreateUser(context.Background(), input)
- require.NoError(t, err)
- require.NotNil(t, user)
- require.Equal(t, int64(10), user.ID)
- require.Equal(t, input.Email, user.Email)
- require.Equal(t, input.Username, user.Username)
- require.Equal(t, input.Notes, user.Notes)
- require.Equal(t, balance, user.Balance)
- require.Equal(t, input.Concurrency, user.Concurrency)
- require.Equal(t, input.AllowedGroups, user.AllowedGroups)
- require.Equal(t, RoleUser, user.Role)
- require.Equal(t, StatusActive, user.Status)
- require.True(t, user.CheckPassword(input.Password))
- require.Len(t, repo.created, 1)
- require.Equal(t, user, repo.created[0])
- }
- func TestAdminService_CreateUser_UsesDefaultBalanceWhenBalanceOmitted(t *testing.T) {
- repo := &userRepoStub{nextID: 11}
- cfg := &config.Config{
- Default: config.DefaultConfig{
- UserBalance: 0,
- },
- }
- settingService := NewSettingService(&settingRepoStub{values: map[string]string{
- SettingKeyDefaultBalance: "0.02",
- }}, cfg)
- svc := &adminServiceImpl{userRepo: repo, settingService: settingService}
- user, err := svc.CreateUser(context.Background(), &CreateUserInput{
- Email: "default-balance@test.com",
- Password: "strong-pass",
- })
- require.NoError(t, err)
- require.NotNil(t, user)
- require.Equal(t, 0.02, user.Balance)
- require.Len(t, repo.created, 1)
- require.Equal(t, 0.02, repo.created[0].Balance)
- }
- func TestAdminService_CreateUser_ExplicitZeroBalanceOverridesDefault(t *testing.T) {
- repo := &userRepoStub{nextID: 12}
- cfg := &config.Config{
- Default: config.DefaultConfig{
- UserBalance: 0,
- },
- }
- settingService := NewSettingService(&settingRepoStub{values: map[string]string{
- SettingKeyDefaultBalance: "0.02",
- }}, cfg)
- svc := &adminServiceImpl{userRepo: repo, settingService: settingService}
- balance := 0.0
- user, err := svc.CreateUser(context.Background(), &CreateUserInput{
- Email: "zero-balance@test.com",
- Password: "strong-pass",
- Balance: &balance,
- })
- require.NoError(t, err)
- require.NotNil(t, user)
- require.Equal(t, 0.0, user.Balance)
- require.Len(t, repo.created, 1)
- require.Equal(t, 0.0, repo.created[0].Balance)
- }
- func TestAdminService_CreateUser_EmailExists(t *testing.T) {
- repo := &userRepoStub{createErr: ErrEmailExists}
- svc := &adminServiceImpl{userRepo: repo}
- _, err := svc.CreateUser(context.Background(), &CreateUserInput{
- Email: "dup@test.com",
- Password: "password",
- })
- require.ErrorIs(t, err, ErrEmailExists)
- require.Empty(t, repo.created)
- }
- func TestAdminService_CreateUser_CreateError(t *testing.T) {
- createErr := errors.New("db down")
- repo := &userRepoStub{createErr: createErr}
- svc := &adminServiceImpl{userRepo: repo}
- _, err := svc.CreateUser(context.Background(), &CreateUserInput{
- Email: "user@test.com",
- Password: "password",
- })
- require.ErrorIs(t, err, createErr)
- require.Empty(t, repo.created)
- }
- func TestAdminService_CreateUser_AssignsDefaultSubscriptions(t *testing.T) {
- repo := &userRepoStub{nextID: 21}
- assigner := &defaultSubscriptionAssignerStub{}
- cfg := &config.Config{
- Default: config.DefaultConfig{
- UserBalance: 0,
- UserConcurrency: 1,
- },
- }
- settingService := NewSettingService(&settingRepoStub{values: map[string]string{
- SettingKeyDefaultSubscriptions: `[{"group_id":5,"validity_days":30}]`,
- }}, cfg)
- svc := &adminServiceImpl{
- userRepo: repo,
- settingService: settingService,
- defaultSubAssigner: assigner,
- }
- _, err := svc.CreateUser(context.Background(), &CreateUserInput{
- Email: "new-user@test.com",
- Password: "password",
- })
- require.NoError(t, err)
- require.Len(t, assigner.calls, 1)
- require.Equal(t, int64(21), assigner.calls[0].UserID)
- require.Equal(t, int64(5), assigner.calls[0].GroupID)
- require.Equal(t, 30, assigner.calls[0].ValidityDays)
- }
|