diff --git a/internal/jsondb/db.go b/internal/jsondb/db.go index 09118ed21..ecb80cd50 100644 --- a/internal/jsondb/db.go +++ b/internal/jsondb/db.go @@ -79,6 +79,14 @@ func (db *JSONDatabase) List() ([]string, error) { return names, nil } +// Delete will delete the file from the database +func (db *JSONDatabase) Delete(name string) error { + if len(name) == 0 { + return fmt.Errorf("missing jsondb document name") + } + return os.Remove(filepath.Join(db.dir, name+".json")) +} + // 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 835585787..5090aa0c2 100644 --- a/internal/jsondb/db_test.go +++ b/internal/jsondb/db_test.go @@ -121,3 +121,38 @@ func TestMultiple(t *testing.T) { require.Equalf(t, doc, d, "error retrieving document '%s'", name) } } + +func TestDelete(t *testing.T) { + dir := t.TempDir() + + perm := os.FileMode(0600) + documents := map[string]document{ + "one": document{"octopus", true}, + "two": document{"zebra", false}, + "three": document{"clownfish", true}, + } + + db := jsondb.New(dir, perm) + + for name, doc := range documents { + err := db.Write(name, doc) + require.NoError(t, err) + } + + err := db.Delete("two") + require.Nil(t, err) + + names, err := db.List() + require.NoError(t, err) + require.ElementsMatch(t, []string{"one", "three"}, names) +} + +func TestDeleteError(t *testing.T) { + dir := t.TempDir() + + perm := os.FileMode(0600) + db := jsondb.New(dir, perm) + + err := db.Delete("missing") + require.Error(t, err) +}