Skip to content

Commit bcd8b04

Browse files
committed
Improve tests intention
1 parent 5abc511 commit bcd8b04

File tree

1 file changed

+149
-91
lines changed

1 file changed

+149
-91
lines changed

coderd/workspacebuilds_test.go

Lines changed: 149 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1216,6 +1216,32 @@ func TestWorkspaceBuildTimings(t *testing.T) {
12161216
CreatedBy: owner.UserID,
12171217
})
12181218

1219+
// Create a build to attach timings
1220+
makeBuild := func() database.WorkspaceBuild {
1221+
ws := dbgen.Workspace(t, db, database.Workspace{
1222+
OwnerID: owner.UserID,
1223+
OrganizationID: owner.OrganizationID,
1224+
TemplateID: template.ID,
1225+
// Generate unique name for the workspace
1226+
Name: "test-workspace-" + uuid.New().String(),
1227+
})
1228+
jobID := uuid.New()
1229+
job := dbgen.ProvisionerJob(t, db, pubsub, database.ProvisionerJob{
1230+
ID: jobID,
1231+
OrganizationID: owner.OrganizationID,
1232+
Type: database.ProvisionerJobTypeWorkspaceBuild,
1233+
Tags: database.StringMap{jobID.String(): "true"},
1234+
})
1235+
return dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{
1236+
WorkspaceID: ws.ID,
1237+
TemplateVersionID: version.ID,
1238+
BuildNumber: 1,
1239+
Transition: database.WorkspaceTransitionStart,
1240+
InitiatorID: owner.UserID,
1241+
JobID: job.ID,
1242+
})
1243+
}
1244+
12191245
makeProvisionerTimings := func(build database.WorkspaceBuild, count int) []database.ProvisionerJobTiming {
12201246
// Use the database.ProvisionerJobTiming struct to mock timings data instead
12211247
// of directly creating database.InsertProvisionerJobTimingsParams. This
@@ -1250,8 +1276,86 @@ func TestWorkspaceBuildTimings(t *testing.T) {
12501276
return dbgen.ProvisionerJobTimings(t, db, insertParams)
12511277
}
12521278

1253-
makeAgentScriptTimings := func(build database.WorkspaceBuild, count int) []database.WorkspaceAgentScriptTiming {
1254-
// Create a resource, agent, and script to test the timing of agent scripts
1279+
makeAgentScriptTimings := func(script database.WorkspaceAgentScript, count int) []database.WorkspaceAgentScriptTiming {
1280+
newTimings := make([]database.InsertWorkspaceAgentScriptTimingsParams, count)
1281+
now := time.Now()
1282+
for i := range count {
1283+
startedAt := now.Add(-time.Hour + time.Duration(i)*time.Minute)
1284+
endedAt := startedAt.Add(time.Minute)
1285+
newTimings[i] = database.InsertWorkspaceAgentScriptTimingsParams{
1286+
StartedAt: startedAt,
1287+
EndedAt: endedAt,
1288+
Stage: database.WorkspaceAgentScriptTimingStageStart,
1289+
ScriptID: script.ID,
1290+
ExitCode: 0,
1291+
Status: database.WorkspaceAgentScriptTimingStatusOk,
1292+
}
1293+
}
1294+
1295+
timings := make([]database.WorkspaceAgentScriptTiming, 0)
1296+
for _, newTiming := range newTimings {
1297+
timing := dbgen.WorkspaceAgentScriptTiming(t, db, newTiming)
1298+
timings = append(timings, timing)
1299+
}
1300+
1301+
return timings
1302+
}
1303+
1304+
t.Run("NonExistentBuild", func(t *testing.T) {
1305+
t.Parallel()
1306+
1307+
// When: fetching an inexistent build
1308+
buildID := uuid.New()
1309+
_, err := client.WorkspaceBuildTimings(context.Background(), buildID)
1310+
1311+
// Then: expect a not found error
1312+
require.Error(t, err)
1313+
require.Contains(t, err.Error(), "not found")
1314+
})
1315+
1316+
t.Run("EmptyTimings", func(t *testing.T) {
1317+
t.Parallel()
1318+
1319+
// When: fetching timings for a build with no timings
1320+
build := makeBuild()
1321+
res, err := client.WorkspaceBuildTimings(context.Background(), build.ID)
1322+
1323+
// Then: return a response with empty timings
1324+
require.NoError(t, err)
1325+
require.Empty(t, res.ProvisionerTimings)
1326+
require.Empty(t, res.AgentScriptTimings)
1327+
})
1328+
1329+
t.Run("ProvisionerTimings", func(t *testing.T) {
1330+
t.Parallel()
1331+
1332+
// When: fetching timings for a build with provisioner timings
1333+
build := makeBuild()
1334+
provisionerTimings := makeProvisionerTimings(build, 5)
1335+
1336+
// Then: return a response with the expected timings
1337+
res, err := client.WorkspaceBuildTimings(context.Background(), build.ID)
1338+
require.NoError(t, err)
1339+
require.Len(t, res.ProvisionerTimings, 5)
1340+
1341+
for i := range res.ProvisionerTimings {
1342+
timingRes := res.ProvisionerTimings[i]
1343+
genTiming := provisionerTimings[i]
1344+
require.Equal(t, genTiming.Resource, timingRes.Resource)
1345+
require.Equal(t, genTiming.Action, timingRes.Action)
1346+
require.Equal(t, string(genTiming.Stage), timingRes.Stage)
1347+
require.Equal(t, genTiming.JobID.String(), timingRes.JobID.String())
1348+
require.Equal(t, genTiming.Source, timingRes.Source)
1349+
require.Equal(t, genTiming.StartedAt.UnixMilli(), timingRes.StartedAt.UnixMilli())
1350+
require.Equal(t, genTiming.EndedAt.UnixMilli(), timingRes.EndedAt.UnixMilli())
1351+
}
1352+
})
1353+
1354+
t.Run("AgentScriptTimings", func(t *testing.T) {
1355+
t.Parallel()
1356+
1357+
// When: fetching timings for a build with agent script timings
1358+
build := makeBuild()
12551359
resource := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{
12561360
JobID: build.JobID,
12571361
})
@@ -1276,101 +1380,55 @@ func TestWorkspaceBuildTimings(t *testing.T) {
12761380
uuid.New(),
12771381
},
12781382
})
1383+
agentScriptTimings := makeAgentScriptTimings(scripts[0], 5)
12791384

1280-
newTimings := make([]database.InsertWorkspaceAgentScriptTimingsParams, count)
1281-
now := time.Now()
1282-
for i := range count {
1283-
startedAt := now.Add(-time.Hour + time.Duration(i)*time.Minute)
1284-
endedAt := startedAt.Add(time.Minute)
1285-
newTimings[i] = database.InsertWorkspaceAgentScriptTimingsParams{
1286-
StartedAt: startedAt,
1287-
EndedAt: endedAt,
1288-
Stage: database.WorkspaceAgentScriptTimingStageStart,
1289-
ScriptID: scripts[0].ID,
1290-
ExitCode: 0,
1291-
Status: database.WorkspaceAgentScriptTimingStatusOk,
1292-
}
1385+
// Then: return a response with the expected timings
1386+
res, err := client.WorkspaceBuildTimings(context.Background(), build.ID)
1387+
require.NoError(t, err)
1388+
require.Len(t, res.AgentScriptTimings, 5)
1389+
1390+
for i := range res.AgentScriptTimings {
1391+
timingRes := res.AgentScriptTimings[i]
1392+
genTiming := agentScriptTimings[i]
1393+
require.Equal(t, genTiming.ExitCode, timingRes.ExitCode)
1394+
require.Equal(t, string(genTiming.Status), timingRes.Status)
1395+
require.Equal(t, string(genTiming.Stage), timingRes.Stage)
1396+
require.Equal(t, genTiming.StartedAt.UnixMilli(), timingRes.StartedAt.UnixMilli())
1397+
require.Equal(t, genTiming.EndedAt.UnixMilli(), timingRes.EndedAt.UnixMilli())
12931398
}
1399+
})
12941400

