From 2b7adb32003ec4868ac9ba4301b543bcacbf7635 Mon Sep 17 00:00:00 2001 From: Lars Karlitski Date: Wed, 8 Apr 2020 22:26:02 +0200 Subject: [PATCH] jsondb: add List method And add some additional tests. --- internal/jsondb/db.go | 22 ++++++++++++++ internal/jsondb/db_test.go | 61 ++++++++++++++++++++++++-------------- 2 files changed, 60 insertions(+), 23 deletions(-) diff --git a/internal/jsondb/db.go b/internal/jsondb/db.go index 796bdb39c..6551f4ed1 100644 --- a/internal/jsondb/db.go +++ b/internal/jsondb/db.go @@ -22,6 +22,7 @@ import ( "os" "path" "path/filepath" + "strings" ) type JSONDatabase struct { @@ -55,6 +56,27 @@ func (db *JSONDatabase) Read(name string, document interface{}) (bool, error) { return true, nil } +// Returns a list of all documents' names. +func (db *JSONDatabase) List() ([]string, error) { + f, err := os.Open(db.dir) + if err != nil { + return nil, err + } + defer f.Close() + + infos, err := f.Readdir(-1) + if err != nil { + return nil, err + } + + names := make([]string, len(infos)) + for i, info := range infos { + names[i] = strings.TrimSuffix(info.Name(), ".json") + } + + return names, nil +} + // Writes `document` to `name`, overwriting a previous document if it exists. // `document` must be serializable to JSON. func (db *JSONDatabase) Write(name string, document interface{}) error { diff --git a/internal/jsondb/db_test.go b/internal/jsondb/db_test.go index 0ef666d82..70dbbd0bc 100644 --- a/internal/jsondb/db_test.go +++ b/internal/jsondb/db_test.go @@ -17,34 +17,56 @@ type document struct { CanSwim bool `json:"can-swim"` } +func cleanupTempDir(t *testing.T, dir string) { + err := os.RemoveAll(dir) + require.NoError(t, err) +} + // If the passed directory is not readable (writable), we should notice on the // first read (write). func TestDegenerate(t *testing.T) { - db := jsondb.New("/non-existant-directory", 0755) + t.Run("no-exist", func(t *testing.T) { + db := jsondb.New("/non-existant-directory", 0755) - var d document - exist, err := db.Read("one", &d) - assert.False(t, exist) - assert.NoError(t, err) + var d document + exist, err := db.Read("one", &d) + assert.False(t, exist) + assert.NoError(t, err) - err = db.Write("one", &d) - assert.Error(t, err) + err = db.Write("one", &d) + assert.Error(t, err) + + l, err := db.List() + assert.Error(t, err) + assert.Nil(t, l) + }) + + t.Run("invalid-json", func(t *testing.T) { + dir, err := ioutil.TempDir("", "jsondb-test-") + require.NoError(t, err) + defer cleanupTempDir(t, dir) + + db := jsondb.New(dir, 0755) + + // write-only file + err = ioutil.WriteFile(path.Join(dir, "one.json"), []byte("{"), 0644) + require.NoError(t, err) + + var d document + _, err = db.Read("one", &d) + assert.Error(t, err) + }) } func TestCorrupt(t *testing.T) { dir, err := ioutil.TempDir("", "jsondb-test-") require.NoError(t, err) - - defer func() { - err := os.RemoveAll(dir) - require.NoError(t, err) - }() + defer cleanupTempDir(t, dir) err = ioutil.WriteFile(path.Join(dir, "one.json"), []byte("{"), 0755) require.NoError(t, err) db := jsondb.New(dir, 0755) - var d document _, err = db.Read("one", &d) require.Error(t, err) @@ -53,11 +75,7 @@ func TestCorrupt(t *testing.T) { func TestMultiple(t *testing.T) { dir, err := ioutil.TempDir("", "jsondb-test-") require.NoError(t, err) - - defer func() { - err := os.RemoveAll(dir) - require.NoError(t, err) - }() + defer cleanupTempDir(t, dir) perm := os.FileMode(0600) documents := map[string]document{ @@ -72,12 +90,9 @@ func TestMultiple(t *testing.T) { err = db.Write(name, doc) require.NoError(t, err) } - infos, err := ioutil.ReadDir(dir) + names, err := db.List() require.NoError(t, err) - require.Equal(t, len(infos), len(documents)) - for _, info := range infos { - require.Equal(t, perm, info.Mode()) - } + require.ElementsMatch(t, []string{"one", "two", "three"}, names) for name, doc := range documents { var d document