202 lines
6.0 KiB
TypeScript
202 lines
6.0 KiB
TypeScript
import { expect } from '@push.rocks/tapbundle';
|
|
import {
|
|
EventSystem,
|
|
ProxyEvents,
|
|
ComponentType
|
|
} from '../../../ts/core/utils/event-system.js';
|
|
|
|
// Test event system
|
|
expect.describe('Event System', async () => {
|
|
let eventSystem: EventSystem;
|
|
let receivedEvents: any[] = [];
|
|
|
|
// Set up a new event system before each test
|
|
expect.beforeEach(() => {
|
|
eventSystem = new EventSystem(ComponentType.SMART_PROXY, 'test-id');
|
|
receivedEvents = [];
|
|
});
|
|
|
|
expect.it('should emit certificate events with correct structure', async () => {
|
|
// Set up listeners
|
|
eventSystem.on(ProxyEvents.CERTIFICATE_ISSUED, (data) => {
|
|
receivedEvents.push({
|
|
type: 'issued',
|
|
data
|
|
});
|
|
});
|
|
|
|
eventSystem.on(ProxyEvents.CERTIFICATE_RENEWED, (data) => {
|
|
receivedEvents.push({
|
|
type: 'renewed',
|
|
data
|
|
});
|
|
});
|
|
|
|
// Emit events
|
|
eventSystem.emitCertificateIssued({
|
|
domain: 'example.com',
|
|
certificate: 'cert-content',
|
|
privateKey: 'key-content',
|
|
expiryDate: new Date('2025-01-01')
|
|
});
|
|
|
|
eventSystem.emitCertificateRenewed({
|
|
domain: 'example.com',
|
|
certificate: 'new-cert-content',
|
|
privateKey: 'new-key-content',
|
|
expiryDate: new Date('2026-01-01'),
|
|
isRenewal: true
|
|
});
|
|
|
|
// Verify events
|
|
expect(receivedEvents.length).to.equal(2);
|
|
|
|
// Check issuance event
|
|
expect(receivedEvents[0].type).to.equal('issued');
|
|
expect(receivedEvents[0].data.domain).to.equal('example.com');
|
|
expect(receivedEvents[0].data.certificate).to.equal('cert-content');
|
|
expect(receivedEvents[0].data.componentType).to.equal(ComponentType.SMART_PROXY);
|
|
expect(receivedEvents[0].data.componentId).to.equal('test-id');
|
|
expect(receivedEvents[0].data.timestamp).to.be.a('number');
|
|
|
|
// Check renewal event
|
|
expect(receivedEvents[1].type).to.equal('renewed');
|
|
expect(receivedEvents[1].data.domain).to.equal('example.com');
|
|
expect(receivedEvents[1].data.isRenewal).to.be.true;
|
|
expect(receivedEvents[1].data.expiryDate).to.deep.equal(new Date('2026-01-01'));
|
|
});
|
|
|
|
expect.it('should emit component lifecycle events', async () => {
|
|
// Set up listeners
|
|
eventSystem.on(ProxyEvents.COMPONENT_STARTED, (data) => {
|
|
receivedEvents.push({
|
|
type: 'started',
|
|
data
|
|
});
|
|
});
|
|
|
|
eventSystem.on(ProxyEvents.COMPONENT_STOPPED, (data) => {
|
|
receivedEvents.push({
|
|
type: 'stopped',
|
|
data
|
|
});
|
|
});
|
|
|
|
// Emit events
|
|
eventSystem.emitComponentStarted('TestComponent', '1.0.0');
|
|
eventSystem.emitComponentStopped('TestComponent');
|
|
|
|
// Verify events
|
|
expect(receivedEvents.length).to.equal(2);
|
|
|
|
// Check started event
|
|
expect(receivedEvents[0].type).to.equal('started');
|
|
expect(receivedEvents[0].data.name).to.equal('TestComponent');
|
|
expect(receivedEvents[0].data.version).to.equal('1.0.0');
|
|
|
|
// Check stopped event
|
|
expect(receivedEvents[1].type).to.equal('stopped');
|
|
expect(receivedEvents[1].data.name).to.equal('TestComponent');
|
|
});
|
|
|
|
expect.it('should emit connection events', async () => {
|
|
// Set up listeners
|
|
eventSystem.on(ProxyEvents.CONNECTION_ESTABLISHED, (data) => {
|
|
receivedEvents.push({
|
|
type: 'established',
|
|
data
|
|
});
|
|
});
|
|
|
|
eventSystem.on(ProxyEvents.CONNECTION_CLOSED, (data) => {
|
|
receivedEvents.push({
|
|
type: 'closed',
|
|
data
|
|
});
|
|
});
|
|
|
|
// Emit events
|
|
eventSystem.emitConnectionEstablished({
|
|
connectionId: 'conn-123',
|
|
clientIp: '192.168.1.1',
|
|
port: 443,
|
|
isTls: true,
|
|
domain: 'example.com'
|
|
});
|
|
|
|
eventSystem.emitConnectionClosed({
|
|
connectionId: 'conn-123',
|
|
clientIp: '192.168.1.1',
|
|
port: 443
|
|
});
|
|
|
|
// Verify events
|
|
expect(receivedEvents.length).to.equal(2);
|
|
|
|
// Check established event
|
|
expect(receivedEvents[0].type).to.equal('established');
|
|
expect(receivedEvents[0].data.connectionId).to.equal('conn-123');
|
|
expect(receivedEvents[0].data.clientIp).to.equal('192.168.1.1');
|
|
expect(receivedEvents[0].data.port).to.equal(443);
|
|
expect(receivedEvents[0].data.isTls).to.be.true;
|
|
|
|
// Check closed event
|
|
expect(receivedEvents[1].type).to.equal('closed');
|
|
expect(receivedEvents[1].data.connectionId).to.equal('conn-123');
|
|
});
|
|
|
|
expect.it('should support once and off subscription methods', async () => {
|
|
// Set up a listener that should fire only once
|
|
eventSystem.once(ProxyEvents.CONNECTION_ESTABLISHED, (data) => {
|
|
receivedEvents.push({
|
|
type: 'once',
|
|
data
|
|
});
|
|
});
|
|
|
|
// Set up a persistent listener
|
|
const persistentHandler = (data: any) => {
|
|
receivedEvents.push({
|
|
type: 'persistent',
|
|
data
|
|
});
|
|
};
|
|
|
|
eventSystem.on(ProxyEvents.CONNECTION_ESTABLISHED, persistentHandler);
|
|
|
|
// First event should trigger both listeners
|
|
eventSystem.emitConnectionEstablished({
|
|
connectionId: 'conn-1',
|
|
clientIp: '192.168.1.1',
|
|
port: 443
|
|
});
|
|
|
|
// Second event should only trigger the persistent listener
|
|
eventSystem.emitConnectionEstablished({
|
|
connectionId: 'conn-2',
|
|
clientIp: '192.168.1.1',
|
|
port: 443
|
|
});
|
|
|
|
// Unsubscribe the persistent listener
|
|
eventSystem.off(ProxyEvents.CONNECTION_ESTABLISHED, persistentHandler);
|
|
|
|
// Third event should not trigger any listeners
|
|
eventSystem.emitConnectionEstablished({
|
|
connectionId: 'conn-3',
|
|
clientIp: '192.168.1.1',
|
|
port: 443
|
|
});
|
|
|
|
// Verify events
|
|
expect(receivedEvents.length).to.equal(3);
|
|
expect(receivedEvents[0].type).to.equal('once');
|
|
expect(receivedEvents[0].data.connectionId).to.equal('conn-1');
|
|
|
|
expect(receivedEvents[1].type).to.equal('persistent');
|
|
expect(receivedEvents[1].data.connectionId).to.equal('conn-1');
|
|
|
|
expect(receivedEvents[2].type).to.equal('persistent');
|
|
expect(receivedEvents[2].data.connectionId).to.equal('conn-2');
|
|
});
|
|
}); |