github.com/ddev/ddev@v1.23.2-0.20240519125000-d824ffe36ff3/pkg/ddevapp/mailpit_test.go (about)

     1  package ddevapp_test
     2  
     3  import (
     4  	"fmt"
     5  	"github.com/ddev/ddev/pkg/ddevapp"
     6  	"github.com/ddev/ddev/pkg/dockerutil"
     7  	"github.com/ddev/ddev/pkg/fileutil"
     8  	"github.com/ddev/ddev/pkg/globalconfig"
     9  	"github.com/ddev/ddev/pkg/testcommon"
    10  	assert2 "github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  	"os"
    13  	"path/filepath"
    14  	"testing"
    15  	"time"
    16  )
    17  
    18  // TestMailpit does a basic test of mailpit.
    19  func TestMailpit(t *testing.T) {
    20  	assert := assert2.New(t)
    21  
    22  	testcommon.ClearDockerEnv()
    23  
    24  	origDir, _ := os.Getwd()
    25  	testDir := testcommon.CreateTmpDir(t.Name())
    26  
    27  	app, err := ddevapp.NewApp(testDir, false)
    28  	require.NoError(t, err)
    29  	t.Cleanup(func() {
    30  		globalconfig.DdevGlobalConfig.RouterMailpitHTTPPort = ""
    31  		globalconfig.DdevGlobalConfig.RouterMailpitHTTPSPort = ""
    32  		err = globalconfig.WriteGlobalConfig(globalconfig.DdevGlobalConfig)
    33  		assert.NoError(err)
    34  		err = app.Stop(true, false)
    35  		assert.NoError(err)
    36  		_ = os.RemoveAll(testDir)
    37  	})
    38  
    39  	_ = os.RemoveAll(testDir)
    40  	err = fileutil.CopyDir(filepath.Join(origDir, "testdata", t.Name()), testDir)
    41  	require.NoError(t, err)
    42  
    43  	err = app.WriteConfig()
    44  	require.NoError(t, err)
    45  
    46  	err = globalconfig.ReadGlobalConfig()
    47  	require.NoError(t, err)
    48  
    49  	err = app.Start()
    50  	require.NoError(t, err)
    51  
    52  	stdout, stderr, err := app.Exec(&ddevapp.ExecOpts{
    53  		Service: "web",
    54  		Cmd:     "composer install",
    55  	})
    56  	require.NoError(t, err)
    57  	assert.Contains(stderr, "No composer.lock file present. Updating dependencies", "stdout='%s' stderr='%s'", stdout, stderr)
    58  
    59  	err = app.MutagenSyncFlush()
    60  	require.NoError(t, err)
    61  
    62  	expectation := "Testing DDEV Mailpit on default ports"
    63  	stdout, _, err = app.Exec(&ddevapp.ExecOpts{
    64  		Service: "web",
    65  		Cmd:     `php send_email.php "` + expectation + `"`,
    66  	})
    67  	require.NoError(t, err)
    68  	assert.Contains(stdout, "Message sent!")
    69  
    70  	// See if we got the mail.
    71  	desc, err := app.Describe(true)
    72  	require.NoError(t, err)
    73  	require.NotNil(t, desc["mailpit_url"])
    74  	require.NotNil(t, desc["mailpit_https_url"])
    75  
    76  	resp, err := testcommon.EnsureLocalHTTPContent(t, desc["mailpit_url"].(string)+"/api/v1/messages", expectation)
    77  	require.NoError(t, err, "Error getting mailpit_url: %v resp=%v", err, resp)
    78  	// Colima tests on github don't respect https
    79  	if !dockerutil.IsColima() && !dockerutil.IsLima() {
    80  		resp, err = testcommon.EnsureLocalHTTPContent(t, desc["mailpit_https_url"].(string)+"/api/v1/messages", expectation)
    81  		require.NoError(t, err, "Error getting mailpit_url: %v resp=%v", err, resp)
    82  	}
    83  	// Change the global ports to make sure that works
    84  	globalconfig.DdevGlobalConfig.RouterMailpitHTTPPort = "28023"
    85  	globalconfig.DdevGlobalConfig.RouterMailpitHTTPSPort = "28024"
    86  	require.NoError(t, err)
    87  
    88  	err = globalconfig.WriteGlobalConfig(globalconfig.DdevGlobalConfig)
    89  	require.NoError(t, err)
    90  
    91  	err = app.Restart()
    92  	require.NoError(t, err)
    93  
    94  	expectation = fmt.Sprintf("Testing DDEV Mailpit on global ports %v and %v", globalconfig.DdevGlobalConfig.RouterMailpitHTTPPort, globalconfig.DdevGlobalConfig.RouterMailpitHTTPSPort)
    95  	stdout, _, err = app.Exec(&ddevapp.ExecOpts{
    96  		Service: "web",
    97  		Cmd:     `php send_email.php "` + expectation + `"`,
    98  	})
    99  	require.NoError(t, err)
   100  	assert.Contains(stdout, "Message sent!")
   101  
   102  	desc, err = app.Describe(true)
   103  	require.NoError(t, err)
   104  	require.NotNil(t, desc["mailpit_url"])
   105  	require.NotNil(t, desc["mailpit_https_url"])
   106  
   107  	// The API may not be ready the first time we hit it, especially on Rancher Desktop
   108  	// So try a few times
   109  	for i := 0; i < 5; i++ {
   110  		_, _, err = testcommon.GetLocalHTTPResponse(t, desc["mailpit_url"].(string)+"/api/v1/messages")
   111  		if err != nil {
   112  			t.Logf("Error hitting mailpit_url (try %d): %v resp=%v", i, err, resp)
   113  			time.Sleep(1 * time.Second)
   114  		} else {
   115  			break
   116  		}
   117  	}
   118  	resp, err = testcommon.EnsureLocalHTTPContent(t, desc["mailpit_url"].(string)+"/api/v1/messages", expectation)
   119  	require.NoError(t, err, "Error getting mailpit_url: %v resp=%v", err, resp)
   120  	// Colima tests on GitHub don't respect https
   121  	if !dockerutil.IsColima() && !dockerutil.IsLima() {
   122  		resp, err = testcommon.EnsureLocalHTTPContent(t, desc["mailpit_https_url"].(string)+"/api/v1/messages", expectation)
   123  		require.NoError(t, err, "Error getting mailpit_url: %v resp=%v", err, resp)
   124  	}
   125  
   126  	// Change the ports on the project to make sure that works
   127  	app.MailpitHTTPPort = "18025"
   128  	app.MailpitHTTPSPort = "18026"
   129  	err = app.Restart()
   130  	require.NoError(t, err)
   131  
   132  	expectation = fmt.Sprintf("Testing DDEV Mailpit on project-overridden ports %v and %v", app.MailpitHTTPPort, app.MailpitHTTPSPort)
   133  	stdout, _, err = app.Exec(&ddevapp.ExecOpts{
   134  		Service: "web",
   135  		Cmd:     `php send_email.php "` + expectation + `"`,
   136  	})
   137  	require.NoError(t, err)
   138  	assert.Contains(stdout, "Message sent!")
   139  
   140  	desc, err = app.Describe(true)
   141  	require.NoError(t, err)
   142  	require.NotNil(t, desc["mailpit_url"])
   143  	require.NotNil(t, desc["mailpit_https_url"])
   144  
   145  	// The API may not be ready the first time we hit it, especially on Rancher Desktop
   146  	// So try a few times
   147  	for i := 0; i < 5; i++ {
   148  		_, _, err = testcommon.GetLocalHTTPResponse(t, desc["mailpit_url"].(string)+"/api/v1/messages")
   149  		if err != nil {
   150  			t.Logf("Error hitting mailpit_url (try %d): %v resp=%v", i, err, resp)
   151  			time.Sleep(1 * time.Second)
   152  		} else {
   153  			break
   154  		}
   155  	}
   156  	resp, err = testcommon.EnsureLocalHTTPContent(t, desc["mailpit_url"].(string)+"/api/v1/messages", expectation)
   157  	require.NoError(t, err, "Error getting mailpit_url: %v resp=%v", err, resp)
   158  	// Colima tests on github don't respect https
   159  	if !dockerutil.IsColima() && !dockerutil.IsLima() {
   160  		resp, err = testcommon.EnsureLocalHTTPContent(t, desc["mailpit_https_url"].(string)+"/api/v1/messages", expectation)
   161  		require.NoError(t, err, "Error getting mailpit_url: %v resp=%v", err, resp)
   162  	}
   163  }