Skip to content

Commit

Permalink
improve error wrapping
Browse files Browse the repository at this point in the history
  • Loading branch information
Reuven committed Feb 28, 2024
1 parent 1d9342c commit 481c337
Show file tree
Hide file tree
Showing 10 changed files with 34 additions and 24 deletions.
2 changes: 1 addition & 1 deletion diff/diff_error_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -240,5 +240,5 @@ func TestDiff_ComponentCallbacksNil(t *testing.T) {

func TestFilterByRegex_Invalid(t *testing.T) {
_, err := diff.Get(&diff.Config{PathFilter: "["}, l(t, 1), l(t, 2))
require.EqualError(t, err, "failed to compile filter regex \"[\" with error parsing regexp: missing closing ]: `[`")
require.EqualError(t, err, "failed to compile filter regex \"[\": error parsing regexp: missing closing ]: `[`")
}
8 changes: 4 additions & 4 deletions diff/example_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@ func ExampleGet() {

s1, err := loader.LoadFromFile("../data/simple1.yaml")
if err != nil {
fmt.Fprintf(os.Stderr, "failed to load spec with %v", err)
fmt.Fprintf(os.Stderr, "failed to load spec: %v", err)
return
}

s2, err := loader.LoadFromFile("../data/simple2.yaml")
if err != nil {
fmt.Fprintf(os.Stderr, "failed to load spec with %v", err)
fmt.Fprintf(os.Stderr, "failed to load spec: %v", err)
return
}

Expand Down Expand Up @@ -66,13 +66,13 @@ func ExampleGetPathsDiff() {

s1, err := load.NewSpecInfo(loader, load.NewSource("../data/openapi-test1.yaml"))
if err != nil {
fmt.Fprintf(os.Stderr, "failed to load spec with %v", err)
fmt.Fprintf(os.Stderr, "failed to load spec: %v", err)
return
}

s2, err := load.NewSpecInfo(loader, load.NewSource("../data/openapi-test3.yaml"))
if err != nil {
fmt.Fprintf(os.Stderr, "failed to load spec with %v", err)
fmt.Fprintf(os.Stderr, "failed to load spec: %v", err)
return
}

Expand Down
2 changes: 1 addition & 1 deletion diff/operations_diff.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ func filterOperationsByExtensions(filterExtension string, pathItemPair *pathItem

r, err := regexp.Compile(filterExtension)
if err != nil {
return fmt.Errorf("failed to compile extension filter regex %q with %w", filterExtension, err)
return fmt.Errorf("failed to compile extension filter regex %q: %w", filterExtension, err)
}

filterOperationsByExtensionInternal(pathItemPair.PathItem1, r)
Expand Down
4 changes: 2 additions & 2 deletions diff/paths_diff.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ func filterPathsByName(filter string, paths1, paths2 *openapi3.Paths) error {

r, err := regexp.Compile(filter)
if err != nil {
return fmt.Errorf("failed to compile filter regex %q with %w", filter, err)
return fmt.Errorf("failed to compile filter regex %q: %w", filter, err)
}

filterPathsInternal(paths1, r)
Expand All @@ -147,7 +147,7 @@ func filterPathsByExtensions(filterExtension string, paths1, paths2 *openapi3.Pa

r, err := regexp.Compile(filterExtension)
if err != nil {
return fmt.Errorf("failed to compile extension filter regex %q with %w", filterExtension, err)
return fmt.Errorf("failed to compile extension filter regex %q: %w", filterExtension, err)
}

filterPathsByExtensionInternal(paths1, r)
Expand Down
2 changes: 1 addition & 1 deletion flatten/allof/merge_allof_spec_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,5 @@ func Test_MergeSpecOK(t *testing.T) {

func Test_MergeSpecInvalid(t *testing.T) {
_, err := load.NewSpecInfo(openapi3.NewLoader(), load.NewSource("../../data/allof/invalid.yaml"), load.WithFlattenAllOf())
require.EqualError(t, err, "unable to resolve Type conflict: all Type values must be identical")
require.EqualError(t, err, "failed to flatten allOf in \"../../data/allof/invalid.yaml\": unable to resolve Type conflict: all Type values must be identical")
}
10 changes: 5 additions & 5 deletions internal/errors.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,28 +22,28 @@ func getErrInvalidFlags(err error) *ReturnError {

func getErrFailedToLoadSpec(what string, source *load.Source, err error) *ReturnError {
return getError(
fmt.Errorf("failed to load %s spec from %s with %v", what, source.Out(), err),
fmt.Errorf("failed to load %s spec from %s: %w", what, source.Out(), err),
102,
)
}

func getErrFailedToLoadSpecs(what string, path string, err error) *ReturnError {
return getError(
fmt.Errorf("failed to load %s specs from glob %q with %v", what, path, err),
fmt.Errorf("failed to load %s specs from glob %q: %w", what, path, err),
103,
)
}

func getErrDiffFailed(err error) *ReturnError {
return getError(
fmt.Errorf("diff failed with %v", err),
fmt.Errorf("diff failed: %w", err),
104,
)
}

func getErrFailedPrint(what string, err error) *ReturnError {
return getError(
fmt.Errorf("failed to print %q with %v", what, err),
fmt.Errorf("failed to print %q: %w", what, err),
105,
)
}
Expand Down Expand Up @@ -92,7 +92,7 @@ func getErrInvalidColorMode(err error) *ReturnError {

func getErrCantProcessIgnoreFile(what string, err error) *ReturnError {
return getError(
fmt.Errorf("can't process %s ignore file %v", what, err),
fmt.Errorf("can't process %s ignore file: %w", what, err),
121,
)
}
Expand Down
21 changes: 14 additions & 7 deletions internal/run_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,27 +78,27 @@ func Test_InvalidFile(t *testing.T) {
var stderr bytes.Buffer
require.Equal(t, 102, internal.Run(cmdToArgs("oasdiff diff no-file ../data/openapi-test3.yaml"), io.Discard, &stderr))
require.Condition(t, func() (success bool) {
return stderr.String() == "Error: failed to load base spec from \"no-file\" with open no-file: no such file or directory\n" ||
stderr.String() == "Error: failed to load base spec from \"no-file\" with open no-file: The system cannot find the file specified.\n" // windows
})
return stderr.String() == "Error: failed to load base spec from \"no-file\": open no-file: no such file or directory\n" ||
stderr.String() == "Error: failed to load base spec from \"no-file\": open no-file: The system cannot find the file specified.\n" // windows
}, stderr.String())
}

func Test_InvalidGlob(t *testing.T) {
var stderr bytes.Buffer
require.Equal(t, 103, internal.Run(cmdToArgs(`oasdiff diff -c "a[" ../data/openapi-test3.yaml`), io.Discard, &stderr))
require.Equal(t, "Error: failed to load base specs from glob \"\\\"a[\\\"\" with syntax error in pattern\n", stderr.String())
require.Equal(t, "Error: failed to load base specs from glob \"\\\"a[\\\"\": syntax error in pattern\n", stderr.String())
}

func Test_GlobNoFiles(t *testing.T) {
var stderr bytes.Buffer
require.Equal(t, 103, internal.Run(cmdToArgs("oasdiff diff -c no-file ../data/openapi-test3.yaml"), io.Discard, &stderr))
require.Equal(t, "Error: failed to load base specs from glob \"no-file\" with no matching files\n", stderr.String())
require.Equal(t, "Error: failed to load base specs from glob \"no-file\": no matching files\n", stderr.String())
}

func Test_GlobWithUrl(t *testing.T) {
var stderr bytes.Buffer
require.Equal(t, 103, internal.Run(cmdToArgs("oasdiff diff -c ../data/openapi-test1.yaml https://"), io.Discard, &stderr))
require.Equal(t, "Error: failed to load revision specs from glob \"https://\" with no matching files (should be a glob, not a URL)\n", stderr.String())
require.Equal(t, "Error: failed to load revision specs from glob \"https://\": no matching files (should be a glob, not a URL)\n", stderr.String())
}

func Test_DiffInvalidFormat(t *testing.T) {
Expand Down Expand Up @@ -202,6 +202,13 @@ func Test_ComposedMode(t *testing.T) {
require.Equal(t, map[string]interface{}{"paths": map[string]interface{}{"deleted": []interface{}{"/api/old-test"}}}, bc)
}

func Test_ComposedModeInvalidFile(t *testing.T) {
var stderr bytes.Buffer
require.Equal(t, 103, internal.Run(cmdToArgs("oasdiff diff ../data/allof/* ../data/allof/* --composed --flatten"), io.Discard, &stderr))
require.Equal(t, `Error: failed to load base specs from glob "../data/allof/*": failed to flatten allOf in "../data/allof/invalid.yaml": unable to resolve Type conflict: all Type values must be identical
`, stderr.String())
}

func Test_Help(t *testing.T) {
var stdout bytes.Buffer
require.Zero(t, internal.Run(cmdToArgs("oasdiff --help"), &stdout, io.Discard))
Expand Down Expand Up @@ -285,7 +292,7 @@ func Test_FlattenCmdOK(t *testing.T) {
func Test_FlattenCmdInvalid(t *testing.T) {
var stderr bytes.Buffer
require.Equal(t, 102, internal.Run(cmdToArgs("oasdiff flatten ../data/allof/invalid.yaml"), io.Discard, &stderr))
require.Equal(t, `Error: failed to load original spec from "../data/allof/invalid.yaml" with unable to resolve Type conflict: all Type values must be identical
require.Equal(t, `Error: failed to load original spec from "../data/allof/invalid.yaml": failed to flatten allOf in "../data/allof/invalid.yaml": unable to resolve Type conflict: all Type values must be identical
`, stderr.String())
}

Expand Down
4 changes: 3 additions & 1 deletion load/option.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package load

import (
"fmt"

"github.com/tufin/oasdiff/flatten/allof"
"github.com/tufin/oasdiff/flatten/commonparams"
"github.com/tufin/oasdiff/flatten/headers"
Expand Down Expand Up @@ -30,7 +32,7 @@ func WithFlattenAllOf() Option {
var err error
for _, specInfo := range specInfos {
if specInfo.Spec, err = allof.MergeSpec(specInfo.Spec); err != nil {
return nil, err
return nil, fmt.Errorf("failed to flatten allOf in %q: %w", specInfo.Url, err)
}
}
return specInfos, nil
Expand Down
3 changes: 2 additions & 1 deletion load/spec_info.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package load

import (
"errors"
"fmt"
"net/url"

"github.com/getkin/kin-openapi/openapi3"
Expand Down Expand Up @@ -86,7 +87,7 @@ func fromGlob(loader Loader, glob string) ([]*SpecInfo, error) {
for _, file := range files {
spec, err := loader.LoadFromFile(file)
if err != nil {
return nil, err
return nil, fmt.Errorf("failed to load %q: %w", file, err)
}
result = append(result, &SpecInfo{Url: file, Spec: spec})
}
Expand Down
2 changes: 1 addition & 1 deletion load/spec_info_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ func TestSpecInfo_GlobOK(t *testing.T) {

func TestSpecInfo_InvalidSpec(t *testing.T) {
_, err := load.NewSpecInfoFromGlob(MockLoader{}, "../data/ignore-err-example.txt")
require.EqualError(t, err, "error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string into Go value of type openapi3.TBis")
require.EqualError(t, err, "failed to load \"../data/ignore-err-example.txt\": error unmarshaling JSON: while decoding JSON: json: cannot unmarshal string into Go value of type openapi3.TBis")
}

func TestSpecInfo_InvalidGlob(t *testing.T) {
Expand Down

0 comments on commit 481c337

Please sign in to comment.