From e76fad15233f10ced1c0839d0bff244761cb4273 Mon Sep 17 00:00:00 2001 From: James Hillyerd Date: Wed, 17 Oct 2012 20:25:27 -0700 Subject: [PATCH] More MIME dev, new unit test libs MIME parsing code is now in an acceptable state to integrate into web UI. It should be able to display text and/or HTML (sans attachments). Added "testify" unit testing library, providing assertions and mocks. --- app/inbucket/mime.go | 19 ++++-- app/inbucket/mime_test.go | 59 ++++++++++++++++--- ...l-mime-attach.raw => html-mime-inline.raw} | 0 test-data/non-mime.raw | 8 +++ 4 files changed, 73 insertions(+), 13 deletions(-) rename test-data/{html-mime-attach.raw => html-mime-inline.raw} (100%) create mode 100644 test-data/non-mime.raw diff --git a/app/inbucket/mime.go b/app/inbucket/mime.go index 7a0a409..a8393b3 100644 --- a/app/inbucket/mime.go +++ b/app/inbucket/mime.go @@ -64,6 +64,21 @@ func (n *MIMENode) String() string { return fmt.Sprintf("[%v %v] %v", n.Type, children, siblings) } +func IsMIMEMessage(mailMsg *mail.Message) bool { + // Parse top-level multipart + ctype := mailMsg.Header.Get("Content-Type") + mediatype, _, err := mime.ParseMediaType(ctype) + if err != nil { + return false + } + switch mediatype { + case "multipart/alternative": + return true + } + + return false +} + func ParseMIMEMessage(mailMsg *mail.Message) (*MIMEMessage, error) { mimeMsg := new(MIMEMessage) @@ -86,9 +101,7 @@ func ParseMIMEMessage(mailMsg *mail.Message) (*MIMEMessage, error) { // Root Node of our tree root := NewMIMENode(nil, mediatype) - err = parseNodes(root, mailMsg.Body, boundary) - fmt.Println(root.String()) // Locate text body match := root.BreadthFirstSearch(func(node *MIMENode) bool { @@ -106,8 +119,6 @@ func ParseMIMEMessage(mailMsg *mail.Message) (*MIMEMessage, error) { mimeMsg.Html = string(match.Content) } - fmt.Println(mimeMsg.String()) - return mimeMsg, err } diff --git a/app/inbucket/mime_test.go b/app/inbucket/mime_test.go index 52c8df4..3675985 100644 --- a/app/inbucket/mime_test.go +++ b/app/inbucket/mime_test.go @@ -2,27 +2,68 @@ package inbucket import ( "bufio" + "fmt" + "github.com/stretchrcom/testify/assert" "net/mail" "os" + "path/filepath" "testing" ) -func TestSomething(t *testing.T) { - // Open test email for parsing - raw, err := os.Open("../../test-data/html-mime-attach.raw") +func TestIdentifyNonMime(t *testing.T) { + msg := readMessage("non-mime.raw") + assert.False(t, IsMIMEMessage(msg), "Failed to identify non-MIME message") +} + +func TestIdentifyMime(t *testing.T) { + msg := readMessage("html-mime-inline.raw") + assert.True(t, IsMIMEMessage(msg), "Failed to identify MIME message") +} + +func TestParseNonMime(t *testing.T) { + msg := readMessage("non-mime.raw") + + _, err := ParseMIMEMessage(msg) + assert.NotNil(t, err, "Expected error parsing a non-MIME message") +} + +func TestParseInlineText(t *testing.T) { + msg := readMessage("html-mime-inline.raw") + + mime, err := ParseMIMEMessage(msg) if err != nil { - t.Fatalf("Failed to open test data: %v", err) + t.Fatalf("Failed to parse mime: %v", err) + } + + assert.Equal(t, mime.Text, "Test of HTML section") +} + +func TestParseInlineHtml(t *testing.T) { + msg := readMessage("html-mime-inline.raw") + + mime, err := ParseMIMEMessage(msg) + if err != nil { + t.Fatalf("Failed to parse mime: %v", err) + } + + assert.Contains(t, mime.Html, "") + assert.Contains(t, mime.Html, "Test of HTML section") +} + +// readMessage is a test utility function to fetch a mail.Message object. +func readMessage(filename string) *mail.Message { + // Open test email for parsing + raw, err := os.Open(filepath.Join("..", "..", "test-data", filename)) + if err != nil { + panic(fmt.Sprintf("Failed to open test data: %v", err)) } // Parse email into a mail.Message object like we do reader := bufio.NewReader(raw) msg, err := mail.ReadMessage(reader) if err != nil { - t.Fatalf("Failed to read message: %v", err) + panic(fmt.Sprintf("Failed to read message: %v", err)) } - _, err = ParseMIMEMessage(msg) - if err != nil { - t.Fatalf("Failed to parse mime: %v", err) - } + return msg } diff --git a/test-data/html-mime-attach.raw b/test-data/html-mime-inline.raw similarity index 100% rename from test-data/html-mime-attach.raw rename to test-data/html-mime-inline.raw diff --git a/test-data/non-mime.raw b/test-data/non-mime.raw new file mode 100644 index 0000000..ce1f0af --- /dev/null +++ b/test-data/non-mime.raw @@ -0,0 +1,8 @@ +Date: Sun, 14 Oct 2012 16:09:01 -0700 +To: greg@inbucket.com +From: James Hillyerd +Subject: test Sun, 14 Oct 2012 16:09:01 -0700 +X-Mailer: swaks v20120320.0 jetmore.org/john/code/swaks/ + +This is a test mailing +