@lifeready/core 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. package/README.md +62 -62
  2. package/karma.conf.js +32 -0
  3. package/ng-package.json +26 -0
  4. package/package.json +21 -29
  5. package/src/lib/_common/ast.ts +75 -0
  6. package/src/lib/_common/deferred-promise.ts +35 -0
  7. package/src/lib/_common/exceptions.ts +189 -0
  8. package/src/lib/_common/queries.gql.ts +200 -0
  9. package/src/lib/_common/run-outside-angular.ts +125 -0
  10. package/src/lib/_common/tests.ts +82 -0
  11. package/{lib/_common/types.d.ts → src/lib/_common/types.ts} +13 -10
  12. package/src/lib/_common/utils.ts +57 -0
  13. package/src/lib/api/api-mutation.spec.ts +547 -0
  14. package/src/lib/api/api-query.spec.ts +40 -0
  15. package/src/lib/api/contact-card.gql.ts +85 -0
  16. package/src/lib/api/contact-card.service.spec.ts +249 -0
  17. package/src/lib/api/contact-card.service.ts +228 -0
  18. package/src/lib/api/contact-card2.gql.ts +93 -0
  19. package/src/lib/api/contact-card2.service.spec.ts +297 -0
  20. package/src/lib/api/contact-card2.service.ts +139 -0
  21. package/src/lib/api/file.service.spec.ts +14 -0
  22. package/src/lib/api/file.service.ts +81 -0
  23. package/src/lib/api/item2.gql.ts +211 -0
  24. package/src/lib/api/item2.service.spec.ts +1043 -0
  25. package/src/lib/api/item2.service.ts +481 -0
  26. package/src/lib/api/key-exchange.gql.ts +196 -0
  27. package/src/lib/api/key-exchange.service.spec.ts +470 -0
  28. package/src/lib/api/key-exchange.service.ts +731 -0
  29. package/src/lib/api/key-exchange.types.ts +235 -0
  30. package/src/lib/api/key-exchange2.gql.ts +310 -0
  31. package/src/lib/api/key-exchange2.service.spec.ts +892 -0
  32. package/src/lib/api/key-exchange2.service.ts +875 -0
  33. package/src/lib/api/lock.gql.ts +67 -0
  34. package/src/lib/api/lock.service.spec.ts +549 -0
  35. package/src/lib/api/lock.service.ts +57 -0
  36. package/src/lib/api/lr-apollo.service.spec.ts +27 -0
  37. package/src/lib/api/lr-apollo.service.ts +43 -0
  38. package/{lib/api/lr-graphql/index.d.ts → src/lib/api/lr-graphql/index.ts} +5 -5
  39. package/src/lib/api/lr-graphql/lr-graphql.service.ts +313 -0
  40. package/src/lib/api/lr-graphql/lr-merged-mutation.ts +377 -0
  41. package/src/lib/api/lr-graphql/lr-mutation-base.ts +67 -0
  42. package/src/lib/api/lr-graphql/lr-mutation.ts +74 -0
  43. package/src/lib/api/lr-graphql/lr.service.ts +28 -0
  44. package/src/lib/api/message.service.spec.ts +20 -0
  45. package/src/lib/api/message.service.ts +210 -0
  46. package/src/lib/api/persist.service.spec.ts +209 -0
  47. package/src/lib/api/persist.service.ts +220 -0
  48. package/src/lib/api/query-processor/common-processors.service.ts +148 -0
  49. package/{lib/api/query-processor/index.d.ts → src/lib/api/query-processor/index.ts} +2 -2
  50. package/src/lib/api/query-processor/query-processor.service.ts +240 -0
  51. package/src/lib/api/query-processor/tp-password-reset-processor.service.ts +177 -0
  52. package/src/lib/api/shared-contact-card.service.ts +156 -0
  53. package/src/lib/api/shared-contact-card2.gql.ts +76 -0
  54. package/src/lib/api/shared-contact-card2.service.ts +154 -0
  55. package/src/lib/api/time.service.spec.ts +48 -0
  56. package/src/lib/api/time.service.ts +155 -0
  57. package/src/lib/api/types/graphql.types.ts +48 -0
  58. package/{lib/api/types/index.d.ts → src/lib/api/types/index.ts} +2 -2
  59. package/src/lib/api/types/lr-graphql.types.ts +467 -0
  60. package/src/lib/auth/auth.config.ts +83 -0
  61. package/src/lib/auth/auth.gql.ts +62 -0
  62. package/src/lib/auth/auth.types.ts +79 -0
  63. package/src/lib/auth/idle.service.spec.ts +119 -0
  64. package/src/lib/auth/idle.service.ts +208 -0
  65. package/src/lib/auth/idle.types.ts +11 -0
  66. package/src/lib/auth/lbop.service.spec.ts +56 -0
  67. package/src/lib/auth/lbop.service.ts +539 -0
  68. package/src/lib/auth/life-ready-auth.service.spec.ts +70 -0
  69. package/src/lib/auth/life-ready-auth.service.ts +454 -0
  70. package/src/lib/auth/password.service.spec.ts +51 -0
  71. package/src/lib/auth/password.service.ts +438 -0
  72. package/src/lib/auth/register.service.spec.ts +31 -0
  73. package/src/lib/auth/register.service.ts +181 -0
  74. package/src/lib/auth/two-factor.service.spec.ts +21 -0
  75. package/src/lib/auth/two-factor.service.ts +69 -0
  76. package/src/lib/category/category-meta.service.spec.ts +28 -0
  77. package/src/lib/category/category-meta.service.ts +125 -0
  78. package/src/lib/category/category.gql.ts +449 -0
  79. package/src/lib/category/category.service.spec.ts +26 -0
  80. package/src/lib/category/category.service.ts +498 -0
  81. package/src/lib/category/category.types.ts +89 -0
  82. package/src/lib/cryptography/cryptography.types.ts +108 -0
  83. package/src/lib/cryptography/encryption.service.spec.ts +125 -0
  84. package/src/lib/cryptography/encryption.service.ts +243 -0
  85. package/src/lib/cryptography/key-factory.service.spec.ts +15 -0
  86. package/src/lib/cryptography/key-factory.service.ts +303 -0
  87. package/src/lib/cryptography/key-graph.service.spec.ts +16 -0
  88. package/src/lib/cryptography/key-graph.service.ts +354 -0
  89. package/src/lib/cryptography/key-meta.service.spec.ts +40 -0
  90. package/src/lib/cryptography/key-meta.service.ts +254 -0
  91. package/src/lib/cryptography/key.service.spec.ts +16 -0
  92. package/src/lib/cryptography/key.service.ts +154 -0
  93. package/src/lib/cryptography/slip39.service.spec.ts +44 -0
  94. package/src/lib/cryptography/slip39.service.ts +204 -0
  95. package/src/lib/cryptography/web-crypto.service.ts +22 -0
  96. package/src/lib/life-ready.config.ts +127 -0
  97. package/src/lib/life-ready.module.ts +81 -0
  98. package/src/lib/plan/plan.gql.ts +133 -0
  99. package/src/lib/plan/plan.service.spec.ts +294 -0
  100. package/src/lib/plan/plan.service.ts +198 -0
  101. package/src/lib/plan/plan.types.ts +37 -0
  102. package/src/lib/record/record-attachment.service.spec.ts +31 -0
  103. package/src/lib/record/record-attachment.service.ts +101 -0
  104. package/src/lib/record/record.gql.ts +192 -0
  105. package/src/lib/record/record.service.spec.ts +598 -0
  106. package/src/lib/record/record.service.ts +236 -0
  107. package/src/lib/record/record.types.ts +86 -0
  108. package/src/lib/record-type/record-type.service.spec.ts +16 -0
  109. package/src/lib/record-type/record-type.service.ts +71 -0
  110. package/src/lib/record-type/record-type.types.ts +58 -0
  111. package/src/lib/scenario/approvals/scenario-approval.gql.ts +112 -0
  112. package/src/lib/scenario/approvals/scenario-approval.types.ts +85 -0
  113. package/src/lib/scenario/approvals/scenario-approver.service.spec.ts +16 -0
  114. package/src/lib/scenario/approvals/scenario-approver.service.ts +422 -0
  115. package/src/lib/scenario/claimants/scenario-claimant.gql.ts +56 -0
  116. package/src/lib/scenario/claimants/scenario-claimant.service.spec.ts +16 -0
  117. package/src/lib/scenario/claimants/scenario-claimant.service.ts +100 -0
  118. package/src/lib/scenario/claimants/scenario-claimant.types.ts +21 -0
  119. package/src/lib/scenario/receivers/scenario-receiver.gql.ts +157 -0
  120. package/src/lib/scenario/receivers/scenario-receiver.service.spec.ts +16 -0
  121. package/src/lib/scenario/receivers/scenario-receiver.service.ts +278 -0
  122. package/src/lib/scenario/receivers/scenario-receiver.types.ts +66 -0
  123. package/src/lib/scenario/scenario-setup.service.spec.ts +22 -0
  124. package/src/lib/scenario/scenario-setup.service.ts +369 -0
  125. package/src/lib/scenario/scenario.gql.ts +404 -0
  126. package/src/lib/scenario/scenario.service.spec.ts +1586 -0
  127. package/src/lib/scenario/scenario.service.ts +811 -0
  128. package/src/lib/scenario/scenario.types.ts +258 -0
  129. package/src/lib/search/search.gql.ts +62 -0
  130. package/src/lib/search/search.service.spec.ts +57 -0
  131. package/src/lib/search/search.service.ts +174 -0
  132. package/src/lib/search/search.types.ts +24 -0
  133. package/src/lib/trusted-parties/tp-password-reset-request.service.ts +140 -0
  134. package/src/lib/trusted-parties/tp-password-reset-user.service.ts +359 -0
  135. package/src/lib/trusted-parties/tp-password-reset.gql.ts +453 -0
  136. package/src/lib/trusted-parties/tp-password-reset.service.spec.ts +602 -0
  137. package/src/lib/trusted-parties/tp-password-reset.service.ts +482 -0
  138. package/src/lib/trusted-parties/trusted-party.gql.ts +159 -0
  139. package/src/lib/trusted-parties/trusted-party.service.spec.ts +1008 -0
  140. package/src/lib/trusted-parties/trusted-party.service.ts +394 -0
  141. package/src/lib/trusted-parties/trusted-party.types.ts +119 -0
  142. package/src/lib/trusted-parties/trusted-party2.gql.ts +165 -0
  143. package/src/lib/trusted-parties/trusted-party2.service.spec.ts +1782 -0
  144. package/src/lib/trusted-parties/trusted-party2.service.ts +272 -0
  145. package/src/lib/users/profile-details.service.spec.ts +45 -0
  146. package/src/lib/users/profile-details.service.ts +278 -0
  147. package/src/lib/users/profile.gql.ts +108 -0
  148. package/src/lib/users/profile.service.spec.ts +97 -0
  149. package/src/lib/users/profile.service.ts +224 -0
  150. package/src/lib/users/profile.types.ts +101 -0
  151. package/src/lib/users/user.gql.ts +69 -0
  152. package/src/lib/users/user.service.spec.ts +161 -0
  153. package/src/lib/users/user.service.ts +72 -0
  154. package/src/lib/users/user.types.ts +27 -0
  155. package/{public-api.d.ts → src/public-api.ts} +96 -77
  156. package/src/test.ts +21 -0
  157. package/tsconfig.lib.json +21 -0
  158. package/tsconfig.lib.prod.json +6 -0
  159. package/tsconfig.spec.json +10 -0
  160. package/tslint.json +17 -0
  161. package/bundles/lifeready-core.umd.js +0 -15876
  162. package/bundles/lifeready-core.umd.js.map +0 -1
  163. package/bundles/lifeready-core.umd.min.js +0 -16
  164. package/bundles/lifeready-core.umd.min.js.map +0 -1
  165. package/esm2015/lib/_common/ast.js +0 -40
  166. package/esm2015/lib/_common/deferred-promise.js +0 -24
  167. package/esm2015/lib/_common/exceptions.js +0 -157
  168. package/esm2015/lib/_common/queries.gql.js +0 -190
  169. package/esm2015/lib/_common/run-outside-angular.js +0 -79
  170. package/esm2015/lib/_common/types.js +0 -1
  171. package/esm2015/lib/_common/utils.js +0 -44
  172. package/esm2015/lib/api/contact-card.gql.js +0 -79
  173. package/esm2015/lib/api/contact-card.service.js +0 -154
  174. package/esm2015/lib/api/contact-card2.gql.js +0 -60
  175. package/esm2015/lib/api/contact-card2.service.js +0 -103
  176. package/esm2015/lib/api/file.service.js +0 -74
  177. package/esm2015/lib/api/item2.gql.js +0 -110
  178. package/esm2015/lib/api/item2.service.js +0 -311
  179. package/esm2015/lib/api/key-exchange.gql.js +0 -188
  180. package/esm2015/lib/api/key-exchange.service.js +0 -442
  181. package/esm2015/lib/api/key-exchange.types.js +0 -18
  182. package/esm2015/lib/api/key-exchange2.gql.js +0 -171
  183. package/esm2015/lib/api/key-exchange2.service.js +0 -479
  184. package/esm2015/lib/api/lock.gql.js +0 -40
  185. package/esm2015/lib/api/lock.service.js +0 -64
  186. package/esm2015/lib/api/lr-apollo.service.js +0 -46
  187. package/esm2015/lib/api/lr-graphql/index.js +0 -6
  188. package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +0 -155
  189. package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +0 -213
  190. package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +0 -51
  191. package/esm2015/lib/api/lr-graphql/lr-mutation.js +0 -48
  192. package/esm2015/lib/api/lr-graphql/lr.service.js +0 -18
  193. package/esm2015/lib/api/message.service.js +0 -138
  194. package/esm2015/lib/api/persist.service.js +0 -181
  195. package/esm2015/lib/api/query-processor/common-processors.service.js +0 -93
  196. package/esm2015/lib/api/query-processor/index.js +0 -3
  197. package/esm2015/lib/api/query-processor/query-processor.service.js +0 -192
  198. package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +0 -109
  199. package/esm2015/lib/api/shared-contact-card.service.js +0 -119
  200. package/esm2015/lib/api/shared-contact-card2.gql.js +0 -41
  201. package/esm2015/lib/api/shared-contact-card2.service.js +0 -117
  202. package/esm2015/lib/api/time.service.js +0 -146
  203. package/esm2015/lib/api/types/graphql.types.js +0 -7
  204. package/esm2015/lib/api/types/index.js +0 -3
  205. package/esm2015/lib/api/types/lr-graphql.types.js +0 -71
  206. package/esm2015/lib/auth/auth.config.js +0 -57
  207. package/esm2015/lib/auth/auth.gql.js +0 -48
  208. package/esm2015/lib/auth/auth.types.js +0 -27
  209. package/esm2015/lib/auth/idle.service.js +0 -168
  210. package/esm2015/lib/auth/idle.types.js +0 -7
  211. package/esm2015/lib/auth/lbop.service.js +0 -355
  212. package/esm2015/lib/auth/life-ready-auth.service.js +0 -333
  213. package/esm2015/lib/auth/password.service.js +0 -320
  214. package/esm2015/lib/auth/register.service.js +0 -172
  215. package/esm2015/lib/auth/two-factor.service.js +0 -74
  216. package/esm2015/lib/category/category-meta.service.js +0 -99
  217. package/esm2015/lib/category/category.gql.js +0 -406
  218. package/esm2015/lib/category/category.service.js +0 -390
  219. package/esm2015/lib/category/category.types.js +0 -29
  220. package/esm2015/lib/cryptography/cryptography.types.js +0 -11
  221. package/esm2015/lib/cryptography/encryption.service.js +0 -189
  222. package/esm2015/lib/cryptography/key-factory.service.js +0 -237
  223. package/esm2015/lib/cryptography/key-graph.service.js +0 -280
  224. package/esm2015/lib/cryptography/key-meta.service.js +0 -200
  225. package/esm2015/lib/cryptography/key.service.js +0 -124
  226. package/esm2015/lib/cryptography/slip39.service.js +0 -169
  227. package/esm2015/lib/cryptography/web-crypto.service.js +0 -29
  228. package/esm2015/lib/life-ready.config.js +0 -84
  229. package/esm2015/lib/life-ready.module.js +0 -74
  230. package/esm2015/lib/plan/plan.gql.js +0 -123
  231. package/esm2015/lib/plan/plan.service.js +0 -149
  232. package/esm2015/lib/plan/plan.types.js +0 -11
  233. package/esm2015/lib/record/record-attachment.service.js +0 -101
  234. package/esm2015/lib/record/record.gql.js +0 -179
  235. package/esm2015/lib/record/record.service.js +0 -206
  236. package/esm2015/lib/record/record.types.js +0 -15
  237. package/esm2015/lib/record-type/record-type.service.js +0 -75
  238. package/esm2015/lib/record-type/record-type.types.js +0 -28
  239. package/esm2015/lib/scenario/approvals/scenario-approval.gql.js +0 -105
  240. package/esm2015/lib/scenario/approvals/scenario-approval.types.js +0 -1
  241. package/esm2015/lib/scenario/approvals/scenario-approver.service.js +0 -300
  242. package/esm2015/lib/scenario/claimants/scenario-claimant.gql.js +0 -52
  243. package/esm2015/lib/scenario/claimants/scenario-claimant.service.js +0 -97
  244. package/esm2015/lib/scenario/claimants/scenario-claimant.types.js +0 -1
  245. package/esm2015/lib/scenario/receivers/scenario-receiver.gql.js +0 -150
  246. package/esm2015/lib/scenario/receivers/scenario-receiver.service.js +0 -229
  247. package/esm2015/lib/scenario/receivers/scenario-receiver.types.js +0 -1
  248. package/esm2015/lib/scenario/scenario-setup.service.js +0 -269
  249. package/esm2015/lib/scenario/scenario.gql.js +0 -368
  250. package/esm2015/lib/scenario/scenario.service.js +0 -611
  251. package/esm2015/lib/scenario/scenario.types.js +0 -64
  252. package/esm2015/lib/search/search.gql.js +0 -62
  253. package/esm2015/lib/search/search.service.js +0 -156
  254. package/esm2015/lib/search/search.types.js +0 -6
  255. package/esm2015/lib/trusted-parties/tp-password-reset-request.service.js +0 -112
  256. package/esm2015/lib/trusted-parties/tp-password-reset-user.service.js +0 -266
  257. package/esm2015/lib/trusted-parties/tp-password-reset.gql.js +0 -232
  258. package/esm2015/lib/trusted-parties/tp-password-reset.service.js +0 -300
  259. package/esm2015/lib/trusted-parties/trusted-party.gql.js +0 -148
  260. package/esm2015/lib/trusted-parties/trusted-party.service.js +0 -326
  261. package/esm2015/lib/trusted-parties/trusted-party.types.js +0 -41
  262. package/esm2015/lib/trusted-parties/trusted-party2.gql.js +0 -87
  263. package/esm2015/lib/trusted-parties/trusted-party2.service.js +0 -215
  264. package/esm2015/lib/users/profile-details.service.js +0 -214
  265. package/esm2015/lib/users/profile.gql.js +0 -97
  266. package/esm2015/lib/users/profile.service.js +0 -169
  267. package/esm2015/lib/users/profile.types.js +0 -34
  268. package/esm2015/lib/users/user.gql.js +0 -60
  269. package/esm2015/lib/users/user.service.js +0 -79
  270. package/esm2015/lib/users/user.types.js +0 -5
  271. package/esm2015/lifeready-core.js +0 -10
  272. package/esm2015/public-api.js +0 -81
  273. package/fesm2015/lifeready-core.js +0 -13282
  274. package/fesm2015/lifeready-core.js.map +0 -1
  275. package/lib/_common/ast.d.ts +0 -11
  276. package/lib/_common/deferred-promise.d.ts +0 -12
  277. package/lib/_common/exceptions.d.ts +0 -109
  278. package/lib/_common/queries.gql.d.ts +0 -10
  279. package/lib/_common/run-outside-angular.d.ts +0 -14
  280. package/lib/_common/utils.d.ts +0 -3
  281. package/lib/api/contact-card.gql.d.ts +0 -7
  282. package/lib/api/contact-card.service.d.ts +0 -52
  283. package/lib/api/contact-card2.gql.d.ts +0 -34
  284. package/lib/api/contact-card2.service.d.ts +0 -49
  285. package/lib/api/file.service.d.ts +0 -18
  286. package/lib/api/item2.gql.d.ts +0 -96
  287. package/lib/api/item2.service.d.ts +0 -177
  288. package/lib/api/key-exchange.gql.d.ts +0 -9
  289. package/lib/api/key-exchange.service.d.ts +0 -39
  290. package/lib/api/key-exchange.types.d.ts +0 -196
  291. package/lib/api/key-exchange2.gql.d.ts +0 -125
  292. package/lib/api/key-exchange2.service.d.ts +0 -187
  293. package/lib/api/lock.gql.d.ts +0 -27
  294. package/lib/api/lock.service.d.ts +0 -25
  295. package/lib/api/lr-apollo.service.d.ts +0 -15
  296. package/lib/api/lr-graphql/lr-graphql.service.d.ts +0 -60
  297. package/lib/api/lr-graphql/lr-merged-mutation.d.ts +0 -27
  298. package/lib/api/lr-graphql/lr-mutation-base.d.ts +0 -28
  299. package/lib/api/lr-graphql/lr-mutation.d.ts +0 -8
  300. package/lib/api/lr-graphql/lr.service.d.ts +0 -9
  301. package/lib/api/message.service.d.ts +0 -58
  302. package/lib/api/persist.service.d.ts +0 -31
  303. package/lib/api/query-processor/common-processors.service.d.ts +0 -36
  304. package/lib/api/query-processor/query-processor.service.d.ts +0 -18
  305. package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +0 -15
  306. package/lib/api/shared-contact-card.service.d.ts +0 -33
  307. package/lib/api/shared-contact-card2.gql.d.ts +0 -36
  308. package/lib/api/shared-contact-card2.service.d.ts +0 -45
  309. package/lib/api/time.service.d.ts +0 -16
  310. package/lib/api/types/graphql.types.d.ts +0 -29
  311. package/lib/api/types/lr-graphql.types.d.ts +0 -385
  312. package/lib/auth/auth.config.d.ts +0 -5
  313. package/lib/auth/auth.gql.d.ts +0 -15
  314. package/lib/auth/auth.types.d.ts +0 -66
  315. package/lib/auth/idle.service.d.ts +0 -40
  316. package/lib/auth/idle.types.d.ts +0 -10
  317. package/lib/auth/lbop.service.d.ts +0 -91
  318. package/lib/auth/life-ready-auth.service.d.ts +0 -46
  319. package/lib/auth/password.service.d.ts +0 -78
  320. package/lib/auth/register.service.d.ts +0 -25
  321. package/lib/auth/two-factor.service.d.ts +0 -15
  322. package/lib/category/category-meta.service.d.ts +0 -23
  323. package/lib/category/category.gql.d.ts +0 -45
  324. package/lib/category/category.service.d.ts +0 -67
  325. package/lib/category/category.types.d.ts +0 -79
  326. package/lib/cryptography/cryptography.types.d.ts +0 -83
  327. package/lib/cryptography/encryption.service.d.ts +0 -41
  328. package/lib/cryptography/key-factory.service.d.ts +0 -38
  329. package/lib/cryptography/key-graph.service.d.ts +0 -33
  330. package/lib/cryptography/key-meta.service.d.ts +0 -44
  331. package/lib/cryptography/key.service.d.ts +0 -36
  332. package/lib/cryptography/slip39.service.d.ts +0 -43
  333. package/lib/cryptography/web-crypto.service.d.ts +0 -5
  334. package/lib/life-ready.config.d.ts +0 -14
  335. package/lib/life-ready.module.d.ts +0 -5
  336. package/lib/plan/plan.gql.d.ts +0 -11
  337. package/lib/plan/plan.service.d.ts +0 -33
  338. package/lib/plan/plan.types.d.ts +0 -31
  339. package/lib/record/record-attachment.service.d.ts +0 -16
  340. package/lib/record/record.gql.d.ts +0 -14
  341. package/lib/record/record.service.d.ts +0 -25
  342. package/lib/record/record.types.d.ts +0 -57
  343. package/lib/record-type/record-type.service.d.ts +0 -11
  344. package/lib/record-type/record-type.types.d.ts +0 -50
  345. package/lib/scenario/approvals/scenario-approval.gql.d.ts +0 -7
  346. package/lib/scenario/approvals/scenario-approval.types.d.ts +0 -63
  347. package/lib/scenario/approvals/scenario-approver.service.d.ts +0 -32
  348. package/lib/scenario/claimants/scenario-claimant.gql.d.ts +0 -5
  349. package/lib/scenario/claimants/scenario-claimant.service.d.ts +0 -17
  350. package/lib/scenario/claimants/scenario-claimant.types.d.ts +0 -18
  351. package/lib/scenario/receivers/scenario-receiver.gql.d.ts +0 -8
  352. package/lib/scenario/receivers/scenario-receiver.service.d.ts +0 -30
  353. package/lib/scenario/receivers/scenario-receiver.types.d.ts +0 -54
  354. package/lib/scenario/scenario-setup.service.d.ts +0 -22
  355. package/lib/scenario/scenario.gql.d.ts +0 -34
  356. package/lib/scenario/scenario.service.d.ts +0 -58
  357. package/lib/scenario/scenario.types.d.ts +0 -217
  358. package/lib/search/search.gql.d.ts +0 -1
  359. package/lib/search/search.service.d.ts +0 -25
  360. package/lib/search/search.types.d.ts +0 -20
  361. package/lib/trusted-parties/tp-password-reset-request.service.d.ts +0 -20
  362. package/lib/trusted-parties/tp-password-reset-user.service.d.ts +0 -41
  363. package/lib/trusted-parties/tp-password-reset.gql.d.ts +0 -218
  364. package/lib/trusted-parties/tp-password-reset.service.d.ts +0 -131
  365. package/lib/trusted-parties/trusted-party.gql.d.ts +0 -9
  366. package/lib/trusted-parties/trusted-party.service.d.ts +0 -44
  367. package/lib/trusted-parties/trusted-party.types.d.ts +0 -102
  368. package/lib/trusted-parties/trusted-party2.gql.d.ts +0 -79
  369. package/lib/trusted-parties/trusted-party2.service.d.ts +0 -114
  370. package/lib/users/profile-details.service.d.ts +0 -21
  371. package/lib/users/profile.gql.d.ts +0 -11
  372. package/lib/users/profile.service.d.ts +0 -35
  373. package/lib/users/profile.types.d.ts +0 -96
  374. package/lib/users/user.gql.d.ts +0 -9
  375. package/lib/users/user.service.d.ts +0 -12
  376. package/lib/users/user.types.d.ts +0 -23
  377. package/lifeready-core.d.ts +0 -9
  378. package/lifeready-core.metadata.json +0 -1
