trade360-nodejs-sdk
Version:
LSports Trade360 SDK for Node.js
227 lines • 12.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const transport_message_headers_1 = require("../../../src/entities/message-wrappers/transport-message-headers");
describe('TransportMessageHeaders', () => {
describe('createFromProperties', () => {
it('should create TransportMessageHeaders with all required properties', () => {
const properties = {
MessageGuid: 'test-guid-123',
MessageType: 'MarketUpdate',
timestamp_in_ms: '1640995200000',
MessageSequence: 'seq-456',
FixtureId: 'fixture-789',
};
const headers = transport_message_headers_1.TransportMessageHeaders.createFromProperties(properties);
expect(headers.messageGuid).toBe('test-guid-123');
expect(headers.messageType).toBe('MarketUpdate');
expect(headers.timestampInMs).toBe('1640995200000');
expect(headers.messageSequence).toBe('seq-456');
expect(headers.fixtureId).toBe('fixture-789');
});
it('should create TransportMessageHeaders with only required properties', () => {
const properties = {
MessageGuid: 'test-guid-123',
MessageType: 'HeartbeatUpdate',
timestamp_in_ms: '1640995200000',
};
const headers = transport_message_headers_1.TransportMessageHeaders.createFromProperties(properties);
expect(headers.messageGuid).toBe('test-guid-123');
expect(headers.messageType).toBe('HeartbeatUpdate');
expect(headers.timestampInMs).toBe('1640995200000');
expect(headers.messageSequence).toBe('');
expect(headers.fixtureId).toBe('');
});
it('should handle Buffer values correctly', () => {
const properties = {
MessageGuid: Buffer.from('test-guid-buffer', 'utf8'),
MessageType: Buffer.from('MarketUpdate', 'utf8'),
timestamp_in_ms: Buffer.from('1640995200000', 'utf8'),
};
const headers = transport_message_headers_1.TransportMessageHeaders.createFromProperties(properties);
expect(headers.messageGuid).toBe('test-guid-buffer');
expect(headers.messageType).toBe('MarketUpdate');
expect(headers.timestampInMs).toBe('1640995200000');
});
it('should handle non-string values by converting to string', () => {
const properties = {
MessageGuid: 12345,
MessageType: true,
timestamp_in_ms: 1640995200000,
};
const headers = transport_message_headers_1.TransportMessageHeaders.createFromProperties(properties);
expect(headers.messageGuid).toBe('12345');
expect(headers.messageType).toBe('true');
expect(headers.timestampInMs).toBe('1640995200000');
});
it('should throw error when properties parameter is null', () => {
expect(() => {
transport_message_headers_1.TransportMessageHeaders.createFromProperties(null);
}).toThrow('Properties parameter cannot be null or undefined');
});
it('should throw error when properties parameter is undefined', () => {
expect(() => {
transport_message_headers_1.TransportMessageHeaders.createFromProperties(undefined);
}).toThrow('Properties parameter cannot be null or undefined');
});
it('should throw error when required MessageGuid is missing', () => {
const properties = {
MessageType: 'MarketUpdate',
timestamp_in_ms: '1640995200000',
};
expect(() => {
transport_message_headers_1.TransportMessageHeaders.createFromProperties(properties);
}).toThrow("Header 'MessageGuid' is missing, null, or empty in message properties object.");
});
it('should throw error when required MessageType is missing', () => {
const properties = {
MessageGuid: 'test-guid-123',
timestamp_in_ms: '1640995200000',
};
expect(() => {
transport_message_headers_1.TransportMessageHeaders.createFromProperties(properties);
}).toThrow("Header 'MessageType' is missing, null, or empty in message properties object.");
});
it('should throw error when required timestamp_in_ms is missing', () => {
const properties = {
MessageGuid: 'test-guid-123',
MessageType: 'MarketUpdate',
};
expect(() => {
transport_message_headers_1.TransportMessageHeaders.createFromProperties(properties);
}).toThrow("Header 'timestamp_in_ms' is missing, null, or empty in message properties object.");
});
it('should throw error when required property is null', () => {
const properties = {
MessageGuid: null,
MessageType: 'MarketUpdate',
timestamp_in_ms: '1640995200000',
};
expect(() => {
transport_message_headers_1.TransportMessageHeaders.createFromProperties(properties);
}).toThrow("Header 'MessageGuid' is missing, null, or empty in message properties object.");
});
it('should throw error when required property is empty string', () => {
const properties = {
MessageGuid: '',
MessageType: 'MarketUpdate',
timestamp_in_ms: '1640995200000',
};
expect(() => {
transport_message_headers_1.TransportMessageHeaders.createFromProperties(properties);
}).toThrow("Header 'MessageGuid' is missing, null, or empty in message properties object.");
});
it('should throw error when required property is whitespace only', () => {
const properties = {
MessageGuid: ' ',
MessageType: 'MarketUpdate',
timestamp_in_ms: '1640995200000',
};
expect(() => {
transport_message_headers_1.TransportMessageHeaders.createFromProperties(properties);
}).toThrow("Header 'MessageGuid' is missing, null, or empty in message properties object.");
});
it('should return empty string for optional properties when null', () => {
const properties = {
MessageGuid: 'test-guid-123',
MessageType: 'MarketUpdate',
timestamp_in_ms: '1640995200000',
MessageSequence: null,
FixtureId: undefined,
};
const headers = transport_message_headers_1.TransportMessageHeaders.createFromProperties(properties);
expect(headers.messageSequence).toBe('');
expect(headers.fixtureId).toBe('');
});
it('should return empty string for optional properties when empty string', () => {
const properties = {
MessageGuid: 'test-guid-123',
MessageType: 'MarketUpdate',
timestamp_in_ms: '1640995200000',
MessageSequence: '',
FixtureId: ' ',
};
const headers = transport_message_headers_1.TransportMessageHeaders.createFromProperties(properties);
expect(headers.messageSequence).toBe('');
expect(headers.fixtureId).toBe(' '); // Optional properties don't get trimmed, only validated if required
});
it('should handle mixed property types correctly', () => {
const properties = {
MessageGuid: 'test-guid-123',
MessageType: Buffer.from('MarketUpdate', 'utf8'),
timestamp_in_ms: 1640995200000,
MessageSequence: null,
FixtureId: Buffer.from('fixture-789', 'utf8'),
};
const headers = transport_message_headers_1.TransportMessageHeaders.createFromProperties(properties);
expect(headers.messageGuid).toBe('test-guid-123');
expect(headers.messageType).toBe('MarketUpdate');
expect(headers.timestampInMs).toBe('1640995200000');
expect(headers.messageSequence).toBe('');
expect(headers.fixtureId).toBe('fixture-789');
});
it('should throw error when attempting to access invalid property key', () => {
const properties = {
MessageGuid: 'test-guid-123',
MessageType: 'MarketUpdate',
timestamp_in_ms: '1640995200000',
};
// This test simulates what would happen if someone tried to inject an invalid key
// In practice, this would only happen if the internal code was modified incorrectly
expect(() => {
// Using any to bypass TypeScript checking for this security test
transport_message_headers_1.TransportMessageHeaders.getRequiredProperty(properties, 'maliciousKey', true);
}).toThrow("Invalid property key: 'maliciousKey'. Only predefined header keys are allowed.");
});
it('should reject object values to prevent injection attacks', () => {
const maliciousObject = {
toString: () => 'malicious-payload',
valueOf: () => 'another-payload',
};
const properties = {
MessageGuid: maliciousObject,
MessageType: 'MarketUpdate',
timestamp_in_ms: '1640995200000',
};
expect(() => {
transport_message_headers_1.TransportMessageHeaders.createFromProperties(properties);
}).toThrow("Header 'MessageGuid' contains invalid data type. Only primitive values are allowed.");
});
it('should reject function values to prevent code injection', () => {
const maliciousFunction = () => 'malicious-code';
const properties = {
MessageGuid: 'test-guid-123',
MessageType: maliciousFunction,
timestamp_in_ms: '1640995200000',
};
expect(() => {
transport_message_headers_1.TransportMessageHeaders.createFromProperties(properties);
}).toThrow("Header 'MessageType' contains invalid data type. Only primitive values are allowed.");
});
it('should reject array values to prevent injection attacks', () => {
const maliciousArray = ['payload1', 'payload2'];
const properties = {
MessageGuid: 'test-guid-123',
MessageType: 'MarketUpdate',
timestamp_in_ms: maliciousArray,
};
expect(() => {
transport_message_headers_1.TransportMessageHeaders.createFromProperties(properties);
}).toThrow("Header 'timestamp_in_ms' contains invalid data type. Only primitive values are allowed.");
});
it('should prevent prototype pollution attacks', () => {
// Create an object that doesn't inherit from Object.prototype
const maliciousProperties = Object.create(null);
maliciousProperties.MessageGuid = 'test-guid-123';
maliciousProperties.MessageType = 'MarketUpdate';
maliciousProperties.timestamp_in_ms = '1640995200000';
// Add a property that would exist on prototype but not own property
Object.setPrototypeOf(maliciousProperties, {
MessageGuid: 'prototype-pollution-attempt',
});
// Should work fine since we use hasOwnProperty check
const headers = transport_message_headers_1.TransportMessageHeaders.createFromProperties(maliciousProperties);
expect(headers.messageGuid).toBe('test-guid-123');
});
});
});
//# sourceMappingURL=transport-message-headers.spec.js.map