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  }