diff --git a/msgwriter_test.go b/msgwriter_test.go new file mode 100644 index 0000000..856616d --- /dev/null +++ b/msgwriter_test.go @@ -0,0 +1,102 @@ +package mail + +import ( + "bytes" + "fmt" + "io" + "mime" + "strings" + "testing" + "time" +) + +// brokenWriter implements a broken writer for io.Writer testing +type brokenWriter struct { + io.Writer +} + +// Write implements the io.Writer interface but intentionally returns an error at +// any time +func (bw *brokenWriter) Write([]byte) (int, error) { + return 0, fmt.Errorf("intentionally failed") +} + +// TestMsgWriter_Write tests the Write() method of the msgWriter +func TestMsgWriter_Write(t *testing.T) { + bw := &brokenWriter{} + mw := &msgWriter{w: bw, c: CharsetUTF8, en: mime.QEncoding} + _, err := mw.Write([]byte("test")) + if err == nil { + t.Errorf("msgWriter Write() with brokenWriter should fail, but didn't") + } + + // Also test the part when a previous error happend + mw.err = fmt.Errorf("broken") + _, err = mw.Write([]byte("test")) + if err == nil { + t.Errorf("msgWriter Write() with brokenWriter should fail, but didn't") + } +} + +// TestMsgWriter_writeMsg tests the writeMsg method of the msgWriter +func TestMsgWriter_writeMsg(t *testing.T) { + m := NewMsg() + _ = m.From(`"Toni Tester" `) + _ = m.To(`"Toni Receiver" `) + m.Subject("This is a subject") + m.SetBulk() + now := time.Now() + m.SetDateWithValue(now) + m.SetMessageIDWithValue("message@id.com") + m.SetBodyString(TypeTextPlain, "This is the body") + buf := bytes.Buffer{} + mw := &msgWriter{w: &buf, c: CharsetUTF8, en: mime.QEncoding} + mw.writeMsg(m) + ms := buf.String() + + var ea []string + if !strings.Contains(ms, `MIME-Version: 1.0`) { + ea = append(ea, "MIME-Version") + } + if !strings.Contains(ms, fmt.Sprintf("Date: %s", now.Format(time.RFC1123Z))) { + ea = append(ea, "Date") + } + if !strings.Contains(ms, `Message-ID: `) { + ea = append(ea, "Message-ID") + } + if !strings.Contains(ms, `Precedence: bulk`) { + ea = append(ea, "Precedence") + } + if !strings.Contains(ms, `Subject: This is a subject`) { + ea = append(ea, "Subject") + } + if !strings.Contains(ms, `User-Agent: go-mail v`) { + ea = append(ea, "User-Agent") + } + if !strings.Contains(ms, `X-Mailer: go-mail v`) { + ea = append(ea, "X-Mailer") + } + if !strings.Contains(ms, `From: "Toni Tester" `) { + ea = append(ea, "From") + } + if !strings.Contains(ms, `To: "Toni Receiver" `) { + ea = append(ea, "To") + } + if !strings.Contains(ms, `Content-Type: text/plain; charset=UTF-8`) { + ea = append(ea, "Content-Type") + } + if !strings.Contains(ms, `Content-Transfer-Encoding: quoted-printable`) { + ea = append(ea, "Content-Transfer-Encoding") + } + if !strings.Contains(ms, "\r\n\r\nThis is the body") { + ea = append(ea, "Message body") + } + if len(ea) > 0 { + em := fmt.Sprint("writeMsg() failed. The following errors occured:\n") + for e := range ea { + em += fmt.Sprintf("* incorrect %q field", ea[e]) + } + em += fmt.Sprintf("\n\nFull message:\n%s", ms) + t.Errorf(em) + } +}