test(260925-bow): Anlagewege tragen die laufende Version ein (rot)

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-25 08:49:21 +02:00
parent 187fb76c91
commit 25c8db746a
2 changed files with 86 additions and 2 deletions
+35 -1
View File
@@ -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();
+51 -1
View File
@@ -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<UserService['create']>[0]);
expect(result.lastSeenReleaseVersion).toBe('10.2.3');
});
});
describe('findById', () => {
let prisma: any;
let service: UserService;