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  }