From 00fd4d2a4b7f17e40ae8fc7bc9ea01bbf07c3b78 Mon Sep 17 00:00:00 2001 From: andreaangiolillo Date: Mon, 11 Mar 2024 13:47:11 +0000 Subject: [PATCH 1/6] Add mocking --- tools/cli/Makefile | 10 +- tools/cli/go.mod | 1 + tools/cli/go.sum | 2 + tools/cli/internal/cli/merge/merge.go | 10 +- tools/cli/internal/cli/merge/merge_test.go | 46 +++++++++ tools/cli/internal/mocks/mock_openapi.go | 93 +++++++++++++++++++ .../openapi/errors/path_conflict_error.go | 14 +++ tools/cli/internal/openapi/oasdiff.go | 56 +++-------- tools/cli/internal/openapi/openapi.go | 62 ++++++++++++- tools/cli/internal/openapi/openapi3.go | 14 +++ 10 files changed, 259 insertions(+), 49 deletions(-) create mode 100644 tools/cli/internal/mocks/mock_openapi.go diff --git a/tools/cli/Makefile b/tools/cli/Makefile index 8dc6f04..8d7cdcd 100644 --- a/tools/cli/Makefile +++ b/tools/cli/Makefile @@ -24,6 +24,7 @@ deps: ## Download go module dependencies .PHONY: devtools devtools: ## Install dev tools @echo "==> Installing dev tools..." + go install go.uber.org/mock/mockgen@latest curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(shell go env GOPATH)/bin $(GOLANGCI_VERSION) .PHONY: setup @@ -31,8 +32,8 @@ setup: deps devtools ## Set up dev env .PHONY: fmt fmt: ### Format all go files with goimports and gofmt - find . -name "*.go" -exec gofmt -w "{}" \; - find . -name "*.go" -exec goimports -l -w "{}" \; + find . -name "*.go" -not -path "./internal/mocks" -exec gofmt -w "{}" \; + find . -name "*.go" -not -path "./internal/mocks" -exec goimports -l -w "{}" \; .PHONY: build build: @@ -57,6 +58,11 @@ fix-lint: ## Fix linting errors list: ## List all make targets @${MAKE} -pRrn : -f $(MAKEFILE_LIST) 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | egrep -v -e '^[^[:alnum:]]' -e '^$@$$' | sort +.PHONY: gen-mocks +gen-mocks: ## Generate mocks + @echo "==> Generating mocks" + rm -rf ./internal/mocks + go generate ./internal... .PHONY: help .DEFAULT_GOAL := help diff --git a/tools/cli/go.mod b/tools/cli/go.mod index 816185e..6b3adad 100644 --- a/tools/cli/go.mod +++ b/tools/cli/go.mod @@ -7,6 +7,7 @@ require ( github.com/spf13/cobra v1.8.0 github.com/stretchr/testify v1.9.0 github.com/tufin/oasdiff v1.10.11 + go.uber.org/mock v0.4.0 ) require ( diff --git a/tools/cli/go.sum b/tools/cli/go.sum index f98dcb9..acdc8f5 100644 --- a/tools/cli/go.sum +++ b/tools/cli/go.sum @@ -48,6 +48,8 @@ github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4d github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/yargevad/filepathx v1.0.0 h1:SYcT+N3tYGi+NvazubCNlvgIPbzAk7i7y2dwg3I5FYc= github.com/yargevad/filepathx v1.0.0/go.mod h1:BprfX/gpYNJHJfc35GjRRpVcwWXS89gGulUIU5tK3tA= +go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= +go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA= golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/tools/cli/internal/cli/merge/merge.go b/tools/cli/internal/cli/merge/merge.go index 2d849f9..b09ee2b 100644 --- a/tools/cli/internal/cli/merge/merge.go +++ b/tools/cli/internal/cli/merge/merge.go @@ -29,6 +29,10 @@ const ( DefaultOutputFileName = "FOAS.json" ) +// writeToFileFunc is a variable that holds the function used to write files. +// It can be overridden in tests. +var writeToFileFunc = os.WriteFile + type Opts struct { Merger openapi.Merger basePath string @@ -36,7 +40,7 @@ type Opts struct { externalPaths []string } -func (o *Opts) Run(_ []string) error { +func (o *Opts) Run() error { federated, err := o.Merger.MergeOpenAPISpecs(o.externalPaths) if err != nil { return err @@ -65,7 +69,7 @@ func (o *Opts) PreRunE(_ []string) error { } func (o *Opts) saveFile(data []byte) error { - if err := os.WriteFile(o.outputPath, data, 0o600); err != nil { + if err := writeToFileFunc(o.outputPath, data, 0o600); err != nil { return err } @@ -86,7 +90,7 @@ func Builder() *cobra.Command { return opts.PreRunE(args) }, RunE: func(_ *cobra.Command, args []string) error { - return opts.Run(args) + return opts.Run() }, } diff --git a/tools/cli/internal/cli/merge/merge_test.go b/tools/cli/internal/cli/merge/merge_test.go index 856cfb6..3b30e03 100644 --- a/tools/cli/internal/cli/merge/merge_test.go +++ b/tools/cli/internal/cli/merge/merge_test.go @@ -15,12 +15,48 @@ package merge import ( + "os" "testing" + "github.com/getkin/kin-openapi/openapi3" + "github.com/mongodb/openapi/tools/cli/internal/mocks" + "github.com/tufin/oasdiff/load" + "go.uber.org/mock/gomock" + "github.com/mongodb/openapi/tools/cli/internal/cli/flag" "github.com/mongodb/openapi/tools/cli/internal/cli/validator" ) +func TestSuccessfulMerge_Run(t *testing.T) { + setupTest(t) + ctrl := gomock.NewController(t) + mockMergerStore := mocks.NewMockMerger(ctrl) + + externalPaths := []string{"external.json"} + opts := &Opts{ + Merger: mockMergerStore, + basePath: "base.json", + outputPath: "foas.json", + externalPaths: externalPaths, + } + + response := &load.SpecInfo{ + Spec: &openapi3.T{}, + Url: "test", + Version: "3.0.1", + } + + mockMergerStore. + EXPECT(). + MergeOpenAPISpecs(opts.externalPaths). + Return(response, nil). + Times(1) + + if err := opts.Run(); err != nil { + t.Fatalf("Run() unexpected error: %v", err) + } +} + func TestCreateBuilder(t *testing.T) { validator.ValidateSubCommandsAndFlags( t, @@ -29,3 +65,13 @@ func TestCreateBuilder(t *testing.T) { []string{flag.Base, flag.External, flag.Output}, ) } + +func setupTest(t *testing.T) { + t.Helper() + writeToFileFunc = func(filename string, data []byte, perm os.FileMode) error { + return nil + } + defer func() { + writeToFileFunc = os.WriteFile + }() +} diff --git a/tools/cli/internal/mocks/mock_openapi.go b/tools/cli/internal/mocks/mock_openapi.go new file mode 100644 index 0000000..464e1b1 --- /dev/null +++ b/tools/cli/internal/mocks/mock_openapi.go @@ -0,0 +1,93 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/mongodb/openapi/tools/cli/internal/openapi (interfaces: Parser,Merger) +// +// Generated by this command: +// +// mockgen -destination=../mocks/mock_openapi.go -package=mocks github.com/mongodb/openapi/tools/cli/internal/openapi Parser,Merger +// + +// Package mocks is a generated GoMock package. +package mocks + +import ( + reflect "reflect" + + load "github.com/tufin/oasdiff/load" + gomock "go.uber.org/mock/gomock" +) + +// MockParser is a mock of Parser interface. +type MockParser struct { + ctrl *gomock.Controller + recorder *MockParserMockRecorder +} + +// MockParserMockRecorder is the mock recorder for MockParser. +type MockParserMockRecorder struct { + mock *MockParser +} + +// NewMockParser creates a new mock instance. +func NewMockParser(ctrl *gomock.Controller) *MockParser { + mock := &MockParser{ctrl: ctrl} + mock.recorder = &MockParserMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockParser) EXPECT() *MockParserMockRecorder { + return m.recorder +} + +// CreateOpenAPISpecFromPath mocks base method. +func (m *MockParser) CreateOpenAPISpecFromPath(arg0 string) (*load.SpecInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateOpenAPISpecFromPath", arg0) + ret0, _ := ret[0].(*load.SpecInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateOpenAPISpecFromPath indicates an expected call of CreateOpenAPISpecFromPath. +func (mr *MockParserMockRecorder) CreateOpenAPISpecFromPath(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateOpenAPISpecFromPath", reflect.TypeOf((*MockParser)(nil).CreateOpenAPISpecFromPath), arg0) +} + +// MockMerger is a mock of Merger interface. +type MockMerger struct { + ctrl *gomock.Controller + recorder *MockMergerMockRecorder +} + +// MockMergerMockRecorder is the mock recorder for MockMerger. +type MockMergerMockRecorder struct { + mock *MockMerger +} + +// NewMockMerger creates a new mock instance. +func NewMockMerger(ctrl *gomock.Controller) *MockMerger { + mock := &MockMerger{ctrl: ctrl} + mock.recorder = &MockMergerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockMerger) EXPECT() *MockMergerMockRecorder { + return m.recorder +} + +// MergeOpenAPISpecs mocks base method. +func (m *MockMerger) MergeOpenAPISpecs(arg0 []string) (*load.SpecInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MergeOpenAPISpecs", arg0) + ret0, _ := ret[0].(*load.SpecInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MergeOpenAPISpecs indicates an expected call of MergeOpenAPISpecs. +func (mr *MockMergerMockRecorder) MergeOpenAPISpecs(arg0 any) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MergeOpenAPISpecs", reflect.TypeOf((*MockMerger)(nil).MergeOpenAPISpecs), arg0) +} diff --git a/tools/cli/internal/openapi/errors/path_conflict_error.go b/tools/cli/internal/openapi/errors/path_conflict_error.go index b01db5a..4493b51 100644 --- a/tools/cli/internal/openapi/errors/path_conflict_error.go +++ b/tools/cli/internal/openapi/errors/path_conflict_error.go @@ -1,3 +1,17 @@ +// Copyright 2024 MongoDB Inc +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package errors import "fmt" diff --git a/tools/cli/internal/openapi/oasdiff.go b/tools/cli/internal/openapi/oasdiff.go index 54bf339..4ea4aa7 100644 --- a/tools/cli/internal/openapi/oasdiff.go +++ b/tools/cli/internal/openapi/oasdiff.go @@ -1,8 +1,20 @@ +// Copyright 2024 MongoDB Inc +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package openapi import ( - "log" - "github.com/mongodb/openapi/tools/cli/internal/openapi/errors" "github.com/tufin/oasdiff/diff" "github.com/tufin/oasdiff/load" @@ -16,46 +28,6 @@ type OasDiff struct { parser Parser } -func NewOasDiff(base string) (*OasDiff, error) { - parser := NewOpenAPI3() - baseSpec, err := parser.CreateOpenAPISpecFromPath(base) - if err != nil { - return nil, err - } - - return &OasDiff{ - base: baseSpec, - parser: parser, - config: &diff.Config{ - IncludePathParams: true, - }, - }, nil -} - -func (o *OasDiff) MergeOpenAPISpecs(paths []string) (*load.SpecInfo, error) { - for _, p := range paths { - spec, err := o.parser.CreateOpenAPISpecFromPath(p) - if err != nil { - return nil, err - } - - specDiff, err := diff.Get(o.config, o.base.Spec, spec.Spec) - if err != nil { - log.Fatalf("error in calculating the diff of the specs: %s", err) - return nil, err - } - - o.specDiff = specDiff - o.external = spec - err = o.mergeSpecIntoBase() - if err != nil { - return nil, err - } - } - - return o.base, nil -} - func (o OasDiff) mergeSpecIntoBase() error { return o.mergePaths() } diff --git a/tools/cli/internal/openapi/openapi.go b/tools/cli/internal/openapi/openapi.go index 5bdb959..555252f 100644 --- a/tools/cli/internal/openapi/openapi.go +++ b/tools/cli/internal/openapi/openapi.go @@ -1,13 +1,71 @@ +// Copyright 2024 MongoDB Inc +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package openapi +//go:generate mockgen -destination=../mocks/mock_openapi.go -package=mocks github.com/mongodb/openapi/tools/cli/internal/openapi Parser,Merger import ( + "log" + + "github.com/tufin/oasdiff/diff" "github.com/tufin/oasdiff/load" ) +type Parser interface { + CreateOpenAPISpecFromPath(string) (*load.SpecInfo, error) +} + type Merger interface { MergeOpenAPISpecs([]string) (*load.SpecInfo, error) } -type Parser interface { - CreateOpenAPISpecFromPath(string) (*load.SpecInfo, error) +func (o *OasDiff) MergeOpenAPISpecs(paths []string) (*load.SpecInfo, error) { + for _, p := range paths { + spec, err := o.parser.CreateOpenAPISpecFromPath(p) + if err != nil { + return nil, err + } + + specDiff, err := diff.Get(o.config, o.base.Spec, spec.Spec) + if err != nil { + log.Fatalf("error in calculating the diff of the specs: %s", err) + return nil, err + } + + o.specDiff = specDiff + o.external = spec + err = o.mergeSpecIntoBase() + if err != nil { + return nil, err + } + } + + return o.base, nil +} + +func NewOasDiff(base string) (*OasDiff, error) { + parser := NewOpenAPI3() + baseSpec, err := parser.CreateOpenAPISpecFromPath(base) + if err != nil { + return nil, err + } + + return &OasDiff{ + base: baseSpec, + parser: parser, + config: &diff.Config{ + IncludePathParams: true, + }, + }, nil } diff --git a/tools/cli/internal/openapi/openapi3.go b/tools/cli/internal/openapi/openapi3.go index 8e858f8..011386f 100644 --- a/tools/cli/internal/openapi/openapi3.go +++ b/tools/cli/internal/openapi/openapi3.go @@ -1,3 +1,17 @@ +// Copyright 2024 MongoDB Inc +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package openapi import ( From 45ec0b18d1a913f209a85d437c9830bf35f98606 Mon Sep 17 00:00:00 2001 From: andreaangiolillo Date: Mon, 11 Mar 2024 13:51:02 +0000 Subject: [PATCH 2/6] fixes --- tools/cli/internal/cli/merge/merge.go | 2 +- tools/cli/internal/cli/merge/merge_test.go | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/tools/cli/internal/cli/merge/merge.go b/tools/cli/internal/cli/merge/merge.go index b09ee2b..832cad7 100644 --- a/tools/cli/internal/cli/merge/merge.go +++ b/tools/cli/internal/cli/merge/merge.go @@ -89,7 +89,7 @@ func Builder() *cobra.Command { PreRunE: func(_ *cobra.Command, args []string) error { return opts.PreRunE(args) }, - RunE: func(_ *cobra.Command, args []string) error { + RunE: func(_ *cobra.Command, _ []string) error { return opts.Run() }, } diff --git a/tools/cli/internal/cli/merge/merge_test.go b/tools/cli/internal/cli/merge/merge_test.go index 3b30e03..2643084 100644 --- a/tools/cli/internal/cli/merge/merge_test.go +++ b/tools/cli/internal/cli/merge/merge_test.go @@ -12,6 +12,8 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build unit + package merge import ( @@ -19,12 +21,11 @@ import ( "testing" "github.com/getkin/kin-openapi/openapi3" + "github.com/mongodb/openapi/tools/cli/internal/cli/flag" + "github.com/mongodb/openapi/tools/cli/internal/cli/validator" "github.com/mongodb/openapi/tools/cli/internal/mocks" "github.com/tufin/oasdiff/load" "go.uber.org/mock/gomock" - - "github.com/mongodb/openapi/tools/cli/internal/cli/flag" - "github.com/mongodb/openapi/tools/cli/internal/cli/validator" ) func TestSuccessfulMerge_Run(t *testing.T) { @@ -68,10 +69,7 @@ func TestCreateBuilder(t *testing.T) { func setupTest(t *testing.T) { t.Helper() - writeToFileFunc = func(filename string, data []byte, perm os.FileMode) error { + writeToFileFunc = func(_ string, _ []byte, _ os.FileMode) error { return nil } - defer func() { - writeToFileFunc = os.WriteFile - }() } From 65b246d5b41103fe643976959ac8479c7069d9f0 Mon Sep 17 00:00:00 2001 From: andreaangiolillo Date: Mon, 11 Mar 2024 14:09:45 +0000 Subject: [PATCH 3/6] Addressed PR comments - Part 1 --- tools/cli/Makefile | 1 - tools/cli/internal/cli/merge/merge.go | 6 +----- tools/cli/internal/cli/merge/merge_test.go | 16 +++------------- .../internal/{mocks => openapi}/mock_openapi.go | 6 +++--- tools/cli/internal/openapi/openapi.go | 2 +- 5 files changed, 8 insertions(+), 23 deletions(-) rename tools/cli/internal/{mocks => openapi}/mock_openapi.go (93%) diff --git a/tools/cli/Makefile b/tools/cli/Makefile index 8d7cdcd..dfe6877 100644 --- a/tools/cli/Makefile +++ b/tools/cli/Makefile @@ -61,7 +61,6 @@ list: ## List all make targets .PHONY: gen-mocks gen-mocks: ## Generate mocks @echo "==> Generating mocks" - rm -rf ./internal/mocks go generate ./internal... .PHONY: help diff --git a/tools/cli/internal/cli/merge/merge.go b/tools/cli/internal/cli/merge/merge.go index 832cad7..d96ee0f 100644 --- a/tools/cli/internal/cli/merge/merge.go +++ b/tools/cli/internal/cli/merge/merge.go @@ -29,10 +29,6 @@ const ( DefaultOutputFileName = "FOAS.json" ) -// writeToFileFunc is a variable that holds the function used to write files. -// It can be overridden in tests. -var writeToFileFunc = os.WriteFile - type Opts struct { Merger openapi.Merger basePath string @@ -69,7 +65,7 @@ func (o *Opts) PreRunE(_ []string) error { } func (o *Opts) saveFile(data []byte) error { - if err := writeToFileFunc(o.outputPath, data, 0o600); err != nil { + if err := os.WriteFile(o.outputPath, data, 0o600); err != nil { return err } diff --git a/tools/cli/internal/cli/merge/merge_test.go b/tools/cli/internal/cli/merge/merge_test.go index 2643084..4b9db1f 100644 --- a/tools/cli/internal/cli/merge/merge_test.go +++ b/tools/cli/internal/cli/merge/merge_test.go @@ -12,26 +12,23 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build unit - package merge import ( - "os" "testing" + "github.com/mongodb/openapi/tools/cli/internal/openapi" + "github.com/getkin/kin-openapi/openapi3" "github.com/mongodb/openapi/tools/cli/internal/cli/flag" "github.com/mongodb/openapi/tools/cli/internal/cli/validator" - "github.com/mongodb/openapi/tools/cli/internal/mocks" "github.com/tufin/oasdiff/load" "go.uber.org/mock/gomock" ) func TestSuccessfulMerge_Run(t *testing.T) { - setupTest(t) ctrl := gomock.NewController(t) - mockMergerStore := mocks.NewMockMerger(ctrl) + mockMergerStore := openapi.NewMockMerger(ctrl) externalPaths := []string{"external.json"} opts := &Opts{ @@ -66,10 +63,3 @@ func TestCreateBuilder(t *testing.T) { []string{flag.Base, flag.External, flag.Output}, ) } - -func setupTest(t *testing.T) { - t.Helper() - writeToFileFunc = func(_ string, _ []byte, _ os.FileMode) error { - return nil - } -} diff --git a/tools/cli/internal/mocks/mock_openapi.go b/tools/cli/internal/openapi/mock_openapi.go similarity index 93% rename from tools/cli/internal/mocks/mock_openapi.go rename to tools/cli/internal/openapi/mock_openapi.go index 464e1b1..4b0dfb1 100644 --- a/tools/cli/internal/mocks/mock_openapi.go +++ b/tools/cli/internal/openapi/mock_openapi.go @@ -3,11 +3,11 @@ // // Generated by this command: // -// mockgen -destination=../mocks/mock_openapi.go -package=mocks github.com/mongodb/openapi/tools/cli/internal/openapi Parser,Merger +// mockgen -destination=../openapi/mock_openapi.go -package=openapi github.com/mongodb/openapi/tools/cli/internal/openapi Parser,Merger // -// Package mocks is a generated GoMock package. -package mocks +// Package openapi is a generated GoMock package. +package openapi import ( reflect "reflect" diff --git a/tools/cli/internal/openapi/openapi.go b/tools/cli/internal/openapi/openapi.go index 555252f..07922a6 100644 --- a/tools/cli/internal/openapi/openapi.go +++ b/tools/cli/internal/openapi/openapi.go @@ -14,7 +14,7 @@ package openapi -//go:generate mockgen -destination=../mocks/mock_openapi.go -package=mocks github.com/mongodb/openapi/tools/cli/internal/openapi Parser,Merger +//go:generate mockgen -destination=../openapi/mock_openapi.go -package=openapi github.com/mongodb/openapi/tools/cli/internal/openapi Parser,Merger import ( "log" From 04bb4cd5afc85977a6780c32e125dfcd646f15f6 Mon Sep 17 00:00:00 2001 From: andreaangiolillo Date: Mon, 11 Mar 2024 14:23:32 +0000 Subject: [PATCH 4/6] addressed PR comments - Part 2 --- tools/cli/go.mod | 2 ++ tools/cli/go.sum | 4 ++++ tools/cli/internal/cli/merge/merge.go | 12 +++++++----- tools/cli/internal/cli/merge/merge_test.go | 7 ++++--- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/tools/cli/go.mod b/tools/cli/go.mod index 6b3adad..42f46ba 100644 --- a/tools/cli/go.mod +++ b/tools/cli/go.mod @@ -4,6 +4,7 @@ go 1.22.1 require ( github.com/getkin/kin-openapi v0.123.0 + github.com/spf13/afero v1.11.0 github.com/spf13/cobra v1.8.0 github.com/stretchr/testify v1.9.0 github.com/tufin/oasdiff v1.10.11 @@ -25,5 +26,6 @@ require ( github.com/spf13/pflag v1.0.5 // indirect github.com/ugorji/go/codec v1.2.11 // indirect github.com/yargevad/filepathx v1.0.0 // indirect + golang.org/x/text v0.14.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/tools/cli/go.sum b/tools/cli/go.sum index acdc8f5..98ca60a 100644 --- a/tools/cli/go.sum +++ b/tools/cli/go.sum @@ -36,6 +36,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -52,6 +54,8 @@ go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA= golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/tools/cli/internal/cli/merge/merge.go b/tools/cli/internal/cli/merge/merge.go index d96ee0f..2c7750a 100644 --- a/tools/cli/internal/cli/merge/merge.go +++ b/tools/cli/internal/cli/merge/merge.go @@ -16,13 +16,12 @@ package merge import ( "fmt" - "log" - "os" - "github.com/mongodb/openapi/tools/cli/internal/cli/flag" "github.com/mongodb/openapi/tools/cli/internal/cli/usage" "github.com/mongodb/openapi/tools/cli/internal/openapi" + "github.com/spf13/afero" "github.com/spf13/cobra" + "log" ) const ( @@ -34,6 +33,7 @@ type Opts struct { basePath string outputPath string externalPaths []string + fs afero.Fs } func (o *Opts) Run() error { @@ -65,7 +65,7 @@ func (o *Opts) PreRunE(_ []string) error { } func (o *Opts) saveFile(data []byte) error { - if err := os.WriteFile(o.outputPath, data, 0o600); err != nil { + if err := afero.WriteFile(o.fs, o.outputPath, data, 0o600); err != nil { return err } @@ -76,7 +76,9 @@ func (o *Opts) saveFile(data []byte) error { // Builder builds the merge command with the following signature: // merge -b base-oas -e external-oas-1 -e external-oas-2 func Builder() *cobra.Command { - opts := &Opts{} + opts := &Opts{ + fs: afero.NewOsFs(), + } cmd := &cobra.Command{ Use: "merge -b base-spec [-e spec]...", diff --git a/tools/cli/internal/cli/merge/merge_test.go b/tools/cli/internal/cli/merge/merge_test.go index 4b9db1f..d50903d 100644 --- a/tools/cli/internal/cli/merge/merge_test.go +++ b/tools/cli/internal/cli/merge/merge_test.go @@ -15,13 +15,13 @@ package merge import ( + "github.com/spf13/afero" "testing" - "github.com/mongodb/openapi/tools/cli/internal/openapi" - "github.com/getkin/kin-openapi/openapi3" "github.com/mongodb/openapi/tools/cli/internal/cli/flag" "github.com/mongodb/openapi/tools/cli/internal/cli/validator" + "github.com/mongodb/openapi/tools/cli/internal/openapi" "github.com/tufin/oasdiff/load" "go.uber.org/mock/gomock" ) @@ -29,13 +29,14 @@ import ( func TestSuccessfulMerge_Run(t *testing.T) { ctrl := gomock.NewController(t) mockMergerStore := openapi.NewMockMerger(ctrl) - + fs := afero.NewMemMapFs() externalPaths := []string{"external.json"} opts := &Opts{ Merger: mockMergerStore, basePath: "base.json", outputPath: "foas.json", externalPaths: externalPaths, + fs: fs, } response := &load.SpecInfo{ From 11e55d99727a009769ecdb53a936a707b1ce8a7c Mon Sep 17 00:00:00 2001 From: andreaangiolillo Date: Mon, 11 Mar 2024 14:25:04 +0000 Subject: [PATCH 5/6] lint --- tools/cli/internal/cli/merge/merge.go | 5 +++-- tools/cli/internal/cli/merge/merge_test.go | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tools/cli/internal/cli/merge/merge.go b/tools/cli/internal/cli/merge/merge.go index 2c7750a..4bf1abc 100644 --- a/tools/cli/internal/cli/merge/merge.go +++ b/tools/cli/internal/cli/merge/merge.go @@ -16,12 +16,13 @@ package merge import ( "fmt" + "log" + "github.com/mongodb/openapi/tools/cli/internal/cli/flag" "github.com/mongodb/openapi/tools/cli/internal/cli/usage" "github.com/mongodb/openapi/tools/cli/internal/openapi" "github.com/spf13/afero" "github.com/spf13/cobra" - "log" ) const ( @@ -30,10 +31,10 @@ const ( type Opts struct { Merger openapi.Merger + fs afero.Fs basePath string outputPath string externalPaths []string - fs afero.Fs } func (o *Opts) Run() error { diff --git a/tools/cli/internal/cli/merge/merge_test.go b/tools/cli/internal/cli/merge/merge_test.go index d50903d..cad106f 100644 --- a/tools/cli/internal/cli/merge/merge_test.go +++ b/tools/cli/internal/cli/merge/merge_test.go @@ -15,13 +15,13 @@ package merge import ( - "github.com/spf13/afero" "testing" "github.com/getkin/kin-openapi/openapi3" "github.com/mongodb/openapi/tools/cli/internal/cli/flag" "github.com/mongodb/openapi/tools/cli/internal/cli/validator" "github.com/mongodb/openapi/tools/cli/internal/openapi" + "github.com/spf13/afero" "github.com/tufin/oasdiff/load" "go.uber.org/mock/gomock" ) From 4b2fb0bd4645e6fb0413c52533cb0a5884b94159 Mon Sep 17 00:00:00 2001 From: Andrea Angiolillo Date: Mon, 11 Mar 2024 14:32:38 +0000 Subject: [PATCH 6/6] Update tools/cli/Makefile Co-authored-by: Gustavo Bazan --- tools/cli/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/cli/Makefile b/tools/cli/Makefile index dfe6877..4453dda 100644 --- a/tools/cli/Makefile +++ b/tools/cli/Makefile @@ -32,8 +32,8 @@ setup: deps devtools ## Set up dev env .PHONY: fmt fmt: ### Format all go files with goimports and gofmt - find . -name "*.go" -not -path "./internal/mocks" -exec gofmt -w "{}" \; - find . -name "*.go" -not -path "./internal/mocks" -exec goimports -l -w "{}" \; + find . -name "*.go" -exec gofmt -w "{}" \; + find . -name "*.go" -exec goimports -l -w "{}" \; .PHONY: build build: