package account import ( "context" "errors" "strings" "testing" "time" "github.com/google/uuid" ) // TestUpdateProfileValidation checks that bad fields are rejected before any // database access, so a nil-backed Store is enough to exercise the guards. It also // confirms UpdateProfile wires the Stage 8 validators (name format, away window, // offset/IANA timezone), not just their unit tests in validate_test.go. func TestUpdateProfileValidation(t *testing.T) { s := &Store{} base := ProfileUpdate{DisplayName: "Kaya", PreferredLanguage: "en", TimeZone: "UTC"} hm := func(h, m int) time.Time { return time.Date(0, 1, 1, h, m, 0, 0, time.UTC) } tests := []struct { name string mut func(p *ProfileUpdate) }{ {"unknown language", func(p *ProfileUpdate) { p.PreferredLanguage = "fr" }}, {"invalid timezone", func(p *ProfileUpdate) { p.TimeZone = "Mars/Olympus" }}, {"bad offset timezone", func(p *ProfileUpdate) { p.TimeZone = "+15:00" }}, {"over-long name", func(p *ProfileUpdate) { p.DisplayName = strings.Repeat("x", maxDisplayName+1) }}, {"bad name layout", func(p *ProfileUpdate) { p.DisplayName = "Bad__Name" }}, {"away over 12h", func(p *ProfileUpdate) { p.AwayStart, p.AwayEnd = hm(8, 0), hm(21, 0) }}, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { p := base tc.mut(&p) if _, err := s.UpdateProfile(context.Background(), uuid.New(), p); !errors.Is(err, ErrInvalidProfile) { t.Fatalf("err = %v, want ErrInvalidProfile", err) } }) } }