fix(v5): Laufzeit-Pfade plattformneutral — pipeline/struktur auf node:path
Ampel / ampel (push) Successful in 1m21s

Der NFO-Ablage-Test brach in der Linux-CI: pipeline/struktur bauten mit
path.win32 auf POSIX-Testordnern (mkdir legte 'x\Filme' als EINEN Namen
an, readdir fand nichts). Regel jetzt dokumentiert: Module ueber
LAUFZEIT-Wurzeln (Ablage) nutzen plattform-path — zur echten Laufzeit
immer Windows, in der CI physisch korrekt auf POSIX; Module mit FESTER
Windows-Semantik (katalog, dateiDaneben) bleiben bei path.win32.
Testerwartungen entsprechend ueber join() statt Literale.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-08-30 18:29:46 +02:00
co-authored by Claude Fable 5
parent 3dc296f071
commit e840b7f327
6 changed files with 390 additions and 15 deletions
+12 -9
View File
@@ -1,5 +1,6 @@
// Tests der Ablage — sichere Namen, Zielstruktur, Episoden-Zuordnung, NFO.
// Testfälle sinngemäß aus test_medien.py (Docker-Zweig).
import { join } from 'node:path'
import { describe, expect, it } from 'vitest'
import { baueNfo } from '../src/kern/ablage/nfo'
import {
@@ -28,19 +29,21 @@ describe('sichererName', () => {
describe('zielordner', () => {
it('sprechender Name; bei Kollision Job-Kennung statt Überschreiben', () => {
expect(zielordner('E:\\Filme', 'Akira', 1988, 'job-1234abcd', () => false)).toBe(
'E:\\Filme\\Akira (1988)',
// Erwartungen über join() — die Funktionen arbeiten mit den
// Pfadregeln der LAUFZEIT-Plattform (Linux-CI testet mit POSIX).
expect(zielordner('Filme', 'Akira', 1988, 'job-1234abcd', () => false)).toBe(
join('Filme', 'Akira (1988)'),
)
expect(zielordner('E:\\Filme', 'Akira', 1988, 'job-1234abcd', () => true)).toBe(
'E:\\Filme\\Akira (1988) [job-1234]',
expect(zielordner('Filme', 'Akira', 1988, 'job-1234abcd', () => true)).toBe(
join('Filme', 'Akira (1988) [job-1234]'),
)
expect(zielordner('E:\\Filme', '', null, 'job-1', () => false)).toBe('E:\\Filme\\job-1')
expect(zielordner('Filme', '', null, 'job-1', () => false)).toBe(join('Filme', 'job-1'))
})
})
describe('serienOrdner', () => {
it('Jellyfin-Schema Serie/Season NN', () => {
expect(serienOrdner('E:\\Serien', 'Dr. Who?', 2)).toBe('E:\\Serien\\Dr. Who\\Season 02')
expect(serienOrdner('Serien', 'Dr. Who?', 2)).toBe(join('Serien', 'Dr. Who', 'Season 02'))
})
})
@@ -90,14 +93,14 @@ describe('matcheEpisoden', () => {
describe('episodenUmbenennen', () => {
it('benennt in Disc-Reihenfolge um, überschreibt nie', () => {
const umbenannt: Array<[string, string]> = []
const meldungen = episodenUmbenennen('E:\\S', 'Akte X', 1, [3, 4], {
const meldungen = episodenUmbenennen('S', 'Akte X', 1, [3, 4], {
listen: () => ['title_t01.mkv', 'title_t00.mkv'],
existiert: () => false,
umbenennen: (von, nach) => umbenannt.push([von, nach]),
})
expect(umbenannt).toEqual([
['E:\\S\\title_t00.mkv', 'E:\\S\\Akte X S01E03.mkv'],
['E:\\S\\title_t01.mkv', 'E:\\S\\Akte X S01E04.mkv'],
[join('S', 'title_t00.mkv'), join('S', 'Akte X S01E03.mkv')],
[join('S', 'title_t01.mkv'), join('S', 'Akte X S01E04.mkv')],
])
expect(meldungen).toHaveLength(2)
})