| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- import Vue from 'vue'
- // helper for async assertions.
- // Use like this:
- //
- // vm.a = 123
- // waitForUpdate(() => {
- // expect(vm.$el.textContent).toBe('123')
- // vm.a = 234
- // })
- // .then(() => {
- // // more assertions...
- // })
- // .then(done)
- interface Job extends Function {
- wait?: boolean
- fail?: (e: any) => void
- }
- const waitForUpdate = (initialCb: Job) => {
- let end
- const queue: Job[] = initialCb ? [initialCb] : []
- function shift() {
- const job = queue.shift()
- if (queue.length) {
- let hasError = false
- try {
- job!.wait ? job!(shift) : job!()
- } catch (e) {
- hasError = true
- const done = queue[queue.length - 1]
- if (done && done.fail) {
- done.fail(e)
- }
- }
- if (!hasError && !job!.wait) {
- if (queue.length) {
- Vue.nextTick(shift)
- }
- }
- } else if (job && (job.fail || job === end)) {
- job() // done
- }
- }
- Vue.nextTick(() => {
- if (!queue.length || (!end && !queue[queue.length - 1]!.fail)) {
- throw new Error('waitForUpdate chain is missing .then(done)')
- }
- shift()
- })
- const chainer = {
- then: nextCb => {
- queue.push(nextCb)
- return chainer
- },
- thenWaitFor: wait => {
- if (typeof wait === 'number') {
- wait = timeout(wait)
- }
- wait.wait = true
- queue.push(wait)
- return chainer
- },
- end: endFn => {
- queue.push(endFn)
- end = endFn
- }
- }
- return chainer
- }
- function timeout(n) {
- return next => setTimeout(next, n)
- }
- export { waitForUpdate }
|