slate-test-1770505673/services/preferences-api/internal/domain/preference_test.go
rdev-worker 868f79c67a
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
build: /implement-feature user-preferences
2026-02-07 23:47:42 +00:00

125 lines
3.6 KiB
Go

package domain
import (
"errors"
"testing"
)
func TestValidateKey(t *testing.T) {
tests := []struct {
name string
key string
wantErr error
}{
{name: "valid theme", key: "theme", wantErr: nil},
{name: "valid language", key: "language", wantErr: nil},
{name: "valid notifications_enabled", key: "notifications_enabled", wantErr: nil},
{name: "unknown key", key: "unknown", wantErr: ErrUnknownKey},
{name: "empty key", key: "", wantErr: ErrUnknownKey},
{name: "similar key", key: "themes", wantErr: ErrUnknownKey},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := ValidateKey(tt.key)
if tt.wantErr == nil {
if err != nil {
t.Errorf("expected no error, got %v", err)
}
} else {
if !errors.Is(err, tt.wantErr) {
t.Errorf("expected %v, got %v", tt.wantErr, err)
}
}
})
}
}
func TestValidateValue(t *testing.T) {
tests := []struct {
name string
key string
value string
wantErr error
}{
// Theme
{name: "theme light", key: "theme", value: "light", wantErr: nil},
{name: "theme dark", key: "theme", value: "dark", wantErr: nil},
{name: "theme system", key: "theme", value: "system", wantErr: nil},
{name: "theme invalid", key: "theme", value: "blue", wantErr: ErrInvalidValue},
{name: "theme empty", key: "theme", value: "", wantErr: ErrInvalidValue},
// Language
{name: "language en", key: "language", value: "en", wantErr: nil},
{name: "language fr", key: "language", value: "fr", wantErr: nil},
{name: "language es", key: "language", value: "es", wantErr: nil},
{name: "language invalid long", key: "language", value: "english", wantErr: ErrInvalidValue},
{name: "language invalid uppercase", key: "language", value: "EN", wantErr: ErrInvalidValue},
{name: "language invalid single char", key: "language", value: "e", wantErr: ErrInvalidValue},
{name: "language empty", key: "language", value: "", wantErr: ErrInvalidValue},
// Notifications
{name: "notifications true", key: "notifications_enabled", value: "true", wantErr: nil},
{name: "notifications false", key: "notifications_enabled", value: "false", wantErr: nil},
{name: "notifications invalid yes", key: "notifications_enabled", value: "yes", wantErr: ErrInvalidValue},
{name: "notifications invalid 1", key: "notifications_enabled", value: "1", wantErr: ErrInvalidValue},
// Unknown key
{name: "unknown key", key: "unknown", value: "anything", wantErr: ErrUnknownKey},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := ValidateValue(tt.key, tt.value)
if tt.wantErr == nil {
if err != nil {
t.Errorf("expected no error, got %v", err)
}
} else {
if !errors.Is(err, tt.wantErr) {
t.Errorf("expected %v, got %v", tt.wantErr, err)
}
}
})
}
}
func TestPreference_Validate(t *testing.T) {
tests := []struct {
name string
pref Preference
wantErr error
}{
{
name: "valid preference",
pref: Preference{UserID: "user-1", Key: "theme", Value: "dark"},
wantErr: nil,
},
{
name: "unknown key",
pref: Preference{UserID: "user-1", Key: "unknown", Value: "val"},
wantErr: ErrUnknownKey,
},
{
name: "invalid value",
pref: Preference{UserID: "user-1", Key: "theme", Value: "blue"},
wantErr: ErrInvalidValue,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := tt.pref.Validate()
if tt.wantErr == nil {
if err != nil {
t.Errorf("expected no error, got %v", err)
}
} else {
if !errors.Is(err, tt.wantErr) {
t.Errorf("expected %v, got %v", tt.wantErr, err)
}
}
})
}
}