Files
grafana/pkg/services/ngalert/api/forking_alertmanager_test.go

139 lines
3.7 KiB
Go

package api
import (
"net/http"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model"
"github.com/grafana/grafana/pkg/services/featuremgmt"
apimodels "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions"
"github.com/grafana/grafana/pkg/services/user"
"github.com/grafana/grafana/pkg/web"
)
func TestAlertmanagerApiHandler_isExtraConfig(t *testing.T) {
tests := []struct {
name string
datasourceUID string
flagEnabled bool
expectedIsExtra bool
}{
{
name: "normal datasource when feature enabled",
datasourceUID: "normal-datasource",
flagEnabled: true,
expectedIsExtra: false,
},
{
name: "extra config when feature enabled",
datasourceUID: "~grafana-with-extra-config",
flagEnabled: true,
expectedIsExtra: true,
},
{
name: "extra config when feature disabled",
datasourceUID: "~grafana-with-extra-config",
flagEnabled: false,
expectedIsExtra: false,
},
{
name: "empty datasource UID",
datasourceUID: "",
flagEnabled: true,
expectedIsExtra: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
req := &http.Request{}
ctx := &contextmodel.ReqContext{
Context: &web.Context{
Req: req,
},
SignedInUser: &user.SignedInUser{
OrgID: 1,
},
}
ctx.Req = web.SetURLParams(req, map[string]string{
":DatasourceUID": tt.datasourceUID,
})
var features featuremgmt.FeatureToggles
if tt.flagEnabled {
features = featuremgmt.WithFeatures(featuremgmt.FlagAlertingImportAlertmanagerUI)
} else {
features = featuremgmt.WithFeatures()
}
handler := &AlertmanagerApiHandler{
FeatureManager: features,
}
isExtra := handler.isExtraConfig(ctx)
assert.Equal(t, tt.expectedIsExtra, isExtra)
})
}
}
func TestAlertmanagerApiHandler_ExtraConfigRouting(t *testing.T) {
t.Run("GET status returns ready for extra config", func(t *testing.T) {
req := &http.Request{}
ctx := &contextmodel.ReqContext{
Context: &web.Context{
Req: req,
},
SignedInUser: &user.SignedInUser{
OrgID: 1,
},
}
ctx.Req = web.SetURLParams(req, map[string]string{
":DatasourceUID": "~grafana-with-extra-config",
})
handler := &AlertmanagerApiHandler{
FeatureManager: featuremgmt.WithFeatures(featuremgmt.FlagAlertingImportAlertmanagerUI),
}
resp := handler.handleRouteGetAMStatus(ctx, "~grafana-with-extra-config")
require.Equal(t, http.StatusOK, resp.Status())
})
t.Run("POST operations return 403 for extra config", func(t *testing.T) {
req := &http.Request{}
ctx := &contextmodel.ReqContext{
Context: &web.Context{
Req: req,
},
SignedInUser: &user.SignedInUser{
OrgID: 1,
},
}
ctx.Req = web.SetURLParams(req, map[string]string{
":DatasourceUID": "~grafana-with-extra-config",
})
handler := &AlertmanagerApiHandler{
FeatureManager: featuremgmt.WithFeatures(featuremgmt.FlagAlertingImportAlertmanagerUI),
}
resp := handler.handleRouteCreateSilence(ctx, apimodels.PostableSilence{}, "~grafana-with-extra-config")
assert.Equal(t, http.StatusForbidden, resp.Status())
resp = handler.handleRouteDeleteAlertingConfig(ctx, "~grafana-with-extra-config")
assert.Equal(t, http.StatusForbidden, resp.Status())
resp = handler.handleRoutePostAlertingConfig(ctx, apimodels.PostableUserConfig{}, "~grafana-with-extra-config")
assert.Equal(t, http.StatusForbidden, resp.Status())
resp = handler.handleRoutePostAMAlerts(ctx, apimodels.PostableAlerts{}, "~grafana-with-extra-config")
assert.Equal(t, http.StatusForbidden, resp.Status())
})
}