116 lines
2.5 KiB
Go
116 lines
2.5 KiB
Go
package test
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"io/fs"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/santhosh-tekuri/jsonschema/v5"
|
|
"github.com/stretchr/testify/require"
|
|
"gopkg.in/yaml.v3"
|
|
)
|
|
|
|
func Test_validateTestConfigurationFiles(t *testing.T) {
|
|
err := validateTestConfigurationFiles("../jsonschema/golangci.next.jsonschema.json", ".")
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func validateTestConfigurationFiles(schemaPath, targetDir string) error {
|
|
schema, err := loadSchema(filepath.FromSlash(schemaPath))
|
|
if err != nil {
|
|
return fmt.Errorf("load schema: %w", err)
|
|
}
|
|
|
|
yamlFiles, err := findConfigurationFiles(filepath.FromSlash(targetDir))
|
|
if err != nil {
|
|
return fmt.Errorf("find configuration files: %w", err)
|
|
}
|
|
|
|
var errAll error
|
|
for _, filename := range yamlFiles {
|
|
// internal tests
|
|
if filename == filepath.FromSlash("testdata/withconfig/.golangci.yml") {
|
|
continue
|
|
}
|
|
|
|
m, err := decodeYamlFile(filename)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = schema.Validate(m)
|
|
if err != nil {
|
|
abs, _ := filepath.Abs(filename)
|
|
errAll = errors.Join(errAll, fmt.Errorf("%s: %w", abs, err))
|
|
}
|
|
}
|
|
|
|
return errAll
|
|
}
|
|
|
|
func loadSchema(schemaPath string) (*jsonschema.Schema, error) {
|
|
compiler := jsonschema.NewCompiler()
|
|
compiler.Draft = jsonschema.Draft7
|
|
|
|
schemaFile, err := os.Open(schemaPath)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("open schema file: %w", err)
|
|
}
|
|
|
|
defer func() { _ = schemaFile.Close() }()
|
|
|
|
err = compiler.AddResource(filepath.Base(schemaPath), schemaFile)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("add schema resource: %w", err)
|
|
}
|
|
|
|
schema, err := compiler.Compile(filepath.Base(schemaPath))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("compile schema: %w", err)
|
|
}
|
|
|
|
return schema, nil
|
|
}
|
|
|
|
func findConfigurationFiles(targetDir string) ([]string, error) {
|
|
var yamlFiles []string
|
|
|
|
err := filepath.WalkDir(targetDir, func(path string, d fs.DirEntry, err error) error {
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if !d.IsDir() && (strings.EqualFold(filepath.Ext(d.Name()), ".yml") || strings.EqualFold(filepath.Ext(d.Name()), ".yaml")) {
|
|
yamlFiles = append(yamlFiles, path)
|
|
}
|
|
|
|
return nil
|
|
})
|
|
if err != nil {
|
|
return nil, fmt.Errorf("walk dir: %w", err)
|
|
}
|
|
|
|
return yamlFiles, nil
|
|
}
|
|
|
|
func decodeYamlFile(filename string) (any, error) {
|
|
yamlFile, err := os.Open(filename)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("[%s] file open: %w", filename, err)
|
|
}
|
|
|
|
defer func() { _ = yamlFile.Close() }()
|
|
|
|
var m any
|
|
err = yaml.NewDecoder(yamlFile).Decode(&m)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("[%s] yaml decode: %w", filename, err)
|
|
}
|
|
|
|
return m, nil
|
|
}
|