112 lines
5.6 KiB
Markdown
112 lines
5.6 KiB
Markdown
# Аудит и план доработок
|
|
|
|
## 1. Невыполненный пункт todo.md
|
|
|
|
- [ ] **Боковая панель** — при изменении настроек должна обновляться (или кнопка
|
|
refresh)
|
|
- `todo.md:58-60`
|
|
|
|
---
|
|
|
|
## 2. Рефакторинг: слияние frontmatterBlock.ts → frontmatterFields.ts
|
|
|
|
> ✅ **Выполнено**
|
|
|
|
- `frontmatterBlock.ts` удалён, логика перенесена в `frontmatterFields.ts`
|
|
- Обновлены импорты в `validateFrontmatter.ts` и `parseTaskTags.ts`
|
|
- Написаны 7 unit-тестов на `extractFrontmatterBlock`
|
|
|
|
---
|
|
|
|
## 3. Тесты на edge cases
|
|
|
|
> ✅ **Выполнено** — добавлено 14 тестов во все перечисленные модули.
|
|
|
|
Список покрытых кейсов:
|
|
|
|
| Модуль | Что добавили |
|
|
| ------------------------------- | --------------------------------------------------------------------- |
|
|
| `dashboard/sortTasks` | пустой массив, одинаковые created, invalid даты |
|
|
| `kanban/buildKanbanBoard` | одинаковые updated (стабильность) |
|
|
| `storage/FsTaskRepository` | кириллица, title 80 символов, спецсимволы в тегах, slug для Fix___bug |
|
|
| `dashboard/applyRawTaskContent` | разный порядок полей, пустое body |
|
|
| `dashboard/buildDashboardView` | пустой массив |
|
|
| `dashboard/groupTasks` | неизвестный статус/приоритет |
|
|
| `dashboard/filterTasks` | пустой массив |
|
|
|
|
### 🟡 Ещё можно добавить
|
|
|
|
| Модуль | Кейс |
|
|
| ------------------ | -------------------------------------------------------------- |
|
|
| — | Интеграционный тест: create → serialize → write → read → parse |
|
|
| `FsTaskRepository` | конфликт ID при merge задач из project + global |
|
|
|
|
### ❓ Дизайн-вопрос: неизвестные статусы/приоритеты
|
|
|
|
`groupTasks` молча дропает задачи, у которых `status` или `priority` не входит в
|
|
известный список (`TASK_STATUS_ORDER` / `TASK_PRIORITY_ORDER`). Такая задача
|
|
будет в `visibleTasks`, но не попадёт ни в одну группу → фактически невидима в
|
|
grouped-view.
|
|
|
|
**Возможное решение:** добавить `TaskStatus.UNKNOWN` / `TaskPriority.UNKNOWN` и
|
|
маппить любые невалидные значения на них при парсинге в `parseTaskFile`
|
|
(`utils/markdown.ts`). Тогда groupTasks всегда найдёт такую задачу в группе
|
|
"Unknown".
|
|
|
|
Решение требует изменений:
|
|
|
|
- `model/taskStatus.ts` — `TaskStatus.UNKNOWN`, `TASK_STATUS_ORDER`,
|
|
`TASK_STATUS_META`
|
|
- `model/taskPriority.ts` — `TaskPriority.UNKNOWN`, `TASK_PRIORITY_ORDER`,
|
|
`TASK_PRIORITY_META`
|
|
- `utils/markdown.ts` — маппинг в `parseTaskFile`
|
|
- `validateFrontmatter.ts` — возможно, смягчить валидацию для unknown
|
|
|
|
---
|
|
|
|
## 4. Хрупкие тесты
|
|
|
|
### Snapshot-тесты
|
|
|
|
- `model/taskStatus.test.ts` — `toMatchSnapshot()` на `TaskStatus`
|
|
- `model/taskPriority.test.ts` — `toMatchSnapshot()` на `TaskPriority`
|
|
|
|
Ломаются от любого изменения порядка ключей.
|
|
|
|
→ Заменить на `toEqual()` с явными ожиданиями.
|
|
|
|
### `_unsafeUnwrap()` вместо проверок isErr/isOk
|
|
|
|
7 мест, где используется `_unsafeUnwrap()` — при падении теста вместо понятной
|
|
assertion ошибки будет `RuntimeError: called _unsafeUnwrap on an Err`:
|
|
|
|
- `src/commands/addProjectTag.test.ts:27,28,50,63,66`
|
|
- `src/projectConfig/parseProjectConfig.test.ts:14,15,24`
|
|
- `src/projectConfig/serializeProjectConfig.test.ts:11,17`
|
|
|
|
→ Заменить на `isErr()`/`isOk()` + `if (result.isErr()) return` паттерн.
|
|
|
|
---
|
|
|
|
## 5. Untested-модули (кроме UI/vscode-адаптеров)
|
|
|
|
**`src/config.ts`** (60 строк) После слияния `frontmatterBlock.ts` — самый
|
|
крупный untested модуль.
|
|
Стоит покрыть: `getConfigSection`, `getSettingDefault`, ошибки при missing keys.
|
|
|
|
**`src/model/taskFile.ts`** (46 строк) `isTaskFileName` + константы — можно
|
|
быстрый unit-тест.
|
|
|
|
---
|
|
|
|
## Текущий статус
|
|
|
|
- [x] **Рефакторинг** — `frontmatterBlock.ts` → `frontmatterFields.ts` + тесты
|
|
- [x] **Edge case тесты** — 14 тестов добавлены, все зелёные
|
|
- [ ] **Дизайн-вопрос** — решить судьбу неизвестных статусов/приоритетов
|
|
- [ ] **Хрупкие тесты** — snapshot → `toEqual`, `_unsafeUnwrap` → безопасный
|
|
паттерн
|
|
- [ ] **config.ts + taskFile.ts** — unit-тесты
|
|
- [ ] **todo.md** — refresh боковой панели
|
|
- [ ] **Интеграционный тест** — полный round-trip через файл
|