206 lines
5.3 KiB
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
|
|
}
|