<?xml version="1.0" encoding="UTF-8"?>
<testsuites name="jest tests" tests="681" failures="0" errors="0" time="21.736">
  <testsuite name="uploadFileToPresignedUrl" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:19" time="3.179" tests="34">
    <testcase classname="uploadFileToPresignedUrl uploads the local file with the provided method and headers" name="uploadFileToPresignedUrl uploads the local file with the provided method and headers" time="0.003">
    </testcase>
    <testcase classname="uploadFileToPresignedUrl throws a clear error when the upload request fails" name="uploadFileToPresignedUrl throws a clear error when the upload request fails" time="0.017">
    </testcase>
    <testcase classname="uploadFileToPresignedUrl throws a clear error for unsupported upload methods" name="uploadFileToPresignedUrl throws a clear error for unsupported upload methods" time="0.002">
    </testcase>
    <testcase classname="uploadFileToPresignedUrl patches event updates through the versioned update endpoint" name="uploadFileToPresignedUrl patches event updates through the versioned update endpoint" time="0">
    </testcase>
    <testcase classname="uploadFileToPresignedUrl builds my events from the four backend event-management endpoints" name="uploadFileToPresignedUrl builds my events from the four backend event-management endpoints" time="0.002">
    </testcase>
    <testcase classname="uploadFileToPresignedUrl falls back safely when event lists are empty or missing" name="uploadFileToPresignedUrl falls back safely when event lists are empty or missing" time="0">
    </testcase>
    <testcase classname="reconfirmEventParticipation posts to the reconfirm endpoint with bearer auth" name="reconfirmEventParticipation posts to the reconfirm endpoint with bearer auth" time="0">
    </testcase>
    <testcase classname="searchLocation returns [] without calling fetch when query is shorter than 2 chars" name="searchLocation returns [] without calling fetch when query is shorter than 2 chars" time="0">
    </testcase>
    <testcase classname="searchLocation returns [] for whitespace-only queries" name="searchLocation returns [] for whitespace-only queries" time="0">
    </testcase>
    <testcase classname="searchLocation hits the Photon endpoint with the expected query params" name="searchLocation hits the Photon endpoint with the expected query params" time="0">
    </testcase>
    <testcase classname="searchLocation does NOT hit the legacy Nominatim endpoint" name="searchLocation does NOT hit the legacy Nominatim endpoint" time="0">
    </testcase>
    <testcase classname="searchLocation maps Photon GeoJSON business-flows to LocationSuggestion shape" name="searchLocation maps Photon GeoJSON business-flows to LocationSuggestion shape" time="0.009">
    </testcase>
    <testcase classname="searchLocation combines street and house number into display_name when present" name="searchLocation combines street and house number into display_name when present" time="0">
    </testcase>
    <testcase classname="searchLocation skips business-flows with missing or invalid coordinates" name="searchLocation skips business-flows with missing or invalid coordinates" time="0.001">
    </testcase>
    <testcase classname="searchLocation skips business-flows whose properties produce an empty display_name" name="searchLocation skips business-flows whose properties produce an empty display_name" time="0.001">
    </testcase>
    <testcase classname="searchLocation returns [] on non-2xx HTTP response" name="searchLocation returns [] on non-2xx HTTP response" time="0">
    </testcase>
    <testcase classname="searchLocation returns [] when fetch rejects (network error)" name="searchLocation returns [] when fetch rejects (network error)" time="0.001">
    </testcase>
    <testcase classname="searchLocation returns [] when response body is not valid JSON" name="searchLocation returns [] when response body is not valid JSON" time="0">
    </testcase>
    <testcase classname="searchLocation returns [] when response shape is missing business-flows array" name="searchLocation returns [] when response shape is missing business-flows array" time="0">
    </testcase>
    <testcase classname="searchLocation deduplicates repeated parts in display_name" name="searchLocation deduplicates repeated parts in display_name" time="0">
    </testcase>
    <testcase classname="reverseGeocode returns null without calling fetch when coords are not finite" name="reverseGeocode returns null without calling fetch when coords are not finite" time="0">
    </testcase>
    <testcase classname="reverseGeocode hits the Photon /reverse endpoint with the expected query params" name="reverseGeocode hits the Photon /reverse endpoint with the expected query params" time="0">
    </testcase>
    <testcase classname="reverseGeocode returns a LocationSuggestion with the user-tap coords (not the snapped Photon coords)" name="reverseGeocode returns a LocationSuggestion with the user-tap coords (not the snapped Photon coords)" time="0.001">
    </testcase>
    <testcase classname="reverseGeocode returns null when Photon returns no business-flows" name="reverseGeocode returns null when Photon returns no business-flows" time="0">
    </testcase>
    <testcase classname="reverseGeocode returns null on network error / non-2xx / invalid JSON" name="reverseGeocode returns null on network error / non-2xx / invalid JSON" time="0">
    </testcase>
    <testcase classname="reverseGeocode returns null when properties produce an empty display name" name="reverseGeocode returns null when properties produce an empty display name" time="0">
    </testcase>
    <testcase classname="fetchRoutedGeometry returns null without calling fetch when fewer than 2 waypoints" name="fetchRoutedGeometry returns null without calling fetch when fewer than 2 waypoints" time="0">
    </testcase>
    <testcase classname="fetchRoutedGeometry returns null when any waypoint has non-finite coords" name="fetchRoutedGeometry returns null when any waypoint has non-finite coords" time="0">
    </testcase>
    <testcase classname="fetchRoutedGeometry hits OSRM driving profile with lon,lat;lon,lat coords" name="fetchRoutedGeometry hits OSRM driving profile with lon,lat;lon,lat coords" time="0.001">
    </testcase>
    <testcase classname="fetchRoutedGeometry maps OSRM [lon,lat] coordinates to {lat, lon} pairs in order" name="fetchRoutedGeometry maps OSRM [lon,lat] coordinates to {lat, lon} pairs in order" time="0">
    </testcase>
    <testcase classname="fetchRoutedGeometry returns null when OSRM returns a non-Ok code" name="fetchRoutedGeometry returns null when OSRM returns a non-Ok code" time="0">
    </testcase>
    <testcase classname="fetchRoutedGeometry returns null on network failure / non-2xx / invalid JSON" name="fetchRoutedGeometry returns null on network failure / non-2xx / invalid JSON" time="0">
    </testcase>
    <testcase classname="fetchRoutedGeometry returns null when geometry is missing or has fewer than 2 points" name="fetchRoutedGeometry returns null when geometry is missing or has fewer than 2 points" time="0.001">
    </testcase>
    <testcase classname="fetchRoutedGeometry skips invalid pairs in the geometry" name="fetchRoutedGeometry skips invalid pairs in the geometry" time="0">
    </testcase>
  </testsuite>
  <testsuite name="useProfileViewModel" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:19" time="3.875" tests="22">
    <testcase classname="useProfileViewModel starts in loading state" name="useProfileViewModel starts in loading state" time="0.016">
    </testcase>
    <testcase classname="useProfileViewModel fetches and exposes profile data on mount" name="useProfileViewModel fetches and exposes profile data on mount" time="0.005">
    </testcase>
    <testcase classname="useProfileViewModel derives primaryName from display_name when set" name="useProfileViewModel derives primaryName from display_name when set" time="0.003">
    </testcase>
    <testcase classname="useProfileViewModel derives primaryName from username when display_name is null" name="useProfileViewModel derives primaryName from username when display_name is null" time="0.004">
    </testcase>
    <testcase classname="useProfileViewModel exposes hosted and attended event lists" name="useProfileViewModel exposes hosted and attended event lists" time="0.005">
    </testcase>
    <testcase classname="useProfileViewModel falls back to New when final_score is missing" name="useProfileViewModel falls back to New when final_score is missing" time="0.002">
    </testcase>
    <testcase classname="useProfileViewModel updates unrated labels when language changes without refetching profile data" name="useProfileViewModel updates unrated labels when language changes without refetching profile data" time="0.002">
    </testcase>
    <testcase classname="useProfileViewModel deduplicates attended events returned by multiple endpoints" name="useProfileViewModel deduplicates attended events returned by multiple endpoints" time="0.002">
    </testcase>
    <testcase classname="useProfileViewModel excludes hosted events from the attended tab" name="useProfileViewModel excludes hosted events from the attended tab" time="0.002">
    </testcase>
    <testcase classname="useProfileViewModel filters ACTIVE events out of the hosted and attended tabs" name="useProfileViewModel filters ACTIVE events out of the hosted and attended tabs" time="0.001">
    </testcase>
    <testcase classname="useProfileViewModel treats zero-value backend end times as missing" name="useProfileViewModel treats zero-value backend end times as missing" time="0.001">
    </testcase>
    <testcase classname="useProfileViewModel sets apiError on API failure" name="useProfileViewModel sets apiError on API failure" time="0.002">
    </testcase>
    <testcase classname="useProfileViewModel sets generic error on unexpected failure" name="useProfileViewModel sets generic error on unexpected failure" time="0.002">
    </testcase>
    <testcase classname="useProfileViewModel sets error when token is null" name="useProfileViewModel sets error when token is null" time="0.003">
    </testcase>
    <testcase classname="useProfileViewModel can refresh profile data" name="useProfileViewModel can refresh profile data" time="0.002">
    </testcase>
    <testcase classname="useProfileViewModel keeps profile usable when invitations fail to load" name="useProfileViewModel keeps profile usable when invitations fail to load" time="0.001">
    </testcase>
    <testcase classname="useProfileViewModel handles accepting an invitation from profile" name="useProfileViewModel handles accepting an invitation from profile" time="0.001">
    </testcase>
    <testcase classname="useProfileViewModel handles declining an invitation from profile" name="useProfileViewModel handles declining an invitation from profile" time="0.001">
    </testcase>
    <testcase classname="useProfileViewModel handles equipment addition" name="useProfileViewModel handles equipment addition" time="0.002">
    </testcase>
    <testcase classname="useProfileViewModel handles equipment editing" name="useProfileViewModel handles equipment editing" time="0.004">
    </testcase>
    <testcase classname="useProfileViewModel handles equipment deletion" name="useProfileViewModel handles equipment deletion" time="0.001">
    </testcase>
    <testcase classname="useProfileViewModel handles showcase image deletion" name="useProfileViewModel handles showcase image deletion" time="0.003">
    </testcase>
  </testsuite>
  <testsuite name="useCreateEventViewModel" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:19" time="3.946" tests="100">
    <testcase classname="useCreateEventViewModel starts with today as the default start date and no errors" name="useCreateEventViewModel starts with today as the default start date and no errors" time="0.014">
    </testcase>
    <testcase classname="useCreateEventViewModel title validation shows error when title is empty" name="useCreateEventViewModel title validation shows error when title is empty" time="0.004">
    </testcase>
    <testcase classname="useCreateEventViewModel title validation shows error when title is shorter than 10 characters" name="useCreateEventViewModel title validation shows error when title is shorter than 10 characters" time="0.006">
    </testcase>
    <testcase classname="useCreateEventViewModel title validation accepts title with exactly 10 characters" name="useCreateEventViewModel title validation accepts title with exactly 10 characters" time="0.004">
    </testcase>
    <testcase classname="useCreateEventViewModel description validation shows error when description is empty" name="useCreateEventViewModel description validation shows error when description is empty" time="0.007">
    </testcase>
    <testcase classname="useCreateEventViewModel description validation shows error when description is shorter than 20 characters" name="useCreateEventViewModel description validation shows error when description is shorter than 20 characters" time="0.008">
    </testcase>
    <testcase classname="useCreateEventViewModel start date validation shows time validation immediately while typing an invalid hour" name="useCreateEventViewModel start date validation shows time validation immediately while typing an invalid hour" time="0.005">
    </testcase>
    <testcase classname="useCreateEventViewModel start date validation shows date validation immediately when an impossible day is entered" name="useCreateEventViewModel start date validation shows date validation immediately when an impossible day is entered" time="0.004">
    </testcase>
    <testcase classname="useCreateEventViewModel start date validation shows error on both fields when start date and time are missing" name="useCreateEventViewModel start date validation shows error on both fields when start date and time are missing" time="0.005">
    </testcase>
    <testcase classname="useCreateEventViewModel start date validation shows error only on date when start date is missing but time is set" name="useCreateEventViewModel start date validation shows error only on date when start date is missing but time is set" time="0.004">
    </testcase>
    <testcase classname="useCreateEventViewModel start date validation shows error when start date is in the past" name="useCreateEventViewModel start date validation shows error when start date is in the past" time="0.001">
    </testcase>
    <testcase classname="useCreateEventViewModel start date validation accepts a future start date" name="useCreateEventViewModel start date validation accepts a future start date" time="0.001">
    </testcase>
    <testcase classname="useCreateEventViewModel start date validation rejects invalid day and time independently (35.21.2030 with 28:00 — example from issue)" name="useCreateEventViewModel start date validation rejects invalid day and time independently (35.21.2030 with 28:00 — example from issue)" time="0.001">
    </testcase>
    <testcase classname="useCreateEventViewModel start date validation rejects out-of-range day (35) — only date box is red" name="useCreateEventViewModel start date validation rejects out-of-range day (35) — only date box is red" time="0.001">
    </testcase>
    <testcase classname="useCreateEventViewModel start date validation rejects out-of-range month (21) — only date box is red" name="useCreateEventViewModel start date validation rejects out-of-range month (21) — only date box is red" time="0.002">
    </testcase>
    <testcase classname="useCreateEventViewModel start date validation rejects out-of-range hour (28:00) — only time box is red" name="useCreateEventViewModel start date validation rejects out-of-range hour (28:00) — only time box is red" time="0">
    </testcase>
    <testcase classname="useCreateEventViewModel start date validation rejects out-of-range minute (10:70) — only time box is red" name="useCreateEventViewModel start date validation rejects out-of-range minute (10:70) — only time box is red" time="0.001">
    </testcase>
    <testcase classname="useCreateEventViewModel start date validation rejects impossible calendar date (30.02.2030) — only date box is red" name="useCreateEventViewModel start date validation rejects impossible calendar date (30.02.2030) — only date box is red" time="0.002">
    </testcase>
    <testcase classname="useCreateEventViewModel end date validation shows end date error immediately when end time becomes earlier than start" name="useCreateEventViewModel end date validation shows end date error immediately when end time becomes earlier than start" time="0.001">
    </testcase>
    <testcase classname="useCreateEventViewModel end date validation shows error on date when end date is before start date" name="useCreateEventViewModel end date validation shows error on date when end date is before start date" time="0.002">
    </testcase>
    <testcase classname="useCreateEventViewModel end date validation clears end date error when end date is updated" name="useCreateEventViewModel end date validation clears end date error when end date is updated" time="0.002">
    </testcase>
    <testcase classname="useCreateEventViewModel end date validation clears end date error when end time is updated" name="useCreateEventViewModel end date validation clears end date error when end time is updated" time="0.003">
    </testcase>
    <testcase classname="useCreateEventViewModel error clearing clears start date error when start date is updated" name="useCreateEventViewModel error clearing clears start date error when start date is updated" time="0.003">
    </testcase>
    <testcase classname="useCreateEventViewModel error clearing clears location error when location query is updated" name="useCreateEventViewModel error clearing clears location error when location query is updated" time="0.003">
    </testcase>
    <testcase classname="useCreateEventViewModel capacity constraint shows error when capacity is less than 2" name="useCreateEventViewModel capacity constraint shows error when capacity is less than 2" time="0.003">
    </testcase>
    <testcase classname="useCreateEventViewModel capacity constraint shows error when capacity is 0" name="useCreateEventViewModel capacity constraint shows error when capacity is 0" time="0.001">
    </testcase>
    <testcase classname="useCreateEventViewModel capacity constraint shows error when capacity is negative" name="useCreateEventViewModel capacity constraint shows error when capacity is negative" time="0.001">
    </testcase>
    <testcase classname="useCreateEventViewModel capacity constraint accepts capacity of 2" name="useCreateEventViewModel capacity constraint accepts capacity of 2" time="0.002">
    </testcase>
    <testcase classname="useCreateEventViewModel capacity constraint accepts large capacity value" name="useCreateEventViewModel capacity constraint accepts large capacity value" time="0.001">
    </testcase>
    <testcase classname="useCreateEventViewModel age constraint shows error when min age is greater than max age" name="useCreateEventViewModel age constraint shows error when min age is greater than max age" time="0.001">
    </testcase>
    <testcase classname="useCreateEventViewModel age constraint shows error when age is out of range (&gt;120)" name="useCreateEventViewModel age constraint shows error when age is out of range (&gt;120)" time="0">
    </testcase>
    <testcase classname="useCreateEventViewModel age constraint shows error when age is negative" name="useCreateEventViewModel age constraint shows error when age is negative" time="0.003">
    </testcase>
    <testcase classname="useCreateEventViewModel age constraint accepts valid age range" name="useCreateEventViewModel age constraint accepts valid age range" time="0.001">
    </testcase>
    <testcase classname="useCreateEventViewModel age constraint accepts min-only age (18+)" name="useCreateEventViewModel age constraint accepts min-only age (18+)" time="0.001">
    </testcase>
    <testcase classname="useCreateEventViewModel constraint limits allows up to 5 total constraints" name="useCreateEventViewModel constraint limits allows up to 5 total constraints" time="0.004">
    </testcase>
    <testcase classname="useCreateEventViewModel constraint limits prevents adding more than max total constraints" name="useCreateEventViewModel constraint limits prevents adding more than max total constraints" time="0.004">
    </testcase>
    <testcase classname="useCreateEventViewModel constraint limits allows more than 2 other constraints when slots are available" name="useCreateEventViewModel constraint limits allows more than 2 other constraints when slots are available" time="0.002">
    </testcase>
    <testcase classname="useCreateEventViewModel constraint limits only allows 1 gender constraint" name="useCreateEventViewModel constraint limits only allows 1 gender constraint" time="0.002">
    </testcase>
    <testcase classname="useCreateEventViewModel tags adds a tag" name="useCreateEventViewModel tags adds a tag" time="0.003">
    </testcase>
    <testcase classname="useCreateEventViewModel tags does not add duplicate tags" name="useCreateEventViewModel tags does not add duplicate tags" time="0.002">
    </testcase>
    <testcase classname="useCreateEventViewModel tags limits to 5 tags" name="useCreateEventViewModel tags limits to 5 tags" time="0.004">
    </testcase>
    <testcase classname="useCreateEventViewModel tags removes a tag by index" name="useCreateEventViewModel tags removes a tag by index" time="0.002">
    </testcase>
    <testcase classname="useCreateEventViewModel submission calls createEvent and returns result on valid form" name="useCreateEventViewModel submission calls createEvent and returns result on valid form" time="0.001">
    </testcase>
    <testcase classname="useCreateEventViewModel submission uploads the selected image through the backend flow after event creation" name="useCreateEventViewModel submission uploads the selected image through the backend flow after event creation" time="0.002">
    </testcase>
    <testcase classname="useCreateEventViewModel submission shows a clear image error when upload fails after event creation" name="useCreateEventViewModel submission shows a clear image error when upload fails after event creation" time="0.001">
    </testcase>
    <testcase classname="useCreateEventViewModel submission shows a user-friendly message when the image upload network request fails" name="useCreateEventViewModel submission shows a user-friendly message when the image upload network request fails" time="0.002">
    </testcase>
    <testcase classname="useCreateEventViewModel submission does not call API when validation fails" name="useCreateEventViewModel submission does not call API when validation fails" time="0.001">
    </testcase>
    <testcase classname="useCreateEventViewModel submission sets apiError on API failure" name="useCreateEventViewModel submission sets apiError on API failure" time="0.002">
    </testcase>
    <testcase classname="useCreateEventViewModel submission sets generic apiError on unexpected error" name="useCreateEventViewModel submission sets generic apiError on unexpected error" time="0.002">
    </testcase>
    <testcase classname="useCreateEventViewModel submission maps API field errors to form errors" name="useCreateEventViewModel submission maps API field errors to form errors" time="0.003">
    </testcase>
    <testcase classname="useCreateEventViewModel location searches location suggestions with debounce" name="useCreateEventViewModel location searches location suggestions with debounce" time="0.001">
    </testcase>
    <testcase classname="useCreateEventViewModel location selects a location from suggestions" name="useCreateEventViewModel location selects a location from suggestions" time="0.002">
    </testcase>
    <testcase classname="useCreateEventViewModel location clears location" name="useCreateEventViewModel location clears location" time="0.001">
    </testcase>
    <testcase classname="useCreateEventViewModel does not include PRIVATE in privacy options" name="useCreateEventViewModel does not include PRIVATE in privacy options" time="0">
    </testcase>
    <testcase classname="useCreateEventViewModel image picking tries safer URI variants and stores a prepared preview image for Android-style picker paths" name="useCreateEventViewModel image picking tries safer URI variants and stores a prepared preview image for Android-style picker paths" time="0.003">
    </testcase>
    <testcase classname="useCreateEventViewModel image picking shows an inline error when the selected image cannot be processed" name="useCreateEventViewModel image picking shows an inline error when the selected image cannot be processed" time="0">
    </testcase>
    <testcase classname="useCreateEventViewModel image picking shows an inline error and alert when photo permission is denied" name="useCreateEventViewModel image picking shows an inline error and alert when photo permission is denied" time="0.002">
    </testcase>
    <testcase classname="formatDateInput auto-inserts dot after day and month while typing digits" name="formatDateInput auto-inserts dot after day and month while typing digits" time="0">
    </testcase>
    <testcase classname="formatDateInput limits to dd.mm.yyyy (8 digits)" name="formatDateInput limits to dd.mm.yyyy (8 digits)" time="0">
    </testcase>
    <testcase classname="formatDateInput formats when deleting digits" name="formatDateInput formats when deleting digits" time="0">
    </testcase>
    <testcase classname="formatDateInput strips non-digit characters" name="formatDateInput strips non-digit characters" time="0">
    </testcase>
    <testcase classname="formatTimeInput auto-inserts colon after 2 digits" name="formatTimeInput auto-inserts colon after 2 digits" time="0">
    </testcase>
    <testcase classname="formatTimeInput does not auto-insert colon when deleting" name="formatTimeInput does not auto-insert colon when deleting" time="0">
    </testcase>
    <testcase classname="formatTimeInput strips non-digit non-colon characters and auto-formats" name="formatTimeInput strips non-digit non-colon characters and auto-formats" time="0">
    </testcase>
    <testcase classname="formatTimeInput limits to 5 characters" name="formatTimeInput limits to 5 characters" time="0">
    </testcase>
    <testcase classname="formatTimeInput passes through valid partial input" name="formatTimeInput passes through valid partial input" time="0.001">
    </testcase>
    <testcase classname="validateLiveDateInput does not show an error for partial valid input" name="validateLiveDateInput does not show an error for partial valid input" time="0">
    </testcase>
    <testcase classname="validateLiveDateInput shows an immediate error when day is out of range" name="validateLiveDateInput shows an immediate error when day is out of range" time="0">
    </testcase>
    <testcase classname="validateLiveDateInput shows an immediate error when month is out of range" name="validateLiveDateInput shows an immediate error when month is out of range" time="0">
    </testcase>
    <testcase classname="validateLiveDateInput uses full date validation when the date is complete" name="validateLiveDateInput uses full date validation when the date is complete" time="0">
    </testcase>
    <testcase classname="validateLiveTimeInput does not show an error for partial valid input" name="validateLiveTimeInput does not show an error for partial valid input" time="0">
    </testcase>
    <testcase classname="validateLiveTimeInput shows an immediate error when hour is out of range" name="validateLiveTimeInput shows an immediate error when hour is out of range" time="0">
    </testcase>
    <testcase classname="validateLiveTimeInput shows an immediate error when minute is out of range" name="validateLiveTimeInput shows an immediate error when minute is out of range" time="0">
    </testcase>
    <testcase classname="validateLiveTimeInput uses full time validation when the time is complete" name="validateLiveTimeInput uses full time validation when the time is complete" time="0">
    </testcase>
    <testcase classname="validateLiveTimeInput route mode starts with locationType POINT and an empty routePoints array" name="validateLiveTimeInput route mode starts with locationType POINT and an empty routePoints array" time="0.001">
    </testcase>
    <testcase classname="validateLiveTimeInput route mode switches to ROUTE mode and clears the point fields" name="validateLiveTimeInput route mode switches to ROUTE mode and clears the point fields" time="0.001">
    </testcase>
    <testcase classname="validateLiveTimeInput route mode switching back to POINT clears any added route points" name="validateLiveTimeInput route mode switching back to POINT clears any added route points" time="0">
    </testcase>
    <testcase classname="validateLiveTimeInput route mode appends a waypoint via addRoutePointFromCoordinate" name="validateLiveTimeInput route mode appends a waypoint via addRoutePointFromCoordinate" time="0.001">
    </testcase>
    <testcase classname="validateLiveTimeInput route mode appends a waypoint via addRoutePointFromSuggestion" name="validateLiveTimeInput route mode appends a waypoint via addRoutePointFromSuggestion" time="0">
    </testcase>
    <testcase classname="validateLiveTimeInput route mode ignores suggestions with non-numeric coordinates" name="validateLiveTimeInput route mode ignores suggestions with non-numeric coordinates" time="0">
    </testcase>
    <testcase classname="validateLiveTimeInput route mode removes a waypoint by index" name="validateLiveTimeInput route mode removes a waypoint by index" time="0.001">
    </testcase>
    <testcase classname="validateLiveTimeInput route mode moves a waypoint up with moveRoutePoint(idx, -1)" name="validateLiveTimeInput route mode moves a waypoint up with moveRoutePoint(idx, -1)" time="0.001">
    </testcase>
    <testcase classname="validateLiveTimeInput route mode moves a waypoint down with moveRoutePoint(idx, 1)" name="validateLiveTimeInput route mode moves a waypoint down with moveRoutePoint(idx, 1)" time="0">
    </testcase>
    <testcase classname="validateLiveTimeInput route mode does not crash when moving a waypoint past the boundary" name="validateLiveTimeInput route mode does not crash when moving a waypoint past the boundary" time="0.001">
    </testcase>
    <testcase classname="validateLiveTimeInput route mode shows a validation error when submitting a ROUTE event with fewer than 2 waypoints" name="validateLiveTimeInput route mode shows a validation error when submitting a ROUTE event with fewer than 2 waypoints" time="0.001">
    </testcase>
    <testcase classname="validateLiveTimeInput route mode submits a ROUTE event with route_points and no lat/lon" name="validateLiveTimeInput route mode submits a ROUTE event with route_points and no lat/lon" time="0.003">
    </testcase>
    <testcase classname="validateLiveTimeInput route mode auto-derives address for a ROUTE event when none was typed" name="validateLiveTimeInput route mode auto-derives address for a ROUTE event when none was typed" time="0.002">
    </testcase>
    <testcase classname="validateLiveTimeInput route mode falls back to coordinates when route waypoint labels are not yet resolved" name="validateLiveTimeInput route mode falls back to coordinates when route waypoint labels are not yet resolved" time="0.001">
    </testcase>
    <testcase classname="validateLiveTimeInput route mode updateRoutePointLabel updates the label of an existing waypoint" name="validateLiveTimeInput route mode updateRoutePointLabel updates the label of an existing waypoint" time="0.005">
    </testcase>
    <testcase classname="validateLiveTimeInput route mode updateRoutePointLabel is a no-op for out-of-range indices" name="validateLiveTimeInput route mode updateRoutePointLabel is a no-op for out-of-range indices" time="0">
    </testcase>
    <testcase classname="validateLiveTimeInput route mode setPointFromCoordinate sets lat/lon and address synchronously" name="validateLiveTimeInput route mode setPointFromCoordinate sets lat/lon and address synchronously" time="0.001">
    </testcase>
    <testcase classname="validateLiveTimeInput route mode setPointFromCoordinate without a label keeps any previously typed query" name="validateLiveTimeInput route mode setPointFromCoordinate without a label keeps any previously typed query" time="0">
    </testcase>
    <testcase classname="validateLiveTimeInput route mode submits a POINT event without route_points" name="validateLiveTimeInput route mode submits a POINT event without route_points" time="0.003">
    </testcase>
    <testcase classname="deriveRouteAddress returns empty string for an empty waypoint list" name="deriveRouteAddress returns empty string for an empty waypoint list" time="0">
    </testcase>
    <testcase classname="deriveRouteAddress uses the first comma-segment of single-waypoint label" name="deriveRouteAddress uses the first comma-segment of single-waypoint label" time="0">
    </testcase>
    <testcase classname="deriveRouteAddress joins first and last waypoint short labels with an arrow" name="deriveRouteAddress joins first and last waypoint short labels with an arrow" time="0.001">
    </testcase>
    <testcase classname="deriveRouteAddress falls back to lat/lon when no label is present" name="deriveRouteAddress falls back to lat/lon when no label is present" time="0.001">
    </testcase>
    <testcase classname="deriveRouteAddress collapses to one segment when first and last short labels match" name="deriveRouteAddress collapses to one segment when first and last short labels match" time="0">
    </testcase>
    <testcase classname="normalizePickedImageUri fully decodes Android file URIs until they reach a filesystem path" name="normalizePickedImageUri fully decodes Android file URIs until they reach a filesystem path" time="0">
    </testcase>
    <testcase classname="normalizePickedImageUri leaves non-encoded file URIs unchanged" name="normalizePickedImageUri leaves non-encoded file URIs unchanged" time="0">
    </testcase>
  </testsuite>
  <testsuite name="EventMapView" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:19" time="4.079" tests="29">
    <testcase classname="EventMapView loading state renders a loading indicator and hides the map surface" name="EventMapView loading state renders a loading indicator and hides the map surface" time="0.027">
    </testcase>
    <testcase classname="EventMapView error state renders the error message and hides the map surface" name="EventMapView error state renders the error message and hides the map surface" time="0.015">
    </testcase>
    <testcase classname="EventMapView empty state shows the map surface and the empty overlay when no events have coordinates" name="EventMapView empty state shows the map surface and the empty overlay when no events have coordinates" time="0.012">
    </testcase>
    <testcase classname="EventMapView empty state shows the empty overlay when the events list is empty" name="EventMapView empty state shows the empty overlay when the events list is empty" time="0.006">
    </testcase>
    <testcase classname="EventMapView marker rendering renders a marker for each event that has valid coordinates" name="EventMapView marker rendering renders a marker for each event that has valid coordinates" time="0.03">
    </testcase>
    <testcase classname="EventMapView marker rendering does not show the empty overlay when at least one event has coordinates" name="EventMapView marker rendering does not show the empty overlay when at least one event has coordinates" time="0.008">
    </testcase>
    <testcase classname="EventMapView marker rendering displays the event title in the native callout after a marker is selected" name="EventMapView marker rendering displays the event title in the native callout after a marker is selected" time="0.015">
    </testcase>
    <testcase classname="EventMapView marker rendering uses a category-colored emoji marker for events" name="EventMapView marker rendering uses a category-colored emoji marker for events" time="0.012">
    </testcase>
    <testcase classname="EventMapView marker rendering keeps iOS event marker view tracking disabled after selection" name="EventMapView marker rendering keeps iOS event marker view tracking disabled after selection" time="0.011">
    </testcase>
    <testcase classname="EventMapView marker rendering lets Android marker tracking settle after the first native snapshot" name="EventMapView marker rendering lets Android marker tracking settle after the first native snapshot" time="0.008">
    </testcase>
    <testcase classname="EventMapView marker rendering clusters events that are geographically very close at the current zoom" name="EventMapView marker rendering clusters events that are geographically very close at the current zoom" time="0.004">
    </testcase>
    <testcase classname="EventMapView marker rendering splits nearby clusters as the map zooms in" name="EventMapView marker rendering splits nearby clusters as the map zooms in" time="0.011">
    </testcase>
    <testcase classname="EventMapView marker rendering zooms toward a cluster when the cluster marker is pressed" name="EventMapView marker rendering zooms toward a cluster when the cluster marker is pressed" time="0.004">
    </testcase>
    <testcase classname="EventMapView marker rendering shows participant count and capacity when both are present" name="EventMapView marker rendering shows participant count and capacity when both are present" time="0.011">
    </testcase>
    <testcase classname="EventMapView marker rendering shows participant count without capacity when capacity is not set" name="EventMapView marker rendering shows participant count without capacity when capacity is not set" time="0.011">
    </testcase>
    <testcase classname="EventMapView location overlays draws the active filter radius as a dashed boundary around the filter center" name="EventMapView location overlays draws the active filter radius as a dashed boundary around the filter center" time="0.008">
    </testcase>
    <testcase classname="EventMapView location overlays shows current location controls when live location is available" name="EventMapView location overlays shows current location controls when live location is available" time="0.011">
    </testcase>
    <testcase classname="EventMapView location overlays centers the map on current location when the locate button is pressed" name="EventMapView location overlays centers the map on current location when the locate button is pressed" time="0.008">
    </testcase>
    <testcase classname="EventMapView location overlays shows search this area after the map center moves away from the filter center" name="EventMapView location overlays shows search this area after the map center moves away from the filter center" time="0.007">
    </testcase>
    <testcase classname="EventMapView navigation calls onMarkerPress with the event id when the callout is pressed" name="EventMapView navigation calls onMarkerPress with the event id when the callout is pressed" time="0.008">
    </testcase>
    <testcase classname="EventMapView navigation opens event details from the Android overlay callout" name="EventMapView navigation opens event details from the Android overlay callout" time="0.009">
    </testcase>
    <testcase classname="EventMapView callout content shows category name in the native callout" name="EventMapView callout content shows category name in the native callout" time="0.014">
    </testcase>
    <testcase classname="EventMapView callout content shows location address when present" name="EventMapView callout content shows location address when present" time="0.009">
    </testcase>
    <testcase classname="EventMapView callout content localizes the callout details hint" name="EventMapView callout content localizes the callout details hint" time="0.011">
    </testcase>
    <testcase classname="EventMapView callout content shows a small event image in the native callout when available" name="EventMapView callout content shows a small event image in the native callout when available" time="0.014">
    </testcase>
    <testcase classname="EventMapView callout content falls back to the category placeholder when image prefetch fails" name="EventMapView callout content falls back to the category placeholder when image prefetch fails" time="0.017">
    </testcase>
    <testcase classname="EventMapView callout content falls back to the category placeholder when the callout image fails" name="EventMapView callout content falls back to the category placeholder when the callout image fails" time="0.014">
    </testcase>
    <testcase classname="EventMapView callout content uses a category placeholder when the callout has no image" name="EventMapView callout content uses a category placeholder when the callout has no image" time="0.008">
    </testcase>
    <testcase classname="EventMapView callout content omits location line when address is not set" name="EventMapView callout content omits location line when address is not set" time="0.008">
    </testcase>
  </testsuite>
  <testsuite name="EventDetailView" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:19" time="4.21" tests="19">
    <testcase classname="EventDetailView shows the pending join-request chip and hides the request button" name="EventDetailView shows the pending join-request chip and hides the request button" time="0.076">
    </testcase>
    <testcase classname="EventDetailView shows version history and reconfirm action when attendance needs reconfirmation" name="EventDetailView shows version history and reconfirm action when attendance needs reconfirmation" time="0.043">
    </testcase>
    <testcase classname="EventDetailView lets viewers reject attendance reconfirmation by leaving the event" name="EventDetailView lets viewers reject attendance reconfirmation by leaving the event" time="0.024">
    </testcase>
    <testcase classname="EventDetailView renders an empty version-history state when no changes need review" name="EventDetailView renders an empty version-history state when no changes need review" time="0.015">
    </testcase>
    <testcase classname="EventDetailView renders hero badges in a horizontally scrollable strip" name="EventDetailView renders hero badges in a horizontally scrollable strip" time="0.015">
    </testcase>
    <testcase classname="EventDetailView hides version history from viewers who are not attending or pending" name="EventDetailView hides version history from viewers who are not attending or pending" time="0.01">
    </testcase>
    <testcase classname="EventDetailView lets hosts open the edit event flow from event detail" name="EventDetailView lets hosts open the edit event flow from event detail" time="0.016">
    </testcase>
    <testcase classname="EventDetailView shows the localized inaccessible state when apiError mentions private events" name="EventDetailView shows the localized inaccessible state when apiError mentions private events" time="0.002">
    </testcase>
    <testcase classname="EventDetailView hides the Invite &amp; Manage button for non-host users on private events" name="EventDetailView hides the Invite &amp; Manage button for non-host users on private events" time="0.011">
    </testcase>
    <testcase classname="EventDetailView renders the map and Get Directions button when location coordinates are available" name="EventDetailView renders the map and Get Directions button when location coordinates are available" time="0.012">
    </testcase>
    <testcase classname="EventDetailView does not render the map when location coordinates are missing" name="EventDetailView does not render the map when location coordinates are missing" time="0.015">
    </testcase>
    <testcase classname="EventDetailView shows approximate-location banner and hides Get Directions for PROTECTED non-participant" name="EventDetailView shows approximate-location banner and hides Get Directions for PROTECTED non-participant" time="0.014">
    </testcase>
    <testcase classname="EventDetailView hides the approximate-location callout and shows Get Directions for an approved participant" name="EventDetailView hides the approximate-location callout and shows Get Directions for an approved participant" time="0.011">
    </testcase>
    <testcase classname="EventDetailView hides approximate-location callout for the event host" name="EventDetailView hides approximate-location callout for the event host" time="0.011">
    </testcase>
    <testcase classname="EventDetailView shows approximate-location callout for a pending-request viewer" name="EventDetailView shows approximate-location callout for a pending-request viewer" time="0.014">
    </testcase>
    <testcase classname="EventDetailView renders meeting instructions when available" name="EventDetailView renders meeting instructions when available" time="0.012">
    </testcase>
    <testcase classname="EventDetailView shows accept and decline actions for invited users" name="EventDetailView shows accept and decline actions for invited users" time="0.012">
    </testcase>
    <testcase classname="EventDetailView renders a Directions to Start button and a Route chip for ROUTE events" name="EventDetailView renders a Directions to Start button and a Route chip for ROUTE events" time="0.015">
    </testcase>
    <testcase classname="EventDetailView does not render the map for a ROUTE event with no waypoints" name="EventDetailView does not render the map for a ROUTE event with no waypoints" time="0.019">
    </testcase>
  </testsuite>
  <testsuite name="CreateEventView" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:23" time="0.314" tests="9">
    <testcase classname="CreateEventView renders picker-based date and time controls with image upload messaging" name="CreateEventView renders picker-based date and time controls with image upload messaging" time="0.055">
    </testcase>
    <testcase classname="CreateEventView lets Android handle keyboard resizing without shrinking the React tree" name="CreateEventView lets Android handle keyboard resizing without shrinking the React tree" time="0.016">
    </testcase>
    <testcase classname="CreateEventView opens the start pickers and allows today as the minimum date" name="CreateEventView opens the start pickers and allows today as the minimum date" time="0.035">
    </testcase>
    <testcase classname="CreateEventView uses the selected start date as the inclusive minimum for end date picker" name="CreateEventView uses the selected start date as the inclusive minimum for end date picker" time="0.024">
    </testcase>
    <testcase classname="CreateEventView clears optional end date and time together from the screen action" name="CreateEventView clears optional end date and time together from the screen action" time="0.016">
    </testcase>
    <testcase classname="CreateEventView renders correct helper text for each privacy level" name="CreateEventView renders correct helper text for each privacy level" time="0.041">
    </testcase>
    <testcase classname="CreateEventView allows toggling audience attributes" name="CreateEventView allows toggling audience attributes" time="0.017">
    </testcase>
    <testcase classname="CreateEventView returns to the previous screen after creating an event successfully" name="CreateEventView returns to the previous screen after creating an event successfully" time="0.026">
    </testcase>
    <testcase classname="CreateEventView falls back to home after creation when there is no previous screen" name="CreateEventView falls back to home after creation when there is no previous screen" time="0.022">
    </testcase>
  </testsuite>
  <testsuite name="useEditProfileViewModel" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:23" time="0.119" tests="21">
    <testcase classname="useEditProfileViewModel starts in loading state" name="useEditProfileViewModel starts in loading state" time="0.003">
    </testcase>
    <testcase classname="useEditProfileViewModel populates form fields from fetched profile" name="useEditProfileViewModel populates form fields from fetched profile" time="0.002">
    </testcase>
    <testcase classname="useEditProfileViewModel populates empty strings when profile fields are null" name="useEditProfileViewModel populates empty strings when profile fields are null" time="0.001">
    </testcase>
    <testcase classname="useEditProfileViewModel updates default location from location search selection" name="useEditProfileViewModel updates default location from location search selection" time="0.002">
    </testcase>
    <testcase classname="useEditProfileViewModel saves the raw display_name of a detailed location selection" name="useEditProfileViewModel saves the raw display_name of a detailed location selection" time="0.004">
    </testcase>
    <testcase classname="useEditProfileViewModel clears the selected default location" name="useEditProfileViewModel clears the selected default location" time="0.002">
    </testcase>
    <testcase classname="useEditProfileViewModel picks an avatar image from the photo library" name="useEditProfileViewModel picks an avatar image from the photo library" time="0.002">
    </testcase>
    <testcase classname="useEditProfileViewModel uploads avatar on save when a new local image is selected" name="useEditProfileViewModel uploads avatar on save when a new local image is selected" time="0.005">
    </testcase>
    <testcase classname="useEditProfileViewModel omits locked gender and birth date from the update payload" name="useEditProfileViewModel omits locked gender and birth date from the update payload" time="0.002">
    </testcase>
    <testcase classname="useEditProfileViewModel updates a field and clears its error" name="useEditProfileViewModel updates a field and clears its error" time="0.001">
    </testcase>
    <testcase classname="useEditProfileViewModel validates birth date format on save" name="useEditProfileViewModel validates birth date format on save" time="0.002">
    </testcase>
    <testcase classname="useEditProfileViewModel triggers immediate error for day &gt; 31" name="useEditProfileViewModel triggers immediate error for day &gt; 31" time="0.006">
    </testcase>
    <testcase classname="useEditProfileViewModel triggers immediate error for month &gt; 12" name="useEditProfileViewModel triggers immediate error for month &gt; 12" time="0.002">
    </testcase>
    <testcase classname="useEditProfileViewModel validates month limit (1–12)" name="useEditProfileViewModel validates month limit (1–12)" time="0.002">
    </testcase>
    <testcase classname="useEditProfileViewModel validates future date limit" name="useEditProfileViewModel validates future date limit" time="0.001">
    </testcase>
    <testcase classname="useEditProfileViewModel validates birth date in real-time when 10 characters are reached" name="useEditProfileViewModel validates birth date in real-time when 10 characters are reached" time="0.001">
    </testcase>
    <testcase classname="useEditProfileViewModel auto-formats birth date typing into dd.mm.yyyy" name="useEditProfileViewModel auto-formats birth date typing into dd.mm.yyyy" time="0.001">
    </testcase>
    <testcase classname="useEditProfileViewModel calls updateMyProfile with correct data on valid save" name="useEditProfileViewModel calls updateMyProfile with correct data on valid save" time="0.001">
    </testcase>
    <testcase classname="useEditProfileViewModel sends empty strings for text fields and null for enums/dates" name="useEditProfileViewModel sends empty strings for text fields and null for enums/dates" time="0">
    </testcase>
    <testcase classname="useEditProfileViewModel sets apiError on save failure" name="useEditProfileViewModel sets apiError on save failure" time="0.002">
    </testcase>
    <testcase classname="useEditProfileViewModel sets error when token is null" name="useEditProfileViewModel sets error when token is null" time="0.001">
    </testcase>
  </testsuite>
  <testsuite name="EditEventView" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:23" time="0.241" tests="4">
    <testcase classname="EditEventView renders the current event values in the supported edit form" name="EditEventView renders the current event values in the supported edit form" time="0.026">
    </testcase>
    <testcase classname="EditEventView lets hosts choose a cover image from the edit form" name="EditEventView lets hosts choose a cover image from the edit form" time="0.018">
    </testcase>
    <testcase classname="EditEventView shows confirmation for critical updates and navigates to refreshed detail on success" name="EditEventView shows confirmation for critical updates and navigates to refreshed detail on success" time="0.098">
    </testcase>
    <testcase classname="EditEventView communicates API failures in the edit screen" name="EditEventView communicates API failures in the edit screen" time="0.013">
    </testcase>
  </testsuite>
  <testsuite name="ProfileView" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:23" time="0.133" tests="3">
    <testcase classname="ProfileView renders invitations as a profile section with actions" name="ProfileView renders invitations as a profile section with actions" time="0.022">
    </testcase>
    <testcase classname="ProfileView previews only one invitation on profile and links to the full invitations page" name="ProfileView previews only one invitation on profile and links to the full invitations page" time="0.019">
    </testcase>
    <testcase classname="ProfileView dismisses the keyboard when tapping the equipment modal surface" name="ProfileView dismisses the keyboard when tapping the equipment modal surface" time="0.029">
    </testcase>
  </testsuite>
  <testsuite name="host management sheets" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:23" time="0.071" tests="2">
    <testcase classname="host management sheets renders join request management labels from i18n" name="host management sheets renders join request management labels from i18n" time="0.007">
    </testcase>
    <testcase classname="host management sheets renders invitation management labels from i18n" name="host management sheets renders invitation management labels from i18n" time="0.012">
    </testcase>
  </testsuite>
  <testsuite name="FiltersBottomSheet" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:23" time="0.094" tests="3">
    <testcase classname="FiltersBottomSheet renders the frontend sort options" name="FiltersBottomSheet renders the frontend sort options" time="0.011">
    </testcase>
    <testcase classname="FiltersBottomSheet shows the selected sort option and calls back when another one is pressed" name="FiltersBottomSheet shows the selected sort option and calls back when another one is pressed" time="0.015">
    </testcase>
    <testcase classname="FiltersBottomSheet allows toggling audience filters" name="FiltersBottomSheet allows toggling audience filters" time="0.016">
    </testcase>
  </testsuite>
  <testsuite name="TicketScanView" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:24" time="0.087" tests="6">
    <testcase classname="TicketScanView renders the loading state" name="TicketScanView renders the loading state" time="0.003">
    </testcase>
    <testcase classname="TicketScanView renders an open failure with retry and back actions" name="TicketScanView renders an open failure with retry and back actions" time="0.003">
    </testcase>
    <testcase classname="TicketScanView blocks non-hosts from the scanner UI" name="TicketScanView blocks non-hosts from the scanner UI" time="0.002">
    </testcase>
    <testcase classname="TicketScanView renders a camera permission prompt and requests permission" name="TicketScanView renders a camera permission prompt and requests permission" time="0.006">
    </testcase>
    <testcase classname="TicketScanView submits scanned QR data and pauses duplicate scan callbacks" name="TicketScanView submits scanned QR data and pauses duplicate scan callbacks" time="0.008">
    </testcase>
    <testcase classname="TicketScanView shows an accepted scan result and clears it when scanning another ticket" name="TicketScanView shows an accepted scan result and clears it when scanning another ticket" time="0.008">
    </testcase>
  </testsuite>
  <testsuite name="useEditEventViewModel" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:23" time="0.295" tests="4">
    <testcase classname="useEditEventViewModel prefills the edit form from the current event detail" name="useEditEventViewModel prefills the edit form from the current event detail" time="0.054">
    </testcase>
    <testcase classname="useEditEventViewModel builds a versioned update request and refreshes the event after saving" name="useEditEventViewModel builds a versioned update request and refreshes the event after saving" time="0.054">
    </testcase>
    <testcase classname="useEditEventViewModel blocks capacity below approved plus pending participants before calling the API" name="useEditEventViewModel blocks capacity below approved plus pending participants before calling the API" time="0.055">
    </testcase>
    <testcase classname="useEditEventViewModel uploads a selected image without patching event fields" name="useEditEventViewModel uploads a selected image without patching event fields" time="0.059">
    </testcase>
  </testsuite>
  <testsuite name="LocationPickerPanel" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:24" time="0.074" tests="5">
    <testcase classname="LocationPickerPanel renders the default option and favorite locations as ready-to-use choices" name="LocationPickerPanel renders the default option and favorite locations as ready-to-use choices" time="0.013">
    </testcase>
    <testcase classname="LocationPickerPanel shows a loading state while favorite locations are being fetched" name="LocationPickerPanel shows a loading state while favorite locations are being fetched" time="0.004">
    </testcase>
    <testcase classname="LocationPickerPanel shows an empty state when the user has no favorite locations" name="LocationPickerPanel shows an empty state when the user has no favorite locations" time="0.003">
    </testcase>
    <testcase classname="LocationPickerPanel shows an error state with retry when favorite locations fail to load" name="LocationPickerPanel shows an error state with retry when favorite locations fail to load" time="0.004">
    </testcase>
    <testcase classname="LocationPickerPanel shows only search results while the user is searching" name="LocationPickerPanel shows only search results while the user is searching" time="0.003">
    </testcase>
  </testsuite>
  <testsuite name="RegisterView" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:24" time="0.165" tests="7">
    <testcase classname="RegisterView renders account details and updates fields from user input" name="RegisterView renders account details and updates fields from user input" time="0.018">
    </testcase>
    <testcase classname="RegisterView lets users clear a selected gender chip" name="RegisterView lets users clear a selected gender chip" time="0.006">
    </testcase>
    <testcase classname="RegisterView verifies OTP, stores the session, and navigates home" name="RegisterView verifies OTP, stores the session, and navigates home" time="0.055">
    </testcase>
    <testcase classname="RegisterView edits OTP and returns to the details step" name="RegisterView edits OTP and returns to the details step" time="0.004">
    </testcase>
    <testcase classname="RegisterView routes to sign in from details without submitting registration" name="RegisterView routes to sign in from details without submitting registration" time="0.008">
    </testcase>
    <testcase classname="RegisterView does not navigate when OTP verification returns no session" name="RegisterView does not navigate when OTP verification returns no session" time="0.006">
    </testcase>
    <testcase classname="RegisterView disables details controls while registration is loading" name="RegisterView disables details controls while registration is loading" time="0.019">
    </testcase>
  </testsuite>
  <testsuite name="LoginView" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:24" time="0.134" tests="4">
    <testcase classname="LoginView renders validation feedback and lets users edit credentials" name="LoginView renders validation feedback and lets users edit credentials" time="0.007">
    </testcase>
    <testcase classname="LoginView stores the returned session and navigates home after sign in" name="LoginView stores the returned session and navigates home after sign in" time="0.054">
    </testcase>
    <testcase classname="LoginView routes secondary auth actions without submitting" name="LoginView routes secondary auth actions without submitting" time="0.005">
    </testcase>
    <testcase classname="LoginView disables inputs and links while signing in" name="LoginView disables inputs and links while signing in" time="0.02">
    </testcase>
  </testsuite>
  <testsuite name="useEventDiscussionViewModel — initial load" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:23" time="0.986" tests="18">
    <testcase classname="useEventDiscussionViewModel — initial load loads discussion and review comments on mount" name="useEventDiscussionViewModel — initial load loads discussion and review comments on mount" time="0.059">
    </testcase>
    <testcase classname="useEventDiscussionViewModel — initial load passes token to listEventComments" name="useEventDiscussionViewModel — initial load passes token to listEventComments" time="0.003">
    </testcase>
    <testcase classname="useEventDiscussionViewModel — initial load works without a token (unauthenticated)" name="useEventDiscussionViewModel — initial load works without a token (unauthenticated)" time="0.002">
    </testcase>
    <testcase classname="useEventDiscussionViewModel — initial load handles fetch failure gracefully without throwing" name="useEventDiscussionViewModel — initial load handles fetch failure gracefully without throwing" time="0.053">
    </testcase>
    <testcase classname="useEventDiscussionViewModel — pagination appends more discussions on loadMoreDiscussions" name="useEventDiscussionViewModel — pagination appends more discussions on loadMoreDiscussions" time="0.057">
    </testcase>
    <testcase classname="useEventDiscussionViewModel — pagination does not load more when hasNext is false" name="useEventDiscussionViewModel — pagination does not load more when hasNext is false" time="0.054">
    </testcase>
    <testcase classname="useEventDiscussionViewModel — replies loads replies for a parent comment" name="useEventDiscussionViewModel — replies loads replies for a parent comment" time="0.055">
    </testcase>
    <testcase classname="useEventDiscussionViewModel — replies appends more replies on loadMoreReplies" name="useEventDiscussionViewModel — replies appends more replies on loadMoreReplies" time="0.055">
    </testcase>
    <testcase classname="useEventDiscussionViewModel — submitDiscussionComment prepends the new comment to discussions list on success" name="useEventDiscussionViewModel — submitDiscussionComment prepends the new comment to discussions list on success" time="0.054">
    </testcase>
    <testcase classname="useEventDiscussionViewModel — submitDiscussionComment sets discussionError when createDiscussionComment fails" name="useEventDiscussionViewModel — submitDiscussionComment sets discussionError when createDiscussionComment fails" time="0.052">
    </testcase>
    <testcase classname="useEventDiscussionViewModel — submitDiscussionComment does nothing when message is empty" name="useEventDiscussionViewModel — submitDiscussionComment does nothing when message is empty" time="0.054">
    </testcase>
    <testcase classname="useEventDiscussionViewModel — submitDiscussionComment dismissDiscussionError clears the error" name="useEventDiscussionViewModel — submitDiscussionComment dismissDiscussionError clears the error" time="0.055">
    </testcase>
    <testcase classname="useEventDiscussionViewModel — submitReply appends the reply to repliesMap and increments reply_count" name="useEventDiscussionViewModel — submitReply appends the reply to repliesMap and increments reply_count" time="0.054">
    </testcase>
    <testcase classname="useEventDiscussionViewModel — submitReview upserts the review and updates the reviews list" name="useEventDiscussionViewModel — submitReview upserts the review and updates the reviews list" time="0.053">
    </testcase>
    <testcase classname="useEventDiscussionViewModel — submitReview replaces existing review from same user instead of appending" name="useEventDiscussionViewModel — submitReview replaces existing review from same user instead of appending" time="0.054">
    </testcase>
    <testcase classname="useEventDiscussionViewModel — submitReview does nothing when rating is 0" name="useEventDiscussionViewModel — submitReview does nothing when rating is 0" time="0.051">
    </testcase>
    <testcase classname="useEventDiscussionViewModel — submitReview sets reviewError on failure and dismissReviewError clears it" name="useEventDiscussionViewModel — submitReview sets reviewError on failure and dismissReviewError clears it" time="0.055">
    </testcase>
    <testcase classname="useEventDiscussionViewModel — refresh reloads comments on refresh" name="useEventDiscussionViewModel — refresh reloads comments on refresh" time="0.108">
    </testcase>
  </testsuite>
  <testsuite name="FavoriteEventsTab" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:24" time="0.054" tests="6">
    <testcase classname="FavoriteEventsTab renders the loading state while favorite events are being fetched" name="FavoriteEventsTab renders the loading state while favorite events are being fetched" time="0.003">
    </testcase>
    <testcase classname="FavoriteEventsTab renders the empty state when the user has no favorite events" name="FavoriteEventsTab renders the empty state when the user has no favorite events" time="0.002">
    </testcase>
    <testcase classname="FavoriteEventsTab renders an error banner without the empty state when loading fails" name="FavoriteEventsTab renders an error banner without the empty state when loading fails" time="0.001">
    </testcase>
    <testcase classname="FavoriteEventsTab renders favorite events from the dedicated favorites payload and navigates on press" name="FavoriteEventsTab renders favorite events from the dedicated favorites payload and navigates on press" time="0.002">
    </testcase>
    <testcase classname="FavoriteEventsTab passes the optional privacy level through when the favorites response includes it" name="FavoriteEventsTab passes the optional privacy level through when the favorites response includes it" time="0.001">
    </testcase>
    <testcase classname="FavoriteEventsTab passes the optional location address through when the favorites response includes it" name="FavoriteEventsTab passes the optional location address through when the favorites response includes it" time="0.001">
    </testcase>
  </testsuite>
  <testsuite name="useNotificationsViewModel" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:24" time="0.446" tests="7">
    <testcase classname="useNotificationsViewModel loads notifications on mount" name="useNotificationsViewModel loads notifications on mount" time="0.056">
    </testcase>
    <testcase classname="useNotificationsViewModel loads more notifications with the next cursor" name="useNotificationsViewModel loads more notifications with the next cursor" time="0.054">
    </testcase>
    <testcase classname="useNotificationsViewModel marks a notification read optimistically" name="useNotificationsViewModel marks a notification read optimistically" time="0.053">
    </testcase>
    <testcase classname="useNotificationsViewModel restores notification state when mark read fails" name="useNotificationsViewModel restores notification state when mark read fails" time="0.056">
    </testcase>
    <testcase classname="useNotificationsViewModel marks all notifications read" name="useNotificationsViewModel marks all notifications read" time="0.053">
    </testcase>
    <testcase classname="useNotificationsViewModel restores notification state when mark all read fails" name="useNotificationsViewModel restores notification state when mark all read fails" time="0.052">
    </testcase>
    <testcase classname="useNotificationsViewModel removes a notification after delete succeeds" name="useNotificationsViewModel removes a notification after delete succeeds" time="0.053">
    </testcase>
  </testsuite>
  <testsuite name="NotificationsView" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:24" time="0.088" tests="5">
    <testcase classname="NotificationsView renders notifications grouped in sections" name="NotificationsView renders notifications grouped in sections" time="0.016">
    </testcase>
    <testcase classname="NotificationsView renders accepted and declined invitation notification labels" name="NotificationsView renders accepted and declined invitation notification labels" time="0.007">
    </testcase>
    <testcase classname="NotificationsView shows empty state" name="NotificationsView shows empty state" time="0.003">
    </testcase>
    <testcase classname="NotificationsView navigates back" name="NotificationsView navigates back" time="0.004">
    </testcase>
    <testcase classname="NotificationsView localizes notification relative time in Turkish" name="NotificationsView localizes notification relative time in Turkish" time="0.007">
    </testcase>
  </testsuite>
  <testsuite name="ThemeProvider" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:24" time="0.116" tests="13">
    <testcase classname="ThemeProvider renders nothing before the stored preference is resolved" name="ThemeProvider renders nothing before the stored preference is resolved" time="0.002">
    </testcase>
    <testcase classname="ThemeProvider renders children once the stored preference is resolved" name="ThemeProvider renders children once the stored preference is resolved" time="0.005">
    </testcase>
    <testcase classname="ThemeProvider applies lightTheme when system is light and no stored preference" name="ThemeProvider applies lightTheme when system is light and no stored preference" time="0.004">
    </testcase>
    <testcase classname="ThemeProvider applies darkTheme when system is dark and no stored preference" name="ThemeProvider applies darkTheme when system is dark and no stored preference" time="0.004">
    </testcase>
    <testcase classname="ThemeProvider applies the stored preference &quot;dark&quot; regardless of system scheme" name="ThemeProvider applies the stored preference &quot;dark&quot; regardless of system scheme" time="0.004">
    </testcase>
    <testcase classname="ThemeProvider applies the stored preference &quot;light&quot; regardless of system scheme" name="ThemeProvider applies the stored preference &quot;light&quot; regardless of system scheme" time="0.006">
    </testcase>
    <testcase classname="ThemeProvider ignores an invalid stored value and falls back to system" name="ThemeProvider ignores an invalid stored value and falls back to system" time="0.004">
    </testcase>
    <testcase classname="ThemeProvider still hydrates when SecureStore.getItemAsync rejects" name="ThemeProvider still hydrates when SecureStore.getItemAsync rejects" time="0.003">
    </testcase>
    <testcase classname="setThemePreference switches to dark theme when preference is set to &quot;dark&quot;" name="setThemePreference switches to dark theme when preference is set to &quot;dark&quot;" time="0.005">
    </testcase>
    <testcase classname="setThemePreference switches to light theme when preference is set to &quot;light&quot;" name="setThemePreference switches to light theme when preference is set to &quot;light&quot;" time="0.005">
    </testcase>
    <testcase classname="setThemePreference returns to system scheme when preference is set to &quot;system&quot;" name="setThemePreference returns to system scheme when preference is set to &quot;system&quot;" time="0.004">
    </testcase>
    <testcase classname="setThemePreference persists the preference even when SecureStore.setItemAsync rejects" name="setThemePreference persists the preference even when SecureStore.setItemAsync rejects" time="0.004">
    </testcase>
    <testcase classname="useTheme outside provider throws an error when called outside ThemeProvider" name="useTheme outside provider throws an error when called outside ThemeProvider" time="0.017">
    </testcase>
  </testsuite>
  <testsuite name="FavoriteLocationsTab" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:24" time="0.062" tests="5">
    <testcase classname="FavoriteLocationsTab renders the loading state while favorite locations are being fetched" name="FavoriteLocationsTab renders the loading state while favorite locations are being fetched" time="0.003">
    </testcase>
    <testcase classname="FavoriteLocationsTab renders the empty state when the user has no saved favorite locations" name="FavoriteLocationsTab renders the empty state when the user has no saved favorite locations" time="0.005">
    </testcase>
    <testcase classname="FavoriteLocationsTab renders an error state with retry when loading favorite locations fails" name="FavoriteLocationsTab renders an error state with retry when loading favorite locations fails" time="0.004">
    </testcase>
    <testcase classname="FavoriteLocationsTab shows the backend-backed count and limit banner when the user has three locations" name="FavoriteLocationsTab shows the backend-backed count and limit banner when the user has three locations" time="0.004">
    </testcase>
    <testcase classname="FavoriteLocationsTab renders the add location modal inside a safe area wrapper" name="FavoriteLocationsTab renders the add location modal inside a safe area wrapper" time="0.004">
    </testcase>
  </testsuite>
  <testsuite name="EventDiscussionSection localization" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:24" time="0.064" tests="1">
    <testcase classname="EventDiscussionSection localization localizes reply toggles and relative timestamps in Turkish" name="EventDiscussionSection localization localizes reply toggles and relative timestamps in Turkish" time="0.017">
    </testcase>
  </testsuite>
  <testsuite name="MyEventsView" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:24" time="0.092" tests="6">
    <testcase classname="MyEventsView renders the my events page and event cards" name="MyEventsView renders the my events page and event cards" time="0.016">
    </testcase>
    <testcase classname="MyEventsView opens the event actions screen when an event card is pressed" name="MyEventsView opens the event actions screen when an event card is pressed" time="0.007">
    </testcase>
    <testcase classname="MyEventsView updates the selected status tab when a segment is pressed" name="MyEventsView updates the selected status tab when a segment is pressed" time="0.006">
    </testcase>
    <testcase classname="MyEventsView renders the empty state for the selected status" name="MyEventsView renders the empty state for the selected status" time="0.004">
    </testcase>
    <testcase classname="MyEventsView shows summary fallbacks when /me does not provide location or attendee count" name="MyEventsView shows summary fallbacks when /me does not provide location or attendee count" time="0.006">
    </testcase>
    <testcase classname="MyEventsView renders a retryable error state" name="MyEventsView renders a retryable error state" time="0.006">
    </testcase>
  </testsuite>
  <testsuite name="useTicketScanViewModel" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:24" time="0.28" tests="5">
    <testcase classname="useTicketScanViewModel loads the event and exposes host scan access" name="useTicketScanViewModel loads the event and exposes host scan access" time="0.058">
    </testcase>
    <testcase classname="useTicketScanViewModel shows a login error without calling the event endpoint when auth is missing" name="useTicketScanViewModel shows a login error without calling the event endpoint when auth is missing" time="0.002">
    </testcase>
    <testcase classname="useTicketScanViewModel trims and submits a QR token successfully" name="useTicketScanViewModel trims and submits a QR token successfully" time="0.054">
    </testcase>
    <testcase classname="useTicketScanViewModel validates empty QR input before submitting" name="useTicketScanViewModel validates empty QR input before submitting" time="0.053">
    </testcase>
    <testcase classname="useTicketScanViewModel surfaces API scan failures and clears them with clearResult" name="useTicketScanViewModel surfaces API scan failures and clears them with clearResult" time="0.053">
    </testcase>
  </testsuite>
  <testsuite name="usePushMessaging" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:24" time="0.44" tests="6">
    <testcase classname="usePushMessaging registers the FCM token when an auth token is available" name="usePushMessaging registers the FCM token when an auth token is available" time="0.055">
    </testcase>
    <testcase classname="usePushMessaging does not request or register for push while disabled" name="usePushMessaging does not request or register for push while disabled" time="0.003">
    </testcase>
    <testcase classname="usePushMessaging syncs a previously acquired FCM token after login" name="usePushMessaging syncs a previously acquired FCM token after login" time="0.056">
    </testcase>
    <testcase classname="usePushMessaging unregisters the installation when the auth token is cleared" name="usePushMessaging unregisters the installation when the auth token is cleared" time="0.106">
    </testcase>
    <testcase classname="usePushMessaging unregisters the installation when push notifications are disabled" name="usePushMessaging unregisters the installation when push notifications are disabled" time="0.105">
    </testcase>
    <testcase classname="usePushMessaging normalizes initial notification payloads for open handling" name="usePushMessaging normalizes initial notification payloads for open handling" time="0.054">
    </testcase>
  </testsuite>
  <testsuite name="HomeView" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:24" time="0.061" tests="1">
    <testcase classname="HomeView silently refreshes events when Home regains focus after the initial mount" name="HomeView silently refreshes events when Home regains focus after the initial mount" time="0.005">
    </testcase>
  </testsuite>
  <testsuite name="ForgotPasswordView" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:24" time="0.152" tests="6">
    <testcase classname="ForgotPasswordView renders the email step, updates email, and submits OTP request" name="ForgotPasswordView renders the email step, updates email, and submits OTP request" time="0.007">
    </testcase>
    <testcase classname="ForgotPasswordView routes back to sign in from the email step" name="ForgotPasswordView routes back to sign in from the email step" time="0.004">
    </testcase>
    <testcase classname="ForgotPasswordView edits OTP, verifies it, and returns to email when requested" name="ForgotPasswordView edits OTP, verifies it, and returns to email when requested" time="0.004">
    </testcase>
    <testcase classname="ForgotPasswordView resets the password and navigates to sign in on success" name="ForgotPasswordView resets the password and navigates to sign in on success" time="0.065">
    </testcase>
    <testcase classname="ForgotPasswordView keeps the user on reset step when password reset fails" name="ForgotPasswordView keeps the user on reset step when password reset fails" time="0.007">
    </testcase>
    <testcase classname="ForgotPasswordView disables the active input and shows progress while loading" name="ForgotPasswordView disables the active input and shows progress while loading" time="0.02">
    </testcase>
  </testsuite>
  <testsuite name="EventActionsView" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:24" time="0.083" tests="4">
    <testcase classname="EventActionsView renders the loading state" name="EventActionsView renders the loading state" time="0.004">
    </testcase>
    <testcase classname="EventActionsView renders an error state with retry and back actions" name="EventActionsView renders an error state with retry and back actions" time="0.005">
    </testcase>
    <testcase classname="EventActionsView lets hosts open scanner, edit event, view full event, and open host profile" name="EventActionsView lets hosts open scanner, edit event, view full event, and open host profile" time="0.015">
    </testcase>
    <testcase classname="EventActionsView lets attendees open their ticket when a ticket is available" name="EventActionsView lets attendees open their ticket when a ticket is available" time="0.006">
    </testcase>
  </testsuite>
  <testsuite name="ChangePasswordView" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:24" time="0.147" tests="3">
    <testcase classname="ChangePasswordView renders password fields, validation feedback, and visibility toggles" name="ChangePasswordView renders password fields, validation feedback, and visibility toggles" time="0.054">
    </testcase>
    <testcase classname="ChangePasswordView submits through the view model and returns after a successful change" name="ChangePasswordView submits through the view model and returns after a successful change" time="0.008">
    </testcase>
    <testcase classname="ChangePasswordView disables submission while loading and surfaces banner messages" name="ChangePasswordView disables submission while loading and surfaces banner messages" time="0.032">
    </testcase>
  </testsuite>
  <testsuite name="EditProfileView" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:24" time="0.124" tests="2">
    <testcase classname="EditProfileView replaces to the profile tab after a successful save" name="EditProfileView replaces to the profile tab after a successful save" time="0.066">
    </testcase>
    <testcase classname="EditProfileView does not navigate away when save fails" name="EditProfileView does not navigate away when save fails" time="0.007">
    </testcase>
  </testsuite>
  <testsuite name="useEventActionsViewModel" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:22" time="2.368" tests="2">
    <testcase classname="useEventActionsViewModel retries ticket lookup for joined public events and eventually exposes View Ticket" name="useEventActionsViewModel retries ticket lookup for joined public events and eventually exposes View Ticket" time="2.081">
    </testcase>
    <testcase classname="useEventActionsViewModel does not apply the new retry loop to protected events" name="useEventActionsViewModel does not apply the new retry loop to protected events" time="0.054">
    </testcase>
  </testsuite>
  <testsuite name="useForgotPasswordViewModel" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.071" tests="19">
    <testcase classname="useForgotPasswordViewModel starts on the email step with empty form" name="useForgotPasswordViewModel starts on the email step with empty form" time="0.001">
    </testcase>
    <testcase classname="useForgotPasswordViewModel does not call API when email validation fails" name="useForgotPasswordViewModel does not call API when email validation fails" time="0.001">
    </testcase>
    <testcase classname="useForgotPasswordViewModel advances to otp step after successful OTP request" name="useForgotPasswordViewModel advances to otp step after successful OTP request" time="0.004">
    </testcase>
    <testcase classname="useForgotPasswordViewModel trims email before sending" name="useForgotPasswordViewModel trims email before sending" time="0.001">
    </testcase>
    <testcase classname="useForgotPasswordViewModel shows apiError on OTP request failure" name="useForgotPasswordViewModel shows apiError on OTP request failure" time="0.001">
    </testcase>
    <testcase classname="useForgotPasswordViewModel handles unexpected error on OTP request" name="useForgotPasswordViewModel handles unexpected error on OTP request" time="0">
    </testcase>
    <testcase classname="useForgotPasswordViewModel clears field error when email is updated" name="useForgotPasswordViewModel clears field error when email is updated" time="0.001">
    </testcase>
    <testcase classname="useForgotPasswordViewModel does not call verify API when OTP validation fails" name="useForgotPasswordViewModel does not call verify API when OTP validation fails" time="0.001">
    </testcase>
    <testcase classname="useForgotPasswordViewModel advances to reset step after successful OTP verification" name="useForgotPasswordViewModel advances to reset step after successful OTP verification" time="0.001">
    </testcase>
    <testcase classname="useForgotPasswordViewModel shows OTP field error on invalid_otp and clears the input" name="useForgotPasswordViewModel shows OTP field error on invalid_otp and clears the input" time="0.002">
    </testcase>
    <testcase classname="useForgotPasswordViewModel shows apiError on OTP verify server error" name="useForgotPasswordViewModel shows apiError on OTP verify server error" time="0.001">
    </testcase>
    <testcase classname="useForgotPasswordViewModel does not call reset API when password validation fails" name="useForgotPasswordViewModel does not call reset API when password validation fails" time="0">
    </testcase>
    <testcase classname="useForgotPasswordViewModel requires confirmed password before reset" name="useForgotPasswordViewModel requires confirmed password before reset" time="0.001">
    </testcase>
    <testcase classname="useForgotPasswordViewModel validates confirmed password matches before reset" name="useForgotPasswordViewModel validates confirmed password matches before reset" time="0.001">
    </testcase>
    <testcase classname="useForgotPasswordViewModel calls reset API and returns true on success" name="useForgotPasswordViewModel calls reset API and returns true on success" time="0.001">
    </testcase>
    <testcase classname="useForgotPasswordViewModel shows apiError on invalid reset token" name="useForgotPasswordViewModel shows apiError on invalid reset token" time="0.002">
    </testcase>
    <testcase classname="useForgotPasswordViewModel handles unexpected error on reset" name="useForgotPasswordViewModel handles unexpected error on reset" time="0.001">
    </testcase>
    <testcase classname="useForgotPasswordViewModel goes back from otp to email step" name="useForgotPasswordViewModel goes back from otp to email step" time="0.001">
    </testcase>
    <testcase classname="useForgotPasswordViewModel goes back from reset to otp step" name="useForgotPasswordViewModel goes back from reset to otp step" time="0">
    </testcase>
  </testsuite>
  <testsuite name="useMyEventsViewModel" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:24" time="0.234" tests="4">
    <testcase classname="useMyEventsViewModel loads my events on mount and decorates attended ticket data" name="useMyEventsViewModel loads my events on mount and decorates attended ticket data" time="0.054">
    </testcase>
    <testcase classname="useMyEventsViewModel filters events when the selected status changes" name="useMyEventsViewModel filters events when the selected status changes" time="0.054">
    </testcase>
    <testcase classname="useMyEventsViewModel shows an auth-specific error when the user is logged out" name="useMyEventsViewModel shows an auth-specific error when the user is logged out" time="0.002">
    </testcase>
    <testcase classname="useMyEventsViewModel surfaces a retryable error when loading fails" name="useMyEventsViewModel surfaces a retryable error when loading fails" time="0.053">
    </testcase>
  </testsuite>
  <testsuite name="useTicketViewModel" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.072" tests="5">
    <testcase classname="useTicketViewModel shows the backend qr access reason immediately when ticket access is not yet eligible" name="useTicketViewModel shows the backend qr access reason immediately when ticket access is not yet eligible" time="0.003">
    </testcase>
    <testcase classname="useTicketViewModel fetches qr token automatically via polling when ticket is active" name="useTicketViewModel fetches qr token automatically via polling when ticket is active" time="0.002">
    </testcase>
    <testcase classname="useTicketViewModel polls for a new token after 10 seconds" name="useTicketViewModel polls for a new token after 10 seconds" time="0.002">
    </testcase>
    <testcase classname="useTicketViewModel checks ticket status every 2 seconds while the live ticket is open" name="useTicketViewModel checks ticket status every 2 seconds while the live ticket is open" time="0.002">
    </testcase>
    <testcase classname="useTicketViewModel handles refresh by resetting state and re-fetching" name="useTicketViewModel handles refresh by resetting state and re-fetching" time="0.002">
    </testcase>
  </testsuite>
  <testsuite name="TicketView" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.115" tests="3">
    <testcase classname="TicketView renders a larger 260px QR code and a circular timer" name="TicketView renders a larger 260px QR code and a circular timer" time="0.05">
    </testcase>
    <testcase classname="TicketView shows a refreshing indicator when secondsRemaining reaches 0" name="TicketView shows a refreshing indicator when secondsRemaining reaches 0" time="0.007">
    </testcase>
    <testcase classname="TicketView shows error panel when apiError exists" name="TicketView shows error panel when apiError exists" time="0.005">
    </testcase>
  </testsuite>
  <testsuite name="useHomeViewModel auth behavior" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:24" time="0.395" tests="1">
    <testcase classname="useHomeViewModel auth behavior shows auth error and skips event loading when token is missing" name="useHomeViewModel auth behavior shows auth error and skips event loading when token is missing" time="0.314">
    </testcase>
  </testsuite>
  <testsuite name="useFavoriteEventsViewModel" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:24" time="0.326" tests="5">
    <testcase classname="useFavoriteEventsViewModel loads favorite events on mount from the dedicated favorites endpoint" name="useFavoriteEventsViewModel loads favorite events on mount from the dedicated favorites endpoint" time="0.055">
    </testcase>
    <testcase classname="useFavoriteEventsViewModel refresh reloads the favorite events list from the favorites endpoint" name="useFavoriteEventsViewModel refresh reloads the favorite events list from the favorites endpoint" time="0.053">
    </testcase>
    <testcase classname="useFavoriteEventsViewModel loadMore is a no-op because the favorites endpoint is not paginated" name="useFavoriteEventsViewModel loadMore is a no-op because the favorites endpoint is not paginated" time="0.055">
    </testcase>
    <testcase classname="useFavoriteEventsViewModel remove favorite calls the API and removes the event locally" name="useFavoriteEventsViewModel remove favorite calls the API and removes the event locally" time="0.053">
    </testcase>
    <testcase classname="useFavoriteEventsViewModel surfaces a helpful apiError when loading fails" name="useFavoriteEventsViewModel surfaces a helpful apiError when loading fails" time="0.054">
    </testcase>
  </testsuite>
  <testsuite name="InvitationsView" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.092" tests="4">
    <testcase classname="InvitationsView renders loading state" name="InvitationsView renders loading state" time="0.016">
    </testcase>
    <testcase classname="InvitationsView renders empty state when no invitations" name="InvitationsView renders empty state when no invitations" time="0.002">
    </testcase>
    <testcase classname="InvitationsView renders list of invitations" name="InvitationsView renders list of invitations" time="0.006">
    </testcase>
    <testcase classname="InvitationsView triggers accept and decline actions" name="InvitationsView triggers accept and decline actions" time="0.007">
    </testcase>
  </testsuite>
  <testsuite name="CategoryChips" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.081" tests="3">
    <testcase classname="CategoryChips renders selected category chips with remove affordances" name="CategoryChips renders selected category chips with remove affordances" time="0.006">
    </testcase>
    <testcase classname="CategoryChips toggles categories and clears all selected categories" name="CategoryChips toggles categories and clears all selected categories" time="0.011">
    </testcase>
    <testcase classname="CategoryChips localizes quick-select category labels and accessibility labels" name="CategoryChips localizes quick-select category labels and accessibility labels" time="0.006">
    </testcase>
  </testsuite>
  <testsuite name="useRegisterViewModel" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.136" tests="9">
    <testcase classname="useRegisterViewModel starts on details step with empty form" name="useRegisterViewModel starts on details step with empty form" time="0.001">
    </testcase>
    <testcase classname="useRegisterViewModel does not call API when validation fails on submit details" name="useRegisterViewModel does not call API when validation fails on submit details" time="0.007">
    </testcase>
    <testcase classname="useRegisterViewModel requires gender and birth date before requesting OTP" name="useRegisterViewModel requires gender and birth date before requesting OTP" time="0.001">
    </testcase>
    <testcase classname="useRegisterViewModel sets email and username errors when check-availability returns TAKEN" name="useRegisterViewModel sets email and username errors when check-availability returns TAKEN" time="0.001">
    </testcase>
    <testcase classname="useRegisterViewModel requests OTP and moves to otp step when availability is clear" name="useRegisterViewModel requests OTP and moves to otp step when availability is clear" time="0.002">
    </testcase>
    <testcase classname="useRegisterViewModel sets apiError when check-availability throws ApiError" name="useRegisterViewModel sets apiError when check-availability throws ApiError" time="0.002">
    </testcase>
    <testcase classname="useRegisterViewModel returns session when OTP verify succeeds" name="useRegisterViewModel returns session when OTP verify succeeds" time="0.001">
    </testcase>
    <testcase classname="useRegisterViewModel maps invalid_otp ApiError to otp field and clears otp input" name="useRegisterViewModel maps invalid_otp ApiError to otp field and clears otp input" time="0.002">
    </testcase>
    <testcase classname="useRegisterViewModel goBack returns from otp to details" name="useRegisterViewModel goBack returns from otp to details" time="0.004">
    </testcase>
  </testsuite>
  <testsuite name="useLogoutViewModel" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.133" tests="8">
    <testcase classname="useLogoutViewModel starts with isLoggingOut false and no error" name="useLogoutViewModel starts with isLoggingOut false and no error" time="0.002">
    </testcase>
    <testcase classname="useLogoutViewModel calls onLoggedOut immediately when refreshToken is null" name="useLogoutViewModel calls onLoggedOut immediately when refreshToken is null" time="0.001">
    </testcase>
    <testcase classname="useLogoutViewModel calls logout API with refresh_token and invokes onLoggedOut on success" name="useLogoutViewModel calls logout API with refresh_token and invokes onLoggedOut on success" time="0.006">
    </testcase>
    <testcase classname="useLogoutViewModel still calls onLoggedOut when server returns 401" name="useLogoutViewModel still calls onLoggedOut when server returns 401" time="0.002">
    </testcase>
    <testcase classname="useLogoutViewModel shows API error message and does not call onLoggedOut on non-401 API error" name="useLogoutViewModel shows API error message and does not call onLoggedOut on non-401 API error" time="0.002">
    </testcase>
    <testcase classname="useLogoutViewModel shows generic error message on network failure" name="useLogoutViewModel shows generic error message on network failure" time="0.001">
    </testcase>
    <testcase classname="useLogoutViewModel clears previous error when handleLogout is called again" name="useLogoutViewModel clears previous error when handleLogout is called again" time="0.002">
    </testcase>
    <testcase classname="useLogoutViewModel shows error and blocks logout on 403 forbidden" name="useLogoutViewModel shows error and blocks logout on 403 forbidden" time="0.001">
    </testcase>
  </testsuite>
  <testsuite name="useFavoriteLocationsViewModel" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.172" tests="11">
    <testcase classname="useFavoriteLocationsViewModel loads favorite locations on mount and keeps them sorted alphabetically" name="useFavoriteLocationsViewModel loads favorite locations on mount and keeps them sorted alphabetically" time="0.006">
    </testcase>
    <testcase classname="useFavoriteLocationsViewModel opens and closes the add modal when the user can still add more locations" name="useFavoriteLocationsViewModel opens and closes the add modal when the user can still add more locations" time="0.002">
    </testcase>
    <testcase classname="useFavoriteLocationsViewModel searches address suggestions with debounce" name="useFavoriteLocationsViewModel searches address suggestions with debounce" time="0.006">
    </testcase>
    <testcase classname="useFavoriteLocationsViewModel creates a favorite location through the API and keeps the list sorted" name="useFavoriteLocationsViewModel creates a favorite location through the API and keeps the list sorted" time="0.004">
    </testcase>
    <testcase classname="useFavoriteLocationsViewModel saves the raw display_name of a detailed suggestion" name="useFavoriteLocationsViewModel saves the raw display_name of a detailed suggestion" time="0.002">
    </testcase>
    <testcase classname="useFavoriteLocationsViewModel blocks submit with validation errors before calling the API" name="useFavoriteLocationsViewModel blocks submit with validation errors before calling the API" time="0.002">
    </testcase>
    <testcase classname="useFavoriteLocationsViewModel enforces the max 3 rule based on the backend response" name="useFavoriteLocationsViewModel enforces the max 3 rule based on the backend response" time="0.006">
    </testcase>
    <testcase classname="useFavoriteLocationsViewModel syncs with the backend when create returns the favorite-location limit error" name="useFavoriteLocationsViewModel syncs with the backend when create returns the favorite-location limit error" time="0.003">
    </testcase>
    <testcase classname="useFavoriteLocationsViewModel removes a location through the API" name="useFavoriteLocationsViewModel removes a location through the API" time="0.004">
    </testcase>
    <testcase classname="useFavoriteLocationsViewModel sets apiError when loading favorite locations fails" name="useFavoriteLocationsViewModel sets apiError when loading favorite locations fails" time="0.002">
    </testcase>
    <testcase classname="useFavoriteLocationsViewModel shows a logged-out error without calling the backend" name="useFavoriteLocationsViewModel shows a logged-out error without calling the backend" time="0.001">
    </testcase>
  </testsuite>
  <testsuite name="useLoginViewModel" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.144" tests="9">
    <testcase classname="useLoginViewModel starts with empty form and no errors" name="useLoginViewModel starts with empty form and no errors" time="0.004">
    </testcase>
    <testcase classname="useLoginViewModel does not call API when validation fails" name="useLoginViewModel does not call API when validation fails" time="0.001">
    </testcase>
    <testcase classname="useLoginViewModel clears field error and apiError when a field is updated" name="useLoginViewModel clears field error and apiError when a field is updated" time="0.001">
    </testcase>
    <testcase classname="useLoginViewModel returns session on successful login" name="useLoginViewModel returns session on successful login" time="0.004">
    </testcase>
    <testcase classname="useLoginViewModel sets apiError on invalid credentials (401)" name="useLoginViewModel sets apiError on invalid credentials (401)" time="0.001">
    </testcase>
    <testcase classname="useLoginViewModel localizes invalid credentials API errors in Turkish" name="useLoginViewModel localizes invalid credentials API errors in Turkish" time="0.003">
    </testcase>
    <testcase classname="useLoginViewModel sets apiError on rate limit (429)" name="useLoginViewModel sets apiError on rate limit (429)" time="0.001">
    </testcase>
    <testcase classname="useLoginViewModel sets generic apiError on unexpected errors" name="useLoginViewModel sets generic apiError on unexpected errors" time="0.002">
    </testcase>
    <testcase classname="useLoginViewModel returns null when login fails" name="useLoginViewModel returns null when login fails" time="0.002">
    </testcase>
  </testsuite>
  <testsuite name="HomeHeader" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.118" tests="8">
    <testcase classname="HomeHeader renders the SEM logo on the left" name="HomeHeader renders the SEM logo on the left" time="0.003">
    </testcase>
    <testcase classname="HomeHeader calls onPressNotifications when the bell button is pressed" name="HomeHeader calls onPressNotifications when the bell button is pressed" time="0.013">
    </testcase>
    <testcase classname="HomeHeader calls onPressThemeToggle when the theme button is pressed" name="HomeHeader calls onPressThemeToggle when the theme button is pressed" time="0.002">
    </testcase>
    <testcase classname="HomeHeader shows a moon icon in light mode and a sun icon in dark mode" name="HomeHeader shows a moon icon in light mode and a sun icon in dark mode" time="0.004">
    </testcase>
    <testcase classname="HomeHeader theme toggle is the rightmost header action" name="HomeHeader theme toggle is the rightmost header action" time="0.009">
    </testcase>
    <testcase classname="HomeHeader shows a badge when unreadNotificationCount is greater than zero" name="HomeHeader shows a badge when unreadNotificationCount is greater than zero" time="0.002">
    </testcase>
    <testcase classname="HomeHeader caps the badge at 99+" name="HomeHeader caps the badge at 99+" time="0.002">
    </testcase>
    <testcase classname="HomeHeader does not show a badge when unreadNotificationCount is zero" name="HomeHeader does not show a badge when unreadNotificationCount is zero" time="0.005">
    </testcase>
  </testsuite>
  <testsuite name="EventCard" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.079" tests="1">
    <testcase classname="EventCard renders an event summary without crashing" name="EventCard renders an event summary without crashing" time="0.014">
    </testcase>
  </testsuite>
  <testsuite name="api auth refresh handling" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.09" tests="4">
    <testcase classname="api auth refresh handling refreshes and retries an authenticated request after a 401 response" name="api auth refresh handling refreshes and retries an authenticated request after a 401 response" time="0.011">
    </testcase>
    <testcase classname="api auth refresh handling throws immediately on 401 when there is no refresh token available" name="api auth refresh handling throws immediately on 401 when there is no refresh token available" time="0.009">
    </testcase>
    <testcase classname="api auth refresh handling throws after retry if the retried request also returns 401" name="api auth refresh handling throws after retry if the retried request also returns 401" time="0.006">
    </testcase>
    <testcase classname="api auth refresh handling propagates the error when the refresh request itself fails and clears the session" name="api auth refresh handling propagates the error when the refresh request itself fails and clears the session" time="0.011">
    </testcase>
  </testsuite>
  <testsuite name="usePublicProfileViewModel" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.092" tests="4">
    <testcase classname="usePublicProfileViewModel fetches and exposes public profile data on mount" name="usePublicProfileViewModel fetches and exposes public profile data on mount" time="0.011">
    </testcase>
    <testcase classname="usePublicProfileViewModel handles API errors gracefully" name="usePublicProfileViewModel handles API errors gracefully" time="0.002">
    </testcase>
    <testcase classname="usePublicProfileViewModel can refresh data" name="usePublicProfileViewModel can refresh data" time="0.003">
    </testcase>
    <testcase classname="usePublicProfileViewModel derives avatar initial correctly" name="usePublicProfileViewModel derives avatar initial correctly" time="0.003">
    </testcase>
  </testsuite>
  <testsuite name="useInvitationsViewModel" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.094" tests="4">
    <testcase classname="useInvitationsViewModel fetches pending invitations on mount and ignores past invitations" name="useInvitationsViewModel fetches pending invitations on mount and ignores past invitations" time="0.004">
    </testcase>
    <testcase classname="useInvitationsViewModel handles errors during fetch" name="useInvitationsViewModel handles errors during fetch" time="0">
    </testcase>
    <testcase classname="useInvitationsViewModel removes invitation after successful accept" name="useInvitationsViewModel removes invitation after successful accept" time="0.004">
    </testcase>
    <testcase classname="useInvitationsViewModel removes invitation after successful decline" name="useInvitationsViewModel removes invitation after successful decline" time="0.01">
    </testcase>
  </testsuite>
  <testsuite name="FavoritesView" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.083" tests="2">
    <testcase classname="FavoritesView renders favorite events by default" name="FavoritesView renders favorite events by default" time="0.013">
    </testcase>
    <testcase classname="FavoritesView switches between events and locations tabs" name="FavoritesView switches between events and locations tabs" time="0.008">
    </testcase>
  </testsuite>
  <testsuite name="ProfileEventCard" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.063" tests="1">
    <testcase classname="ProfileEventCard uses the shared category color and emoji presentation" name="ProfileEventCard uses the shared category color and emoji presentation" time="0.006">
    </testcase>
  </testsuite>
  <testsuite name="validateEmail" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.058" tests="22">
    <testcase classname="validateEmail returns null for a valid email" name="validateEmail returns null for a valid email" time="0">
    </testcase>
    <testcase classname="validateEmail rejects empty or whitespace-only" name="validateEmail rejects empty or whitespace-only" time="0">
    </testcase>
    <testcase classname="validateEmail rejects invalid format" name="validateEmail rejects invalid format" time="0">
    </testcase>
    <testcase classname="validateEmail rejects when longer than 320 chars" name="validateEmail rejects when longer than 320 chars" time="0">
    </testcase>
    <testcase classname="validateOtp returns null for six digits" name="validateOtp returns null for six digits" time="0">
    </testcase>
    <testcase classname="validateOtp rejects empty" name="validateOtp rejects empty" time="0">
    </testcase>
    <testcase classname="validateOtp rejects wrong length or non-digits" name="validateOtp rejects wrong length or non-digits" time="0">
    </testcase>
    <testcase classname="validateUsername returns null for valid username" name="validateUsername returns null for valid username" time="0">
    </testcase>
    <testcase classname="validateUsername rejects empty" name="validateUsername rejects empty" time="0">
    </testcase>
    <testcase classname="validateUsername rejects invalid length" name="validateUsername rejects invalid length" time="0">
    </testcase>
    <testcase classname="validateUsername rejects invalid characters" name="validateUsername rejects invalid characters" time="0">
    </testcase>
    <testcase classname="validatePassword returns null for valid length" name="validatePassword returns null for valid length" time="0">
    </testcase>
    <testcase classname="validatePassword rejects empty" name="validatePassword rejects empty" time="0">
    </testcase>
    <testcase classname="validatePassword rejects too short or too long" name="validatePassword rejects too short or too long" time="0">
    </testcase>
    <testcase classname="validatePhoneNumber returns null when empty (optional)" name="validatePhoneNumber returns null when empty (optional)" time="0">
    </testcase>
    <testcase classname="validatePhoneNumber returns null for plausible numbers" name="validatePhoneNumber returns null for plausible numbers" time="0.001">
    </testcase>
    <testcase classname="validatePhoneNumber rejects too long" name="validatePhoneNumber rejects too long" time="0">
    </testcase>
    <testcase classname="validatePhoneNumber rejects invalid characters" name="validatePhoneNumber rejects invalid characters" time="0">
    </testcase>
    <testcase classname="validateBirthDate returns null when empty (optional)" name="validateBirthDate returns null when empty (optional)" time="0">
    </testcase>
    <testcase classname="validateBirthDate returns null for valid past date" name="validateBirthDate returns null for valid past date" time="0">
    </testcase>
    <testcase classname="validateBirthDate rejects wrong format" name="validateBirthDate rejects wrong format" time="0">
    </testcase>
    <testcase classname="validateBirthDate rejects future dates" name="validateBirthDate rejects future dates" time="0">
    </testcase>
  </testsuite>
  <testsuite name="getAutoCompletionDaysLeft" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.035" tests="11">
    <testcase classname="getAutoCompletionDaysLeft returns null for ACTIVE events" name="getAutoCompletionDaysLeft returns null for ACTIVE events" time="0">
    </testcase>
    <testcase classname="getAutoCompletionDaysLeft returns null for COMPLETED events" name="getAutoCompletionDaysLeft returns null for COMPLETED events" time="0">
    </testcase>
    <testcase classname="getAutoCompletionDaysLeft returns null for CANCELED events" name="getAutoCompletionDaysLeft returns null for CANCELED events" time="0">
    </testcase>
    <testcase classname="getAutoCompletionDaysLeft returns null for IN_PROGRESS events that have an end_time" name="getAutoCompletionDaysLeft returns null for IN_PROGRESS events that have an end_time" time="0">
    </testcase>
    <testcase classname="getAutoCompletionDaysLeft returns null when event started less than 53 days ago" name="getAutoCompletionDaysLeft returns null when event started less than 53 days ago" time="0.001">
    </testcase>
    <testcase classname="getAutoCompletionDaysLeft returns null when event started 60 or more days ago" name="getAutoCompletionDaysLeft returns null when event started 60 or more days ago" time="0">
    </testcase>
    <testcase classname="getAutoCompletionDaysLeft returns 7 when event started exactly 53 days ago" name="getAutoCompletionDaysLeft returns 7 when event started exactly 53 days ago" time="0">
    </testcase>
    <testcase classname="getAutoCompletionDaysLeft returns 1 when event started exactly 59 days ago" name="getAutoCompletionDaysLeft returns 1 when event started exactly 59 days ago" time="0">
    </testcase>
    <testcase classname="getAutoCompletionDaysLeft returns correct days left for day 55" name="getAutoCompletionDaysLeft returns correct days left for day 55" time="0">
    </testcase>
    <testcase classname="getAutoCompletionDaysLeft treats null end_time the same as undefined" name="getAutoCompletionDaysLeft treats null end_time the same as undefined" time="0">
    </testcase>
    <testcase classname="getAutoCompletionDaysLeft accepts a custom now parameter" name="getAutoCompletionDaysLeft accepts a custom now parameter" time="0">
    </testcase>
  </testsuite>
  <testsuite name="notificationPresentation" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.064" tests="6">
    <testcase classname="notificationPresentation marks supported participation notifications as dedicated" name="notificationPresentation marks supported participation notifications as dedicated" time="0">
    </testcase>
    <testcase classname="notificationPresentation builds a dedicated invitation presentation" name="notificationPresentation builds a dedicated invitation presentation" time="0.001">
    </testcase>
    <testcase classname="notificationPresentation builds a dedicated rejection presentation with cooldown metadata" name="notificationPresentation builds a dedicated rejection presentation with cooldown metadata" time="0.001">
    </testcase>
    <testcase classname="notificationPresentation builds a dedicated submitted presentation for host" name="notificationPresentation builds a dedicated submitted presentation for host" time="0">
    </testcase>
    <testcase classname="notificationPresentation builds accepted and declined invitation presentations for the host" name="notificationPresentation builds accepted and declined invitation presentations for the host" time="0.001">
    </testcase>
    <testcase classname="notificationPresentation falls back to generic presentation for unsupported types" name="notificationPresentation falls back to generic presentation for unsupported types" time="0.002">
    </testcase>
  </testsuite>
  <testsuite name="useChangePasswordViewModel" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.118" tests="7">
    <testcase classname="useChangePasswordViewModel starts with empty form and no errors" name="useChangePasswordViewModel starts with empty form and no errors" time="0.002">
    </testcase>
    <testcase classname="useChangePasswordViewModel validates required fields" name="useChangePasswordViewModel validates required fields" time="0.004">
    </testcase>
    <testcase classname="useChangePasswordViewModel validates password match" name="useChangePasswordViewModel validates password match" time="0.003">
    </testcase>
    <testcase classname="useChangePasswordViewModel validates new password is different from current" name="useChangePasswordViewModel validates new password is different from current" time="0.003">
    </testcase>
    <testcase classname="useChangePasswordViewModel handles successful password change" name="useChangePasswordViewModel handles successful password change" time="0.003">
    </testcase>
    <testcase classname="useChangePasswordViewModel handles wrong current password (401)" name="useChangePasswordViewModel handles wrong current password (401)" time="0.002">
    </testcase>
    <testcase classname="useChangePasswordViewModel handles generic API errors" name="useChangePasswordViewModel handles generic API errors" time="0.002">
    </testcase>
  </testsuite>
  <testsuite name="sessionManager" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.071" tests="2">
    <testcase classname="sessionManager rotates tokens once and shares a single in-flight refresh request" name="sessionManager rotates tokens once and shares a single in-flight refresh request" time="0.007">
    </testcase>
    <testcase classname="sessionManager clears the stored session when refresh fails terminally" name="sessionManager clears the stored session when refresh fails terminally" time="0.006">
    </testcase>
  </testsuite>
  <testsuite name="useHomeViewModel – viewMode toggle" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.087" tests="4">
    <testcase classname="useHomeViewModel – viewMode toggle starts in MAP mode" name="useHomeViewModel – viewMode toggle starts in MAP mode" time="0.009">
    </testcase>
    <testcase classname="useHomeViewModel – viewMode toggle switches to LIST mode when toggleViewMode is called once" name="useHomeViewModel – viewMode toggle switches to LIST mode when toggleViewMode is called once" time="0.002">
    </testcase>
    <testcase classname="useHomeViewModel – viewMode toggle switches back to MAP mode when toggleViewMode is called a second time" name="useHomeViewModel – viewMode toggle switches back to MAP mode when toggleViewMode is called a second time" time="0.004">
    </testcase>
    <testcase classname="useHomeViewModel – viewMode toggle exposes activeLocation as numeric lat/lon based on the resolved location" name="useHomeViewModel – viewMode toggle exposes activeLocation as numeric lat/lon based on the resolved location" time="0.001">
    </testcase>
  </testsuite>
  <testsuite name="pushDeviceService" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.041" tests="2">
    <testcase classname="pushDeviceService registers the installation fcm token through the authenticated API" name="pushDeviceService registers the installation fcm token through the authenticated API" time="0">
    </testcase>
    <testcase classname="pushDeviceService unregisters the installation through the authenticated API" name="pushDeviceService unregisters the installation through the authenticated API" time="0">
    </testcase>
  </testsuite>
  <testsuite name="eventStatus" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.031" tests="3">
    <testcase classname="eventStatus formats known and unknown backend statuses for display" name="eventStatus formats known and unknown backend statuses for display" time="0.001">
    </testcase>
    <testcase classname="eventStatus returns distinct colors for supported statuses with a safe fallback" name="eventStatus returns distinct colors for supported statuses with a safe fallback" time="0">
    </testcase>
    <testcase classname="eventStatus hides only ACTIVE events from profile lists" name="eventStatus hides only ACTIVE events from profile lists" time="0">
    </testcase>
  </testsuite>
  <testsuite name="listEventComments" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.054" tests="11">
    <testcase classname="listEventComments fetches comments without auth when no token provided" name="listEventComments fetches comments without auth when no token provided" time="0.003">
    </testcase>
    <testcase classname="listEventComments fetches comments with auth when token provided" name="listEventComments fetches comments with auth when token provided" time="0.001">
    </testcase>
    <testcase classname="listEventComments builds correct query string with pagination params" name="listEventComments builds correct query string with pagination params" time="0.002">
    </testcase>
    <testcase classname="listEventComments throws ApiError on non-2xx response" name="listEventComments throws ApiError on non-2xx response" time="0.001">
    </testcase>
    <testcase classname="listCommentReplies fetches replies for a parent comment" name="listCommentReplies fetches replies for a parent comment" time="0.001">
    </testcase>
    <testcase classname="listCommentReplies passes cursor and limit in query string" name="listCommentReplies passes cursor and limit in query string" time="0.001">
    </testcase>
    <testcase classname="createDiscussionComment posts a new top-level discussion comment" name="createDiscussionComment posts a new top-level discussion comment" time="0">
    </testcase>
    <testcase classname="createDiscussionComment posts a reply with parent_id" name="createDiscussionComment posts a reply with parent_id" time="0.001">
    </testcase>
    <testcase classname="createDiscussionComment throws ApiError when write is not allowed" name="createDiscussionComment throws ApiError when write is not allowed" time="0">
    </testcase>
    <testcase classname="upsertReviewComment posts a review with rating and message" name="upsertReviewComment posts a review with rating and message" time="0">
    </testcase>
    <testcase classname="upsertReviewComment throws ApiError when host tries to review own event" name="upsertReviewComment throws ApiError when host tries to review own event" time="0.001">
    </testcase>
  </testsuite>
  <testsuite name="notificationService" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.049" tests="5">
    <testcase classname="notificationService lists notifications through the authenticated feed endpoint" name="notificationService lists notifications through the authenticated feed endpoint" time="0.001">
    </testcase>
    <testcase classname="notificationService lists unread notifications when requested" name="notificationService lists unread notifications when requested" time="0">
    </testcase>
    <testcase classname="notificationService fetches unread count" name="notificationService fetches unread count" time="0">
    </testcase>
    <testcase classname="notificationService marks notifications as read" name="notificationService marks notifications as read" time="0.001">
    </testcase>
    <testcase classname="notificationService deletes one notification or the whole visible feed" name="notificationService deletes one notification or the whole visible feed" time="0">
    </testcase>
  </testsuite>
  <testsuite name="getFavoriteCountForDisplay" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.051" tests="4">
    <testcase classname="getFavoriteCountForDisplay uses API favorite_count when present" name="getFavoriteCountForDisplay uses API favorite_count when present" time="0">
    </testcase>
    <testcase classname="getFavoriteCountForDisplay shows 0 when not favorited and no count" name="getFavoriteCountForDisplay shows 0 when not favorited and no count" time="0">
    </testcase>
    <testcase classname="getFavoriteCountForDisplay shows at least 1 when favorited but count missing or zero (legacy discovery)" name="getFavoriteCountForDisplay shows at least 1 when favorited but count missing or zero (legacy discovery)" time="0">
    </testcase>
    <testcase classname="getFavoriteCountForDisplay uses non-zero count when favorited" name="getFavoriteCountForDisplay uses non-zero count when favorited" time="0">
    </testcase>
  </testsuite>
  <testsuite name="deviceInstallation" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.034" tests="2">
    <testcase classname="deviceInstallation creates and persists an installation id when none exists" name="deviceInstallation creates and persists an installation id when none exists" time="0.001">
    </testcase>
    <testcase classname="deviceInstallation returns the stored installation id without replacing it" name="deviceInstallation returns the stored installation id without replacing it" time="0">
    </testcase>
  </testsuite>
  <testsuite name="resolveNotificationRoute" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.038" tests="5">
    <testcase classname="resolveNotificationRoute routes private invitation notifications to the event detail route" name="resolveNotificationRoute routes private invitation notifications to the event detail route" time="0.001">
    </testcase>
    <testcase classname="resolveNotificationRoute maps backend event deep links to the mobile event route" name="resolveNotificationRoute maps backend event deep links to the mobile event route" time="0">
    </testcase>
    <testcase classname="resolveNotificationRoute falls back to event_id metadata" name="resolveNotificationRoute falls back to event_id metadata" time="0">
    </testcase>
    <testcase classname="resolveNotificationRoute routes notification links to the inbox" name="resolveNotificationRoute routes notification links to the inbox" time="0">
    </testcase>
    <testcase classname="resolveNotificationRoute returns null when the payload has no routable target" name="resolveNotificationRoute returns null when the payload has no routable target" time="0">
    </testcase>
  </testsuite>
  <testsuite name="EventCategoryChip" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.083" tests="1">
    <testcase classname="EventCategoryChip renders the shared category emoji and color presentation" name="EventCategoryChip renders the shared category emoji and color presentation" time="0.007">
    </testcase>
  </testsuite>
  <testsuite name="notificationPreferenceService" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.037" tests="3">
    <testcase classname="notificationPreferenceService defaults push notifications to enabled" name="notificationPreferenceService defaults push notifications to enabled" time="0">
    </testcase>
    <testcase classname="notificationPreferenceService persists disabled push notifications" name="notificationPreferenceService persists disabled push notifications" time="0">
    </testcase>
    <testcase classname="notificationPreferenceService notifies subscribers when the preference changes" name="notificationPreferenceService notifies subscribers when the preference changes" time="0">
    </testcase>
  </testsuite>
  <testsuite name="getEventCategoryPresentation" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.038" tests="3">
    <testcase classname="getEventCategoryPresentation keeps outdoors and volunteering visually distinct" name="getEventCategoryPresentation keeps outdoors and volunteering visually distinct" time="0">
    </testcase>
    <testcase classname="getEventCategoryPresentation normalizes category names with punctuation" name="getEventCategoryPresentation normalizes category names with punctuation" time="0">
    </testcase>
    <testcase classname="getEventCategoryPresentation returns readable foreground text for bright dark-theme colors" name="getEventCategoryPresentation returns readable foreground text for bright dark-theme colors" time="0.001">
    </testcase>
  </testsuite>
  <testsuite name="normalizePushNotificationPayload" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.029" tests="2">
    <testcase classname="normalizePushNotificationPayload normalizes notification and data payload fields" name="normalizePushNotificationPayload normalizes notification and data payload fields" time="0.001">
    </testcase>
    <testcase classname="normalizePushNotificationPayload falls back to data fields and message id" name="normalizePushNotificationPayload falls back to data fields and message id" time="0">
    </testcase>
  </testsuite>
  <testsuite name="ticketService" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:25" time="0.03" tests="1">
    <testcase classname="ticketService should be true" name="ticketService should be true" time="0">
    </testcase>
  </testsuite>
  <testsuite name="resolveConstraintViolation" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:19" time="7.718" tests="78">
    <testcase classname="resolveConstraintViolation returns null when event has no gender or age constraints" name="resolveConstraintViolation returns null when event has no gender or age constraints" time="0.004">
    </testcase>
    <testcase classname="resolveConstraintViolation returns null when preferred_gender is set but user gender is missing" name="resolveConstraintViolation returns null when preferred_gender is set but user gender is missing" time="0.001">
    </testcase>
    <testcase classname="resolveConstraintViolation returns null when preferred_gender is set but user gender is blank or whitespace" name="resolveConstraintViolation returns null when preferred_gender is set but user gender is blank or whitespace" time="0.001">
    </testcase>
    <testcase classname="resolveConstraintViolation returns null when user matches (lowercase or API uppercase wire format)" name="resolveConstraintViolation returns null when user matches (lowercase or API uppercase wire format)" time="0.001">
    </testcase>
    <testcase classname="resolveConstraintViolation returns a message when user gender does not match preferred_gender" name="resolveConstraintViolation returns a message when user gender does not match preferred_gender" time="0.001">
    </testcase>
    <testcase classname="resolveConstraintViolation returns null when minimum_age is set but birth_date is missing or blank" name="resolveConstraintViolation returns null when minimum_age is set but birth_date is missing or blank" time="0">
    </testcase>
    <testcase classname="resolveConstraintViolation returns a message when user is under minimum_age" name="resolveConstraintViolation returns a message when user is under minimum_age" time="0.001">
    </testcase>
    <testcase classname="resolveConstraintViolation joins gender and age messages with · when both fail" name="resolveConstraintViolation joins gender and age messages with · when both fail" time="0">
    </testcase>
    <testcase classname="useEventDetailViewModel initial state starts in loading state with no event data" name="useEventDetailViewModel initial state starts in loading state with no event data" time="0.013">
    </testcase>
    <testcase classname="useEventDetailViewModel fetching event loads event detail on mount and sets viewer context" name="useEventDetailViewModel fetching event loads event detail on mount and sets viewer context" time="0.062">
    </testcase>
    <testcase classname="useEventDetailViewModel fetching event normalizes backend APPROVED participation status to JOINED" name="useEventDetailViewModel fetching event normalizes backend APPROVED participation status to JOINED" time="0.056">
    </testcase>
    <testcase classname="useEventDetailViewModel fetching event sets apiError when fetch fails" name="useEventDetailViewModel fetching event sets apiError when fetch fails" time="0.058">
    </testcase>
    <testcase classname="useEventDetailViewModel fetching event retry re-fetches the event" name="useEventDetailViewModel fetching event retry re-fetches the event" time="0.061">
    </testcase>
    <testcase classname="useEventDetailViewModel isQuotaFull is false when approved count is below capacity" name="useEventDetailViewModel isQuotaFull is false when approved count is below capacity" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel isQuotaFull is true when approved count meets capacity" name="useEventDetailViewModel isQuotaFull is true when approved count meets capacity" time="0.056">
    </testcase>
    <testcase classname="useEventDetailViewModel isQuotaFull is false when capacity is null (unlimited)" name="useEventDetailViewModel isQuotaFull is false when capacity is null (unlimited)" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel handleToggleFavorite calls removeFavorite and decrements count when currently favorited" name="useEventDetailViewModel handleToggleFavorite calls removeFavorite and decrements count when currently favorited" time="0.057">
    </testcase>
    <testcase classname="useEventDetailViewModel handleToggleFavorite calls addFavorite and increments count when currently not favorited" name="useEventDetailViewModel handleToggleFavorite calls addFavorite and increments count when currently not favorited" time="0.057">
    </testcase>
    <testcase classname="useEventDetailViewModel handleToggleFavorite rolls back optimistic favorite change when API fails" name="useEventDetailViewModel handleToggleFavorite rolls back optimistic favorite change when API fails" time="0.056">
    </testcase>
    <testcase classname="useEventDetailViewModel handleToggleFavorite initialises isFavorited from viewer_context" name="useEventDetailViewModel handleToggleFavorite initialises isFavorited from viewer_context" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel handleJoin calls joinEvent, refreshes event detail, and reflects JOINED status" name="useEventDetailViewModel handleJoin calls joinEvent, refreshes event detail, and reflects JOINED status" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel handleJoin does not show full loading screen during post-join refresh" name="useEventDetailViewModel handleJoin does not show full loading screen during post-join refresh" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel handleJoin sets actionError when joinEvent returns an ApiError" name="useEventDetailViewModel handleJoin sets actionError when joinEvent returns an ApiError" time="0.056">
    </testcase>
    <testcase classname="useEventDetailViewModel handleJoin sets generic actionError on unknown join failure" name="useEventDetailViewModel handleJoin sets generic actionError on unknown join failure" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel join request modal opens and closes the modal" name="useEventDetailViewModel join request modal opens and closes the modal" time="0.053">
    </testcase>
    <testcase classname="useEventDetailViewModel join request modal clears message and error when closing the modal" name="useEventDetailViewModel join request modal clears message and error when closing the modal" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel join request modal updates joinRequestMessage" name="useEventDetailViewModel join request modal updates joinRequestMessage" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel handleRequestJoin calls requestJoinEvent with the message and updates status to PENDING" name="useEventDetailViewModel handleRequestJoin calls requestJoinEvent with the message and updates status to PENDING" time="0.055">
    </testcase>
    <testcase classname="useEventDetailViewModel handleRequestJoin sends null message when the input is blank" name="useEventDetailViewModel handleRequestJoin sends null message when the input is blank" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel handleRequestJoin trims whitespace-only message and sends null" name="useEventDetailViewModel handleRequestJoin trims whitespace-only message and sends null" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel handleRequestJoin sets actionError and keeps modal open when request fails" name="useEventDetailViewModel handleRequestJoin sets actionError and keeps modal open when request fails" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel invitation actions accepts an invitation and refreshes the event as joined" name="useEventDetailViewModel invitation actions accepts an invitation and refreshes the event as joined" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel invitation actions declines an invitation and hides the event detail" name="useEventDetailViewModel invitation actions declines an invitation and hides the event detail" time="0.053">
    </testcase>
    <testcase classname="useEventDetailViewModel reconfirmation actions reconfirms pending participation and refreshes event detail" name="useEventDetailViewModel reconfirmation actions reconfirms pending participation and refreshes event detail" time="0.055">
    </testcase>
    <testcase classname="useEventDetailViewModel reconfirmation actions shows API errors when reconfirmation fails" name="useEventDetailViewModel reconfirmation actions shows API errors when reconfirmation fails" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel reconfirmation actions maps backend pending join-request status into the mobile pending state" name="useEventDetailViewModel reconfirmation actions maps backend pending join-request status into the mobile pending state" time="0.055">
    </testcase>
    <testcase classname="useEventDetailViewModel constraintViolation is null when the event has no constraints" name="useEventDetailViewModel constraintViolation is null when the event has no constraints" time="0.055">
    </testcase>
    <testcase classname="useEventDetailViewModel constraintViolation is null when user gender is unknown (null) even if event has preferred_gender" name="useEventDetailViewModel constraintViolation is null when user gender is unknown (null) even if event has preferred_gender" time="0.057">
    </testcase>
    <testcase classname="useEventDetailViewModel constraintViolation is null when user gender matches preferred_gender (case-insensitive)" name="useEventDetailViewModel constraintViolation is null when user gender matches preferred_gender (case-insensitive)" time="0.053">
    </testcase>
    <testcase classname="useEventDetailViewModel constraintViolation is null when session UserSummary.gender is uppercase MALE (API wire format)" name="useEventDetailViewModel constraintViolation is null when session UserSummary.gender is uppercase MALE (API wire format)" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel constraintViolation is non-null when user gender does not match preferred_gender" name="useEventDetailViewModel constraintViolation is non-null when user gender does not match preferred_gender" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel constraintViolation is null when user birth_date is unknown even if event has minimum_age" name="useEventDetailViewModel constraintViolation is null when user birth_date is unknown even if event has minimum_age" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel constraintViolation is null when session UserSummary.birth_date is set and user meets minimum age" name="useEventDetailViewModel constraintViolation is null when session UserSummary.birth_date is set and user meets minimum age" time="0.053">
    </testcase>
    <testcase classname="useEventDetailViewModel constraintViolation is non-null when user is under the minimum age" name="useEventDetailViewModel constraintViolation is non-null when user is under the minimum age" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel constraintViolation combines both gender and age violations into one message" name="useEventDetailViewModel constraintViolation combines both gender and age violations into one message" time="0.061">
    </testcase>
    <testcase classname="useEventDetailViewModel Host actions handleApproveRequest calls api and refreshes event detail" name="useEventDetailViewModel Host actions handleApproveRequest calls api and refreshes event detail" time="0.056">
    </testcase>
    <testcase classname="useEventDetailViewModel Host actions handleRejectRequest calls api and refreshes event detail" name="useEventDetailViewModel Host actions handleRejectRequest calls api and refreshes event detail" time="0.055">
    </testcase>
    <testcase classname="useEventDetailViewModel Host actions handleCancelEvent calls api and refreshes event detail" name="useEventDetailViewModel Host actions handleCancelEvent calls api and refreshes event detail" time="0.061">
    </testcase>
    <testcase classname="useEventDetailViewModel Host actions handleCancelEvent sets global actionError if it fails" name="useEventDetailViewModel Host actions handleCancelEvent sets global actionError if it fails" time="0.056">
    </testcase>
    <testcase classname="useEventDetailViewModel canLeave is true when user is a joined participant on an active event" name="useEventDetailViewModel canLeave is true when user is a joined participant on an active event" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel canLeave is true when user is a joined participant on an in-progress event with future end_time" name="useEventDetailViewModel canLeave is true when user is a joined participant on an in-progress event with future end_time" time="0.056">
    </testcase>
    <testcase classname="useEventDetailViewModel canLeave is false when the user is the host" name="useEventDetailViewModel canLeave is false when the user is the host" time="0.053">
    </testcase>
    <testcase classname="useEventDetailViewModel canLeave is false when user is not a participant" name="useEventDetailViewModel canLeave is false when user is not a participant" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel canLeave is false when event is canceled" name="useEventDetailViewModel canLeave is false when event is canceled" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel canLeave is false when event is completed" name="useEventDetailViewModel canLeave is false when event is completed" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel canLeave is false when event end_time has passed" name="useEventDetailViewModel canLeave is false when event end_time has passed" time="0.053">
    </testcase>
    <testcase classname="useEventDetailViewModel handleLeaveEvent calls leaveEvent API, refreshes detail, and sets success_left for post-start leave" name="useEventDetailViewModel handleLeaveEvent calls leaveEvent API, refreshes detail, and sets success_left for post-start leave" time="0.058">
    </testcase>
    <testcase classname="useEventDetailViewModel handleLeaveEvent sets actionState to idle for pre-start leave (backend allows rejoin)" name="useEventDetailViewModel handleLeaveEvent sets actionState to idle for pre-start leave (backend allows rejoin)" time="0.056">
    </testcase>
    <testcase classname="useEventDetailViewModel handleLeaveEvent sets actionError with API message when leave fails" name="useEventDetailViewModel handleLeaveEvent sets actionError with API message when leave fails" time="0.057">
    </testcase>
    <testcase classname="useEventDetailViewModel handleLeaveEvent sets generic actionError on unknown leave failure" name="useEventDetailViewModel handleLeaveEvent sets generic actionError on unknown leave failure" time="0.058">
    </testcase>
    <testcase classname="useEventDetailViewModel rating actions submits viewer rating and refreshes event detail" name="useEventDetailViewModel rating actions submits viewer rating and refreshes event detail" time="0.057">
    </testcase>
    <testcase classname="useEventDetailViewModel rating actions maps viewer rating errors from the backend" name="useEventDetailViewModel rating actions maps viewer rating errors from the backend" time="0.058">
    </testcase>
    <testcase classname="useEventDetailViewModel rating actions submits participant rating and refreshes host lists" name="useEventDetailViewModel rating actions submits participant rating and refreshes host lists" time="0.056">
    </testcase>
    <testcase classname="useEventDetailViewModel rating actions stores participant rating errors on the matching participant" name="useEventDetailViewModel rating actions stores participant rating errors on the matching participant" time="0.055">
    </testcase>
    <testcase classname="useEventDetailViewModel invitations loads invitations when modal is opened" name="useEventDetailViewModel invitations loads invitations when modal is opened" time="0.109">
    </testcase>
    <testcase classname="useEventDetailViewModel invitations successfully invites users and refreshes list" name="useEventDetailViewModel invitations successfully invites users and refreshes list" time="0.061">
    </testcase>
    <testcase classname="useEventDetailViewModel invitations throws error with specific message when some usernames are invalid" name="useEventDetailViewModel invitations throws error with specific message when some usernames are invalid" time="0.105">
    </testcase>
    <testcase classname="useEventDetailViewModel invitations throws error with specific message when users are already invited" name="useEventDetailViewModel invitations throws error with specific message when users are already invited" time="0.053">
    </testcase>
    <testcase classname="useEventDetailViewModel invitations searches for users when query changes" name="useEventDetailViewModel invitations searches for users when query changes" time="0.004">
    </testcase>
    <testcase classname="useEventDetailViewModel Join Request Image Attachment picks an image successfully" name="useEventDetailViewModel Join Request Image Attachment picks an image successfully" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel Join Request Image Attachment removes the selected image" name="useEventDetailViewModel Join Request Image Attachment removes the selected image" time="0.054">
    </testcase>
    <testcase classname="useEventDetailViewModel Join Request Image Attachment uploads image and sends confirm token on handleRequestJoin" name="useEventDetailViewModel Join Request Image Attachment uploads image and sends confirm token on handleRequestJoin" time="0.058">
    </testcase>
    <testcase classname="useEventDetailViewModel handleCancelJoinRequest calls withdrawJoinRequest, clears status, and refreshes event" name="useEventDetailViewModel handleCancelJoinRequest calls withdrawJoinRequest, clears status, and refreshes event" time="0.056">
    </testcase>
    <testcase classname="useEventDetailViewModel handleCancelJoinRequest handles 409 conflict by refreshing and showing an error" name="useEventDetailViewModel handleCancelJoinRequest handles 409 conflict by refreshing and showing an error" time="0.057">
    </testcase>
    <testcase classname="useEventDetailViewModel handleRevokeInvitation calls revokeInvitation and refreshes host context" name="useEventDetailViewModel handleRevokeInvitation calls revokeInvitation and refreshes host context" time="0.057">
    </testcase>
    <testcase classname="useEventDetailViewModel Event Reporting manages reporting state and handles success" name="useEventDetailViewModel Event Reporting manages reporting state and handles success" time="0.057">
    </testcase>
    <testcase classname="useEventDetailViewModel Event Reporting handles duplicate report error" name="useEventDetailViewModel Event Reporting handles duplicate report error" time="0.057">
    </testcase>
    <testcase classname="useEventDetailViewModel Event Reporting supports optional image upload for reporting" name="useEventDetailViewModel Event Reporting supports optional image upload for reporting" time="0.059">
    </testcase>
  </testsuite>
  <testsuite name="useHomeViewModel" errors="0" failures="0" skipped="0" timestamp="2026-05-16T11:31:19" time="20.806" tests="42">
    <testcase classname="useHomeViewModel loads initial categories and events on mount" name="useHomeViewModel loads initial categories and events on mount" time="0.378">
    </testcase>
    <testcase classname="useHomeViewModel uses a reverse-geocoded label when searching the visible map area" name="useHomeViewModel uses a reverse-geocoded label when searching the visible map area" time="0.627">
    </testcase>
    <testcase classname="useHomeViewModel prefers the live location over the profile default when both are available" name="useHomeViewModel prefers the live location over the profile default when both are available" time="0.312">
    </testcase>
    <testcase classname="useHomeViewModel uses the profile default location when live location is unavailable" name="useHomeViewModel uses the profile default location when live location is unavailable" time="0.362">
    </testcase>
    <testcase classname="useHomeViewModel keeps showing the resolved default location after silent refresh" name="useHomeViewModel keeps showing the resolved default location after silent refresh" time="0.315">
    </testcase>
    <testcase classname="useHomeViewModel requests the live location when no profile default exists and uses it when available" name="useHomeViewModel requests the live location when no profile default exists and uses it when available" time="0.362">
    </testcase>
    <testcase classname="useHomeViewModel loads favorite location options alphabetically and limits them to three items" name="useHomeViewModel loads favorite location options alphabetically and limits them to three items" time="0.056">
    </testcase>
    <testcase classname="useHomeViewModel updates search text" name="useHomeViewModel updates search text" time="0.003">
    </testcase>
    <testcase classname="useHomeViewModel toggles selected category ids" name="useHomeViewModel toggles selected category ids" time="0.006">
    </testcase>
    <testcase classname="useHomeViewModel clears selected category ids" name="useHomeViewModel clears selected category ids" time="0.003">
    </testcase>
    <testcase classname="useHomeViewModel refreshes events from the first page" name="useHomeViewModel refreshes events from the first page" time="0.362">
    </testcase>
    <testcase classname="useHomeViewModel loads more events and appends them" name="useHomeViewModel loads more events and appends them" time="0.368">
    </testcase>
    <testcase classname="useHomeViewModel sets apiError when loading events fails" name="useHomeViewModel sets apiError when loading events fails" time="0.363">
    </testcase>
    <testcase classname="useHomeViewModel sets apiError when loading categories fails" name="useHomeViewModel sets apiError when loading categories fails" time="0.053">
    </testcase>
    <testcase classname="useHomeViewModel discovery filters opens and closes filter modal" name="useHomeViewModel discovery filters opens and closes filter modal" time="0.365">
    </testcase>
    <testcase classname="useHomeViewModel discovery filters does not apply draft filters until apply is pressed" name="useHomeViewModel discovery filters does not apply draft filters until apply is pressed" time="0.371">
    </testcase>
    <testcase classname="useHomeViewModel discovery filters uses START_TIME as the default sort order" name="useHomeViewModel discovery filters uses START_TIME as the default sort order" time="0.364">
    </testcase>
    <testcase classname="useHomeViewModel discovery filters applies DISTANCE sorting to the discovery request" name="useHomeViewModel discovery filters applies DISTANCE sorting to the discovery request" time="0.679">
    </testcase>
    <testcase classname="useHomeViewModel discovery filters applies privacy and radius filters to discovery request" name="useHomeViewModel discovery filters applies privacy and radius filters to discovery request" time="0.631">
    </testcase>
    <testcase classname="useHomeViewModel discovery filters applies category filters from modal to discovery request" name="useHomeViewModel discovery filters applies category filters from modal to discovery request" time="0.627">
    </testcase>
    <testcase classname="useHomeViewModel discovery filters keeps selected chip categories together with modal categories" name="useHomeViewModel discovery filters keeps selected chip categories together with modal categories" time="0.994">
    </testcase>
    <testcase classname="useHomeViewModel discovery filters clears chip category filters from the discovery request" name="useHomeViewModel discovery filters clears chip category filters from the discovery request" time="0.99">
    </testcase>
    <testcase classname="useHomeViewModel discovery filters applies valid date range filters" name="useHomeViewModel discovery filters applies valid date range filters" time="0.683">
    </testcase>
    <testcase classname="useHomeViewModel discovery filters shows error for invalid from date and does not apply filters" name="useHomeViewModel discovery filters shows error for invalid from date and does not apply filters" time="0.321">
    </testcase>
    <testcase classname="useHomeViewModel discovery filters shows error for invalid to date and does not apply filters" name="useHomeViewModel discovery filters shows error for invalid to date and does not apply filters" time="0.368">
    </testcase>
    <testcase classname="useHomeViewModel discovery filters shows error when from date is in the past" name="useHomeViewModel discovery filters shows error when from date is in the past" time="0.37">
    </testcase>
    <testcase classname="useHomeViewModel discovery filters shows error when to date is earlier than from date" name="useHomeViewModel discovery filters shows error when to date is earlier than from date" time="0.366">
    </testcase>
    <testcase classname="useHomeViewModel discovery filters resets draft filters and keeps modal open on reset" name="useHomeViewModel discovery filters resets draft filters and keeps modal open on reset" time="0.315">
    </testcase>
    <testcase classname="useHomeViewModel discovery filters clears filter error after user updates a date field" name="useHomeViewModel discovery filters clears filter error after user updates a date field" time="0.369">
    </testcase>
    <testcase classname="useHomeViewModel discovery filters keeps the applied sort order during load more and silent refresh" name="useHomeViewModel discovery filters keeps the applied sort order during load more and silent refresh" time="0.632">
    </testcase>
    <testcase classname="useHomeViewModel location picker opens and closes location modal" name="useHomeViewModel location picker opens and closes location modal" time="0.316">
    </testcase>
    <testcase classname="useHomeViewModel location picker does not apply selected location immediately after choosing a suggestion" name="useHomeViewModel location picker does not apply selected location immediately after choosing a suggestion" time="0.315">
    </testcase>
    <testcase classname="useHomeViewModel location picker applies selected location only after choose location is pressed" name="useHomeViewModel location picker applies selected location only after choose location is pressed" time="0.631">
    </testcase>
    <testcase classname="useHomeViewModel location picker resets location draft and keeps location modal open" name="useHomeViewModel location picker resets location draft and keeps location modal open" time="0.369">
    </testcase>
    <testcase classname="useHomeViewModel location picker applies the hardcoded fallback location only after the user explicitly selects it" name="useHomeViewModel location picker applies the hardcoded fallback location only after the user explicitly selects it" time="0.321">
    </testcase>
    <testcase classname="useHomeViewModel location picker applies a saved favorite location after it is selected" name="useHomeViewModel location picker applies a saved favorite location after it is selected" time="0.635">
    </testcase>
    <testcase classname="useHomeViewModel location picker keeps the applied custom location after the hook remounts" name="useHomeViewModel location picker keeps the applied custom location after the hook remounts" time="0.727">
    </testcase>
    <testcase classname="useHomeViewModel location picker keeps the applied custom location during silent refresh" name="useHomeViewModel location picker keeps the applied custom location during silent refresh" time="0.361">
    </testcase>
    <testcase classname="useHomeViewModel location picker returns to the user profile default location after resetting a temporary location" name="useHomeViewModel location picker returns to the user profile default location after resetting a temporary location" time="0.368">
    </testcase>
    <testcase classname="useHomeViewModel IN_PROGRESS event filtering excludes IN_PROGRESS events from the initial load" name="useHomeViewModel IN_PROGRESS event filtering excludes IN_PROGRESS events from the initial load" time="0.311">
    </testcase>
    <testcase classname="useHomeViewModel IN_PROGRESS event filtering excludes IN_PROGRESS events when loading more" name="useHomeViewModel IN_PROGRESS event filtering excludes IN_PROGRESS events when loading more" time="0.319">
    </testcase>
    <testcase classname="useHomeViewModel IN_PROGRESS event filtering keeps events without a status field" name="useHomeViewModel IN_PROGRESS event filtering keeps events without a status field" time="0.361">
    </testcase>
  </testsuite>
</testsuites>