add tests
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"testing"
|
||||
|
||||
"github.com/vaultdrop/backend/pkg/passwd"
|
||||
"github.com/vaultdrop/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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user