Gitfed
bastien-mrq/gitfed / internal / store / auth_test.go
package store

import (
	"path/filepath"
	"testing"
	"time"
)

func TestPasswordHashRequiresExistingUser(t *testing.T) {
	s, err := Open(filepath.Join(t.TempDir(), "gitfed.db"))
	if err != nil {
		t.Fatalf("open: %v", err)
	}
	defer s.Close()

	if err := s.SetPasswordHash("nobody", "hash"); err != ErrNotFound {
		t.Fatalf("SetPasswordHash for nonexistent user: got %v, want ErrNotFound", err)
	}

	if err := s.CreateUser(User{Username: "alice"}); err != nil {
		t.Fatalf("create user: %v", err)
	}
	if err := s.SetPasswordHash("alice", "hash123"); err != nil {
		t.Fatalf("SetPasswordHash: %v", err)
	}
	got, err := s.GetPasswordHash("alice")
	if err != nil {
		t.Fatalf("GetPasswordHash: %v", err)
	}
	if got != "hash123" {
		t.Fatalf("got hash %q, want %q", got, "hash123")
	}
}

func TestSessionLifecycle(t *testing.T) {
	s, err := Open(filepath.Join(t.TempDir(), "gitfed.db"))
	if err != nil {
		t.Fatalf("open: %v", err)
	}
	defer s.Close()

	token, err := s.CreateSession("alice@local.test", "alice", true, time.Hour)
	if err != nil {
		t.Fatalf("CreateSession: %v", err)
	}
	if token == "" {
		t.Fatal("expected a non-empty token")
	}

	sess, err := s.GetSession(token)
	if err != nil {
		t.Fatalf("GetSession: %v", err)
	}
	if sess.Principal != "alice@local.test" || !sess.IsAdmin {
		t.Fatalf("unexpected session: %+v", sess)
	}

	if err := s.DeleteSession(token); err != nil {
		t.Fatalf("DeleteSession: %v", err)
	}
	if _, err := s.GetSession(token); err != ErrNotFound {
		t.Fatalf("GetSession after delete: got %v, want ErrNotFound", err)
	}
}

func TestSessionExpiry(t *testing.T) {
	s, err := Open(filepath.Join(t.TempDir(), "gitfed.db"))
	if err != nil {
		t.Fatalf("open: %v", err)
	}
	defer s.Close()

	token, err := s.CreateSession("alice@local.test", "alice", false, -time.Second)
	if err != nil {
		t.Fatalf("CreateSession: %v", err)
	}
	if _, err := s.GetSession(token); err != ErrNotFound {
		t.Fatalf("GetSession on expired token: got %v, want ErrNotFound", err)
	}
}