@@ -2,78 +2,117 @@ package cli_test
2
2
3
3
import (
4
4
"bytes"
5
+ "os"
6
+ "path/filepath"
5
7
"testing"
6
8
7
9
"github.com/stretchr/testify/require"
8
10
9
11
"github.com/coder/coder/cli/clitest"
10
12
"github.com/coder/coder/coderd/coderdtest"
11
13
"github.com/coder/coder/provisioner/echo"
12
- "github.com/coder/coder/provisionersdk/proto "
14
+ "github.com/coder/coder/pty/ptytest "
13
15
)
14
16
15
17
func TestTemplatePull (t * testing.T ) {
16
18
t .Parallel ()
17
19
18
- client := coderdtest .New (t , & coderdtest.Options {IncludeProvisionerD : true })
19
- user := coderdtest .CreateFirstUser (t , client )
20
-
21
- // Create an initial template bundle.
22
- templateSource := & echo.Responses {
23
- Parse : []* proto.Parse_Response {
24
- {
25
- Type : & proto.Parse_Response_Log {
26
- Log : & proto.Log {Output : "yahoo" },
27
- },
28
- },
29
-
30
- {
31
- Type : & proto.Parse_Response_Complete {
32
- Complete : & proto.Parse_Complete {},
33
- },
34
- },
35
- },
36
- Provision : echo .ProvisionComplete ,
37
- }
38
-
39
- // Create an updated template bundle. This will be used to ensure
40
- // that templates are correctly returned in order from latest to oldest.
41
- templateSource2 := & echo.Responses {
42
- Parse : []* proto.Parse_Response {
43
- {
44
- Type : & proto.Parse_Response_Log {
45
- Log : & proto.Log {Output : "wahoo" },
46
- },
47
- },
48
-
49
- {
50
- Type : & proto.Parse_Response_Complete {
51
- Complete : & proto.Parse_Complete {},
52
- },
53
- },
54
- },
55
- Provision : echo .ProvisionComplete ,
56
- }
57
-
58
- expected , err := echo .Tar (templateSource2 )
59
- require .NoError (t , err )
60
-
61
- version1 := coderdtest .CreateTemplateVersion (t , client , user .OrganizationID , templateSource )
62
- _ = coderdtest .AwaitTemplateVersionJob (t , client , version1 .ID )
63
- template := coderdtest .CreateTemplate (t , client , user .OrganizationID , version1 .ID )
64
-
65
- // Update the template version so that we can assert that templates
66
- // are being sorted correctly.
67
- _ = coderdtest .UpdateTemplateVersion (t , client , user .OrganizationID , templateSource2 , template .ID )
68
-
69
- cmd , root := clitest .New (t , "templates" , "pull" , template .Name )
70
- clitest .SetupConfig (t , client , root )
71
-
72
- buf := & bytes.Buffer {}
73
- cmd .SetOut (buf )
74
-
75
- err = cmd .Execute ()
76
- require .NoError (t , err )
77
-
78
- require .True (t , bytes .Equal (expected , buf .Bytes ()), "Bytes differ" )
20
+ // Stdout tests that 'templates pull' pulls down the latest template
21
+ // and writes it to stdout.
22
+ t .Run ("Stdout" , func (t * testing.T ) {
23
+ t .Parallel ()
24
+
25
+ client := coderdtest .New (t , & coderdtest.Options {IncludeProvisionerD : true })
26
+ user := coderdtest .CreateFirstUser (t , client )
27
+
28
+ // Create an initial template bundle.
29
+ source1 := clitest .GenTemplateVersion ()
30
+ // Create an updated template bundle. This will be used to ensure
31
+ // that templates are correctly returned in order from latest to oldest.
32
+ source2 := clitest .GenTemplateVersion ()
33
+
34
+ expected , err := echo .Tar (source2 )
35
+ require .NoError (t , err )
36
+
37
+ version1 := coderdtest .CreateTemplateVersion (t , client , user .OrganizationID , source1 )
38
+ _ = coderdtest .AwaitTemplateVersionJob (t , client , version1 .ID )
39
+
40
+ template := coderdtest .CreateTemplate (t , client , user .OrganizationID , version1 .ID )
41
+
42
+ // Update the template version so that we can assert that templates
43
+ // are being sorted correctly.
44
+ _ = coderdtest .UpdateTemplateVersion (t , client , user .OrganizationID , source2 , template .ID )
45
+
46
+ cmd , root := clitest .New (t , "templates" , "pull" , template .Name )
47
+ clitest .SetupConfig (t , client , root )
48
+
49
+ var buf bytes.Buffer
50
+ cmd .SetOut (& buf )
51
+
52
+ err = cmd .Execute ()
53
+ require .NoError (t , err )
54
+
55
+ require .True (t , bytes .Equal (expected , buf .Bytes ()), "tar files differ" )
56
+ })
57
+
58
+ // ToFile tests that 'templates pull' pulls down the latest template
59
+ // and writes it to the correct directory.
60
+ t .Run ("ToFile" , func (t * testing.T ) {
61
+ t .Parallel ()
62
+
63
+ client := coderdtest .New (t , & coderdtest.Options {IncludeProvisionerD : true })
64
+ user := coderdtest .CreateFirstUser (t , client )
65
+
66
+ // Create an initial template bundle.
67
+ source1 := clitest .GenTemplateVersion ()
68
+ // Create an updated template bundle. This will be used to ensure
69
+ // that templates are correctly returned in order from latest to oldest.
70
+ source2 := clitest .GenTemplateVersion ()
71
+
72
+ expected , err := echo .Tar (source2 )
73
+ require .NoError (t , err )
74
+
75
+ version1 := coderdtest .CreateTemplateVersion (t , client , user .OrganizationID , source1 )
76
+ _ = coderdtest .AwaitTemplateVersionJob (t , client , version1 .ID )
77
+
78
+ template := coderdtest .CreateTemplate (t , client , user .OrganizationID , version1 .ID )
79
+
80
+ // Update the template version so that we can assert that templates
81
+ // are being sorted correctly.
82
+ _ = coderdtest .UpdateTemplateVersion (t , client , user .OrganizationID , source2 , template .ID )
83
+
84
+ dir := t .TempDir ()
85
+
86
+ dest := filepath .Join (dir , "actual.tar" )
87
+
88
+ // Create the file so that we can test that the command
89
+ // warns the user before overwriting a preexisting file.
90
+ fi , err := os .OpenFile (dest , os .O_CREATE | os .O_RDONLY , 0600 )
91
+ require .NoError (t , err )
92
+ _ = fi .Close ()
93
+
94
+ cmd , root := clitest .New (t , "templates" , "pull" , template .Name , dest )
95
+ clitest .SetupConfig (t , client , root )
96
+
97
+ pty := ptytest .New (t )
98
+ cmd .SetIn (pty .Input ())
99
+ cmd .SetOut (pty .Output ())
100
+
101
+ errChan := make (chan error )
102
+ go func () {
103
+ defer close (errChan )
104
+ errChan <- cmd .Execute ()
105
+ }()
106
+
107
+ // We expect to be prompted that a file already exists.
108
+ pty .ExpectMatch ("already exists" )
109
+ pty .WriteLine ("yes" )
110
+
111
+ require .NoError (t , <- errChan )
112
+
113
+ actual , err := os .ReadFile (dest )
114
+ require .NoError (t , err )
115
+
116
+ require .True (t , bytes .Equal (actual , expected ), "tar files differ" )
117
+ })
79
118
}
0 commit comments