|
| 1 | +package cli_test |
| 2 | + |
| 3 | +import ( |
| 4 | +"fmt" |
| 5 | +"testing" |
| 6 | + |
| 7 | +"github.com/coder/coder/v2/cli/clitest" |
| 8 | +"github.com/coder/coder/v2/coderd/coderdtest" |
| 9 | +"github.com/coder/coder/v2/codersdk" |
| 10 | +"github.com/coder/coder/v2/provisioner/echo" |
| 11 | +"github.com/coder/coder/v2/provisionersdk/proto" |
| 12 | +"github.com/coder/coder/v2/testutil" |
| 13 | +"github.com/google/uuid" |
| 14 | +"github.com/stretchr/testify/require" |
| 15 | +) |
| 16 | + |
| 17 | +funcTestTaskCreate(t*testing.T) { |
| 18 | +t.Parallel() |
| 19 | + |
| 20 | +createAITemplate:=func(t*testing.T,client*codersdk.Client,user codersdk.CreateFirstUserResponse) (codersdk.TemplateVersion, codersdk.Template) { |
| 21 | +t.Helper() |
| 22 | + |
| 23 | +taskAppID:=uuid.New() |
| 24 | +version:=coderdtest.CreateTemplateVersion(t,client,user.OrganizationID,&echo.Responses{ |
| 25 | +Parse:echo.ParseComplete, |
| 26 | +ProvisionPlan: []*proto.Response{ |
| 27 | +{ |
| 28 | +Type:&proto.Response_Plan{ |
| 29 | +Plan:&proto.PlanComplete{ |
| 30 | +Parameters: []*proto.RichParameter{{Name:codersdk.AITaskPromptParameterName,Type:"string"}}, |
| 31 | +HasAiTasks:true, |
| 32 | +AiTasks: []*proto.AITask{}, |
| 33 | +}, |
| 34 | +}, |
| 35 | +}, |
| 36 | +}, |
| 37 | +ProvisionApply: []*proto.Response{ |
| 38 | +{ |
| 39 | +Type:&proto.Response_Apply{ |
| 40 | +Apply:&proto.ApplyComplete{ |
| 41 | +Resources: []*proto.Resource{{ |
| 42 | +Name:"example", |
| 43 | +Type:"aws_instance", |
| 44 | +Agents: []*proto.Agent{{ |
| 45 | +Id:uuid.NewString(), |
| 46 | +Name:"example", |
| 47 | +Apps: []*proto.App{ |
| 48 | +{ |
| 49 | +Id:taskAppID.String(), |
| 50 | +Slug:"task-sidebar", |
| 51 | +DisplayName:"Task Sidebar", |
| 52 | +}, |
| 53 | +}, |
| 54 | +}}, |
| 55 | +}}, |
| 56 | +Parameters: []*proto.RichParameter{{Name:codersdk.AITaskPromptParameterName,Type:"string"}}, |
| 57 | +AiTasks: []*proto.AITask{{ |
| 58 | +SidebarApp:&proto.AITaskSidebarApp{ |
| 59 | +Id:taskAppID.String(), |
| 60 | +}, |
| 61 | +}}, |
| 62 | +}, |
| 63 | +}, |
| 64 | +}, |
| 65 | +}, |
| 66 | +}) |
| 67 | +coderdtest.AwaitTemplateVersionJobCompleted(t,client,version.ID) |
| 68 | +template:=coderdtest.CreateTemplate(t,client,user.OrganizationID,version.ID) |
| 69 | + |
| 70 | +returnversion,template |
| 71 | +} |
| 72 | + |
| 73 | +t.Run("CreateWithTemplateNameAndVersion",func(t*testing.T) { |
| 74 | +t.Parallel() |
| 75 | + |
| 76 | +var ( |
| 77 | +ctx=testutil.Context(t,testutil.WaitShort) |
| 78 | + |
| 79 | +prompt="Task prompt" |
| 80 | +) |
| 81 | + |
| 82 | +client:=coderdtest.New(t,&coderdtest.Options{IncludeProvisionerDaemon:true}) |
| 83 | +owner:=coderdtest.CreateFirstUser(t,client) |
| 84 | +templateVersion,template:=createAITemplate(t,client,owner) |
| 85 | + |
| 86 | +member,_:=coderdtest.CreateAnotherUser(t,client,owner.OrganizationID) |
| 87 | +expMember:=codersdk.NewExperimentalClient(member) |
| 88 | + |
| 89 | +tasks,err:=expMember.Tasks(ctx,nil) |
| 90 | +require.NoError(t,err) |
| 91 | +require.Empty(t,tasks) |
| 92 | + |
| 93 | +args:= []string{ |
| 94 | +"exp", |
| 95 | +"task", |
| 96 | +"create", |
| 97 | +fmt.Sprintf("%s@%s",template.Name,templateVersion.Name), |
| 98 | +"--input",prompt, |
| 99 | +} |
| 100 | + |
| 101 | +inv,root:=clitest.New(t,args...) |
| 102 | +clitest.SetupConfig(t,member,root) |
| 103 | + |
| 104 | +err=inv.Run() |
| 105 | +require.NoError(t,err) |
| 106 | + |
| 107 | +workspaces,err:=member.Workspaces(ctx, codersdk.WorkspaceFilter{FilterQuery:"has-ai-task:true"}) |
| 108 | +require.NoError(t,err) |
| 109 | +require.Len(t,workspaces.Workspaces,1) |
| 110 | + |
| 111 | +coderdtest.AwaitWorkspaceBuildJobCompleted(t,member,workspaces.Workspaces[0].LatestBuild.ID) |
| 112 | + |
| 113 | +tasks,err=expMember.Tasks(ctx,nil) |
| 114 | +require.NoError(t,err) |
| 115 | +require.Len(t,tasks,1) |
| 116 | + |
| 117 | +require.Equal(t,prompt,tasks[0].InitialPrompt) |
| 118 | +}) |
| 119 | +} |