@itwin/core-backend 5.9.0-dev.3 → 5.9.0-dev.5

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 (426) hide show
  1. package/lib/cjs/BriefcaseManager.js +3 -3
  2. package/lib/cjs/BriefcaseManager.js.map +1 -1
  3. package/lib/cjs/Category.d.ts +37 -7
  4. package/lib/cjs/Category.d.ts.map +1 -1
  5. package/lib/cjs/Category.js +33 -42
  6. package/lib/cjs/Category.js.map +1 -1
  7. package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -1
  8. package/lib/cjs/ChangesetECAdaptor.js +5 -2
  9. package/lib/cjs/ChangesetECAdaptor.js.map +1 -1
  10. package/lib/cjs/ChannelControl.d.ts +29 -0
  11. package/lib/cjs/ChannelControl.d.ts.map +1 -1
  12. package/lib/cjs/ChannelControl.js.map +1 -1
  13. package/lib/cjs/CheckpointManager.js +1 -1
  14. package/lib/cjs/CheckpointManager.js.map +1 -1
  15. package/lib/cjs/CodeSpecs.d.ts +32 -3
  16. package/lib/cjs/CodeSpecs.d.ts.map +1 -1
  17. package/lib/cjs/CodeSpecs.js +48 -20
  18. package/lib/cjs/CodeSpecs.js.map +1 -1
  19. package/lib/cjs/DisplayStyle.d.ts +18 -3
  20. package/lib/cjs/DisplayStyle.d.ts.map +1 -1
  21. package/lib/cjs/DisplayStyle.js +10 -21
  22. package/lib/cjs/DisplayStyle.js.map +1 -1
  23. package/lib/cjs/EditTxn.d.ts +262 -0
  24. package/lib/cjs/EditTxn.d.ts.map +1 -0
  25. package/lib/cjs/EditTxn.js +548 -0
  26. package/lib/cjs/EditTxn.js.map +1 -0
  27. package/lib/cjs/Element.d.ts +74 -5
  28. package/lib/cjs/Element.d.ts.map +1 -1
  29. package/lib/cjs/Element.js +63 -75
  30. package/lib/cjs/Element.js.map +1 -1
  31. package/lib/cjs/ElementAspect.d.ts +10 -0
  32. package/lib/cjs/ElementAspect.d.ts.map +1 -1
  33. package/lib/cjs/ElementAspect.js +21 -12
  34. package/lib/cjs/ElementAspect.js.map +1 -1
  35. package/lib/cjs/ElementTreeWalker.d.ts +56 -3
  36. package/lib/cjs/ElementTreeWalker.d.ts.map +1 -1
  37. package/lib/cjs/ElementTreeWalker.js +53 -40
  38. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  39. package/lib/cjs/ExternalSource.d.ts +11 -2
  40. package/lib/cjs/ExternalSource.d.ts.map +1 -1
  41. package/lib/cjs/ExternalSource.js +10 -8
  42. package/lib/cjs/ExternalSource.js.map +1 -1
  43. package/lib/cjs/IModelDb.d.ts +66 -22
  44. package/lib/cjs/IModelDb.d.ts.map +1 -1
  45. package/lib/cjs/IModelDb.js +174 -288
  46. package/lib/cjs/IModelDb.js.map +1 -1
  47. package/lib/cjs/IModelHost.d.ts +22 -0
  48. package/lib/cjs/IModelHost.d.ts.map +1 -1
  49. package/lib/cjs/IModelHost.js +9 -0
  50. package/lib/cjs/IModelHost.js.map +1 -1
  51. package/lib/cjs/IpcHost.js +2 -2
  52. package/lib/cjs/IpcHost.js.map +1 -1
  53. package/lib/cjs/LineStyle.d.ts +47 -7
  54. package/lib/cjs/LineStyle.d.ts.map +1 -1
  55. package/lib/cjs/LineStyle.js +38 -33
  56. package/lib/cjs/LineStyle.js.map +1 -1
  57. package/lib/cjs/Material.d.ts +8 -1
  58. package/lib/cjs/Material.d.ts.map +1 -1
  59. package/lib/cjs/Material.js +6 -12
  60. package/lib/cjs/Material.js.map +1 -1
  61. package/lib/cjs/Model.d.ts +59 -20
  62. package/lib/cjs/Model.d.ts.map +1 -1
  63. package/lib/cjs/Model.js +38 -80
  64. package/lib/cjs/Model.js.map +1 -1
  65. package/lib/cjs/Relationship.d.ts +72 -7
  66. package/lib/cjs/Relationship.d.ts.map +1 -1
  67. package/lib/cjs/Relationship.js +39 -21
  68. package/lib/cjs/Relationship.js.map +1 -1
  69. package/lib/cjs/SchemaSync.js +4 -4
  70. package/lib/cjs/SchemaSync.js.map +1 -1
  71. package/lib/cjs/SheetIndex.d.ts +9 -0
  72. package/lib/cjs/SheetIndex.d.ts.map +1 -1
  73. package/lib/cjs/SheetIndex.js +38 -35
  74. package/lib/cjs/SheetIndex.js.map +1 -1
  75. package/lib/cjs/StashManager.js +1 -1
  76. package/lib/cjs/StashManager.js.map +1 -1
  77. package/lib/cjs/Texture.d.ts +6 -0
  78. package/lib/cjs/Texture.d.ts.map +1 -1
  79. package/lib/cjs/Texture.js +6 -14
  80. package/lib/cjs/Texture.js.map +1 -1
  81. package/lib/cjs/TxnManager.d.ts +5 -5
  82. package/lib/cjs/TxnManager.d.ts.map +1 -1
  83. package/lib/cjs/TxnManager.js +23 -7
  84. package/lib/cjs/TxnManager.js.map +1 -1
  85. package/lib/cjs/ViewDefinition.d.ts +21 -1
  86. package/lib/cjs/ViewDefinition.d.ts.map +1 -1
  87. package/lib/cjs/ViewDefinition.js +27 -66
  88. package/lib/cjs/ViewDefinition.js.map +1 -1
  89. package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts +14 -6
  90. package/lib/cjs/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
  91. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js +33 -27
  92. package/lib/cjs/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  93. package/lib/cjs/annotations/TextAnnotationElement.d.ts.map +1 -1
  94. package/lib/cjs/annotations/TextAnnotationElement.js +6 -5
  95. package/lib/cjs/annotations/TextAnnotationElement.js.map +1 -1
  96. package/lib/cjs/core-backend.d.ts +1 -0
  97. package/lib/cjs/core-backend.d.ts.map +1 -1
  98. package/lib/cjs/core-backend.js +1 -0
  99. package/lib/cjs/core-backend.js.map +1 -1
  100. package/lib/cjs/domains/FunctionalElements.d.ts +6 -2
  101. package/lib/cjs/domains/FunctionalElements.d.ts.map +1 -1
  102. package/lib/cjs/domains/FunctionalElements.js +8 -13
  103. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  104. package/lib/cjs/domains/GenericElements.d.ts +11 -4
  105. package/lib/cjs/domains/GenericElements.d.ts.map +1 -1
  106. package/lib/cjs/domains/GenericElements.js +13 -24
  107. package/lib/cjs/domains/GenericElements.js.map +1 -1
  108. package/lib/cjs/internal/ChannelAdmin.d.ts +15 -0
  109. package/lib/cjs/internal/ChannelAdmin.d.ts.map +1 -1
  110. package/lib/cjs/internal/ChannelAdmin.js +5 -3
  111. package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
  112. package/lib/cjs/internal/Symbols.d.ts +4 -0
  113. package/lib/cjs/internal/Symbols.d.ts.map +1 -1
  114. package/lib/cjs/internal/Symbols.js +5 -1
  115. package/lib/cjs/internal/Symbols.js.map +1 -1
  116. package/lib/cjs/internal/annotations/fields.d.ts +3 -2
  117. package/lib/cjs/internal/annotations/fields.d.ts.map +1 -1
  118. package/lib/cjs/internal/annotations/fields.js +7 -6
  119. package/lib/cjs/internal/annotations/fields.js.map +1 -1
  120. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts.map +1 -1
  121. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  122. package/lib/esm/BriefcaseManager.js +3 -3
  123. package/lib/esm/BriefcaseManager.js.map +1 -1
  124. package/lib/esm/Category.d.ts +37 -7
  125. package/lib/esm/Category.d.ts.map +1 -1
  126. package/lib/esm/Category.js +33 -42
  127. package/lib/esm/Category.js.map +1 -1
  128. package/lib/esm/ChangesetECAdaptor.d.ts.map +1 -1
  129. package/lib/esm/ChangesetECAdaptor.js +5 -2
  130. package/lib/esm/ChangesetECAdaptor.js.map +1 -1
  131. package/lib/esm/ChannelControl.d.ts +29 -0
  132. package/lib/esm/ChannelControl.d.ts.map +1 -1
  133. package/lib/esm/ChannelControl.js.map +1 -1
  134. package/lib/esm/CheckpointManager.js +1 -1
  135. package/lib/esm/CheckpointManager.js.map +1 -1
  136. package/lib/esm/CodeSpecs.d.ts +32 -3
  137. package/lib/esm/CodeSpecs.d.ts.map +1 -1
  138. package/lib/esm/CodeSpecs.js +49 -21
  139. package/lib/esm/CodeSpecs.js.map +1 -1
  140. package/lib/esm/DisplayStyle.d.ts +18 -3
  141. package/lib/esm/DisplayStyle.d.ts.map +1 -1
  142. package/lib/esm/DisplayStyle.js +10 -21
  143. package/lib/esm/DisplayStyle.js.map +1 -1
  144. package/lib/esm/EditTxn.d.ts +262 -0
  145. package/lib/esm/EditTxn.d.ts.map +1 -0
  146. package/lib/esm/EditTxn.js +543 -0
  147. package/lib/esm/EditTxn.js.map +1 -0
  148. package/lib/esm/Element.d.ts +74 -5
  149. package/lib/esm/Element.d.ts.map +1 -1
  150. package/lib/esm/Element.js +64 -76
  151. package/lib/esm/Element.js.map +1 -1
  152. package/lib/esm/ElementAspect.d.ts +10 -0
  153. package/lib/esm/ElementAspect.d.ts.map +1 -1
  154. package/lib/esm/ElementAspect.js +22 -13
  155. package/lib/esm/ElementAspect.js.map +1 -1
  156. package/lib/esm/ElementTreeWalker.d.ts +56 -3
  157. package/lib/esm/ElementTreeWalker.d.ts.map +1 -1
  158. package/lib/esm/ElementTreeWalker.js +53 -40
  159. package/lib/esm/ElementTreeWalker.js.map +1 -1
  160. package/lib/esm/ExternalSource.d.ts +11 -2
  161. package/lib/esm/ExternalSource.d.ts.map +1 -1
  162. package/lib/esm/ExternalSource.js +10 -8
  163. package/lib/esm/ExternalSource.js.map +1 -1
  164. package/lib/esm/IModelDb.d.ts +66 -22
  165. package/lib/esm/IModelDb.d.ts.map +1 -1
  166. package/lib/esm/IModelDb.js +176 -290
  167. package/lib/esm/IModelDb.js.map +1 -1
  168. package/lib/esm/IModelHost.d.ts +22 -0
  169. package/lib/esm/IModelHost.d.ts.map +1 -1
  170. package/lib/esm/IModelHost.js +9 -0
  171. package/lib/esm/IModelHost.js.map +1 -1
  172. package/lib/esm/IpcHost.js +3 -3
  173. package/lib/esm/IpcHost.js.map +1 -1
  174. package/lib/esm/LineStyle.d.ts +47 -7
  175. package/lib/esm/LineStyle.d.ts.map +1 -1
  176. package/lib/esm/LineStyle.js +38 -33
  177. package/lib/esm/LineStyle.js.map +1 -1
  178. package/lib/esm/Material.d.ts +8 -1
  179. package/lib/esm/Material.d.ts.map +1 -1
  180. package/lib/esm/Material.js +6 -12
  181. package/lib/esm/Material.js.map +1 -1
  182. package/lib/esm/Model.d.ts +59 -20
  183. package/lib/esm/Model.d.ts.map +1 -1
  184. package/lib/esm/Model.js +39 -81
  185. package/lib/esm/Model.js.map +1 -1
  186. package/lib/esm/Relationship.d.ts +72 -7
  187. package/lib/esm/Relationship.d.ts.map +1 -1
  188. package/lib/esm/Relationship.js +40 -22
  189. package/lib/esm/Relationship.js.map +1 -1
  190. package/lib/esm/SchemaSync.js +5 -5
  191. package/lib/esm/SchemaSync.js.map +1 -1
  192. package/lib/esm/SheetIndex.d.ts +9 -0
  193. package/lib/esm/SheetIndex.d.ts.map +1 -1
  194. package/lib/esm/SheetIndex.js +38 -35
  195. package/lib/esm/SheetIndex.js.map +1 -1
  196. package/lib/esm/StashManager.js +1 -1
  197. package/lib/esm/StashManager.js.map +1 -1
  198. package/lib/esm/Texture.d.ts +6 -0
  199. package/lib/esm/Texture.d.ts.map +1 -1
  200. package/lib/esm/Texture.js +6 -14
  201. package/lib/esm/Texture.js.map +1 -1
  202. package/lib/esm/TxnManager.d.ts +5 -5
  203. package/lib/esm/TxnManager.d.ts.map +1 -1
  204. package/lib/esm/TxnManager.js +23 -7
  205. package/lib/esm/TxnManager.js.map +1 -1
  206. package/lib/esm/ViewDefinition.d.ts +21 -1
  207. package/lib/esm/ViewDefinition.d.ts.map +1 -1
  208. package/lib/esm/ViewDefinition.js +27 -66
  209. package/lib/esm/ViewDefinition.js.map +1 -1
  210. package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts +14 -6
  211. package/lib/esm/annotations/ElementDrivesTextAnnotation.d.ts.map +1 -1
  212. package/lib/esm/annotations/ElementDrivesTextAnnotation.js +33 -27
  213. package/lib/esm/annotations/ElementDrivesTextAnnotation.js.map +1 -1
  214. package/lib/esm/annotations/TextAnnotationElement.d.ts.map +1 -1
  215. package/lib/esm/annotations/TextAnnotationElement.js +6 -5
  216. package/lib/esm/annotations/TextAnnotationElement.js.map +1 -1
  217. package/lib/esm/core-backend.d.ts +1 -0
  218. package/lib/esm/core-backend.d.ts.map +1 -1
  219. package/lib/esm/core-backend.js +1 -0
  220. package/lib/esm/core-backend.js.map +1 -1
  221. package/lib/esm/domains/FunctionalElements.d.ts +6 -2
  222. package/lib/esm/domains/FunctionalElements.d.ts.map +1 -1
  223. package/lib/esm/domains/FunctionalElements.js +8 -13
  224. package/lib/esm/domains/FunctionalElements.js.map +1 -1
  225. package/lib/esm/domains/GenericElements.d.ts +11 -4
  226. package/lib/esm/domains/GenericElements.d.ts.map +1 -1
  227. package/lib/esm/domains/GenericElements.js +13 -24
  228. package/lib/esm/domains/GenericElements.js.map +1 -1
  229. package/lib/esm/internal/ChannelAdmin.d.ts +15 -0
  230. package/lib/esm/internal/ChannelAdmin.d.ts.map +1 -1
  231. package/lib/esm/internal/ChannelAdmin.js +6 -4
  232. package/lib/esm/internal/ChannelAdmin.js.map +1 -1
  233. package/lib/esm/internal/Symbols.d.ts +4 -0
  234. package/lib/esm/internal/Symbols.d.ts.map +1 -1
  235. package/lib/esm/internal/Symbols.js +4 -0
  236. package/lib/esm/internal/Symbols.js.map +1 -1
  237. package/lib/esm/internal/annotations/fields.d.ts +3 -2
  238. package/lib/esm/internal/annotations/fields.d.ts.map +1 -1
  239. package/lib/esm/internal/annotations/fields.js +7 -6
  240. package/lib/esm/internal/annotations/fields.js.map +1 -1
  241. package/lib/esm/rpc-impl/RpcBriefcaseUtility.d.ts.map +1 -1
  242. package/lib/esm/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  243. package/lib/esm/test/AnnotationTestUtils.js.map +1 -1
  244. package/lib/esm/test/ElementDrivesElement.test.d.ts +20 -19
  245. package/lib/esm/test/ElementDrivesElement.test.d.ts.map +1 -1
  246. package/lib/esm/test/ElementDrivesElement.test.js +111 -96
  247. package/lib/esm/test/ElementDrivesElement.test.js.map +1 -1
  248. package/lib/esm/test/ElementLRUCache.test.js.map +1 -1
  249. package/lib/esm/test/IModelHost.test.js +56 -2
  250. package/lib/esm/test/IModelHost.test.js.map +1 -1
  251. package/lib/esm/test/IModelTestUtils.d.ts +23 -23
  252. package/lib/esm/test/IModelTestUtils.d.ts.map +1 -1
  253. package/lib/esm/test/IModelTestUtils.js +466 -449
  254. package/lib/esm/test/IModelTestUtils.js.map +1 -1
  255. package/lib/esm/test/PropertyDb.test.js +2 -2
  256. package/lib/esm/test/PropertyDb.test.js.map +1 -1
  257. package/lib/esm/test/SquashSchemaAndDataChanges.test.js +27 -18
  258. package/lib/esm/test/SquashSchemaAndDataChanges.test.js.map +1 -1
  259. package/lib/esm/test/TestChangeSetUtility.d.ts.map +1 -1
  260. package/lib/esm/test/TestChangeSetUtility.js +11 -7
  261. package/lib/esm/test/TestChangeSetUtility.js.map +1 -1
  262. package/lib/esm/test/TestEditTxn.d.ts +8 -0
  263. package/lib/esm/test/TestEditTxn.d.ts.map +1 -0
  264. package/lib/esm/test/TestEditTxn.js +34 -0
  265. package/lib/esm/test/TestEditTxn.js.map +1 -0
  266. package/lib/esm/test/TestUtils.d.ts +1 -0
  267. package/lib/esm/test/TestUtils.d.ts.map +1 -1
  268. package/lib/esm/test/TestUtils.js +8 -1
  269. package/lib/esm/test/TestUtils.js.map +1 -1
  270. package/lib/esm/test/annotations/Fields.test.js +82 -90
  271. package/lib/esm/test/annotations/Fields.test.js.map +1 -1
  272. package/lib/esm/test/annotations/FrameGeometry.test.js.map +1 -1
  273. package/lib/esm/test/annotations/TextAnnotation.test.js +156 -99
  274. package/lib/esm/test/annotations/TextAnnotation.test.js.map +1 -1
  275. package/lib/esm/test/annotations/TextBlock.test.js +5 -3
  276. package/lib/esm/test/annotations/TextBlock.test.js.map +1 -1
  277. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/old.config.js.map +1 -1
  278. package/lib/esm/test/assets/IncrementalSchemaLocater/configs/simple.config.js.map +1 -1
  279. package/lib/esm/test/categories/Category.test.js +63 -3
  280. package/lib/esm/test/categories/Category.test.js.map +1 -1
  281. package/lib/esm/test/codespec/CodeSpec.test.js +88 -5
  282. package/lib/esm/test/codespec/CodeSpec.test.js.map +1 -1
  283. package/lib/esm/test/ecdb/ECDb.test.js.map +1 -1
  284. package/lib/esm/test/ecdb/ECSqlAst.test.js +3 -2
  285. package/lib/esm/test/ecdb/ECSqlAst.test.js.map +1 -1
  286. package/lib/esm/test/ecdb/ECSqlQuery.test.js +2 -2
  287. package/lib/esm/test/ecdb/ECSqlQuery.test.js.map +1 -1
  288. package/lib/esm/test/ecdb/ECSqlStatement.test.js +0 -1
  289. package/lib/esm/test/ecdb/ECSqlStatement.test.js.map +1 -1
  290. package/lib/esm/test/ecdb/QueryReaders.test.js +17 -14
  291. package/lib/esm/test/ecdb/QueryReaders.test.js.map +1 -1
  292. package/lib/esm/test/ecdb/SqliteStatement.test.js +2 -2
  293. package/lib/esm/test/ecdb/SqliteStatement.test.js.map +1 -1
  294. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.d.ts.map +1 -1
  295. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js +30 -28
  296. package/lib/esm/test/ecsql/dataset/ECSqlDatasets.js.map +1 -1
  297. package/lib/esm/test/ecsql/src/ECSqlTestGenerator.js.map +1 -1
  298. package/lib/esm/test/ecsql/src/ECSqlTestParser.js.map +1 -1
  299. package/lib/esm/test/ecsql/src/ECSqlTestRunner.test.js.map +1 -1
  300. package/lib/esm/test/element/DeleteDefinitionElements.test.js +159 -143
  301. package/lib/esm/test/element/DeleteDefinitionElements.test.js.map +1 -1
  302. package/lib/esm/test/element/ElementAspect.test.js +68 -60
  303. package/lib/esm/test/element/ElementAspect.test.js.map +1 -1
  304. package/lib/esm/test/element/ElementDependencyGraph.test.d.ts.map +1 -1
  305. package/lib/esm/test/element/ElementDependencyGraph.test.js +51 -43
  306. package/lib/esm/test/element/ElementDependencyGraph.test.js.map +1 -1
  307. package/lib/esm/test/element/ElementRoundTrip.test.js +37 -38
  308. package/lib/esm/test/element/ElementRoundTrip.test.js.map +1 -1
  309. package/lib/esm/test/element/ExcludedElements.test.js +2 -2
  310. package/lib/esm/test/element/ExcludedElements.test.js.map +1 -1
  311. package/lib/esm/test/element/ExternalSource.test.js +40 -38
  312. package/lib/esm/test/element/ExternalSource.test.js.map +1 -1
  313. package/lib/esm/test/element/NullStructArray.test.js +10 -9
  314. package/lib/esm/test/element/NullStructArray.test.js.map +1 -1
  315. package/lib/esm/test/element/ProjectInformationRecord.test.js +5 -2
  316. package/lib/esm/test/element/ProjectInformationRecord.test.js.map +1 -1
  317. package/lib/esm/test/element/SheetInformationAspect.test.js +43 -11
  318. package/lib/esm/test/element/SheetInformationAspect.test.js.map +1 -1
  319. package/lib/esm/test/element/UrlLink.test.js +2 -2
  320. package/lib/esm/test/element/UrlLink.test.js.map +1 -1
  321. package/lib/esm/test/font/IModelDbFonts.test.js +87 -73
  322. package/lib/esm/test/font/IModelDbFonts.test.js.map +1 -1
  323. package/lib/esm/test/hubaccess/ApplyChangeset.test.js +164 -125
  324. package/lib/esm/test/hubaccess/ApplyChangeset.test.js.map +1 -1
  325. package/lib/esm/test/hubaccess/BriefcaseManager.test.js +2 -4
  326. package/lib/esm/test/hubaccess/BriefcaseManager.test.js.map +1 -1
  327. package/lib/esm/test/hubaccess/Rebase.test.js +313 -247
  328. package/lib/esm/test/hubaccess/Rebase.test.js.map +1 -1
  329. package/lib/esm/test/hubaccess/SemanticRebase.test.js +322 -247
  330. package/lib/esm/test/hubaccess/SemanticRebase.test.js.map +1 -1
  331. package/lib/esm/test/imodel/Code.test.js +31 -31
  332. package/lib/esm/test/imodel/Code.test.js.map +1 -1
  333. package/lib/esm/test/imodel/ElementTreeWalker.test.js +57 -48
  334. package/lib/esm/test/imodel/ElementTreeWalker.test.js.map +1 -1
  335. package/lib/esm/test/imodel/IModel.test.js +419 -344
  336. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  337. package/lib/esm/test/imodel/ProjectExtents.test.js +2 -2
  338. package/lib/esm/test/imodel/ProjectExtents.test.js.map +1 -1
  339. package/lib/esm/test/incrementalSchemaLocater/ECSqlQueries.test.js.map +1 -1
  340. package/lib/esm/test/incrementalSchemaLocater/TestContext.d.ts.map +1 -1
  341. package/lib/esm/test/incrementalSchemaLocater/TestContext.js +2 -2
  342. package/lib/esm/test/incrementalSchemaLocater/TestContext.js.map +1 -1
  343. package/lib/esm/test/index.d.ts +1 -0
  344. package/lib/esm/test/index.d.ts.map +1 -1
  345. package/lib/esm/test/index.js +1 -0
  346. package/lib/esm/test/index.js.map +1 -1
  347. package/lib/esm/test/schema/ClassRegistry.test.js +23 -22
  348. package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
  349. package/lib/esm/test/schema/FunctionalDomain.test.js +36 -34
  350. package/lib/esm/test/schema/FunctionalDomain.test.js.map +1 -1
  351. package/lib/esm/test/schema/GenericDomain.test.js +114 -94
  352. package/lib/esm/test/schema/GenericDomain.test.js.map +1 -1
  353. package/lib/esm/test/schema/IModelSchemaContext.test.js +2 -1
  354. package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
  355. package/lib/esm/test/schema/SchemaImportCallbacks.test.js +207 -192
  356. package/lib/esm/test/schema/SchemaImportCallbacks.test.js.map +1 -1
  357. package/lib/esm/test/sheetindex/SheetIndex.test.d.ts +1 -3
  358. package/lib/esm/test/sheetindex/SheetIndex.test.d.ts.map +1 -1
  359. package/lib/esm/test/sheetindex/SheetIndex.test.js +312 -247
  360. package/lib/esm/test/sheetindex/SheetIndex.test.js.map +1 -1
  361. package/lib/esm/test/standalone/ChangeMerge.test.js +101 -82
  362. package/lib/esm/test/standalone/ChangeMerge.test.js.map +1 -1
  363. package/lib/esm/test/standalone/ChangesetReader.test.js +114 -85
  364. package/lib/esm/test/standalone/ChangesetReader.test.js.map +1 -1
  365. package/lib/esm/test/standalone/DisplayStyle.test.js +43 -40
  366. package/lib/esm/test/standalone/DisplayStyle.test.js.map +1 -1
  367. package/lib/esm/test/standalone/Drawing.test.js +4 -3
  368. package/lib/esm/test/standalone/Drawing.test.js.map +1 -1
  369. package/lib/esm/test/standalone/EditTxn.test.d.ts +2 -0
  370. package/lib/esm/test/standalone/EditTxn.test.d.ts.map +1 -0
  371. package/lib/esm/test/standalone/EditTxn.test.js +219 -0
  372. package/lib/esm/test/standalone/EditTxn.test.js.map +1 -0
  373. package/lib/esm/test/standalone/ElementMesh.test.js +16 -13
  374. package/lib/esm/test/standalone/ElementMesh.test.js.map +1 -1
  375. package/lib/esm/test/standalone/ExportGraphics.test.js +26 -20
  376. package/lib/esm/test/standalone/ExportGraphics.test.js.map +1 -1
  377. package/lib/esm/test/standalone/GeometryChangeEvents.test.js +11 -15
  378. package/lib/esm/test/standalone/GeometryChangeEvents.test.js.map +1 -1
  379. package/lib/esm/test/standalone/GeometryStream.test.js +212 -165
  380. package/lib/esm/test/standalone/GeometryStream.test.js.map +1 -1
  381. package/lib/esm/test/standalone/HubMock.test.js +31 -25
  382. package/lib/esm/test/standalone/HubMock.test.js.map +1 -1
  383. package/lib/esm/test/standalone/IModelLimits.test.js +11 -8
  384. package/lib/esm/test/standalone/IModelLimits.test.js.map +1 -1
  385. package/lib/esm/test/standalone/IModelWrite.test.d.ts +2 -2
  386. package/lib/esm/test/standalone/IModelWrite.test.d.ts.map +1 -1
  387. package/lib/esm/test/standalone/IModelWrite.test.js +184 -142
  388. package/lib/esm/test/standalone/IModelWrite.test.js.map +1 -1
  389. package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js +25 -22
  390. package/lib/esm/test/standalone/InlineGeometryPartReferences.test.js.map +1 -1
  391. package/lib/esm/test/standalone/IntegrityCheck.test.js +20 -18
  392. package/lib/esm/test/standalone/IntegrityCheck.test.js.map +1 -1
  393. package/lib/esm/test/standalone/MergeConflict.test.d.ts +2 -2
  394. package/lib/esm/test/standalone/MergeConflict.test.d.ts.map +1 -1
  395. package/lib/esm/test/standalone/MergeConflict.test.js +49 -33
  396. package/lib/esm/test/standalone/MergeConflict.test.js.map +1 -1
  397. package/lib/esm/test/standalone/RenderMaterialElement.test.js +5 -5
  398. package/lib/esm/test/standalone/RenderMaterialElement.test.js.map +1 -1
  399. package/lib/esm/test/standalone/RenderTimeline.test.js +3 -2
  400. package/lib/esm/test/standalone/RenderTimeline.test.js.map +1 -1
  401. package/lib/esm/test/standalone/SectionDrawing.test.js +7 -7
  402. package/lib/esm/test/standalone/SectionDrawing.test.js.map +1 -1
  403. package/lib/esm/test/standalone/ServerBasedLocks.test.js +21 -19
  404. package/lib/esm/test/standalone/ServerBasedLocks.test.js.map +1 -1
  405. package/lib/esm/test/standalone/Settings.test.js +7 -4
  406. package/lib/esm/test/standalone/Settings.test.js.map +1 -1
  407. package/lib/esm/test/standalone/SettingsSchemas.test.js +2 -1
  408. package/lib/esm/test/standalone/SettingsSchemas.test.js.map +1 -1
  409. package/lib/esm/test/standalone/SnapshotDb.test.js +3 -1
  410. package/lib/esm/test/standalone/SnapshotDb.test.js.map +1 -1
  411. package/lib/esm/test/standalone/StandaloneDb.test.js +7 -6
  412. package/lib/esm/test/standalone/StandaloneDb.test.js.map +1 -1
  413. package/lib/esm/test/standalone/Texture.test.js +5 -4
  414. package/lib/esm/test/standalone/Texture.test.js.map +1 -1
  415. package/lib/esm/test/standalone/TileCache.test.d.ts.map +1 -1
  416. package/lib/esm/test/standalone/TileCache.test.js +5 -3
  417. package/lib/esm/test/standalone/TileCache.test.js.map +1 -1
  418. package/lib/esm/test/standalone/TileTree.test.js +35 -31
  419. package/lib/esm/test/standalone/TileTree.test.js.map +1 -1
  420. package/lib/esm/test/standalone/TxnManager.test.js +700 -653
  421. package/lib/esm/test/standalone/TxnManager.test.js.map +1 -1
  422. package/lib/esm/test/standalone/ViewDefinition.test.js +295 -229
  423. package/lib/esm/test/standalone/ViewDefinition.test.js.map +1 -1
  424. package/lib/esm/test/standalone/Workspace.test.js +25 -23
  425. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  426. package/package.json +12 -12
