<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="0" skipped="1" tests="27" time="11.230" timestamp="2026-05-26T14:22:54.714037+00:00" hostname="agent-env-07c95d3f-5a6a-49ec-9dd7-5643f5c9eede"><testcase classname="tests.test_security_and_marketing" name="test_password_strength_strong" time="0.422" /><testcase classname="tests.test_security_and_marketing" name="test_password_strength_weak" time="0.149" /><testcase classname="tests.test_security_and_marketing" name="test_forgot_password_existing_email" time="0.335" /><testcase classname="tests.test_security_and_marketing" name="test_forgot_password_nonexistent_email_no_enumeration" time="0.141" /><testcase classname="tests.test_security_and_marketing" name="test_reset_password_weak_rejected" time="0.106" /><testcase classname="tests.test_security_and_marketing" name="test_reset_password_wrong_token" time="0.326" /><testcase classname="tests.test_security_and_marketing" name="test_reset_password_success_and_restore" time="2.535" /><testcase classname="tests.test_security_and_marketing" name="test_login_otp_request" time="0.609" /><testcase classname="tests.test_security_and_marketing" name="test_login_otp_verify_wrong_code_increments_tries" time="0.346" /><testcase classname="tests.test_security_and_marketing" name="test_login_otp_verify_success_sets_cookie" time="0.334" /><testcase classname="tests.test_security_and_marketing" name="test_login_otp_verify_reuse_after_success_fails" time="0.132" /><testcase classname="tests.test_security_and_marketing" name="test_login_history_self" time="0.068" /><testcase classname="tests.test_security_and_marketing" name="test_admin_security_dashboard" time="0.059" /><testcase classname="tests.test_security_and_marketing" name="test_admin_security_alerts_list" time="0.057" /><testcase classname="tests.test_security_and_marketing" name="test_admin_security_alert_resolve" time="0.000"><skipped type="pytest.skip" message="No alerts to resolve">/app/backend/tests/test_security_and_marketing.py:228: No alerts to resolve</skipped></testcase><testcase classname="tests.test_security_and_marketing" name="test_marketing_templates" time="0.059" /><testcase classname="tests.test_security_and_marketing" name="test_marketing_coupon_create" time="0.054" /><testcase classname="tests.test_security_and_marketing" name="test_marketing_coupons_list_includes_new" time="0.062" /><testcase classname="tests.test_security_and_marketing" name="test_marketing_coupon_redeem" time="0.060" /><testcase classname="tests.test_security_and_marketing" name="test_marketing_coupon_redeem_limit_reached" time="0.175" /><testcase classname="tests.test_security_and_marketing" name="test_marketing_coupon_delete_admin_only" time="0.115" /><testcase classname="tests.test_security_and_marketing" name="test_marketing_campaign_create" time="0.174" /><testcase classname="tests.test_security_and_marketing" name="test_marketing_campaigns_list" time="0.057" /><testcase classname="tests.test_security_and_marketing" name="test_marketing_campaign_invalid_channel" time="0.057" /><testcase classname="tests.test_security_and_marketing" name="test_marketing_ai_ad" time="3.916" /><testcase classname="tests.test_security_and_marketing" name="test_marketing_stats" time="0.061" /><testcase classname="tests.test_security_and_marketing" name="test_non_admin_denied_security_dashboard" time="0.790" /></testsuite></testsuites>