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 }