server.test.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. const request = require('supertest');
  2. const { expect } = require('chai');
  3. const server = require('../src/server');
  4. describe('Financial Data Server', () => {
  5. let app;
  6. before(async () => {
  7. // Get the Express app instance from the server
  8. app = server.app;
  9. });
  10. describe('Health Check', () => {
  11. it('should return server health status', (done) => {
  12. request(app)
  13. .get('/health')
  14. .expect(200)
  15. .end((err, res) => {
  16. if (err) return done(err);
  17. expect(res.body).to.have.property('status', 'OK');
  18. expect(res.body).to.have.property('timestamp');
  19. expect(res.body).to.have.property('uptime');
  20. done();
  21. });
  22. });
  23. });
  24. describe('Price API', () => {
  25. it('should return current price for valid symbol', (done) => {
  26. request(app)
  27. .get('/api/prices/current/EURUSD')
  28. .expect(200)
  29. .end((err, res) => {
  30. if (err) return done(err);
  31. expect(res.body).to.have.property('status', 'success');
  32. expect(res.body).to.have.property('data');
  33. expect(res.body.data).to.have.property('symbol', 'EURUSD');
  34. expect(res.body.data).to.have.property('price');
  35. expect(res.body.data).to.have.property('change');
  36. expect(res.body.data).to.have.property('changePercent');
  37. done();
  38. });
  39. });
  40. it('should return 404 for invalid symbol', (done) => {
  41. request(app)
  42. .get('/api/prices/current/INVALID')
  43. .expect(404)
  44. .end((err, res) => {
  45. if (err) return done(err);
  46. expect(res.body).to.have.property('status', 'error');
  47. expect(res.body).to.have.property('message');
  48. done();
  49. });
  50. });
  51. it('should return historical data for valid symbol', (done) => {
  52. request(app)
  53. .get('/api/prices/historical/EURUSD?timeframe=H1&limit=10')
  54. .expect(200)
  55. .end((err, res) => {
  56. if (err) return done(err);
  57. expect(res.body).to.have.property('status', 'success');
  58. expect(res.body).to.have.property('data');
  59. expect(res.body.data).to.be.an('array');
  60. expect(res.body).to.have.property('symbol', 'EURUSD');
  61. expect(res.body).to.have.property('timeframe', 'H1');
  62. done();
  63. });
  64. });
  65. });
  66. describe('Symbol API', () => {
  67. it('should return list of symbols', (done) => {
  68. request(app)
  69. .get('/api/symbols')
  70. .expect(200)
  71. .end((err, res) => {
  72. if (err) return done(err);
  73. expect(res.body).to.have.property('status', 'success');
  74. expect(res.body).to.have.property('data');
  75. expect(res.body.data).to.be.an('array');
  76. expect(res.body).to.have.property('pagination');
  77. done();
  78. });
  79. });
  80. it('should return specific symbol details', (done) => {
  81. request(app)
  82. .get('/api/symbols/EURUSD')
  83. .expect(200)
  84. .end((err, res) => {
  85. if (err) return done(err);
  86. expect(res.body).to.have.property('status', 'success');
  87. expect(res.body).to.have.property('data');
  88. expect(res.body.data).to.have.property('symbol', 'EURUSD');
  89. expect(res.body.data).to.have.property('name');
  90. expect(res.body.data).to.have.property('category');
  91. expect(res.body.data).to.have.property('exchange');
  92. done();
  93. });
  94. });
  95. it('should return 404 for non-existent symbol', (done) => {
  96. request(app)
  97. .get('/api/symbols/NONEXISTENT')
  98. .expect(404)
  99. .end((err, res) => {
  100. if (err) return done(err);
  101. expect(res.body).to.have.property('status', 'error');
  102. expect(res.body).to.have.property('message');
  103. done();
  104. });
  105. });
  106. it('should return symbol categories', (done) => {
  107. request(app)
  108. .get('/api/symbols/categories/list')
  109. .expect(200)
  110. .end((err, res) => {
  111. if (err) return done(err);
  112. expect(res.body).to.have.property('status', 'success');
  113. expect(res.body).to.have.property('data');
  114. expect(res.body.data).to.be.an('array');
  115. done();
  116. });
  117. });
  118. });
  119. describe('Error Handling', () => {
  120. it('should handle 404 for unknown routes', (done) => {
  121. request(app)
  122. .get('/api/unknown-route')
  123. .expect(404)
  124. .end((err, res) => {
  125. if (err) return done(err);
  126. expect(res.body).to.have.property('status', 'error');
  127. expect(res.body).to.have.property('message');
  128. done();
  129. });
  130. });
  131. it('should handle malformed JSON', (done) => {
  132. request(app)
  133. .post('/api/prices/subscribe')
  134. .set('Content-Type', 'application/json')
  135. .send('{ malformed json }')
  136. .expect(400)
  137. .end((err, res) => {
  138. if (err) return done(err);
  139. expect(res.body).to.have.property('status', 'error');
  140. done();
  141. });
  142. });
  143. });
  144. });