From 137466f89b4cc6f0cac1d46ec9b80946f5117ca2 Mon Sep 17 00:00:00 2001 From: James Hillyerd Date: Sun, 11 Mar 2018 10:48:50 -0700 Subject: [PATCH] storage: Move NewMessage() into Store interface for #69 --- pkg/server/smtp/handler.go | 2 +- pkg/server/smtp/handler_test.go | 4 ++-- pkg/storage/file/fstore.go | 9 +++++++++ pkg/storage/file/fstore_test.go | 6 +----- pkg/storage/storage.go | 3 ++- pkg/storage/testing.go | 6 ++++++ pkg/test/storage.go | 5 +++++ 7 files changed, 26 insertions(+), 9 deletions(-) diff --git a/pkg/server/smtp/handler.go b/pkg/server/smtp/handler.go index 3b0660d..228718a 100644 --- a/pkg/server/smtp/handler.go +++ b/pkg/server/smtp/handler.go @@ -451,7 +451,7 @@ func (ss *Session) dataHandler() { // deliverMessage creates and populates a new Message for the specified recipient func (ss *Session) deliverMessage(r recipientDetails, msgBuf [][]byte) (ok bool) { - msg, err := r.mailbox.NewMessage() + msg, err := ss.server.dataStore.NewMessage(r.localPart) if err != nil { ss.logError("Failed to create message for %q: %s", r.localPart, err) return false diff --git a/pkg/server/smtp/handler_test.go b/pkg/server/smtp/handler_test.go index b53b651..b8603a5 100644 --- a/pkg/server/smtp/handler_test.go +++ b/pkg/server/smtp/handler_test.go @@ -148,7 +148,7 @@ func TestMailState(t *testing.T) { mb1 := &storage.MockMailbox{} msg1 := &storage.MockMessage{} mds.On("MailboxFor", "u1").Return(mb1, nil) - mb1.On("NewMessage").Return(msg1, nil) + mds.On("NewMessage", "u1").Return(msg1, nil) mb1.On("Name").Return("u1") msg1.On("ID").Return("") msg1.On("From").Return("") @@ -263,7 +263,7 @@ func TestDataState(t *testing.T) { mb1 := &storage.MockMailbox{} msg1 := &storage.MockMessage{} mds.On("MailboxFor", "u1").Return(mb1, nil) - mb1.On("NewMessage").Return(msg1, nil) + mds.On("NewMessage", "u1").Return(msg1, nil) mb1.On("Name").Return("u1") msg1.On("ID").Return("") msg1.On("From").Return("") diff --git a/pkg/storage/file/fstore.go b/pkg/storage/file/fstore.go index ddf6d1c..b3a2e5e 100644 --- a/pkg/storage/file/fstore.go +++ b/pkg/storage/file/fstore.go @@ -175,6 +175,15 @@ func (fs *Store) LockFor(emailAddress string) (*sync.RWMutex, error) { return fs.hashLock.Get(hash), nil } +// NewMessage is temproary until #69 MessageData refactor +func (fs *Store) NewMessage(mailbox string) (storage.Message, error) { + mb, err := fs.MailboxFor(mailbox) + if err != nil { + return nil, err + } + return mb.(*Mailbox).NewMessage() +} + // Mailbox implements Mailbox, manages the mail for a specific user and // correlates to a particular directory on disk. type Mailbox struct { diff --git a/pkg/storage/file/fstore_test.go b/pkg/storage/file/fstore_test.go index 8247de9..a7bb039 100644 --- a/pkg/storage/file/fstore_test.go +++ b/pkg/storage/file/fstore_test.go @@ -490,13 +490,9 @@ func deliverMessage(ds *Store, mbName string, subject string, testMsg = append(testMsg, []byte("\r\n")...) testMsg = append(testMsg, []byte("Test Body\r\n")...) - mb, err := ds.MailboxFor(mbName) - if err != nil { - panic(err) - } // Create message object id = generateID(date) - msg, err := mb.NewMessage() + msg, err := ds.NewMessage(mbName) if err != nil { panic(err) } diff --git a/pkg/storage/storage.go b/pkg/storage/storage.go index b18bf33..54adb58 100644 --- a/pkg/storage/storage.go +++ b/pkg/storage/storage.go @@ -28,12 +28,13 @@ type Store interface { MailboxFor(emailAddress string) (Mailbox, error) // LockFor is a temporary hack to fix #77 until Datastore revamp LockFor(emailAddress string) (*sync.RWMutex, error) + // NewMessage is temproary until #69 MessageData refactor + NewMessage(mailbox string) (Message, error) } // Mailbox is an interface to get and manipulate messages in a DataStore type Mailbox interface { GetMessages() ([]Message, error) - NewMessage() (Message, error) String() string } diff --git a/pkg/storage/testing.go b/pkg/storage/testing.go index 64d7bf0..8757230 100644 --- a/pkg/storage/testing.go +++ b/pkg/storage/testing.go @@ -44,6 +44,12 @@ func (m *MockDataStore) LockFor(name string) (*sync.RWMutex, error) { return &sync.RWMutex{}, nil } +// NewMessage temporary for #69 +func (m *MockDataStore) NewMessage(mailbox string) (Message, error) { + args := m.Called(mailbox) + return args.Get(0).(Message), args.Error(1) +} + // VisitMailboxes accepts a function that will be called with the messages in each mailbox while it // continues to return true. func (m *MockDataStore) VisitMailboxes(f func([]Message) (cont bool)) error { diff --git a/pkg/test/storage.go b/pkg/test/storage.go index 3f0fcbd..fab78ca 100644 --- a/pkg/test/storage.go +++ b/pkg/test/storage.go @@ -56,3 +56,8 @@ func (s *StoreStub) VisitMailboxes(f func([]storage.Message) (cont bool)) error } return nil } + +// NewMessage is temproary until #69 MessageData refactor +func (s *StoreStub) NewMessage(mailbox string) (storage.Message, error) { + return nil, nil +}