- 21 test cases across 5 suites (text commands, update all, multi-select, errors, regression) - Deployment steps for n8n workflow import - Success criteria mapping to tests - Test execution log template with issue tracking - Covers all BAT-01 through BAT-06 requirements
14 KiB
Phase 09-04 Deployment and Test Plan
Generated: 2026-02-04 Purpose: Verification testing for batch operations implementation
Deployment Steps
1. Import Updated Workflow
- Open your n8n instance (typically at http://your-server:5678)
- Navigate to Workflows
- Select "Docker Manager Bot" workflow
- Click the three-dot menu → Export
- Save current version as backup:
n8n-workflow-backup-20260204.json - Return to Workflows → Import from File
- Select the updated
n8n-workflow.jsonfrom this repository - Confirm credential mapping (should use existing "Telegram API" credential)
- Save and activate the workflow
2. Verify Workflow Health
Before testing, confirm:
- ✅ Workflow is "Active" (toggle in top-right)
- ✅ No error indicators on nodes
- ✅ Telegram Trigger shows connected
- ✅ Your user ID is still configured in IF User/Callback Authenticated nodes
Test Plan
Test Suite A: Batch Text Commands
Test A1: Multi-Container Update
Objective: Verify batch update with space-separated names
Steps:
- Send to bot:
update plex sonarr(use 2-3 of your actual container names) - Observe behavior
Expected Results:
- ✅ Message shows "Updating N containers..."
- ✅ Progress updates appear for each container individually
- ✅ Shows "Pulling image..." → "Stopping..." → "Starting..." per container
- ✅ Final summary message appears with success count
- ✅ If any container fails, shows failure with reason but continues batch
- ✅ Summary emphasizes failures (if any) over successes
Notes:
- Record actual execution time for performance assessment
- Screenshot final summary for documentation
Test A2: Multi-Container Start
Objective: Verify batch start executes immediately (no confirmation)
Preparation:
- Manually stop 2-3 containers via existing single commands:
stop plex,stop sonarr - Confirm containers are stopped via
status
Steps:
- Send to bot:
start plex sonarr(use your stopped container names) - Observe behavior
Expected Results:
- ✅ No confirmation prompt (starts immediately)
- ✅ Progress shows for each container
- ✅ Summary shows successful starts
- ✅ Verify containers are running via
status
Test A3: Multi-Container Stop with Confirmation
Objective: Verify batch stop requires confirmation (safety measure)
Steps:
- Send to bot:
stop plex sonarr(use 2+ running containers) - Wait for confirmation prompt
- Tap "Confirm" button
- Observe execution
Expected Results:
- ✅ Confirmation message appears: "Stop 2 containers?"
- ✅ Lists container names in confirmation
- ✅ Has "Confirm" and "Cancel" buttons
- ✅ After confirm: batch execution proceeds with progress
- ✅ Summary shows containers stopped
Follow-up Test:
- Repeat but tap "Cancel" button
- Expected: Confirmation deleted, no action taken
Follow-up Test 2:
- Repeat but don't respond for 30+ seconds
- Expected: Confirmation expires with message
Test A4: Fuzzy Matching with Exact Match Priority
Objective: Verify exact match takes priority over partial matches
Scenario 1: Exact match exists
- Send:
update plex(when both "plex" and "jellyplex" exist) - Expected: Only "plex" container updates (no disambiguation)
Scenario 2: Only partial matches
- Send:
update jelly(matches "jellyplex" but not exact) - Expected: If only one match, proceeds; if multiple, shows disambiguation
Note: This test depends on your actual container names. Adjust to match your server.
Test A5: Disambiguation for Ambiguous Names
Objective: Verify disambiguation prompt appears when multiple containers match
Steps:
- Send command with ambiguous partial match (e.g.,
update linif you have multiple "lin*" containers) - Wait for disambiguation prompt
- Select intended container
Expected Results:
- ✅ Shows "Multiple containers match: lin"
- ✅ Lists matching containers with buttons
- ✅ Selecting one proceeds with single-container action
- ✅ Batch not triggered (user clarified intent)
Note: If no ambiguous names on your server, document "Cannot test - no ambiguous container names"
Test Suite B: Update All Command
Test B1: Update All with Available Updates
Objective: Verify "update all" targets only :latest containers with updates
Steps:
- Send:
update all(orupdateall) - Observe confirmation prompt
- Note which containers are listed
- Tap "Confirm"
- Observe execution
Expected Results:
- ✅ Command recognized and routed
- ✅ Confirmation shows: "Update N containers?"
- ✅ Lists containers (max 10 displayed in message)
- ✅ Only includes containers using :latest tag
- ✅ 30-second timeout on confirmation
- ✅ After confirm: batch execution with progress per container
- ✅ Summary shows results
Verification:
- Check that only :latest containers were updated
- Containers with specific tags (e.g.,
:1.2.3) should not appear in list
Test B2: Update All When No Updates Available
Objective: Verify appropriate message when all containers are current
Preparation:
- Update all containers manually first OR wait until all are current
Steps:
- Send:
update all - Observe response
Expected Results:
- ✅ Shows: "All containers are up to date!" (or similar message)
- ✅ No confirmation prompt
- ✅ No batch execution attempted
Test B3: Update All Cancel
Objective: Verify cancel works
Steps:
- Send:
update all - Wait for confirmation
- Tap "Cancel"
Expected Results:
- ✅ Confirmation message deleted
- ✅ Shows cancellation feedback
- ✅ No containers updated
Test B4: Update All Timeout
Objective: Verify expiration behavior
Steps:
- Send:
update all - Wait for confirmation
- Don't respond for 30+ seconds
- Try tapping button after expiry
Expected Results:
- ✅ After 30s: Shows expiry message
- ✅ Confirmation becomes inactive
- ✅ Tapping expired button shows alert
Test Suite C: Inline Keyboard Multi-Select
Test C1: Enter Multi-Select Mode
Objective: Verify multi-select keyboard appears
Steps:
- Send:
/status - Locate "Select Multiple" button (may need to be added in future plan)
- OR send callback manually: Use bot command that triggers
batch:mode
Note: If no entry point exists yet, test by:
- Temporarily adding "Select Multiple" button to status keyboard
- OR testing via n8n "Execute Node" with callback_query data:
batch:mode
Expected Results:
- ✅ Keyboard shows container list with state icons
- ✅ Running containers: 🟢
- ✅ Stopped containers: ⚪
- ✅ Each button shows container name
- ✅ No checkmarks initially
- ✅ Bottom row has "Cancel" button
Test C2: Toggle Selection
Objective: Verify checkmarks toggle on/off
Steps:
- Enter multi-select mode (from C1)
- Tap a container button
- Observe keyboard update
- Tap same container again
- Tap different container
Expected Results:
- ✅ First tap: Checkmark (✓) appears before container name
- ✅ Second tap: Checkmark disappears
- ✅ Multiple containers can have checkmarks
- ✅ Action buttons appear when any container selected
- ✅ "Clear Selection" button appears with selection
Test C3: Execute Batch Update from Multi-Select
Objective: Verify batch execution from inline keyboard
Steps:
- Enter multi-select mode
- Select 2-3 containers (tap to add checkmarks)
- Tap "Update Selected (N)" button
- Observe execution
Expected Results:
- ✅ Immediate execution (no confirmation for update)
- ✅ Progress shows for each selected container
- ✅ Summary shows results
- ✅ Selection message deleted after execution starts
Test C4: Execute Batch Stop with Confirmation
Objective: Verify stop requires confirmation from multi-select
Steps:
- Enter multi-select mode
- Select 2+ running containers
- Tap "Stop Selected (N)" button
- Wait for confirmation
- Tap "Confirm"
Expected Results:
- ✅ Confirmation prompt appears (doesn't execute immediately)
- ✅ Lists selected containers
- ✅ After confirm: batch stop executes
- ✅ Summary shows stopped containers
Test C5: Selection Limit Enforcement
Objective: Verify callback size limit prevents overflow
Steps:
- Enter multi-select mode
- Select containers one by one
- Attempt to select 9+ containers
Expected Results:
- ✅ Selection works smoothly for first ~8 containers
- ✅ At limit: Alert appears "Selection limit reached"
- ✅ Cannot select additional containers
- ✅ Can deselect and select different containers
- ✅ Guidance shown (e.g., "Use 'update all' for larger batches")
Note: Exact limit depends on container name lengths. Shorter names = more selections possible.
Test C6: Clear Selection
Objective: Verify clear button resets selection
Steps:
- Select 3+ containers
- Tap "Clear Selection" button
Expected Results:
- ✅ All checkmarks removed
- ✅ Action buttons disappear
- ✅ Only "Cancel" button remains
- ✅ Can start new selection
Test C7: Cancel Multi-Select
Objective: Verify cancel exits cleanly
Steps:
- Enter multi-select mode (with or without selection)
- Tap "Cancel" button
Expected Results:
- ✅ Selection message deleted
- ✅ Returns to previous state
- ✅ No actions executed
Test Suite D: Error Handling
Test D1: Failure Isolation
Objective: Verify one failure doesn't abort batch
Steps:
- Create a batch with intentional failure (e.g., non-existent container mixed with real ones)
- Example:
update plex nonexistent sonarr - Observe execution
Expected Results:
- ✅ First container processes
- ✅ Failed container shows error message with reason
- ✅ Remaining containers still process (batch continues)
- ✅ Summary shows: "2 succeeded, 1 failed"
- ✅ Failure details prominent in summary
Test D2: Warning vs Error Classification
Objective: Verify non-critical warnings don't show as errors
Setup:
- Stop a container:
stop plex - Try stopping again:
stop plex
Expected Results:
- ✅ Shows as warning, not error
- ✅ Message: "Already stopped" or similar
- ✅ Summary distinguishes warnings from errors
Similar tests:
- Update container with no update available → Warning, not error
- Start already-running container → Warning
Test Suite E: Regression Tests
Test E1: Single-Container Commands Still Work
Objective: Verify no regression in existing functionality
Commands to test:
status→ Shows container list keyboardstart plex→ Starts single containerstop plex→ Shows confirmation, then stopsrestart plex→ Restarts with progressupdate plex→ Updates single containerlogs plex→ Shows last 50 lineslogs plex 100→ Shows last 100 lines
Expected Results:
- ✅ All single-container commands work exactly as before
- ✅ No batch behavior triggered for single containers
- ✅ Confirmation behavior unchanged (stop requires confirm, others don't)
Test E2: Inline Keyboard Actions Still Work
Objective: Verify phase 8 keyboard functionality intact
Steps:
- Send:
status - Tap a container name button
- Tap an action button (e.g., "▶️ Start", "Update 🔄")
- Complete action
Expected Results:
- ✅ Container detail view appears
- ✅ Action buttons work
- ✅ Actions execute correctly
- ✅ No interference from batch infrastructure
Test E3: Pagination Still Works
Objective: Verify container list pagination for many containers
Steps:
- Send:
status(if you have 10+ containers) - Navigate with Previous/Next buttons
Expected Results:
- ✅ Pagination works correctly
- ✅ Page numbers accurate
- ✅ No batch selection interference
Note: If < 10 containers, document "Cannot test - insufficient containers"
Success Criteria Verification
After completing all tests, verify these criteria are met:
-
BAT-01: User can update multiple containers in one command
- Tests: A1, C3
-
BAT-02: Batch updates execute sequentially with per-container feedback
- Tests: A1, A2, C3
-
BAT-03: "Update all" updates only containers with updates available
- Tests: B1, B2
-
BAT-04: "Update all" requires confirmation
- Tests: B1, B3, B4
-
BAT-05: One failure doesn't abort remaining batch
- Tests: D1
-
BAT-06: Final summary shows success/failure count
- Tests: A1, C3, D1
-
Inline keyboard batch selection works
- Tests: C1-C7
-
No regression in existing commands
- Tests: E1, E2, E3
Test Execution Log
Date: ___________ Tester: ___________ n8n Version: ___________ Workflow Import Time: ___________
Results Summary
| Test | Status | Notes |
|---|---|---|
| A1: Multi-container update | ⬜ Pass / ⬜ Fail | |
| A2: Multi-container start | ⬜ Pass / ⬜ Fail | |
| A3: Multi-container stop | ⬜ Pass / ⬜ Fail | |
| A4: Fuzzy matching | ⬜ Pass / ⬜ Fail / ⬜ N/A | |
| A5: Disambiguation | ⬜ Pass / ⬜ Fail / ⬜ N/A | |
| B1: Update all with updates | ⬜ Pass / ⬜ Fail | |
| B2: Update all (none available) | ⬜ Pass / ⬜ Fail / ⬜ N/A | |
| B3: Update all cancel | ⬜ Pass / ⬜ Fail | |
| B4: Update all timeout | ⬜ Pass / ⬜ Fail | |
| C1: Enter multi-select | ⬜ Pass / ⬜ Fail | |
| C2: Toggle selection | ⬜ Pass / ⬜ Fail | |
| C3: Batch update from multi-select | ⬜ Pass / ⬜ Fail | |
| C4: Batch stop with confirm | ⬜ Pass / ⬜ Fail | |
| C5: Selection limit | ⬜ Pass / ⬜ Fail | |
| C6: Clear selection | ⬜ Pass / ⬜ Fail | |
| C7: Cancel multi-select | ⬜ Pass / ⬜ Fail | |
| D1: Failure isolation | ⬜ Pass / ⬜ Fail | |
| D2: Warning vs error | ⬜ Pass / ⬜ Fail | |
| E1: Single commands regression | ⬜ Pass / ⬜ Fail | |
| E2: Inline keyboard regression | ⬜ Pass / ⬜ Fail | |
| E3: Pagination regression | ⬜ Pass / ⬜ Fail / ⬜ N/A |
Issues Found
| Issue # | Test | Description | Severity | Status |
|---|---|---|---|---|
Additional Observations
Record any unexpected behavior, performance notes, UX feedback, etc.
Overall Assessment: ⬜ Ready for Production / ⬜ Issues Need Resolution
Notes for Phase 10: Record any polish/improvement ideas discovered during testing