influxdb/notebooks/service_test.go

206 lines
5.3 KiB
Go

package notebooks
import (
"context"
"fmt"
"testing"
"github.com/influxdata/influxdb/v2"
"github.com/influxdata/influxdb/v2/snowflake"
"github.com/influxdata/influxdb/v2/sqlite"
"github.com/influxdata/influxdb/v2/sqlite/migrations"
"github.com/stretchr/testify/require"
"go.uber.org/zap"
)
var (
idGen = snowflake.NewIDGenerator()
)
func TestCreateAndGetNotebook(t *testing.T) {
t.Parallel()
svc := newTestService(t)
ctx := context.Background()
// getting an invalid id should return an error
got, err := svc.GetNotebook(ctx, idGen.ID())
require.Nil(t, got)
require.ErrorIs(t, influxdb.ErrNotebookNotFound, err)
testCreate := &influxdb.NotebookReqBody{
OrgID: idGen.ID(),
Name: "some name",
Spec: map[string]interface{}{"hello": "goodbye"},
}
// create a notebook and assert the results
gotCreate, err := svc.CreateNotebook(ctx, testCreate)
require.NoError(t, err)
gotCreateBody := &influxdb.NotebookReqBody{
OrgID: gotCreate.OrgID,
Name: gotCreate.Name,
Spec: gotCreate.Spec,
}
require.Equal(t, testCreate, gotCreateBody)
// get the notebook with the ID that was created and assert the results
gotGet, err := svc.GetNotebook(ctx, gotCreate.ID)
require.NoError(t, err)
gotGetBody := &influxdb.NotebookReqBody{
OrgID: gotGet.OrgID,
Name: gotGet.Name,
Spec: gotGet.Spec,
}
require.Equal(t, testCreate, gotGetBody)
}
func TestUpdate(t *testing.T) {
t.Parallel()
svc := newTestService(t)
ctx := context.Background()
testCreate := &influxdb.NotebookReqBody{
OrgID: idGen.ID(),
Name: "some name",
Spec: map[string]interface{}{"hello": "goodbye"},
}
testUpdate := &influxdb.NotebookReqBody{
OrgID: testCreate.OrgID,
Name: "a new name",
Spec: map[string]interface{}{"aloha": "aloha"},
}
// attempting to update a non-existant notebook should return an error
got, err := svc.UpdateNotebook(ctx, idGen.ID(), testUpdate)
require.Nil(t, got)
require.ErrorIs(t, influxdb.ErrNotebookNotFound, err)
// create the notebook so updating it can be tested
gotCreate, err := svc.CreateNotebook(ctx, testCreate)
require.NoError(t, err)
gotCreateBody := &influxdb.NotebookReqBody{
OrgID: gotCreate.OrgID,
Name: gotCreate.Name,
Spec: gotCreate.Spec,
}
require.Equal(t, testCreate, gotCreateBody)
// try to update the notebook and assert the results
gotUpdate, err := svc.UpdateNotebook(ctx, gotCreate.ID, testUpdate)
require.NoError(t, err)
gotUpdateBody := &influxdb.NotebookReqBody{
OrgID: gotUpdate.OrgID,
Name: gotUpdate.Name,
Spec: gotUpdate.Spec,
}
require.Equal(t, testUpdate, gotUpdateBody)
require.Equal(t, gotCreate.ID, gotUpdate.ID)
require.Equal(t, gotCreate.CreatedAt, gotUpdate.CreatedAt)
require.NotEqual(t, gotUpdate.CreatedAt, gotUpdate.UpdatedAt)
}
func TestDelete(t *testing.T) {
t.Parallel()
svc := newTestService(t)
ctx := context.Background()
// attempting to delete a non-existant notebook should return an error
err := svc.DeleteNotebook(ctx, idGen.ID())
fmt.Println(err)
require.ErrorIs(t, influxdb.ErrNotebookNotFound, err)
testCreate := &influxdb.NotebookReqBody{
OrgID: idGen.ID(),
Name: "some name",
Spec: map[string]interface{}{"hello": "goodbye"},
}
// create the notebook that we are going to try to delete
gotCreate, err := svc.CreateNotebook(ctx, testCreate)
require.NoError(t, err)
gotCreateBody := &influxdb.NotebookReqBody{
OrgID: gotCreate.OrgID,
Name: gotCreate.Name,
Spec: gotCreate.Spec,
}
require.Equal(t, testCreate, gotCreateBody)
// should be able to successfully delete the notebook now
err = svc.DeleteNotebook(ctx, gotCreate.ID)
require.NoError(t, err)
// ensure the notebook no longer exists
_, err = svc.GetNotebook(ctx, gotCreate.ID)
require.ErrorIs(t, influxdb.ErrNotebookNotFound, err)
}
func TestList(t *testing.T) {
t.Parallel()
svc := newTestService(t)
ctx := context.Background()
orgID := idGen.ID()
// selecting with no matches for org_id should return an empty list and no error
got, err := svc.ListNotebooks(ctx, influxdb.NotebookListFilter{OrgID: orgID})
require.NoError(t, err)
require.Equal(t, []*influxdb.Notebook{}, got)
// create some notebooks to test the list operation with
creates := []*influxdb.NotebookReqBody{
{
OrgID: orgID,
Name: "some name",
Spec: map[string]interface{}{"hello": "goodbye"},
},
{
OrgID: orgID,
Name: "another name",
Spec: map[string]interface{}{"aloha": "aloha"},
},
{
OrgID: orgID,
Name: "some name",
Spec: map[string]interface{}{"hola": "adios"},
},
}
for _, c := range creates {
_, err := svc.CreateNotebook(ctx, c)
require.NoError(t, err)
}
// there should now be notebooks returned from ListNotebooks
got, err = svc.ListNotebooks(ctx, influxdb.NotebookListFilter{OrgID: orgID})
require.NoError(t, err)
require.Equal(t, len(creates), len(got))
// make sure the elements from the returned list were from the list of notebooks to create
for _, n := range got {
require.Contains(t, creates, &influxdb.NotebookReqBody{
OrgID: n.OrgID,
Name: n.Name,
Spec: n.Spec,
})
}
}
func newTestService(t *testing.T) *Service {
store := sqlite.NewTestStore(t)
ctx := context.Background()
sqliteMigrator := sqlite.NewMigrator(store, zap.NewNop())
err := sqliteMigrator.Up(ctx, migrations.AllUp)
require.NoError(t, err)
svc := NewService(store)
return svc
}