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(); }); });