@expo/entity 0.34.0 → 0.36.0

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 (333) hide show
  1. package/build/AuthorizationResultBasedEntityLoader.d.ts +128 -0
  2. package/build/AuthorizationResultBasedEntityLoader.js +196 -0
  3. package/build/AuthorizationResultBasedEntityLoader.js.map +1 -0
  4. package/build/ComposedEntityCacheAdapter.js +1 -0
  5. package/build/ComposedEntityCacheAdapter.js.map +1 -1
  6. package/build/ComposedSecondaryEntityCache.js +1 -0
  7. package/build/ComposedSecondaryEntityCache.js.map +1 -1
  8. package/build/EnforcingEntityLoader.d.ts +5 -4
  9. package/build/EnforcingEntityLoader.js +4 -2
  10. package/build/EnforcingEntityLoader.js.map +1 -1
  11. package/build/Entity.d.ts +4 -31
  12. package/build/Entity.js +19 -46
  13. package/build/Entity.js.map +1 -1
  14. package/build/EntityAssociationLoader.d.ts +9 -9
  15. package/build/EntityAssociationLoader.js +37 -12
  16. package/build/EntityAssociationLoader.js.map +1 -1
  17. package/build/EntityCompanion.js +9 -1
  18. package/build/EntityCompanion.js.map +1 -1
  19. package/build/EntityCompanionProvider.d.ts +3 -1
  20. package/build/EntityCompanionProvider.js +10 -4
  21. package/build/EntityCompanionProvider.js.map +1 -1
  22. package/build/EntityConfiguration.d.ts +2 -1
  23. package/build/EntityConfiguration.js +19 -1
  24. package/build/EntityConfiguration.js.map +1 -1
  25. package/build/EntityDatabaseAdapter.d.ts +2 -2
  26. package/build/EntityDatabaseAdapter.js +5 -3
  27. package/build/EntityDatabaseAdapter.js.map +1 -1
  28. package/build/EntityFieldDefinition.d.ts +21 -10
  29. package/build/EntityFieldDefinition.js +8 -9
  30. package/build/EntityFieldDefinition.js.map +1 -1
  31. package/build/EntityFields.d.ts +10 -0
  32. package/build/EntityFields.js +15 -1
  33. package/build/EntityFields.js.map +1 -1
  34. package/build/EntityLoader.d.ts +12 -125
  35. package/build/EntityLoader.js +24 -239
  36. package/build/EntityLoader.js.map +1 -1
  37. package/build/EntityLoaderFactory.d.ts +1 -1
  38. package/build/EntityLoaderFactory.js +3 -0
  39. package/build/EntityLoaderFactory.js.map +1 -1
  40. package/build/EntityLoaderUtils.d.ts +58 -0
  41. package/build/EntityLoaderUtils.js +109 -0
  42. package/build/EntityLoaderUtils.js.map +1 -0
  43. package/build/EntityMutator.d.ts +1 -0
  44. package/build/EntityMutator.js +71 -56
  45. package/build/EntityMutator.js.map +1 -1
  46. package/build/EntityMutatorFactory.js +9 -0
  47. package/build/EntityMutatorFactory.js.map +1 -1
  48. package/build/EntityPrivacyPolicy.d.ts +11 -5
  49. package/build/EntityPrivacyPolicy.js +5 -7
  50. package/build/EntityPrivacyPolicy.js.map +1 -1
  51. package/build/EntityQueryContext.d.ts +2 -1
  52. package/build/EntityQueryContext.js +11 -6
  53. package/build/EntityQueryContext.js.map +1 -1
  54. package/build/EntityQueryContextProvider.d.ts +1 -1
  55. package/build/EntityQueryContextProvider.js +1 -1
  56. package/build/EntityQueryContextProvider.js.map +1 -1
  57. package/build/EntitySecondaryCacheLoader.js +5 -1
  58. package/build/EntitySecondaryCacheLoader.js.map +1 -1
  59. package/build/GenericEntityCacheAdapter.js +1 -0
  60. package/build/GenericEntityCacheAdapter.js.map +1 -1
  61. package/build/GenericSecondaryEntityCache.js +2 -0
  62. package/build/GenericSecondaryEntityCache.js.map +1 -1
  63. package/build/IEntityCacheAdapterProvider.d.ts +1 -1
  64. package/build/IEntityDatabaseAdapterProvider.d.ts +1 -1
  65. package/build/ReadonlyEntity.d.ts +1 -1
  66. package/build/ReadonlyEntity.js +9 -2
  67. package/build/ReadonlyEntity.js.map +1 -1
  68. package/build/ViewerContext.d.ts +2 -2
  69. package/build/ViewerContext.js +5 -3
  70. package/build/ViewerContext.js.map +1 -1
  71. package/build/ViewerScopedEntityCompanion.js +2 -0
  72. package/build/ViewerScopedEntityCompanion.js.map +1 -1
  73. package/build/ViewerScopedEntityCompanionProvider.d.ts +0 -1
  74. package/build/ViewerScopedEntityCompanionProvider.js +2 -1
  75. package/build/ViewerScopedEntityCompanionProvider.js.map +1 -1
  76. package/build/ViewerScopedEntityLoaderFactory.d.ts +1 -1
  77. package/build/ViewerScopedEntityLoaderFactory.js +2 -0
  78. package/build/ViewerScopedEntityLoaderFactory.js.map +1 -1
  79. package/build/ViewerScopedEntityMutatorFactory.js +2 -0
  80. package/build/ViewerScopedEntityMutatorFactory.js.map +1 -1
  81. package/build/__tests__/ComposedCacheAdapter-test.js +2 -0
  82. package/build/__tests__/ComposedCacheAdapter-test.js.map +1 -1
  83. package/build/__tests__/ComposedSecondaryEntityCache-test.js +1 -0
  84. package/build/__tests__/ComposedSecondaryEntityCache-test.js.map +1 -1
  85. package/build/__tests__/EnforcingEntityLoader-test.js +101 -113
  86. package/build/__tests__/EnforcingEntityLoader-test.js.map +1 -1
  87. package/build/__tests__/Entity-test.js +5 -137
  88. package/build/__tests__/Entity-test.js.map +1 -1
  89. package/build/__tests__/EntityAssociationLoader-test.js +37 -65
  90. package/build/__tests__/EntityAssociationLoader-test.js.map +1 -1
  91. package/build/__tests__/EntityCommonUseCases-test.js +31 -37
  92. package/build/__tests__/EntityCommonUseCases-test.js.map +1 -1
  93. package/build/__tests__/EntityCompanion-test.js +26 -3
  94. package/build/__tests__/EntityCompanion-test.js.map +1 -1
  95. package/build/__tests__/EntityConfiguration-test.js +103 -0
  96. package/build/__tests__/EntityConfiguration-test.js.map +1 -0
  97. package/build/__tests__/EntityDatabaseAdapter-test.js +6 -0
  98. package/build/__tests__/EntityDatabaseAdapter-test.js.map +1 -1
  99. package/build/__tests__/EntityEdges-test.js +89 -80
  100. package/build/__tests__/EntityEdges-test.js.map +1 -1
  101. package/build/__tests__/EntityFields-test.js +6 -0
  102. package/build/__tests__/EntityFields-test.js.map +1 -1
  103. package/build/__tests__/EntityLoader-constructor-test.js +17 -18
  104. package/build/__tests__/EntityLoader-constructor-test.js.map +1 -1
  105. package/build/__tests__/EntityLoader-test.js +93 -41
  106. package/build/__tests__/EntityLoader-test.js.map +1 -1
  107. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js +18 -21
  108. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +1 -1
  109. package/build/__tests__/EntityMutator-test.js +74 -29
  110. package/build/__tests__/EntityMutator-test.js.map +1 -1
  111. package/build/__tests__/EntityPrivacyPolicy-test.js +77 -59
  112. package/build/__tests__/EntityPrivacyPolicy-test.js.map +1 -1
  113. package/build/__tests__/EntityQueryContext-test.js +9 -0
  114. package/build/__tests__/EntityQueryContext-test.js.map +1 -1
  115. package/build/__tests__/EntitySecondaryCacheLoader-test.js +10 -10
  116. package/build/__tests__/EntitySecondaryCacheLoader-test.js.map +1 -1
  117. package/build/__tests__/EntitySelfReferentialEdges-test.js +59 -74
  118. package/build/__tests__/EntitySelfReferentialEdges-test.js.map +1 -1
  119. package/build/__tests__/ReadonlyEntity-test.js +13 -13
  120. package/build/__tests__/ReadonlyEntity-test.js.map +1 -1
  121. package/build/__tests__/ViewerContext-test.js +2 -2
  122. package/build/__tests__/ViewerContext-test.js.map +1 -1
  123. package/build/__tests__/ViewerScopedEntityLoaderFactory-test.js.map +1 -1
  124. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +26 -28
  125. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +1 -1
  126. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +25 -30
  127. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +1 -1
  128. package/build/entityUtils.d.ts +1 -1
  129. package/build/entityUtils.js.map +1 -1
  130. package/build/errors/EntityCacheAdapterError.js +2 -5
  131. package/build/errors/EntityCacheAdapterError.js.map +1 -1
  132. package/build/errors/EntityDatabaseAdapterError.js +14 -35
  133. package/build/errors/EntityDatabaseAdapterError.js.map +1 -1
  134. package/build/errors/EntityError.js +1 -0
  135. package/build/errors/EntityError.js.map +1 -1
  136. package/build/errors/EntityInvalidFieldValueError.js +2 -2
  137. package/build/errors/EntityInvalidFieldValueError.js.map +1 -1
  138. package/build/errors/EntityNotAuthorizedError.js +3 -2
  139. package/build/errors/EntityNotAuthorizedError.js.map +1 -1
  140. package/build/errors/EntityNotFoundError.js +2 -2
  141. package/build/errors/EntityNotFoundError.js.map +1 -1
  142. package/build/index.d.ts +1 -0
  143. package/build/index.js +1 -0
  144. package/build/index.js.map +1 -1
  145. package/build/internal/EntityDataManager.d.ts +1 -1
  146. package/build/internal/EntityDataManager.js +7 -2
  147. package/build/internal/EntityDataManager.js.map +1 -1
  148. package/build/internal/EntityFieldTransformationUtils.d.ts +5 -5
  149. package/build/internal/EntityFieldTransformationUtils.js +5 -8
  150. package/build/internal/EntityFieldTransformationUtils.js.map +1 -1
  151. package/build/internal/EntityTableDataCoordinator.d.ts +1 -1
  152. package/build/internal/EntityTableDataCoordinator.js +5 -0
  153. package/build/internal/EntityTableDataCoordinator.js.map +1 -1
  154. package/build/internal/ReadThroughEntityCache.d.ts +1 -1
  155. package/build/internal/ReadThroughEntityCache.js +2 -0
  156. package/build/internal/ReadThroughEntityCache.js.map +1 -1
  157. package/build/internal/__tests__/EntityDataManager-test.js +11 -11
  158. package/build/internal/__tests__/EntityDataManager-test.js.map +1 -1
  159. package/build/internal/__tests__/EntityFieldTransformationUtils-test.js +6 -2
  160. package/build/internal/__tests__/EntityFieldTransformationUtils-test.js.map +1 -1
  161. package/build/internal/__tests__/ReadThroughEntityCache-test.js +33 -0
  162. package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +1 -1
  163. package/build/metrics/IEntityMetricsAdapter.d.ts +1 -1
  164. package/build/rules/AlwaysAllowPrivacyPolicyRule.d.ts +1 -1
  165. package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
  166. package/build/rules/AlwaysDenyPrivacyPolicyRule.d.ts +1 -1
  167. package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
  168. package/build/rules/AlwaysSkipPrivacyPolicyRule.d.ts +1 -1
  169. package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
  170. package/build/rules/PrivacyPolicyRule.d.ts +1 -1
  171. package/build/rules/PrivacyPolicyRule.js.map +1 -1
  172. package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js.map +1 -1
  173. package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js.map +1 -1
  174. package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js.map +1 -1
  175. package/build/testfixtures/DateIDTestEntity.js +12 -15
  176. package/build/testfixtures/DateIDTestEntity.js.map +1 -1
  177. package/build/testfixtures/SimpleTestEntity.d.ts +8 -8
  178. package/build/testfixtures/SimpleTestEntity.js +12 -15
  179. package/build/testfixtures/SimpleTestEntity.js.map +1 -1
  180. package/build/testfixtures/TestEntity.d.ts +12 -12
  181. package/build/testfixtures/TestEntity.js +12 -15
  182. package/build/testfixtures/TestEntity.js.map +1 -1
  183. package/build/testfixtures/TestEntity2.d.ts +8 -8
  184. package/build/testfixtures/TestEntity2.js +12 -15
  185. package/build/testfixtures/TestEntity2.js.map +1 -1
  186. package/build/testfixtures/TestEntityNumberKey.js +12 -15
  187. package/build/testfixtures/TestEntityNumberKey.js.map +1 -1
  188. package/build/testfixtures/TestEntityWithMutationTriggers.d.ts +36 -0
  189. package/build/testfixtures/TestEntityWithMutationTriggers.js +82 -0
  190. package/build/testfixtures/TestEntityWithMutationTriggers.js.map +1 -0
  191. package/build/testfixtures/TestViewerContext.d.ts +0 -3
  192. package/build/testfixtures/TestViewerContext.js +0 -6
  193. package/build/testfixtures/TestViewerContext.js.map +1 -1
  194. package/build/utils/EntityPrivacyUtils.d.ts +34 -0
  195. package/build/utils/EntityPrivacyUtils.js +160 -0
  196. package/build/utils/EntityPrivacyUtils.js.map +1 -0
  197. package/build/utils/__tests__/EntityPrivacyUtils-test.d.ts +1 -0
  198. package/build/utils/__tests__/EntityPrivacyUtils-test.js +395 -0
  199. package/build/utils/__tests__/EntityPrivacyUtils-test.js.map +1 -0
  200. package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.d.ts +1 -0
  201. package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js +26 -0
  202. package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js.map +1 -0
  203. package/build/utils/collections/maps.js.map +1 -1
  204. package/build/utils/mergeEntityMutationTriggerConfigurations.d.ts +4 -0
  205. package/build/utils/mergeEntityMutationTriggerConfigurations.js +28 -0
  206. package/build/utils/mergeEntityMutationTriggerConfigurations.js.map +1 -0
  207. package/build/utils/testing/PrivacyPolicyRuleTestUtils.d.ts +1 -1
  208. package/build/utils/testing/PrivacyPolicyRuleTestUtils.js.map +1 -1
  209. package/build/utils/testing/StubCacheAdapter.d.ts +3 -3
  210. package/build/utils/testing/StubCacheAdapter.js +3 -3
  211. package/build/utils/testing/StubCacheAdapter.js.map +1 -1
  212. package/build/utils/testing/StubDatabaseAdapter.d.ts +2 -2
  213. package/build/utils/testing/StubDatabaseAdapter.js +4 -2
  214. package/build/utils/testing/StubDatabaseAdapter.js.map +1 -1
  215. package/build/utils/testing/StubDatabaseAdapterProvider.d.ts +1 -1
  216. package/build/utils/testing/StubDatabaseAdapterProvider.js +1 -3
  217. package/build/utils/testing/StubDatabaseAdapterProvider.js.map +1 -1
  218. package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.d.ts +1 -0
  219. package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.js +42 -0
  220. package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.js.map +1 -0
  221. package/build/utils/testing/__tests__/StubDatabaseAdapter-test.js +53 -0
  222. package/build/utils/testing/__tests__/StubDatabaseAdapter-test.js.map +1 -1
  223. package/build/utils/testing/describeFieldTestCase.js.map +1 -1
  224. package/package.json +4 -3
  225. package/src/AuthorizationResultBasedEntityLoader.ts +297 -0
  226. package/src/ComposedEntityCacheAdapter.ts +6 -6
  227. package/src/ComposedSecondaryEntityCache.ts +8 -8
  228. package/src/EnforcingEntityLoader.ts +20 -19
  229. package/src/Entity.ts +26 -118
  230. package/src/EntityAssociationLoader.ts +56 -41
  231. package/src/EntityCompanion.ts +8 -4
  232. package/src/EntityCompanionProvider.ts +24 -16
  233. package/src/EntityConfiguration.ts +18 -7
  234. package/src/EntityDatabaseAdapter.ts +41 -41
  235. package/src/EntityFieldDefinition.ts +28 -18
  236. package/src/EntityFields.ts +15 -0
  237. package/src/EntityLoader.ts +63 -357
  238. package/src/EntityLoaderFactory.ts +10 -4
  239. package/src/EntityLoaderUtils.ts +149 -0
  240. package/src/EntityMutationInfo.ts +2 -2
  241. package/src/EntityMutationTriggerConfiguration.ts +5 -5
  242. package/src/EntityMutationValidator.ts +2 -2
  243. package/src/EntityMutator.ts +146 -144
  244. package/src/EntityMutatorFactory.ts +8 -8
  245. package/src/EntityPrivacyPolicy.ts +78 -28
  246. package/src/EntityQueryContext.ts +14 -13
  247. package/src/EntityQueryContextProvider.ts +6 -6
  248. package/src/EntitySecondaryCacheLoader.ts +13 -11
  249. package/src/GenericEntityCacheAdapter.ts +10 -10
  250. package/src/GenericSecondaryEntityCache.ts +6 -6
  251. package/src/IEntityCacheAdapter.ts +4 -4
  252. package/src/IEntityCacheAdapterProvider.ts +2 -2
  253. package/src/IEntityDatabaseAdapterProvider.ts +2 -2
  254. package/src/ReadonlyEntity.ts +8 -5
  255. package/src/ViewerContext.ts +10 -10
  256. package/src/ViewerScopedEntityCompanion.ts +4 -4
  257. package/src/ViewerScopedEntityCompanionProvider.ts +4 -5
  258. package/src/ViewerScopedEntityLoaderFactory.ts +10 -4
  259. package/src/ViewerScopedEntityMutatorFactory.ts +5 -5
  260. package/src/__tests__/ComposedCacheAdapter-test.ts +12 -10
  261. package/src/__tests__/ComposedSecondaryEntityCache-test.ts +8 -8
  262. package/src/__tests__/EnforcingEntityLoader-test.ts +236 -159
  263. package/src/__tests__/Entity-test.ts +5 -223
  264. package/src/__tests__/EntityAssociationLoader-test.ts +91 -169
  265. package/src/__tests__/EntityCommonUseCases-test.ts +36 -38
  266. package/src/__tests__/EntityCompanion-test.ts +57 -5
  267. package/src/__tests__/EntityConfiguration-test.ts +118 -0
  268. package/src/__tests__/EntityDatabaseAdapter-test.ts +11 -11
  269. package/src/__tests__/EntityEdges-test.ts +128 -118
  270. package/src/__tests__/EntityFields-test.ts +14 -2
  271. package/src/__tests__/EntityLoader-constructor-test.ts +21 -8
  272. package/src/__tests__/EntityLoader-test.ts +233 -105
  273. package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +17 -20
  274. package/src/__tests__/EntityMutator-test.ts +342 -163
  275. package/src/__tests__/EntityPrivacyPolicy-test.ts +166 -53
  276. package/src/__tests__/EntityQueryContext-test.ts +30 -12
  277. package/src/__tests__/EntitySecondaryCacheLoader-test.ts +17 -26
  278. package/src/__tests__/EntitySelfReferentialEdges-test.ts +67 -115
  279. package/src/__tests__/GenericEntityCacheAdapter-test.ts +2 -2
  280. package/src/__tests__/ReadonlyEntity-test.ts +13 -15
  281. package/src/__tests__/ViewerContext-test.ts +3 -4
  282. package/src/__tests__/ViewerScopedEntityCompanion-test.ts +2 -2
  283. package/src/__tests__/ViewerScopedEntityCompanionProvider-test.ts +2 -2
  284. package/src/__tests__/ViewerScopedEntityLoaderFactory-test.ts +2 -1
  285. package/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.ts +34 -45
  286. package/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.ts +22 -30
  287. package/src/__tests__/entityUtils-test.ts +2 -2
  288. package/src/entityUtils.ts +4 -4
  289. package/src/errors/EntityError.ts +4 -1
  290. package/src/errors/EntityInvalidFieldValueError.ts +2 -2
  291. package/src/errors/EntityNotAuthorizedError.ts +3 -3
  292. package/src/errors/EntityNotFoundError.ts +2 -2
  293. package/src/index.ts +1 -0
  294. package/src/internal/EntityDataManager.ts +25 -25
  295. package/src/internal/EntityFieldTransformationUtils.ts +39 -32
  296. package/src/internal/EntityTableDataCoordinator.ts +3 -3
  297. package/src/internal/ReadThroughEntityCache.ts +9 -9
  298. package/src/internal/__tests__/EntityDataManager-test.ts +62 -62
  299. package/src/internal/__tests__/EntityFieldTransformationUtils-test.ts +14 -10
  300. package/src/internal/__tests__/ReadThroughEntityCache-test.ts +74 -18
  301. package/src/metrics/EntityMetricsUtils.ts +4 -4
  302. package/src/metrics/IEntityMetricsAdapter.ts +1 -1
  303. package/src/rules/AlwaysAllowPrivacyPolicyRule.ts +9 -3
  304. package/src/rules/AlwaysDenyPrivacyPolicyRule.ts +9 -3
  305. package/src/rules/AlwaysSkipPrivacyPolicyRule.ts +9 -3
  306. package/src/rules/PrivacyPolicyRule.ts +9 -3
  307. package/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.ts +2 -1
  308. package/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.ts +2 -1
  309. package/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.ts +2 -1
  310. package/src/testfixtures/SimpleTestEntity.ts +8 -8
  311. package/src/testfixtures/TestEntity.ts +13 -16
  312. package/src/testfixtures/TestEntity2.ts +8 -8
  313. package/src/testfixtures/TestEntityWithMutationTriggers.ts +156 -0
  314. package/src/testfixtures/TestViewerContext.ts +1 -12
  315. package/src/utils/EntityPrivacyUtils.ts +325 -0
  316. package/src/utils/__tests__/EntityPrivacyUtils-test.ts +570 -0
  317. package/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.ts +29 -0
  318. package/src/utils/collections/__tests__/maps-test.ts +2 -2
  319. package/src/utils/collections/maps.ts +11 -11
  320. package/src/utils/mergeEntityMutationTriggerConfigurations.ts +44 -0
  321. package/src/utils/testing/PrivacyPolicyRuleTestUtils.ts +25 -22
  322. package/src/utils/testing/StubCacheAdapter.ts +17 -15
  323. package/src/utils/testing/StubDatabaseAdapter.ts +35 -30
  324. package/src/utils/testing/StubDatabaseAdapterProvider.ts +2 -2
  325. package/src/utils/testing/StubQueryContextProvider.ts +2 -2
  326. package/src/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.ts +42 -0
  327. package/src/utils/testing/__tests__/StubDatabaseAdapter-test.ts +111 -29
  328. package/src/utils/testing/createUnitTestEntityCompanionProvider.ts +2 -2
  329. package/src/utils/testing/describeFieldTestCase.ts +1 -1
  330. package/build/__tests__/EntityDataConfiguration-test.js +0 -68
  331. package/build/__tests__/EntityDataConfiguration-test.js.map +0 -1
  332. package/src/__tests__/EntityDataConfiguration-test.ts +0 -77
  333. /package/build/__tests__/{EntityDataConfiguration-test.d.ts → EntityConfiguration-test.d.ts} +0 -0
