(t *testing.T)
| 3823 | } |
| 3824 | |
| 3825 | func TestWorkspaceWatcher(t *testing.T) { |
| 3826 | t.Parallel() |
| 3827 | client, closeFunc := coderdtest.NewWithProvisionerCloser(t, &coderdtest.Options{ |
| 3828 | IncludeProvisionerDaemon: true, |
| 3829 | AllowWorkspaceRenames: true, |
| 3830 | }) |
| 3831 | defer closeFunc.Close() |
| 3832 | user := coderdtest.CreateFirstUser(t, client) |
| 3833 | authToken := uuid.NewString() |
| 3834 | version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{ |
| 3835 | Parse: echo.ParseComplete, |
| 3836 | ProvisionPlan: echo.PlanComplete, |
| 3837 | ProvisionGraph: []*proto.Response{{ |
| 3838 | Type: &proto.Response_Graph{ |
| 3839 | Graph: &proto.GraphComplete{ |
| 3840 | Resources: []*proto.Resource{{ |
| 3841 | Name: "example", |
| 3842 | Type: "aws_instance", |
| 3843 | Agents: []*proto.Agent{{ |
| 3844 | Id: uuid.NewString(), |
| 3845 | Name: "dev", |
| 3846 | Auth: &proto.Agent_Token{ |
| 3847 | Token: authToken, |
| 3848 | }, |
| 3849 | ConnectionTimeoutSeconds: 1, |
| 3850 | }}, |
| 3851 | }}, |
| 3852 | }, |
| 3853 | }, |
| 3854 | }}, |
| 3855 | }) |
| 3856 | coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID) |
| 3857 | template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID) |
| 3858 | workspace := coderdtest.CreateWorkspace(t, client, template.ID) |
| 3859 | coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID) |
| 3860 | ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong) |
| 3861 | defer cancel() |
| 3862 | |
| 3863 | wc, err := client.WatchWorkspace(ctx, workspace.ID) |
| 3864 | require.NoError(t, err) |
| 3865 | |
| 3866 | // Wait events are easier to debug with timestamped logs. |
| 3867 | logger := testutil.Logger(t).Named(t.Name()) |
| 3868 | wait := func(event string, ready func(w codersdk.Workspace) bool) { |
| 3869 | for { |
| 3870 | select { |
| 3871 | case <-ctx.Done(): |
| 3872 | require.FailNow(t, "timed out waiting for event", event) |
| 3873 | case w, ok := <-wc: |
| 3874 | require.True(t, ok, "watch channel closed: %s", event) |
| 3875 | if ready == nil || ready(w) { |
| 3876 | logger.Info(ctx, "done waiting for event", |
| 3877 | slog.F("event", event), |
| 3878 | slog.F("workspace", w)) |
| 3879 | return |
| 3880 | } |
| 3881 | logger.Info(ctx, "skipped update for event", |
| 3882 | slog.F("event", event), |
nothing calls this directly
no test coverage detected