Files
Charon/tests/fixtures/proxy-hosts.ts
akanealw eec8c28fb3
Some checks are pending
Go Benchmark / Performance Regression Check (push) Waiting to run
Cerberus Integration / Cerberus Security Stack Integration (push) Waiting to run
Upload Coverage to Codecov / Backend Codecov Upload (push) Waiting to run
Upload Coverage to Codecov / Frontend Codecov Upload (push) Waiting to run
CodeQL - Analyze / CodeQL analysis (go) (push) Waiting to run
CodeQL - Analyze / CodeQL analysis (javascript-typescript) (push) Waiting to run
CrowdSec Integration / CrowdSec Bouncer Integration (push) Waiting to run
Docker Build, Publish & Test / build-and-push (push) Waiting to run
Docker Build, Publish & Test / Security Scan PR Image (push) Blocked by required conditions
Quality Checks / Auth Route Protection Contract (push) Waiting to run
Quality Checks / Codecov Trigger/Comment Parity Guard (push) Waiting to run
Quality Checks / Backend (Go) (push) Waiting to run
Quality Checks / Frontend (React) (push) Waiting to run
Rate Limit integration / Rate Limiting Integration (push) Waiting to run
Security Scan (PR) / Trivy Binary Scan (push) Waiting to run
Supply Chain Verification (PR) / Verify Supply Chain (push) Waiting to run
WAF integration / Coraza WAF Integration (push) Waiting to run
changed perms
2026-04-22 18:19:14 +00:00

387 lines
8.9 KiB
TypeScript
Executable File

