From c582668c1dc5e7c30a8886ed16f94b0f7bea2c60 Mon Sep 17 00:00:00 2001 From: Reuven Harrison Date: Wed, 1 Nov 2023 11:35:56 +0200 Subject: [PATCH] improve coverage (#412) --- formatters/format_githubactions.go | 23 +------ formatters/format_githubactions_test.go | 43 +++++++++--- formatters/format_html.go | 23 +------ formatters/format_html_test.go | 39 +++++++++++ formatters/format_json_test.go | 82 ++++++++++++++++++++++ formatters/format_junit.go | 23 +------ formatters/format_junit_test.go | 31 +++++++-- formatters/format_text.go | 10 +-- formatters/format_text_test.go | 92 +++++++++++++++++++++++++ formatters/format_yaml_test.go | 82 ++++++++++++++++++++++ formatters/interface.go | 4 -- formatters/not_implemented.go | 39 +++++++++++ utils/circular_refs_test.go | 17 +++++ utils/path_test.go | 15 ++++ utils/string_list_test.go | 21 ++++++ utils/string_set_test.go | 12 ++++ 16 files changed, 461 insertions(+), 95 deletions(-) create mode 100644 formatters/format_html_test.go create mode 100644 formatters/format_json_test.go create mode 100644 formatters/format_text_test.go create mode 100644 formatters/format_yaml_test.go create mode 100644 formatters/not_implemented.go create mode 100644 utils/circular_refs_test.go create mode 100644 utils/path_test.go create mode 100644 utils/string_list_test.go diff --git a/formatters/format_githubactions.go b/formatters/format_githubactions.go index 3c4bb82a..b5767b94 100644 --- a/formatters/format_githubactions.go +++ b/formatters/format_githubactions.go @@ -7,9 +7,7 @@ import ( "strconv" "strings" - "github.com/getkin/kin-openapi/openapi3" "github.com/tufin/oasdiff/checker" - "github.com/tufin/oasdiff/diff" ) var githubActionsSeverity = map[checker.Level]string{ @@ -19,14 +17,7 @@ var githubActionsSeverity = map[checker.Level]string{ } type GitHubActionsFormatter struct { -} - -func (f GitHubActionsFormatter) RenderDiff(*diff.Diff, RenderOpts) ([]byte, error) { - return notImplemented() -} - -func (f GitHubActionsFormatter) RenderSummary(*diff.Diff, RenderOpts) ([]byte, error) { - return notImplemented() + notImplementedFormatter } func (f GitHubActionsFormatter) RenderBreakingChanges(changes checker.Changes, opts RenderOpts) ([]byte, error) { @@ -72,18 +63,6 @@ func (f GitHubActionsFormatter) RenderBreakingChanges(changes checker.Changes, o return buf.Bytes(), nil } -func (f GitHubActionsFormatter) RenderChangelog(checker.Changes, RenderOpts) ([]byte, error) { - return notImplemented() -} - -func (f GitHubActionsFormatter) RenderChecks([]Check, RenderOpts) ([]byte, error) { - return notImplemented() -} - -func (f GitHubActionsFormatter) RenderFlatten(*openapi3.T, RenderOpts) ([]byte, error) { - return notImplemented() -} - func (f GitHubActionsFormatter) SupportedOutputs() []Output { return []Output{OutputBreaking} } diff --git a/formatters/format_githubactions_test.go b/formatters/format_githubactions_test.go index cf59156e..4b560991 100644 --- a/formatters/format_githubactions_test.go +++ b/formatters/format_githubactions_test.go @@ -1,4 +1,4 @@ -package formatters +package formatters_test import ( "os" @@ -6,11 +6,12 @@ import ( "github.com/stretchr/testify/assert" "github.com/tufin/oasdiff/checker" + "github.com/tufin/oasdiff/formatters" ) func TestGitHubActionsFormatter_RenderBreakingChanges_OneFailure(t *testing.T) { // prepare formatter and test changes - formatter := GitHubActionsFormatter{} + formatter := formatters.GitHubActionsFormatter{} testChanges := checker.Changes{ checker.ComponentChange{ Id: "change_id", @@ -20,7 +21,7 @@ func TestGitHubActionsFormatter_RenderBreakingChanges_OneFailure(t *testing.T) { } // check output - output, err := formatter.RenderBreakingChanges(testChanges, RenderOpts{}) + output, err := formatter.RenderBreakingChanges(testChanges, formatters.RenderOpts{}) assert.NoError(t, err) expectedOutput := "::error title=change_id::This is a breaking change.\n" assert.Equal(t, expectedOutput, string(output)) @@ -28,7 +29,7 @@ func TestGitHubActionsFormatter_RenderBreakingChanges_OneFailure(t *testing.T) { func TestGitHubActionsFormatter_RenderBreakingChanges_MultipleLevels(t *testing.T) { // prepare formatter and test changes - formatter := GitHubActionsFormatter{} + formatter := formatters.GitHubActionsFormatter{} testChanges := checker.Changes{ checker.ComponentChange{ Id: "change_id", @@ -48,7 +49,7 @@ func TestGitHubActionsFormatter_RenderBreakingChanges_MultipleLevels(t *testing. } // check output - output, err := formatter.RenderBreakingChanges(testChanges, RenderOpts{}) + output, err := formatter.RenderBreakingChanges(testChanges, formatters.RenderOpts{}) assert.NoError(t, err) expectedOutput := "::error title=change_id::This is a breaking change.\n::warning title=change_id::This is a warning.\n::notice title=change_id::This is a notice.\n" assert.Equal(t, expectedOutput, string(output)) @@ -56,7 +57,7 @@ func TestGitHubActionsFormatter_RenderBreakingChanges_MultipleLevels(t *testing. func TestGitHubActionsFormatter_RenderBreakingChanges_MultilineText(t *testing.T) { // prepare formatter and test changes - formatter := GitHubActionsFormatter{} + formatter := formatters.GitHubActionsFormatter{} testChanges := checker.Changes{ checker.ComponentChange{ Id: "change_id", @@ -66,7 +67,7 @@ func TestGitHubActionsFormatter_RenderBreakingChanges_MultilineText(t *testing.T } // check output - output, err := formatter.RenderBreakingChanges(testChanges, RenderOpts{}) + output, err := formatter.RenderBreakingChanges(testChanges, formatters.RenderOpts{}) assert.NoError(t, err) expectedOutput := "::error title=change_id::This is a breaking change.%0AThis is a second line.\n" assert.Equal(t, expectedOutput, string(output)) @@ -74,7 +75,7 @@ func TestGitHubActionsFormatter_RenderBreakingChanges_MultilineText(t *testing.T func TestGitHubActionsFormatter_RenderBreakingChanges_FileLocation(t *testing.T) { // prepare formatter and test changes - formatter := GitHubActionsFormatter{} + formatter := formatters.GitHubActionsFormatter{} testChanges := checker.Changes{ checker.ComponentChange{ Id: "change_id", @@ -89,7 +90,7 @@ func TestGitHubActionsFormatter_RenderBreakingChanges_FileLocation(t *testing.T) } // check output - output, err := formatter.RenderBreakingChanges(testChanges, RenderOpts{}) + output, err := formatter.RenderBreakingChanges(testChanges, formatters.RenderOpts{}) assert.NoError(t, err) expectedOutput := "::error title=change_id,file=openapi.json,col=6,endColumn=11,line=21,endLine=26::This is a breaking change.\n" assert.Equal(t, expectedOutput, string(output)) @@ -103,7 +104,7 @@ func TestGitHubActionsFormatter_RenderBreakingChanges_JobOutputParameters(t *tes _ = os.Setenv("GITHUB_OUTPUT", tempFile.Name()) // prepare formatter and test changes - formatter := GitHubActionsFormatter{} + formatter := formatters.GitHubActionsFormatter{} testChanges := checker.Changes{ checker.ComponentChange{ Id: "change_id", @@ -128,7 +129,7 @@ func TestGitHubActionsFormatter_RenderBreakingChanges_JobOutputParameters(t *tes } // check output - output, err := formatter.RenderBreakingChanges(testChanges, RenderOpts{}) + output, err := formatter.RenderBreakingChanges(testChanges, formatters.RenderOpts{}) assert.NoError(t, err) _ = os.Unsetenv("GITHUB_OUTPUT") expectedOutput := "::error title=change_id::This is a breaking change.\n::error title=change_id::This is a second breaking change.\n::warning title=change_id::This is a warning.\n::notice title=change_id::This is a notice.\n" @@ -141,3 +142,23 @@ func TestGitHubActionsFormatter_RenderBreakingChanges_JobOutputParameters(t *tes assert.Contains(t, string(outputFile), "warning_count=1\n") assert.Contains(t, string(outputFile), "info_count=1\n") } + +func TestGitHubActionsFormatterr_NotImplemented(t *testing.T) { + formatter := formatters.GitHubActionsFormatter{} + + var err error + _, err = formatter.RenderDiff(nil, formatters.RenderOpts{}) + assert.Error(t, err) + + _, err = formatter.RenderSummary(nil, formatters.RenderOpts{}) + assert.Error(t, err) + + _, err = formatter.RenderChangelog(nil, formatters.RenderOpts{}) + assert.Error(t, err) + + _, err = formatter.RenderChecks(nil, formatters.RenderOpts{}) + assert.Error(t, err) + + _, err = formatter.RenderFlatten(nil, formatters.RenderOpts{}) + assert.Error(t, err) +} diff --git a/formatters/format_html.go b/formatters/format_html.go index 02fe97f7..5c697d51 100644 --- a/formatters/format_html.go +++ b/formatters/format_html.go @@ -3,13 +3,12 @@ package formatters import ( "fmt" - "github.com/getkin/kin-openapi/openapi3" - "github.com/tufin/oasdiff/checker" "github.com/tufin/oasdiff/diff" "github.com/tufin/oasdiff/report" ) type HTMLFormatter struct { + notImplementedFormatter } func (f HTMLFormatter) RenderDiff(diff *diff.Diff, opts RenderOpts) ([]byte, error) { @@ -21,26 +20,6 @@ func (f HTMLFormatter) RenderDiff(diff *diff.Diff, opts RenderOpts) ([]byte, err return []byte(reportAsString), nil } -func (f HTMLFormatter) RenderSummary(*diff.Diff, RenderOpts) ([]byte, error) { - return notImplemented() -} - -func (f HTMLFormatter) RenderBreakingChanges(checker.Changes, RenderOpts) ([]byte, error) { - return notImplemented() -} - -func (f HTMLFormatter) RenderChangelog(checker.Changes, RenderOpts) ([]byte, error) { - return notImplemented() -} - -func (f HTMLFormatter) RenderChecks([]Check, RenderOpts) ([]byte, error) { - return notImplemented() -} - -func (f HTMLFormatter) RenderFlatten(*openapi3.T, RenderOpts) ([]byte, error) { - return notImplemented() -} - func (f HTMLFormatter) SupportedOutputs() []Output { return []Output{OutputDiff} } diff --git a/formatters/format_html_test.go b/formatters/format_html_test.go new file mode 100644 index 00000000..a14a1abf --- /dev/null +++ b/formatters/format_html_test.go @@ -0,0 +1,39 @@ +package formatters_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/tufin/oasdiff/checker" + "github.com/tufin/oasdiff/formatters" +) + +func TestHtmlFormatter_RenderDiff(t *testing.T) { + formatter := formatters.HTMLFormatter{} + + out, err := formatter.RenderDiff(nil, formatters.RenderOpts{}) + require.NoError(t, err) + require.Equal(t, string(out), "

No changes

\n") + +} + +func TestHtmlFormatter_NotImplemented(t *testing.T) { + formatter := formatters.HTMLFormatter{} + + var err error + _, err = formatter.RenderBreakingChanges(checker.Changes{}, formatters.RenderOpts{}) + assert.Error(t, err) + + _, err = formatter.RenderChangelog(checker.Changes{}, formatters.RenderOpts{}) + assert.Error(t, err) + + _, err = formatter.RenderChecks([]formatters.Check{}, formatters.RenderOpts{}) + assert.Error(t, err) + + _, err = formatter.RenderFlatten(nil, formatters.RenderOpts{}) + assert.Error(t, err) + + _, err = formatter.RenderSummary(nil, formatters.RenderOpts{}) + assert.Error(t, err) +} diff --git a/formatters/format_json_test.go b/formatters/format_json_test.go new file mode 100644 index 00000000..896581ec --- /dev/null +++ b/formatters/format_json_test.go @@ -0,0 +1,82 @@ +package formatters_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + "github.com/tufin/oasdiff/checker" + "github.com/tufin/oasdiff/formatters" +) + +func TestJsonFormatter_RenderBreakingChanges(t *testing.T) { + formatter := formatters.JSONFormatter{} + + testChanges := checker.Changes{ + checker.ComponentChange{ + Id: "change_id", + Text: "This is a breaking change.", + Level: checker.ERR, + }, + } + + out, err := formatter.RenderBreakingChanges(testChanges, formatters.RenderOpts{}) + require.NoError(t, err) + require.Equal(t, string(out), "[{\"id\":\"change_id\",\"text\":\"This is a breaking change.\",\"level\":3}]") +} + +func TestJsonFormatter_RenderChangelog(t *testing.T) { + formatter := formatters.JSONFormatter{} + + testChanges := checker.Changes{ + checker.ComponentChange{ + Id: "change_id", + Text: "This is a breaking change.", + Level: checker.ERR, + }, + } + + out, err := formatter.RenderChangelog(testChanges, formatters.RenderOpts{}) + require.NoError(t, err) + require.Equal(t, string(out), "[{\"id\":\"change_id\",\"text\":\"This is a breaking change.\",\"level\":3}]") +} + +func TestJsonFormatter_RenderChecks(t *testing.T) { + formatter := formatters.JSONFormatter{} + + checks := []formatters.Check{ + { + Id: "change_id", + Level: "info", + Description: "This is a breaking change.", + Required: true, + }, + } + + out, err := formatter.RenderChecks(checks, formatters.RenderOpts{}) + require.NoError(t, err) + require.Equal(t, string(out), "[{\"id\":\"change_id\",\"level\":\"info\",\"description\":\"This is a breaking change.\",\"reuired\":true}]") +} + +func TestJsonFormatter_RenderDiff(t *testing.T) { + formatter := formatters.JSONFormatter{} + + out, err := formatter.RenderDiff(nil, formatters.RenderOpts{}) + require.NoError(t, err) + require.Empty(t, string(out)) +} + +func TestJsonFormatter_RenderFlatten(t *testing.T) { + formatter := formatters.JSONFormatter{} + + out, err := formatter.RenderFlatten(nil, formatters.RenderOpts{}) + require.NoError(t, err) + require.Empty(t, string(out)) +} + +func TestJsonFormatter_RenderSummary(t *testing.T) { + formatter := formatters.JSONFormatter{} + + out, err := formatter.RenderSummary(nil, formatters.RenderOpts{}) + require.NoError(t, err) + require.Equal(t, string(out), `{"diff":false}`) +} diff --git a/formatters/format_junit.go b/formatters/format_junit.go index ef6f9f69..e97d7935 100644 --- a/formatters/format_junit.go +++ b/formatters/format_junit.go @@ -4,9 +4,7 @@ import ( "encoding/xml" "fmt" - "github.com/getkin/kin-openapi/openapi3" "github.com/tufin/oasdiff/checker" - "github.com/tufin/oasdiff/diff" ) type JUnitTestSuites struct { @@ -38,14 +36,7 @@ type JUnitFailure struct { } type JUnitFormatter struct { -} - -func (f JUnitFormatter) RenderDiff(*diff.Diff, RenderOpts) ([]byte, error) { - return notImplemented() -} - -func (f JUnitFormatter) RenderSummary(*diff.Diff, RenderOpts) ([]byte, error) { - return notImplemented() + notImplementedFormatter } func (f JUnitFormatter) RenderBreakingChanges(changes checker.Changes, opts RenderOpts) ([]byte, error) { @@ -92,18 +83,6 @@ func (f JUnitFormatter) RenderBreakingChanges(changes checker.Changes, opts Rend return []byte(xml.Header + string(output)), nil } -func (f JUnitFormatter) RenderChangelog(checker.Changes, RenderOpts) ([]byte, error) { - return notImplemented() -} - -func (f JUnitFormatter) RenderChecks([]Check, RenderOpts) ([]byte, error) { - return notImplemented() -} - -func (f JUnitFormatter) RenderFlatten(*openapi3.T, RenderOpts) ([]byte, error) { - return notImplemented() -} - func (f JUnitFormatter) SupportedOutputs() []Output { return []Output{OutputBreaking} } diff --git a/formatters/format_junit_test.go b/formatters/format_junit_test.go index d8a30fe6..56498979 100644 --- a/formatters/format_junit_test.go +++ b/formatters/format_junit_test.go @@ -1,15 +1,16 @@ -package formatters +package formatters_test import ( "testing" "github.com/stretchr/testify/assert" "github.com/tufin/oasdiff/checker" + "github.com/tufin/oasdiff/formatters" ) func TestJUnitFormatter_RenderBreakingChanges_OneFailure(t *testing.T) { // prepare formatter and test changes - formatter := JUnitFormatter{} + formatter := formatters.JUnitFormatter{} testChanges := checker.Changes{ checker.ComponentChange{ Id: "change_id", @@ -19,7 +20,7 @@ func TestJUnitFormatter_RenderBreakingChanges_OneFailure(t *testing.T) { } // check output - output, err := formatter.RenderBreakingChanges(testChanges, RenderOpts{}) + output, err := formatter.RenderBreakingChanges(testChanges, formatters.RenderOpts{}) assert.NoError(t, err) expectedOutput := ` @@ -34,11 +35,11 @@ func TestJUnitFormatter_RenderBreakingChanges_OneFailure(t *testing.T) { func TestJUnitFormatter_RenderBreakingChanges_Success(t *testing.T) { // prepare formatter and test changes - formatter := JUnitFormatter{} + formatter := formatters.JUnitFormatter{} testChanges := checker.Changes{} // check output - output, err := formatter.RenderBreakingChanges(testChanges, RenderOpts{}) + output, err := formatter.RenderBreakingChanges(testChanges, formatters.RenderOpts{}) assert.NoError(t, err) expectedOutput := ` @@ -48,3 +49,23 @@ func TestJUnitFormatter_RenderBreakingChanges_Success(t *testing.T) { ` assert.Equal(t, expectedOutput, string(output)) } + +func TestJUnitFormatter_NotImplemented(t *testing.T) { + formatter := formatters.GitHubActionsFormatter{} + + var err error + _, err = formatter.RenderDiff(nil, formatters.RenderOpts{}) + assert.Error(t, err) + + _, err = formatter.RenderSummary(nil, formatters.RenderOpts{}) + assert.Error(t, err) + + _, err = formatter.RenderChangelog(nil, formatters.RenderOpts{}) + assert.Error(t, err) + + _, err = formatter.RenderChecks(nil, formatters.RenderOpts{}) + assert.Error(t, err) + + _, err = formatter.RenderFlatten(nil, formatters.RenderOpts{}) + assert.Error(t, err) +} diff --git a/formatters/format_text.go b/formatters/format_text.go index a43ead00..cbe70ae7 100644 --- a/formatters/format_text.go +++ b/formatters/format_text.go @@ -5,13 +5,13 @@ import ( "fmt" "text/tabwriter" - "github.com/getkin/kin-openapi/openapi3" "github.com/tufin/oasdiff/checker" "github.com/tufin/oasdiff/diff" "github.com/tufin/oasdiff/report" ) type TEXTFormatter struct { + notImplementedFormatter Localizer checker.Localizer } @@ -19,10 +19,6 @@ func (f TEXTFormatter) RenderDiff(diff *diff.Diff, opts RenderOpts) ([]byte, err return []byte(report.GetTextReportAsString(diff)), nil } -func (f TEXTFormatter) RenderSummary(*diff.Diff, RenderOpts) ([]byte, error) { - return notImplemented() -} - func (f TEXTFormatter) RenderBreakingChanges(changes checker.Changes, opts RenderOpts) ([]byte, error) { result := bytes.NewBuffer(nil) @@ -86,10 +82,6 @@ func (f TEXTFormatter) RenderChecks(checks []Check, opts RenderOpts) ([]byte, er return result.Bytes(), nil } -func (f TEXTFormatter) RenderFlatten(*openapi3.T, RenderOpts) ([]byte, error) { - return notImplemented() -} - func (f TEXTFormatter) SupportedOutputs() []Output { return []Output{OutputDiff, OutputBreaking, OutputChangelog, OutputChecks} } diff --git a/formatters/format_text_test.go b/formatters/format_text_test.go new file mode 100644 index 00000000..62569e65 --- /dev/null +++ b/formatters/format_text_test.go @@ -0,0 +1,92 @@ +package formatters_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/tufin/oasdiff/checker" + "github.com/tufin/oasdiff/formatters" +) + +func TestTextFormatter_RenderBreakingChanges(t *testing.T) { + formatter, err := formatters.Lookup("text", formatters.FormatterOpts{ + Language: formatters.LangDefault, + }) + require.NoError(t, err) + + testChanges := checker.Changes{ + checker.ComponentChange{ + Id: "change_id", + Text: "This is a breaking change.", + Level: checker.ERR, + }, + } + + out, err := formatter.RenderBreakingChanges(testChanges, formatters.RenderOpts{}) + require.NoError(t, err) + require.Equal(t, string(out), "1 breaking changes: 1 error, 0 warning\nerror, in components This is a breaking change. [change_id]. \n\n") +} + +func TestTextFormatter_RenderChangelog(t *testing.T) { + formatter, err := formatters.Lookup("text", formatters.FormatterOpts{ + Language: formatters.LangDefault, + }) + require.NoError(t, err) + + testChanges := checker.Changes{ + checker.ComponentChange{ + Id: "change_id", + Text: "This is a breaking change.", + Level: checker.ERR, + }, + } + + out, err := formatter.RenderChangelog(testChanges, formatters.RenderOpts{}) + require.NoError(t, err) + require.Equal(t, string(out), "1 changes: 1 error, 0 warning, 0 info\nerror, in components This is a breaking change. [change_id]. \n\n") +} + +func TestTextFormatter_RenderChecks(t *testing.T) { + formatter, err := formatters.Lookup("text", formatters.FormatterOpts{ + Language: formatters.LangDefault, + }) + require.NoError(t, err) + + checks := []formatters.Check{ + { + Id: "change_id", + Level: "info", + Description: "This is a breaking change.", + Required: true, + }, + } + + out, err := formatter.RenderChecks(checks, formatters.RenderOpts{}) + require.NoError(t, err) + require.Equal(t, string(out), "ID DESCRIPTION LEVEL\nchange_id This is a breaking change. info\n") +} + +func TestTextFormatter_RenderDiff(t *testing.T) { + formatter, err := formatters.Lookup("text", formatters.FormatterOpts{ + Language: formatters.LangDefault, + }) + require.NoError(t, err) + + out, err := formatter.RenderDiff(nil, formatters.RenderOpts{}) + require.NoError(t, err) + require.Equal(t, string(out), "No changes\n") +} + +func TestTextFormatter_NotImplemented(t *testing.T) { + formatter, err := formatters.Lookup("text", formatters.FormatterOpts{ + Language: formatters.LangDefault, + }) + require.NoError(t, err) + + _, err = formatter.RenderFlatten(nil, formatters.RenderOpts{}) + assert.Error(t, err) + + _, err = formatter.RenderSummary(nil, formatters.RenderOpts{}) + assert.Error(t, err) +} diff --git a/formatters/format_yaml_test.go b/formatters/format_yaml_test.go new file mode 100644 index 00000000..7ab6d8de --- /dev/null +++ b/formatters/format_yaml_test.go @@ -0,0 +1,82 @@ +package formatters_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + "github.com/tufin/oasdiff/checker" + "github.com/tufin/oasdiff/formatters" +) + +func TestYamlFormatter_RenderBreakingChanges(t *testing.T) { + formatter := formatters.YAMLFormatter{} + + testChanges := checker.Changes{ + checker.ComponentChange{ + Id: "change_id", + Text: "This is a breaking change.", + Level: checker.ERR, + }, + } + + out, err := formatter.RenderBreakingChanges(testChanges, formatters.RenderOpts{}) + require.NoError(t, err) + require.Equal(t, string(out), "- id: change_id\n text: This is a breaking change.\n level: 3\n") +} + +func TestYamlFormatter_RenderChangelog(t *testing.T) { + formatter := formatters.YAMLFormatter{} + + testChanges := checker.Changes{ + checker.ComponentChange{ + Id: "change_id", + Text: "This is a breaking change.", + Level: checker.ERR, + }, + } + + out, err := formatter.RenderChangelog(testChanges, formatters.RenderOpts{}) + require.NoError(t, err) + require.Equal(t, string(out), "- id: change_id\n text: This is a breaking change.\n level: 3\n") +} + +func TestYamlFormatter_RenderChecks(t *testing.T) { + formatter := formatters.YAMLFormatter{} + + checks := []formatters.Check{ + { + Id: "change_id", + Level: "info", + Description: "This is a breaking change.", + Required: true, + }, + } + + out, err := formatter.RenderChecks(checks, formatters.RenderOpts{}) + require.NoError(t, err) + require.Equal(t, string(out), "- id: change_id\n level: info\n description: This is a breaking change.\n reuired: true\n") +} + +func TestYamlFormatter_RenderDiff(t *testing.T) { + formatter := formatters.YAMLFormatter{} + + out, err := formatter.RenderDiff(nil, formatters.RenderOpts{}) + require.NoError(t, err) + require.Empty(t, string(out)) +} + +func TestYamlFormatter_RenderFlatten(t *testing.T) { + formatter := formatters.YAMLFormatter{} + + out, err := formatter.RenderFlatten(nil, formatters.RenderOpts{}) + require.NoError(t, err) + require.Empty(t, string(out)) +} + +func TestYamlFormatter_RenderSummary(t *testing.T) { + formatter := formatters.YAMLFormatter{} + + out, err := formatter.RenderSummary(nil, formatters.RenderOpts{}) + require.NoError(t, err) + require.Equal(t, string(out), "diff: false\n") +} diff --git a/formatters/interface.go b/formatters/interface.go index e601ae9a..11b12d63 100644 --- a/formatters/interface.go +++ b/formatters/interface.go @@ -69,7 +69,3 @@ func DefaultFormatterOpts() FormatterOpts { Language: LangDefault, } } - -func notImplemented() ([]byte, error) { - return nil, fmt.Errorf("not implemented") -} diff --git a/formatters/not_implemented.go b/formatters/not_implemented.go new file mode 100644 index 00000000..1d11e3c1 --- /dev/null +++ b/formatters/not_implemented.go @@ -0,0 +1,39 @@ +package formatters + +import ( + "fmt" + + "github.com/getkin/kin-openapi/openapi3" + "github.com/tufin/oasdiff/checker" + "github.com/tufin/oasdiff/diff" +) + +type notImplementedFormatter struct{} + +func (f notImplementedFormatter) RenderDiff(*diff.Diff, RenderOpts) ([]byte, error) { + return notImplemented() +} + +func (f notImplementedFormatter) RenderSummary(*diff.Diff, RenderOpts) ([]byte, error) { + return notImplemented() +} + +func (f notImplementedFormatter) RenderBreakingChanges(checker.Changes, RenderOpts) ([]byte, error) { + return notImplemented() +} + +func (f notImplementedFormatter) RenderChangelog(checker.Changes, RenderOpts) ([]byte, error) { + return notImplemented() +} + +func (f notImplementedFormatter) RenderChecks([]Check, RenderOpts) ([]byte, error) { + return notImplemented() +} + +func (f notImplementedFormatter) RenderFlatten(*openapi3.T, RenderOpts) ([]byte, error) { + return notImplemented() +} + +func notImplemented() ([]byte, error) { + return nil, fmt.Errorf("not implemented") +} diff --git a/utils/circular_refs_test.go b/utils/circular_refs_test.go new file mode 100644 index 00000000..693c1773 --- /dev/null +++ b/utils/circular_refs_test.go @@ -0,0 +1,17 @@ +package utils_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + "github.com/tufin/oasdiff/utils" +) + +func Test_VisitedRefs(t *testing.T) { + v := utils.VisitedRefs{} + require.False(t, v.IsVisited("test")) + v.Add("test") + require.True(t, v.IsVisited("test")) + v.Remove("test") + require.False(t, v.IsVisited("test")) +} diff --git a/utils/path_test.go b/utils/path_test.go new file mode 100644 index 00000000..1c57c79d --- /dev/null +++ b/utils/path_test.go @@ -0,0 +1,15 @@ +package utils_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + "github.com/tufin/oasdiff/utils" +) + +func Test_NormalizeTemplatedPath(t *testing.T) { + normalizedPath, numOfParams, paramNames := utils.NormalizeTemplatedPath("/person/{personName}") + require.Equal(t, "/person/{}", normalizedPath) + require.Equal(t, uint(0x1), numOfParams) + require.Equal(t, []string{"personName"}, paramNames) +} diff --git a/utils/string_list_test.go b/utils/string_list_test.go new file mode 100644 index 00000000..84485ef1 --- /dev/null +++ b/utils/string_list_test.go @@ -0,0 +1,21 @@ +package utils_test + +import ( + "testing" + + "github.com/stretchr/testify/require" + "github.com/tufin/oasdiff/utils" +) + +func Test_StringList(t *testing.T) { + l := utils.StringList{} + require.True(t, l.Empty()) + require.Equal(t, l.String(), "") + require.NoError(t, l.Set("b,a")) + require.Equal(t, l.String(), "b, a") + l = l.Sort() + require.Equal(t, l.String(), "a, b") + require.True(t, l.Contains("a")) + require.True(t, l.Contains("b")) + require.True(t, l.Minus(l).ToStringSet().Empty()) +} diff --git a/utils/string_set_test.go b/utils/string_set_test.go index 93ee9274..d298c630 100644 --- a/utils/string_set_test.go +++ b/utils/string_set_test.go @@ -39,3 +39,15 @@ func TestIntersection_Empty(t *testing.T) { s.Add("y") require.Empty(t, s.Intersection(utils.StringSet{})) } + +func TestStringSet_Plus(t *testing.T) { + s := utils.StringSet{} + s.Add("x") + require.True(t, s.Equals(s.Plus(s))) +} + +func TestStringSet_Equals(t *testing.T) { + s := utils.StringSet{} + s.Add("x") + require.True(t, s.Equals(s)) +}