'use strict'; /** * Integration tests – vehicle controller (controllers/vehicle.js) */ const { connectDB, disconnectDB, clearCollection } = require('./jest.setup'); const { mockApplicator, mockVehicle, mockReq, mockRes, newId } = require('./mock_data'); let Vehicle, Customer; beforeAll(async () => { await connectDB(); Customer = require('../../model/customer'); Vehicle = require('../../model/vehicle'); }); afterAll(async () => { await disconnectDB(); }); const vehicleCtl = require('../../controllers/vehicle'); describe('vehicle controller – data methods', () => { let applicator; beforeAll(async () => { await clearCollection(Vehicle); applicator = await Customer.create(mockApplicator()); }); afterAll(async () => { await clearCollection(Vehicle); await Customer.deleteMany({ _id: applicator._id }); }); const makeReq = (extra = {}) => mockReq({ uid: applicator._id, puid: applicator._id, ut: '1', ...extra }); // ------------------------------------------------------------------------- describe('create_post', () => { it('creates a vehicle and returns it', async () => { const req = makeReq({ body: mockVehicle(applicator._id) }); const res = mockRes(); await vehicleCtl.createVehicle_post(req, res); expect(res.json).toHaveBeenCalled(); expect(res._data._id).toBeDefined(); expect(res._data.name).toMatch(/Aircraft-/); }); it('throws when body is missing', async () => { const req = makeReq({ body: null }); const res = mockRes(); await expect(vehicleCtl.createVehicle_post(req, res)).rejects.toThrow(); }); }); // ------------------------------------------------------------------------- describe('getById_get', () => { let vehicleId; beforeAll(async () => { const doc = await Vehicle.create(mockVehicle(applicator._id)); vehicleId = String(doc._id); }); it('returns vehicle by id', async () => { const req = makeReq({ params: { id: vehicleId } }); const res = mockRes(); await vehicleCtl.getVehicle_get(req, res); expect(res.json).toHaveBeenCalled(); expect(String(res._data._id)).toBe(vehicleId); }); }); // ------------------------------------------------------------------------- describe('search_post', () => { it('returns matching vehicles', async () => { const req = makeReq({ body: { byUserId: applicator._id } }); const res = mockRes(); await vehicleCtl.search_post(req, res); expect(res.json).toHaveBeenCalled(); expect(Array.isArray(res._data)).toBe(true); }); }); // ------------------------------------------------------------------------- describe('bulkUpdate_post', () => { let vehicleIds; beforeAll(async () => { const docs = await Vehicle.create([ mockVehicle(applicator._id), mockVehicle(applicator._id), ]); vehicleIds = docs.map(d => String(d._id)); }); it('bulk-updates multiple vehicles', async () => { const req = makeReq({ body: vehicleIds.map(id => ({ _id: id, active: false })), }); const res = mockRes(); await vehicleCtl.updateVehicles_post(req, res); expect(res.json).toHaveBeenCalled(); }); }); // ------------------------------------------------------------------------- describe('delete_delete', () => { let vehicleId; beforeAll(async () => { const doc = await Vehicle.create(mockVehicle(applicator._id)); vehicleId = String(doc._id); }); it.skip('soft-deletes a vehicle (skipped: requires MongoDB replica-set for transactions)', async () => { const req = makeReq({ params: { id: vehicleId } }); const res = mockRes(); await vehicleCtl.deleteVehicle(req, res); expect(res.json).toHaveBeenCalled(); const found = await Vehicle.findById(vehicleId); expect(!found || found.markedDelete).toBeTruthy(); }); }); });