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  }