@@ -7,6 +7,7 @@ import { Id64, OpenMode } from "@itwin/core-bentley";
7
7
  import { Code, IModel } from "@itwin/core-common";
8
8
  import { GenericSchema, IModelJsFs, RenderTimeline, StandaloneDb } from "../../core-backend";
9
9
  import { IModelTestUtils } from "../IModelTestUtils";
10
+ import { withEditTxn } from "../../EditTxn";
10
11
  describe("RenderTimeline", () => {
11
12
  before(() => {
12
13
  GenericSchema.registerSchema();
@@ -29,7 +30,7 @@ describe("RenderTimeline", () => {
29
30
  code: Code.createEmpty(),
30
31
  script,
31
32
  };
32
- return imodel.elements.insertElement(props);
33
+ return withEditTxn(imodel, (txn) => txn.insertElement(props));
33
34
  }
34
35
  function createIModel(name) {
35
36
  const props = {
@@ -61,7 +62,7 @@ describe("RenderTimeline", () => {
61
62
  const scriptProps = makeScriptProps();
62
63
  scriptProps.push(makeScriptProps()[0]);
63
64
  timeline.scriptProps = scriptProps;
64
- timeline.update();
65
+ withEditTxn(imodel, (txn) => timeline.update(txn));
65
66
  timeline = imodel.elements.getElement(timelineId);
66
67
  expect(timeline.description).to.equal("My timeline");
67
68
  expect(timeline.scriptProps).to.deep.equal(scriptProps);
@@ -1 +1 @@
1
- {"version":3,"file":"RenderTimeline.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/RenderTimeline.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { expect } from \"chai\";\nimport { Id64, Id64String, OpenMode } from \"@itwin/core-bentley\";\nimport { Code, IModel, RenderSchedule, RenderTimelineProps } from \"@itwin/core-common\";\nimport { GenericSchema, IModelJsFs, RenderTimeline, StandaloneDb } from \"../../core-backend\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\n\ndescribe(\"RenderTimeline\", () => {\n before(() => {\n GenericSchema.registerSchema();\n });\n\n function makeScriptProps(): RenderSchedule.ScriptProps {\n return [{\n modelId: \"0x123\",\n elementTimelines: [{\n batchId: 1,\n elementIds: [\"0xabc\", \"0xdef\"],\n visibilityTimeline: [{ time: 42, value: 50 }],\n }],\n }];\n }\n\n function insertTimeline(imodel: StandaloneDb, scriptProps?: RenderSchedule.ScriptProps): Id64String {\n const script = JSON.stringify(scriptProps ?? makeScriptProps());\n const props: RenderTimelineProps = {\n model: IModel.dictionaryId,\n classFullName: RenderTimeline.classFullName,\n code: Code.createEmpty(),\n script,\n };\n return imodel.elements.insertElement(props);\n }\n\n function createIModel(name: string): StandaloneDb {\n const props = {\n rootSubject: {\n name,\n },\n enableTransactions: true,\n };\n const filename = IModelTestUtils.prepareOutputFile(\"RenderTimeline\", `${name}.bim`);\n return StandaloneDb.createEmpty(filename, props);\n }\n\n it(\"requires BisCore >= 1.0.13\", () => {\n const filename = IModelTestUtils.prepareOutputFile(\"RenderTimeline.SchemaTooOld\", \"testImodel.bim\");\n const seedFileName = IModelTestUtils.resolveAssetFile(\"testImodel.bim\");\n IModelJsFs.copySync(seedFileName, filename);\n\n const imodel = StandaloneDb.openFile(filename, OpenMode.ReadWrite);\n expect(() => insertTimeline(imodel)).to.throw(\"ecClass not found\");\n imodel.close();\n });\n\n it(\"creates, queries, and updates\", () => {\n const imodel = createIModel(\"CRUD\");\n const timelineId = insertTimeline(imodel);\n expect(Id64.isValid(timelineId)).to.be.true;\n\n let timeline = imodel.elements.getElement<RenderTimeline>(timelineId);\n expect(timeline).instanceof(RenderTimeline);\n expect(timeline.scriptProps).to.deep.equal(makeScriptProps());\n expect(timeline.description).to.equal(\"\");\n\n timeline.description = \"My timeline\";\n const scriptProps = makeScriptProps();\n scriptProps.push(makeScriptProps()[0]);\n timeline.scriptProps = scriptProps;\n\n timeline.update();\n timeline = imodel.elements.getElement<RenderTimeline>(timelineId);\n expect(timeline.description).to.equal(\"My timeline\");\n expect(timeline.scriptProps).to.deep.equal(scriptProps);\n\n imodel.close();\n });\n});\n"]}
1
+ {"version":3,"file":"RenderTimeline.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/RenderTimeline.test.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAc,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAuC,MAAM,oBAAoB,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC7F,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,MAAM,CAAC,GAAG,EAAE;QACV,aAAa,CAAC,cAAc,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,SAAS,eAAe;QACtB,OAAO,CAAC;gBACN,OAAO,EAAE,OAAO;gBAChB,gBAAgB,EAAE,CAAC;wBACjB,OAAO,EAAE,CAAC;wBACV,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;wBAC9B,kBAAkB,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;qBAC9C,CAAC;aACH,CAAC,CAAC;IACL,CAAC;IAED,SAAS,cAAc,CAAC,MAAoB,EAAE,WAAwC;QACpF,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,IAAI,eAAe,EAAE,CAAC,CAAC;QAChE,MAAM,KAAK,GAAwB;YACjC,KAAK,EAAE,MAAM,CAAC,YAAY;YAC1B,aAAa,EAAE,cAAc,CAAC,aAAa;YAC3C,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE;YACxB,MAAM;SACP,CAAC;QACF,OAAO,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,SAAS,YAAY,CAAC,IAAY;QAChC,MAAM,KAAK,GAAG;YACZ,WAAW,EAAE;gBACX,IAAI;aACL;YACD,kBAAkB,EAAE,IAAI;SACzB,CAAC;QACF,MAAM,QAAQ,GAAG,eAAe,CAAC,iBAAiB,CAAC,gBAAgB,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;QACpF,OAAO,YAAY,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC;IAED,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,QAAQ,GAAG,eAAe,CAAC,iBAAiB,CAAC,6BAA6B,EAAE,gBAAgB,CAAC,CAAC;QACpG,MAAM,YAAY,GAAG,eAAe,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;QACxE,UAAU,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAE5C,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;QACnE,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACnE,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;QAE5C,IAAI,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAiB,UAAU,CAAC,CAAC;QACtE,MAAM,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;QAC5C,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,CAAC;QAC9D,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAE1C,QAAQ,CAAC,WAAW,GAAG,aAAa,CAAC;QACrC,MAAM,WAAW,GAAG,eAAe,EAAE,CAAC;QACtC,WAAW,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAC;QAEnC,WAAW,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACnD,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAiB,UAAU,CAAC,CAAC;QAClE,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACrD,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAExD,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { expect } from \"chai\";\nimport { Id64, Id64String, OpenMode } from \"@itwin/core-bentley\";\nimport { Code, IModel, RenderSchedule, RenderTimelineProps } from \"@itwin/core-common\";\nimport { GenericSchema, IModelJsFs, RenderTimeline, StandaloneDb } from \"../../core-backend\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\nimport { withEditTxn } from \"../../EditTxn\";\n\ndescribe(\"RenderTimeline\", () => {\n before(() => {\n GenericSchema.registerSchema();\n });\n\n function makeScriptProps(): RenderSchedule.ScriptProps {\n return [{\n modelId: \"0x123\",\n elementTimelines: [{\n batchId: 1,\n elementIds: [\"0xabc\", \"0xdef\"],\n visibilityTimeline: [{ time: 42, value: 50 }],\n }],\n }];\n }\n\n function insertTimeline(imodel: StandaloneDb, scriptProps?: RenderSchedule.ScriptProps): Id64String {\n const script = JSON.stringify(scriptProps ?? makeScriptProps());\n const props: RenderTimelineProps = {\n model: IModel.dictionaryId,\n classFullName: RenderTimeline.classFullName,\n code: Code.createEmpty(),\n script,\n };\n return withEditTxn(imodel, (txn) => txn.insertElement(props));\n }\n\n function createIModel(name: string): StandaloneDb {\n const props = {\n rootSubject: {\n name,\n },\n enableTransactions: true,\n };\n const filename = IModelTestUtils.prepareOutputFile(\"RenderTimeline\", `${name}.bim`);\n return StandaloneDb.createEmpty(filename, props);\n }\n\n it(\"requires BisCore >= 1.0.13\", () => {\n const filename = IModelTestUtils.prepareOutputFile(\"RenderTimeline.SchemaTooOld\", \"testImodel.bim\");\n const seedFileName = IModelTestUtils.resolveAssetFile(\"testImodel.bim\");\n IModelJsFs.copySync(seedFileName, filename);\n\n const imodel = StandaloneDb.openFile(filename, OpenMode.ReadWrite);\n expect(() => insertTimeline(imodel)).to.throw(\"ecClass not found\");\n imodel.close();\n });\n\n it(\"creates, queries, and updates\", () => {\n const imodel = createIModel(\"CRUD\");\n const timelineId = insertTimeline(imodel);\n expect(Id64.isValid(timelineId)).to.be.true;\n\n let timeline = imodel.elements.getElement<RenderTimeline>(timelineId);\n expect(timeline).instanceof(RenderTimeline);\n expect(timeline.scriptProps).to.deep.equal(makeScriptProps());\n expect(timeline.description).to.equal(\"\");\n\n timeline.description = \"My timeline\";\n const scriptProps = makeScriptProps();\n scriptProps.push(makeScriptProps()[0]);\n timeline.scriptProps = scriptProps;\n\n withEditTxn(imodel, (txn) => timeline.update(txn));\n timeline = imodel.elements.getElement<RenderTimeline>(timelineId);\n expect(timeline.description).to.equal(\"My timeline\");\n expect(timeline.scriptProps).to.deep.equal(scriptProps);\n\n imodel.close();\n });\n});\n\n\n"]}
@@ -10,30 +10,31 @@ import { Drawing, SectionDrawing } from "../../Element";
10
10
  import { DocumentListModel, DrawingModel, SectionDrawingModel } from "../../Model";
11
11
  import { SnapshotDb } from "../../IModelDb";
12
12
  import { IModelTestUtils } from "../IModelTestUtils";
13
+ import { withEditTxn } from "../../EditTxn";
13
14
  describe("SectionDrawing", () => {
14
15
  let imodel;
15
16
  let documentListModelId;
16
17
  before(() => {
17
18
  const iModelPath = IModelTestUtils.prepareOutputFile("SectionDrawing", "SectionDrawing.bim");
18
19
  imodel = SnapshotDb.createEmpty(iModelPath, { rootSubject: { name: "SectionDrawingTest" } });
19
- documentListModelId = DocumentListModel.insert(imodel, SnapshotDb.rootSubjectId, "DocumentList");
20
+ documentListModelId = withEditTxn(imodel, (txn) => DocumentListModel.insert(txn, SnapshotDb.rootSubjectId, "DocumentList"));
20
21
  });
21
22
  after(() => {
22
23
  imodel.close();
23
24
  });
24
25
  it("should round-trip through JSON", () => {
25
26
  // Insert a SectionDrawing
26
- const drawingId = imodel.elements.insertElement({
27
+ const drawingId = withEditTxn(imodel, (txn) => txn.insertElement({
27
28
  classFullName: SectionDrawing.classFullName,
28
29
  model: documentListModelId,
29
30
  code: Drawing.createCode(imodel, documentListModelId, "SectionDrawingRoundTrip"),
30
- });
31
+ }));
31
32
  expect(Id64.isValidId64(drawingId)).to.be.true;
32
33
  const model = imodel.models.createModel({
33
34
  classFullName: DrawingModel.classFullName,
34
35
  modeledElement: { id: drawingId },
35
36
  });
36
- const modelId = imodel.models.insertModel(model.toJSON());
37
+ const modelId = withEditTxn(imodel, (txn) => txn.insertModel(model.toJSON()));
37
38
  expect(Id64.isValidId64(modelId)).to.be.true;
38
39
  let drawing = imodel.elements.getElement(drawingId);
39
40
  expect(drawing instanceof SectionDrawing).to.be.true;
@@ -62,8 +63,7 @@ describe("SectionDrawing", () => {
62
63
  const props = drawing.toJSON();
63
64
  expectProps(props);
64
65
  // Persist changes
65
- imodel.elements.updateElement(props);
66
- imodel.saveChanges();
66
+ withEditTxn(imodel, (txn) => txn.updateElement(props));
67
67
  // Obtain persistent element
68
68
  drawing = imodel.elements.getElement(drawingId);
69
69
  // Expect persistent values
@@ -71,7 +71,7 @@ describe("SectionDrawing", () => {
71
71
  expectProps(drawing.toJSON());
72
72
  });
73
73
  it("should create a SectionDrawing and SectionDrawingModel on insert", () => {
74
- const sectionDrawingId = SectionDrawing.insert(imodel, documentListModelId, "SectionDrawingInsert");
74
+ const sectionDrawingId = withEditTxn(imodel, (txn) => SectionDrawing.insert(txn, documentListModelId, "SectionDrawingInsert"));
75
75
  expect(Id64.isValidId64(sectionDrawingId)).to.be.true;
76
76
  const insertedSectionDrawing = imodel.elements.getElement(sectionDrawingId);
77
77
  expect(insertedSectionDrawing instanceof SectionDrawing).to.be.true;
@@ -1 +1 @@
1
- {"version":3,"file":"SectionDrawing.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/SectionDrawing.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { expect } from \"chai\";\nimport { Id64 } from \"@itwin/core-bentley\";\nimport { Transform } from \"@itwin/core-geometry\";\nimport { RelatedElement, SectionDrawingProps, SectionType } from \"@itwin/core-common\";\nimport { Drawing, SectionDrawing } from \"../../Element\";\nimport { DocumentListModel, DrawingModel, SectionDrawingModel } from \"../../Model\";\nimport { SnapshotDb } from \"../../IModelDb\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\n\ndescribe(\"SectionDrawing\", () => {\n let imodel: SnapshotDb;\n let documentListModelId: string;\n before(() => {\n const iModelPath = IModelTestUtils.prepareOutputFile(\"SectionDrawing\", \"SectionDrawing.bim\");\n imodel = SnapshotDb.createEmpty(iModelPath, { rootSubject: { name: \"SectionDrawingTest\" } });\n documentListModelId = DocumentListModel.insert(imodel, SnapshotDb.rootSubjectId, \"DocumentList\");\n });\n\n after(() => {\n imodel.close();\n });\n\n it(\"should round-trip through JSON\", () => {\n // Insert a SectionDrawing\n const drawingId = imodel.elements.insertElement({\n classFullName: SectionDrawing.classFullName,\n model: documentListModelId,\n code: Drawing.createCode(imodel, documentListModelId, \"SectionDrawingRoundTrip\"),\n });\n expect(Id64.isValidId64(drawingId)).to.be.true;\n\n const model = imodel.models.createModel({\n classFullName: DrawingModel.classFullName,\n modeledElement: { id: drawingId },\n });\n const modelId = imodel.models.insertModel(model.toJSON());\n expect(Id64.isValidId64(modelId)).to.be.true;\n\n let drawing = imodel.elements.getElement<SectionDrawing>(drawingId);\n expect(drawing instanceof SectionDrawing).to.be.true;\n\n // Expect default values\n expect(Id64.isValidId64(drawing.spatialView.id)).to.be.false;\n expect(drawing.sectionType).to.equal(SectionType.Section);\n expect(drawing.jsonProperties.drawingToSpatialTransform).to.be.undefined;\n expect(drawing.jsonProperties.sheetToSpatialTransform).to.be.undefined;\n expect(drawing.drawingToSpatialTransform).to.be.undefined;\n expect(drawing.sheetToSpatialTransform).to.be.undefined;\n\n // Modify values\n const drawingToSpatial = Transform.createTranslationXYZ(1, 2, 3);\n const sheetToSpatial = Transform.createTranslationXYZ(4, 5, 6);\n drawing.spatialView = new RelatedElement({ id: \"0x123\" });\n drawing.sectionType = SectionType.Elevation;\n drawing.drawingToSpatialTransform = drawingToSpatial;\n drawing.sheetToSpatialTransform = sheetToSpatial;\n\n // Expect updated values\n const expectProps = (json: SectionDrawingProps | SectionDrawing) => {\n expect(json.spatialView).not.to.be.undefined;\n expect(json.spatialView?.id).to.equal(\"0x123\");\n expect(json.sectionType).to.equal(SectionType.Elevation);\n expect(Transform.fromJSON(json.jsonProperties?.drawingToSpatialTransform).isAlmostEqual(drawingToSpatial)).to.be.true;\n expect(Transform.fromJSON(json.jsonProperties?.sheetToSpatialTransform).isAlmostEqual(sheetToSpatial)).to.be.true;\n };\n\n const props = drawing.toJSON();\n expectProps(props);\n\n // Persist changes\n imodel.elements.updateElement(props);\n imodel.saveChanges();\n\n // Obtain persistent element\n drawing = imodel.elements.getElement<SectionDrawing>(drawingId);\n\n // Expect persistent values\n expectProps(drawing);\n expectProps(drawing.toJSON());\n });\n\n it(\"should create a SectionDrawing and SectionDrawingModel on insert\", () => {\n const sectionDrawingId = SectionDrawing.insert(imodel, documentListModelId, \"SectionDrawingInsert\");\n\n expect(Id64.isValidId64(sectionDrawingId)).to.be.true;\n\n const insertedSectionDrawing = imodel.elements.getElement(sectionDrawingId);\n\n expect(insertedSectionDrawing instanceof SectionDrawing).to.be.true;\n\n const insertedSectionDrawingModel = imodel.models.getModel(sectionDrawingId);\n\n expect(insertedSectionDrawingModel.className).to.equal(\"SectionDrawingModel\");\n expect(insertedSectionDrawingModel instanceof SectionDrawingModel).to.be.true;\n });\n});\n"]}
1
+ {"version":3,"file":"SectionDrawing.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/SectionDrawing.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { expect } from \"chai\";\nimport { Id64 } from \"@itwin/core-bentley\";\nimport { Transform } from \"@itwin/core-geometry\";\nimport { RelatedElement, SectionDrawingProps, SectionType } from \"@itwin/core-common\";\nimport { Drawing, SectionDrawing } from \"../../Element\";\nimport { DocumentListModel, DrawingModel, SectionDrawingModel } from \"../../Model\";\nimport { SnapshotDb } from \"../../IModelDb\";\nimport { IModelTestUtils } from \"../IModelTestUtils\";\nimport { withEditTxn } from \"../../EditTxn\";\n\ndescribe(\"SectionDrawing\", () => {\n let imodel: SnapshotDb;\n let documentListModelId: string;\n before(() => {\n const iModelPath = IModelTestUtils.prepareOutputFile(\"SectionDrawing\", \"SectionDrawing.bim\");\n imodel = SnapshotDb.createEmpty(iModelPath, { rootSubject: { name: \"SectionDrawingTest\" } });\n documentListModelId = withEditTxn(imodel, (txn) => DocumentListModel.insert(txn, SnapshotDb.rootSubjectId, \"DocumentList\"));\n });\n\n after(() => {\n imodel.close();\n });\n\n it(\"should round-trip through JSON\", () => {\n // Insert a SectionDrawing\n const drawingId = withEditTxn(imodel, (txn) => txn.insertElement({\n classFullName: SectionDrawing.classFullName,\n model: documentListModelId,\n code: Drawing.createCode(imodel, documentListModelId, \"SectionDrawingRoundTrip\"),\n }));\n expect(Id64.isValidId64(drawingId)).to.be.true;\n\n const model = imodel.models.createModel({\n classFullName: DrawingModel.classFullName,\n modeledElement: { id: drawingId },\n });\n const modelId = withEditTxn(imodel, (txn) => txn.insertModel(model.toJSON()));\n expect(Id64.isValidId64(modelId)).to.be.true;\n\n let drawing = imodel.elements.getElement<SectionDrawing>(drawingId);\n expect(drawing instanceof SectionDrawing).to.be.true;\n\n // Expect default values\n expect(Id64.isValidId64(drawing.spatialView.id)).to.be.false;\n expect(drawing.sectionType).to.equal(SectionType.Section);\n expect(drawing.jsonProperties.drawingToSpatialTransform).to.be.undefined;\n expect(drawing.jsonProperties.sheetToSpatialTransform).to.be.undefined;\n expect(drawing.drawingToSpatialTransform).to.be.undefined;\n expect(drawing.sheetToSpatialTransform).to.be.undefined;\n\n // Modify values\n const drawingToSpatial = Transform.createTranslationXYZ(1, 2, 3);\n const sheetToSpatial = Transform.createTranslationXYZ(4, 5, 6);\n drawing.spatialView = new RelatedElement({ id: \"0x123\" });\n drawing.sectionType = SectionType.Elevation;\n drawing.drawingToSpatialTransform = drawingToSpatial;\n drawing.sheetToSpatialTransform = sheetToSpatial;\n\n // Expect updated values\n const expectProps = (json: SectionDrawingProps | SectionDrawing) => {\n expect(json.spatialView).not.to.be.undefined;\n expect(json.spatialView?.id).to.equal(\"0x123\");\n expect(json.sectionType).to.equal(SectionType.Elevation);\n expect(Transform.fromJSON(json.jsonProperties?.drawingToSpatialTransform).isAlmostEqual(drawingToSpatial)).to.be.true;\n expect(Transform.fromJSON(json.jsonProperties?.sheetToSpatialTransform).isAlmostEqual(sheetToSpatial)).to.be.true;\n };\n\n const props = drawing.toJSON();\n expectProps(props);\n\n // Persist changes\n withEditTxn(imodel, (txn) => txn.updateElement(props));\n\n // Obtain persistent element\n drawing = imodel.elements.getElement<SectionDrawing>(drawingId);\n\n // Expect persistent values\n expectProps(drawing);\n expectProps(drawing.toJSON());\n });\n\n it(\"should create a SectionDrawing and SectionDrawingModel on insert\", () => {\n const sectionDrawingId = withEditTxn(imodel, (txn) => SectionDrawing.insert(txn, documentListModelId, \"SectionDrawingInsert\"));\n\n expect(Id64.isValidId64(sectionDrawingId)).to.be.true;\n\n const insertedSectionDrawing = imodel.elements.getElement(sectionDrawingId);\n\n expect(insertedSectionDrawing instanceof SectionDrawing).to.be.true;\n\n const insertedSectionDrawingModel = imodel.models.getModel(sectionDrawingId);\n\n expect(insertedSectionDrawingModel.className).to.equal(\"SectionDrawingModel\");\n expect(insertedSectionDrawingModel instanceof SectionDrawingModel).to.be.true;\n });\n});\n"]}
@@ -17,6 +17,7 @@ import { ExtensiveTestScenario, IModelTestUtils } from "../IModelTestUtils";
17
17
  import { KnownTestLocations } from "../KnownTestLocations";
18
18
  import { ChannelControl } from "../../core-backend";
19
19
  import { _hubAccess, _releaseAllLocks } from "../../internal/Symbols";
20
+ import { EditTxn, withEditTxn } from "../../EditTxn";
20
21
  const expect = chai.expect;
21
22
  const assert = chai.assert;
22
23
  chai.use(chaiAsPromised);
@@ -27,7 +28,6 @@ describe("Server-based locks", () => {
27
28
  assert.isFalse(sourceDb.locks.isServerBased);
28
29
  await ExtensiveTestScenario.prepareDb(sourceDb);
29
30
  await ExtensiveTestScenario.populateDb(sourceDb);
30
- sourceDb.saveChanges();
31
31
  sourceDb.close();
32
32
  return dbName;
33
33
  };
@@ -161,21 +161,24 @@ describe("Server-based locks", () => {
161
161
  category: childElJson.category,
162
162
  code: Code.createEmpty(),
163
163
  };
164
- assert.throws(() => bc1.elements.insertElement(physicalProps), IModelError, "shared lock"); // insert requires shared lock on model
164
+ assert.throws(() => withEditTxn(bc1, (txn) => txn.insertElement(physicalProps)), IModelError, "shared lock"); // insert requires shared lock on model
165
165
  await bc1Locks.acquireLocks({ shared: parentId }); // also acquires shared lock on model
166
- const newElId = bc1.elements.insertElement(physicalProps);
166
+ const newElId = withEditTxn(bc1, (txn) => txn.insertElement(physicalProps));
167
167
  assertExclusiveLocks(bc1Locks, newElId);
168
168
  childElJson.userLabel = "new user label";
169
- assert.throws(() => bc1.elements.updateElement(childElJson), "exclusive lock");
169
+ assert.throws(() => withEditTxn(bc1, (txn) => txn.updateElement(childElJson)), "exclusive lock");
170
170
  await bc1Locks.acquireLocks({ exclusive: child1 });
171
- bc1.elements.updateElement(childElJson);
172
- bc1.saveChanges();
173
- bc1.elements.deleteElement(child1); // make sure delete now works
174
- bc1.abandonChanges();
171
+ withEditTxn(bc1, (txn) => txn.updateElement(childElJson));
172
+ {
173
+ const txn = new EditTxn(bc1, "verify delete lock behavior");
174
+ txn.start();
175
+ txn.deleteElement(child1); // make sure delete now works
176
+ txn.end("abandon");
177
+ }
175
178
  assert.isTrue(bc1.locks.holdsSharedLock(IModel.repositoryModelId));
176
179
  await bc1.pushChanges({ accessToken: accessToken1, description: "my changes" });
177
180
  assert.isFalse(bc1.locks.holdsSharedLock(IModel.repositoryModelId));
178
- assert.throws(() => bc2.elements.deleteElement(child1), "exclusive lock"); // bc2 can't delete because it doesn't hold lock
181
+ assert.throws(() => withEditTxn(bc2, (txn) => txn.deleteElement(child1)), "exclusive lock"); // bc2 can't delete because it doesn't hold lock
179
182
  await expect(bc2Locks.acquireLocks({ exclusive: child1 })).rejectedWith(IModelError, "pull is required"); // can't get lock since other briefcase changed it
180
183
  await bc2.pullChanges({ accessToken: accessToken2 });
181
184
  await bc2Locks.acquireLocks({ exclusive: child1, shared: child1 });
@@ -207,10 +210,10 @@ describe("Server-based locks", () => {
207
210
  expect(locks.getLockCount(LockState.Exclusive)).to.equal(0);
208
211
  expect(locks.getLockCount(LockState.Shared)).to.equal(0);
209
212
  }
210
- function write() {
213
+ function write(txn) {
211
214
  const elem = bc.elements.getElement(elemId);
212
215
  elem.jsonProperties.testProp = Guid.createValue();
213
- elem.update();
216
+ elem.update(txn);
214
217
  }
215
218
  async function push(retainLocks) {
216
219
  return bc.pushChanges({ retainLocks, accessToken: "token", description: "changes" });
@@ -231,8 +234,7 @@ describe("Server-based locks", () => {
231
234
  it("is called when pushing changes", async () => {
232
235
  await bc.acquireSchemaLock();
233
236
  expectLocked();
234
- write();
235
- bc.saveChanges();
237
+ withEditTxn(bc, (txn) => write(txn));
236
238
  await push();
237
239
  expectUnlocked();
238
240
  });
@@ -247,8 +249,7 @@ describe("Server-based locks", () => {
247
249
  it("is not called when pushing changes if retainLocks is specified", async () => {
248
250
  await bc.acquireSchemaLock();
249
251
  expectLocked();
250
- write();
251
- bc.saveChanges();
252
+ withEditTxn(bc, (txn) => write(txn));
252
253
  await push(true);
253
254
  expectLocked();
254
255
  await locks.releaseAllLocks();
@@ -258,8 +259,7 @@ describe("Server-based locks", () => {
258
259
  expectUnlocked();
259
260
  await bc.acquireSchemaLock();
260
261
  expectLocked();
261
- write();
262
- bc.saveChanges();
262
+ withEditTxn(bc, (txn) => write(txn));
263
263
  await expect(locks.releaseAllLocks()).to.eventually.be.rejectedWith("local changes");
264
264
  await push();
265
265
  expectUnlocked();
@@ -267,10 +267,12 @@ describe("Server-based locks", () => {
267
267
  it("throws if briefcase has unsaved changes", async () => {
268
268
  expectUnlocked();
269
269
  await bc.acquireSchemaLock();
270
- write();
270
+ const txn = new EditTxn(bc, "releaseAllLocks unsaved changes");
271
+ txn.start();
272
+ write(txn);
271
273
  await expect(locks.releaseAllLocks()).to.eventually.be.rejectedWith("local changes");
272
274
  expectLocked();
273
- bc.abandonChanges();
275
+ txn.end("abandon");
274
276
  await locks.releaseAllLocks();
275
277
  expectUnlocked();
276
278
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ServerBasedLocks.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ServerBasedLocks.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport * as chai from \"chai\";\nimport * as chaiAsPromised from \"chai-as-promised\";\nimport { restore as sinonRestore, spy as sinonSpy } from \"sinon\";\nimport { AccessToken, Guid, GuidString, Id64, Id64Arg } from \"@itwin/core-bentley\";\nimport { Code, IModel, IModelError, LocalBriefcaseProps, LockState, PhysicalElementProps, RequestNewBriefcaseProps } from \"@itwin/core-common\";\nimport { BriefcaseManager } from \"../../BriefcaseManager\";\nimport { PhysicalObject } from \"../../domains/GenericElements\";\nimport { PhysicalElement } from \"../../Element\";\nimport { BriefcaseDb, SnapshotDb } from \"../../IModelDb\";\nimport { IModelHost } from \"../../IModelHost\";\nimport { ElementOwnsChildElements } from \"../../NavigationRelationship\";\nimport { ServerBasedLocks } from \"../../internal/ServerBasedLocks\";\nimport { HubMock } from \"../../internal/HubMock\";\nimport { ExtensiveTestScenario, IModelTestUtils } from \"../IModelTestUtils\";\nimport { KnownTestLocations } from \"../KnownTestLocations\";\nimport { ChannelControl } from \"../../core-backend\";\nimport { _hubAccess, _releaseAllLocks } from \"../../internal/Symbols\";\n\nconst expect = chai.expect;\nconst assert = chai.assert;\nchai.use(chaiAsPromised);\n\ndescribe(\"Server-based locks\", () => {\n const createVersion0 = async () => {\n const dbName = IModelTestUtils.prepareOutputFile(\"ServerBasedLocks\", \"ServerBasedLocks.bim\");\n const sourceDb = SnapshotDb.createEmpty(dbName, { rootSubject: { name: \"server lock test\" } });\n assert.isFalse(sourceDb.locks.isServerBased);\n await ExtensiveTestScenario.prepareDb(sourceDb);\n await ExtensiveTestScenario.populateDb(sourceDb);\n sourceDb.saveChanges();\n sourceDb.close();\n return dbName;\n };\n\n let iModelId: GuidString;\n let accessToken1: AccessToken;\n let accessToken2: AccessToken;\n let briefcase1Props: LocalBriefcaseProps;\n let briefcase2Props: LocalBriefcaseProps;\n\n afterEach(() => sinonRestore());\n before(async () => {\n HubMock.startup(\"ServerBasedLocks\", KnownTestLocations.outputDir);\n\n const iModelProps = {\n iModelName: \"server locks test\",\n iTwinId: HubMock.iTwinId,\n version0: await createVersion0(),\n };\n\n iModelId = await HubMock.createNewIModel(iModelProps);\n const args: RequestNewBriefcaseProps = { iTwinId: iModelProps.iTwinId, iModelId };\n briefcase1Props = await BriefcaseManager.downloadBriefcase({ accessToken: \"test token\", ...args });\n briefcase2Props = await BriefcaseManager.downloadBriefcase({ accessToken: \"test token2\", ...args });\n });\n after(() => {\n HubMock.shutdown();\n });\n\n const assertSharedLocks = (locks: ServerBasedLocks, ids: Id64Arg) => {\n for (const id of Id64.iterable(ids))\n assert.isTrue(locks.holdsSharedLock(id));\n };\n const assertExclusiveLocks = (locks: ServerBasedLocks, ids: Id64Arg) => {\n assertSharedLocks(locks, ids);\n for (const id of Id64.iterable(ids))\n assert.isTrue(locks.holdsSharedLock(id));\n };\n const assertLockCounts = (locks: ServerBasedLocks, shared: number, exclusive: number) => {\n assert.equal(locks.getLockCount(LockState.Shared), shared);\n assert.equal(locks.getLockCount(LockState.Exclusive), exclusive);\n };\n\n it(\"Acquiring locks\", async () => {\n const lockSpy = sinonSpy(IModelHost[_hubAccess], \"acquireLocks\");\n let bc1 = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\n assert.isTrue(bc1.locks.isServerBased);\n bc1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n let bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\n assert.isTrue(bc2.locks.isServerBased);\n\n let bc1Locks = bc1.locks as ServerBasedLocks;\n let bc2Locks = bc2.locks as ServerBasedLocks;\n const child1 = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1A\");\n const child2 = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1B\");\n const childEl = bc1.elements.getElement<PhysicalElement>(child1);\n const parentId = childEl.parent!.id;\n const modelId = childEl.model;\n const modelProps = bc1.elements.getElementProps(modelId);\n const subjectId = modelProps.parent!.id;\n\n const sharedLockError = \"shared lock is held\";\n const exclusiveLockError = \"lock is already held\";\n\n await bc1.acquireSchemaLock();\n assert.equal(lockSpy.callCount, 1);\n assert.isTrue(bc1.holdsSchemaLock);\n assertLockCounts(bc1Locks, 0, 1);\n assertExclusiveLocks(bc1Locks, [IModel.dictionaryId, child1, parentId]); // even though we only hold 1 lock (the \"schema\" lock), every element should say it's locked\n\n await bc1Locks.acquireLocks({ exclusive: child1 }); // attempting to acquire exclusive lock on any element when schema lock is held shouldn't need a server request\n assert.equal(lockSpy.callCount, 1);\n\n assert.isFalse(bc2.holdsSchemaLock);\n await expect(bc2.acquireSchemaLock()).rejectedWith(IModelError, exclusiveLockError, \"acquire schema exclusive\");\n await expect(bc2Locks.acquireLocks({ shared: childEl.model })).rejectedWith(IModelError, exclusiveLockError);\n\n await bc1Locks[_releaseAllLocks]();\n await bc1Locks.acquireLocks({ exclusive: parentId, shared: parentId });\n assertLockCounts(bc1Locks, 3, 1);\n assertSharedLocks(bc1Locks, [modelId, IModel.rootSubjectId]);\n assertExclusiveLocks(bc1Locks, [parentId, child1, child2]); // acquiring exclusive lock on parent implicitly holds exclusive lock on children\n\n await bc1Locks[_releaseAllLocks]();\n await bc1Locks.acquireLocks({ exclusive: modelId });\n assertLockCounts(bc1Locks, 2, 1);\n assertSharedLocks(bc1Locks, [modelId, IModel.rootSubjectId]);\n assertExclusiveLocks(bc1Locks, [modelId, parentId, child1, child2]); // acquiring exclusive lock on model implicitly holds exclusive lock on members\n\n await bc1Locks[_releaseAllLocks]();\n lockSpy.resetHistory();\n await bc1Locks.acquireLocks({ shared: child1 });\n assert.equal(lockSpy.callCount, 1);\n assert.equal(lockSpy.getCall(0).args[1].size, 5);\n assertSharedLocks(bc1Locks, [child1, parentId, modelId, subjectId, IModel.rootSubjectId]);\n assertLockCounts(bc1Locks, 5, 0);\n await bc1Locks.acquireLocks({ exclusive: child1 }); // upgrade lock from shared to exclusive\n assert.equal(lockSpy.callCount, 2);\n assertLockCounts(bc1Locks, 4, 1);\n\n assertExclusiveLocks(bc1Locks, child1);\n assert.equal(lockSpy.callCount, 2); // should not need to call server on a lock already held\n\n await expect(bc2.acquireSchemaLock()).rejectedWith(IModelError, sharedLockError);\n assert.equal(lockSpy.callCount, 3);\n await expect(bc2Locks.acquireLocks({ exclusive: parentId })).rejectedWith(IModelError, sharedLockError);\n assert.equal(lockSpy.callCount, 4);\n await bc2Locks.acquireLocks({ shared: parentId });\n assert.equal(lockSpy.callCount, 5);\n assertSharedLocks(bc2Locks, [parentId, IModel.rootSubjectId]);\n await bc2Locks.acquireLocks({ shared: IModel.dictionaryId });\n assert.equal(lockSpy.callCount, 6);\n assertSharedLocks(bc2Locks, IModel.dictionaryId);\n\n assertLockCounts(bc1Locks, 4, 1);\n assertLockCounts(bc2Locks, 5, 0);\n\n const childElJson = childEl.toJSON();\n // if we close and reopen the briefcase, the local locks database should still be intact\n bc1.close();\n bc2.close();\n\n bc1 = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\n bc1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n\n bc1Locks = bc1.locks as ServerBasedLocks;\n bc2Locks = bc2.locks as ServerBasedLocks;\n\n assertLockCounts(bc1Locks, 4, 1);\n assertLockCounts(bc2Locks, 5, 0);\n\n assertSharedLocks(bc1Locks, [parentId, childEl.model, IModel.rootSubjectId]);\n assertSharedLocks(bc2Locks, [parentId, IModel.rootSubjectId, IModel.dictionaryId]);\n assertExclusiveLocks(bc1Locks, child1);\n assert.isFalse(bc2Locks.holdsExclusiveLock(child1));\n\n await bc2Locks[_releaseAllLocks](); // release all locks from bc2 so we can test expected failures below\n assertLockCounts(bc2Locks, 0, 0);\n\n await expect(bc2Locks.acquireLocks({ exclusive: [IModel.dictionaryId, parentId] })).rejectedWith(IModelError, sharedLockError);\n assertLockCounts(bc2Locks, 0, 0); // exclusive lock is available on dictionary, but not on parent - should get neither\n await bc2Locks.acquireLocks({ exclusive: IModel.dictionaryId }); // now attempt to get only dictionary\n assertExclusiveLocks(bc2Locks, IModel.dictionaryId); // that should work\n assertSharedLocks(bc2Locks, IModel.rootSubjectId); // it should also acquire the shared lock on the rootSubject\n assertLockCounts(bc2Locks, 1, 1);\n\n await bc1Locks[_releaseAllLocks]();\n await bc2Locks[_releaseAllLocks]();\n lockSpy.resetHistory();\n\n const physicalProps: PhysicalElementProps = {\n classFullName: PhysicalObject.classFullName,\n model: modelId,\n parent: new ElementOwnsChildElements(parentId),\n category: childElJson.category,\n code: Code.createEmpty(),\n };\n assert.throws(() => bc1.elements.insertElement(physicalProps), IModelError, \"shared lock\"); // insert requires shared lock on model\n await bc1Locks.acquireLocks({ shared: parentId }); // also acquires shared lock on model\n const newElId = bc1.elements.insertElement(physicalProps);\n assertExclusiveLocks(bc1Locks, newElId);\n\n childElJson.userLabel = \"new user label\";\n assert.throws(() => bc1.elements.updateElement(childElJson), \"exclusive lock\");\n await bc1Locks.acquireLocks({ exclusive: child1 });\n bc1.elements.updateElement(childElJson);\n bc1.saveChanges();\n\n bc1.elements.deleteElement(child1); // make sure delete now works\n bc1.abandonChanges();\n\n assert.isTrue(bc1.locks.holdsSharedLock(IModel.repositoryModelId));\n\n await bc1.pushChanges({ accessToken: accessToken1, description: \"my changes\" });\n\n assert.isFalse(bc1.locks.holdsSharedLock(IModel.repositoryModelId));\n\n assert.throws(() => bc2.elements.deleteElement(child1), \"exclusive lock\"); // bc2 can't delete because it doesn't hold lock\n await expect(bc2Locks.acquireLocks({ exclusive: child1 })).rejectedWith(IModelError, \"pull is required\"); // can't get lock since other briefcase changed it\n\n await bc2.pullChanges({ accessToken: accessToken2 });\n await bc2Locks.acquireLocks({ exclusive: child1, shared: child1 });\n const child2El = bc2.elements.getElement<PhysicalElement>(child1);\n\n assert.equal(child2El.userLabel, childElJson.userLabel);\n await bc1.locks.releaseAllLocks();\n await bc2.locks.releaseAllLocks();\n bc1.close();\n bc2.close();\n });\n\n describe(\"releaseAllLocks\", () => {\n let bc: BriefcaseDb;\n let locks: ServerBasedLocks;\n let elemId: string;\n\n beforeEach(async () => {\n bc = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\n expect(bc.locks.isServerBased).to.be.true;\n locks = bc.locks as ServerBasedLocks;\n bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n elemId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n expect(elemId).not.to.equal(\"0\");\n });\n\n afterEach(() => bc.close());\n\n function expectLocked(): void {\n expect(locks.getLockCount(LockState.Exclusive)).least(1);\n expect(locks.getLockCount(LockState.Shared)).to.equal(0);\n }\n\n function expectUnlocked(): void {\n expect(locks.getLockCount(LockState.Exclusive)).to.equal(0);\n expect(locks.getLockCount(LockState.Shared)).to.equal(0);\n }\n\n function write(): void {\n const elem = bc.elements.getElement(elemId);\n elem.jsonProperties.testProp = Guid.createValue();\n elem.update();\n }\n\n async function push(retainLocks?: true): Promise<void> {\n return bc.pushChanges({ retainLocks, accessToken: \"token\", description: \"changes\" });\n }\n\n it(\"releases all locks\", async () => {\n expectUnlocked();\n await bc.acquireSchemaLock();\n expectLocked();\n await locks.releaseAllLocks();\n expectUnlocked();\n });\n\n it(\"is called when pushChanges is called with no local changes\", async () => {\n await bc.acquireSchemaLock();\n expectLocked();\n await push();\n expectUnlocked();\n });\n\n it(\"is called when pushing changes\", async () => {\n await bc.acquireSchemaLock();\n expectLocked();\n write();\n bc.saveChanges();\n await push();\n expectUnlocked();\n });\n\n it(\"is not called when pushChanges is called with no local changes if retainLocks is specified\", async () => {\n await bc.acquireSchemaLock();\n expectLocked();\n await push(true);\n expectLocked();\n await locks.releaseAllLocks();\n expectUnlocked();\n });\n\n it(\"is not called when pushing changes if retainLocks is specified\", async () => {\n await bc.acquireSchemaLock();\n expectLocked();\n write();\n bc.saveChanges();\n await push(true);\n expectLocked();\n await locks.releaseAllLocks();\n expectUnlocked();\n });\n\n it(\"throws if briefcase has unpushed changes\", async () => {\n expectUnlocked();\n await bc.acquireSchemaLock();\n expectLocked();\n write();\n bc.saveChanges();\n await expect(locks.releaseAllLocks()).to.eventually.be.rejectedWith(\"local changes\");\n await push();\n expectUnlocked();\n });\n\n it(\"throws if briefcase has unsaved changes\", async () => {\n expectUnlocked();\n await bc.acquireSchemaLock();\n write();\n await expect(locks.releaseAllLocks()).to.eventually.be.rejectedWith(\"local changes\");\n expectLocked();\n bc.abandonChanges();\n await locks.releaseAllLocks();\n expectUnlocked();\n });\n });\n});\n"]}
1
+ {"version":3,"file":"ServerBasedLocks.test.js","sourceRoot":"","sources":["../../../../src/test/standalone/ServerBasedLocks.test.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport * as chai from \"chai\";\nimport * as chaiAsPromised from \"chai-as-promised\";\nimport { restore as sinonRestore, spy as sinonSpy } from \"sinon\";\nimport { AccessToken, Guid, GuidString, Id64, Id64Arg } from \"@itwin/core-bentley\";\nimport { Code, IModel, IModelError, LocalBriefcaseProps, LockState, PhysicalElementProps, RequestNewBriefcaseProps } from \"@itwin/core-common\";\nimport { BriefcaseManager } from \"../../BriefcaseManager\";\nimport { PhysicalObject } from \"../../domains/GenericElements\";\nimport { PhysicalElement } from \"../../Element\";\nimport { BriefcaseDb, SnapshotDb } from \"../../IModelDb\";\nimport { IModelHost } from \"../../IModelHost\";\nimport { ElementOwnsChildElements } from \"../../NavigationRelationship\";\nimport { ServerBasedLocks } from \"../../internal/ServerBasedLocks\";\nimport { HubMock } from \"../../internal/HubMock\";\nimport { ExtensiveTestScenario, IModelTestUtils } from \"../IModelTestUtils\";\nimport { KnownTestLocations } from \"../KnownTestLocations\";\nimport { ChannelControl } from \"../../core-backend\";\nimport { _hubAccess, _releaseAllLocks } from \"../../internal/Symbols\";\nimport { EditTxn, withEditTxn } from \"../../EditTxn\";\n\nconst expect = chai.expect;\nconst assert = chai.assert;\nchai.use(chaiAsPromised);\n\ndescribe(\"Server-based locks\", () => {\n const createVersion0 = async () => {\n const dbName = IModelTestUtils.prepareOutputFile(\"ServerBasedLocks\", \"ServerBasedLocks.bim\");\n const sourceDb = SnapshotDb.createEmpty(dbName, { rootSubject: { name: \"server lock test\" } });\n assert.isFalse(sourceDb.locks.isServerBased);\n await ExtensiveTestScenario.prepareDb(sourceDb);\n await ExtensiveTestScenario.populateDb(sourceDb);\n sourceDb.close();\n return dbName;\n };\n\n let iModelId: GuidString;\n let accessToken1: AccessToken;\n let accessToken2: AccessToken;\n let briefcase1Props: LocalBriefcaseProps;\n let briefcase2Props: LocalBriefcaseProps;\n\n afterEach(() => sinonRestore());\n before(async () => {\n HubMock.startup(\"ServerBasedLocks\", KnownTestLocations.outputDir);\n\n const iModelProps = {\n iModelName: \"server locks test\",\n iTwinId: HubMock.iTwinId,\n version0: await createVersion0(),\n };\n\n iModelId = await HubMock.createNewIModel(iModelProps);\n const args: RequestNewBriefcaseProps = { iTwinId: iModelProps.iTwinId, iModelId };\n briefcase1Props = await BriefcaseManager.downloadBriefcase({ accessToken: \"test token\", ...args });\n briefcase2Props = await BriefcaseManager.downloadBriefcase({ accessToken: \"test token2\", ...args });\n });\n after(() => {\n HubMock.shutdown();\n });\n\n const assertSharedLocks = (locks: ServerBasedLocks, ids: Id64Arg) => {\n for (const id of Id64.iterable(ids))\n assert.isTrue(locks.holdsSharedLock(id));\n };\n const assertExclusiveLocks = (locks: ServerBasedLocks, ids: Id64Arg) => {\n assertSharedLocks(locks, ids);\n for (const id of Id64.iterable(ids))\n assert.isTrue(locks.holdsSharedLock(id));\n };\n const assertLockCounts = (locks: ServerBasedLocks, shared: number, exclusive: number) => {\n assert.equal(locks.getLockCount(LockState.Shared), shared);\n assert.equal(locks.getLockCount(LockState.Exclusive), exclusive);\n };\n\n it(\"Acquiring locks\", async () => {\n const lockSpy = sinonSpy(IModelHost[_hubAccess], \"acquireLocks\");\n let bc1 = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\n assert.isTrue(bc1.locks.isServerBased);\n bc1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n let bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\n assert.isTrue(bc2.locks.isServerBased);\n\n let bc1Locks = bc1.locks as ServerBasedLocks;\n let bc2Locks = bc2.locks as ServerBasedLocks;\n const child1 = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1A\");\n const child2 = IModelTestUtils.queryByUserLabel(bc1, \"ChildObject1B\");\n const childEl = bc1.elements.getElement<PhysicalElement>(child1);\n const parentId = childEl.parent!.id;\n const modelId = childEl.model;\n const modelProps = bc1.elements.getElementProps(modelId);\n const subjectId = modelProps.parent!.id;\n\n const sharedLockError = \"shared lock is held\";\n const exclusiveLockError = \"lock is already held\";\n\n await bc1.acquireSchemaLock();\n assert.equal(lockSpy.callCount, 1);\n assert.isTrue(bc1.holdsSchemaLock);\n assertLockCounts(bc1Locks, 0, 1);\n assertExclusiveLocks(bc1Locks, [IModel.dictionaryId, child1, parentId]); // even though we only hold 1 lock (the \"schema\" lock), every element should say it's locked\n\n await bc1Locks.acquireLocks({ exclusive: child1 }); // attempting to acquire exclusive lock on any element when schema lock is held shouldn't need a server request\n assert.equal(lockSpy.callCount, 1);\n\n assert.isFalse(bc2.holdsSchemaLock);\n await expect(bc2.acquireSchemaLock()).rejectedWith(IModelError, exclusiveLockError, \"acquire schema exclusive\");\n await expect(bc2Locks.acquireLocks({ shared: childEl.model })).rejectedWith(IModelError, exclusiveLockError);\n\n await bc1Locks[_releaseAllLocks]();\n await bc1Locks.acquireLocks({ exclusive: parentId, shared: parentId });\n assertLockCounts(bc1Locks, 3, 1);\n assertSharedLocks(bc1Locks, [modelId, IModel.rootSubjectId]);\n assertExclusiveLocks(bc1Locks, [parentId, child1, child2]); // acquiring exclusive lock on parent implicitly holds exclusive lock on children\n\n await bc1Locks[_releaseAllLocks]();\n await bc1Locks.acquireLocks({ exclusive: modelId });\n assertLockCounts(bc1Locks, 2, 1);\n assertSharedLocks(bc1Locks, [modelId, IModel.rootSubjectId]);\n assertExclusiveLocks(bc1Locks, [modelId, parentId, child1, child2]); // acquiring exclusive lock on model implicitly holds exclusive lock on members\n\n await bc1Locks[_releaseAllLocks]();\n lockSpy.resetHistory();\n await bc1Locks.acquireLocks({ shared: child1 });\n assert.equal(lockSpy.callCount, 1);\n assert.equal(lockSpy.getCall(0).args[1].size, 5);\n assertSharedLocks(bc1Locks, [child1, parentId, modelId, subjectId, IModel.rootSubjectId]);\n assertLockCounts(bc1Locks, 5, 0);\n await bc1Locks.acquireLocks({ exclusive: child1 }); // upgrade lock from shared to exclusive\n assert.equal(lockSpy.callCount, 2);\n assertLockCounts(bc1Locks, 4, 1);\n\n assertExclusiveLocks(bc1Locks, child1);\n assert.equal(lockSpy.callCount, 2); // should not need to call server on a lock already held\n\n await expect(bc2.acquireSchemaLock()).rejectedWith(IModelError, sharedLockError);\n assert.equal(lockSpy.callCount, 3);\n await expect(bc2Locks.acquireLocks({ exclusive: parentId })).rejectedWith(IModelError, sharedLockError);\n assert.equal(lockSpy.callCount, 4);\n await bc2Locks.acquireLocks({ shared: parentId });\n assert.equal(lockSpy.callCount, 5);\n assertSharedLocks(bc2Locks, [parentId, IModel.rootSubjectId]);\n await bc2Locks.acquireLocks({ shared: IModel.dictionaryId });\n assert.equal(lockSpy.callCount, 6);\n assertSharedLocks(bc2Locks, IModel.dictionaryId);\n\n assertLockCounts(bc1Locks, 4, 1);\n assertLockCounts(bc2Locks, 5, 0);\n\n const childElJson = childEl.toJSON();\n // if we close and reopen the briefcase, the local locks database should still be intact\n bc1.close();\n bc2.close();\n\n bc1 = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\n bc1.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n bc2 = await BriefcaseDb.open({ fileName: briefcase2Props.fileName });\n bc2.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n\n bc1Locks = bc1.locks as ServerBasedLocks;\n bc2Locks = bc2.locks as ServerBasedLocks;\n\n assertLockCounts(bc1Locks, 4, 1);\n assertLockCounts(bc2Locks, 5, 0);\n\n assertSharedLocks(bc1Locks, [parentId, childEl.model, IModel.rootSubjectId]);\n assertSharedLocks(bc2Locks, [parentId, IModel.rootSubjectId, IModel.dictionaryId]);\n assertExclusiveLocks(bc1Locks, child1);\n assert.isFalse(bc2Locks.holdsExclusiveLock(child1));\n\n await bc2Locks[_releaseAllLocks](); // release all locks from bc2 so we can test expected failures below\n assertLockCounts(bc2Locks, 0, 0);\n\n await expect(bc2Locks.acquireLocks({ exclusive: [IModel.dictionaryId, parentId] })).rejectedWith(IModelError, sharedLockError);\n assertLockCounts(bc2Locks, 0, 0); // exclusive lock is available on dictionary, but not on parent - should get neither\n await bc2Locks.acquireLocks({ exclusive: IModel.dictionaryId }); // now attempt to get only dictionary\n assertExclusiveLocks(bc2Locks, IModel.dictionaryId); // that should work\n assertSharedLocks(bc2Locks, IModel.rootSubjectId); // it should also acquire the shared lock on the rootSubject\n assertLockCounts(bc2Locks, 1, 1);\n\n await bc1Locks[_releaseAllLocks]();\n await bc2Locks[_releaseAllLocks]();\n lockSpy.resetHistory();\n\n const physicalProps: PhysicalElementProps = {\n classFullName: PhysicalObject.classFullName,\n model: modelId,\n parent: new ElementOwnsChildElements(parentId),\n category: childElJson.category,\n code: Code.createEmpty(),\n };\n assert.throws(() => withEditTxn(bc1, (txn) => txn.insertElement(physicalProps)), IModelError, \"shared lock\"); // insert requires shared lock on model\n await bc1Locks.acquireLocks({ shared: parentId }); // also acquires shared lock on model\n const newElId = withEditTxn(bc1, (txn) => txn.insertElement(physicalProps));\n assertExclusiveLocks(bc1Locks, newElId);\n\n childElJson.userLabel = \"new user label\";\n assert.throws(() => withEditTxn(bc1, (txn) => txn.updateElement(childElJson)), \"exclusive lock\");\n await bc1Locks.acquireLocks({ exclusive: child1 });\n withEditTxn(bc1, (txn) => txn.updateElement(childElJson));\n\n {\n const txn = new EditTxn(bc1, \"verify delete lock behavior\");\n txn.start();\n txn.deleteElement(child1); // make sure delete now works\n txn.end(\"abandon\");\n }\n\n assert.isTrue(bc1.locks.holdsSharedLock(IModel.repositoryModelId));\n\n await bc1.pushChanges({ accessToken: accessToken1, description: \"my changes\" });\n\n assert.isFalse(bc1.locks.holdsSharedLock(IModel.repositoryModelId));\n\n assert.throws(() => withEditTxn(bc2, (txn) => txn.deleteElement(child1)), \"exclusive lock\"); // bc2 can't delete because it doesn't hold lock\n await expect(bc2Locks.acquireLocks({ exclusive: child1 })).rejectedWith(IModelError, \"pull is required\"); // can't get lock since other briefcase changed it\n\n await bc2.pullChanges({ accessToken: accessToken2 });\n await bc2Locks.acquireLocks({ exclusive: child1, shared: child1 });\n const child2El = bc2.elements.getElement<PhysicalElement>(child1);\n\n assert.equal(child2El.userLabel, childElJson.userLabel);\n await bc1.locks.releaseAllLocks();\n await bc2.locks.releaseAllLocks();\n bc1.close();\n bc2.close();\n });\n\n describe(\"releaseAllLocks\", () => {\n let bc: BriefcaseDb;\n let locks: ServerBasedLocks;\n let elemId: string;\n\n beforeEach(async () => {\n bc = await BriefcaseDb.open({ fileName: briefcase1Props.fileName });\n expect(bc.locks.isServerBased).to.be.true;\n locks = bc.locks as ServerBasedLocks;\n bc.channels.addAllowedChannel(ChannelControl.sharedChannelName);\n elemId = IModelTestUtils.queryByUserLabel(bc, \"ChildObject1B\");\n expect(elemId).not.to.equal(\"0\");\n });\n\n afterEach(() => bc.close());\n\n function expectLocked(): void {\n expect(locks.getLockCount(LockState.Exclusive)).least(1);\n expect(locks.getLockCount(LockState.Shared)).to.equal(0);\n }\n\n function expectUnlocked(): void {\n expect(locks.getLockCount(LockState.Exclusive)).to.equal(0);\n expect(locks.getLockCount(LockState.Shared)).to.equal(0);\n }\n\n function write(txn: EditTxn): void {\n const elem = bc.elements.getElement(elemId);\n elem.jsonProperties.testProp = Guid.createValue();\n elem.update(txn);\n }\n\n async function push(retainLocks?: true): Promise<void> {\n return bc.pushChanges({ retainLocks, accessToken: \"token\", description: \"changes\" });\n }\n\n it(\"releases all locks\", async () => {\n expectUnlocked();\n await bc.acquireSchemaLock();\n expectLocked();\n await locks.releaseAllLocks();\n expectUnlocked();\n });\n\n it(\"is called when pushChanges is called with no local changes\", async () => {\n await bc.acquireSchemaLock();\n expectLocked();\n await push();\n expectUnlocked();\n });\n\n it(\"is called when pushing changes\", async () => {\n await bc.acquireSchemaLock();\n expectLocked();\n withEditTxn(bc, (txn) => write(txn));\n await push();\n expectUnlocked();\n });\n\n it(\"is not called when pushChanges is called with no local changes if retainLocks is specified\", async () => {\n await bc.acquireSchemaLock();\n expectLocked();\n await push(true);\n expectLocked();\n await locks.releaseAllLocks();\n expectUnlocked();\n });\n\n it(\"is not called when pushing changes if retainLocks is specified\", async () => {\n await bc.acquireSchemaLock();\n expectLocked();\n withEditTxn(bc, (txn) => write(txn));\n await push(true);\n expectLocked();\n await locks.releaseAllLocks();\n expectUnlocked();\n });\n\n it(\"throws if briefcase has unpushed changes\", async () => {\n expectUnlocked();\n await bc.acquireSchemaLock();\n expectLocked();\n withEditTxn(bc, (txn) => write(txn));\n await expect(locks.releaseAllLocks()).to.eventually.be.rejectedWith(\"local changes\");\n await push();\n expectUnlocked();\n });\n\n it(\"throws if briefcase has unsaved changes\", async () => {\n expectUnlocked();\n await bc.acquireSchemaLock();\n const txn = new EditTxn(bc, \"releaseAllLocks unsaved changes\");\n txn.start();\n write(txn);\n await expect(locks.releaseAllLocks()).to.eventually.be.rejectedWith(\"local changes\");\n expectLocked();\n txn.end(\"abandon\");\n await locks.releaseAllLocks();\n expectUnlocked();\n });\n });\n});\n\n"]}
@@ -6,6 +6,7 @@ import { expect } from "chai";
6
6
  import { assert, OpenMode } from "@itwin/core-bentley";
7
7
  import { StandaloneDb } from "../../IModelDb";
8
8
  import { IModelHost } from "../../IModelHost";
9
+ import { withEditTxn } from "../../EditTxn";
9
10
  import { SettingsPriority } from "../../workspace/Settings";
10
11
  import { IModelTestUtils } from "../IModelTestUtils";
11
12
  import { GeoCoordConfig } from "../../GeoCoordConfig";
@@ -261,18 +262,20 @@ describe("Settings", () => {
261
262
  const gcsDbDict = {
262
263
  "gcs/databases": ["gcs/Usa", "gcs/Canada"],
263
264
  };
264
- iModel2.saveSettingDictionary("gcs-dbs", gcsDbDict);
265
- iModel2.saveSettingDictionary("test1", setting1);
265
+ withEditTxn(iModel2, (txn) => {
266
+ txn.saveSettingDictionary("gcs-dbs", gcsDbDict);
267
+ txn.saveSettingDictionary("test1", setting1);
268
+ });
266
269
  iModel2.close();
267
270
  let iModel3 = StandaloneDb.openFile(iModelName, OpenMode.ReadWrite);
268
271
  expect(iModel3.workspace.settings.getObject("gcs/databases")).to.deep.equal(gcsDbDict["gcs/databases"]);
269
272
  expect(iModel3.workspace.settings.getString("imodel/setting1")).equal(setting1["imodel/setting1"]);
270
- iModel3.saveSettingDictionary("test1", setting1changed);
273
+ withEditTxn(iModel3, (txn) => txn.saveSettingDictionary("test1", setting1changed));
271
274
  iModel3.close();
272
275
  iModel3 = StandaloneDb.openFile(iModelName);
273
276
  expect(iModel3.workspace.settings.getObject("gcs/databases")).to.deep.equal(gcsDbDict["gcs/databases"]);
274
277
  expect(iModel3.workspace.settings.getString("imodel/setting1")).equal(setting1changed["imodel/setting1"]);
275
- iModel3.deleteSettingDictionary("test1");
278
+ withEditTxn(iModel3, (txn) => txn.deleteSettingDictionary("test1"));
276
279
  iModel3.close();
277
280
  iModel3 = StandaloneDb.openFile(iModelName);
278
281
  expect(iModel3.workspace.settings.getObject("gcs/databases")).to.deep.equal(gcsDbDict["gcs/databases"]);