@@ -5,7 +5,9 @@ import { v4 as uuidv4 } from 'uuid';
5
5
  import { OrderByOrdering } from '../EntityDatabaseAdapter';
6
6
  import EntityLoader from '../EntityLoader';
7
7
  import { EntityPrivacyPolicyEvaluationContext } from '../EntityPrivacyPolicy';
8
+ import ViewerContext from '../ViewerContext';
8
9
  import { enforceResultsAsync } from '../entityUtils';
10
+ import EntityNotFoundError from '../errors/EntityNotFoundError';
9
11
  import EntityDataManager from '../internal/EntityDataManager';
10
12
  import ReadThroughEntityCache from '../internal/ReadThroughEntityCache';
11
13
  import IEntityMetricsAdapter from '../metrics/IEntityMetricsAdapter';
@@ -14,7 +16,6 @@ import TestEntity, {
14
16
  TestEntityPrivacyPolicy,
15
17
  testEntityConfiguration,
16
18
  } from '../testfixtures/TestEntity';
17
- import TestViewerContext from '../testfixtures/TestViewerContext';
18
19
  import { NoCacheStubCacheAdapterProvider } from '../utils/testing/StubCacheAdapter';
19
20
  import StubDatabaseAdapter from '../utils/testing/StubDatabaseAdapter';
