Skip to content

Commit 69f8087

Browse files
committed
Merge pull request #190 from optimizely/jordan/fix-isCached-for-empty-store-states
Fix isCached function for empty store states
2 parents 77ced5e + d44c8a5 commit 69f8087

File tree

2 files changed

+62
-1
lines changed

2 files changed

+62
-1
lines changed

src/reactor/fns.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,13 @@ function isCached(reactorState, keyPathOrGetter) {
382382
return false
383383
}
384384

385-
return entry.get('storeStates').every((stateId, storeId) => {
385+
const storeStates = entry.get('storeStates')
386+
if (storeStates.size === 0) {
387+
// if there are no store states for this entry then it was never cached before
388+
return false
389+
}
390+
391+
return storeStates.every((stateId, storeId) => {
386392
return reactorState.getIn(['storeStates', storeId]) === stateId
387393
})
388394
}

tests/reactor-tests.js

+55
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,61 @@ describe('Reactor', () => {
396396

397397
expect(mockFn.calls.count()).toEqual(0)
398398
})
399+
400+
it('should trigger an observer for a late registered store', () => {
401+
var mockFn = jasmine.createSpy()
402+
var reactor = new Reactor()
403+
reactor.observe(['test'], mockFn)
404+
405+
expect(mockFn.calls.count()).toEqual(0)
406+
407+
reactor.registerStores({
408+
test: Store({
409+
getInitialState() {
410+
return 1
411+
}
412+
})
413+
})
414+
415+
expect(mockFn.calls.count()).toEqual(1)
416+
expect(mockFn.calls.argsFor(0)).toEqual([1])
417+
})
418+
419+
it('should trigger an observer for a late registered store for the identity getter', () => {
420+
var mockFn = jasmine.createSpy()
421+
var reactor = new Reactor()
422+
reactor.observe([], mockFn)
423+
424+
expect(mockFn.calls.count()).toEqual(0)
425+
426+
reactor.registerStores({
427+
test: Store({
428+
getInitialState() {
429+
return 1
430+
},
431+
initialize() {
432+
this.on('increment', (state) => state + 1)
433+
}
434+
})
435+
})
436+
437+
// it should call the observer after the store has been registered
438+
expect(mockFn.calls.count()).toEqual(1)
439+
var observedValue = mockFn.calls.argsFor(0)[0]
440+
var expectedHandlerValue = Map({
441+
test: 1
442+
})
443+
expect(is(observedValue, expectedHandlerValue)).toBe(true)
444+
445+
// it should call the observer again when the store handles an action
446+
reactor.dispatch('increment')
447+
expect(mockFn.calls.count()).toEqual(2)
448+
var observedValue = mockFn.calls.argsFor(1)[0]
449+
var expectedHandlerValue = Map({
450+
test: 2
451+
})
452+
expect(is(observedValue, expectedHandlerValue)).toBe(true)
453+
})
399454
})
400455

401456
describe('#unobserve', () => {

0 commit comments

Comments
 (0)