Skip to content

Commit

Permalink
Update Opticks to support Optimizely's JS SDK v5.3.2
Browse files Browse the repository at this point in the history
  • Loading branch information
Vinicius de Lacerda committed Jun 5, 2024
1 parent b742a51 commit 8c7dd43
Show file tree
Hide file tree
Showing 8 changed files with 91 additions and 242 deletions.
4 changes: 2 additions & 2 deletions packages/lib/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,10 @@
"author": "Jop de Klein",
"license": "ISC",
"peerDependencies": {
"@optimizely/optimizely-sdk": "~4.4.3"
"@optimizely/optimizely-sdk": "5.3.2"
},
"devDependencies": {
"@optimizely/optimizely-sdk": "~4.4.3",
"@optimizely/optimizely-sdk": "5.3.2",
"@types/jest": "^29.4.0",
"jest": "^29.4.0",
"ts-jest": "^29.0.5",
Expand Down
58 changes: 0 additions & 58 deletions packages/lib/src/core/booleanToggle.test.ts

This file was deleted.

24 changes: 0 additions & 24 deletions packages/lib/src/core/booleanToggle.ts

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,18 @@ export const createInstanceMock = jest.fn(() => ({
notificationCenter: {
addNotificationListener: addNotificationListenerMock
},
activate: activateMock
activate: activateMock,
createUserContext: optimizelyUserContextMock
}))

export const decideMock = jest.fn((toggleKey) => ({
enabled: toggleKey === "foo"
}))
export const optimizelyUserContextMock = jest.fn((userId, attributes) => ({
decide: decideMock
}))


export const isFeatureEnabledMock = jest.fn((toggleId) => toggleId === 'foo')

export const getEnabledFeaturesMock = jest.fn((userId, attributes) => {
Expand All @@ -38,8 +47,12 @@ export const activateMock = jest.fn((toggleId, userId) => {
return shouldReturnB && 'b'
})

const originalModule = jest.requireActual('@optimizely/optimizely-sdk')

const mock = {
...originalModule,
createInstance: createInstanceMock
}


export default mock
56 changes: 15 additions & 41 deletions packages/lib/src/integrations/optimizely.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,12 @@ import {
setUserId,
setAudienceSegmentationAttributes,
resetAudienceSegmentationAttributes,
booleanToggle,
toggle,
forceToggles,
getEnabledFeatures
} from './optimizely'

// During the tests:
// for booleanToggle 'foo' yields true and 'bar' yields false, unless forced
// for toggle 'foo' yields 'b' and 'bar' yields 'a', unless forced
import datafile from './__fixtures__/dataFile'

Expand All @@ -26,7 +24,11 @@ import Optimizely, {
// @ts-expect-error
getEnabledFeaturesMock,
// @ts-expect-error
activateMock
activateMock,
// @ts-expect-error
decideMock,
// @ts-expect-error
optimizelyUserContextMock
} from '@optimizely/optimizely-sdk'

// Re-used between toggle test suites
Expand Down Expand Up @@ -123,9 +125,6 @@ describe('Optimizely Integration', () => {
expect(() => toggle('foo')).toThrow(
'Opticks: Fatal error: user id is not set'
)
expect(() => booleanToggle('foo')).toThrow(
'Opticks: Fatal error: user id is not set'
)
})
})

Expand All @@ -140,25 +139,18 @@ describe('Optimizely Integration', () => {
expect(toggle('bax', 'a', 'b', 'c')).toEqual('c')
expect(toggle('foo')).toEqual('b')
expect(toggle('bar')).toEqual('a')
expect(booleanToggle('foo')).toEqual(true)
expect(booleanToggle('bar')).toEqual(false)
})
*/

it('Forwards toggle reading and audienceSegmentationAttributes to Optimizely', () => {
toggle('foo', 'a', 'b', 'c')
expect(activateMock).toHaveBeenCalledWith('foo', 'fooBSide', {})
toggle('foo')
expect(isFeatureEnabledMock).toHaveBeenCalledWith(
'foo',
'fooBSide',
{}
expect(decideMock).toHaveBeenCalledWith(
'foo'
)
booleanToggle('foo')
expect(isFeatureEnabledMock).toHaveBeenCalledWith(
'foo',
'fooBSide',
{}
expect(optimizelyUserContextMock).toHaveBeenCalledWith(
'fooBSide', {}
)
})
})
Expand All @@ -182,16 +174,11 @@ describe('Optimizely Integration', () => {
deviceType: 'mobile',
isLoggedIn: false
})
})