20
21
  import StubQueryContextProvider from '../utils/testing/StubQueryContextProvider';
@@ -22,10 +23,13 @@ import StubQueryContextProvider from '../utils/testing/StubQueryContextProvider'
22
23
  describe(EntityLoader, () => {
23
24
  it('loads entities', async () => {
24
25
  const dateToInsert = new Date();
25
- const viewerContext = instance(mock(TestViewerContext));
26
- const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
26
+ const viewerContext = instance(mock(ViewerContext));
27
+ const privacyPolicyEvaluationContext =
28
+ instance(
29
+ mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
30
+ );
27
31
  const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
28
- const queryContext = StubQueryContextProvider.getNonTransactionalQueryContext();
32
+ const queryContext = StubQueryContextProvider.getQueryContext();
29
33
 
30
34
  const id1 = uuidv4();
31
35
  const id2 = uuidv4();
@@ -55,8 +59,8 @@ describe(EntityLoader, () => {
55
59
  },
56
60
  ],
57
61
  ],
58
- ])
59
- )
62
+ ]),
63
+ ),
60
64
  );
61
65
  const privacyPolicy = new TestEntityPrivacyPolicy();
62
66
  const cacheAdapterProvider = new NoCacheStubCacheAdapterProvider();
@@ -67,7 +71,7 @@ describe(EntityLoader, () => {
67
71
  entityCache,
68
72
  StubQueryContextProvider,
69
73
  instance(mock<IEntityMetricsAdapter>()),
70
- TestEntity.name
74
+ TestEntity.name,
71
75
  );
72
76
  const entityLoader = new EntityLoader(
73
77
  viewerContext,
@@ -78,22 +82,28 @@ describe(EntityLoader, () => {
78
82
  /* entitySelectedFields */ undefined,
79
83
  privacyPolicy,
80
84
  dataManager,
81
- metricsAdapter
85
+ metricsAdapter,
86
+ );
87
+ const entity = await enforceAsyncResult(
88
+ entityLoader.withAuthorizationResults().loadByIDAsync(id1),
82
89
  );
83
- const entity = await enforceAsyncResult(entityLoader.loadByIDAsync(id1));
84
90
  expect(entity.getID()).toEqual(id1);
85
91
  expect(entity.getField('dateField')).toEqual(dateToInsert);
86
92
 
87
93
  const entities = await enforceResultsAsync(
88
- entityLoader.loadManyByFieldEqualingAsync('stringField', 'huh')
94
+ entityLoader.withAuthorizationResults().loadManyByFieldEqualingAsync('stringField', 'huh'),
89
95
  );
90
96
  expect(entities.map((m) => m.getID())).toEqual([id1, id2]);
91
97
 
92
- const entityResultNumber3 = await entityLoader.loadByFieldEqualingAsync('intField', 3);
98
+ const entityResultNumber3 = await entityLoader
99
+ .withAuthorizationResults()
100
+ .loadByFieldEqualingAsync('intField', 3);
93
101
  expect(entityResultNumber3).not.toBeNull();
94
102
  expect(entityResultNumber3!.enforceValue().getID()).toEqual(id2);
95
103
 
96
- const entityResultNumber4 = await entityLoader.loadByFieldEqualingAsync('intField', 4);
104
+ const entityResultNumber4 = await entityLoader
105
+ .withAuthorizationResults()
106
+ .loadByFieldEqualingAsync('intField', 4);
97
107
  expect(entityResultNumber4).toBeNull();
98
108
 
99
109
  const entityResultDuplicateValues = await entityLoader
@@ -102,25 +112,45 @@ describe(EntityLoader, () => {
102
112
  expect(entityResultDuplicateValues.size).toBe(1);
103
113
  expect(entityResultDuplicateValues.get('huh')?.map((m) => m.getID())).toEqual([id1, id2]);
104
114
 
105
- await expect(entityLoader.loadByFieldEqualingAsync('stringField', 'huh')).rejects.toThrowError(
106
- 'loadByFieldEqualing: Multiple entities of type TestEntity found for stringField=huh'
115
+ await expect(
116
+ entityLoader.withAuthorizationResults().loadByFieldEqualingAsync('stringField', 'huh'),
117
+ ).rejects.toThrowError(
118
+ 'loadByFieldEqualing: Multiple entities of type TestEntity found for stringField=huh',
107
119
  );
108
120
 
109
- await expect(entityLoader.loadByIDNullableAsync(uuidv4())).resolves.toBeNull();
110
- await expect(entityLoader.loadByIDNullableAsync(id1)).resolves.not.toBeNull();
121
+ await expect(
122
+ entityLoader.withAuthorizationResults().loadByIDNullableAsync(uuidv4()),
123
+ ).resolves.toBeNull();
124
+ await expect(
125
+ entityLoader.withAuthorizationResults().loadByIDNullableAsync(id1),
126
+ ).resolves.not.toBeNull();
111
127
 
112
- await expect(entityLoader.loadByIDAsync('not-a-uuid')).rejects.toThrowError(
113
- 'Entity field not valid: TestEntity (customIdField = not-a-uuid)'
114
- );
128
+ const nonExistentId = uuidv4();
129
+ const manyIdResults = await entityLoader
130
+ .withAuthorizationResults()
131
+ .loadManyByIDsNullableAsync([nonExistentId, id1]);
132
+ expect(manyIdResults.get(nonExistentId)).toBeNull();
133
+ expect(manyIdResults.get(id1)).not.toBeNull();
134
+
135
+ await expect(
136
+ enforceAsyncResult(entityLoader.withAuthorizationResults().loadByIDAsync(nonExistentId)),
137
+ ).rejects.toThrow(EntityNotFoundError);
138
+
139
+ await expect(
140
+ entityLoader.withAuthorizationResults().loadByIDAsync('not-a-uuid'),
141
+ ).rejects.toThrowError('Entity field not valid: TestEntity (customIdField = not-a-uuid)');
115
142
  });
116
143
 
117
144
  it('loads entities with loadManyByFieldEqualityConjunction', async () => {
118
145
  const privacyPolicy = new TestEntityPrivacyPolicy();
119
146
  const spiedPrivacyPolicy = spy(privacyPolicy);
120
- const viewerContext = instance(mock(TestViewerContext));
121
- const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
147
+ const viewerContext = instance(mock(ViewerContext));
148
+ const privacyPolicyEvaluationContext =
149
+ instance(
150
+ mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
151
+ );
122
152
  const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
123
- const queryContext = StubQueryContextProvider.getNonTransactionalQueryContext();
153
+ const queryContext = StubQueryContextProvider.getQueryContext();
124
154
 
125
155
  const id1 = uuidv4();
126
156
  const id2 = uuidv4();
@@ -159,8 +189,8 @@ describe(EntityLoader, () => {
159
189
  },
160
190
  ],
161
191
  ],
162
- ])
163
- )
192
+ ]),
193
+ ),
164
194
  );
