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  }