json_schema_test.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package main
  2. import (
  3. "encoding/json"
  4. "io/fs"
  5. "os"
  6. "path/filepath"
  7. "testing"
  8. "github.com/xeipuuv/gojsonschema"
  9. )
  10. type conf struct {
  11. Version string `json:"version"`
  12. }
  13. func loadSchema(t *testing.T, path string) *gojsonschema.Schema {
  14. t.Helper()
  15. schemaBytes, err := os.ReadFile(path)
  16. if err != nil {
  17. t.Fatal(err)
  18. }
  19. loader := gojsonschema.NewStringLoader(string(schemaBytes))
  20. schema, err := gojsonschema.NewSchema(loader)
  21. if err != nil {
  22. t.Fatalf("invalid schema: %s", err)
  23. }
  24. return schema
  25. }
  26. func TestJsonSchema(t *testing.T) {
  27. t.Parallel()
  28. schemaOne := loadSchema(t, filepath.Join("..", "config", "v_one.json"))
  29. schemaTwo := loadSchema(t, filepath.Join("..", "config", "v_two.json"))
  30. srcs := []string{
  31. filepath.Join("..", "..", "examples"),
  32. filepath.Join("testdata"),
  33. }
  34. for _, dir := range srcs {
  35. err := filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error {
  36. if err != nil {
  37. return err
  38. }
  39. if filepath.Base(path) != "sqlc.json" {
  40. return nil
  41. }
  42. t.Run(path, func(t *testing.T) {
  43. t.Parallel()
  44. contents, err := os.ReadFile(path)
  45. if err != nil {
  46. t.Fatal(err)
  47. }
  48. var c conf
  49. if err := json.Unmarshal(contents, &c); err != nil {
  50. t.Fatal(err)
  51. }
  52. l := gojsonschema.NewStringLoader(string(contents))
  53. switch c.Version {
  54. case "1":
  55. if _, err := schemaOne.Validate(l); err != nil {
  56. t.Fatal(err)
  57. }
  58. case "2":
  59. if _, err := schemaTwo.Validate(l); err != nil {
  60. t.Fatal(err)
  61. }
  62. default:
  63. t.Fatalf("unknown schema version: %s", c.Version)
  64. }
  65. })
  66. return nil
  67. })
  68. if err != nil {
  69. t.Error(err)
  70. }
  71. }
  72. }