Files
dozzle/internal/auth/roles_test.go
T

103 lines
4.3 KiB
Go

package auth
import (
"testing"
)
func TestParseRole(t *testing.T) {
testCases := []struct {
name string
input string
expected Role
}{
// Single role tests
{"Single shell role", "shell", Shell},
{"Single actions role", "actions", Actions},
{"Single download role", "download", Download},
{"Single notifications role", "notifications", Notifications},
{"Single dozzle_notifications role", "dozzle_notifications", Notifications},
{"Single cloud role", "cloud", Cloud},
{"Single dozzle_cloud role", "dozzle_cloud", Cloud},
{"All includes notifications and cloud", "all", Shell | Actions | Download | Notifications | Cloud},
{"None role", "none", None},
{"All role", "all", All},
// Single dozzle_ prefixed role tests
{"Single dozzle_shell role", "dozzle_shell", Shell},
{"Single dozzle_actions role", "dozzle_actions", Actions},
{"Single dozzle_download role", "dozzle_download", Download},
{"Dozzle_none role", "dozzle_none", None},
{"Dozzle_all role", "dozzle_all", All},
// Case insensitive tests
{"Shell uppercase", "SHELL", Shell},
{"Actions mixed case", "AcTiOnS", Actions},
{"Download with spaces", " download ", Download},
{"Dozzle_shell uppercase", "DOZZLE_SHELL", Shell},
{"Dozzle_actions mixed case", "DoZzLe_AcTiOnS", Actions},
{"Dozzle_download with spaces", " dozzle_download ", Download},
// Multiple roles with comma separator
{"Shell and actions", "shell,actions", Shell | Actions},
{"All three roles", "shell,actions,download", Shell | Actions | Download},
{"Roles with spaces", "shell , actions , download", Shell | Actions | Download},
{"Dozzle roles with comma", "dozzle_shell,dozzle_actions", Shell | Actions},
{"Mixed dozzle and regular", "shell,dozzle_actions,download", Shell | Actions | Download},
{"Cloud with other roles", "shell,cloud", Shell | Cloud},
// Multiple roles with pipe separator
{"Shell and actions with pipe", "shell|actions", Shell | Actions},
{"All three with pipe", "shell|actions|download", Shell | Actions | Download},
{"Mixed separators", "shell,actions|download", Shell | Actions | Download},
{"Dozzle roles with pipe", "dozzle_shell|dozzle_actions", Shell | Actions},
// JSON format tests
{"JSON single role", `["shell"]`, Shell},
{"JSON multiple roles", `["shell", "actions"]`, Shell | Actions},
{"JSON all roles", `["shell", "actions", "download"]`, Shell | Actions | Download},
{"JSON with spaces", ` ["shell", "actions"] `, Shell | Actions},
{"JSON single dozzle role", `["dozzle_shell"]`, Shell},
{"JSON multiple dozzle roles", `["dozzle_shell", "dozzle_actions"]`, Shell | Actions},
{"JSON mixed dozzle and regular", `["shell", "dozzle_actions"]`, Shell | Actions},
// Edge cases
{"Empty string", "", None},
{"Whitespace only", " ", None},
{"Invalid role", "invalid", None},
{"Mixed valid and invalid", "shell,invalid,actions", Shell | Actions},
{"None overrides others", "shell,none,actions", None},
{"All overrides others", "shell,all,actions", All},
{"Dozzle_none overrides others", "dozzle_shell,dozzle_none,dozzle_actions", None},
{"Dozzle_all overrides others", "dozzle_shell,dozzle_all,dozzle_actions", All},
// Negated roles
{"All except shell", "all,^shell", All &^ Shell},
{"All except shell with pipe", "all | ^shell", All &^ Shell},
{"All except two", "all,^shell,^actions", All &^ (Shell | Actions)},
{"Negate everything", "all,^all", None},
{"Negation order does not matter", "^shell,all", All &^ Shell},
{"Negate unset role", "shell,^actions", Shell},
{"Negate with spaces", "all, ^ shell ", All &^ Shell},
{"Negated dozzle prefixed role", "dozzle_all,^dozzle_shell", All &^ Shell},
{"Negated uppercase", "ALL,^SHELL", All &^ Shell},
{"Negated invalid role", "all,^invalid", All},
{"Negated none is ignored", "all,^none", All},
{"None still wins over negation", "all,^shell,none", None},
{"All except notifications", "all,^notifications", All &^ Notifications},
{"JSON with negation", `["all", "^shell"]`, All &^ Shell},
// Invalid JSON
{"Invalid JSON format", `["shell"`, None},
{"Malformed JSON", `{shell: "test"}`, None},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
result := ParseRole(tc.input)
if result != tc.expected {
t.Errorf("ParseRole(%q) = %d, expected %d", tc.input, int(result), int(tc.expected))
}
})
}
}