tdb/query_test.go

193 lines
5.5 KiB
Go

package tdb
import (
"testing"
// "encoding/ascii85"
// "log"
// "reflect"
// "strconv"
// "git.keganmyers.com/terribleplan/tdb/stringy"
// bolt "go.etcd.io/bbolt"
// "github.com/golang/protobuf/proto"
)
func TestSimpleQuery(t *testing.T) {
setupTestDb()
defer cleanupTestDb()
guarantee := randomString(16)
id := tdb.TEST_Main.CreateOrPanic(&TEST_Main{Guarantee: guarantee})
items, err := tdb.TEST_Main.Query().
Where("Id", "=", id).
Run()
if assertNilEnd(t, err, "Unable to run query") {
return
}
if assertEqualEnd(t, len(items), 1, "Wrong number of results") {
return
}
tmi, ok := items[0].(*TEST_Main)
if assertOkEnd(t, ok, "Unable to cast returned to *TEST_Main") {
return
}
assertEqual(t, tmi.Guarantee, guarantee, "Mismatched guarantee strings")
}
func TestSimpleQueryAmongstMany(t *testing.T) {
setupTestDb()
defer cleanupTestDb()
guarantee := randomString(16)
tdb.TEST_Main.CreateOrPanic(&TEST_Main{})
tdb.TEST_Main.CreateOrPanic(&TEST_Main{})
tdb.TEST_Main.CreateOrPanic(&TEST_Main{})
tdb.TEST_Main.CreateOrPanic(&TEST_Main{})
tdb.TEST_Main.CreateOrPanic(&TEST_Main{})
// id: 6
id := tdb.TEST_Main.CreateOrPanic(&TEST_Main{Guarantee: guarantee})
tdb.TEST_Main.CreateOrPanic(&TEST_Main{})
tdb.TEST_Main.CreateOrPanic(&TEST_Main{})
tdb.TEST_Main.CreateOrPanic(&TEST_Main{})
tdb.TEST_Main.CreateOrPanic(&TEST_Main{})
tdb.TEST_Main.CreateOrPanic(&TEST_Main{})
items, err := tdb.TEST_Main.Query().
Where("Id", "=", id).
Run()
if assertNilEnd(t, err, "Unable to run query") {
return
}
if assertEqualEnd(t, len(items), 1, "Wrong number of results") {
return
}
tmi, ok := items[0].(*TEST_Main)
if assertOkEnd(t, ok, "Unable to cast returned to *TEST_Main") {
return
}
assertEqual(t, tmi.Guarantee, guarantee, "Mismatched guarantee strings")
}
func TestForeignQuery(t *testing.T) {
setupTestDb()
defer cleanupTestDb()
mid1 := tdb.TEST_Main.CreateOrPanic(&TEST_Main{})
mid2 := tdb.TEST_Main.CreateOrPanic(&TEST_Main{})
id1 := tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid2})
id3 := tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1})
q := tdb.TEST_OwnedBy.Query().
Where("MainId", "=", mid1)
items, err := q.Run()
if assertNilEnd(t, err, "Unable to run query") {
return
}
if assertEqualEnd(t, len(items), 2, "Wrong number of results") {
return
}
for _, item := range items {
tmi, ok := item.(*TEST_OwnedBy)
if assertOkEnd(t, ok, "Unable to cast returned item to *TEST_OwnedBy") {
continue
}
assertEqual(t, tmi.MainId, mid1, "Got result with bad MainId")
if tmi.Id != id1 && tmi.Id != id3 {
t.Errorf("Got result with bad Id: got %d, expected %d or %d", tmi.Id, id1, id3)
}
}
qd := q.(*queryData)
assertUint64Equal(t, qd.sr, 2, "Scanned incorrect number of records")
}
func EmptyIndexQuery(t *testing.T) {
setupTestDb()
defer cleanupTestDb()
mid1 := tdb.TEST_Main.CreateOrPanic(&TEST_Main{})
mid2 := tdb.TEST_Main.CreateOrPanic(&TEST_Main{})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid2})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1})
q := tdb.TEST_OwnedBy.Query().
Where("MainId", "=", mid1)
items, err := q.Run()
if assertNilEnd(t, err, "Unable to run query") {
return
}
if assertEqualEnd(t, len(items), 0, "Wrong number of results") {
return
}
qd := q.(*queryData)
assertUint64Equal(t, qd.sr, 0, "Scanned incorrect number of records")
}
func TestComplexQueryAmongstMany(t *testing.T) {
setupTestDb()
defer cleanupTestDb()
guarantee := randomString(16)
mid1 := tdb.TEST_Main.CreateOrPanic(&TEST_Main{})
mid2 := tdb.TEST_Main.CreateOrPanic(&TEST_Main{})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid2})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1})
id := tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid2, Guarantee: guarantee})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid2})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid2})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid2})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid1})
tdb.TEST_OwnedBy.CreateOrPanic(&TEST_OwnedBy{MainId: mid2})
q := tdb.TEST_OwnedBy.Query().
Where("MainId", "=", mid2). // indexed, speeds query
Where("Guarantee", "=", guarantee) // non-indexed, filters during index scan
items, err := q.Run()
if assertNilEnd(t, err, "Unable to run query") {
return
}
if assertEqualEnd(t, len(items), 1, "Wrong number of results") {
return
}
tobi, ok := items[0].(*TEST_OwnedBy)
if assertOkEnd(t, ok, "Unable to cast returned to *TEST_OwnedBy") {
return
}
assertEqual(t, tobi.Id, id, "Mismatched IDs")
assertEqual(t, tobi.Guarantee, guarantee, "Mismatched guarantee strings")
qd := q.(*queryData)
assertUint64Equal(t, qd.sr, 6, "Scanned incorrect number of records")
}