mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2025-01-11 09:59:59 +08:00
187 lines
4.1 KiB
Go
187 lines
4.1 KiB
Go
package octoyaml
|
|
|
|
/*
|
|
|
|
Test
|
|
DSL -> yaml
|
|
YAML -> JSON
|
|
|
|
001-test.js
|
|
001-test.yaml
|
|
001-test.json
|
|
*/
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
"testing"
|
|
"unicode"
|
|
|
|
testifyrequire "github.com/stretchr/testify/require"
|
|
"github.com/tdewolff/minify/v2"
|
|
minjson "github.com/tdewolff/minify/v2/json"
|
|
)
|
|
|
|
const (
|
|
testDir = "octodns/octoyaml/parse_tests"
|
|
errorDir = "octodns/octoyaml/error_tests"
|
|
)
|
|
|
|
func init() {
|
|
os.Chdir("../..") // go up a directory so we helpers.js is in a consistent place.
|
|
}
|
|
|
|
func TestYamlWrite(t *testing.T) {
|
|
|
|
// Read a .JS and make sure we can generate the expected YAML.
|
|
|
|
files, err := ioutil.ReadDir(testDir)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for _, f := range files {
|
|
|
|
// Run JS -> conf
|
|
|
|
// run all js files that start with a number. Skip others.
|
|
if filepath.Ext(f.Name()) != ".js" || !unicode.IsNumber(rune(f.Name()[0])) {
|
|
continue
|
|
}
|
|
|
|
m := minify.New()
|
|
m.AddFunc("json", minjson.Minify)
|
|
|
|
t.Run(f.Name(), func(t *testing.T) {
|
|
fname := filepath.Join(testDir, f.Name())
|
|
fmt.Printf("Filename: %v\n", fname)
|
|
content, err := ioutil.ReadFile(fname)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
conf, err := ExecuteJavascript(string(content), true)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
basename := f.Name()[:len(f.Name())-3] // Remove ".js"
|
|
|
|
// Run conf -> YAML
|
|
|
|
actualYAML := bytes.NewBuffer([]byte{})
|
|
dom := conf.FindDomain("example.tld")
|
|
if dom == nil {
|
|
panic(fmt.Sprintf("FILE %s does not mention domain '%s'", f.Name(), "example.tld"))
|
|
}
|
|
|
|
err = WriteYaml(actualYAML, conf.FindDomain("example.tld").Records, "example.tld")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// Read expected YAML
|
|
|
|
expectedFile := filepath.Join(testDir, basename+".yaml")
|
|
expectedData, err := ioutil.ReadFile(expectedFile)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
expectedYAML := expectedData
|
|
|
|
// Compare YAML and expectedData
|
|
|
|
if string(expectedYAML) != actualYAML.String() {
|
|
t.Error("Expected and actual YAML don't match")
|
|
t.Log("Expected:", string(expectedYAML))
|
|
t.Log("Actual :", actualYAML.String())
|
|
}
|
|
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestYamlRead(t *testing.T) {
|
|
|
|
// Read a .YAML and make sure it matches the RecordConfig (.JSON).
|
|
|
|
minifyFlag := true
|
|
|
|
files, err := ioutil.ReadDir(testDir)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for _, f := range files {
|
|
// run all yaml files that start with a number. Skip others.
|
|
if filepath.Ext(f.Name()) != ".yaml" || !unicode.IsNumber(rune(f.Name()[0])) {
|
|
continue
|
|
}
|
|
basename := f.Name()[:len(f.Name())-5] // remove ".yaml"
|
|
|
|
m := minify.New()
|
|
m.AddFunc("json", minjson.Minify)
|
|
|
|
t.Run(f.Name(), func(t *testing.T) {
|
|
|
|
// Parse YAML
|
|
|
|
content, err := ioutil.ReadFile(filepath.Join(testDir, f.Name()))
|
|
if err != nil {
|
|
if os.IsNotExist(err) {
|
|
content = nil
|
|
} else {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
recs, err := ReadYaml(bytes.NewBufferString(string(content)), "example.tld")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
//fmt.Printf("DEBUG: CONTENT=%s\n", string(content))
|
|
//fmt.Printf("DEBUG: RECS=%v\n", recs)
|
|
|
|
// YAML -> JSON
|
|
|
|
actualJSON, err := json.MarshalIndent(recs, "", " ")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if minifyFlag {
|
|
// fmt.Printf("DEBUG: actualJSON-full: %s\n", actualJSON)
|
|
actualJSON, err = m.Bytes("json", actualJSON)
|
|
}
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
// fmt.Printf("DEBUG: actualJSON-mini: %s\n", actualJSON)
|
|
|
|
// Read expected JSON
|
|
expectedFile := filepath.Join(testDir, basename+".json")
|
|
expectedData, err := ioutil.ReadFile(expectedFile)
|
|
if err != nil {
|
|
if os.IsNotExist(err) {
|
|
fmt.Println("SKIPPING")
|
|
t.Log("Skipping (no .json)")
|
|
return
|
|
}
|
|
t.Fatal(err)
|
|
}
|
|
var expectedJSON string
|
|
if minifyFlag {
|
|
expectedJSON, err = m.String("json", string(expectedData))
|
|
} else {
|
|
expectedJSON = string(expectedData)
|
|
}
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
//fmt.Printf("DEBUG: EXPECTED=%s\n", string(expectedJSON))
|
|
//fmt.Printf("DEBUG: ACTUAL =%s\n", string(actualJSON))
|
|
|
|
es, as := string(expectedJSON), string(actualJSON)
|
|
testifyrequire.JSONEqf(t, es, as, "EXPECTING %q = \n```\n%s\n```", expectedFile, as)
|
|
})
|
|
}
|
|
}
|