Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

membership.spec.js 7.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  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/membership')
  6. const ProfileService = require('../lib/services/profile')
  7. const UserService = require('../lib/services/user')
  8. const MembershipService = require('../lib/services/membership')
  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 TagAssociation = require('../lib/models/tag-association')
  14. const User = require('../lib/models/user')
  15. const Aspect = require('../lib/models/aspect')
  16. const AspectLabel = require('../lib/models/aspect_label')
  17. /**
  18. * Route parameters
  19. */
  20. const params = {
  21. profile_id: 99,
  22. }
  23. const mockReturn = {
  24. profile: {
  25. profile_id: 99,
  26. user_id: 99,
  27. user: {
  28. user_email: '',
  29. user_name: 'bob',
  30. },
  31. responses: [],
  32. tags: [],
  33. },
  34. memberships: [
  35. { membership_id: 1, grouping_id: 1, profile_id: 99 },
  36. { membership_id: 1, grouping_id: 1, profile_id: 1 },
  37. { membership_id: 1, grouping_id: 1, profile_id: 2 },
  38. ],
  39. groupings: [
  40. { grouping_id: 1, profiles: [{ profile_id: 1 }, { profile_id: 99 }] },
  41. ],
  42. profiles: [
  43. {
  44. profile_id: 1,
  45. tags: [],
  46. responses: [
  47. { val: '90012', response_key_id: 7 },
  48. { val: 'foo', response_key_id: 8 },
  49. { val: 'foo', response_key_id: 9 },
  50. { val: 'foo', response_key_id: 10 },
  51. { val: 'foo', response_key_id: 11 },
  52. { val: 'foo', response_key_id: 12 },
  53. ],
  54. user: { user_name: 'phil' },
  55. },
  56. {
  57. profile_id: 2,
  58. tags: [],
  59. responses: [
  60. { val: '90012', response_key_id: 7 },
  61. { val: 'foo', response_key_id: 8 },
  62. { val: 'foo', response_key_id: 9 },
  63. { val: 'foo', response_key_id: 10 },
  64. { val: 'foo', response_key_id: 11 },
  65. { val: 'foo', response_key_id: 12 },
  66. ],
  67. user: { user_name: 'gil' },
  68. },
  69. {
  70. profile_id: 99,
  71. tags: [],
  72. responses: [
  73. { val: '90012', response_key_id: 7 },
  74. { val: 'foo', response_key_id: 8 },
  75. { val: 'foo', response_key_id: 9 },
  76. { val: 'foo', response_key_id: 10 },
  77. { val: 'foo', response_key_id: 11 },
  78. { val: 'foo', response_key_id: 12 },
  79. ],
  80. user: { user_name: 'jill' },
  81. },
  82. ],
  83. tag_associations: [
  84. {
  85. tag_association_id: 1,
  86. profile_id: 99,
  87. grouping_id: 1,
  88. tag_id: 7,
  89. is_deleted: 0,
  90. },
  91. {
  92. tag_association_id: 2,
  93. profile_id: 1,
  94. grouping_id: 1,
  95. tag_id: 8,
  96. is_deleted: 0,
  97. },
  98. ],
  99. tags: [
  100. {
  101. tag_id: 7,
  102. tag_category: 'reveal',
  103. tag_description: 'user_name',
  104. is_active: 1,
  105. },
  106. {
  107. tag_id: 8,
  108. tag_category: 'reveal',
  109. tag_description: 'user_email',
  110. is_active: 1,
  111. },
  112. ],
  113. labels: [
  114. { aspect_id: 1, a: 100, b: 100 },
  115. { aspect_id: 2, a: 100, b: 200 },
  116. { aspect_id: 3, a: 200, b: 200 },
  117. { aspect_id: 4, a: 200, b: 100 },
  118. ],
  119. aspects: [
  120. { aspect_id: 1, 1: 111, 2: 112, 3: 113, 4: 114 },
  121. { aspect_id: 2, 1: 222, 2: 222, 3: 333, 4: 222 },
  122. { aspect_id: 3, 1: 111, 2: 112, 3: 113, 4: 114 },
  123. { aspect_id: 4, 1: 111, 2: 111, 3: 111, 4: 111 },
  124. ],
  125. user: [
  126. {
  127. user_id: 99,
  128. user_name: 'bob',
  129. user_email: 'bob@testemail.com',
  130. is_admin: 0,
  131. is_poster: 0,
  132. is_verified: 0,
  133. },
  134. ],
  135. }
  136. const pathToTest = {
  137. method: 'GET',
  138. url: `/${params.profile_id}`,
  139. }
  140. test('path /<profile_id> should return ok', async t => {
  141. /**
  142. * Create a new server and register services,
  143. * models and routes for testing
  144. * -
  145. * NOTE: We use a mocked registerModel() and register
  146. * models manually. Normally this is handled by
  147. * Schwifty at runtime.
  148. */
  149. const server = Hapi.server()
  150. /**
  151. * Overload so we don't register any models
  152. * using the plugin call (see plugins/profile.js)
  153. * and Manually load the model we need for the test
  154. */
  155. server.registerModel = () => {}
  156. server.models = () => ({
  157. Aspect,
  158. AspectLabel,
  159. Profile,
  160. Membership,
  161. Grouping,
  162. Tag,
  163. TagAssociation,
  164. User,
  165. })
  166. /**
  167. * Register Routes and Services as usual
  168. */
  169. await plugin.register(server)
  170. /**
  171. * Replace Objection model methods with our own mock functions
  172. * !: Janky - might be better to temp knex sqlite instance
  173. */
  174. server.services()['profileService'] = new ProfileService(server)
  175. server.services()['membershipService'] = new MembershipService(server)
  176. server.services()['userService'] = new UserService(server)
  177. stub(server.models()['Tag'], 'query').returns(mockReturn.tags)
  178. stub(server.models()['AspectLabel'], 'query').returns(mockReturn.labels)
  179. stub(server.models()['Aspect'], 'query').returns(mockReturn.aspects)
  180. stub(server.models()['User'], 'query').returns({
  181. throwIfNotFound: () => ({
  182. first: () => ({
  183. where: () => {
  184. return mockReturn.user
  185. },
  186. }),
  187. }),
  188. })
  189. stub(server.models()['Grouping'], 'query').returns({
  190. whereIn: () => ({
  191. withGraphFetched: () => {
  192. return mockReturn.groupings
  193. },
  194. }),
  195. })
  196. stub(server.models()['Membership'], 'query').returns({
  197. where: () => {
  198. return mockReturn.memberships
  199. },
  200. whereIn: () => {
  201. return mockReturn.memberships
  202. },
  203. })
  204. stub(server.models()['TagAssociation'], 'query').returns({
  205. where: () => ({
  206. andWhere: () => {
  207. return mockReturn.tag_associations
  208. },
  209. }),
  210. })
  211. stub(server.models()['Profile'], 'query').returns({
  212. // Mocked for getProfile()
  213. where: () => ({
  214. first: () => ({
  215. withGraphFetched: () => ({
  216. withGraphFetched: () => ({
  217. withGraphFetched: () => mockReturn.profile,
  218. }),
  219. }),
  220. }),
  221. }),
  222. whereIn: () => ({
  223. withGraphFetched: () => ({
  224. withGraphFetched: () => ({
  225. withGraphFetched: () => mockReturn.profiles,
  226. }),
  227. }),
  228. }),
  229. })
  230. /**
  231. * Test the server with registered models and services
  232. */
  233. const { payload } = await server.inject(pathToTest)
  234. const res = JSON.parse(payload)
  235. t.deepEqual(res.ok, true)
  236. t.deepEqual(res.data.length, 1)
  237. t.deepEqual(res.data[0].grouping_id, mockReturn.groupings[0].grouping_id)
  238. t.deepEqual(
  239. res.data[0].profile.user_name,
  240. mockReturn.groupings[0].profile.user_name,
  241. )
  242. })