import '@testing-library/jest-dom';
import { useNFTContext } from '@/nft/components/NFTProvider';
import { render } from '@testing-library/react';
import {
type Mock,
afterEach,
beforeEach,
describe,
expect,
it,
vi,
} from 'vitest';
import { NFTLastSoldPrice } from './NFTLastSoldPrice';
vi.mock('@/nft/components/NFTProvider', () => ({
useNFTContext: vi.fn(),
}));
describe('NFTLastSoldPrice', () => {
beforeEach(() => {
(useNFTContext as Mock).mockReturnValue({
lastSoldPrice: {
amount: '1',
currency: 'ETH',
amountUSD: '3000',
},
});
});
afterEach(() => {
vi.clearAllMocks();
});
it('should render', () => {
const { getByText } = render();
expect(getByText('Last sale price')).toBeInTheDocument();
expect(getByText('1 ETH')).toBeInTheDocument();
expect(getByText('$3,000.00')).toBeInTheDocument();
});
it('should render scientific notation', () => {
(useNFTContext as Mock).mockReturnValue({
lastSoldPrice: {
amount: '5e-05',
currency: 'ETH',
amountUSD: '0.13',
},
});
const { getByText } = render();
expect(getByText('Last sale price')).toBeInTheDocument();
expect(getByText('0.00005 ETH')).toBeInTheDocument();
expect(getByText('$0.13')).toBeInTheDocument();
});
it('should render null if price is not available', () => {
(useNFTContext as Mock).mockReturnValue({
lastSoldPrice: {
amount: null,
currency: 'ETH',
},
});
const { container } = render();
expect(container.firstChild).toBeNull();
});
it('should render null if currency is not available', () => {
(useNFTContext as Mock).mockReturnValue({
lastSoldPrice: { amount: '100', currency: null, amountUSD: '3000' },
});
const { container } = render();
expect(container.firstChild).toBeNull();
});
it('should apply custom className', () => {
const { getByText } = render();
expect(getByText('Last sale price').parentElement).toHaveClass(
'custom-class',
);
});
it('should display custom label', () => {
const { getByText } = render();
expect(getByText('Mint Price')).toBeInTheDocument();
});
});