Skip to content
This repository was archived by the owner on Jul 28, 2020. It is now read-only.

Commit 77b0f54

Browse files
dgoddAnthony Emengo
authored andcommitted
Switch cfanalytics mocks from hand-rolled to gomock
- mockToggle - mockUI Signed-off-by: Anthony Emengo <[email protected]>
1 parent b4ddec5 commit 77b0f54

File tree

4 files changed

+166
-61
lines changed

4 files changed

+166
-61
lines changed

src/code.cloudfoundry.org/cfdev/cfanalytics/cfanalytics.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,25 @@ import (
1010
analytics "gopkg.in/segmentio/analytics-go.v3"
1111
)
1212

13-
const START_BEGIN = "start_begin"
14-
const START_END = "start_end"
15-
const STOP = "stop"
16-
const ERROR = "error"
17-
const UNINSTALL = "uninstall"
13+
const (
14+
START_BEGIN = "start_begin"
15+
START_END = "start_end"
16+
STOP = "stop"
17+
ERROR = "error"
18+
UNINSTALL = "uninstall"
19+
)
1820

1921
//go:generate mockgen -package mocks -destination mocks/analytics_client.go gopkg.in/segmentio/analytics-go.v3 Client
2022

23+
//go:generate mockgen -package mocks -destination mocks/toggle.go code.cloudfoundry.org/cfdev/cfanalytics Toggle
2124
type Toggle interface {
2225
Defined() bool
2326
Get() bool
2427
Set(value bool) error
2528
GetProps() map[string]interface{}
2629
}
30+
31+
//go:generate mockgen -package mocks -destination mocks/ui.go code.cloudfoundry.org/cfdev/cfanalytics UI
2732
type UI interface {
2833
Ask(prompt string) (answer string)
2934
}

src/code.cloudfoundry.org/cfdev/cfanalytics/cfanalytics_test.go

Lines changed: 30 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -14,119 +14,93 @@ import (
1414
analytics "gopkg.in/segmentio/analytics-go.v3"
1515
)
1616

