Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

user-send-email.spec.js 4.3KB

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