diff --git a/load/load.go b/load/load.go index 768e6df9..7d52d7ee 100644 --- a/load/load.go +++ b/load/load.go @@ -14,8 +14,8 @@ type Loader interface { LoadFromStdin() (*openapi3.T, error) } -// From is a convenience function that opens an OpenAPI spec from a URL or a local path based on the format of the path parameter -func From(loader Loader, source *Source) (*openapi3.T, error) { +// from is a convenience function that opens an OpenAPI spec from a URL or a local path based on the format of the path parameter +func from(loader Loader, source *Source) (*openapi3.T, error) { switch source.Type { case SourceTypeStdin: diff --git a/load/load_test.go b/load/load_test.go deleted file mode 100644 index 43b7ccf0..00000000 --- a/load/load_test.go +++ /dev/null @@ -1,96 +0,0 @@ -package load_test - -import ( - "log" - "net/url" - "os" - "testing" - - "github.com/getkin/kin-openapi/openapi3" - "github.com/stretchr/testify/require" - "github.com/tufin/oasdiff/load" -) - -func (mockLoader MockLoader) LoadFromFile(path string) (*openapi3.T, error) { - return openapi3.NewLoader().LoadFromFile(path) -} - -func (mockLoader MockLoader) LoadFromURI(location *url.URL) (*openapi3.T, error) { - return openapi3.NewLoader().LoadFromFile(".." + location.Path) -} - -func (mockLoader MockLoader) LoadFromStdin() (*openapi3.T, error) { - return openapi3.NewLoader().LoadFromStdin() -} - -type MockLoader struct{} - -func TestLoad_File(t *testing.T) { - _, err := load.From(MockLoader{}, load.NewSource("../data/openapi-test1.yaml")) - require.NoError(t, err) -} - -func TestLoad_FileWindows(t *testing.T) { - _, err := load.From(MockLoader{}, load.NewSource(`C:\dev\OpenApi\spec2.yaml`)) - require.Condition(t, func() (success bool) { - return err.Error() == "open C:\\dev\\OpenApi\\spec2.yaml: no such file or directory" || - err.Error() == "open C:/dev/OpenApi/spec2.yaml: The system cannot find the path specified." - }) -} - -func TestLoad_URI(t *testing.T) { - _, err := load.From(MockLoader{}, load.NewSource("https://localhost/data/openapi-test1.yaml")) - require.NoError(t, err) -} - -func TestLoad_URIError(t *testing.T) { - _, err := load.From(MockLoader{}, load.NewSource("http://localhost/null")) - require.Condition(t, func() (success bool) { - return err.Error() == "open ../null: no such file or directory" || - err.Error() == "open ../null: The system cannot find the file specified." - }) -} - -func TestLoad_URIBadScheme(t *testing.T) { - _, err := load.From(MockLoader{}, load.NewSource("ftp://localhost/null")) - require.Condition(t, func() (success bool) { - return err.Error() == "open ftp://localhost/null: no such file or directory" || - err.Error() == "open ftp://localhost/null: The filename, directory name, or volume label syntax is incorrect." - }) -} - -func TestLoad_Stdin(t *testing.T) { - content := []byte(`openapi: 3.0.1 -info: - title: Test API - version: v1 -paths: - /partner-api/test/some-method: - get: - responses: - "200": - description: Success -`) - - tmpfile, err := os.CreateTemp("", "example") - if err != nil { - log.Fatal(err) - } - - defer os.Remove(tmpfile.Name()) // clean up - - if _, err := tmpfile.Write(content); err != nil { - log.Fatal(err) - } - - if _, err := tmpfile.Seek(0, 0); err != nil { - log.Fatal(err) - } - - oldStdin := os.Stdin - defer func() { os.Stdin = oldStdin }() // Restore original Stdin - - os.Stdin = tmpfile - _, err = load.From(MockLoader{}, load.NewSource("-")) - require.NoError(t, err) -} diff --git a/load/mock_loader_test.go b/load/mock_loader_test.go new file mode 100644 index 00000000..884cd32e --- /dev/null +++ b/load/mock_loader_test.go @@ -0,0 +1,21 @@ +package load_test + +import ( + "net/url" + + "github.com/getkin/kin-openapi/openapi3" +) + +func (mockLoader MockLoader) LoadFromFile(path string) (*openapi3.T, error) { + return openapi3.NewLoader().LoadFromFile(path) +} + +func (mockLoader MockLoader) LoadFromURI(location *url.URL) (*openapi3.T, error) { + return openapi3.NewLoader().LoadFromFile(".." + location.Path) +} + +func (mockLoader MockLoader) LoadFromStdin() (*openapi3.T, error) { + return openapi3.NewLoader().LoadFromStdin() +} + +type MockLoader struct{} diff --git a/load/spec_info.go b/load/spec_info.go index 232cf8ab..868b1baa 100644 --- a/load/spec_info.go +++ b/load/spec_info.go @@ -40,7 +40,7 @@ func getVersion(spec *openapi3.T) string { // LoadSpecInfo creates a SpecInfo from a local file path, a URL, or stdin func LoadSpecInfo(loader Loader, source *Source) (*SpecInfo, error) { - s, err := From(loader, source) + s, err := from(loader, source) if err != nil { return nil, err } diff --git a/load/spec_info_test.go b/load/spec_info_test.go index 7f408522..9a02743c 100644 --- a/load/spec_info_test.go +++ b/load/spec_info_test.go @@ -1,17 +1,118 @@ package load_test import ( + "log" + "os" "testing" "github.com/stretchr/testify/require" "github.com/tufin/oasdiff/load" ) -func TestSpecInfo(t *testing.T) { +func TestSpecInfo_File(t *testing.T) { _, err := load.LoadSpecInfo(MockLoader{}, load.NewSource("../data/openapi-test1.yaml")) require.NoError(t, err) } +func TestLoadInfo_FileWindows(t *testing.T) { + _, err := load.LoadSpecInfo(MockLoader{}, load.NewSource(`C:\dev\OpenApi\spec2.yaml`)) + require.Condition(t, func() (success bool) { + return err.Error() == "open C:\\dev\\OpenApi\\spec2.yaml: no such file or directory" || + err.Error() == "open C:/dev/OpenApi/spec2.yaml: The system cannot find the path specified." + }) +} + +func TestLoadInfo_URI(t *testing.T) { + _, err := load.LoadSpecInfo(MockLoader{}, load.NewSource("https://localhost/data/openapi-test1.yaml")) + require.NoError(t, err) +} + +func TestLoadInfo_UriInvalid(t *testing.T) { + _, err := load.LoadSpecInfo(MockLoader{}, load.NewSource("http://localhost/null")) + require.Condition(t, func() (success bool) { + return err.Error() == "open ../null: no such file or directory" || + err.Error() == "open ../null: The system cannot find the file specified." + }) +} + +func TestLoadInfo_UriBadScheme(t *testing.T) { + _, err := load.LoadSpecInfo(MockLoader{}, load.NewSource("ftp://localhost/null")) + require.Condition(t, func() (success bool) { + return err.Error() == "open ftp://localhost/null: no such file or directory" || + err.Error() == "open ftp://localhost/null: The filename, directory name, or volume label syntax is incorrect." + }) +} + +func TestLoadInfo_Stdin(t *testing.T) { + content := []byte(`openapi: 3.0.1 +info: + title: Test API + version: v1 +paths: + /partner-api/test/some-method: + get: + responses: + "200": + description: Success +`) + + tmpfile, err := os.CreateTemp("", "example") + if err != nil { + log.Fatal(err) + } + + defer os.Remove(tmpfile.Name()) // clean up + + if _, err := tmpfile.Write(content); err != nil { + log.Fatal(err) + } + + if _, err := tmpfile.Seek(0, 0); err != nil { + log.Fatal(err) + } + + oldStdin := os.Stdin + defer func() { os.Stdin = oldStdin }() // Restore original Stdin + + os.Stdin = tmpfile + _, err = load.LoadSpecInfo(MockLoader{}, load.NewSource("-")) + require.NoError(t, err) +} + +func TestLoadInfo_NoVersion(t *testing.T) { + content := []byte(`openapi: 3.0.1 +paths: + /partner-api/test/some-method: + get: + responses: + "200": + description: Success +`) + + tmpfile, err := os.CreateTemp("", "example") + if err != nil { + log.Fatal(err) + } + + defer os.Remove(tmpfile.Name()) // clean up + + if _, err := tmpfile.Write(content); err != nil { + log.Fatal(err) + } + + if _, err := tmpfile.Seek(0, 0); err != nil { + log.Fatal(err) + } + + oldStdin := os.Stdin + defer func() { os.Stdin = oldStdin }() // Restore original Stdin + + os.Stdin = tmpfile + specInfo, err := load.LoadSpecInfo(MockLoader{}, load.NewSource("-")) + require.NoError(t, err) + require.Empty(t, specInfo.Version) +} + func TestSpecInfo_GlobOK(t *testing.T) { _, err := load.FromGlob(MockLoader{}, "../data/*.yaml") require.NoError(t, err)