Chore: Add unit test for cloudmigration package (#88868)
This commit is contained in:
@@ -4,8 +4,27 @@ import (
|
||||
"context"
|
||||
"testing"
|
||||
|
||||
"github.com/grafana/grafana/pkg/api/routing"
|
||||
"github.com/grafana/grafana/pkg/components/simplejson"
|
||||
"github.com/grafana/grafana/pkg/infra/db"
|
||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
||||
"github.com/grafana/grafana/pkg/services/cloudmigration"
|
||||
"github.com/grafana/grafana/pkg/services/contexthandler/ctxkey"
|
||||
contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model"
|
||||
"github.com/grafana/grafana/pkg/services/dashboards"
|
||||
"github.com/grafana/grafana/pkg/services/datasources"
|
||||
datafakes "github.com/grafana/grafana/pkg/services/datasources/fakes"
|
||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
||||
"github.com/grafana/grafana/pkg/services/folder"
|
||||
"github.com/grafana/grafana/pkg/services/folder/foldertest"
|
||||
secretsfakes "github.com/grafana/grafana/pkg/services/secrets/fakes"
|
||||
"github.com/grafana/grafana/pkg/services/user"
|
||||
"github.com/grafana/grafana/pkg/setting"
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/mock"
|
||||
"github.com/stretchr/testify/require"
|
||||
"go.opentelemetry.io/otel/sdk/trace/tracetest"
|
||||
)
|
||||
|
||||
func Test_NoopServiceDoesNothing(t *testing.T) {
|
||||
@@ -13,3 +32,143 @@ func Test_NoopServiceDoesNothing(t *testing.T) {
|
||||
_, e := s.CreateToken(context.Background())
|
||||
assert.ErrorIs(t, e, cloudmigration.ErrFeatureDisabledError)
|
||||
}
|
||||
|
||||
func Test_CreateGetAndDeleteToken(t *testing.T) {
|
||||
s := setUpServiceTest(t, false)
|
||||
|
||||
createResp, err := s.CreateToken(context.Background())
|
||||
assert.NoError(t, err)
|
||||
assert.NotEmpty(t, createResp.Token)
|
||||
|
||||
token, err := s.GetToken(context.Background())
|
||||
assert.NoError(t, err)
|
||||
assert.NotEmpty(t, token.Name)
|
||||
|
||||
err = s.DeleteToken(context.Background(), token.ID)
|
||||
assert.NoError(t, err)
|
||||
|
||||
_, err = s.GetToken(context.Background())
|
||||
assert.ErrorIs(t, cloudmigration.ErrTokenNotFound, err)
|
||||
|
||||
cm := cloudmigration.CloudMigration{}
|
||||
err = s.ValidateToken(context.Background(), cm)
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
|
||||
func Test_CreateGetRunMigrationsAndRuns(t *testing.T) {
|
||||
s := setUpServiceTest(t, true)
|
||||
|
||||
createTokenResp, err := s.CreateToken(context.Background())
|
||||
assert.NoError(t, err)
|
||||
assert.NotEmpty(t, createTokenResp.Token)
|
||||
|
||||
cmd := cloudmigration.CloudMigrationRequest{
|
||||
AuthToken: createTokenResp.Token,
|
||||
}
|
||||
|
||||
createResp, err := s.CreateMigration(context.Background(), cmd)
|
||||
require.NoError(t, err)
|
||||
require.NotEmpty(t, createResp.UID)
|
||||
require.NotEmpty(t, createResp.Stack)
|
||||
|
||||
getMigResp, err := s.GetMigration(context.Background(), createResp.UID)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, getMigResp)
|
||||
require.Equal(t, createResp.UID, getMigResp.UID)
|
||||
require.Equal(t, createResp.Stack, getMigResp.Stack)
|
||||
|
||||
listResp, err := s.GetMigrationList(context.Background())
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, listResp)
|
||||
require.Equal(t, 1, len(listResp.Migrations))
|
||||
require.Equal(t, createResp.UID, listResp.Migrations[0].UID)
|
||||
require.Equal(t, createResp.Stack, listResp.Migrations[0].Stack)
|
||||
|
||||
runResp, err := s.RunMigration(ctxWithSignedInUser(), createResp.UID)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, runResp)
|
||||
resultItemsByType := make(map[string]int)
|
||||
for _, item := range runResp.Items {
|
||||
resultItemsByType[string(item.Type)] = resultItemsByType[string(item.Type)] + 1
|
||||
}
|
||||
require.Equal(t, 1, resultItemsByType["DASHBOARD"])
|
||||
require.Equal(t, 2, resultItemsByType["DATASOURCE"])
|
||||
require.Equal(t, 2, len(resultItemsByType))
|
||||
|
||||
runStatusResp, err := s.GetMigrationStatus(context.Background(), runResp.RunUID)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, runResp.RunUID, runStatusResp.UID)
|
||||
|
||||
listRunResp, err := s.GetMigrationRunList(context.Background(), createResp.UID)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, 1, len(listRunResp.Runs))
|
||||
require.Equal(t, runResp.RunUID, listRunResp.Runs[0].RunUID)
|
||||
|
||||
delMigResp, err := s.DeleteMigration(context.Background(), createResp.UID)
|
||||
require.NoError(t, err)
|
||||
require.NotNil(t, createResp.UID, delMigResp.UID)
|
||||
}
|
||||
|
||||
func ctxWithSignedInUser() context.Context {
|
||||
c := &contextmodel.ReqContext{
|
||||
SignedInUser: &user.SignedInUser{OrgID: 1},
|
||||
}
|
||||
k := ctxkey.Key{}
|
||||
ctx := context.WithValue(context.Background(), k, c)
|
||||
return ctx
|
||||
}
|
||||
|
||||
func setUpServiceTest(t *testing.T, withDashboardMock bool) cloudmigration.Service {
|
||||
sqlStore := db.InitTestDB(t)
|
||||
secretsService := secretsfakes.NewFakeSecretsService()
|
||||
rr := routing.NewRouteRegister()
|
||||
spanRecorder := tracetest.NewSpanRecorder()
|
||||
tracer := tracing.InitializeTracerForTest(tracing.WithSpanProcessor(spanRecorder))
|
||||
mockFolder := &foldertest.FakeService{
|
||||
ExpectedFolder: &folder.Folder{UID: "folderUID", Title: "Folder"},
|
||||
}
|
||||
|
||||
cfg := setting.NewCfg()
|
||||
section, err := cfg.Raw.NewSection("cloud_migration")
|
||||
require.NoError(t, err)
|
||||
_, err = section.NewKey("domain", "localhost:1234")
|
||||
require.NoError(t, err)
|
||||
// dont know if this is the best, but dont want to refactor at the moment
|
||||
cfg.CloudMigration.IsDeveloperMode = true
|
||||
|
||||
dashboardService := dashboards.NewFakeDashboardService(t)
|
||||
if withDashboardMock {
|
||||
dashboardService.On("GetAllDashboards", mock.Anything).Return(
|
||||
[]*dashboards.Dashboard{
|
||||
{
|
||||
UID: "1",
|
||||
Data: simplejson.New(),
|
||||
},
|
||||
},
|
||||
nil,
|
||||
)
|
||||
}
|
||||
|
||||
dsService := &datafakes.FakeDataSourceService{
|
||||
DataSources: []*datasources.DataSource{
|
||||
{Name: "mmm", Type: "mysql"},
|
||||
{Name: "ZZZ", Type: "infinity"},
|
||||
},
|
||||
}
|
||||
|
||||
s, err := ProvideService(
|
||||
cfg,
|
||||
featuremgmt.WithFeatures(featuremgmt.FlagOnPremToCloudMigrations),
|
||||
sqlStore,
|
||||
dsService,
|
||||
secretsService,
|
||||
rr,
|
||||
prometheus.DefaultRegisterer,
|
||||
tracer,
|
||||
dashboardService,
|
||||
mockFolder,
|
||||
)
|
||||
require.NoError(t, err)
|
||||
|
||||
return s
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user