influxdb/tenant/storage_org_test.go

272 lines
6.9 KiB
Go

package tenant_test
import (
"context"
"fmt"
"testing"
"time"
"github.com/influxdata/influxdb/v2"
"github.com/influxdata/influxdb/v2/kit/platform"
"github.com/influxdata/influxdb/v2/kv"
"github.com/influxdata/influxdb/v2/mock"
"github.com/influxdata/influxdb/v2/tenant"
itesting "github.com/influxdata/influxdb/v2/testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// type Organization struct {
// ID ID `json:"id,omitempty"`
// Name string `json:"name"`
// Description string `json:"description"`
// CRUDLog
// }
const (
firstOrgID platform.ID = (iota + 1)
secondOrgID
thirdOrgID
fourthOrgID
fifthOrgID
)
func TestOrg(t *testing.T) {
var (
aTime = time.Date(2020, 7, 23, 10, 0, 0, 0, time.UTC)
testOrgs = func(count int, visit ...func(*influxdb.Organization)) (orgs []*influxdb.Organization) {
for i := 1; i <= count; i++ {
org := &influxdb.Organization{
ID: platform.ID(i),
Name: fmt.Sprintf("org%d", i),
Description: "words",
}
if len(visit) > 0 {
visit[0](org)
}
orgs = append(orgs, org)
}
return
}
withCrudLog = func(o *influxdb.Organization) {
o.CRUDLog = influxdb.CRUDLog{
CreatedAt: aTime,
UpdatedAt: aTime,
}
}
simpleSetup = func(t *testing.T, store *tenant.Store, tx kv.Tx) {
store.OrgIDGen = mock.NewIncrementingIDGenerator(1)
for _, org := range testOrgs(10) {
require.NoError(t, store.CreateOrg(context.Background(), tx, org))
}
}
over20Setup = func(t *testing.T, store *tenant.Store, tx kv.Tx) {
store.OrgIDGen = mock.NewIncrementingIDGenerator(1)
for _, org := range testOrgs(25) {
require.NoError(t, store.CreateOrg(context.Background(), tx, org))
}
}
)
st := []struct {
name string
setup func(*testing.T, *tenant.Store, kv.Tx)
update func(*testing.T, *tenant.Store, kv.Tx)
results func(*testing.T, *tenant.Store, kv.Tx)
}{
{
name: "create",
setup: simpleSetup,
results: func(t *testing.T, store *tenant.Store, tx kv.Tx) {
orgs, err := store.ListOrgs(context.Background(), tx)
if err != nil {
t.Fatal(err)
}
assert.Len(t, orgs, 10)
expected := testOrgs(10, withCrudLog)
assert.Equal(t, expected, orgs)
},
},
{
name: "get",
setup: simpleSetup,
results: func(t *testing.T, store *tenant.Store, tx kv.Tx) {
org, err := store.GetOrg(context.Background(), tx, fifthOrgID)
if err != nil {
t.Fatal(err)
}
expected := &influxdb.Organization{
ID: fifthOrgID,
Name: "org5",
Description: "words",
CRUDLog: influxdb.CRUDLog{
CreatedAt: org.CreatedAt,
UpdatedAt: org.UpdatedAt,
},
}
require.Equal(t, expected, org)
org, err = store.GetOrgByName(context.Background(), tx, "org5")
if err != nil {
t.Fatal(err)
}
require.Equal(t, expected, org)
if _, err := store.GetOrg(context.Background(), tx, 500); err != tenant.ErrOrgNotFound {
t.Fatal("failed to get correct error when looking for invalid org by id")
}
if _, err := store.GetOrgByName(context.Background(), tx, "notaorg"); err.Error() != tenant.OrgNotFoundByName("notaorg").Error() {
t.Fatal("failed to get correct error when looking for invalid org by name")
}
},
},
{
name: "list",
setup: simpleSetup,
results: func(t *testing.T, store *tenant.Store, tx kv.Tx) {
orgs, err := store.ListOrgs(context.Background(), tx)
if err != nil {
t.Fatal(err)
}
require.Len(t, orgs, 10)
expected := testOrgs(10, withCrudLog)
require.Equal(t, expected, orgs)
orgs, err = store.ListOrgs(context.Background(), tx, influxdb.FindOptions{Limit: 4})
require.NoError(t, err)
assert.Len(t, orgs, 4)
assert.Equal(t, expected[:4], orgs)
orgs, err = store.ListOrgs(context.Background(), tx, influxdb.FindOptions{Offset: 3})
require.NoError(t, err)
assert.Len(t, orgs, 7)
assert.Equal(t, expected[3:], orgs)
},
},
{
name: "listOver20",
setup: over20Setup,
results: func(t *testing.T, store *tenant.Store, tx kv.Tx) {
orgs, err := store.ListOrgs(context.Background(), tx)
if err != nil {
t.Fatal(err)
}
require.Len(t, orgs, 25)
},
},
{
name: "update",
setup: simpleSetup,
update: func(t *testing.T, store *tenant.Store, tx kv.Tx) {
org5 := "org5"
_, err := store.UpdateOrg(context.Background(), tx, thirdOrgID, influxdb.OrganizationUpdate{Name: &org5})
if err.Error() != tenant.OrgAlreadyExistsError(org5).Error() {
t.Fatal("failed to error on duplicate orgname")
}
org30 := "org30"
_, err = store.UpdateOrg(context.Background(), tx, thirdOrgID, influxdb.OrganizationUpdate{Name: &org30})
require.NoError(t, err)
description := "notWords"
_, err = store.UpdateOrg(context.Background(), tx, thirdOrgID, influxdb.OrganizationUpdate{Description: &description})
require.NoError(t, err)
},
results: func(t *testing.T, store *tenant.Store, tx kv.Tx) {
orgs, err := store.ListOrgs(context.Background(), tx)
require.NoError(t, err)
assert.Len(t, orgs, 10)
expected := testOrgs(10, withCrudLog)
expected[2].Name = "org30"
expected[2].Description = "notWords"
require.Equal(t, expected, orgs)
},
},
{
name: "delete",
setup: simpleSetup,
update: func(t *testing.T, store *tenant.Store, tx kv.Tx) {
err := store.DeleteOrg(context.Background(), tx, firstOrgID)
require.NoError(t, err)
err = store.DeleteOrg(context.Background(), tx, firstOrgID)
if err != tenant.ErrOrgNotFound {
t.Fatal("invalid error when deleting org that has already been deleted", err)
}
err = store.DeleteOrg(context.Background(), tx, thirdOrgID)
require.NoError(t, err)
},
results: func(t *testing.T, store *tenant.Store, tx kv.Tx) {
orgs, err := store.ListOrgs(context.Background(), tx)
require.NoError(t, err)
assert.Len(t, orgs, 8)
all := testOrgs(10, withCrudLog)
// deleted first and third item
expected := append(all[1:2], all[3:]...)
require.Equal(t, expected, orgs)
},
},
}
for _, testScenario := range st {
t.Run(testScenario.name, func(t *testing.T) {
s := itesting.NewTestInmemStore(t)
ts := tenant.NewStore(s, tenant.WithNow(func() time.Time {
return aTime
}))
// 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)
}
}
})
}
}