| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- /* eslint-env jest */
- import fs from 'fs'
- import path from 'path'
- import { transformSync } from '@babel/core'
- import { parseComponent } from 'vue/compiler-sfc'
- import usersInfo from '@/utils/usersInfo'
- jest.mock('@/utils/usersInfo', () => ({ clear: jest.fn() }))
- jest.mock('@/ui-refactor/views/guest-shop/MarketDialog.vue', () => ({}))
- const file = path.resolve('src/views/login/index.vue')
- const { script } = parseComponent(fs.readFileSync(file, 'utf8'))
- const code = transformSync(script.content, { babelrc: false, configFile: false, plugins: [require.resolve('@babel/plugin-transform-modules-commonjs')] }).code
- const module = { exports: {}}
- new Function('require', 'module', 'exports', code)(id => id === './components/SocialSignin' ? {} : require(id), module, module.exports)
- const Login = module.exports.default
- async function settle() { for (let i = 0; i < 12; i++) await Promise.resolve() }
- function context(query = {}) {
- const vm = {
- loginForm: { username: 'SAMPLE', password: 'fixture-password', verifyCode: '1234' },
- pageId: 'sample-page', isLoginVerify: true, loading: false,
- $refs: { loginForm: { validate: callback => callback(true) }},
- $store: { dispatch: jest.fn().mockResolvedValue({}) },
- $router: { push: jest.fn() },
- refreshLoginVerifyStatus: jest.fn(), changeCaptcha: jest.fn(),
- getOtherQuery: Login.methods.getOtherQuery
- }
- Login.watch.$route.handler.call(vm, { query })
- return vm
- }
- beforeEach(() => jest.clearAllMocks())
- it.each([undefined, '', '/', '/dashboard/index', '/dashboard/index/dashboard'])('opens quick purchase after successful login with default redirect %s', async redirect => {
- const vm = context({ redirect, ref: 'SAMPLE-REF' })
- Login.methods.handleLogin.call(vm)
- await settle()
- expect(vm.$store.dispatch.mock.calls).toEqual([
- ['user/login', { userName: 'SAMPLE', password: 'fixture-password', verifyCode: '1234', pageId: 'sample-page', isLoginVerify: true }],
- ['user/getUserInfo', {}],
- ['user/getBaseInfo', {}]
- ])
- expect(vm.$router.push).toHaveBeenCalledWith({ path: '/dashboard/repeat-purchase', query: { ref: 'SAMPLE-REF' }})
- expect(vm.loading).toBe(false)
- })
- it.each(['/dashboard/member-repurchase', '/dashboard/repeat-purchase', '/shop/member-order'])('preserves the explicit return destination %s and other query parameters', async redirect => {
- const vm = context({ redirect, from: 'member-upgrade' })
- Login.methods.handleLogin.call(vm)
- await settle()
- expect(vm.$router.push).toHaveBeenCalledWith({ path: redirect, query: { from: 'member-upgrade' }})
- })
- it('waits for base information before navigating', async() => {
- let resolveBase
- const vm = context()
- vm.$store.dispatch.mockImplementation(action => action === 'user/getBaseInfo' ? new Promise(resolve => { resolveBase = resolve }) : Promise.resolve({}))
- Login.methods.handleLogin.call(vm)
- await settle()
- expect(vm.loading).toBe(true)
- expect(vm.$router.push).not.toHaveBeenCalled()
- resolveBase({})
- await settle()
- expect(vm.$router.push).toHaveBeenCalledWith({ path: '/dashboard/repeat-purchase', query: {}})
- })
- it.each(['user/login', 'user/getUserInfo', 'user/getBaseInfo'])('does not navigate when %s fails and preserves the existing cleanup', async failedAction => {
- const vm = context()
- vm.$store.dispatch.mockImplementation(action => action === failedAction ? Promise.reject(new Error('Sample failure')) : Promise.resolve({}))
- Login.methods.handleLogin.call(vm)
- await settle()
- expect(vm.$router.push).not.toHaveBeenCalled()
- expect(usersInfo.clear).toHaveBeenCalledTimes(1)
- expect(vm.refreshLoginVerifyStatus).toHaveBeenCalledTimes(1)
- expect(vm.changeCaptcha).toHaveBeenCalledTimes(1)
- expect(vm.loading).toBe(false)
- })
|