import {act, render, screen} from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import {describe, expect, it, vi} from 'vitest'; import SeedStack from './SeedStack'; const props = { crop: {name: 'Tomato', path: '/crops/tomato'}, count: 2, image_url: '/t.jpg', heirloom: 'heirloom', rule: 'Sow in spring', owner: null, packets: [ {id: 1, name: 'Roma', path: '/seeds/1', image_url: '/1.jpg', when: 'Saved 2024', detail: '20 seeds', rule: 'Sow in spring', heirloom: 'heirloom', past: false}, {id: 2, name: 'Cherry', path: '/seeds/2', image_url: '/2.jpg', when: 'Saved 2020', detail: '5 seeds', rule: 'Sow in spring', heirloom: null, past: true}, ], }; const pile = () => screen.getByRole('button', {name: 'Tomato, 2 packets. Open to see each packet'}); describe('SeedStack', () => { it('starts as a closed pile', () => { render(); expect(pile()).toHaveAttribute('aria-expanded', 'false'); }); it('shows the count on the pile', () => { render(); expect(screen.getByText('×2')).toBeInTheDocument(); }); it('shows the heirloom pill', () => { render(); expect(screen.getByText('Heirloom')).toBeInTheDocument(); }); it('shows whose it is on a page of other people\'s seeds', () => { render(); expect(screen.getByRole('link', {name: 'Sam\'s seeds'})).toHaveAttribute('href', '/members/sam'); }); describe('when opened', () => { async function open() { render(); await userEvent.click(pile()); } it('spreads out a packet each', async () => { await open(); expect(screen.getAllByRole('article')).toHaveLength(2); }); it('links each packet', async () => { await open(); expect(screen.getByRole('link', {name: 'Roma'})).toHaveAttribute('href', '/seeds/1'); }); it('stamps packets past their sow-by date', async () => { await open(); expect(screen.getAllByText('Past sow-by')).toHaveLength(1); }); it('links to the crop page', async () => { await open(); expect(screen.getByRole('link', {name: /Open the Tomato page/})).toHaveAttribute('href', '/crops/tomato'); }); it('is a group named for the pile', async () => { await open(); expect(screen.getByRole('group', {name: 'Tomato, 2 packets'})).toBeInTheDocument(); }); }); describe('when closed again', () => { it('folds back into a pile after the animation', async () => { vi.useFakeTimers({shouldAdvanceTime: true}); render(); await userEvent.click(pile()); await userEvent.click(screen.getByRole('button', {name: /Close/})); act(() => vi.advanceTimersByTime(300)); expect(pile()).toBeInTheDocument(); }); it('closes on Escape', async () => { vi.useFakeTimers({shouldAdvanceTime: true}); render(); await userEvent.click(pile()); screen.getByRole('button', {name: /Close/}).focus(); await userEvent.keyboard('{Escape}'); act(() => vi.advanceTimersByTime(300)); expect(pile()).toBeInTheDocument(); }); }); });