You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

score.spec.js 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. 'use strict'
  2. const test = require('ava')
  3. const { stub } = require('sinon')
  4. const Hapi = require('@hapi/hapi')
  5. const plugin = require('../lib/plugins/profile')
  6. const Profile = require('../lib/models/profile')
  7. const ZipCode = require('../lib/models/zip-code')
  8. const MatchQueue = require('../lib/models/matchqueue')
  9. const Aspect = require('../lib/models/aspect')
  10. const AspectLabel = require('../lib/models/aspect_label')
  11. // !: Must match the key set in servives/profile.js
  12. const zipcodeKey = 10
  13. /**
  14. * Route parameters
  15. */
  16. const params = {
  17. profile_id: 1,
  18. max_distance: 1000,
  19. }
  20. const mockReturn = {
  21. user: [
  22. {
  23. profile_id: 1,
  24. user: { is_poster: 1 },
  25. responses: [
  26. { response_key_id: 1, val: '100' },
  27. { response_key_id: 2, val: '200' },
  28. { response_key_id: 3, val: '200' },
  29. { response_key_id: 4, val: '200' },
  30. { response_key_id: 5, val: '200' },
  31. { response_key_id: 6, val: '200' },
  32. { response_key_id: 7, val: '200' },
  33. { response_key_id: 8, val: '200' },
  34. { response_key_id: 9, val: '200' },
  35. { response_key_id: zipcodeKey, val: '90065' },
  36. ],
  37. },
  38. {
  39. profile_id: 2,
  40. user: { is_poster: 0 },
  41. responses: [
  42. { response_key_id: 1, val: '100' },
  43. { response_key_id: 2, val: '200' },
  44. { response_key_id: 3, val: '200' },
  45. { response_key_id: 4, val: '200' },
  46. { response_key_id: 5, val: '200' },
  47. { response_key_id: 6, val: '200' },
  48. { response_key_id: 7, val: '200' },
  49. { response_key_id: 8, val: '200' },
  50. { response_key_id: 9, val: '200' },
  51. { response_key_id: zipcodeKey, val: '97002' },
  52. ],
  53. },
  54. {
  55. profile_id: 3,
  56. user: { is_poster: 0 },
  57. responses: [
  58. { response_key_id: 1, val: '200' },
  59. { response_key_id: 2, val: '200' },
  60. { response_key_id: 3, val: '200' },
  61. { response_key_id: 4, val: '200' },
  62. { response_key_id: 5, val: '200' },
  63. { response_key_id: 6, val: '200' },
  64. { response_key_id: 7, val: '200' },
  65. { response_key_id: 8, val: '200' },
  66. { response_key_id: 9, val: '200' },
  67. { response_key_id: zipcodeKey, val: '96741' },
  68. ],
  69. },
  70. ],
  71. labels: [
  72. { aspect_id: 1, a: 100, b: 100 },
  73. { aspect_id: 2, a: 100, b: 200 },
  74. { aspect_id: 3, a: 200, b: 200 },
  75. { aspect_id: 4, a: 200, b: 100 },
  76. ],
  77. aspects: [
  78. { aspect_id: 1, 1: 111, 2: 112, 3: 113, 4: 114 },
  79. { aspect_id: 2, 1: 222, 2: 222, 3: 333, 4: 222 },
  80. { aspect_id: 3, 1: 111, 2: 112, 3: 113, 4: 114 },
  81. { aspect_id: 4, 1: 111, 2: 111, 3: 111, 4: 111 },
  82. ],
  83. }
  84. const pathToTest = {
  85. method: 'GET',
  86. url: `/${params.profile_id}/score?max_distance=${params.max_distance}`,
  87. }
  88. test(`path ${pathToTest.url} should return ok on GET`, async t => {
  89. /**
  90. * Create a new server and register services,
  91. * models and routes for testing
  92. * -
  93. * NOTE: We use a mocked registerModel() and register
  94. * models manually. Normally this is handled by
  95. * Schwifty at runtime.
  96. */
  97. const server = Hapi.server()
  98. /**
  99. * Overload so we don't register any models
  100. * using the plugin call (see plugins/profile.js)
  101. * and Manually load the model we need for the test
  102. */
  103. server.registerModel = () => {}
  104. server.models = () => ({
  105. Aspect,
  106. AspectLabel,
  107. MatchQueue,
  108. Profile,
  109. ZipCode,
  110. })
  111. /**
  112. * Register mock authentication just for testing
  113. * -
  114. * Profile plugin does not do this
  115. */
  116. server.auth.scheme('jwt', () => ({
  117. authenticate: (req, h) => h.authenticated({ credentials: {} }),
  118. }))
  119. server.auth.strategy('default_jwt', 'jwt')
  120. /**
  121. * Register Routes and Services as usual
  122. */
  123. await plugin.register(server)
  124. /**
  125. * Replace Objection model methods with our own mock functions
  126. * !: Janky - might be better to temp knex sqlite instance
  127. */
  128. stub(server.models()['Profile'], 'query').returns({
  129. // Mocked for pathToTest(), scoreProfilesFor()
  130. findOne: () => ({
  131. withGraphFetched: () => ({
  132. withGraphFetched: () => mockReturn.user[0],
  133. }),
  134. }),
  135. // Mocked for scoreProfilesFor()
  136. withGraphFetched: () => ({
  137. withGraphFetched: () => [mockReturn.user[1], mockReturn.user[2]],
  138. }),
  139. // Mocked for _getProfileIdsForUserId()
  140. where: () => ({}),
  141. // Mocked for getCompleteProfilesFor(), getProfilesFor()
  142. whereIn: () => ({
  143. withGraphFetched: () => ({}),
  144. }),
  145. // Mocked for deleteProfile()
  146. delete: () => ({
  147. where: () => ({}),
  148. }),
  149. })
  150. stub(server.models()['AspectLabel'], 'query').returns(mockReturn.labels)
  151. stub(server.models()['Aspect'], 'query').returns(mockReturn.aspects)
  152. stub(server.models()['ZipCode'], 'query').returns({
  153. // Mocked for _latLonForZip()
  154. findOne: () => ({
  155. latitude: 38.0 + Math.random(),
  156. longitude: -121.0 + Math.random(),
  157. }),
  158. })
  159. stub(server.models()['MatchQueue'], 'query').returns({
  160. patch: () => ({
  161. where: () => ({}),
  162. }),
  163. insert: () => ({}),
  164. where: () => ({
  165. where: () => {
  166. return { profile_id: 99 }
  167. },
  168. }),
  169. })
  170. /**
  171. * Test the server with registered models and services
  172. */
  173. const { payload } = await server.inject(pathToTest)
  174. const res = JSON.parse(payload)
  175. t.deepEqual(res.ok, true)
  176. t.is(res.data.length, 2)
  177. t.is(res.data[0].profile_id, 3)
  178. server.stop()
  179. })