package asset import ( "bytes" "io" "testing" "github.com/mediocregopher/blog.mediocregopher.com/srv/post" "github.com/stretchr/testify/assert" ) type testHarness struct { store Store } func newTestHarness(t *testing.T) *testHarness { db := post.NewInMemSQLDB() t.Cleanup(func() { db.Close() }) store := NewStore(db) return &testHarness{ store: store, } } func (h *testHarness) assertGet(t *testing.T, exp, id string) { t.Helper() buf := new(bytes.Buffer) err := h.store.Get(id, buf) assert.NoError(t, err) assert.Equal(t, exp, buf.String()) } func (h *testHarness) assertNotFound(t *testing.T, id string) { t.Helper() err := h.store.Get(id, io.Discard) assert.ErrorIs(t, ErrNotFound, err) } func TestStore(t *testing.T) { testStore := func(t *testing.T, h *testHarness) { t.Helper() h.assertNotFound(t, "foo") h.assertNotFound(t, "bar") err := h.store.Set("foo", bytes.NewBufferString("FOO")) assert.NoError(t, err) h.assertGet(t, "FOO", "foo") h.assertNotFound(t, "bar") err = h.store.Set("foo", bytes.NewBufferString("FOOFOO")) assert.NoError(t, err) h.assertGet(t, "FOOFOO", "foo") h.assertNotFound(t, "bar") assert.NoError(t, h.store.Delete("foo")) h.assertNotFound(t, "foo") h.assertNotFound(t, "bar") assert.NoError(t, h.store.Delete("bar")) h.assertNotFound(t, "foo") h.assertNotFound(t, "bar") // test list ids, err := h.store.List() assert.NoError(t, err) assert.Empty(t, ids) err = h.store.Set("foo", bytes.NewBufferString("FOOFOO")) assert.NoError(t, err) err = h.store.Set("foo", bytes.NewBufferString("FOOFOO")) assert.NoError(t, err) err = h.store.Set("bar", bytes.NewBufferString("FOOFOO")) assert.NoError(t, err) ids, err = h.store.List() assert.NoError(t, err) assert.Equal(t, []string{"bar", "foo"}, ids) } t.Run("sql", func(t *testing.T) { h := newTestHarness(t) testStore(t, h) }) }