1
0

GODT-1650: text/html sending tests

This commit is contained in:
James Houlahan
2022-10-04 16:27:38 +02:00
parent ba9368426c
commit c953b8030a
12 changed files with 535 additions and 165 deletions

View File

@ -6,82 +6,85 @@ import (
"strconv"
"time"
"github.com/bradenaw/juniper/xslices"
"github.com/cucumber/godog"
"github.com/cucumber/messages-go/v16"
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
"github.com/emersion/go-imap"
"golang.org/x/exp/slices"
)
type Message struct {
Subject string `bdd:"subject"`
From string `bdd:"sender"`
To string `bdd:"recipient"`
From string `bdd:"from"`
To string `bdd:"to"`
CC string `bdd:"cc"`
BCC string `bdd:"bcc"`
Unread bool `bdd:"unread"`
}
func newMessageFromRow(header, row *messages.PickleTableRow) Message {
var msg Message
if err := unmarshalRow(header, row, &msg); err != nil {
panic(err)
func newMessageFromIMAP(msg *imap.Message) Message {
message := Message{
Subject: msg.Envelope.Subject,
Unread: slices.Contains(msg.Flags, imap.SeenFlag),
}
return msg
if len(msg.Envelope.From) > 0 {
message.From = msg.Envelope.From[0].Address()
}
if len(msg.Envelope.To) > 0 {
message.To = msg.Envelope.To[0].Address()
}
if len(msg.Envelope.Cc) > 0 {
message.CC = msg.Envelope.Cc[0].Address()
}
if len(msg.Envelope.Bcc) > 0 {
message.BCC = msg.Envelope.Bcc[0].Address()
}
return message
}
func matchMessages(have []Message, want *godog.Table) error {
if want := parseMessages(want); !cmp.Equal(want, have, cmpopts.SortSlices(func(a, b Message) bool { return a.Subject < b.Subject })) {
return fmt.Errorf("want: %v, have: %v", want, have)
func matchMessages(have, want []Message) error {
if !IsSub(ToAny(have), ToAny(want)) {
return fmt.Errorf("missing messages: %v", want)
}
return nil
}
func parseMessages(table *godog.Table) []Message {
header := table.Rows[0]
return xslices.Map(table.Rows[1:], func(row *messages.PickleTableRow) Message {
return newMessageFromRow(header, row)
})
}
type Mailbox struct {
Name string `bdd:"name"`
Total int `bdd:"total"`
Unread int `bdd:"unread"`
}
func newMailboxFromRow(header, row *messages.PickleTableRow) Mailbox {
var mbox Mailbox
if err := unmarshalRow(header, row, &mbox); err != nil {
panic(err)
func newMailboxFromIMAP(status *imap.MailboxStatus) Mailbox {
return Mailbox{
Name: status.Name,
Total: int(status.Messages),
Unread: int(status.Unseen),
}
return mbox
}
func matchMailboxes(have []Mailbox, want *godog.Table) error {
if want := parseMailboxes(want); !cmp.Equal(want, have, cmpopts.SortSlices(func(a, b Mailbox) bool { return a.Name < b.Name })) {
return fmt.Errorf("want: %v, have: %v", want, have)
func matchMailboxes(have, want []Mailbox) error {
slices.SortFunc(have, func(a, b Mailbox) bool {
return a.Name < b.Name
})
slices.SortFunc(want, func(a, b Mailbox) bool {
return a.Name < b.Name
})
if !IsSub(want, have) {
return fmt.Errorf("missing messages: %v", want)
}
return nil
}
func parseMailboxes(table *godog.Table) []Mailbox {
header := table.Rows[0]
return xslices.Map(table.Rows[1:], func(row *messages.PickleTableRow) Mailbox {
return newMailboxFromRow(header, row)
})
}
func eventually(condition func() error, waitFor, tick time.Duration) error {
ch := make(chan error, 1)
@ -111,14 +114,24 @@ func eventually(condition func() error, waitFor, tick time.Duration) error {
}
}
func getCellValue(header, row *messages.PickleTableRow, name string) (string, bool) {
for idx, cell := range header.Cells {
if cell.Value == name {
return row.Cells[idx].Value, true
}
func unmarshalTable[T any](table *messages.PickleTable) ([]T, error) {
if len(table.Rows) == 0 {
return nil, fmt.Errorf("empty table")
}
return "", false
var res []T
for _, row := range table.Rows[1:] {
var v T
if err := unmarshalRow(table.Rows[0], row, &v); err != nil {
return nil, err
}
res = append(res, v)
}
return res, nil
}
func unmarshalRow(header, row *messages.PickleTableRow, v any) error {
@ -152,6 +165,16 @@ func unmarshalRow(header, row *messages.PickleTableRow, v any) error {
return nil
}
func getCellValue(header, row *messages.PickleTableRow, name string) (string, bool) {
for idx, cell := range header.Cells {
if cell.Value == name {
return row.Cells[idx].Value, true
}
}
return "", false
}
func mustParseInt(s string) int {
i, err := strconv.Atoi(s)
if err != nil {