1295-
timings := make([]database.WorkspaceAgentScriptTiming, 0)
1296-
for _, newTiming := range newTimings {
1297-
timing := dbgen.WorkspaceAgentScriptTiming(t, db, newTiming)
1298-
timings = append(timings, timing)
1299-
}
1401+
t.Run("NoAgentScripts", func(t *testing.T) {
1402+
t.Parallel()
13001403

1301-
return timings
1302-
}
1404+
// When: fetching timings for a build with no agent scripts
1405+
build := makeBuild()
1406+
resource := dbgen.WorkspaceResource(t, db, database.WorkspaceResource{
1407+
JobID: build.JobID,
1408+
})
1409+
dbgen.WorkspaceAgent(t, db, database.WorkspaceAgent{
1410+
ResourceID: resource.ID,
1411+
})
13031412

1304-
// Given
1305-
testCases := []struct {
1306-
name string
1307-
provisionerTimings int
1308-
actionScriptTimings int
1309-
}{
1310-
{name: "with empty provisioner timings", provisionerTimings: 0},
1311-
{name: "with provisioner timings", provisionerTimings: 5},
1312-
{name: "with empty agent script timings", actionScriptTimings: 0},
1313-
{name: "with agent script timings", actionScriptTimings: 5},
1314-
}
1413+
// Then: return a response with empty agent script timings
1414+
res, err := client.WorkspaceBuildTimings(context.Background(), build.ID)
1415+
require.NoError(t, err)
1416+
require.Empty(t, res.AgentScriptTimings)
1417+
})
13151418

