QA-01: teststrategie-core (pflichttest-gate, testdb-isolationsnachweis, ci-workflow)
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
package pflichttestgate
|
||||
|
||||
import "testing"
|
||||
|
||||
// Prüfung 1 (QA-01): CI-Lauf mit absichtlich fehlendem Pflichttest schlägt kontrolliert fehl —
|
||||
// Negativtest des Gates selbst.
|
||||
func TestCheckDiff_BlocksAuthChangeWithoutTest(t *testing.T) {
|
||||
changed := []string{
|
||||
"internal/auth/login.go",
|
||||
"internal/apiserver/handler.go", // unkritisch, keine Testpflicht
|
||||
}
|
||||
|
||||
violations := CheckDiff(changed)
|
||||
|
||||
if len(violations) != 1 {
|
||||
t.Fatalf("erwartet 1 Verstoß, bekommen %d: %+v", len(violations), violations)
|
||||
}
|
||||
if violations[0].Package != "internal/auth" {
|
||||
t.Errorf("erwartetes Package internal/auth, bekommen %q", violations[0].Package)
|
||||
}
|
||||
if violations[0].ChangedFile != "internal/auth/login.go" {
|
||||
t.Errorf("erwartete Datei internal/auth/login.go, bekommen %q", violations[0].ChangedFile)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCheckDiff_PassesWhenTestFileAccompaniesChange(t *testing.T) {
|
||||
changed := []string{
|
||||
"internal/auth/login.go",
|
||||
"internal/auth/login_test.go",
|
||||
}
|
||||
|
||||
violations := CheckDiff(changed)
|
||||
|
||||
if len(violations) != 0 {
|
||||
t.Fatalf("erwartet keinen Verstoß, bekommen %+v", violations)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCheckDiff_PassesForNewTestFileEvenWithoutSourceChange(t *testing.T) {
|
||||
// Nachtraeglich ergaenzter Test fuer bestehenden Code ist erlaubt/erwuenscht.
|
||||
changed := []string{"internal/tenant/registry_test.go"}
|
||||
|
||||
violations := CheckDiff(changed)
|
||||
|
||||
if len(violations) != 0 {
|
||||
t.Fatalf("erwartet keinen Verstoß, bekommen %+v", violations)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCheckDiff_IgnoresUnrelatedPackages(t *testing.T) {
|
||||
changed := []string{"internal/config/config.go", "internal/db/db.go"}
|
||||
|
||||
violations := CheckDiff(changed)
|
||||
|
||||
if len(violations) != 0 {
|
||||
t.Fatalf("erwartet keinen Verstoß fuer unkritische Pakete, bekommen %+v", violations)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCheckDiff_CoversAllSensitiveAreas(t *testing.T) {
|
||||
cases := []string{
|
||||
"internal/auth/session.go",
|
||||
"internal/iam/user.go",
|
||||
"internal/tenant/provisioner.go",
|
||||
"internal/rbac/enforcer.go",
|
||||
"internal/policy/decision.go",
|
||||
}
|
||||
for _, f := range cases {
|
||||
violations := CheckDiff([]string{f})
|
||||
if len(violations) != 1 {
|
||||
t.Errorf("Datei %q sollte als sensibel erkannt werden, Verstöße: %+v", f, violations)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestCheckDiff_IgnoresNonGoFiles(t *testing.T) {
|
||||
changed := []string{"internal/auth/README.md"}
|
||||
|
||||
violations := CheckDiff(changed)
|
||||
|
||||
if len(violations) != 0 {
|
||||
t.Fatalf("Nicht-Go-Dateien duerfen keine Testpflicht ausloesen, bekommen %+v", violations)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user