Skip to content

Commit 0d2fea3

Browse files
committed
more tests
1 parent 1feba5a commit 0d2fea3

File tree

4 files changed

+103
-20
lines changed

4 files changed

+103
-20
lines changed

coderd/workspaceportshare.go

+12-4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package coderd
33
import (
44
"database/sql"
55
"errors"
6+
"fmt"
67
"net/http"
78

89
"github.com/coder/coder/v2/coderd/database"
@@ -29,16 +30,23 @@ func (api *API) postWorkspacePortShare(rw http.ResponseWriter, r *http.Request)
2930
return
3031
}
3132

33+
if req.ShareLevel < 0 || req.ShareLevel > 2 {
34+
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
35+
Message: "Port sharing level not allowed. Must be between 0 and 2.",
36+
})
37+
return
38+
}
39+
3240
if portSharer.CanRestrictSharing() {
3341
template, err := api.Database.GetTemplateByID(ctx, workspace.TemplateID)
3442
if err != nil {
3543
httpapi.InternalServerError(rw, err)
3644
return
3745
}
3846

39-
if req.ShareLevel > codersdk.WorkspacePortShareLevel(template.MaxPortShareLevel) || req.ShareLevel < 0 {
47+
if req.ShareLevel > codersdk.WorkspaceAgentPortShareLevel(template.MaxPortShareLevel) {
4048
httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{
41-
Message: "Port sharing level not allowed. Must be between 0 and 2.",
49+
Message: fmt.Sprintf("Port sharing level not allowed. Must not be greater than %d.", template.MaxPortShareLevel),
4250
})
4351
return
4452
}
@@ -70,7 +78,7 @@ func (api *API) postWorkspacePortShare(rw http.ResponseWriter, r *http.Request)
7078
Port: req.Port,
7179
})
7280
if err != nil {
73-
if errors.Is(err, sql.ErrNoRows) {
81+
if !errors.Is(err, sql.ErrNoRows) {
7482
httpapi.InternalServerError(rw, err)
7583
return
7684
}
@@ -97,7 +105,7 @@ func (api *API) postWorkspacePortShare(rw http.ResponseWriter, r *http.Request)
97105
return
98106
}
99107

100-
if codersdk.WorkspacePortShareLevel(psl.ShareLevel) == codersdk.WorkspaceAgentPortShareLevelOwner {
108+
if codersdk.WorkspaceAgentPortShareLevel(psl.ShareLevel) == codersdk.WorkspaceAgentPortShareLevelOwner {
101109
// If the port is shared, and the user is trying to set it to owner,
102110
// we need to remove the existing share record.
103111
err = api.Database.DeleteWorkspaceAgentPortShare(ctx, database.DeleteWorkspaceAgentPortShareParams{

coderd/workspaceportshare_test.go

+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package coderd_test
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/stretchr/testify/require"
8+
9+
"github.com/coder/coder/v2/coderd/coderdtest"
10+
"github.com/coder/coder/v2/coderd/database"
11+
"github.com/coder/coder/v2/coderd/database/dbauthz"
12+
"github.com/coder/coder/v2/coderd/database/dbfake"
13+
"github.com/coder/coder/v2/codersdk"
14+
"github.com/coder/coder/v2/provisionersdk/proto"
15+
"github.com/coder/coder/v2/testutil"
16+
)
17+
18+
func TestWorkspacePortShare(t *testing.T) {
19+
t.Parallel()
20+
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitLong)
21+
defer cancel()
22+
23+
ownerClient, db := coderdtest.NewWithDatabase(t, nil)
24+
owner := coderdtest.CreateFirstUser(t, ownerClient)
25+
client, user := coderdtest.CreateAnotherUser(t, ownerClient, owner.OrganizationID)
26+
27+
tmpDir := t.TempDir()
28+
r := dbfake.WorkspaceBuild(t, db, database.Workspace{
29+
OrganizationID: owner.OrganizationID,
30+
OwnerID: user.ID,
31+
}).WithAgent(func(agents []*proto.Agent) []*proto.Agent {
32+
agents[0].Directory = tmpDir
33+
return agents
34+
}).Do()
35+
agents, err := db.GetWorkspaceAgentsInLatestBuildByWorkspaceID(dbauthz.As(ctx, coderdtest.AuthzUserSubject(user, owner.OrganizationID)), r.Workspace.ID)
36+
require.NoError(t, err)
37+
38+
// negative level
39+
err = client.UpdateWorkspaceAgentPortShare(ctx, r.Workspace.ID, codersdk.UpdateWorkspaceAgentPortShareRequest{
40+
AgentName: agents[0].Name,
41+
Port: 8080,
42+
ShareLevel: codersdk.WorkspaceAgentPortShareLevel(-1),
43+
})
44+
require.Error(t, err)
45+
46+
// level too high
47+
err = client.UpdateWorkspaceAgentPortShare(ctx, r.Workspace.ID, codersdk.UpdateWorkspaceAgentPortShareRequest{
48+
AgentName: agents[0].Name,
49+
Port: 8080,
50+
ShareLevel: codersdk.WorkspaceAgentPortShareLevel(3),
51+
})
52+
require.Error(t, err)
53+
54+
// OK, ignoring template max port share level because we are AGPL
55+
err = client.UpdateWorkspaceAgentPortShare(ctx, r.Workspace.ID, codersdk.UpdateWorkspaceAgentPortShareRequest{
56+
AgentName: agents[0].Name,
57+
Port: 8080,
58+
ShareLevel: codersdk.WorkspaceAgentPortShareLevelPublic,
59+
})
60+
require.NoError(t, err)
61+
62+
ps, err := db.GetWorkspaceAgentPortShare(ctx, database.GetWorkspaceAgentPortShareParams{
63+
WorkspaceID: r.Workspace.ID,
64+
AgentName: agents[0].Name,
65+
Port: 8080,
66+
})
67+
require.NoError(t, err)
68+
require.EqualValues(t, codersdk.WorkspaceAgentPortShareLevelPublic, ps.ShareLevel)
69+
}

codersdk/workspaceportshare.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,22 @@ import (
99
)
1010

1111
const (
12-
WorkspaceAgentPortShareLevelOwner WorkspacePortShareLevel = 0
13-
WorkspaceAgentPortShareLevelAuthenticated WorkspacePortShareLevel = 1
14-
WorkspaceAgentPortShareLevelPublic WorkspacePortShareLevel = 2
12+
WorkspaceAgentPortShareLevelOwner WorkspaceAgentPortShareLevel = 0
13+
WorkspaceAgentPortShareLevelAuthenticated WorkspaceAgentPortShareLevel = 1
14+
WorkspaceAgentPortShareLevelPublic WorkspaceAgentPortShareLevel = 2
1515
)
1616

1717
type (
18-
WorkspacePortShareLevel int
18+
WorkspaceAgentPortShareLevel int
1919
UpdateWorkspaceAgentPortShareRequest struct {
20-
AgentName string `json:"agent_name"`
21-
Port int32 `json:"port"`
22-
ShareLevel WorkspacePortShareLevel `json:"share_level"`
20+
AgentName string `json:"agent_name"`
21+
Port int32 `json:"port"`
22+
ShareLevel WorkspaceAgentPortShareLevel `json:"share_level"`
2323
}
2424
)
2525

2626
func (c *Client) UpdateWorkspaceAgentPortShare(ctx context.Context, workspaceID uuid.UUID, req UpdateWorkspaceAgentPortShareRequest) error {
27-
res, err := c.Request(ctx, http.MethodPost, fmt.Sprintf("/api/v2/workspace/%s/port-share", workspaceID), req)
27+
res, err := c.Request(ctx, http.MethodPost, fmt.Sprintf("/api/v2/workspaces/%s/port-share", workspaceID), req)
2828
if err != nil {
2929
return err
3030
}

enterprise/coderd/workspaceportshare_test.go

+14-8
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"github.com/stretchr/testify/require"
88

99
"github.com/coder/coder/v2/coderd/coderdtest"
10-
"github.com/coder/coder/v2/coderd/database"
1110
"github.com/coder/coder/v2/coderd/rbac"
1211
"github.com/coder/coder/v2/codersdk"
1312
"github.com/coder/coder/v2/enterprise/coderd/coderdenttest"
@@ -18,7 +17,7 @@ import (
1817
func TestWorkspacePortShare(t *testing.T) {
1918
t.Parallel()
2019

21-
ownerClient, db, owner := coderdenttest.NewWithDatabase(t, &coderdenttest.Options{
20+
ownerClient, owner := coderdenttest.New(t, &coderdenttest.Options{
2221
Options: &coderdtest.Options{
2322
IncludeProvisionerDaemon: true,
2423
},
@@ -36,18 +35,25 @@ func TestWorkspacePortShare(t *testing.T) {
3635
ctx, cancel := context.WithTimeout(context.Background(), testutil.WaitShort)
3736
defer cancel()
3837

38+
// try to update port share with template max port share level 0
3939
err := client.UpdateWorkspaceAgentPortShare(ctx, workspace.ID, codersdk.UpdateWorkspaceAgentPortShareRequest{
4040
AgentName: agent.Name,
4141
Port: 8080,
4242
ShareLevel: codersdk.WorkspaceAgentPortShareLevelPublic,
4343
})
44-
require.NoError(t, err)
44+
require.Error(t, err, "Port sharing level not allowed")
45+
46+
// update the template max port share level to public
47+
var level int32 = 2
48+
client.UpdateTemplateMeta(ctx, workspace.TemplateID, codersdk.UpdateTemplateMeta{
49+
MaxPortShareLevel: &level,
50+
})
4551

46-
ps, err := db.GetWorkspaceAgentPortShare(ctx, database.GetWorkspaceAgentPortShareParams{
47-
WorkspaceID: workspace.ID,
48-
AgentName: agent.Name,
49-
Port: 8080,
52+
// OK
53+
err = client.UpdateWorkspaceAgentPortShare(ctx, workspace.ID, codersdk.UpdateWorkspaceAgentPortShareRequest{
54+
AgentName: agent.Name,
55+
Port: 8080,
56+
ShareLevel: codersdk.WorkspaceAgentPortShareLevelPublic,
5057
})
5158
require.NoError(t, err)
52-
require.Equal(t, codersdk.WorkspaceAgentPortShareLevelPublic, ps.ShareLevel)
5359
}

0 commit comments

Comments
 (0)