github.com/ddev/ddev@v1.23.2-0.20240519125000-d824ffe36ff3/pkg/ddevapp/providerLagoon_test.go (about) 1 package ddevapp_test 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 "strings" 8 "testing" 9 10 "github.com/ddev/ddev/pkg/ddevapp" 11 "github.com/ddev/ddev/pkg/exec" 12 "github.com/ddev/ddev/pkg/fileutil" 13 "github.com/ddev/ddev/pkg/globalconfig" 14 "github.com/ddev/ddev/pkg/nodeps" 15 "github.com/ddev/ddev/pkg/testcommon" 16 asrt "github.com/stretchr/testify/assert" 17 "github.com/stretchr/testify/require" 18 ) 19 20 /** 21 * These tests rely on an external test account. 22 */ 23 24 const lagoonProjectName = "amazeeio-ddev" 25 26 // TODO: Change to use the "pull" environment when we have one 27 const lagoonPullTestSiteEnvironment = "pull" 28 const lagoonPushTestSiteEnvironment = "push" 29 30 // TODO: Change this to the actual dediicated pull environment 31 const lagoonPullSiteURL = "https://nginx.pull.amazeeio-ddev.us2.amazee.io/" 32 const lagoonSiteExpectation = "Super easy vegetarian pasta" 33 34 // These tests won't run with GitHub actions on a forked PR. 35 36 func lagoonSetupSSHKey(t *testing.T) string { 37 sshkey := "" 38 if sshkey = os.Getenv("DDEV_LAGOON_SSH_KEY"); sshkey == "" { 39 t.Skipf("No DDEV_LAGOON_SSH_KEY env var has been set. Skipping %v", t.Name()) 40 } 41 sshkey = strings.Replace(sshkey, "<SPLIT>", "\n", -1) 42 return sshkey 43 } 44 45 // TestLagoonPull ensures we can pull from lagoon 46 func TestLagoonPull(t *testing.T) { 47 assert := asrt.New(t) 48 var err error 49 50 sshKey := lagoonSetupSSHKey(t) 51 52 require.True(t, isPullSiteValid(lagoonPullSiteURL, lagoonSiteExpectation), "lagoonPullSiteURL %s isn't working right", lagoonPullSiteURL) 53 54 origDir, _ := os.Getwd() 55 56 siteDir := testcommon.CreateTmpDir(t.Name()) 57 58 err = globalconfig.RemoveProjectInfo(t.Name()) 59 require.NoError(t, err) 60 61 err = os.Chdir(siteDir) 62 assert.NoError(err) 63 app, err := ddevapp.NewApp(siteDir, true) 64 assert.NoError(err) 65 app.Name = t.Name() 66 app.Type = nodeps.AppTypeDrupal 67 err = app.Stop(true, false) 68 require.NoError(t, err) 69 err = app.WriteConfig() 70 require.NoError(t, err) 71 72 testcommon.ClearDockerEnv() 73 74 t.Cleanup(func() { 75 err = app.Stop(true, false) 76 assert.NoError(err) 77 78 err = os.Chdir(origDir) 79 assert.NoError(err) 80 _ = os.RemoveAll(siteDir) 81 }) 82 83 err = ddevapp.PopulateExamplesCommandsHomeadditions(app.Name) 84 require.NoError(t, err) 85 86 app.Docroot = "web" 87 err = app.WriteConfig() 88 require.NoError(t, err) 89 90 provider, err := app.GetProvider("lagoon") 91 require.NoError(t, err) 92 93 app.WebEnvironment = []string{"LAGOON_PROJECT=" + lagoonProjectName, "LAGOON_ENVIRONMENT=" + lagoonPullTestSiteEnvironment} 94 95 err = setupSSHKey(t, sshKey, filepath.Join(origDir, "testdata", t.Name())) 96 require.NoError(t, err) 97 98 err = fileutil.CopyFile(filepath.Join(origDir, "testdata", t.Name(), ".lagoon.yml"), filepath.Join(app.AppRoot, ".lagoon.yml")) 99 require.NoError(t, err) 100 101 err = app.Start() 102 require.NoError(t, err) 103 err = app.Pull(provider, false, false, false) 104 require.NoError(t, err) 105 106 assert.FileExists(filepath.Join(app.GetHostUploadDirFullPath(), "victoria-sponge-umami.jpg")) 107 out, err := exec.RunHostCommand("bash", "-c", fmt.Sprintf(`echo 'select COUNT(*) from users_field_data where mail="margaret.hopper@example.com";' | %s mysql -N`, DdevBin)) 108 assert.NoError(err) 109 assert.True(strings.HasPrefix(out, "1\n")) 110 } 111 112 // TestLagoonPush ensures we can push to lagoon for a configured environment. 113 func TestLagoonPush(t *testing.T) { 114 assert := asrt.New(t) 115 origDir, _ := os.Getwd() 116 117 sshKey := lagoonSetupSSHKey(t) 118 119 siteDir := testcommon.CreateTmpDir(t.Name()) 120 121 err := os.Chdir(siteDir) 122 require.NoError(t, err) 123 124 err = globalconfig.RemoveProjectInfo(t.Name()) 125 require.NoError(t, err) 126 127 app, err := ddevapp.NewApp(siteDir, true) 128 assert.NoError(err) 129 130 t.Cleanup(func() { 131 err = app.Stop(true, false) 132 assert.NoError(err) 133 134 err = os.Chdir(origDir) 135 assert.NoError(err) 136 _ = os.RemoveAll(siteDir) 137 }) 138 139 app.Name = t.Name() 140 app.Type = nodeps.AppTypeDrupal 141 _ = app.Stop(true, false) 142 143 app.Docroot = "web" 144 145 err = app.WriteConfig() 146 require.NoError(t, err) 147 148 testcommon.ClearDockerEnv() 149 150 err = ddevapp.PopulateExamplesCommandsHomeadditions(app.Name) 151 require.NoError(t, err) 152 153 provider, err := app.GetProvider("lagoon") 154 require.NoError(t, err) 155 156 provider.EnvironmentVariables["LAGOON_PROJECT"] = lagoonProjectName 157 provider.EnvironmentVariables["LAGOON_ENVIRONMENT"] = lagoonPushTestSiteEnvironment 158 159 err = setupSSHKey(t, sshKey, filepath.Join(origDir, "testdata", t.Name())) 160 require.NoError(t, err) 161 162 err = fileutil.CopyFile(filepath.Join(origDir, "testdata", t.Name(), ".lagoon.yml"), filepath.Join(app.AppRoot, ".lagoon.yml")) 163 require.NoError(t, err) 164 165 err = app.Start() 166 require.NoError(t, err) 167 168 // Create database and files entries that we can verify after push 169 tval := nodeps.RandomString(10) 170 _, _, err = app.Exec(&ddevapp.ExecOpts{ 171 Cmd: fmt.Sprintf(`mysql -e 'CREATE TABLE IF NOT EXISTS %s ( title VARCHAR(255) NOT NULL ); INSERT INTO %s VALUES("%s");'`, t.Name(), t.Name(), tval), 172 }) 173 require.NoError(t, err) 174 fName := tval + ".txt" 175 fContent := []byte(tval) 176 err = os.WriteFile(filepath.Join(siteDir, "web/sites/default/files", fName), fContent, 0644) 177 assert.NoError(err) 178 179 err = app.Push(provider, false, false) 180 require.NoError(t, err) 181 182 // Test that the database row was added 183 c := fmt.Sprintf(`echo 'SELECT title FROM %s WHERE title="%s";' | lagoon ssh -p %s -e %s -C 'mysql --host=$MARIADB_HOST --user=$MARIADB_USERNAME --password=$MARIADB_PASSWORD --database=$MARIADB_DATABASE'`, t.Name(), tval, lagoonProjectName, lagoonPushTestSiteEnvironment) 184 //t.Logf("attempting command '%s'", c) 185 out, _, err := app.Exec(&ddevapp.ExecOpts{ 186 Cmd: c, 187 }) 188 assert.NoError(err) 189 assert.Contains(out, tval) 190 191 // Test that the file arrived there 192 out, _, err = app.Exec(&ddevapp.ExecOpts{ 193 Cmd: fmt.Sprintf(`lagoon ssh -p %s -e %s -C 'ls -l /app/web/sites/default/files/%s'`, lagoonProjectName, lagoonPushTestSiteEnvironment, fName), 194 }) 195 assert.NoError(err) 196 assert.Contains(out, tval) 197 198 err = app.MutagenSyncFlush() 199 assert.NoError(err) 200 }