1316-
for _, tc := range testCases {
1317-
tc := tc
1318-
t.Run(tc.name, func(t *testing.T) {
1319-
t.Parallel()
1320-
1321-
// Create a build to attach provisioner timings
1322-
ws := dbgen.Workspace(t, db, database.Workspace{
1323-
OwnerID: owner.UserID,
1324-
OrganizationID: owner.OrganizationID,
1325-
TemplateID: template.ID,
1326-
// Generate unique name for the workspace
1327-
Name: "test-workspace-" + uuid.New().String(),
1328-
})
1329-
jobID := uuid.New()
1330-
job := dbgen.ProvisionerJob(t, db, pubsub, database.ProvisionerJob{
1331-
ID: jobID,
1332-
OrganizationID: owner.OrganizationID,
1333-
Type: database.ProvisionerJobTypeWorkspaceBuild,
1334-
Tags: database.StringMap{jobID.String(): "true"},
1335-
})
1336-
build := dbgen.WorkspaceBuild(t, db, database.WorkspaceBuild{
1337-
WorkspaceID: ws.ID,
1338-
TemplateVersionID: version.ID,
1339-
BuildNumber: 1,
1340-
Transition: database.WorkspaceTransitionStart,
1341-
InitiatorID: owner.UserID,
1342-
JobID: job.ID,
1343-
})
1344-
1345-
// Generate timings based on test config
1346-
genProvisionerTimings := makeProvisionerTimings(build, tc.provisionerTimings)
1347-
genAgentScriptTimings := makeAgentScriptTimings(build, tc.provisionerTimings)
1348-
1349-
res, err := client.WorkspaceBuildTimings(context.Background(), build.ID)
1350-
require.NoError(t, err)
1351-
require.Len(t, res.ProvisionerTimings, tc.provisionerTimings)
1352-
1353-
for i := range res.ProvisionerTimings {
1354-
timingRes := res.ProvisionerTimings[i]
1355-
genTiming := genProvisionerTimings[i]
1356-
require.Equal(t, genTiming.Resource, timingRes.Resource)
1357-
require.Equal(t, genTiming.Action, timingRes.Action)
1358-
require.Equal(t, string(genTiming.Stage), timingRes.Stage)
1359-
require.Equal(t, genTiming.JobID.String(), timingRes.JobID.String())
1360-
require.Equal(t, genTiming.Source, timingRes.Source)
1361-
require.Equal(t, genTiming.StartedAt.UnixMilli(), timingRes.StartedAt.UnixMilli())
1362-
require.Equal(t, genTiming.EndedAt.UnixMilli(), timingRes.EndedAt.UnixMilli())
1363-
}
1419+
// Some workspaces might not have agents. It is improbable, but possible.
1420+
t.Run("NoAgents", func(t *testing.T) {
1421+
t.Parallel()
13641422

1365-
for i := range res.AgentScriptTimings {
1366-
timingRes := res.AgentScriptTimings[i]
1367-
genTiming := genAgentScriptTimings[i]
1368-
require.Equal(t, genTiming.ExitCode, timingRes.ExitCode)
1369-
require.Equal(t, string(genTiming.Status), timingRes.Status)
1370-
require.Equal(t, string(genTiming.Stage), timingRes.Stage)
1371-
require.Equal(t, genTiming.StartedAt.UnixMilli(), timingRes.StartedAt.UnixMilli())
1372-
require.Equal(t, genTiming.EndedAt.UnixMilli(), timingRes.EndedAt.UnixMilli())
1373-
}
1423+
// When: fetching timings for a build with no agents
1424+
build := makeBuild()
1425+
dbgen.WorkspaceResource(t, db, database.WorkspaceResource{
1426+
JobID: build.JobID,
13741427
})
1375-
}
1428+
1429+
// Then: return a response with empty agent script timings
1430+
res, err := client.WorkspaceBuildTimings(context.Background(), build.ID)
1431+
require.NoError(t, err)
1432+
require.Empty(t, res.AgentScriptTimings)
1433+
})
13761434
}

0 commit comments

Comments
 (0)