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) } }