175 lines
4.6 KiB
Go
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)
|
|
}
|
|
}
|