b35edd5f31
- parseReleaseVersion/compareReleaseVersions/getRunningRelease - GET me/release-notice, POST me/release-seen: Format, nicht ueber laufend, nie absenken, Mandanten- und Benutzerbindung, ReleaseSeenDto Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
123 lines
4.0 KiB
TypeScript
123 lines
4.0 KiB
TypeScript
import { compareReleaseVersions, parseReleaseVersion } from '@tessera/shared';
|
|
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
import { getRunningRelease } from './app-version';
|
|
|
|
/**
|
|
* Freigegebene Versionen (quick-260925-bow, D-02/D-06).
|
|
*
|
|
* `parseReleaseVersion` und `compareReleaseVersions` stehen EINMAL in
|
|
* `packages/shared/src/index.ts` und werden von API und Web benutzt. Getestet
|
|
* wird hier in der API-Suite, weil `packages/shared` keinen eigenen Testlauf
|
|
* hat (Vorbild `widget-module-map.spec.ts`).
|
|
*
|
|
* `getRunningRelease()` ist die einzige Quelle der laufenden Version fuer das
|
|
* "Was ist neu"-Fenster: `APP_VERSION` der API, auf X.Y.Z gekuerzt.
|
|
*/
|
|
|
|
afterEach(() => {
|
|
vi.unstubAllEnvs();
|
|
});
|
|
|
|
describe('parseReleaseVersion (quick-260925-bow)', () => {
|
|
it.each([
|
|
['v10.2.3', '10.2.3'],
|
|
['10.2.3', '10.2.3'],
|
|
['v10.2.3-5-gabc1234', '10.2.3'],
|
|
['10.2.3-12-g0123456789abcdef', '10.2.3'],
|
|
['010.02.3', '10.2.3'],
|
|
['1.4.0', '1.4.0'],
|
|
])('%s → %s', (raw, expected) => {
|
|
expect(parseReleaseVersion(raw)).toBe(expected);
|
|
});
|
|
|
|
it.each([
|
|
['dev'],
|
|
[''],
|
|
['abc1234'],
|
|
['10.2'],
|
|
['10.2.3-rc.1'],
|
|
['10.2.3-dirty'],
|
|
[' 10.2.3'],
|
|
['10.2.3 '],
|
|
['V10.2.3'],
|
|
['vv10.2.3'],
|
|
['10.2.3.4'],
|
|
['1234567.0.0'],
|
|
['10.2.3-5-gxyz1234'],
|
|
['10.2.3-5-gabc'],
|
|
['10.2.3-g0123456'],
|
|
])('%j → null', (raw) => {
|
|
expect(parseReleaseVersion(raw)).toBeNull();
|
|
});
|
|
|
|
it('Eingaben ueber 64 Zeichen ergeben null, auch wenn das Muster sonst passen wuerde', () => {
|
|
const long = `1.2.3-5-g${'a'.repeat(40)}`;
|
|
expect(long.length).toBeLessThanOrEqual(64);
|
|
expect(parseReleaseVersion(long)).toBe('1.2.3');
|
|
expect(parseReleaseVersion(`${'1'.repeat(70)}.0.0`)).toBeNull();
|
|
expect(parseReleaseVersion('x'.repeat(10_000))).toBeNull();
|
|
});
|
|
|
|
it('Nicht-Zeichenketten ergeben null statt eines Fehlers', () => {
|
|
expect(parseReleaseVersion(undefined as unknown as string)).toBeNull();
|
|
expect(parseReleaseVersion(null as unknown as string)).toBeNull();
|
|
expect(parseReleaseVersion(123 as unknown as string)).toBeNull();
|
|
});
|
|
});
|
|
|
|
describe('compareReleaseVersions (quick-260925-bow)', () => {
|
|
it('vergleicht numerisch, nicht lexikografisch', () => {
|
|
expect(compareReleaseVersions('1.10.0', '1.9.0')).toBe(1);
|
|
expect(compareReleaseVersions('1.9.0', '1.10.0')).toBe(-1);
|
|
});
|
|
|
|
it('die hoehere Hauptversion gewinnt', () => {
|
|
expect(compareReleaseVersions('2.0.0', '1.99.99')).toBe(1);
|
|
expect(compareReleaseVersions('1.99.99', '2.0.0')).toBe(-1);
|
|
});
|
|
|
|
it('Patch-Stelle entscheidet bei gleicher Haupt- und Nebenversion', () => {
|
|
expect(compareReleaseVersions('1.3.1', '1.3.0')).toBe(1);
|
|
});
|
|
|
|
it('gleiche Versionen ergeben 0, auch mit v-Praefix und Describe-Anhang', () => {
|
|
expect(compareReleaseVersions('1.4.0', '1.4.0')).toBe(0);
|
|
expect(compareReleaseVersions('v10.2.3', '10.2.3')).toBe(0);
|
|
expect(compareReleaseVersions('v10.2.3-5-gabc1234', '10.2.3')).toBe(0);
|
|
});
|
|
|
|
it('wirft bei nicht parsebarer Eingabe', () => {
|
|
expect(() => compareReleaseVersions('dev', '1.0.0')).toThrow();
|
|
expect(() => compareReleaseVersions('1.0.0', 'abc1234')).toThrow();
|
|
});
|
|
});
|
|
|
|
describe('getRunningRelease (quick-260925-bow)', () => {
|
|
it('liest APP_VERSION und kuerzt den Describe-Stand auf X.Y.Z', () => {
|
|
vi.stubEnv('APP_VERSION', 'v10.2.3-5-gabc1234');
|
|
expect(getRunningRelease()).toBe('10.2.3');
|
|
});
|
|
|
|
it('ein Tag-Stand ergibt die Version selbst', () => {
|
|
vi.stubEnv('APP_VERSION', 'v1.4.0');
|
|
expect(getRunningRelease()).toBe('1.4.0');
|
|
});
|
|
|
|
it('dev ergibt null', () => {
|
|
vi.stubEnv('APP_VERSION', 'dev');
|
|
expect(getRunningRelease()).toBeNull();
|
|
});
|
|
|
|
it('ungesetzt oder leer ergibt null', () => {
|
|
vi.stubEnv('APP_VERSION', undefined);
|
|
expect(getRunningRelease()).toBeNull();
|
|
vi.stubEnv('APP_VERSION', '');
|
|
expect(getRunningRelease()).toBeNull();
|
|
});
|
|
|
|
it('ein blosser Commit-Stempel ergibt null', () => {
|
|
vi.stubEnv('APP_VERSION', 'abc1234');
|
|
expect(getRunningRelease()).toBeNull();
|
|
});
|
|
});
|