(t *testing.T)
| 3685 | } |
| 3686 | |
| 3687 | func TestWorkspaceExtend(t *testing.T) { |
| 3688 | t.Parallel() |
| 3689 | var ( |
| 3690 | ttl = 8 * time.Hour |
| 3691 | newDeadline = time.Now().Add(ttl + time.Hour).UTC() |
| 3692 | client = coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true}) |
| 3693 | user = coderdtest.CreateFirstUser(t, client) |
| 3694 | version = coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, nil) |
| 3695 | _ = coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) |
| 3696 | template = coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) |
| 3697 | workspace = coderdtest.CreateWorkspace(t, client, template.ID, func(cwr *codersdk.CreateWorkspaceRequest) { |
| 3698 | cwr.TTLMillis = ptr.Ref(ttl.Milliseconds()) |
| 3699 | }) |
| 3700 | _ = coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) |
| 3701 | ) |
| 3702 | |
| 3703 | ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) |
| 3704 | defer cancel() |
| 3705 | |
| 3706 | workspace, err := client.Workspace(ctx, workspace.ID) |
| 3707 | require.NoError(t, err, "fetch provisioned workspace") |
| 3708 | oldDeadline := workspace.LatestBuild.Deadline.Time |
| 3709 | |
| 3710 | // Updating the deadline should succeed |
| 3711 | req := codersdk.PutExtendWorkspaceRequest{ |
| 3712 | Deadline: newDeadline, |
| 3713 | } |
| 3714 | err = client.PutExtendWorkspace(ctx, workspace.ID, req) |
| 3715 | require.NoError(t, err, "failed to extend workspace") |
| 3716 | |
| 3717 | // Ensure deadline set correctly |
| 3718 | updated, err := client.Workspace(ctx, workspace.ID) |
| 3719 | require.NoError(t, err, "failed to fetch updated workspace") |
| 3720 | require.WithinDuration(t, newDeadline, updated.LatestBuild.Deadline.Time, time.Minute) |
| 3721 | |
| 3722 | // Zero time should fail |
| 3723 | err = client.PutExtendWorkspace(ctx, workspace.ID, codersdk.PutExtendWorkspaceRequest{ |
| 3724 | Deadline: time.Time{}, |
| 3725 | }) |
| 3726 | require.ErrorContains(t, err, "deadline: Validation failed for tag \"required\" with value: \"0001-01-01 00:00:00 +0000 UTC\"", "setting an empty deadline on a workspace should fail") |
| 3727 | |
| 3728 | // Updating with a deadline less than 30 minutes in the future should fail |
| 3729 | deadlineTooSoon := time.Now().Add(15 * time.Minute) // XXX: time.Now |
| 3730 | err = client.PutExtendWorkspace(ctx, workspace.ID, codersdk.PutExtendWorkspaceRequest{ |
| 3731 | Deadline: deadlineTooSoon, |
| 3732 | }) |
| 3733 | require.ErrorContains(t, err, "unexpected status code 400: Cannot extend workspace: new deadline must be at least 30 minutes in the future", "setting a deadline less than 30 minutes in the future should fail") |
| 3734 | |
| 3735 | // Updating with a deadline 30 minutes in the future should succeed |
| 3736 | deadlineJustSoonEnough := time.Now().Add(30 * time.Minute) |
| 3737 | err = client.PutExtendWorkspace(ctx, workspace.ID, codersdk.PutExtendWorkspaceRequest{ |
| 3738 | Deadline: deadlineJustSoonEnough, |
| 3739 | }) |
| 3740 | require.NoError(t, err, "setting a deadline at least 30 minutes in the future should succeed") |
| 3741 | |
| 3742 | // Updating with a deadline an hour before the previous deadline should succeed |
| 3743 | err = client.PutExtendWorkspace(ctx, workspace.ID, codersdk.PutExtendWorkspaceRequest{ |
| 3744 | Deadline: oldDeadline.Add(-time.Hour), |
nothing calls this directly
no test coverage detected