Milestone Review - bounswe/bounswe2026group4 GitHub Wiki
CMPE354 D6-D7 Milestone Deliverable
Project: Local History Story Map (StoryMap)
Group: 4
Repository: bounswe/bounswe2026group4
Live URL: https://storymap.page
Tech Stack: React 19 (Vite) + Django 4.2 (DRF) + React Native (Expo 54) + MySQL 8.0
Table of Contents
D6. Milestone Review
D6.1 Project Status
StoryMap is a platform where users share historical stories tied to geographic locations. The application features a map-centric interface where stories are pinned to real-world coordinates, allowing users to explore narratives across time and space. The MVP was successfully demonstrated on April 8, 2026, with all core features functional and deployed at https://storymap.page.
Decisions Made During Development
- Map-centric interface chosen as the core UX paradigm (per Customer Meeting 1, Feb 18). The map is the primary entry point for discovering stories.
- Global scope for stories -- not limited to Turkey or any specific region. Users can share stories from anywhere in the world.
- Guest access provides read-only browsing; registration is required for creating stories and interacting (like, comment, save).
- No strict pre-verification of stories. The platform uses a reporting and moderation approach similar to Google Maps, allowing community-driven content quality control.
- Flexible time resolution for stories: exact year, approximate year, decade, or year range -- accommodating the inherently imprecise nature of historical memory.
- Tech stack selection: React (Vite) for web, Django REST Framework for backend, React Native (Expo) for mobile, MySQL for data storage.
- Database hosting initially on Google Cloud, later migrated to a DigitalOcean VPS for cost efficiency and operational simplicity.
- Mobile framework switch: The mobile team switched from native development to React Native (Expo) to accelerate cross-platform development.
- PR review policy: All pull requests require at least 1 review approval before merge, enforced throughout the project lifecycle.
Customer Feedback Summary
Customer Meeting 1 (February 18, 2026) -- Customer: Kutay Eroglu
- The map is a MUST -- it is the core interface element of the platform.
- Global scope is important; users should be able to explore stories from locations they have never visited.
- Guest users should be able to see stories in read-only mode without registration.
- Users can post stories about places they do not currently live in (e.g., family stories, childhood memories).
- Filtering and searching are ABSOLUTE MUST features.
- Like/dislike, commenting, and saving stories should all be supported.
- Time representation should be flexible: "in my childhood," decades, year ranges are all valid.
- Notifications are not in scope for the MVP.
- Moderation should follow a reporting-based approach (similar to Google Maps).
Customer Meeting 2 (February 25, 2026) -- Stakeholder: Utkan Gezer
- Story location refers to the place the memory is assigned to, not merely a map pinpoint.
- Story components include a marginal distinguishing factor (time), a social component, and the wish to share.
- Domain-specific input design is needed for time periods, tags, and metadata.
MVP Presentation Feedback (April 8, 2026)
- The evaluator liked the scenario and world-building approach.
- The evaluator was satisfied with the demo overall.
- Positive feedback on the use of childhood imagery in the demo scenario.
- The evaluator strongly emphasized wanting a timeline feature in the final milestone.
- Expected behavior: user should be able to see all the stories associated with a place in a timeline format.
Requirements Elicitation Questions
The team conducted structured elicitation across the following categories:
- Vision and Scope: Primary goal of the platform (preservation, education, community building), target user demographics, geographic coverage scope.
- User Profile Management: User roles and permissions, guest access boundaries, profile information and privacy controls, reward/gamification systems, registration flow, age restrictions.
- Post Browsing: Default view on the main page, display formats (map vs. feed vs. timeline), search capabilities, filtering options, who can create posts, bookmark functionality, place profile pages.
- Media Formats: Supported media types (text, image, audio, video), interaction features (like, comment, share), story metadata requirements, notification preferences, transcription support, multi-location stories.
- Ethics and Privacy: Complaint handling procedures, user privacy controls, content verification approach, handling of contradicting stories about the same event or location.
D6.2 Deliverables
Documentation Deliverables
| Deliverable | Status | Details |
|---|---|---|
| Software Requirements Specification | Completed | Full SRS published on the project wiki with numbered requirements covering functional and non-functional aspects |
| Software Design (UML Diagrams) | Completed | Use case, class, and sequence diagrams published on the wiki |
| Scenarios and Mockups | Completed | 4 detailed scenarios with corresponding web and mobile mockups |
| Project Plan, Communication Plan, RAM | Completed | Project planning, regular weekly meetings, milestone tracking, and responsibility assignment documentation prepared throughout the semester |
| API Documentation | Completed | Comprehensive API documentation prepared with endpoint descriptions, request/response structures, and example usages |
| UX Design | Completed | Domain-specific UX decisions documented through scenarios, mockups, and interface design artifacts for both web and mobile |
Software Deliverables
| Deliverable | Status | Details |
|---|---|---|
| Pre-release Software (0.1.0-alpha) | Completed | Deployed at https://storymap.page |
| User Authentication (Register/Login/Logout) | Completed | JWT-based authentication with token refresh on all platforms |
| Guest Access (Read-Only Browsing) | Completed | Implemented across web and mobile |
| Story CRUD | Completed | Create, read, update, delete with all metadata fields |
| Map View with Story Pins | Completed | Leaflet on web, react-native-maps on mobile |
| Feed View with Cards and Pagination | Completed | Sorting (recent) and filtering support |
| Story Detail Page | Completed | Full narrative, metadata, image attachment support, and interactions |
| Search and Filter | Completed | By title, location, and time period |
| Like/Comment System | Completed | With atomic counter updates via Django signals |
| Image Upload | Completed | For story media attachments |
| User Profile | In Progress | Basic profile functionality implemented; full privacy controls deferred |
| Story Deletion | Completed | With confirmation flow on web and mobile |
| Docker + Deployment | Completed | Docker Compose (dev + prod), Nginx reverse proxy, CD pipeline |
| CI/CD Pipeline | Completed | Backend tests, frontend lint+build, mobile typecheck+tests |
| Android APK Build | Completed | GitHub Action for automated APK generation |
Evaluation of Deliverable Status and Their Impact on the Project Plan
Overall, the milestone deliverables show that the project successfully completed the core documentation and MVP software outputs required for the current phase. Foundational deliverables such as the Software Requirements Specification, UML-based software design documents, scenarios and mockups, API documentation, and UX design artifacts were completed and published in a structured manner. On the software side, the team was able to deliver the main end-to-end MVP flow, including authentication, guest browsing, story creation and display, map and feed interfaces, story interactions, deployment, and CI/CD support. This indicates that the milestone goals were largely achieved and that the project progressed in alignment with its intended MVP scope.
At the same time, the deliverable status also highlights the boundaries of the MVP and the trade-offs made during planning and implementation. Some features originally defined in the broader requirements, such as notifications, reporting and moderation, bookmarks, gamification, timeline view, geolocation radius filtering, and richer media support, were intentionally left incomplete or postponed. In most of these areas, groundwork such as data models, validation rules, or partial backend support has already been prepared, which reduces the expected implementation risk for the final milestone.
From a project planning perspective, the completion of the core MVP deliverables had a positive effect on the overall plan because it allowed the team to establish a working, deployed, and testable system before moving on to more advanced features. This reduced uncertainty for the final milestone and created a stable baseline for integration work. However, the milestone also showed that some initially envisioned features required more time and coordination than expected, especially those involving cross-platform UI work, advanced interaction flows, and additional backend endpoints. As a result, the project plan evolved toward prioritizing core user-facing functionality first and deferring non-critical or higher-complexity features to the final milestone.
In conclusion, the current deliverable status reflects a successful MVP strategy: the project achieved its essential goals, delivered the main user journey in a deployable form, and created a solid technical and documentation foundation for the remaining milestone work. The incomplete deliverables do not indicate a planning failure; rather, they reflect conscious scope control decisions made to ensure that the most critical features were completed with adequate implementation, testing, documentation, and deployment quality.
UX Design with Focus on Domain-Specific Nature
API Documentation
D6.3 Requirements
This milestone focused on implementing the requirements necessary to deliver the core MVP flow of the platform. Based on the MVP scope and feature requirements mapping, the covered requirements are grouped below by functional area.
1. User Role and Core Interaction Requirements
The following guest and registered user requirements were fully covered during MVP:
-
1.1.1.1 Unregistered users shall be able to view stories on the map interface.
-
1.1.1.2 Unregistered users shall be able to view stories in feed format.
-
1.1.1.3 Unregistered users shall be able to open and read full story details.
-
1.1.1.4 Unregistered users shall be able to view story metadata.
-
1.1.1.5 Unregistered users shall be able to search locations on the map interface.
-
1.1.1.6 Unregistered users shall be able to filter stories based on metadata.
-
1.1.1.7 Unregistered users shall be able to register/create an account.
-
1.1.1.8 Unregistered users shall have read-only access and shall not be able to perform restricted actions such as like, comment, save, submit, or report stories.
-
1.1.2.1 Registered users shall be able to log in by providing email and password and log out securely.
-
1.1.2.2 Registered users shall be able to create and submit stories.
-
1.1.2.3 Registered users shall be able to edit their own stories.
-
1.1.2.4 Registered users shall be able to like stories.
-
1.1.2.5 Registered users shall be able to comment on stories.
-
1.1.2.10 Registered users shall be able to do everything the unregistered users can do.
The following user-related requirement was partially covered:
-
1.1.2.7 Registered users shall be able to remove their like, comment and bookmark.
MVP coverage includes removing likes and comments, but not bookmark removal, since saved stories/bookmarks were deferred. -
1.1.2.9 Registered users shall be able to manage their profile information and visibility settings.
MVP coverage was limited to a minimal profile implementation centered on username, contribution count, submitted stories, and a limited subset of profile fields.
2. Authentication and Profile Requirements
The following authentication requirements were fully covered during MVP:
- 1.2.1.1 The system shall require a unique email address during registration.
- 1.2.1.3 The system shall require a unique user name during registration.
- 1.2.1.4 The system shall require a password that meets the specified criteria during registration.
- 1.2.1.5 The system shall require password confirmation during registration.
- 1.2.1.6 The system shall authenticate users via email and password during log-in.
- 1.2.1.7 The system shall allow users to log out of their account.
- 1.2.1.8 The system shall allow users to change their password after logging in.
- 1.2.1.10 The system shall provide meaningful error messages for failed login attempts without exposing personal data.
The following profile-related requirement was partially covered:
- 1.2.2.1 The system shall allow users to optionally provide and update profile information.
Within MVP, this was covered only partially, limited to bio support rather than the full profile field set.
3. Story Display and Discovery Requirements
The following map, feed, and story page requirements were fully covered during MVP:
-
1.3.1.1 The platform shall allow users to select a specific geographic location on the map when creating a story.
-
1.3.1.2 The system shall require users to provide a place name in addition to selecting the geographic location.
-
1.3.1.3 The platform shall display stories on the map, each represented by a pin associated with a specific geographic coordinate.
-
1.3.1.5 Clicking on a pin shall display a short story preview including place name, time information, and story title.
-
1.3.1.6 The map shall support zooming and panning.
-
1.3.1.7 The map shall allow users to open the full story page by clicking on the preview.
-
1.3.1.8 The map shall update displayed stories based on active search queries and filters.
-
1.3.2.1 The platform shall provide a feed view displaying stories in card format.
-
1.3.2.2 Each story card in the feed shall include title, location, date or time period, short preview text, and media indicators.
-
1.3.2.3 The feed shall preserve applied filters and search criteria when a user clicks on a story and returns from the story page.
-
1.3.2.5 The feed shall support continuous scrolling or pagination.
-
1.3.3.1 Selecting a story from the feed or map shall open a dedicated story page.
-
1.3.3.2 The story page shall display the full written narrative.
-
1.3.3.3 The story page shall display story metadata including location, year or approximate time period, contributor name if visible, submission date, number of likes, and comments.
The following discovery-related requirements were partially covered:
-
1.3.2.4 The feed shall allow sorting by most recent and most popular.
MVP supports sorting by most recent only; most popular was deferred. -
1.3.5.1 The platform shall allow users to search stories by story title, story narrative text, tags, and location name.
MVP coverage includes search by story title and location name only. Search by narrative text and tags was deferred. -
1.3.5.2 The system shall support filtering based on time information, location, and tag/topic/theme.
MVP supports filtering by time information and location only. Tag/topic/theme-based filtering was deferred. -
1.3.5.5 The system shall update map, feed, and timeline results consistently based on active search and filter criteria.
MVP covers consistent updates for map and feed, but not for timeline, since the timeline feature was deferred.
4. Story Submission and Media Requirements
The following submission requirements were fully covered during MVP:
- 1.4.1.1 The system shall require a minimum set of fields for story submission to support authenticity and discoverability.
- 1.4.1.2 The system shall support flexible time resolution for stories.
- 1.4.1.4 The system shall allow users to submit stories associated with locations different from their profile location.
The following media and lifecycle requirements were partially covered:
-
1.4.2.1 The system shall support story media uploads including images, audio recordings, and video.
MVP supports image uploads only. Audio and video were deferred. -
1.4.2.3 The system shall validate media file type and file size during upload.
This requirement was covered for image uploads within MVP scope. -
1.4.2.4 The system shall associate uploaded media with the story record and preserve media metadata needed for rendering.
This was covered only for the image-upload flow implemented in MVP. -
1.4.3.1 The system shall maintain a story status, including at minimum Published and Removed.
This requirement was covered at the backend level only during MVP.
5. Non-Functional Requirements
The following non-functional requirements were fully covered during MVP:
- 2.2.2 All forms shall provide clear validation messages for incorrect or missing inputs.
- 2.4.1 All communication between client and server shall use HTTPS.
- 2.4.2 User passwords shall be stored securely using hashing mechanisms.
- 2.4.3 The system shall enforce role-based authorization for guest, registered user, and admin actions.
- 2.5.1 The platform shall function correctly on modern web browsers (Chrome, Firefox, Edge).
- 2.5.2 The platform shall support responsive layouts for desktop and mobile screen sizes.
The following non-functional requirements were partially covered:
-
2.1.1 The system shall respond to common user actions within 2 seconds under normal usage conditions.
-
2.1.2 Search and filtering operations shall return results within 2 seconds for typical data sizes.
-
2.1.3 The system shall support at least 100 concurrent active users while maintaining the defined response time requirements.
Performance targets were addressed on a best-effort basis during MVP, but were not treated as fully validated completed requirements. -
2.2.1 The platform shall provide a consistent interface across map, feed, timeline, and story pages.
MVP covers consistency across implemented views, but not across the timeline interface, since the timeline feature was deferred.
6. Explicitly Deferred Requirements
The following requirement groups were explicitly deferred from MVP scope:
- 1.1.2.6 Saved stories / bookmarks
- 1.1.2.8 Reporting stories and comments
- 1.1.2.11 Account deletion with anonymization
- 1.1.3.1β1.1.3.7 Admin moderation functionality
- 1.2.1.2 Email verification via 6-digit code
- 1.2.1.9 Password reset via email
- 1.2.2.2β1.2.3.2 Full profile privacy and public profile display features
- 1.3.4.1β1.3.4.4 Timeline feature
- 1.3.5.3, 1.3.5.6β1.3.5.11 Advanced filtering, filter reset behavior, and current-location radius filtering
- 1.3.6.1β1.3.6.5 Tag creation, management, and tag-based browsing
- 1.4.2.2 Support for combining multiple media types in a single story beyond the MVP image-only flow
- 1.5.1.1β1.5.1.3 Reporting workflow
- 1.6.1.1β1.6.3.2 Notifications
- 1.7.1β1.7.2.3 Points, badges, and gamification features.
D6.4 Testing
The full test plan and coverage documentation is available on the wiki: Test Plan & Coverage.
D6.4.1 Test Plan and Strategy
Testing Philosophy
The project follows a test pyramid strategy: a broad base of unit tests for models, serializers, and utility functions; a middle layer of integration tests for API endpoints and component interactions; and targeted end-to-end validation through manual demo rehearsals. Every feature pull request must include corresponding tests.
Core Principles:
- Isolation: Each test is independent β no shared mutable state between test cases. Backend tests use Django's
TransactionTestCaseorTestCasewith per-test database rollback. Frontend and mobile tests use fresh mock adapters per test. - Real database for backend: Backend tests run against a real MySQL 8.0 instance (not SQLite or mocks) to catch database-specific issues (foreign key constraints, migration problems, charset handling).
- Fast execution: Frontend tests complete in ~5.5s, mobile tests in ~5.4s. Backend uses MD5 password hasher in test settings (instead of bcrypt) for faster auth-related tests.
- User-centric queries: Frontend and mobile tests use
@testing-librarywith queries likegetByRole,getByText,getByPlaceholderTextrather than implementation-specific selectors, ensuring tests reflect real user interactions. - Mocked externals: API calls are intercepted via
axios-mock-adapter(frontend) and Jest mocks (mobile) to isolate UI behavior from network dependencies.
What We Test Per Layer
Backend (Django REST Framework):
| Layer | What is tested | Example |
|---|---|---|
| Models | Field validation, constraints, defaults, string representations, relationships | test_story_requires_title, test_like_unique_constraint, test_user_total_points_default_zero |
| Serializers | Input validation, field inclusion/exclusion, nested relationships, error messages | test_register_password_mismatch, test_story_serializer_includes_contributor_name |
| Services | Business logic, point calculations, badge awarding, counter updates | test_create_story_service, test_like_increments_count |
| Views | HTTP status codes, authentication, permissions, pagination, filtering, error responses | test_unauthenticated_user_cannot_create_story, test_feed_pagination, test_search_by_location |
| Permissions | Role-based access (guest vs registered vs admin), object-level permissions (owner-only edit/delete) | test_owner_can_delete_story, test_non_owner_cannot_update |
| Validators | Custom validation functions (year range, file size, tag format) | test_year_range_start_before_end |
Frontend (React + Vitest):
| Layer | What is tested | Example |
|---|---|---|
| Pages | Full page rendering, form submission flows, API integration, routing, loading/error states | test_login_submits_credentials, test_feed_shows_stories, test_submit_story_with_image |
| Components | Rendering with various props, user interactions (click, type, select), conditional UI | test_like_button_toggles, test_comment_section_posts_comment, test_map_renders_markers |
| UI Primitives | Rendering variants, accessibility, prop handling | test_loading_skeleton_renders, test_error_state_shows_retry |
| Services | API call construction, token management, interceptor behavior, error handling | test_api_refreshes_expired_token, test_story_service_creates_story |
| Hooks/Context | State management, side effects, context propagation | test_auth_context_provides_user, test_filter_state_resets_page |
Mobile (React Native + Jest):
| Layer | What is tested | Example |
|---|---|---|
| Screens | Screen rendering, data loading, user interactions, navigation triggers | test_feed_screen_loads_stories, test_map_screen_renders_markers, test_story_screen_shows_comments |
| Navigation | Role-based routing (guest/user/admin), back stack management, deep linking | test_guest_sees_auth_screen, test_user_sees_feed, test_back_navigation |
| Auth | Login/register flows, token persistence, session handling, auto-refresh | test_login_stores_tokens, test_logout_clears_session |
| Services/Data | API calls, data mapping, repository pattern, remote data sources | test_feed_service_fetches_stories, test_story_mapper_transforms_api_response |
| Shared Components | Reusable UI components, filter interactions, search behavior | test_filter_panel_applies_filters, test_search_input_debounces |
CI Pipeline Integration
Tests are enforced via GitHub Actions (.github/workflows/ci.yml) with three parallel jobs on every push to main and on pull requests:
| Job | Runner | Steps | Dependencies |
|---|---|---|---|
backend-tests |
Ubuntu, Python 3.12 | pytest -v |
MySQL 8.0 service container |
frontend-checks |
Ubuntu, Node 20 | npm run lint, npm run build |
β |
mobile-checks |
Ubuntu, Node 20 | npm run typecheck, npm test -- --runInBand |
β |
Test Configuration
| Platform | Config File | Key Settings |
|---|---|---|
| Backend | backend/pytest.ini |
DJANGO_SETTINGS_MODULE=config.settings.test, pattern: tests/test_*.py |
| Backend | config/settings/test.py |
DEBUG=False, MD5PasswordHasher, in-memory email backend |
| Frontend | frontend/vite.config.js (inline) |
Environment: jsdom, globals: true, CSS: enabled, setup: src/test/setup.js |
| Mobile | mobile/package.json |
Preset: jest-expo, setup: jest.setup.ts |
Shared backend test fixtures are defined in backend/conftest.py: user, second_user, admin_user, and story β providing consistent test data across all apps.
D6.4.2 Test Execution Reports
Generated Unit Test Reports are here
Backend Test Breakdown (569 tests across 29 files)
| App | Test Files | Test Count | What is Covered |
|---|---|---|---|
| users | test_models, test_permissions, test_serializers, test_services, test_views |
161 | User creation, email validation, password hashing, JWT auth (register/login/logout), token refresh, profile CRUD, privacy controls, role-based permissions |
| stories | test_models, test_serializers, test_services, test_views |
171 | Story CRUD, field validation (time_type, coordinates, required fields), feed endpoint (sorting, filtering, pagination), map endpoint (bounding box), search endpoint, story deletion with cascade |
| interactions | test_models, test_serializers, test_services, test_views |
98 | Comment creation/deletion, like/unlike toggle, saved stories, unique constraints (no duplicate likes), Django signal-based counter sync (like_count, save_count), anonymous comment handling on user deletion |
| media | test_models, test_serializers, test_services, test_views |
37 | Image upload, file type validation (JPEG/PNG), file size tracking, media association with stories, display ordering |
| common | test_exceptions, test_permissions, test_validators |
28 | Custom exception classes, permission classes (IsOwnerOrReadOnly, IsAdminUser), year range validator, file size validator |
| gamification | test_models, test_services, test_views |
22 | Point transactions (award/deduct), badge criteria (stories_published, points_total), badge awarding, immutable audit log |
| tags | test_models, test_views |
22 | Tag creation, lowercase-dash format validation, story-tag M2M (max 3), denormalized story_count |
| notifications | test_models, test_views |
15 | Notification types (new_comment, new_like, etc.), read/unread status, per-type preferences |
| reports | test_models, test_views |
15 | Report creation, reason enum, status transitions, duplicate prevention (unique constraint per user+story) |
Commands:
# Run backend tests (requires Docker for MySQL)
docker compose run --rm web pytest -v
# Run with coverage
docker compose run --rm web pytest -v --cov=apps --cov-report=html
Frontend Test Breakdown (363 tests across 33 files)
| Category | Test Files | Count | What is Covered |
|---|---|---|---|
| Pages | FeedPage(20), LoginPage(18), RegisterPage(23), SubmitStoryPage(16), StoryDetailPage(37), ProfilePage(9), MapPage(6), NotFoundPage(5) |
134 | Full page rendering, form validation (email, password strength, required fields), API integration (success/error flows), navigation/routing, loading/error/empty states, authenticated vs guest behavior |
| Components | CommentSection(25), StoryCard(22), SearchFilter(11), FilterPanel(10), AppLayout(10), LikeButton(9), SearchBar(9), MapView(9), MapPicker(6), ActiveFilters(13), StoryDetailMap(4), StoryPopup(3), ProtectedRoute(3) |
134 | Component rendering, user interactions (click/type/submit), conditional rendering, prop handling, accessibility, responsive behavior |
| UI Primitives | EmptyState(8), ErrorState(8), Toaster(7), LoadingSpinner(6), LoadingSkeleton(5) |
34 | Variant rendering, message customization, retry callbacks, accessibility |
| Services | storyService(19), api(9), tokenStore(8), authService(6) |
42 | API call construction, request/response handling, token storage/retrieval, interceptor-based token refresh, error propagation |
| Context/Hooks | useFilterState(9), AuthContext(8), useAuth(2) |
19 | Auth state management, filter state transitions, page reset on filter change, context propagation |
Commands:
# Run frontend tests
cd frontend && npm run test:run
# Run with UI (watch mode)
cd frontend && npm run test
Mobile Test Breakdown (111 tests across 28 files)
| Category | Test Files | Count | What is Covered |
|---|---|---|---|
| Screens | StoryScreen(15), FeedScreen(13), MapScreen(8), ProfileScreen(5), SubmissionScreen(3) |
44 | Screen rendering, data loading from API, user interactions, navigation triggers, loading/error states |
| Navigation | RootNavigator(9), linking(2) |
11 | Role-based routing (guest β auth screen, user β feed/map, admin β moderation), back stack management, Android back button, deep link configuration |
| Auth | AuthContext(9), AuthFormCard(2) |
11 | Login/register flows, token persistence in secure storage, session restoration, auto-refresh on 401, logout cleanup |
| Services/Data | storyService(4), userService(3), StoryRepository(3), storyMappers(2), feedRemoteSource(2), feedService(1), MapRepository(1), client(1) |
17 | API calls, data transformation (API β domain models), repository pattern, error handling |
| Shared UI | FilterPanel(4), EmptyState(3), ErrorState(3), LoadingSkeleton(3), NotFoundPage(3), FilterChips(2), SearchInput(2), Toast(2), Loader(2) |
24 | Component rendering, filter application/removal, search debounce, state display variants |
| Hooks | useDebounce(1) |
1 | Timer-based debounce behavior |
Commands:
# Run mobile tests
cd mobile && npm test
# Run specific test file
cd mobile && npm test -- StoryScreen
D6.4.3 Impact Analysis
Coverage
The test suite covers 1,043 test functions across 90 test files and ~13,160 lines of test code, spanning all three platforms.
Backend Coverage (569 tests):
- All 8 Django apps have dedicated test files covering every architectural layer (models β serializers β services β views)
- All 20 active API endpoints are tested for success cases, validation errors, permission checks, and edge cases
- Database constraints (unique, foreign key, cascade delete) are explicitly verified
- Django signals for counter synchronization (like_count, save_count) are tested for consistency
- Custom permission classes tested for all role combinations (guest, registered, owner, admin)
Frontend Coverage (363 tests):
- All 8 pages have dedicated test suites covering rendering, form flows, and API integration
- All 13 interactive components tested for user interactions and conditional rendering
- All 5 UI primitives tested for variant rendering and accessibility
- All 4 API services tested for request construction and error handling
- Token refresh interceptor tested for automatic retry on 401 responses
- Filter state management tested for URL synchronization and page reset behavior
Mobile Coverage (111 tests):
- All 5 main screens tested for rendering and data loading
- Role-based navigation tested for all 3 user roles (guest, registered, admin)
- Auth flow tested end-to-end: login β token storage β session restore β refresh β logout
- Repository pattern tested at data, mapper, and service layers
- Shared UI components and filter system tested for consistent behavior across map and feed
Bugs Detected Through Testing
-
Token refresh race condition (#344, #348) β Both frontend and mobile had issues where expired JWT access tokens caused automatic logouts instead of silently refreshing. The frontend interceptor was not correctly queuing concurrent requests during refresh, and mobile was not persisting the new access token after refresh. Detected through integration testing of the auth flow and user reports during demo rehearsal. Fix: Added Axios response interceptor that catches 401 errors, calls
/auth/token/refresh/, retries the original request with the new token, and queues concurrent requests to avoid duplicate refresh calls. -
CORS misconfiguration (#148) β Frontend API calls were blocked by the browser with "No 'Access-Control-Allow-Origin' header" errors. The Django backend had no CORS configuration. Caught immediately during the first frontend-backend integration test. Fix: Added
django-cors-headersmiddleware withCORS_ALLOW_ALL_ORIGINS = Truefor development. -
Media file 404s (#298) β Uploaded story images returned HTTP 404 in the development environment. Django's
MEDIA_URLandMEDIA_ROOTwere configured, but the URL patterns for serving media files in development were missing. Discovered through the story detail page tests expecting images to render. Fix: Addedstatic(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)to URL patterns whenDEBUG=True. -
Map pin display limit (#346) β The map view was silently capping the number of visible story pins due to a low default limit in the API query. With only a few pins showing, the map appeared empty for locations with many stories. Discovered during user acceptance testing with populated data. Fix: Increased the maximum number of returned map markers to 100.
-
Navigation conflicts (#247, #338) β The FeedPage component had its own navigation header that overlapped with the AppLayout navbar, causing duplicate controls and broken routing on small viewports. Caught through
AppLayoutcomponent tests and manual mobile viewport testing. Fix: Removed the duplicate navigation from FeedPage and consolidated all navigation into AppLayout. -
Missing username in story endpoints (#270) β Story API responses did not include the contributor's username, forcing the frontend to make separate API calls for each story to show the author name. Discovered when frontend
StoryCardtests expected acontributor_namefield. Fix: Addedcontributor_nameas a read-only field toStorySerializer. -
Mobile filter panel bugs (#329) β Multiple filter-related UX issues: year input accepted invalid values, filter state was shared between map and feed views (filtering on map also filtered the feed), and resetting filters didn't clear the search text. Discovered through
FilterPanelandSearchInputtests. Fix: Separated filter state per scope (map vs feed), added year input validation, and connected reset to clear all state. -
Mobile map pin drops (#302) β Story pins on the mobile map were not rendering because the marker component was receiving coordinates as strings instead of numbers. Caught through
MapScreentests. Fix: Added numeric type coercion in the map data mapper.
D6.5 Planning and Team Process
Description
The team of 8 members was organized into three sub-teams from the start of the semester and operated under a shared set of documented processes throughout the project.
The process was centered around:
- GitHub issues and pull requests as the main technical coordination mechanism β all tasks were tracked as issues, all changes went through PRs with at least 1 required approval before merge, and no direct pushes to
mainwere permitted - Google Meets for weekly Monday evening full-team meetings (9 held across the semester), covering progress updates, blockers, and planning for the upcoming period
- Sub-team meetings held as needed for detailed technical coordination within frontend, backend, and mobile groups (7 sub-team meetings documented)
- Wiki-based documentation for planning, meeting notes, customer feedback, scenarios, and milestone artifacts β kept current throughout the semester
- Structured branching and commit conventions (
feat/,fix/,refactor/,docs/prefixes;type: descriptioncommit format) enforced across all sub-teams
Planning was organized as follows:
- The MVP was planned in a 3-week sprint (March 15 β April 6) with explicit in-scope / out-of-scope decisions, a risk register, and a Definition of Done.
- An internal Core Implementation Complete gate was set for April 2 to confirm all core features were working before the polish and deployment phase.
- The final milestone was planned in a 5-week sprint with weekly gates (FM1βFM5) covering all remaining features.
- One process adjustment was made during the semester: OΔuz Semih ArΔ±k transferred from the backend team to the mobile team due to imbalanced workloads.
- Minor scope changes happened in the Milestone plans which were all documented in the related wiki pages.
Evaluation
Version Control
Every change followed the same path: GitHub issue β named branch (feat/, fix/) β PR with at least 1 approval β merge, with direct pushes to main blocked. The review policy paid off in concrete terms β it caught allowed us to catch bugs early and fix them in their individual branches before ever being merged into main. Commit conventions (type: description) kept the history readable across three platforms.
Project Management
Running web, mobile, and backend in parallel required explicit planning. The MVP was structured as a 3-week sprint with an internal April 2 milestone (Core Implementation Complete) to confirm all end-to-end flows worked before the deployment phase began. Deferred features were listed by name with documented rationale so scope stayed stable and prevented feature creep. This allowed us to finish our MVP implementation earlier than the due date and left time for extensive testing and polishing. Our project was deployed on April 3rd, almost 5 days before the due date. Nine full-team and seven sub-team meetings were held across the semester, all documented on the wiki. Ownership was tracked via the Responsibility Assignment Matrix.
Design Tools
UML artifacts (4 use-case diagrams, 1 class diagram, 8 per-member sequence diagrams) were authored in PlantUML and committed to the wiki, keeping them version-controlled alongside the code. The same scenarios written for requirements elicitation drove the mockups β and one of them (Eski ΓΔ±nar ParkΔ±) became the narrative spine of the MVP demo, giving the design artifacts continuity all the way through to presentation day and making our implementation phase focused and easy.
Reflection
What worked well:
- The PR review policy and named scope boundary kept quality high and the final sprint focused β buffer days were spent on polish, not on firefighting integration failures.
- The CI/CD pipeline made deployment automatic on merge to main; Docker environment parity meant production behavior matched local development throughout.
- Sub-team ownership with documented API contracts let frontend, backend, and mobile progress in parallel without waiting on each other.
Areas for improvement:
- Most implementation compressed into the last two weeks of the sprint; workload should be distributed earlier, and team members should flag overloaded tasks sooner so others can step in before it compounds.
- Frontend unit tests ran locally but were not enforced in CI during the MVP phase. This is a committed fix for the final milestone, not a deferred one.
Links to Screenshots and Documents
- Communication Plan
- Development Workflow Documentation
- Responsibility Assignment Matrix
- Milestones Roadmap
- Core Implementation Complete Milestone Plan
- Core Implementation Complete - Milestone Review
- MVP Milestone Plan
- MVP Demo Plan
- Final Milestone Plan
- Meeting Notes
- Github Projects Screenshots
D7. Individual Contributions
| # | Name | Subgroup | Contribution Link |
|---|---|---|---|
| 1 | Oguz Semih Arik | Mobile | Individual Contribution MVP |
| 2 | Omer Faruk Celik | Frontend | Individual Contribution MVP |
| 3 | Sezin DoΔan | Frontend | Individual Contribution MVP |
| 4 | Ahmet Cagdas Girit | Backend | Individual Contribution MVP |
| 5 | Mert Eren Kaplan | Mobile | Individual Contribution MVP |
| 6 | Aysu Keskin | Backend, Dev-Ops | Individual Contribution MVP |
| 7 | Kemal Mahmutogullari | Dev-Ops, Backend | Individual Contributions MVP |
| 8 | Osman Yusuf Tosun | Mobile | Individual Contribution MVP |