@@ -2,12 +2,14 @@ package cli_test
2
2
3
3
import (
4
4
"bytes"
5
+ "context"
5
6
"flag"
6
7
"fmt"
7
8
"net/http"
8
9
"net/http/httptest"
9
10
"os"
10
11
"path/filepath"
12
+ "regexp"
11
13
"runtime"
12
14
"strings"
13
15
"testing"
@@ -20,6 +22,8 @@ import (
20
22
"github.com/coder/coder/buildinfo"
21
23
"github.com/coder/coder/cli"
22
24
"github.com/coder/coder/cli/clitest"
25
+ "github.com/coder/coder/coderd/coderdtest"
26
+ "github.com/coder/coder/coderd/database/dbtestutil"
23
27
"github.com/coder/coder/codersdk"
24
28
"github.com/coder/coder/testutil"
25
29
)
@@ -28,13 +32,17 @@ import (
28
32
// make update-golden-files
29
33
var updateGoldenFiles = flag .Bool ("update" , false , "update .golden files" )
30
34
35
+ var timestampRegex = regexp .MustCompile (`(?i)\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(.\d+)?Z` )
36
+
31
37
//nolint:tparallel,paralleltest // These test sets env vars.
32
38
func TestCommandHelp (t * testing.T ) {
33
39
commonEnv := map [string ]string {
34
40
"HOME" : "~" ,
35
41
"CODER_CONFIG_DIR" : "~/.config/coderv2" ,
36
42
}
37
43
44
+ rootClient , replacements := prepareTestData (t )
45
+
38
46
type testCase struct {
39
47
name string
40
48
cmd []string
@@ -59,6 +67,14 @@ func TestCommandHelp(t *testing.T) {
59
67
"CODER_AGENT_LOG_DIR" : "/tmp" ,
60
68
},
61
69
},
70
+ {
71
+ name : "coder list --output json" ,
72
+ cmd : []string {"list" , "--output" , "json" },
73
+ },
74
+ {
75
+ name : "coder users list --output json" ,
76
+ cmd : []string {"users" , "list" , "--output" , "json" },
77
+ },
62
78
}
63
79
64
80
root := cli .Root (cli .AGPL ())
@@ -111,21 +127,33 @@ ExtractCommandPathsLoop:
111
127
}
112
128
err := os .Chdir (tmpwd )
113
129
var buf bytes.Buffer
114
- root , _ := clitest .New (t , tt .cmd ... )
115
- root .SetOut (& buf )
130
+ cmd , cfg := clitest .New (t , tt .cmd ... )
131
+ clitest .SetupConfig (t , rootClient , cfg )
132
+ cmd .SetOut (& buf )
116
133
assert .NoError (t , err )
117
- err = root .ExecuteContext (ctx )
134
+ err = cmd .ExecuteContext (ctx )
118
135
err2 := os .Chdir (wd )
119
136
require .NoError (t , err )
120
137
require .NoError (t , err2 )
121
138
122
139
got := buf .Bytes ()
123
- // Remove CRLF newlines (Windows).
124
- got = bytes .ReplaceAll (got , []byte {'\r' , '\n' }, []byte {'\n' })
125
140
126
- // The `coder templates create --help` command prints the path
127
- // to the working directory (--directory flag default value).
128
- got = bytes .ReplaceAll (got , []byte (fmt .Sprintf ("%q" , tmpwd )), []byte ("\" [current directory]\" " ))
141
+ replace := map [string ][]byte {
142
+ // Remove CRLF newlines (Windows).
143
+ string ([]byte {'\r' , '\n' }): []byte ("\n " ),
144
+ // The `coder templates create --help` command prints the path
145
+ // to the working directory (--directory flag default value).
146
+ fmt .Sprintf ("%q" , tmpwd ): []byte ("\" [current directory]\" " ),
147
+ }
148
+ for k , v := range replacements {
149
+ replace [k ] = []byte (v )
150
+ }
151
+ for k , v := range replace {
152
+ got = bytes .ReplaceAll (got , []byte (k ), v )
153
+ }
154
+
155
+ // Replace any timestamps with a placeholder.
156
+ got = timestampRegex .ReplaceAll (got , []byte ("[timestamp]" ))
129
157
130
158
gf := filepath .Join ("testdata" , strings .Replace (tt .name , " " , "_" , - 1 )+ ".golden" )
131
159
if * updateGoldenFiles {
@@ -156,6 +184,56 @@ func extractVisibleCommandPaths(cmdPath []string, cmds []*cobra.Command) [][]str
156
184
return cmdPaths
157
185
}
158
186
187
+ func prepareTestData (t * testing.T ) (* codersdk.Client , map [string ]string ) {
188
+ t .Helper ()
189
+
190
+ ctx , cancel := context .WithTimeout (context .Background (), testutil .WaitLong )
191
+ defer cancel ()
192
+
193
+ db , pubsub := dbtestutil .NewDB (t )
194
+ rootClient := coderdtest .New (t , & coderdtest.Options {
195
+ Database : db ,
196
+ Pubsub : pubsub ,
197
+ IncludeProvisionerDaemon : true ,
198
+ })
199
+ firstUser := coderdtest .CreateFirstUser (t , rootClient )
200
+ secondUser , err := rootClient .CreateUser (ctx , codersdk.CreateUserRequest {
201
+ Email : "testuser2@coder.com" ,
202
+ Username : "testuser2" ,
203
+ Password : coderdtest .FirstUserParams .Password ,
204
+ OrganizationID : firstUser .OrganizationID ,
205
+ })
206
+ require .NoError (t , err )
207
+ version := coderdtest .CreateTemplateVersion (t , rootClient , firstUser .OrganizationID , nil )
208
+ version = coderdtest .AwaitTemplateVersionJob (t , rootClient , version .ID )
209
+ template := coderdtest .CreateTemplate (t , rootClient , firstUser .OrganizationID , version .ID , func (req * codersdk.CreateTemplateRequest ) {
210
+ req .Name = "test-template"
211
+ })
212
+ workspace := coderdtest .CreateWorkspace (t , rootClient , firstUser .OrganizationID , template .ID , func (req * codersdk.CreateWorkspaceRequest ) {
213
+ req .Name = "test-workspace"
214
+ })
215
+ workspaceBuild := coderdtest .AwaitWorkspaceBuildJob (t , rootClient , workspace .LatestBuild .ID )
216
+
217
+ replacements := map [string ]string {
218
+ firstUser .UserID .String (): "[first user ID]" ,
219
+ secondUser .ID .String (): "[second user ID]" ,
220
+ firstUser .OrganizationID .String (): "[first org ID]" ,
221
+ version .ID .String (): "[version ID]" ,
222
+ version .Name : "[version name]" ,
223
+ version .Job .ID .String (): "[version job ID]" ,
224
+ version .Job .FileID .String (): "[version file ID]" ,
225
+ version .Job .WorkerID .String (): "[version worker ID]" ,
226
+ template .ID .String (): "[template ID]" ,
227
+ workspace .ID .String (): "[workspace ID]" ,
228
+ workspaceBuild .ID .String (): "[workspace build ID]" ,
229
+ workspaceBuild .Job .ID .String (): "[workspace build job ID]" ,
230
+ workspaceBuild .Job .FileID .String (): "[workspace build file ID]" ,
231
+ workspaceBuild .Job .WorkerID .String (): "[workspace build worker ID]" ,
232
+ }
233
+
234
+ return rootClient , replacements
235
+ }
236
+
159
237
func TestRoot (t * testing.T ) {
160
238
t .Parallel ()
161
239
t .Run ("FormatCobraError" , func (t * testing.T ) {
0 commit comments