{ "numTotalTestSuites": 10, "numPassedTestSuites": 2, "numFailedTestSuites": 8, "numPendingTestSuites": 0, "numTotalTests": 47, "numPassedTests": 9, "numFailedTests": 38, "numPendingTests": 0, "numTodoTests": 0, "snapshot": { "added": 0, "failure": false, "filesAdded": 0, "filesRemoved": 0, "filesRemovedList": [], "filesUnmatched": 0, "filesUpdated": 0, "matched": 0, "total": 0, "unchecked": 0, "uncheckedKeysByFile": [], "unmatched": 0, "updated": 0, "didUpdate": false }, "startTime": 1790408012144, "success": false, "testResults": [ { "assertionResults": [ { "ancestorTitles": ["HARNESS: реальный сервер + PostgreSQL 17"], "fullName": "HARNESS: реальный сервер + PostgreSQL 17 [HARNESS] сервер отвечает live/ready (ready проверяет БД)", "status": "passed", "title": "[HARNESS] сервер отвечает live/ready (ready проверяет БД)", "duration": 32.192098, "failureMessages": [], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["HARNESS: реальный сервер + PostgreSQL 17"], "fullName": "HARNESS: реальный сервер + PostgreSQL 17 [HARNESS] БД: PostgreSQL 17, приложение под ролью без SUPERUSER/BYPASSRLS, мигратор без SUPERUSER", "status": "passed", "title": "[HARNESS] БД: PostgreSQL 17, приложение под ролью без SUPERUSER/BYPASSRLS, мигратор без SUPERUSER", "duration": 14.342552000000012, "failureMessages": [], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["HARNESS: реальный сервер + PostgreSQL 17"], "fullName": "HARNESS: реальный сервер + PostgreSQL 17 [HARNESS] миграции применены мигратором, app-роль не видит schema_migrations", "status": "passed", "title": "[HARNESS] миграции применены мигратором, app-роль не видит schema_migrations", "duration": 14.26604900000001, "failureMessages": [], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["HARNESS: реальный сервер + PostgreSQL 17"], "fullName": "HARNESS: реальный сервер + PostgreSQL 17 [HARNESS] токены: без токена 401, случайный токен 401, manager-токен 200", "status": "passed", "title": "[HARNESS] токены: без токена 401, случайный токен 401, manager-токен 200", "duration": 13.863121000000007, "failureMessages": [], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["HARNESS: реальный сервер + PostgreSQL 17"], "fullName": "HARNESS: реальный сервер + PostgreSQL 17 [HARNESS] терминал: отметка сотрудника из импорта принимается (201)", "status": "passed", "title": "[HARNESS] терминал: отметка сотрудника из импорта принимается (201)", "duration": 24.62379200000001, "failureMessages": [], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["HARNESS: реальный сервер + PostgreSQL 17"], "fullName": "HARNESS: реальный сервер + PostgreSQL 17 [CTRL] RBAC: терминал не видит портал и не создаёт сотрудников; сотрудник видит только себя", "status": "passed", "title": "[CTRL] RBAC: терминал не видит портал и не создаёт сотрудников; сотрудник видит только себя", "duration": 23.691180000000003, "failureMessages": [], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["HARNESS: реальный сервер + PostgreSQL 17"], "fullName": "HARNESS: реальный сервер + PostgreSQL 17 [CTRL] уволенный сотрудник теряет доступ (401)", "status": "passed", "title": "[CTRL] уволенный сотрудник теряет доступ (401)", "duration": 23.254977999999994, "failureMessages": [], "meta": {}, "tags": [], "benchmarks": [] } ], "startTime": 1790408019083, "endTime": 1790408019229.255, "status": "passed", "message": "", "name": "/workspace/krona-staff/tests/e2e/00-harness.e2e.ts" }, { "assertionResults": [ { "ancestorTitles": ["Основной API на реальной PostgreSQL"], "fullName": "Основной API на реальной PostgreSQL [N1] менеджер создаёт сотрудника через POST /employees → 201", "status": "failed", "title": "[N1] менеджер создаёт сотрудника через POST /employees → 201", "duration": 38.316193, "failureMessages": [ "AssertionError: HTTP 500 {\"statusCode\":500,\"code\":\"42P08\",\"error\":\"Internal Server Error\",\"message\":\"inconsistent types deduced for parameter $2\"}: expected 500 to be 201 // Object.is equality\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:55:57\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Основной API на реальной PostgreSQL"], "fullName": "Основной API на реальной PostgreSQL [N2] подтверждение смены, расчёт и утверждение зарплаты проходят (200) и начисляют 8 ч × ставка", "status": "failed", "title": "[N2] подтверждение смены, расчёт и утверждение зарплаты проходят (200) и начисляют 8 ч × ставка", "duration": 110.697531, "failureMessages": [ "AssertionError: подтверждение смены: HTTP 500 {\"statusCode\":500,\"code\":\"23502\",\"error\":\"Internal Server Error\",\"message\":\"null value in column \\\"occurred_at\\\" of relation \\\"staff_outbox\\\" violates not-null constraint\"}: expected 500 to be 200 // Object.is equality\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:73:81\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Основной API на реальной PostgreSQL"], "fullName": "Основной API на реальной PostgreSQL [N4] пересекающиеся расчёты не начисляют одну смену дважды", "status": "failed", "title": "[N4] пересекающиеся расчёты не начисляют одну смену дважды", "duration": 66.33918700000004, "failureMessages": [ "AssertionError: подтверждение смены (предусловие, см. N2): HTTP 500 {\"statusCode\":500,\"code\":\"23502\",\"error\":\"Internal Server Error\",\"message\":\"null value in column \\\"occurred_at\\\" of relation \\\"staff_outbox\\\" violates not-null constraint\"}: expected 500 to be 200 // Object.is equality\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:104:7\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Основной API на реальной PostgreSQL"], "fullName": "Основной API на реальной PostgreSQL [N3] push-подписка на внутренний адрес отклоняется, сервер не подключается к 127.0.0.1", "status": "failed", "title": "[N3] push-подписка на внутренний адрес отклоняется, сервер не подключается к 127.0.0.1", "duration": 2544.330582, "failureMessages": [ "AssertionError: подписка: HTTP 201 {\"id\":\"01M3EA4FH3FG4Q3YEKXYQ8Y4Q5\",\"endpoint\":\"https://127.0.0.1:36027/e2e-internal-admin\"}: expected { status: 201, connections: 1 } to deeply equal { status: toSatisfy{…}, …(1) }\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:161:9\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Основной API на реальной PostgreSQL"], "fullName": "Основной API на реальной PostgreSQL [N9] чужой push-endpoint нельзя перепривязать к другому сотруднику", "status": "failed", "title": "[N9] чужой push-endpoint нельзя перепривязать к другому сотруднику", "duration": 44.48753099999976, "failureMessages": [ "AssertionError: HTTP 201 {\"id\":\"01M3EA4J0JSPFRDF22J6E2CEY1\",\"endpoint\":\"https://fcm.googleapis.com/fcm/send/e2e-d464594734e6ddf8569ec571f5832dbf\"}: expected { status: 201, …(1) } to deeply equal { status: toSatisfy{…}, …(1) }\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:191:7\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Основной API на реальной PostgreSQL"], "fullName": "Основной API на реальной PostgreSQL [N12] PUT pay-assignment отвергает лишние поля и нереальные суммы (400)", "status": "failed", "title": "[N12] PUT pay-assignment отвергает лишние поля и нереальные суммы (400)", "duration": 31.35817700000007, "failureMessages": [ "AssertionError: HTTP 200 {\"id\":\"01M3EA4J1PHXWHFMAMYYVRMK3E\",\"employee_id\":\"01M3EA4J151B1H9D5AKAR29AN9\",\"org_unit_id\":null,\"pay_rule_id\":\"01M3EA4FCDRQSS6V8H5Q6XS615\",\"pay_rule_code\":\"hourly\",\"pay_rule_name\":\"Почасовая (стажёр, дополнительный сотрудник)\",\"rate_minor\":12345,\"percent_bp\":0,\"guarantee_minor\":0,\"pool_weight_bp\":0… | HTTP 200 {\"id\":\"01M3EA4J1PHXWHFMAMYYVRMK3E\",\"employee_id\":\"01M3EA4J151B1H9D5AKAR29AN9\",\"org_unit_id\":null,\"pay_rule_id\":\"01M3EA4FCDRQSS6V8H5Q6XS615\",\"pay_rule_code\":\"hourly\",\"pay_rule_name\":\"Почасовая (стажёр, дополнительный сотрудник)\",\"rate_minor\":9007199254740991,\"percent_bp\":0,\"guarantee_minor\":900719925…: expected { extra: 200, huge: 200 } to deeply equal { extra: 400, huge: 400 }\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:215:7\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Основной API на реальной PostgreSQL"], "fullName": "Основной API на реальной PostgreSQL [N10] терминальный токен не читает справочники профессий и точек (403)", "status": "failed", "title": "[N10] терминальный токен не читает справочники профессий и точек (403)", "duration": 4.364047000000028, "failureMessages": [ "AssertionError: expected { professions: 200, units: 200 } to deeply equal { professions: 403, units: 403 }\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:224:70\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Основной API на реальной PostgreSQL"], "fullName": "Основной API на реальной PostgreSQL [F2] standalone без токенов не выдаёт права менеджера анонимному запросу (401)", "status": "failed", "title": "[F2] standalone без токенов не выдаёт права менеджера анонимному запросу (401)", "duration": 19.630533999999898, "failureMessages": [ "AssertionError: expected { portal: 200, payroll: 200, …(1) } to deeply equal { portal: 401, payroll: 401, …(1) }\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:237:85\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Основной API на реальной PostgreSQL"], "fullName": "Основной API на реальной PostgreSQL [F3] cookie сессии не содержит сырой токен и отзывается при выходе", "status": "failed", "title": "[F3] cookie сессии не содержит сырой токен и отзывается при выходе", "duration": 8.088321000000178, "failureMessages": [ "AssertionError: expected { rawTokenInCookie: true, …(1) } to deeply equal { rawTokenInCookie: false, …(1) }\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:255:91\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Основной API на реальной PostgreSQL"], "fullName": "Основной API на реальной PostgreSQL [F10] мутация по cookie без Origin отклоняется (CSRF, 403)", "status": "failed", "title": "[F10] мутация по cookie без Origin отклоняется (CSRF, 403)", "duration": 5.457843000000139, "failureMessages": [ "AssertionError: HTTP 201 {\"id\":\"01M3EA4J31CEM99Y9708PNVE90\",\"code\":\"profession-01m3ea4j31cem99y9708pnve90\",\"name\":\"E2E-CSRF-профессия-c30803\",\"status\":\"active\"}: expected 201 to be 403 // Object.is equality\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:269:57\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Основной API на реальной PostgreSQL"], "fullName": "Основной API на реальной PostgreSQL [F7] повтор Idempotency-Key с другим телом не создаёт второе событие", "status": "failed", "title": "[F7] повтор Idempotency-Key с другим телом не создаёт второе событие", "duration": 31.478251999999884, "failureMessages": [ "AssertionError: expected { first: 201, secondCreated: true } to deeply equal { first: 201, secondCreated: false }\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:288:75\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Основной API на реальной PostgreSQL"], "fullName": "Основной API на реальной PostgreSQL [N11] импорт с неверным kind начисления → 400, а не 500", "status": "failed", "title": "[N11] импорт с неверным kind начисления → 400, а не 500", "duration": 24.907294000000093, "failureMessages": [ "AssertionError: HTTP 500 {\"statusCode\":500,\"code\":\"23514\",\"error\":\"Internal Server Error\",\"message\":\"new row for relation \\\"staff_payroll_ledger\\\" violates check constraint \\\"staff_payroll_ledger_kind_check\\\"\"}: expected 500 to be 400 // Object.is equality\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:311:57\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Основной API на реальной PostgreSQL"], "fullName": "Основной API на реальной PostgreSQL [F4] перебор ключей входа ограничивается (429 не позже 30 неверных попыток)", "status": "failed", "title": "[F4] перебор ключей входа ограничивается (429 не позже 30 неверных попыток)", "duration": 75.38818200000014, "failureMessages": [ "AssertionError: статусы: 401: expected false to be true // Object.is equality\n at /workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts:324:84\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] } ], "startTime": 1790408015147, "endTime": 1790408018151.3882, "status": "failed", "message": "", "name": "/workspace/krona-staff/tests/e2e/10-core-defects.e2e.ts" }, { "assertionResults": [ { "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-A] устройство не может само подтвердить смену (status=confirmed отклоняется)", "status": "failed", "title": "[SYNC-A] устройство не может само подтвердить смену (status=confirmed отклоняется)", "duration": 86.95440500000001, "failureMessages": [ "AssertionError: HTTP 200 {\"results\":[{\"idempotency_key\":\"e2e-01M3EA4JPXC3E39GZMHFH33H92\",\"command_type\":\"upsert_work_session\",\"status\":\"applied\",\"result\":{\"id\":\"01M3EA4JPXQPVQDPGEA3YVFPXV\",\"revision\":1,\"status\":\"applied\"}}]}: expected { http: 200, result: 'applied', …(1) } to deeply equal { http: 200, result: 'rejected', …(1) }\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:86:7\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-B] устройство не может утвердить табель (status=approved отклоняется)", "status": "failed", "title": "[SYNC-B] устройство не может утвердить табель (status=approved отклоняется)", "duration": 32.361658000000006, "failureMessages": [ "AssertionError: HTTP 200 {\"results\":[{\"idempotency_key\":\"e2e-01M3EA4JR4CST4PE643FC043K9\",\"command_type\":\"upsert_timesheet_entry\",\"status\":\"applied\",\"result\":{\"id\":\"01M3EA4JR43V65BMVJVX5DHSV0\",\"revision\":1,\"status\":\"applied\"}}]}: expected { result: 'applied', …(1) } to deeply equal { result: 'rejected', stored: null }\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:109:7\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-C0] начальная загрузка (pull без курсора) работает на реальной БД (200)", "status": "failed", "title": "[SYNC-C0] начальная загрузка (pull без курсора) работает на реальной БД (200)", "duration": 39.13565999999997, "failureMessages": [ "AssertionError: HTTP 500 {\"statusCode\":500,\"code\":\"42703\",\"error\":\"Internal Server Error\",\"message\":\"column \\\"status\\\" does not exist\"}: expected 500 to be 200 // Object.is equality\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:120:57\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-C] начальная загрузка >100 сущностей отдаёт все сущности постранично", "status": "failed", "title": "[SYNC-C] начальная загрузка >100 сущностей отдаёт все сущности постранично", "duration": 54.852048000000025, "failureMessages": [ "AssertionError: HTTP 500 {\"statusCode\":500,\"code\":\"42703\",\"error\":\"Internal Server Error\",\"message\":\"column \\\"status\\\" does not exist\"}: expected 500 to be 200 // Object.is equality\n at pullAll (/workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:51:57)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:130:25\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-D] изменения, сделанные через портал, попадают в инкрементальный pull", "status": "failed", "title": "[SYNC-D] изменения, сделанные через портал, попадают в инкрементальный pull", "duration": 40.97763200000003, "failureMessages": [ "AssertionError: expected false to be true // Object.is equality\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:151:95\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-E] отметка уволенного сотрудника через sync отклоняется", "status": "failed", "title": "[SYNC-E] отметка уволенного сотрудника через sync отклоняется", "duration": 23.937388999999996, "failureMessages": [ "AssertionError: HTTP 200 {\"results\":[{\"idempotency_key\":\"e2e-01M3EA4JXB10Y1W7WAT3QXPJXR\",\"command_type\":\"attendance_event\",\"status\":\"applied\",\"result\":{\"event_id\":\"01M3EA4JXD7TMSBAMMAK6HMXK2\",\"status\":\"accepted\"}}]}: expected 'applied' to be 'rejected' // Object.is equality\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:171:77\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-F] отметка через sync сохраняет точку устройства; чужая точка в payload отклоняется", "status": "failed", "title": "[SYNC-F] отметка через sync сохраняет точку устройства; чужая точка в payload отклоняется", "duration": 42.41749800000002, "failureMessages": [ "AssertionError: HTTP 200 {\"results\":[{\"idempotency_key\":\"e2e-01M3EA4JYFDZ0AAZYVEF6G72T2\",\"command_type\":\"attendance_event\",\"status\":\"applied\",\"result\":{\"event_id\":\"01M3EA4JYH12S10KQ4NWN232FM\",\"status\":\"accepted\"}},{\"idempotency_key\":\"e2e-01M3EA4JYFDXJXPH923SG1E832\",\"command_type\":\"attendance_event\",\"status\":\"applied\",\"resul…: expected { Object (ownOrgUnit, foreign) } to deeply equal { …(2) }\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:202:7\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-G] битая команда в пакете отклоняется по отдельности, остальные применяются (не 500)", "status": "failed", "title": "[SYNC-G] битая команда в пакете отклоняется по отдельности, остальные применяются (не 500)", "duration": 20.59652299999999, "failureMessages": [ "AssertionError: HTTP 500 {\"statusCode\":500,\"code\":\"22007\",\"error\":\"Internal Server Error\",\"message\":\"invalid input syntax for type timestamp with time zone: \\\"e2e-not-a-timestamp\\\"\"}: expected { http: 500, statuses: [] } to deeply equal { http: 200, statuses: [ …(2) ] }\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:225:7\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-H] регистрация устройства по cookie с чужим Origin отклоняется (CSRF, 403)", "status": "failed", "title": "[SYNC-H] регистрация устройства по cookie с чужим Origin отклоняется (CSRF, 403)", "duration": 9.081312000000025, "failureMessages": [ "AssertionError: HTTP 201 {\"device\":{\"id\":\"01M3EA4JZKVD04KCMNCGGW1EAH\",\"tenant_id\":\"01M3EA4DJNEY3HRCYSBSX43XW0\",\"device_code\":\"E2E-5J7EDPFQV6\",\"name\":\"E2E-CSRF-терминал-34e01a\",\"token_hint\":\"kstaff_dev_01M3E\",\"status\":\"active\",\"allowed_scopes\":[\"attendance:sync\"],\"registered_at\":\"2026-09-26T07:33:38.935Z\",\"created_by\":\"01M3E…: expected 201 to be 403 // Object.is equality\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:236:57\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-I] без настроенных токенов анонимный запрос не регистрирует устройство (401)", "status": "failed", "title": "[SYNC-I] без настроенных токенов анонимный запрос не регистрирует устройство (401)", "duration": 6.548922000000005, "failureMessages": [ "AssertionError: HTTP 201 {\"device\":{\"id\":\"01M3EA4JZWQF4S3SXWCX77J9ST\",\"tenant_id\":\"01M3EA4DJNEY3HRCYSBSX43XW0\",\"device_code\":\"E2E-KS5GF18F83\",\"name\":\"E2E-Анонимный терминал-75d36d\",\"token_hint\":\"kstaff_dev_01M3E\",\"status\":\"active\",\"allowed_scopes\":[\"attendance:sync\"],\"registered_at\":\"2026-09-26T07:33:38.940Z\",\"created_by\":\"…: expected 201 to be 401 // Object.is equality\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:247:57\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-J] отметка через sync вне окна времени (2001 год) отклоняется, как в POST /attendance/events", "status": "failed", "title": "[SYNC-J] отметка через sync вне окна времени (2001 год) отклоняется, как в POST /attendance/events", "duration": 23.565251999999987, "failureMessages": [ "AssertionError: HTTP 200 {\"results\":[{\"idempotency_key\":\"e2e-01M3EA4K0JQNMDJTDAM1PZ1J8K\",\"command_type\":\"attendance_event\",\"status\":\"applied\",\"result\":{\"event_id\":\"01M3EA4K0NB5RS8GACHWC7N2C2\",\"status\":\"accepted\"}}]}: expected 'applied' to be 'rejected' // Object.is equality\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:260:77\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-K] ack курсора из будущего (больше выданного сервером) отклоняется (400)", "status": "failed", "title": "[SYNC-K] ack курсора из будущего (больше выданного сервером) отклоняется (400)", "duration": 6.953785000000039, "failureMessages": [ "AssertionError: HTTP 200 {\"acknowledged\":true,\"cursor\":\"cur_999999999_fd163ccb01a6\",\"acknowledged_at\":\"2026-09-26T07:33:38.972Z\"}: expected 200 to be 400 // Object.is equality\n at /workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts:275:57\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Офлайн-синхронизация на реальной PostgreSQL"], "fullName": "Офлайн-синхронизация на реальной PostgreSQL [SYNC-L] отозванное устройство не может синхронизироваться (403) — позитивный контроль", "status": "passed", "title": "[SYNC-L] отозванное устройство не может синхронизироваться (403) — позитивный контроль", "duration": 8.451247999999964, "failureMessages": [], "meta": {}, "tags": [], "benchmarks": [] } ], "startTime": 1790408018587, "endTime": 1790408018982.4512, "status": "failed", "message": "", "name": "/workspace/krona-staff/tests/e2e/20-sync-defects.e2e.ts" }, { "assertionResults": [ { "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-01] менеджер точки A запускает расчёт для точки B → 403", "status": "failed", "title": "[OWN-01] менеджер точки A запускает расчёт для точки B → 403", "duration": 109.84663699999999, "failureMessages": [ "AssertionError: C1 POST /access-grants (point_manager): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:94:22\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-02] менеджер точки отправляет пакет на согласование → 403", "status": "failed", "title": "[OWN-02] менеджер точки отправляет пакет на согласование → 403", "duration": 64.021771, "failureMessages": [ "AssertionError: C1 POST /access-grants (point_manager): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:105:22\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-03] бухгалтер отправляет пакет → успех, каждый директор получает ровно одно уведомление", "status": "failed", "title": "[OWN-03] бухгалтер отправляет пакет → успех, каждый директор получает ровно одно уведомление", "duration": 1.5183850000000234, "failureMessages": [ "AssertionError: C1 POST /access-grants (accountant): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:118:24\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-04] бухгалтер пытается подписать пакет → 403", "status": "failed", "title": "[OWN-04] бухгалтер пытается подписать пакет → 403", "duration": 1.8508840000000077, "failureMessages": [ "AssertionError: C1 POST /access-grants (accountant): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:133:24\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-05] до подписи директора в ledger нет начислений и выплат", "status": "failed", "title": "[OWN-05] до подписи директора в ledger нет начислений и выплат", "duration": 1.9114280000000008, "failureMessages": [ "AssertionError: C1 POST /access-grants (accountant): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:141:24\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-06] подпись директора → начисления и выплаты в ledger, пакет и смены неизменяемы", "status": "failed", "title": "[OWN-06] подпись директора → начисления и выплаты в ledger, пакет и смены неизменяемы", "duration": 1.5373430000000212, "failureMessages": [ "AssertionError: C1 POST /access-grants (accountant): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:148:24\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-07] смена изменена после отправки → подписать нельзя (409), пакет возвращён бухгалтеру", "status": "failed", "title": "[OWN-07] смена изменена после отправки → подписать нельзя (409), пакет возвращён бухгалтеру", "duration": 1.4993349999999737, "failureMessages": [ "AssertionError: C1 POST /access-grants (accountant): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:173:24\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-08] возврат с комментарием → пакет у бухгалтера, комментарий сохранён", "status": "failed", "title": "[OWN-08] возврат с комментарием → пакет у бухгалтера, комментарий сохранён", "duration": 2.188139000000035, "failureMessages": [ "AssertionError: C1 POST /access-grants (accountant): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:195:24\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-09] сотрудник точки A отработал смену в точке B → смена попадает в зарплату точки B", "status": "failed", "title": "[OWN-09] сотрудник точки A отработал смену в точке B → смена попадает в зарплату точки B", "duration": 2.2691649999999868, "failureMessages": [ "AssertionError: C1 POST /access-grants (accountant): HTTP 404 {\"message\":\"Route POST:/api/v1/staff/access-grants not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 201 // Object.is equality\n at grant (/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:28:94)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:213:24\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-10] сотрудник без согласия на биометрию → сервер сообщает терминалу «регистрация запрещена»", "status": "failed", "title": "[OWN-10] сотрудник без согласия на биометрию → сервер сообщает терминалу «регистрация запрещена»", "duration": 15.068132999999989, "failureMessages": [ "AssertionError: C3: HTTP 404 {\"message\":\"Route GET:/api/v1/staff/terminal/employees/01M3EA4JGPPB7M0G78QQBQBJ1M/enrollment not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 200 // Object.is equality\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:241:66\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["Решения владельца: роли, пакеты зарплаты, согласие на биометрию"], "fullName": "Решения владельца: роли, пакеты зарплаты, согласие на биометрию [OWN-11] согласие отозвано → статус для терминала меняется", "status": "failed", "title": "[OWN-11] согласие отозвано → статус для терминала меняется", "duration": 14.774637000000041, "failureMessages": [ "AssertionError: C3 PUT biometric-consent: HTTP 404 {\"message\":\"Route PUT:/api/v1/staff/employees/01M3EA4JH57XZ361XBC2Z7SA6J/biometric-consent not found\",\"error\":\"Not Found\",\"statusCode\":404}: expected 404 to be 200 // Object.is equality\n at /workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts:255:86\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:20" ], "meta": {}, "tags": [], "benchmarks": [] } ], "startTime": 1790408018262, "endTime": 1790408018478.7747, "status": "failed", "message": "", "name": "/workspace/krona-staff/tests/e2e/30-owner-decisions.e2e.ts" }, { "assertionResults": [ { "ancestorTitles": ["deploy/pilot/compose.yaml"], "fullName": "deploy/pilot/compose.yaml [PILOT-1] все подставляемые переменные обязательны: ${VAR:?сообщение}", "status": "failed", "title": "[PILOT-1] все подставляемые переменные обязательны: ${VAR:?сообщение}", "duration": 5.8893739999999895, "failureMessages": [ "AssertionError: переменные без :? — пустое значение молча попадёт в контейнер: expected [ 'STANDALONE_MANAGER_TOKEN', …(13) ] to deeply equal []\n at /workspace/krona-staff/tests/e2e/40-compose-pilot.e2e.ts:34:87\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:1628:35\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:26\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3319:20\n at new Promise ()\n at runWithCancel (file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3314:10)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3299:20\n at new Promise ()\n at runWithTimeout (file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3257:10)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3876:64" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["deploy/pilot/compose.yaml"], "fullName": "deploy/pilot/compose.yaml [PILOT-2] ни один сервис не запускается с NODE_ENV=development", "status": "failed", "title": "[PILOT-2] ни один сервис не запускается с NODE_ENV=development", "duration": 1.0336859999999888, "failureMessages": [ "AssertionError: expected [ 'app' ] to deeply equal []\n at /workspace/krona-staff/tests/e2e/40-compose-pilot.e2e.ts:41:23\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:1628:35\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:2783:26\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3319:20\n at new Promise ()\n at runWithCancel (file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3314:10)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3299:20\n at new Promise ()\n at runWithTimeout (file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3257:10)\n at file:///workspace/krona-staff/node_modules/vitest/dist/chunks/run.C5UmxDPh.js:3876:64" ], "meta": {}, "tags": [], "benchmarks": [] }, { "ancestorTitles": ["deploy/pilot/compose.yaml"], "fullName": "deploy/pilot/compose.yaml [PILOT-3] у сервиса app нет учётных данных мигратора", "status": "passed", "title": "[PILOT-3] у сервиса app нет учётных данных мигратора", "duration": 0.5442440000000062, "failureMessages": [], "meta": {}, "tags": [], "benchmarks": [] } ], "startTime": 1790408019346, "endTime": 1790408019353.5442, "status": "failed", "message": "", "name": "/workspace/krona-staff/tests/e2e/40-compose-pilot.e2e.ts" } ] }