/**
* Proxy Host Test Fixtures
*
* Mock data for proxy host E2E tests.
* Provides various configurations for testing CRUD operations,
* validation, and edge cases.
*
* @example
* ```typescript
* import { basicProxyHost, proxyHostWithSSL, invalidProxyHosts } from './fixtures/proxy-hosts';
*
* test('create basic proxy host', async ({ testData }) => {
* const { id } = await testData.createProxyHost(basicProxyHost);
* });
* ```
*/
import {
generateDomain,
generateIPAddress,
generatePort,
generateUniqueId,
} from './test-data';
/**
* Proxy host configuration interface
*/
export interface ProxyHostConfig {
/** Domain name for the proxy */
domain: string;
/** Target hostname or IP */
forwardHost: string;
/** Target port */
forwardPort: number;
/** Friendly name for the proxy host */
name?: string;
/** Protocol scheme */
scheme: 'http' | 'https';
/** Enable WebSocket support */
websocketSupport: boolean;
/** Enable HTTP/2 */
http2Support?: boolean;
/** Enable gzip compression */
gzipEnabled?: boolean;
/** Custom headers */
customHeaders?: Record<string, string>;
/** Access list ID (if applicable) */
accessListId?: string;
/** Certificate ID (if applicable) */
certificateId?: string;
/** Enable HSTS */
hstsEnabled?: boolean;
/** Force SSL redirect */
forceSSL?: boolean;
/** Block exploits */
blockExploits?: boolean;
/** Custom Caddy configuration */
advancedConfig?: string;
/** Enable/disable the proxy */
enabled?: boolean;
}
/**
* Basic proxy host configuration
* Minimal setup for simple HTTP proxying
*/
export const basicProxyHost: ProxyHostConfig = {
domain: 'basic-app.example.com',
forwardHost: '192.168.1.100',
forwardPort: 3000,
scheme: 'http',
websocketSupport: false,
};
/**
* Proxy host with SSL enabled
* Uses HTTPS scheme and forces SSL redirect
*/
export const proxyHostWithSSL: ProxyHostConfig = {
domain: 'secure-app.example.com',
forwardHost: '192.168.1.100',
forwardPort: 443,
scheme: 'https',
websocketSupport: false,
hstsEnabled: true,
forceSSL: true,
};
/**
* Proxy host with WebSocket support
* For real-time applications
*/
export const proxyHostWithWebSocket: ProxyHostConfig = {
domain: 'ws-app.example.com',
forwardHost: '192.168.1.100',
forwardPort: 3000,
scheme: 'http',
websocketSupport: true,
};
/**
* Proxy host with full security features
* Includes SSL, HSTS, exploit blocking
*/
export const proxyHostFullSecurity: ProxyHostConfig = {
domain: 'secure-full.example.com',
forwardHost: '192.168.1.100',
forwardPort: 8080,
scheme: 'https',
websocketSupport: true,
http2Support: true,
hstsEnabled: true,
forceSSL: true,
blockExploits: true,
gzipEnabled: true,
};
/**
* Proxy host with custom headers
* For testing header injection
*/
export const proxyHostWithHeaders: ProxyHostConfig = {
domain: 'headers-app.example.com',
forwardHost: '192.168.1.100',
forwardPort: 3000,
scheme: 'http',
websocketSupport: false,
customHeaders: {
'X-Custom-Header': 'test-value',
'X-Forwarded-Proto': 'https',
'X-Real-IP': '{remote_host}',
},
};
/**
* Proxy host with access list
* Placeholder for ACL integration testing
*/
export const proxyHostWithAccessList: ProxyHostConfig = {
domain: 'restricted-app.example.com',
forwardHost: '192.168.1.100',
forwardPort: 3000,
scheme: 'http',
websocketSupport: false,
accessListId: '', // Will be set dynamically in tests
};
/**
* Proxy host with advanced Caddy configuration
* For testing custom configuration injection
*/
export const proxyHostWithAdvancedConfig: ProxyHostConfig = {
domain: 'advanced-app.example.com',
forwardHost: '192.168.1.100',
forwardPort: 3000,
scheme: 'http',
websocketSupport: false,
advancedConfig: `
header {
-Server
X-Robots-Tag "noindex, nofollow"
}
request_body {
max_size 10MB
}
`,
};
/**
* Disabled proxy host
* For testing enable/disable functionality
*/
export const disabledProxyHost: ProxyHostConfig = {
domain: 'disabled-app.example.com',
forwardHost: '192.168.1.100',
forwardPort: 3000,
scheme: 'http',
websocketSupport: false,
enabled: false,
};
/**
* Docker container proxy host
* Uses container name as forward host
*/
export const dockerProxyHost: ProxyHostConfig = {
domain: 'docker-app.example.com',
forwardHost: 'my-container',
forwardPort: 80,
scheme: 'http',
websocketSupport: false,
};
/**
* Wildcard domain proxy host
* For subdomain proxying
*/
export const wildcardProxyHost: ProxyHostConfig = {
domain: '*.apps.example.com',
forwardHost: '192.168.1.100',
forwardPort: 3000,
scheme: 'http',
websocketSupport: false,
};
/**
* Invalid proxy host configurations for validation testing
*/
export const invalidProxyHosts = {
/** Empty domain */
emptyDomain: {
domain: '',
forwardHost: '192.168.1.100',
forwardPort: 3000,
scheme: 'http' as const,
websocketSupport: false,
},
/** Invalid domain format */
invalidDomain: {
domain: 'not a valid domain!',
forwardHost: '192.168.1.100',
forwardPort: 3000,
scheme: 'http' as const,
websocketSupport: false,
},
/** Empty forward host */
emptyForwardHost: {
domain: 'valid.example.com',
forwardHost: '',
forwardPort: 3000,
scheme: 'http' as const,
websocketSupport: false,
},
/** Invalid IP address */
invalidIP: {
domain: 'valid.example.com',
forwardHost: '999.999.999.999',
forwardPort: 3000,
scheme: 'http' as const,
websocketSupport: false,
},
/** Port out of range (too low) */
portTooLow: {
domain: 'valid.example.com',
forwardHost: '192.168.1.100',
forwardPort: 0,
scheme: 'http' as const,
websocketSupport: false,
},
/** Port out of range (too high) */
portTooHigh: {
domain: 'valid.example.com',
forwardHost: '192.168.1.100',
forwardPort: 70000,
scheme: 'http' as const,
websocketSupport: false,
},
/** Negative port */
negativePort: {
domain: 'valid.example.com',
forwardHost: '192.168.1.100',
forwardPort: -1,
scheme: 'http' as const,
websocketSupport: false,
},
/** XSS in domain */
xssInDomain: {
domain: '<script>alert(1)</script>.example.com',
forwardHost: '192.168.1.100',
forwardPort: 3000,
scheme: 'http' as const,
websocketSupport: false,
},
/** SQL injection in domain */
sqlInjectionInDomain: {
domain: "'; DROP TABLE proxy_hosts; --",
forwardHost: '192.168.1.100',
forwardPort: 3000,
scheme: 'http' as const,
websocketSupport: false,
},
};
/**
* Generate a unique proxy host configuration
* Creates a proxy host with unique domain to avoid conflicts
* @param overrides - Optional configuration overrides
* @returns ProxyHostConfig with unique domain
*
* @example
* ```typescript
* const host = generateProxyHost({ websocketSupport: true });
* ```
*/
export function generateProxyHost(
overrides: Partial<ProxyHostConfig> = {}
): ProxyHostConfig {
const domain = generateDomain('proxy');
return {
domain,
forwardHost: generateIPAddress(),
forwardPort: generatePort({ min: 3000, max: 9000 }),
name: `Test Host ${Date.now()}`,
scheme: 'http',
websocketSupport: false,
...overrides,
};
}
/**
* Generate multiple unique proxy hosts
* @param count - Number of proxy hosts to generate
* @param overrides - Optional configuration overrides for all hosts
* @returns Array of ProxyHostConfig
*/
export function generateProxyHosts(
count: number,
overrides: Partial<ProxyHostConfig> = {}
): ProxyHostConfig[] {
return Array.from({ length: count }, () => generateProxyHost(overrides));
}
/**
* Proxy host for load balancing tests
* Multiple backends configuration
*/
export const loadBalancedProxyHost = {
domain: 'lb-app.example.com',
backends: [
{ host: '192.168.1.101', port: 3000, weight: 1 },
{ host: '192.168.1.102', port: 3000, weight: 1 },
{ host: '192.168.1.103', port: 3000, weight: 2 },
],
scheme: 'http' as const,
websocketSupport: false,
healthCheck: {
path: '/health',
interval: '10s',
timeout: '5s',
},
};
/**
* Expected API response for proxy host creation
*/
export interface ProxyHostAPIResponse {
id: string;
uuid: string;
domain: string;
forward_host: string;
forward_port: number;
scheme: string;
websocket_support: boolean;
enabled: boolean;
created_at: string;
updated_at: string;
}
/**
* Mock API response for testing
*/
export function mockProxyHostResponse(
config: Partial<ProxyHostConfig> = {}
): ProxyHostAPIResponse {
const id = generateUniqueId();
return {
id,
uuid: `uuid-${id}`,
domain: config.domain || generateDomain('proxy'),
forward_host: config.forwardHost || '192.168.1.100',
forward_port: config.forwardPort || 3000,
scheme: config.scheme || 'http',
websocket_support: config.websocketSupport || false,
enabled: config.enabled !== false,
created_at: new Date().toISOString(),
updated_at: new Date().toISOString(),
};
}