jsondb: add List method

And add some additional tests.
This commit is contained in:
Lars Karlitski 2020-04-08 22:26:02 +02:00 committed by Tom Gundersen
parent d74a63f4f2
commit 2b7adb3200
2 changed files with 60 additions and 23 deletions

View file

@ -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 {

View file

@ -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