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  }