Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

user-send-email.spec.js 4.2KB

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