diff options
| author | mihna123 <mihailonvojinovic@gmail.com> | 2026-08-29 23:28:28 +0200 |
|---|---|---|
| committer | mihna123 <mihailonvojinovic@gmail.com> | 2026-08-29 23:28:28 +0200 |
| commit | 41d4965db78414ba53237f791919ae17c0b99e14 (patch) | |
| tree | bd3e25202e8cb66cff14b7c119c7afdbbc7b1ff6 /internal/user/service_test.go | |
| parent | 7ba6bc53be1546b44610840c46996dd6e2147405 (diff) | |
| download | openstore-41d4965db78414ba53237f791919ae17c0b99e14.tar.gz openstore-41d4965db78414ba53237f791919ae17c0b99e14.zip | |
user: add a service stub with validated register method
Diffstat (limited to 'internal/user/service_test.go')
| -rw-r--r-- | internal/user/service_test.go | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/internal/user/service_test.go b/internal/user/service_test.go new file mode 100644 index 0000000..938d2c3 --- /dev/null +++ b/internal/user/service_test.go @@ -0,0 +1,134 @@ +package user + +import ( + "errors" + "log/slog" + "os" + "testing" + + "golang.org/x/crypto/bcrypt" +) + +func TestMain(m *testing.M) { + slog.SetDefault(slog.New(slog.DiscardHandler)) + os.Exit(m.Run()) +} + +func NewTestUserService(t *testing.T) *Service { + t.Helper() + return &Service{repository: getEmptyRepository(), bcryptCost: bcrypt.MinCost} +} + +func TestRegisterInputValidateFaultyData(t *testing.T) { + badInputs := getInvalidRegisterInputs() + + for name, in := range badInputs { + t.Run(name, func(t *testing.T) { + err := in.validate() + if err == nil { + t.Errorf("bad input got through: %+v", in) + } + if !errors.Is(err, ErrInvalidInput) { + t.Errorf("unexpected error: got %v, want ErrInvalidInput", err) + } + }) + } +} + +func TestRegisterBadInput(t *testing.T) { + in := &RegisterInput{} + s := NewTestUserService(t) + _, err := s.Register(in) + if err == nil { + t.Error("no error when registering with faulty input") + } +} + +func TestRegisterExistingUser(t *testing.T) { + r := getEmptyRepository() + r.fill() + + badInputs := map[string]RegisterInput{ + "existing username": { + Username: r.users[0].Username, + Email: "thisemaildoesnt@exist.com", + Phone: "123321", + Password: "22332233", + }, + "existing email": { + Username: "thisusernamedoesntexist", + Email: r.users[0].Email, + Phone: "123321", + Password: "22332233", + }, + } + + for name, in := range badInputs { + t.Run(name, func(t *testing.T) { + s := &Service{repository: r, bcryptCost: bcrypt.MinCost} + _, err := s.Register(&in) + if err == nil { + t.Error("existing user registered") + } + + if !errors.Is(err, ErrUserExists) { + t.Errorf("unexpected error: got %v, want ErrUserExists", err) + } + }) + } +} + +func TestRegisterRepositoryError(t *testing.T) { + s := &Service{repository: &RepositoryMock{err: errors.New("db down")}} + in := &RegisterInput{Username: "bob", Email: "b@b.com", Password: "thisissecure"} + _, err := s.Register(in) + + if err == nil { + t.Error("register swallowed repository error") + } + + if errors.Is(err, ErrUserExists) { + t.Error("repository failure reported as ErrUserExists") + } +} + +func TestSuccessfulRegister(t *testing.T) { + s := NewTestUserService(t) + in := &RegisterInput{ + Username: "happyuser123", + Email: "happyuser@email.com", + Phone: "+381233232", + Password: "supersecretpassword1234", + } + usr, err := s.Register(in) + if err != nil { + t.Errorf("register with good input failed: %+v", in) + } + + err = bcrypt.CompareHashAndPassword([]byte(usr.passwordHash), []byte(in.Password)) + if err != nil { + t.Errorf("hash and password compare error: %v", err) + } +} + +func TestRegisterSameUserTwice(t *testing.T) { + s := NewTestUserService(t) + in := &RegisterInput{ + Username: "happyuser123", + Email: "happyuser@email.com", + Phone: "+381233232", + Password: "supersecretpassword1234", + } + + s.Register(in) + + _, err := s.Register(in) + if err == nil { + t.Errorf("registered same user twice: %+v", in) + } + + if !errors.Is(err, ErrUserExists) { + t.Errorf("unexpected error: got %v, want ErrUserExists", err) + } + +} |
