github.com/drud/ddev@v1.21.5-alpha1.0.20230226034409-94fcc4b94453/pkg/ddevapp/providerPlatform_test.go (about) 1 package ddevapp_test 2 3 import ( 4 "fmt" 5 "github.com/drud/ddev/pkg/exec" 6 "github.com/drud/ddev/pkg/globalconfig" 7 "github.com/drud/ddev/pkg/nodeps" 8 "github.com/drud/ddev/pkg/util" 9 "github.com/stretchr/testify/require" 10 "os" 11 "path/filepath" 12 "strings" 13 "testing" 14 15 . "github.com/drud/ddev/pkg/ddevapp" 16 "github.com/drud/ddev/pkg/testcommon" 17 asrt "github.com/stretchr/testify/assert" 18 ) 19 20 /** 21 * These tests rely on an external test account. To run them, you'll 22 * need to set an environment variable called "DDEV_PLATFORM_API_TOKEN" with credentials for 23 * this account. If no such environment variable is present, these tests will be skipped. 24 * 25 * A valid site must be present which matches the test site and environment name 26 * defined in the constants below. 27 */ 28 29 const platformTestSiteID = "lago3j23xu2w6" 30 const platformPullTestSiteEnvironment = "platform-pull" 31 const platformPushTestSiteEnvironment = "platform-push" 32 33 const platformPullSiteURL = "https://master-7rqtwti-lago3j23xu2w6.eu-3.platformsh.site/" 34 const platformSiteExpectation = "Super easy vegetarian pasta" 35 36 // Note that these tests won't run with GitHub actions on a forked PR. 37 // Thie is a security feature, but means that PRs intended to test this 38 // must be done in the ddev repo. 39 40 // TestPlatformPull ensures we can pull backups from platform.sh for a configured environment. 41 func TestPlatformPull(t *testing.T) { 42 var token string 43 if token = os.Getenv("DDEV_PLATFORM_API_TOKEN"); token == "" { 44 t.Skipf("No DDEV_PLATFORM_API_TOKEN env var has been set. Skipping %v", t.Name()) 45 } 46 assert := asrt.New(t) 47 var err error 48 49 require.True(t, isPullSiteValid(platformPullSiteURL, platformSiteExpectation), "platformPullSiteURL %s isn't working right", platformPullSiteURL) 50 51 origDir, _ := os.Getwd() 52 53 siteDir := testcommon.CreateTmpDir(t.Name()) 54 55 err = globalconfig.RemoveProjectInfo(t.Name()) 56 require.NoError(t, err) 57 58 err = os.Chdir(siteDir) 59 assert.NoError(err) 60 app, err := NewApp(siteDir, true) 61 assert.NoError(err) 62 app.Name = t.Name() 63 app.Type = nodeps.AppTypeDrupal9 64 err = app.Stop(true, false) 65 require.NoError(t, err) 66 err = app.WriteConfig() 67 require.NoError(t, err) 68 69 testcommon.ClearDockerEnv() 70 71 t.Cleanup(func() { 72 err = app.Stop(true, false) 73 assert.NoError(err) 74 75 _ = os.Chdir(origDir) 76 err = os.RemoveAll(siteDir) 77 assert.NoError(err) 78 }) 79 80 err = PopulateExamplesCommandsHomeadditions(app.Name) 81 require.NoError(t, err) 82 83 app.Docroot = "web" 84 err = app.WriteConfig() 85 require.NoError(t, err) 86 87 provider, err := app.GetProvider("platform") 88 require.NoError(t, err) 89 90 provider.EnvironmentVariables["PLATFORM_PROJECT"] = platformTestSiteID 91 provider.EnvironmentVariables["PLATFORM_ENVIRONMENT"] = platformPullTestSiteEnvironment 92 provider.EnvironmentVariables["PLATFORMSH_CLI_TOKEN"] = token 93 94 err = app.Start() 95 require.NoError(t, err) 96 err = app.Pull(provider, false, false, false) 97 require.NoError(t, err) 98 99 assert.FileExists(filepath.Join(app.GetHostUploadDirFullPath(), "victoria-sponge-umami.jpg")) 100 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)) 101 assert.NoError(err) 102 assert.True(strings.HasPrefix(out, "1\n")) 103 } 104 105 // TestPlatformPush ensures we can push to platform.sh for a configured environment. 106 func TestPlatformPush(t *testing.T) { 107 var token string 108 if token = os.Getenv("DDEV_PLATFORM_API_TOKEN"); token == "" { 109 t.Skipf("No DDEV_PLATFORM_API_TOKEN env var has been set. Skipping %v", t.Name()) 110 } 111 112 assert := asrt.New(t) 113 origDir, _ := os.Getwd() 114 115 siteDir := testcommon.CreateTmpDir(t.Name()) 116 117 err := os.Chdir(siteDir) 118 require.NoError(t, err) 119 120 err = globalconfig.RemoveProjectInfo(t.Name()) 121 require.NoError(t, err) 122 123 app, err := NewApp(siteDir, true) 124 assert.NoError(err) 125 126 t.Cleanup(func() { 127 err = app.Stop(true, false) 128 assert.NoError(err) 129 130 _ = os.Chdir(origDir) 131 err = os.RemoveAll(siteDir) 132 assert.NoError(err) 133 }) 134 135 app.Name = t.Name() 136 app.Type = nodeps.AppTypeDrupal8 137 app.Hooks = map[string][]YAMLTask{"post-push": {{"exec-host": "touch hello-post-push-" + app.Name}}, "pre-push": {{"exec-host": "touch hello-pre-push-" + app.Name}}} 138 _ = app.Stop(true, false) 139 140 app.Docroot = "web" 141 142 err = app.WriteConfig() 143 require.NoError(t, err) 144 145 testcommon.ClearDockerEnv() 146 147 err = PopulateExamplesCommandsHomeadditions(app.Name) 148 require.NoError(t, err) 149 150 provider, err := app.GetProvider("platform") 151 require.NoError(t, err) 152 153 provider.EnvironmentVariables["PLATFORM_PROJECT"] = platformTestSiteID 154 provider.EnvironmentVariables["PLATFORM_ENVIRONMENT"] = platformPushTestSiteEnvironment 155 provider.EnvironmentVariables["PLATFORMSH_CLI_TOKEN"] = token 156 157 err = app.Start() 158 require.NoError(t, err) 159 160 // Create database and files entries that we can verify after push 161 tval := nodeps.RandomString(10) 162 _, _, err = app.Exec(&ExecOpts{ 163 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), 164 }) 165 require.NoError(t, err) 166 fName := tval + ".txt" 167 fContent := []byte(tval) 168 err = os.WriteFile(filepath.Join(siteDir, "web/sites/default/files", fName), fContent, 0644) 169 assert.NoError(err) 170 171 err = app.Push(provider, false, false) 172 require.NoError(t, err) 173 174 // Test that the database row was added 175 out, _, err := app.Exec(&ExecOpts{ 176 Cmd: fmt.Sprintf(`echo 'SELECT title FROM %s WHERE title="%s";' | PLATFORMSH_CLI_TOKEN=%s platform db:sql --project="%s" --environment="%s"`, t.Name(), tval, token, platformTestSiteID, platformPushTestSiteEnvironment), 177 }) 178 require.NoError(t, err) 179 assert.Contains(out, tval) 180 181 // Test that the file arrived there (by rsyncing it back) 182 tmpRsyncDir := filepath.Join("/tmp", t.Name()+util.RandString(5)) 183 out, _, err = app.Exec(&ExecOpts{ 184 Cmd: fmt.Sprintf(`PLATFORMSH_CLI_TOKEN=%s platform mount:download --yes --quiet --project="%s" --environment="%s" --mount=web/sites/default/files --target=%s && cat %s/%s && rm -rf %s`, token, platformTestSiteID, platformPushTestSiteEnvironment, tmpRsyncDir, tmpRsyncDir, fName, tmpRsyncDir), 185 }) 186 require.NoError(t, err) 187 assert.Contains(out, tval) 188 189 err = app.MutagenSyncFlush() 190 assert.NoError(err) 191 192 assert.FileExists("hello-pre-push-" + app.Name) 193 assert.FileExists("hello-post-push-" + app.Name) 194 err = os.Remove("hello-pre-push-" + app.Name) 195 assert.NoError(err) 196 err = os.Remove("hello-post-push-" + app.Name) 197 assert.NoError(err) 198 }