route/vendor/github.com/asdine/storm/kv_test.go

150 lines
3.3 KiB
Go

package storm
import (
"net/mail"
"testing"
"time"
"github.com/asdine/storm/codec/gob"
"github.com/asdine/storm/codec/json"
"github.com/boltdb/bolt"
"github.com/stretchr/testify/require"
)
func TestGet(t *testing.T) {
db, cleanup := createDB(t)
defer cleanup()
err := db.Set("trash", 10, 100)
require.NoError(t, err)
var nb int
err = db.Get("trash", 10, &nb)
require.NoError(t, err)
require.Equal(t, 100, nb)
tm := time.Now()
err = db.Set("logs", tm, "I'm hungry")
require.NoError(t, err)
var message string
err = db.Get("logs", tm, &message)
require.NoError(t, err)
require.Equal(t, "I'm hungry", message)
var hand int
err = db.Get("wallet", "100 bucks", &hand)
require.Equal(t, ErrNotFound, err)
err = db.Set("wallet", "10 bucks", 10)
require.NoError(t, err)
err = db.Get("wallet", "100 bucks", &hand)
require.Equal(t, ErrNotFound, err)
err = db.Get("logs", tm, nil)
require.Equal(t, ErrPtrNeeded, err)
err = db.Get("", nil, nil)
require.Equal(t, ErrPtrNeeded, err)
err = db.Get("", "100 bucks", &hand)
require.Equal(t, ErrNotFound, err)
}
func TestGetBytes(t *testing.T) {
db, cleanup := createDB(t)
defer cleanup()
err := db.SetBytes("trash", "a", []byte("hi"))
require.NoError(t, err)
val, err := db.GetBytes("trash", "a")
require.NoError(t, err)
require.Equal(t, []byte("hi"), val)
_, err = db.GetBytes("trash", "b")
require.Equal(t, ErrNotFound, err)
}
func TestSet(t *testing.T) {
db, cleanup := createDB(t)
defer cleanup()
err := db.Set("b1", 10, 10)
require.NoError(t, err)
err = db.Set("b1", "best friend's mail", &mail.Address{Name: "Gandalf", Address: "gandalf@lorien.ma"})
require.NoError(t, err)
err = db.Set("b2", []byte("i'm already a slice of bytes"), "a value")
require.NoError(t, err)
err = db.Set("b2", []byte("i'm already a slice of bytes"), nil)
require.NoError(t, err)
err = db.Set("b1", 0, 100)
require.NoError(t, err)
err = db.Set("b1", nil, 100)
require.Error(t, err)
db.Bolt.View(func(tx *bolt.Tx) error {
b1 := tx.Bucket([]byte("b1"))
require.NotNil(t, b1)
b2 := tx.Bucket([]byte("b2"))
require.NotNil(t, b2)
k1, err := toBytes(10, json.Codec)
require.NoError(t, err)
val := b1.Get(k1)
require.NotNil(t, val)
k2 := []byte("best friend's mail")
val = b1.Get(k2)
require.NotNil(t, val)
k3, err := toBytes(0, json.Codec)
require.NoError(t, err)
val = b1.Get(k3)
require.NotNil(t, val)
return nil
})
err = db.Set("", 0, 100)
require.Error(t, err)
err = db.Set("b", nil, 100)
require.Error(t, err)
err = db.Set("b", 10, nil)
require.NoError(t, err)
err = db.Set("b", nil, nil)
require.Error(t, err)
}
func TestSetMetadata(t *testing.T) {
db, cleanup := createDB(t, Batch())
defer cleanup()
w := User{ID: 10, Name: "John"}
err := db.Set("User", 10, &w)
require.NoError(t, err)
n := db.WithCodec(gob.Codec)
err = n.Set("User", 10, &w)
require.Equal(t, ErrDifferentCodec, err)
}
func TestDelete(t *testing.T) {
db, cleanup := createDB(t)
defer cleanup()
err := db.Set("files", "myfile.csv", "a,b,c,d")
require.NoError(t, err)
err = db.Delete("files", "myfile.csv")
require.NoError(t, err)
err = db.Delete("files", "myfile.csv")
require.NoError(t, err)
err = db.Delete("i don't exist", "myfile.csv")
require.Equal(t, ErrNotFound, err)
err = db.Delete("", nil)
require.Equal(t, ErrNotFound, err)
}