165
195
  const cacheAdapterProvider = new NoCacheStubCacheAdapterProvider();
166
196
  const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
@@ -170,7 +200,7 @@ describe(EntityLoader, () => {
170
200
  entityCache,
171
201
  StubQueryContextProvider,
172
202
  instance(mock<IEntityMetricsAdapter>()),
173
- TestEntity.name
203
+ TestEntity.name,
174
204
  );
175
205
  const entityLoader = new EntityLoader(
176
206
  viewerContext,
@@ -181,19 +211,19 @@ describe(EntityLoader, () => {
181
211
  /* entitySelectedFields */ undefined,
182
212
  privacyPolicy,
183
213
  dataManager,
184
- metricsAdapter
214
+ metricsAdapter,
185
215
  );
186
216
  const entities = await enforceResultsAsync(
187
- entityLoader.loadManyByFieldEqualityConjunctionAsync([
217
+ entityLoader.withAuthorizationResults().loadManyByFieldEqualityConjunctionAsync([
188
218
  {
189
219
  fieldName: 'stringField',
190
220
  fieldValue: 'huh',
191
221
  },
192
222
  {
193
223
  fieldName: 'intField',
194
- fieldValue: 4,
224
+ fieldValues: [4],
195
225
  },
196
- ])
226
+ ]),
197
227
  );
198
228
  expect(entities).toHaveLength(2);
199
229
  verify(
@@ -202,24 +232,29 @@ describe(EntityLoader, () => {
202
232
  queryContext,
203
233
  privacyPolicyEvaluationContext,
204
234
  anyOfClass(TestEntity),
205
- anything()
206
- )
235
+ anything(),
236
+ ),
207
237
  ).twice();
208
238
 
209
239
  await expect(
210
- entityLoader.loadManyByFieldEqualityConjunctionAsync([
211
- { fieldName: 'customIdField', fieldValue: 'not-a-uuid' },
212
- ])
240
+ entityLoader
241
+ .withAuthorizationResults()
242
+ .loadManyByFieldEqualityConjunctionAsync([
243
+ { fieldName: 'customIdField', fieldValue: 'not-a-uuid' },
244
+ ]),
213
245
  ).rejects.toThrowError('Entity field not valid: TestEntity (customIdField = not-a-uuid)');
214
246
  });
215
247
 
216
248
  it('loads entities with loadFirstByFieldEqualityConjunction', async () => {
217
249
  const privacyPolicy = new TestEntityPrivacyPolicy();
218
250
  const spiedPrivacyPolicy = spy(privacyPolicy);
219
- const viewerContext = instance(mock(TestViewerContext));
220
- const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
251
+ const viewerContext = instance(mock(ViewerContext));
252
+ const privacyPolicyEvaluationContext =
253
+ instance(
254
+ mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
255
+ );
221
256
  const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
222
- const queryContext = StubQueryContextProvider.getNonTransactionalQueryContext();
257
+ const queryContext = StubQueryContextProvider.getQueryContext();
223
258
 
224
259
  const id1 = uuidv4();
225
260
  const id2 = uuidv4();
@@ -258,8 +293,8 @@ describe(EntityLoader, () => {
258
293
  },
259
294
  ],
260
295
  ],
261
- ])
262
- )
296
+ ]),
297
+ ),
263
298
  );
