sessions/internal/domain/user_test.go

150 lines
3.2 KiB
Go

package domain_test
import (
"fmt"
"math/rand"
"testing"
"gitea.dwysokinski.me/twhelp/sessions/internal/domain"
"github.com/stretchr/testify/assert"
)
func TestNewCreateUserParams(t *testing.T) {
t.Parallel()
tests := []struct {
name string
username string
expectedErr error
}{
{
name: "OK",
username: "testTEST-test-2",
expectedErr: nil,
},
{
name: "ERR: username is required",
username: "",
expectedErr: domain.ValidationError{
Field: "Name",
Err: domain.ErrRequired,
},
},
{
name: "ERR: len(username) < 2",
username: "u",
expectedErr: domain.ValidationError{
Field: "Name",
Err: domain.MinLengthError{
Min: 2,
},
},
},
{
name: "ERR: len(username) > 40",
username: randString(41),
expectedErr: domain.ValidationError{
Field: "Name",
Err: domain.MaxLengthError{
Max: 40,
},
},
},
{
name: "ERR: username - hyphen at the end",
username: "u-",
expectedErr: domain.ValidationError{
Field: "Name",
Err: domain.ErrUsernameFormat,
},
},
{
name: "ERR: username - hyphen at the beginning",
username: "-u",
expectedErr: domain.ValidationError{
Field: "Name",
Err: domain.ErrUsernameFormat,
},
},
{
name: "ERR: username - only alphanumeric 1",
username: "userńame",
expectedErr: domain.ValidationError{
Field: "Name",
Err: domain.ErrUsernameFormat,
},
},
{
name: "ERR: username - only alphanumeric 1",
username: "漢字",
expectedErr: domain.ValidationError{
Field: "Name",
Err: domain.ErrUsernameFormat,
},
},
}
for _, tt := range tests {
tt := tt
t.Run(tt.name, func(t *testing.T) {
t.Parallel()
params, err := domain.NewCreateUserParams(tt.username)
if tt.expectedErr != nil {
assert.Equal(t, tt.expectedErr, err)
assert.Zero(t, params)
return
}
assert.NoError(t, err)
assert.Equal(t, tt.username, params.Name())
})
}
}
func TestUsernameAlreadyTakenError(t *testing.T) {
t.Parallel()
err := domain.UsernameAlreadyTakenError{
Name: "xxxx",
}
var _ domain.Error = err
assert.Equal(t, fmt.Sprintf("username '%s' is already taken", err.Name), err.Error())
assert.Equal(t, err.Error(), err.UserError())
assert.Equal(t, domain.ErrorCodeAlreadyExists, err.Code())
}
func TestUserDoesNotExistError(t *testing.T) {
t.Parallel()
err := domain.UserDoesNotExistError{
ID: 12345,
}
var _ domain.Error = err
assert.Equal(t, fmt.Sprintf("user (ID=%d) doesn't exist", err.ID), err.Error())
assert.Equal(t, err.Error(), err.UserError())
assert.Equal(t, domain.ErrorCodeValidationError, err.Code())
}
func TestUserNotFoundError(t *testing.T) {
t.Parallel()
err := domain.UserNotFoundError{
ID: 12345,
}
var _ domain.Error = err
assert.Equal(t, fmt.Sprintf("user (ID=%d) not found", err.ID), err.Error())
assert.Equal(t, err.Error(), err.UserError())
assert.Equal(t, domain.ErrorCodeEntityNotFound, err.Code())
}
func randString(length int) string {
const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
b := make([]byte, length)
for i := range b {
//nolint:gosec
b[i] = charset[rand.Intn(len(charset))]
}
return string(b)
}