Skip to content

Commit 6afb914

Browse files
committed
Test parameter usage
1 parent e605a15 commit 6afb914

File tree

2 files changed

+94
-6
lines changed

2 files changed

+94
-6
lines changed

coderd/insights.go

+6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"encoding/json"
66
"fmt"
77
"net/http"
8+
"sort"
89
"time"
910

1011
"github.com/google/uuid"
@@ -339,6 +340,11 @@ func convertTemplateInsightsParameters(parameterRows []database.GetTemplateParam
339340
for _, param := range parametersByNum {
340341
parametersUsage = append(parametersUsage, *param)
341342
}
343+
344+
sort.Slice(parametersUsage, func(i, j int) bool {
345+
return parametersUsage[i].Name < parametersUsage[j].Name
346+
})
347+
342348
return parametersUsage, nil
343349
}
344350

coderd/insights_test.go

+88-6
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"github.com/coder/coder/codersdk"
2121
"github.com/coder/coder/codersdk/agentsdk"
2222
"github.com/coder/coder/provisioner/echo"
23+
"github.com/coder/coder/provisionersdk/proto"
2324
"github.com/coder/coder/testutil"
2425
)
2526

@@ -231,6 +232,32 @@ func TestUserLatencyInsights_BadRequest(t *testing.T) {
231232
func TestTemplateInsights(t *testing.T) {
232233
t.Parallel()
233234

235+
const (
236+
firstParameterName = "first_parameter"
237+
firstParameterDisplayName = "First PARAMETER"
238+
firstParameterType = "string"
239+
firstParameterDescription = "This is first parameter"
240+
firstParameterValue = "abc"
241+
242+
secondParameterName = "second_parameter"
243+
secondParameterDisplayName = "Second PARAMETER"
244+
secondParameterType = "number"
245+
secondParameterDescription = "This is second parameter"
246+
secondParameterValue = "123"
247+
248+
thirdParameterName = "third_parameter"
249+
thirdParameterDisplayName = "Third PARAMETER"
250+
thirdParameterType = "string"
251+
thirdParameterDescription = "This is third parameter"
252+
thirdParameterValue = "bbb"
253+
thirdParameterOptionName1 = "This is AAA"
254+
thirdParameterOptionValue1 = "aaa"
255+
thirdParameterOptionName2 = "This is BBB"
256+
thirdParameterOptionValue2 = "bbb"
257+
thirdParameterOptionName3 = "This is CCC"
258+
thirdParameterOptionValue3 = "ccc"
259+
)
260+
234261
logger := slogtest.Make(t, nil)
235262
opts := &coderdtest.Options{
236263
IncludeProvisionerDaemon: true,
@@ -241,15 +268,39 @@ func TestTemplateInsights(t *testing.T) {
241268
user := coderdtest.CreateFirstUser(t, client)
242269
authToken := uuid.NewString()
243270
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{
244-
Parse: echo.ParseComplete,
245-
ProvisionPlan: echo.ProvisionComplete,
271+
Parse: echo.ParseComplete,
272+
ProvisionPlan: []*proto.Provision_Response{
273+
{
274+
Type: &proto.Provision_Response_Complete{
275+
Complete: &proto.Provision_Complete{
276+
Parameters: []*proto.RichParameter{
277+
{Name: firstParameterName, DisplayName: firstParameterDisplayName, Type: firstParameterType, Description: firstParameterDescription, Required: true},
278+
{Name: secondParameterName, DisplayName: secondParameterDisplayName, Type: secondParameterType, Description: secondParameterDescription, Required: true},
279+
{Name: thirdParameterName, DisplayName: thirdParameterDisplayName, Type: thirdParameterType, Description: thirdParameterDescription, Required: true, Options: []*proto.RichParameterOption{
280+
{Name: thirdParameterOptionName1, Value: thirdParameterOptionValue1},
281+
{Name: thirdParameterOptionName2, Value: thirdParameterOptionValue2},
282+
{Name: thirdParameterOptionName3, Value: thirdParameterOptionValue3},
283+
}},
284+
},
285+
},
286+
},
287+
},
288+
},
246289
ProvisionApply: echo.ProvisionApplyWithAgent(authToken),
247290
})
248291
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
249292
require.Empty(t, template.BuildTimeStats[codersdk.WorkspaceTransitionStart])
250-
251293
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
252-
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
294+
295+
buildParameters := []codersdk.WorkspaceBuildParameter{
296+
{Name: firstParameterName, Value: firstParameterValue},
297+
{Name: secondParameterName, Value: secondParameterValue},
298+
{Name: thirdParameterName, Value: thirdParameterValue},
299+
}
300+
301+
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID, func(cwr *codersdk.CreateWorkspaceRequest) {
302+
cwr.RichParameterValues = buildParameters
303+
})
253304
coderdtest.AwaitWorkspaceBuildJob(t, client, workspace.LatestBuild.ID)
254305

255306
// Start an agent so that we can generate stats.
@@ -346,12 +397,43 @@ func TestTemplateInsights(t *testing.T) {
346397
}
347398
}
348399
// The full timeframe is <= 24h, so the interval matches exactly.
349-
assert.Len(t, resp.IntervalReports, 1, "want one interval report")
400+
require.Len(t, resp.IntervalReports, 1, "want one interval report")
350401
assert.WithinDuration(t, req.StartTime, resp.IntervalReports[0].StartTime, 0)
351402
assert.WithinDuration(t, req.EndTime, resp.IntervalReports[0].EndTime, 0)
352403
assert.Equal(t, resp.IntervalReports[0].ActiveUsers, int64(1), "want one active user in the interval report")
353404

354-
// TODO(mafredri): Verify template parameter insights (first we need to generate them).
405+
// The workspace uses 3 parameters
406+
require.Len(t, resp.Report.ParametersUsage, 3)
407+
assert.Equal(t, firstParameterName, resp.Report.ParametersUsage[0].Name)
408+
assert.Equal(t, firstParameterDisplayName, resp.Report.ParametersUsage[0].DisplayName)
409+
assert.Contains(t, resp.Report.ParametersUsage[0].Values, codersdk.TemplateParameterValue{
410+
Value: firstParameterValue,
411+
Count: 1,
412+
})
413+
assert.Contains(t, resp.Report.ParametersUsage[0].TemplateIDs, template.ID)
414+
assert.Empty(t, resp.Report.ParametersUsage[0].Options)
415+
416+
assert.Equal(t, secondParameterName, resp.Report.ParametersUsage[1].Name)
417+
assert.Equal(t, secondParameterDisplayName, resp.Report.ParametersUsage[1].DisplayName)
418+
assert.Contains(t, resp.Report.ParametersUsage[1].Values, codersdk.TemplateParameterValue{
419+
Value: secondParameterValue,
420+
Count: 1,
421+
})
422+
assert.Contains(t, resp.Report.ParametersUsage[1].TemplateIDs, template.ID)
423+
assert.Empty(t, resp.Report.ParametersUsage[1].Options)
424+
425+
assert.Equal(t, thirdParameterName, resp.Report.ParametersUsage[2].Name)
426+
assert.Equal(t, thirdParameterDisplayName, resp.Report.ParametersUsage[2].DisplayName)
427+
assert.Contains(t, resp.Report.ParametersUsage[2].Values, codersdk.TemplateParameterValue{
428+
Value: thirdParameterValue,
429+
Count: 1,
430+
})
431+
assert.Contains(t, resp.Report.ParametersUsage[2].TemplateIDs, template.ID)
432+
assert.Equal(t, []codersdk.TemplateVersionParameterOption{
433+
{Name: thirdParameterOptionName1, Value: thirdParameterOptionValue1},
434+
{Name: thirdParameterOptionName2, Value: thirdParameterOptionValue2},
435+
{Name: thirdParameterOptionName3, Value: thirdParameterOptionValue3},
436+
}, resp.Report.ParametersUsage[2].Options)
355437
}
356438

357439
func TestTemplateInsights_BadRequest(t *testing.T) {

0 commit comments

Comments
 (0)