package db
import (
"bytes"
"context"
"errors"
"testing"
"go.bigb.es/sourcehut-dolt/core"
)
func TestDoltKeyLifecycle(t *testing.T) {
s, db, cleanup := newTestStore(t)
defer cleanup()
ctx := context.Background()
uid := insertUser(t, db, 1, "alice", core.UserTypeUser)
pub := bytes.Repeat([]byte{0xab}, 32)
key, err := s.InsertKey(ctx, uid, "kid-one", pub, "laptop")
if err != nil {
t.Fatalf("insert key: %v", err)
}
if key.ID == 0 {
t.Fatal("expected non-zero key id")
}
// Duplicate kid → ErrKeyExists.
if _, err := s.InsertKey(ctx, uid, "kid-one", pub, "dup"); !errors.Is(err, ErrKeyExists) {
t.Fatalf("expected ErrKeyExists, got %v", err)
}
// KeyByKID returns pubkey + user identity for authn.
ka, err := s.KeyByKID(ctx, "kid-one")
if err != nil {
t.Fatalf("key by kid: %v", err)
}
if ka.UserID != uid || ka.Username != "alice" || ka.UserType != core.UserTypeUser {
t.Fatalf("unexpected key auth identity: %+v", ka)
}
if !bytes.Equal(ka.PubKey, pub) {
t.Fatalf("pubkey mismatch: %x", ka.PubKey)
}
// Missing kid → ErrNotFound.
if _, err := s.KeyByKID(ctx, "absent"); !errors.Is(err, ErrNotFound) {
t.Fatalf("expected ErrNotFound, got %v", err)
}
// TouchKeyLastUsed sets last_used.
if err := s.TouchKeyLastUsed(ctx, "kid-one"); err != nil {
t.Fatalf("touch: %v", err)
}
keys, err := s.ListKeysByUser(ctx, uid)
if err != nil {
t.Fatalf("list keys: %v", err)
}
if len(keys) != 1 || keys[0].Comment != "laptop" || keys[0].LastUsed == nil {
t.Fatalf("unexpected keys after touch: %+v", keys)
}
// Touching an absent kid → ErrNotFound.
if err := s.TouchKeyLastUsed(ctx, "absent"); !errors.Is(err, ErrNotFound) {
t.Fatalf("expected ErrNotFound touching absent, got %v", err)
}
// DeleteKey is scoped by user: wrong user cannot delete.
if err := s.DeleteKey(ctx, key.ID, 999); !errors.Is(err, ErrNotFound) {
t.Fatalf("expected ErrNotFound deleting other user's key, got %v", err)
}
if err := s.DeleteKey(ctx, key.ID, uid); err != nil {
t.Fatalf("delete own key: %v", err)
}
keys, err = s.ListKeysByUser(ctx, uid)
if err != nil {
t.Fatalf("list after delete: %v", err)
}
if len(keys) != 0 {
t.Fatalf("expected no keys after delete, got %d", len(keys))
}
}