it('Forwards toggle reading and audienceSegmentationAttributes to Optimizely', () => {
toggle('foo')
expect(isFeatureEnabledMock).toHaveBeenCalledWith('foo', 'fooBSide', {
thisWillNotBeOverwritten: 'foo',
deviceType: 'mobile',
isLoggedIn: false
})

booleanToggle('foo')
expect(isFeatureEnabledMock).toHaveBeenCalledWith('foo', 'fooBSide', {
expect(optimizelyUserContextMock).toHaveBeenCalledWith('fooBSide', {
thisWillNotBeOverwritten: 'foo',
deviceType: 'mobile',
isLoggedIn: false
Expand All @@ -213,26 +200,23 @@ describe('Optimizely Integration', () => {
})

toggle('foo', 'a', 'b')
expect(isFeatureEnabledMock).toHaveBeenCalledWith('foo', 'fooBSide', {
expect(optimizelyUserContextMock).toHaveBeenCalledWith('fooBSide', {
valueAfterReset: true
})

toggle('foo')
expect(isFeatureEnabledMock).toHaveBeenCalledWith('foo', 'fooBSide', {
expect(optimizelyUserContextMock).toHaveBeenCalledWith('fooBSide', {
valueAfterReset: true
})
})
})

testAudienceSegmentationCacheBusting(toggle, activateMock)
testAudienceSegmentationCacheBusting(booleanToggle, isFeatureEnabledMock)

it("Returns Optimizely's value when no arguments supplied using booleanToggle", () => {
it("Returns Optimizely's value when no arguments supplied using", () => {
// maps to a, b, c
expect(toggle('foo')).toEqual('b')
expect(toggle('bar')).toEqual('a')
expect(booleanToggle('foo')).toBeTruthy()
expect(booleanToggle('bar')).toBeFalsy()
})

it('Maps Optimizely value to a, b, c indexed arguments', () => {
Expand All @@ -257,27 +241,21 @@ describe('Optimizely Integration', () => {
expect(toggle('bax', 'a', 'b', 'c')).toEqual('c')
expect(toggle('bar')).toEqual('a')
expect(toggle('baz')).toEqual('b')
expect(booleanToggle('bar')).toEqual(false)
expect(booleanToggle('baz')).toEqual(true)
})

it('allows you to invent non-existing experiments', () => {
expect(toggle('bax', 'a', 'b', 'c')).toEqual('c')
expect(booleanToggle('baz')).toEqual(true)
})

it('persist after setAudienceSegmentationAttributes is called', () => {
expect(toggle('bax', 'a', 'b', 'c')).toEqual('c')
setAudienceSegmentationAttributes({foo: 'bar'})
expect(toggle('foo', 'a', 'b', 'c')).toEqual('a')
expect(toggle('bax', 'a', 'b', 'c')).toEqual('c')
expect(booleanToggle('bar')).toEqual(false)
expect(booleanToggle('baz')).toEqual(true)
})

it('makes sure Toggles return defaults if forced values are of wrong type', () => {
expect(toggle('baz', 'a', 'b', 'c')).toEqual('a')
expect(booleanToggle('bax')).toEqual(false)
})

describe('Clearing forced toggles', () => {
Expand All @@ -288,15 +266,11 @@ describe('Optimizely Integration', () => {
it('should yield real values for cleared toggles', () => {
expect(toggle('foo', 'a', 'b', 'c')).toEqual('b')
expect(toggle('bar', 'a', 'b', 'c')).toEqual('a')
expect(booleanToggle('foo')).toEqual(true)
expect(booleanToggle('bar')).toEqual(false)
})

it('should keep the non-cleared forced toggles and other defaults', () => {
expect(toggle('bax', 'a', 'b', 'c')).toEqual('c')
expect(booleanToggle('baz')).toEqual(true)
expect(toggle('nonexistent', 'a', 'b', 'c')).toEqual('a')
expect(booleanToggle('nonexistent')).toEqual(false)
})
})
})
Expand Down
Loading

0 comments on commit 8c7dd43

Please sign in to comment.