github.com/ijc/docker-app@v0.6.1-0.20181012090447-c7ca8bc483fb/loader/loader_test.go (about) 1 package loader 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "strings" 7 "testing" 8 9 "github.com/docker/app/internal" 10 "github.com/docker/app/types" 11 "github.com/docker/docker/pkg/archive" 12 "github.com/pkg/errors" 13 14 "gotest.tools/assert" 15 is "gotest.tools/assert/cmp" 16 "gotest.tools/fs" 17 ) 18 19 const ( 20 metadata = `name: my-app 21 version: 1.0.0` 22 yaml = `version: "3.1" 23 24 services: 25 web: 26 image: nginx` 27 settings = `foo: bar` 28 ) 29 30 func TestLoadFromSingleFile(t *testing.T) { 31 singlefile := fmt.Sprintf(`%s 32 --- 33 %s 34 --- 35 %s`, metadata, yaml, settings) 36 app, err := LoadFromSingleFile("my-app", strings.NewReader(singlefile)) 37 assert.NilError(t, err) 38 assert.Assert(t, app != nil) 39 assert.Assert(t, is.Equal(app.Path, "my-app")) 40 assertAppContent(t, app) 41 } 42 43 func TestLoadFromSingleFileInvalidReader(t *testing.T) { 44 _, err := LoadFromSingleFile("my-app", &faultyReader{}) 45 assert.ErrorContains(t, err, "faulty reader") 46 } 47 48 func TestLoadFromSingleFileMalformed(t *testing.T) { 49 _, err := LoadFromSingleFile("my-app", strings.NewReader(`foo 50 --- 51 bar`)) 52 assert.ErrorContains(t, err, "malformed single-file application") 53 } 54 55 func TestLoadFromDirectory(t *testing.T) { 56 dir := fs.NewDir(t, "my-app", 57 fs.WithFile(internal.MetadataFileName, metadata), 58 fs.WithFile(internal.SettingsFileName, settings), 59 fs.WithFile(internal.ComposeFileName, yaml), 60 ) 61 defer dir.Remove() 62 app, err := LoadFromDirectory(dir.Path()) 63 assert.NilError(t, err) 64 assert.Assert(t, app != nil) 65 assert.Assert(t, is.Equal(app.Path, dir.Path())) 66 assertAppContent(t, app) 67 } 68 69 func TestLoadFromTarInexistent(t *testing.T) { 70 _, err := LoadFromTar("any-tar.tar") 71 assert.ErrorContains(t, err, "open any-tar.tar") 72 } 73 74 func TestLoadFromTar(t *testing.T) { 75 myapp := createAppTar(t) 76 defer myapp.Remove() 77 app, err := LoadFromTar(myapp.Path()) 78 assert.NilError(t, err) 79 assert.Assert(t, app != nil) 80 assert.Assert(t, is.Equal(app.Path, myapp.Path())) 81 assertAppContent(t, app) 82 } 83 84 func createAppTar(t *testing.T) *fs.File { 85 t.Helper() 86 dir := fs.NewDir(t, "my-app", 87 fs.WithFile(internal.MetadataFileName, metadata), 88 fs.WithFile(internal.SettingsFileName, settings), 89 fs.WithFile(internal.ComposeFileName, yaml), 90 ) 91 defer dir.Remove() 92 r, err := archive.TarWithOptions(dir.Path(), &archive.TarOptions{ 93 Compression: archive.Uncompressed, 94 }) 95 assert.NilError(t, err) 96 data, err := ioutil.ReadAll(r) 97 assert.NilError(t, err) 98 return fs.NewFile(t, "app", fs.WithBytes(data)) 99 } 100 101 func assertContentIs(t *testing.T, actual []byte, expected string) { 102 t.Helper() 103 assert.Assert(t, is.Equal(string(actual), expected)) 104 } 105 106 func assertAppContent(t *testing.T, app *types.App) { 107 assert.Assert(t, is.Len(app.SettingsRaw(), 1)) 108 assertContentIs(t, app.SettingsRaw()[0], settings) 109 assert.Assert(t, is.Len(app.Composes(), 1)) 110 assertContentIs(t, app.Composes()[0], yaml) 111 assertContentIs(t, app.MetadataRaw(), metadata) 112 } 113 114 type faultyReader struct{} 115 116 func (r *faultyReader) Read(_ []byte) (int, error) { 117 return 0, errors.New("faulty reader") 118 }