Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit 4dcb5c4

Browse files
authored
fix (datafile manager): Change onReady meaning to 'a datafile is available' (optimizely#14)
Summary: This changes the behavior of the `onReady` Promise to align with the Java implementation. The `onReady` Promise is now resolved as soon as the datafile manager has any datafile (whether it was passed in or fetched). An update event is always emitted when the datafile changes after `onReady`. Test plan: Updated unit tests
1 parent d0b3b77 commit 4dcb5c4

File tree

2 files changed

+76
-11
lines changed

2 files changed

+76
-11
lines changed

packages/datafile-manager/__test__/httpPollingDatafileManager.spec.ts

Lines changed: 68 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,24 +79,88 @@ describe('httpPollingDatafileManager', () => {
7979
jest.restoreAllMocks()
8080
})
8181

82-
describe('when constructed with sdkKey and datafile', () => {
82+
describe('when constructed with sdkKey and datafile and autoUpdate: true,', () => {
8383
beforeEach(() => {
84-
manager = createTestManager({ datafile: { foo: 'abcd' }, sdkKey: '123' })
84+
manager = createTestManager({ datafile: { foo: 'abcd' }, sdkKey: '123', autoUpdate: true })
8585
})
8686

8787
it('returns the passed datafile from get', () => {
8888
expect(manager.get()).toEqual({ foo: 'abcd' })
8989
})
9090

91-
it('after being started, fetches the datafile and resolves onReady', async () => {
91+
it('resolves onReady immediately', async () => {
92+
manager.start()
93+
await manager.onReady()
94+
expect(manager.get()).toEqual({ foo: 'abcd' })
95+
})
96+
97+
it('after being started, fetches the datafile, updates itself, emits an update event, and updates itself again after a timeout', async () => {
98+
manager.queuedResponses.push(
99+
{
100+
statusCode: 200,
101+
body: '{"fooz": "barz"}',
102+
headers: {}
103+
},
104+
{
105+
statusCode: 200,
106+
body: '{"foo": "bar"}',
107+
headers: {}
108+
}
109+
)
110+
const updateFn = jest.fn()
111+
manager.on('update', updateFn)
112+
manager.start()
113+
expect(manager.responsePromises.length).toBe(1)
114+
await manager.responsePromises[0]
115+
expect(updateFn).toBeCalledTimes(1)
116+
expect(updateFn).toBeCalledWith({
117+
datafile: { foo: 'bar' }
118+
})
119+
expect(manager.get()).toEqual({ foo: 'bar' })
120+
updateFn.mockReset()
121+
testTimeoutFactory.timeoutFns[0]()
122+
expect(manager.responsePromises.length).toBe(2)
123+
await manager.responsePromises[1]
124+
expect(updateFn).toBeCalledTimes(1)
125+
expect(updateFn).toBeCalledWith({
126+
datafile: { fooz: 'barz' }
127+
})
128+
expect(manager.get()).toEqual({ fooz: 'barz' })
129+
})
130+
})
131+
132+
describe('when constructed with sdkKey and datafile and autoUpdate: false,', () => {
133+
beforeEach(() => {
134+
manager = createTestManager({ datafile: { foo: 'abcd' }, sdkKey: '123', autoUpdate: false })
135+
})
136+
137+
it('returns the passed datafile from get', () => {
138+
expect(manager.get()).toEqual({ foo: 'abcd' })
139+
})
140+
141+
it('after being started, resolves onReady immediately', async () => {
142+
manager.start()
143+
await manager.onReady()
144+
expect(manager.get()).toEqual({ foo: 'abcd' })
145+
})
146+
147+
it('after being started, fetches the datafile, updates itself once, and emits an update event, but does not schedule a future update', async () => {
92148
manager.queuedResponses.push({
93149
statusCode: 200,
94150
body: '{"foo": "bar"}',
95151
headers: {}
96152
})
153+
const updateFn = jest.fn()
154+
manager.on('update', updateFn)
97155
manager.start()
98-
await manager.onReady()
156+
expect(manager.responsePromises.length).toBe(1)
157+
await manager.responsePromises[0]
158+
expect(updateFn).toBeCalledTimes(1)
159+
expect(updateFn).toBeCalledWith({
160+
datafile: { foo: 'bar' }
161+
})
99162
expect(manager.get()).toEqual({ foo: 'bar' })
163+
expect(testTimeoutFactory.timeoutFns.length).toBe(0)
100164
})
101165
})
102166

packages/datafile-manager/src/httpPollingDatafileManager.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,6 @@ export default abstract class HTTPPollingDatafileManager implements DatafileMana
9292

9393
this.sdkKey = sdkKey
9494

95-
if (typeof datafile !== 'undefined') {
96-
this.currentDatafile = datafile
97-
} else {
98-
this.currentDatafile = null
99-
}
100-
10195
this.isReadyPromiseSettled = false
10296
this.readyPromiseResolver = () => {}
10397
this.readyPromiseRejecter = () => {}
@@ -106,6 +100,13 @@ export default abstract class HTTPPollingDatafileManager implements DatafileMana
106100
this.readyPromiseRejecter = reject
107101
})
108102

103+
if (typeof datafile !== 'undefined') {
104+
this.currentDatafile = datafile
105+
this.resolveReadyPromise()
106+
} else {
107+
this.currentDatafile = null
108+
}
109+
109110
this.isStarted = false
110111

111112
this.urlTemplate = urlTemplate
@@ -204,7 +205,7 @@ export default abstract class HTTPPollingDatafileManager implements DatafileMana
204205
this.currentDatafile = datafile
205206
if (!this.isReadyPromiseSettled) {
206207
this.resolveReadyPromise()
207-
} else if (this.autoUpdate) {
208+
} else {
208209
const datafileUpdate: DatafileUpdate = {
209210
datafile,
210211
}

0 commit comments

Comments
 (0)