import { describe, expect, it } from "vitest" ;
import {
normalizeAtHashSlug,
normalizeHyphenSlug,
normalizeStringEntries,
normalizeStringEntriesLower,
} from "./string-normalization.js" ;
describe("shared/string-normalization" , () => {
it("normalizes mixed allow-list entries" , () => {
expect(normalizeStringEntries([" a " , 42 , "" , " " , "z" ])).toEqual(["a" , "42" , "z" ]);
expect(normalizeStringEntries([" ok " , null , { toString: () => " obj " }])).toEqual([
"ok" ,
"null" ,
"obj" ,
]);
expect(normalizeStringEntries(undefined)).toEqual([]);
});
it("normalizes mixed allow-list entries to lowercase" , () => {
expect(normalizeStringEntriesLower([" A " , "MiXeD" , 7 ])).toEqual(["a" , "mixed" , "7" ]);
});
it("normalizes slug-like labels while preserving supported symbols" , () => {
expect(normalizeHyphenSlug(" Team Room " )).toBe("team-room" );
expect(normalizeHyphenSlug(" #My_Channel + Alerts " )).toBe("#my_channel-+-alerts" );
expect(normalizeHyphenSlug("..foo---bar.." )).toBe("foo-bar" );
expect(normalizeHyphenSlug(undefined)).toBe("" );
expect(normalizeHyphenSlug(null )).toBe("" );
});
it("collapses repeated separators and trims leading/trailing punctuation" , () => {
expect(normalizeHyphenSlug(" ...Hello / World--- " )).toBe("hello-world" );
expect(normalizeHyphenSlug(" ###Team@@@Room### " )).toBe("###team@@@room###" );
});
it("normalizes @/# prefixed slugs used by channel allowlists" , () => {
expect(normalizeAtHashSlug(" #My_Channel + Alerts " )).toBe("my-channel-alerts" );
expect(normalizeAtHashSlug("@@Room___Name" )).toBe("room-name" );
expect(normalizeAtHashSlug(undefined)).toBe("" );
expect(normalizeAtHashSlug(null )).toBe("" );
});
it("strips repeated prefixes and collapses separator-only results" , () => {
expect(normalizeAtHashSlug("###__Room Name__" )).toBe("room-name" );
expect(normalizeAtHashSlug("@@@___" )).toBe("" );
});
});
Messung V0.5 in Prozent C=99 H=98 G=98
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-10)
¤
*© Formatika GbR, Deutschland