refactor: add dbgen chat generators and migrate test boilerplate (#24497)

- Adds chat-related dbgen generators covering defaults, overrides, and message field mapping.
- Replaces raw single-row chat, message, provider, and model-config setup in tests with dbgen helpers.
- Simplifies chat seed helpers after moving fixture setup into dbgen.

> Generated with [Coder Agents](https://coder.com/agents).
This commit is contained in:
Cian Johnston
2026-05-01 13:29:33 +01:00
committed by GitHub
parent 6ee5fe983c
commit 2f855904be
25 changed files with 1586 additions and 2316 deletions
+35 -70
View File
@@ -39,7 +39,7 @@ func TestService_IsEnabled(t *testing.T) {
ctx := testutil.Context(t, testutil.WaitLong)
db, _, _ := dbtestutil.NewDBWithSQLDB(t)
_, owner, chat, model := seedChat(ctx, t, db)
_, owner, chat, model := seedChat(t, db)
require.NotEqual(t, uuid.Nil, model.ID)
svc := chatdebug.NewService(db, testutil.Logger(t), nil)
@@ -77,7 +77,7 @@ func TestService_IsEnabled_AlwaysEnable(t *testing.T) {
ctx := testutil.Context(t, testutil.WaitLong)
db, _, _ := dbtestutil.NewDBWithSQLDB(t)
_, owner, chat, model := seedChat(ctx, t, db)
_, owner, chat, model := seedChat(t, db)
require.NotEqual(t, uuid.Nil, model.ID)
svc := chatdebug.NewService(db, testutil.Logger(t), nil, chatdebug.WithAlwaysEnable(true))
@@ -98,11 +98,11 @@ func TestService_CreateRun(t *testing.T) {
t.Parallel()
fixture := newFixture(t)
rootChat := insertChat(fixture.ctx, t, fixture.db, fixture.org.ID, fixture.owner.ID, fixture.model.ID)
parentChat := insertChat(fixture.ctx, t, fixture.db, fixture.org.ID, fixture.owner.ID, fixture.model.ID)
triggerMsg := insertMessage(fixture.ctx, t, fixture.db, fixture.chat.ID,
rootChat := insertChat(t, fixture.db, fixture.org.ID, fixture.owner.ID, fixture.model.ID)
parentChat := insertChat(t, fixture.db, fixture.org.ID, fixture.owner.ID, fixture.model.ID)
triggerMsg := insertMessage(t, fixture.db, fixture.chat.ID,
fixture.owner.ID, fixture.model.ID, database.ChatMessageRoleUser, "trigger")
historyTipMsg := insertMessage(fixture.ctx, t, fixture.db, fixture.chat.ID,
historyTipMsg := insertMessage(t, fixture.db, fixture.chat.ID,
fixture.owner.ID, fixture.model.ID, database.ChatMessageRoleAssistant,
"history-tip")
@@ -279,7 +279,7 @@ func TestService_CreateStep(t *testing.T) {
fixture := newFixture(t)
run := createRun(t, fixture)
historyTipMsg := insertMessage(fixture.ctx, t, fixture.db, fixture.chat.ID,
historyTipMsg := insertMessage(t, fixture.db, fixture.chat.ID,
fixture.owner.ID, fixture.model.ID, database.ChatMessageRoleAssistant,
"history-tip")
@@ -424,7 +424,7 @@ func TestService_CreateStep_ChatIDMismatchReportsNotFound(t *testing.T) {
// attach a step to the existing run using the wrong chat_id.
// The insert's locked_run WHERE fails on chat_id, producing
// sql.ErrNoRows; classifyMissingRun must report not-found.
otherChat := insertChat(fixture.ctx, t, fixture.db, fixture.org.ID,
otherChat := insertChat(t, fixture.db, fixture.org.ID,
fixture.owner.ID, fixture.model.ID)
_, err := fixture.svc.CreateStep(fixture.ctx, chatdebug.CreateStepParams{
@@ -454,7 +454,7 @@ func TestService_UpdateStep(t *testing.T) {
})
require.NoError(t, err)
assistantMsg := insertMessage(fixture.ctx, t, fixture.db, fixture.chat.ID,
assistantMsg := insertMessage(t, fixture.db, fixture.chat.ID,
fixture.owner.ID, fixture.model.ID, database.ChatMessageRoleAssistant,
"assistant")
finishedAt := time.Now().UTC().Round(time.Microsecond)
@@ -598,12 +598,12 @@ func TestService_DeleteAfterMessageID(t *testing.T) {
t.Parallel()
fixture := newFixture(t)
low := insertMessage(fixture.ctx, t, fixture.db, fixture.chat.ID, fixture.owner.ID,
low := insertMessage(t, fixture.db, fixture.chat.ID, fixture.owner.ID,
fixture.model.ID, database.ChatMessageRoleAssistant, "low")
threshold := insertMessage(fixture.ctx, t, fixture.db, fixture.chat.ID,
threshold := insertMessage(t, fixture.db, fixture.chat.ID,
fixture.owner.ID, fixture.model.ID, database.ChatMessageRoleAssistant,
"threshold")
high := insertMessage(fixture.ctx, t, fixture.db, fixture.chat.ID, fixture.owner.ID,
high := insertMessage(t, fixture.db, fixture.chat.ID, fixture.owner.ID,
fixture.model.ID, database.ChatMessageRoleAssistant, "high")
require.Less(t, low.ID, threshold.ID)
require.Less(t, threshold.ID, high.ID)
@@ -685,7 +685,7 @@ func TestService_FinalizeStale(t *testing.T) {
ctx := testutil.Context(t, testutil.WaitLong)
db, _ := dbtestutil.NewDB(t)
_, owner, chat, model := seedChat(ctx, t, db)
_, owner, chat, model := seedChat(t, db)
require.NotEqual(t, uuid.Nil, owner.ID)
staleTime := time.Now().Add(-10 * time.Minute).UTC().Round(time.Microsecond)
@@ -733,7 +733,7 @@ func TestService_FinalizeStale_BroadcastsFinalizeEvent(t *testing.T) {
ctx := testutil.Context(t, testutil.WaitLong)
db, _ := dbtestutil.NewDB(t)
_, owner, chat, model := seedChat(ctx, t, db)
_, owner, chat, model := seedChat(t, db)
require.NotEqual(t, uuid.Nil, owner.ID)
staleTime := time.Now().Add(-10 * time.Minute).UTC().Round(time.Microsecond)
@@ -796,7 +796,7 @@ func TestService_FinalizeStale_NoChangesDoesNotBroadcast(t *testing.T) {
ctx := testutil.Context(t, testutil.WaitLong)
db, _ := dbtestutil.NewDB(t)
_, owner, chat, _ := seedChat(ctx, t, db)
_, owner, chat, _ := seedChat(t, db)
require.NotEqual(t, uuid.Nil, owner.ID)
memoryPubsub := dbpubsub.NewInMemory()
@@ -1018,7 +1018,7 @@ func TestService_PublishesEvents(t *testing.T) {
ctx := testutil.Context(t, testutil.WaitLong)
db, _ := dbtestutil.NewDB(t)
_, owner, chat, model := seedChat(ctx, t, db)
_, owner, chat, model := seedChat(t, db)
require.NotEqual(t, uuid.Nil, owner.ID)
memoryPubsub := dbpubsub.NewInMemory()
@@ -1069,7 +1069,7 @@ func newFixture(t *testing.T) testFixture {
ctx := testutil.Context(t, testutil.WaitLong)
db, _ := dbtestutil.NewDB(t)
org, owner, chat, model := seedChat(ctx, t, db)
org, owner, chat, model := seedChat(t, db)
return testFixture{
ctx: ctx,
db: db,
@@ -1082,7 +1082,6 @@ func newFixture(t *testing.T) testFixture {
}
func seedChat(
ctx context.Context,
t *testing.T,
db database.Store,
) (database.Organization, database.User, database.Chat, database.ChatModelConfig) {
@@ -1091,38 +1090,21 @@ func seedChat(
org := dbgen.Organization(t, db, database.Organization{})
owner := dbgen.User(t, db, database.User{})
providerName := "openai"
_, err := db.InsertChatProvider(ctx, database.InsertChatProviderParams{
Provider: providerName,
DisplayName: "OpenAI",
APIKey: "test-key",
CreatedBy: uuid.NullUUID{UUID: owner.ID, Valid: true},
Enabled: true,
CentralApiKeyEnabled: true,
dbgen.ChatProvider(t, db, database.ChatProvider{
Provider: providerName,
DisplayName: "OpenAI",
})
require.NoError(t, err)
model, err := db.InsertChatModelConfig(ctx,
database.InsertChatModelConfigParams{
Provider: providerName,
Model: "model-" + uuid.NewString(),
DisplayName: "Test Model",
CreatedBy: uuid.NullUUID{UUID: owner.ID, Valid: true},
UpdatedBy: uuid.NullUUID{UUID: owner.ID, Valid: true},
Enabled: true,
IsDefault: true,
ContextLimit: 128000,
CompressionThreshold: 70,
Options: json.RawMessage(`{}`),
},
)
require.NoError(t, err)
model := dbgen.ChatModelConfig(t, db, database.ChatModelConfig{
Model: "model-" + uuid.NewString(),
IsDefault: true,
})
chat := insertChat(ctx, t, db, org.ID, owner.ID, model.ID)
chat := insertChat(t, db, org.ID, owner.ID, model.ID)
return org, owner, chat, model
}
func insertChat(
ctx context.Context,
t *testing.T,
db database.Store,
orgID uuid.UUID,
@@ -1131,20 +1113,16 @@ func insertChat(
) database.Chat {
t.Helper()
chat, err := db.InsertChat(ctx, database.InsertChatParams{
chat := dbgen.Chat(t, db, database.Chat{
OrganizationID: orgID,
Status: database.ChatStatusWaiting,
ClientType: database.ChatClientTypeUi,
OwnerID: ownerID,
LastModelConfigID: modelID,
Title: "chat-" + uuid.NewString(),
})
require.NoError(t, err)
return chat
}
func insertMessage(
ctx context.Context,
t *testing.T,
db database.Store,
chatID uuid.UUID,
@@ -1160,29 +1138,16 @@ func insertMessage(
})
require.NoError(t, err)
messages, err := db.InsertChatMessages(ctx, database.InsertChatMessagesParams{
ChatID: chatID,
CreatedBy: []uuid.UUID{createdBy},
ModelConfigID: []uuid.UUID{modelID},
Role: []database.ChatMessageRole{role},
Content: []string{string(parts.RawMessage)},
ContentVersion: []int16{chatprompt.CurrentContentVersion},
Visibility: []database.ChatMessageVisibility{database.ChatMessageVisibilityBoth},
InputTokens: []int64{0},
OutputTokens: []int64{0},
TotalTokens: []int64{0},
ReasoningTokens: []int64{0},
CacheCreationTokens: []int64{0},
CacheReadTokens: []int64{0},
ContextLimit: []int64{0},
Compressed: []bool{false},
TotalCostMicros: []int64{0},
RuntimeMs: []int64{0},
ProviderResponseID: []string{""},
msg := dbgen.ChatMessage(t, db, database.ChatMessage{
ChatID: chatID,
CreatedBy: uuid.NullUUID{UUID: createdBy, Valid: true},
ModelConfigID: uuid.NullUUID{UUID: modelID, Valid: true},
Role: role,
Content: parts,
ContentVersion: chatprompt.CurrentContentVersion,
ProviderResponseID: sql.NullString{},
})
require.NoError(t, err)
require.Len(t, messages, 1)
return messages[0]
return msg
}
func createRun(t *testing.T, fixture testFixture) database.ChatDebugRun {