github.com/docker/app@v0.9.1-beta3.0.20210611140623-a48f773ab002/internal/packager/init_test.go (about) 1 package packager 2 3 import ( 4 "fmt" 5 "os/user" 6 "testing" 7 8 "github.com/docker/app/internal" 9 "gotest.tools/assert" 10 "gotest.tools/fs" 11 ) 12 13 func TestInitFromComposeFile(t *testing.T) { 14 composeData := ` 15 version: '3.0' 16 services: 17 nginx: 18 image: nginx:${NGINX_VERSION} 19 command: nginx $NGINX_ARGS 20 ` 21 envData := "# some comment\nNGINX_VERSION=latest" 22 23 inputDir := fs.NewDir(t, "app_input_", 24 fs.WithFile(internal.ComposeFileName, composeData), 25 fs.WithFile(".env", envData), 26 ) 27 defer inputDir.Remove() 28 29 appName := "my.dockerapp" 30 dir := fs.NewDir(t, "app_", 31 fs.WithDir(appName), 32 ) 33 defer dir.Remove() 34 35 err := initFromComposeFile(nil, dir.Join(appName), inputDir.Join(internal.ComposeFileName)) 36 assert.NilError(t, err) 37 38 manifest := fs.Expected( 39 t, 40 fs.WithMode(0755), 41 fs.WithFile(internal.ComposeFileName, composeData, fs.WithMode(0644)), 42 fs.WithFile(internal.ParametersFileName, "NGINX_ARGS: FILL ME\nNGINX_VERSION: latest\n", fs.WithMode(0644)), 43 ) 44 45 assert.Assert(t, fs.Equal(dir.Join(appName), manifest)) 46 } 47 48 func TestInitFromComposeFileWithFlattenedParams(t *testing.T) { 49 composeData := ` 50 version: '3.0' 51 services: 52 service1: 53 ports: 54 - ${ports.service1:-9001} 55 service2: 56 ports: 57 - ${ports.service2-9002} 58 service3: 59 ports: 60 - ${ports.service3:?'port is unset or empty in the environment'} 61 service4: 62 ports: 63 - ${ports.service4?'port is unset or empty in the environment'} 64 ` 65 inputDir := fs.NewDir(t, "app_input_", 66 fs.WithFile(internal.ComposeFileName, composeData), 67 ) 68 defer inputDir.Remove() 69 70 appName := "my.dockerapp" 71 dir := fs.NewDir(t, "app_", 72 fs.WithDir(appName), 73 ) 74 defer dir.Remove() 75 76 err := initFromComposeFile(nil, dir.Join(appName), inputDir.Join(internal.ComposeFileName)) 77 assert.NilError(t, err) 78 79 const expectedParameters = `ports: 80 service1: 9001 81 service2: 9002 82 service3: FILL ME 83 service4: FILL ME 84 ` 85 const expectedUpdatedComposeData = ` 86 version: '3.0' 87 services: 88 service1: 89 ports: 90 - ${ports.service1} 91 service2: 92 ports: 93 - ${ports.service2} 94 service3: 95 ports: 96 - ${ports.service3} 97 service4: 98 ports: 99 - ${ports.service4} 100 ` 101 manifest := fs.Expected( 102 t, 103 fs.WithMode(0755), 104 fs.WithFile(internal.ComposeFileName, expectedUpdatedComposeData, fs.WithMode(0644)), 105 fs.WithFile(internal.ParametersFileName, expectedParameters, fs.WithMode(0644)), 106 ) 107 assert.Assert(t, fs.Equal(dir.Join(appName), manifest)) 108 } 109 110 func TestInitFromInvalidComposeFile(t *testing.T) { 111 err := initFromComposeFile(nil, "my.dockerapp", "doesnotexist") 112 assert.ErrorContains(t, err, "failed to read") 113 } 114 115 func TestInitFromV2ComposeFile(t *testing.T) { 116 composeData := ` 117 version: '2.4' 118 services: 119 nginx: 120 image: nginx:${NGINX_VERSION} 121 command: nginx $NGINX_ARGS 122 ` 123 inputDir := fs.NewDir(t, "app_input_", 124 fs.WithFile(internal.ComposeFileName, composeData), 125 ) 126 defer inputDir.Remove() 127 128 appName := "my.dockerapp" 129 dir := fs.NewDir(t, "app_", 130 fs.WithDir(appName), 131 ) 132 defer dir.Remove() 133 134 err := initFromComposeFile(nil, dir.Join(appName), inputDir.Join(internal.ComposeFileName)) 135 assert.ErrorContains(t, err, "unsupported Compose file version") 136 } 137 138 func TestInitFromV1ComposeFile(t *testing.T) { 139 composeData := ` 140 nginx: 141 image: nginx 142 ` 143 inputDir := fs.NewDir(t, "app_input_", 144 fs.WithFile(internal.ComposeFileName, composeData), 145 ) 146 defer inputDir.Remove() 147 148 appName := "my.dockerapp" 149 dir := fs.NewDir(t, "app_", 150 fs.WithDir(appName), 151 ) 152 defer dir.Remove() 153 154 err := initFromComposeFile(nil, dir.Join(appName), inputDir.Join(internal.ComposeFileName)) 155 assert.ErrorContains(t, err, "unsupported Compose file version") 156 } 157 158 func TestWriteMetadataFile(t *testing.T) { 159 appName := "writemetadata_test" 160 tmpdir := fs.NewDir(t, appName) 161 defer tmpdir.Remove() 162 163 err := writeMetadataFile(appName, tmpdir.Path()) 164 assert.NilError(t, err) 165 166 userData, _ := user.Current() 167 currentUser := "" 168 if userData != nil { 169 currentUser = userData.Username 170 } 171 172 data := fmt.Sprintf(`# Version of the application 173 version: 0.1.0 174 # Name of the application 175 name: writemetadata_test 176 # A short description of the application 177 description: 178 # List of application maintainers with name and email for each 179 maintainers: 180 - name: %s 181 email: 182 `, currentUser) 183 184 manifest := fs.Expected(t, 185 fs.WithFile(internal.MetadataFileName, data, fs.WithMode(0644)), 186 ) 187 assert.Assert(t, fs.Equal(tmpdir.Path(), manifest)) 188 }