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:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
SELECT
|
||||
`resource_version`,
|
||||
`group`,
|
||||
`resource`
|
||||
FROM `resource_version`
|
||||
;
|
||||
Vendored
Executable
+6
@@ -0,0 +1,6 @@
|
||||
SELECT
|
||||
"resource_version",
|
||||
"group",
|
||||
"resource"
|
||||
FROM "resource_version"
|
||||
;
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
SELECT
|
||||
"resource_version",
|
||||
"group",
|
||||
"resource"
|
||||
FROM "resource_version"
|
||||
;
|
||||
Reference in New Issue
Block a user