package acl import "testing" // stronger entscheidet, welches Recht gilt, wenn jemand eine Ressource über // mehrere Wege erreicht – direkt und zusätzlich über zwei Gruppen etwa. Kippt // diese Funktion, bekommt jemand entweder zu viel oder unerwartet zu wenig. func TestStrongerPermissionWins(t *testing.T) { tests := []struct { name string a, b Permission want Permission }{ {"nichts und nichts", "", "", ""}, {"nur lesen", PermRead, "", PermRead}, {"lesen und schreiben", PermRead, PermWrite, PermWrite}, {"schreiben und lesen", PermWrite, PermRead, PermWrite}, {"zweimal schreiben", PermWrite, PermWrite, PermWrite}, {"zweimal lesen", PermRead, PermRead, PermRead}, {"schreiben aus dem Nichts", "", PermWrite, PermWrite}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := stronger(tt.a, tt.b); got != tt.want { t.Errorf("stronger(%q, %q) = %q, want %q", tt.a, tt.b, got, tt.want) } }) } } // Ein unbekanntes Recht darf nicht durchrutschen: Die Datenbank hat zwar einen // CHECK, aber die Prüfung soll vorher greifen und eine klare Fehlermeldung // liefern statt eines Constraint-Fehlers. func TestPermissionValidation(t *testing.T) { for _, p := range []Permission{PermRead, PermWrite} { if !p.valid() { t.Errorf("%q sollte gültig sein", p) } } for _, p := range []Permission{"", "admin", "owner", "READ", "write "} { if p.valid() { t.Errorf("%q sollte ungültig sein", p) } } } // Access.CanWrite ist die Weiche vor jeder Änderung. func TestAccessCanWrite(t *testing.T) { if (Access{Permission: PermRead}).CanWrite() { t.Error("Lesezugriff darf nicht schreiben dürfen") } if !(Access{Permission: PermWrite}).CanWrite() { t.Error("Schreibzugriff muss schreiben dürfen") } // Der Nullwert entsteht, wenn eine Auflösung fehlschlägt – der darf // keinesfalls Schreibrechte bedeuten. if (Access{}).CanWrite() { t.Error("leerer Zugriff darf nicht schreiben dürfen") } }