Skip to content

Commit d44c8a5

Browse files
committed
Fix isCached function for empty store states
The bug exists when the isCached function thinks that no storeStates means the entry is cached due to how `Array.prototype.every` works
1 parent 77ced5e commit d44c8a5

File tree

2 files changed

+62
-1
lines changed

2 files changed

+62
-1
lines changed

src/reactor/fns.js

Lines changed: 7 additions & 1 deletion
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

Lines changed: 55 additions & 0 deletions
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)