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  }