diff --git a/pkg/services/ngalert/tests/util.go b/pkg/services/ngalert/tests/util.go index ea3415c7ec7..348db1797e9 100644 --- a/pkg/services/ngalert/tests/util.go +++ b/pkg/services/ngalert/tests/util.go @@ -3,25 +3,32 @@ package tests import ( "context" "encoding/json" + "errors" "fmt" "testing" "time" + "github.com/stretchr/testify/mock" + "github.com/grafana/grafana/pkg/api/routing" busmock "github.com/grafana/grafana/pkg/bus/mock" "github.com/grafana/grafana/pkg/infra/log" + "github.com/grafana/grafana/pkg/services/accesscontrol" acmock "github.com/grafana/grafana/pkg/services/accesscontrol/mock" "github.com/grafana/grafana/pkg/services/dashboards" databasestore "github.com/grafana/grafana/pkg/services/dashboards/database" dashboardservice "github.com/grafana/grafana/pkg/services/dashboards/service" "github.com/grafana/grafana/pkg/services/featuremgmt" + "github.com/grafana/grafana/pkg/services/guardian" "github.com/grafana/grafana/pkg/services/ngalert" "github.com/grafana/grafana/pkg/services/ngalert/metrics" "github.com/grafana/grafana/pkg/services/ngalert/models" "github.com/grafana/grafana/pkg/services/ngalert/store" + "github.com/grafana/grafana/pkg/services/org" "github.com/grafana/grafana/pkg/services/secrets/database" secretsManager "github.com/grafana/grafana/pkg/services/secrets/manager" "github.com/grafana/grafana/pkg/services/sqlstore" + "github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/util" @@ -32,6 +39,15 @@ import ( // SetupTestEnv initializes a store to used by the tests. func SetupTestEnv(t *testing.T, baseInterval time.Duration) (*ngalert.AlertNG, *store.DBstore) { t.Helper() + origNewGuardian := guardian.New + guardian.MockDashboardGuardian(&guardian.FakeDashboardGuardian{ + CanSaveValue: true, + CanViewValue: true, + CanAdminValue: true, + }) + t.Cleanup(func() { + guardian.New = origNewGuardian + }) cfg := setting.NewCfg() cfg.UnifiedAlerting = setting.UnifiedAlertingSettings{ @@ -49,6 +65,7 @@ func SetupTestEnv(t *testing.T, baseInterval time.Duration) (*ngalert.AlertNG, * ac := acmock.New() features := featuremgmt.WithFeatures() folderPermissions := acmock.NewMockedPermissionsService() + folderPermissions.On("SetPermissions", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]accesscontrol.ResourcePermission{}, nil) dashboardPermissions := acmock.NewMockedPermissionsService() dashboardService := dashboardservice.ProvideDashboardService( @@ -74,6 +91,7 @@ func SetupTestEnv(t *testing.T, baseInterval time.Duration) (*ngalert.AlertNG, * }, Logger: log.New("ngalert-test"), DashboardService: dashboardService, + FolderService: folderService, } } @@ -84,7 +102,20 @@ func CreateTestAlertRule(t *testing.T, ctx context.Context, dbstore *store.DBsto func CreateTestAlertRuleWithLabels(t *testing.T, ctx context.Context, dbstore *store.DBstore, intervalSeconds int64, orgID int64, labels map[string]string) *models.AlertRule { ruleGroup := fmt.Sprintf("ruleGroup-%s", util.GenerateShortUID()) - _, err := dbstore.InsertAlertRules(ctx, []models.AlertRule{ + folderUID := "namespace" + user := &user.SignedInUser{ + UserID: 1, + OrgID: orgID, + OrgRole: org.RoleAdmin, + IsGrafanaAdmin: true, + } + folder, err := dbstore.FolderService.CreateFolder(ctx, user, orgID, "FOLDER-"+util.GenerateShortUID(), folderUID) + if errors.Is(err, dashboards.ErrFolderWithSameUIDExists) || errors.Is(err, dashboards.ErrFolderVersionMismatch) { + folder, err = dbstore.FolderService.GetFolderByUID(ctx, user, orgID, folderUID) + } + require.NoError(t, err) + + _, err = dbstore.InsertAlertRules(ctx, []models.AlertRule{ { ID: 0, @@ -108,7 +139,7 @@ func CreateTestAlertRuleWithLabels(t *testing.T, ctx context.Context, dbstore *s Labels: labels, Annotations: map[string]string{"testAnnoKey": "testAnnoValue"}, IntervalSeconds: intervalSeconds, - NamespaceUID: "namespace", + NamespaceUID: folder.Uid, RuleGroup: ruleGroup, NoDataState: models.NoData, ExecErrState: models.AlertingErrState, @@ -118,7 +149,7 @@ func CreateTestAlertRuleWithLabels(t *testing.T, ctx context.Context, dbstore *s q := models.ListAlertRulesQuery{ OrgID: orgID, - NamespaceUIDs: []string{"namespace"}, + NamespaceUIDs: []string{folder.Uid}, RuleGroup: ruleGroup, } err = dbstore.ListAlertRules(ctx, &q) @@ -126,6 +157,6 @@ func CreateTestAlertRuleWithLabels(t *testing.T, ctx context.Context, dbstore *s require.NotEmpty(t, q.Result) rule := q.Result[0] - t.Logf("alert definition: %v with title: %q interval: %d created", rule.GetKey(), rule.Title, rule.IntervalSeconds) + t.Logf("alert definition: %v with title: %q interval: %d folder: %s created", rule.GetKey(), rule.Title, rule.IntervalSeconds, folder.Uid) return rule }