Mobile Generated Unit Test Reports - bounswe/bounswe2026group4 GitHub Wiki
Auto-generated: 2026-04-29 18:07 UTC β CI run
β 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 |