const request = require('supertest'); const { expect } = require('chai'); const server = require('../src/server'); describe('Financial Data Server', () => { let app; before(async () => { // Get the Express app instance from the server app = server.app; }); describe('Health Check', () => { it('should return server health status', (done) => { request(app) .get('/health') .expect(200) .end((err, res) => { if (err) return done(err); expect(res.body).to.have.property('status', 'OK'); expect(res.body).to.have.property('timestamp'); expect(res.body).to.have.property('uptime'); done(); }); }); }); describe('Price API', () => { it('should return current price for valid symbol', (done) => { request(app) .get('/api/prices/current/EURUSD') .expect(200) .end((err, res) => { if (err) return done(err); expect(res.body).to.have.property('status', 'success'); expect(res.body).to.have.property('data'); expect(res.body.data).to.have.property('symbol', 'EURUSD'); expect(res.body.data).to.have.property('price'); expect(res.body.data).to.have.property('change'); expect(res.body.data).to.have.property('changePercent'); done(); }); }); it('should return 404 for invalid symbol', (done) => { request(app) .get('/api/prices/current/INVALID') .expect(404) .end((err, res) => { if (err) return done(err); expect(res.body).to.have.property('status', 'error'); expect(res.body).to.have.property('message'); done(); }); }); it('should return historical data for valid symbol', (done) => { request(app) .get('/api/prices/historical/EURUSD?timeframe=H1&limit=10') .expect(200) .end((err, res) => { if (err) return done(err); expect(res.body).to.have.property('status', 'success'); expect(res.body).to.have.property('data'); expect(res.body.data).to.be.an('array'); expect(res.body).to.have.property('symbol', 'EURUSD'); expect(res.body).to.have.property('timeframe', 'H1'); done(); }); }); }); describe('Symbol API', () => { it('should return list of symbols', (done) => { request(app) .get('/api/symbols') .expect(200) .end((err, res) => { if (err) return done(err); expect(res.body).to.have.property('status', 'success'); expect(res.body).to.have.property('data'); expect(res.body.data).to.be.an('array'); expect(res.body).to.have.property('pagination'); done(); }); }); it('should return specific symbol details', (done) => { request(app) .get('/api/symbols/EURUSD') .expect(200) .end((err, res) => { if (err) return done(err); expect(res.body).to.have.property('status', 'success'); expect(res.body).to.have.property('data'); expect(res.body.data).to.have.property('symbol', 'EURUSD'); expect(res.body.data).to.have.property('name'); expect(res.body.data).to.have.property('category'); expect(res.body.data).to.have.property('exchange'); done(); }); }); it('should return 404 for non-existent symbol', (done) => { request(app) .get('/api/symbols/NONEXISTENT') .expect(404) .end((err, res) => { if (err) return done(err); expect(res.body).to.have.property('status', 'error'); expect(res.body).to.have.property('message'); done(); }); }); it('should return symbol categories', (done) => { request(app) .get('/api/symbols/categories/list') .expect(200) .end((err, res) => { if (err) return done(err); expect(res.body).to.have.property('status', 'success'); expect(res.body).to.have.property('data'); expect(res.body.data).to.be.an('array'); done(); }); }); }); describe('Error Handling', () => { it('should handle 404 for unknown routes', (done) => { request(app) .get('/api/unknown-route') .expect(404) .end((err, res) => { if (err) return done(err); expect(res.body).to.have.property('status', 'error'); expect(res.body).to.have.property('message'); done(); }); }); it('should handle malformed JSON', (done) => { request(app) .post('/api/prices/subscribe') .set('Content-Type', 'application/json') .send('{ malformed json }') .expect(400) .end((err, res) => { if (err) return done(err); expect(res.body).to.have.property('status', 'error'); done(); }); }); }); });