slack5-1770574304/services/preferences-api/internal/service/preferences_test.go
rdev-worker 5fa5a77bfb
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
build: /implement-feature user-preferences
2026-02-08 18:36:52 +00:00

175 lines
4.6 KiB
Go

package service
import (
"context"
"testing"
"git.threesix.ai/jordan/slack5-1770574304/pkg/logging"
"git.threesix.ai/jordan/slack5-1770574304/services/preferences-api/internal/adapter/memory"
"git.threesix.ai/jordan/slack5-1770574304/services/preferences-api/internal/domain"
)
func newTestPreferenceService() (*PreferenceService, *memory.PreferenceRepository) {
repo := memory.NewPreferenceRepository()
svc := NewPreferenceService(repo, logging.Nop())
return svc, repo
}
func TestPreferenceService_GetPreferences_Defaults(t *testing.T) {
svc, _ := newTestPreferenceService()
prefs, err := svc.GetPreferences(context.Background(), "user-1")
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if prefs.UserID != "user-1" {
t.Errorf("expected user_id user-1, got %s", prefs.UserID)
}
if prefs.Theme != domain.ThemeSystem {
t.Errorf("expected default theme system, got %s", prefs.Theme)
}
if prefs.Language != "en" {
t.Errorf("expected default language en, got %s", prefs.Language)
}
if !prefs.Notifications.Email {
t.Error("expected default notifications.email true")
}
if !prefs.Notifications.Push {
t.Error("expected default notifications.push true")
}
if prefs.Notifications.Digest != domain.DigestWeekly {
t.Errorf("expected default digest weekly, got %s", prefs.Notifications.Digest)
}
}
func TestPreferenceService_GetPreferences_Existing(t *testing.T) {
svc, repo := newTestPreferenceService()
// Seed existing preferences
existing := &domain.UserPreferences{
UserID: "user-1",
Theme: domain.ThemeDark,
Language: "fr",
Notifications: domain.NotificationPreferences{
Email: false,
Push: true,
Digest: domain.DigestDaily,
},
}
_ = repo.Upsert(context.Background(), existing)
prefs, err := svc.GetPreferences(context.Background(), "user-1")
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if prefs.Theme != domain.ThemeDark {
t.Errorf("expected theme dark, got %s", prefs.Theme)
}
if prefs.Language != "fr" {
t.Errorf("expected language fr, got %s", prefs.Language)
}
if prefs.Notifications.Email {
t.Error("expected notifications.email false")
}
if prefs.Notifications.Digest != domain.DigestDaily {
t.Errorf("expected digest daily, got %s", prefs.Notifications.Digest)
}
}
func TestPreferenceService_UpdatePreferences_Valid(t *testing.T) {
svc, _ := newTestPreferenceService()
prefs := &domain.UserPreferences{
Theme: domain.ThemeDark,
Language: "ja",
Notifications: domain.NotificationPreferences{
Email: false,
Push: false,
Digest: domain.DigestNone,
},
}
result, err := svc.UpdatePreferences(context.Background(), "user-1", prefs)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
if result.UserID != "user-1" {
t.Errorf("expected user_id user-1, got %s", result.UserID)
}
if result.Theme != domain.ThemeDark {
t.Errorf("expected theme dark, got %s", result.Theme)
}
if result.Language != "ja" {
t.Errorf("expected language ja, got %s", result.Language)
}
}
func TestPreferenceService_UpdatePreferences_InvalidTheme(t *testing.T) {
svc, _ := newTestPreferenceService()
prefs := &domain.UserPreferences{
Theme: "invalid",
Language: "en",
Notifications: domain.NotificationPreferences{
Email: true,
Push: true,
Digest: domain.DigestWeekly,
},
}
_, err := svc.UpdatePreferences(context.Background(), "user-1", prefs)
if err == nil {
t.Fatal("expected error for invalid theme")
}
if err != domain.ErrInvalidTheme {
t.Errorf("expected ErrInvalidTheme, got %v", err)
}
}
func TestPreferenceService_UpdatePreferences_InvalidLanguage(t *testing.T) {
svc, _ := newTestPreferenceService()
prefs := &domain.UserPreferences{
Theme: domain.ThemeLight,
Language: "xx",
Notifications: domain.NotificationPreferences{
Email: true,
Push: true,
Digest: domain.DigestWeekly,
},
}
_, err := svc.UpdatePreferences(context.Background(), "user-1", prefs)
if err == nil {
t.Fatal("expected error for invalid language")
}
if err != domain.ErrInvalidLanguage {
t.Errorf("expected ErrInvalidLanguage, got %v", err)
}
}
func TestPreferenceService_UpdatePreferences_InvalidDigest(t *testing.T) {
svc, _ := newTestPreferenceService()
prefs := &domain.UserPreferences{
Theme: domain.ThemeLight,
Language: "en",
Notifications: domain.NotificationPreferences{
Email: true,
Push: true,
Digest: "biweekly",
},
}
_, err := svc.UpdatePreferences(context.Background(), "user-1", prefs)
if err == nil {
t.Fatal("expected error for invalid digest")
}
if err != domain.ErrInvalidDigest {
t.Errorf("expected ErrInvalidDigest, got %v", err)
}
}