sinka/api/src/tenancy/tenant-url.spec.ts
2026-09-16 04:57:09 +00:00

49 lines
1.8 KiB
TypeScript

import { BadRequestException } from '@nestjs/common';
import { adminDatabaseUrl, normalizeSlug, tenantDatabaseName, urlForDatabase } from './tenant-url';
describe('tenantDatabaseName', () => {
it('maps slug to a dedicated mysql database', () => {
expect(tenantDatabaseName('demo')).toBe('sinka_t_demo');
expect(tenantDatabaseName('filial-sul')).toBe('sinka_t_filial_sul');
});
});
describe('normalizeSlug', () => {
it('accepts a valid company code', () => {
expect(normalizeSlug(' Demo-01 ')).toBe('demo-01');
});
it('rejects reserved product paths', () => {
expect(() => normalizeSlug('admin')).toThrow(BadRequestException);
expect(() => normalizeSlug('login')).toThrow(BadRequestException);
expect(() => normalizeSlug('api')).toThrow(BadRequestException);
});
it('rejects codes that are too short or start with a digit', () => {
expect(() => normalizeSlug('a')).toThrow(BadRequestException);
expect(() => normalizeSlug('1demo')).toThrow(BadRequestException);
});
});
describe('database urls', () => {
const previous = {
DATABASE_URL: process.env.DATABASE_URL,
MYSQL_ADMIN_URL: process.env.MYSQL_ADMIN_URL,
};
afterEach(() => {
process.env.DATABASE_URL = previous.DATABASE_URL;
process.env.MYSQL_ADMIN_URL = previous.MYSQL_ADMIN_URL;
});
it('points the connection at the company database', () => {
process.env.DATABASE_URL = 'mysql://sinka:sinka@localhost:3306/sinka_platform';
expect(urlForDatabase('sinka_t_demo')).toBe('mysql://sinka:sinka@localhost:3306/sinka_t_demo');
});
it('keeps an admin url that already has a database', () => {
process.env.MYSQL_ADMIN_URL = 'mysql://root:root@localhost:3306';
expect(adminDatabaseUrl()).toBe('mysql://root:root@localhost:3306/mysql');
});
});