Skip to content

test(scripts): покрий разпознаването на липсваща таблица в safeD1 (#277) - #295

Merged
todorkolev merged 1 commit into
mainfrom
test/safed1-stdout-detection
Aug 9, 2026
Merged

test(scripts): покрий разпознаването на липсваща таблица в safeD1 (#277)#295
todorkolev merged 1 commit into
mainfrom
test/safed1-stdout-detection

Conversation

@todorkolev

Copy link
Copy Markdown
Collaborator

Дългът от #277. Там писах, че тест няма как да се направи, понеже import.mjs изпълнява код при внасяне и safeD1 не се тества модулно. Това вече не е вярно: #270 донесе сглобка, която кара истинския скрипт като отделен процес с подставен wrangler най-отпред в PATH.

Какво пази

safeD1 трябва да различи „тази таблица още я няма" (поправимо - latestLoadedDate пада към data_freshness) от всеки друг провал (трябва да се вдигне нагоре). Сгрешено, това чупи import --catchup --plan-only в нормалното му състояние: drop-transient-staging маха raw_contracts в finally, а --plan-only излиза преди основният поток да я пресъздаде.

Три теста: падането към data_freshness работи; заявката към data_freshness наистина се пуска (иначе първият тест би минал по случайност); и грешка, която не е липсваща таблица, продължава да се вдига.

Подставката е сверена срещу истинския инструмент

Това е същината на теста, тъй че моделиране по памет не би доказало нищо. Наблюдавано от wrangler d1 execute sigma --local --json --command "SELECT 1 FROM no_such_table_xyz":

exit code : 1
stdout    : {"error":{"text":"no such table: no_such_table_xyz: SQLITE_ERROR"}}
stderr    : ▲ [WARNING] Processing wrangler.jsonc configuration: ...
err.message : "Command failed: wrangler d1 execute ..."

Тоест грешката от SQLite е на stdout, известията на stderr, а съобщението на изключението не носи нито едното. Това разминаване е точно каквото старата проверка само върху err.message изпускаше:

old guard (message only)      matches? false
new guard (msg+stdout+stderr) matches? true

Наблюдаваният изход е записан в теста, редом с подставката.

Уточнение, понеже двете лесно се бъркат: това не противоречи на #293. Там ставаше дума за известието ▲ [WARNING], което е на stderr; тук за грешката от SQLite, която е на stdout. Различни потоци, различни твърдения - и двете вече проверени.

Мутации

мутация резултат
проверката пак само върху err.message 2 падат
safeD1 става общ капан за всяка грешка 1 пада

Само тест; поведението не се променя. scripts/: 89 теста минават.

Заслугата за самата поправка е на @StanislavBG - вж. коментара по #277.

Поправката от #277 нямаше нищо, което да я пази: `import.mjs` изпълнява код
при внасяне, тъй че `safeD1` не се тества модулно. Сглобката от #270 обаче
кара истинския скрипт като отделен процес с подставен `wrangler`, и това е
достатъчно.

Подставката е сверена срещу истинския двоичен файл, а не измислена - при
`d1 execute --json` върху липсваща таблица грешката от SQLite излиза на
stdout, известията на stderr, а съобщението на изключението е само
„Command failed". Точно това разминаване изпускаше старата проверка. Наблюдаваният
изход е записан в теста.

Мутациите: връщането на проверката само върху `err.message` вали два теста,
а превръщането на safeD1 в общ капан вали третия.
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown

Test coverage

Workspace Lines Δ Branches Δ Functions Statements
apps/etl 75.43% +1.43pp 63.52% +5.32pp 70.00% 74.11%
apps/web 91.02% +1.32pp 82.50% +0.70pp 91.19% 89.73%
packages/config 92.85% +0.05pp 72.22% +0.02pp 92.85% 89.18%
packages/db 94.54% +0.34pp 79.38% +0.38pp 87.19% 91.55%
packages/ingest 88.17% +2.37pp 82.30% +2.30pp 80.17% 86.36%
packages/shared 95.50% +0.10pp 80.83% +0.83pp 92.30% 89.56%
Total (informational) 91.23% 80.72% 86.95% 89.08%

✅ No workspace dropped below its baseline (tolerance 0.5pp).

📈 Coverage rose by more than 1pp — run node scripts/check-coverage.mjs --update locally and commit coverage-baseline.json to ratchet the threshold up.

@todorkolev
todorkolev merged commit 4f4ff60 into main Aug 9, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants