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.

membership.spec.js 6.2KB

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