97 lines
3.2 KiB
JavaScript
97 lines
3.2 KiB
JavaScript
// 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);
|
|
});
|
|
});
|
|
}); |