docs: update test plan format and structure

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-30 21:01:32 -05:00
parent 0ccd26444e
commit 56d393e127

View File

@@ -1,8 +1,7 @@
# TrakQR Test Plan # TrakQR Test Plan
> Manual test plan for validating all features before release. > Manual test plan for validating all features before release.
- ## Test Plan Overview
## Test Plan Overview
| Item | Details | | Item | Details |
|------|---------| |------|---------|
@@ -10,8 +9,7 @@
| **Version** | MVP | | **Version** | MVP |
| **Test Type** | Functional / End-to-End | | **Test Type** | Functional / End-to-End |
| **Environment** | Development (`localhost:5173` + `localhost:42001`) | | **Environment** | Development (`localhost:5173` + `localhost:42001`) |
- ## How to Use This Document
## How to Use This Document
1. Work through each section sequentially 1. Work through each section sequentially
2. Check the box `[x]` when a test passes 2. Check the box `[x]` when a test passes
@@ -19,10 +17,8 @@
4. Mark `[S]` for skipped tests with reason 4. Mark `[S]` for skipped tests with reason
--- ---
- ## 1. Authentication
## 1. Authentication - ### 1.1 Registration
### 1.1 Registration
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -31,8 +27,7 @@
| 1.1.3 | Register with short password | 1. Go to `/register`<br>2. Enter valid email, password < 8 chars<br>3. Click Register | Error message about password length | [ ] | | 1.1.3 | Register with short password | 1. Go to `/register`<br>2. Enter valid email, password < 8 chars<br>3. Click Register | Error message about password length | [ ] |
| 1.1.4 | Register with existing email | 1. Register a new account<br>2. Try to register again with same email | Error message about email already in use | [ ] | | 1.1.4 | Register with existing email | 1. Register a new account<br>2. Try to register again with same email | Error message about email already in use | [ ] |
| 1.1.5 | Registration rate limiting | 1. Attempt to register 15+ times in 1 minute | Rate limit error after ~10 attempts | [ ] | | 1.1.5 | Registration rate limiting | 1. Attempt to register 15+ times in 1 minute | Rate limit error after ~10 attempts | [ ] |
- ### 1.2 Login
### 1.2 Login
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -41,8 +36,7 @@
| 1.2.3 | Login with non-existent email | 1. Go to `/login`<br>2. Enter unregistered email<br>3. Click Login | Error message (generic, no email enumeration) | [ ] | | 1.2.3 | Login with non-existent email | 1. Go to `/login`<br>2. Enter unregistered email<br>3. Click Login | Error message (generic, no email enumeration) | [ ] |
| 1.2.4 | Login rate limiting | 1. Attempt failed logins 15+ times | Rate limit error after ~10 attempts | [ ] | | 1.2.4 | Login rate limiting | 1. Attempt failed logins 15+ times | Rate limit error after ~10 attempts | [ ] |
| 1.2.5 | Redirect after login | 1. Try to access `/links` while logged out<br>2. Get redirected to login<br>3. Login successfully | Redirected back to `/links` | [ ] | | 1.2.5 | Redirect after login | 1. Try to access `/links` while logged out<br>2. Get redirected to login<br>3. Login successfully | Redirected back to `/links` | [ ] |
- ### 1.3 Password Reset
### 1.3 Password Reset
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -50,16 +44,14 @@
| 1.3.2 | Reset with valid token | 1. Get reset token from email/console<br>2. Go to `/reset-password?token=xxx`<br>3. Enter new password | Password changed, can login with new password | [ ] | | 1.3.2 | Reset with valid token | 1. Get reset token from email/console<br>2. Go to `/reset-password?token=xxx`<br>3. Enter new password | Password changed, can login with new password | [ ] |
| 1.3.3 | Reset with invalid token | 1. Go to `/reset-password?token=invalid`<br>2. Enter new password | Error message about invalid/expired token | [ ] | | 1.3.3 | Reset with invalid token | 1. Go to `/reset-password?token=invalid`<br>2. Enter new password | Error message about invalid/expired token | [ ] |
| 1.3.4 | Reset with expired token | 1. Wait for token to expire (or modify DB)<br>2. Try to use token | Error message about expired token | [ ] | | 1.3.4 | Reset with expired token | 1. Wait for token to expire (or modify DB)<br>2. Try to use token | Error message about expired token | [ ] |
- ### 1.4 Email Verification
### 1.4 Email Verification
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |----------------|-------|-----------------|--------|
| 1.4.1 | Verify with valid token | 1. Register new account<br>2. Get verification token from console<br>3. Go to `/verify-email?token=xxx` | Email verified, success message | [ ] | | 1.4.1 | Verify with valid token | 1. Register new account<br>2. Get verification token from console<br>3. Go to `/verify-email?token=xxx` | Email verified, success message | [ ] |
| 1.4.2 | Verify with invalid token | 1. Go to `/verify-email?token=invalid` | Error message about invalid token | [ ] | | 1.4.2 | Verify with invalid token | 1. Go to `/verify-email?token=invalid` | Error message about invalid token | [ ] |
| 1.4.3 | Resend verification | 1. Login with unverified account<br>2. Go to Settings<br>3. Click "Resend verification" | New email sent (check console) | [ ] | | 1.4.3 | Resend verification | 1. Login with unverified account<br>2. Go to Settings<br>3. Click "Resend verification" | New email sent (check console) | [ ] |
- ### 1.5 Logout
### 1.5 Logout
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -67,10 +59,8 @@
| 1.5.2 | Session persistence | 1. Login<br>2. Close browser<br>3. Reopen and go to app | Still logged in (token in localStorage) | [ ] | | 1.5.2 | Session persistence | 1. Login<br>2. Close browser<br>3. Reopen and go to app | Still logged in (token in localStorage) | [ ] |
--- ---
- ## 2. Workspaces
## 2. Workspaces - ### 2.1 Workspace Management
### 2.1 Workspace Management
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -83,10 +73,8 @@
| 2.1.7 | Workspace persistence | 1. Switch to workspace B<br>2. Refresh page | Still on workspace B (localStorage) | [ ] | | 2.1.7 | Workspace persistence | 1. Switch to workspace B<br>2. Refresh page | Still on workspace B (localStorage) | [ ] |
--- ---
- ## 3. Projects
## 3. Projects - ### 3.1 Project CRUD
### 3.1 Project CRUD
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -97,10 +85,8 @@
| 3.1.5 | Project shows link count | 1. Create project<br>2. Create links assigned to project<br>3. View projects | Link count displayed correctly | [ ] | | 3.1.5 | Project shows link count | 1. Create project<br>2. Create links assigned to project<br>3. View projects | Link count displayed correctly | [ ] |
--- ---
- ## 4. Short Links
## 4. Short Links - ### 4.1 Link Creation
### 4.1 Link Creation
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -111,8 +97,7 @@
| 4.1.5 | Create link with password | 1. Create link with password set | Link requires password to access | [ ] | | 4.1.5 | Create link with password | 1. Create link with password set | Link requires password to access | [ ] |
| 4.1.6 | Invalid destination URL | 1. Try to create link with invalid URL | Error message shown | [ ] | | 4.1.6 | Invalid destination URL | 1. Try to create link with invalid URL | Error message shown | [ ] |
| 4.1.7 | Duplicate slug | 1. Create link with slug "test"<br>2. Try to create another with same slug | Error message about duplicate | [ ] | | 4.1.7 | Duplicate slug | 1. Create link with slug "test"<br>2. Try to create another with same slug | Error message about duplicate | [ ] |
- ### 4.2 Link Management
### 4.2 Link Management
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -123,16 +108,14 @@
| 4.2.5 | View trash | 1. Click "Trash" toggle | Deleted links shown | [ ] | | 4.2.5 | View trash | 1. Click "Trash" toggle | Deleted links shown | [ ] |
| 4.2.6 | Restore link | 1. View trash<br>2. Click restore on a link | Link restored, works again | [ ] | | 4.2.6 | Restore link | 1. View trash<br>2. Click restore on a link | Link restored, works again | [ ] |
| 4.2.7 | Disable link | 1. Edit link<br>2. Set status to Disabled<br>3. Save | Link returns 404/disabled message | [ ] | | 4.2.7 | Disable link | 1. Edit link<br>2. Set status to Disabled<br>3. Save | Link returns 404/disabled message | [ ] |
- ### 4.3 Bulk Import
### 4.3 Bulk Import
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
| 4.3.1 | Bulk import URLs | 1. Click "Bulk Import"<br>2. Paste multiple URLs (one per line)<br>3. Import | All links created | [ ] | | 4.3.1 | Bulk import URLs | 1. Click "Bulk Import"<br>2. Paste multiple URLs (one per line)<br>3. Import | All links created | [ ] |
| 4.3.2 | Bulk import with titles | 1. Paste URLs with titles: `https://example.com, My Title`<br>2. Import | Links created with titles | [ ] | | 4.3.2 | Bulk import with titles | 1. Paste URLs with titles: `https://example.com, My Title`<br>2. Import | Links created with titles | [ ] |
| 4.3.3 | Bulk import with invalid URLs | 1. Include some invalid URLs in list<br>2. Import | Valid URLs imported, errors shown for invalid | [ ] | | 4.3.3 | Bulk import with invalid URLs | 1. Include some invalid URLs in list<br>2. Import | Valid URLs imported, errors shown for invalid | [ ] |
- ### 4.4 UTM Builder
### 4.4 UTM Builder
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -141,10 +124,8 @@
| 4.4.3 | UTM preview | 1. Fill in UTM fields | Preview shows full URL with params | [ ] | | 4.4.3 | UTM preview | 1. Fill in UTM fields | Preview shows full URL with params | [ ] |
--- ---
- ## 5. Redirect
## 5. Redirect - ### 5.1 Public Redirect
### 5.1 Public Redirect
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -158,18 +139,15 @@
| 5.1.8 | Redirect rate limiting | 1. Hit redirect endpoint 100+ times rapidly | Rate limited after threshold | [ ] | | 5.1.8 | Redirect rate limiting | 1. Hit redirect endpoint 100+ times rapidly | Rate limited after threshold | [ ] |
--- ---
- ## 6. QR Codes
## 6. QR Codes - ### 6.1 QR Creation
### 6.1 QR Creation
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
| 6.1.1 | Create basic QR | 1. Go to `/qrcodes/new`<br>2. Select a link<br>3. Save | QR code created with default style | [ ] | | 6.1.1 | Create basic QR | 1. Go to `/qrcodes/new`<br>2. Select a link<br>3. Save | QR code created with default style | [ ] |
| 6.1.2 | QR requires link | 1. Go to `/qrcodes/new`<br>2. Try to save without link | Error message | [ ] | | 6.1.2 | QR requires link | 1. Go to `/qrcodes/new`<br>2. Try to save without link | Error message | [ ] |
| 6.1.3 | QR name | 1. Create QR with custom name | Name shown in list | [ ] | | 6.1.3 | QR name | 1. Create QR with custom name | Name shown in list | [ ] |
- ### 6.2 QR Designer
### 6.2 QR Designer
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -183,8 +161,7 @@
| 6.2.8 | Upload logo | 1. Click logo upload<br>2. Select image file | Logo appears in center of QR | [ ] | | 6.2.8 | Upload logo | 1. Click logo upload<br>2. Select image file | Logo appears in center of QR | [ ] |
| 6.2.9 | Select existing logo | 1. Have uploaded assets<br>2. Select from asset gallery | Logo applied from gallery | [ ] | | 6.2.9 | Select existing logo | 1. Have uploaded assets<br>2. Select from asset gallery | Logo applied from gallery | [ ] |
| 6.2.10 | Remove logo | 1. Have QR with logo<br>2. Remove logo | QR renders without logo | [ ] | | 6.2.10 | Remove logo | 1. Have QR with logo<br>2. Remove logo | QR renders without logo | [ ] |
- ### 6.3 QR Export
### 6.3 QR Export
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -193,8 +170,7 @@
| 6.3.3 | PNG has correct size | 1. Export PNG<br>2. Check dimensions | Matches selected size (256/512/1024) | [ ] | | 6.3.3 | PNG has correct size | 1. Export PNG<br>2. Check dimensions | Matches selected size (256/512/1024) | [ ] |
| 6.3.4 | QR is scannable | 1. Export QR<br>2. Scan with phone | Opens correct short URL | [ ] | | 6.3.4 | QR is scannable | 1. Export QR<br>2. Scan with phone | Opens correct short URL | [ ] |
| 6.3.5 | QR with logo is scannable | 1. Add logo to QR<br>2. Export and scan | Still scans correctly | [ ] | | 6.3.5 | QR with logo is scannable | 1. Add logo to QR<br>2. Export and scan | Still scans correctly | [ ] |
- ### 6.4 QR List
### 6.4 QR List
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -204,10 +180,8 @@
| 6.4.4 | Edit QR | 1. Click edit on QR | Opens designer with saved settings | [ ] | | 6.4.4 | Edit QR | 1. Click edit on QR | Opens designer with saved settings | [ ] |
--- ---
- ## 7. Analytics
## 7. Analytics - ### 7.1 Event Tracking
### 7.1 Event Tracking
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -217,8 +191,7 @@
| 7.1.4 | Device detection | 1. Visit from mobile device<br>2. Check device breakdown | Mobile device recorded | [ ] | | 7.1.4 | Device detection | 1. Visit from mobile device<br>2. Check device breakdown | Mobile device recorded | [ ] |
| 7.1.5 | Referrer tracking | 1. Visit link from a webpage<br>2. Check referrer breakdown | Referrer domain recorded | [ ] | | 7.1.5 | Referrer tracking | 1. Visit link from a webpage<br>2. Check referrer breakdown | Referrer domain recorded | [ ] |
| 7.1.6 | Country detection | 1. Visit link<br>2. Check geo breakdown | Country detected (if GeoIP configured) | [ ] | | 7.1.6 | Country detection | 1. Visit link<br>2. Check geo breakdown | Country detected (if GeoIP configured) | [ ] |
- ### 7.2 Dashboard Analytics
### 7.2 Dashboard Analytics
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -229,23 +202,20 @@
| 7.2.5 | Device breakdown | 1. View device breakdown | Desktop/Mobile/Tablet shown | [ ] | | 7.2.5 | Device breakdown | 1. View device breakdown | Desktop/Mobile/Tablet shown | [ ] |
| 7.2.6 | Referrer breakdown | 1. View referrer breakdown | Top referrers listed | [ ] | | 7.2.6 | Referrer breakdown | 1. View referrer breakdown | Top referrers listed | [ ] |
| 7.2.7 | Country breakdown | 1. View geo breakdown | Countries with flags shown | [ ] | | 7.2.7 | Country breakdown | 1. View geo breakdown | Countries with flags shown | [ ] |
- ### 7.3 Period Filters
### 7.3 Period Filters
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
| 7.3.1 | 24h filter | 1. Click "24h" period | Data filtered to last 24 hours | [ ] | | 7.3.1 | 24h filter | 1. Click "24h" period | Data filtered to last 24 hours | [ ] |
| 7.3.2 | 7d filter | 1. Click "7d" period | Data filtered to last 7 days | [ ] | | 7.3.2 | 7d filter | 1. Click "7d" period | Data filtered to last 7 days | [ ] |
| 7.3.3 | 30d filter | 1. Click "30d" period | Data filtered to last 30 days | [ ] | | 7.3.3 | 30d filter | 1. Click "30d" period | Data filtered to last 30 days | [ ] |
- ### 7.4 Per-Link Analytics
### 7.4 Per-Link Analytics
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
| 7.4.1 | View link detail | 1. Go to `/links/{id}` | Link analytics shown | [ ] | | 7.4.1 | View link detail | 1. Go to `/links/{id}` | Link analytics shown | [ ] |
| 7.4.2 | Link-specific stats | 1. View link detail | Stats match only that link's data | [ ] | | 7.4.2 | Link-specific stats | 1. View link detail | Stats match only that link's data | [ ] |
- ### 7.5 Per-QR Analytics
### 7.5 Per-QR Analytics
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -253,10 +223,8 @@
| 7.5.2 | QR-specific stats | 1. View QR detail | Stats match only that QR's scans | [ ] | | 7.5.2 | QR-specific stats | 1. View QR detail | Stats match only that QR's scans | [ ] |
--- ---
- ## 8. Domains
## 8. Domains - ### 8.1 Domain Management
### 8.1 Domain Management
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -269,26 +237,22 @@
| 8.1.7 | Free plan restriction | 1. Be on Free plan<br>2. Try to add domain | Upgrade prompt shown | [ ] | | 8.1.7 | Free plan restriction | 1. Be on Free plan<br>2. Try to add domain | Upgrade prompt shown | [ ] |
--- ---
- ## 9. Settings
## 9. Settings - ### 9.1 Profile
### 9.1 Profile
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
| 9.1.1 | View profile | 1. Go to `/settings` | Current email shown | [ ] | | 9.1.1 | View profile | 1. Go to `/settings` | Current email shown | [ ] |
| 9.1.2 | Update email | 1. Change email<br>2. Save | Email updated | [ ] | | 9.1.2 | Update email | 1. Change email<br>2. Save | Email updated | [ ] |
| 9.1.3 | Verification warning | 1. Have unverified email | Warning shown with resend link | [ ] | | 9.1.3 | Verification warning | 1. Have unverified email | Warning shown with resend link | [ ] |
- ### 9.2 Password Change
### 9.2 Password Change
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
| 9.2.1 | Change password | 1. Enter current password<br>2. Enter new password twice<br>3. Submit | Password changed | [ ] | | 9.2.1 | Change password | 1. Enter current password<br>2. Enter new password twice<br>3. Submit | Password changed | [ ] |
| 9.2.2 | Wrong current password | 1. Enter wrong current password<br>2. Submit | Error message | [ ] | | 9.2.2 | Wrong current password | 1. Enter wrong current password<br>2. Submit | Error message | [ ] |
| 9.2.3 | Passwords don't match | 1. Enter different passwords<br>2. Submit | Error message | [ ] | | 9.2.3 | Passwords don't match | 1. Enter different passwords<br>2. Submit | Error message | [ ] |
- ### 9.3 API Keys
### 9.3 API Keys
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -298,8 +262,7 @@
| 9.3.4 | Key with expiry | 1. Create key with 30-day expiry | Expiry date shown | [ ] | | 9.3.4 | Key with expiry | 1. Create key with 30-day expiry | Expiry date shown | [ ] |
| 9.3.5 | Delete API key | 1. Click delete on a key<br>2. Confirm | Key removed | [ ] | | 9.3.5 | Delete API key | 1. Click delete on a key<br>2. Confirm | Key removed | [ ] |
| 9.3.6 | Key prefix shown | 1. View existing keys | Only prefix visible (e.g., `tq_abc...`) | [ ] | | 9.3.6 | Key prefix shown | 1. View existing keys | Only prefix visible (e.g., `tq_abc...`) | [ ] |
- ### 9.4 Danger Zone
### 9.4 Danger Zone
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -308,18 +271,15 @@
| 9.4.3 | Wrong password on delete | 1. Enter wrong password | Error, account not deleted | [ ] | | 9.4.3 | Wrong password on delete | 1. Enter wrong password | Error, account not deleted | [ ] |
--- ---
- ## 10. Billing
## 10. Billing - ### 10.1 Plan Display
### 10.1 Plan Display
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
| 10.1.1 | View billing page | 1. Go to `/billing` | Current plan and features shown | [ ] | | 10.1.1 | View billing page | 1. Go to `/billing` | Current plan and features shown | [ ] |
| 10.1.2 | Plan comparison | 1. View billing page | Free/Pro/Business plans compared | [ ] | | 10.1.2 | Plan comparison | 1. View billing page | Free/Pro/Business plans compared | [ ] |
| 10.1.3 | Current plan highlighted | 1. View billing page | Current plan marked as "Current" | [ ] | | 10.1.3 | Current plan highlighted | 1. View billing page | Current plan marked as "Current" | [ ] |
- ### 10.2 Stripe Integration
### 10.2 Stripe Integration
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -328,10 +288,8 @@
| 10.2.3 | Cancel subscription | 1. Cancel in Stripe portal | Plan downgrades at period end | [ ] | | 10.2.3 | Cancel subscription | 1. Cancel in Stripe portal | Plan downgrades at period end | [ ] |
--- ---
- ## 11. Plan Limits
## 11. Plan Limits - ### 11.1 Free Plan Limits
### 11.1 Free Plan Limits
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -339,41 +297,35 @@
| 11.1.2 | Link limit | 1. Create 50 links<br>2. Try to create 51st | Error: limit reached | [ ] | | 11.1.2 | Link limit | 1. Create 50 links<br>2. Try to create 51st | Error: limit reached | [ ] |
| 11.1.3 | QR code limit | 1. Create 25 QR codes<br>2. Try to create 26th | Error: limit reached | [ ] | | 11.1.3 | QR code limit | 1. Create 25 QR codes<br>2. Try to create 26th | Error: limit reached | [ ] |
| 11.1.4 | No custom domains | 1. Try to add domain on Free | Upgrade prompt | [ ] | | 11.1.4 | No custom domains | 1. Try to add domain on Free | Upgrade prompt | [ ] |
- ### 11.2 Usage Display
### 11.2 Usage Display
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
| 11.2.1 | View usage | 1. Check billing or dashboard | Usage stats shown (links, QRs, events) | [ ] | | 11.2.1 | View usage | 1. Check billing or dashboard | Usage stats shown (links, QRs, events) | [ ] |
--- ---
- ## 12. UI/UX
## 12. UI/UX - ### 12.1 Navigation
### 12.1 Navigation
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
| 12.1.1 | Sidebar navigation | 1. Click each nav item | Correct page loads | [ ] | | 12.1.1 | Sidebar navigation | 1. Click each nav item | Correct page loads | [ ] |
| 12.1.2 | Active nav highlight | 1. Navigate to different pages | Current page highlighted in sidebar | [ ] | | 12.1.2 | Active nav highlight | 1. Navigate to different pages | Current page highlighted in sidebar | [ ] |
| 12.1.3 | Mobile responsive | 1. Resize to mobile width | Layout adapts correctly | [ ] | | 12.1.3 | Mobile responsive | 1. Resize to mobile width | Layout adapts correctly | [ ] |
- ### 12.2 Loading States
### 12.2 Loading States
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
| 12.2.1 | Loading indicators | 1. Navigate to data-heavy page | Loading indicator shown while fetching | [ ] | | 12.2.1 | Loading indicators | 1. Navigate to data-heavy page | Loading indicator shown while fetching | [ ] |
| 12.2.2 | Button loading states | 1. Submit a form | Button shows loading state | [ ] | | 12.2.2 | Button loading states | 1. Submit a form | Button shows loading state | [ ] |
- ### 12.3 Error Handling
### 12.3 Error Handling
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
| 12.3.1 | API errors shown | 1. Trigger an API error | User-friendly error message | [ ] | | 12.3.1 | API errors shown | 1. Trigger an API error | User-friendly error message | [ ] |
| 12.3.2 | Network error | 1. Disable network<br>2. Try an action | Appropriate error message | [ ] | | 12.3.2 | Network error | 1. Disable network<br>2. Try an action | Appropriate error message | [ ] |
| 12.3.3 | 401 redirect | 1. Clear token from localStorage<br>2. Try protected action | Redirected to login | [ ] | | 12.3.3 | 401 redirect | 1. Clear token from localStorage<br>2. Try protected action | Redirected to login | [ ] |
- ### 12.4 Empty States
### 12.4 Empty States
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -383,18 +335,15 @@
| 12.4.4 | No analytics data | 1. View analytics with no events | Empty state message | [ ] | | 12.4.4 | No analytics data | 1. View analytics with no events | Empty state message | [ ] |
--- ---
- ## 13. Security
## 13. Security - ### 13.1 Authentication
### 13.1 Authentication
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
| 13.1.1 | Protected routes | 1. Log out<br>2. Try to access `/dashboard` | Redirected to login | [ ] | | 13.1.1 | Protected routes | 1. Log out<br>2. Try to access `/dashboard` | Redirected to login | [ ] |
| 13.1.2 | JWT expiry | 1. Wait for token to expire<br>2. Try an action | Redirected to login | [ ] | | 13.1.2 | JWT expiry | 1. Wait for token to expire<br>2. Try an action | Redirected to login | [ ] |
| 13.1.3 | Cross-workspace access | 1. Try to access another user's workspace ID | 404 or 403 error | [ ] | | 13.1.3 | Cross-workspace access | 1. Try to access another user's workspace ID | 404 or 403 error | [ ] |
- ### 13.2 Input Validation
### 13.2 Input Validation
| # | Test Case | Steps | Expected Result | Status | | # | Test Case | Steps | Expected Result | Status |
|---|-----------|-------|-----------------|--------| |---|-----------|-------|-----------------|--------|
@@ -402,8 +351,7 @@
| 13.2.2 | SQL injection attempt | 1. Enter SQL in form fields | No SQL executed, handled safely | [ ] | | 13.2.2 | SQL injection attempt | 1. Enter SQL in form fields | No SQL executed, handled safely | [ ] |
--- ---
- ## Test Summary
## Test Summary
| Section | Total Tests | Passed | Failed | Skipped | | Section | Total Tests | Passed | Failed | Skipped |
|---------|-------------|--------|--------|---------| |---------|-------------|--------|--------|---------|
@@ -423,10 +371,8 @@
| **TOTAL** | **131** | | | | | **TOTAL** | **131** | | | |
--- ---
- ## Test Environment Setup
## Test Environment Setup - ### Prerequisites
### Prerequisites
1. **Backend running**: `cd src/api && dotnet run` 1. **Backend running**: `cd src/api && dotnet run`
2. **Frontend running**: `cd src/frontend && npm run dev` 2. **Frontend running**: `cd src/frontend && npm run dev`
@@ -434,8 +380,7 @@
4. **Email**: Console output in development (check terminal) 4. **Email**: Console output in development (check terminal)
5. **Stripe**: Test mode with test API keys (optional for billing tests) 5. **Stripe**: Test mode with test API keys (optional for billing tests)
6. **GeoIP**: MaxMind database configured (optional for geo tests) 6. **GeoIP**: MaxMind database configured (optional for geo tests)
- ### Test Accounts
### Test Accounts
Create these accounts before testing: Create these accounts before testing:
@@ -446,21 +391,17 @@ Create these accounts before testing:
| `free@example.com` | `password123` | Free limits testing | | `free@example.com` | `password123` | Free limits testing |
--- ---
- ## Notes
## Notes
- Mark tests as `[F]` if they fail and add details below - Mark tests as `[F]` if they fail and add details below
- Mark tests as `[S]` if skipped with reason - Mark tests as `[S]` if skipped with reason
- Re-run failed tests after fixes - Re-run failed tests after fixes
- Update this document as features change - Update this document as features change
- ### Failed Tests Log
### Failed Tests Log
| Test # | Issue | Date | Fixed | | Test # | Issue | Date | Fixed |
|--------|-------|------|-------| |--------|-------|------|-------|
| | | | | | | | | |
- ### Skipped Tests Log
### Skipped Tests Log
| Test # | Reason | Date | | Test # | Reason | Date |
|--------|--------|------| |--------|--------|------|