Files
grafana/pkg/services/ngalert/store/compat_test.go
T
Moustafa Baiou ca8324e62a Alerting: Add support for alpha rules apis in legacy storage
Rules created in the new api makes the rule have no group in the database, but the rule is returned in the old group api with a sentinel group name formatted with the rule uid for compatiblity with the old api.
This makes the UI continue to work with the rules without a group, and the ruler will continue to work with the rules without a group.

Rules are not allowed to be created in the provisioning api with a NoGroup sentinel mask, but NoGroup rules can be manipulated through both the new and old apis.

Co-authored-by: William Wernert <william.wernert@grafana.com>
2025-09-10 09:30:56 -04:00

84 lines
2.5 KiB
Go

package store
import (
"testing"
"github.com/stretchr/testify/require"
"github.com/grafana/grafana/pkg/infra/log/logtest"
ngmodels "github.com/grafana/grafana/pkg/services/ngalert/models"
"github.com/grafana/grafana/pkg/util"
)
func TestAlertRuleToModelsAlertRule(t *testing.T) {
g := ngmodels.RuleGen
t.Run("make sure no data is lost between conversions", func(t *testing.T) {
for _, rule := range g.GenerateMany(100) {
r, err := alertRuleFromModelsAlertRule(rule)
require.NoError(t, err)
clone, err := alertRuleToModelsAlertRule(r, &logtest.Fake{})
require.NoError(t, err)
require.Empty(t, rule.Diff(&clone))
}
})
t.Run("should use NoData if NoDataState is not known", func(t *testing.T) {
rule, err := alertRuleFromModelsAlertRule(g.Generate())
require.NoError(t, err)
rule.NoDataState = util.GenerateShortUID()
converted, err := alertRuleToModelsAlertRule(rule, &logtest.Fake{})
require.NoError(t, err)
require.Equal(t, ngmodels.NoData, converted.NoDataState)
})
t.Run("should use Error if ExecErrState is not known", func(t *testing.T) {
rule, err := alertRuleFromModelsAlertRule(g.Generate())
require.NoError(t, err)
rule.ExecErrState = util.GenerateShortUID()
converted, err := alertRuleToModelsAlertRule(rule, &logtest.Fake{})
require.NoError(t, err)
require.Equal(t, ngmodels.ErrorErrState, converted.ExecErrState)
})
t.Run("should handle NoGroup rules properly", func(t *testing.T) {
rule, err := alertRuleFromModelsAlertRule(g.Generate())
require.NoError(t, err)
rule.RuleGroup = ""
projectedRuleGroup, err := ngmodels.NewNoGroupRuleGroup(rule.UID)
require.NoError(t, err)
converted, err := alertRuleToModelsAlertRule(rule, &logtest.Fake{})
require.NoError(t, err)
require.Equal(t, projectedRuleGroup.String(), converted.RuleGroup)
clone, err := alertRuleFromModelsAlertRule(converted)
require.NoError(t, err)
require.Equal(t, rule, clone)
require.Empty(t, clone.RuleGroup)
converted2, err := alertRuleToModelsAlertRule(clone, &logtest.Fake{})
require.NoError(t, err)
require.Equal(t, converted, converted2)
})
}
func TestAlertRuleVersionToAlertRule(t *testing.T) {
g := ngmodels.RuleGen
t.Run("make sure no data is lost between conversions", func(t *testing.T) {
for _, rule := range g.GenerateMany(100) {
// ignore fields
rule.DashboardUID = nil
rule.PanelID = nil
r, err := alertRuleFromModelsAlertRule(rule)
require.NoError(t, err)
r2 := alertRuleVersionToAlertRule(alertRuleToAlertRuleVersion(r))
require.Equal(t, r, r2)
}
})
}