264
299
  const cacheAdapterProvider = new NoCacheStubCacheAdapterProvider();
265
300
  const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
@@ -269,7 +304,7 @@ describe(EntityLoader, () => {
269
304
  entityCache,
270
305
  StubQueryContextProvider,
271
306
  instance(mock<IEntityMetricsAdapter>()),
272
- TestEntity.name
307
+ TestEntity.name,
273
308
  );
274
309
  const entityLoader = new EntityLoader(
275
310
  viewerContext,
@@ -280,21 +315,23 @@ describe(EntityLoader, () => {
280
315
  /* entitySelectedFields */ undefined,
281
316
  privacyPolicy,
282
317
  dataManager,
283
- metricsAdapter
284
- );
285
- const result = await entityLoader.loadFirstByFieldEqualityConjunctionAsync(
286
- [
287
- {
288
- fieldName: 'stringField',
289
- fieldValue: 'huh',
290
- },
291
- {
292
- fieldName: 'intField',
293
- fieldValue: 4,
294
- },
295
- ],
296
- { orderBy: [{ fieldName: 'testIndexedField', order: OrderByOrdering.DESCENDING }] }
318
+ metricsAdapter,
297
319
  );
320
+ const result = await entityLoader
321
+ .withAuthorizationResults()
322
+ .loadFirstByFieldEqualityConjunctionAsync(
323
+ [
324
+ {
325
+ fieldName: 'stringField',
326
+ fieldValue: 'huh',
327
+ },
328
+ {
329
+ fieldName: 'intField',
330
+ fieldValue: 4,
331
+ },
332
+ ],
333
+ { orderBy: [{ fieldName: 'testIndexedField', order: OrderByOrdering.DESCENDING }] },
334
+ );
298
335
  expect(result).not.toBeNull();
299
336
  expect(result!.ok).toBe(true);
300
337
  expect(result!.enforceValue().getField('testIndexedField')).toEqual('5');
@@ -304,8 +341,69 @@ describe(EntityLoader, () => {
304
341
  queryContext,
305
342
  privacyPolicyEvaluationContext,
306
343
  anyOfClass(TestEntity),
307
- anything()
308
- )
344
+ anything(),
345
+ ),
346
+ ).once();
347
+ });
348
+
349
+ it('loads entities with loadManyByRawWhereClauseAsync', async () => {
350
+ const privacyPolicy = new TestEntityPrivacyPolicy();
351
+ const spiedPrivacyPolicy = spy(privacyPolicy);
352
+ const viewerContext = instance(mock(ViewerContext));
353
+ const privacyPolicyEvaluationContext =
354
+ instance(
355
+ mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
356
+ );
357
+ const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
358
+ const queryContext = StubQueryContextProvider.getQueryContext();
359
+
360
+ const dataManagerMock = mock<EntityDataManager<TestFields>>(EntityDataManager);
361
+ when(
362
+ dataManagerMock.loadManyByRawWhereClauseAsync(
363
+ queryContext,
364
+ anything(),
365
+ anything(),
366
+ anything(),
367
+ ),
368
+ ).thenResolve([
369
+ {
370
+ customIdField: 'id',
371
+ stringField: 'huh',
372
+ intField: 4,
373
+ testIndexedField: '4',
374
+ dateField: new Date(),
375
+ nullableField: null,
376
+ },
377
+ ]);
378
+ const dataManager = instance(dataManagerMock);
379
+ const entityLoader = new EntityLoader(
380
+ viewerContext,
381
+ queryContext,
382
+ privacyPolicyEvaluationContext,
383
+ testEntityConfiguration,
384
+ TestEntity,
385
+ /* entitySelectedFields */ undefined,
386
+ privacyPolicy,
387
+ dataManager,
388
+ metricsAdapter,
389
+ );
390
+ const result = await entityLoader
391
+ .withAuthorizationResults()
392
+ .loadManyByRawWhereClauseAsync('id = ?', [1], {
393
+ orderBy: [{ fieldName: 'testIndexedField', order: OrderByOrdering.DESCENDING }],
394
+ });
395
+ expect(result).toHaveLength(1);
396
+ expect(result[0]).not.toBeNull();
397
+ expect(result[0]!.ok).toBe(true);
398
+ expect(result[0]!.enforceValue().getField('testIndexedField')).toEqual('4');
399
+ verify(
400
+ spiedPrivacyPolicy.authorizeReadAsync(
401
+ viewerContext,
402
+ queryContext,
403
+ privacyPolicyEvaluationContext,
404
+ anyOfClass(TestEntity),
405
+ anything(),
406
+ ),
309
407
  ).once();
310
408
  });
