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)) } }