75 lines
2.5 KiB
JavaScript
75 lines
2.5 KiB
JavaScript
const request = require('supertest');
|
|
const { app, calculateDestination } = require('../app/server');
|
|
|
|
// Mock pg Pool
|
|
jest.mock('pg', () => {
|
|
const mPool = {
|
|
query: jest.fn(),
|
|
on: jest.fn(),
|
|
end: jest.fn(),
|
|
};
|
|
return { Pool: jest.fn(() => mPool) };
|
|
});
|
|
|
|
const { Pool } = require('pg');
|
|
const pool = new Pool();
|
|
|
|
describe('Line of Sight Backend', () => {
|
|
beforeEach(() => {
|
|
jest.clearAllMocks();
|
|
});
|
|
|
|
describe('calculateDestination', () => {
|
|
test('should calculate correct destination for North (0 degrees)', () => {
|
|
const start = { lat: 0, lon: 0 };
|
|
const dest = calculateDestination(start.lat, start.lon, 0, 111.12); // ~1 degree North
|
|
expect(dest.lat).toBeCloseTo(1, 1);
|
|
expect(dest.lon).toBeCloseTo(0, 1);
|
|
});
|
|
|
|
test('should calculate correct destination for East (90 degrees)', () => {
|
|
const start = { lat: 0, lon: 0 };
|
|
const dest = calculateDestination(start.lat, start.lon, 90, 111.12); // ~1 degree East at equator
|
|
expect(dest.lat).toBeCloseTo(0, 1);
|
|
expect(dest.lon).toBeCloseTo(1, 1);
|
|
});
|
|
});
|
|
|
|
describe('GET /api/health', () => {
|
|
test('should return 200 OK', async () => {
|
|
const response = await request(app).get('/api/health');
|
|
expect(response.status).toBe(200);
|
|
expect(response.body.status).toBe('ok');
|
|
});
|
|
});
|
|
|
|
describe('GET /api/line-of-sight', () => {
|
|
test('should return valid response structure', async () => {
|
|
// Mock the water checks and the main city query
|
|
pool.query
|
|
.mockResolvedValueOnce({ rows: [{ has_land: true }] }) // Simplified for tests, it actually calls many times
|
|
.mockResolvedValue({ rows: [{ id: 1, name: 'London', population: 9000000, country: 'GB', lat: 51.5, lon: -0.1, distance_off_line_km: 0, distance_from_start_km: 0, pos_on_line: 0 }] });
|
|
|
|
const response = await request(app)
|
|
.get('/api/line-of-sight')
|
|
.query({ lat: 51.5, lon: -0.1, direction: 45, tolerance: 50 });
|
|
|
|
expect(response.status).toBe(200);
|
|
expect(response.body.success).toBe(true);
|
|
expect(response.body.data.conurbations).toBeDefined();
|
|
expect(response.body.data.line_coordinates).toBeDefined();
|
|
});
|
|
|
|
test('should handle database errors', async () => {
|
|
pool.query.mockRejectedValue(new Error('DB Error'));
|
|
|
|
const response = await request(app)
|
|
.get('/api/line-of-sight')
|
|
.query({ lat: 51.5, lon: -0.1, direction: 45, tolerance: 50 });
|
|
|
|
expect(response.status).toBe(500);
|
|
expect(response.body.success).toBe(false);
|
|
});
|
|
});
|
|
});
|