github.com/drud/ddev@v1.21.5-alpha1.0.20230226034409-94fcc4b94453/cmd/ddev/cmd/homeadditions_test.go (about)

     1  package cmd
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  	"testing"
     8  
     9  	"github.com/drud/ddev/pkg/ddevapp"
    10  	"github.com/drud/ddev/pkg/exec"
    11  	"github.com/drud/ddev/pkg/fileutil"
    12  	"github.com/drud/ddev/pkg/globalconfig"
    13  	"github.com/drud/ddev/pkg/nodeps"
    14  	"github.com/drud/ddev/pkg/testcommon"
    15  	asrt "github.com/stretchr/testify/assert"
    16  	"github.com/stretchr/testify/require"
    17  )
    18  
    19  // TestHomeadditions makes sure that extra files added to
    20  // .ddev/homeadditions and ~/.ddev/homeadditions get added into the container's ~/
    21  func TestHomeadditions(t *testing.T) {
    22  	if nodeps.MutagenEnabledDefault || globalconfig.DdevGlobalConfig.MutagenEnabledGlobal || nodeps.NoBindMountsDefault {
    23  		t.Skip("Skipping because this changes homedir and breaks mutagen functionality")
    24  	}
    25  	assert := asrt.New(t)
    26  
    27  	origDir, _ := os.Getwd()
    28  	testdata := filepath.Join(origDir, "testdata", t.Name())
    29  
    30  	tmpHome := testcommon.CreateTmpDir(t.Name() + "tempHome")
    31  	// Change the homedir temporarily
    32  	t.Setenv("HOME", tmpHome)
    33  	t.Setenv("USERPROFILE", tmpHome)
    34  
    35  	site := TestSites[0]
    36  	projectHomeadditionsDir := filepath.Join(site.Dir, ".ddev", "homeadditions")
    37  
    38  	// We can't use the standard getGlobalDDevDir here because *our* global hasn't changed.
    39  	// It's changed via $HOME for the ddev subprocess
    40  	err := os.MkdirAll(filepath.Join(tmpHome, ".ddev"), 0755)
    41  	assert.NoError(err)
    42  	tmpHomeGlobalHomeadditionsDir := filepath.Join(tmpHome, ".ddev", "homeadditions")
    43  	err = os.RemoveAll(tmpHomeGlobalHomeadditionsDir)
    44  	assert.NoError(err)
    45  	err = os.RemoveAll(projectHomeadditionsDir)
    46  	assert.NoError(err)
    47  	err = fileutil.CopyDir(filepath.Join(testdata, "global"), tmpHomeGlobalHomeadditionsDir)
    48  	assert.NoError(err)
    49  	err = fileutil.CopyDir(filepath.Join(testdata, "project"), projectHomeadditionsDir)
    50  	assert.NoError(err)
    51  	err = os.Chdir(site.Dir)
    52  	require.NoError(t, err)
    53  	t.Cleanup(func() {
    54  		_, err := os.Stat(globalconfig.GetMutagenPath())
    55  		if err == nil {
    56  			out, err := exec.RunHostCommand(DdevBin, "debug", "mutagen", "daemon", "stop")
    57  			assert.NoError(err, "mutagen daemon stop returned %s", string(out))
    58  		}
    59  
    60  		err = os.Chdir(origDir)
    61  		assert.NoError(err)
    62  		err = fileutil.PurgeDirectory(projectHomeadditionsDir)
    63  		assert.NoError(err)
    64  		err = os.RemoveAll(tmpHome)
    65  		assert.NoError(err)
    66  	})
    67  
    68  	// Before we can symlink global, need to make sure anything is already gone
    69  	err = os.RemoveAll(filepath.Join(tmpHomeGlobalHomeadditionsDir, "realglobaltarget.txt"))
    70  	assert.NoError(err)
    71  	err = os.RemoveAll(filepath.Join(projectHomeadditionsDir, "realprojecttarget.txt"))
    72  	assert.NoError(err)
    73  
    74  	// symlink the project file
    75  	err = os.Symlink(filepath.Join(origDir, "testdata", t.Name(), "project/realprojecttarget.txt"), filepath.Join(projectHomeadditionsDir, "realprojecttarget.txt"))
    76  	require.NoError(t, err)
    77  	// symlink the global file
    78  	err = os.Symlink(filepath.Join(origDir, "testdata", t.Name(), "global/realglobaltarget.txt"), filepath.Join(tmpHomeGlobalHomeadditionsDir, "realglobaltarget.txt"))
    79  	require.NoError(t, err)
    80  	// Run ddev start make sure homeadditions example files get populated
    81  	_, err = exec.RunHostCommand(DdevBin, "restart")
    82  	assert.NoError(err)
    83  
    84  	for _, f := range []string{"bash_aliases.example", "README.txt"} {
    85  		assert.FileExists(filepath.Join(projectHomeadditionsDir, f))
    86  		assert.FileExists(filepath.Join(tmpHomeGlobalHomeadditionsDir, f))
    87  	}
    88  
    89  	app, err := ddevapp.GetActiveApp(site.Name)
    90  	require.NoError(t, err)
    91  
    92  	// Make sure that even though there was a global and a project-level .myscript.sh
    93  	// the project-level one should win.
    94  
    95  	stdout, _, err := app.Exec(&ddevapp.ExecOpts{
    96  		Service: "web",
    97  		Cmd:     "~/.myscript.sh",
    98  	})
    99  	assert.NoError(err)
   100  	assert.Contains(stdout, "this is project .myscript.sh")
   101  
   102  	for _, script := range []string{"global", "project"} {
   103  		stdout, _, err = app.Exec(&ddevapp.ExecOpts{
   104  			Service: "web",
   105  			Cmd:     fmt.Sprintf("~/.%sscript.sh", script),
   106  		})
   107  		assert.NoError(err)
   108  		assert.Contains(stdout, fmt.Sprintf("this is .%sscript.sh", script))
   109  	}
   110  	for _, f := range []string{"realglobaltarget.txt", "realprojecttarget.txt"} {
   111  		_, _, err = app.Exec(&ddevapp.ExecOpts{
   112  			Cmd: `ls ~/` + f,
   113  		})
   114  		assert.NoError(err)
   115  	}
   116  }