11 KiB
Caddy Import Tests Reorganization: Move from Security Shard to Core
Date: 2026-02-26 Status: Ready for Implementation
1. Introduction
Overview
The 5 Caddyfile import UI test files were manually moved from
tests/security-enforcement/zzz-caddy-imports/ to tests/core/caddy-import/.
These tests verify Caddyfile parsing/import UI functionality and do not
require Cerberus middleware — they belong in the non-security (core) shard.
Objectives
- Update CI workflow to reflect the new file locations.
- Simplify the Playwright config by removing the now-unnecessary
crossBrowserCaddyImportSpec/securityEnforcementExceptCrossBrowserspecial-case regex logic. - Fix one broken relative import in the moved test files.
- Confirm all security UI tests remain in the security shard untouched.
2. Research Findings
2.1 Current File State
Moved to tests/core/caddy-import/ (confirmed present):
| File | Description |
|---|---|
caddy-import-cross-browser.spec.ts |
Cross-browser Caddyfile import scenarios |
caddy-import-debug.spec.ts |
Diagnostic/debug tests for import flow |
caddy-import-firefox.spec.ts |
Firefox-specific edge cases |
caddy-import-gaps.spec.ts |
Gap coverage (conflict details, session resume, etc.) |
caddy-import-webkit.spec.ts |
WebKit-specific edge cases |
Old directory tests/security-enforcement/zzz-caddy-imports/: Fully removed (confirmed via filesystem scan).
2.2 Security Shard — Intact (No Changes Needed)
tests/security-enforcement/ (17 files + 1 subdirectory):
acl-enforcement.spec.ts,acl-waf-layering.spec.ts,auth-api-enforcement.spec.ts,auth-middleware-cascade.spec.ts,authorization-rbac.spec.ts,combined-enforcement.spec.ts,crowdsec-enforcement.spec.ts,emergency-reset.spec.ts,emergency-server/,emergency-token.spec.ts,multi-component-security-workflows.spec.ts,rate-limit-enforcement.spec.ts,security-headers-enforcement.spec.ts,waf-enforcement.spec.ts,waf-rate-limit-interaction.spec.ts,zzz-admin-whitelist-blocking.spec.ts,zzzz-break-glass-recovery.spec.ts
tests/security-enforcement/zzz-security-ui/ (5 files):
access-lists-crud.spec.ts,crowdsec-import.spec.ts,encryption-management.spec.ts,real-time-logs.spec.ts,system-security-settings.spec.ts
tests/security/ (15 files):
acl-integration.spec.ts,audit-logs.spec.ts,crowdsec-config.spec.ts,crowdsec-console-enrollment.spec.ts,crowdsec-decisions.spec.ts,crowdsec-diagnostics.spec.ts,crowdsec-import.spec.ts,emergency-operations.spec.ts,rate-limiting.spec.ts,security-dashboard.spec.ts,security-headers.spec.ts,suite-integration.spec.ts,system-settings-feature-toggles.spec.ts,waf-config.spec.ts,workflow-security.spec.ts
All of these require Cerberus ON and stay in the security shard.
2.3 Broken Import
In tests/core/caddy-import/caddy-import-gaps.spec.ts (line 20):
import type { TestDataManager } from '../utils/TestDataManager';
This resolves to tests/core/utils/TestDataManager — does not exist.
The actual file is at tests/utils/TestDataManager.ts.
Fix: Change to ../../utils/TestDataManager.
All other imports (../../fixtures/auth-fixtures) resolve correctly from the
new location.
3. Technical Specifications
3.1 CI Workflow Changes
File: .github/workflows/e2e-tests-split.yml
The non-security shards explicitly list test directories. Since they already
include tests/core, the new tests/core/caddy-import/ directory is
automatically picked up — no CI changes needed for test path inclusion.
The security shards explicitly list tests/security-enforcement/ and
tests/security/. Since zzz-caddy-imports/ was removed from
tests/security-enforcement/, the caddy import tests are automatically
excluded from the security shard — no CI changes needed.
Verification matrix:
| Shard Type | Test Paths in Workflow | Picks Up tests/core/caddy-import/? |
|---|---|---|
| Security (Chromium, line 331-333) | tests/security-enforcement/, tests/security/, tests/integration/multi-feature-workflows.spec.ts |
No |
| Security (Firefox, line 540-542) | Same pattern | No |
| Security (WebKit, line 749-751) | Same pattern | No |
| Non-Security Chromium (line 945-952) | tests/core, tests/dns-provider-crud.spec.ts, tests/dns-provider-types.spec.ts, tests/integration, tests/manual-dns-provider.spec.ts, tests/monitoring, tests/settings, tests/tasks |
Yes (via tests/core) |
| Non-Security Firefox (line 1157-1164) | Same pattern | Yes |
| Non-Security WebKit (line 1369-1376) | Same pattern | Yes |
Result: No CI workflow file changes required.
3.2 Playwright Config Changes
File: playwright.config.js
The config has special-case regex logic (lines 38-41) that was created to
handle the old zzz-caddy-imports location within security-enforcement/:
// CURRENT (lines 38-41) — references old, non-existent path
const crossBrowserCaddyImportSpec =
/security-enforcement\/zzz-caddy-imports\/caddy-import-cross-browser\.spec\.(ts|js)$/;
const securityEnforcementExceptCrossBrowser =
/security-enforcement\/(?!zzz-caddy-imports\/caddy-import-cross-browser\.spec\.(ts|js)$).*/;
Now that the caddy import tests live under tests/core/caddy-import/:
crossBrowserCaddyImportSpecno longer matches any file — dead code.securityEnforcementExceptCrossBrowsernegative lookahead is now unnecessary — all files insecurity-enforcement/are security tests.- The browser projects'
testIgnorealready includes'**/security/**'and the simplifiedsecurity-enforcementpattern will exclude all security tests.
Required change: Remove the special-case variables and simplify testIgnore
to use a plain **/security-enforcement/** glob.
Diff: playwright.config.js
const skipSecurityDeps = process.env.PLAYWRIGHT_SKIP_SECURITY_DEPS !== '0';
const browserDependencies = skipSecurityDeps ? ['setup'] : ['setup', 'security-tests'];
-const crossBrowserCaddyImportSpec =
- /security-enforcement\/zzz-caddy-imports\/caddy-import-cross-browser\.spec\.(ts|js)$/;
-const securityEnforcementExceptCrossBrowser =
- /security-enforcement\/(?!zzz-caddy-imports\/caddy-import-cross-browser\.spec\.(ts|js)$).*/;
For each of the 3 browser projects (chromium, firefox, webkit), change:
- testMatch: [crossBrowserCaddyImportSpec, /.*\.spec\.(ts|js)$/],
- testIgnore: ['**/frontend/**', '**/node_modules/**', '**/backend/**', securityEnforcementExceptCrossBrowser, '**/security/**'],
+ testMatch: /.*\.spec\.(ts|js)$/,
+ testIgnore: ['**/frontend/**', '**/node_modules/**', '**/backend/**', '**/security-enforcement/**', '**/security/**'],
Rationale: The crossBrowserCaddyImportSpec regex was a workaround to
include one specific file from the security-enforcement directory in cross-browser
runs. Now that all caddy import tests are under tests/core/, they are
naturally included by the default .*\.spec\.(ts|js)$ pattern and naturally
excluded from the security ignore patterns.
3.3 Broken Import Fix
File: tests/core/caddy-import/caddy-import-gaps.spec.ts (line 20)
-import type { TestDataManager } from '../utils/TestDataManager';
+import type { TestDataManager } from '../../utils/TestDataManager';
Rationale: From the new location tests/core/caddy-import/, the correct
relative path to tests/utils/TestDataManager.ts is ../../utils/TestDataManager.
4. Implementation Plan
Phase 1: Fix Broken Import (1 file)
| Task | File | Change |
|---|---|---|
Fix TestDataManager import path |
tests/core/caddy-import/caddy-import-gaps.spec.ts:20 |
../utils/TestDataManager → ../../utils/TestDataManager |
Phase 2: Simplify Playwright Config (1 file, 4 locations)
| Task | File | Lines | Change |
|---|---|---|---|
Remove crossBrowserCaddyImportSpec variable |
playwright.config.js |
38-39 | Delete |
Remove securityEnforcementExceptCrossBrowser variable |
playwright.config.js |
40-41 | Delete |
| Simplify Chromium project config | playwright.config.js |
269-270 | Replace testMatch/testIgnore |
| Simplify Firefox project config | playwright.config.js |
280-281 | Replace testMatch/testIgnore |
| Simplify WebKit project config | playwright.config.js |
291-292 | Replace testMatch/testIgnore |
Phase 3: Validation
| Task | Command | Expected Result |
|---|---|---|
| Run caddy import tests locally (Firefox) | npx playwright test --project=firefox tests/core/caddy-import/ |
All 5 files discovered, tests execute |
| Run caddy import tests locally (all browsers) | npx playwright test tests/core/caddy-import/ |
Tests run on chromium, firefox, webkit |
| Verify security tests excluded from non-security run | npx playwright test --project=firefox --list tests/core |
No security-enforcement files listed |
| Verify security shard unchanged | npx playwright test --project=security-tests --list |
All security-enforcement + security files listed |
Phase 4: Documentation
No external documentation changes needed. The archive docs in
docs/reports/archive/ reference old paths but are historical records
and should not be updated.
5. Acceptance Criteria
tests/core/caddy-import/contains all 5 caddy import test files.tests/security-enforcement/zzz-caddy-imports/no longer exists.- All security UI tests remain in
tests/security-enforcement/zzz-security-ui/andtests/security/. caddy-import-gaps.spec.tsimport path resolves correctly.playwright.config.jshas no references tozzz-caddy-imports.- Non-security shards automatically pick up
tests/core/caddy-import/viatests/core. - Security shards do not run caddy import tests.
- No CI workflow file changes needed (paths already correct).
- Playwright test discovery lists caddy import files under all 3 browser projects.
6. PR Slicing Strategy
Decision: Single PR.
Rationale:
- Small scope: 2 files changed (1 import fix + 1 config simplification).
- Low risk: Test-only changes, no production code affected.
- No cross-domain concerns.
- Fully reversible.
PR-1: Caddy Import Test Reorganization Cleanup
| Attribute | Value |
|---|---|
| Scope | Fix broken import + simplify playwright config |
| Files | tests/core/caddy-import/caddy-import-gaps.spec.ts, playwright.config.js |
| Dependencies | None (file move already done manually) |
| Validation | Run npx playwright test --project=firefox tests/core/caddy-import/ |
| Rollback | Revert the 2-file change |
7. Risk Assessment
| Risk | Likelihood | Impact | Mitigation |
|---|---|---|---|
| Caddy import tests silently dropped from CI | Low | High | Verify with --list that files are discovered |
| Security tests accidentally run in non-security shard | Low | Medium | testIgnore patterns verified against all security paths |
| Other tests break from playwright config change | Very Low | Medium | Only testMatch/testIgnore simplified; no new exclusions added |