'use strict'; /** * Integration tests – partner controller (controllers/partner.js) * * Covers: createPartner_post, getPartners_get, getPartners_post, * getPartnerById_get, updatePartner_put, deletePartner * * Skipped: syncData_post, uploadJob_post, testPartnerAuth_post * (require external partner service / RabbitMQ). */ const { connectDB, disconnectDB, clearCollection } = require('./jest.setup'); const { mockApplicator, mockReq, mockRes, newId } = require('./mock_data'); let Partner, Customer; beforeAll(async () => { await connectDB(); Customer = require('../../model/customer'); // Ensure partner discriminator is registered const partnerModel = require('../../model/partner'); Partner = partnerModel.Partner || partnerModel; }); afterAll(async () => { await disconnectDB(); }); const partnerCtl = require('../../controllers/partner'); describe('partner controller – data methods', () => { let admin; function makePartnerBody() { return { name: `Partner-${Date.now()}`, username: `partner_${Date.now()}@test.com`, password: 'Test@123', active: true, kind: '20', partnerCode: `TESTCODE-${Date.now()}`, }; } beforeAll(async () => { await clearCollection(Partner); admin = await Customer.create(mockApplicator()); }); afterAll(async () => { await clearCollection(Partner); await Customer.deleteMany({ _id: admin._id }); }); const makeReq = (extra = {}) => mockReq({ uid: admin._id, puid: admin._id, ut: '1', ...extra }); // ------------------------------------------------------------------------- describe('createPartner_post', () => { it('creates a partner and returns it', async () => { const req = makeReq({ body: makePartnerBody() }); const res = mockRes(); await partnerCtl.createPartner_post(req, res); expect(res.json).toHaveBeenCalled(); expect(res._data._id).toBeDefined(); expect(res._data.kind).toBe('20'); }); it('throws when body is missing', async () => { const req = makeReq({ body: null }); const res = mockRes(); await expect(partnerCtl.createPartner_post(req, res)).rejects.toThrow(); }); }); // ------------------------------------------------------------------------- describe('getPartners_get', () => { it('returns array of partners', async () => { const req = makeReq({ query: {} }); const res = mockRes(); await partnerCtl.getPartners_get(req, res); expect(res.json).toHaveBeenCalled(); expect(Array.isArray(res._data)).toBe(true); }); }); // ------------------------------------------------------------------------- describe('getPartners_post', () => { it('returns partners matching search criteria', async () => { const req = makeReq({ body: { name: 'Partner' } }); const res = mockRes(); await partnerCtl.getPartners_post(req, res); expect(res.json).toHaveBeenCalled(); expect(Array.isArray(res._data)).toBe(true); }); }); // ------------------------------------------------------------------------- describe('getPartnerById_get', () => { let partnerId; beforeAll(async () => { const req = makeReq({ body: makePartnerBody() }); const res = mockRes(); await partnerCtl.createPartner_post(req, res); partnerId = String(res._data._id); }); it('returns partner by id', async () => { const req = makeReq({ params: { id: partnerId } }); const res = mockRes(); await partnerCtl.getPartnerById_get(req, res); expect(res.json).toHaveBeenCalled(); expect(String(res._data._id)).toBe(partnerId); }); it('throws when partner id is invalid', async () => { const req = makeReq({ params: { id: 'invalid-id' } }); const res = mockRes(); await expect(partnerCtl.getPartnerById_get(req, res)).rejects.toThrow(); }); }); // ------------------------------------------------------------------------- describe('updatePartner_put', () => { let partnerId; beforeAll(async () => { const req = makeReq({ body: makePartnerBody() }); const res = mockRes(); await partnerCtl.createPartner_post(req, res); partnerId = String(res._data._id); }); it('updates a partner field', async () => { const req = makeReq({ params: { id: partnerId }, body: { name: 'Updated Partner Name', kind: '20' }, }); const res = mockRes(); await partnerCtl.updatePartner_put(req, res); expect(res.json).toHaveBeenCalled(); expect(res._data.name).toBe('Updated Partner Name'); }); }); // ------------------------------------------------------------------------- describe('deletePartner', () => { let partnerId; beforeAll(async () => { const req = makeReq({ body: makePartnerBody() }); const res = mockRes(); await partnerCtl.createPartner_post(req, res); partnerId = String(res._data._id); }); it('soft-deletes a partner', async () => { const req = makeReq({ params: { id: partnerId } }); const res = mockRes(); await partnerCtl.deletePartner(req, res); expect(res.json).toHaveBeenCalled(); const found = await Partner.findById(partnerId); expect(!found || found.active === false).toBeTruthy(); }); }); });