diff --git a/apps/api/src/user/admin-seed.service.spec.ts b/apps/api/src/user/admin-seed.service.spec.ts index 3e09881..8b12fff 100644 --- a/apps/api/src/user/admin-seed.service.spec.ts +++ b/apps/api/src/user/admin-seed.service.spec.ts @@ -1,4 +1,4 @@ -import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { AdminSeedService } from './admin-seed.service'; /** @@ -95,6 +95,40 @@ describe('AdminSeedService', () => { service = new AdminSeedService(prisma, configService, groupsService); }); + afterEach(() => { + vi.unstubAllEnvs(); + }); + + // quick-260925-bow (D-04): der Erst-Administrator bekommt die laufende + // freigegebene Version eingetragen und sieht kein "Was ist neu"-Fenster + // mit Altlasten; auf dev-Staenden null. + it('legt den Erst-Administrator mit lastSeenReleaseVersion der laufenden Version an', async () => { + vi.stubEnv('APP_VERSION', 'v10.2.3-3-gabc1234'); + let createdData: any; + prisma.__setUserCreateImpl(async (args: any) => { + createdData = args.data; + return { id: 'u1' }; + }); + + await service.onApplicationBootstrap(); + + expect(createdData.lastSeenReleaseVersion).toBe('10.2.3'); + expect(createdData.role).toBe('SUPER_ADMIN'); + }); + + it('legt den Erst-Administrator auf dev-Staenden mit lastSeenReleaseVersion null an', async () => { + vi.stubEnv('APP_VERSION', 'dev'); + let createdData: any; + prisma.__setUserCreateImpl(async (args: any) => { + createdData = args.data; + return { id: 'u1' }; + }); + + await service.onApplicationBootstrap(); + + expect(createdData).toHaveProperty('lastSeenReleaseVersion', null); + }); + it('ruft auf einer frischen Installation in genau dieser Reihenfolge auf: tenant.upsert, ensureDefaultGroup, dann user.create', async () => { await service.onApplicationBootstrap(); diff --git a/apps/api/src/user/user.service.spec.ts b/apps/api/src/user/user.service.spec.ts index c4f7e37..86e300d 100644 --- a/apps/api/src/user/user.service.spec.ts +++ b/apps/api/src/user/user.service.spec.ts @@ -1,5 +1,5 @@ import { ConflictException } from '@nestjs/common'; -import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { UserService } from './user.service'; /** @@ -251,6 +251,56 @@ describe('UserService', () => { }); }); + /** + * quick-260925-bow (D-04): neue Benutzer bekommen die laufende freigegebene + * Version eingetragen, damit sie kein "Was ist neu"-Fenster mit Altlasten + * sehen. Der Wert ist eine Eigenschaft des Servers (APP_VERSION), nicht des + * Aufrufers — die Signatur von create() bekommt kein neues Feld. + */ + describe('create — lastSeenReleaseVersion (quick-260925-bow)', () => { + let prisma: any; + let service: UserService; + + beforeEach(() => { + prisma = makeFakePrisma(); + service = new UserService(prisma, { addUserToDefaultGroup: vi.fn().mockResolvedValue(undefined) } as any); + }); + + afterEach(() => { + vi.unstubAllEnvs(); + }); + + it('traegt bei freigegebener laufender Version X.Y.Z ein (Describe-Stand gekuerzt)', async () => { + vi.stubEnv('APP_VERSION', 'v10.2.3-3-gabc1234'); + const result = await service.create({ username: 'neu', email: 'neu@example.com', tenantId: 't1' }); + expect(result.lastSeenReleaseVersion).toBe('10.2.3'); + expectBoundCall(prisma, 't1', 'user', 'create'); + }); + + it('traegt auf dev-Staenden null ein', async () => { + vi.stubEnv('APP_VERSION', 'dev'); + const result = await service.create({ username: 'neu2', email: 'neu2@example.com', tenantId: 't1' }); + expect(result.lastSeenReleaseVersion).toBeNull(); + }); + + it('traegt ohne APP_VERSION null ein', async () => { + vi.stubEnv('APP_VERSION', undefined); + const result = await service.create({ username: 'neu3', email: 'neu3@example.com', tenantId: 't1' }); + expect(result.lastSeenReleaseVersion).toBeNull(); + }); + + it('ein von aussen untergeschobenes Feld setzt den Wert nicht (kein Parameter der Signatur)', async () => { + vi.stubEnv('APP_VERSION', 'v10.2.3'); + const result = await service.create({ + username: 'neu4', + email: 'neu4@example.com', + tenantId: 't1', + lastSeenReleaseVersion: '99.0.0', + } as unknown as Parameters[0]); + expect(result.lastSeenReleaseVersion).toBe('10.2.3'); + }); + }); + describe('findById', () => { let prisma: any; let service: UserService;