admin_service_create_user_test.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. //go:build unit
  2. package service
  3. import (
  4. "context"
  5. "errors"
  6. "testing"
  7. "github.com/Wei-Shaw/sub2api/internal/config"
  8. "github.com/stretchr/testify/require"
  9. )
  10. func TestAdminService_CreateUser_Success(t *testing.T) {
  11. repo := &userRepoStub{nextID: 10}
  12. svc := &adminServiceImpl{userRepo: repo}
  13. balance := 12.5
  14. input := &CreateUserInput{
  15. Email: "user@test.com",
  16. Password: "strong-pass",
  17. Username: "tester",
  18. Notes: "note",
  19. Balance: &balance,
  20. Concurrency: 7,
  21. AllowedGroups: []int64{3, 5},
  22. }
  23. user, err := svc.CreateUser(context.Background(), input)
  24. require.NoError(t, err)
  25. require.NotNil(t, user)
  26. require.Equal(t, int64(10), user.ID)
  27. require.Equal(t, input.Email, user.Email)
  28. require.Equal(t, input.Username, user.Username)
  29. require.Equal(t, input.Notes, user.Notes)
  30. require.Equal(t, balance, user.Balance)
  31. require.Equal(t, input.Concurrency, user.Concurrency)
  32. require.Equal(t, input.AllowedGroups, user.AllowedGroups)
  33. require.Equal(t, RoleUser, user.Role)
  34. require.Equal(t, StatusActive, user.Status)
  35. require.True(t, user.CheckPassword(input.Password))
  36. require.Len(t, repo.created, 1)
  37. require.Equal(t, user, repo.created[0])
  38. }
  39. func TestAdminService_CreateUser_UsesDefaultBalanceWhenBalanceOmitted(t *testing.T) {
  40. repo := &userRepoStub{nextID: 11}
  41. cfg := &config.Config{
  42. Default: config.DefaultConfig{
  43. UserBalance: 0,
  44. },
  45. }
  46. settingService := NewSettingService(&settingRepoStub{values: map[string]string{
  47. SettingKeyDefaultBalance: "0.02",
  48. }}, cfg)
  49. svc := &adminServiceImpl{userRepo: repo, settingService: settingService}
  50. user, err := svc.CreateUser(context.Background(), &CreateUserInput{
  51. Email: "default-balance@test.com",
  52. Password: "strong-pass",
  53. })
  54. require.NoError(t, err)
  55. require.NotNil(t, user)
  56. require.Equal(t, 0.02, user.Balance)
  57. require.Len(t, repo.created, 1)
  58. require.Equal(t, 0.02, repo.created[0].Balance)
  59. }
  60. func TestAdminService_CreateUser_ExplicitZeroBalanceOverridesDefault(t *testing.T) {
  61. repo := &userRepoStub{nextID: 12}
  62. cfg := &config.Config{
  63. Default: config.DefaultConfig{
  64. UserBalance: 0,
  65. },
  66. }
  67. settingService := NewSettingService(&settingRepoStub{values: map[string]string{
  68. SettingKeyDefaultBalance: "0.02",
  69. }}, cfg)
  70. svc := &adminServiceImpl{userRepo: repo, settingService: settingService}
  71. balance := 0.0
  72. user, err := svc.CreateUser(context.Background(), &CreateUserInput{
  73. Email: "zero-balance@test.com",
  74. Password: "strong-pass",
  75. Balance: &balance,
  76. })
  77. require.NoError(t, err)
  78. require.NotNil(t, user)
  79. require.Equal(t, 0.0, user.Balance)
  80. require.Len(t, repo.created, 1)
  81. require.Equal(t, 0.0, repo.created[0].Balance)
  82. }
  83. func TestAdminService_CreateUser_EmailExists(t *testing.T) {
  84. repo := &userRepoStub{createErr: ErrEmailExists}
  85. svc := &adminServiceImpl{userRepo: repo}
  86. _, err := svc.CreateUser(context.Background(), &CreateUserInput{
  87. Email: "dup@test.com",
  88. Password: "password",
  89. })
  90. require.ErrorIs(t, err, ErrEmailExists)
  91. require.Empty(t, repo.created)
  92. }
  93. func TestAdminService_CreateUser_CreateError(t *testing.T) {
  94. createErr := errors.New("db down")
  95. repo := &userRepoStub{createErr: createErr}
  96. svc := &adminServiceImpl{userRepo: repo}
  97. _, err := svc.CreateUser(context.Background(), &CreateUserInput{
  98. Email: "user@test.com",
  99. Password: "password",
  100. })
  101. require.ErrorIs(t, err, createErr)
  102. require.Empty(t, repo.created)
  103. }
  104. func TestAdminService_CreateUser_AssignsDefaultSubscriptions(t *testing.T) {
  105. repo := &userRepoStub{nextID: 21}
  106. assigner := &defaultSubscriptionAssignerStub{}
  107. cfg := &config.Config{
  108. Default: config.DefaultConfig{
  109. UserBalance: 0,
  110. UserConcurrency: 1,
  111. },
  112. }
  113. settingService := NewSettingService(&settingRepoStub{values: map[string]string{
  114. SettingKeyDefaultSubscriptions: `[{"group_id":5,"validity_days":30}]`,
  115. }}, cfg)
  116. svc := &adminServiceImpl{
  117. userRepo: repo,
  118. settingService: settingService,
  119. defaultSubAssigner: assigner,
  120. }
  121. _, err := svc.CreateUser(context.Background(), &CreateUserInput{
  122. Email: "new-user@test.com",
  123. Password: "password",
  124. })
  125. require.NoError(t, err)
  126. require.Len(t, assigner.calls, 1)
  127. require.Equal(t, int64(21), assigner.calls[0].UserID)
  128. require.Equal(t, int64(5), assigner.calls[0].GroupID)
  129. require.Equal(t, 30, assigner.calls[0].ValidityDays)
  130. }