import { describe, it, expect, vi, beforeEach } from 'vitest' import { useSenpay } from '../use-senpay' import { valueToNumber } from '#lib/utils' import type { GetFastPayRequest, SenpayResponse } from '#lib/types' const mockNadal = { payment: { requestSenpayInvoice: vi.fn(), } } const mockPromotion = { isUsingPromotion: { value: false, }, promotionPackages: { value: [], }, fetchPromotionPackages: vi.fn().mockResolvedValue({ success: true }), } const mockCancelPromotion = { openModalCancelPromotion: vi.fn(), } // Mock dependencies vi.mock('nuxt/app', () => ({ useNuxtApp: vi.fn(), })) vi.mock('#lib/composables', () => ({ useCancelPromotion: () => mockCancelPromotion, usePromotion: () => mockPromotion, useNadal: () => mockNadal, })) vi.mock('#lib/utils', () => ({ valueToNumber: vi.fn(), })) describe('useSenpay', () => { beforeEach(() => { vi.clearAllMocks() }) it('should request transfer info if not welcome type', async () => { const { fetchTransferInfo } = useSenpay() const mockData: GetFastPayRequest = { amount: '1000', otherParam: 'value', } vi.mocked(valueToNumber).mockReturnValue(1) const mockResponse: SenpayResponse = { success: true } mockNadal.payment.requestSenpayInvoice.mockResolvedValue(mockResponse) const result = await fetchTransferInfo(mockData) expect(mockCancelPromotion.openModalCancelPromotion).not.toHaveBeenCalled() expect(mockNadal.payment.requestSenpayInvoice).toHaveBeenCalledWith({ amount: 1, otherParam: 'value', }) expect(result).toEqual(mockResponse) }) it('should open cancel promotion modal if welcome type', async () => { mockPromotion.isUsingPromotion.value = true const { fetchTransferInfo } = useSenpay() const mockData: GetFastPayRequest = { amount: '1000', otherParam: 'value', } const result = await fetchTransferInfo(mockData) expect(mockCancelPromotion.openModalCancelPromotion).toHaveBeenCalled() expect(mockNadal.payment.requestSenpayInvoice).not.toHaveBeenCalled() expect(result).toBeUndefined() }) it('should fetch promotion packages and manage loading state', async () => { const { fetchData, isLoading } = useSenpay() const fetchPromise = fetchData() expect(isLoading.value).toBe(true) await fetchPromise expect(mockPromotion.fetchPromotionPackages).toHaveBeenCalled() expect(isLoading.value).toBe(false) }) })