import { beforeEach, describe, expect, it } from 'vitest'; import { initPacketSheet, setEditing, toggleZoom } from './packet_sheet'; describe('the packet sheet', () => { let sheet; beforeEach(() => { document.body.innerHTML = ` Edit
`; sheet = document.querySelector('[data-packet-sheet]'); sheet.scrollIntoView = () => {}; }); describe('setEditing', () => { it('shows the form when editing', () => { setEditing(sheet, true); expect(sheet.classList).toContain('is-editing'); }); it('puts the cursor in the first field', () => { setEditing(sheet, true); expect(document.activeElement.name).toBe('seed[variety]'); }); it('opens the text, which is wanted beside the fields', () => { let opened = false; sheet.querySelector('.seed-packet-text-toggle').addEventListener('click', () => { opened = true; }); setEditing(sheet, true); expect(opened).toBe(true); }); it('leaves the text open once it is', () => { let clicks = 0; const toggle = sheet.querySelector('.seed-packet-text-toggle'); toggle.setAttribute('aria-expanded', 'true'); toggle.addEventListener('click', () => { clicks += 1; }); setEditing(sheet, true); expect(clicks).toBe(0); }); it('goes back to the list when not editing', () => { setEditing(sheet, true); setEditing(sheet, false); expect(sheet.classList).not.toContain('is-editing'); }); }); describe('zooming a packet photo', () => { let link; let image; beforeEach(() => { document.body.insertAdjacentHTML('beforeend', `
`); link = document.querySelector('.seed-packet-photos a'); image = link.querySelector('img'); }); it('shows the big copy, full size', () => { toggleZoom(link); expect(image.getAttribute('src')).toBe('large.jpg'); }); it('marks the photos as zoomed', () => { toggleZoom(link); expect(link.closest('.seed-packet-photos').classList).toContain('is-zoomed'); }); it('goes back to the one that fits', () => { toggleZoom(link); toggleZoom(link); expect(image.getAttribute('src')).toBe('fit.jpg'); }); it('falls back to the one that fits if the big one is not there', () => { toggleZoom(link); image.onerror(); expect(image.getAttribute('src')).toBe('fit.jpg'); }); it('zooms on a click, instead of going to the photo\'s page', () => { initPacketSheet(); const click = new MouseEvent('click', { bubbles: true, cancelable: true }); link.dispatchEvent(click); expect(click.defaultPrevented).toBe(true); }); it('leaves a click with the control key down alone, to open in a new tab', () => { initPacketSheet(); const click = new MouseEvent('click', { bubbles: true, cancelable: true, ctrlKey: true }); link.dispatchEvent(click); expect(click.defaultPrevented).toBe(false); }); }); describe('the buttons', () => { beforeEach(() => initPacketSheet()); it('Edit all starts editing', () => { document.getElementById('edit-all').click(); expect(sheet.classList).toContain('is-editing'); }); it('the menu\'s Edit starts editing, instead of going to the form\'s page', () => { const click = new MouseEvent('click', { bubbles: true, cancelable: true }); document.getElementById('menu-edit').dispatchEvent(click); expect(click.defaultPrevented).toBe(true); }); it('Cancel stops editing', () => { setEditing(sheet, true); document.getElementById('cancel').click(); expect(sheet.classList).not.toContain('is-editing'); }); }); });