2025-04-01 10:38:02 +09:00

107 lines
2.3 KiB
Go

package prom
import (
"testing"
"time"
prommodel "github.com/prometheus/common/model"
"github.com/stretchr/testify/require"
"gopkg.in/yaml.v3"
)
func TestPrometheusRulesFileYAML(t *testing.T) {
interval := prommodel.Duration(5 * time.Minute)
alertFor := prommodel.Duration(10 * time.Minute)
keepFiring := prommodel.Duration(15 * time.Minute)
tests := []struct {
name string
input PrometheusRulesFile
expectedYAML string
}{
{
name: "simple alert rule and a recording rule",
input: PrometheusRulesFile{
Groups: []PrometheusRuleGroup{
{
Name: "test_group",
Interval: interval,
Rules: []PrometheusRule{
{
Alert: "alert-1",
Expr: "vector(0) > 90",
For: &alertFor,
KeepFiringFor: &keepFiring,
Labels: map[string]string{
"team": "alerting",
},
Annotations: map[string]string{
"summary": "some summary",
"description": "some description",
},
},
{
Record: "vector(1)",
},
},
},
},
},
expectedYAML: `
groups:
- name: test_group
interval: 5m
rules:
- alert: alert-1
expr: vector(0) > 90
for: 10m
keep_firing_for: 15m
labels:
team: alerting
annotations:
description: some description
summary: some summary
- record: vector(1)
`,
},
{
name: "empty rules file",
input: PrometheusRulesFile{
Groups: []PrometheusRuleGroup{},
},
expectedYAML: `groups: []`,
},
{
name: "empty group",
input: PrometheusRulesFile{
Groups: []PrometheusRuleGroup{
{
Name: "empty_group",
Interval: interval,
Rules: []PrometheusRule{},
},
},
},
expectedYAML: `
groups:
- name: empty_group
interval: 5m
rules: []`,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
yamlData, err := yaml.Marshal(tt.input)
require.NoError(t, err, "Failed to marshal to YAML")
require.YAMLEq(t, tt.expectedYAML, string(yamlData))
var parsed PrometheusRulesFile
err = yaml.Unmarshal(yamlData, &parsed)
require.NoError(t, err, "Failed to unmarshal from YAML")
require.Equal(t, tt.input, parsed)
})
}
}