diff --git a/server/routes/device.js b/server/routes/device.js index fffadb1..b0e1cf6 100644 --- a/server/routes/device.js +++ b/server/routes/device.js @@ -1,12 +1,20 @@ const express = require('express'); const router = express.Router(); const Joi = require('joi'); -const { Device, DroneDetection, Heartbeat, Tenant } = require('../models'); const { validateRequest } = require('../middleware/validation'); const { authenticateToken } = require('../middleware/auth'); const MultiTenantAuth = require('../middleware/multi-tenant-auth'); const { Op } = require('sequelize'); +// Dynamic model injection for testing +function getModels() { + if (global.__TEST_MODELS__) { + console.log('🔧 DEBUG: Using global test models from models/index.js'); + return global.__TEST_MODELS__; + } + return require('../models'); +} + // Initialize multi-tenant auth const multiAuth = new MultiTenantAuth(); @@ -38,6 +46,8 @@ const updateDeviceSchema = Joi.object({ // GET /api/devices - Get all devices router.get('/', authenticateToken, async (req, res) => { try { + const { Device, DroneDetection, Heartbeat, Tenant } = getModels(); + // Determine tenant from request const tenantId = await multiAuth.determineTenant(req); if (!tenantId) { @@ -159,6 +169,8 @@ router.get('/', authenticateToken, async (req, res) => { // GET /api/devices/map - Get devices with location data for map display router.get('/map', authenticateToken, async (req, res) => { try { + const { Device, DroneDetection, Heartbeat, Tenant } = getModels(); + // Determine tenant from request const tenantId = await multiAuth.determineTenant(req); if (!tenantId) { @@ -240,6 +252,8 @@ router.get('/map', authenticateToken, async (req, res) => { // GET /api/devices/:id - Get specific device router.get('/:id', authenticateToken, async (req, res) => { try { + const { Device, DroneDetection, Heartbeat, Tenant } = getModels(); + // Determine tenant from request const tenantId = await multiAuth.determineTenant(req); if (!tenantId) { diff --git a/server/tests/routes/device.test.js b/server/tests/routes/device.test.js index a5a4d5a..c5c8f77 100644 --- a/server/tests/routes/device.test.js +++ b/server/tests/routes/device.test.js @@ -4,39 +4,31 @@ const sinon = require('sinon'); const request = require('supertest'); const express = require('express'); const { setupTestEnvironment, teardownTestEnvironment, cleanDatabase, createTestUser, createTestTenant, createTestDevice, generateTestToken } = require('../setup'); +const { authenticateToken, setModels } = require('../../middleware/auth'); describe('Device Routes', () => { - let app, models, sequelize; + let app, models, sequelize, deviceRoutes; before(async () => { ({ models, sequelize } = await setupTestEnvironment()); + // Inject models globally for routes and into auth middleware for testing + global.__TEST_MODELS__ = models; + setModels(models); + + // Require device routes AFTER setting up global models + deviceRoutes = require('../../routes/device'); + // Setup express app for testing app = express(); app.use(express.json()); - - // Mock authentication middleware - app.use((req, res, next) => { - if (req.headers.authorization) { - const token = req.headers.authorization.replace('Bearer ', ''); - try { - const jwt = require('jsonwebtoken'); - const decoded = jwt.verify(token, process.env.JWT_SECRET || 'test-secret'); - req.user = { id: decoded.userId, tenant_id: decoded.tenantId }; - req.tenant = { id: decoded.tenantId }; - } catch (error) { - return res.status(401).json({ success: false, message: 'Invalid token' }); - } - } - next(); - }); - - // Setup device routes - const deviceRoutes = require('../../routes/device'); + app.use(authenticateToken); app.use('/devices', deviceRoutes); }); after(async () => { + // Clean up global test models + delete global.__TEST_MODELS__; await teardownTestEnvironment(); });