package forms_test import ( "strings" "testing" validation "github.com/go-ozzo/ozzo-validation/v4" "github.com/pocketbase/pocketbase/forms" "github.com/pocketbase/pocketbase/tests" ) func TestEmailSendValidateAndSubmit(t *testing.T) { scenarios := []struct { template string email string expectedErrors []string }{ {"", "", []string{"template", "email"}}, {"invalid", "test@example.com", []string{"template"}}, {"verification", "invalid", []string{"email"}}, {"verification", "test@example.com", nil}, {"password-reset", "test@example.com", nil}, {"email-change", "test@example.com", nil}, } for i, s := range scenarios { func() { app, _ := tests.NewTestApp() defer app.Cleanup() form := forms.NewTestEmailSend(app) form.Email = s.email form.Template = s.template result := form.Submit() // parse errors errs, ok := result.(validation.Errors) if !ok && result != nil { t.Errorf("(%d) Failed to parse errors %v", i, result) return } // check errors if len(errs) > len(s.expectedErrors) { t.Errorf("(%d) Expected error keys %v, got %v", i, s.expectedErrors, errs) return } for _, k := range s.expectedErrors { if _, ok := errs[k]; !ok { t.Errorf("(%d) Missing expected error key %q in %v", i, k, errs) return } } expectedEmails := 1 if len(s.expectedErrors) > 0 { expectedEmails = 0 } if app.TestMailer.TotalSend != expectedEmails { t.Errorf("(%d) Expected %d email(s) to be sent, got %d", i, expectedEmails, app.TestMailer.TotalSend) } if len(s.expectedErrors) > 0 { return } expectedContent := "Verify" if s.template == "password-reset" { expectedContent = "Reset password" } else if s.template == "email-change" { expectedContent = "Confirm new email" } if !strings.Contains(app.TestMailer.LastMessage.HTML, expectedContent) { t.Errorf("(%d) Expected the email to contains %s, got \n%v", i, expectedContent, app.TestMailer.LastMessage.HTML) } }() } }