mirror of
https://github.com/coder/coder.git
synced 2026-06-02 20:48:20 +00:00
chore: add form_type parameter argument to db (#17920)
`form_type` is a new parameter field in the terraform provider. Bring that field into coder/coder. Validation for `multi-select` has also been added.
This commit is contained in:
@@ -42,6 +42,7 @@ import (
|
||||
"github.com/coder/coder/v2/provisioner/echo"
|
||||
"github.com/coder/coder/v2/provisionersdk/proto"
|
||||
"github.com/coder/coder/v2/testutil"
|
||||
"github.com/coder/terraform-provider-coder/v2/provider"
|
||||
)
|
||||
|
||||
func TestWorkspace(t *testing.T) {
|
||||
@@ -3527,6 +3528,12 @@ func TestWorkspaceWithRichParameters(t *testing.T) {
|
||||
secondParameterDescription = "_This_ is second *parameter*"
|
||||
secondParameterValue = "2"
|
||||
secondParameterValidationMonotonic = codersdk.MonotonicOrderIncreasing
|
||||
|
||||
thirdParameterName = "third_parameter"
|
||||
thirdParameterType = "list(string)"
|
||||
thirdParameterFormType = proto.ParameterFormType_MULTISELECT
|
||||
thirdParameterDefault = `["red"]`
|
||||
thirdParameterOption = "red"
|
||||
)
|
||||
|
||||
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
|
||||
@@ -3542,6 +3549,7 @@ func TestWorkspaceWithRichParameters(t *testing.T) {
|
||||
Name: firstParameterName,
|
||||
Type: firstParameterType,
|
||||
Description: firstParameterDescription,
|
||||
FormType: proto.ParameterFormType_INPUT,
|
||||
},
|
||||
{
|
||||
Name: secondParameterName,
|
||||
@@ -3551,6 +3559,19 @@ func TestWorkspaceWithRichParameters(t *testing.T) {
|
||||
ValidationMin: ptr.Ref(int32(1)),
|
||||
ValidationMax: ptr.Ref(int32(3)),
|
||||
ValidationMonotonic: string(secondParameterValidationMonotonic),
|
||||
FormType: proto.ParameterFormType_INPUT,
|
||||
},
|
||||
{
|
||||
Name: thirdParameterName,
|
||||
Type: thirdParameterType,
|
||||
DefaultValue: thirdParameterDefault,
|
||||
Options: []*proto.RichParameterOption{
|
||||
{
|
||||
Name: thirdParameterOption,
|
||||
Value: thirdParameterOption,
|
||||
},
|
||||
},
|
||||
FormType: thirdParameterFormType,
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -3575,12 +3596,13 @@ func TestWorkspaceWithRichParameters(t *testing.T) {
|
||||
|
||||
templateRichParameters, err := client.TemplateVersionRichParameters(ctx, version.ID)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, templateRichParameters, 2)
|
||||
require.Len(t, templateRichParameters, 3)
|
||||
require.Equal(t, firstParameterName, templateRichParameters[0].Name)
|
||||
require.Equal(t, firstParameterType, templateRichParameters[0].Type)
|
||||
require.Equal(t, firstParameterDescription, templateRichParameters[0].Description)
|
||||
require.Equal(t, firstParameterDescriptionPlaintext, templateRichParameters[0].DescriptionPlaintext)
|
||||
require.Equal(t, codersdk.ValidationMonotonicOrder(""), templateRichParameters[0].ValidationMonotonic) // no validation for string
|
||||
|
||||
require.Equal(t, secondParameterName, templateRichParameters[1].Name)
|
||||
require.Equal(t, secondParameterDisplayName, templateRichParameters[1].DisplayName)
|
||||
require.Equal(t, secondParameterType, templateRichParameters[1].Type)
|
||||
@@ -3588,9 +3610,18 @@ func TestWorkspaceWithRichParameters(t *testing.T) {
|
||||
require.Equal(t, secondParameterDescriptionPlaintext, templateRichParameters[1].DescriptionPlaintext)
|
||||
require.Equal(t, secondParameterValidationMonotonic, templateRichParameters[1].ValidationMonotonic)
|
||||
|
||||
third := templateRichParameters[2]
|
||||
require.Equal(t, thirdParameterName, third.Name)
|
||||
require.Equal(t, thirdParameterType, third.Type)
|
||||
require.Equal(t, string(database.ParameterFormTypeMultiSelect), third.FormType)
|
||||
require.Equal(t, thirdParameterDefault, third.DefaultValue)
|
||||
require.Equal(t, thirdParameterOption, third.Options[0].Name)
|
||||
require.Equal(t, thirdParameterOption, third.Options[0].Value)
|
||||
|
||||
expectedBuildParameters := []codersdk.WorkspaceBuildParameter{
|
||||
{Name: firstParameterName, Value: firstParameterValue},
|
||||
{Name: secondParameterName, Value: secondParameterValue},
|
||||
{Name: thirdParameterName, Value: thirdParameterDefault},
|
||||
}
|
||||
|
||||
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
|
||||
@@ -3606,6 +3637,72 @@ func TestWorkspaceWithRichParameters(t *testing.T) {
|
||||
require.ElementsMatch(t, expectedBuildParameters, workspaceBuildParameters)
|
||||
}
|
||||
|
||||
func TestWorkspaceWithMultiSelectFailure(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
|
||||
user := coderdtest.CreateFirstUser(t, client)
|
||||
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{
|
||||
Parse: echo.ParseComplete,
|
||||
ProvisionPlan: []*proto.Response{
|
||||
{
|
||||
Type: &proto.Response_Plan{
|
||||
Plan: &proto.PlanComplete{
|
||||
Parameters: []*proto.RichParameter{
|
||||
{
|
||||
Name: "param",
|
||||
Type: provider.OptionTypeListString,
|
||||
DefaultValue: `["red"]`,
|
||||
Options: []*proto.RichParameterOption{
|
||||
{
|
||||
Name: "red",
|
||||
Value: "red",
|
||||
},
|
||||
},
|
||||
FormType: proto.ParameterFormType_MULTISELECT,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
ProvisionApply: []*proto.Response{{
|
||||
Type: &proto.Response_Apply{
|
||||
Apply: &proto.ApplyComplete{},
|
||||
},
|
||||
}},
|
||||
})
|
||||
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID)
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
|
||||
defer cancel()
|
||||
|
||||
templateRichParameters, err := client.TemplateVersionRichParameters(ctx, version.ID)
|
||||
require.NoError(t, err)
|
||||
require.Len(t, templateRichParameters, 1)
|
||||
|
||||
expectedBuildParameters := []codersdk.WorkspaceBuildParameter{
|
||||
// purple is not in the response set
|
||||
{Name: "param", Value: `["red", "purple"]`},
|
||||
}
|
||||
|
||||
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
|
||||
req := codersdk.CreateWorkspaceRequest{
|
||||
TemplateID: template.ID,
|
||||
Name: coderdtest.RandomUsername(t),
|
||||
AutostartSchedule: ptr.Ref("CRON_TZ=US/Central 30 9 * * 1-5"),
|
||||
TTLMillis: ptr.Ref((8 * time.Hour).Milliseconds()),
|
||||
AutomaticUpdates: codersdk.AutomaticUpdatesNever,
|
||||
RichParameterValues: expectedBuildParameters,
|
||||
}
|
||||
|
||||
_, err = client.CreateUserWorkspace(context.Background(), codersdk.Me, req)
|
||||
require.Error(t, err)
|
||||
var apiError *codersdk.Error
|
||||
require.ErrorAs(t, err, &apiError)
|
||||
require.Equal(t, http.StatusBadRequest, apiError.StatusCode())
|
||||
}
|
||||
|
||||
func TestWorkspaceWithOptionalRichParameters(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user