168 lines
7.0 KiB
TypeScript
168 lines
7.0 KiB
TypeScript
import { tap, expect } from '@push.rocks/tapbundle';
|
|
import * as plugins from '../ts/plugins.js';
|
|
import type { IForwardConfig } from '../ts/forwarding/config/forwarding-types.js';
|
|
|
|
// First, import the components directly to avoid issues with compiled modules
|
|
import { ForwardingHandlerFactory } from '../ts/forwarding/factory/forwarding-factory.js';
|
|
import { httpOnly, tlsTerminateToHttp, tlsTerminateToHttps, httpsPassthrough } from '../ts/forwarding/config/forwarding-types.js';
|
|
// Import route-based helpers
|
|
import {
|
|
createHttpRoute,
|
|
createHttpsTerminateRoute,
|
|
createHttpsPassthroughRoute,
|
|
createHttpToHttpsRedirect,
|
|
createCompleteHttpsServer
|
|
} from '../ts/proxies/smart-proxy/utils/route-helpers.js';
|
|
|
|
const helpers = {
|
|
httpOnly,
|
|
tlsTerminateToHttp,
|
|
tlsTerminateToHttps,
|
|
httpsPassthrough
|
|
};
|
|
|
|
tap.test('ForwardingHandlerFactory - apply defaults based on type', async () => {
|
|
// HTTP-only defaults
|
|
const httpConfig: IForwardConfig = {
|
|
type: 'http-only',
|
|
target: { host: 'localhost', port: 3000 }
|
|
};
|
|
|
|
const expandedHttpConfig = ForwardingHandlerFactory.applyDefaults(httpConfig);
|
|
expect(expandedHttpConfig.http?.enabled).toEqual(true);
|
|
|
|
// HTTPS-passthrough defaults
|
|
const passthroughConfig: IForwardConfig = {
|
|
type: 'https-passthrough',
|
|
target: { host: 'localhost', port: 443 }
|
|
};
|
|
|
|
const expandedPassthroughConfig = ForwardingHandlerFactory.applyDefaults(passthroughConfig);
|
|
expect(expandedPassthroughConfig.https?.forwardSni).toEqual(true);
|
|
expect(expandedPassthroughConfig.http?.enabled).toEqual(false);
|
|
|
|
// HTTPS-terminate-to-http defaults
|
|
const terminateToHttpConfig: IForwardConfig = {
|
|
type: 'https-terminate-to-http',
|
|
target: { host: 'localhost', port: 3000 }
|
|
};
|
|
|
|
const expandedTerminateToHttpConfig = ForwardingHandlerFactory.applyDefaults(terminateToHttpConfig);
|
|
expect(expandedTerminateToHttpConfig.http?.enabled).toEqual(true);
|
|
expect(expandedTerminateToHttpConfig.http?.redirectToHttps).toEqual(true);
|
|
expect(expandedTerminateToHttpConfig.acme?.enabled).toEqual(true);
|
|
expect(expandedTerminateToHttpConfig.acme?.maintenance).toEqual(true);
|
|
|
|
// HTTPS-terminate-to-https defaults
|
|
const terminateToHttpsConfig: IForwardConfig = {
|
|
type: 'https-terminate-to-https',
|
|
target: { host: 'localhost', port: 8443 }
|
|
};
|
|
|
|
const expandedTerminateToHttpsConfig = ForwardingHandlerFactory.applyDefaults(terminateToHttpsConfig);
|
|
expect(expandedTerminateToHttpsConfig.http?.enabled).toEqual(true);
|
|
expect(expandedTerminateToHttpsConfig.http?.redirectToHttps).toEqual(true);
|
|
expect(expandedTerminateToHttpsConfig.acme?.enabled).toEqual(true);
|
|
expect(expandedTerminateToHttpsConfig.acme?.maintenance).toEqual(true);
|
|
});
|
|
|
|
tap.test('ForwardingHandlerFactory - validate configuration', async () => {
|
|
// Valid configuration
|
|
const validConfig: IForwardConfig = {
|
|
type: 'http-only',
|
|
target: { host: 'localhost', port: 3000 }
|
|
};
|
|
|
|
expect(() => ForwardingHandlerFactory.validateConfig(validConfig)).not.toThrow();
|
|
|
|
// Invalid configuration - missing target
|
|
const invalidConfig1: any = {
|
|
type: 'http-only'
|
|
};
|
|
|
|
expect(() => ForwardingHandlerFactory.validateConfig(invalidConfig1)).toThrow();
|
|
|
|
// Invalid configuration - invalid port
|
|
const invalidConfig2: IForwardConfig = {
|
|
type: 'http-only',
|
|
target: { host: 'localhost', port: 0 }
|
|
};
|
|
|
|
expect(() => ForwardingHandlerFactory.validateConfig(invalidConfig2)).toThrow();
|
|
|
|
// Invalid configuration - HTTP disabled for HTTP-only
|
|
const invalidConfig3: IForwardConfig = {
|
|
type: 'http-only',
|
|
target: { host: 'localhost', port: 3000 },
|
|
http: { enabled: false }
|
|
};
|
|
|
|
expect(() => ForwardingHandlerFactory.validateConfig(invalidConfig3)).toThrow();
|
|
|
|
// Invalid configuration - HTTP enabled for HTTPS passthrough
|
|
const invalidConfig4: IForwardConfig = {
|
|
type: 'https-passthrough',
|
|
target: { host: 'localhost', port: 443 },
|
|
http: { enabled: true }
|
|
};
|
|
|
|
expect(() => ForwardingHandlerFactory.validateConfig(invalidConfig4)).toThrow();
|
|
});
|
|
tap.test('Route Helper - create HTTP route configuration', async () => {
|
|
// Create a route-based configuration
|
|
const route = createHttpRoute('example.com', { host: 'localhost', port: 3000 });
|
|
|
|
// Verify route properties
|
|
expect(route.match.domains).toEqual('example.com');
|
|
expect(route.action.type).toEqual('forward');
|
|
expect(route.action.target?.host).toEqual('localhost');
|
|
expect(route.action.target?.port).toEqual(3000);
|
|
});
|
|
tap.test('Route Helper Functions - create HTTP route', async () => {
|
|
const route = createHttpRoute('example.com', { host: 'localhost', port: 3000 });
|
|
expect(route.match.domains).toEqual('example.com');
|
|
expect(route.match.ports).toEqual(80);
|
|
expect(route.action.type).toEqual('forward');
|
|
expect(route.action.target.host).toEqual('localhost');
|
|
expect(route.action.target.port).toEqual(3000);
|
|
});
|
|
|
|
tap.test('Route Helper Functions - create HTTPS terminate route', async () => {
|
|
const route = createHttpsTerminateRoute('example.com', { host: 'localhost', port: 3000 });
|
|
expect(route.match.domains).toEqual('example.com');
|
|
expect(route.match.ports).toEqual(443);
|
|
expect(route.action.type).toEqual('forward');
|
|
expect(route.action.target.host).toEqual('localhost');
|
|
expect(route.action.target.port).toEqual(3000);
|
|
expect(route.action.tls?.mode).toEqual('terminate');
|
|
expect(route.action.tls?.certificate).toEqual('auto');
|
|
});
|
|
|
|
tap.test('Route Helper Functions - create complete HTTPS server', async () => {
|
|
const routes = createCompleteHttpsServer('example.com', { host: 'localhost', port: 8443 });
|
|
expect(routes.length).toEqual(2);
|
|
|
|
// HTTPS route
|
|
expect(routes[0].match.domains).toEqual('example.com');
|
|
expect(routes[0].match.ports).toEqual(443);
|
|
expect(routes[0].action.type).toEqual('forward');
|
|
expect(routes[0].action.target.host).toEqual('localhost');
|
|
expect(routes[0].action.target.port).toEqual(8443);
|
|
expect(routes[0].action.tls?.mode).toEqual('terminate');
|
|
|
|
// HTTP redirect route
|
|
expect(routes[1].match.domains).toEqual('example.com');
|
|
expect(routes[1].match.ports).toEqual(80);
|
|
expect(routes[1].action.type).toEqual('redirect');
|
|
});
|
|
|
|
tap.test('Route Helper Functions - create HTTPS passthrough route', async () => {
|
|
const route = createHttpsPassthroughRoute('example.com', { host: 'localhost', port: 443 });
|
|
expect(route.match.domains).toEqual('example.com');
|
|
expect(route.match.ports).toEqual(443);
|
|
expect(route.action.type).toEqual('forward');
|
|
expect(route.action.target.host).toEqual('localhost');
|
|
expect(route.action.target.port).toEqual(443);
|
|
expect(route.action.tls?.mode).toEqual('passthrough');
|
|
});
|
|
export default tap.start(); |