Files
grafana/pkg/tests/api/folders/api_folder_test.go
Kristin Laemmert 299c142f6a QuotaService: refactor to use ReplDB for Get queries (#91333)
* 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
2024-08-08 13:41:33 -04:00

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
}