0d7d8a597e
- TenantService.create ruft nach prisma.tenant.create ensureDefaultGroup auf; Fehler werden protokolliert, nicht propagiert (Muster aus UserService.create) - tenant.module.ts importiert GroupsModule (keine Zirkularitaet, wie UserModule bereits vormacht) - AdminSeedService.onApplicationBootstrap besteht jetzt aus zwei sequenziellen await-Schritten: seedAdmin() (bisheriger Rumpf, plus ensureDefaultGroup nach dem Tenant-Upsert und VOR user.create), dann ensureDefaultGroupsForAllTenants() als abschliessende Reparatur ueber ALLE Mandanten — laeuft unabhaengig von seedAdmin()s fruehen Rueckkehrpfaden (fehlende ENV / Admin existiert bereits) und ist je Mandant sowie insgesamt try/catch-gekapselt, blockiert den API-Start nie - Reparatur sitzt bewusst NICHT als eigener onApplicationBootstrap-Hook in GroupsModule (Ordering-Falle aus tender-scheduler.service.ts) - tenant.service.spec.ts, admin-seed.service.spec.ts (neu): Reihenfolge, beide fruehen Rueckkehrpfade, Fehlerisolation je Mandant, Idempotenz ueber zwei Bootstrap-Laeufe
48 lines
1.8 KiB
TypeScript
48 lines
1.8 KiB
TypeScript
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
import { TenantService } from './tenant.service';
|
|
|
|
/**
|
|
* TenantService.create — Standardgruppen-Anlage (D-06/D-13, quick-260805-fok).
|
|
*
|
|
* TenantService.create ist neben AdminSeedService.seedAdmin der zweite
|
|
* Mandanten-Entstehungspfad. Diese Tests decken ausschließlich die neue
|
|
* ensureDefaultGroup-Anbindung ab, mit gemocktem PrismaService und
|
|
* gemocktem GroupsService — im Stil von user.service.spec.ts.
|
|
*/
|
|
describe('TenantService.create — Standardgruppen-Anlage (D-06/D-13)', () => {
|
|
let prisma: any;
|
|
let groupsService: any;
|
|
let service: TenantService;
|
|
|
|
const createdTenant = { id: 't1', name: 'Acme', slug: 'acme' };
|
|
const baseData = { name: 'Acme', slug: 'acme' };
|
|
|
|
beforeEach(() => {
|
|
vi.clearAllMocks();
|
|
prisma = {
|
|
tenant: {
|
|
create: vi.fn().mockResolvedValue(createdTenant),
|
|
},
|
|
};
|
|
groupsService = {
|
|
ensureDefaultGroup: vi.fn().mockResolvedValue({ id: 'g1' }),
|
|
};
|
|
service = new TenantService(prisma, groupsService);
|
|
});
|
|
|
|
it('ruft nach der Mandanten-Anlage genau einmal ensureDefaultGroup mit der id des neu angelegten Mandanten auf; der Rueckgabewert bleibt der Mandant', async () => {
|
|
const result = await service.create(baseData);
|
|
|
|
expect(result).toEqual(createdTenant);
|
|
expect(groupsService.ensureDefaultGroup).toHaveBeenCalledTimes(1);
|
|
expect(groupsService.ensureDefaultGroup).toHaveBeenCalledWith('t1');
|
|
});
|
|
|
|
it('gibt den Mandanten trotz werfendem ensureDefaultGroup zurueck — der Fehler wird protokolliert, nicht propagiert', async () => {
|
|
groupsService.ensureDefaultGroup.mockRejectedValue(new Error('boom'));
|
|
|
|
await expect(service.create(baseData)).resolves.toEqual(createdTenant);
|
|
expect(prisma.tenant.create).toHaveBeenCalledTimes(1);
|
|
});
|
|
});
|