import { describe, it, expect, vi, beforeEach } from 'vitest' import { useCrypto } from '../use-crypto' import { DepositMethodEnum } from '#lib/enums' import { ref } from 'vue' // Mock dependencies const mockDepositStore = { cryptos: [], setCryptos: vi.fn(), } const mockPromotionComposable = { isUsingPromotion: ref(false), promotionPackages: vi.fn(), fetchPromotionPackages: vi.fn(), } const mockCancelPromotionComposable = { openModalCancelPromotion: vi.fn(), } const mockNadal = { payment: { addInvoiceCrypto: vi.fn(), cryptoList: vi.fn(), }, transaction: { histories: vi.fn(), }, } vi.mock('#lib/stores/deposit', () => ({ useDepositStore: () => mockDepositStore, })) vi.mock('#lib/composables/promotion', () => ({ usePromotion: () => mockPromotionComposable, useCancelPromotion: () => mockCancelPromotionComposable, })) vi.mock('#lib/composables', () => ({ useNadal: () => mockNadal, })) describe('useCrypto composable', () => { beforeEach(() => { vi.clearAllMocks() }) it('should handle onCryptoChanged correctly when promotion is not used', async () => { mockPromotionComposable.isUsingPromotion.value = false const mockRequest = { currency: 'BTC', amount: 1 } const mockResponse = { success: true } mockNadal.payment.addInvoiceCrypto.mockResolvedValue(mockResponse) const { onCryptoChanged } = useCrypto() const response = await onCryptoChanged(mockRequest) expect(mockNadal.payment.addInvoiceCrypto).toHaveBeenCalledWith({ ...mockRequest, method: DepositMethodEnum.Crypto, }) expect(response).toEqual(mockResponse) }) it('should open cancel promotion modal when promotion is used', async () => { mockPromotionComposable.isUsingPromotion.value = true const { onCryptoChanged } = useCrypto() await onCryptoChanged({ currency: 'BTC', amount: 1 }) expect( mockCancelPromotionComposable.openModalCancelPromotion, ).toHaveBeenCalled() expect(mockNadal.payment.addInvoiceCrypto).not.toHaveBeenCalled() }) it('should fetch promotion packages and crypto list together', async () => { const { fetchData } = useCrypto() await fetchData() expect(mockPromotionComposable.fetchPromotionPackages).toHaveBeenCalled() expect(mockNadal.payment.cryptoList).toHaveBeenCalled() }) })