import { testA11y, screen, render } from '@fuels/jest';
import { composeStory } from '@storybook/react';
import { SIZES_MAP } from '../Avatar/styles';
import { Asset } from './Asset';
import Meta, * as Stories from './Asset.stories';
import { MOCK_ASSETS } from './__mocks__/assets';
const Usage = composeStory(Stories.Usage, Meta);
const Sizes = composeStory(Stories.Sizes, Meta);
const Amounts = composeStory(Stories.AmountExamples, Meta);
const NoIcon = composeStory(Stories.NoIcon, Meta);
const CustomIcon = composeStory(Stories.CustomIcon, Meta);
describe('Asset', () => {
it('a11y', async () => {
await testA11y();
});
it('should render story usage properly', () => {
const { container } = render();
const img = screen.getByRole('img', { name: /ethereum image/i });
const asset = MOCK_ASSETS.eth;
expect(img).toBeInTheDocument();
expect(img).toHaveAttribute('width', String(SIZES_MAP.sm));
expect(img).toHaveAttribute('height', String(SIZES_MAP.sm));
expect(img).toHaveAttribute('src', asset.imageUrl);
expect(screen.getByText(asset.name)).toBeInTheDocument();
expect(screen.getByText(asset.symbol)).toBeInTheDocument();
expect(screen.getByText('1.000')).toBeInTheDocument();
expect(container.querySelector('.fuel_Asset')).toBeInTheDocument();
expect(container.querySelector('.fuel_Asset-name')).toBeInTheDocument();
expect(container.querySelector('.fuel_Asset-icon')).toBeInTheDocument();
expect(container.querySelector('.fuel_Asset-amount')).toBeInTheDocument();
expect(container.querySelector('.fuel_Asset-symbol')).toBeInTheDocument();
});
it('should render sizes according sizes map', () => {
render();
const img = screen.getAllByRole('img', { name: /ethereum image/i });
['sm', 'md', 'lg', 'xl'].forEach((size, index) => {
expect(img[index]).toBeInTheDocument();
expect(img[index]).toHaveAttribute('width', String(SIZES_MAP[size]));
expect(img[index]).toHaveAttribute('height', String(SIZES_MAP[size]));
});
});
it('should render amount in a different precision', () => {
render();
expect(screen.getAllByText('1.000000001')).toHaveLength(2);
});
it('should render different icons for amount', () => {
render();
expect(screen.getByLabelText('Icon ArrowUp')).toBeInTheDocument();
expect(screen.getByLabelText('Icon ArrowDown')).toBeInTheDocument();
});
it('should hide icon using prop', () => {
render();
expect(() => screen.getByLabelText('Icon ArrowUp')).toThrow();
expect(() => screen.getByLabelText('Icon ArrowDown')).toThrow();
});
it('should render a custom icon', () => {
render();
expect(screen.getByLabelText('Icon CurrencyEthereum')).toBeInTheDocument();
expect(screen.getByLabelText('Ethereum icon')).toBeInTheDocument();
});
it('should render asset initial if no image url is passed', () => {
render();
expect(screen.getByText('ET')).toBeInTheDocument();
expect(screen.getByLabelText('Ethereum initials')).toBeInTheDocument();
});
it('should not be able to render without allowed children', () => {
jest.spyOn(console, 'error').mockImplementation(() => null);
expect(() =>
render(
hi
,
),
).toThrow();
});
});