66 lines
3.1 KiB
TypeScript
66 lines
3.1 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { GuidFehler, guidAusBytes } from "@/lib/ldap-guid";
|
|
|
|
/**
|
|
* `objectGUID` als GUID-Zeichenkette (#016).
|
|
*
|
|
* Diese Umsortierung ist der Grund, warum die Kennung ueberhaupt eine eigene
|
|
* Datei hat: schlaegt sie fehl, sieht das Ergebnis trotzdem wie eine GUID aus.
|
|
* Der Abgleich wuerde dann bei jedem Lauf dieselben Personen neu anlegen, weil
|
|
* die Kennung zwar stabil, aber gegen `Get-ADUser` nicht auffindbar waere — ein
|
|
* Fehler, der erst auffaellt, wenn jemand mit dem AD vergleicht.
|
|
*
|
|
* Die erwarteten Zeichenketten sind mit Pythons `uuid.UUID(bytes_le=…)`
|
|
* ausgerechnet, also mit einer unabhaengigen Umsetzung derselben Reihenfolge.
|
|
*/
|
|
|
|
describe("guidAusBytes", () => {
|
|
it("ordnet die ersten drei Gruppen little-endian, den Rest in Leserichtung", () => {
|
|
// Der aufschlussreichste Vektor: die Bytes 00…0f. An der Ausgabe ist die
|
|
// Umsortierung mit dem Auge nachzuvollziehen.
|
|
const bytes = Uint8Array.from([
|
|
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
|
|
]);
|
|
expect(guidAusBytes(bytes)).toBe("03020100-0504-0706-0809-0a0b0c0d0e0f");
|
|
});
|
|
|
|
it("liest den Byte-Vektor einer echten AD-Kennung", () => {
|
|
// Dieselben Bytes stehen base64-kodiert im Fixture des Testcontainers
|
|
// (tests/fixtures/ldap/daten/50-personen.ldif, „Maria Huber“).
|
|
const bytes = Uint8Array.from(Buffer.from("EEMHXzU8HUqDb6UPUV56NQ==", "base64"));
|
|
expect(guidAusBytes(bytes)).toBe("5f074310-3c35-4a1d-836f-a50f515e7a35");
|
|
});
|
|
|
|
it("liefert bei denselben Bytes immer dieselbe Zeichenkette", () => {
|
|
const bytes = Uint8Array.from(Buffer.from("nEA+HXqyyUux5vCiw9Tl9g==", "base64"));
|
|
expect(guidAusBytes(bytes)).toBe(guidAusBytes(bytes));
|
|
expect(guidAusBytes(Uint8Array.from(bytes))).toBe("1d3e409c-b27a-4bc9-b1e6-f0a2c3d4e5f6");
|
|
});
|
|
|
|
it("schreibt fuehrende Nullen mit", () => {
|
|
// Ohne padStart waere daraus "0-0-0-0-0"; die Kennung waere kuerzer als eine
|
|
// GUID und passte doch zu einem Konto.
|
|
expect(guidAusBytes(new Uint8Array(16))).toBe("00000000-0000-0000-0000-000000000000");
|
|
});
|
|
|
|
it("gibt Klein- und nicht Grossbuchstaben aus", () => {
|
|
const bytes = Uint8Array.from(Buffer.from("/+7dzLuqmYh3ZlVEMyIRAA==", "base64"));
|
|
const guid = guidAusBytes(bytes);
|
|
expect(guid).toBe("ccddeeff-aabb-8899-7766-554433221100");
|
|
expect(guid).toBe(guid.toLowerCase());
|
|
});
|
|
|
|
it("hat die Form 8-4-4-4-12", () => {
|
|
const guid = guidAusBytes(Uint8Array.from(Buffer.from("AQIDBAUGBwgJCgsMDQ4PEA==", "base64")));
|
|
expect(guid).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/u);
|
|
});
|
|
|
|
it("wirft bei falscher Laenge statt eine halbe Kennung zu liefern", () => {
|
|
// Genau der Fall, der ohne explicitBufferAttributes entsteht: die 16 Bytes
|
|
// wurden als UTF-8 gelesen und dabei veraendert.
|
|
expect(() => guidAusBytes(new Uint8Array(15))).toThrow(GuidFehler);
|
|
expect(() => guidAusBytes(new Uint8Array(0))).toThrow(GuidFehler);
|
|
expect(() => guidAusBytes(new Uint8Array(36))).toThrow(/16 Bytes/u);
|
|
});
|
|
});
|