github.com/ddev/ddev@v1.23.2-0.20240519125000-d824ffe36ff3/pkg/ddevapp/composer_test.go (about)

     1  package ddevapp_test
     2  
     3  import (
     4  	"github.com/ddev/ddev/pkg/ddevapp"
     5  	"github.com/ddev/ddev/pkg/fileutil"
     6  	"github.com/ddev/ddev/pkg/globalconfig"
     7  	"github.com/ddev/ddev/pkg/testcommon"
     8  	asrt "github.com/stretchr/testify/assert"
     9  	"github.com/stretchr/testify/require"
    10  	"os"
    11  	"strings"
    12  	"testing"
    13  )
    14  
    15  // TestComposer does trivial tests of the DDEV Composer command
    16  // More tests are found in the cmd package
    17  func TestComposer(t *testing.T) {
    18  	assert := asrt.New(t)
    19  	app := &ddevapp.DdevApp{}
    20  	origDir, _ := os.Getwd()
    21  
    22  	// Use drupal9 only for this test, need a little Composer action
    23  	site := FullTestSites[8]
    24  	// If running this with GOTEST_SHORT we have to create the directory, tarball etc.
    25  	if site.Dir == "" || !fileutil.FileExists(site.Dir) {
    26  		app := &ddevapp.DdevApp{Name: site.Name}
    27  		_ = app.Stop(true, false)
    28  		_ = globalconfig.RemoveProjectInfo(site.Name)
    29  
    30  		err := site.Prepare()
    31  		require.NoError(t, err)
    32  		t.Cleanup(func() {
    33  			err = app.Stop(true, false)
    34  			assert.NoError(err)
    35  			err := os.Chdir(origDir)
    36  			assert.NoError(err)
    37  			_ = os.RemoveAll(app.AppRoot)
    38  		})
    39  	}
    40  
    41  	_ = os.Chdir(site.Dir)
    42  
    43  	testcommon.ClearDockerEnv()
    44  	err := app.Init(site.Dir)
    45  	assert.NoError(err)
    46  	app.Hooks = map[string][]ddevapp.YAMLTask{"post-composer": {{"exec-host": "touch hello-post-composer-" + app.Name}}, "pre-composer": {{"exec-host": "touch hello-pre-composer-" + app.Name}}}
    47  	// Make sure we get rid of this for other uses
    48  
    49  	t.Cleanup(func() {
    50  		err = os.Chdir(origDir)
    51  		assert.NoError(err)
    52  		app.Hooks = nil
    53  		app.ComposerVersion = ""
    54  		_ = app.WriteConfig()
    55  		_ = app.Stop(true, false)
    56  	})
    57  
    58  	err = app.Start()
    59  	require.NoError(t, err)
    60  
    61  	// Make sure to remove the var-dump-server to start; composer install should replace it.
    62  	_ = os.RemoveAll("vendor/bin/var-dump-server")
    63  
    64  	err = app.MutagenSyncFlush()
    65  	assert.NoError(err)
    66  
    67  	_, _, err = app.Composer([]string{"config", "--no-plugins", "allow-plugins", "true"})
    68  	require.NoError(t, err)
    69  	_, _, err = app.Composer([]string{"install", "--no-progress", "--no-interaction"})
    70  	require.NoError(t, err)
    71  	err = app.MutagenSyncFlush()
    72  	require.NoError(t, err)
    73  
    74  	out, _, err := app.Exec(&ddevapp.ExecOpts{
    75  		Cmd: "ls -l vendor/bin/var-dump-server | awk '{print $1}'",
    76  	})
    77  	assert.NoError(err)
    78  	assert.True(strings.HasPrefix(out, "lrwx") || strings.HasPrefix(out, "-rwx"), "perms of var-dump-server should be 'lrwx' or '-rwx', got '%s' instead", out)
    79  
    80  	_, _, err = app.Exec(&ddevapp.ExecOpts{
    81  		Cmd: "vendor/bin/var-dump-server -h",
    82  	})
    83  	assert.NoError(err)
    84  
    85  	assert.FileExists("hello-pre-composer-" + app.Name)
    86  	assert.FileExists("hello-post-composer-" + app.Name)
    87  	err = os.Remove("hello-pre-composer-" + app.Name)
    88  	assert.NoError(err)
    89  	err = os.Remove("hello-post-composer-" + app.Name)
    90  	assert.NoError(err)
    91  }
    92  
    93  // TestComposerVersion tests to make sure that composer_version setting
    94  // works correctly
    95  func TestComposerVersion(t *testing.T) {
    96  	assert := asrt.New(t)
    97  
    98  	testDir := testcommon.CreateTmpDir(t.Name())
    99  
   100  	origDir, _ := os.Getwd()
   101  	err := os.Chdir(testDir)
   102  	assert.NoError(err)
   103  
   104  	app, err := ddevapp.NewApp(testDir, false)
   105  	assert.NoError(err)
   106  
   107  	t.Cleanup(func() {
   108  		err = app.Stop(true, false)
   109  		assert.NoError(err)
   110  		err = os.Chdir(origDir)
   111  		assert.NoError(err)
   112  		// Mutagen can compete with removal, so go ahead and ignore result
   113  		_ = os.RemoveAll(testDir)
   114  	})
   115  
   116  	_ = app.Stop(true, false)
   117  	app.Name = t.Name()
   118  	err = app.WriteConfig()
   119  	require.NoError(t, err)
   120  
   121  	// Make sure base version (default) is Composer v2
   122  	err = app.Start()
   123  	require.NoError(t, err)
   124  	stdout, _, err := app.Exec(&ddevapp.ExecOpts{Cmd: "composer --version"})
   125  	assert.NoError(err)
   126  	assert.True(strings.HasPrefix(stdout, "Composer 2") || strings.HasPrefix(stdout, "Composer version 2"), "Composer version not the expected Composer 2: %v", stdout)
   127  
   128  	// Make sure it does the right thing with 1.x
   129  	app.ComposerVersion = "1"
   130  	err = app.Restart()
   131  	require.NoError(t, err)
   132  	stdout, _, err = app.Exec(&ddevapp.ExecOpts{Cmd: "composer --version"})
   133  	assert.NoError(err)
   134  	assert.Contains(stdout, "Composer version 1")
   135  
   136  	// With version "2" we should be back to latest v2
   137  	app.ComposerVersion = "2"
   138  	err = app.Restart()
   139  	require.NoError(t, err)
   140  	stdout, _, err = app.Exec(&ddevapp.ExecOpts{Cmd: "composer --version"})
   141  	assert.NoError(err)
   142  	assert.True(strings.HasPrefix(stdout, "Composer 2") || strings.HasPrefix(stdout, "Composer version 2"), "Composer version doesn't start with the expected value: %v", stdout)
   143  
   144  	// With explicit version, we should get that version
   145  	app.ComposerVersion = "2.0.1"
   146  	err = app.Restart()
   147  	require.NoError(t, err)
   148  	stdout, _, err = app.Exec(&ddevapp.ExecOpts{Cmd: "composer --version"})
   149  	assert.NoError(err)
   150  	assert.Contains(stdout, "Composer version "+app.ComposerVersion)
   151  }