mirror of
https://github.com/jhillyerd/inbucket.git
synced 2025-12-18 01:57:02 +00:00
Handle missing .raw better, closes #19
- Add filestore unit tests to exercise #19 - Move deferred file close under error check - Handle error message from server gracefully on message click - Scroll to top of page when message loads successfully
This commit is contained in:
@@ -330,10 +330,10 @@ func (m *FileMessage) rawPath() string {
|
|||||||
// ReadHeader opens the .raw portion of a Message and returns a standard Go mail.Message object
|
// ReadHeader opens the .raw portion of a Message and returns a standard Go mail.Message object
|
||||||
func (m *FileMessage) ReadHeader() (msg *mail.Message, err error) {
|
func (m *FileMessage) ReadHeader() (msg *mail.Message, err error) {
|
||||||
file, err := os.Open(m.rawPath())
|
file, err := os.Open(m.rawPath())
|
||||||
defer file.Close()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
defer file.Close()
|
||||||
reader := bufio.NewReader(file)
|
reader := bufio.NewReader(file)
|
||||||
msg, err = mail.ReadMessage(reader)
|
msg, err = mail.ReadMessage(reader)
|
||||||
return msg, err
|
return msg, err
|
||||||
|
|||||||
@@ -334,6 +334,48 @@ func TestFSSize(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test missing files
|
||||||
|
func TestFSMissing(t *testing.T) {
|
||||||
|
ds, logbuf := setupDataStore()
|
||||||
|
defer teardownDataStore(ds)
|
||||||
|
|
||||||
|
mbName := "fred"
|
||||||
|
subjects := []string{"a", "b", "c"}
|
||||||
|
sentIds := make([]string, len(subjects))
|
||||||
|
|
||||||
|
for i, subj := range subjects {
|
||||||
|
// Add a message
|
||||||
|
id, _ := deliverMessage(ds, mbName, subj, time.Now())
|
||||||
|
sentIds[i] = id
|
||||||
|
}
|
||||||
|
|
||||||
|
mb, err := ds.MailboxFor(mbName)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Failed to MailboxFor(%q): %v", mbName, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete a message file without removing it from index
|
||||||
|
msg, err := mb.GetMessage(sentIds[1])
|
||||||
|
assert.Nil(t, err)
|
||||||
|
fmsg := msg.(*FileMessage)
|
||||||
|
os.Remove(fmsg.rawPath())
|
||||||
|
msg, err = mb.GetMessage(sentIds[1])
|
||||||
|
assert.Nil(t, err)
|
||||||
|
|
||||||
|
// Try to read parts of message
|
||||||
|
_, err = msg.ReadHeader()
|
||||||
|
assert.Error(t, err)
|
||||||
|
_, err = msg.ReadBody()
|
||||||
|
assert.Error(t, err)
|
||||||
|
|
||||||
|
if t.Failed() {
|
||||||
|
// Wait for handler to finish logging
|
||||||
|
time.Sleep(2 * time.Second)
|
||||||
|
// Dump buffered log data if there was a failure
|
||||||
|
io.Copy(os.Stderr, logbuf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// setupDataStore creates a new FileDataStore in a temporary directory
|
// setupDataStore creates a new FileDataStore in a temporary directory
|
||||||
func setupDataStore() (*FileDataStore, *bytes.Buffer) {
|
func setupDataStore() (*FileDataStore, *bytes.Buffer) {
|
||||||
path, err := ioutil.TempDir("", "inbucket")
|
path, err := ioutil.TempDir("", "inbucket")
|
||||||
|
|||||||
@@ -4,6 +4,14 @@
|
|||||||
{{define "script"}}
|
{{define "script"}}
|
||||||
<script>
|
<script>
|
||||||
var selected = "{{.selected}}"
|
var selected = "{{.selected}}"
|
||||||
|
function messageLoaded(responseText, textStatus, XMLHttpRequest) {
|
||||||
|
if (textStatus == "error") {
|
||||||
|
alert("Failed to load message, server said:\n" + responseText)
|
||||||
|
} else {
|
||||||
|
window.scrollTo(0,0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function listLoaded() {
|
function listLoaded() {
|
||||||
$('.listEntry').hover(
|
$('.listEntry').hover(
|
||||||
function() {
|
function() {
|
||||||
@@ -16,7 +24,7 @@
|
|||||||
function() {
|
function() {
|
||||||
$('.listEntry').removeClass("listEntrySelected")
|
$('.listEntry').removeClass("listEntrySelected")
|
||||||
$(this).addClass("listEntrySelected")
|
$(this).addClass("listEntrySelected")
|
||||||
$('#emailContent').load('/mailbox/{{.name}}/' + this.id)
|
$('#emailContent').load('/mailbox/{{.name}}/' + this.id, messageLoaded)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
$("#messageList").slideDown()
|
$("#messageList").slideDown()
|
||||||
|
|||||||
Reference in New Issue
Block a user