311
409
 
@@ -313,10 +411,13 @@ describe(EntityLoader, () => {
313
411
  const privacyPolicy = new TestEntityPrivacyPolicy();
314
412
  const spiedPrivacyPolicy = spy(privacyPolicy);
315
413
 
316
- const viewerContext = instance(mock(TestViewerContext));
317
- const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
414
+ const viewerContext = instance(mock(ViewerContext));
415
+ const privacyPolicyEvaluationContext =
416
+ instance(
417
+ mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
418
+ );
318
419
  const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
319
- const queryContext = StubQueryContextProvider.getNonTransactionalQueryContext();
420
+ const queryContext = StubQueryContextProvider.getQueryContext();
320
421
 
321
422
  const id1 = uuidv4();
322
423
  const databaseAdapter = new StubDatabaseAdapter<TestFields>(
@@ -337,8 +438,8 @@ describe(EntityLoader, () => {
337
438
  },
338
439
  ],
339
440
  ],
340
- ])
341
- )
441
+ ]),
442
+ ),
342
443
  );
343
444
  const cacheAdapterProvider = new NoCacheStubCacheAdapterProvider();
344
445
  const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
@@ -348,7 +449,7 @@ describe(EntityLoader, () => {
348
449
  entityCache,
349
450
  StubQueryContextProvider,
350
451
  instance(mock<IEntityMetricsAdapter>()),
351
- TestEntity.name
452
+ TestEntity.name,
352
453
  );
353
454
  const entityLoader = new EntityLoader(
354
455
  viewerContext,
@@ -359,25 +460,30 @@ describe(EntityLoader, () => {
359
460
  /* entitySelectedFields */ undefined,
360
461
  privacyPolicy,
361
462
  dataManager,
362
- metricsAdapter
463
+ metricsAdapter,
464
+ );
465
+ const entity = await enforceAsyncResult(
466
+ entityLoader.withAuthorizationResults().loadByIDAsync(id1),
363
467
  );
364
- const entity = await enforceAsyncResult(entityLoader.loadByIDAsync(id1));
365
468
  verify(
366
469
  spiedPrivacyPolicy.authorizeReadAsync(
367
470
  viewerContext,
368
471
  queryContext,
369
472
  privacyPolicyEvaluationContext,
370
473
  entity,
371
- anything()
372
- )
474
+ anything(),
475
+ ),
373
476
  ).once();
374
477
  });
