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 }