|
|
@@ -366,20 +366,78 @@ describe('Signup welcome-pack compatibility', () => {
|
|
|
expect(vm.$message).toHaveBeenCalledWith({ message: expect.any(String), type: 'error' })
|
|
|
})
|
|
|
|
|
|
- it('reopens the same payment after closing without creating or deleting an order', () => {
|
|
|
+ it('refreshes payment details on every continuation using the current form and prevents concurrent requests', async() => {
|
|
|
const vm = instance()
|
|
|
+ vm.draft = { draftId: 'test-draft', accessToken: 'test-only-guest-token' }
|
|
|
+ Object.assign(vm.form, {
|
|
|
+ decLv: 'level', recUserName: 'test-referrer', conUserName: 'test-actual-referrer',
|
|
|
+ payType: 'pay_stack', email: 'first@example.invalid'
|
|
|
+ })
|
|
|
+ vm.multipleSelection = [{ ID: 'goods', goodsNum: 1, MARKET_PRICE: 120 }]
|
|
|
vm.paymentOrder = { orderSn: 'test-order', accessCode: 'test-access-code', reference: 'test-reference' }
|
|
|
+ const firstOrder = { accessCode: 'first-access-code', reference: 'first-reference', amount: 120, currency: 'NGN' }
|
|
|
+ const secondOrder = { accessCode: 'second-access-code', reference: 'second-reference', amount: 240, currency: 'NGN' }
|
|
|
+ request.mockResolvedValueOnce({ data: firstOrder }).mockResolvedValueOnce({ data: secondOrder })
|
|
|
vm.visible = true
|
|
|
vm.handleClose()
|
|
|
expect(vm.visible).toBe(false)
|
|
|
vm.onSubmit()
|
|
|
+ expect(vm.visible).toBe(false)
|
|
|
+ expect(vm.submitButtonStat).toBe(true)
|
|
|
+ vm.onSubmit()
|
|
|
+ expect(request).toHaveBeenCalledTimes(1)
|
|
|
+ await settle()
|
|
|
expect(vm.visible).toBe(true)
|
|
|
- expect(vm.paymentOrder.accessCode).toBe('test-access-code')
|
|
|
- expect(request).not.toHaveBeenCalled()
|
|
|
+ expect(vm.paymentOrder).toEqual(firstOrder)
|
|
|
+ expect(vm.submitButtonStat).toBe(false)
|
|
|
+ vm.handleClose()
|
|
|
+ vm.form.email = 'updated@example.invalid'
|
|
|
+ vm.multipleSelection[0].goodsNum = 2
|
|
|
+ vm.onSubmit()
|
|
|
+ expect(request).toHaveBeenCalledTimes(2)
|
|
|
+ expect(request).toHaveBeenLastCalledWith({
|
|
|
+ url: '/v1/user/guest-dec', method: 'post', data: expect.objectContaining({
|
|
|
+ draftId: 'test-draft', accessToken: 'test-only-guest-token',
|
|
|
+ email: 'updated@example.invalid', goodsId: ['goods'], goodsNum: [2]
|
|
|
+ })
|
|
|
+ })
|
|
|
+ expect(vm.visible).toBe(false)
|
|
|
+ await settle()
|
|
|
+ expect(vm.visible).toBe(true)
|
|
|
+ expect(vm.paymentOrder).toEqual(secondOrder)
|
|
|
+ expect(vm.submitButtonStat).toBe(false)
|
|
|
expect(window.location.assign).not.toHaveBeenCalled()
|
|
|
expect(vm.$router.push).not.toHaveBeenCalled()
|
|
|
})
|
|
|
|
|
|
+ it.each([false, true])('does not reopen cached payment after a failed or incomplete refresh: %s', async(incomplete) => {
|
|
|
+ const vm = instance()
|
|
|
+ vm.draft = { draftId: 'test-draft', accessToken: 'test-only-guest-token' }
|
|
|
+ Object.assign(vm.form, { decLv: 'level', recUserName: 'test-referrer', conUserName: 'test-actual-referrer', payType: 'pay_stack' })
|
|
|
+ vm.multipleSelection = [{ ID: 'goods', goodsNum: 1, MARKET_PRICE: 120 }]
|
|
|
+ vm.paymentOrder = { accessCode: 'old-access-code', reference: 'old-reference' }
|
|
|
+ if (incomplete) request.mockResolvedValue({ data: { reference: 'new-reference' }})
|
|
|
+ else request.mockRejectedValue(new Error('Unable to refresh payment.'))
|
|
|
+ vm.onSubmit()
|
|
|
+ expect(request).toHaveBeenCalledTimes(1)
|
|
|
+ await settle()
|
|
|
+ expect(vm.visible).toBe(false)
|
|
|
+ expect(vm.submitButtonStat).toBe(false)
|
|
|
+ expect(vm.$message).toHaveBeenCalledWith({
|
|
|
+ message: incomplete ? 'Payment details are missing. Please contact customer service.' : 'Unable to refresh payment.',
|
|
|
+ type: 'error'
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ it('validates the edited form before requesting continued payment', () => {
|
|
|
+ const vm = instance()
|
|
|
+ vm.paymentOrder = { accessCode: 'old-access-code', reference: 'old-reference' }
|
|
|
+ vm.onSubmit()
|
|
|
+ expect(request).not.toHaveBeenCalled()
|
|
|
+ expect(vm.visible).toBe(false)
|
|
|
+ expect(vm.$message).toHaveBeenCalledWith({ message: 'profile.selectLevel', type: 'error' })
|
|
|
+ })
|
|
|
+
|
|
|
it('stays on signup after the payment callback and prevents another submission', () => {
|
|
|
const vm = instance()
|
|
|
vm.paymentOrder = { accessCode: 'test-access-code', reference: 'test-reference' }
|