Blame internal/jsondb/db_test.go

Packit Service 4d2de5
package jsondb_test
Packit Service 4d2de5
Packit Service 4d2de5
import (
Packit Service 4d2de5
	"io/ioutil"
Packit Service 4d2de5
	"os"
Packit Service 4d2de5
	"path"
Packit Service 4d2de5
	"testing"
Packit Service 4d2de5
Packit Service 4d2de5
	"github.com/stretchr/testify/assert"
Packit Service 4d2de5
	"github.com/stretchr/testify/require"
Packit Service 4d2de5
Packit Service 4d2de5
	"github.com/osbuild/osbuild-composer/internal/jsondb"
Packit Service 4d2de5
)
Packit Service 4d2de5
Packit Service 4d2de5
type document struct {
Packit Service 4d2de5
	Animal  string `json:"animal"`
Packit Service 4d2de5
	CanSwim bool   `json:"can-swim"`
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func cleanupTempDir(t *testing.T, dir string) {
Packit Service 4d2de5
	err := os.RemoveAll(dir)
Packit Service 4d2de5
	require.NoError(t, err)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
// If the passed directory is not readable (writable), we should notice on the
Packit Service 4d2de5
// first read (write).
Packit Service 4d2de5
func TestDegenerate(t *testing.T) {
Packit Service 4d2de5
	t.Run("no-exist", func(t *testing.T) {
Packit Service 4d2de5
		db := jsondb.New("/non-existant-directory", 0755)
Packit Service 4d2de5
Packit Service 4d2de5
		var d document
Packit Service 4d2de5
		exist, err := db.Read("one", &d)
Packit Service 4d2de5
		assert.False(t, exist)
Packit Service 4d2de5
		assert.NoError(t, err)
Packit Service 4d2de5
Packit Service 4d2de5
		err = db.Write("one", &d)
Packit Service 4d2de5
		assert.Error(t, err)
Packit Service 4d2de5
Packit Service 4d2de5
		l, err := db.List()
Packit Service 4d2de5
		assert.Error(t, err)
Packit Service 4d2de5
		assert.Nil(t, l)
Packit Service 4d2de5
	})
Packit Service 4d2de5
Packit Service 4d2de5
	t.Run("invalid-json", func(t *testing.T) {
Packit Service 4d2de5
		dir, err := ioutil.TempDir("", "jsondb-test-")
Packit Service 4d2de5
		require.NoError(t, err)
Packit Service 4d2de5
		defer cleanupTempDir(t, dir)
Packit Service 4d2de5
Packit Service 4d2de5
		db := jsondb.New(dir, 0755)
Packit Service 4d2de5
Packit Service 4d2de5
		// write-only file
Packit Service 4d2de5
		err = ioutil.WriteFile(path.Join(dir, "one.json"), []byte("{"), 0644)
Packit Service 4d2de5
		require.NoError(t, err)
Packit Service 4d2de5
Packit Service 4d2de5
		var d document
Packit Service 4d2de5
		_, err = db.Read("one", &d)
Packit Service 4d2de5
		assert.Error(t, err)
Packit Service 4d2de5
	})
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func TestCorrupt(t *testing.T) {
Packit Service 4d2de5
	dir, err := ioutil.TempDir("", "jsondb-test-")
Packit Service 4d2de5
	require.NoError(t, err)
Packit Service 4d2de5
	defer cleanupTempDir(t, dir)
Packit Service 4d2de5
Packit Service 4d2de5
	err = ioutil.WriteFile(path.Join(dir, "one.json"), []byte("{"), 0755)
Packit Service 4d2de5
	require.NoError(t, err)
Packit Service 4d2de5
Packit Service 4d2de5
	db := jsondb.New(dir, 0755)
Packit Service 4d2de5
	var d document
Packit Service 4d2de5
	_, err = db.Read("one", &d)
Packit Service 4d2de5
	require.Error(t, err)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func TestRead(t *testing.T) {
Packit Service 4d2de5
	dir, err := ioutil.TempDir("", "jsondb-test-")
Packit Service 4d2de5
	require.NoError(t, err)
Packit Service 4d2de5
	defer cleanupTempDir(t, dir)
Packit Service 4d2de5
Packit Service 4d2de5
	err = ioutil.WriteFile(path.Join(dir, "one.json"), []byte("true"), 0755)
Packit Service 4d2de5
	require.NoError(t, err)
Packit Service 4d2de5
Packit Service 4d2de5
	db := jsondb.New(dir, 0755)
Packit Service 4d2de5
Packit Service 4d2de5
	var b bool
Packit Service 4d2de5
	exists, err := db.Read("one", &b)
Packit Service 4d2de5
	require.NoError(t, err)
Packit Service 4d2de5
	require.True(t, exists)
Packit Service 4d2de5
	require.True(t, b)
Packit Service 4d2de5
Packit Service 4d2de5
	// nil means don't deserialize
Packit Service 4d2de5
	exists, err = db.Read("one", nil)
Packit Service 4d2de5
	require.NoError(t, err)
Packit Service 4d2de5
	require.True(t, exists)
Packit Service 4d2de5
Packit Service 4d2de5
	b = false
Packit Service 4d2de5
	exists, err = db.Read("two", &b)
Packit Service 4d2de5
	require.NoError(t, err)
Packit Service 4d2de5
	require.False(t, exists)
Packit Service 4d2de5
	require.False(t, b)
Packit Service 4d2de5
Packit Service 4d2de5
	// nil means don't deserialize
Packit Service 4d2de5
	exists, err = db.Read("two", nil)
Packit Service 4d2de5
	require.NoError(t, err)
Packit Service 4d2de5
	require.False(t, exists)
Packit Service 4d2de5
}
Packit Service 4d2de5
Packit Service 4d2de5
func TestMultiple(t *testing.T) {
Packit Service 4d2de5
	dir, err := ioutil.TempDir("", "jsondb-test-")
Packit Service 4d2de5
	require.NoError(t, err)
Packit Service 4d2de5
	defer cleanupTempDir(t, dir)
Packit Service 4d2de5
Packit Service 4d2de5
	perm := os.FileMode(0600)
Packit Service 4d2de5
	documents := map[string]document{
Packit Service 4d2de5
		"one":   document{"octopus", true},
Packit Service 4d2de5
		"two":   document{"zebra", false},
Packit Service 4d2de5
		"three": document{"clownfish", true},
Packit Service 4d2de5
	}
Packit Service 4d2de5
Packit Service 4d2de5
	db := jsondb.New(dir, perm)
Packit Service 4d2de5
Packit Service 4d2de5
	for name, doc := range documents {
Packit Service 4d2de5
		err = db.Write(name, doc)
Packit Service 4d2de5
		require.NoError(t, err)
Packit Service 4d2de5
	}
Packit Service 4d2de5
	names, err := db.List()
Packit Service 4d2de5
	require.NoError(t, err)
Packit Service 4d2de5
	require.ElementsMatch(t, []string{"one", "two", "three"}, names)
Packit Service 4d2de5
Packit Service 4d2de5
	for name, doc := range documents {
Packit Service 4d2de5
		var d document
Packit Service 4d2de5
		exist, err := db.Read(name, &d)
Packit Service 4d2de5
		require.NoError(t, err)
Packit Service 4d2de5
		require.True(t, exist)
Packit Service 4d2de5
		require.Equalf(t, doc, d, "error retrieving document '%s'", name)
Packit Service 4d2de5
	}
Packit Service 4d2de5
}