Skip to content

Commit

Permalink
Track active observables & fix tests (#321)
Browse files Browse the repository at this point in the history
  • Loading branch information
bpinto committed Nov 9, 2021
1 parent c5364d4 commit a1e2d5c
Show file tree
Hide file tree
Showing 2 changed files with 175 additions and 1 deletion.
31 changes: 31 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
import {install} from '@sinonjs/fake-timers'

function extend(target /*, mixin1, mixin2... */) {
for (let i = 1; i < arguments.length; i++) {
for (const prop in arguments[i]) {
target[prop] = arguments[i][prop]
}
}

return target
}

const throwEventTypeError = event => {
throw new TypeError(`Expected event object, received:
${JSON.stringify(event, null, ' ')}`)
Expand Down Expand Up @@ -207,10 +217,31 @@ export default function createTestHelpers(Kefir) {
return log
}

const observables = {
active: [],
clear: function() {
this.active = []
},
}

const {_onActivation, _onDeactivation} = Kefir.Observable.prototype

extend(Kefir.Observable.prototype, {
_onActivation() {
observables.active.push(this)
_onActivation.apply(this)
},
_onDeactivation() {
observables.active.splice(observables.active.indexOf(this), 1)
_onDeactivation.apply(this)
},
})

return {
END,
VALUE,
ERROR,
observables,
send,
parseDiagram,
sendFrames,
Expand Down
145 changes: 144 additions & 1 deletion test/kefir-test-utils.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ describe('kefir-test-utils', () => {
END,
VALUE,
ERROR,
observables,
send,
parseDiagram,
sendFrames,
Expand All @@ -24,6 +25,141 @@ describe('kefir-test-utils', () => {
watchWithTime,
} = createTestUtils(Kefir)

beforeEach(() => {
observables.clear()
})

afterEach(() => {
expect(observables.active.length).to.equal(0, 'Expected 0 active observables after test execution.')
})

describe('activeObservables', () => {
const noop = () => {}

describe('Observable', () => {
it('counts active observables', () => {
const observable = new Kefir.Observable()
expect(observables.active.length).to.equal(0)

observable.onValue(noop)
expect(observables.active.length).to.equal(1)
observable.offValue(noop)
})

it('counts all observable activations', () => {
const observable = new Kefir.Observable()
expect(observables.active.length).to.equal(0)

observable.onValue(noop)
expect(observables.active.length).to.equal(1)
observable.offValue(noop)
expect(observables.active.length).to.equal(0)

observable.onValue(noop)
expect(observables.active.length).to.equal(1)
observable.offValue(noop)
expect(observables.active.length).to.equal(0)
})

it('multiple subscriptions do not count as multiple active observables', () => {
const observable = new Kefir.Observable()
expect(observables.active.length).to.equal(0)

observable.onValue(noop)
expect(observables.active.length).to.equal(1)
observable.onError(noop)
expect(observables.active.length).to.equal(1)

observable.offValue(noop)
expect(observables.active.length).to.equal(1)
observable.offError(noop)
expect(observables.active.length).to.equal(0)
})
})

describe('Property', () => {
it('counts active observables', () => {
const observable = new Kefir.Property()
expect(observables.active.length).to.equal(0)

observable.onValue(noop)
expect(observables.active.length).to.equal(1)
observable.offValue(noop)
})

it('counts all observable activations', () => {
const observable = new Kefir.Property()
expect(observables.active.length).to.equal(0)

observable.onValue(noop)
expect(observables.active.length).to.equal(1)
observable.offValue(noop)
expect(observables.active.length).to.equal(0)

observable.onValue(noop)
expect(observables.active.length).to.equal(1)
observable.offValue(noop)
expect(observables.active.length).to.equal(0)
})

it('multiple subscriptions do not count as multiple active observables', () => {
const observable = new Kefir.Property()
expect(observables.active.length).to.equal(0)

observable.onValue(noop)
expect(observables.active.length).to.equal(1)
observable.onError(noop)
expect(observables.active.length).to.equal(1)

observable.offValue(noop)
expect(observables.active.length).to.equal(1)
observable.offError(noop)
expect(observables.active.length).to.equal(0)
})
})

describe('Stream', () => {
it('counts active observables', () => {
const observable = new Kefir.Stream()
expect(observables.active.length).to.equal(0)

observable.onValue(noop)
expect(observables.active.length).to.equal(1)
observable.offValue(noop)
})

it('counts all observable activations', () => {
const observable = new Kefir.Stream()
expect(observables.active.length).to.equal(0)

observable.onValue(noop)
expect(observables.active.length).to.equal(1)
observable.offValue(noop)
expect(observables.active.length).to.equal(0)

observable.onValue(noop)
expect(observables.active.length).to.equal(1)
observable.offValue(noop)
expect(observables.active.length).to.equal(0)
})

it('multiple subscriptions do not count as multiple active observables', () => {
const observable = new Kefir.Stream()
expect(observables.active.length).to.equal(0)

observable.onValue(noop)
expect(observables.active.length).to.equal(1)
observable.onError(noop)
expect(observables.active.length).to.equal(1)

observable.offValue(noop)
expect(observables.active.length).to.equal(1)
observable.offError(noop)
expect(observables.active.length).to.equal(0)
})
})
})

describe('observable creators', () => {
it('should create a prop', () => {
expect(prop()).to.be.instanceof(Kefir.Property)
Expand All @@ -41,10 +177,16 @@ describe('kefir-test-utils', () => {
describe('send', () => {
let log, obs

const fn = val => log.push(val)

beforeEach(() => {
log = []
obs = stream()
obs.onAny(val => log.push(val))
obs.onAny(fn)
})

afterEach(() => {
obs.offAny(fn)
})

it('should send a value', () => {
Expand Down Expand Up @@ -118,6 +260,7 @@ describe('kefir-test-utils', () => {
const obs = activate(stream())

expect(obs._active).to.equal(true)
deactivate(obs)
})

it('should deactivate an activated observable', () => {
Expand Down

0 comments on commit a1e2d5c

Please sign in to comment.