File Requests - QA Test Plan
Overview
Section titled “Overview”The File Requests app enables users to create shareable upload links where recipients can submit files. The requester can set constraints (file types, size limits, deadlines), review submissions, approve/reject them, and import approved files into the Documents app. Routes are under /business/apps/filerequests/.
Request Statuses
Section titled “Request Statuses”active— Accepting submissionsclosed— Manually closed by requesterexpired— Past the expiry date
Submission Statuses
Section titled “Submission Statuses”pending— Awaiting reviewapproved— Accepted by requesterrejected— Declined by requester (with optional reason)
1. File Requests List
Section titled “1. File Requests List”| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| FR-001 | List page loads | User is logged in | Navigate to /business/apps/filerequests | Page shows header with count badge, “New Request” button, filter controls, and request list | P0 |
| FR-002 | Request cards display correctly | Requests exist | View list | Each card shows subject, status badge, created date, expires date (if set), and max documents (if set) | P0 |
| FR-003 | Status badges render correctly | Requests with various statuses | View list | Active = default, Closed = secondary, Expired = destructive | P1 |
| FR-004 | Empty state when no requests | No requests exist | View list | ”No file requests found” message shown | P1 |
| FR-005 | Request card links to detail | Requests exist | Click on a request card | Navigates to /business/apps/filerequests/{id} | P0 |
| FR-006 | Count badge shows total | Requests exist | View header | Badge shows correct total count | P1 |
2. Filters & Search
Section titled “2. Filters & Search”| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| FR-010 | Search by keyword | Requests exist | Type search term in search box, press Enter | URL updates with ?search=term; list filters by subject matching search | P0 |
| FR-011 | Filter by status - Active | Active and closed requests exist | Select “Active” from status dropdown | URL updates with ?status=active; only active requests shown | P0 |
| FR-012 | Filter by status - Closed | Closed requests exist | Select “Closed” from status dropdown | Only closed requests shown | P0 |
| FR-013 | Filter by status - Expired | Expired requests exist | Select “Expired” from status dropdown | Only expired requests shown | P0 |
| FR-014 | Clear status filter | Status filter is applied | Select “All Statuses” | Status param removed from URL; all requests shown | P1 |
| FR-015 | Combined search and status filter | Various requests exist | Enter search term and select status | Both params in URL; list filtered by both criteria | P1 |
| FR-016 | Pagination resets on filter change | Multiple pages of requests | Apply a new filter | Page param is removed from URL | P2 |
3. Create File Request
Section titled “3. Create File Request”| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| FR-020 | Create page loads | User is logged in | Navigate to /business/apps/filerequests/new | Form shows Subject, Description, Password, Max Documents, Max File Size, Allowed Extensions, and Expiry Date fields | P0 |
| FR-021 | Create request with all fields | User is logged in | 1. Enter subject “Tax Documents 2025” 2. Enter description 3. Set password 4. Set max docs to 5 5. Set max size to 10 MB 6. Enter “pdf, docx” for extensions 7. Set expiry date 8. Submit | Request created; user redirected to /business/apps/filerequests | P0 |
| FR-022 | Subject is required | User is logged in | Leave subject empty, submit | Validation error on subject field | P0 |
| FR-023 | Create with only required fields | User is logged in | Enter subject only, submit | Request created successfully with defaults (unlimited docs, 25MB size, all types, no expiry) | P0 |
| FR-024 | Allowed extensions parsing | User is logged in | Enter “pdf, docx, jpg” in extensions field | Extensions parsed as array ["pdf", "docx", "jpg"]; leading dots stripped | P1 |
| FR-025 | Allowed extensions with dots | User is logged in | Enter “.pdf, .docx” in extensions field | Leading dots stripped; stored as ["pdf", "docx"] | P1 |
| FR-026 | Password protection is optional | User is logged in | Leave password empty, submit | Request created without password protection | P1 |
| FR-027 | Expiry date is optional | User is logged in | Leave expiry date empty, submit | Request created without expiry date | P1 |
| FR-028 | Cancel returns to list | User is on create page | Click “Cancel” | Navigates to /business/apps/filerequests | P2 |
| FR-029 | Submit shows loading state | User submits form | Observe submit button | Spinner shown; button disabled during request | P1 |
| FR-030 | Server error shows toast | Server returns error | Submit (simulated failure) | Error toast with server message | P1 |
| FR-031 | Unauthenticated user redirected | User not logged in | Navigate to create page | Redirected to /auth/login | P0 |
4. Request Detail Page
Section titled “4. Request Detail Page”| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| FR-040 | Detail page loads | Request exists, user authenticated | Navigate to /business/apps/filerequests/{id} | Page shows subject, status badge, description, shareable upload link, constraints (max docs, max size, allowed extensions, password protected), dates, and submissions table | P0 |
| FR-041 | Shareable link displays | Request loaded | View upload link section | Public URL displayed as {origin}/file-request/{id} with Copy button | P0 |
| FR-042 | Copy shareable link | Detail page loaded | Click “Copy” button | Link copied to clipboard; toast “Link copied to clipboard” | P1 |
| FR-043 | Constraints display correctly | Request has constraints set | View info card | Max Documents, Max File Size (MB), Allowed Extensions (comma-separated or “All types”), and Password Protected (Yes/No) shown | P0 |
| FR-044 | Close active request | Request status is active | Click “Close Request” | Request status changes to closed; toast success | P0 |
| FR-045 | Close button hidden for non-active | Request is closed or expired | View header actions | ”Close Request” button is not rendered | P1 |
| FR-046 | Delete request with confirmation | Request exists | Click “Delete” button, confirm browser dialog | Request deleted; user redirected to /business/apps/filerequests | P0 |
| FR-047 | Cancel delete | Delete confirmation shown | Click cancel in confirm dialog | Request remains; user stays on page | P2 |
5. Submission Review
Section titled “5. Submission Review”| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| FR-050 | Submissions table displays | Submissions exist | View detail page | Table shows File name, Submitter (name + email), Status badge, Date, Size (formatted), and action buttons | P0 |
| FR-051 | Approve pending submission | Submission status is pending | Click approve (check) button | Submission status changes to approved; toast “Submission approved” | P0 |
| FR-052 | Reject pending submission | Submission status is pending | Click reject (X) button | Submission status changes to rejected; toast “Submission rejected” | P0 |
| FR-053 | Reject with reason | Submission status is pending | Enter rejection reason, click reject | Submission rejected with reason displayed beneath status badge | P1 |
| FR-054 | Approve/reject buttons hidden for non-pending | Submission is approved or rejected | View actions column | No approve/reject buttons shown | P1 |
| FR-055 | File size formatting | Various file sizes | View size column | Bytes shown as B/KB/MB with one decimal (e.g., “2.5 MB”, “512 KB”) | P2 |
| FR-056 | Empty submissions state | No submissions yet | View submissions section | ”No submissions yet. Share the link to start receiving files.” message | P1 |
6. Import to Documents
Section titled “6. Import to Documents”| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| FR-060 | Import button shown for approved, non-imported | Submission is approved and not yet imported | View actions | Import (file-import) icon button visible | P0 |
| FR-061 | Import submission to documents | Approved submission, not imported | Click import button | Submission imported to Documents app; toast “Imported to documents”; “Imported” badge appears | P0 |
| FR-062 | Imported badge shown | Submission has imported_document_id | View actions | ”Imported” outline badge shown instead of import button | P1 |
| FR-063 | Import button hidden for non-approved | Submission is pending or rejected | View actions | No import button rendered | P1 |
7. Authorization & Error Handling
Section titled “7. Authorization & Error Handling”| ID | Description | Preconditions | Steps | Expected Result | Priority |
|---|---|---|---|---|---|
| FR-070 | Unauthenticated user gets 401 on detail | Not logged in | Navigate to request detail | 401 “Unauthorized” error | P0 |
| FR-071 | Non-existent request returns 404 | Invalid request ID | Navigate to /business/apps/filerequests/nonexistent | 404 “File request not found” error | P1 |
| FR-072 | Unauthenticated user gets empty list | Not logged in | Navigate to list page | Empty requests array returned; no server error | P1 |
| FR-073 | Action failures return 500 with message | Server error on approve/reject/import | Submit action (simulated failure) | 500 error with descriptive message | P1 |