SQLTemplates: Add helper to ensure all templates have a test-case (#103964)

* SQLTemplates: Add helper to ensure all templates have a test-case associated

* UnifiedStorage: Add missing sql template test case

* LegacyDashboards: Add sql templates fs to test cases for exhaustiveness check

* RBACStore: Add sql templates fs to test cases for exhaustiveness check

* LegacyIAM: Add missing sql template test cases
This commit is contained in:
Matheus Macabu
2025-04-22 11:21:51 +02:00
committed by GitHub
parent 512df0091a
commit fc9f32a9f6
36 changed files with 513 additions and 4 deletions
+12 -1
View File
@@ -12,7 +12,8 @@ import (
func TestUnifiedStorageQueries(t *testing.T) {
mocks.CheckQuerySnapshots(t, mocks.TemplateTestSetup{
RootDir: "testdata",
RootDir: "testdata",
SQLTemplatesFS: sqlTemplatesFS,
Templates: map[*template.Template][]mocks.TemplateTestCase{
sqlResourceDelete: {
{
@@ -335,6 +336,16 @@ func TestUnifiedStorageQueries(t *testing.T) {
},
},
sqlResourceVersionList: {
{
Name: "single path",
Data: &sqlResourceVersionListRequest{
SQLTemplate: mocks.NewTestingSQLTemplate(),
groupResourceVersion: new(groupResourceVersion),
},
},
},
sqlResourceStats: {
{
Name: "global",
@@ -2,6 +2,7 @@ package mocks
import (
"fmt"
"io/fs"
"os"
"path/filepath"
reflect "reflect"
@@ -10,6 +11,7 @@ import (
"text/template"
"github.com/google/go-cmp/cmp"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
sqltemplate "github.com/grafana/grafana/pkg/storage/unified/sql/sqltemplate"
@@ -82,6 +84,10 @@ type TemplateTestSetup struct {
// Check a set of templates against example inputs
Templates map[*template.Template][]TemplateTestCase
// The (embedded) filesystem containing the SQL query templates
// If not nil, a test will be run to ensure all templates in that folder have a test-case
SQLTemplatesFS fs.FS
}
func CheckQuerySnapshots(t *testing.T, setup TemplateTestSetup) {
@@ -96,6 +102,10 @@ func CheckQuerySnapshots(t *testing.T, setup TemplateTestSetup) {
}
}
if setup.SQLTemplatesFS != nil {
ensureAllTemplatesHaveTestCases(t, setup)
}
for tmpl, cases := range setup.Templates {
t.Run(tmpl.Name(), func(t *testing.T) {
t.Parallel()
@@ -146,3 +156,40 @@ func CheckQuerySnapshots(t *testing.T, setup TemplateTestSetup) {
})
}
}
func ensureAllTemplatesHaveTestCases(t *testing.T, setup TemplateTestSetup) {
t.Helper()
// Folder containing SQL query templates
sqlFiles := make([]string, 0, len(setup.Templates))
err := fs.WalkDir(setup.SQLTemplatesFS, ".", func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
if d.IsDir() {
return nil
}
if name := d.Name(); strings.HasSuffix(name, ".sql") {
sqlFiles = append(sqlFiles, name)
}
return nil
})
require.NoError(t, err)
// Makes sure all SQL files in the folder have a test-case
for _, file := range sqlFiles {
found := false
for template := range setup.Templates {
if template.Name() == file {
found = true
break
}
}
assert.True(t, found, "File '%s' does not have a test case", file)
}
}
@@ -0,0 +1,6 @@
SELECT
`resource_version`,
`group`,
`resource`
FROM `resource_version`
;
@@ -0,0 +1,6 @@
SELECT
"resource_version",
"group",
"resource"
FROM "resource_version"
;
@@ -0,0 +1,6 @@
SELECT
"resource_version",
"group",
"resource"
FROM "resource_version"
;