<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="0" skipped="2" tests="80" time="21.727" timestamp="2026-06-17T09:22:17.462702+00:00" hostname="agent-env-07c95d3f-5a6a-49ec-9dd7-5643f5c9eede"><testcase classname="" name="tests.test_invoice_share_and_prefixes" time="0.000"><skipped message="collection skipped">('/app/backend/tests/test_invoice_share_and_prefixes.py', 15, 'Skipped: TEST_ADMIN_PASSWORD env var not set — populate /app/memory/test_credentials.md and export it before running these regression tests.')</skipped></testcase><testcase classname="tests.test_smoke.TestLogin" name="test_root_responds" time="0.118" /><testcase classname="tests.test_smoke.TestLogin" name="test_admin_can_login" time="0.396" /><testcase classname="tests.test_smoke.TestLogin" name="test_bad_credentials_rejected" time="0.102" /><testcase classname="tests.test_smoke.TestSystemHealth" name="test_health_endpoint" time="0.050" /><testcase classname="tests.test_smoke.TestSystemHealth" name="test_health_blocked_for_anonymous" time="0.106" /><testcase classname="tests.test_smoke.TestErrorTracking" name="test_frontend_can_post_anonymously" time="0.099" /><testcase classname="tests.test_smoke.TestErrorTracking" name="test_admin_can_list_errors" time="0.152" /><testcase classname="tests.test_smoke.TestErrorTracking" name="test_admin_can_get_stats" time="0.047" /><testcase classname="tests.test_smoke.TestPermissions" name="test_anonymous_cannot_list_users" time="0.128" /><testcase classname="tests.test_smoke.TestPermissions" name="test_anonymous_cannot_clear_errors" time="0.092" /><testcase classname="tests.test_smoke.TestInventoryCRUD" name="test_item_appears_in_list" time="0.144" /><testcase classname="tests.test_smoke.TestInventoryCRUD" name="test_item_can_be_updated" time="0.180" /><testcase classname="tests.test_smoke.TestInvoiceFlow" name="test_invoice_created_with_totals" time="0.183" /><testcase classname="tests.test_smoke.TestInvoiceFlow" name="test_invoice_appears_in_listing" time="0.073" /><testcase classname="tests.test_smoke.TestDatabaseConsistency" name="test_companies_list_serializable" time="0.044" /><testcase classname="tests.test_smoke.TestDatabaseConsistency" name="test_items_list_serializable" time="0.047" /><testcase classname="tests.test_smoke.TestDatabaseConsistency" name="test_health_endpoint_serializable" time="0.049" /><testcase classname="tests.test_smoke.TestPdfAndPrint" name="test_items_excel_template_downloads" time="0.068" /><testcase classname="tests.test_smoke.TestPdfAndPrint" name="test_parties_excel_template_downloads" time="0.062" /><testcase classname="tests.test_smoke.TestPdfAndPrint" name="test_label_templates_list" time="0.044" /><testcase classname="tests.test_smoke" name="test_zzz_summary" time="0.046" /><testcase classname="tests.test_auto_product_create.TestAutoProductCreate" name="test_check_duplicate_endpoint_exists" time="0.049" /><testcase classname="tests.test_auto_product_create.TestAutoProductCreate" name="test_check_duplicate_finds_known_item" time="0.090" /><testcase classname="tests.test_auto_product_create.TestAutoProductCreate" name="test_post_items_409_on_duplicate_barcode" time="0.129" /><testcase classname="tests.test_auto_product_create.TestAutoProductCreate" name="test_full_ai_detected_payload_roundtrips" time="0.049" /><testcase classname="tests.test_auto_product_create.TestAutoProductCreate" name="test_unauthenticated_blocked" time="0.095" /><testcase classname="tests.test_item_multi_images.TestItemMultiImages" name="test_create_with_legacy_photo_url_mirrors_into_new_fields" time="0.090" /><testcase classname="tests.test_item_multi_images.TestItemMultiImages" name="test_create_with_images_array_sets_cover_to_first" time="0.090" /><testcase classname="tests.test_item_multi_images.TestItemMultiImages" name="test_update_reorders_cover" time="0.136" /><testcase classname="tests.test_item_multi_images.TestItemMultiImages" name="test_max_10_images_cap" time="0.096" /><testcase classname="tests.test_item_multi_images.TestItemMultiImages" name="test_search_returns_cover_image_for_thumbnails" time="0.139" /><testcase classname="tests.test_invoice_crud_regression" name="test_post_invoice_create_regression" time="0.094" /><testcase classname="tests.test_invoice_crud_regression" name="test_get_invoice_regression" time="0.145" /><testcase classname="tests.test_invoice_crud_regression" name="test_delete_invoice_soft_delete_regression" time="0.141" /><testcase classname="tests.test_invoice_crud_regression" name="test_put_invoice_preserves_type_and_invoice_no_all_types" time="1.042" /><testcase classname="tests.test_invoice_crud_regression" name="test_put_invoice_blocked_when_cancelled" time="0.139"><skipped type="pytest.skip" message="No /cancel endpoint (got 404); cancellation flow not exercised here">/app/backend/tests/test_invoice_crud_regression.py:88: No /cancel endpoint (got 404); cancellation flow not exercised here</skipped></testcase><testcase classname="tests.test_invoice_edit" name="test_put_invoice_updates_notes_and_lines" time="0.145" /><testcase classname="tests.test_invoice_edit" name="test_put_invoice_recalculates_totals" time="0.146" /><testcase classname="tests.test_invoice_edit" name="test_put_invoice_404_for_missing_id" time="0.044" /><testcase classname="tests.test_invoice_edit" name="test_put_invoice_status_recomputed_on_payment" time="0.178" /><testcase classname="tests.test_change_password.TestChangePassword" name="test_requires_authentication" time="0.114" /><testcase classname="tests.test_change_password.TestChangePassword" name="test_wrong_old_password_returns_401" time="0.631" /><testcase classname="tests.test_change_password.TestChangePassword" name="test_short_new_password_returns_400" time="0.394" /><testcase classname="tests.test_change_password.TestChangePassword" name="test_same_as_old_returns_400" time="0.402" /><testcase classname="tests.test_change_password.TestChangePassword" name="test_weak_new_password_returns_400" time="0.453" /><testcase classname="tests.test_change_password.TestChangePassword" name="test_happy_path_and_rollback" time="2.315" /><testcase classname="tests.test_change_password.TestChangePassword" name="test_empty_body_returns_400" time="0.377" /><testcase classname="tests.test_unified_sequence.TestUnifiedSequence" name="test_auto_bills_increment_continuously" time="0.291" /><testcase classname="tests.test_unified_sequence.TestUnifiedSequence" name="test_manual_bumps_counter_forward" time="0.295" /><testcase classname="tests.test_unified_sequence.TestUnifiedSequence" name="test_manual_smaller_than_current_rejected_as_duplicate" time="0.324" /><testcase classname="tests.test_unified_sequence.TestUnifiedSequence" name="test_year_change_resets_counter" time="0.422" /><testcase classname="tests.test_unified_sequence.TestMultiUserCounters" name="test_two_users_have_independent_sequences" time="1.108" /><testcase classname="tests.test_unified_sequence.TestMultiUserCounters" name="test_user_manual_bumps_only_own_counter" time="0.867" /><testcase classname="tests.test_v12_2_enhancements.TestItemBatchExpiry" name="test_create_item_with_batch_expiry" time="0.098" /><testcase classname="tests.test_v12_2_enhancements.TestItemBatchExpiry" name="test_create_item_without_batch" time="0.086" /><testcase classname="tests.test_v12_2_enhancements.TestItemAlerts" name="test_alerts_shape" time="0.048" /><testcase classname="tests.test_v12_2_enhancements.TestItemAlerts" name="test_alerts_picks_expired_item" time="0.093" /><testcase classname="tests.test_v12_2_enhancements.TestMarketingAI" name="test_ai_greeting_endpoint" time="1.915" /><testcase classname="tests.test_v12_2_enhancements.TestMarketingAI" name="test_ai_business_tip_endpoint" time="2.738" /><testcase classname="tests.test_v12_2_enhancements.TestAccounting" name="test_profit_loss" time="0.056" /><testcase classname="tests.test_v12_2_enhancements.TestAccounting" name="test_balance_sheet" time="0.050" /><testcase classname="tests.test_v12_2_enhancements.TestAccounting" name="test_trial_balance" time="0.049" /><testcase classname="tests.test_v12_2_enhancements.TestAccounting" name="test_gstr_3b_exists" time="0.051" /><testcase classname="tests.test_v12_2_enhancements.TestAccounting" name="test_gstr_9_exists" time="0.045" /><testcase classname="tests.test_v12_3_trash_migration.TestBackupTrash" name="test_soft_delete_moves_to_trash" time="0.999" /><testcase classname="tests.test_v12_3_trash_migration.TestBackupTrash" name="test_trash_list_contains_item" time="0.044" /><testcase classname="tests.test_v12_3_trash_migration.TestBackupTrash" name="test_active_list_excludes_trash" time="0.044" /><testcase classname="tests.test_v12_3_trash_migration.TestBackupTrash" name="test_auto_clean_within_retention" time="0.131" /><testcase classname="tests.test_v12_3_trash_migration.TestBackupTrash" name="test_restore_from_trash" time="0.134" /><testcase classname="tests.test_v12_3_trash_migration.TestBackupTrash" name="test_permanent_delete_purges" time="0.140" /><testcase classname="tests.test_v12_3_trash_migration.TestBackupTrash" name="test_trash_empty_purges_all" time="1.108" /><testcase classname="tests.test_v12_3_trash_migration.TestMigrationExpenses" name="test_expenses_preview_all_columns_mapped" time="0.057" /><testcase classname="tests.test_v12_3_trash_migration.TestMigrationExpenses" name="test_expenses_preview_dd_mm_yyyy_normalised_on_commit" time="0.130" /><testcase classname="tests.test_v12_3_trash_migration.TestMigrationExpenses" name="test_expenses_commit_inserts_with_metadata" time="0.087" /><testcase classname="tests.test_v12_3_trash_migration.TestMigrationAliases" name="test_parties_tally_ledger_name_alias" time="0.044" /><testcase classname="tests.test_v12_3_trash_migration.TestMigrationAliases" name="test_parties_marg_account_name_alias" time="0.045" /><testcase classname="tests.test_v12_3_trash_migration.TestMigrationAliases" name="test_items_vyapar_marg_aliases" time="0.046" /><testcase classname="tests.test_v12_3_trash_migration.TestTxnPrefixesArchive" name="test_default_excludes_archived" time="0.047" /><testcase classname="tests.test_v12_3_trash_migration.TestTxnPrefixesArchive" name="test_include_archived_returns_all" time="0.105" /></testsuite></testsuites>