mirror of
https://github.com/timshannon/bolthold.git
synced 2025-12-24 13:37:58 +08:00
201 lines
4.7 KiB
Go
201 lines
4.7 KiB
Go
// Copyright 2016 Tim Shannon. All rights reserved.
|
|
// Use of this source code is governed by the MIT license
|
|
// that can be found in the LICENSE file.
|
|
|
|
package bolthold_test
|
|
|
|
import (
|
|
"errors"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/timshannon/bolthold"
|
|
bh "github.com/timshannon/bolthold"
|
|
bolt "go.etcd.io/bbolt"
|
|
)
|
|
|
|
func TestDelete(t *testing.T) {
|
|
testWrap(t, func(store *bolthold.Store, t *testing.T) {
|
|
key := "testKey"
|
|
data := &ItemTest{
|
|
Name: "Test Name",
|
|
Created: time.Now(),
|
|
}
|
|
|
|
err := store.Insert(key, data)
|
|
if err != nil {
|
|
t.Fatalf("Error inserting data for delete test: %s", err)
|
|
}
|
|
|
|
result := &ItemTest{}
|
|
|
|
err = store.Delete(key, result)
|
|
if err != nil {
|
|
t.Fatalf("Error deleting data from bolthold: %s", err)
|
|
}
|
|
|
|
err = store.Get(key, result)
|
|
if err != bolthold.ErrNotFound {
|
|
t.Fatalf("Data was not deleted from bolthold")
|
|
}
|
|
|
|
})
|
|
}
|
|
|
|
func TestDeleteMatching(t *testing.T) {
|
|
for _, tst := range testResults {
|
|
t.Run(tst.name, func(t *testing.T) {
|
|
testWrap(t, func(store *bolthold.Store, t *testing.T) {
|
|
|
|
insertTestData(t, store)
|
|
|
|
err := store.DeleteMatching(&ItemTest{}, tst.query)
|
|
if err != nil {
|
|
t.Fatalf("Error deleting data from bolthold: %s", err)
|
|
}
|
|
|
|
var result []ItemTest
|
|
err = store.Find(&result, nil)
|
|
if err != nil {
|
|
t.Fatalf("Error finding result after delete from bolthold: %s", err)
|
|
}
|
|
|
|
if len(result) != (len(testData) - len(tst.result)) {
|
|
if testing.Verbose() {
|
|
t.Fatalf("Delete result count is %d wanted %d. Results: %v", len(result),
|
|
(len(testData) - len(tst.result)), result)
|
|
}
|
|
t.Fatalf("Delete result count is %d wanted %d.", len(result),
|
|
(len(testData) - len(tst.result)))
|
|
|
|
}
|
|
|
|
for i := range result {
|
|
found := false
|
|
for k := range tst.result {
|
|
if result[i].equal(&testData[tst.result[k]]) {
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
|
|
if found {
|
|
if testing.Verbose() {
|
|
t.Fatalf("Found %v in the result set when it should've been deleted! Full results: %v", result[i], result)
|
|
}
|
|
t.Fatalf("Found %v in the result set when it should've been deleted!", result[i])
|
|
}
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestDeleteOnUnknownType(t *testing.T) {
|
|
testWrap(t, func(store *bolthold.Store, t *testing.T) {
|
|
insertTestData(t, store)
|
|
var x BadType
|
|
err := store.DeleteMatching(x, bolthold.Where("BadName").Eq("blah"))
|
|
if err != nil {
|
|
t.Fatalf("Error finding data from bolthold: %s", err)
|
|
}
|
|
|
|
var result []ItemTest
|
|
err = store.Find(&result, nil)
|
|
if err != nil {
|
|
t.Fatalf("Error finding result after delete from bolthold: %s", err)
|
|
}
|
|
|
|
if len(result) != len(testData) {
|
|
t.Fatalf("Find result count after delete is %d wanted %d.", len(result), len(testData))
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestDeleteWithNilValue(t *testing.T) {
|
|
testWrap(t, func(store *bolthold.Store, t *testing.T) {
|
|
insertTestData(t, store)
|
|
|
|
var result ItemTest
|
|
err := store.DeleteMatching(&result, bolthold.Where("Name").Eq(nil))
|
|
if err == nil {
|
|
t.Fatalf("Comparing with nil did NOT return an error!")
|
|
}
|
|
|
|
if _, ok := err.(*bolthold.ErrTypeMismatch); !ok {
|
|
t.Fatalf("Comparing with nil did NOT return the correct error. Got %v", err)
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestDeleteReadTxn(t *testing.T) {
|
|
testWrap(t, func(store *bolthold.Store, t *testing.T) {
|
|
key := "testKey"
|
|
data := &ItemTest{
|
|
Name: "Test Name",
|
|
Created: time.Now(),
|
|
}
|
|
|
|
err := store.Bolt().View(func(tx *bolt.Tx) error {
|
|
return store.TxDelete(tx, key, data)
|
|
})
|
|
|
|
if err == nil {
|
|
t.Fatalf("Deleting from a read only transaction didn't fail!")
|
|
}
|
|
|
|
err = store.Bolt().Update(func(tx *bolt.Tx) error {
|
|
err = store.TxInsert(tx, key, data)
|
|
if err != nil {
|
|
t.Fatalf("Inserting into a writable transaction failed: %s", err)
|
|
}
|
|
return store.TxDelete(tx, key, data)
|
|
})
|
|
|
|
if err != nil {
|
|
t.Fatalf("Deleting from a writable transaction failed: %s", err)
|
|
}
|
|
})
|
|
}
|
|
|
|
func TestDeleteNotFound(t *testing.T) {
|
|
testWrap(t, func(store *bolthold.Store, t *testing.T) {
|
|
key := "testKey"
|
|
data := &ItemTest{
|
|
Name: "Test Name",
|
|
Created: time.Now(),
|
|
}
|
|
|
|
err := store.Delete(key, data)
|
|
|
|
if err == nil {
|
|
t.Fatalf("Deleting with an unfound key did not return an error")
|
|
}
|
|
|
|
if err != bolthold.ErrNotFound {
|
|
t.Fatalf("Deleting with an unfound key did not return the correct error. Wanted %s, got %s",
|
|
bolthold.ErrNotFound, err)
|
|
}
|
|
|
|
})
|
|
}
|
|
|
|
func TestDeleteEOFIssue116(t *testing.T) {
|
|
testWrap(t, func(store *bolthold.Store, t *testing.T) {
|
|
type Item struct{ Name string }
|
|
|
|
ok(t, store.Insert("key", &Item{"Name"}))
|
|
|
|
empty := &Item{}
|
|
|
|
for i := 1; i < 5; i++ {
|
|
err := store.Delete("key", empty)
|
|
if err != nil && !errors.Is(err, bh.ErrNotFound) {
|
|
t.Fatalf("unexpected error after delete #%d: %v", i, err)
|
|
}
|
|
}
|
|
})
|
|
}
|