88 lines
2.4 KiB
Go
88 lines
2.4 KiB
Go
package service
|
|
|
|
import (
|
|
"errors"
|
|
"testing"
|
|
|
|
"github.com/kazier/backend/pkg/passwd"
|
|
"github.com/kazier/backend/repository"
|
|
)
|
|
|
|
func TestEnsureAdminCreatesFirstAdmin(t *testing.T) {
|
|
s := newServiceStore(t)
|
|
repo := s.Repository
|
|
|
|
if err := EnsureAdmin(repo, " Admin ", "admin-secret-123"); err != nil {
|
|
t.Fatalf("EnsureAdmin: %v", err)
|
|
}
|
|
|
|
user, err := repo.Users.GetByUsernameNormalized("admin")
|
|
if err != nil {
|
|
t.Fatalf("admin non trouvé: %v", err)
|
|
}
|
|
if !user.IsAdmin {
|
|
t.Error("le compte créé doit être admin")
|
|
}
|
|
if user.UsernameNormalized != "admin" || user.Username != "admin" {
|
|
t.Errorf("identité anormale: %+v", user)
|
|
}
|
|
if err := passwd.Verify("admin-secret-123", user.PasswordHash); err != nil {
|
|
t.Errorf("le mot de passe doit vérifier: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestNormalizeUsername(t *testing.T) {
|
|
cases := map[string]string{
|
|
" admin ": "admin",
|
|
" Alice": "alice",
|
|
"A B C": "a b c",
|
|
"": "",
|
|
" ": "",
|
|
}
|
|
for in, want := range cases {
|
|
if got := NormalizeUsername(in); got != want {
|
|
t.Errorf("NormalizeUsername(%q) = %q, attendu %q", in, got, want)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestEnsureAdminRefusesOnEmptyDBWithoutEnv(t *testing.T) {
|
|
s := newServiceStore(t)
|
|
|
|
err := EnsureAdmin(s.Repository, "", "")
|
|
if !errors.Is(err, ErrAdminRequired) {
|
|
t.Errorf("env absent : attendu ErrAdminRequired, got %v", err)
|
|
}
|
|
|
|
err = EnsureAdmin(s.Repository, " ", "some-password")
|
|
if !errors.Is(err, ErrAdminRequired) {
|
|
t.Errorf("username blanc : attendu ErrAdminRequired, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestEnsureAdminNeverOverwritesExistingAccounts(t *testing.T) {
|
|
s := newServiceStore(t)
|
|
repo := s.Repository
|
|
|
|
// La base n'est PAS vide → l'env ne doit rien créer, même avec des valeurs.
|
|
if _, err := repo.Users.Create("alice", "alice", "existing-hash", false); err != nil {
|
|
t.Fatalf("seed user: %v", err)
|
|
}
|
|
|
|
if err := EnsureAdmin(repo, "ADMIN", "would-be-admin-secret"); err != nil {
|
|
t.Fatalf("EnsureAdmin sur base non vide : %v", err)
|
|
}
|
|
|
|
// Aucun admin n'a été ajouté, l'existant est intact.
|
|
if _, err := repo.Users.GetByUsernameNormalized("admin"); !errors.Is(err, repository.ErrNotFound) {
|
|
t.Errorf("admin ne doit pas exister sur base non vide (err=%v)", err)
|
|
}
|
|
alice, err := repo.Users.GetByUsernameNormalized("alice")
|
|
if err != nil {
|
|
t.Fatalf("alice doit être intacte: %v", err)
|
|
}
|
|
if alice.PasswordHash != "existing-hash" || alice.IsAdmin {
|
|
t.Errorf("l'existant doit être préservé: %+v", alice)
|
|
}
|
|
}
|