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  }