kammer/e2e/specs/flows/check-out-check-in.spec.ts
Christopher Mühl ba68fb456a test: E2E test suite + handoff documentation
50 Playwright E2E tests across 13 spec files covering all routes and
user flows (items CRUD, check-out/in, locations, labels, scanning,
search/filter). Uses vitest as runner with playwright-core for browser
automation (bun-compatible alternative to @playwright/test).

Includes Gherkin .feature files as living documentation, test support
infrastructure (IDB seeding, item factories, assertion helpers, layout
measurement), and HANDOFF.md covering project state, deployment, and
open design decisions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-26 20:53:08 +01:00

50 lines
1.9 KiB
TypeScript

/**
* @feature Check Out / Check In Flow
* @see e2e/features/flows/check-out-check-in.feature
*/
import { describe, test } from 'vitest';
import { setupBrowser } from '../../support/browser';
import { waitForAppReady, seedItems } from '../../support/seed';
import { buildItem, buildCheckedOutItem } from '../../support/item-factory';
import { expectVisible } from '../../support/expect';
const { getPage } = setupBrowser();
describe('Check Out / Check In Flow', () => {
test('check out an item', async () => {
const page = getPage();
const item = buildItem({ name: 'Drill', category: 'Tools' });
await page.goto('/');
await waitForAppReady(page);
await seedItems(page, [item]);
await page.goto('/items');
await waitForAppReady(page);
await page.getByText('Drill').click();
// 'Home' badge on item detail (not the location tree 'Home')
await expectVisible(page.locator('main').getByText('Home').first());
await page.getByRole('button', { name: 'Check Out' }).click();
await page.locator('#co-reason').selectOption('lent');
await page.getByRole('button', { name: 'Confirm' }).click();
// Badge shows reason label "Lent" after checkout
await expectVisible(page.locator('main').getByText('Lent').first());
});
test('check in a checked-out item shows check-in form', async () => {
const page = getPage();
const item = buildCheckedOutItem({ name: 'Drill' });
await page.goto('/');
await waitForAppReady(page);
await seedItems(page, [item]);
await page.goto('/items');
await waitForAppReady(page);
await page.getByText('Drill').click();
// buildCheckedOutItem sets reason 'in-use' → badge shows "In Use"
await expectVisible(page.locator('main').getByText('In Use').first());
await expectVisible(page.getByRole('heading', { name: 'Check In' }));
await expectVisible(page.getByText('Return to'));
});
});