# E2E Testing Guide
Руководство по написанию e2e тестов для Team Planner.
## Принципы
### 1. Тесты следуют требованиям, а не коду
Тесты должны проверять **пользовательские сценарии** из требований, а не адаптироваться под текущую реализацию.
```
❌ Плохо: "Проверить что кнопка имеет класс .MuiButton-contained"
✅ Хорошо: "Проверить что пользователь может создать новую идею"
```
**Порядок работы:**
1. Прочитать требования к фазе/фиче в `ROADMAP.md` и `REQUIREMENTS.md`
2. Выделить пользовательские сценарии
3. Написать тесты для каждого сценария
4. Убедиться что тесты проверяют бизнес-логику, а не детали реализации
### 2. Стабильные селекторы через data-testid
**Никогда не использовать:**
- Позиционные селекторы: `tbody tr`, `.nth(2)`, `:first-child`
- CSS классы MUI: `.MuiButton-root`, `.MuiTableCell-body`
- Структурные селекторы: `table > tbody > tr > td`
**Всегда использовать:**
- `data-testid` для уникальной идентификации элементов
- `[role="..."]` только для стандартных ARIA ролей (tab, dialog, listbox)
- Текстовые селекторы только для статичного контента
```typescript
// ❌ Плохо - сломается при изменении структуры
const row = page.locator('tbody tr').nth(2);
const button = page.locator('.MuiIconButton-root').first();
// ✅ Хорошо - стабильно при рефакторинге
const row = page.locator('[data-testid="idea-row-123"]');
const button = page.locator('[data-testid="delete-idea-button"]');
```
## Соглашения по data-testid
### Именование
| Паттерн | Пример | Использование |
|---------|--------|---------------|
| `{component}-{element}` | `ideas-table` | Основные элементы |
| `{component}-{element}-{id}` | `idea-row-123` | Динамические элементы |
| `{action}-{target}-button` | `delete-idea-button` | Кнопки действий |
| `{name}-input` | `member-name-input` | Поля ввода |
| `{name}-modal` | `team-member-modal` | Модальные окна |
| `filter-{name}` | `filter-status` | Фильтры |
### Обязательные data-testid по компонентам
#### Таблицы
```
{name}-table - сам table элемент
{name}-table-container - обёртка таблицы
{name}-empty-state - состояние "нет данных"
{item}-row-{id} - строка с данными
```
#### Формы и модалки
```
{name}-modal - Dialog компонент
{name}-form - form элемент
{field}-input - поля ввода (TextField)
{field}-select - выпадающие списки (FormControl)
submit-{action}-button - кнопка отправки
cancel-{action}-button - кнопка отмены
```
#### Действия в строках
```
edit-{item}-button - редактирование
delete-{item}-button - удаление
toggle-{feature}-button - переключение
```
## Работа с MUI компонентами
### Popover / Menu
MUI Popover рендерится через Portal в `
`. Для добавления `data-testid` используй `slotProps`:
```tsx
,
}}
>
```
### Dialog
Dialog также использует Portal. Добавляй `data-testid` напрямую:
```tsx