| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- should = require('chai').should()
- SandboxedModule = require('sandboxed-module')
- assert = require('assert')
- path = require('path')
- sinon = require('sinon')
- modulePath = path.join __dirname, "../../../../app/js/Features/Email/EmailSender.js"
- expect = require("chai").expect
- describe "EmailSender", ->
- beforeEach ->
- @RateLimiter =
- addCount:sinon.stub()
- @settings =
- email:
- transport: "ses"
- parameters:
- AWSAccessKeyID: "key"
- AWSSecretKey: "secret"
- fromAddress: "bob@bob.com"
- replyToAddress: "sally@gmail.com"
- @sesClient =
- sendMail: sinon.stub()
- @ses =
- createTransport: => @sesClient
- @sender = SandboxedModule.require modulePath, requires:
- 'nodemailer': @ses
- "settings-sharelatex":@settings
- '../../infrastructure/RateLimiter':@RateLimiter
- "logger-sharelatex":
- log:->
- warn:->
- err:->
- "../../infrastructure/Metrics": inc:->
- @opts =
- to: "bob@bob.com"
- subject: "new email"
- html: "<hello></hello>"
- describe "sendEmail", ->
- it "should set the properties on the email to send", (done)->
- @sesClient.sendMail.callsArgWith(1)
- @sender.sendEmail @opts, =>
- args = @sesClient.sendMail.args[0][0]
- args.html.should.equal @opts.html
- args.to.should.equal @opts.to
- args.subject.should.equal @opts.subject
- done()
- it "should return the error", (done)->
- @sesClient.sendMail.callsArgWith(1, "error")
- @sender.sendEmail {}, (err)=>
- err.should.equal "error"
- done()
- it "should use the from address from settings", (done)->
- @sesClient.sendMail.callsArgWith(1)
- @sender.sendEmail @opts, =>
- args = @sesClient.sendMail.args[0][0]
- args.from.should.equal @settings.email.fromAddress
- done()
- it "should use the reply to address from settings", (done)->
- @sesClient.sendMail.callsArgWith(1)
- @sender.sendEmail @opts, =>
- args = @sesClient.sendMail.args[0][0]
- args.replyTo.should.equal @settings.email.replyToAddress
- done()
- it "should use the reply to address in options as an override", (done)->
- @sesClient.sendMail.callsArgWith(1)
- @opts.replyTo = "someone@else.com"
- @sender.sendEmail @opts, =>
- args = @sesClient.sendMail.args[0][0]
- args.replyTo.should.equal @opts.replyTo
- done()
- it "should not send an email when the rate limiter says no", (done)->
- @opts.sendingUser_id = "12321312321"
- @RateLimiter.addCount.callsArgWith(1, null, false)
- @sender.sendEmail @opts, =>
- @sesClient.sendMail.called.should.equal false
- done()
- it "should send the email when the rate limtier says continue", (done)->
- @sesClient.sendMail.callsArgWith(1)
- @opts.sendingUser_id = "12321312321"
- @RateLimiter.addCount.callsArgWith(1, null, true)
- @sender.sendEmail @opts, =>
- @sesClient.sendMail.called.should.equal true
- done()
- it "should not check the rate limiter when there is no sendingUser_id", (done)->
- @sesClient.sendMail.callsArgWith(1)
- @sender.sendEmail @opts, =>
- @sesClient.sendMail.called.should.equal true
- @RateLimiter.addCount.called.should.equal false
- done()
- describe 'with plain-text email content', () ->
- beforeEach ->
- @opts.text = "hello there"
- it "should set the text property on the email to send", (done)->
- @sesClient.sendMail.callsArgWith(1)
- @sender.sendEmail @opts, =>
- args = @sesClient.sendMail.args[0][0]
- args.html.should.equal @opts.html
- args.text.should.equal @opts.text
- args.to.should.equal @opts.to
- args.subject.should.equal @opts.subject
- done()
|