blob: a3e883491fc28b7ce9ec64c92520593533aa95e0 [file] [log] [blame]
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package credsutil
import (
"regexp"
"testing"
)
func TestGenerateUsername(t *testing.T) {
type testCase struct {
displayName string
displayNameLen int
roleName string
roleNameLen int
usernameLen int
separator string
caseOp CaseOp
regex string
}
tests := map[string]testCase{
"all opts": {
displayName: "abcdefghijklmonpqrstuvwxyz",
displayNameLen: 10,
roleName: "zyxwvutsrqpnomlkjihgfedcba",
roleNameLen: 10,
usernameLen: 45,
separator: ".",
caseOp: KeepCase,
regex: "^v.abcdefghij.zyxwvutsrq.[a-zA-Z0-9]{20}.$",
},
"no separator": {
displayName: "abcdefghijklmonpqrstuvwxyz",
displayNameLen: 10,
roleName: "zyxwvutsrqpnomlkjihgfedcba",
roleNameLen: 10,
usernameLen: 45,
separator: "",
caseOp: KeepCase,
regex: "^vabcdefghijzyxwvutsrq[a-zA-Z0-9]{20}[0-9]{4}$",
},
"lowercase": {
displayName: "abcdefghijklmonpqrstuvwxyz",
displayNameLen: 10,
roleName: "zyxwvutsrqpnomlkjihgfedcba",
roleNameLen: 10,
usernameLen: 45,
separator: "_",
caseOp: Lowercase,
regex: "^v_abcdefghij_zyxwvutsrq_[a-z0-9]{20}_$",
},
"uppercase": {
displayName: "abcdefghijklmonpqrstuvwxyz",
displayNameLen: 10,
roleName: "zyxwvutsrqpnomlkjihgfedcba",
roleNameLen: 10,
usernameLen: 45,
separator: "_",
caseOp: Uppercase,
regex: "^V_ABCDEFGHIJ_ZYXWVUTSRQ_[A-Z0-9]{20}_$",
},
"short username": {
displayName: "abcdefghijklmonpqrstuvwxyz",
displayNameLen: 5,
roleName: "zyxwvutsrqpnomlkjihgfedcba",
roleNameLen: 5,
usernameLen: 15,
separator: "_",
caseOp: KeepCase,
regex: "^v_abcde_zyxwv_[a-zA-Z0-9]{1}$",
},
"long username": {
displayName: "abcdefghijklmonpqrstuvwxyz",
displayNameLen: 0,
roleName: "zyxwvutsrqpnomlkjihgfedcba",
roleNameLen: 0,
usernameLen: 100,
separator: "_",
caseOp: KeepCase,
regex: "^v_abcdefghijklmonpqrstuvwxyz_zyxwvutsrqpnomlkjihgfedcba_[a-zA-Z0-9]{20}_[0-9]{1,23}$",
},
"zero max length": {
displayName: "abcdefghijklmonpqrstuvwxyz",
displayNameLen: 0,
roleName: "zyxwvutsrqpnomlkjihgfedcba",
roleNameLen: 0,
usernameLen: 0,
separator: "_",
caseOp: KeepCase,
regex: "^v_abcdefghijklmonpqrstuvwxyz_zyxwvutsrqpnomlkjihgfedcba_[a-zA-Z0-9]{20}_[0-9]+$",
},
"no display name": {
displayName: "abcdefghijklmonpqrstuvwxyz",
displayNameLen: NoneLength,
roleName: "zyxwvutsrqpnomlkjihgfedcba",
roleNameLen: 15,
usernameLen: 100,
separator: "_",
caseOp: KeepCase,
regex: "^v_zyxwvutsrqpnoml_[a-zA-Z0-9]{20}_[0-9]+$",
},
"no role name": {
displayName: "abcdefghijklmonpqrstuvwxyz",
displayNameLen: 15,
roleName: "zyxwvutsrqpnomlkjihgfedcba",
roleNameLen: NoneLength,
usernameLen: 100,
separator: "_",
caseOp: KeepCase,
regex: "^v_abcdefghijklmon_[a-zA-Z0-9]{20}_[0-9]+$",
},
}
for name, test := range tests {
t.Run(name, func(t *testing.T) {
re := regexp.MustCompile(test.regex)
username, err := GenerateUsername(
DisplayName(test.displayName, test.displayNameLen),
RoleName(test.roleName, test.roleNameLen),
Separator(test.separator),
MaxLength(test.usernameLen),
Case(test.caseOp),
)
if err != nil {
t.Fatalf("no error expected, got: %s", err)
}
if !re.MatchString(username) {
t.Fatalf("username %q does not match regex %q", username, test.regex)
}
})
}
}