Add tests for middleware application on messages

Introduced comprehensive test cases for applying middlewares (uppercase and encode) to messages. Also added tests for writing messages to memory buffers and parsing them back. Corrected messages in helper functions for consistency.
This commit is contained in:
Winni Neessen 2024-10-28 14:54:42 +01:00
parent ae44d37d03
commit 4a519a3b1f
Signed by: wneessen
GPG key ID: 385AC9889632126E

View file

@ -5142,24 +5142,136 @@ func TestMsg_Reset(t *testing.T) {
}
}
func TestMsg_applyMiddlewares(t *testing.T) {
t.Run("new message with middleware: uppercase", func(t *testing.T) {
tests := []struct {
subject string
want string
}{
{"This is test subject", "THIS IS TEST SUBJECT"},
{"This is also a test subject", "THIS IS ALSO A TEST SUBJECT"},
}
for _, tt := range tests {
t.Run(tt.subject, func(t *testing.T) {
message := NewMsg()
if message == nil {
t.Fatal("message is nil")
}
if len(message.middlewares) != 0 {
t.Errorf("NewMsg() failed. Expected empty middlewares, got: %d", len(message.middlewares))
}
message = NewMsg(WithMiddleware(uppercaseMiddleware{}))
if len(message.middlewares) != 1 {
t.Errorf("NewMsg(WithMiddleware(uppercaseMiddleware{})) failed. Expected 1 middleware, got: %d",
len(message.middlewares))
}
message.Subject(tt.subject)
checkGenHeader(t, message, HeaderSubject, "applyMiddleware", 0, 1, tt.subject)
message = message.applyMiddlewares(message)
checkGenHeader(t, message, HeaderSubject, "applyMiddleware", 0, 1, tt.want)
})
}
})
t.Run("new message with middleware: encode", func(t *testing.T) {
tests := []struct {
subject string
want string
}{
{"This is a test subject", "This is @ test subject"},
{"This is also a test subject", "This is @lso @ test subject"},
}
for _, tt := range tests {
t.Run(tt.subject, func(t *testing.T) {
message := NewMsg()
if message == nil {
t.Fatal("message is nil")
}
if len(message.middlewares) != 0 {
t.Errorf("NewMsg() failed. Expected empty middlewares, got: %d", len(message.middlewares))
}
message = NewMsg(WithMiddleware(encodeMiddleware{}))
if len(message.middlewares) != 1 {
t.Errorf("NewMsg(WithMiddleware(encodeMiddleware{})) failed. Expected 1 middleware, got: %d",
len(message.middlewares))
}
message.Subject(tt.subject)
checkGenHeader(t, message, HeaderSubject, "applyMiddleware", 0, 1, tt.subject)
message = message.applyMiddlewares(message)
checkGenHeader(t, message, HeaderSubject, "applyMiddleware", 0, 1, tt.want)
})
}
})
t.Run("new message with middleware: uppercase and encode", func(t *testing.T) {
tests := []struct {
subject string
want string
}{
{"This is a test subject", "THIS IS @ TEST SUBJECT"},
{"This is also a test subject", "THIS IS @LSO @ TEST SUBJECT"},
}
for _, tt := range tests {
t.Run(tt.subject, func(t *testing.T) {
message := NewMsg()
if message == nil {
t.Fatal("message is nil")
}
if len(message.middlewares) != 0 {
t.Errorf("NewMsg() failed. Expected empty middlewares, got: %d", len(message.middlewares))
}
message = NewMsg(WithMiddleware(encodeMiddleware{}), WithMiddleware(uppercaseMiddleware{}))
if len(message.middlewares) != 2 {
t.Errorf("NewMsg(WithMiddleware(encodeMiddleware{})) failed. Expected 2 middlewares, got: %d",
len(message.middlewares))
}
message.Subject(tt.subject)
checkGenHeader(t, message, HeaderSubject, "applyMiddleware", 0, 1, tt.subject)
message = message.applyMiddlewares(message)
checkGenHeader(t, message, HeaderSubject, "applyMiddleware", 0, 1, tt.want)
})
}
})
}
func TestMsg_WriteTo(t *testing.T) {
t.Run("WriteTo memory buffer with normal mail parts", func(t *testing.T) {
message := testMessage(t)
buffer := bytes.NewBuffer(nil)
if _, err := message.WriteTo(buffer); err != nil {
t.Fatalf("failed to write message to buffer: %s", err)
}
parsed, err := EMLToMsgFromReader(buffer)
if err != nil {
t.Fatalf("failed to parse message in buffer: %s", err)
}
checkAddrHeader(t, parsed, HeaderFrom, "WriteTo", 0, 1, TestSenderValid, "")
checkAddrHeader(t, parsed, HeaderTo, "WriteTo", 0, 1, TestRcptValid, "")
checkGenHeader(t, parsed, HeaderSubject, "WriteTo", 0, 1, "Testmail")
parts := parsed.GetParts()
if len(parts) != 1 {
t.Fatalf("expected 1 parts, got: %d", len(parts))
}
if parts[0].contentType != TypeTextPlain {
t.Errorf("expected contentType to be %s, got: %s", TypeTextPlain, parts[0].contentType)
}
if parts[0].encoding != EncodingQP {
t.Errorf("expected encoding to be %s, got: %s", EncodingQP, parts[0].encoding)
}
messageBuf := bytes.NewBuffer(nil)
_, err = parts[0].writeFunc(messageBuf)
if err != nil {
t.Errorf("writer func failed: %s", err)
}
got := strings.TrimSpace(messageBuf.String())
if !strings.HasSuffix(got, "Testmail") {
t.Errorf("expected message buffer to contain Testmail, got: %s", got)
}
})
}
/*
// TestNewMsgWithMiddleware tests WithMiddleware
func TestNewMsgWithMiddleware(t *testing.T) {
m := NewMsg()
if len(m.middlewares) != 0 {
t.Errorf("empty middlewares failed. m.middlewares expected to be: empty, got: %d middleware", len(m.middlewares))
}
m = NewMsg(WithMiddleware(uppercaseMiddleware{}))
if len(m.middlewares) != 1 {
t.Errorf("empty middlewares failed. m.middlewares expected to be: 1, got: %d middleware", len(m.middlewares))
}
m = NewMsg(WithMiddleware(uppercaseMiddleware{}), WithMiddleware(encodeMiddleware{}))
if len(m.middlewares) != 2 {
t.Errorf("empty middlewares failed. m.middlewares expected to be: 2, got: %d middleware", len(m.middlewares))
}
}
// TestApplyMiddlewares tests the applyMiddlewares for the Msg object
func TestApplyMiddlewares(t *testing.T) {
@ -6658,23 +6770,23 @@ func checkAddrHeader(t *testing.T, message *Msg, header AddrHeader, fn string, f
t.Helper()
addresses, ok := message.addrHeader[header]
if !ok {
t.Fatalf("failed to set %s, addrHeader field is not set", fn)
t.Fatalf("failed to exec %s, addrHeader field is not set", fn)
}
if len(addresses) != wantFields {
t.Fatalf("failed to set %s, addrHeader value count is: %d, want: %d", fn, len(addresses), field)
t.Fatalf("failed to exec %s, addrHeader value count is: %d, want: %d", fn, len(addresses), field)
}
if addresses[field].Address != wantMail {
t.Errorf("failed to set %s, addrHeader value is %s, want: %s", fn, addresses[field].Address, wantMail)
t.Errorf("failed to exec %s, addrHeader value is %s, want: %s", fn, addresses[field].Address, wantMail)
}
wantString := fmt.Sprintf(`<%s>`, wantMail)
if wantName != "" {
wantString = fmt.Sprintf(`%q <%s>`, wantName, wantMail)
}
if addresses[field].String() != wantString {
t.Errorf("failed to set %s, addrHeader value is %s, want: %s", fn, addresses[field].String(), wantString)
t.Errorf("failed to exec %s, addrHeader value is %s, want: %s", fn, addresses[field].String(), wantString)
}
if addresses[field].Name != wantName {
t.Errorf("failed to set %s, addrHeader name is %s, want: %s", fn, addresses[field].Name, wantName)
t.Errorf("failed to exec %s, addrHeader name is %s, want: %s", fn, addresses[field].Name, wantName)
}
}
@ -6685,12 +6797,12 @@ func checkGenHeader(t *testing.T, message *Msg, header Header, fn string, field,
t.Helper()
values, ok := message.genHeader[header]
if !ok {
t.Fatalf("failed to set %s, genHeader field is not set", fn)
t.Fatalf("failed to exec %s, genHeader field is not set", fn)
}
if len(values) != wantFields {
t.Fatalf("failed to set %s, genHeader value count is: %d, want: %d", fn, len(values), field)
t.Fatalf("failed to exec %s, genHeader value count is: %d, want: %d", fn, len(values), field)
}
if values[field] != wantVal {
t.Errorf("failed to set %s, genHeader value is %s, want: %s", fn, values[field], wantVal)
t.Errorf("failed to exec %s, genHeader value is %s, want: %s", fn, values[field], wantVal)
}
}