From 6bec0e3964f03f776841cec5e639784222a33958 Mon Sep 17 00:00:00 2001 From: Brian Picciano Date: Sat, 31 Jul 2021 16:45:49 -0600 Subject: begin work on mailing list server, got the fundamental components done --- srv/mailinglist/store_test.go | 102 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 srv/mailinglist/store_test.go (limited to 'srv/mailinglist/store_test.go') diff --git a/srv/mailinglist/store_test.go b/srv/mailinglist/store_test.go new file mode 100644 index 0000000..25eb150 --- /dev/null +++ b/srv/mailinglist/store_test.go @@ -0,0 +1,102 @@ +package mailinglist + +import ( + "io" + "io/ioutil" + "os" + "testing" + "time" + + "github.com/stretchr/testify/assert" +) + +func TestStore(t *testing.T) { + tmpFile, err := ioutil.TempFile(os.TempDir(), "mediocre-blog-mailinglist-store-test-") + if err != nil { + t.Fatal("Cannot create temporary file", err) + } + tmpFilePath := tmpFile.Name() + tmpFile.Close() + + t.Logf("using temporary sqlite file at %q", tmpFilePath) + + t.Cleanup(func() { + if err := os.Remove(tmpFilePath); err != nil { + panic(err) + } + }) + + store, err := NewStore(tmpFilePath) + assert.NoError(t, err) + + t.Cleanup(func() { + assert.NoError(t, store.Close()) + }) + + now := func() time.Time { + return time.Now().Truncate(time.Second) + } + + assertGet := func(t *testing.T, email Email) { + t.Helper() + + gotEmail, err := store.Get(email.Email) + assert.NoError(t, err) + assert.Equal(t, email, gotEmail) + + gotEmail, err = store.GetBySubToken(email.SubToken) + assert.NoError(t, err) + assert.Equal(t, email, gotEmail) + + if email.UnsubToken != "" { + gotEmail, err = store.GetByUnsubToken(email.UnsubToken) + assert.NoError(t, err) + assert.Equal(t, email, gotEmail) + } + } + + assertNotFound := func(t *testing.T, email string) { + t.Helper() + _, err := store.Get(email) + assert.ErrorIs(t, err, ErrNotFound) + } + + // now start actual tests + + // GetAll should not do anything, there's no data + _, err = store.GetAll()() + assert.ErrorIs(t, err, io.EOF) + + emailFoo := Email{ + Email: "foo", + SubToken: "subTokenFoo", + CreatedAt: now(), + } + + // email isn't stored yet, shouldn't exist + assertNotFound(t, emailFoo.Email) + + // Set an email, now it should exist + assert.NoError(t, store.Set(emailFoo)) + assertGet(t, emailFoo) + + // Update the email with an unsub token + emailFoo.UnsubToken = "unsubTokenFoo" + emailFoo.VerifiedAt = now() + assert.NoError(t, store.Set(emailFoo)) + assertGet(t, emailFoo) + + // GetAll should now only return that email + iter := store.GetAll() + gotEmail, err := iter() + assert.NoError(t, err) + assert.Equal(t, emailFoo, gotEmail) + _, err = iter() + assert.ErrorIs(t, err, io.EOF) + + // Delete the email, it should be gone + assert.NoError(t, store.Delete(emailFoo.Email)) + assertNotFound(t, emailFoo.Email) + _, err = store.GetAll()() + assert.ErrorIs(t, err, io.EOF) +} -- cgit v1.2.3