diff --git a/package.json b/package.json index 51fb934811..7aad18bfe6 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,8 @@ "@babel/core": "^7.2.2", "@babel/preset-env": "^7.3.1", "@nuxtjs/eslint-config": "^0.0.1", + "@vue/server-test-utils": "^1.0.0-beta.29", + "@vue/test-utils": "^1.0.0-beta.29", "babel-core": "^7.0.0-bridge", "babel-eslint": "^10.0.1", "babel-jest": "^23.6.0", diff --git a/packages/vue-app/test/__utils__/index.js b/packages/vue-app/test/__utils__/index.js new file mode 100644 index 0000000000..22e66e65bc --- /dev/null +++ b/packages/vue-app/test/__utils__/index.js @@ -0,0 +1,5 @@ +export const vmTick = (vm) => { + return new Promise((resolve) => { + vm.$nextTick(resolve) + }) +} diff --git a/packages/vue-app/test/nuxt-loading.test.js b/packages/vue-app/test/nuxt-loading.test.js new file mode 100644 index 0000000000..81faf9aecc --- /dev/null +++ b/packages/vue-app/test/nuxt-loading.test.js @@ -0,0 +1,167 @@ +/** + * @jest-environment jsdom + */ +import { resolve } from 'path' +import { mount, createLocalVue } from '@vue/test-utils' +import { renderToString } from '@vue/server-test-utils' +import { loadFixture } from '../../../test/utils' +import { vmTick } from './__utils__' + +jest.useFakeTimers() + +describe('nuxt-loading', () => { + let localVue + let Component + + beforeAll(async () => { + const config = await loadFixture('basic') + const componentDir = resolve(config.rootDir, '.nuxt/components') + + localVue = createLocalVue() + Component = (await import(resolve(componentDir, 'nuxt-loading.vue'))).default + }) + + afterEach(() => jest.clearAllTimers()) + + test('removed when not loading', () => { + const str = renderToString(Component) + expect(str).toBe('') + }) + + test('added when loading', () => { + const wrapper = mount(Component, { localVue }) + + wrapper.setData({ throttle: 0 }) + wrapper.vm.start() + + expect(wrapper.html()).toBe('
') + }) + + test('percentage changed after 1s', () => { + const wrapper = mount(Component, { localVue }) + wrapper.setData({ + duration: 1000, + throttle: 0 + }) + + wrapper.vm.start() + + jest.advanceTimersByTime(250) + + const html = wrapper.html() + expect(html).not.toBe('
') + expect(wrapper.vm.get()).not.toBe(0) + }) + + test('can be finished', async () => { + const wrapper = mount(Component, { localVue }) + + wrapper.setData({ + duration: 1000, + throttle: 0 + }) + + wrapper.vm.start() + wrapper.vm.finish() + + let html = wrapper.html() + expect(html).toBe('
') + expect(wrapper.vm.get()).toBe(100) + + jest.runAllTimers() + await vmTick(wrapper.vm) + + html = wrapper.html() + expect(html).toBeUndefined() + expect(wrapper.vm.get()).toBe(0) + }) + + test('can fail', () => { + const wrapper = mount(Component, { localVue }) + + wrapper.vm.set(50) + wrapper.vm.fail() + + const html = wrapper.html() + expect(html).toBe('
') + }) + + test('not shown until throttle', () => { + const wrapper = mount(Component, { localVue }) + + wrapper.setData({ + duration: 2000, + throttle: 1000 + }) + + wrapper.vm.start() + jest.advanceTimersByTime(250) + + let html = wrapper.html() + expect(html).toBeUndefined() + + jest.advanceTimersByTime(1000) + + html = wrapper.html() + expect(html).not.toBe('
') + expect(html).toContain('
{ + const wrapper = mount(Component, { localVue }) + + wrapper.setData({ + duration: 2000, + throttle: 0 + }) + + wrapper.vm.start() + jest.advanceTimersByTime(250) + + let html = wrapper.html() + expect(html).toContain('
{ + const wrapper = mount(Component, { localVue }) + + wrapper.setData({ + continuous: true, + duration: 500, + rtl: false, + throttle: 0 + }) + + wrapper.vm.start() + + jest.advanceTimersByTime(500) + + let html = wrapper.html() + expect(html).toBe('
') + + jest.advanceTimersByTime(250) + + html = wrapper.html() + expect(wrapper.vm.reversed).toBe(true) + expect(html).toContain('
{ - beforeAll(async () => { - const config = await loadFixture('basic') - componentDir = resolve(config.rootDir, '.nuxt/components') - }) - - describe('nuxt-loading', () => { - let VueComponent - - beforeAll(async () => { - const Component = (await import(resolve(componentDir, 'nuxt-loading.vue'))).default - VueComponent = Vue.extend(Component) - }) - - test('removed when not loading', async () => { - const component = new VueComponent().$mount() - const str = await renderToString(component) - expect(str).toBe('') - }) - - test('added when loading', async () => { - const component = new VueComponent().$mount() - component.throttle = 0 - component.start() - const str = await renderToString(component) - expect(str).toBe('
') - component.clear() - }) - - test('percentage changed after 1s', async () => { - jest.useRealTimers() - const component = new VueComponent().$mount() - component.duration = 2000 - component.throttle = 0 - component.start() - await waitFor(250) - const str = await renderToString(component) - expect(str).not.toBe('') - expect(str).not.toBe('
') - expect(component.$data.percent).not.toBe(0) - component.clear() - }) - - test('can be finished', async () => { - jest.useFakeTimers() - const component = new VueComponent().$mount() - component.throttle = 0 - component.start() - component.finish() - let str = await renderToString(component) - expect(str).toBe('
') - expect(component.$data.percent).toBe(100) - jest.runAllTimers() - str = await renderToString(component) - expect(str).toBe('') - expect(component.$data.percent).toBe(0) - component.clear() - jest.useRealTimers() - }) - - test('can fail', async () => { - const component = new VueComponent().$mount() - component.set(50) - component.fail() - const str = await renderToString(component) - expect(str).toBe('
') - }) - - test('not shown until throttle', async () => { - const component = new VueComponent().$mount() - component.duration = 2000 - component.throttle = 1000 - component.start() - await waitFor(300) - let str = await renderToString(component) - expect(str).toBe('') - await waitFor(1000) - str = await renderToString(component) - expect(str).not.toBe('') - expect(str).not.toBe('
') - component.clear() - }) - - test('can pause and resume', async () => { - const component = new VueComponent().$mount() - component.duration = 2000 - component.throttle = 0 - component.start() - await waitFor(250) - let str = await renderToString(component) - expect(str).not.toBe('') - component.pause() - await waitFor(500) - const str2 = await renderToString(component) - expect(str2).toBe(str) - component.resume() - await waitFor(500) - str = await renderToString(component) - expect(str).not.toBe('') - expect(str).not.toBe(str2) - component.clear() - }) - - test('continues after duration', async () => { - const component = new VueComponent().$mount() - component.continuous = true - component.duration = 500 - component.throttle = 0 - component.start() - await waitFor(850) - const str = await renderToString(component) - expect(str).not.toBe('') - expect(str).not.toBe('
') - expect(str).not.toBe('
') - expect(str).not.toBe('
') - expect(str).not.toBe('
') - component.clear() - }) - }) -}) diff --git a/yarn.lock b/yarn.lock index 806296fbed..cc0c47eced 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1523,6 +1523,21 @@ source-map "~0.6.1" vue-template-es2015-compiler "^1.8.2" +"@vue/server-test-utils@^1.0.0-beta.29": + version "1.0.0-beta.29" + resolved "https://registry.npmjs.org/@vue/server-test-utils/-/server-test-utils-1.0.0-beta.29.tgz#8a61a9900992b742cda7c143593db1c5e4a019bd" + integrity sha512-N6e2cixTnz7+mos0wL+R3LM/2op+f3ym1aSQYuNfksZzvX81lrQtjGr6Aszv0+1Ryms+WrqlL18Jb/MY8XyXaQ== + dependencies: + cheerio "^1.0.0-rc.2" + +"@vue/test-utils@^1.0.0-beta.29": + version "1.0.0-beta.29" + resolved "https://registry.npmjs.org/@vue/test-utils/-/test-utils-1.0.0-beta.29.tgz#c942cf25e891cf081b6a03332b4ae1ef430726f0" + integrity sha512-yX4sxEIHh4M9yAbLA/ikpEnGKMNBCnoX98xE1RwxfhQVcn0MaXNSj1Qmac+ZydTj6VBSEVukchBogXBTwc+9iA== + dependencies: + dom-event-types "^1.0.0" + lodash "^4.17.4" + "@webassemblyjs/ast@1.7.11": version "1.7.11" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" @@ -3912,6 +3927,11 @@ dom-converter@~0.2: dependencies: utila "~0.4" +dom-event-types@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/dom-event-types/-/dom-event-types-1.0.0.tgz#5830a0a29e1bf837fe50a70cd80a597232813cae" + integrity sha512-2G2Vwi2zXTHBGqXHsJ4+ak/iP0N8Ar+G8a7LiD2oup5o4sQWytwqqrZu/O6hIMV0KMID2PL69OhpshLO0n7UJQ== + dom-serializer@0, dom-serializer@~0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"