17-
type MockUI struct {
18-
WasCalled bool
19-
Return string
20-
}
21-
22-
func (m *MockUI) Ask(prompt string) string {
23-
if prompt == `
24-
CF Dev collects anonymous usage data to help us improve your user experience. We intend to share these anonymous usage analytics with user community by publishing quarterly reports at :
25-
26-
https://github.com/pivotal-cf/cfdev/wiki/Telemetry
27-
28-
Are you ok with CF Dev periodically capturing anonymized telemetry [y/N]?` {
29-
m.WasCalled = true
30-
}
31-
32-
return m.Return
33-
}
34-
35-
type MockToggle struct {
36-
defined bool
37-
val bool
38-
props map[string]interface{}
39-
SetCalled bool
40-
}
41-
42-
func (t *MockToggle) Defined() bool { return t.defined }
43-
func (t *MockToggle) Get() bool { return t.val }
44-
func (t *MockToggle) Set(v bool) error { t.val = v; t.SetCalled = true; return nil }
45-
func (t *MockToggle) GetProps() map[string]interface{} { return t.props }
46-
4717
var _ = Describe("Analytics", func() {
4818
var (
4919
mockController *gomock.Controller
5020
mockClient *mocks.MockClient
51-
52-
mockToggle *MockToggle
53-
exitChan chan struct{}
54-
mockUI MockUI
55-
subject *cfanalytics.Analytics
21+
mockToggle *mocks.MockToggle
22+
mockUI *mocks.MockUI
23+
exitChan chan struct{}
24+
subject *cfanalytics.Analytics
5625
)
5726
BeforeEach(func() {
5827
mockController = gomock.NewController(GinkgoT())
5928
mockClient = mocks.NewMockClient(mockController)
60-
61-
mockToggle = &MockToggle{}
29+
mockToggle = mocks.NewMockToggle(mockController)
30+
mockUI = mocks.NewMockUI(mockController)
6231
exitChan = make(chan struct{}, 1)
63-
mockUI = MockUI{WasCalled: false}
64-
subject = cfanalytics.New(mockToggle, mockClient, "4.5.6-unit-test", exitChan, &mockUI)
32+
subject = cfanalytics.New(mockToggle, mockClient, "4.5.6-unit-test", exitChan, mockUI)
6533
})
6634
AfterEach(func() {
6735
mockController.Finish()
6836
})
6937

7038
Describe("PromptOptIn", func() {
7139
Context("When user has NOT yet answered optin prompt", func() {
72-
BeforeEach(func() { mockToggle.defined = false })
40+
BeforeEach(func() {
41+
mockToggle.EXPECT().Defined().Return(false).AnyTimes()
42+
})
7343
It("prompts user", func() {
44+
mockToggle.EXPECT().Set(gomock.Any()).AnyTimes()
45+
mockUI.EXPECT().Ask(gomock.Any()).Do(func(prompt string) {
46+
Expect(prompt).To(ContainSubstring("Are you ok with CF Dev periodically capturing anonymized telemetry [y/N]?"))
47+
})
7448
Expect(subject.PromptOptIn()).To(Succeed())
75-
Expect(mockUI.WasCalled).To(Equal(true))
7649
})
7750
for _, answer := range []string{"yes", "y", "yEs"} {
7851
Context("user answers "+answer, func() {
79-
BeforeEach(func() { mockUI.Return = answer })
52+
BeforeEach(func() { mockUI.EXPECT().Ask(gomock.Any()).Return(answer) })
8053
It("saves optin", func() {
54+
mockToggle.EXPECT().Set(true)
55+
8156
Expect(subject.PromptOptIn()).To(Succeed())
82-
Expect(mockToggle.SetCalled).To(Equal(true))
83-
Expect(mockToggle.val).To(Equal(true))
8457
})
8558
})
8659
}
8760
for _, answer := range []string{"no", "N", "anything", ""} {
8861
Context("user answers "+answer, func() {
89-
BeforeEach(func() { mockUI.Return = answer })
62+
BeforeEach(func() { mockUI.EXPECT().Ask(gomock.Any()).Return(answer) })
9063
It("saves optout", func() {
64+
mockToggle.EXPECT().Set(false)
65+
9166
Expect(subject.PromptOptIn()).To(Succeed())
92-
Expect(mockToggle.SetCalled).To(Equal(true))
93-
Expect(mockToggle.val).To(Equal(false))
9467
})
9568
})
9669
}
9770
Context("user hits ctrl-c", func() {
9871
BeforeEach(func() {
99-
mockUI.Return = ""
72+
mockUI.EXPECT().Ask(gomock.Any()).Return("")
10073
exitChan <- struct{}{}
10174
})
10275
It("does not write set a value on toggle", func() {
10376
Expect(subject.PromptOptIn()).To(MatchError("Exit while waiting for telemetry prompt"))
104-
Expect(mockToggle.SetCalled).To(Equal(false))
10577
})
10678
})
10779
})
10880
Context("When user has answered optin prompt", func() {
109-
BeforeEach(func() { mockToggle.defined = true })
81+
BeforeEach(func() {
82+
mockToggle.EXPECT().Defined().AnyTimes().Return(true)
83+
})
11084
It("does not ask again", func() {
11185
Expect(subject.PromptOptIn()).To(Succeed())
112-
Expect(mockUI.WasCalled).To(Equal(false))
113-
Expect(mockToggle.SetCalled).To(Equal(false))
11486
})
11587
})
11688
})
11789
Describe("Event", func() {
11890
Context("opt out", func() {
119-
BeforeEach(func() { mockToggle.val = false })
91+
BeforeEach(func() {
92+
mockToggle.EXPECT().Get().AnyTimes().Return(false)
93+
})
12094
It("does nothing and succeeds", func() {
12195
Expect(subject.Event("anevent", map[string]interface{}{"mykey": "myval"})).To(Succeed())
12296
})
12397
})
12498
Context("opt in", func() {
12599
BeforeEach(func() {
126-
mockToggle.val = true
127-
mockToggle.props = map[string]interface{}{
100+
mockToggle.EXPECT().Get().AnyTimes().Return(true)
101+
mockToggle.EXPECT().GetProps().AnyTimes().Return(map[string]interface{}{
128102
"type": "cf.1.2.3.iso",
129-
}
103+
})
130104
})
131105
It("sends identity and event to segmentio", func() {
132106
uuid, _ := machineid.ProtectedID("cfdev")

src/code.cloudfoundry.org/cfdev/cfanalytics/mocks/toggle.go

Lines changed: 81 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/code.cloudfoundry.org/cfdev/cfanalytics/mocks/ui.go

Lines changed: 45 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)