<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="3" skipped="28" tests="180" time="42.218" timestamp="2026-05-26T07:15:42.961588+00:00" hostname="agent-env-07c95d3f-5a6a-49ec-9dd7-5643f5c9eede"><testcase classname="backend.tests.test_admin_panel.TestDashboard" name="test_dashboard_shape" time="0.471" /><testcase classname="backend.tests.test_admin_panel.TestDashboard" name="test_dashboard_admin_only" time="0.666" /><testcase classname="backend.tests.test_admin_panel.TestTwoFA" name="test_full_2fa_lifecycle_and_challenge_flow" time="5.464" /><testcase classname="backend.tests.test_admin_panel.TestUserControl" name="test_reset_password" time="0.718" /><testcase classname="backend.tests.test_admin_panel.TestUserControl" name="test_temp_password" time="0.883" /><testcase classname="backend.tests.test_admin_panel.TestUserControl" name="test_toggle_active_twice" time="0.455" /><testcase classname="backend.tests.test_admin_panel.TestUserControl" name="test_toggle_active_self_409" time="0.047" /><testcase classname="backend.tests.test_admin_panel.TestUserControl" name="test_revoke_sessions_kills_old_token" time="2.471" /><testcase classname="backend.tests.test_admin_panel.TestUserControl" name="test_force_change" time="0.102" /><testcase classname="backend.tests.test_admin_panel.TestUserControl" name="test_user_activity_returns_audit_rows" time="0.050" /><testcase classname="backend.tests.test_admin_panel.TestFeatures" name="test_list_features" time="0.062" /><testcase classname="backend.tests.test_admin_panel.TestFeatures" name="test_toggle_feature" time="0.147" /><testcase classname="backend.tests.test_admin_panel.TestFeatures" name="test_unknown_feature_404" time="0.047" /><testcase classname="backend.tests.test_admin_panel.TestMaintenance" name="test_maintenance_lifecycle" time="0.290" /><testcase classname="backend.tests.test_admin_panel.TestAnnouncements" name="test_announcement_crud_and_active" time="0.197" /><testcase classname="backend.tests.test_admin_panel.TestAudit" name="test_failed_login_writes_audit" time="0.420" /><testcase classname="backend.tests.test_admin_panel.TestAudit" name="test_successful_login_writes_audit" time="0.373" /><testcase classname="backend.tests.test_admin_panel.TestAudit" name="test_audit_filter_by_email" time="0.050" /><testcase classname="backend.tests.test_admin_panel.TestSettings" name="test_read_settings" time="0.049" /><testcase classname="backend.tests.test_admin_panel.TestSettings" name="test_update_settings_clamps" time="0.293" /><testcase classname="backend.tests.test_backend.TestAuth" name="test_health" time="0.099" /><testcase classname="backend.tests.test_backend.TestAuth" name="test_admin_login_success_sets_cookies" time="0.321" /><testcase classname="backend.tests.test_backend.TestAuth" name="test_me_returns_admin" time="0.376" /><testcase classname="backend.tests.test_backend.TestAuth" name="test_login_wrong_password_returns_401" time="0.331" /><testcase classname="backend.tests.test_backend.TestAuth" name="test_staff_login" time="0.099"><failure message="AssertionError: {&quot;detail&quot;:&quot;Invalid email or password&quot;}&#10;assert 401 == 200&#10; +  where 401 = &lt;Response [401]&gt;.status_code">E   AssertionError: {"detail":"Invalid email or password"}
    assert 401 == 200
     +  where 401 = &lt;Response [401]&gt;.status_code</failure></testcase><testcase classname="backend.tests.test_backend.TestAuth" name="test_me_unauthenticated_returns_401" time="0.114" /><testcase classname="backend.tests.test_backend.TestCompanies" name="test_list_companies_default_seeded" time="0.048"><failure message="assert False&#10; +  where False = any(&lt;generator object TestCompanies.test_list_companies_default_seeded.&lt;locals&gt;.&lt;genexpr&gt; at 0xfb12fc865990&gt;)">E   assert False
     +  where False = any(&lt;generator object TestCompanies.test_list_companies_default_seeded.&lt;locals&gt;.&lt;genexpr&gt; at 0xfb12fc865990&gt;)</failure></testcase><testcase classname="backend.tests.test_backend.TestCompanies" name="test_create_update_delete_company_admin" time="0.200" /><testcase classname="backend.tests.test_backend.TestCompanies" name="test_create_company_staff_forbidden" time="0.104"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_backend.py:88: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_backend.TestParties" name="test_create_and_list_party" time="0.148" /><testcase classname="backend.tests.test_backend.TestParties" name="test_create_party_staff_forbidden" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_backend.py:111: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_backend.TestItems" name="test_create_and_list_item" time="0.591" /><testcase classname="backend.tests.test_backend.TestItems" name="test_create_item_staff_forbidden" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_backend.py:137: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_backend.TestInvoices" name="test_create_sale_invoice_calc_and_stock" time="0.606" /><testcase classname="backend.tests.test_backend.TestInvoices" name="test_create_purchase_increments_stock" time="1.007" /><testcase classname="backend.tests.test_backend.TestInvoices" name="test_list_sale_invoices" time="0.049" /><testcase classname="backend.tests.test_backend.TestInvoices" name="test_list_purchase_invoices" time="0.049" /><testcase classname="backend.tests.test_backend.TestInvoices" name="test_get_invoice_by_id_has_lines" time="0.049" /><testcase classname="backend.tests.test_backend.TestInvoices" name="test_soft_delete_and_restore" time="0.264" /><testcase classname="backend.tests.test_backend.TestInvoices" name="test_staff_cannot_delete_invoice" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_backend.py:272: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_backend.TestExpenses" name="test_create_list_delete_expense" time="0.147" /><testcase classname="backend.tests.test_backend.TestDashboardReports" name="test_dashboard_stats_shape" time="0.068" /><testcase classname="backend.tests.test_backend.TestDashboardReports" name="test_gst_report" time="0.057" /><testcase classname="backend.tests.test_backend.TestDashboardReports" name="test_sales_summary" time="0.049" /><testcase classname="backend.tests.test_backend.TestDashboardReports" name="test_stock_report" time="0.206" /><testcase classname="backend.tests.test_backend.TestUsers" name="test_list_users_no_password_hash" time="0.049" /><testcase classname="backend.tests.test_backend.TestUsers" name="test_staff_cannot_list_users" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_backend.py:347: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_backend.TestUsers" name="test_create_update_delete_user" time="0.957" /><testcase classname="backend.tests.test_backend.TestUsers" name="test_cannot_delete_self" time="0.098" /><testcase classname="backend.tests.test_backend.TestUsers" name="test_staff_cannot_create_user" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_backend.py:382: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_backend.TestActivityLogs" name="test_admin_can_list" time="0.056" /><testcase classname="backend.tests.test_backend.TestActivityLogs" name="test_staff_blocked" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_backend.py:401: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_cash_bank.TestDashboard" name="test_dashboard_shape" time="0.443" /><testcase classname="backend.tests.test_cash_bank.TestBankAccounts" name="test_create_bank" time="0.058" /><testcase classname="backend.tests.test_cash_bank.TestBankAccounts" name="test_create_bank2" time="0.053" /><testcase classname="backend.tests.test_cash_bank.TestBankAccounts" name="test_list_banks_shows_current_balance" time="0.052" /><testcase classname="backend.tests.test_cash_bank.TestBankAccounts" name="test_update_bank" time="0.050" /><testcase classname="backend.tests.test_cash_bank.TestBankAccounts" name="test_invalid_bank_id_returns_400" time="0.050" /><testcase classname="backend.tests.test_cash_bank.TestCash" name="test_cash_deposit" time="0.057" /><testcase classname="backend.tests.test_cash_bank.TestCash" name="test_cash_balance" time="0.048" /><testcase classname="backend.tests.test_cash_bank.TestCash" name="test_cash_to_bank_transfer_mirrors" time="0.106" /><testcase classname="backend.tests.test_cash_bank.TestBankTxn" name="test_create_bank_txn_deposit" time="0.051" /><testcase classname="backend.tests.test_cash_bank.TestBankTxn" name="test_bank_to_bank_transfer_mirrors" time="0.103" /><testcase classname="backend.tests.test_cash_bank.TestBankTxn" name="test_unified_transactions" time="0.052" /><testcase classname="backend.tests.test_cash_bank.TestCheques" name="test_create_cheque" time="0.055" /><testcase classname="backend.tests.test_cash_bank.TestCheques" name="test_cheque_cleared_creates_bank_deposit" time="0.161" /><testcase classname="backend.tests.test_cash_bank.TestCheques" name="test_filter_cheques_by_direction" time="0.049" /><testcase classname="backend.tests.test_cash_bank.TestCheques" name="test_delete_cheque_cascades" time="0.150" /><testcase classname="backend.tests.test_cash_bank.TestLoans" name="test_create_loan" time="0.054" /><testcase classname="backend.tests.test_cash_bank.TestLoans" name="test_loan_payment_creates_bank_outflow" time="0.164" /><testcase classname="backend.tests.test_cash_bank.TestLoans" name="test_list_loans_computed_fields" time="0.052" /><testcase classname="backend.tests.test_cash_bank.TestLoans" name="test_delete_loan_blocked_with_payments" time="0.055" /><testcase classname="backend.tests.test_cash_bank.TestLoans" name="test_delete_loan_payment_cascades" time="0.052" /><testcase classname="backend.tests.test_cash_bank.TestLedger" name="test_bank_ledger" time="0.051" /><testcase classname="backend.tests.test_cash_bank.TestLedger" name="test_cash_ledger" time="0.051" /><testcase classname="backend.tests.test_cash_bank.TestReports" name="test_cashflow" time="0.057" /><testcase classname="backend.tests.test_cash_bank.TestReports" name="test_daily_collection" time="0.051" /><testcase classname="backend.tests.test_cash_bank.TestRoles" name="test_staff_can_read_dashboard" time="0.100"><skipped type="pytest.skip" message="staff login failed 401">/app/backend/tests/test_cash_bank.py:274: staff login failed 401</skipped></testcase><testcase classname="backend.tests.test_cash_bank.TestRoles" name="test_staff_cannot_create_bank" time="0.000"><skipped type="pytest.skip" message="staff login failed 401">/app/backend/tests/test_cash_bank.py:278: staff login failed 401</skipped></testcase><testcase classname="backend.tests.test_cash_bank.TestRoles" name="test_staff_cannot_create_cheque" time="0.000"><skipped type="pytest.skip" message="staff login failed 401">/app/backend/tests/test_cash_bank.py:283: staff login failed 401</skipped></testcase><testcase classname="backend.tests.test_cash_bank.TestRoles" name="test_staff_cannot_create_loan" time="0.000"><skipped type="pytest.skip" message="staff login failed 401">/app/backend/tests/test_cash_bank.py:288: staff login failed 401</skipped></testcase><testcase classname="backend.tests.test_cash_bank.TestZCleanup" name="test_cleanup" time="0.470" /><testcase classname="backend.tests.test_permissions_sync.TestPermissionsCatalog" name="test_catalog_returns_17_modules" time="0.051" /><testcase classname="backend.tests.test_permissions_sync.TestPermissionsCatalog" name="test_roles_returns_5_presets" time="0.048" /><testcase classname="backend.tests.test_permissions_sync.TestPermissionsCatalog" name="test_me_for_admin" time="0.048" /><testcase classname="backend.tests.test_permissions_sync.TestPermissionsCatalog" name="test_catalog_requires_auth" time="0.106" /><testcase classname="backend.tests.test_permissions_sync.TestCustomRoles" name="test_create_custom_role" time="0.097" /><testcase classname="backend.tests.test_permissions_sync.TestCustomRoles" name="test_update_custom_role" time="0.097" /><testcase classname="backend.tests.test_permissions_sync.TestCustomRoles" name="test_update_preset_admin_409" time="0.048" /><testcase classname="backend.tests.test_permissions_sync.TestCustomRoles" name="test_create_preset_name_409" time="0.046" /><testcase classname="backend.tests.test_permissions_sync.TestCustomRoles" name="test_delete_preset_admin_409" time="0.054" /><testcase classname="backend.tests.test_permissions_sync.TestCustomRoles" name="test_delete_custom_role" time="0.100" /><testcase classname="backend.tests.test_permissions_sync.TestRoleAssignment" name="test_create_user_with_cashier_role" time="0.446" /><testcase classname="backend.tests.test_permissions_sync.TestRoleAssignment" name="test_self_demote_blocked" time="0.096" /><testcase classname="backend.tests.test_permissions_sync.TestSync" name="test_push_empty_ops" time="0.048" /><testcase classname="backend.tests.test_permissions_sync.TestSync" name="test_push_valid_op_then_idempotent_replay" time="0.231" /><testcase classname="backend.tests.test_permissions_sync.TestSync" name="test_push_invalid_url_marked_error" time="0.049" /><testcase classname="backend.tests.test_permissions_sync.TestSync" name="test_pull_returns_arrays" time="0.555" /><testcase classname="backend.tests.test_permissions_sync.TestSync" name="test_status" time="0.049" /><testcase classname="backend.tests.test_permissions_sync.TestSync" name="test_log" time="0.054" /><testcase classname="backend.tests.test_portal_version_license.TestVersion" name="test_current" time="0.137" /><testcase classname="backend.tests.test_portal_version_license.TestVersion" name="test_check_outdated" time="0.109" /><testcase classname="backend.tests.test_portal_version_license.TestVersion" name="test_check_uptodate" time="0.107" /><testcase classname="backend.tests.test_portal_version_license.TestVersion" name="test_changelog" time="0.108" /><testcase classname="backend.tests.test_portal_version_license.TestVersion" name="test_rollback_info_requires_admin" time="0.098" /><testcase classname="backend.tests.test_portal_version_license.TestVersion" name="test_rollback_info_admin" time="0.049" /><testcase classname="backend.tests.test_portal_version_license.TestVersion" name="test_check_now" time="0.053" /><testcase classname="backend.tests.test_portal_version_license.TestLicensing" name="test_plans_public" time="0.104" /><testcase classname="backend.tests.test_portal_version_license.TestLicensing" name="test_status_autoinit" time="0.048" /><testcase classname="backend.tests.test_portal_version_license.TestLicensing" name="test_generate_demo_key" time="0.053" /><testcase classname="backend.tests.test_portal_version_license.TestLicensing" name="test_activate_pro" time="0.097" /><testcase classname="backend.tests.test_portal_version_license.TestLicensing" name="test_activate_invalid_key" time="0.048" /><testcase classname="backend.tests.test_portal_version_license.TestLicensing" name="test_device_register_first" time="0.050" /><testcase classname="backend.tests.test_portal_version_license.TestLicensing" name="test_device_register_duplicate" time="0.049" /><testcase classname="backend.tests.test_portal_version_license.TestLicensing" name="test_list_devices" time="0.049" /><testcase classname="backend.tests.test_portal_version_license.TestLicensing" name="test_delete_device" time="0.098" /><testcase classname="backend.tests.test_portal_version_license.TestLicensing" name="test_start_trial_conflict" time="0.051" /><testcase classname="backend.tests.test_portal_version_license.TestLicensing" name="test_restore_trial_state" time="0.097" /><testcase classname="backend.tests.test_portal_version_license.TestPortal" name="test_login_no_party" time="0.099" /><testcase classname="backend.tests.test_portal_version_license.TestPortal" name="test_create_party_then_login" time="0.257" /><testcase classname="backend.tests.test_portal_version_license.TestPortal" name="test_portal_dashboard" time="0.052" /><testcase classname="backend.tests.test_portal_version_license.TestPortal" name="test_portal_order" time="0.604" /><testcase classname="backend.tests.test_portal_version_license.TestStorefront" name="test_items_public" time="0.112" /><testcase classname="backend.tests.test_portal_version_license.TestStorefront" name="test_guest_order_creates_party" time="0.196" /><testcase classname="backend.tests.test_portal_version_license.TestStorefront" name="test_verify_invoice_public" time="0.118" /><testcase classname="backend.tests.test_portal_version_license.TestZZCleanup" name="test_cleanup" time="0.196" /><testcase classname="backend.tests.test_reports_and_backup.TestLoginRegression" name="test_login_success_returns_user_and_no_500" time="0.324" /><testcase classname="backend.tests.test_reports_and_backup.TestLoginRegression" name="test_login_wrong_password_401" time="0.333" /><testcase classname="backend.tests.test_reports_and_backup.TestReportSources" name="test_sources_returns_six_with_fields" time="0.049" /><testcase classname="backend.tests.test_reports_and_backup.TestReportPreview" name="test_preview_sales_basic" time="0.049" /><testcase classname="backend.tests.test_reports_and_backup.TestReportPreview" name="test_preview_invalid_source_400" time="0.047" /><testcase classname="backend.tests.test_reports_and_backup.TestReportPreview" name="test_preview_empty_columns_400" time="0.049" /><testcase classname="backend.tests.test_reports_and_backup.TestReportPreview" name="test_preview_with_date_filter_sort_group" time="0.047" /><testcase classname="backend.tests.test_reports_and_backup.TestSavedReports" name="test_save_returns_id" time="0.097" /><testcase classname="backend.tests.test_reports_and_backup.TestSavedReports" name="test_list_includes_new" time="0.144" /><testcase classname="backend.tests.test_reports_and_backup.TestSavedReports" name="test_run_returns_same_shape_as_preview" time="0.146" /><testcase classname="backend.tests.test_reports_and_backup.TestSavedReports" name="test_update_saved" time="0.157" /><testcase classname="backend.tests.test_reports_and_backup.TestSavedReports" name="test_delete_saved" time="0.145" /><testcase classname="backend.tests.test_reports_and_backup.TestSavedReports" name="test_export_csv" time="0.050" /><testcase classname="backend.tests.test_reports_and_backup.TestAiSummary" name="test_ai_summary_returns_text" time="3.715" /><testcase classname="backend.tests.test_reports_and_backup.TestBackup" name="test_create_backup" time="0.647" /><testcase classname="backend.tests.test_reports_and_backup.TestBackup" name="test_list_returns_array_newest_first" time="0.631" /><testcase classname="backend.tests.test_reports_and_backup.TestBackup" name="test_verify_sha256_matches" time="0.753" /><testcase classname="backend.tests.test_reports_and_backup.TestBackup" name="test_download_returns_binary" time="0.647" /><testcase classname="backend.tests.test_reports_and_backup.TestBackup" name="test_restore_merge_returns_counts" time="0.695"><failure message="Failed: ROUTE COLLISION: /api/backup/restore is shadowed by utilities.py's multipart upload route. The new JSON-body restore in backup_engine.py is unreachable.">E   Failed: ROUTE COLLISION: /api/backup/restore is shadowed by utilities.py's multipart upload route. The new JSON-body restore in backup_engine.py is unreachable.</failure></testcase><testcase classname="backend.tests.test_reports_and_backup.TestBackup" name="test_delete_backup" time="0.627" /><testcase classname="backend.tests.test_reports_and_backup.TestBackupSchedule" name="test_get_schedule_shape" time="0.048" /><testcase classname="backend.tests.test_reports_and_backup.TestBackupSchedule" name="test_put_schedule_saves_and_clamps" time="0.385" /><testcase classname="backend.tests.test_reports_and_backup.TestBackupPermissions" name="test_non_admin_403_on_list" time="0.743" /><testcase classname="backend.tests.test_shortcuts.TestAuthGate" name="test_anonymous_me_returns_401" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_shortcuts.py:41: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_shortcuts.TestAuthGate" name="test_anonymous_logs_returns_401" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_shortcuts.py:45: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_shortcuts.TestAuthGate" name="test_anonymous_put_returns_401" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_shortcuts.py:49: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_shortcuts.TestShortcutCRUD" name="test_fresh_user_returns_empty_dict" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_shortcuts.py:57: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_shortcuts.TestShortcutCRUD" name="test_put_saves_override_and_persists" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_shortcuts.py:65: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_shortcuts.TestShortcutCRUD" name="test_put_conflict_returns_409" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_shortcuts.py:90: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_shortcuts.TestShortcutCRUD" name="test_put_disabled_skips_conflict_check" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_shortcuts.py:101: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_shortcuts.TestShortcutCRUD" name="test_put_update_changes_keys" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_shortcuts.py:111: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_shortcuts.TestShortcutCRUD" name="test_delete_resets_single_override" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_shortcuts.py:123: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_shortcuts.TestShortcutCRUD" name="test_delete_nonexistent_is_idempotent" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_shortcuts.py:135: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_shortcuts.TestShortcutCRUD" name="test_reset_all_clears_overrides" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_shortcuts.py:142: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_shortcuts.TestShortcutLogs" name="test_logs_contain_expected_fields" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_shortcuts.py:162: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_shortcuts.TestStaffAccess" name="test_staff_can_manage_own_overrides" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_shortcuts.py:189: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_shortcuts.TestItemsRegression" name="test_items_list_ok" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_shortcuts.py:204: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_shortcuts.TestItemsRegression" name="test_items_import_template_ok" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_shortcuts.py:209: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_shortcuts.TestItemsRegression" name="test_items_export_ok" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_shortcuts.py:215: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_shortcuts.TestItemsRegression" name="test_items_bulk_update_noop_ok" time="0.000"><skipped type="pytest.skip" message="Staff login failed: 401 {&quot;detail&quot;:&quot;Invalid email or password&quot;}">/app/backend/tests/test_shortcuts.py:220: Staff login failed: 401 {"detail":"Invalid email or password"}</skipped></testcase><testcase classname="backend.tests.test_trash_and_print.TestPartiesTrash" name="test_party_delete_restore_purge_full_flow" time="0.447" /><testcase classname="backend.tests.test_trash_and_print.TestPartiesTrash" name="test_restore_party_not_in_trash_returns_404" time="0.048" /><testcase classname="backend.tests.test_trash_and_print.TestItemsTrash" name="test_item_delete_restore_roundtrip_preserves_data" time="1.316" /><testcase classname="backend.tests.test_trash_and_print.TestItemsTrash" name="test_purge_non_existent_item_404" time="0.052" /><testcase classname="backend.tests.test_trash_and_print.TestExpensesTrash" name="test_expense_full_trash_cycle" time="0.388" /><testcase classname="backend.tests.test_trash_and_print.TestInvoicesTrashPurge" name="test_invoice_purge_endpoint" time="0.241" /><testcase classname="backend.tests.test_trash_and_print.TestTrashSummary" name="test_summary_shape_and_counts_increase_on_delete" time="0.585" /><testcase classname="backend.tests.test_trash_and_print.TestTrashEmpty" name="test_empty_specific_kind_items" time="0.349" /><testcase classname="backend.tests.test_trash_and_print.TestTrashEmpty" name="test_empty_all_kinds_no_kind_param" time="0.412" /><testcase classname="backend.tests.test_trash_and_print.TestRegressionSmoke" name="test_units_endpoints" time="0.096" /><testcase classname="backend.tests.test_trash_and_print.TestRegressionSmoke" name="test_reminders_overdue" time="0.053" /><testcase classname="backend.tests.test_trash_and_print.TestRegressionSmoke" name="test_gst_filing_gstr1" time="0.090" /><testcase classname="backend.tests.test_trash_and_print.TestRegressionSmoke" name="test_ocr_scan_bill_requires_auth" time="0.096" /><testcase classname="backend.tests.test_trash_and_print.TestRegressionSmoke" name="test_invoices_list_still_works" time="0.048" /></testsuite></testsuites>