influxdb/label/storage_test.go

283 lines
6.9 KiB
Go

package label_test
import (
"context"
"fmt"
"reflect"
"testing"
"github.com/influxdata/influxdb/v2"
"github.com/influxdata/influxdb/v2/inmem"
"github.com/influxdata/influxdb/v2/kit/platform"
"github.com/influxdata/influxdb/v2/kv"
"github.com/influxdata/influxdb/v2/kv/migration/all"
"github.com/influxdata/influxdb/v2/label"
"github.com/influxdata/influxdb/v2/mock"
"go.uber.org/zap/zaptest"
)
func TestLabels(t *testing.T) {
setup := func(t *testing.T, store *label.Store, tx kv.Tx) {
for i := 1; i <= 10; i++ {
mock.SetIDForFunc(&store.IDGenerator, platform.ID(i), func() {
err := store.CreateLabel(context.Background(), tx, &influxdb.Label{
Name: fmt.Sprintf("labelname%d", i),
OrgID: platform.ID(i),
})
if err != nil {
t.Fatal(err)
}
})
}
}
setupForList := func(t *testing.T, store *label.Store, tx kv.Tx) {
setup(t, store, tx)
mock.SetIDForFunc(&store.IDGenerator, platform.ID(11), func() {
err := store.CreateLabel(context.Background(), tx, &influxdb.Label{
Name: fmt.Sprintf("labelname%d", 11),
OrgID: platform.ID(5),
})
if err != nil {
t.Fatal(err)
}
})
}
tt := []struct {
name string
setup func(*testing.T, *label.Store, kv.Tx)
update func(*testing.T, *label.Store, kv.Tx)
results func(*testing.T, *label.Store, kv.Tx)
}{
{
name: "create",
setup: setup,
results: func(t *testing.T, store *label.Store, tx kv.Tx) {
labels, err := store.ListLabels(context.Background(), tx, influxdb.LabelFilter{})
if err != nil {
t.Fatal(err)
}
if len(labels) != 10 {
t.Fatalf("expected 10 labels, got: %d", len(labels))
}
expected := []*influxdb.Label{}
for i := 1; i <= 10; i++ {
expected = append(expected, &influxdb.Label{
ID: platform.ID(i),
Name: fmt.Sprintf("labelname%d", i),
OrgID: platform.ID(i),
})
}
if !reflect.DeepEqual(labels, expected) {
t.Fatalf("expected identical labels: \n%+v\n%+v", labels, expected)
}
},
},
{
name: "get",
setup: setup,
results: func(t *testing.T, store *label.Store, tx kv.Tx) {
label, err := store.GetLabel(context.Background(), tx, platform.ID(1))
if err != nil {
t.Fatal(err)
}
expected := &influxdb.Label{
ID: platform.ID(1),
Name: "labelname1",
OrgID: platform.ID(1),
}
if !reflect.DeepEqual(label, expected) {
t.Fatalf("expected identical label: \n%+v\n%+v", label, expected)
}
},
},
{
name: "list",
setup: setupForList,
results: func(t *testing.T, store *label.Store, tx kv.Tx) {
// list all
labels, err := store.ListLabels(context.Background(), tx, influxdb.LabelFilter{})
if err != nil {
t.Fatal(err)
}
if len(labels) != 11 {
t.Fatalf("expected 11 labels, got: %d", len(labels))
}
expected := []*influxdb.Label{}
for i := 1; i <= 10; i++ {
expected = append(expected, &influxdb.Label{
ID: platform.ID(i),
Name: fmt.Sprintf("labelname%d", i),
OrgID: platform.ID(i),
})
}
expected = append(expected, &influxdb.Label{
ID: platform.ID(11),
Name: fmt.Sprintf("labelname%d", 11),
OrgID: platform.ID(5),
})
if !reflect.DeepEqual(labels, expected) {
t.Fatalf("expected identical labels: \n%+v\n%+v", labels, expected)
}
// filter by name
l, err := store.ListLabels(context.Background(), tx, influxdb.LabelFilter{Name: "labelname5"})
if err != nil {
t.Fatal(err)
}
if len(l) != 1 {
t.Fatalf("expected 1 label, got: %d", len(l))
}
expectedLabel := []*influxdb.Label{&influxdb.Label{
ID: platform.ID(5),
Name: "labelname5",
OrgID: platform.ID(5),
}}
if !reflect.DeepEqual(l, expectedLabel) {
t.Fatalf("label returned by list did not match expected: \n%+v\n%+v", l, expectedLabel)
}
// filter by org id
id := platform.ID(5)
l, err = store.ListLabels(context.Background(), tx, influxdb.LabelFilter{OrgID: &id})
if err != nil {
t.Fatal(err)
}
if len(l) != 2 {
t.Fatalf("expected 2 labels, got: %d", len(l))
}
expectedLabel = []*influxdb.Label{
&influxdb.Label{
ID: platform.ID(5),
Name: "labelname5",
OrgID: platform.ID(5)},
{
ID: platform.ID(11),
Name: "labelname11",
OrgID: platform.ID(5),
}}
if !reflect.DeepEqual(l, expectedLabel) {
t.Fatalf("label returned by list did not match expected: \n%+v\n%+v", l, expectedLabel)
}
},
},
{
name: "update",
setup: setup,
update: func(t *testing.T, store *label.Store, tx kv.Tx) {
upd := influxdb.LabelUpdate{Name: "newName"}
updated, err := store.UpdateLabel(context.Background(), tx, platform.ID(1), upd)
if err != nil {
t.Fatal(err)
}
if updated.Name != upd.Name {
t.Fatalf("expected updated name %s, got: %s", upd.Name, updated.Name)
}
},
results: func(t *testing.T, store *label.Store, tx kv.Tx) {
la, err := store.GetLabel(context.Background(), tx, platform.ID(1))
if err != nil {
t.Fatal(err)
}
if la.Name != "newName" {
t.Fatalf("expected update name to be %s, got: %s", "newName", la.Name)
}
},
},
{
name: "delete",
setup: setup,
update: func(t *testing.T, store *label.Store, tx kv.Tx) {
err := store.DeleteLabel(context.Background(), tx, platform.ID(5))
if err != nil {
t.Fatal(err)
}
err = store.DeleteLabel(context.Background(), tx, platform.ID(5))
if err != label.ErrLabelNotFound {
t.Fatal("expected label not found error when deleting bucket that has already been deleted, got: ", err)
}
},
results: func(t *testing.T, store *label.Store, tx kv.Tx) {
l, err := store.ListLabels(context.Background(), tx, influxdb.LabelFilter{})
if err != nil {
t.Fatal(err)
}
if len(l) != 9 {
t.Fatalf("expected 9 labels, got: %d", len(l))
}
},
},
}
for _, ts := range tt {
testScenario := ts
t.Run(testScenario.name, func(t *testing.T) {
t.Parallel()
store := inmem.NewKVStore()
if err := all.Up(context.Background(), zaptest.NewLogger(t), store); err != nil {
t.Fatal(err)
}
ts, err := label.NewStore(store)
if err != nil {
t.Fatal(err)
}
// setup
if testScenario.setup != nil {
err := ts.Update(context.Background(), func(tx kv.Tx) error {
testScenario.setup(t, ts, tx)
return nil
})
if err != nil {
t.Fatal(err)
}
}
// update
if testScenario.update != nil {
err := ts.Update(context.Background(), func(tx kv.Tx) error {
testScenario.update(t, ts, tx)
return nil
})
if err != nil {
t.Fatal(err)
}
}
// results
if testScenario.results != nil {
err := ts.View(context.Background(), func(tx kv.Tx) error {
testScenario.results(t, ts, tx)
return nil
})
if err != nil {
t.Fatal(err)
}
}
})
}
}