github.com/ijc/docker-app@v0.6.1-0.20181012090447-c7ca8bc483fb/types/types_test.go (about) 1 package types 2 3 import ( 4 "errors" 5 "path" 6 "strings" 7 "testing" 8 9 "github.com/docker/app/internal" 10 11 "gotest.tools/assert" 12 is "gotest.tools/assert/cmp" 13 "gotest.tools/fs" 14 ) 15 16 const ( 17 validMeta = `name: test-app 18 version: 0.1.0` 19 validCompose = `version: "3.0" 20 services: 21 web: 22 image: nginx` 23 validSettings = `foo: bar` 24 ) 25 26 func TestNewApp(t *testing.T) { 27 app, err := NewApp("any-app") 28 assert.NilError(t, err) 29 assert.Assert(t, is.Equal(app.Path, "any-app")) 30 } 31 32 func TestNewAppFromDefaultFiles(t *testing.T) { 33 dir := fs.NewDir(t, "my-app", 34 fs.WithFile(internal.MetadataFileName, validMeta), 35 fs.WithFile(internal.SettingsFileName, `foo: bar`), 36 fs.WithFile(internal.ComposeFileName, validCompose), 37 ) 38 defer dir.Remove() 39 app, err := NewAppFromDefaultFiles(dir.Path()) 40 assert.NilError(t, err) 41 assert.Assert(t, is.Len(app.SettingsRaw(), 1)) 42 assertContentIs(t, app.SettingsRaw()[0], `foo: bar`) 43 assert.Assert(t, is.Len(app.Composes(), 1)) 44 assertContentIs(t, app.Composes()[0], validCompose) 45 assertContentIs(t, app.MetadataRaw(), validMeta) 46 } 47 48 func TestNewAppWithOpError(t *testing.T) { 49 _, err := NewApp("any-app", func(_ *App) error { return errors.New("error creating") }) 50 assert.ErrorContains(t, err, "error creating") 51 } 52 53 func TestWithPath(t *testing.T) { 54 app := &App{Path: "any-app"} 55 err := WithPath("any-path")(app) 56 assert.NilError(t, err) 57 assert.Assert(t, is.Equal(app.Path, "any-path")) 58 } 59 60 func TestWithCleanup(t *testing.T) { 61 app := &App{Path: "any-app"} 62 err := WithCleanup(func() {})(app) 63 assert.NilError(t, err) 64 assert.Assert(t, app.Cleanup != nil) 65 } 66 67 func TestWithSettingsFilesError(t *testing.T) { 68 app := &App{Path: "any-app"} 69 err := WithSettingsFiles("any-settings-file")(app) 70 assert.ErrorContains(t, err, "open any-settings-file") 71 } 72 73 func TestWithSettingsFiles(t *testing.T) { 74 dir := fs.NewDir(t, "settings", 75 fs.WithFile("my-settings-file", validSettings), 76 ) 77 defer dir.Remove() 78 app := &App{Path: "my-app"} 79 err := WithSettingsFiles(dir.Join("my-settings-file"))(app) 80 assert.NilError(t, err) 81 assert.Assert(t, is.Len(app.SettingsRaw(), 1)) 82 assertContentIs(t, app.SettingsRaw()[0], validSettings) 83 } 84 85 func TestWithSettings(t *testing.T) { 86 r := strings.NewReader(validSettings) 87 app := &App{Path: "my-app"} 88 err := WithSettings(r)(app) 89 assert.NilError(t, err) 90 assert.Assert(t, is.Len(app.SettingsRaw(), 1)) 91 assertContentIs(t, app.SettingsRaw()[0], validSettings) 92 } 93 94 func TestWithComposeFilesError(t *testing.T) { 95 app := &App{Path: "any-app"} 96 err := WithComposeFiles("any-compose-file")(app) 97 assert.ErrorContains(t, err, "open any-compose-file") 98 } 99 100 func TestWithComposeFiles(t *testing.T) { 101 dir := fs.NewDir(t, "composes", 102 fs.WithFile("my-compose-file", validCompose), 103 ) 104 defer dir.Remove() 105 app := &App{Path: "my-app"} 106 err := WithComposeFiles(dir.Join("my-compose-file"))(app) 107 assert.NilError(t, err) 108 assert.Assert(t, is.Len(app.Composes(), 1)) 109 assertContentIs(t, app.Composes()[0], validCompose) 110 } 111 112 func TestWithComposes(t *testing.T) { 113 r := strings.NewReader(validCompose) 114 app := &App{Path: "my-app"} 115 err := WithComposes(r)(app) 116 assert.NilError(t, err) 117 assert.Assert(t, is.Len(app.Composes(), 1)) 118 assertContentIs(t, app.Composes()[0], validCompose) 119 } 120 121 func TestMetadataFileError(t *testing.T) { 122 app := &App{Path: "any-app"} 123 err := MetadataFile("any-metadata-file")(app) 124 assert.ErrorContains(t, err, "open any-metadata-file") 125 } 126 127 func TestMetadataFile(t *testing.T) { 128 dir := fs.NewDir(t, "metadata", 129 fs.WithFile("my-metadata-file", validMeta), 130 ) 131 defer dir.Remove() 132 app := &App{Path: "my-app"} 133 err := MetadataFile(dir.Join("my-metadata-file"))(app) 134 assert.NilError(t, err) 135 assert.Assert(t, app.MetadataRaw() != nil) 136 assertContentIs(t, app.MetadataRaw(), validMeta) 137 } 138 139 func TestMetadata(t *testing.T) { 140 r := strings.NewReader(validMeta) 141 app := &App{Path: "my-app"} 142 err := Metadata(r)(app) 143 assert.NilError(t, err) 144 assertContentIs(t, app.MetadataRaw(), validMeta) 145 } 146 147 func assertContentIs(t *testing.T, data []byte, expected string) { 148 t.Helper() 149 assert.Assert(t, is.Equal(string(data), expected)) 150 } 151 152 func TestWithAttachmentsAndNestedDirectories(t *testing.T) { 153 dir := fs.NewDir(t, "externalfile", 154 fs.WithFile(internal.MetadataFileName, validMeta), 155 fs.WithFile(internal.SettingsFileName, `foo: bar`), 156 fs.WithFile(internal.ComposeFileName, validCompose), 157 fs.WithFile("config.cfg", "something"), 158 fs.WithDir("nesteddirectory", 159 fs.WithFile("nestedconfig.cfg", "something"), 160 ), 161 ) 162 defer dir.Remove() 163 app, err := NewAppFromDefaultFiles(dir.Path()) 164 assert.NilError(t, err) 165 assert.Assert(t, is.Len(app.Attachments(), 2)) 166 assert.Equal(t, app.Attachments()[0].Path(), "config.cfg") 167 assert.Equal(t, app.Attachments()[0].Size(), int64(9)) 168 assert.Equal(t, app.Attachments()[1].Path(), "nesteddirectory/nestedconfig.cfg") 169 } 170 171 func TestAttachmentsAreSorted(t *testing.T) { 172 dir := fs.NewDir(t, "externalfile", 173 fs.WithFile(internal.MetadataFileName, validMeta), 174 fs.WithFile(internal.SettingsFileName, `foo: bar`), 175 fs.WithFile(internal.ComposeFileName, validCompose), 176 fs.WithFile("c.cfg", "something"), 177 fs.WithFile("a.cfg", "something"), 178 fs.WithFile("b.cfg", "something"), 179 fs.WithDir("nesteddirectory", 180 fs.WithFile("a.cfg", "something"), 181 fs.WithFile("c.cfg", "something"), 182 fs.WithFile("b.cfg", "something"), 183 ), 184 ) 185 defer dir.Remove() 186 app, err := NewAppFromDefaultFiles(dir.Path()) 187 assert.NilError(t, err) 188 assert.Assert(t, is.Len(app.Attachments(), 6)) 189 assert.Equal(t, app.Attachments()[0].Path(), "a.cfg") 190 assert.Equal(t, app.Attachments()[1].Path(), "b.cfg") 191 assert.Equal(t, app.Attachments()[2].Path(), "c.cfg") 192 assert.Equal(t, app.Attachments()[3].Path(), "nesteddirectory/a.cfg") 193 assert.Equal(t, app.Attachments()[4].Path(), "nesteddirectory/b.cfg") 194 assert.Equal(t, app.Attachments()[5].Path(), "nesteddirectory/c.cfg") 195 } 196 197 func TestWithAttachmentsIncludingNestedCoreFiles(t *testing.T) { 198 dir := fs.NewDir(t, "attachments", 199 fs.WithFile(internal.MetadataFileName, validMeta), 200 fs.WithFile(internal.SettingsFileName, `foo: bar`), 201 fs.WithFile(internal.ComposeFileName, validCompose), 202 fs.WithDir("nesteddirectory", 203 fs.WithFile(internal.MetadataFileName, validMeta), 204 fs.WithFile(internal.SettingsFileName, `foo: bar`), 205 fs.WithFile(internal.ComposeFileName, validCompose), 206 ), 207 ) 208 defer dir.Remove() 209 app, err := NewAppFromDefaultFiles(dir.Path()) 210 assert.NilError(t, err) 211 assert.Assert(t, is.Len(app.Attachments(), 3)) 212 assert.Equal(t, app.Attachments()[0].Path(), path.Join("nesteddirectory", internal.ComposeFileName)) 213 assert.Equal(t, app.Attachments()[1].Path(), path.Join("nesteddirectory", internal.MetadataFileName)) 214 assert.Equal(t, app.Attachments()[2].Path(), path.Join("nesteddirectory", internal.SettingsFileName)) 215 } 216 217 func TestValidateBrokenMetadata(t *testing.T) { 218 r := strings.NewReader(`#version: 0.1.0-missing 219 name: _INVALID-name 220 namespace: myHubUsername 221 maintainers: 222 - name: user 223 email: user@email.com 224 - name: user2 225 - name: bad-user 226 email: bad-email 227 unknown: property`) 228 app := &App{Path: "my-app"} 229 err := Metadata(r)(app) 230 assert.Error(t, err, `failed to validate metadata: 231 - maintainers.2.email: Does not match format 'email' 232 - name: Does not match format 'hostname' 233 - version: version is required`) 234 } 235 236 func TestValidateBrokenSettings(t *testing.T) { 237 metadata := strings.NewReader(`version: "0.1" 238 name: myname`) 239 composeFile := strings.NewReader(`version: "3.6"`) 240 brokenSettings := strings.NewReader(`my-settings: 241 1: toto`) 242 app := &App{Path: "my-app"} 243 err := Metadata(metadata)(app) 244 assert.NilError(t, err) 245 err = WithComposes(composeFile)(app) 246 assert.NilError(t, err) 247 err = WithSettings(brokenSettings)(app) 248 assert.ErrorContains(t, err, `Non-string key in my-settings: 1`) 249 }