# Vitest + Clean Architecture Refactoring ## Цель Установить Vitest, переделать архитектуру ближе к чистой (порты/адаптеры), написать нехрупкие тесты на реальные юзкейсы. ## Изменения ### Новые файлы ```txt src/ ├── ports.ts # Интерфейсы: IFileSystem, ITaskRepository, IConfigProvider ├── storage/ │ ├── FsTaskRepository.ts # ITaskRepository → зависит только от IFileSystem, markdown, uuid │ ├── FsTaskRepository.test.ts # unit (sociable) — colocation с модулем │ ├── VscodeConfigProvider.ts # IConfigProvider → зависит от vscode │ └── NodeFileSystem.ts # IFileSystem → обёртка над fs.promises ├── utils/ │ └── markdown.test.ts # unit — colocation tests/ └── helpers/ └── InMemoryFileSystem.ts # shared fakes; integration/e2e — сюда же позже ``` ### Удалить - `src/storage/taskStore.ts` - `src/storage/configStore.ts` ### Изменить - `src/views/taskTreeProvider.ts` — конструктор принимает `ITaskRepository` + `IConfigProvider` - `src/extension.ts` — сборка зависимостей (DI) ### Инфраструктура - `npm i -D vitest` - `vitest.config.ts` - `package.json` — скрипты `test`, `test:run` ## Тесты | Тест | Где | I/O | Что проверяет | | ---------------- | ----------------------- | ------------------------ | -------------------------------------------- | | FsTaskRepository | `src/storage/*.test.ts` | InMemoryFileSystem (Map) | CRUD, фильтрация по extension, контент файла | | markdown | `src/utils/*.test.ts` | — | parse, serialize, round-trip, default-ы | Unit/sociable unit — рядом с модулем (`src/**/*.test.ts`). Shared fakes и будущие integration/e2e — в `tests/`. ## Что НЕ тестируем (пока) - NodeFileSystem — тривиальная обёртка - VscodeConfigProvider — требует Extension Host - TaskTreeProvider — UI, требует Extension Host