'use strict'; /** * Shared mock data factories for integration tests. * All ids are fresh ObjectIds so tests are fully isolated. */ const mongoose = require('mongoose'); const newId = () => new mongoose.Types.ObjectId(); // --------------------------------------------------------------------------- // Applicator / Customer (kind = "1") // --------------------------------------------------------------------------- function mockApplicator(overrides = {}) { return { _id: newId(), kind: '1', username: `applicator_${Date.now()}@test.com`, password: '$2a$10$hashedpassword', name: 'Test Applicator Co.', email: `applicator_${Date.now()}@test.com`, phone: '+15550001000', address: '123 Main St', country: 'US', active: true, billable: true, premium: 0, selfSignup: false, markedDelete: false, ...overrides, }; } // --------------------------------------------------------------------------- // Client (kind = "3") // --------------------------------------------------------------------------- function mockClient(parentId, overrides = {}) { return { _id: newId(), kind: '3', username: `client_${Date.now()}@test.com`, name: 'Test Client', email: `client_${Date.now()}@test.com`, phone: '+15550002000', address: '456 Oak Ave', country: 'US', active: true, parent: parentId, markedDelete: false, ...overrides, }; } // --------------------------------------------------------------------------- // Pilot (kind = "5") // --------------------------------------------------------------------------- function mockPilot(parentId, overrides = {}) { return { _id: newId(), kind: '5', username: `pilot_${Date.now()}@test.com`, name: 'Test Pilot', email: `pilot_${Date.now()}@test.com`, active: true, parent: parentId, markedDelete: false, ...overrides, }; } // --------------------------------------------------------------------------- // Vehicle / Device (kind = "9") // --------------------------------------------------------------------------- function mockVehicle(parentId, overrides = {}) { return { _id: newId(), kind: '9', name: `Aircraft-${Date.now()}`, model: 'AgNav TestBird', color: 'yellow', vehicleType: 0, active: true, tracking: false, pkgActive: false, parent: parentId, markedDelete: false, ...overrides, }; } // --------------------------------------------------------------------------- // Product // --------------------------------------------------------------------------- function mockProduct(puid, overrides = {}) { return { name: `Product-${Date.now()}`, type: 1, // ACTIVE restricted: false, epaReg: `EPA-${Date.now()}`, desc: 'Integration test product', rate: { value: 2.5, unit: 1 }, // GAL byPuid: puid, ...overrides, }; } // --------------------------------------------------------------------------- // Crop // --------------------------------------------------------------------------- function mockCrop(puid, overrides = {}) { return { name: `Crop-${Date.now()}`, color: '#00AA00', desc: 'Integration test crop', byPuid: puid, ...overrides, }; } // --------------------------------------------------------------------------- // Job // --------------------------------------------------------------------------- function mockJob(puid, overrides = {}) { return { name: `Job-${Date.now()}`, orderNumber: `ORD-${Date.now()}`, measureUnit: false, // false = acres swathWidth: 60, byPuid: puid, status: 0, // PENDING markedDelete: false, ...overrides, }; } // --------------------------------------------------------------------------- // Costing Item // --------------------------------------------------------------------------- function mockCostingItem(puid, userId, overrides = {}) { return { name: `CostItem-${Date.now()}`, type: 0, unit: 1, // GAL price: 10.5, byPuid: puid, createdBy: userId, updatedBy: userId, ...overrides, }; } // --------------------------------------------------------------------------- // Invoice Setting // --------------------------------------------------------------------------- function mockInvoiceSetting(puid, userId, overrides = {}) { return { byPuid: puid, userId, companyName: 'Test Applicator Co.', address: '123 Main St, Testville, TX', taxValue: 0, discount: 0, termOpts: [15, 30, 60], paymentTerm: 30, currency: 'USD', note: 'Integration test invoice setting', logo: '', createdBy: userId, updatedBy: userId, ...overrides, }; } // --------------------------------------------------------------------------- // Request / response mocks used for controller unit-style tests // --------------------------------------------------------------------------- /** * Build a minimal Express-like req object for an authenticated applicator. */ function mockReq({ uid, puid, ut = '1', body = {}, params = {}, query = {}, userInfo = null } = {}) { const _uid = uid ? String(uid) : String(new mongoose.Types.ObjectId()); const _puid = puid ? String(puid) : _uid; return { uid: _uid, ut, userInfo: userInfo || { puid: _puid, kind: ut, premium: 0, membership: null, markedDelete: false }, body, params, query, headers: {}, file: undefined, }; } /** * Build a minimal Express-like res object with jest spy functions. */ function mockRes() { const res = { statusCode: 200, _data: undefined, }; res.json = jest.fn((data) => { res._data = data; return res; }); res.send = jest.fn((data) => { res._data = data; return res; }); res.status = jest.fn((code) => { res.statusCode = code; return res; }); res.end = jest.fn(() => res); return res; } module.exports = { newId, mockApplicator, mockClient, mockPilot, mockVehicle, mockProduct, mockCrop, mockJob, mockCostingItem, mockInvoiceSetting, mockReq, mockRes, };