Mobile Generated Unit Test Reports - bounswe/bounswe2026group4 GitHub Wiki

Mobile Generated Unit Test Reports

Auto-generated: 2026-04-29 18:07 UTC β€” CI run

πŸ“„ View full HTML report


βœ… All passed  Β·  161 passed  Β·  0 failed  Β·  0 skipped  Β·  161 total  Β·  22.80 s

Full test list
Suite Test Status Duration
RootNavigator RootNavigator auth flow shows a message instead of redirecting unauthenticated users for protected screens βœ… passed 4.50 s
RootNavigator RootNavigator auth flow opens the main pager on the feed tab by default βœ… passed 54 ms
RootNavigator RootNavigator auth flow shows only the StoryMap brand in the main header βœ… passed 55 ms
RootNavigator RootNavigator auth flow allows access to protected screens after login and returns to a public route on logout βœ… passed 314 ms
RootNavigator RootNavigator auth flow opens profile completion after registration and persists the session βœ… passed 140 ms
RootNavigator RootNavigator auth flow returns to the feed after profile completion is submitted βœ… passed 276 ms
RootNavigator RootNavigator auth flow falls back to manual sign-in when auto-login after registration fails βœ… passed 201 ms
RootNavigator RootNavigator auth flow persists search and filter state between feed and map views βœ… passed 151 ms
RootNavigator RootNavigator auth flow opens a protected screen after login and returns with the back button βœ… passed 163 ms
RootNavigator RootNavigator auth flow returns from story detail to the previous route when back is pressed βœ… passed 177 ms
RootNavigator RootNavigator auth flow opens a public profile from the contributor name on story detail βœ… passed 337 ms
RootNavigator RootNavigator auth flow opens the signed-in user profile when the contributor is the current user βœ… passed 224 ms
StoryScreen StoryScreen renders loading state while fetching the story βœ… passed 10 ms
StoryScreen StoryScreen renders the full narrative, metadata, media, and comments βœ… passed 65 ms
StoryScreen StoryScreen opens the contributor profile when the contributor name is pressed βœ… passed 54 ms
StoryScreen StoryScreen shows the contributor profile photo when public profile metadata includes one βœ… passed 54 ms
StoryScreen StoryScreen keeps the profile action for anonymous contributors βœ… passed 65 ms
StoryScreen StoryScreen shows deleted user when the story belongs to a deleted account βœ… passed 55 ms
StoryScreen StoryScreen shows deleted account for anonymized comments from deleted users βœ… passed 54 ms
StoryScreen StoryScreen marks the signed-in user on their own story even if their username is private βœ… passed 54 ms
StoryScreen StoryScreen uses the contributor public profile to hide private usernames βœ… passed 54 ms
StoryScreen StoryScreen shows an image fallback message when the media fails to load βœ… passed 60 ms
StoryScreen StoryScreen toggles likes for authenticated users βœ… passed 70 ms
StoryScreen StoryScreen prompts unauthenticated users to log in before liking βœ… passed 61 ms
StoryScreen StoryScreen reverts optimistic likes when the API request fails βœ… passed 111 ms
StoryScreen StoryScreen renders comments in most recent first order βœ… passed 54 ms
StoryScreen StoryScreen submits a new comment and shows it at the top βœ… passed 123 ms
StoryScreen StoryScreen shows delete controls only for the user’s own comments and deletes after confirmation βœ… passed 71 ms
StoryScreen StoryScreen marks the signed-in user on their own comments even when private βœ… passed 52 ms
StoryScreen StoryScreen shows the delete story action only to the owner or an admin βœ… passed 174 ms
StoryScreen StoryScreen confirms and deletes the story for authorized users βœ… passed 99 ms
StoryScreen StoryScreen shows a meaningful error when story deletion fails βœ… passed 60 ms
StoryScreen StoryScreen collapses long narratives and expands them on request βœ… passed 70 ms
StoryScreen StoryScreen prompts unauthenticated users when they try to comment βœ… passed 59 ms
StoryScreen StoryScreen renders the 404 state when the story does not exist βœ… passed 51 ms
ProfileScreen ProfileScreen renders a loading state while profile data is being fetched βœ… passed 23 ms
ProfileScreen ProfileScreen opens the edit profile form with photo actions and privacy toggles βœ… passed 79 ms
ProfileScreen ProfileScreen shows the saved full name on the profile header when available βœ… passed 57 ms
ProfileScreen ProfileScreen shows the saved birth date on the signed-in user profile βœ… passed 54 ms
ProfileScreen ProfileScreen falls back to the public birth year on the signed-in user profile when the full date is unavailable βœ… passed 53 ms
ProfileScreen ProfileScreen shows a photo preview after selecting a valid image and can remove it before saving βœ… passed 98 ms
ProfileScreen ProfileScreen validates selected photo type and size before save βœ… passed 189 ms
ProfileScreen ProfileScreen validates bio length and birth date range before saving βœ… passed 88 ms
ProfileScreen ProfileScreen saves profile changes, uploads the photo, and updates auth user state βœ… passed 211 ms
ProfileScreen ProfileScreen renders public profile fields returned by the API and falls back to anonymous user when username is hidden βœ… passed 110 ms
ProfileScreen ProfileScreen shows the bio privacy pending note in the edit form βœ… passed 67 ms
ProfileScreen ProfileScreen shows an error state when profile loading fails βœ… passed 53 ms
ProfileScreen ProfileScreen renders delete account action and requires password before deletion βœ… passed 68 ms
ProfileScreen ProfileScreen can dismiss the delete account modal without triggering deletion βœ… passed 63 ms
MapScreen MapScreen renders the map and fetched markers βœ… passed 98 ms
MapScreen MapScreen shows the selected marker preview and navigates to story detail βœ… passed 59 ms
MapScreen MapScreen shows nearby stories when a clustered marker is pressed βœ… passed 66 ms
MapScreen MapScreen requests scrolling to the preview when a marker is pressed βœ… passed 71 ms
MapScreen MapScreen refetches markers when filters change βœ… passed 76 ms
MapScreen MapScreen shows a floating status badge after a search returns results βœ… passed 116 ms
MapScreen MapScreen fits the map to all matched stories after a search βœ… passed 73 ms
MapScreen MapScreen shows a no-results badge for a location search βœ… passed 82 ms
MapScreen MapScreen applies the default year filters when submitted unchanged βœ… passed 82 ms
MapScreen MapScreen hides the badge when the active search is cleared βœ… passed 137 ms
MapScreen MapScreen updates the badge when the visible map area changes βœ… passed 64 ms
MapScreen MapScreen refetches all markers when a chip filter is removed βœ… passed 97 ms
MapScreen MapScreen refetches all markers when clear all filters is pressed βœ… passed 94 ms
MapScreen MapScreen keeps the map visible and shows an error overlay when loading fails βœ… passed 59 ms
userService userService fetches the authenticated profile from /users/me/ βœ… passed 1 ms
userService userService fetches a public profile from /users/:id βœ… passed 1 ms
userService userService updates the authenticated profile via PATCH /users/me/ βœ… passed 1 ms
userService userService supports profile completion updates without sending username fields βœ… passed 1 ms
userService userService uploads a profile photo via POST /users/me/photo/ βœ… passed 1 ms
userService userService removes a profile photo via DELETE /users/me/photo/ βœ… passed 0 ms
userService userService deletes the authenticated account via DELETE /users/me/ βœ… passed 1 ms
AuthContext AuthProvider restores a persisted session on app launch βœ… passed 63 ms
AuthContext AuthProvider handles login and logout with persistent storage βœ… passed 108 ms
AuthContext AuthProvider clears auth state even when the logout request fails βœ… passed 107 ms
AuthContext AuthProvider refreshes the session and retries the request after an expired access token βœ… passed 108 ms
AuthContext AuthProvider clears auth state when token refresh fails βœ… passed 107 ms
AuthContext AuthProvider updates the stored auth user when profile data changes βœ… passed 108 ms
AuthContext AuthProvider registers without creating a persisted session βœ… passed 57 ms
AuthContext AuthProvider attaches the bearer token to outgoing API requests βœ… passed 107 ms
AuthContext AuthProvider clears auth state when the API returns 401 βœ… passed 106 ms
AuthContext AuthProvider resets loading when login fails βœ… passed 59 ms
FeedScreen FeedScreen shows loading skeletons while fetching βœ… passed 59 ms
FeedScreen FeedScreen renders story cards after a successful fetch βœ… passed 55 ms
FeedScreen FeedScreen hides top feed controls when search controls are disabled βœ… passed 52 ms
FeedScreen FeedScreen shows an empty state when no stories are returned βœ… passed 52 ms
FeedScreen FeedScreen shows a filtered empty state when search is active and no stories match βœ… passed 53 ms
FeedScreen FeedScreen loads the next page when the list reaches the end βœ… passed 66 ms
FeedScreen FeedScreen uses Most Recent as the default sort request βœ… passed 52 ms
FeedScreen FeedScreen updates search query filters after debounce βœ… passed 71 ms
FeedScreen FeedScreen applies search when the search button is pressed βœ… passed 81 ms
FeedScreen FeedScreen updates advanced filters in feed requests βœ… passed 110 ms
FeedScreen FeedScreen applies the default year filters when submitted unchanged βœ… passed 75 ms
FeedScreen FeedScreen closes the filter panel when tapping outside of it βœ… passed 59 ms
FeedScreen FeedScreen resets only filter fields and preserves the search query βœ… passed 133 ms
FeedScreen FeedScreen syncs draft filters from incoming initial filters βœ… passed 68 ms
FeedScreen FeedScreen opens story details when a card is pressed βœ… passed 53 ms
SubmissionScreen SubmissionScreen shows inline validation errors when required fields are missing βœ… passed 44 ms
SubmissionScreen SubmissionScreen marks blank required inputs with red outer borders βœ… passed 29 ms
SubmissionScreen SubmissionScreen scrolls to the topmost missing required field on failed submit βœ… passed 29 ms
SubmissionScreen SubmissionScreen scrolls to the year field when only year is missing βœ… passed 66 ms
SubmissionScreen SubmissionScreen submits the story payload and returns the user to the feed on success βœ… passed 73 ms
SubmissionScreen SubmissionScreen shows an inline image validation error for oversized uploads βœ… passed 60 ms
FilterPanel FilterPanel forwards location and valid year filter updates βœ… passed 20 ms
FilterPanel FilterPanel shows the expected default year values when initialized βœ… passed 8 ms
FilterPanel FilterPanel accepts only positive four-digit-or-shorter numeric years βœ… passed 7 ms
FilterPanel FilterPanel clamps manual year entries to the supported bounds on blur βœ… passed 5 ms
FilterPanel FilterPanel disables increment once the maximum year is reached βœ… passed 5 ms
FilterPanel FilterPanel increments and decrements year values with the step buttons βœ… passed 5 ms
FilterPanel FilterPanel allows entering an end year even before the start year and shows the range warning βœ… passed 13 ms
FilterPanel FilterPanel resets the filter form βœ… passed 5 ms
ProfileCompletionScreen ProfileCompletionScreen validates required fields before allowing submission βœ… passed 41 ms
ProfileCompletionScreen ProfileCompletionScreen moves through optional steps one by one with continue βœ… passed 30 ms
ProfileCompletionScreen ProfileCompletionScreen submits with only required fields when optional steps are left blank βœ… passed 42 ms
ProfileCompletionScreen ProfileCompletionScreen uploads a selected photo after saving the profile payload βœ… passed 146 ms
StoryRepository StoryRepositoryImpl fetches a story detail record and merges mapped comments βœ… passed 2 ms
StoryRepository StoryRepositoryImpl returns null when the story is not found βœ… passed 0 ms
StoryRepository StoryRepositoryImpl deletes a story through the remote source βœ… passed 0 ms
StoryRepository StoryRepositoryImpl maps a GeoJSON FeatureCollection into mobile story pins βœ… passed 0 ms
StoryRepository StoryRepositoryImpl returns an empty list when the GeoJSON FeatureCollection is empty βœ… passed 0 ms
storiesRemoteSource storiesRemoteSource attaches preview text to GeoJSON features when the map endpoint omits it βœ… passed 3 ms
storiesRemoteSource storiesRemoteSource normalizes the legacy map response shape without an extra enrichment request βœ… passed 0 ms
storyMappers story mappers maps the backend story detail payload into the mobile story entity βœ… passed 1 ms
storyMappers story mappers keeps anonymous fallback when a contributor exists but their public name is hidden βœ… passed 0 ms
storyMappers story mappers maps backend comments into the mobile comment shape βœ… passed 0 ms
storyMappers story mappers maps a GeoJSON feature into the mobile story map pin shape βœ… passed 1 ms
AuthFormCard AuthFormCard toggles password visibility on sign in βœ… passed 25 ms
AuthFormCard AuthFormCard toggles confirm password visibility on registration βœ… passed 8 ms
storyService storyService delegates getStories to the repository with filters βœ… passed 1 ms
storyService storyService delegates getMapPins to the repository with filters βœ… passed 1 ms
storyService storyService delegates deleteStory to the repository βœ… passed 0 ms
storyService storyService delegates getFeed to the feed service βœ… passed 0 ms
MapRepository MapRepositoryImpl returns one marker per story pin without clustering βœ… passed 1 ms
FeedCard FeedCard renders the story fields and media indicator βœ… passed 18 ms
FeedCard FeedCard navigates when the card is pressed βœ… passed 3 ms
FeedCard FeedCard hides the media indicator when the story has no media βœ… passed 2 ms
Toast Toast shows a success toast βœ… passed 15 ms
Toast Toast dismisses a toast βœ… passed 6 ms
useDebounce useDebounce returns the latest value only after the delay elapses βœ… passed 16 ms
feedRemoteSource feedRemoteSource uses the search endpoint when a text query is provided βœ… passed 3 ms
feedRemoteSource feedRemoteSource uses the feed endpoint when no text query is provided βœ… passed 1 ms
EmptyState EmptyState renders default content βœ… passed 15 ms
EmptyState EmptyState renders custom content βœ… passed 2 ms
EmptyState EmptyState triggers action callback βœ… passed 3 ms
linking linking defines the profile and story route patterns βœ… passed 1 ms
linking linking builds and parses profile and story paths βœ… passed 1 ms
ErrorState ErrorState renders default content βœ… passed 16 ms
ErrorState ErrorState renders custom content βœ… passed 2 ms
ErrorState ErrorState triggers retry callback βœ… passed 2 ms
FilterChips FilterChips removes a single active filter chip βœ… passed 12 ms
FilterChips FilterChips clears all active filters βœ… passed 2 ms
NotFoundPage NotFoundPage renders default content βœ… passed 11 ms
NotFoundPage NotFoundPage renders custom content βœ… passed 6 ms
NotFoundPage NotFoundPage triggers go back callback βœ… passed 2 ms
SearchInput SearchInput renders the current query and forwards text changes βœ… passed 18 ms
SearchInput SearchInput runs the explicit search action from the button βœ… passed 6 ms
feedService feedService delegates getFeed to the repository βœ… passed 1 ms
LoadingSkeleton LoadingSkeleton renders Skeleton without crashing βœ… passed 23 ms
LoadingSkeleton LoadingSkeleton renders SkeletonCard without crashing βœ… passed 5 ms
LoadingSkeleton LoadingSkeleton renders SkeletonPage without crashing βœ… passed 11 ms
client apiClient returns a helpful error when the transport fails before receiving a response βœ… passed 16 ms
Loader Loader renders the default loading message βœ… passed 14 ms
Loader Loader renders a custom message βœ… passed 1 ms
⚠️ **GitHub.com Fallback** ⚠️