summaryrefslogtreecommitdiff
path: root/internal/user/service_test.go
diff options
context:
space:
mode:
authormihna123 <mihailonvojinovic@gmail.com>2026-08-29 23:28:28 +0200
committermihna123 <mihailonvojinovic@gmail.com>2026-08-29 23:28:28 +0200
commit41d4965db78414ba53237f791919ae17c0b99e14 (patch)
treebd3e25202e8cb66cff14b7c119c7afdbbc7b1ff6 /internal/user/service_test.go
parent7ba6bc53be1546b44610840c46996dd6e2147405 (diff)
downloadopenstore-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.go134
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)
+ }
+
+}