EcoTracker-II / backend /src /tests /integration /simulations.test.js
Akash-Dragon's picture
refactor: restructure project as a monorepo and implement backend API
7e49c4d
Raw
History Blame Contribute Delete
4.68 kB
import { describe, it, expect, beforeEach, afterAll } from 'vitest';
import request from 'supertest';
import app from '../../app.js';
import prisma from '../../utils/prismaClient.js';
import { resetDb } from '../setup.js';
let testUserId;
let testAssessmentId;
// Re-seed fixtures before EVERY test so each test gets a clean DB with data.
// This prevents test-order dependencies and cures the beforeEach reset bug.
beforeEach(async () => {
resetDb();
const userRes = await request(app)
.post('/api/users')
.send({ name: 'Sim Test User', email: `sim-test-${Date.now()}@example.com` });
testUserId = userRes.body.data.id;
const assessRes = await request(app).post('/api/assessments').send({
userId: testUserId,
dailyCarKm: 25,
carFuelType: 'petrol',
shortFlightsPerYear: 3,
longFlightsPerYear: 1,
monthlyElectricityKwh: 300,
renewablePercentage: 0,
dietType: 'mixed',
clothingItemsPerYear: 15,
electronicsItemsPerYear: 2,
});
testAssessmentId = assessRes.body.data.id;
});
afterAll(async () => {
await prisma.$disconnect();
});
describe('Simulations API Integration Tests', () => {
describe('POST /api/simulations', () => {
it('should run a simulation with valid data', async () => {
const res = await request(app)
.post('/api/simulations')
.send({
assessmentId: testAssessmentId,
scenarioName: 'Switch to Electric Vehicle',
scenarioParams: { carFuelType: 'electric' },
});
expect(res.status).toBe(201);
expect(res.body.success).toBe(true);
expect(res.body.data).toHaveProperty('id');
expect(res.body.data).toHaveProperty('originalEmission');
expect(res.body.data).toHaveProperty('projectedEmission');
expect(res.body.data).toHaveProperty('reductionPercentage');
expect(res.body.data).toHaveProperty('annualSavingsKg');
});
it('should show reduced emissions for EV switch', async () => {
const res = await request(app)
.post('/api/simulations')
.send({
assessmentId: testAssessmentId,
scenarioName: 'Switch to Electric Vehicle',
scenarioParams: { carFuelType: 'electric' },
});
expect(res.body.data.projectedEmission).toBeLessThan(res.body.data.originalEmission);
expect(res.body.data.reductionPercentage).toBeGreaterThan(0);
});
it('should show reduced emissions for vegetarian diet', async () => {
const res = await request(app)
.post('/api/simulations')
.send({
assessmentId: testAssessmentId,
scenarioName: 'Switch to Vegetarian Diet',
scenarioParams: { dietType: 'vegetarian' },
});
expect(res.body.data.projectedEmission).toBeLessThan(res.body.data.originalEmission);
});
it('should show reduced emissions for flight reduction', async () => {
const res = await request(app)
.post('/api/simulations')
.send({
assessmentId: testAssessmentId,
scenarioName: 'Reduce Flights by 50%',
scenarioParams: { flightReductionFactor: 0.5 },
});
expect(res.body.data.annualSavingsKg).toBeGreaterThan(0);
});
it('should return 400 for missing assessmentId', async () => {
const res = await request(app)
.post('/api/simulations')
.send({
scenarioName: 'Test',
scenarioParams: { carFuelType: 'electric' },
});
expect(res.status).toBe(400);
});
it('should return 404 for non-existent assessment', async () => {
const res = await request(app).post('/api/simulations').send({
assessmentId: 'nonexistent-id',
scenarioName: 'Test',
scenarioParams: {},
});
expect(res.status).toBe(404);
});
});
describe('GET /api/simulations/:id', () => {
it('should retrieve a simulation by id', async () => {
// Create a simulation first, then retrieve it
const createRes = await request(app)
.post('/api/simulations')
.send({
assessmentId: testAssessmentId,
scenarioName: 'Solar Panels',
scenarioParams: { renewablePercentage: 80 },
});
const simulationId = createRes.body.data.id;
const res = await request(app).get(`/api/simulations/${simulationId}`);
expect(res.status).toBe(200);
expect(res.body.success).toBe(true);
expect(res.body.data.id).toBe(simulationId);
});
it('should return 404 for non-existent simulation', async () => {
const res = await request(app).get('/api/simulations/nonexistent-id');
expect(res.status).toBe(404);
});
});
});