- mail/go.mod: erstes eigenstaendiges Go-Modul fuer NEXARCH Mail - mail/docs/TESTSTRATEGIE-MAIL.md: Testpyramide (Unit/Integration/ Protokoll-Zustandsmaschinen/E2E/Vertragstests), Pflichttest-Merge-Gate, Bug-Tracking-Konvention (Gitea-Issues), analog Core QA-01 - mail/internal/example: ein reales, kleines Beispiel (Adress- Normalisierung) mit je einem Test pro Testart (Unit/Integration/E2E), 6 Tests real bestanden - mail/internal/pflichttestgate + cmd/pflichttestgate: Merge-Gate-CLI, echter End-zu-Ende-Beweis (Binary lehnt Verstoss ab, akzeptiert begleiteten Test), .gitea/workflows/mail-pflichttest-gate.yml - Ehrlich dokumentiert: kein Gitea-API-Token verfuegbar, daher kein echter Issue angelegt - Bug-Tracking-Vorgehen stattdessen anhand eines realen, bereits dokumentierten Befunds (RET-10) durchgespielt, als offener Punkt vermerkt - Gegenlesen durch zweite Person (Nutzer) noch ausstehend Pruefungen siehe mail/docs/TESTSTRATEGIE-MAIL.md
70 lines
1.7 KiB
Go
70 lines
1.7 KiB
Go
// Integrations-Test-Beispiel (QA-01 Akzeptanzkriterium 1/Prüfung 2):
|
|
// echte Postgres-Instanz, folgt derselben Testhost-Konvention wie
|
|
// DMS/Archive/Core (TEST_TENANT_DSN, t.Cleanup, geteilte physische
|
|
// Instanz auf 192.168.1.131 — siehe project-nexarch-test-infra).
|
|
package example
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
)
|
|
|
|
func setupTest(t *testing.T) *pgxpool.Pool {
|
|
t.Helper()
|
|
dsn := os.Getenv("TEST_TENANT_DSN")
|
|
if dsn == "" {
|
|
t.Skip("TEST_TENANT_DSN nicht gesetzt, Integrationstest übersprungen")
|
|
}
|
|
ctx := context.Background()
|
|
pool, err := pgxpool.New(ctx, dsn)
|
|
if err != nil {
|
|
t.Fatalf("pool: %v", err)
|
|
}
|
|
t.Cleanup(func() { pool.Close() })
|
|
|
|
if _, err := pool.Exec(ctx, `
|
|
CREATE TABLE IF NOT EXISTS example_addresses (
|
|
address TEXT PRIMARY KEY
|
|
);
|
|
`); err != nil {
|
|
t.Fatalf("schema: %v", err)
|
|
}
|
|
t.Cleanup(func() {
|
|
_, _ = pool.Exec(context.Background(), `TRUNCATE example_addresses`)
|
|
})
|
|
return pool
|
|
}
|
|
|
|
func TestAddressStore_SaveAndCheckExists(t *testing.T) {
|
|
pool := setupTest(t)
|
|
store := NewAddressStore(pool)
|
|
ctx := context.Background()
|
|
|
|
normalized, err := store.SaveNormalized(ctx, "Kunde@Beispiel.DE")
|
|
if err != nil {
|
|
t.Fatalf("savenormalized: %v", err)
|
|
}
|
|
if normalized != "Kunde@beispiel.de" {
|
|
t.Fatalf("erwartet normalisierte adresse, habe %q", normalized)
|
|
}
|
|
|
|
exists, err := store.Exists(ctx, normalized)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !exists {
|
|
t.Fatal("erwartet real gespeicherte adresse")
|
|
}
|
|
|
|
notExists, err := store.Exists(ctx, "unbekannt@beispiel.de")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if notExists {
|
|
t.Fatal("nie gespeicherte adresse haette nicht existieren duerfen")
|
|
}
|
|
}
|