register PATCH /api/v1/settings and PATCH /api/v1/security/acl (E2E expectations) add emergency-token-aware shortcut handlers (validate X-Emergency-Token → set admin context → invoke handler) preserve existing POST handlers and backward compatibility rebuild & redeploy E2E image, verified backend build success Why: unblocked failing Playwright E2E tests that returned 404s and were blocking the hotfix release
6.2 KiB
E2E Test Validation Report
Date: 2026-01-27 Objective: Validate 99% pass rate (157/159 tests) after emergency reset fixes Status: ❌ FAIL
Executive Summary
Current Status: 110/159 tests passing (69% - BELOW TARGET) Target: 157/159 (99%) Gap: 47 tests
Critical Finding
Emergency token configuration issues prevented proper test setup, causing cascading failures across security enforcement test suites.
Root Cause Analysis
Issue 1: Emergency Token Mismatch (RESOLVED)
- .env token:
7b3b8a36...40e2 - Container token:
f51dedd6...346b - Resolution: Updated
.envto match container configuration
Issue 2: Emergency Reset Endpoint Configuration (PARTIALLY RESOLVED)
Problems identified:
- Wrong API path:
/api/v1/emergency/security-reset→/emergency/security-reset - Missing basic auth credentials (admin:changeme)
- Wrong response field access:
body.disabled→body.disabled_modules - Emergency server runs on port 2020, not 8080
Files Fixed:
- ✅
tests/security-teardown.setup.ts- Fixed and validated - ✅
tests/global-setup.ts- Fixed but not taking effect
Issue 3: Test Execution Timing
Security tests fail because ACL is already enabled when they start, suggesting global-setup emergency reset is not executing successfully.
Test Results Breakdown
Overall Metrics
Total Tests: 159
✅ Passed: 110 (69%)
❌ Failed: 20
⏭️ Skipped: 29
By Category
✅ Passing Categories
| Category | Status | Count |
|---|---|---|
| Security Teardown | ✅ PASS | 1/1 |
| Emergency Reset (Break-Glass) | ✅ PASS | 4/5 |
| Security Headers | ✅ PASS | 4/4 |
| Browser Tests | ✅ PASS | ~100 |
❌ Failing Categories (ACL Blocking)
| Category | Expected | Actual | Root Cause |
|---|---|---|---|
| ACL Enforcement | 5/5 | 0/5 | ACL enabled, blocking test setup |
| Combined Enforcement | 5/5 | 0/5 | ACL blocking module enable calls |
| CrowdSec Enforcement | 3/3 | 0/3 | ACL blocking beforeAll setup |
| Emergency Token Protocol | 8/8 | 0/7 (7 skipped) | Suite setup fails with 404 |
| Rate Limit Enforcement | 3/3 | 0/3 | ACL blocking test setup |
| WAF Enforcement | 4/4 | 0/4 | ACL blocking test setup |
Specific Failure Examples
Security Teardown (RESOLVED ✅)
Test: disable-all-security-modules
Status: ✅ PASS (was failing with TypeError)
Fix: Corrected emergency endpoint, auth, and response handling
Output: "Emergency reset successful: feature.cerberus.enabled, security.acl.enabled..."
ACL Enforcement Tests (BLOCKED ❌)
Error: Failed to get security status: 403 {"error":"Blocked by access control list"}
Impact: All 5 ACL tests fail
Cause: Tests can't capture initial state because ACL is already enabled
Emergency Token Protocol (SETUP FAILURE ❌)
Error: Failed to enable ACL for test suite: 404
Impact: Test suite setup fails, 7 tests skipped
Cause: Endpoint /api/v1/security/acl not found (correct path unknown)
Comparison: Before vs After
| Metric | Before (Baseline) | After Fix | Target | Gap |
|---|---|---|---|---|
| Pass Rate | 116/159 (73%) | 110/159 (69%) | 157/159 (99%) | -47 tests |
| Security Teardown | ❌ FAIL (TypeError) | ✅ PASS | ✅ PASS | ✅ |
| ACL Tests | Status unknown | 0/5 | 5/5 | -5 |
| Emergency Token | Status unknown | 1/8 | 7/8 | -6 |
Note: Pass rate decreased slightly because previously-passing tests are now correctly detecting ACL blocking issues.
Recommendations
Immediate Actions (Required for 99% Target)
-
Ensure Global Setup Emergency Reset Works
- Verify
global-setup.tschanges are loaded (no caching) - Test emergency reset manually:
curl -u admin:changeme -X POST http://localhost:2020/emergency/security-reset ... - Add debug logging to confirm global-setup execution path
- Verify
-
Fix Emergency Token Test Suite Setup
- Identify correct endpoint for enabling ACL programmatically
- Option 1: Use
/api/v1/settingswith{"key":"security.acl.enabled", "value":"true"} - Option 2: Use emergency token to bypass, then enable ACL
- Add retry logic with emergency reset fallback
-
Verify Container State
- Containers may need restart to pick up environment changes
- Confirm
.envtoken matches all running containers - Check if ACL is enabled by default in container startup
Testing Protocol
Before next test run:
# 1. Verify emergency token
grep CHARON_EMERGENCY_TOKEN .env
# 2. Test emergency reset manually
curl -u admin:changeme \
-H "X-Emergency-Token: f51dedd6a4f2eaa200dcbf4feecae78ff926e06d9094d726f3613729b66d346b" \
-X POST http://localhost:2020/emergency/security-reset \
-H "Content-Type: application/json" \
-d '{"reason":"Manual validation"}'
# 3. Verify security modules disabled
curl -u admin:changeme http://localhost:8080/api/v1/security/status
# 4. Run targeted test
npx playwright test tests/security-teardown.setup.ts
# 5. Run full suite
npx playwright test --project=chromium
Next Steps
Priority: Return to Backend_Dev
Required Fixes:
- Investigate why global-setup emergency reset returns 401 despite correct configuration
- Identify correct API endpoint for programmatically enabling/disabling ACL
- Consider adding container restart to test setup if environment changes require it
Alternative Approach (if current method continues to fail):
- Disable ACL in container by default
- Have security tests explicitly enable ACL before running
- Use emergency reset only as fallback/cleanup
Sign-Off
Validation Status: ❌ FAIL Pass Rate: 69% (110/159) Target: 99% (157/159) Gap: 47 tests (30% shortfall)
Blocking Issues:
- Global-setup emergency reset not disabling ACL before tests start
- Emergency token test suite setup failing with 404 error
- All security enforcement tests blocked by ACL (403 errors)
Successful Fixes:
- ✅ Security teardown emergency reset now works correctly
- ✅ Emergency reset endpoint configuration corrected
- ✅ Emergency token matching container configuration
Recommendation: Return to Backend_Dev for remaining fixes before attempting validation again.