Market Data Service is a high-performance financial data API that provides comprehensive Symbol prices of different markets through both RESTful endpoints and real-time WebSocket connections.

candleController.test.js 2.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. const request = require('supertest');
  2. const app = require('../src/app');
  3. const { Candle1h, Symbol, sequelize } = require('../src/models');
  4. describe('Candle Controller Integration Tests', () => {
  5. let testSymbol;
  6. beforeAll(async () => {
  7. // Sync database and cleanup
  8. await sequelize.sync({ force: true });
  9. // Create fresh test symbol
  10. testSymbol = await Symbol.create({
  11. symbol: 'TEST_SYMBOL',
  12. exchange: 'TEST',
  13. instrumentType: 'forex'
  14. });
  15. });
  16. afterAll(async () => {
  17. // Cleanup test data
  18. await Candle1h.destroy({ where: {} });
  19. await Symbol.destroy({ where: {} });
  20. await sequelize.close();
  21. });
  22. describe('POST /api/candles/bulk', () => {
  23. it('should create multiple candles from MT5 payload', async () => {
  24. const mockCandles = [
  25. {
  26. symbolId: testSymbol.id,
  27. openTime: '2025-10-17 00:00:00',
  28. closeTime: '2025-10-17 01:00:00',
  29. open: 1.1000,
  30. high: 1.1050,
  31. low: 1.0990,
  32. close: 1.1025,
  33. volume: 1000
  34. },
  35. {
  36. symbolId: testSymbol.id,
  37. openTime: '2025-10-17 01:00:00',
  38. closeTime: '2025-10-17 02:00:00',
  39. open: 1.1025,
  40. high: 1.1075,
  41. low: 1.1005,
  42. close: 1.1060,
  43. volume: 1200
  44. }
  45. ];
  46. const response = await request(app)
  47. .post('/api/candles/bulk')
  48. .send({ candles: mockCandles })
  49. .expect(201);
  50. expect(response.body.success).toBe(true);
  51. expect(response.body.message).toBe('2 candles created successfully');
  52. expect(response.body.data.length).toBe(2);
  53. // Verify database persistence
  54. const dbCandles = await Candle1h.findAll({
  55. where: { symbolId: testSymbol.id },
  56. order: [['openTime', 'ASC']]
  57. });
  58. expect(dbCandles.length).toBe(2);
  59. expect(Number(dbCandles[0].open)).toBeCloseTo(1.1000);
  60. expect(Number(dbCandles[1].close)).toBeCloseTo(1.1060);
  61. });
  62. it('should reject invalid payload format', async () => {
  63. const response = await request(app)
  64. .post('/api/candles/bulk')
  65. .send({ invalid: 'payload' })
  66. .expect(400);
  67. expect(response.body.success).toBe(false);
  68. expect(response.body.message).toContain('Validation error');
  69. });
  70. it('should handle invalid symbol IDs', async () => {
  71. const invalidCandles = [{
  72. symbolId: 999,
  73. openTime: '2025-10-17 00:00:00',
  74. closeTime: '2025-10-17 01:00:00',
  75. open: 1.1000,
  76. high: 1.1050,
  77. low: 1.0990,
  78. close: 1.1025,
  79. volume: 1000
  80. }];
  81. const response = await request(app)
  82. .post('/api/candles/bulk')
  83. .send({ candles: invalidCandles })
  84. .expect(400);
  85. expect(response.body.success).toBe(false);
  86. expect(response.body.message).toContain('Invalid symbol IDs');
  87. });
  88. });
  89. });