# Тестирование

## Обзор

| Тип                      | Фреймворк  | Команда              | Расположение    |
| ------------------------ | ---------- | -------------------- | --------------- |
| E2E визуальная регрессия | Playwright | `bun run test`       | `tests/e2e/`    |
| Figma CDP референс       | Playwright | `bun run test:figma` | `tests/figma/`  |
| Юнит-тесты               | bun:test   | `bun run test:unit`  | `tests/engine/` |

## E2E визуальная регрессия

Playwright создаёт фигуры на холсте и сравнивает скриншоты с эталонными PNG.

```sh
bun run test              # Запуск тестов, сравнение с эталонами
bun run test:update       # Пересоздание эталонных скриншотов
```

### Как это работает

1. Тесты загружают редактор в headless-браузере
2. Редактор сигнализирует о готовности через HTML-атрибут `data-ready`
3. Тесты создают фигуры через API редактора
4. Скриншоты снимаются и сравниваются с эталонами с помощью `toMatchSnapshot`
5. Страница переиспользуется между тест-кейсами для скорости (~2с на все)

### Режим без оформления

Редактор поддерживает тестовый режим, скрывающий элементы интерфейса (панель инструментов, панели) для чистого снятия скриншотов. Активируется через URL-параметр.

## Figma CDP референсные тесты

Отдельный Playwright-проект подключается к Figma через Chrome DevTools Protocol для снятия эталонных скриншотов для попиксельного сравнения.

```sh
bun run figma:debug       # Запустить Figma с портом отладки
bun run test:figma        # Подключиться к Figma, снять эталоны
```

Требуется запущенное десктопное приложение Figma с `--remote-debugging-port=9222`.

## Юнит-тесты

Юнит-тесты движка используют bun:test и нацелены на время выполнения < 50мс:

```sh
bun run test:unit
```

Тесты покрывают:

- CRUD-операции графа сцены, связи родитель-потомок, z-упорядочивание, проверку попадания
- **Конвейер fig-import** — маппинг типов узлов, трансформации, заливки/обводки/эффекты, градиенты, изображения, дуги, вложенные иерархии (`tests/engine/io/fig/import/legacy/*.test.ts`)
- **Вычисление компоновки** — Yoga auto-layout: направление, gap, padding, justify, align, размер потомков (fixed/fill/hug), размер по поперечной оси, перенос, вложенные компоновки (`tests/engine/layout/`)

### Написание юнит-тестов

```typescript
import { describe, expect, it } from 'bun:test'
import { SceneGraph } from '@open-pencil/core/scene-graph'

describe('SceneGraph', () => {
  it('creates and retrieves a node', () => {
    const sg = new SceneGraph()
    const node = sg.createNode('RECTANGLE', sg.root, { name: 'Test' })
    expect(sg.getNode(node.guid)).toBeDefined()
  })
})
```

## Покрытие E2E-тестами

| Файл теста                       | Область                                                                              |
| -------------------------------- | ------------------------------------------------------------------------------------ |
| `tests/e2e/layers-panel.spec.ts` | Древовидная структура панели слоёв, переключатели видимости, синхронизация выделения |
| `tests/e2e/visual.spec.ts`       | Визуальная регрессия скриншотов для фигур и отрисовки                                |

## Вспомогательные модули

| Файл                      | Назначение                                   |
| ------------------------- | -------------------------------------------- |
| `tests/helpers/canvas.ts` | Утилиты настройки и взаимодействия с холстом |
| `tests/helpers/figma.ts`  | Хелперы подключения к Figma по CDP           |

## Целевые показатели производительности

| Метрика                  | Цель                          |
| ------------------------ | ----------------------------- |
| Полный E2E-набор         | < 3с                          |
| Полный набор юнит-тестов | < 50мс                        |
| Сравнение скриншотов     | toMatchSnapshot (попиксельно) |
