github.com/goravel/framework@v1.13.9/mail/application_test.go (about) 1 package mail 2 3 import ( 4 "context" 5 "os" 6 "testing" 7 "time" 8 9 "github.com/gookit/color" 10 "github.com/spf13/cast" 11 "github.com/spf13/viper" 12 "github.com/stretchr/testify/assert" 13 "github.com/stretchr/testify/suite" 14 15 configmock "github.com/goravel/framework/contracts/config/mocks" 16 logmock "github.com/goravel/framework/contracts/log/mocks" 17 "github.com/goravel/framework/contracts/mail" 18 queuecontract "github.com/goravel/framework/contracts/queue" 19 "github.com/goravel/framework/queue" 20 testingdocker "github.com/goravel/framework/support/docker" 21 "github.com/goravel/framework/support/file" 22 ) 23 24 var testBcc, testCc, testTo, testFromAddress, testFromName string 25 26 type ApplicationTestSuite struct { 27 suite.Suite 28 redisPort int 29 } 30 31 func TestApplicationTestSuite(t *testing.T) { 32 if testing.Short() { 33 t.Skip("Skipping tests of using docker") 34 } 35 36 if !file.Exists("../.env") && os.Getenv("MAIL_HOST") == "" { 37 color.Redln("No mail tests run, need create .env based on .env.example, then initialize it") 38 return 39 } 40 41 redisPool, redisResource, err := testingdocker.Redis() 42 assert.Nil(t, err) 43 44 suite.Run(t, &ApplicationTestSuite{ 45 redisPort: cast.ToInt(redisResource.GetPort("6379/tcp")), 46 }) 47 48 assert.Nil(t, redisPool.Purge(redisResource)) 49 } 50 51 func (s *ApplicationTestSuite) SetupTest() {} 52 53 func (s *ApplicationTestSuite) TestSendMailBy465Port() { 54 mockConfig := mockConfig(465, s.redisPort) 55 app := NewApplication(mockConfig, nil) 56 s.Nil(app.To([]string{testTo}). 57 Cc([]string{testCc}). 58 Bcc([]string{testBcc}). 59 Attach([]string{"../logo.png"}). 60 Content(mail.Content{Subject: "Goravel Test 465", Html: "<h1>Hello Goravel</h1>"}). 61 Send()) 62 } 63 64 func (s *ApplicationTestSuite) TestSendMailBy587Port() { 65 mockConfig := mockConfig(587, s.redisPort) 66 app := NewApplication(mockConfig, nil) 67 s.Nil(app.To([]string{testTo}). 68 Cc([]string{testCc}). 69 Bcc([]string{testBcc}). 70 Attach([]string{"../logo.png"}). 71 Content(mail.Content{Subject: "Goravel Test 587", Html: "<h1>Hello Goravel</h1>"}). 72 Send()) 73 } 74 75 func (s *ApplicationTestSuite) TestSendMailWithFrom() { 76 mockConfig := mockConfig(587, s.redisPort) 77 app := NewApplication(mockConfig, nil) 78 s.Nil(app.From(mail.From{Address: testFromAddress, Name: testFromName}). 79 To([]string{testTo}). 80 Cc([]string{testCc}). 81 Bcc([]string{testBcc}). 82 Attach([]string{"../logo.png"}). 83 Content(mail.Content{Subject: "Goravel Test 587 With From", Html: "<h1>Hello Goravel</h1>"}). 84 Send()) 85 } 86 87 func (s *ApplicationTestSuite) TestQueueMail() { 88 mockConfig := mockConfig(587, s.redisPort) 89 mockLog := &logmock.Log{} 90 91 queueFacade := queue.NewApplication(mockConfig, mockLog) 92 queueFacade.Register([]queuecontract.Job{ 93 NewSendMailJob(mockConfig), 94 }) 95 96 app := NewApplication(mockConfig, queueFacade) 97 98 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) 99 defer cancel() 100 go func(ctx context.Context) { 101 s.Nil(queueFacade.Worker(nil).Run()) 102 103 for range ctx.Done() { 104 return 105 } 106 }(ctx) 107 time.Sleep(3 * time.Second) 108 s.Nil(app.To([]string{testTo}). 109 Cc([]string{testCc}). 110 Bcc([]string{testBcc}). 111 Attach([]string{"../logo.png"}). 112 Content(mail.Content{Subject: "Goravel Test Queue", Html: "<h1>Hello Goravel</h1>"}). 113 Queue(nil)) 114 time.Sleep(3 * time.Second) 115 } 116 117 func mockConfig(mailPort, redisPort int) *configmock.Config { 118 mockConfig := &configmock.Config{} 119 mockConfig.On("GetString", "app.name").Return("goravel") 120 mockConfig.On("GetBool", "app.debug").Return(false) 121 mockConfig.On("GetString", "queue.default").Return("redis") 122 mockConfig.On("GetString", "queue.connections.sync.driver").Return("sync") 123 mockConfig.On("GetString", "queue.connections.redis.driver").Return("redis") 124 mockConfig.On("GetString", "queue.connections.redis.connection").Return("default") 125 mockConfig.On("GetString", "queue.connections.redis.queue", "default").Return("default") 126 mockConfig.On("GetString", "database.redis.default.host").Return("localhost") 127 mockConfig.On("GetString", "database.redis.default.password").Return("") 128 mockConfig.On("GetInt", "database.redis.default.port").Return(redisPort) 129 mockConfig.On("GetInt", "database.redis.default.database").Return(0) 130 131 if file.Exists("../.env") { 132 vip := viper.New() 133 vip.SetConfigName("../.env") 134 vip.SetConfigType("env") 135 vip.AddConfigPath(".") 136 _ = vip.ReadInConfig() 137 vip.SetEnvPrefix("goravel") 138 vip.AutomaticEnv() 139 140 mockConfig.On("GetString", "mail.host").Return(vip.Get("MAIL_HOST")) 141 mockConfig.On("GetInt", "mail.port").Return(mailPort) 142 mockConfig.On("GetString", "mail.from.address").Return(vip.Get("MAIL_FROM_ADDRESS")) 143 mockConfig.On("GetString", "mail.from.name").Return(vip.Get("MAIL_FROM_NAME")) 144 mockConfig.On("GetString", "mail.username").Return(vip.Get("MAIL_USERNAME")) 145 mockConfig.On("GetString", "mail.password").Return(vip.Get("MAIL_PASSWORD")) 146 mockConfig.On("GetString", "mail.to").Return(vip.Get("MAIL_TO")) 147 mockConfig.On("GetString", "mail.cc").Return(vip.Get("MAIL_CC")) 148 mockConfig.On("GetString", "mail.bcc").Return(vip.Get("MAIL_BCC")) 149 150 testFromAddress = vip.Get("MAIL_FROM_ADDRESS").(string) 151 testFromName = vip.Get("MAIL_FROM_NAME").(string) 152 testTo = vip.Get("MAIL_TO").(string) 153 } 154 if os.Getenv("MAIL_HOST") != "" { 155 mockConfig.On("GetString", "mail.host").Return(os.Getenv("MAIL_HOST")) 156 mockConfig.On("GetInt", "mail.port").Return(mailPort) 157 mockConfig.On("GetString", "mail.from.address").Return(os.Getenv("MAIL_FROM_ADDRESS")) 158 mockConfig.On("GetString", "mail.from.name").Return(os.Getenv("MAIL_FROM_NAME")) 159 mockConfig.On("GetString", "mail.username").Return(os.Getenv("MAIL_USERNAME")) 160 mockConfig.On("GetString", "mail.password").Return(os.Getenv("MAIL_PASSWORD")) 161 mockConfig.On("GetString", "mail.to").Return(os.Getenv("MAIL_TO")) 162 mockConfig.On("GetString", "mail.cc").Return(os.Getenv("MAIL_CC")) 163 mockConfig.On("GetString", "mail.bcc").Return(os.Getenv("MAIL_BCC")) 164 165 testFromAddress = os.Getenv("MAIL_FROM_ADDRESS") 166 testFromName = os.Getenv("MAIL_FROM_NAME") 167 testBcc = os.Getenv("MAIL_BCC") 168 testCc = os.Getenv("MAIL_CC") 169 testTo = os.Getenv("MAIL_TO") 170 } 171 172 return mockConfig 173 }