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

Commit b4ddec5

Browse files
dgoddAnthony Emengo
authored andcommitted
Identify user with analytics client before tracking
- Migrate hand-rolled client mock to gomock - Mixpanel doesn't support 'AnonymousId' for identify on their 'People' page [#157195474] Signed-off-by: Anthony Emengo <[email protected]>
1 parent e16bf0b commit b4ddec5

File tree

3 files changed

+98
-25
lines changed

3 files changed

+98
-25
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ const STOP = "stop"
1616
const ERROR = "error"
1717
const UNINSTALL = "uninstall"
1818

19+
//go:generate mockgen -package mocks -destination mocks/analytics_client.go gopkg.in/segmentio/analytics-go.v3 Client
20+
1921
type Toggle interface {
2022
Defined() bool
2123
Get() bool
@@ -58,6 +60,11 @@ func (a *Analytics) Event(event string, data ...map[string]interface{}) error {
5860
if !a.toggle.Get() {
5961
return nil
6062
}
63+
64+
a.client.Enqueue(analytics.Identify{
65+
UserId: a.userId,
66+
})
67+
6168
properties := analytics.NewProperties()
6269
properties.Set("os", runtime.GOOS)
6370
properties.Set("version", a.version)

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

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import (
55
"time"
66

77
"code.cloudfoundry.org/cfdev/cfanalytics"
8+
"code.cloudfoundry.org/cfdev/cfanalytics/mocks"
89
"github.com/denisbrodbeck/machineid"
10+
"github.com/golang/mock/gomock"
911
. "github.com/onsi/ginkgo"
1012
. "github.com/onsi/gomega"
1113
"github.com/onsi/gomega/gstruct"
@@ -42,29 +44,28 @@ func (t *MockToggle) Get() bool { return t.val }
4244
func (t *MockToggle) Set(v bool) error { t.val = v; t.SetCalled = true; return nil }
4345
func (t *MockToggle) GetProps() map[string]interface{} { return t.props }
4446

45-
type MockClient struct {
46-
CloseWasCalled bool
47-
EnqueueCalledWith analytics.Message
48-
}
49-
50-
func (c *MockClient) Close() error { c.CloseWasCalled = true; return nil }
51-
func (c *MockClient) Enqueue(msg analytics.Message) error { c.EnqueueCalledWith = msg; return nil }
52-
5347
var _ = Describe("Analytics", func() {
5448
var (
49+
mockController *gomock.Controller
50+
mockClient *mocks.MockClient
51+
5552
mockToggle *MockToggle
56-
mockClient *MockClient
5753
exitChan chan struct{}
5854
mockUI MockUI
5955
subject *cfanalytics.Analytics
6056
)
6157
BeforeEach(func() {
58+
mockController = gomock.NewController(GinkgoT())
59+
mockClient = mocks.NewMockClient(mockController)
60+
6261
mockToggle = &MockToggle{}
63-
mockClient = &MockClient{}
6462
exitChan = make(chan struct{}, 1)
6563
mockUI = MockUI{WasCalled: false}
6664
subject = cfanalytics.New(mockToggle, mockClient, "4.5.6-unit-test", exitChan, &mockUI)
6765
})
66+
AfterEach(func() {
67+
mockController.Finish()
68+
})
6869

6970
Describe("PromptOptIn", func() {
7071
Context("When user has NOT yet answered optin prompt", func() {
@@ -118,7 +119,6 @@ var _ = Describe("Analytics", func() {
118119
BeforeEach(func() { mockToggle.val = false })
119120
It("does nothing and succeeds", func() {
120121
Expect(subject.Event("anevent", map[string]interface{}{"mykey": "myval"})).To(Succeed())
121-
Expect(mockClient.EnqueueCalledWith).To(BeNil())
122122
})
123123
})
124124
Context("opt in", func() {
@@ -128,21 +128,29 @@ var _ = Describe("Analytics", func() {
128128
"type": "cf.1.2.3.iso",
129129
}
130130
})
131-
It("sends event to segmentio", func() {
132-
Expect(subject.Event("anevent", map[string]interface{}{"mykey": "myval"})).To(Succeed())
133-
131+
It("sends identity and event to segmentio", func() {
134132
uuid, _ := machineid.ProtectedID("cfdev")
135-
Expect(mockClient.EnqueueCalledWith).To(gstruct.MatchFields(gstruct.IgnoreExtras, gstruct.Fields{
136-
"UserId": Equal(uuid),
137-
"Event": Equal("anevent"),
138-
"Timestamp": BeTemporally(">=", time.Now().Add(-1*time.Minute)),
139-
"Properties": BeEquivalentTo(map[string]interface{}{
140-
"os": runtime.GOOS,
141-
"version": "4.5.6-unit-test",
142-
"type": "cf.1.2.3.iso",
143-
"mykey": "myval",
144-
}),
145-
}))
133+
134+
mockClient.EXPECT().Enqueue(gomock.Any()).Do(func(msg analytics.Message) {
135+
Expect(msg).To(Equal(analytics.Identify{
136+
UserId: uuid,
137+
}))
138+
})
139+
mockClient.EXPECT().Enqueue(gomock.Any()).Do(func(msg analytics.Message) {
140+
Expect(msg).To(gstruct.MatchFields(gstruct.IgnoreExtras, gstruct.Fields{
141+
"UserId": Equal(uuid),
142+
"Event": Equal("anevent"),
143+
"Timestamp": BeTemporally(">=", time.Now().Add(-1*time.Minute)),
144+
"Properties": BeEquivalentTo(map[string]interface{}{
145+
"os": runtime.GOOS,
146+
"version": "4.5.6-unit-test",
147+
"type": "cf.1.2.3.iso",
148+
"mykey": "myval",
149+
}),
150+
}))
151+
})
152+
153+
Expect(subject.Event("anevent", map[string]interface{}{"mykey": "myval"})).To(Succeed())
146154
})
147155
})
148156
})

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

Lines changed: 58 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)