<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="0" skipped="0" tests="140" time="21.482" timestamp="2026-10-27T20:49:14.765310+00:00" hostname="Mac"><testcase classname="tests.test_boundaries" name="test_fresh_businesses_empty_and_separate_files" time="0.175" /><testcase classname="tests.test_boundaries" name="test_auth_csrf_origin_host_and_security_headers" time="0.136" /><testcase classname="tests.test_boundaries" name="test_cross_business_reads_writes_and_body_tenant_spoof" time="0.194" /><testcase classname="tests.test_boundaries" name="test_public_capture_routes_exact_business_and_deduplicates_retries" time="0.147" /><testcase classname="tests.test_boundaries" name="test_two_customers_same_name_email_have_separate_portals" time="0.148" /><testcase classname="tests.test_boundaries" name="test_portal_drafts_hidden_acceptance_and_immediate_revocation" time="0.139" /><testcase classname="tests.test_boundaries" name="test_portal_replacing_code_revokes_old_session" time="0.110" /><testcase classname="tests.test_boundaries" name="test_money_rounding_invoice_snapshot_idempotency_and_overpayment" time="0.143" /><testcase classname="tests.test_boundaries" name="test_concurrent_payments_do_not_lose_or_double_count" time="0.147" /><testcase classname="tests.test_boundaries" name="test_optimistic_job_update_rejects_stale_version" time="0.112" /><testcase classname="tests.test_boundaries" name="test_site_draft_publish_restore_and_tenant_separation" time="0.173" /><testcase classname="tests.test_boundaries" name="test_image_validation_and_publication_access" time="0.184" /><testcase classname="tests.test_boundaries" name="test_password_change_and_logout_invalidate_sessions" time="0.197" /><testcase classname="tests.test_boundaries" name="test_rate_limit_and_no_sensitive_validation_echo" time="0.301" /><testcase classname="tests.test_boundaries" name="test_domain_simulator_no_default_and_unique_ownership" time="0.136" /><testcase classname="tests.test_boundaries" name="test_records_persist_across_app_restart" time="0.139" /><testcase classname="tests.test_boundaries" name="test_outbound_guard_blocks_socket_before_connection" time="0.019" /><testcase classname="tests.test_boundaries" name="test_static_server_does_not_serve_data_or_unknown_api" time="0.085" /><testcase classname="tests.test_customers" name="test_explicit_reuse_creates_one_customer_and_many_jobs" time="0.116" /><testcase classname="tests.test_customers" name="test_public_matching_remains_separate_even_same_contact" time="0.134" /><testcase classname="tests.test_customers" name="test_customer_history_financial_totals_and_immutable_names" time="0.131" /><testcase classname="tests.test_customers" name="test_customer_edit_revokes_portal_and_reuse_exposes_only_selected_customer" time="0.123" /><testcase classname="tests.test_customers" name="test_customer_routes_business_csrf_portal_and_unknown_fields" time="0.165" /><testcase classname="tests.test_customers" name="test_reviewed_bare_enquiry_link_preserves_customers_and_audit" time="0.122" /><testcase classname="tests.test_customers" name="test_link_blocks_document_cost_portal_state_and_false_confirmation" time="0.189" /><testcase classname="tests.test_documents" name="test_draft_edit_revision_preserves_published_snapshot_and_history" time="0.161" /><testcase classname="tests.test_documents" name="test_expiry_and_cancelled_draft_do_not_create_portal_access" time="0.159" /><testcase classname="tests.test_documents" name="test_invoice_private_draft_issue_sealing_and_unpaid_replacement" time="0.171" /><testcase classname="tests.test_documents" name="test_cancel_draft_and_void_paid_invoice_boundaries" time="0.161" /><testcase classname="tests.test_documents" name="test_stage_requests_never_add_money_and_receipts_allocate_once" time="0.165" /><testcase classname="tests.test_documents" name="test_schedule_validation_lock_and_clear_before_use" time="0.166" /><testcase classname="tests.test_documents" name="test_voided_invoice_closes_existing_stage_requests_in_portal" time="0.156" /><testcase classname="tests.test_documents" name="test_fractional_quantities_exact_line_rounding_and_vat" time="0.136" /><testcase classname="tests.test_documents" name="test_payment_error_correction_atomic_retry_and_preserved_ledger" time="0.163" /><testcase classname="tests.test_documents" name="test_concurrent_stage_receipts_and_same_key_cannot_double_apply" time="0.163" /><testcase classname="tests.test_documents" name="test_concurrent_quote_revision_acceptance_and_invoice_numbering" time="0.288" /><testcase classname="tests.test_documents" name="test_cross_business_document_actions_and_csrf[issue]" time="0.155" /><testcase classname="tests.test_documents" name="test_cross_business_document_actions_and_csrf[cancel]" time="0.196" /><testcase classname="tests.test_documents" name="test_cross_business_document_actions_and_csrf[void]" time="0.161" /><testcase classname="tests.test_documents" name="test_cross_business_document_actions_and_csrf[correct]" time="0.180" /><testcase classname="tests.test_documents" name="test_customer_scope_retry_actor_and_stage_ownership" time="0.184" /><testcase classname="tests.test_documents" name="test_correction_racing_new_payment_never_uses_a_stale_balance" time="0.142" /><testcase classname="tests.test_documents" name="test_void_racing_payment_has_one_valid_winner" time="0.133" /><testcase classname="tests.test_documents" name="test_schedule_change_racing_receipt_preserves_exact_allocations" time="0.150" /><testcase classname="tests.test_documents" name="test_receipts_require_positive_bounded_integer_pence[True]" time="0.130" /><testcase classname="tests.test_documents" name="test_receipts_require_positive_bounded_integer_pence[False]" time="0.120" /><testcase classname="tests.test_documents" name="test_receipts_require_positive_bounded_integer_pence[1.5]" time="0.121" /><testcase classname="tests.test_documents" name="test_receipts_require_positive_bounded_integer_pence[100]" time="0.145" /><testcase classname="tests.test_documents" name="test_receipts_require_positive_bounded_integer_pence[-1]" time="0.119" /><testcase classname="tests.test_documents" name="test_receipts_require_positive_bounded_integer_pence[0]" time="0.125" /><testcase classname="tests.test_documents" name="test_receipts_require_positive_bounded_integer_pence[100000001]" time="0.121" /><testcase classname="tests.test_documents" name="test_recovery_rejects_cross_customer_document_link_even_with_valid_foreign_key" time="0.245" /><testcase classname="tests.test_documents" name="test_v04_upgrade_retains_issued_visibility_receipts_sessions_and_snapshots" time="0.128" /><testcase classname="tests.test_documents" name="test_recovery_format1_migrates_only_fresh_restored_copy" time="0.280" /><testcase classname="tests.test_documents" name="test_document_lifecycle_survives_loss_and_recovery" time="0.337" /><testcase classname="tests.test_materials" name="test_new_read_paths_staff_only_and_mutations_csrf" time="0.144" /><testcase classname="tests.test_materials" name="test_business_job_customer_and_catalogue_isolation" time="0.192" /><testcase classname="tests.test_materials" name="test_same_name_customers_filter_by_id_and_historical_jobs" time="0.130" /><testcase classname="tests.test_materials" name="test_exact_costs_fractional_quantity_and_rounding" time="0.128" /><testcase classname="tests.test_materials" name="test_invalid_material_input_writes_nothing[quantity-0]" time="0.117" /><testcase classname="tests.test_materials" name="test_invalid_material_input_writes_nothing[quantity--1]" time="0.117" /><testcase classname="tests.test_materials" name="test_invalid_material_input_writes_nothing[quantity-NaN]" time="0.115" /><testcase classname="tests.test_materials" name="test_invalid_material_input_writes_nothing[quantity-1.0001]" time="0.106" /><testcase classname="tests.test_materials" name="test_invalid_material_input_writes_nothing[quantity-1000001]" time="0.110" /><testcase classname="tests.test_materials" name="test_invalid_material_input_writes_nothing[quantity-True]" time="0.110" /><testcase classname="tests.test_materials" name="test_invalid_material_input_writes_nothing[cost_price--1]" time="0.112" /><testcase classname="tests.test_materials" name="test_invalid_material_input_writes_nothing[cost_price-1.001]" time="0.106" /><testcase classname="tests.test_materials" name="test_invalid_material_input_writes_nothing[cost_price-NaN]" time="0.106" /><testcase classname="tests.test_materials" name="test_invalid_material_input_writes_nothing[cost_price-Infinity]" time="0.136" /><testcase classname="tests.test_materials" name="test_invalid_material_input_writes_nothing[cost_price-1e999999999]" time="0.106" /><testcase classname="tests.test_materials" name="test_invalid_material_input_writes_nothing[cost_price-1000000.01]" time="0.109" /><testcase classname="tests.test_materials" name="test_invalid_material_input_writes_nothing[cost_price-True]" time="0.108" /><testcase classname="tests.test_materials" name="test_invalid_material_input_writes_nothing[status-paid]" time="0.113" /><testcase classname="tests.test_materials" name="test_invalid_material_input_writes_nothing[name-   ]" time="0.107" /><testcase classname="tests.test_materials" name="test_invalid_material_input_writes_nothing[ordered_date-2026-02-30]" time="0.105" /><testcase classname="tests.test_materials" name="test_supplier_references_safe_and_preserved" time="0.121" /><testcase classname="tests.test_materials" name="test_stages_dates_versions_archival_and_no_reparenting" time="0.129" /><testcase classname="tests.test_materials" name="test_bulk_all_or_nothing_foreign_ids_stale_versions_and_retry" time="0.159" /><testcase classname="tests.test_materials" name="test_catalogue_snapshot_reference_only_no_financial_changes" time="0.130" /><testcase classname="tests.test_materials" name="test_catalogue_uniqueness_archive_restore_and_versions" time="0.185" /><testcase classname="tests.test_materials" name="test_catalogue_optional_charge_price_and_invalid_prices" time="0.117" /><testcase classname="tests.test_materials" name="test_catalogue_add_override_and_retry" time="0.113" /><testcase classname="tests.test_materials" name="test_cost_free_order_projection_and_no_partial_foreign_export" time="0.119" /><testcase classname="tests.test_materials" name="test_csv_preview_payload_atomic_import_and_retry" time="0.144" /><testcase classname="tests.test_materials" name="test_price_history_business_scope_exact_match_and_archive" time="0.152" /><testcase classname="tests.test_materials" name="test_concurrent_material_edits_cannot_overwrite" time="0.111" /><testcase classname="tests.test_materials" name="test_additive_schema_preserves_v01_records_and_materials_restart" time="0.198" /><testcase classname="tests.test_recovery" name="test_full_two_business_restore_after_simulated_loss" time="0.851" /><testcase classname="tests.test_recovery" name="test_unsafe_paths_rejected_without_creating_target[../outside]" time="0.101" /><testcase classname="tests.test_recovery" name="test_unsafe_paths_rejected_without_creating_target[/absolute]" time="0.102" /><testcase classname="tests.test_recovery" name="test_unsafe_paths_rejected_without_creating_target[businesses/oak/../harbour/evil]" time="0.102" /><testcase classname="tests.test_recovery" name="test_unsafe_paths_rejected_without_creating_target[businesses\\oak\\evil]" time="0.103" /><testcase classname="tests.test_recovery" name="test_unsafe_paths_rejected_without_creating_target[registry.sqlite3]" time="0.107" /><testcase classname="tests.test_recovery" name="test_corrupt_or_mapped_archives_rejected[swap_businesses]" time="0.102" /><testcase classname="tests.test_recovery" name="test_corrupt_or_mapped_archives_rejected[wrong_file_owner]" time="0.101" /><testcase classname="tests.test_recovery" name="test_corrupt_or_mapped_archives_rejected[wrong_slug]" time="0.097" /><testcase classname="tests.test_recovery" name="test_corrupt_or_mapped_archives_rejected[missing_database]" time="0.092" /><testcase classname="tests.test_recovery" name="test_corrupt_or_mapped_archives_rejected[unknown_version]" time="0.094" /><testcase classname="tests.test_recovery" name="test_corrupt_or_mapped_archives_rejected[wrong_member_hash]" time="0.122" /><testcase classname="tests.test_recovery" name="test_corrupt_or_mapped_archives_rejected[corrupt_sqlite]" time="0.104" /><testcase classname="tests.test_recovery" name="test_corrupt_or_mapped_archives_rejected[extra_schema]" time="0.099" /><testcase classname="tests.test_recovery" name="test_corrupt_or_mapped_archives_rejected[broken_foreign_key]" time="0.095" /><testcase classname="tests.test_recovery" name="test_corrupt_or_mapped_archives_rejected[portal_grant]" time="0.098" /><testcase classname="tests.test_recovery" name="test_corrupt_or_mapped_archives_rejected[oversize_metadata]" time="0.097" /><testcase classname="tests.test_recovery" name="test_duplicate_symlink_and_crc_inputs_rejected" time="0.094" /><testcase classname="tests.test_recovery" name="test_missing_or_corrupt_owned_images_fail" time="0.139" /><testcase classname="tests.test_recovery" name="test_fresh_target_and_explicit_confirmation_guards" time="0.092" /><testcase classname="tests.test_recovery" name="test_running_lock_and_sqlite_writer_prevent_snapshot" time="0.141" /><testcase classname="tests.test_recovery" name="test_process_lock_release_and_incomplete_restore_guard" time="0.132" /><testcase classname="tests.test_recovery" name="test_cli_safe_summary_failure_and_no_password_output" time="0.838" /><testcase classname="tests.test_recovery" name="test_committed_wal_pages_are_included_consistently" time="0.277" /><testcase classname="tests.test_recovery" name="test_interrupted_publication_cleans_only_new_target" time="0.214" /><testcase classname="tests.test_recovery" name="test_additive_v03_upgrade_keeps_records_and_rejects_mixed_datasets" time="0.253" /><testcase classname="tests.test_scheduling" name="test_interval_adjacency_different_people_and_multi_day_overlap" time="0.132" /><testcase classname="tests.test_scheduling" name="test_whole_team_unavailability_blocks_existing_and_new_people" time="0.121" /><testcase classname="tests.test_scheduling" name="test_uk_clock_gap_and_ambiguous_fold_choices" time="0.116" /><testcase classname="tests.test_scheduling" name="test_all_day_tracks_london_midnight_and_clock_change[2026-03-29-23]" time="0.119" /><testcase classname="tests.test_scheduling" name="test_all_day_tracks_london_midnight_and_clock_change[2026-10-25-25]" time="0.113" /><testcase classname="tests.test_scheduling" name="test_versioned_edit_archive_restore_conflicts_and_history" time="0.127" /><testcase classname="tests.test_scheduling" name="test_retry_and_simultaneous_overlap_have_one_result" time="0.168" /><testcase classname="tests.test_scheduling" name="test_team_archive_requires_future_bookings_resolved_and_restore_checks_team" time="0.302" /><testcase classname="tests.test_scheduling" name="test_scheduling_business_portal_csrf_and_validation_boundaries" time="0.231" /><testcase classname="tests.test_scheduling" name="test_schedule_preserves_financials_job_status_and_survives_restart" time="0.177" /><testcase classname="tests.test_workforce" name="test_rate_snapshot_exact_rounding_corrections_and_history" time="0.122" /><testcase classname="tests.test_workforce" name="test_invalid_time_cannot_write[changes0]" time="0.109" /><testcase classname="tests.test_workforce" name="test_invalid_time_cannot_write[changes1]" time="0.113" /><testcase classname="tests.test_workforce" name="test_invalid_time_cannot_write[changes2]" time="0.115" /><testcase classname="tests.test_workforce" name="test_invalid_time_cannot_write[changes3]" time="0.121" /><testcase classname="tests.test_workforce" name="test_invalid_time_cannot_write[changes4]" time="0.119" /><testcase classname="tests.test_workforce" name="test_invalid_time_cannot_write[changes5]" time="0.110" /><testcase classname="tests.test_workforce" name="test_invalid_time_cannot_write[changes6]" time="0.111" /><testcase classname="tests.test_workforce" name="test_invalid_time_cannot_write[changes7]" time="0.145" /><testcase classname="tests.test_workforce" name="test_invalid_time_cannot_write[changes8]" time="0.111" /><testcase classname="tests.test_workforce" name="test_invalid_time_cannot_write[changes9]" time="0.109" /><testcase classname="tests.test_workforce" name="test_invalid_time_cannot_write[changes10]" time="0.114" /><testcase classname="tests.test_workforce" name="test_capacity_across_jobs_archive_and_restore" time="0.132" /><testcase classname="tests.test_workforce" name="test_time_retry_and_simultaneous_capacity_checks" time="0.166" /><testcase classname="tests.test_workforce" name="test_costs_keep_material_stages_invoices_payments_separate" time="0.140" /><testcase classname="tests.test_workforce" name="test_workforce_business_portal_and_csrf_boundaries" time="0.172" /><testcase classname="tests.test_workforce" name="test_time_persists_restart_and_blocks_customer_relink" time="0.156" /></testsuite></testsuites>