| name | e2e-test-plan |
| description | Create comprehensive E2E test plans with deep application analysis, navigation coverage audit, and browser-testable scenarios |
E2E Test Plan Skill
Overview
This skill creates exhaustive, browser-testable E2E test plans by deeply analyzing Laravel Filament applications. It documents all pages, user roles, critical flows, navigation coverage, and detailed test scenarios that can be executed step-by-step by a QA tester who has never seen the codebase.
Standard Plan Location
Default output: docs/detailed-test-list.md
This skill ALWAYS saves the test plan to docs/detailed-test-list.md unless a custom path is specified via the --output flag.
Important:
- Create the
docs/ directory if it doesn't exist
- Use the Write tool to save the plan to the standard location
- In update mode: Merge new discoveries with existing plan content
- Use
--force flag to completely overwrite existing plan
- Use
--quick flag for basic plan without deep discovery
Purpose
Generate structured test plans that ensure:
- All pages are identified and will be tested
- All user roles are mapped with their permissions
- Critical user flows are documented
- Test scenarios cover positive and negative cases
- 100% NAVIGATION COVERAGE: Every menu item and internal link is tested
- Cross-user interactions are documented
- Every test can be executed by someone who never saw the codebase
- Priority levels guide test execution order
Review and Update Mode
When docs/detailed-test-list.md exists (and no --force flag), operate in review and update mode:
Step 0a: Read Existing Plan
- Parse Existing Plan Content
- Read
docs/detailed-test-list.md
- Extract existing pages from navigation registry
- Extract existing roles from test user accounts
- Extract existing flows from test sections
- Extract test credentials
- Note the previous "Generated" date
Step 0b: Validate Existing Content
-
Validate Pages
For each page in the existing plan:
- Check if the route still exists in the codebase
- For Laravel: Check routes/web.php, Filament resources
- Mark pages as "deprecated" if route no longer exists
-
Validate Roles
- Check if role definitions still exist
- Check permission assignments
- Mark roles that no longer exist
-
Validate Flows
- Check if flow entry points still exist
- Verify flow steps are still valid
Step 0c: Discover New Content
Compare current codebase against documented content:
- Find new routes not in existing plan
- Find new Filament resources
- Find new roles/permissions
- Find new navigation items
Step 0d: Merge and Update
- Keep valid existing content
- Add newly discovered content
- Mark deprecated items
- Generate update report showing changes
Workflow
Phase 1: Deep Discovery (Execute All Commands)
You MUST execute these discovery commands to understand the complete application:
1.1 Database Architecture Analysis
ls -la database/migrations/
cat database/migrations/*.php
For each table, document:
- Table name and purpose
- Key columns and types
- Foreign key relationships
- Pivot tables
1.2 Model & Relationship Mapping
ls -la app/Models/
cat app/Models/*.php
For each model, extract:
- Relationships (hasMany, belongsTo, belongsToMany, morphTo)
- Scopes (local and global)
- Casts and attributes
- Traits used (HasRoles, SoftDeletes)
1.3 Authentication & Authorization System
cat config/auth.php
cat config/permission.php 2>/dev/null
ls -la app/Policies/ 2>/dev/null
cat app/Policies/*.php 2>/dev/null
cat app/Providers/AuthServiceProvider.php 2>/dev/null
ls -la app/Http/Middleware/
cat database/seeders/*.php
grep -A 50 "Role\|Permission" database/seeders/*.php 2>/dev/null
Document:
- All roles in the system
- All permissions per role
- Policy rules per resource
- Guard configurations
1.4 Filament Panel Configuration
cat app/Providers/Filament/*.php 2>/dev/null
ls -la app/Filament/
find app -name "*PanelProvider*" -exec cat {} \; 2>/dev/null
Document:
- Number of panels
- Panel URLs and access rules
- Navigation structure
- Multi-tenant configuration
1.5 Filament Resources Deep Dive
find app/Filament -name "*Resource.php" | head -50
find app/Filament -name "*Resource.php" -exec cat {} \;
For each resource, extract:
- Associated model
- Form fields and validation rules
- Table columns and filters
- Actions (table, bulk, header)
- Relation managers
- Authorization methods
1.6 Filament Pages & Widgets
find app/Filament -name "*Page*.php" -exec cat {} \; 2>/dev/null
find app/Filament -name "*Widget*.php" -exec cat {} \; 2>/dev/null
ls -la app/Livewire/ 2>/dev/null
1.7 Business Logic Layer
ls -la app/Actions/ 2>/dev/null
cat app/Actions/**/*.php 2>/dev/null
ls -la app/Services/ 2>/dev/null
ls -la app/Jobs/ 2>/dev/null
cat app/Jobs/*.php 2>/dev/null
ls -la app/Notifications/ 2>/dev/null
cat app/Notifications/*.php 2>/dev/null
ls -la app/Mail/ 2>/dev/null
1.8 Routes & API
cat routes/web.php
cat routes/api.php 2>/dev/null
php artisan route:list --path=admin 2>/dev/null
php artisan route:list 2>/dev/null | head -100
1.9 Subscription/Billing System
cat composer.json | grep -i "cashier\|stripe\|paddle"
cat config/cashier.php 2>/dev/null
grep -r "subscription\|plan\|billing" database/migrations/
grep -r "Billable\|subscription" app/Models/
1.10 Multi-tenancy
cat composer.json | grep -i "tenancy\|team\|organization"
grep -r "Tenant\|Team\|Organization\|Workspace" app/Models/
1.11 Navigation Audit (CRITICAL)
grep -r "NavigationItem\|navigationItems\|getNavigation\|menu" app/Filament/ --include="*.php"
grep -r "::make\|NavigationGroup\|navigationLabel\|navigationIcon" app/Filament/ --include="*.php" | head -100
grep -r "Action::make\|Tables\\\\Actions\|->url(\|->link(" app/Filament/ --include="*.php" | head -50
Phase 2: Synthesis
Based on Phase 1 analysis, create:
2.1 Application Purpose Statement
Write 2-3 sentences on what this app does and its core value.
2.2 User/Role Matrix
Create detailed table of all user types with permissions:
| User Type/Role | Access Level | Primary Use Cases | Key Permissions |
|---|
| Super Admin | Full | System config | Everything |
| Admin | High | Manage users | CRUD users |
| Member | Standard | Core features | Own resources |
| Guest | Limited | View only | Read public |
2.3 Core User Journeys
Identify the 5-10 most important user flows.
2.4 Entity Relationship Map
Document key models and their relationships.
Phase 3: Generate Test Plan Document
Create docs/detailed-test-list.md with ALL required sections:
# [Application Name] - Detailed Test List
> Generated: [Date]
> Application Version: [Version if available]
> Based on analysis of: [Key files analyzed]
## Test Environment Setup
### Prerequisites
- [ ] Application deployed and accessible at: `[URL]`
- [ ] Database seeded with test data
- [ ] Email testing service configured (e.g., Mailtrap)
- [ ] Payment gateway in test mode (if applicable)
### Test User Accounts
| User ID | Email | Password | Role(s) | Plan | Notes |
|---------|-------|----------|---------|------|-------|
| U1 | admin@test.com | TestPass123! | Super Admin | - | Full access |
| U2 | owner@test.com | TestPass123! | Team Owner | Pro | Team owner |
| U3 | member@test.com | TestPass123! | Member | Free | Standard user |
| U4 | viewer@test.com | TestPass123! | Viewer | - | Read-only |
| U5 | (to be created) | TestPass123! | User | - | Created via invitation |
### Initial Data State
| Entity | Count | Key Records |
|--------|-------|-------------|
| Users | 4 | See above |
| Teams | 2 | "Acme Corp" (U2 owner), "Beta Inc" (U3 member) |
| [Resource] | X | [Description] |
---
## Section 0: Navigation & Link Coverage Audit
This section ensures 100% coverage of all navigable elements.
### 0.1 Complete Navigation Registry
#### 0.1.1 Sidebar Menu Items
| Menu Item | URL Path | Visible To | Tested In | Test Actor |
|-----------|----------|------------|-----------|------------|
| Dashboard | /admin | All roles | 1.1.1, 2.1.1 | U1, U2 |
| Users | /admin/users | Admin only | 5.1.1 | U1 |
| Users > Create | /admin/users/create | Admin only | 5.1.2 | U1 |
| Teams | /admin/teams | Owner+ | 3.1.1 | U2 |
| Projects | /admin/projects | All roles | 2.2.1 | U2 |
| [Continue for ALL menu items...] | | | | |
#### 0.1.2 Resource Action Buttons
| Resource | Action | URL/Behavior | Tested In | Test Actor |
|----------|--------|--------------|-----------|------------|
| Projects | View | /admin/projects/{id} | 2.2.3 | U2 |
| Projects | Edit | /admin/projects/{id}/edit | 2.2.3 | U2 |
| Projects | Delete | Modal confirmation | 2.2.4 | U2 |
| [Continue for ALL actions...] | | | | |
#### 0.1.3 Internal Cross-Reference Links
| Source Page | Link Text/Location | Destination | Tested In |
|-------------|-------------------|-------------|-----------|
| Task Detail | "Project: [Name]" | Project detail | 2.3.2 |
| Project Detail | "Owner: [Name]" | User profile | 2.2.3 |
| [Continue for ALL links...] | | | |
| Element | Location | Action | Tested In |
|---------|----------|--------|-----------|
| User dropdown | Top-right | Opens profile menu | 1.1.1 |
| Logout | User dropdown | Logs out, redirects | 1.4.1 |
| Notifications bell | Top-right | Opens notifications | 3.1.2 |
| Global search | Header | Opens search modal | 2.4.1 |
U1 (Super Admin)
Access every single menu item to verify all pages load without error
U1 logged in
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | Verify sidebar shows all items | All menu items visible |
| 2 | Click "Dashboard" | Page loads, URL = /admin |
| 3 | Click "Users" | Page loads, URL = /admin/users |
| 4 | Click "Create" on Users | Form loads, URL = /admin/users/create |
| 5 | Click "Users" breadcrumb | Returns to /admin/users |
| [CONTINUE FOR EVERY MENU ITEM] | | |
| N | Click user dropdown > "Logout" | Logged out, redirected to login |
All menu items verified accessible
---
U2 (Team Owner)
Verify correct menu visibility and restricted pages return 403
U2 logged in
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | Verify sidebar items | Shows permitted items only |
| 2 | Verify hidden items | Does NOT show admin-only items |
| 3 | Click each visible menu item | All load successfully |
| 4 | Manually navigate to /admin/users | 403 Forbidden OR redirect |
| [TEST ALL BOUNDARIES] | | |
---
U3 (Team Member)
Verify most restrictive common role
U3 logged in
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | Verify sidebar items | Shows minimal items |
| 2 | Navigate to restricted URL | 403 Forbidden |
| [TEST ALL BOUNDARIES] | | |
U2
Project with tasks exists
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | Navigate to deep nested page | URL loads correctly |
| 2 | Verify breadcrumb trail | Shows full path |
| 3 | Click each breadcrumb level | Navigates correctly |
U2
Resource with relations exists
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | Navigate to resource detail | Page loads |
| 2 | Click relation manager tabs | Each tab loads data |
| 3 | Click related item | Navigates or opens modal |
At the end of test execution, verify:
[ ] Every row in table 0.1.1 (Sidebar Menu) has been executed
[ ] Every row in table 0.1.2 (Resource Actions) has been executed
[ ] Every row in table 0.1.3 (Cross-Reference Links) has been executed
[ ] Every row in table 0.1.4 (Header Elements) has been executed
[ ] All restricted URLs tested for each role (403 verification)
[ ] Breadcrumb navigation tested at least 3 levels deep
[ ] All relation manager tabs accessed
---
U1 (Super Admin)
User U1 exists and is active
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | Navigate to | Login page loads |
| 2 | Enter email: | Email field populated |
| 3 | Enter password: | Password field masked |
| 4 | Click "Sign In" button | - Redirect to dashboard- User name visible |
User session active
---
Anonymous
None
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | Navigate to login | Login page loads |
| 2 | Enter wrong credentials | Fields populated |
| 3 | Click "Sign In" | - Error message shown- Remain on login |
---
[Tests...]
[Tests...]
[Tests...]
---
U2 (Team Owner)
U2 logged in, has existing data
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | Navigate to dashboard | Dashboard page loads |
| 2 | Verify statistics widget | Shows accurate counts |
| 3 | Verify recent activity | Lists recent actions |
| 4 | Verify navigation menu | Permitted items visible |
---
U2 (Team Owner)
U2 logged in
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | Click "[Resources]" in nav | List page loads |
| 2 | Click "New [Resource]" | Create form opens |
| 3 | Fill required fields | Fields accept input |
| 4 | Click "Create" | - Success notification- Resource in list |
New resource exists, owned by U2
---
U2 (Team Owner)
U2 logged in
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | Navigate to create form | Form loads |
| 2 | Leave required fields empty | - |
| 3 | Click "Create" | - Validation errors shown- Form does NOT submit |
---
U2
[Tests...]
U2
[Tests...]
U3
Resource owned by U2
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | Login as U3 | Dashboard loads |
| 2 | Navigate to U2's resource edit URL | 403 Forbidden OR redirect |
---
U2
[Tests...]
---
[Tests...]
---
U2 (Team Owner)
U2 owns team
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | Navigate to Team Settings | Settings page loads |
| 2 | Click "Invite Member" | Modal opens |
| 3 | Enter email: | Email populated |
| 4 | Select role: "Member" | Role selected |
| 5 | Click "Send Invitation" | - Success message- Invitation in list |
Invitation record created
---
U5 (new user)
Test 3.1.1 completed
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | Check email | Invitation received |
| 2 | Click invitation link | Registration page loads |
| 3 | Complete registration | Account created |
| 4 | Verify team membership | Listed as team member |
U5 is team member
---
U2 (Owner)
U2 owns resource, U5 is team member
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | Navigate to resource | Detail view loads |
| 2 | Click "Share" | Sharing modal opens |
| 3 | Enable team sharing | Toggle activated |
| 4 | Save | Success, sharing indicator shown |
Resource visible to team
---
U5 (Team Member)
Test 3.2.1 completed
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | Login as U5 | Dashboard loads |
| 2 | Navigate to resources | Shared resource visible |
| 3 | View shared resource | Content accessible |
---
U5 (Team Member with edit permission)
U5 has edit permission
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | Open shared resource | View loads |
| 2 | Click Edit | Form loads |
| 3 | Make changes | Changes accepted |
| 4 | Save | Success, changes visible |
Resource modified by U5
---
U2 (Owner)
Test 3.2.3 completed
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | Login as U2 | Dashboard loads |
| 2 | View resource | Changes by U5 visible |
| 3 | Check activity log | Edit by U5 recorded |
---
U3 (Free Plan)
U3 at plan limit
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | Attempt to exceed limit | Upgrade prompt shown |
---
U3
[Tests...]
---
U1 (Super Admin)
[Tests...]
U1 (Super Admin)
U1 logged in, U3 exists
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | Navigate to Users | User list loads |
| 2 | Click "Impersonate" on U3 | Impersonation banner appears |
| 3 | Verify viewing as U3 | U3's data visible |
| 4 | Click "Stop Impersonating" | Return to admin view |
---
[Tests...]
---
U2
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | Login as U2 | Dashboard loads |
| 2 | Wait for session timeout | - |
| 3 | Attempt action | Prompt to re-login |
---
U2 and U5
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | U2 opens edit form | Form loads |
| 2 | U5 opens same form | Form loads |
| 3 | U2 saves changes | Success |
| 4 | U5 saves changes | Conflict warning OR last write wins |
---
U1 (Admin) and U2 (target)
| Step | Action | Expected Result |
|------|--------|-----------------|
| 1 | U1 changes U2's role | Change saved |
| 2 | U2 navigates to now-restricted page | Access denied |
---
[Tests...]
---
Appendix B: Known Issues / Skip Conditions
| Test ID | Issue | Skip Condition |
|---|
| 4.1.2 | Stripe test mode only | Production |
Appendix C: Test Execution Log Template
| Date | Tester | Test ID | Result | Notes |
|---|
| | | Pass / Fail / Skip | |
## Output
The skill produces:
1. A comprehensive test plan at `docs/detailed-test-list.md`
2. 100% navigation coverage through Section 0
3. Structured tests executable by any QA tester
4. Cross-user interaction scenarios
5. Edge cases and error handling tests
**Final Step**: After generating the plan content, you MUST:
1. Ensure the `docs/` directory exists (create if needed)
2. Write the plan to `docs/detailed-test-list.md` using the Write tool
3. Confirm the file was saved successfully
## Best Practices
1. **Be Exhaustive** - Don't skip pages or flows
2. **100% Navigation Coverage** - Every menu item, every link, every action
3. **Document Assumptions** - Note any assumptions made
4. **Include Credentials** - Provide test user info
5. **Prioritize** - Mark critical tests as high priority
6. **Consider Edge Cases** - Include error scenarios
7. **Cross-User Flows** - Test multi-user interactions
8. **Actor Specification** - Every test must specify the actor
9. **Preconditions** - Document what must exist before each test
10. **Postconditions** - Document expected state after each test
11. **One Action Per Step** - Each step = one browser action
12. **Expected Results** - Every action has explicit expected outcome
13. **Dependencies** - Mark test dependencies clearly
14. **Negative Tests** - Include what should NOT happen
15. **Review Mode** - When updating, preserve working content and merge carefully