@@ -18,6 +18,7 @@ import (
18
18
"github.com/coder/coder/v2/coderd/database"
19
19
"github.com/coder/coder/v2/coderd/database/dbauthz"
20
20
"github.com/coder/coder/v2/coderd/database/dbtestutil"
21
+ "github.com/coder/coder/v2/coderd/database/dbtime"
21
22
"github.com/coder/coder/v2/coderd/util/slice"
22
23
"github.com/coder/coder/v2/codersdk"
23
24
"github.com/coder/coder/v2/codersdk/agentsdk"
@@ -269,19 +270,39 @@ func TestTasks(t *testing.T) {
269
270
t .Run ("Get" ,func (t * testing.T ) {
270
271
t .Parallel ()
271
272
272
- client := coderdtest .New (t ,& coderdtest.Options {IncludeProvisionerDaemon :true })
273
- user := coderdtest .CreateFirstUser (t ,client )
274
- ctx := testutil .Context (t ,testutil .WaitLong )
275
-
276
- template := createAITemplate (t ,client ,user )
273
+ var (
274
+ client ,db = coderdtest .NewWithDatabase (t ,& coderdtest.Options {IncludeProvisionerDaemon :true })
275
+ ctx = testutil .Context (t ,testutil .WaitLong )
276
+ user = coderdtest .CreateFirstUser (t ,client )
277
+ template = createAITemplate (t ,client ,user )
278
+ // Create a workspace (task) with a specific prompt.
279
+ wantPrompt = "review my code"
280
+ workspace = coderdtest .CreateWorkspace (t ,client ,template .ID ,func (req * codersdk.CreateWorkspaceRequest ) {
281
+ req .RichParameterValues = []codersdk.WorkspaceBuildParameter {
282
+ {Name :codersdk .AITaskPromptParameterName ,Value :wantPrompt },
283
+ }
284
+ })
285
+ )
277
286
278
- // Create a workspace (task) with a specific prompt.
279
- wantPrompt := "review my code"
280
- workspace := coderdtest .CreateWorkspace (t ,client ,template .ID ,func (req * codersdk.CreateWorkspaceRequest ) {
281
- req .RichParameterValues = []codersdk.WorkspaceBuildParameter {
282
- {Name :codersdk .AITaskPromptParameterName ,Value :wantPrompt },
283
- }
287
+ coderdtest .AwaitWorkspaceBuildJobCompleted (t ,client ,workspace .LatestBuild .ID )
288
+ ws := coderdtest .MustWorkspace (t ,client ,workspace .ID )
289
+ // Assert invariant: the workspace has exactly one resource with one agent with one app.
290
+ require .Len (t ,ws .LatestBuild .Resources ,1 )
291
+ require .Len (t ,ws .LatestBuild .Resources [0 ].Agents ,1 )
292
+ agentID := ws .LatestBuild .Resources [0 ].Agents [0 ].ID
293
+ taskAppID := ws .LatestBuild .Resources [0 ].Agents [0 ].Apps [0 ].ID
294
+
295
+ // Insert an app status for the workspace
296
+ _ ,err := db .InsertWorkspaceAppStatus (dbauthz .AsSystemRestricted (ctx ), database.InsertWorkspaceAppStatusParams {
297
+ ID :uuid .New (),
298
+ WorkspaceID :workspace .ID ,
299
+ CreatedAt :dbtime .Now (),
300
+ AgentID :agentID ,
301
+ AppID :taskAppID ,
302
+ State :database .WorkspaceAppStatusStateComplete ,
303
+ Message :"all done" ,
284
304
})
305
+ require .NoError (t ,err )
285
306
286
307
// Fetch the task by ID via experimental API and verify fields.
287
308
exp := codersdk .NewExperimentalClient (client )
@@ -293,6 +314,24 @@ func TestTasks(t *testing.T) {
293
314
assert .Equal (t ,wantPrompt ,task .InitialPrompt ,"task prompt should match the AI Prompt parameter" )
294
315
assert .Equal (t ,workspace .ID ,task .WorkspaceID .UUID ,"workspace id should match" )
295
316
assert .NotEmpty (t ,task .Status ,"task status should not be empty" )
317
+
318
+ // Stop the workspace
319
+ coderdtest .MustTransitionWorkspace (t ,client ,workspace .ID ,codersdk .WorkspaceTransitionStart ,codersdk .WorkspaceTransitionStop )
320
+
321
+ // Verify that the previous status still remains
322
+ updated ,err := exp .TaskByID (ctx ,workspace .ID )
323
+ require .NoError (t ,err )
324
+ assert .NotNil (t ,updated .CurrentState ,"current state should not be nil" )
325
+ assert .Equal (t ,"all done" ,updated .CurrentState .Message )
326
+ assert .Equal (t ,codersdk .TaskStateComplete ,updated .CurrentState .State )
327
+
328
+ // Start the workspace again
329
+ coderdtest .MustTransitionWorkspace (t ,client ,workspace .ID ,codersdk .WorkspaceTransitionStop ,codersdk .WorkspaceTransitionStart )
330
+
331
+ // Verify that the status from the previous build is no longer present
332
+ updated ,err = exp .TaskByID (ctx ,workspace .ID )
333
+ require .NoError (t ,err )
334
+ assert .Nil (t ,updated .CurrentState ,"current state should be nil" )
296
335
})
297
336
298
337
t .Run ("Delete" ,func (t * testing.T ) {