From 54e60b113e80405aca19835c8fcf24c4bd991e54 Mon Sep 17 00:00:00 2001 From: Nick Dumas Date: Tue, 13 Jun 2023 10:26:33 -0400 Subject: [PATCH] also working on unit tests --- validate.go | 36 +++++++++++++++++++++--------------- validate_test.go | 5 ++++- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/validate.go b/validate.go index 5c574b2..da19887 100644 --- a/validate.go +++ b/validate.go @@ -2,6 +2,7 @@ package obp import ( "encoding/json" + "errors" "fmt" "io" @@ -10,35 +11,39 @@ import ( "gopkg.in/yaml.v3" ) +var ( + ErrUnsupportedOutputFormat = errors.New("unspported output format") +) + // Validate accepts a Markdown file as input via the Reader // and parses the frontmatter present, if any. It then // applies the schema fetched from schemaURL against the // decoded YAML. func Validate(schemaURL string, r io.Reader) error { - var m interface{} + var frontmatter interface{} dec := yaml.NewDecoder(r) - err := dec.Decode(&m) + + err := dec.Decode(&frontmatter) if err != nil { return fmt.Errorf("error decoding YAML: %w", err) } compiler := jsonschema.NewCompiler() + schema, err := compiler.Compile(schemaURL) if err != nil { return fmt.Errorf("error compiling schema: %w", err) } - if err := schema.Validate(m); err != nil { - return err - } - return nil + return schema.Validate(frontmatter) } func recurseDetails(detailed jsonschema.Detailed, acc map[string]jsonschema.Detailed) map[string]jsonschema.Detailed { if detailed.Error != "" { acc[detailed.AbsoluteKeywordLocation] = detailed } + for _, e := range detailed.Errors { acc = recurseDetails(e, acc) } @@ -49,29 +54,30 @@ func recurseDetails(detailed jsonschema.Detailed, acc map[string]jsonschema.Deta // PrettyDetails takes error output from jsonschema.Validate // and pretty-prints it to stdout. // -// Supported formats are: JSON, Markdown -func PrettyDetails(w io.Writer, format string, details jsonschema.Detailed, filename string) error { +// Supported formats are: JSON, Markdown. +func PrettyDetails(writer io.Writer, format string, details jsonschema.Detailed, filename string) error { // acc := make([]jsonschema.Detailed, 0) acc := make(map[string]jsonschema.Detailed) errors := recurseDetails(details, acc) switch format { case "json": - enc := json.NewEncoder(w) + enc := json.NewEncoder(writer) + err := enc.Encode(details) if err != nil { return fmt.Errorf("error writing JSON payload to provided writer: %w", err) } case "markdown": - fmt.Fprintf(w, "# Validation Errors for %q\n", filename) - fmt.Fprintf(w, "Validation Rule|Failing Property|Error\n") - fmt.Fprintf(w, "--|---|---\n") + fmt.Fprintf(writer, "# Validation Errors for %q\n", filename) + fmt.Fprintf(writer, "Validation Rule|Failing Property|Error\n") + fmt.Fprintf(writer, "--|---|---\n") + for _, e := range errors { - fmt.Fprintf(w, "%s|%s|%s\n", e.KeywordLocation, e.InstanceLocation, e.Error) + fmt.Fprintf(writer, "%s|%s|%s\n", e.KeywordLocation, e.InstanceLocation, e.Error) } default: - return fmt.Errorf("unknown format") - + return ErrUnsupportedOutputFormat } return nil diff --git a/validate_test.go b/validate_test.go index af86e6b..cd57bcc 100644 --- a/validate_test.go +++ b/validate_test.go @@ -1,15 +1,18 @@ -package obp +package obp_test import ( "testing" ) func Test_BasicValidation(t *testing.T) { + t.Parallel() t.Run("KeyMissing", func(t *testing.T) { + t.Parallel() t.Fail() }) t.Run("KeyTypeMismatch", func(t *testing.T) { + t.Parallel() t.Fail() }) }