Skip to content

Commit 6d07846

Browse files
author
Michael Ng
authored
refac(test): Move some client tests into test suite. (#125)
1 parent 023d4d5 commit 6d07846

File tree

3 files changed

+182
-181
lines changed

3 files changed

+182
-181
lines changed

optimizely/client/client_test.go

Lines changed: 148 additions & 179 deletions
Original file line numberDiff line numberDiff line change
@@ -144,183 +144,6 @@ func TestTrackFail(t *testing.T) {
144144

145145
}
146146

147-
func TestIsFeatureEnabled(t *testing.T) {
148-
testUserContext := entities.UserContext{ID: "test_user_1"}
149-
testVariation := entities.Variation{
150-
ID: "22222",
151-
Key: "22222",
152-
FeatureEnabled: true,
153-
}
154-
testExperiment := entities.Experiment{
155-
ID: "111111",
156-
Variations: map[string]entities.Variation{"22222": testVariation},
157-
}
158-
testFeatureKey := "test_feature_key"
159-
testFeature := entities.Feature{
160-
ID: "22222",
161-
Key: testFeatureKey,
162-
FeatureExperiments: []entities.Experiment{testExperiment},
163-
}
164-
// Test happy path
165-
mockConfig := new(MockProjectConfig)
166-
mockConfig.On("GetFeatureByKey", testFeatureKey).Return(testFeature, nil)
167-
mockConfigManager := new(MockProjectConfigManager)
168-
mockConfigManager.On("GetConfig").Return(mockConfig, nil)
169-
// Set up the mock decision service and its return value
170-
testDecisionContext := decision.FeatureDecisionContext{
171-
Feature: &testFeature,
172-
ProjectConfig: mockConfig,
173-
}
174-
175-
expectedFeatureDecision := decision.FeatureDecision{
176-
Experiment: testExperiment,
177-
Variation: &testVariation,
178-
}
179-
180-
mockDecisionService := new(MockDecisionService)
181-
mockDecisionService.On("GetFeatureDecision", testDecisionContext, testUserContext).Return(expectedFeatureDecision, nil)
182-
183-
client := OptimizelyClient{
184-
ConfigManager: mockConfigManager,
185-
DecisionService: mockDecisionService,
186-
}
187-
result, _ := client.IsFeatureEnabled(testFeatureKey, testUserContext)
188-
assert.True(t, result)
189-
mockConfig.AssertExpectations(t)
190-
mockConfigManager.AssertExpectations(t)
191-
mockDecisionService.AssertExpectations(t)
192-
}
193-
194-
func TestIsFeatureEnabledErrorCases(t *testing.T) {
195-
testUserContext := entities.UserContext{ID: "test_user_1"}
196-
testFeatureKey := "test_feature_key"
197-
198-
// Test instance invalid
199-
mockConfigManager := new(MockProjectConfigManager)
200-
mockConfigManager.On("GetConfig").Return(nil, errors.New("no project config available"))
201-
mockDecisionService := new(MockDecisionService)
202-
203-
client := OptimizelyClient{
204-
ConfigManager: mockConfigManager,
205-
DecisionService: mockDecisionService,
206-
}
207-
result, _ := client.IsFeatureEnabled(testFeatureKey, testUserContext)
208-
assert.False(t, result)
209-
mockDecisionService.AssertNotCalled(t, "GetFeatureDecision")
210-
211-
// Test invalid feature key
212-
expectedError := errors.New("Invalid feature key")
213-
mockConfig := new(MockProjectConfig)
214-
mockConfig.On("GetFeatureByKey", testFeatureKey).Return(entities.Feature{}, expectedError)
215-
216-
mockConfigManager = new(MockProjectConfigManager)
217-
mockConfigManager.On("GetConfig").Return(mockConfig, nil)
218-
mockDecisionService = new(MockDecisionService)
219-
client = OptimizelyClient{
220-
ConfigManager: mockConfigManager,
221-
DecisionService: mockDecisionService,
222-
}
223-
result, err := client.IsFeatureEnabled(testFeatureKey, testUserContext)
224-
if assert.Error(t, err) {
225-
assert.Equal(t, expectedError, err)
226-
}
227-
assert.False(t, result)
228-
mockConfigManager.AssertExpectations(t)
229-
mockDecisionService.AssertNotCalled(t, "GetDecision")
230-
}
231-
232-
func TestIsFeatureEnabledPanic(t *testing.T) {
233-
testUserContext := entities.UserContext{ID: "test_user_1"}
234-
testFeatureKey := "test_feature_key"
235-
236-
mockDecisionService := new(MockDecisionService)
237-
238-
client := OptimizelyClient{
239-
ConfigManager: &PanickingConfigManager{},
240-
DecisionService: mockDecisionService,
241-
}
242-
243-
// ensure that the client calms back down and recovers
244-
result, err := client.IsFeatureEnabled(testFeatureKey, testUserContext)
245-
assert.False(t, result)
246-
assert.True(t, assert.Error(t, err))
247-
}
248-
249-
func TestGetEnabledFeatures(t *testing.T) {
250-
testUserContext := entities.UserContext{ID: "test_user_1"}
251-
testVariationEnabled := entities.Variation{
252-
ID: "22222",
253-
Key: "22222",
254-
FeatureEnabled: true,
255-
}
256-
testVariationDisabled := entities.Variation{
257-
ID: "22222",
258-
Key: "22222",
259-
FeatureEnabled: false,
260-
}
261-
testExperimentEnabled := entities.Experiment{
262-
ID: "111111",
263-
Variations: map[string]entities.Variation{"22222": testVariationEnabled},
264-
}
265-
testExperimentDisabled := entities.Experiment{
266-
ID: "111111",
267-
Variations: map[string]entities.Variation{"22222": testVariationDisabled},
268-
}
269-
testFeatureEnabledKey := "test_feature_enabled_key"
270-
testFeatureEnabled := entities.Feature{
271-
ID: "22222",
272-
Key: testFeatureEnabledKey,
273-
FeatureExperiments: []entities.Experiment{testExperimentEnabled},
274-
}
275-
testFeatureDisabledKey := "test_feature_disabled_key"
276-
testFeatureDisabled := entities.Feature{
277-
ID: "22222",
278-
Key: testFeatureDisabledKey,
279-
FeatureExperiments: []entities.Experiment{testExperimentDisabled},
280-
}
281-
featureList := []entities.Feature{testFeatureEnabled, testFeatureDisabled}
282-
// Test happy path
283-
mockConfig := new(MockProjectConfig)
284-
mockConfig.On("GetFeatureByKey", testFeatureEnabledKey).Return(testFeatureEnabled, nil)
285-
mockConfig.On("GetFeatureByKey", testFeatureDisabledKey).Return(testFeatureDisabled, nil)
286-
mockConfig.On("GetFeatureList").Return(featureList)
287-
mockConfigManager := new(MockProjectConfigManager)
288-
mockConfigManager.On("GetConfig").Return(mockConfig, nil)
289-
// Set up the mock decision service and its return value
290-
testDecisionContextEnabled := decision.FeatureDecisionContext{
291-
Feature: &testFeatureEnabled,
292-
ProjectConfig: mockConfig,
293-
}
294-
testDecisionContextDisabled := decision.FeatureDecisionContext{
295-
Feature: &testFeatureDisabled,
296-
ProjectConfig: mockConfig,
297-
}
298-
299-
expectedFeatureDecisionEnabled := decision.FeatureDecision{
300-
Experiment: testExperimentEnabled,
301-
Variation: &testVariationEnabled,
302-
}
303-
expectedFeatureDecisionDisabled := decision.FeatureDecision{
304-
Experiment: testExperimentDisabled,
305-
Variation: &testVariationDisabled,
306-
}
307-
308-
mockDecisionService := new(MockDecisionService)
309-
mockDecisionService.On("GetFeatureDecision", testDecisionContextEnabled, testUserContext).Return(expectedFeatureDecisionEnabled, nil)
310-
mockDecisionService.On("GetFeatureDecision", testDecisionContextDisabled, testUserContext).Return(expectedFeatureDecisionDisabled, nil)
311-
312-
client := OptimizelyClient{
313-
ConfigManager: mockConfigManager,
314-
DecisionService: mockDecisionService,
315-
}
316-
result, err := client.GetEnabledFeatures(testUserContext)
317-
assert.NoError(t, err)
318-
assert.ElementsMatch(t, result, []string{testFeatureEnabledKey})
319-
mockConfig.AssertExpectations(t)
320-
mockConfigManager.AssertExpectations(t)
321-
mockDecisionService.AssertExpectations(t)
322-
}
323-
324147
func TestGetEnabledFeaturesErrorCases(t *testing.T) {
325148
testUserContext := entities.UserContext{ID: "test_user_1"}
326149

@@ -1639,7 +1462,7 @@ func (s *ClientTestSuiteAB) SetupTest() {
16391462

16401463
func (s *ClientTestSuiteAB) TestActivate() {
16411464
testUserContext := entities.UserContext{ID: "test_user_1"}
1642-
testExperiment := getTestExperiment("test_exp_1")
1465+
testExperiment := makeTestExperiment("test_exp_1")
16431466
s.mockConfig.On("GetExperimentByKey", "test_exp_1").Return(testExperiment, nil)
16441467

16451468
testDecisionContext := decision.ExperimentDecisionContext{
@@ -1683,7 +1506,7 @@ func (s *ClientTestSuiteAB) TestActivatePanics() {
16831506

16841507
func (s *ClientTestSuiteAB) TestGetVariation() {
16851508
testUserContext := entities.UserContext{ID: "test_user_1"}
1686-
testExperiment := getTestExperiment("test_exp_1")
1509+
testExperiment := makeTestExperiment("test_exp_1")
16871510
s.mockConfig.On("GetExperimentByKey", "test_exp_1").Return(testExperiment, nil)
16881511

16891512
testDecisionContext := decision.ExperimentDecisionContext{
@@ -1723,6 +1546,152 @@ func (s *ClientTestSuiteAB) TestGetVariationPanics() {
17231546
s.EqualError(err, "I'm panicking")
17241547
}
17251548

1549+
type ClientTestSuiteFM struct {
1550+
suite.Suite
1551+
mockConfig *MockProjectConfig
1552+
mockConfigManager *MockProjectConfigManager
1553+
mockDecisionService *MockDecisionService
1554+
mockEventProcessor *MockEventProcessor
1555+
}
1556+
1557+
func (s *ClientTestSuiteFM) SetupTest() {
1558+
s.mockConfig = new(MockProjectConfig)
1559+
s.mockConfigManager = new(MockProjectConfigManager)
1560+
s.mockConfigManager.On("GetConfig").Return(s.mockConfig, nil)
1561+
s.mockDecisionService = new(MockDecisionService)
1562+
s.mockEventProcessor = new(MockEventProcessor)
1563+
}
1564+
1565+
func (s *ClientTestSuiteFM) TestIsFeatureEnabled() {
1566+
testUserContext := entities.UserContext{ID: "test_user_1"}
1567+
1568+
// Test happy path
1569+
testVariation := makeTestVariation("green", true)
1570+
testExperiment := makeTestExperimentWithVariations("number_1", []entities.Variation{testVariation})
1571+
testFeature := makeTestFeatureWithExperiment("feature_1", testExperiment)
1572+
s.mockConfig.On("GetFeatureByKey", testFeature.Key).Return(testFeature, nil)
1573+
s.mockConfigManager.On("GetConfig").Return(s.mockConfig, nil)
1574+
1575+
// Set up the mock decision service and its return value
1576+
testDecisionContext := decision.FeatureDecisionContext{
1577+
Feature: &testFeature,
1578+
ProjectConfig: s.mockConfig,
1579+
}
1580+
1581+
expectedFeatureDecision := decision.FeatureDecision{
1582+
Experiment: testExperiment,
1583+
Variation: &testVariation,
1584+
}
1585+
1586+
s.mockDecisionService.On("GetFeatureDecision", testDecisionContext, testUserContext).Return(expectedFeatureDecision, nil)
1587+
1588+
client := OptimizelyClient{
1589+
ConfigManager: s.mockConfigManager,
1590+
DecisionService: s.mockDecisionService,
1591+
}
1592+
result, _ := client.IsFeatureEnabled(testFeature.Key, testUserContext)
1593+
s.True(result)
1594+
s.mockConfig.AssertExpectations(s.T())
1595+
s.mockConfigManager.AssertExpectations(s.T())
1596+
s.mockDecisionService.AssertExpectations(s.T())
1597+
}
1598+
1599+
func (s *ClientTestSuiteFM) TestIsFeatureEnabledErrorCases() {
1600+
testUserContext := entities.UserContext{ID: "test_user_1"}
1601+
testFeatureKey := "test_feature_key"
1602+
1603+
// Test instance invalid
1604+
s.mockConfigManager.On("GetConfig").Return(nil, errors.New("no project config available"))
1605+
1606+
client := OptimizelyClient{
1607+
ConfigManager: s.mockConfigManager,
1608+
DecisionService: s.mockDecisionService,
1609+
}
1610+
result, _ := client.IsFeatureEnabled(testFeatureKey, testUserContext)
1611+
s.False(result)
1612+
s.mockDecisionService.AssertNotCalled(s.T(), "GetFeatureDecision")
1613+
1614+
// Test invalid feature key
1615+
expectedError := errors.New("Invalid feature key")
1616+
s.mockConfig.On("GetFeatureByKey", testFeatureKey).Return(entities.Feature{}, expectedError)
1617+
s.mockConfigManager.On("GetConfig").Return(s.mockConfig, nil)
1618+
1619+
client = OptimizelyClient{
1620+
ConfigManager: s.mockConfigManager,
1621+
DecisionService: s.mockDecisionService,
1622+
}
1623+
result, err := client.IsFeatureEnabled(testFeatureKey, testUserContext)
1624+
if s.Error(err) {
1625+
s.Equal(expectedError, err)
1626+
}
1627+
s.False(result)
1628+
s.mockConfigManager.AssertExpectations(s.T())
1629+
s.mockDecisionService.AssertNotCalled(s.T(), "GetDecision")
1630+
}
1631+
1632+
func (s *ClientTestSuiteFM) TestIsFeatureEnabledPanic() {
1633+
testUserContext := entities.UserContext{ID: "test_user_1"}
1634+
testFeatureKey := "test_feature_key"
1635+
1636+
client := OptimizelyClient{
1637+
ConfigManager: &PanickingConfigManager{},
1638+
}
1639+
1640+
// ensure that the client calms back down and recovers
1641+
result, err := client.IsFeatureEnabled(testFeatureKey, testUserContext)
1642+
s.False(result)
1643+
s.Error(err)
1644+
}
1645+
1646+
func (s *ClientTestSuiteFM) TestGetEnabledFeatures() {
1647+
testUserContext := entities.UserContext{ID: "test_user_1"}
1648+
testVariationEnabled := makeTestVariation("a", true)
1649+
testVariationDisabled := makeTestVariation("b", false)
1650+
testExperimentEnabled := makeTestExperimentWithVariations("enabled_exp", []entities.Variation{testVariationEnabled})
1651+
testExperimentDisabled := makeTestExperimentWithVariations("disabled_exp", []entities.Variation{testVariationDisabled})
1652+
testFeatureEnabled := makeTestFeatureWithExperiment("enabled_feat", testExperimentEnabled)
1653+
testFeatureDisabled := makeTestFeatureWithExperiment("disabled_feat", testExperimentDisabled)
1654+
1655+
featureList := []entities.Feature{testFeatureEnabled, testFeatureDisabled}
1656+
s.mockConfig.On("GetFeatureByKey", testFeatureEnabled.Key).Return(testFeatureEnabled, nil)
1657+
s.mockConfig.On("GetFeatureByKey", testFeatureDisabled.Key).Return(testFeatureDisabled, nil)
1658+
s.mockConfig.On("GetFeatureList").Return(featureList)
1659+
s.mockConfigManager.On("GetConfig").Return(s.mockConfig, nil)
1660+
1661+
testDecisionContextEnabled := decision.FeatureDecisionContext{
1662+
Feature: &testFeatureEnabled,
1663+
ProjectConfig: s.mockConfig,
1664+
}
1665+
testDecisionContextDisabled := decision.FeatureDecisionContext{
1666+
Feature: &testFeatureDisabled,
1667+
ProjectConfig: s.mockConfig,
1668+
}
1669+
1670+
expectedFeatureDecisionEnabled := decision.FeatureDecision{
1671+
Experiment: testExperimentEnabled,
1672+
Variation: &testVariationEnabled,
1673+
}
1674+
expectedFeatureDecisionDisabled := decision.FeatureDecision{
1675+
Experiment: testExperimentDisabled,
1676+
Variation: &testVariationDisabled,
1677+
}
1678+
1679+
s.mockDecisionService.On("GetFeatureDecision", testDecisionContextEnabled, testUserContext).Return(expectedFeatureDecisionEnabled, nil)
1680+
s.mockDecisionService.On("GetFeatureDecision", testDecisionContextDisabled, testUserContext).Return(expectedFeatureDecisionDisabled, nil)
1681+
1682+
client := OptimizelyClient{
1683+
ConfigManager: s.mockConfigManager,
1684+
DecisionService: s.mockDecisionService,
1685+
}
1686+
result, err := client.GetEnabledFeatures(testUserContext)
1687+
s.NoError(err)
1688+
s.ElementsMatch(result, []string{testFeatureEnabled.Key})
1689+
s.mockConfig.AssertExpectations(s.T())
1690+
s.mockConfigManager.AssertExpectations(s.T())
1691+
s.mockDecisionService.AssertExpectations(s.T())
1692+
}
1693+
17261694
func TestClientTestSuite(t *testing.T) {
17271695
suite.Run(t, new(ClientTestSuiteAB))
1696+
suite.Run(t, new(ClientTestSuiteFM))
17281697
}

0 commit comments

Comments
 (0)