Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

user-send-email.spec.js 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. 'use strict'
  2. /*
  3. * NOTE: This test ACTUALLY will send an email
  4. * (see commented out email variable below)
  5. */
  6. // Change email here to your actual email
  7. let email = undefined
  8. // email = 'myalias@myactualemail.com'
  9. const test = require('ava')
  10. const { stub } = require('sinon')
  11. const Hapi = require('@hapi/hapi')
  12. const UserService = require('../lib/services/user.js')
  13. const plugin = require('../lib/plugins/user.js')
  14. // Necessary Dependencies/Configurations for Brevo Transac Email
  15. const crypto = require('crypto')
  16. const Brevo = require('@getbrevo/brevo')
  17. const apiInstance = new Brevo.TransactionalEmailsApi()
  18. const apiKey = apiInstance.apiClient.authentications['api-key']
  19. apiKey.apiKey = process.env.BREVO_KEY
  20. const sendSmtpEmail = new Brevo.SendSmtpEmail()
  21. // Existing activeSession to test against (should not match)
  22. const activeSessions = {
  23. 'a;lsdkfja;ldfjka;ldfja;lskjdfa;dfjk': {
  24. email: 'test@testemail.com',
  25. name: 'john_doe',
  26. seeking: 'position',
  27. sessionToken: 'efasdf;laksdfja;lkdjfa;lkdjf',
  28. expiration: Date.now() + 600000,
  29. emailWasRespondedTo: false,
  30. accessToken: null,
  31. },
  32. }
  33. let hashedSessionToken = ''
  34. const payload = {
  35. email: email,
  36. name: 'fk',
  37. seeking: 'seeker',
  38. sessionToken: 'a;slkdjfa;lskdf;asjkdfl;asdf;klj',
  39. }
  40. const userCredentials = payload
  41. const pathToTest = {
  42. method: 'POST',
  43. url: '/send-email/',
  44. payload: JSON.stringify(payload),
  45. }
  46. test('path /send-email should send test transac email', async t => {
  47. /* If email is left undefined, simply pass the test */
  48. if (!email) {
  49. t.log('no actual email was given, bypassing test...')
  50. return t.pass()
  51. }
  52. /**
  53. * Create a new server and register services,
  54. * models and routes for testing
  55. */
  56. const server = Hapi.server()
  57. server.registrations = {
  58. 'main-app-plugin': {
  59. options: {},
  60. },
  61. }
  62. /**
  63. * Register Services
  64. */
  65. await plugin.register(server)
  66. server.services()['userService'] = new UserService(server)
  67. server.services()['userService']['activeSessions'] = activeSessions
  68. const hashToken = token => {
  69. const salt = process.env.APP_SESSION_SALT
  70. try {
  71. return crypto.createHmac('sha256', salt).update(token).digest('hex')
  72. } catch (err) {
  73. throw new Error(err.message)
  74. }
  75. }
  76. hashedSessionToken = Object.keys(activeSessions).find(hashedToken => {
  77. return activeSessions[`${hashedToken}`].email === userCredentials.email
  78. })
  79. /**
  80. * Sends a Transactional Email via Brevo
  81. * @ returns {Object}
  82. */
  83. const emailSent = async userCredentials => {
  84. hashedSessionToken = hashToken(userCredentials.sessionToken)
  85. if (Object.keys(activeSessions).includes(hashedSessionToken)) {
  86. return new Error('session already in cache!!')
  87. }
  88. // Set expiration time for ten minutes from now
  89. const duration = 600000
  90. activeSessions[hashedSessionToken] = {
  91. email: userCredentials.email,
  92. name: userCredentials.name,
  93. seeking: userCredentials.seeking,
  94. sessionToken: userCredentials.sessionToken,
  95. expiration: Date.now() + duration,
  96. emailWasRespondedTo: false,
  97. accessToken: null,
  98. }
  99. sendSmtpEmail.sender = {
  100. name: 'My Test Company',
  101. email: 'mytestemail@email.com',
  102. }
  103. sendSmtpEmail.subject = 'My Test Company'
  104. sendSmtpEmail = {
  105. to: [
  106. {
  107. email: userCredentials.email,
  108. },
  109. ],
  110. }
  111. sendSmtpEmail.templateId = Number(process.env.BREVO_TEMPLATE_ID)
  112. sendSmtpEmail.params = {
  113. link: `${process.env.BREVO_LINK}/verify/${hashedSessionToken}`,
  114. }
  115. return await apiInstance.sendTransacEmail(sendSmtpEmail).then(
  116. data => {
  117. return { wasSuccessfull: true, data: data }
  118. },
  119. error => {
  120. return { wasSuccessfull: false, error: error }
  121. },
  122. )
  123. }
  124. stub(server.services()['userService'], 'emailSent').returns(
  125. await emailSent(userCredentials),
  126. )
  127. const mockReturn = {
  128. emailSentSuccessfully: true,
  129. hashedSessionToken,
  130. }
  131. /**
  132. * Test the server with registered models and services
  133. */
  134. const { payload } = await server.inject(pathToTest)
  135. const res = JSON.parse(payload)
  136. t.deepEqual(res.ok, true)
  137. t.deepEqual(res.data, mockReturn)
  138. server.stop()
  139. })