From 8528e33b69c51999c494eb6c6dff528c40d90ea6 Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Tue, 22 Mar 2022 23:09:35 +0000 Subject: [PATCH] fix: Improve coverage by uploading PostgreSQL tests This also adds a test for workspace creation via the CLI. --- .github/workflows/coder.yaml | 8 +++ cli/workspacecreate_test.go | 44 ++++++++++++++++ codecov.yml | 1 + coderd/projectversions_test.go | 92 +++++++++++++++++++++++++--------- 4 files changed, 120 insertions(+), 25 deletions(-) create mode 100644 cli/workspacecreate_test.go diff --git a/.github/workflows/coder.yaml b/.github/workflows/coder.yaml index 32ea6aec5bb1a..380f5b0a32fdf 100644 --- a/.github/workflows/coder.yaml +++ b/.github/workflows/coder.yaml @@ -270,6 +270,14 @@ jobs: GIT_COMMIT_MESSAGE: ${{ github.event.head_commit.message }} run: go run scripts/datadog-cireport/main.go gotests.xml + - uses: codecov/codecov-action@v2 + if: github.actor != 'dependabot[bot]' + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: ./gotests.coverage + flags: unittest-go-${{ matrix.os }} + fail_ci_if_error: true + deploy: name: "deploy" runs-on: ubuntu-latest diff --git a/cli/workspacecreate_test.go b/cli/workspacecreate_test.go new file mode 100644 index 0000000000000..5dd85e0833c93 --- /dev/null +++ b/cli/workspacecreate_test.go @@ -0,0 +1,44 @@ +package cli_test + +import ( + "testing" + + "github.com/coder/coder/cli/clitest" + "github.com/coder/coder/coderd/coderdtest" + "github.com/coder/coder/pty/ptytest" + "github.com/stretchr/testify/require" +) + +func TestWorkspaceCreate(t *testing.T) { + t.Parallel() + t.Run("Create", func(t *testing.T) { + t.Parallel() + client := coderdtest.New(t, nil) + user := coderdtest.CreateFirstUser(t, client) + coderdtest.NewProvisionerDaemon(t, client) + version := coderdtest.CreateProjectVersion(t, client, user.OrganizationID, nil) + coderdtest.AwaitProjectVersionJob(t, client, version.ID) + project := coderdtest.CreateProject(t, client, user.OrganizationID, version.ID) + cmd, root := clitest.New(t, "workspaces", "create", "my-workspace", "--project", project.Name) + clitest.SetupConfig(t, client, root) + doneChan := make(chan struct{}) + pty := ptytest.New(t) + cmd.SetIn(pty.Input()) + cmd.SetOut(pty.Output()) + go func() { + defer close(doneChan) + err := cmd.Execute() + require.NoError(t, err) + }() + matches := []string{ + "Create workspace", "yes", + } + for i := 0; i < len(matches); i += 2 { + match := matches[i] + value := matches[i+1] + pty.ExpectMatch(match) + pty.WriteLine(value) + } + <-doneChan + }) +} diff --git a/codecov.yml b/codecov.yml index 39b0aa0c229f8..dcc14725254c5 100644 --- a/codecov.yml +++ b/codecov.yml @@ -29,6 +29,7 @@ ignore: - database/databasefake # These are generated or don't require tests. - cmd + - coderd/tunnel - database/dump - database/postgres - peerbroker/proto diff --git a/coderd/projectversions_test.go b/coderd/projectversions_test.go index c7bbf3d706998..15bc4bfc8e969 100644 --- a/coderd/projectversions_test.go +++ b/coderd/projectversions_test.go @@ -29,34 +29,76 @@ func TestProjectVersion(t *testing.T) { func TestPatchCancelProjectVersion(t *testing.T) { t.Parallel() - client := coderdtest.New(t, nil) - user := coderdtest.CreateFirstUser(t, client) - coderdtest.NewProvisionerDaemon(t, client) - version := coderdtest.CreateProjectVersion(t, client, user.OrganizationID, &echo.Responses{ - Parse: echo.ParseComplete, - Provision: []*proto.Provision_Response{{ - Type: &proto.Provision_Response_Log{ - Log: &proto.Log{}, - }, - }}, + t.Run("AlreadyCompleted", func(t *testing.T) { + t.Parallel() + client := coderdtest.New(t, nil) + user := coderdtest.CreateFirstUser(t, client) + coderdtest.NewProvisionerDaemon(t, client) + version := coderdtest.CreateProjectVersion(t, client, user.OrganizationID, nil) + coderdtest.AwaitProjectVersionJob(t, client, version.ID) + err := client.CancelProjectVersion(context.Background(), version.ID) + var apiErr *codersdk.Error + require.ErrorAs(t, err, &apiErr) + require.Equal(t, http.StatusPreconditionFailed, apiErr.StatusCode()) }) - require.Eventually(t, func() bool { - var err error - version, err = client.ProjectVersion(context.Background(), version.ID) + t.Run("AlreadyCanceled", func(t *testing.T) { + t.Parallel() + client := coderdtest.New(t, nil) + user := coderdtest.CreateFirstUser(t, client) + coderdtest.NewProvisionerDaemon(t, client) + version := coderdtest.CreateProjectVersion(t, client, user.OrganizationID, &echo.Responses{ + Parse: echo.ParseComplete, + Provision: []*proto.Provision_Response{{ + Type: &proto.Provision_Response_Log{ + Log: &proto.Log{}, + }, + }}, + }) + require.Eventually(t, func() bool { + var err error + version, err = client.ProjectVersion(context.Background(), version.ID) + require.NoError(t, err) + t.Logf("Status: %s", version.Job.Status) + return version.Job.Status == codersdk.ProvisionerJobRunning + }, 5*time.Second, 25*time.Millisecond) + err := client.CancelProjectVersion(context.Background(), version.ID) require.NoError(t, err) - t.Logf("Status: %s", version.Job.Status) - return version.Job.Status == codersdk.ProvisionerJobRunning - }, 5*time.Second, 25*time.Millisecond) - err := client.CancelProjectVersion(context.Background(), version.ID) - require.NoError(t, err) - require.Eventually(t, func() bool { - var err error - version, err = client.ProjectVersion(context.Background(), version.ID) + err = client.CancelProjectVersion(context.Background(), version.ID) + var apiErr *codersdk.Error + require.ErrorAs(t, err, &apiErr) + require.Equal(t, http.StatusPreconditionFailed, apiErr.StatusCode()) + }) + t.Run("Success", func(t *testing.T) { + t.Parallel() + client := coderdtest.New(t, nil) + user := coderdtest.CreateFirstUser(t, client) + coderdtest.NewProvisionerDaemon(t, client) + version := coderdtest.CreateProjectVersion(t, client, user.OrganizationID, &echo.Responses{ + Parse: echo.ParseComplete, + Provision: []*proto.Provision_Response{{ + Type: &proto.Provision_Response_Log{ + Log: &proto.Log{}, + }, + }}, + }) + require.Eventually(t, func() bool { + var err error + version, err = client.ProjectVersion(context.Background(), version.ID) + require.NoError(t, err) + t.Logf("Status: %s", version.Job.Status) + return version.Job.Status == codersdk.ProvisionerJobRunning + }, 5*time.Second, 25*time.Millisecond) + err := client.CancelProjectVersion(context.Background(), version.ID) require.NoError(t, err) - // The echo provisioner doesn't respond to a shutdown request, - // so the job cancel will time out and fail. - return version.Job.Status == codersdk.ProvisionerJobFailed - }, 5*time.Second, 25*time.Millisecond) + require.Eventually(t, func() bool { + var err error + version, err = client.ProjectVersion(context.Background(), version.ID) + require.NoError(t, err) + // The echo provisioner doesn't respond to a shutdown request, + // so the job cancel will time out and fail. + return version.Job.Status == codersdk.ProvisionerJobFailed + }, 5*time.Second, 25*time.Millisecond) + }) } func TestProjectVersionSchema(t *testing.T) {