5.6 KiB
Frontend Test Coverage Improvement Plan
Objective
Increase frontend test coverage to 88% locally while maintaining stable CI builds. Current overall line coverage is 84.73%.
Strategy
- Target Low Coverage / High Value Areas: Focus on components with complex logic or API interactions that are currently under-tested.
- Environment-Specific Thresholds: Implement dynamic coverage thresholds to enforce high standards locally without causing CI fragility.
Targeted Files
1. src/api/plugins.ts (Current: 0%)
Complexity: LOW Value: MEDIUM (Core API interactions) Test Cases:
getPlugins: Mocks client.get, returns data.getPlugin: Mocks client.get with ID.enablePlugin: Mocks client.post with ID.disablePlugin: Mocks client.post with ID.reloadPlugins: Mocks client.post, verifies return count.
2. src/components/PermissionsPolicyBuilder.tsx (Current: ~32%)
Complexity: MEDIUM Value: HIGH (Complex string manipulation logic) Test Cases:
- Renders correctly with empty value.
- Parses existing JSON value into state.
- Adds a new feature with
selfallowing. - Adds a new feature with custom origin.
- Updates existing feature when added again.
- Removes a feature.
- "Quick Add" buttons populate multiple features.
- Generates correct Permissions-Policy header string preview.
- Handles invalid JSON gracefully.
3. src/components/DNSProviderForm.tsx (Current: ~55%)
Complexity: HIGH Value: HIGH (Critical configuration form) Test Cases:
- Renders default state correctly.
- Pre-fills form when editing an existing provider.
- Changes inputs based on selected
Provider Type(e.g., Cloudflare vs Route53). - Validates required fields.
- Handles
Test Connectionsuccess/failure states. - Submits create payload correctly.
- Submits update payload correctly.
- Toggles "Advanced Settings".
- Handles Multi-Credential mode toggles.
4. src/utils/validation.ts (Current: ~0%)
Complexity: LOW Value: HIGH (Security and data validation logic) Test Cases:
isValidEmail: valid emails, invalid emails, empty strings.isIPv4: valid IPs, invalid IPs, out of range numbers.isPrivateOrDockerIP:- 10.x.x.x (Private)
- 172.16-31.x.x (Private/Docker)
- 192.168.x.x (Private)
- Public IPs (e.g. 8.8.8.8)
isLikelyDockerContainerIP:- 172.17-31.x.x (Docker range)
- Non-docker IPs.
5. src/utils/proxyHostsHelpers.ts (Current: ~0%)
Complexity: MEDIUM Value: MEDIUM (UI Helper logic) Test Cases:
formatSettingLabel: Verify correct labels for keys.settingHelpText: Verify help text mapping.settingKeyToField: Verify identity mapping.applyBulkSettingsToHosts:- Applies settings to multiple hosts.
- Handles missing hosts gracefully.
- Reports progress callback.
- Updates error count on failure.
6. src/components/ProxyHostForm.tsx (Current: ~78% lines, ~61% func)
Complexity: VERY HIGH (1378 lines) Value: MAXIMUM (Core Component) Test Cases:
- Missing Paths Analysis: Focus on the ~40% of functions not called (likely validation, secondary tabs, dynamic rows).
- Secondary Tabs: "Custom Locations", "Advanced" (HSTS, HTTP/2).
- SSL Flows: Let's Encrypt vs Custom certificates generation flows.
- Dynamic Rows: Adding/removing upstream servers, rewrites interactions.
- Error Simulation: API failures during connection testing.
7. src/components/CredentialManager.tsx (Current: ~50.7%)
Complexity: MEDIUM (132 lines) Value: HIGH (Security sensitive) Missing Lines: ~65 lines Strategy:
- Test CRUD operations for different credential types.
- Verify error handling during creation and deletion.
- Test empty states and loading states.
8. src/pages/CrowdSecConfig.tsx (Current: ~82.5%)
Complexity: HIGH (332 lines) Value: MEDIUM (Configuration page) Missing Lines: ~58 lines Strategy:
- Focus on form interactions for all configuration sections.
- Test "Enable/Disable" toggle flows.
- Verify API error handling when saving configuration.
Configuration Changes
Dynamic Thresholds
Modify frontend/vitest.config.ts to set coverage thresholds based on the environment.
const isCI = process.env.CI === 'true';
export default defineConfig({
// ...
test: {
coverage: {
// ...
thresholds: {
lines: isCI ? 83 : 88,
functions: isCI ? 78 : 88,
branches: isCI ? 77 : 85,
statements: isCI ? 83 : 88,
}
}
}
})
Execution Plan
- Implement Tests (Phase 1):
- Create
src/api/__tests__/plugins.test.ts - Create
src/components/__tests__/PermissionsPolicyBuilder.test.tsx - Create
src/components/__tests__/DNSProviderForm.test.tsx(or expand existing)
- Create
- Implement Tests (Phase 2):
- Create
src/utils/__tests__/validation.test.ts - Create
src/utils/__tests__/proxyHostsHelpers.test.ts
- Create
- Implement Tests (Phase 3 - The Heavy Lifter):
- Target:
src/components/ProxyHostForm.tsx - Goal: >90% coverage for this 1.4k line file.
- Strategy: Expand
src/components/__tests__/ProxyHostForm.test.tsxto cover edge cases, secondary tabs, and validation logic.
- Target:
- Implement Tests (Phase 4 - The Final Push):
- Target:
src/components/CredentialManager.tsxandsrc/pages/CrowdSecConfig.tsx - Goal: Reduce missing lines by >100 (combined).
- Strategy: Create dedicated test files focusing on the unreached branches identified in coverage reports.
- Target:
- Update Configuration:
- Update
frontend/vitest.config.ts
- Update
- Verify:
- Run
npm run test:coveragelocally to confirm >88%. - Verify CI build simulation.
- Run