From 1532017c0b8452f150f0c11d53cbfc076bb314f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A2=D0=B8=D0=BC=D1=83=D1=80=20=D0=93=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=D1=86=D0=BA=D0=B8=D0=B9?= Date: Fri, 16 Oct 2026 10:13:15 +0500 Subject: [PATCH] docs: add step-by-step manual test plan Scenarios per section with expected results, role switching with one account, side-by-side comparison with the legacy pages and a bug report template, so the workbench check can be done systematically. Co-Authored-By: Claude Opus 5.5 (1M context) --- docs/TEST-PLAN.md | 192 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 docs/TEST-PLAN.md diff --git a/docs/TEST-PLAN.md b/docs/TEST-PLAN.md new file mode 100644 index 0000000..ec6fe62 --- /dev/null +++ b/docs/TEST-PLAN.md @@ -0,0 +1,192 @@ +# План ручной проверки StroyBot + +Пошаговая проверка нового приложения перед выкаткой. Дополняет `MIGRATION-CHECKLIST.md` (там — список функций, здесь — что нажать и что должно получиться). + +**Правила** +- Всё, что **записывает** данные (создать / изменить / удалить / импорт / утвердить), — **только на проекте «ТЕСТ StroyBot»**. Такие сценарии помечены ✍️. +- Всё, что только **читает**, проверяем на настоящих проектах — **сравнением со старой страницей** (см. «Главный приём»). +- Нашёл расхождение — не исправляй ничего сам, запиши по шаблону «Как сообщить о баге» и иди дальше. +- Отметки: `[x]` — совпало, `[!]` — баг (номер бага рядом), `[-]` — не применимо. + +--- + +## 0. Подготовка (один раз) + +### 0.1 Тестовые данные в SharePoint (`/sites/stroy`) +- [ ] В списке **«Проекты»** создать проект **«ТЕСТ StroyBot»**, статус **текущий**. Записать его `Id` (видно в адресе элемента): `Id = ____`. +- [ ] В списке **«Доступы»** создать строку: проект = «ТЕСТ StroyBot», пользователь = **ты**, `read` = да, `edit0` = да, `aproove` = нет. + - Это **разные поля в разных старых web parts** (lookup `project`/`user` и поля `projectId`/`userId`). Если при создании строки видно оба набора — заполни оба. Запиши, какие поля реально есть в списке: `________________`. +- [ ] В списке **«Объекты»** — пока ничего, объекты создадим в приложении (T-OBJ). +- [ ] Убедись, что в **«Смены»**, **«Компании»**, **«Профессии»**, **«Техника»**, **«Единицы измерения»** есть хотя бы по 2 элемента. + +### 0.2 Переключение ролей одним аккаунтом +Роли меняются правкой **твоей строки «Доступы»** у «ТЕСТ StroyBot», статус проекта — полем **Status** в «Проекты». После правки — **F5** в приложении. + +| Роль | read | edit0 | aproove | +|---|---|---|---| +| **Р** — только чтение | да | нет | нет | +| **Е** — редактор | да | да | нет | +| **У** — утверждающий | да | нет | да | +| **Н** — нет доступа | нет | нет | нет | + +Начальная роль — **Е**. + +### 0.3 Запуск workbench +1. В терминале VS Code (`` Ctrl+` ``) в папке `stroy-bot-monorepo`: `npx heft start`. Дождаться `Starting server`. +2. Открыть `https://tnsukz.sharepoint.com/sites/stroy/_layouts/workbench.aspx` (именно на сайте **stroy**, не корневом). +3. Разрешить загрузку отладочных скриптов, если браузер спросит. +4. **+** → web part **StroyBot**. +5. Держать открытыми **F12 → Console** и **F12 → Network** (фильтр `Fetch/XHR`) — туда смотрим при любой ошибке. + +> Workbench не умеет одобрять API-разрешения. Если Dataverse или выгрузки упадут с ошибкой доступа/токена — это ожидаемо до выкатки пакета; помечай `[!]` с текстом ошибки, разберёмся. + +--- + +## Главный приём — сравнение со старой страницей +Для любого раздела, который **показывает** данные: +1. Открыть **старую** страницу раздела (из старого stroy-bot-main) для проекта X. +2. Открыть **новый** раздел в workbench для того же проекта X. +3. Сравнить: количество строк, названия, числа, даты, порядок, бейджи, какие кнопки видны. + +Проекты для сравнения — 2 настоящих: один **большой** (много объектов и отчётов), один **маленький**. Запиши: +- Большой: `________________` (Id `__`) +- Маленький: `________________` (Id `__`) + +--- + +## 1. Оболочка — `T-APP` +- [ ] **T-APP-01** Открыть web part. Слева меню с одним пунктом «Проект», справа главная. Ошибок в Console нет. +- [ ] **T-APP-02** Выбрать проект → в меню появились разделы. Нажать «Объекты» → адрес стал `…?page=objects&projectId=…`. +- [ ] **T-APP-03** Нажать «назад» в браузере → вернулись на главную. «Вперёд» → снова объекты. +- [ ] **T-APP-04** Скопировать адрес раздела, открыть в новой вкладке → открылся тот же раздел того же проекта. +- [ ] **T-APP-05** F5 на любом разделе → остались в нём. +- [ ] **T-APP-06** Закрыть вкладку, открыть web part заново (без `projectId` в адресе) → проект восстановился из сессии. +- [ ] **T-APP-07** Шрифты: заголовки — с засечками (Lora), текст — Inter. Сравнить «на глаз» со старым main. +- [ ] **T-APP-08** Узкое окно (< 768px) → меню прячется, появляется кнопка-бургер, меню открывается поверх. + +## 2. Главная — `T-HUB` (сравнение со старым stroy-bot-main) +- [ ] **T-HUB-01** Клик в поле «Проект» → список; набор совпадает со старым main; сверху до 7 недавно активных. +- [ ] **T-HUB-02** Ввести часть названия (разный регистр) → фильтруется, не больше 7 строк; несуществующее → «Проекты не найдены». +- [ ] **T-HUB-03** Esc и клик мимо → список закрылся, в поле — выбранный проект. +- [ ] **T-HUB-04** Бейджи статусов совпадают по цвету: текущий — зелёный, завершён — серый, архивный — золотой, пусто — «Без статуса». +- [ ] **T-HUB-05** Без выбранного проекта все карточки неактивны, видна подсказка. +- [ ] **T-HUB-06** «ТЕСТ StroyBot», роль Е, статус **текущий** → все 6 карточек активны; меню — все разделы. +- [ ] **T-HUB-07** Роль **Р** → неактивна только «Отправить отчёт»; в меню нет «Отправить отчёт» и «Привязка к справочнику». +- [ ] **T-HUB-08** Статус **завершен** (роль Е) → неактивна только «Отправить отчёт». +- [ ] **T-HUB-09** Статус **архивный** → активен только «Архив», выгрузка неактивна, в меню только «Проект». Вернуть статус **текущий**. +- [ ] **T-HUB-10** «Архив проекта» → в новой вкладке папка `Документы/Архив/{проект}` (та же, что открывает старый main). +- [ ] **T-HUB-11** Ctrl+клик по карточке «Объекты» → раздел открылся в новой вкладке. +- [ ] **T-HUB-12** Выгрузка: «?» показывает 3 строки и закрывается кликом мимо. Даты 13.10–19.10 → «Отчёт за период»; 12.10–18.10 (Пн–Вс) → «Еженедельный»; один день → «Ежедневный»; начало позже конца → ошибка, кнопка неактивна. +- [ ] **T-HUB-13** «Выгрузить» на большом проекте за неделю → скачался `weekly_…xlsx`. **Сравнить** с файлом из старого main за тот же период — содержимое одинаковое. + +## 3. Ресурсы проекта — `T-RES` +- [ ] **T-RES-01** Большой проект: вкладки «Профессии (N)», «Компании (N)» — числа и списки совпадают со старой страницей. +- [ ] **T-RES-02** Поиск слева, «✕» очищает; «уже добавлено» у привязанных. +- [ ] ✍️ **T-RES-03** «ТЕСТ StroyBot»: «+» у профессии → сразу справа; F5 → осталась. Проверить строку в «Профессии по проекту». +- [ ] ✍️ **T-RES-04** «−» → исчезла; F5 → не вернулась; строка удалена из списка. +- [ ] ✍️ **T-RES-05** То же для компании. +- [ ] **T-RES-06** Узкое окно → колонки друг под другом. + +## 4. Привязка к справочнику — `T-BND` +- [ ] **T-BND-01** Большой проект: карточка проекта (описание, адрес, статус, даты, координаты) совпадает со старой страницей; бейдж «Привязан/Не привязан» тот же. +- [ ] **T-BND-02** Поиск по справочнику: результаты, «←/→», «стр / всего» — как в старой. +- [ ] ✍️ **T-BND-03** «ТЕСТ StroyBot»: выбрать проект справочника → «Связать» → сообщение успеха, бейдж «Привязан». В «Проекты» заполнились `UniqueId0`, `UniqueName`. +- [ ] ✍️ **T-BND-04** «Отвязать» → «Привязка удалена», поля очищены. **Снова привязать** (нужно для T-IMP). + +## 5. Объекты — `T-OBJ` +- [ ] **T-OBJ-01** Большой проект: число объектов в тулбаре и дерево (названия, вложенность, счётчики детей) совпадают со старой страницей. +- [ ] **T-OBJ-02** «Развернуть» / «Свернуть», клик по строке раскрывает. +- [ ] **T-OBJ-03** Роль **Р** → нет «Добавить объект», нет меню ⋮, нет перетаскивания. +- [ ] ✍️ **T-OBJ-04** «ТЕСТ StroyBot», роль Е: пустое дерево → «Объекты не найдены» + кнопка. Добавить объект-пятно «Корпус 1». +- [ ] ✍️ **T-OBJ-05** Меню ⋮ у «Корпус 1» → «Добавить объект» → «Раздел» «Фундамент». У «Фундамент» → «Вид работ» «Бетонирование». У вида работ нет пункта «Добавить объект». +- [ ] ✍️ **T-OBJ-06** Пустое название → сообщение «Поле обязательно…»; Enter сохраняет. +- [ ] ✍️ **T-OBJ-07** Редактировать «Фундамент» → сменить родителя (нужен второй объект-пятно «Корпус 2»). +- [ ] ✍️ **T-OBJ-08** Перетащить объект на другой → родитель сменился; на своего потомка — запрещено. +- [ ] ✍️ **T-OBJ-09** Удалить объект с детьми → подтверждение с числом детей; дети остаются (🐞 так было). +- [ ] **T-OBJ-10** «Экспорт» → скачался `objects-{id}.xlsx`, содержимое как у старой страницы. +- [ ] **T-OBJ-11** Меню ⋮ → «Работы» → открылся раздел «Работы» этого объекта. + +## 6. Работы — `T-WRK` +- [ ] **T-WRK-01** Объект большого проекта: список работ, единицы, объёмы (3 знака), даты, вложенность — как в старой странице. +- [ ] **T-WRK-02** Родители свёрнуты; нумерация считает только видимые строки. +- [ ] ✍️ **T-WRK-03** «ТЕСТ StroyBot», «Бетонирование»: «Добавить работу» «Бетон В25», м3, 12.5, даты. +- [ ] ✍️ **T-WRK-04** «Сохранить и добавить еще» → окно не закрылось, поля пустые, родитель тот же. +- [ ] ✍️ **T-WRK-05** ⋮ → «Добавить дочернюю» → родитель предвыбран. +- [ ] ✍️ **T-WRK-06** «Редактировать» дочернюю → убрать родителя → сохранить → стала корневой. +- [ ] ✍️ **T-WRK-07** В списке «Родительская работа» при правке нет самой работы и её потомков. +- [ ] ✍️ **T-WRK-08** Удалить → «Подтвердите удаление» → исчезла. +- [ ] **T-WRK-09** Роль **Р** → нет кнопок добавления и меню ⋮. + +## 7. Импорт работ — `T-IMP` +- [ ] **T-IMP-01** Проект без привязки к справочнику → «Проект не привязан к справочнику…». +- [ ] **T-IMP-02** Большой привязанный проект: «Загрузка работ… X из Y», затем число работ совпадает со старой страницей. +- [ ] **T-IMP-03** Поиск (код СНБ, объём, название), страницы по 100. +- [ ] ✍️ **T-IMP-04** «ТЕСТ StroyBot» (привязан в T-BND-04): выбрать объект → отметить 2 работы → «Импортировать» → тост «✓ Успешно импортировано: 2»; строки стали «✓ импортировано» и неактивны. +- [ ] ✍️ **T-IMP-05** Работы появились в разделе «Работы» этого объекта. +- [ ] ✍️ **T-IMP-06** «Импорт с созданием объекта» → в «Объекты» созданы объект и раздел из сметы, работы — под ними. +- [ ] **T-IMP-07** «Импортировать» без объекта → тост «Выберите объект…». + +## 8. Отчёты по проекту — `T-RPL` +- [ ] **T-RPL-01** Большой проект, текущая неделя: число карточек, номера, даты, авторы, компании, объекты — как в старой странице. +- [ ] **T-RPL-02** Сменить период → «Применить» → совпадает со старой за тот же период. +- [ ] **T-RPL-03** Поиск по автору, компании, объекту, комментарию. +- [ ] **T-RPL-04** Роль **Н** → «Нет доступа». +- [ ] **T-RPL-05** Роль **Р** → нет «Отправить отчёт», копирования и удаления. +- [ ] **T-RPL-06** Клик по карточке → форма отчёта в **новой вкладке** с `reportId`. + +## 9. Форма отчёта — `T-REP` (самое важное) +Роль **Е**, «ТЕСТ StroyBot», объекты и работы из T-OBJ / T-WRK. +- [ ] ✍️ **T-REP-01** «Отправить отчёт» → «Новый отчет», дата — сегодня, смена — первая. +- [ ] ✍️ **T-REP-02** «Сохранить» пустым → все 5 ошибок валидации, тексты как в старой форме. +- [ ] ✍️ **T-REP-03** Выбрать объект, компанию; «+ Выбрать работу» → работы объекта; drill-down по родителям; «Выбрать «X»». +- [ ] ✍️ **T-REP-04** У работы: значение 3.5, комментарий; «Персонал на работе» + профессия (2 чел., 8 ч); «Техника на работе» + техника. +- [ ] ✍️ **T-REP-05** Общий персонал с типом «Часы простоя» без комментария → ошибка валидации; с комментарием — ок. +- [ ] ✍️ **T-REP-06** Общая техника «Часы ремонта» + комментарий. +- [ ] ✍️ **T-REP-07** Добавить 2 фото → превью; удалить одно. +- [ ] ✍️ **T-REP-08** «Сохранить отчет» → «Отчет успешно сохранен!», кнопка стала «← Вернуться назад». Записать номер отчёта: `№ ____`. +- [ ] ✍️ **T-REP-09** Проверить в данных: отчёт в Dataverse; строки — работа, её персонал и техника **с родителем = строка работы**, общий персонал и техника **без родителя**; фото в `DocLib/{projectId}_{номер}`. +- [ ] ✍️ **T-REP-10** Открыть отчёт из «Отчёты по проекту» → режим правки, всё заполнено как сохраняли (включая персонал внутри работы). +- [ ] ✍️ **T-REP-11** Изменить значение работы, удалить общую технику → сохранить → открыть заново → изменения на месте, **лишних и задвоенных строк нет**. +- [ ] ✍️ **T-REP-12** Сменить объект в форме → работы очистились. +- [ ] ✍️ **T-REP-13** «Создать на основе» (копирование) → новая форма, всё скопировано, дата — сегодня, фото — пусто; сохранить → новый номер. +- [ ] ✍️ **T-REP-14** Пикер техники: группы, фильтр, «Все». Создать новую технику из пикера → появилась в списке «Техника». +- [ ] ✍️ **T-REP-15** Пикер работ: создать новую работу (ед., план, родитель) → появилась в «Работах» объекта. +- [ ] ✍️ **T-REP-16** Роль **У** → открыть неутверждённый отчёт → «На утверждении», поля только для чтения, «Утвердить отчет» → подтверждение → «Отчет утвержден!», бейдж «Утверждён». +- [ ] ✍️ **T-REP-17** Роль **Е** → утверждённый отчёт открывается только для чтения. +- [ ] **T-REP-18** Роль **Р** → отчёт только для чтения, кнопок нет. +- [ ] **T-REP-19** Роль **Н** → «Нет доступа» при открытии существующего отчёта. +- [ ] **T-REP-20** Большой проект: открыть 3 разных старых отчёта → всё совпадает со старой формой (план-факт, персонал, техника, фото-папка). +- [ ] **T-REP-21** «← Вернуться назад» → вернулись туда, откуда пришли. +- [ ] **T-REP-22** Enter в любом поле не перезагружает страницу. +- [ ] ✍️ **T-REP-23** Удалить тестовый отчёт из «Отчёты по проекту» → «Удалить отчёт?» → пропал из списка (мягкое удаление). + +--- + +## Как сообщить о баге +Скопируй и заполни: +``` +Баг: T-XXX-NN +Роль / проект: Е / ТЕСТ StroyBot +Что сделал: 1) … 2) … 3) … +Ожидал: … +Получил: … +Старая страница в этом случае: … (если сравнивал) +Console (F12): текст красной ошибки +Network (F12): красный запрос — адрес и ответ (вкладка Response) +Скриншот: (если про внешний вид) +``` + +--- + +## Итог +| Раздел | Пройдено | Багов | +|---|---|---| +| Оболочка | | | +| Главная | | | +| Ресурсы | | | +| Привязка | | | +| Объекты | | | +| Работы | | | +| Импорт | | | +| Отчёты по проекту | | | +| Форма отчёта | | |