import { describe, it, expect, vi, beforeEach } from 'vitest' import { useEWallet } from '../use-ewallet' import { usePaymentStore } from '#lib/stores' import { useDepositData, usePromotion, useCancelPromotion, } from '#lib/composables' import { E_WALLET_EMPTY_INFO } from '#lib/constants' import { ref } from 'vue' // Mock dependencies vi.mock('#lib/stores', () => ({ useDepositStore: vi.fn(), usePaymentStore: vi.fn(), })) vi.mock('#lib/composables', () => ({ useDepositData: vi.fn(), usePromotion: vi.fn(), useCancelPromotion: vi.fn(), })) describe('useEWallet', () => { let mockDepositStore: any let mockDepositData: any let mockPromotion: any let mockCancelPromotion: any beforeEach(() => { vi.clearAllMocks() mockDepositStore = { eWalletCode: 'mock-eWallet-code', eWallets: [ { label: 'Momo', value: 'momo', items: [ { account_name: 'Nguyễn Văn A', account_no: '0123456789', qr_code: 'https://qr.momo.vn/...', }, ], isMaintainance: false, }, ], } mockDepositData = { fetchEWallets: vi.fn(), fetchEWalletCode: vi.fn(), } mockPromotion = { isUsingPromotion: ref(false), } mockCancelPromotion = { openModalCancelPromotion: vi.fn(), } vi.mocked(usePaymentStore).mockReturnValue(mockDepositStore) vi.mocked(useDepositData).mockReturnValue(mockDepositData) vi.mocked(usePromotion).mockReturnValue(mockPromotion) vi.mocked(useCancelPromotion).mockReturnValue(mockCancelPromotion) }) it('should fetch eWallets and eWalletCode on fetchData', async () => { const { fetchData } = useEWallet() await fetchData() expect(mockDepositData.fetchEWallets).toHaveBeenCalled() expect(mockDepositData.fetchEWalletCode).toHaveBeenCalled() }) it('should return correct eWallet code', () => { const { eWalletCode } = useEWallet() expect(eWalletCode.value).toBe('mock-eWallet-code') }) it('should return correct eWallet provider options', () => { const { eWalletProviderOptions } = useEWallet() expect(eWalletProviderOptions.value).toEqual(mockDepositStore.eWallets) }) it('should select the correct eWallet type', () => { const { eWalletTypeSelected } = useEWallet() expect(eWalletTypeSelected.value).toBe('momo') }) it('should return correct eWallet options based on selected type', () => { const { eWalletOptions } = useEWallet() expect(eWalletOptions.value).toEqual([ { value: '0123456789', label: 'Nguyễn Văn A - 0123456789', account_name: 'Nguyễn Văn A', account_no: '0123456789', qr_code: 'https://qr.momo.vn/...', }, ]) }) it('should change eWallet provider correctly', () => { const { onChangeEWalletProvider, eWalletTypeSelected } = useEWallet() onChangeEWalletProvider('momo') expect(eWalletTypeSelected.value).toBe('momo') }) it('should change eWallet correctly when promotion is not active', () => { const { onChangeEWallet, eWalletInfo } = useEWallet() const selectedItem = { value: {}, // trick account_name: 'Nguyễn Văn A', account_no: '0123456789', qr_code: 'https://qr.momo.vn/...', } onChangeEWallet(selectedItem) expect(eWalletInfo.account_name).toBe('Nguyễn Văn A') expect(eWalletInfo.account_no).toBe('0123456789') expect(eWalletInfo.qr_code).toBe('https://qr.momo.vn/...') }) it('should open cancel promotion modal when promotion is active', () => { mockPromotion.isUsingPromotion.value = true const { onChangeEWallet } = useEWallet() const selectedItem = { value: {}, // trick account_name: 'Nguyễn Văn A', account_no: '0123456789', qr_code: 'https://qr.momo.vn/...', } onChangeEWallet(selectedItem) expect(mockCancelPromotion.openModalCancelPromotion).toHaveBeenCalled() }) it('should reset eWalletInfo when changing eWallet provider', () => { const { onChangeEWalletProvider, eWalletInfo } = useEWallet() onChangeEWalletProvider('momo') expect(eWalletInfo).toEqual(E_WALLET_EMPTY_INFO) }) })