Skip to content

Commit 0586ab2

Browse files
committed
chore: migrate CLI tests to use dbfake
1 parent 839a16e commit 0586ab2

File tree

6 files changed

+78
-120
lines changed

6 files changed

+78
-120
lines changed

cli/configssh_test.go

+35-59
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@ import (
2222
"github.com/coder/coder/v2/agent/agenttest"
2323
"github.com/coder/coder/v2/cli/clitest"
2424
"github.com/coder/coder/v2/coderd/coderdtest"
25+
"github.com/coder/coder/v2/coderd/database"
26+
"github.com/coder/coder/v2/coderd/database/dbfake"
2527
"github.com/coder/coder/v2/codersdk"
26-
"github.com/coder/coder/v2/provisioner/echo"
2728
"github.com/coder/coder/v2/provisionersdk/proto"
2829
"github.com/coder/coder/v2/pty/ptytest"
2930
"github.com/coder/coder/v2/testutil"
@@ -64,8 +65,7 @@ func TestConfigSSH(t *testing.T) {
6465
const hostname = "test-coder."
6566
const expectedKey = "ConnectionAttempts"
6667
const removeKey = "ConnectionTimeout"
67-
client := coderdtest.New(t, &coderdtest.Options{
68-
IncludeProvisionerDaemon: true,
68+
client, db := coderdtest.NewWithDatabase(t, &coderdtest.Options{
6969
ConfigSSH: codersdk.SSHConfigResponse{
7070
HostnamePrefix: hostname,
7171
SSHConfigOptions: map[string]string{
@@ -76,32 +76,13 @@ func TestConfigSSH(t *testing.T) {
7676
},
7777
})
7878
owner := coderdtest.CreateFirstUser(t, client)
79-
member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
80-
authToken := uuid.NewString()
81-
version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, &echo.Responses{
82-
Parse: echo.ParseComplete,
83-
ProvisionPlan: []*proto.Response{{
84-
Type: &proto.Response_Plan{
85-
Plan: &proto.PlanComplete{
86-
Resources: []*proto.Resource{{
87-
Name: "example",
88-
Type: "aws_instance",
89-
Agents: []*proto.Agent{{
90-
Id: uuid.NewString(),
91-
Name: "example",
92-
}},
93-
}},
94-
},
95-
},
96-
}},
97-
ProvisionApply: echo.ProvisionApplyWithAgent(authToken),
79+
member, memberUser := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
80+
ws, authToken := dbfake.WorkspaceWithAgent(t, db, database.Workspace{
81+
OrganizationID: owner.OrganizationID,
82+
OwnerID: memberUser.ID,
9883
})
99-
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID)
100-
template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID)
101-
workspace := coderdtest.CreateWorkspace(t, member, owner.OrganizationID, template.ID)
102-
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID)
10384
_ = agenttest.New(t, client.URL, authToken)
104-
resources := coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID)
85+
resources := coderdtest.AwaitWorkspaceAgents(t, client, ws.ID)
10586
agentConn, err := client.DialWorkspaceAgent(context.Background(), resources[0].Agents[0].ID, nil)
10687
require.NoError(t, err)
10788
defer agentConn.Close()
@@ -172,7 +153,7 @@ func TestConfigSSH(t *testing.T) {
172153

173154
home := filepath.Dir(filepath.Dir(sshConfigFile))
174155
// #nosec
175-
sshCmd := exec.Command("ssh", "-F", sshConfigFile, hostname+workspace.Name, "echo", "test")
156+
sshCmd := exec.Command("ssh", "-F", sshConfigFile, hostname+ws.Name, "echo", "test")
176157
pty = ptytest.New(t)
177158
// Set HOME because coder config is included from ~/.ssh/coder.
178159
sshCmd.Env = append(sshCmd.Env, fmt.Sprintf("HOME=%s", home))
@@ -213,13 +194,13 @@ func TestConfigSSH_FileWriteAndOptionsFlow(t *testing.T) {
213194
match, write string
214195
}
215196
tests := []struct {
216-
name string
217-
args []string
218-
matches []match
219-
writeConfig writeConfig
220-
wantConfig wantConfig
221-
wantErr bool
222-
echoResponse *echo.Responses
197+
name string
198+
args []string
199+
matches []match
200+
writeConfig writeConfig
201+
wantConfig wantConfig
202+
wantErr bool
203+
hasAgent bool
223204
}{
224205
{
225206
name: "Config file is created",
@@ -576,11 +557,8 @@ func TestConfigSSH_FileWriteAndOptionsFlow(t *testing.T) {
576557
args: []string{
577558
"-y", "--coder-binary-path", "/foo/bar/coder",
578559
},
579-
wantErr: false,
580-
echoResponse: &echo.Responses{
581-
Parse: echo.ParseComplete,
582-
ProvisionApply: echo.ProvisionApplyWithAgent(""),
583-
},
560+
wantErr: false,
561+
hasAgent: true,
584562
wantConfig: wantConfig{
585563
regexMatch: "ProxyCommand /foo/bar/coder",
586564
},
@@ -591,15 +569,14 @@ func TestConfigSSH_FileWriteAndOptionsFlow(t *testing.T) {
591569
t.Run(tt.name, func(t *testing.T) {
592570
t.Parallel()
593571

594-
var (
595-
client = coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
596-
user = coderdtest.CreateFirstUser(t, client)
597-
version = coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, tt.echoResponse)
598-
_ = coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID)
599-
project = coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
600-
workspace = coderdtest.CreateWorkspace(t, client, user.OrganizationID, project.ID)
601-
_ = coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID)
602-
)
572+
client, db := coderdtest.NewWithDatabase(t, nil)
573+
user := coderdtest.CreateFirstUser(t, client)
574+
if tt.hasAgent {
575+
_, _ = dbfake.WorkspaceWithAgent(t, db, database.Workspace{
576+
OrganizationID: user.OrganizationID,
577+
OwnerID: user.UserID,
578+
})
579+
}
603580

604581
// Prepare ssh config files.
605582
sshConfigName := sshConfigFileName(t)
@@ -613,6 +590,7 @@ func TestConfigSSH_FileWriteAndOptionsFlow(t *testing.T) {
613590
}
614591
args = append(args, tt.args...)
615592
inv, root := clitest.New(t, args...)
593+
//nolint:gocritic // This has always ran with the admin user.
616594
clitest.SetupConfig(t, client, root)
617595

618596
pty := ptytest.New(t)
@@ -710,17 +688,15 @@ func TestConfigSSH_Hostnames(t *testing.T) {
710688
resources = append(resources, resource)
711689
}
712690

713-
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
691+
client, db := coderdtest.NewWithDatabase(t, nil)
714692
owner := coderdtest.CreateFirstUser(t, client)
715-
member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
716-
// authToken := uuid.NewString()
717-
version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID,
718-
echo.WithResources(resources))
719-
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID)
720-
template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID)
721-
workspace := coderdtest.CreateWorkspace(t, member, owner.OrganizationID, template.ID)
722-
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID)
693+
member, memberUser := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
723694

695+
ws := dbfake.Workspace(t, db, database.Workspace{
696+
OrganizationID: owner.OrganizationID,
697+
OwnerID: memberUser.ID,
698+
})
699+
dbfake.WorkspaceBuild(t, db, ws, database.WorkspaceBuild{}, resources...)
724700
sshConfigFile := sshConfigFileName(t)
725701

726702
inv, root := clitest.New(t, "config-ssh", "--ssh-config-file", sshConfigFile)
@@ -745,7 +721,7 @@ func TestConfigSSH_Hostnames(t *testing.T) {
745721

746722
var expectedHosts []string
747723
for _, hostnamePattern := range tt.expected {
748-
hostname := strings.ReplaceAll(hostnamePattern, "@", workspace.Name)
724+
hostname := strings.ReplaceAll(hostnamePattern, "@", ws.Name)
749725
expectedHosts = append(expectedHosts, hostname)
750726
}
751727

cli/gitssh_test.go

+7-14
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,25 @@ import (
1616
"testing"
1717

1818
"github.com/gliderlabs/ssh"
19-
"github.com/google/uuid"
2019
"github.com/stretchr/testify/require"
2120
gossh "golang.org/x/crypto/ssh"
2221

2322
"github.com/coder/coder/v2/agent"
2423
"github.com/coder/coder/v2/agent/agenttest"
2524
"github.com/coder/coder/v2/cli/clitest"
2625
"github.com/coder/coder/v2/coderd/coderdtest"
26+
"github.com/coder/coder/v2/coderd/database"
27+
"github.com/coder/coder/v2/coderd/database/dbfake"
2728
"github.com/coder/coder/v2/codersdk"
2829
"github.com/coder/coder/v2/codersdk/agentsdk"
29-
"github.com/coder/coder/v2/provisioner/echo"
3030
"github.com/coder/coder/v2/pty/ptytest"
3131
"github.com/coder/coder/v2/testutil"
3232
)
3333

3434
func prepareTestGitSSH(ctx context.Context, t *testing.T) (*agentsdk.Client, string, gossh.PublicKey) {
3535
t.Helper()
3636

37-
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
37+
client, db := coderdtest.NewWithDatabase(t, nil)
3838
user := coderdtest.CreateFirstUser(t, client)
3939

4040
ctx, cancel := context.WithCancel(ctx)
@@ -48,24 +48,17 @@ func prepareTestGitSSH(ctx context.Context, t *testing.T) (*agentsdk.Client, str
4848
require.NoError(t, err)
4949

5050
// setup template
51-
agentToken := uuid.NewString()
52-
version := coderdtest.CreateTemplateVersion(t, client, user.OrganizationID, &echo.Responses{
53-
Parse: echo.ParseComplete,
54-
ProvisionPlan: echo.PlanComplete,
55-
ProvisionApply: echo.ProvisionApplyWithAgent(agentToken),
51+
ws, agentToken := dbfake.WorkspaceWithAgent(t, db, database.Workspace{
52+
OrganizationID: user.OrganizationID,
53+
OwnerID: user.UserID,
5654
})
57-
template := coderdtest.CreateTemplate(t, client, user.OrganizationID, version.ID)
58-
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID)
59-
workspace := coderdtest.CreateWorkspace(t, client, user.OrganizationID, template.ID)
60-
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID)
61-
6255
// start workspace agent
6356
agentClient := agentsdk.New(client.URL)
6457
agentClient.SetSessionToken(agentToken)
6558
_ = agenttest.New(t, client.URL, agentToken, func(o *agent.Options) {
6659
o.Client = agentClient
6760
})
68-
_ = coderdtest.AwaitWorkspaceAgents(t, client, workspace.ID)
61+
_ = coderdtest.AwaitWorkspaceAgents(t, client, ws.ID)
6962
return agentClient, agentToken, pubkey
7063
}
7164

cli/list_test.go

+18-18
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111

1212
"github.com/coder/coder/v2/cli/clitest"
1313
"github.com/coder/coder/v2/coderd/coderdtest"
14+
"github.com/coder/coder/v2/coderd/database"
15+
"github.com/coder/coder/v2/coderd/database/dbfake"
1416
"github.com/coder/coder/v2/codersdk"
1517
"github.com/coder/coder/v2/pty/ptytest"
1618
"github.com/coder/coder/v2/testutil"
@@ -20,14 +22,13 @@ func TestList(t *testing.T) {
2022
t.Parallel()
2123
t.Run("Single", func(t *testing.T) {
2224
t.Parallel()
23-
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
25+
client, db := coderdtest.NewWithDatabase(t, nil)
2426
owner := coderdtest.CreateFirstUser(t, client)
25-
member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
26-
version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, nil)
27-
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID)
28-
template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID)
29-
workspace := coderdtest.CreateWorkspace(t, member, owner.OrganizationID, template.ID)
30-
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID)
27+
member, memberUser := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
28+
ws, _ := dbfake.WorkspaceWithAgent(t, db, database.Workspace{
29+
OrganizationID: owner.OrganizationID,
30+
OwnerID: memberUser.ID,
31+
})
3132
inv, root := clitest.New(t, "ls")
3233
clitest.SetupConfig(t, member, root)
3334
pty := ptytest.New(t).Attach(inv)
@@ -40,22 +41,21 @@ func TestList(t *testing.T) {
4041
assert.NoError(t, errC)
4142
close(done)
4243
}()
43-
pty.ExpectMatch(workspace.Name)
44+
pty.ExpectMatch(ws.Name)
4445
pty.ExpectMatch("Started")
4546
cancelFunc()
4647
<-done
4748
})
4849

4950
t.Run("JSON", func(t *testing.T) {
5051
t.Parallel()
51-
client := coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
52+
client, db := coderdtest.NewWithDatabase(t, nil)
5253
owner := coderdtest.CreateFirstUser(t, client)
53-
member, _ := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
54-
version := coderdtest.CreateTemplateVersion(t, client, owner.OrganizationID, nil)
55-
coderdtest.AwaitTemplateVersionJobCompleted(t, client, version.ID)
56-
template := coderdtest.CreateTemplate(t, client, owner.OrganizationID, version.ID)
57-
workspace := coderdtest.CreateWorkspace(t, member, owner.OrganizationID, template.ID)
58-
coderdtest.AwaitWorkspaceBuildJobCompleted(t, client, workspace.LatestBuild.ID)
54+
member, memberUser := coderdtest.CreateAnotherUser(t, client, owner.OrganizationID)
55+
dbfake.WorkspaceWithAgent(t, db, database.Workspace{
56+
OrganizationID: owner.OrganizationID,
57+
OwnerID: memberUser.ID,
58+
})
5959

6060
inv, root := clitest.New(t, "list", "--output=json")
6161
clitest.SetupConfig(t, member, root)
@@ -68,8 +68,8 @@ func TestList(t *testing.T) {
6868
err := inv.WithContext(ctx).Run()
6969
require.NoError(t, err)
7070

71-
var templates []codersdk.Workspace
72-
require.NoError(t, json.Unmarshal(out.Bytes(), &templates))
73-
require.Len(t, templates, 1)
71+
var workspaces []codersdk.Workspace
72+
require.NoError(t, json.Unmarshal(out.Bytes(), &workspaces))
73+
require.Len(t, workspaces, 1)
7474
})
7575
}

cli/portforward_test.go

+14-26
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@ import (
1818
"github.com/coder/coder/v2/agent/agenttest"
1919
"github.com/coder/coder/v2/cli/clitest"
2020
"github.com/coder/coder/v2/coderd/coderdtest"
21+
"github.com/coder/coder/v2/coderd/database"
22+
"github.com/coder/coder/v2/coderd/database/dbfake"
2123
"github.com/coder/coder/v2/codersdk"
22-
"github.com/coder/coder/v2/provisioner/echo"
2324
"github.com/coder/coder/v2/pty/ptytest"
2425
"github.com/coder/coder/v2/testutil"
2526
)
@@ -132,10 +133,10 @@ func TestPortForward(t *testing.T) {
132133
// Setup agent once to be shared between test-cases (avoid expensive
133134
// non-parallel setup).
134135
var (
135-
client = coderdtest.New(t, &coderdtest.Options{IncludeProvisionerDaemon: true})
136-
admin = coderdtest.CreateFirstUser(t, client)
137-
member, _ = coderdtest.CreateAnotherUser(t, client, admin.OrganizationID)
138-
workspace = runAgent(t, client, member)
136+
client, db = coderdtest.NewWithDatabase(t, nil)
137+
admin = coderdtest.CreateFirstUser(t, client)
138+
member, memberUser = coderdtest.CreateAnotherUser(t, client, admin.OrganizationID)
139+
workspace = runAgent(t, client, memberUser.ID, db)
139140
)
140141

141142
for _, c := range cases {
@@ -299,35 +300,22 @@ func TestPortForward(t *testing.T) {
299300
// runAgent creates a fake workspace and starts an agent locally for that
300301
// workspace. The agent will be cleaned up on test completion.
301302
// nolint:unused
302-
func runAgent(t *testing.T, adminClient, userClient *codersdk.Client) codersdk.Workspace {
303-
ctx := context.Background()
304-
user, err := userClient.User(ctx, codersdk.Me)
303+
func runAgent(t *testing.T, client *codersdk.Client, owner uuid.UUID, db database.Store) database.Workspace {
304+
user, err := client.User(context.Background(), codersdk.Me)
305305
require.NoError(t, err, "specified user does not exist")
306306
require.Greater(t, len(user.OrganizationIDs), 0, "user has no organizations")
307307
orgID := user.OrganizationIDs[0]
308-
309-
// Setup template
310-
agentToken := uuid.NewString()
311-
version := coderdtest.CreateTemplateVersion(t, adminClient, orgID, &echo.Responses{
312-
Parse: echo.ParseComplete,
313-
ProvisionPlan: echo.PlanComplete,
314-
ProvisionApply: echo.ProvisionApplyWithAgent(agentToken),
308+
ws, agentToken := dbfake.WorkspaceWithAgent(t, db, database.Workspace{
309+
OrganizationID: orgID,
310+
OwnerID: owner,
315311
})
316-
317-
// Create template and workspace
318-
template := coderdtest.CreateTemplate(t, adminClient, orgID, version.ID)
319-
coderdtest.AwaitTemplateVersionJobCompleted(t, adminClient, version.ID)
320-
workspace := coderdtest.CreateWorkspace(t, userClient, orgID, template.ID)
321-
coderdtest.AwaitWorkspaceBuildJobCompleted(t, adminClient, workspace.LatestBuild.ID)
322-
323-
_ = agenttest.New(t, adminClient.URL, agentToken,
312+
_ = agenttest.New(t, client.URL, agentToken,
324313
func(o *agent.Options) {
325314
o.SSHMaxTimeout = 60 * time.Second
326315
},
327316
)
328-
coderdtest.AwaitWorkspaceAgents(t, adminClient, workspace.ID)
329-
330-
return workspace
317+
coderdtest.AwaitWorkspaceAgents(t, client, ws.ID)
318+
return ws
331319
}
332320

333321
// setupTestListener starts accepting connections and echoing a single packet.

cli/root_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,9 @@ func TestDERPHeaders(t *testing.T) {
136136
})
137137

138138
var (
139-
admin = coderdtest.CreateFirstUser(t, client)
140-
member, _ = coderdtest.CreateAnotherUser(t, client, admin.OrganizationID)
141-
workspace = runAgent(t, client, member)
139+
admin = coderdtest.CreateFirstUser(t, client)
140+
member, memberUser = coderdtest.CreateAnotherUser(t, client, admin.OrganizationID)
141+
workspace = runAgent(t, client, memberUser.ID, newOptions.Database)
142142
)
143143

144144
// Inject custom /derp handler so we can inspect the headers.

coderd/database/dbfake/dbfake.go

+1
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ func WorkspaceBuild(t testing.TB, db database.Store, ws database.Workspace, seed
124124
Valid: true,
125125
},
126126
})
127+
ProvisionerJobResources(t, db, jobID, seed.Transition, resources...)
127128
seed.TemplateVersionID = templateVersion.ID
128129
}
129130
build := dbgen.WorkspaceBuild(t, db, seed)

0 commit comments

Comments
 (0)