loginRedirect.spec.js 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /* eslint-env jest */
  2. import fs from 'fs'
  3. import path from 'path'
  4. import { transformSync } from '@babel/core'
  5. import { parseComponent } from 'vue/compiler-sfc'
  6. import usersInfo from '@/utils/usersInfo'
  7. jest.mock('@/utils/usersInfo', () => ({ clear: jest.fn() }))
  8. jest.mock('@/ui-refactor/views/guest-shop/MarketDialog.vue', () => ({}))
  9. const file = path.resolve('src/views/login/index.vue')
  10. const { script } = parseComponent(fs.readFileSync(file, 'utf8'))
  11. const code = transformSync(script.content, { babelrc: false, configFile: false, plugins: [require.resolve('@babel/plugin-transform-modules-commonjs')] }).code
  12. const module = { exports: {}}
  13. new Function('require', 'module', 'exports', code)(id => id === './components/SocialSignin' ? {} : require(id), module, module.exports)
  14. const Login = module.exports.default
  15. async function settle() { for (let i = 0; i < 12; i++) await Promise.resolve() }
  16. function context(query = {}) {
  17. const vm = {
  18. loginForm: { username: 'SAMPLE', password: 'fixture-password', verifyCode: '1234' },
  19. pageId: 'sample-page', isLoginVerify: true, loading: false,
  20. $refs: { loginForm: { validate: callback => callback(true) }},
  21. $store: { dispatch: jest.fn().mockResolvedValue({}) },
  22. $router: { push: jest.fn() },
  23. refreshLoginVerifyStatus: jest.fn(), changeCaptcha: jest.fn(),
  24. getOtherQuery: Login.methods.getOtherQuery
  25. }
  26. Login.watch.$route.handler.call(vm, { query })
  27. return vm
  28. }
  29. beforeEach(() => jest.clearAllMocks())
  30. it.each([undefined, '', '/', '/dashboard/index', '/dashboard/index/dashboard'])('opens quick purchase after successful login with default redirect %s', async redirect => {
  31. const vm = context({ redirect, ref: 'SAMPLE-REF' })
  32. Login.methods.handleLogin.call(vm)
  33. await settle()
  34. expect(vm.$store.dispatch.mock.calls).toEqual([
  35. ['user/login', { userName: 'SAMPLE', password: 'fixture-password', verifyCode: '1234', pageId: 'sample-page', isLoginVerify: true }],
  36. ['user/getUserInfo', {}],
  37. ['user/getBaseInfo', {}]
  38. ])
  39. expect(vm.$router.push).toHaveBeenCalledWith({ path: '/dashboard/repeat-purchase', query: { ref: 'SAMPLE-REF' }})
  40. expect(vm.loading).toBe(false)
  41. })
  42. it.each(['/dashboard/member-repurchase', '/dashboard/repeat-purchase', '/shop/member-order'])('preserves the explicit return destination %s and other query parameters', async redirect => {
  43. const vm = context({ redirect, from: 'member-upgrade' })
  44. Login.methods.handleLogin.call(vm)
  45. await settle()
  46. expect(vm.$router.push).toHaveBeenCalledWith({ path: redirect, query: { from: 'member-upgrade' }})
  47. })
  48. it('waits for base information before navigating', async() => {
  49. let resolveBase
  50. const vm = context()
  51. vm.$store.dispatch.mockImplementation(action => action === 'user/getBaseInfo' ? new Promise(resolve => { resolveBase = resolve }) : Promise.resolve({}))
  52. Login.methods.handleLogin.call(vm)
  53. await settle()
  54. expect(vm.loading).toBe(true)
  55. expect(vm.$router.push).not.toHaveBeenCalled()
  56. resolveBase({})
  57. await settle()
  58. expect(vm.$router.push).toHaveBeenCalledWith({ path: '/dashboard/repeat-purchase', query: {}})
  59. })
  60. it.each(['user/login', 'user/getUserInfo', 'user/getBaseInfo'])('does not navigate when %s fails and preserves the existing cleanup', async failedAction => {
  61. const vm = context()
  62. vm.$store.dispatch.mockImplementation(action => action === failedAction ? Promise.reject(new Error('Sample failure')) : Promise.resolve({}))
  63. Login.methods.handleLogin.call(vm)
  64. await settle()
  65. expect(vm.$router.push).not.toHaveBeenCalled()
  66. expect(usersInfo.clear).toHaveBeenCalledTimes(1)
  67. expect(vm.refreshLoginVerifyStatus).toHaveBeenCalledTimes(1)
  68. expect(vm.changeCaptcha).toHaveBeenCalledTimes(1)
  69. expect(vm.loading).toBe(false)
  70. })