Go-Backend (chi, pgx, golang-migrate) + React/TS-Frontend als PWA. Enthalten: Auth inkl. OIDC, Dateien mit Versionen und Papierkorb, Freigaben (Links + intern), WebDAV, Gruppenordner, Admin/Theming, Volltextsuche mit OCR, eigener PDF-Betrachter und WOPI-Office (Collabora/OnlyOffice). Nicht im Repo: deploy/.env (Sitzungsschlüssel, DB- und Admin-Passwort) sowie alle Daten- und Build-Verzeichnisse – siehe .gitignore. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
61 lines
1.9 KiB
Go
61 lines
1.9 KiB
Go
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")
|
||
}
|
||
}
|