@@ -2,11 +2,15 @@ package cli_test
2
2
3
3
import (
4
4
"bytes"
5
+ "context"
6
+ "io"
5
7
"os"
6
8
"path/filepath"
7
9
"testing"
8
10
11
+ "github.com/codeclysm/extract"
9
12
"github.com/google/uuid"
13
+ "github.com/ory/dockertest/v3/docker/pkg/archive"
10
14
"github.com/stretchr/testify/require"
11
15
12
16
"github.com/coder/coder/cli/clitest"
@@ -53,7 +57,7 @@ func TestTemplatePull(t *testing.T) {
53
57
// are being sorted correctly.
54
58
_ = coderdtest .UpdateTemplateVersion (t , client , user .OrganizationID , source2 , template .ID )
55
59
56
- cmd , root := clitest .New (t , "templates" , "pull" , template .Name )
60
+ cmd , root := clitest .New (t , "templates" , "pull" , "--tar" , template .Name )
57
61
clitest .SetupConfig (t , client , root )
58
62
59
63
var buf bytes.Buffer
@@ -65,9 +69,9 @@ func TestTemplatePull(t *testing.T) {
65
69
require .True (t , bytes .Equal (expected , buf .Bytes ()), "tar files differ" )
66
70
})
67
71
68
- // ToFile tests that 'templates pull' pulls down the latest template
72
+ // ToDir tests that 'templates pull' pulls down the latest template
69
73
// and writes it to the correct directory.
70
- t .Run ("ToFile " , func (t * testing.T ) {
74
+ t .Run ("ToDir " , func (t * testing.T ) {
71
75
t .Parallel ()
72
76
73
77
client := coderdtest .New (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
@@ -93,15 +97,14 @@ func TestTemplatePull(t *testing.T) {
93
97
94
98
dir := t .TempDir ()
95
99
96
- dest := filepath .Join (dir , "actual.tar" )
100
+ expectedDest := filepath .Join (dir , "expected" )
101
+ actualDest := filepath .Join (dir , "actual" )
102
+ ctx := context .Background ()
97
103
98
- // Create the file so that we can test that the command
99
- // warns the user before overwriting a preexisting file.
100
- fi , err := os .OpenFile (dest , os .O_CREATE | os .O_RDONLY , 0o600 )
104
+ err = extract .Tar (ctx , bytes .NewReader (expected ), expectedDest , nil )
101
105
require .NoError (t , err )
102
- _ = fi .Close ()
103
106
104
- cmd , root := clitest .New (t , "templates" , "pull" , template .Name , dest )
107
+ cmd , root := clitest .New (t , "templates" , "pull" , template .Name , actualDest )
105
108
clitest .SetupConfig (t , client , root )
106
109
107
110
pty := ptytest .New (t )
@@ -114,16 +117,89 @@ func TestTemplatePull(t *testing.T) {
114
117
errChan <- cmd .Execute ()
115
118
}()
116
119
117
- // We expect to be prompted that a file already exists.
118
- pty .ExpectMatch ("already exists" )
119
- pty .WriteLine ("yes" )
120
-
121
120
require .NoError (t , <- errChan )
122
121
123
- actual , err := os .ReadFile (dest )
122
+ expectedTarRd , err := archive .Tar (expectedDest , archive .Uncompressed )
123
+ require .NoError (t , err )
124
+ expectedTar , err := io .ReadAll (expectedTarRd )
125
+ require .NoError (t , err )
126
+
127
+ actualTarRd , err := archive .Tar (actualDest , archive .Uncompressed )
128
+ require .NoError (t , err )
129
+
130
+ actualTar , err := io .ReadAll (actualTarRd )
131
+ require .NoError (t , err )
132
+
133
+ require .True (t , bytes .Equal (expectedTar , actualTar ), "tar files differ" )
134
+ })
135
+
136
+ // FolderConflict tests that 'templates pull' fails when a folder with has
137
+ // existing
138
+ t .Run ("FolderConflict" , func (t * testing.T ) {
139
+ t .Parallel ()
140
+
141
+ client := coderdtest .New (t , & coderdtest.Options {IncludeProvisionerDaemon : true })
142
+ user := coderdtest .CreateFirstUser (t , client )
143
+
144
+ // Create an initial template bundle.
145
+ source1 := genTemplateVersionSource ()
146
+ // Create an updated template bundle. This will be used to ensure
147
+ // that templates are correctly returned in order from latest to oldest.
148
+ source2 := genTemplateVersionSource ()
149
+
150
+ expected , err := echo .Tar (source2 )
151
+ require .NoError (t , err )
152
+
153
+ version1 := coderdtest .CreateTemplateVersion (t , client , user .OrganizationID , source1 )
154
+ _ = coderdtest .AwaitTemplateVersionJob (t , client , version1 .ID )
155
+
156
+ template := coderdtest .CreateTemplate (t , client , user .OrganizationID , version1 .ID )
157
+
158
+ // Update the template version so that we can assert that templates
159
+ // are being sorted correctly.
160
+ _ = coderdtest .UpdateTemplateVersion (t , client , user .OrganizationID , source2 , template .ID )
161
+
162
+ dir := t .TempDir ()
163
+
164
+ expectedDest := filepath .Join (dir , "expected" )
165
+ conflictDest := filepath .Join (dir , "conflict" )
166
+
167
+ err = os .MkdirAll (conflictDest , 0o700 )
168
+ require .NoError (t , err )
169
+
170
+ err = os .WriteFile (
171
+ filepath .Join (conflictDest , "conflict-file" ),
172
+ []byte ("conflict" ), 0o600 ,
173
+ )
174
+ require .NoError (t , err )
175
+
176
+ ctx := context .Background ()
177
+
178
+ err = extract .Tar (ctx , bytes .NewReader (expected ), expectedDest , nil )
179
+ require .NoError (t , err )
180
+
181
+ cmd , root := clitest .New (t , "templates" , "pull" , template .Name , conflictDest )
182
+ clitest .SetupConfig (t , client , root )
183
+
184
+ pty := ptytest .New (t )
185
+ cmd .SetIn (pty .Input ())
186
+ cmd .SetOut (pty .Output ())
187
+
188
+ errChan := make (chan error )
189
+ go func () {
190
+ defer close (errChan )
191
+ errChan <- cmd .Execute ()
192
+ }()
193
+
194
+ pty .ExpectMatch ("not empty" )
195
+ pty .WriteLine ("no" )
196
+
197
+ require .Error (t , <- errChan )
198
+
199
+ ents , err := os .ReadDir (conflictDest )
124
200
require .NoError (t , err )
125
201
126
- require .True (t , bytes . Equal ( actual , expected ) , "tar files differ " )
202
+ require .Len (t , ents , 1 , "conflict folder should have single conflict file " )
127
203
})
128
204
}
129
205
0 commit comments