Registry-DB (nur Tenant-Metadaten), Provisioning-Routine legt pro Mandant
eine physisch isolierte Postgres-DB an und registriert sie transaktional
(Rollback der DB bei fehlgeschlagener Registrierung). Schlanker HTTP-Handler
als Schnittstellen-Vorbereitung fuer API-01/TEN-02, kein eigenes REST-Grundgerüst.
Pruefungen:
1. Migration up/down geschrieben (0001_tenant_registry.{up,down}.sql) — nicht
gegen echte DB ausgefuehrt, da auf dieser Maschine kein Go/Postgres-Test-
Setup verfuegbar ist. Offen zur Ausfuehrung.
2. Integrationstest TestProvision_CreatesIsolatedDatabases geschrieben (zwei
Mandanten, prueft unterschiedliche db_name und current_database()) —
ebenfalls nicht ausgefuehrt, guarded per TEST_ADMIN_DSN env var. Offen.
3. Slug-Validierung (unit test TestValidateSlug) deckt SQL-Injection-Versuch
im Datenbanknamen ab — ebenfalls nicht lokal ausgefuehrt, da kein Go
Compiler auf dieser Maschine vorhanden ist. Offen.
Alle drei Pruefungen sind vorbereitet, aber NICHT durchgefuehrt worden —
zaehlen laut Vorgabe als offen bis auf einer Maschine mit Go+Postgres verifiziert.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
36 lines
668 B
Go
36 lines
668 B
Go
package tenant
|
|
|
|
import "testing"
|
|
|
|
func TestValidateSlug(t *testing.T) {
|
|
cases := []struct {
|
|
slug string
|
|
wantErr bool
|
|
}{
|
|
{"acme", false},
|
|
{"acme_gmbh", false},
|
|
{"a1", false},
|
|
{"", true},
|
|
{"a", true},
|
|
{"1acme", true},
|
|
{"Acme", true},
|
|
{"acme-gmbh", true},
|
|
{"acme;drop table tenants", true},
|
|
}
|
|
|
|
for _, c := range cases {
|
|
err := ValidateSlug(c.slug)
|
|
if (err != nil) != c.wantErr {
|
|
t.Errorf("ValidateSlug(%q) error = %v, wantErr %v", c.slug, err, c.wantErr)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestDBNameForSlug(t *testing.T) {
|
|
got := dbNameForSlug("acme")
|
|
want := "tenant_acme"
|
|
if got != want {
|
|
t.Errorf("dbNameForSlug() = %q, want %q", got, want)
|
|
}
|
|
}
|