Skip to content

Commit e60aa38

Browse files
committed
add unit tests for the new API
1 parent 318224c commit e60aa38

File tree

3 files changed

+100
-1
lines changed

3 files changed

+100
-1
lines changed

coderd/workspacebuilds.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ func (api *API) workspaceBuildByBuildNumber(rw http.ResponseWriter, r *http.Requ
202202
})
203203
if errors.Is(err, sql.ErrNoRows) {
204204
httpapi.Write(rw, http.StatusNotFound, httpapi.Response{
205-
Message: fmt.Sprintf("Workspace %q Build %q does not exist.", workspaceName, buildNumber),
205+
Message: fmt.Sprintf("Workspace %q Build %d does not exist.", workspaceName, buildNumber),
206206
})
207207
return
208208
}

coderd/workspacebuilds_test.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ package coderd_test
22

33
import (
44
"context"
5+
"fmt"
56
"net/http"
7+
"strconv"
68
"testing"
79
"time"
810

@@ -28,6 +30,90 @@ func TestWorkspaceBuild(t *testing.T) {
2830
require.NoError(t, err)
2931
}
3032

33+
func TestWorkspaceBuildByBuildNumber(t *testing.T) {
34+
t.Parallel()
35+
t.Run("Successful", func(t *testing.T) {
36+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true})
37+
first := coderdtest.CreateFirstUser(t, client)
38+
user, err := client.User(context.Background(), codersdk.Me)
39+
require.NoError(t, err, "fetch me")
40+
version := coderdtest.CreateTemplateVersion(t, client, first.OrganizationID, nil)
41+
template := coderdtest.CreateTemplate(t, client, first.OrganizationID, version.ID)
42+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
43+
workspace := coderdtest.CreateWorkspace(t, client, first.OrganizationID, template.ID)
44+
_, err = client.WorkspaceBuildByUsernameAndWorkspaceNameAndBuildNumber(
45+
context.Background(),
46+
user.Username,
47+
workspace.Name,
48+
strconv.FormatInt(int64(workspace.LatestBuild.BuildNumber), 10),
49+
)
50+
require.NoError(t, err)
51+
})
52+
53+
t.Run("BuildNumberNotInt", func(t *testing.T) {
54+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true})
55+
first := coderdtest.CreateFirstUser(t, client)
56+
user, err := client.User(context.Background(), codersdk.Me)
57+
require.NoError(t, err, "fetch me")
58+
version := coderdtest.CreateTemplateVersion(t, client, first.OrganizationID, nil)
59+
template := coderdtest.CreateTemplate(t, client, first.OrganizationID, version.ID)
60+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
61+
workspace := coderdtest.CreateWorkspace(t, client, first.OrganizationID, template.ID)
62+
_, err = client.WorkspaceBuildByUsernameAndWorkspaceNameAndBuildNumber(
63+
context.Background(),
64+
user.Username,
65+
workspace.Name,
66+
"buildNumber",
67+
)
68+
var apiError *codersdk.Error
69+
require.ErrorAs(t, err, &apiError)
70+
require.Equal(t, http.StatusBadRequest, apiError.StatusCode())
71+
require.ErrorContains(t, apiError, "Failed to parse build number as integer.")
72+
})
73+
74+
t.Run("WorkspaceNotFound", func(t *testing.T) {
75+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true})
76+
first := coderdtest.CreateFirstUser(t, client)
77+
user, err := client.User(context.Background(), codersdk.Me)
78+
require.NoError(t, err, "fetch me")
79+
version := coderdtest.CreateTemplateVersion(t, client, first.OrganizationID, nil)
80+
template := coderdtest.CreateTemplate(t, client, first.OrganizationID, version.ID)
81+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
82+
workspace := coderdtest.CreateWorkspace(t, client, first.OrganizationID, template.ID)
83+
_, err = client.WorkspaceBuildByUsernameAndWorkspaceNameAndBuildNumber(
84+
context.Background(),
85+
user.Username,
86+
"workspaceName",
87+
strconv.FormatInt(int64(workspace.LatestBuild.BuildNumber), 10),
88+
)
89+
var apiError *codersdk.Error
90+
require.ErrorAs(t, err, &apiError)
91+
require.Equal(t, http.StatusNotFound, apiError.StatusCode())
92+
require.ErrorContains(t, apiError, "Workspace \"workspaceName\" does not exist.")
93+
})
94+
95+
t.Run("WorkspaceBuildNotFound", func(t *testing.T) {
96+
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerD: true})
97+
first := coderdtest.CreateFirstUser(t, client)
98+
user, err := client.User(context.Background(), codersdk.Me)
99+
require.NoError(t, err, "fetch me")
100+
version := coderdtest.CreateTemplateVersion(t, client, first.OrganizationID, nil)
101+
template := coderdtest.CreateTemplate(t, client, first.OrganizationID, version.ID)
102+
coderdtest.AwaitTemplateVersionJob(t, client, version.ID)
103+
workspace := coderdtest.CreateWorkspace(t, client, first.OrganizationID, template.ID)
104+
_, err = client.WorkspaceBuildByUsernameAndWorkspaceNameAndBuildNumber(
105+
context.Background(),
106+
user.Username,
107+
workspace.Name,
108+
"200",
109+
)
110+
var apiError *codersdk.Error
111+
require.ErrorAs(t, err, &apiError)
112+
require.Equal(t, http.StatusNotFound, apiError.StatusCode())
113+
require.ErrorContains(t, apiError, fmt.Sprintf("Workspace %q Build 200 does not exist.", workspace.Name))
114+
})
115+
}
116+
31117
func TestWorkspaceBuilds(t *testing.T) {
32118
t.Parallel()
33119
t.Run("Single", func(t *testing.T) {

codersdk/workspacebuilds.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,3 +103,16 @@ func (c *Client) WorkspaceBuildState(ctx context.Context, build uuid.UUID) ([]by
103103
}
104104
return io.ReadAll(res.Body)
105105
}
106+
107+
func (c *Client) WorkspaceBuildByUsernameAndWorkspaceNameAndBuildNumber(ctx context.Context, username string, workspaceName string, buildNumber string) (WorkspaceBuild, error) {
108+
res, err := c.Request(ctx, http.MethodGet, fmt.Sprintf("/api/v2/users/%s/workspace/%s/builds/%s", username, workspaceName, buildNumber), nil)
109+
if err != nil {
110+
return WorkspaceBuild{}, err
111+
}
112+
defer res.Body.Close()
113+
if res.StatusCode != http.StatusOK {
114+
return WorkspaceBuild{}, readBodyAsError(res)
115+
}
116+
var workspaceBuild WorkspaceBuild
117+
return workspaceBuild, json.NewDecoder(res.Body).Decode(&workspaceBuild)
118+
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy