Files
bolthold/delete_test.go
2020-08-12 09:46:48 -05:00

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)
}
}
})
}