Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

membership.spec.js 7.4KB

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