(t *testing.T)
| 5681 | } |
| 5682 | |
| 5683 | func TestHeartbeatNoWorkspaceNoBump(t *testing.T) { |
| 5684 | t.Parallel() |
| 5685 | |
| 5686 | db, ps := dbtestutil.NewDB(t) |
| 5687 | |
| 5688 | ctx := testutil.Context(t, testutil.WaitLong) |
| 5689 | user, org, model := seedChatDependencies(t, db) |
| 5690 | setOpenAIProviderBaseURL(ctx, t, db, chattest.NewOpenAI(t, func(req *chattest.OpenAIRequest) chattest.OpenAIResponse { |
| 5691 | if !req.Stream { |
| 5692 | return chattest.OpenAINonStreamingResponse("ok") |
| 5693 | } |
| 5694 | chunks := make(chan chattest.OpenAIChunk) |
| 5695 | go func() { |
| 5696 | defer close(chunks) |
| 5697 | <-req.Context().Done() |
| 5698 | }() |
| 5699 | return chattest.OpenAIResponse{StreamingChunks: chunks} |
| 5700 | })) |
| 5701 | |
| 5702 | // Set up UsageTracker with manual tick/flush. |
| 5703 | usageTickCh := make(chan time.Time) |
| 5704 | flushCh := make(chan int, 1) |
| 5705 | tracker := workspacestats.NewTracker(db, |
| 5706 | workspacestats.TrackerWithTickFlush(usageTickCh, flushCh), |
| 5707 | workspacestats.TrackerWithLogger(slogtest.Make(t, nil)), |
| 5708 | ) |
| 5709 | t.Cleanup(func() { tracker.Close() }) |
| 5710 | |
| 5711 | logger := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true}) |
| 5712 | server := chatd.New(chatd.Config{ |
| 5713 | Logger: logger, |
| 5714 | Database: db, |
| 5715 | ReplicaID: uuid.New(), |
| 5716 | Pubsub: ps, |
| 5717 | PendingChatAcquireInterval: 10 * time.Millisecond, |
| 5718 | InFlightChatStaleAfter: testutil.WaitLong, |
| 5719 | ChatHeartbeatInterval: 100 * time.Millisecond, |
| 5720 | }) |
| 5721 | server.Start() |
| 5722 | t.Cleanup(func() { |
| 5723 | require.NoError(t, server.Close()) |
| 5724 | }) |
| 5725 | |
| 5726 | // Create a chat WITHOUT linking a workspace. |
| 5727 | chat, err := server.CreateChat(ctx, chatd.CreateOptions{ |
| 5728 | OrganizationID: org.ID, |
| 5729 | OwnerID: user.ID, |
| 5730 | Title: "no-workspace-test", |
| 5731 | ModelConfigID: model.ID, |
| 5732 | InitialUserContent: []codersdk.ChatMessagePart{codersdk.ChatMessageText("hello")}, |
| 5733 | }) |
| 5734 | require.NoError(t, err) |
| 5735 | |
| 5736 | // Wait for the chat to be acquired and at least one heartbeat |
| 5737 | // to fire. |
| 5738 | testutil.Eventually(ctx, t, func(ctx context.Context) bool { |
| 5739 | fromDB, listErr := db.GetChatByID(ctx, chat.ID) |
| 5740 | if listErr != nil { |
nothing calls this directly
no test coverage detected