@@ -0,0 +1,67 @@
1
+ import { JWK } from 'node-jose';
2
+ import { gqlTyped } from '../_common/ast';
3
+ import { DateTime, LockState, UUID } from './types';
4
+
5
+ export interface LockFragmentResult {
6
+ created: DateTime;
7
+ modified: DateTime;
8
+ version?: UUID;
9
+ expiryTime: DateTime;
10
+ state: LockState;
11
+ }
12
+ export const LockFragment = gqlTyped<LockFragmentResult>`
13
+ fragment LockFragment on LockField {
14
+ created
15
+ modified
16
+ version
17
+ expiryTime
18
+ state
19
+ }`;
20
+
21
+ export interface UpdateLockMutationResult {
22
+ updateLock: {
23
+ lock: LockFragmentResult;
24
+ };
25
+ }
26
+ export const UpdateLockMutation = gqlTyped<UpdateLockMutationResult>`
27
+ mutation UpdateLockMutation($input: UpdateLockInput!) {
28
+ updateLock(input: $input) {
29
+ lock {
30
+ ...LockFragment
31
+ }
32
+ }
33
+ }
34
+ ${LockFragment}
35
+ `;
36
+
37
+ export interface AcquireLockMutationResult {
38
+ acquireLock: {
39
+ lock: LockFragmentResult;
40
+ };
41
+ }
42
+ export const AcquireLockMutation = gqlTyped<AcquireLockMutationResult>`
43
+ mutation AcquireLockMutation($input: AcquireLockInput!) {
44
+ acquireLock(input: $input) {
45
+ lock {
46
+ ...LockFragment
47
+ }
48
+ }
49
+ }
50
+ ${LockFragment}
51
+ `;
52
+
53
+ export interface ReleaseLockMutationResult {
54
+ releaseLock: {
55
+ lock: LockFragmentResult;
56
+ };
57
+ }
58
+ export const ReleaseLockMutation = gqlTyped<ReleaseLockMutationResult>`
59
+ mutation ReleaseLockMutation($input: ReleaseLockInput!) {
60
+ releaseLock(input: $input) {
61
+ lock {
62
+ ...LockFragment
63
+ }
64
+ }
65
+ }
66
+ ${LockFragment}
67
+ `;
@@ -0,0 +1,549 @@
1
+ import { TestBed } from '@angular/core/testing';
2
+ import {
3
+ delaySec,
4
+ lrConfigureTestingModule,
5
+ lrExpectAsyncThrow,
6
+ lrExpectGqlErrorCodes,
7
+ lrExpectGqlErrorCodesSync,
8
+ lrit,
9
+ } from '../_common/tests';
10
+ import {
11
+ loginTestUser,
12
+ logoutUser,
13
+ } from '../auth/life-ready-auth.service.spec';
14
+ import { environment } from 'projects/lr-auth-app/src/environments/environment';
15
+ import { deleteAllRootDirectories, getDirectory } from './item2.service.spec';
16
+ import { LockService } from './lock.service';
17
+ import { LrGraphQLService, LrMutation } from './lr-graphql';
18
+ import { Item2Service } from './item2.service';
19
+ import { gqlTyped } from '../_common/ast';
20
+ import { setupTps2 } from '../trusted-parties/trusted-party2.service.spec';
21
+ import { TrustedParty2Service } from '../trusted-parties/trusted-party2.service';
22
+ import { AccessRoleChoice, DirectoryNode, LockState } from './types';
23
+ import { LockFragment, LockFragmentResult } from './lock.gql';
24
+ import {
25
+ LrApiErrorCode,
26
+ LrErrorCode,
27
+ LrLockedException,
28
+ } from '../_common/exceptions';
29
+
30
+ const TIMEOUT = 1000 * 60 * 10;
31
+
32
+ interface DebugMutation {
33
+ debugMutation: {
34
+ name: string;
35
+ };
36
+ }
37
+ const DebugMutation = gqlTyped<DebugMutation>`
38
+ mutation DebugMutation($input: DebugMutationInput!) {
39
+ debugMutation(input: $input) {
40
+ name
41
+ }
42
+ }`;
43
+
44
+ interface LockQueryResult {
45
+ lock: LockFragmentResult;
46
+ }
47
+ const LockQuery = gqlTyped<LockQueryResult>`
48
+ query LockQuery($resourceId: String!) {
49
+ lock(resourceId: $resourceId) {
50
+ ...LockFragment
51
+ }
52
+ }
53
+ ${LockFragment}
54
+ `;
55
+
56
+ interface GetDirectoryAndLockQueryResult {
57
+ lock: LockFragmentResult;
58
+ directory: DirectoryNode;
59
+ }
60
+ const GetDirectoryAndLockQuery = gqlTyped<GetDirectoryAndLockQueryResult>`
61
+ query GetDirectoryAndLockQuery($resourceId: String!, $directoryId: LrRelayIdInput!) {
62
+ lock(resourceId: $resourceId) {
63
+ ...LockFragment
64
+ }
65
+ directory(id: $directoryId) {
66
+ created
67
+ modified
68
+ plainMeta
69
+ }
70
+ }
71
+ ${LockFragment}
72
+ `;
73
+
74
+ interface GetDirectoryQueryResult {
75
+ lock: LockFragmentResult;
76
+ directory: DirectoryNode;
77
+ }
78
+ const GetDirectoryQuery = gqlTyped<GetDirectoryQueryResult>`
79
+ query GetDirectoryQuery($directoryId: LrRelayIdInput!) {
80
+ directory(id: $directoryId) {
81
+ created
82
+ modified
83
+ plainMeta
84
+ }
85
+ }
86
+ `;
87
+
88
+ function debugMutation(name: string) {
89
+ return new LrMutation({
90
+ mutation: DebugMutation,
91
+ variables: {
92
+ input: {
93
+ name,
94
+ },
95
+ },
96
+ });
97
+ }
98
+
99
+ describe('LockService', () => {
100
+ let lockService: LockService;
101
+ let lrGraphQL: LrGraphQLService;
102
+ let item2: Item2Service;
103
+ let tp2Service: TrustedParty2Service;
104
+
105
+ beforeEach(async () => {
106
+ lrConfigureTestingModule();
107
+ lockService = TestBed.inject(LockService);
108
+ lrGraphQL = TestBed.inject(LrGraphQLService);
109
+ item2 = TestBed.inject(Item2Service);
110
+ tp2Service = TestBed.inject(TrustedParty2Service);
111
+ }, TIMEOUT);
112
+
113
+ // You would always query the lock together with other fields. There's no point
114
+ // in getting the lock by itself. So this is only useful in testing.
115
+ async function getLock(resourceId: string) {
116
+ const res = await lrGraphQL.query({
117
+ query: LockQuery,
118
+ variables: {
119
+ resourceId,
120
+ },
121
+ });
122
+
123
+ if (res.lock && res.lock.state !== LockState.UNLOCKED) {
124
+ throw new LrLockedException(`Resource lock state: ${res.lock.state}`);
125
+ }
126
+
127
+ return res.lock?.version;
128
+ }
129
+
130
+ async function updateLock(resourceId: string, version: string) {
131
+ return (
132
+ await lrGraphQL.lrMutate(
133
+ lockService.updateLockMutation(resourceId, version)
134
+ )
135
+ ).updateLock.lock.version;
136
+ }
137
+
138
+ async function releaseLock(resourceId: string, version: string) {
139
+ return (
140
+ await lrGraphQL.lrMutate(
141
+ lockService.releaseLockMutation(resourceId, version)
142
+ )
143
+ ).releaseLock.lock.version;
144
+ }
145
+
146
+ async function acquireLock(resourceId: string, timeoutMs: number) {
147
+ return (
148
+ await lrGraphQL.lrMutate(
149
+ lockService.acquireLockMutation(resourceId, timeoutMs)
150
+ )
151
+ ).acquireLock.lock.version;
152
+ }
153
+
154
+ async function createDirectory(
155
+ name: string,
156
+ options: {
157
+ parents?: {
158
+ id: string;
159
+ keyId?: string;
160
+ }[];
161
+ asRoot?: boolean;
162
+ }
163
+ ) {
164
+ return (
165
+ await lrGraphQL.lrMutate(
166
+ item2.createDirectory({
167
+ plainMetaJson: { name },
168
+ cipherMetaClearJson: { name },
169
+ asRootDirectory: options.asRoot,
170
+ parentDirectories: options.parents?.map((parent) => ({
171
+ directoryId: parent.id,
172
+ wrappingKeyId: parent.keyId,
173
+ })),
174
+ })
175
+ )
176
+ ).createDirectory.directory;
177
+ }
178
+
179
+ lrit(
180
+ 'should lock',
181
+ async () => {
182
+ const {
183
+ username: username1,
184
+ password: password1,
185
+ } = environment.test.users[0];
186
+ const {
187
+ username: username2,
188
+ password: password2,
189
+ } = environment.test.users[1];
190
+
191
+ const { U1_TP_U2_ID, U2_TP_U1_ID } = await setupTps2(
192
+ username1,
193
+ password1,
194
+ username2,
195
+ password2
196
+ );
197
+
198
+ // ----------------------------------------------------------
199
+ // User 1
200
+ // ----------------------------------------------------------
201
+ await loginTestUser(username1, password1);
202
+ await deleteAllRootDirectories();
203
+
204
+ const D1 = await createDirectory('D1试用', { asRoot: true });
205
+ const D2 = await createDirectory('D2', { asRoot: true });
206
+
207
+ await lrGraphQL.lrMutate(
208
+ tp2Service.shareDirectory({
209
+ tpId: U1_TP_U2_ID,
210
+ itemId: D2.id,
211
+ accessRole: AccessRoleChoice.READER, // only READ permission is required
212
+ })
213
+ );
214
+
215
+ const version1 = await getLock(D2.id);
216
+ expect(version1).toBeUndefined(
217
+ 'New directory should not have a lock entity.'
218
+ );
219
+
220
+ // ----------------------------------------------------------
221
+ // Logout
222
+ // ----------------------------------------------------------
223
+ await logoutUser();
224
+
225
+ (await lrExpectAsyncThrow(getLock(D1.id))).toBeTruthy();
226
+
227
+ // ----------------------------------------------------------
228
+ // User 2
229
+ // ----------------------------------------------------------
230
+ await loginTestUser(username2, password2);
231
+
232
+ // D1 not shared with user 2
233
+ (await lrExpectGqlErrorCodes(getLock(D1.id))).toContain(
234
+ LrApiErrorCode.WRONG_PERMISSIONS
235
+ );
236
+ (await lrExpectGqlErrorCodes(acquireLock(D1.id, 1000 * 5))).toContain(
237
+ LrApiErrorCode.WRONG_PERMISSIONS
238
+ );
239
+
240
+ const d = await getDirectory(D2.id);
241
+
242
+ // D2 is shared with user 2
243
+ const version1a = await getLock(D2.id);
244
+ expect(version1a).toEqual(version1);
245
+
246
+ const update = lockService.updateLockMutation(D2.id, version1);
247
+
248
+ await lrGraphQL.lrMutate([update, debugMutation('version2')]);
249
+
250
+ const version2 = (await update.promise).updateLock.lock.version;
251
+ expect(version2).not.toEqual(version1);
252
+
253
+ (
254
+ await lrExpectGqlErrorCodes(
255
+ lrGraphQL.lrMutate([
256
+ lockService.updateLockMutation(D2.id, version1),
257
+ debugMutation('version2-fail'),
258
+ ])
259
+ )
260
+ ).toContain(
261
+ LrApiErrorCode.VERSION_MISMATCH,
262
+ 'Should fail to update using the same version'
263
+ );
264
+
265
+ (await lrExpectGqlErrorCodes(acquireLock(D2.id, 1000 * 1000))).toContain(
266
+ 'BAD_ARGUMENT',
267
+ 'Should not be able set lock expiry with large value,'
268
+ );
269
+
270
+ const version3 = await acquireLock(D2.id, 1000 * 3);
271
+
272
+ (await lrExpectGqlErrorCodes(acquireLock(D2.id, 1000 * 3))).toContain(
273
+ LrApiErrorCode.LOCKED,
274
+ 'Should not be able to acquireLock() when already locked'
275
+ );
276
+
277
+ (await lrExpectGqlErrorCodes(getLock(D2.id))).toContain(
278
+ LrErrorCode.Locked,
279
+ 'Should not be able to getLock() when already locked'
280
+ );
281
+
282
+ (await lrExpectGqlErrorCodes(updateLock(D2.id, version3))).toContain(
283
+ LrApiErrorCode.LOCKED,
284
+ 'Should not be able to updateVersion() while locked'
285
+ );
286
+
287
+ (await lrExpectGqlErrorCodes(releaseLock(D2.id, version2))).toContain(
288
+ LrApiErrorCode.VERSION_MISMATCH,
289
+ 'Should not be able to releaseLock() using wrong version'
290
+ );
291
+
292
+ // Release now
293
+ await releaseLock(D2.id, version3);
294
+
295
+ const version4 = await getLock(D2.id);
296
+ expect(version4).not.toEqual(version3);
297
+
298
+ (await lrExpectGqlErrorCodes(releaseLock(D2.id, version4))).toContain(
299
+ LrApiErrorCode.EXPIRED,
300
+ 'Should not be able to releaseLock() when lock has expired'
301
+ );
302
+
303
+ await updateLock(D2.id, version4);
304
+ const version5 = await getLock(D2.id);
305
+ expect(version5).not.toEqual(version4);
306
+
307
+ // ----------------------------
308
+ // This time let lock expire
309
+ // ----------------------------
310
+ const version6 = await acquireLock(D2.id, 1000 * 2);
311
+ expect(version6).not.toEqual(version5);
312
+
313
+ await delaySec(2.5);
314
+
315
+ const version6a = await getLock(D2.id);
316
+ expect(version6a).toEqual(
317
+ version6,
318
+ 'Version should not have changed when lock expires'
319
+ );
320
+
321
+ const version7 = await acquireLock(D2.id, 100);
322
+ expect(version7).not.toEqual(version6);
323
+
324
+ await delaySec(1);
325
+
326
+ const version8 = await updateLock(D2.id, version7);
327
+ },
328
+ TIMEOUT
329
+ );
330
+
331
+ async function testMissingUpdates({
332
+ optimistic,
333
+ mutex,
334
+ }: {
335
+ optimistic: boolean;
336
+ mutex: boolean;
337
+ }) {
338
+ const D1 = await createDirectory('D1试用', { asRoot: true });
339
+ await item2.updateDirectoryExec({
340
+ directoryId: D1.id,
341
+ plainMetaJson: { count: 0 },
342
+ });
343
+
344
+ let total = 0;
345
+ let contentions = 0;
346
+ let optimisticLocks = 0;
347
+ let mutexLocks = 0;
348
+
349
+ /**
350
+ *
351
+ * @param acquire True to use acquireLock(), False to use updateLock()
352
+ */
353
+ const createTask = async (acquire: boolean) => {
354
+ while (1) {
355
+ try {
356
+ await delaySec(Math.random() * 0.5);
357
+
358
+ let version;
359
+ let dir;
360
+
361
+ // Read the directory
362
+ if (acquire) {
363
+ // Lock using the mutex lock
364
+ version = await acquireLock(D1.id, 5000);
365
+ dir = await lrGraphQL.query({
366
+ query: GetDirectoryQuery,
367
+ variables: {
368
+ directoryId: D1.id,
369
+ },
370
+ });
371
+ } else {
372
+ // Lock using the optimistic lock
373
+ dir = await lrGraphQL.query({
374
+ query: GetDirectoryAndLockQuery,
375
+ variables: {
376
+ resourceId: D1.id,
377
+ directoryId: D1.id,
378
+ },
379
+ });
380
+
381
+ if (dir.lock && dir.lock.state !== LockState.UNLOCKED) {
382
+ throw new LrLockedException(
383
+ `Resource lock state: ${dir.lock.state}`
384
+ );
385
+ }
386
+ }
387
+
388
+ await delaySec(Math.random() * 0.2);
389
+
390
+ // Update the directory
391
+ const updateDirectoryMutation = item2.updateDirectoryMutation({
392
+ directoryId: D1.id,
393
+ plainMetaJson: { count: dir.directory.plainMetaJson.count + 1 },
394
+ });
395
+
396
+ let lockMutation;
397
+ if (acquire) {
398
+ // Using mutex lock
399
+ lockMutation = lockService.releaseLockMutation(D1.id, version);
400
+ } else {
401
+ // Using optimistic lock
402
+ lockMutation = lockService.updateLockMutation(
403
+ D1.id,
404
+ dir.lock?.version
405
+ );
406
+ }
407
+
408
+ await lrGraphQL.lrMutate([updateDirectoryMutation, lockMutation]);
409
+
410
+ if (acquire) {
411
+ ++mutexLocks;
412
+ } else {
413
+ ++optimisticLocks;
414
+ }
415
+
416
+ total++;
417
+ console.log('before version:', dir.lock?.version);
418
+ console.log('before count:', dir.directory.plainMetaJson.count);
419
+ break;
420
+ } catch (error) {
421
+ console.log('error: ', error);
422
+ contentions++;
423
+ }
424
+ }
425
+ };
426
+
427
+ const tasks = [];
428
+ const TASK_COUNT = 10;
429
+ for (let i = 0; i < TASK_COUNT; ++i) {
430
+ let acquire;
431
+
432
+ if (optimistic && mutex) {
433
+ acquire = Math.random() > 0.5;
434
+ } else if (optimistic) {
435
+ acquire = false;
436
+ } else if (mutex) {
437
+ acquire = true;
438
+ } else {
439
+ throw new Error('Must at least specify one of optimistic or mutex');
440
+ }
441
+
442
+ tasks.push(createTask(acquire));
443
+ }
444
+
445
+ await Promise.all(tasks);
446
+
447
+ // Get the directory
448
+ const res = await lrGraphQL.query({
449
+ query: GetDirectoryAndLockQuery,
450
+ variables: {
451
+ resourceId: D1.id,
452
+ directoryId: D1.id,
453
+ },
454
+ });
455
+
456
+ console.log('Total count: ', total);
457
+ console.log('Contentions: ', contentions);
458
+ console.log('Optimistic locks: ', optimisticLocks);
459
+ console.log('Mutex locks: ', mutexLocks);
460
+
461
+ expect(res.directory.plainMetaJson.count).toEqual(total);
462
+ expect(res.directory.plainMetaJson.count).toEqual(TASK_COUNT);
463
+ expect(contentions).toBeGreaterThan(0);
464
+ }
465
+
466
+ lrit(
467
+ 'should not have missing updates using optimistic lock',
468
+ async () => {
469
+ const {
470
+ username: username1,
471
+ password: password1,
472
+ } = environment.test.users[0];
473
+
474
+ // ----------------------------------------------------------
475
+ // User 1
476
+ // ----------------------------------------------------------
477
+ await loginTestUser(username1, password1);
478
+
479
+ await testMissingUpdates({
480
+ optimistic: true,
481
+ mutex: false,
482
+ });
483
+ },
484
+ TIMEOUT
485
+ );
486
+
487
+ lrit(
488
+ 'should not have missing updates using mutex lock',
489
+ async () => {
490
+ const {
491
+ username: username1,
492
+ password: password1,
493
+ } = environment.test.users[0];
494
+
495
+ // ----------------------------------------------------------
496
+ // User 1
497
+ // ----------------------------------------------------------
498
+ await loginTestUser(username1, password1);
499
+
500
+ await testMissingUpdates({
501
+ optimistic: false,
502
+ mutex: true,
503
+ });
504
+ },
505
+ TIMEOUT
506
+ );
507
+
508
+ lrit(
509
+ 'should not have missing updates using mutex lock',
510
+ async () => {
511
+ const {
512
+ username: username1,
513
+ password: password1,
514
+ } = environment.test.users[0];
515
+
516
+ // ----------------------------------------------------------
517
+ // User 1
518
+ // ----------------------------------------------------------
519
+ await loginTestUser(username1, password1);
520
+
521
+ await testMissingUpdates({
522
+ optimistic: false,
523
+ mutex: true,
524
+ });
525
+ },
526
+ TIMEOUT
527
+ );
528
+
529
+ lrit(
530
+ 'should not have missing updates using both optimistic and mutex lock',
531
+ async () => {
532
+ const {
533
+ username: username1,
534
+ password: password1,
535
+ } = environment.test.users[0];
536
+
537
+ // ----------------------------------------------------------
538
+ // User 1
539
+ // ----------------------------------------------------------
540
+ await loginTestUser(username1, password1);
541
+
542
+ await testMissingUpdates({
543
+ optimistic: true,
544
+ mutex: true,
545
+ });
546
+ },
547
+ TIMEOUT
548
+ );
549
+ });
@@ -0,0 +1,57 @@
1
+ import { Injectable, Injector, NgZone } from '@angular/core';
2
+ import { LrMutation, LrService } from './lr-graphql';
3
+ import {
4
+ AcquireLockMutation,
5
+ ReleaseLockMutation,
6
+ UpdateLockMutation,
7
+ } from './lock.gql';
8
+ import { RunOutsideAngular } from '../_common/run-outside-angular';
9
+
10
+ @RunOutsideAngular({
11
+ ngZoneName: 'ngZone',
12
+ })
13
+ @Injectable({
14
+ providedIn: 'root',
15
+ })
16
+ export class LockService extends LrService {
17
+ constructor(private ngZone: NgZone, private injector: Injector) {
18
+ super(injector);
19
+ }
20
+
21
+ // Updating the lock version is always to be down along with another mutation.
22
+ updateLockMutation(resourceId: string, version: string) {
23
+ return new LrMutation({
24
+ mutation: UpdateLockMutation,
25
+ variables: {
26
+ input: {
27
+ resourceId,
28
+ version,
29
+ },
30
+ },
31
+ });
32
+ }
33
+
34
+ acquireLockMutation(resourceId: string, timeoutMs: number) {
35
+ return new LrMutation({
36
+ mutation: AcquireLockMutation,
37
+ variables: {
38
+ input: {
39
+ resourceId,
40
+ timeoutMs,
41
+ },
42
+ },
43
+ });
44
+ }
45
+
46
+ releaseLockMutation(resourceId: string, version: string) {
47
+ return new LrMutation({
48
+ mutation: ReleaseLockMutation,
49
+ variables: {
50
+ input: {
51
+ resourceId,
52
+ version,
53
+ },
54
+ },
55
+ });
56
+ }
57
+ }
@@ -0,0 +1,27 @@
1
+ import { TestBed } from '@angular/core/testing';
2
+ import { Apollo } from 'apollo-angular';
3
+ import { KeyGraphService } from '../../public-api';
4
+ import { LrApolloService } from './lr-apollo.service';
5
+
6
+ const keyGraph = jasmine.createSpyObj<KeyGraphService>('KeyGraphService', [
7
+ 'addKeys',
8
+ ]);
9
+ const apollo = jasmine.createSpyObj<Apollo>('Apollo', ['query', 'mutate']);
10
+
11
+ describe('LrApolloService', () => {
12
+ let service: LrApolloService;
13
+
14
+ beforeEach(() => {
15
+ TestBed.configureTestingModule({
16
+ providers: [
17
+ { provide: Apollo, useValue: apollo },
18
+ { provide: KeyGraphService, useValue: keyGraph },
19
+ ],
20
+ });
21
+ service = TestBed.inject(LrApolloService);
22
+ });
23
+
24
+ it('should be created', () => {
25
+ expect(service).toBeTruthy();
26
+ });
27
+ });