github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/pkg/emailer/service_test.go (about) 1 package emailer 2 3 import ( 4 "fmt" 5 "testing" 6 7 "github.com/cozy/cozy-stack/model/instance" 8 "github.com/cozy/cozy-stack/model/job" 9 "github.com/cozy/cozy-stack/pkg/mail" 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/mock" 12 ) 13 14 func TestEmailerImplems(t *testing.T) { 15 assert.Implements(t, (*Emailer)(nil), new(EmailerService)) 16 assert.Implements(t, (*Emailer)(nil), new(Mock)) 17 } 18 19 func Test_Emailer_success(t *testing.T) { 20 brokerMock := job.NewBrokerMock(t) 21 22 emailer := NewEmailerService(brokerMock) 23 24 inst := instance.Instance{} 25 26 brokerMock.On("PushJob", &inst, mock.MatchedBy(func(req *job.JobRequest) bool { 27 assert.Equal(t, "sendmail", req.WorkerType) 28 assert.JSONEq(t, `{ 29 "mode": "noreply", 30 "template_name": "some-template.html", 31 "template_values": { 32 "foo": "bar", 33 "life": 42 34 } 35 }`, string(req.Message)) 36 return true 37 })).Return(nil, nil).Once() 38 39 err := emailer.SendEmail(&inst, &TransactionalEmailCmd{ 40 TemplateName: "some-template.html", 41 TemplateValues: map[string]interface{}{ 42 "foo": "bar", 43 "life": 42, 44 }, 45 }) 46 47 assert.NoError(t, err) 48 } 49 50 func Test_Email_job_push_error(t *testing.T) { 51 brokerMock := job.NewBrokerMock(t) 52 53 emailer := NewEmailerService(brokerMock) 54 55 inst := instance.Instance{} 56 57 brokerMock.On("PushJob", &inst, mock.Anything). 58 Return(nil, fmt.Errorf("some-error")).Once() 59 60 err := emailer.SendEmail(&inst, &TransactionalEmailCmd{ 61 TemplateName: "some-template.html", 62 TemplateValues: map[string]interface{}{ 63 "foo": "bar", 64 "life": 42, 65 }, 66 }) 67 68 assert.EqualError(t, err, "some-error") 69 } 70 71 func TestSendCampaignEmail(t *testing.T) { 72 brokerMock := job.NewBrokerMock(t) 73 74 emailer := NewEmailerService(brokerMock) 75 76 inst := instance.Instance{} 77 78 t.Run("WithoutSubject", func(t *testing.T) { 79 err := emailer.SendCampaignEmail(&inst, &CampaignEmailCmd{}) 80 assert.ErrorIs(t, err, ErrMissingSubject) 81 }) 82 83 t.Run("WithoutParts", func(t *testing.T) { 84 err := emailer.SendCampaignEmail(&inst, &CampaignEmailCmd{ 85 Subject: "Some subject", 86 }) 87 assert.ErrorIs(t, err, ErrMissingContent) 88 }) 89 90 t.Run("WithCompleteCmd", func(t *testing.T) { 91 brokerMock.On("PushJob", &inst, mock.MatchedBy(func(req *job.JobRequest) bool { 92 assert.Equal(t, "sendmail", req.WorkerType) 93 assert.JSONEq(t, 94 `{ 95 "mode": "campaign", 96 "subject": "Some subject", 97 "parts": [{ 98 "body": "Hey !!!", 99 "type": "text/plain" 100 }] 101 }`, 102 string(req.Message), 103 ) 104 return true 105 })).Return(nil, nil).Once() 106 107 err := emailer.SendCampaignEmail(&inst, &CampaignEmailCmd{ 108 Subject: "Some subject", 109 Parts: []mail.Part{ 110 { 111 Body: "Hey !!!", 112 Type: "text/plain", 113 }, 114 }, 115 }) 116 assert.NoError(t, err) 117 }) 118 }