direct-transport-test.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. 'use strict';
  2. process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
  3. var chai = require('chai');
  4. var expect = chai.expect;
  5. var directTransport = require('../src/direct-transport');
  6. var SMTPServer = require('smtp-server').SMTPServer;
  7. chai.config.includeStack = true;
  8. var PORT_NUMBER = 8712;
  9. function MockBuilder(envelope, message) {
  10. this.envelope = envelope;
  11. this.message = message;
  12. this._headers = [];
  13. }
  14. MockBuilder.prototype.getEnvelope = function() {
  15. return this.envelope;
  16. };
  17. MockBuilder.prototype.createReadStream = function() {
  18. return this.message;
  19. };
  20. MockBuilder.prototype.getHeader = function() {
  21. return 'teretere';
  22. };
  23. describe('SMTP Transport Tests', function() {
  24. this.timeout(100 * 1000);
  25. var server;
  26. var retryCount = 0;
  27. beforeEach(function(done) {
  28. server = new SMTPServer({
  29. disabledCommands: ['STARTTLS', 'AUTH'],
  30. onData: function(stream, session, callback) {
  31. stream.on('data', function() {});
  32. stream.on('end', function() {
  33. var err;
  34. if (/retry@/.test(session.envelope.mailFrom.address) && retryCount++ < 3) {
  35. err = new Error('Please try again later');
  36. err.responseCode = 451;
  37. callback(err);
  38. } else {
  39. callback(null, 'OK');
  40. }
  41. });
  42. },
  43. onMailFrom: function(address, session, callback) {
  44. if (/invalid@/.test(address.address)) {
  45. return callback(new Error('Invalid sender'));
  46. }
  47. return callback(); // Accept the address
  48. },
  49. onRcptTo: function(address, session, callback) {
  50. if (/invalid@/.test(address.address)) {
  51. return callback(new Error('Invalid recipient'));
  52. }
  53. return callback(); // Accept the address
  54. },
  55. logger: false
  56. });
  57. server.listen(PORT_NUMBER, done);
  58. });
  59. afterEach(function(done) {
  60. server.close(done);
  61. });
  62. it('Should expose version number', function() {
  63. var client = directTransport();
  64. expect(client.name).to.exist;
  65. expect(client.version).to.exist;
  66. });
  67. it('Should send mail', function(done) {
  68. var client = directTransport({
  69. port: PORT_NUMBER,
  70. debug: false
  71. });
  72. client.on('log', console.log);
  73. var chunks = [],
  74. message = new Array(1024).join('teretere, vana kere\n');
  75. server.on('data', function(connection, chunk) {
  76. chunks.push(chunk);
  77. });
  78. server.on('dataReady', function(connection, callback) {
  79. var body = Buffer.concat(chunks);
  80. expect(body.toString()).to.equal(message.trim().replace(/\n/g, '\r\n'));
  81. callback(null, true);
  82. });
  83. client.send({
  84. data: {},
  85. message: new MockBuilder({
  86. from: 'test@[127.0.0.1]',
  87. to: 'test@[127.0.0.1]'
  88. }, message)
  89. }, function(err, info) {
  90. expect(err).to.not.exist;
  91. expect(info.accepted).to.deep.equal(['test@[127.0.0.1]']);
  92. done();
  93. });
  94. });
  95. it('Should retry mail', function(done) {
  96. var client = directTransport({
  97. port: PORT_NUMBER,
  98. debug: false,
  99. retryDelay: 1000
  100. });
  101. client.on('log', console.log);
  102. client.send({
  103. data: {},
  104. message: new MockBuilder({
  105. from: 'retry@[127.0.0.1]',
  106. to: ['test@[127.0.0.1]', 'test2@[127.0.0.1]']
  107. }, 'test')
  108. }, function(err, info) {
  109. expect(err).to.not.exist;
  110. expect(info.pending.length).to.equal(1);
  111. done();
  112. });
  113. });
  114. it('Should reject mail', function(done) {
  115. var client = directTransport({
  116. port: PORT_NUMBER,
  117. debug: false,
  118. retryDelay: 1000
  119. });
  120. client.on('log', console.log);
  121. client.send({
  122. data: {},
  123. message: new MockBuilder({
  124. from: 'invalid@[127.0.0.1]',
  125. to: ['test@[127.0.0.1]', 'test2@[127.0.0.1]']
  126. }, 'test')
  127. }, function(err) {
  128. expect(err).to.exist;
  129. expect(err.errors[0].recipients).to.deep.equal(['test@[127.0.0.1]', 'test2@[127.0.0.1]']);
  130. done();
  131. });
  132. });
  133. it('Should resolve MX', function(done) {
  134. var client = directTransport({
  135. port: PORT_NUMBER,
  136. debug: false,
  137. retryDelay: 1000
  138. });
  139. client._resolveMx('kreata.ee', function(err, list) {
  140. expect(err).to.not.exist;
  141. expect(list.sort(function(a, b) {
  142. return a.priority - b.priority;
  143. })).to.deep.equal([{
  144. exchange: 'aspmx.l.google.com',
  145. priority: 10
  146. }, {
  147. exchange: 'alt1.aspmx.l.google.com',
  148. priority: 20
  149. }, {
  150. exchange: 'alt2.aspmx.l.google.com',
  151. priority: 30
  152. }]);
  153. done();
  154. });
  155. });
  156. it('Should resolve A', function(done) {
  157. var client = directTransport({
  158. port: PORT_NUMBER,
  159. debug: false,
  160. retryDelay: 1000
  161. });
  162. client._resolveMx('localhost.kreata.ee', function(err, list) {
  163. expect(err).to.not.exist;
  164. expect(list).to.deep.equal([{
  165. priority: 0,
  166. exchange: '127.0.0.1'
  167. }]);
  168. done();
  169. });
  170. });
  171. });