<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="1" skipped="3" tests="26" time="19.702" timestamp="2026-05-10T13:43:29.656484+00:00" hostname="agent-env-846f5da4-866b-45a2-b0be-a8ff7d5ba848"><testcase classname="backend.tests.backend_test.TestHealth" name="test_root" time="0.126" /><testcase classname="backend.tests.backend_test.TestAuth" name="test_register_trader" time="0.321" /><testcase classname="backend.tests.backend_test.TestAuth" name="test_register_duplicate_email" time="0.104" /><testcase classname="backend.tests.backend_test.TestAuth" name="test_login_admin_and_me" time="0.376" /><testcase classname="backend.tests.backend_test.TestAuth" name="test_login_trader" time="0.330" /><testcase classname="backend.tests.backend_test.TestAuth" name="test_me_unauthenticated" time="0.103" /><testcase classname="backend.tests.backend_test.TestAuth" name="test_login_invalid_password" time="0.121" /><testcase classname="backend.tests.backend_test.TestAuth" name="test_refresh_token" time="0.661" /><testcase classname="backend.tests.backend_test.TestAuth" name="test_logout" time="0.422" /><testcase classname="backend.tests.backend_test.TestAuth" name="test_brute_force_lockout" time="0.664"><failure message="AssertionError: expected lockout 429, got [401, 401, 401, 401, 401, 401]&#10;assert 401 == 429">E   AssertionError: expected lockout 429, got [401, 401, 401, 401, 401, 401]
    assert 401 == 429</failure></testcase><testcase classname="backend.tests.backend_test.TestCrypto" name="test_markets" time="0.286" /><testcase classname="backend.tests.backend_test.TestCrypto" name="test_top_gainers[24h]" time="0.535" /><testcase classname="backend.tests.backend_test.TestCrypto" name="test_top_gainers[7d]" time="0.105" /><testcase classname="backend.tests.backend_test.TestCrypto" name="test_top_gainers[30d]" time="0.116" /><testcase classname="backend.tests.backend_test.TestCrypto" name="test_coin_detail" time="0.181" /><testcase classname="backend.tests.backend_test.TestCrypto" name="test_chart" time="2.205"><skipped type="pytest.skip" message="CoinGecko rate-limited">/app/backend/tests/backend_test.py:182: CoinGecko rate-limited</skipped></testcase><testcase classname="backend.tests.backend_test.TestCrypto" name="test_search" time="2.257"><skipped type="pytest.skip" message="CoinGecko rate-limited">/app/backend/tests/backend_test.py:191: CoinGecko rate-limited</skipped></testcase><testcase classname="backend.tests.backend_test.TestCrypto" name="test_exchange_rate" time="2.203"><skipped type="pytest.skip" message="CoinGecko rate-limited">/app/backend/tests/backend_test.py:199: CoinGecko rate-limited</skipped></testcase><testcase classname="backend.tests.backend_test.TestAI" name="test_ai_analyze_bitcoin" time="5.437" /><testcase classname="backend.tests.backend_test.TestPortfolio" name="test_holdings_requires_auth" time="0.126" /><testcase classname="backend.tests.backend_test.TestPortfolio" name="test_create_holding_requires_auth" time="0.128" /><testcase classname="backend.tests.backend_test.TestPortfolio" name="test_create_and_list_holding" time="2.559" /><testcase classname="backend.tests.backend_test.TestPortfolio" name="test_delete_holding" time="0.138" /><testcase classname="backend.tests.backend_test.TestPortfolio" name="test_delete_nonexistent_holding" time="0.046" /><testcase classname="backend.tests.backend_test.TestMongoSetup" name="test_indexes_present" time="0.079" /><testcase classname="backend.tests.backend_test.TestMongoSetup" name="test_admin_seeded_with_bcrypt" time="0.002" /></testsuite></testsuites>