forked from alterminal/alterminal
58 lines
1.4 KiB
Go
58 lines
1.4 KiB
Go
package main
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestSetAndCheckPassword(t *testing.T) {
|
|
u := &User{}
|
|
if err := u.SetPassword("correct horse battery staple"); err != nil {
|
|
t.Fatal("SetPassword: ", err)
|
|
}
|
|
if u.PasswordHash == "" || strings.Contains(u.PasswordHash, "correct horse") {
|
|
t.Fatalf("密碼不應以明文儲存: %q", u.PasswordHash)
|
|
}
|
|
if !u.CheckPassword("correct horse battery staple") {
|
|
t.Error("正確密碼應驗證成功")
|
|
}
|
|
if u.CheckPassword("Tr0ub4dor&3") {
|
|
t.Error("錯誤密碼不應驗證成功")
|
|
}
|
|
}
|
|
|
|
func TestSetPasswordUsesRandomSalt(t *testing.T) {
|
|
a, b := &User{}, &User{}
|
|
if err := a.SetPassword("same password"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := b.SetPassword("same password"); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if a.PasswordHash == b.PasswordHash {
|
|
t.Error("相同密碼應因隨機 salt 產生不同雜湊")
|
|
}
|
|
}
|
|
|
|
func TestCheckPasswordMalformedHash(t *testing.T) {
|
|
for _, hash := range []string{"", "not-a-phc-hash", "$argon2id$v=19$incomplete"} {
|
|
u := &User{PasswordHash: hash}
|
|
if u.CheckPassword("whatever") {
|
|
t.Errorf("格式無效的雜湊 %q 不應驗證成功", hash)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestRoleValid(t *testing.T) {
|
|
for _, r := range []Role{RoleAdmin, RoleUser} {
|
|
if !r.valid() {
|
|
t.Errorf("Role(%q).valid() = false, want true", r)
|
|
}
|
|
}
|
|
for _, r := range []Role{"", "Admin", "superuser", "root"} {
|
|
if r.valid() {
|
|
t.Errorf("Role(%q).valid() = true, want false", r)
|
|
}
|
|
}
|
|
}
|