Skip to content

Commit ee610ae

Browse files
committed
Add tests
1 parent 12738e8 commit ee610ae

File tree

6 files changed

+296
-114
lines changed

6 files changed

+296
-114
lines changed

internal/cli/root/atlas/builder.go

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,9 @@ func Builder(profile *string) *cobra.Command {
127127
c, _ := homebrew.NewChecker(fs)
128128
isHb := c.IsHomebrew()
129129

130-
notifier.notifyIfApplicable(isHb)
130+
if notifier.shouldCheck() {
131+
_ = notifier.notifyIfApplicable(isHb)
132+
}
131133
},
132134
}
133135
rootCmd.SetVersionTemplate(formattedVersion())
@@ -202,20 +204,16 @@ func formattedVersion() string {
202204
runtime.Compiler)
203205
}
204206

205-
func (c *Notifier) notifyIfApplicable(isHb bool) {
206-
if c.shouldCheck() {
207-
release, err := c.finder.Find()
208-
if err != nil || release == nil {
209-
return
210-
}
211-
_ = c.notify(isHb, release)
212-
}
213-
}
214207
func (c *Notifier) shouldCheck() bool {
215208
return !config.SkipUpdateCheck() && cli.IsTerminal(c.writer)
216209
}
217210

218-
func (c *Notifier) notify(isHb bool, release *latestrelease.ReleaseInformation) error {
211+
func (c *Notifier) notifyIfApplicable(isHb bool) error {
212+
release, err := c.finder.Find()
213+
if err != nil || release == nil {
214+
return err
215+
}
216+
219217
if isHb && !isAtLeast24HoursPast(release.PublishedAt) {
220218
return nil
221219
}
@@ -233,7 +231,7 @@ A new version of %s is available '%s'!
233231
234232
To disable this alert, run "%s config set skip_update_check true".
235233
`
236-
_, err := fmt.Fprintf(c.writer, newVersionTemplate, config.ToolName, release.Version, upgradeInstructions, config.BinName())
234+
_, err = fmt.Fprintf(c.writer, newVersionTemplate, config.ToolName, release.Version, upgradeInstructions, config.BinName())
237235
return err
238236
}
239237

internal/cli/root/atlas/builder_test.go

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,18 @@
1717
package atlas
1818

1919
import (
20+
"bytes"
21+
"fmt"
2022
"testing"
2123

24+
"github.com/golang/mock/gomock"
25+
"github.com/google/go-github/v42/github"
26+
"github.com/mongodb/mongocli/internal/config"
27+
"github.com/mongodb/mongocli/internal/latestrelease"
28+
"github.com/mongodb/mongocli/internal/mocks"
2229
"github.com/mongodb/mongocli/internal/test"
30+
"github.com/mongodb/mongocli/internal/version"
31+
"github.com/spf13/afero"
2332
)
2433

2534
func TestBuilder(t *testing.T) {
@@ -31,3 +40,92 @@ func TestBuilder(t *testing.T) {
3140
[]string{},
3241
)
3342
}
43+
44+
func TestOutputOpts_notifyIfApplicable(t *testing.T) {
45+
tests := testCases()
46+
for _, tt := range tests {
47+
t.Run(fmt.Sprintf("%v / %v", tt.currentVersion, tt.release.GetTagName()), func(t *testing.T) {
48+
config.ToolName = config.AtlasCLI
49+
prevVersion := version.Version
50+
version.Version = tt.currentVersion
51+
defer func() {
52+
version.Version = prevVersion
53+
}()
54+
55+
ctrl := gomock.NewController(t)
56+
mockDescriber := mocks.NewMockReleaseVersionDescriber(ctrl)
57+
defer ctrl.Finish()
58+
59+
mockDescriber.
60+
EXPECT().
61+
LatestWithCriteria(gomock.Any(), gomock.Any(), gomock.Any()).
62+
Return(tt.release, nil).
63+
Times(1)
64+
65+
bufOut := new(bytes.Buffer)
66+
fs := afero.NewMemMapFs()
67+
finder, _ := latestrelease.NewVersionFinder(fs, mockDescriber)
68+
69+
notifier := &Notifier{
70+
currentVersion: latestrelease.VersionFromTag(version.Version, config.ToolName),
71+
finder: finder,
72+
filesystem: fs,
73+
writer: bufOut,
74+
}
75+
76+
if err := notifier.notifyIfApplicable(false); err != nil {
77+
t.Errorf("notifyIfApplicable() unexpected error:%v", err)
78+
}
79+
80+
v := latestrelease.VersionFromTag(tt.release.GetTagName(), config.ToolName)
81+
want := ""
82+
if tt.expectNewVersion {
83+
want = fmt.Sprintf(`
84+
A new version of %s is available '%v'!
85+
To upgrade, see: https://dochub.mongodb.org/core/%s-install.
86+
87+
To disable this alert, run "%s config set skip_update_check true".
88+
`, config.ToolName, v, config.ToolName, config.BinName())
89+
}
90+
91+
if got := bufOut.String(); got != want {
92+
t.Errorf("notifyIfApplicable() got = %v, want %v", got, want)
93+
}
94+
})
95+
}
96+
}
97+
98+
type testCase struct {
99+
currentVersion string
100+
expectNewVersion bool
101+
release *github.RepositoryRelease
102+
}
103+
104+
func testCases() []testCase {
105+
f := false
106+
atlasV := "atlascli/v2.0.0"
107+
108+
tests := []testCase{
109+
{
110+
currentVersion: "v1.0.0",
111+
expectNewVersion: true,
112+
release: &github.RepositoryRelease{TagName: &atlasV, Prerelease: &f, Draft: &f},
113+
},
114+
{
115+
currentVersion: "atlascli/v1.0.0",
116+
expectNewVersion: true,
117+
release: &github.RepositoryRelease{TagName: &atlasV, Prerelease: &f, Draft: &f},
118+
},
119+
{
120+
currentVersion: "v3.0.0",
121+
expectNewVersion: false,
122+
release: &github.RepositoryRelease{TagName: &atlasV, Prerelease: &f, Draft: &f},
123+
},
124+
{
125+
currentVersion: "v3.0.0-123",
126+
expectNewVersion: false,
127+
release: &github.RepositoryRelease{TagName: &atlasV, Prerelease: &f, Draft: &f},
128+
},
129+
}
130+
return tests
131+
}

internal/cli/root/mongocli/builder.go

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@ func Builder(profile *string, argsWithoutProg []string) *cobra.Command {
7777
c, _ := homebrew.NewChecker(fs)
7878
isHb := c.IsHomebrew()
7979

80-
notifier.notifyIfApplicable(isHb)
80+
if notifier.shouldCheck() {
81+
_ = notifier.notifyIfApplicable(isHb)
82+
}
8183
},
8284
}
8385
rootCmd.SetVersionTemplate(formattedVersion())
@@ -143,20 +145,16 @@ func formattedVersion() string {
143145
runtime.Compiler)
144146
}
145147

146-
func (c *Notifier) notifyIfApplicable(isHb bool) {
147-
if c.shouldCheck() {
148-
release, err := c.finder.Find()
149-
if err != nil || release == nil {
150-
return
151-
}
152-
_ = c.notify(isHb, release)
153-
}
154-
}
155148
func (c *Notifier) shouldCheck() bool {
156149
return !config.SkipUpdateCheck() && cli.IsTerminal(c.writer)
157150
}
158151

159-
func (c *Notifier) notify(isHb bool, release *latestrelease.ReleaseInformation) error {
152+
func (c *Notifier) notifyIfApplicable(isHb bool) error {
153+
release, err := c.finder.Find()
154+
if err != nil || release == nil {
155+
return err
156+
}
157+
160158
if isHb && !isAtLeast24HoursPast(release.PublishedAt) {
161159
return nil
162160
}
@@ -174,7 +172,7 @@ A new version of %s is available '%s'!
174172
175173
To disable this alert, run "%s config set skip_update_check true".
176174
`
177-
_, err := fmt.Fprintf(c.writer, newVersionTemplate, config.ToolName, release.Version, upgradeInstructions, config.BinName())
175+
_, err = fmt.Fprintf(c.writer, newVersionTemplate, config.ToolName, release.Version, upgradeInstructions, config.BinName())
178176
return err
179177
}
180178

internal/cli/root/mongocli/builder_test.go

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,17 @@
1717
package mongocli
1818

1919
import (
20+
"bytes"
21+
"fmt"
2022
"testing"
23+
24+
"github.com/golang/mock/gomock"
25+
"github.com/google/go-github/v42/github"
26+
"github.com/mongodb/mongocli/internal/config"
27+
"github.com/mongodb/mongocli/internal/latestrelease"
28+
"github.com/mongodb/mongocli/internal/mocks"
29+
"github.com/mongodb/mongocli/internal/version"
30+
"github.com/spf13/afero"
2131
)
2232

2333
func TestBuilder(t *testing.T) {
@@ -120,3 +130,97 @@ func TestBuilder(t *testing.T) {
120130
})
121131
}
122132
}
133+
134+
func TestOutputOpts_notifyIfApplicable(t *testing.T) {
135+
tests := testCases()
136+
for _, tt := range tests {
137+
t.Run(fmt.Sprintf("%v / %v", tt.currentVersion, tt.release.GetTagName()), func(t *testing.T) {
138+
prevVersion := version.Version
139+
version.Version = tt.currentVersion
140+
defer func() {
141+
version.Version = prevVersion
142+
}()
143+
144+
ctrl := gomock.NewController(t)
145+
mockDescriber := mocks.NewMockReleaseVersionDescriber(ctrl)
146+
defer ctrl.Finish()
147+
148+
mockDescriber.
149+
EXPECT().
150+
LatestWithCriteria(gomock.Any(), gomock.Any(), gomock.Any()).
151+
Return(tt.release, nil).
152+
Times(1)
153+
154+
bufOut := new(bytes.Buffer)
155+
fs := afero.NewMemMapFs()
156+
finder, _ := latestrelease.NewVersionFinder(fs, mockDescriber)
157+
158+
notifier := &Notifier{
159+
currentVersion: latestrelease.VersionFromTag(version.Version, config.ToolName),
160+
finder: finder,
161+
filesystem: fs,
162+
writer: bufOut,
163+
}
164+
165+
if err := notifier.notifyIfApplicable(false); err != nil {
166+
t.Errorf("notifyIfApplicable() unexpected error:%v", err)
167+
}
168+
169+
v := latestrelease.VersionFromTag(tt.release.GetTagName(), config.ToolName)
170+
want := ""
171+
if tt.expectNewVersion {
172+
want = fmt.Sprintf(`
173+
A new version of %s is available '%v'!
174+
To upgrade, see: https://dochub.mongodb.org/core/%s-install.
175+
176+
To disable this alert, run "%s config set skip_update_check true".
177+
`, config.ToolName, v, config.ToolName, config.BinName())
178+
}
179+
180+
if got := bufOut.String(); got != want {
181+
t.Errorf("notifyIfApplicable() got = %v, want %v", got, want)
182+
}
183+
})
184+
}
185+
}
186+
187+
type testCase struct {
188+
currentVersion string
189+
expectNewVersion bool
190+
release *github.RepositoryRelease
191+
}
192+
193+
func testCases() []testCase {
194+
f := false
195+
mcliV := "mongocli/v2.0.0"
196+
mcliOldV := "v2.0.0"
197+
198+
tests := []testCase{
199+
{
200+
currentVersion: "v1.0.0",
201+
expectNewVersion: true,
202+
release: &github.RepositoryRelease{TagName: &mcliOldV, Prerelease: &f, Draft: &f},
203+
},
204+
{
205+
currentVersion: "mongocli/v1.0.0",
206+
expectNewVersion: true,
207+
release: &github.RepositoryRelease{TagName: &mcliOldV, Prerelease: &f, Draft: &f},
208+
},
209+
{
210+
currentVersion: "v1.0.0",
211+
expectNewVersion: true,
212+
release: &github.RepositoryRelease{TagName: &mcliV, Prerelease: &f, Draft: &f},
213+
},
214+
{
215+
currentVersion: "v3.0.0",
216+
expectNewVersion: false,
217+
release: &github.RepositoryRelease{TagName: &mcliOldV, Prerelease: &f, Draft: &f},
218+
},
219+
{
220+
currentVersion: "v3.0.0-123",
221+
expectNewVersion: false,
222+
release: &github.RepositoryRelease{TagName: &mcliV, Prerelease: &f, Draft: &f},
223+
},
224+
}
225+
return tests
226+
}

0 commit comments

Comments
 (0)