UNPKG

trade360-nodejs-sdk

Version:
385 lines 18.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const class_transformer_1 = require("class-transformer"); const base_bet_1 = require("../../../../src/entities/core-entities/market/base-bet"); const bet_status_1 = require("../../../../src/entities/core-entities/enums/bet-status"); const settlement_type_1 = require("../../../../src/entities/core-entities/enums/settlement-type"); describe('BaseBet Entity', () => { it('should deserialize a plain object into a BaseBet instance', () => { const plain = { Id: '1', Name: 'Base Bet', Line: '2.5', Status: bet_status_1.BetStatus.Open, Settlement: settlement_type_1.SettlementType.Winner, LastUpdate: '2024-06-01T12:00:00Z', IsChanged: 1, Probability: 0.75, ParticipantId: 42, PlayerName: 'Player X', }; const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, plain, { excludeExtraneousValues: true }); expect(baseBet).toBeInstanceOf(base_bet_1.BaseBet); expect(baseBet.id).toBe('1'); expect(typeof baseBet.id).toBe('string'); expect(baseBet.name).toBe('Base Bet'); expect(baseBet.line).toBe('2.5'); expect(baseBet.status).toBe(bet_status_1.BetStatus.Open); expect(baseBet.settlement).toBe(settlement_type_1.SettlementType.Winner); expect(baseBet.lastUpdate).toBeInstanceOf(Date); expect(baseBet.lastUpdate?.toISOString()).toBe('2024-06-01T12:00:00.000Z'); expect(baseBet.probability).toBe(0.75); expect(baseBet.participantId).toBe(42); expect(baseBet.playerName).toBe('Player X'); }); it('should handle missing properties with valid ID', () => { const plain = { Id: '123' }; const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, plain, { excludeExtraneousValues: true }); expect(baseBet.id).toBe('123'); expect(typeof baseBet.id).toBe('string'); expect(baseBet.name).toBeUndefined(); expect(baseBet.line).toBeUndefined(); expect(baseBet.baseLine).toBeUndefined(); expect(baseBet.status).toBeUndefined(); expect(baseBet.startPrice).toBeUndefined(); expect(baseBet.price).toBeUndefined(); expect(baseBet.priceVolume).toBeUndefined(); expect(baseBet.settlement).toBeUndefined(); expect(baseBet.lastUpdate).toBeUndefined(); expect(baseBet.priceIN).toBeUndefined(); expect(baseBet.priceUS).toBeUndefined(); expect(baseBet.priceUK).toBeUndefined(); expect(baseBet.priceMA).toBeUndefined(); expect(baseBet.priceHK).toBeUndefined(); expect(baseBet.probability).toBeUndefined(); expect(baseBet.participantId).toBeUndefined(); expect(baseBet.playerName).toBeUndefined(); }); it('should ignore extraneous properties', () => { const plain = { Id: '2', Name: 'Test BaseBet', Extra: 'ignore me', }; const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, plain, { excludeExtraneousValues: true }); expect(baseBet.Extra).toBeUndefined(); expect(baseBet.id).toBe('2'); expect(typeof baseBet.id).toBe('string'); }); it('should handle large ID numbers as strings without precision issues', () => { const plain = { Id: '11060329315062111', // Large number as string - maintains precision Name: 'Large ID Bet', }; const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, plain, { excludeExtraneousValues: true }); expect(baseBet).toBeInstanceOf(base_bet_1.BaseBet); expect(baseBet.id).toBe('11060329315062111'); expect(typeof baseBet.id).toBe('string'); expect(baseBet.name).toBe('Large ID Bet'); }); it('should handle the complete end-to-end scenario with standard JSON parsing', () => { // Simulate the exact JSON response from the server (IDs as strings) const jsonResponse = '{"Id":"11060329315062111","Name":"End-to-End Test","Status":1}'; // Parse using standard JSON (since IDs are now strings) const parsedData = JSON.parse(jsonResponse); // Verify that the large number is preserved as string expect(typeof parsedData.Id).toBe('string'); expect(parsedData.Id).toBe('11060329315062111'); // Verify that other numbers remain as regular numbers expect(typeof parsedData.Status).toBe('number'); expect(parsedData.Status).toBe(1); // Transform using class-transformer (as the application would) const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, parsedData, { excludeExtraneousValues: true, }); // Verify the final result maintains precision expect(baseBet.id).toBe('11060329315062111'); expect(typeof baseBet.id).toBe('string'); expect(baseBet.name).toBe('End-to-End Test'); expect(baseBet.status).toBe(1); }); it('should handle numeric inputs by converting to string automatically', () => { // class-transformer automatically converts numbers to strings when the target field is string const plain = { Id: 123 }; const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, plain, { excludeExtraneousValues: true }); expect(baseBet.id).toBe('123'); expect(typeof baseBet.id).toBe('string'); }); it('should reject BigInt inputs with appropriate error', () => { // BigInt is no longer supported - should throw error const plain = { Id: 11060329315062111n }; expect(() => { (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, plain, { excludeExtraneousValues: true }); }).toThrow('Unsupported type: bigint'); }); it('should handle zero values correctly', () => { // Test zero as number const plainWithZeroNumber = { Id: 0 }; const baseBetFromZeroNumber = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, plainWithZeroNumber, { excludeExtraneousValues: true, }); expect(baseBetFromZeroNumber.id).toBe('0'); expect(typeof baseBetFromZeroNumber.id).toBe('string'); // Test zero as string const plainWithZeroString = { Id: '0' }; const baseBetFromZeroString = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, plainWithZeroString, { excludeExtraneousValues: true, }); expect(baseBetFromZeroString.id).toBe('0'); expect(typeof baseBetFromZeroString.id).toBe('string'); }); it('should handle Date field transformation correctly', () => { const plain = { Id: '123', LastUpdate: '2024-06-01T12:00:00Z', }; const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, plain, { excludeExtraneousValues: true }); expect(baseBet.lastUpdate).toBeInstanceOf(Date); expect(baseBet.lastUpdate?.toISOString()).toBe('2024-06-01T12:00:00.000Z'); }); it('should handle complete bet data with all fields', () => { const completeData = { Id: '999999999999999999', Name: 'Complete Bet', Line: '1.5', BaseLine: '1.0', Status: bet_status_1.BetStatus.Open, StartPrice: '2.50', Price: '2.75', PriceVolume: '1000.00', Settlement: settlement_type_1.SettlementType.Winner, SuspensionReason: 5, LastUpdate: '2024-06-01T12:00:00Z', PriceIN: '2.75', PriceUS: '+175', PriceUK: '7/4', PriceMA: '1.75', PriceHK: '1.75', IsChanged: 1, Probability: 0.36, ParticipantId: 789, PlayerName: 'Test Player', }; const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, completeData, { excludeExtraneousValues: true }); expect(baseBet.id).toBe('999999999999999999'); expect(typeof baseBet.id).toBe('string'); expect(baseBet.name).toBe('Complete Bet'); expect(baseBet.line).toBe('1.5'); expect(baseBet.baseLine).toBe('1.0'); expect(baseBet.status).toBe(bet_status_1.BetStatus.Open); expect(baseBet.startPrice).toBe('2.50'); expect(baseBet.price).toBe('2.75'); expect(baseBet.priceVolume).toBe('1000.00'); expect(baseBet.settlement).toBe(settlement_type_1.SettlementType.Winner); expect(baseBet.suspensionReason).toBe(5); expect(baseBet.lastUpdate).toBeInstanceOf(Date); expect(baseBet.priceIN).toBe('2.75'); expect(baseBet.priceUS).toBe('+175'); expect(baseBet.priceUK).toBe('7/4'); expect(baseBet.priceMA).toBe('1.75'); expect(baseBet.priceHK).toBe('1.75'); expect(baseBet.isChanged).toBe(1); expect(baseBet.probability).toBe(0.36); expect(baseBet.participantId).toBe(789); expect(baseBet.playerName).toBe('Test Player'); }); it('should handle default values correctly', () => { const plain = { Id: '123' }; const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, plain, { excludeExtraneousValues: true }); expect(baseBet.id).toBe('123'); expect(typeof baseBet.id).toBe('string'); // isChanged has a default value in the class, but plainToInstance doesn't set it unless provided // This is expected behavior - default values are only applied when constructing new instances expect(baseBet.isChanged).toBeUndefined(); }); it('should maintain consistency across serialization/deserialization cycles', () => { const originalData = { Id: '11060329315062111', Name: 'Test Bet', Status: bet_status_1.BetStatus.Open, Price: '1.95', LastUpdate: '2024-06-01T12:00:00Z', }; // Deserialize const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, originalData, { excludeExtraneousValues: true }); // Serialize back to JSON const serialized = JSON.stringify(baseBet); const reserialized = JSON.parse(serialized); // Verify round-trip consistency expect(reserialized.id).toBe('11060329315062111'); expect(typeof reserialized.id).toBe('string'); expect(reserialized.name).toBe('Test Bet'); expect(reserialized.price).toBe('1.95'); }); it('should work correctly with arrays of BaseBet entities', () => { const arrayData = [ { Id: '1', Name: 'Bet 1' }, { Id: '11060329315062111', Name: 'Bet 2' }, { Id: '123', Name: 'Bet 3' }, ]; const baseBets = arrayData.map((data) => (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, data, { excludeExtraneousValues: true })); expect(baseBets).toHaveLength(3); expect(baseBets[0].id).toBe('1'); expect(baseBets[1].id).toBe('11060329315062111'); expect(baseBets[2].id).toBe('123'); // Verify all IDs are strings baseBets.forEach((bet) => { expect(typeof bet.id).toBe('string'); }); }); it('should handle various input types for ID field', () => { const testCases = [ { input: '1', expected: '1' }, { input: 2, expected: '2' }, { input: 9007199254740991, expected: '9007199254740991' }, { input: '9007199254740992', expected: '9007199254740992' }, ]; testCases.forEach(({ input, expected }) => { const plain = { Id: input }; const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, plain, { excludeExtraneousValues: true }); expect(baseBet.id).toBe(expected); expect(typeof baseBet.id).toBe('string'); }); }); it('should handle PlayerId field correctly', () => { const plain = { Id: '123', PlayerId: 456, }; const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, plain, { excludeExtraneousValues: true }); expect(baseBet.playerId).toBe(456); expect(typeof baseBet.playerId).toBe('number'); }); it('should handle Order field correctly', () => { const plain = { Id: '123', Order: 3, }; const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, plain, { excludeExtraneousValues: true }); expect(baseBet.order).toBe(3); expect(typeof baseBet.order).toBe('number'); }); it('should handle all player-related fields together', () => { const plain = { Id: '123', PlayerId: 789, PlayerName: 'John Doe', ParticipantId: 101, }; const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, plain, { excludeExtraneousValues: true }); expect(baseBet.playerId).toBe(789); expect(baseBet.playerName).toBe('John Doe'); expect(baseBet.participantId).toBe(101); }); it('should handle BaseLine field correctly', () => { const plain = { Id: '123', BaseLine: '2.0', }; const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, plain, { excludeExtraneousValues: true }); expect(baseBet.baseLine).toBe('2.0'); }); it('should handle all price format fields', () => { const plain = { Id: '123', PriceIN: '1.85', PriceUS: '+185', PriceUK: '17/20', PriceMA: '1.85', PriceHK: '0.85', }; const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, plain, { excludeExtraneousValues: true }); expect(baseBet.priceIN).toBe('1.85'); expect(baseBet.priceUS).toBe('+185'); expect(baseBet.priceUK).toBe('17/20'); expect(baseBet.priceMA).toBe('1.85'); expect(baseBet.priceHK).toBe('0.85'); }); it('should handle SuspensionReason field correctly', () => { const plain = { Id: '123', SuspensionReason: 10, }; const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, plain, { excludeExtraneousValues: true }); expect(baseBet.suspensionReason).toBe(10); expect(typeof baseBet.suspensionReason).toBe('number'); }); it('should handle StartPrice and PriceVolume fields', () => { const plain = { Id: '123', StartPrice: '2.00', PriceVolume: '5000.00', }; const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, plain, { excludeExtraneousValues: true }); expect(baseBet.startPrice).toBe('2.00'); expect(baseBet.priceVolume).toBe('5000.00'); }); it('should work with camelCase JSON keys (for Snapshot API compatibility)', () => { // This test verifies that if normalization converts camelCase to PascalCase, // the entity will correctly deserialize the data const plainWithCamelCase = { id: '123', // camelCase - would be normalized to PascalCase before transformation name: 'Test Bet', line: '1.5', playerId: 456, playerName: 'Test Player', order: 1, }; // Simulate normalized data (what would happen after key normalization) const normalizedPlain = { Id: '123', Name: 'Test Bet', Line: '1.5', PlayerId: 456, PlayerName: 'Test Player', Order: 1, }; const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, normalizedPlain, { excludeExtraneousValues: true }); expect(baseBet.id).toBe('123'); expect(baseBet.name).toBe('Test Bet'); expect(baseBet.line).toBe('1.5'); expect(baseBet.playerId).toBe(456); expect(baseBet.playerName).toBe('Test Player'); expect(baseBet.order).toBe(1); }); it('should work with PascalCase JSON keys (for RMQ compatibility)', () => { // This test verifies that PascalCase keys work correctly (RMQ format) const plainWithPascalCase = { Id: '123', Name: 'Test Bet', Line: '1.5', PlayerId: 456, PlayerName: 'Test Player', Order: 1, }; const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, plainWithPascalCase, { excludeExtraneousValues: true }); expect(baseBet.id).toBe('123'); expect(baseBet.name).toBe('Test Bet'); expect(baseBet.line).toBe('1.5'); expect(baseBet.playerId).toBe(456); expect(baseBet.playerName).toBe('Test Player'); expect(baseBet.order).toBe(1); }); it('should handle IsChanged field with default value', () => { const plain = { Id: '123', IsChanged: 1, }; const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, plain, { excludeExtraneousValues: true }); expect(baseBet.isChanged).toBe(1); }); it('should handle missing optional fields gracefully', () => { const plain = { Id: '123', // All other fields are optional and should be undefined }; const baseBet = (0, class_transformer_1.plainToInstance)(base_bet_1.BaseBet, plain, { excludeExtraneousValues: true }); expect(baseBet.id).toBe('123'); expect(baseBet.playerId).toBeUndefined(); expect(baseBet.playerName).toBeUndefined(); expect(baseBet.order).toBeUndefined(); expect(baseBet.baseLine).toBeUndefined(); expect(baseBet.suspensionReason).toBeUndefined(); }); }); //# sourceMappingURL=base-bet.spec.js.map