ARC-03: dublettenerkennung-e-mail
- 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>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
cb5a9da701
commit
704b64fe27
@@ -0,0 +1,58 @@
|
||||
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")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user