- mail/internal/dedup/hash.go: HashAndBuffer, SHA-256 auf Klartext VOR Verschluesselung (ARC-02), liefert erneut lesbaren Reader zurueck. - mail/internal/dedup/store.go: Store (Postgres, tenant_slug fest im Primaerschluessel gebunden), Register: Duplikat referenziert Original statt redundant zu speichern. - Alle 3 Pflichtpruefungen real bestanden (siehe mail/docs/ARC-03-PRUEFPROTOKOLL.md): Duplikat aus zwei Quellen erkannt, zwei Mandanten mit identischem Inhalt nicht verknuepft, knapp unterschiedliche Nachricht korrekt nicht erkannt. - Kein Umbau: internal/storage, internal/crypto, internal/encstorage unveraendert. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
59 lines
1.6 KiB
Go
59 lines
1.6 KiB
Go
package dedup
|
|
|
|
import (
|
|
"io"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestHashAndBuffer_SameContentSameHash(t *testing.T) {
|
|
h1, buf1, err := HashAndBuffer(strings.NewReader("identischer inhalt"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
h2, buf2, err := HashAndBuffer(strings.NewReader("identischer inhalt"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if h1 != h2 {
|
|
t.Fatalf("erwartet identischen hash für identischen inhalt, habe %q vs %q", h1, h2)
|
|
}
|
|
|
|
got1, _ := io.ReadAll(buf1)
|
|
got2, _ := io.ReadAll(buf2)
|
|
if string(got1) != "identischer inhalt" || string(got2) != "identischer inhalt" {
|
|
t.Fatal("buffered reader liefert nicht denselben inhalt zurück wie der ursprüngliche klartext")
|
|
}
|
|
}
|
|
|
|
func TestHashAndBuffer_DifferentContentDifferentHash(t *testing.T) {
|
|
h1, _, err := HashAndBuffer(strings.NewReader("nachricht a"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
h2, _, err := HashAndBuffer(strings.NewReader("nachricht b"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if h1 == h2 {
|
|
t.Fatal("unterschiedlicher inhalt hätte unterschiedlichen hash liefern müssen")
|
|
}
|
|
}
|
|
|
|
// TestHashAndBuffer_SlightlyDifferentContentDifferentHash ist die
|
|
// geforderte Pflichtprüfung 3: knapp unterschiedliche Nachrichten
|
|
// werden korrekt NICHT als Duplikat erkannt.
|
|
func TestHashAndBuffer_SlightlyDifferentContentDifferentHash(t *testing.T) {
|
|
h1, _, err := HashAndBuffer(strings.NewReader("Betreff: Test\r\n\r\nInhalt der Nachricht."))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
h2, _, err := HashAndBuffer(strings.NewReader("Betreff: Test\r\n\r\nInhalt der Nachricht,"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if h1 == h2 {
|
|
t.Fatal("ein einziges abweichendes zeichen hätte den hash ändern müssen")
|
|
}
|
|
}
|