Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

user-validate-session.spec.js 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. 'use strict'
  2. const test = require('ava')
  3. const { stub } = require('sinon')
  4. const Hapi = require('@hapi/hapi')
  5. const UserService = require('../lib/services/user.js')
  6. const ProfileService = require('../lib/services/profile/index.js')
  7. const plugin = require('../lib/plugins/user.js')
  8. const JWT = require('jsonwebtoken')
  9. const User = require('../lib/models/user.js')
  10. const Profile = require('../lib/models/profile.js')
  11. // Dummy Method So JWT can be verified
  12. const createToken = (data, expiration = 600) => {
  13. const key = process.env.APP_SECRET
  14. const obj = {}
  15. Object.assign(obj, { ...data })
  16. return JWT.sign(obj, key, { expiresIn: expiration })
  17. }
  18. // Dummy Data
  19. const payload = 'a;lsdkfja;ldfjka;ldfja;lskjdfa;dfjk'
  20. const email = 'test@testemail.com'
  21. const userData = {
  22. email,
  23. name: 'fk',
  24. seeking: 'position',
  25. sessionToken: createToken(this),
  26. }
  27. const userInDb = {
  28. user_id: 101,
  29. user_name: 'john_doe',
  30. user_email: email,
  31. is_admin: 0,
  32. is_poster: 0,
  33. is_verified: 0,
  34. }
  35. const allProfiles = [
  36. {
  37. profile_id: 147,
  38. user_id: 101,
  39. },
  40. ]
  41. // Existing activeSession
  42. const activeSessions = {
  43. 'a;lsdkfja;ldfjka;ldfja;lskjdfa;dfjk': {
  44. email,
  45. name: 'john_doe',
  46. seeking: 'position',
  47. sessionToken: userData.sessionToken,
  48. expiration: Date.now() + 600000,
  49. emailWasRespondedTo: true,
  50. accessToken: null,
  51. },
  52. }
  53. const mockReturn = {
  54. profileId: allProfiles[0].profile_id,
  55. sessionToken: userData.sessionToken,
  56. }
  57. const pathToTest = {
  58. method: 'POST',
  59. url: '/validate-session',
  60. payload: JSON.stringify(payload),
  61. }
  62. test('path /validate-session should return validated session data and profileId', async t => {
  63. /**
  64. * Create a new server and register services,
  65. * models and routes for testing
  66. * -
  67. * NOTE: We use register models manually.
  68. * Normally this is handled by
  69. * Schwifty at runtime.
  70. */
  71. const server = Hapi.server()
  72. /**
  73. * Register Routes and Services as usual
  74. */
  75. server.registerModel = () => {}
  76. server.models = () => ({
  77. User,
  78. Profile,
  79. })
  80. server.registrations = {
  81. 'main-app-plugin': {
  82. options: {},
  83. },
  84. }
  85. server.registrations['main-app-plugin'].options.jwtKey = {
  86. $filter: 'NODE_ENV',
  87. $default: {
  88. $param: 'APP_SECRET',
  89. $default: 'app-secret',
  90. },
  91. // Use .env file in production
  92. production: {
  93. $param: 'APP_SECRET',
  94. },
  95. }
  96. await plugin.register(server)
  97. server.models = () => ({
  98. User,
  99. Profile,
  100. })
  101. server.services()['userService'] = new UserService(server)
  102. server.services()['userService']['activeSessions'] = activeSessions
  103. server.services()['profileService'] = new ProfileService(server)
  104. server.services()['profileService']['_setTagLookup'] = () => {}
  105. stub(server.models()['User'], 'query').returns({
  106. throwIfNotFound: () => ({
  107. first: () => ({
  108. where: () => {
  109. if (userData.email === userInDb.user_email) {
  110. return userInDb
  111. }
  112. },
  113. }),
  114. }),
  115. })
  116. stub(server.models()['Profile'], 'query').returns({
  117. where: () => {
  118. return [allProfiles.find(obj => obj.user_id === userInDb.user_id)]
  119. },
  120. whereIn: () => ({
  121. withGraphFetched: () => ({
  122. withGraphFetched: () => ({
  123. withGraphFetched: () => [
  124. {
  125. profile_id: 147,
  126. user_id: 101,
  127. tags: [],
  128. responses: [],
  129. user: {
  130. user_id: 101,
  131. user_name: 'fk',
  132. user_email: email,
  133. is_admin: 0,
  134. is_poster: 0,
  135. is_verified: 0,
  136. },
  137. },
  138. ],
  139. }),
  140. }),
  141. }),
  142. })
  143. /**
  144. * Test the server with registered models and services
  145. */
  146. const { payload } = await server.inject(pathToTest)
  147. const res = JSON.parse(payload)
  148. t.deepEqual(res.ok, true)
  149. t.deepEqual(res.data, mockReturn)
  150. server.stop()
  151. })