package notification import ( "strings" "testing" ) func TestRenderAllTemplates(t *testing.T) { tpls, err := NewTemplates() if err != nil { t.Fatalf("NewTemplates: %v", err) } cases := []struct { name TemplateName data map[string]any wantHTML []string // substrings expected in HTML body wantText []string // substrings expected in text body }{ { name: TmplVerification, data: map[string]any{ "Name": "Kay", "Link": "https://example.test/verify-email?token=x", "Subject": "Verify your GuestGuard email", "UnsubscribeLink": "https://example.test/unsubscribe/abc", }, wantHTML: []string{"Verify your email", "Kay", "Verify email", "https://example.test/verify-email?token=x", "unsubscribe here"}, wantText: []string{"Hi Kay", "https://example.test/verify-email?token=x"}, }, { name: TmplPasswordReset, data: map[string]any{ "Name": "Kay", "Link": "https://example.test/reset-password/abc", "ExpiryHumane": "1 hour", }, wantHTML: []string{"Reset your password", "1 hour", "https://example.test/reset-password/abc"}, wantText: []string{"reset your GuestGuard password", "1 hour"}, }, { name: TmplInvitation, data: map[string]any{ "GuestName": "Mira", "HostName": "Kay", "EventName": "Beach Day", "Venue": "Ocean Park", "EventDate": "Sat 14 Jun, 4pm", "Link": "https://example.test/rsvp/tok_x", }, wantHTML: []string{"You're invited", "Beach Day", "Mira", "Ocean Park", "RSVP now", "https://example.test/rsvp/tok_x"}, wantText: []string{"Beach Day", "Mira", "RSVP here", "https://example.test/rsvp/tok_x"}, }, { name: TmplConfirmation, data: map[string]any{ "GuestName": "Mira", "HostName": "Kay", "EventName": "Beach Day", "Venue": "Ocean Park", "EventDate": "Sat 14 Jun, 4pm", "Response": "attending", "PlusOnes": 2, }, wantHTML: []string{"RSVP received", "Beach Day", "attending", "2 plus-ones"}, wantText: []string{"Beach Day", "attending", "+2"}, }, { name: TmplReminder, data: map[string]any{ "GuestName": "Mira", "EventName": "Beach Day", "EventDate": "Sat 14 Jun, 4pm", "Venue": "Ocean Park", "Response": "attending", "PlusOnes": 1, }, wantHTML: []string{"Reminder", "Beach Day", "Ocean Park", "1 plus-one"}, wantText: []string{"Reminder", "Beach Day", "(+1)"}, }, } for _, tc := range cases { t.Run(string(tc.name), func(t *testing.T) { html, text, err := tpls.Render(tc.name, tc.data) if err != nil { t.Fatalf("render: %v", err) } for _, s := range tc.wantHTML { if !strings.Contains(html, s) { t.Errorf("html missing %q\n---\n%s", s, html) } } for _, s := range tc.wantText { if !strings.Contains(text, s) { t.Errorf("text missing %q\n---\n%s", s, text) } } }) } }