1
0
mirror of https://github.com/jhillyerd/inbucket.git synced 2025-12-17 17:47:03 +00:00

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.
This commit is contained in:
James Hillyerd
2012-10-17 20:25:27 -07:00
parent bc7526abef
commit e76fad1523
4 changed files with 73 additions and 13 deletions

View File

@@ -64,6 +64,21 @@ func (n *MIMENode) String() string {
return fmt.Sprintf("[%v %v] %v", n.Type, children, siblings) 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) { func ParseMIMEMessage(mailMsg *mail.Message) (*MIMEMessage, error) {
mimeMsg := new(MIMEMessage) mimeMsg := new(MIMEMessage)
@@ -86,9 +101,7 @@ func ParseMIMEMessage(mailMsg *mail.Message) (*MIMEMessage, error) {
// Root Node of our tree // Root Node of our tree
root := NewMIMENode(nil, mediatype) root := NewMIMENode(nil, mediatype)
err = parseNodes(root, mailMsg.Body, boundary) err = parseNodes(root, mailMsg.Body, boundary)
fmt.Println(root.String())
// Locate text body // Locate text body
match := root.BreadthFirstSearch(func(node *MIMENode) bool { match := root.BreadthFirstSearch(func(node *MIMENode) bool {
@@ -106,8 +119,6 @@ func ParseMIMEMessage(mailMsg *mail.Message) (*MIMEMessage, error) {
mimeMsg.Html = string(match.Content) mimeMsg.Html = string(match.Content)
} }
fmt.Println(mimeMsg.String())
return mimeMsg, err return mimeMsg, err
} }

View File

@@ -2,27 +2,68 @@ package inbucket
import ( import (
"bufio" "bufio"
"fmt"
"github.com/stretchrcom/testify/assert"
"net/mail" "net/mail"
"os" "os"
"path/filepath"
"testing" "testing"
) )
func TestSomething(t *testing.T) { func TestIdentifyNonMime(t *testing.T) {
// Open test email for parsing msg := readMessage("non-mime.raw")
raw, err := os.Open("../../test-data/html-mime-attach.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 { 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, "<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 // Parse email into a mail.Message object like we do
reader := bufio.NewReader(raw) reader := bufio.NewReader(raw)
msg, err := mail.ReadMessage(reader) msg, err := mail.ReadMessage(reader)
if err != nil { if err != nil {
t.Fatalf("Failed to read message: %v", err) panic(fmt.Sprintf("Failed to read message: %v", err))
} }
_, err = ParseMIMEMessage(msg) return msg
if err != nil {
t.Fatalf("Failed to parse mime: %v", err)
}
} }

8
test-data/non-mime.raw Normal file
View File

@@ -0,0 +1,8 @@
Date: Sun, 14 Oct 2012 16:09:01 -0700
To: greg@inbucket.com
From: James Hillyerd <james@hillyerd.com>
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