* Feature (quota service): Use ReplDB for quota service Gets This adds the replDB to the quota service, as well as some more test helper functions to simplify updating tests. My intent is that the helper functions can be removed when this is fully rolled out (or not) and we're consistently using the ReplDB interface (or not!) * test updates
230 lines
7.1 KiB
Go
230 lines
7.1 KiB
Go
package folders
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"net/http"
|
|
"testing"
|
|
|
|
"github.com/go-openapi/runtime"
|
|
"github.com/grafana/grafana-openapi-client-go/client/folders"
|
|
"github.com/grafana/grafana-openapi-client-go/models"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/grafana/grafana/pkg/infra/db"
|
|
"github.com/grafana/grafana/pkg/infra/tracing"
|
|
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
|
"github.com/grafana/grafana/pkg/services/org"
|
|
"github.com/grafana/grafana/pkg/services/org/orgimpl"
|
|
"github.com/grafana/grafana/pkg/services/quota/quotaimpl"
|
|
"github.com/grafana/grafana/pkg/services/supportbundles/supportbundlestest"
|
|
"github.com/grafana/grafana/pkg/services/user"
|
|
"github.com/grafana/grafana/pkg/services/user/userimpl"
|
|
"github.com/grafana/grafana/pkg/setting"
|
|
"github.com/grafana/grafana/pkg/tests"
|
|
"github.com/grafana/grafana/pkg/tests/testinfra"
|
|
)
|
|
|
|
const orgID = 1
|
|
|
|
func TestIntegrationUpdateFolder(t *testing.T) {
|
|
if testing.Short() {
|
|
t.Skip("skipping integration test")
|
|
}
|
|
|
|
dir, path := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{
|
|
DisableAnonymous: true,
|
|
EnableQuota: true,
|
|
})
|
|
|
|
grafanaListedAddr, env := testinfra.StartGrafanaEnv(t, dir, path)
|
|
store, cfg := env.SQLStore, env.Cfg
|
|
// Create user
|
|
createUser(t, store, cfg, user.CreateUserCommand{
|
|
DefaultOrgRole: string(org.RoleAdmin),
|
|
Password: "admin",
|
|
Login: "admin",
|
|
})
|
|
|
|
adminClient := tests.GetClient(grafanaListedAddr, "admin", "admin")
|
|
resp, err := adminClient.Folders.CreateFolder(&models.CreateFolderCommand{
|
|
Title: "folder",
|
|
})
|
|
require.NoError(t, err)
|
|
require.Equal(t, http.StatusOK, resp.Code())
|
|
|
|
t.Run("update folder should succeed", func(t *testing.T) {
|
|
resp, err := adminClient.Folders.UpdateFolder(resp.Payload.UID, &models.UpdateFolderCommand{
|
|
Title: "new title",
|
|
Version: resp.Payload.Version,
|
|
})
|
|
require.NoError(t, err)
|
|
require.Equal(t, http.StatusOK, resp.Code())
|
|
require.Equal(t, "new title", resp.Payload.Title)
|
|
})
|
|
}
|
|
|
|
func TestIntegrationCreateFolder(t *testing.T) {
|
|
if testing.Short() {
|
|
t.Skip("skipping integration test")
|
|
}
|
|
|
|
dir, path := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{
|
|
DisableAnonymous: true,
|
|
EnableQuota: true,
|
|
})
|
|
|
|
grafanaListedAddr, env := testinfra.StartGrafanaEnv(t, dir, path)
|
|
store, cfg := env.SQLStore, env.Cfg
|
|
// Create user
|
|
createUser(t, store, cfg, user.CreateUserCommand{
|
|
DefaultOrgRole: string(org.RoleAdmin),
|
|
Password: "admin",
|
|
Login: "admin",
|
|
})
|
|
|
|
adminClient := tests.GetClient(grafanaListedAddr, "admin", "admin")
|
|
|
|
t.Run("create folder under root should succeed", func(t *testing.T) {
|
|
resp, err := adminClient.Folders.CreateFolder(&models.CreateFolderCommand{
|
|
Title: "folder",
|
|
})
|
|
require.NoError(t, err)
|
|
require.Equal(t, http.StatusOK, resp.Code())
|
|
|
|
t.Run("create folder with same name under root should fail", func(t *testing.T) {
|
|
_, err := adminClient.Folders.CreateFolder(&models.CreateFolderCommand{
|
|
Title: "folder",
|
|
})
|
|
require.Error(t, err)
|
|
var conflict *folders.CreateFolderConflict
|
|
assert.True(t, errors.As(err, &conflict))
|
|
assert.Equal(t, http.StatusConflict, conflict.Code())
|
|
})
|
|
})
|
|
}
|
|
|
|
func TestIntegrationNestedFoldersOn(t *testing.T) {
|
|
if testing.Short() {
|
|
t.Skip("skipping integration test")
|
|
}
|
|
|
|
dir, path := testinfra.CreateGrafDir(t, testinfra.GrafanaOpts{
|
|
DisableAnonymous: true,
|
|
EnableQuota: true,
|
|
EnableFeatureToggles: []string{featuremgmt.FlagNestedFolders},
|
|
})
|
|
|
|
grafanaListedAddr, env := testinfra.StartGrafanaEnv(t, dir, path)
|
|
store, cfg := env.SQLStore, env.Cfg
|
|
// Create user
|
|
createUser(t, store, cfg, user.CreateUserCommand{
|
|
DefaultOrgRole: string(org.RoleAdmin),
|
|
Password: "admin",
|
|
Login: "admin",
|
|
})
|
|
|
|
adminClient := tests.GetClient(grafanaListedAddr, "admin", "admin")
|
|
|
|
t.Run("create folder under root should succeed", func(t *testing.T) {
|
|
resp, err := adminClient.Folders.CreateFolder(&models.CreateFolderCommand{
|
|
Title: "folder",
|
|
})
|
|
require.NoError(t, err)
|
|
require.Equal(t, http.StatusOK, resp.Code())
|
|
|
|
t.Run("create folder with same name under root should fail", func(t *testing.T) {
|
|
_, err := adminClient.Folders.CreateFolder(&models.CreateFolderCommand{
|
|
Title: "folder",
|
|
})
|
|
require.Error(t, err)
|
|
var conflict *folders.CreateFolderConflict
|
|
assert.True(t, errors.As(err, &conflict))
|
|
assert.Equal(t, http.StatusConflict, conflict.Code())
|
|
})
|
|
})
|
|
|
|
t.Run("create subfolder should succeed", func(t *testing.T) {
|
|
resp, err := adminClient.Folders.CreateFolder(&models.CreateFolderCommand{
|
|
Title: "parent",
|
|
})
|
|
require.NoError(t, err)
|
|
require.Equal(t, http.StatusOK, resp.Code())
|
|
parentUID := resp.Payload.UID
|
|
|
|
resp, err = adminClient.Folders.CreateFolder(&models.CreateFolderCommand{
|
|
Title: "subfolder",
|
|
ParentUID: parentUID,
|
|
})
|
|
require.NoError(t, err)
|
|
require.Equal(t, http.StatusOK, resp.Code())
|
|
|
|
t.Run("create subfolder with same name should fail", func(t *testing.T) {
|
|
resp, err = adminClient.Folders.CreateFolder(&models.CreateFolderCommand{
|
|
Title: "subfolder",
|
|
ParentUID: parentUID,
|
|
})
|
|
require.Error(t, err)
|
|
var conflict *folders.CreateFolderConflict
|
|
assert.True(t, errors.As(err, &conflict))
|
|
assert.Equal(t, http.StatusConflict, conflict.Code())
|
|
})
|
|
|
|
t.Run("create subfolder with same name under other folder should succeed", func(t *testing.T) {
|
|
resp, err := adminClient.Folders.CreateFolder(&models.CreateFolderCommand{
|
|
Title: "other",
|
|
})
|
|
require.NoError(t, err)
|
|
require.Equal(t, http.StatusOK, resp.Code())
|
|
other := resp.Payload.UID
|
|
|
|
resp, err = adminClient.Folders.CreateFolder(&models.CreateFolderCommand{
|
|
Title: "subfolder",
|
|
ParentUID: other,
|
|
})
|
|
require.NoError(t, err)
|
|
assert.Equal(t, http.StatusOK, resp.Code())
|
|
assert.Equal(t, other, resp.Payload.ParentUID)
|
|
subfolderUnderOther := resp.Payload.UID
|
|
|
|
t.Run("move subfolder to other folder containing folder with that name should fail", func(t *testing.T) {
|
|
_, err := adminClient.Folders.MoveFolder(subfolderUnderOther, &models.MoveFolderCommand{
|
|
ParentUID: parentUID,
|
|
})
|
|
require.Error(t, err)
|
|
var apiError *runtime.APIError
|
|
assert.True(t, errors.As(err, &apiError))
|
|
assert.Equal(t, http.StatusConflict, apiError.Code)
|
|
})
|
|
|
|
t.Run("move subfolder to root should succeed", func(t *testing.T) {
|
|
resp, err := adminClient.Folders.MoveFolder(subfolderUnderOther, &models.MoveFolderCommand{})
|
|
require.NoError(t, err)
|
|
assert.Equal(t, http.StatusOK, resp.Code())
|
|
assert.Equal(t, "", resp.Payload.ParentUID)
|
|
})
|
|
})
|
|
})
|
|
}
|
|
|
|
func createUser(t *testing.T, store db.DB, cfg *setting.Cfg, cmd user.CreateUserCommand) int64 {
|
|
t.Helper()
|
|
|
|
cfg.AutoAssignOrg = true
|
|
cfg.AutoAssignOrgId = orgID
|
|
|
|
quotaService := quotaimpl.ProvideService(db.FakeReplDBFromDB(store), cfg)
|
|
orgService, err := orgimpl.ProvideService(store, cfg, quotaService)
|
|
require.NoError(t, err)
|
|
usrSvc, err := userimpl.ProvideService(
|
|
store, orgService, cfg, nil, nil, tracing.InitializeTracerForTest(),
|
|
quotaService, supportbundlestest.NewFakeBundleService(),
|
|
)
|
|
require.NoError(t, err)
|
|
|
|
u, err := usrSvc.Create(context.Background(), &cmd)
|
|
require.NoError(t, err)
|
|
return u.ID
|
|
}
|