From 41889ee83a2a98cdb443af574e22b2247ba70824 Mon Sep 17 00:00:00 2001 From: James Hillyerd Date: Tue, 21 Nov 2023 14:56:21 -0800 Subject: [PATCH] test: impl StoreStub.PurgeMessages (#444) Signed-off-by: James Hillyerd --- pkg/test/storage.go | 15 +++++++ pkg/test/storage_test.go | 92 ++++++++++++++++++++++++++-------------- 2 files changed, 75 insertions(+), 32 deletions(-) diff --git a/pkg/test/storage.go b/pkg/test/storage.go index fc4df3c..1382fca 100644 --- a/pkg/test/storage.go +++ b/pkg/test/storage.go @@ -92,6 +92,21 @@ func (s *StoreStub) RemoveMessage(mailbox, id string) error { return storage.ErrNotExist } +// PurgeMessages deletes the contents of a mailbox. +func (s *StoreStub) PurgeMessages(mailbox string) error { + for _, removed := range s.mailboxes[mailbox] { + // Clients will be checking for their original storage.Message, not our wrapper. + if stub, ok := removed.(*MessageStub); ok { + s.deleted[stub.Message] = struct{}{} + } else { + return errors.New("unexpected type in StoreStub.mailboxes") + } + } + + s.mailboxes[mailbox] = nil + return nil +} + // VisitMailboxes accepts a function that will be called with the messages in each mailbox while it // continues to return true. func (s *StoreStub) VisitMailboxes(f func([]storage.Message) (cont bool)) error { diff --git a/pkg/test/storage_test.go b/pkg/test/storage_test.go index 454ce86..3f38288 100644 --- a/pkg/test/storage_test.go +++ b/pkg/test/storage_test.go @@ -19,38 +19,6 @@ import ( var testMessageIDSource uint32 -func TestStoreStubRemoveMessage(t *testing.T) { - ss := test.NewStore() - - // Add messages. - inputMsgs := make([]*message.Delivery, 5) - for i := range inputMsgs { - subject := fmt.Sprintf("%s message %v", "box1", i) - inputMsgs[i] = makeTestMessage("box1", subject) - id, err := ss.AddMessage(inputMsgs[i]) - require.NoError(t, err) - require.NotEmpty(t, id, "AddMessage() must return an ID") - } - - // Delete second message. - deleted := inputMsgs[1] - err := ss.RemoveMessage("box1", deleted.ID()) - assert.NoError(t, err, "DeleteMessage must not fail") - - // Verify message is not in mailbox. - messages, err := ss.GetMessages("box1") - assert.NoError(t, err) - assert.NotContains(t, messages, deleted, "Mailbox should not contain msg %q", deleted.ID()) - - // Verify message is no longer retrievable. - got, err := ss.GetMessage("box1", deleted.ID()) - assert.Error(t, err) - assert.Nil(t, got, "Message should have been nil") - - // Verify message is in deleted list. - assert.True(t, ss.MessageDeleted(deleted), "Message %q should be in deleted list", deleted.ID()) -} - func TestStoreStubMailboxAddGetVisit(t *testing.T) { ss := test.NewStore() @@ -166,6 +134,66 @@ func TestStoreStubMarkSeen(t *testing.T) { assert.Equal(t, 1, gotCount, "Incorrect number of seen messages") } +func TestStoreStubRemoveMessage(t *testing.T) { + ss := test.NewStore() + + // Add messages. + inputMsgs := make([]*message.Delivery, 5) + for i := range inputMsgs { + subject := fmt.Sprintf("%s message %v", "box1", i) + inputMsgs[i] = makeTestMessage("box1", subject) + id, err := ss.AddMessage(inputMsgs[i]) + require.NoError(t, err) + require.NotEmpty(t, id, "AddMessage() must return an ID") + } + + // Delete second message. + deleted := inputMsgs[1] + err := ss.RemoveMessage("box1", deleted.ID()) + assert.NoError(t, err, "DeleteMessage must not fail") + + // Verify message is not in mailbox. + messages, err := ss.GetMessages("box1") + assert.NoError(t, err) + assert.NotContains(t, messages, deleted, "Mailbox should not contain msg %q", deleted.ID()) + + // Verify message is no longer retrievable. + got, err := ss.GetMessage("box1", deleted.ID()) + assert.Error(t, err) + assert.Nil(t, got, "Message should have been nil") + + // Verify message is in deleted list. + assert.True(t, ss.MessageDeleted(deleted), "Message %q should be in deleted list", deleted.ID()) +} + +func TestStoreStubPurgeMessages(t *testing.T) { + ss := test.NewStore() + + // Add messages. + inputMsgs := make([]*message.Delivery, 5) + for i := range inputMsgs { + subject := fmt.Sprintf("%s message %v", "box1", i) + inputMsgs[i] = makeTestMessage("box1", subject) + id, err := ss.AddMessage(inputMsgs[i]) + require.NoError(t, err) + require.NotEmpty(t, id, "AddMessage() must return an ID") + } + + // Purge messages. + err := ss.PurgeMessages("box1") + assert.NoError(t, err, "PurgeMessages must not fail") + + // Verify message is not in mailbox. + messages, err := ss.GetMessages("box1") + assert.NoError(t, err) + assert.Len(t, messages, 0, "Mailbox should be empty") + + // Verify messages are in deleted list. + for _, want := range inputMsgs { + assert.True(t, ss.MessageDeleted(want), "Message %q should be in deleted list", want.ID()) + } +} + func TestStoreStubForcedErrors(t *testing.T) { ss := test.NewStore() var err error