import '@testing-library/jest-dom';
import { useGetFundingUrl } from '@/fund/hooks/useGetFundingUrl';
import { getFundingPopupSize } from '@/fund/utils/getFundingPopupSize';
import { openPopup } from '@/internal/utils/openPopup';
import { fireEvent, render, screen } from '@testing-library/react';
import { type Mock, afterEach, describe, expect, it, vi } from 'vitest';
import { WalletDropdownFundLink } from './WalletDropdownFundLink';
vi.mock('@/fund/hooks/useGetFundingUrl', () => ({
useGetFundingUrl: vi.fn(),
}));
vi.mock('@/fund/utils/getFundingPopupSize', () => ({
getFundingPopupSize: vi.fn(),
}));
vi.mock('@/internal/utils/openPopup', () => ({
openPopup: vi.fn(),
}));
describe('WalletDropdownFundLink', () => {
afterEach(() => {
vi.clearAllMocks();
});
it('renders the fund link button with the fundingUrl prop when it is defined', () => {
const fundingUrl = 'https://props.funding.url';
const { height, width } = { height: 200, width: 100 };
(getFundingPopupSize as Mock).mockReturnValue({ height, width });
render();
expect(useGetFundingUrl).not.toHaveBeenCalled();
const buttonElement = screen.getByRole('button');
expect(screen.getByText('Fund wallet')).toBeInTheDocument();
fireEvent.click(buttonElement);
expect(getFundingPopupSize as Mock).toHaveBeenCalledWith('md', fundingUrl);
expect(openPopup as Mock).toHaveBeenCalledWith({
url: fundingUrl,
height,
width,
target: undefined,
});
});
it('renders the fund link button with the default fundingUrl when the fundingUrl prop is undefined', () => {
const fundingUrl = 'https://default.funding.url';
const { height, width } = { height: 200, width: 100 };
(useGetFundingUrl as Mock).mockReturnValue(fundingUrl);
(getFundingPopupSize as Mock).mockReturnValue({ height, width });
render();
expect(useGetFundingUrl).toHaveBeenCalled();
const buttonElement = screen.getByRole('button');
fireEvent.click(buttonElement);
expect(getFundingPopupSize as Mock).toHaveBeenCalledWith('md', fundingUrl);
expect(openPopup as Mock).toHaveBeenCalledWith({
url: fundingUrl,
height,
width,
target: undefined,
});
});
it('renders a disabled fund link button when no funding URL is provided and the default cannot be fetched', () => {
(useGetFundingUrl as Mock).mockReturnValue(undefined);
render();
expect(useGetFundingUrl).toHaveBeenCalled();
const buttonElement = screen.getByRole('button');
expect(buttonElement).toHaveClass('pointer-events-none');
fireEvent.click(buttonElement);
expect(openPopup as Mock).not.toHaveBeenCalled();
});
it('renders the fund link as a link when the openIn prop is set to tab', () => {
const fundingUrl = 'https://props.funding.url';
const { height, width } = { height: 200, width: 100 };
(getFundingPopupSize as Mock).mockReturnValue({ height, width });
render();
expect(useGetFundingUrl).not.toHaveBeenCalled();
const linkElement = screen.getByRole('link');
expect(screen.getByText('Fund wallet')).toBeInTheDocument();
expect(linkElement).toHaveAttribute('href', fundingUrl);
});
});