375
478
 
376
479
  it('invalidates upon invalidate one', async () => {
377
- const viewerContext = instance(mock(TestViewerContext));
378
- const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
480
+ const viewerContext = instance(mock(ViewerContext));
481
+ const privacyPolicyEvaluationContext =
482
+ instance(
483
+ mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
484
+ );
379
485
  const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
380
- const queryContext = StubQueryContextProvider.getNonTransactionalQueryContext();
486
+ const queryContext = StubQueryContextProvider.getQueryContext();
381
487
  const privacyPolicy = instance(mock(TestEntityPrivacyPolicy));
382
488
  const dataManagerMock = mock<EntityDataManager<TestFields>>();
383
489
  const dataManagerInstance = instance(dataManagerMock);
@@ -392,20 +498,23 @@ describe(EntityLoader, () => {
392
498
  /* entitySelectedFields */ undefined,
393
499
  privacyPolicy,
394
500
  dataManagerInstance,
395
- metricsAdapter
501
+ metricsAdapter,
396
502
  );
397
- await entityLoader.invalidateFieldsAsync({ customIdField: id1 } as any);
503
+ await entityLoader.utils().invalidateFieldsAsync({ customIdField: id1 } as any);
398
504
 
399
505
  verify(
400
- dataManagerMock.invalidateObjectFieldsAsync(deepEqual({ customIdField: id1 } as any))
506
+ dataManagerMock.invalidateObjectFieldsAsync(deepEqual({ customIdField: id1 } as any)),
401
507
  ).once();
402
508
  });
403
509
 
404
510
  it('invalidates upon invalidate by field', async () => {
405
- const viewerContext = instance(mock(TestViewerContext));
406
- const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
511
+ const viewerContext = instance(mock(ViewerContext));
512
+ const privacyPolicyEvaluationContext =
513
+ instance(
514
+ mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
515
+ );
407
516
  const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
408
- const queryContext = StubQueryContextProvider.getNonTransactionalQueryContext();
517
+ const queryContext = StubQueryContextProvider.getQueryContext();
409
518
  const privacyPolicy = instance(mock(TestEntityPrivacyPolicy));
410
519
  const dataManagerMock = mock<EntityDataManager<TestFields>>();
411
520
  const dataManagerInstance = instance(dataManagerMock);
@@ -420,19 +529,22 @@ describe(EntityLoader, () => {
420
529
  /* entitySelectedFields */ undefined,
421
530
  privacyPolicy,
422
531
  dataManagerInstance,
423
- metricsAdapter
532
+ metricsAdapter,
424
533
  );
425
- await entityLoader.invalidateFieldsAsync({ customIdField: id1 } as any);
534
+ await entityLoader.utils().invalidateFieldsAsync({ customIdField: id1 } as any);
426
535
  verify(
427
- dataManagerMock.invalidateObjectFieldsAsync(deepEqual({ customIdField: id1 } as any))
536
+ dataManagerMock.invalidateObjectFieldsAsync(deepEqual({ customIdField: id1 } as any)),
428
537
  ).once();
429
538
  });
430
539
 
431
540
  it('invalidates upon invalidate by entity', async () => {
432
- const viewerContext = instance(mock(TestViewerContext));
433
- const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
541
+ const viewerContext = instance(mock(ViewerContext));
542
+ const privacyPolicyEvaluationContext =
543
+ instance(
544
+ mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
545
+ );
434
546
  const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
435
- const queryContext = StubQueryContextProvider.getNonTransactionalQueryContext();
547
+ const queryContext = StubQueryContextProvider.getQueryContext();
436
548
  const privacyPolicy = instance(mock(TestEntityPrivacyPolicy));
437
549
  const dataManagerMock = mock<EntityDataManager<TestFields>>();
438
550
  const dataManagerInstance = instance(dataManagerMock);
@@ -451,25 +563,28 @@ describe(EntityLoader, () => {
451
563
  /* entitySelectedFields */ undefined,
452
564
  privacyPolicy,
453
565
  dataManagerInstance,
454
- metricsAdapter
566
+ metricsAdapter,
455
567
  );
456
- await entityLoader.invalidateEntityAsync(entityInstance);
568
+ await entityLoader.utils().invalidateEntityAsync(entityInstance);
457
569
  verify(
458
- dataManagerMock.invalidateObjectFieldsAsync(deepEqual({ customIdField: id1 } as any))
570
+ dataManagerMock.invalidateObjectFieldsAsync(deepEqual({ customIdField: id1 } as any)),
459
571
  ).once();
460
572
  });
461
573
 
462
574
  it('returns error result when not allowed', async () => {
463
- const viewerContext = instance(mock(TestViewerContext));
464
- const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
575
+ const viewerContext = instance(mock(ViewerContext));
576
+ const privacyPolicyEvaluationContext =
577
+ instance(
578
+ mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
579
+ );
465
580
  const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
466
- const queryContext = StubQueryContextProvider.getNonTransactionalQueryContext();
581
+ const queryContext = StubQueryContextProvider.getQueryContext();
467
582
  const privacyPolicyMock = mock(TestEntityPrivacyPolicy);
468
583
  const dataManagerMock = mock<EntityDataManager<TestFields>>();
469
584
 
470
585
  const id1 = uuidv4();
471
586
  when(
472
- dataManagerMock.loadManyByFieldEqualingAsync(anything(), anything(), anything())
587
+ dataManagerMock.loadManyByFieldEqualingAsync(anything(), anything(), anything()),
473
588
  ).thenResolve(new Map().set(id1, [{ customIdField: id1 }]));
474
589
 
475
590
  const rejectionError = new Error();
@@ -480,8 +595,8 @@ describe(EntityLoader, () => {
480
595
  queryContext,
481
596
  privacyPolicyEvaluationContext,
482
597
  anyOfClass(TestEntity),
483
- anything()
484
- )
598
+ anything(),
599
+ ),
485
600
  ).thenReject(rejectionError);
486
601
 
487
602
  const privacyPolicy = instance(privacyPolicyMock);
@@ -496,27 +611,30 @@ describe(EntityLoader, () => {
496
611
  /* entitySelectedFields */ undefined,
497
612
  privacyPolicy,
498
613
  dataManagerInstance,
499
- metricsAdapter
614
+ metricsAdapter,
500
615
  );
501
616
 
502
- const entityResult = await entityLoader.loadByIDAsync(id1);
617
+ const entityResult = await entityLoader.withAuthorizationResults().loadByIDAsync(id1);
503
618
  expect(entityResult.ok).toBe(false);
504
619
  expect(entityResult.reason).toEqual(rejectionError);
505
620
  expect(entityResult.value).toBe(undefined);
506
621
  });
507
622
 
508
623
  it('throws upon database adapter error', async () => {
509
- const viewerContext = instance(mock(TestViewerContext));
510
- const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
624
+ const viewerContext = instance(mock(ViewerContext));
625
+ const privacyPolicyEvaluationContext =
626
+ instance(
627
+ mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
628
+ );
511
629
  const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
512
- const queryContext = StubQueryContextProvider.getNonTransactionalQueryContext();
630
+ const queryContext = StubQueryContextProvider.getQueryContext();
513
631
  const privacyPolicy = instance(mock(TestEntityPrivacyPolicy));
514
632
  const dataManagerMock = mock<EntityDataManager<TestFields>>();
515
633
 
516
634
  const error = new Error();
517
635
 
518
636
  when(
519
- dataManagerMock.loadManyByFieldEqualingAsync(anything(), anything(), anything())
637
+ dataManagerMock.loadManyByFieldEqualingAsync(anything(), anything(), anything()),
520
638
  ).thenReject(error);
521
639
 
522
640
  const dataManagerInstance = instance(dataManagerMock);
@@ -530,30 +648,40 @@ describe(EntityLoader, () => {
530
648
  /* entitySelectedFields */ undefined,
531
649
  privacyPolicy,
532
650
  dataManagerInstance,
533
- metricsAdapter
651
+ metricsAdapter,
534
652
  );
535
653
 
536
654
  const loadByValue = uuidv4();
537
655
 
538
- await expect(entityLoader.loadByIDAsync(loadByValue)).rejects.toEqual(error);
656
+ await expect(
657
+ entityLoader.withAuthorizationResults().loadByIDAsync(loadByValue),
658
+ ).rejects.toEqual(error);
539
659
  await expect(entityLoader.enforcing().loadByIDAsync(loadByValue)).rejects.toEqual(error);
540
- await expect(entityLoader.loadManyByIDsAsync([loadByValue])).rejects.toEqual(error);
660
+ await expect(
661
+ entityLoader.withAuthorizationResults().loadManyByIDsAsync([loadByValue]),
662
+ ).rejects.toEqual(error);
541
663
  await expect(entityLoader.enforcing().loadManyByIDsAsync([loadByValue])).rejects.toEqual(error);
542
- await expect(entityLoader.loadManyByIDsNullableAsync([loadByValue])).rejects.toEqual(error);
543
664
  await expect(
544
- entityLoader.enforcing().loadManyByIDsNullableAsync([loadByValue])
665
+ entityLoader.withAuthorizationResults().loadManyByIDsNullableAsync([loadByValue]),
666
+ ).rejects.toEqual(error);
667
+ await expect(
668
+ entityLoader.enforcing().loadManyByIDsNullableAsync([loadByValue]),
545
669
  ).rejects.toEqual(error);
546
670
  await expect(
547
- entityLoader.loadManyByFieldEqualingAsync('customIdField', loadByValue)
671
+ entityLoader
672
+ .withAuthorizationResults()
673
+ .loadManyByFieldEqualingAsync('customIdField', loadByValue),
548
674
  ).rejects.toEqual(error);
549
675
  await expect(
550
- entityLoader.enforcing().loadManyByFieldEqualingAsync('customIdField', loadByValue)
676
+ entityLoader.enforcing().loadManyByFieldEqualingAsync('customIdField', loadByValue),
551
677
  ).rejects.toEqual(error);
552
678
  await expect(
553
- entityLoader.loadManyByFieldEqualingManyAsync('customIdField', [loadByValue])
679
+ entityLoader
680
+ .withAuthorizationResults()
681
+ .loadManyByFieldEqualingManyAsync('customIdField', [loadByValue]),
554
682
  ).rejects.toEqual(error);
555
683
  await expect(
556
- entityLoader.enforcing().loadManyByFieldEqualingManyAsync('customIdField', [loadByValue])
684
+ entityLoader.enforcing().loadManyByFieldEqualingManyAsync('customIdField', [loadByValue]),
557
685
  ).rejects.toEqual(error);
558
686
  });
559
687
  });