// tests/unit/middleware/tenant.test.js const { resolveTenant, enforceTenantIsolation } = require('../../../middleware/tenant'); describe('Tenant Middleware', () => { describe('resolveTenant', () => { test('should resolve tenant from subdomain', () => { const mockReq = { headers: { host: 'tenant1.merchants-of-hope.org' }, originalUrl: '/api/some-endpoint', url: '/api/some-endpoint' }; const mockRes = { status: jest.fn().mockReturnThis(), json: jest.fn() }; let nextCalled = false; const next = () => { nextCalled = true; }; resolveTenant(mockReq, mockRes, next); // In test environment, it falls back to default tenant for non-existent tenants expect(mockReq.tenantId).toBe('default'); expect(mockReq.tenant).toBeDefined(); expect(nextCalled).toBe(true); }); test('should resolve tenant from header', () => { const mockReq = { headers: { host: 'localhost:19000', 'x-tenant-id': 'tenant2' }, originalUrl: '/api/some-endpoint', url: '/api/some-endpoint' }; const mockRes = { status: jest.fn().mockReturnThis(), json: jest.fn() }; let nextCalled = false; const next = () => { nextCalled = true; }; resolveTenant(mockReq, mockRes, next); // In test environment, tenant2 is not in our tenant list, so falls back to default expect(mockReq.tenantId).toBe('default'); expect(nextCalled).toBe(true); }); test('should resolve tenant from URL path', () => { const mockReq = { headers: { host: 'localhost:19000' }, originalUrl: '/tenant/tenant3/api/some-endpoint', url: '/tenant/tenant3/api/some-endpoint' }; const mockRes = { status: jest.fn().mockReturnThis(), json: jest.fn() }; let nextCalled = false; const next = () => { nextCalled = true; }; resolveTenant(mockReq, mockRes, next); // In test environment, tenant3 is not in our tenant list, so falls back to default expect(mockReq.tenantId).toBe('default'); // Check that the URL was modified expect(mockReq.originalUrl).toBe('/api/some-endpoint'); expect(nextCalled).toBe(true); }); test('should default to default tenant if none found', () => { const mockReq = { headers: { host: 'localhost:19000' }, originalUrl: '/api/some-endpoint', url: '/api/some-endpoint' }; const mockRes = { status: jest.fn().mockReturnThis(), json: jest.fn() }; let nextCalled = false; const next = () => { nextCalled = true; }; resolveTenant(mockReq, mockRes, next); expect(mockReq.tenantId).toBe('default'); expect(nextCalled).toBe(true); }); }); describe('enforceTenantIsolation', () => { test('should call next to continue the request chain', () => { const mockReq = { tenantId: 'test-tenant' }; const mockRes = {}; let nextCalled = false; const next = () => { nextCalled = true; }; enforceTenantIsolation(mockReq, mockRes, next); expect(nextCalled).toBe(true); }); }); });