fix(ui): уточнить интерфейсы speed и исправить CLI-подсказку

This commit is contained in:
Denozordec committed 2026-10-08 10:00:42 +07:00
1 parent 47f747586c
commit f194e7269b
8 files changed
+215 -6

No files matched your search

+7 -2
View File
@@ -1664,12 +1664,12 @@ function UptimePageContent({ selectedProbeId, allProbesHref }: { selectedProbeId
lines.push("")
if (si) {
lines.push(`/ip address print where name="${si.replace(/"/g, '\\"')}"`)
lines.push(`/ip address print where interface="${si.replace(/"/g, '\\"')}"`)
lines.push("")
}
if (di) {
lines.push(`# Выполнить на узле назначения (${dst.name}) — адрес приёмника BT-сервера:`)
lines.push(`/ip address print where name="${di.replace(/"/g, '\\"')}"`)
lines.push(`/ip address print where interface="${di.replace(/"/g, '\\"')}"`)
lines.push("")
}
@@ -2778,6 +2778,11 @@ function UptimePageContent({ selectedProbeId, allProbesHref }: { selectedProbeId
/>
</FormField>
<p className="text-xs text-muted-foreground leading-relaxed">
Интерфейс источника используется для Ping после теста. На назначении выбирается
IP интерфейса, статический — первым. Маршрут bandwidth-test определяет RouterOS.
</p>
<div className="grid grid-cols-1 gap-3">
<FormField label="Протокол">
<SegmentedControl
+4
View File
@@ -149,3 +149,7 @@ BGP-prefix evaluator, отдельное live GRE расписание и recove
## Новый frontend proxy timeout — 2026-10-08
12.5.27 [real browser timeout502](ux-ui/acceptance/speed-unreachable-error-2026-10-08.json), [frontend deployment](ux-ui/acceptance/deployed-frontend-aa7dbdf-2026-10-08.json), [пять экранов](ux-ui/acceptance/deploy-browser-aa7dbdf-2026-10-08.json) passed. Frontendaa7dbdf/proxy180s, backend8782054healthy прежний; MMAPP_IMAGE_TAG=ux-aa7dbdf/BACKEND_IMAGE_TAG=ux-8782054. Основной DBcontrol совпал. Isolatedhost/probe восстановлены/удалены, temporarycontainers/network/3018 закрыты. Это transport timeout, не native can not connect; техническая подпись timeout остаётся ограничением UX. Следующий12.5.28 — ROS-3 interface/address/after-ping.
## Интерфейс native test и Ping — 2026-10-08
12.5.28 [real ROS-3](ux-ui/acceptance/speed-interface-2026-10-08.json): reverse2→1 done, bandwidth194.226.121.150/nointerfacebinding, Pingether1/0%loss; metadata source195 не доказываетsourceIPpackets. CHR2 имеет dynamic104/static195, явныйdstinterface предпочитаетstatic. Три1→2 попыткиtimeout, причинаauto-path не установлена; они не приняты. КонфигурацияRouterOS не менялась. Основнойruntimebackend8782054/frontendaa7dbdf/history5 сохранён. UIhint/CLIwhereinterface исправлены локально; browserfixture/typecheck/ESLint passed, не развёрнуты. Следующий12.5.29 — real browserform/deploymentподсказок.
+2 -2
View File
@@ -1,12 +1,12 @@
# План реализации UX/UI по пятичасовым окнам
Актуальное продолжение 2026-10-08: 12.5.27 завершён — frontendaa7dbdf/proxy180s собран, real browser timeout получил502 вместо500, previousTX42/historyerror сохранены, native1/без автоповтора/JS0/320fits. Frontend развёрнут, backend8782054healthy, пять основных экранов/контрольБД passed. Следующий12.5.28 — ROS-3: выбор интерфейса, фактический адрес bandwidth-test и after-ping. Native can not connect/busy/disconnect/abort и полный12.5 открыты.
Актуальное продолжение 2026-10-08: 12.5.28 подтвердил ROS-3 для2→1: native адрес194.226.121.150 без binding, after-ping interfaceether1/0%loss, SQLhistorydone. Три1→2 попытки timeout, этот путь не принят. Локально исправлены CLI where interface и пояснение формы; browser320/typecheck/ESLint passed, ещё не развёрнуты. Runtimebackend8782054/frontendaa7dbdf прежний. Следующий12.5.29 — browserform/deployment UI-подсказок, диагностика forward-сценария остаётся открытой.
Общий план проекта MikrotikManager. Основан на согласованном плане из задачи; точка продолжения обновлена 2026-10-08. Источник фактического прогресса, проверок и ограничений — [журнал реализации](ux-ui-progress.md). Этот документ задаёт объём и критерии завершения, журнал фиксирует результат.
## Актуальная точка продолжения — 2026-10-08
Этапы0–11 завершены в описанных локальных границах. Этап12 остаётся открытым. На161.104.46.222 развёрнуты backend/frontend8782054; два CHR подключены. PG backup/restore/rollback, single-instance quiescence, JWT/RBAC и browser restore приняты в границах журнала. PG-8 проверен с настоящими PG/native и введённой после COMMIT ошибкой подтверждения; новый browser UI сохраняет snapshot и сверяет историю. ROS-8/9 API/SQL/native приняты в описанных границах. Browser-смена пары/длительности и удаление во время native-теста приняты в12.5.24. Реальный отказ bandwidth-аутентификации принят в12.5.25. 12.5.26 обнаружил и локально исправил30s timeout Next proxy. Исправленный frontendaa7dbdf развёрнут и проверен в12.5.27; backend8782054 прежний. Следующий12.5.28 — ROS-3: интерфейсы, адрес bandwidth-test и after-ping. [Протокол](ux-ui-external-acceptance.md) и [журнал](ux-ui-stage-12.md) сохраняют точные доказательства и ограничения.
Этапы0–11 завершены в описанных локальных границах. Этап12 остаётся открытым. На161.104.46.222 развёрнуты backend/frontend8782054; два CHR подключены. PG backup/restore/rollback, single-instance quiescence, JWT/RBAC и browser restore приняты в границах журнала. PG-8 проверен с настоящими PG/native и введённой после COMMIT ошибкой подтверждения; новый browser UI сохраняет snapshot и сверяет историю. ROS-8/9 API/SQL/native приняты в описанных границах. Browser-смена пары/длительности и удаление во время native-теста приняты в12.5.24. Реальный отказ bandwidth-аутентификации принят в12.5.25. 12.5.26 обнаружил и локально исправил30s timeout Next proxy. Исправленный frontendaa7dbdf развёрнут и проверен в12.5.27; backend8782054 прежний. ROS-3 reverse2→1/native-afterping принят в12.5.28; forward timeout открыт. Следующий12.5.29 — real browserform/deployment UI-подсказок. [Протокол](ux-ui-external-acceptance.md) и [журнал](ux-ui-stage-12.md) сохраняют точные доказательства и ограничения.
Реальные pg_dump/pg_restore, PG rollback и остановка UDP worker требуют внешней приёмки. Датированные продолжения ниже — история; точный следующий шаг также указан в начале [журнала](ux-ui-progress.md).
+15 -1
View File
@@ -1,6 +1,6 @@
# UX/UI: журнал реализации
Актуальное продолжение 2026-10-08: 12.5.27 завершён — frontendaa7dbdf/proxy180s собран, real browser timeout получил502 вместо500, previousTX42/historyerror сохранены, native1/без автоповтора/JS0/320fits. Frontend развёрнут, backend8782054healthy, пять основных экранов/контрольБД passed. Следующий12.5.28 — ROS-3: выбор интерфейса, фактический адрес bandwidth-test и after-ping. Native can not connect/busy/disconnect/abort и полный12.5 открыты.
Актуальное продолжение 2026-10-08: 12.5.28 подтвердил ROS-3 для2→1: native адрес194.226.121.150 без binding, after-ping interfaceether1/0%loss, SQLhistorydone. Три1→2 попытки timeout, этот путь не принят. Локально исправлены CLI where interface и пояснение формы; browser320/typecheck/ESLint passed, ещё не развёрнуты. Runtimebackend8782054/frontendaa7dbdf прежний. Следующий12.5.29 — browserform/deployment UI-подсказок, диагностика forward-сценария остаётся открытой.
Общий план: [UX/UI по этапам и пятичасовым окнам](ux-ui-plan.md). План задаёт объём, этот журнал фиксирует выполненные блоки и ограничения. Записи расположены от новых к старым; подробная история этапа12 также сохранена в [ux-ui-stage-12.md](ux-ui-stage-12.md).
@@ -34,6 +34,20 @@
| 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | Завершён в границах локальной приёмки 2026-10-03; ограничения и evidence в11Б.7 |
| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Локальная приёмка завершена в описанных границах:12.3.83,main1186/1186,context221/221. Этап остаётся в работе: стенд12.5.1–3 развёрнут,bootstrap/smoke проверены;остальные сценарии12.5 не выполнены. |
## 12.5.28 — интерфейс bandwidth-test и after-ping; уточнение формы (2026-10-08)
[Real native/API/SQL evidence](ux-ui/acceptance/speed-interface-2026-10-08.json): backend8782054, выделенная mmapp_acceptance_20261007; реальные inventory и команды, HTTP/RouterOS-моков нет. На обоих CHR активны ether1/lo. НаCHR1 ether1 имеет dynamic194.226.121.150/24; наCHR2 dynamic104.165.244.7/24 иstatic195.195.195.195/32. Существующая конфигурация RouterOS не менялась. API каталога предпочитает static195 при явном выборе ether1 назначения. Это не тот же адрес, что host/API104.
Три попытки1→2 (дважды с выбранным ether1 назначения, один разauto) получили502/transport timeout и historyerror; никакая из них не объявлена успешной. Bandwidth-server enabledtrue/authenticatetrue/maxsessions100 наобоихCHR, Ping1→2 и2→1 поether1 подтвердил2/2/0%loss. Причина timeout1→2/auto не установлена. Нельзя заключать, что её вызвала ошибка приложения или исключительноstaticадрес.
Отдельная принятая команда2→1: srcInterfaceether1, dstInterfaceauto, TCPtransmit3s/HTTP200. Wrapper считал и записывал только несекретные параметры настоящих вызовов: bandwidth address194.226.121.150 без interface-параметра; after-ping addressтотже/count4/interfaceether1/interval1s. API/SQLhistorydone, TX3756.788128/RXnull, Ping53ms/0%loss. srcInterfaceAddress195 — metadata выбранного интерфейса, не доказательство фактического source IP bandwidth packets. Native routing определяет RouterOS; source-interface binding не реализован. В принятом прогоне native1, всего4 команды с учётом трёх непрошедшихforward-прогонов. Это функциональная проверка, не benchmark/multi-WAN proof.
В форме локально добавлено пояснение: интерфейс источника используется для Ping после теста, интерфейс назначения выбираетIP/staticfirst, маршрутbandwidth-test определяетRouterOS. Исправлена CLI-подсказка /ip address print where interface= вместоwhere name=; [синтаксис RouterOS](https://help.mikrotik.com/docs/spaces/ROS/pages/47579229/Scripting). Установленные ReUI/Frame-композиции сохранены, новый компонент не устанавливался.
Проверки локального UI: uptime-speed-interface.spec.ts1/1 сHTTP-фикстурами — открытие формы, приоритет адреса изAPI, корректныйCLI/Ping, пояснение и320px fits; scopedfrontend TypeScript/ESLint passed. Это локальная проверка формы, не realbrowserproof новых текстов. Runtimefrontendaa7dbdf прежний, новыеUIизменения ещё не развёрнуты.
Временные --rm containers закрыты, testprobes0; история тестов только в выделеннойБД, основнаяhistory5/backend8782054healthok сохранены. ROS-3 принят дляобратнойкоманды в перечисленных границах; forward2interface/auto не принят. Следующий12.5.29 — realbrowserform/deploymentподсказок; forward-native диагностика иполный12.5 остаются открытыми. План/паспорт/протокол обновлены, локальный коммит без push.
## 12.5.27 — приёмка и deployment исправленного Next proxy (2026-10-08)
Frontend production-образ sourceaa7dbdf608ca4da4986826fca956543f40922841 собран из чистого предыдущего context8782054 с зафиксированным next.config.ts; git diff подтвердил, что это единственное изменение runtime source frontend. Build/встроенный TypeScript passed; proxyTimeout180000 отражён в build config. Backend image8782054 не менялся.
+15 -1
View File
@@ -1,6 +1,6 @@
# Этап 12: итоговая приёмка UX/UI
Актуальное продолжение 2026-10-08: 12.5.27 завершён — frontendaa7dbdf/proxy180s собран, real browser timeout получил502 вместо500, previousTX42/historyerror сохранены, native1/без автоповтора/JS0/320fits. Frontend развёрнут, backend8782054healthy, пять основных экранов/контрольБД passed. Следующий12.5.28 — ROS-3: выбор интерфейса, фактический адрес bandwidth-test и after-ping. Native can not connect/busy/disconnect/abort и полный12.5 открыты.
Актуальное продолжение 2026-10-08: 12.5.28 подтвердил ROS-3 для2→1: native адрес194.226.121.150 без binding, after-ping interfaceether1/0%loss, SQLhistorydone. Три1→2 попытки timeout, этот путь не принят. Локально исправлены CLI where interface и пояснение формы; browser320/typecheck/ESLint passed, ещё не развёрнуты. Runtimebackend8782054/frontendaa7dbdf прежний. Следующий12.5.29 — browserform/deployment UI-подсказок, диагностика forward-сценария остаётся открытой.
План: [ux-ui-plan.md](ux-ui-plan.md). Фактические результаты: [ux-ui-progress.md](ux-ui-progress.md). Подготовлен после сводных проверок 11Б; завершение каждого блока требует локального коммита без push.
@@ -1238,3 +1238,17 @@ Frontend production-образ sourceaa7dbdf608ca4da4986826fca956543f40922841 с
[Пять основных экранов](ux-ui/acceptance/deploy-browser-aa7dbdf-2026-10-08.json): dashboard/servers/uptime-speed/settings/filters200, ПК/320px fits,0JSerrors/0API>=400, HTTP-моков нет. Temporaryfrontend/backend/network/3018 закрыты, destinationhost восстановлен и проверен, testprobes0; основной стенд/туннель сохранены.
Локальная regression31s/TypeScript/ESLint12.5.26 и real production browser proof подтверждают исправление proxy. ROS-2 transport timeout принят в этих границах; native can not connect/busy/disconnect/abort и Portal/multi-instance остаются открытыми. Следующий12.5.28 — ROS-3: фактический адрес native bandwidth-test и интерфейс after-ping. План/паспорт/протокол обновлены; локальный коммит без push.
## 12.5.28 — интерфейс bandwidth-test и after-ping; уточнение формы (2026-10-08)
[Real native/API/SQL evidence](ux-ui/acceptance/speed-interface-2026-10-08.json): backend8782054, выделенная mmapp_acceptance_20261007; реальные inventory и команды, HTTP/RouterOS-моков нет. На обоих CHR активны ether1/lo. НаCHR1 ether1 имеет dynamic194.226.121.150/24; наCHR2 dynamic104.165.244.7/24 иstatic195.195.195.195/32. Существующая конфигурация RouterOS не менялась. API каталога предпочитает static195 при явном выборе ether1 назначения. Это не тот же адрес, что host/API104.
Три попытки1→2 (дважды с выбранным ether1 назначения, один разauto) получили502/transport timeout и historyerror; никакая из них не объявлена успешной. Bandwidth-server enabledtrue/authenticatetrue/maxsessions100 наобоихCHR, Ping1→2 и2→1 поether1 подтвердил2/2/0%loss. Причина timeout1→2/auto не установлена. Нельзя заключать, что её вызвала ошибка приложения или исключительноstaticадрес.
Отдельная принятая команда2→1: srcInterfaceether1, dstInterfaceauto, TCPtransmit3s/HTTP200. Wrapper считал и записывал только несекретные параметры настоящих вызовов: bandwidth address194.226.121.150 без interface-параметра; after-ping addressтотже/count4/interfaceether1/interval1s. API/SQLhistorydone, TX3756.788128/RXnull, Ping53ms/0%loss. srcInterfaceAddress195 — metadata выбранного интерфейса, не доказательство фактического source IP bandwidth packets. Native routing определяет RouterOS; source-interface binding не реализован. В принятом прогоне native1, всего4 команды с учётом трёх непрошедшихforward-прогонов. Это функциональная проверка, не benchmark/multi-WAN proof.
В форме локально добавлено пояснение: интерфейс источника используется для Ping после теста, интерфейс назначения выбираетIP/staticfirst, маршрутbandwidth-test определяетRouterOS. Исправлена CLI-подсказка /ip address print where interface= вместоwhere name=; [синтаксис RouterOS](https://help.mikrotik.com/docs/spaces/ROS/pages/47579229/Scripting). Установленные ReUI/Frame-композиции сохранены, новый компонент не устанавливался.
Проверки локального UI: uptime-speed-interface.spec.ts1/1 сHTTP-фикстурами — открытие формы, приоритет адреса изAPI, корректныйCLI/Ping, пояснение и320px fits; scopedfrontend TypeScript/ESLint passed. Это локальная проверка формы, не realbrowserproof новых текстов. Runtimefrontendaa7dbdf прежний, новыеUIизменения ещё не развёрнуты.
Временные --rm containers закрыты, testprobes0; история тестов только в выделеннойБД, основнаяhistory5/backend8782054healthok сохранены. ROS-3 принят дляобратнойкоманды в перечисленных границах; forward2interface/auto не принят. Следующий12.5.29 — realbrowserform/deploymentподсказок; forward-native диагностика иполный12.5 остаются открытыми. План/паспорт/протокол обновлены, локальный коммит без push.
+4
View File
@@ -157,3 +157,7 @@ ssh -N -L 3000:127.0.0.1:3000 -L 8000:127.0.0.1:8000 root@161.104.46.222
## Новый frontend proxy timeout — 2026-10-08
12.5.27 [real browser timeout502](ux-ui/acceptance/speed-unreachable-error-2026-10-08.json), [frontend deployment](ux-ui/acceptance/deployed-frontend-aa7dbdf-2026-10-08.json), [пять экранов](ux-ui/acceptance/deploy-browser-aa7dbdf-2026-10-08.json) passed. Frontendaa7dbdf/proxy180s, backend8782054healthy прежний; MMAPP_IMAGE_TAG=ux-aa7dbdf/BACKEND_IMAGE_TAG=ux-8782054. Основной DBcontrol совпал. Isolatedhost/probe восстановлены/удалены, temporarycontainers/network/3018 закрыты. Это transport timeout, не native can not connect; техническая подпись timeout остаётся ограничением UX. Следующий12.5.28 — ROS-3 interface/address/after-ping.
## Интерфейс native test и Ping — 2026-10-08
12.5.28 [real ROS-3](ux-ui/acceptance/speed-interface-2026-10-08.json): reverse2→1 done, bandwidth194.226.121.150/nointerfacebinding, Pingether1/0%loss; metadata source195 не доказываетsourceIPpackets. CHR2 имеет dynamic104/static195, явныйdstinterface предпочитаетstatic. Три1→2 попыткиtimeout, причинаauto-path не установлена; они не приняты. КонфигурацияRouterOS не менялась. Основнойruntimebackend8782054/frontendaa7dbdf/history5 сохранён. UIhint/CLIwhereinterface исправлены локально; browserfixture/typecheck/ESLint passed, не развёрнуты. Следующий12.5.29 — real browserform/deploymentподсказок.
@@ -0,0 +1,138 @@
{
"date": "2026-10-08",
"backendSource": "8782054078304f36cc611876af2d17f87b857f60",
"database": "mmapp_acceptance_20261007",
"httpMocks": false,
"routerOsMocks": false,
"inventory": [
{
"id": 1,
"host": "194.226.121.150",
"interfaces": [
"ether1",
"lo"
],
"addresses": [
{
"interface": "ether1",
"address": "194.226.121.150/24",
"dynamic": "true"
}
]
},
{
"id": 2,
"host": "104.165.244.7",
"interfaces": [
"ether1",
"lo"
],
"addresses": [
{
"interface": "ether1",
"address": "104.165.244.7/24",
"dynamic": "true"
},
{
"interface": "ether1",
"address": "195.195.195.195/32",
"dynamic": "false"
}
]
}
],
"selectedDestination": {
"preferredStaticAddress": "195.195.195.195",
"earlierForwardTests": "timeout"
},
"httpStatus": 200,
"nativeCount": 1,
"bandwidth": {
"address": "194.226.121.150",
"protocol": "tcp",
"direction": "transmit",
"durationSec": 3,
"hasInterfaceParameter": false
},
"pingCalls": [
{
"address": "194.226.121.150",
"count": 4,
"interface": "ether1",
"interval": "1s"
}
],
"result": {
"runId": "acceptance-interface-1791428239785",
"srcInterfaceAddress": "195.195.195.195",
"dstInterfaceAddress": null,
"afterBtPing": {
"rttMs": 53,
"lossPct": 0,
"error": null
}
},
"history": [
{
"id": "acceptance-interface-1791428239785",
"src_interface": "ether1",
"dst_interface": "",
"src_interface_address": "195.195.195.195",
"dst_interface_address": null,
"status": "done",
"tx_avg_mbps": 3756.7881279999997,
"rx_avg_mbps": null,
"ping_rtt_ms": 53,
"ping_loss_pct": 0
}
],
"limits": [
"Bandwidth routing chosen by RouterOS, no source-interface binding",
"One actual interface per CHR; multi-WAN route selection not tested",
"Accepted reverse command1; three earlier forward attempts timed out, forward path remains unaccepted",
"API/SQL/native proof; browser form not tested in this block"
],
"firstInventoryAddresses": [
{
"interface": "ether1",
"address": "194.226.121.150"
},
{
"interface": "ether1",
"address": "104.165.244.7"
}
],
"acceptedContext": {
"srcServerId": 2,
"dstServerId": 1,
"srcInterface": "ether1",
"dstInterface": "auto"
},
"forwardAttempts": [
{
"id": "acceptance-interface-1791427768086",
"srcInterface": "ether1",
"dstInterface": "ether1",
"status": "error"
},
{
"id": "acceptance-selected-destination-1791428012326",
"srcInterface": "ether1",
"dstInterface": "ether1",
"status": "error"
},
{
"id": "acceptance-interface-1791428042466",
"srcInterface": "ether1",
"dstInterface": "auto",
"status": "error"
}
],
"cleanup": {
"testProbesRemaining": 0,
"temporaryContainersRemoved": true,
"mainHistoryCountUnchanged": 5,
"mainHealth": "ok",
"mainBackendVersion": "1.0.0-test.8782054"
}
}
+30
View File
@@ -0,0 +1,30 @@
import { test, expect } from "@playwright/test"
import { server } from "./fixtures/users"
test("Speed: форма использует адрес каталога и разделяет маршрут теста и Ping-интерфейс", async ({ page }) => {
const probe = { id: "iface-probe", srcServerId: "1", dstServerId: "2", srcInterface: "ether1", dstInterface: "ether1", protocol: "tcp", direction: "transmit", durationSec: "3", enabled: true, lastRunAt: null, lastStatus: null, lastError: null, lastTxAvgMbps: null, lastRxAvgMbps: null }
await page.route("**/health", route => route.fulfill({ json: { ok: true } }))
await page.route("**/api/**", route => {
const path = new URL(route.request().url()).pathname
return route.fulfill({ json:
path === "/api/auth/config" ? { required: false } :
path === "/api/servers" ? [server, { ...server, id: 2, name: "Назначение", host: "198.51.100.2" }] :
path === "/api/uptime/overview" ? { probes: [], resources: [] } :
path === "/api/uptime/speed-probes" ? { probes: [probe] } :
path === "/api/uptime/speed-test/runs" ? { runs: [] } :
path.includes("/speed-test/endpoints/") ? { interfaces: [{ name: "ether1", running: true, disabled: false, addresses: path.includes("/2/") ? ["195.195.195.195", "198.51.100.2"] : ["192.0.2.1"] }] } : {},
})
})
await page.goto("/uptime?tab=speed")
await page.getByRole("button", { name: "Редактировать speed-пробу", exact: true }).click()
const dialog = page.getByRole("dialog")
const commands = dialog.locator("pre")
await expect(commands).toContainText('/ip address print where interface="ether1"')
await expect(commands).not.toContainText("where name=")
await expect(commands).toContainText('/ping address=195.195.195.195 count=4 interface="ether1"')
await expect(commands).toContainText("/tool bandwidth-test address=195.195.195.195")
await expect(dialog).toContainText("Интерфейс источника используется для Ping после теста")
await expect(dialog).toContainText("Маршрут bandwidth-test определяет RouterOS")
await page.setViewportSize({ width: 320, height: 900 })
expect(await page.evaluate(() => document.documentElement.scrollWidth <= innerWidth)).toBe(true)
})