@itwin/reports-config-widget-react 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (250) hide show
  1. package/.rush/temp/package-deps_rebuild.json +38 -34
  2. package/.rush/temp/shrinkwrap-deps.json +14 -6
  3. package/CHANGELOG.json +30 -0
  4. package/CHANGELOG.md +17 -1
  5. package/coverage/clover.xml +605 -610
  6. package/coverage/coverage-final.json +28 -27
  7. package/coverage/lcov-report/index.html +31 -31
  8. package/coverage/lcov-report/src/ReportsConfigWidget.ts.html +10 -10
  9. package/coverage/lcov-report/src/index.html +1 -1
  10. package/coverage/lcov-report/src/test/index.html +1 -1
  11. package/coverage/lcov-report/src/test/test-utils.tsx.html +22 -22
  12. package/coverage/lcov-report/src/widget/ReportsConfigUiProvider.tsx.html +7 -7
  13. package/coverage/lcov-report/src/widget/components/ActionPanel.tsx.html +29 -41
  14. package/coverage/lcov-report/src/widget/components/AddMappingsModal.tsx.html +31 -37
  15. package/coverage/lcov-report/src/widget/components/BulkExtractor.ts.html +270 -162
  16. package/coverage/lcov-report/src/widget/components/Constants.ts.html +4 -4
  17. package/coverage/lcov-report/src/widget/components/DeleteModal.tsx.html +21 -21
  18. package/coverage/lcov-report/src/widget/components/ExtractionStates/FailedExtractionState.tsx.html +6 -6
  19. package/coverage/lcov-report/src/widget/components/ExtractionStates/QueuedExtractionState.tsx.html +14 -14
  20. package/coverage/lcov-report/src/widget/components/ExtractionStates/RunningExtractionState.tsx.html +15 -15
  21. package/coverage/lcov-report/src/widget/components/ExtractionStates/StartingExtractionState.tsx.html +14 -14
  22. package/coverage/lcov-report/src/widget/components/ExtractionStates/SucceededExtractionState.tsx.html +22 -19
  23. package/coverage/lcov-report/src/widget/components/ExtractionStates/index.html +43 -43
  24. package/coverage/lcov-report/src/widget/components/ExtractionStatus.tsx.html +57 -57
  25. package/coverage/lcov-report/src/widget/components/ExtractionToast.tsx.html +208 -0
  26. package/coverage/lcov-report/src/widget/components/HorizontalTile.tsx.html +8 -8
  27. package/coverage/lcov-report/src/widget/components/LocalizedTablePaginator.tsx.html +8 -8
  28. package/coverage/lcov-report/src/widget/components/ReportAction.tsx.html +14 -20
  29. package/coverage/lcov-report/src/widget/components/ReportHorizontalTile.tsx.html +30 -33
  30. package/coverage/lcov-report/src/widget/components/ReportMappingHorizontalTile.tsx.html +469 -0
  31. package/coverage/lcov-report/src/widget/components/ReportMappings.tsx.html +183 -231
  32. package/coverage/lcov-report/src/widget/components/Reports.tsx.html +73 -43
  33. package/coverage/lcov-report/src/widget/components/ReportsContainer.tsx.html +10 -10
  34. package/coverage/lcov-report/src/widget/components/SearchBar.tsx.html +10 -10
  35. package/coverage/lcov-report/src/widget/components/SelectIModel.tsx.html +31 -31
  36. package/coverage/lcov-report/src/widget/components/index.html +100 -85
  37. package/coverage/lcov-report/src/widget/components/utils.tsx.html +32 -32
  38. package/coverage/lcov-report/src/widget/context/ReportsApiConfigContext.tsx.html +8 -8
  39. package/coverage/lcov-report/src/widget/context/index.html +1 -1
  40. package/coverage/lcov-report/src/widget/hooks/index.html +1 -1
  41. package/coverage/lcov-report/src/widget/hooks/useValidator.ts.html +7 -7
  42. package/coverage/lcov-report/src/widget/index.html +1 -1
  43. package/coverage/lcov.info +990 -1003
  44. package/jest.config.js +6 -0
  45. package/lib/cjs/test/AddMappingModal.test.d.ts +2 -0
  46. package/lib/cjs/test/AddMappingModal.test.d.ts.map +1 -0
  47. package/lib/cjs/test/AddMappingModal.test.js +277 -0
  48. package/lib/cjs/test/AddMappingModal.test.js.map +1 -0
  49. package/lib/cjs/test/BulkExtractor.test.d.ts +2 -0
  50. package/lib/cjs/test/BulkExtractor.test.d.ts.map +1 -0
  51. package/lib/cjs/test/BulkExtractor.test.js +182 -0
  52. package/lib/cjs/test/BulkExtractor.test.js.map +1 -0
  53. package/lib/cjs/test/DeleteModal.test.d.ts +2 -0
  54. package/lib/cjs/test/DeleteModal.test.d.ts.map +1 -0
  55. package/lib/cjs/test/DeleteModal.test.js +93 -0
  56. package/lib/cjs/test/DeleteModal.test.js.map +1 -0
  57. package/lib/cjs/test/ReportAction.test.js +2 -3
  58. package/lib/cjs/test/ReportAction.test.js.map +1 -1
  59. package/lib/cjs/test/ReportMappingHorizontalTile.test.d.ts +2 -0
  60. package/lib/cjs/test/ReportMappingHorizontalTile.test.d.ts.map +1 -0
  61. package/lib/cjs/test/ReportMappingHorizontalTile.test.js +340 -0
  62. package/lib/cjs/test/ReportMappingHorizontalTile.test.js.map +1 -0
  63. package/lib/cjs/test/ReportMappings.test.js +115 -267
  64. package/lib/cjs/test/ReportMappings.test.js.map +1 -1
  65. package/lib/cjs/test/Reports.test.js +1 -1
  66. package/lib/cjs/test/Reports.test.js.map +1 -1
  67. package/lib/cjs/tsconfig.tsbuildinfo +1 -1
  68. package/lib/cjs/widget/components/ActionPanel.d.ts.map +1 -1
  69. package/lib/cjs/widget/components/ActionPanel.js +4 -5
  70. package/lib/cjs/widget/components/ActionPanel.js.map +1 -1
  71. package/lib/cjs/widget/components/AddMappingsModal.d.ts +2 -2
  72. package/lib/cjs/widget/components/AddMappingsModal.d.ts.map +1 -1
  73. package/lib/cjs/widget/components/AddMappingsModal.js +5 -4
  74. package/lib/cjs/widget/components/AddMappingsModal.js.map +1 -1
  75. package/lib/cjs/widget/components/AddMappingsModal.scss +4 -3
  76. package/lib/cjs/widget/components/BulkExtractor.d.ts +18 -9
  77. package/lib/cjs/widget/components/BulkExtractor.d.ts.map +1 -1
  78. package/lib/cjs/widget/components/BulkExtractor.js +86 -57
  79. package/lib/cjs/widget/components/BulkExtractor.js.map +1 -1
  80. package/lib/cjs/widget/components/DeleteModal.js +1 -1
  81. package/lib/cjs/widget/components/DeleteModal.js.map +1 -1
  82. package/lib/cjs/widget/components/DeleteModal.scss +4 -3
  83. package/lib/cjs/widget/components/ExtractionStates/RunningExtractionState.js +1 -1
  84. package/lib/cjs/widget/components/ExtractionStates/RunningExtractionState.js.map +1 -1
  85. package/lib/cjs/widget/components/ExtractionStates/SucceededExtractionState.d.ts.map +1 -1
  86. package/lib/cjs/widget/components/ExtractionStates/SucceededExtractionState.js +1 -1
  87. package/lib/cjs/widget/components/ExtractionStates/SucceededExtractionState.js.map +1 -1
  88. package/lib/cjs/widget/components/ExtractionStatus.scss +15 -1
  89. package/lib/cjs/widget/components/ExtractionToast.d.ts +11 -0
  90. package/lib/cjs/widget/components/ExtractionToast.d.ts.map +1 -0
  91. package/lib/cjs/widget/components/ExtractionToast.js +33 -0
  92. package/lib/cjs/widget/components/ExtractionToast.js.map +1 -0
  93. package/lib/cjs/widget/components/HorizontalTile.scss +1 -1
  94. package/lib/cjs/widget/components/ReportAction.d.ts.map +1 -1
  95. package/lib/cjs/widget/components/ReportAction.js +3 -3
  96. package/lib/cjs/widget/components/ReportAction.js.map +1 -1
  97. package/lib/cjs/widget/components/ReportAction.scss +2 -2
  98. package/lib/cjs/widget/components/ReportHorizontalTile.d.ts.map +1 -1
  99. package/lib/cjs/widget/components/ReportHorizontalTile.js +1 -2
  100. package/lib/cjs/widget/components/ReportHorizontalTile.js.map +1 -1
  101. package/lib/cjs/widget/components/ReportMappingHorizontalTile.d.ts +13 -0
  102. package/lib/cjs/widget/components/ReportMappingHorizontalTile.d.ts.map +1 -0
  103. package/lib/cjs/widget/components/ReportMappingHorizontalTile.js +82 -0
  104. package/lib/cjs/widget/components/ReportMappingHorizontalTile.js.map +1 -0
  105. package/lib/cjs/widget/components/ReportMappings.d.ts +3 -1
  106. package/lib/cjs/widget/components/ReportMappings.d.ts.map +1 -1
  107. package/lib/cjs/widget/components/ReportMappings.js +39 -40
  108. package/lib/cjs/widget/components/ReportMappings.js.map +1 -1
  109. package/lib/cjs/widget/components/ReportMappings.scss +7 -7
  110. package/lib/cjs/widget/components/Reports.d.ts.map +1 -1
  111. package/lib/cjs/widget/components/Reports.js +13 -6
  112. package/lib/cjs/widget/components/Reports.js.map +1 -1
  113. package/lib/cjs/widget/components/Reports.scss +1 -1
  114. package/lib/cjs/widget/components/ReportsContainer.js +1 -1
  115. package/lib/cjs/widget/components/ReportsContainer.js.map +1 -1
  116. package/lib/cjs/widget/components/ReportsContainer.scss +2 -2
  117. package/lib/cjs/widget/components/SelectIModel.js +2 -2
  118. package/lib/cjs/widget/components/SelectIModel.js.map +1 -1
  119. package/lib/cjs/widget/components/SelectIModel.scss +4 -3
  120. package/lib/cjs/widget/components/utils.js +1 -1
  121. package/lib/cjs/widget/components/utils.js.map +1 -1
  122. package/lib/cjs/widget/components/utils.scss +2 -2
  123. package/lib/esm/test/AddMappingModal.test.d.ts +2 -0
  124. package/lib/esm/test/AddMappingModal.test.d.ts.map +1 -0
  125. package/lib/esm/test/AddMappingModal.test.js +253 -0
  126. package/lib/esm/test/AddMappingModal.test.js.map +1 -0
  127. package/lib/esm/test/BulkExtractor.test.d.ts +2 -0
  128. package/lib/esm/test/BulkExtractor.test.d.ts.map +1 -0
  129. package/lib/esm/test/BulkExtractor.test.js +158 -0
  130. package/lib/esm/test/BulkExtractor.test.js.map +1 -0
  131. package/lib/esm/test/DeleteModal.test.d.ts +2 -0
  132. package/lib/esm/test/DeleteModal.test.d.ts.map +1 -0
  133. package/lib/esm/test/DeleteModal.test.js +69 -0
  134. package/lib/esm/test/DeleteModal.test.js.map +1 -0
  135. package/lib/esm/test/ReportAction.test.js +2 -3
  136. package/lib/esm/test/ReportAction.test.js.map +1 -1
  137. package/lib/esm/test/ReportMappingHorizontalTile.test.d.ts +2 -0
  138. package/lib/esm/test/ReportMappingHorizontalTile.test.d.ts.map +1 -0
  139. package/lib/esm/test/ReportMappingHorizontalTile.test.js +316 -0
  140. package/lib/esm/test/ReportMappingHorizontalTile.test.js.map +1 -0
  141. package/lib/esm/test/ReportMappings.test.js +117 -269
  142. package/lib/esm/test/ReportMappings.test.js.map +1 -1
  143. package/lib/esm/test/Reports.test.js +1 -1
  144. package/lib/esm/test/Reports.test.js.map +1 -1
  145. package/lib/esm/tsconfig.tsbuildinfo +1 -1
  146. package/lib/esm/widget/components/ActionPanel.d.ts.map +1 -1
  147. package/lib/esm/widget/components/ActionPanel.js +4 -5
  148. package/lib/esm/widget/components/ActionPanel.js.map +1 -1
  149. package/lib/esm/widget/components/AddMappingsModal.d.ts +2 -2
  150. package/lib/esm/widget/components/AddMappingsModal.d.ts.map +1 -1
  151. package/lib/esm/widget/components/AddMappingsModal.js +4 -5
  152. package/lib/esm/widget/components/AddMappingsModal.js.map +1 -1
  153. package/lib/esm/widget/components/AddMappingsModal.scss +4 -3
  154. package/lib/esm/widget/components/BulkExtractor.d.ts +18 -9
  155. package/lib/esm/widget/components/BulkExtractor.d.ts.map +1 -1
  156. package/lib/esm/widget/components/BulkExtractor.js +86 -57
  157. package/lib/esm/widget/components/BulkExtractor.js.map +1 -1
  158. package/lib/esm/widget/components/DeleteModal.js +1 -1
  159. package/lib/esm/widget/components/DeleteModal.js.map +1 -1
  160. package/lib/esm/widget/components/DeleteModal.scss +4 -3
  161. package/lib/esm/widget/components/ExtractionStates/RunningExtractionState.js +1 -1
  162. package/lib/esm/widget/components/ExtractionStates/RunningExtractionState.js.map +1 -1
  163. package/lib/esm/widget/components/ExtractionStates/SucceededExtractionState.d.ts.map +1 -1
  164. package/lib/esm/widget/components/ExtractionStates/SucceededExtractionState.js +1 -1
  165. package/lib/esm/widget/components/ExtractionStates/SucceededExtractionState.js.map +1 -1
  166. package/lib/esm/widget/components/ExtractionStatus.scss +15 -1
  167. package/lib/esm/widget/components/ExtractionToast.d.ts +11 -0
  168. package/lib/esm/widget/components/ExtractionToast.d.ts.map +1 -0
  169. package/lib/esm/widget/components/ExtractionToast.js +25 -0
  170. package/lib/esm/widget/components/ExtractionToast.js.map +1 -0
  171. package/lib/esm/widget/components/HorizontalTile.scss +1 -1
  172. package/lib/esm/widget/components/ReportAction.d.ts.map +1 -1
  173. package/lib/esm/widget/components/ReportAction.js +3 -3
  174. package/lib/esm/widget/components/ReportAction.js.map +1 -1
  175. package/lib/esm/widget/components/ReportAction.scss +2 -2
  176. package/lib/esm/widget/components/ReportHorizontalTile.d.ts.map +1 -1
  177. package/lib/esm/widget/components/ReportHorizontalTile.js +1 -2
  178. package/lib/esm/widget/components/ReportHorizontalTile.js.map +1 -1
  179. package/lib/esm/widget/components/ReportMappingHorizontalTile.d.ts +13 -0
  180. package/lib/esm/widget/components/ReportMappingHorizontalTile.d.ts.map +1 -0
  181. package/lib/esm/widget/components/ReportMappingHorizontalTile.js +75 -0
  182. package/lib/esm/widget/components/ReportMappingHorizontalTile.js.map +1 -0
  183. package/lib/esm/widget/components/ReportMappings.d.ts +3 -1
  184. package/lib/esm/widget/components/ReportMappings.d.ts.map +1 -1
  185. package/lib/esm/widget/components/ReportMappings.js +40 -41
  186. package/lib/esm/widget/components/ReportMappings.js.map +1 -1
  187. package/lib/esm/widget/components/ReportMappings.scss +7 -7
  188. package/lib/esm/widget/components/Reports.d.ts.map +1 -1
  189. package/lib/esm/widget/components/Reports.js +15 -8
  190. package/lib/esm/widget/components/Reports.js.map +1 -1
  191. package/lib/esm/widget/components/Reports.scss +1 -1
  192. package/lib/esm/widget/components/ReportsContainer.js +1 -1
  193. package/lib/esm/widget/components/ReportsContainer.js.map +1 -1
  194. package/lib/esm/widget/components/ReportsContainer.scss +2 -2
  195. package/lib/esm/widget/components/SelectIModel.js +2 -2
  196. package/lib/esm/widget/components/SelectIModel.js.map +1 -1
  197. package/lib/esm/widget/components/SelectIModel.scss +4 -3
  198. package/lib/esm/widget/components/utils.js +1 -1
  199. package/lib/esm/widget/components/utils.js.map +1 -1
  200. package/lib/esm/widget/components/utils.scss +2 -2
  201. package/lib/public/locales/en/ReportsConfigWidget.json +5 -0
  202. package/package.json +7 -4
  203. package/public/locales/en/ReportsConfigWidget.json +5 -0
  204. package/reports-config-widget-react.build.error.log +10 -6
  205. package/reports-config-widget-react.build.log +51 -46
  206. package/src/test/AddMappingModal.test.tsx +315 -0
  207. package/src/test/BulkExtractor.test.ts +301 -0
  208. package/src/test/DeleteModal.test.tsx +118 -0
  209. package/src/test/ReportAction.test.tsx +2 -4
  210. package/src/test/ReportMappingHorizontalTile.test.tsx +451 -0
  211. package/src/test/ReportMappings.test.tsx +154 -549
  212. package/src/test/Reports.test.tsx +1 -1
  213. package/src/widget/components/ActionPanel.tsx +19 -23
  214. package/src/widget/components/AddMappingsModal.scss +4 -3
  215. package/src/widget/components/AddMappingsModal.tsx +4 -6
  216. package/src/widget/components/BulkExtractor.ts +97 -61
  217. package/src/widget/components/DeleteModal.scss +4 -3
  218. package/src/widget/components/DeleteModal.tsx +1 -1
  219. package/src/widget/components/ExtractionStates/RunningExtractionState.tsx +1 -1
  220. package/src/widget/components/ExtractionStates/SucceededExtractionState.tsx +1 -0
  221. package/src/widget/components/ExtractionStatus.scss +15 -1
  222. package/src/widget/components/ExtractionToast.tsx +41 -0
  223. package/src/widget/components/HorizontalTile.scss +1 -1
  224. package/src/widget/components/ReportAction.scss +2 -2
  225. package/src/widget/components/ReportAction.tsx +1 -3
  226. package/src/widget/components/ReportHorizontalTile.tsx +1 -2
  227. package/src/widget/components/ReportMappingHorizontalTile.tsx +128 -0
  228. package/src/widget/components/ReportMappings.scss +7 -7
  229. package/src/widget/components/ReportMappings.tsx +89 -105
  230. package/src/widget/components/Reports.scss +1 -1
  231. package/src/widget/components/Reports.tsx +18 -8
  232. package/src/widget/components/ReportsContainer.scss +2 -2
  233. package/src/widget/components/ReportsContainer.tsx +1 -1
  234. package/src/widget/components/SelectIModel.scss +4 -3
  235. package/src/widget/components/SelectIModel.tsx +2 -2
  236. package/src/widget/components/utils.scss +2 -2
  237. package/src/widget/components/utils.tsx +1 -1
  238. package/coverage/lcov-report/src/widget/components/Extraction.tsx.html +0 -1030
  239. package/lib/cjs/widget/components/Extraction.d.ts +0 -28
  240. package/lib/cjs/widget/components/Extraction.d.ts.map +0 -1
  241. package/lib/cjs/widget/components/Extraction.js +0 -190
  242. package/lib/cjs/widget/components/Extraction.js.map +0 -1
  243. package/lib/cjs/widget/components/Extraction.scss +0 -39
  244. package/lib/esm/widget/components/Extraction.d.ts +0 -28
  245. package/lib/esm/widget/components/Extraction.d.ts.map +0 -1
  246. package/lib/esm/widget/components/Extraction.js +0 -166
  247. package/lib/esm/widget/components/Extraction.js.map +0 -1
  248. package/lib/esm/widget/components/Extraction.scss +0 -39
  249. package/src/widget/components/Extraction.scss +0 -39
  250. package/src/widget/components/Extraction.tsx +0 -315
@@ -0,0 +1,253 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import React from "react";
6
+ import faker from "@faker-js/faker";
7
+ import "@testing-library/jest-dom";
8
+ import { NoRenderApp } from "@itwin/core-frontend";
9
+ import { ReportsConfigWidget } from "../ReportsConfigWidget";
10
+ import { render, screen, TestUtils, waitFor, within, } from "./test-utils";
11
+ import * as moq from "typemoq";
12
+ import { IModelState } from "@itwin/imodels-client-management";
13
+ import { AddMappingsModal } from "../widget/components/AddMappingsModal";
14
+ import { EmptyLocalization } from "@itwin/core-common";
15
+ const mockITwinId = faker.datatype.uuid();
16
+ const mockIModelId1 = faker.datatype.uuid();
17
+ const mockIModelId2 = faker.datatype.uuid();
18
+ const mockReportId = faker.datatype.uuid();
19
+ const mockIModelsResponse = [
20
+ {
21
+ iModel: {
22
+ id: mockIModelId1,
23
+ displayName: "rAnDoMdIsPlAynAmE1",
24
+ name: "rAnDomName1",
25
+ description: "rAnDoMDeScRiPtIoN1",
26
+ createdDateTime: "2021-10-04T22:13:50.397Z",
27
+ state: IModelState.Initialized,
28
+ projectId: mockITwinId,
29
+ extent: null,
30
+ _links: {
31
+ creator: {
32
+ href: "",
33
+ },
34
+ namedVersions: {
35
+ href: "",
36
+ },
37
+ changesets: {
38
+ href: "",
39
+ },
40
+ },
41
+ },
42
+ },
43
+ {
44
+ iModel: {
45
+ id: mockIModelId2,
46
+ displayName: "rAnDoMdIsPlAynAmE2",
47
+ name: "rAnDomName2",
48
+ description: "rAnDoMDeScRiPtIoN2",
49
+ createdDateTime: "2021-10-04T22:13:50.397Z",
50
+ state: IModelState.Initialized,
51
+ projectId: mockITwinId,
52
+ extent: null,
53
+ _links: {
54
+ creator: {
55
+ href: "",
56
+ },
57
+ namedVersions: {
58
+ href: "",
59
+ },
60
+ changesets: {
61
+ href: "",
62
+ },
63
+ },
64
+ },
65
+ },
66
+ ];
67
+ const mockProjectIModels = {
68
+ iModels: mockIModelsResponse.map((iModel) => ({
69
+ id: iModel.iModel.id,
70
+ displayName: iModel.iModel.displayName,
71
+ })),
72
+ _links: {
73
+ self: {
74
+ href: "",
75
+ },
76
+ prev: null,
77
+ next: null,
78
+ },
79
+ };
80
+ const mockReportMappingsFactory = () => {
81
+ return {
82
+ mappings: [
83
+ {
84
+ reportId: mockReportId,
85
+ mappingId: faker.datatype.uuid(),
86
+ imodelId: mockIModelId1,
87
+ _links: {
88
+ report: {
89
+ href: "",
90
+ },
91
+ mapping: {
92
+ href: "",
93
+ },
94
+ imodel: {
95
+ href: "",
96
+ },
97
+ },
98
+ },
99
+ {
100
+ reportId: mockReportId,
101
+ mappingId: faker.datatype.uuid(),
102
+ imodelId: mockIModelId2,
103
+ _links: {
104
+ report: {
105
+ href: "",
106
+ },
107
+ mapping: {
108
+ href: "",
109
+ },
110
+ imodel: {
111
+ href: "",
112
+ },
113
+ },
114
+ },
115
+ ],
116
+ _links: {
117
+ next: undefined,
118
+ self: {
119
+ href: "",
120
+ },
121
+ },
122
+ };
123
+ };
124
+ const mockMappingsFactory = (mockReportMappings) => {
125
+ const mockMappings = mockReportMappings.mappings.map((mapping, index) => ({
126
+ mapping: {
127
+ id: mapping.mappingId,
128
+ mappingName: `mOcKMaPpIngNaMe${index}`,
129
+ description: `mOcKmApPInGDeScRiPtIoN${index}`,
130
+ extractionEnabled: false,
131
+ createdOn: "",
132
+ createdBy: "",
133
+ modifiedOn: "",
134
+ modifiedBy: "",
135
+ _links: {
136
+ imodel: {
137
+ // Tie the mapping to to the iModel Id
138
+ href: mapping.imodelId,
139
+ },
140
+ },
141
+ },
142
+ }));
143
+ const extraMappingId = faker.datatype.uuid();
144
+ const extraMappingName = "mOcKNaMeExTrA";
145
+ const extraMappingDescription = "mOcKDeScRiPtIoNeXtRa";
146
+ mockMappings.push({
147
+ mapping: {
148
+ id: extraMappingId,
149
+ mappingName: extraMappingName,
150
+ description: extraMappingDescription,
151
+ extractionEnabled: false,
152
+ createdOn: "",
153
+ createdBy: "",
154
+ modifiedOn: "",
155
+ modifiedBy: "",
156
+ _links: {
157
+ imodel: {
158
+ href: "",
159
+ },
160
+ },
161
+ },
162
+ });
163
+ return mockMappings;
164
+ };
165
+ const mockReportMappingsAndMappingsFactory = (mockMappings, reportMappings) => {
166
+ const reportMappingsAndMapping = reportMappings.mappings.map((reportMapping) => {
167
+ var _a;
168
+ const mapping = mockMappings.find((x) => x.mapping.id === reportMapping.mappingId).mapping;
169
+ const iModelName = mockProjectIModels.iModels.find((x) => x.id === reportMapping.imodelId).displayName;
170
+ const reportMappingAndMapping = {
171
+ ...reportMapping,
172
+ iModelName,
173
+ mappingName: mapping.mappingName,
174
+ mappingDescription: (_a = mapping.description) !== null && _a !== void 0 ? _a : "",
175
+ };
176
+ return reportMappingAndMapping;
177
+ });
178
+ return reportMappingsAndMapping;
179
+ };
180
+ const connectionMock = moq.Mock.ofType();
181
+ const mockIModelsClient = moq.Mock.ofType();
182
+ jest.mock("@itwin/appui-react", () => ({
183
+ ...jest.requireActual("@itwin/appui-react"),
184
+ useActiveIModelConnection: () => connectionMock.object,
185
+ }));
186
+ jest.mock("@itwin/imodels-client-management", () => ({
187
+ ...jest.requireActual("@itwin/imodels-client-management"),
188
+ IModelsClient: jest.fn().mockImplementation(() => ({
189
+ iModels: mockIModelsClient.object,
190
+ })),
191
+ toArray: jest.fn().mockImplementation(async () => {
192
+ return mockProjectIModels.iModels;
193
+ }),
194
+ }));
195
+ const mockGetMappings = jest.fn();
196
+ const mockCreateReportMapping = jest.fn();
197
+ jest.mock("@itwin/insights-client", () => ({
198
+ ...jest.requireActual("@itwin/insights-client"),
199
+ MappingsClient: jest.fn().mockImplementation(() => ({
200
+ getMappings: mockGetMappings,
201
+ })),
202
+ ReportsClient: jest.fn().mockImplementation(() => ({
203
+ createReportMapping: mockCreateReportMapping,
204
+ })),
205
+ }));
206
+ beforeAll(async () => {
207
+ await NoRenderApp.startup({ localization: new EmptyLocalization() });
208
+ connectionMock.setup((x) => x.iModelId).returns(() => mockIModelId1);
209
+ await ReportsConfigWidget.initialize();
210
+ });
211
+ afterAll(() => {
212
+ TestUtils.terminateUiFramework();
213
+ });
214
+ afterEach(() => {
215
+ mockGetMappings.mockReset();
216
+ mockIModelsClient.reset();
217
+ });
218
+ describe("Add Mapping Modal", () => {
219
+ it("Adding mapping sends create request", async () => {
220
+ const mockReportMappings = mockReportMappingsFactory();
221
+ const mockMappings = mockMappingsFactory(mockReportMappings);
222
+ const mockReportMappingsAndMappings = mockReportMappingsAndMappingsFactory(mockMappings, mockReportMappings);
223
+ mockGetMappings.mockReturnValueOnce(mockMappings.map((m) => m.mapping));
224
+ const { user } = render(React.createElement(AddMappingsModal, { show: true, reportId: mockReportId, existingMappings: mockReportMappingsAndMappings, returnFn: jest.fn() }));
225
+ expect(screen.getByRole("dialog")).toBeInTheDocument();
226
+ const modal = screen.getByRole("dialog");
227
+ const withinModal = within(modal);
228
+ expect(withinModal.getByText(/addmappings/i)).toBeInTheDocument();
229
+ const addButton = withinModal.getByRole("button", {
230
+ name: /add/i,
231
+ });
232
+ // Add button should be disabled
233
+ expect(addButton).toBeDisabled();
234
+ await waitFor(() => screen.getByRole("row"));
235
+ // Already mapped mappings are disabled
236
+ for (let i = 0; i < mockMappings.length - 1; i++) {
237
+ const row = screen.getByRole("row", {
238
+ name: new RegExp(`${mockMappings[i].mapping.mappingName} ${mockMappings[i].mapping.description}`, "i"),
239
+ });
240
+ const checkbox = within(row).getByRole("checkbox");
241
+ expect(checkbox).toBeDisabled();
242
+ }
243
+ // Click on checkbox on new mapping
244
+ const unmappedRow = screen.getByRole("row", {
245
+ name: new RegExp(`${mockMappings[mockMappings.length - 1].mapping.mappingName} ${mockMappings[mockMappings.length - 1].mapping.description}`, "i"),
246
+ });
247
+ const enabledCheckbox = within(unmappedRow).getByRole("checkbox");
248
+ await user.click(enabledCheckbox);
249
+ await user.click(addButton);
250
+ expect(mockCreateReportMapping).toBeCalledTimes(1);
251
+ });
252
+ });
253
+ //# sourceMappingURL=AddMappingModal.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AddMappingModal.test.js","sourceRoot":"","sources":["../../../src/test/AddMappingModal.test.tsx"],"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 React from \"react\";\nimport faker from \"@faker-js/faker\";\nimport \"@testing-library/jest-dom\";\nimport type {\n IModelConnection,\n} from \"@itwin/core-frontend\";\nimport { NoRenderApp } from \"@itwin/core-frontend\";\nimport { ReportsConfigWidget } from \"../ReportsConfigWidget\";\nimport {\n render,\n screen,\n TestUtils,\n waitFor,\n within,\n} from \"./test-utils\";\nimport * as moq from \"typemoq\";\nimport type {\n MappingSingle,\n ReportMappingCollection,\n} from \"@itwin/insights-client\";\nimport type { ReportMappingAndMapping } from \"../widget/components/ReportMappings\";\nimport type { IModelOperations, OperationOptions } from \"@itwin/imodels-client-management\";\nimport { IModelState } from \"@itwin/imodels-client-management\";\nimport { AddMappingsModal } from \"../widget/components/AddMappingsModal\";\nimport { EmptyLocalization } from \"@itwin/core-common\";\n\nconst mockITwinId = faker.datatype.uuid();\nconst mockIModelId1 = faker.datatype.uuid();\nconst mockIModelId2 = faker.datatype.uuid();\n\nconst mockReportId = faker.datatype.uuid();\n\nconst mockIModelsResponse = [\n {\n iModel: {\n id: mockIModelId1,\n displayName: \"rAnDoMdIsPlAynAmE1\",\n name: \"rAnDomName1\",\n description: \"rAnDoMDeScRiPtIoN1\",\n createdDateTime: \"2021-10-04T22:13:50.397Z\",\n state: IModelState.Initialized,\n projectId: mockITwinId,\n extent: null,\n _links: {\n creator: {\n href: \"\",\n },\n namedVersions: {\n href: \"\",\n },\n changesets: {\n href: \"\",\n },\n },\n },\n },\n {\n iModel: {\n id: mockIModelId2,\n displayName: \"rAnDoMdIsPlAynAmE2\",\n name: \"rAnDomName2\",\n description: \"rAnDoMDeScRiPtIoN2\",\n createdDateTime: \"2021-10-04T22:13:50.397Z\",\n state: IModelState.Initialized,\n projectId: mockITwinId,\n extent: null,\n _links: {\n creator: {\n href: \"\",\n },\n namedVersions: {\n href: \"\",\n },\n changesets: {\n href: \"\",\n },\n },\n },\n },\n];\n\nconst mockProjectIModels = {\n iModels: mockIModelsResponse.map((iModel) => ({\n id: iModel.iModel.id,\n displayName: iModel.iModel.displayName,\n })),\n _links: {\n self: {\n href: \"\",\n },\n prev: null,\n next: null,\n },\n};\n\nconst mockReportMappingsFactory = (): ReportMappingCollection => {\n return {\n mappings: [\n {\n reportId: mockReportId,\n mappingId: faker.datatype.uuid(),\n imodelId: mockIModelId1,\n _links: {\n report: {\n href: \"\",\n },\n mapping: {\n href: \"\",\n },\n imodel: {\n href: \"\",\n },\n },\n },\n {\n reportId: mockReportId,\n mappingId: faker.datatype.uuid(),\n imodelId: mockIModelId2,\n _links: {\n report: {\n href: \"\",\n },\n mapping: {\n href: \"\",\n },\n imodel: {\n href: \"\",\n },\n },\n },\n ],\n _links: {\n next: undefined,\n self: {\n href: \"\",\n },\n },\n };\n};\n\nconst mockMappingsFactory = (\n mockReportMappings: ReportMappingCollection\n): MappingSingle[] => {\n const mockMappings: MappingSingle[] = mockReportMappings.mappings.map(\n (mapping, index) => ({\n mapping: {\n id: mapping.mappingId,\n mappingName: `mOcKMaPpIngNaMe${index}`,\n description: `mOcKmApPInGDeScRiPtIoN${index}`,\n extractionEnabled: false,\n createdOn: \"\",\n createdBy: \"\",\n modifiedOn: \"\",\n modifiedBy: \"\",\n _links: {\n imodel: {\n // Tie the mapping to to the iModel Id\n href: mapping.imodelId,\n },\n },\n },\n })\n );\n\n const extraMappingId = faker.datatype.uuid();\n const extraMappingName = \"mOcKNaMeExTrA\";\n const extraMappingDescription = \"mOcKDeScRiPtIoNeXtRa\";\n\n mockMappings.push({\n mapping: {\n id: extraMappingId,\n mappingName: extraMappingName,\n description: extraMappingDescription,\n extractionEnabled: false,\n createdOn: \"\",\n createdBy: \"\",\n modifiedOn: \"\",\n modifiedBy: \"\",\n _links: {\n imodel: {\n href: \"\",\n },\n },\n },\n });\n\n return mockMappings;\n};\n\nconst mockReportMappingsAndMappingsFactory = (mockMappings: MappingSingle[], reportMappings: ReportMappingCollection): ReportMappingAndMapping[] => {\n const reportMappingsAndMapping =\n reportMappings.mappings.map((reportMapping) => {\n const mapping = mockMappings.find((x) => x.mapping.id === reportMapping.mappingId)!.mapping;\n const iModelName = mockProjectIModels.iModels.find((x) => x.id === reportMapping.imodelId)!.displayName;\n const reportMappingAndMapping: ReportMappingAndMapping = {\n ...reportMapping,\n iModelName,\n mappingName: mapping.mappingName,\n mappingDescription: mapping.description ?? \"\",\n };\n return reportMappingAndMapping;\n });\n return reportMappingsAndMapping;\n};\n\nconst connectionMock = moq.Mock.ofType<IModelConnection>();\nconst mockIModelsClient = moq.Mock.ofType<IModelOperations<OperationOptions>>();\n\njest.mock(\"@itwin/appui-react\", () => ({\n ...jest.requireActual(\"@itwin/appui-react\"),\n useActiveIModelConnection: () => connectionMock.object,\n}));\n\njest.mock(\"@itwin/imodels-client-management\", () => ({\n ...jest.requireActual(\"@itwin/imodels-client-management\"),\n IModelsClient: jest.fn().mockImplementation(() => ({\n iModels: mockIModelsClient.object,\n })),\n toArray: jest.fn().mockImplementation(async () => {\n return mockProjectIModels.iModels;\n }),\n}));\n\nconst mockGetMappings = jest.fn();\nconst mockCreateReportMapping = jest.fn();\n\njest.mock(\"@itwin/insights-client\", () => ({\n ...jest.requireActual(\"@itwin/insights-client\"),\n MappingsClient: jest.fn().mockImplementation(() => ({\n getMappings: mockGetMappings,\n })),\n ReportsClient: jest.fn().mockImplementation(() => ({\n createReportMapping: mockCreateReportMapping,\n })),\n}));\n\nbeforeAll(async () => {\n await NoRenderApp.startup({localization: new EmptyLocalization()});\n connectionMock.setup((x) => x.iModelId).returns(() => mockIModelId1);\n await ReportsConfigWidget.initialize();\n});\n\nafterAll(() => {\n TestUtils.terminateUiFramework();\n});\n\nafterEach(() => {\n mockGetMappings.mockReset();\n mockIModelsClient.reset();\n});\n\ndescribe(\"Add Mapping Modal\", () => {\n it(\"Adding mapping sends create request\", async () => {\n const mockReportMappings = mockReportMappingsFactory();\n const mockMappings = mockMappingsFactory(mockReportMappings);\n const mockReportMappingsAndMappings = mockReportMappingsAndMappingsFactory(mockMappings, mockReportMappings);\n\n mockGetMappings.mockReturnValueOnce(mockMappings.map((m: MappingSingle) => m.mapping));\n\n const { user } = render(\n <AddMappingsModal\n show={true}\n reportId={mockReportId}\n existingMappings={mockReportMappingsAndMappings}\n returnFn={jest.fn()}\n />\n );\n\n expect(screen.getByRole(\"dialog\")).toBeInTheDocument();\n const modal = screen.getByRole(\"dialog\");\n const withinModal = within(modal);\n expect(withinModal.getByText(/addmappings/i)).toBeInTheDocument();\n\n const addButton = withinModal.getByRole(\"button\", {\n name: /add/i,\n });\n // Add button should be disabled\n expect(addButton).toBeDisabled();\n\n await waitFor(() => screen.getByRole(\"row\"));\n\n // Already mapped mappings are disabled\n for (let i = 0; i < mockMappings.length - 1; i++) {\n const row = screen.getByRole(\"row\", {\n name: new RegExp(\n `${mockMappings[i].mapping.mappingName} ${mockMappings[i].mapping.description}`,\n \"i\"\n ),\n });\n\n const checkbox = within(row).getByRole(\"checkbox\");\n expect(checkbox).toBeDisabled();\n }\n\n // Click on checkbox on new mapping\n const unmappedRow = screen.getByRole(\"row\", {\n name: new RegExp(\n `${mockMappings[mockMappings.length - 1].mapping.mappingName\n } ${mockMappings[mockMappings.length - 1].mapping.description}`,\n \"i\"\n ),\n });\n\n const enabledCheckbox = within(unmappedRow).getByRole(\"checkbox\");\n\n await user.click(enabledCheckbox);\n await user.click(addButton);\n\n expect(mockCreateReportMapping).toBeCalledTimes(1);\n });\n});\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=BulkExtractor.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BulkExtractor.test.d.ts","sourceRoot":"","sources":["../../../src/test/BulkExtractor.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,158 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import BulkExtractor from "../widget/components/BulkExtractor";
6
+ import { ExtractionStates } from "../widget/components/ExtractionStatus";
7
+ import { assert } from "chai";
8
+ import * as moq from "typemoq";
9
+ import { ExtractorState } from "@itwin/insights-client";
10
+ jest.mock("../widget/components/Constants.ts", () => ({
11
+ STATUS_CHECK_INTERVAL: -1,
12
+ }));
13
+ jest.mock("../widget/components/ExtractionToast.tsx", () => ({
14
+ FailedExtractionToast: jest.fn(),
15
+ SuccessfulExtractionToast: jest.fn(),
16
+ }));
17
+ const mockRunExtraction = moq.Mock.ofType();
18
+ const mockGetStatus = moq.Mock.ofType();
19
+ const mockGetReportMappings = moq.Mock.ofType();
20
+ jest.mock("@itwin/insights-client", () => ({
21
+ ...jest.requireActual("@itwin/insights-client"),
22
+ ReportsClient: jest.fn().mockImplementation(() => ({
23
+ getReportMappings: mockGetReportMappings.object,
24
+ })),
25
+ ExtractionClient: jest.fn().mockImplementation(() => ({
26
+ runExtraction: mockRunExtraction.object,
27
+ getExtractionStatus: mockGetStatus.object,
28
+ })),
29
+ }));
30
+ afterEach(() => {
31
+ mockRunExtraction.reset();
32
+ mockGetStatus.reset();
33
+ });
34
+ const mockToastCallback = jest.fn();
35
+ const mockIModelId = "mockIModelId";
36
+ const mockIModelId1 = "mockIModelId1";
37
+ const mockReportId = "mockReportId";
38
+ const mockRunId = "mockRunId";
39
+ const mockRunId1 = "mockRunId1";
40
+ describe("BulkExtractor", () => {
41
+ const mockApiConfig = {
42
+ getAccessToken: async () => "mockAccessToken",
43
+ baseUrl: "",
44
+ };
45
+ it("should return status none for unknown iModel", async () => {
46
+ const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);
47
+ const result = await sut.getIModelState(mockIModelId, "", "");
48
+ assert.strictEqual(result, ExtractionStates.None);
49
+ });
50
+ it("should return running status for started extraction", async () => {
51
+ mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId)).returns(async () => ({ id: mockRunId }));
52
+ mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(async () => ({ state: ExtractorState.Running }));
53
+ const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);
54
+ await sut.runIModelExtraction(mockIModelId);
55
+ const result = await sut.getIModelState(mockIModelId, "", "");
56
+ assert.strictEqual(result, ExtractionStates.Running);
57
+ });
58
+ it("should return failed status for failed extraction", async () => {
59
+ mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId)).returns(async () => ({ id: mockRunId }));
60
+ mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(async () => ({ state: ExtractorState.Failed }));
61
+ const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);
62
+ await sut.runIModelExtraction(mockIModelId);
63
+ const result = await sut.getIModelState(mockIModelId, "", "");
64
+ assert.strictEqual(result, ExtractionStates.Failed);
65
+ });
66
+ it("full status check cycle", async () => {
67
+ mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId)).returns(async () => ({ id: mockRunId }));
68
+ mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(async () => ({ state: ExtractorState.Queued }));
69
+ mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(async () => ({ state: ExtractorState.Running }));
70
+ mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(async () => ({ state: ExtractorState.Succeeded }));
71
+ const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);
72
+ await sut.runIModelExtraction(mockIModelId);
73
+ let result = await sut.getIModelState(mockIModelId, "", "");
74
+ assert.strictEqual(result, ExtractionStates.Queued);
75
+ result = await sut.getIModelState(mockIModelId, "", "");
76
+ assert.strictEqual(result, ExtractionStates.Running);
77
+ result = await sut.getIModelState(mockIModelId, "", "");
78
+ assert.strictEqual(result, ExtractionStates.Succeeded);
79
+ });
80
+ it("two started jobs should return status", async () => {
81
+ const mockIModelIds = [mockIModelId, mockIModelId1];
82
+ mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId)).returns(async () => ({ id: mockRunId }));
83
+ mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId1)).returns(async () => ({ id: mockRunId1 }));
84
+ mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(async () => ({ state: ExtractorState.Queued }));
85
+ mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId1)).returns(async () => ({ state: ExtractorState.Queued }));
86
+ const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);
87
+ await sut.runIModelExtractions(mockIModelIds);
88
+ const result1 = await sut.getIModelState(mockIModelId, "", "");
89
+ const result2 = await sut.getIModelState(mockIModelId1, "", "");
90
+ assert.strictEqual(result1, ExtractionStates.Queued);
91
+ assert.strictEqual(result2, ExtractionStates.Queued);
92
+ });
93
+ it("should return status none for unknown report", async () => {
94
+ const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);
95
+ const result = await sut.getReportState(mockReportId);
96
+ assert.strictEqual(result, ExtractionStates.None);
97
+ });
98
+ it("should return status running for running report", async () => {
99
+ mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId)).returns(async () => ({ id: mockRunId }));
100
+ mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(async () => ({ state: ExtractorState.Running }));
101
+ mockGetReportMappings.setup(async (x) => x(moq.It.isAny(), mockReportId)).returns(async () => ([{ imodelId: mockIModelId }]));
102
+ const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);
103
+ await sut.runReportExtractions([mockReportId]);
104
+ const result = await sut.getReportState(mockReportId);
105
+ assert.strictEqual(result, ExtractionStates.Running);
106
+ });
107
+ it("should return status running for both iModels in report", async () => {
108
+ mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId)).returns(async () => ({ id: mockRunId }));
109
+ mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId1)).returns(async () => ({ id: mockRunId1 }));
110
+ mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(async () => ({ state: ExtractorState.Running }));
111
+ mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId1)).returns(async () => ({ state: ExtractorState.Running }));
112
+ mockGetReportMappings.setup(async (x) => x(moq.It.isAny(), mockReportId)).returns(async () => ([{ imodelId: mockIModelId }, { imodelId: mockIModelId1 }]));
113
+ const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);
114
+ await sut.runReportExtractions([mockReportId]);
115
+ const result1 = await sut.getIModelState(mockIModelId, "", "");
116
+ const result2 = await sut.getIModelState(mockIModelId1, "", "");
117
+ assert.strictEqual(result1, ExtractionStates.Running);
118
+ assert.strictEqual(result2, ExtractionStates.Running);
119
+ });
120
+ it("should return lowest progress status for extractions in report", async () => {
121
+ mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId)).returns(async () => ({ id: mockRunId }));
122
+ mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId1)).returns(async () => ({ id: mockRunId1 }));
123
+ mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(async () => ({ state: ExtractorState.Running }));
124
+ mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId1)).returns(async () => ({ state: ExtractorState.Queued }));
125
+ mockGetReportMappings.setup(async (x) => x(moq.It.isAny(), mockReportId)).returns(async () => ([{ imodelId: mockIModelId }, { imodelId: mockIModelId1 }]));
126
+ const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);
127
+ await sut.runReportExtractions([mockReportId]);
128
+ const result = await sut.getReportState(mockReportId);
129
+ assert.strictEqual(result, ExtractionStates.Queued);
130
+ });
131
+ it("should return status failed if one of the extractions in report failed", async () => {
132
+ mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId)).returns(async () => ({ id: mockRunId }));
133
+ mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId1)).returns(async () => ({ id: mockRunId1 }));
134
+ mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(async () => ({ state: ExtractorState.Succeeded }));
135
+ mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId1)).returns(async () => ({ state: ExtractorState.Failed }));
136
+ mockGetReportMappings.setup(async (x) => x(moq.It.isAny(), mockReportId)).returns(async () => ([{ imodelId: mockIModelId1 }, { imodelId: mockIModelId1 }]));
137
+ const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);
138
+ await sut.runReportExtractions([mockReportId]);
139
+ const result = await sut.getReportState(mockReportId);
140
+ assert.strictEqual(result, ExtractionStates.Failed);
141
+ });
142
+ it("full report extraction status check cycle", async () => {
143
+ mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId)).returns(async () => ({ id: mockRunId }));
144
+ mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(async () => ({ state: ExtractorState.Queued }));
145
+ mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(async () => ({ state: ExtractorState.Running }));
146
+ mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(async () => ({ state: ExtractorState.Succeeded }));
147
+ mockGetReportMappings.setup(async (x) => x(moq.It.isAny(), mockReportId)).returns(async () => ([{ imodelId: mockIModelId }]));
148
+ const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);
149
+ await sut.runReportExtractions([mockReportId]);
150
+ let result = await sut.getReportState(mockReportId);
151
+ assert.strictEqual(result, ExtractionStates.Queued);
152
+ result = await sut.getReportState(mockReportId);
153
+ assert.strictEqual(result, ExtractionStates.Running);
154
+ result = await sut.getReportState(mockReportId);
155
+ assert.strictEqual(result, ExtractionStates.Succeeded);
156
+ });
157
+ });
158
+ //# sourceMappingURL=BulkExtractor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BulkExtractor.test.js","sourceRoot":"","sources":["../../../src/test/BulkExtractor.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 BulkExtractor from \"../widget/components/BulkExtractor\";\nimport { ExtractionStates } from \"../widget/components/ExtractionStatus\";\nimport { assert } from \"chai\";\nimport * as moq from \"typemoq\";\nimport { ExtractorState } from \"@itwin/insights-client\";\nimport type { AccessToken } from \"@itwin/core-bentley\";\n\njest.mock(\"../widget/components/Constants.ts\", () => ({\n STATUS_CHECK_INTERVAL: -1,\n}));\n\njest.mock(\"../widget/components/ExtractionToast.tsx\", () => ({\n FailedExtractionToast: jest.fn(),\n SuccessfulExtractionToast: jest.fn(),\n}));\n\nconst mockRunExtraction = moq.Mock.ofType<(accessToken: AccessToken, iModelId: string) => Promise<{ id: string }>>();\nconst mockGetStatus = moq.Mock.ofType<(accessToken: AccessToken, jobId: string) => Promise<{ state: ExtractorState }>>();\nconst mockGetReportMappings = moq.Mock.ofType<(accessToken: AccessToken, reportId: string) => Promise<{ imodelId: string }[]>>();\n\njest.mock(\"@itwin/insights-client\", () => ({\n ...jest.requireActual(\"@itwin/insights-client\"),\n ReportsClient: jest.fn().mockImplementation(() => ({\n getReportMappings: mockGetReportMappings.object,\n })),\n ExtractionClient: jest.fn().mockImplementation(() => ({\n runExtraction: mockRunExtraction.object,\n getExtractionStatus: mockGetStatus.object,\n })),\n}));\n\nafterEach(() => {\n mockRunExtraction.reset();\n mockGetStatus.reset();\n});\n\nconst mockToastCallback = jest.fn();\n\nconst mockIModelId = \"mockIModelId\";\nconst mockIModelId1 = \"mockIModelId1\";\nconst mockReportId = \"mockReportId\";\nconst mockRunId = \"mockRunId\";\nconst mockRunId1 = \"mockRunId1\";\n\ndescribe(\"BulkExtractor\", () => {\n const mockApiConfig = {\n getAccessToken: async () => \"mockAccessToken\",\n baseUrl: \"\",\n };\n\n it(\"should return status none for unknown iModel\", async () => {\n const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);\n const result = await sut.getIModelState(mockIModelId, \"\", \"\");\n assert.strictEqual(result, ExtractionStates.None);\n });\n\n it(\"should return running status for started extraction\", async () => {\n mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId)).returns(\n async () => ({ id: mockRunId })\n );\n\n mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(\n async () => ({ state: ExtractorState.Running })\n );\n\n const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);\n await sut.runIModelExtraction(mockIModelId);\n const result = await sut.getIModelState(mockIModelId, \"\", \"\");\n assert.strictEqual(result, ExtractionStates.Running);\n });\n\n it(\"should return failed status for failed extraction\", async () => {\n mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId)).returns(\n async () => ({ id: mockRunId })\n );\n\n mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(\n async () => ({ state: ExtractorState.Failed })\n );\n\n const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);\n await sut.runIModelExtraction(mockIModelId);\n const result = await sut.getIModelState(mockIModelId, \"\", \"\");\n assert.strictEqual(result, ExtractionStates.Failed);\n });\n\n it(\"full status check cycle\", async () => {\n mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId)).returns(\n async () => ({ id: mockRunId })\n );\n\n mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(\n async () => ({ state: ExtractorState.Queued })\n );\n\n mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(\n async () => ({ state: ExtractorState.Running })\n );\n\n mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(\n async () => ({ state: ExtractorState.Succeeded })\n );\n\n const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);\n await sut.runIModelExtraction(mockIModelId);\n\n let result = await sut.getIModelState(mockIModelId, \"\", \"\");\n assert.strictEqual(result, ExtractionStates.Queued);\n\n result = await sut.getIModelState(mockIModelId, \"\", \"\");\n assert.strictEqual(result, ExtractionStates.Running);\n\n result = await sut.getIModelState(mockIModelId, \"\", \"\");\n assert.strictEqual(result, ExtractionStates.Succeeded);\n });\n\n it(\"two started jobs should return status\", async () => {\n const mockIModelIds = [mockIModelId, mockIModelId1];\n\n mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId)).returns(\n async () => ({ id: mockRunId })\n );\n\n mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId1)).returns(\n async () => ({ id: mockRunId1 })\n );\n\n mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(\n async () => ({ state: ExtractorState.Queued })\n );\n\n mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId1)).returns(\n async () => ({ state: ExtractorState.Queued })\n );\n\n const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);\n\n await sut.runIModelExtractions(mockIModelIds);\n\n const result1 = await sut.getIModelState(mockIModelId, \"\", \"\");\n const result2 = await sut.getIModelState(mockIModelId1, \"\", \"\");\n\n assert.strictEqual(result1, ExtractionStates.Queued);\n assert.strictEqual(result2, ExtractionStates.Queued);\n });\n\n it(\"should return status none for unknown report\", async () => {\n const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);\n const result = await sut.getReportState(mockReportId);\n assert.strictEqual(result, ExtractionStates.None);\n });\n\n it(\"should return status running for running report\", async () => {\n mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId)).returns(\n async () => ({ id: mockRunId })\n );\n\n mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(\n async () => ({ state: ExtractorState.Running })\n );\n\n mockGetReportMappings.setup(async (x) => x(moq.It.isAny(), mockReportId)).returns(\n async () => ([{ imodelId: mockIModelId }])\n );\n\n const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);\n\n await sut.runReportExtractions([mockReportId]);\n\n const result = await sut.getReportState(mockReportId);\n assert.strictEqual(result, ExtractionStates.Running);\n });\n\n it(\"should return status running for both iModels in report\", async () => {\n mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId)).returns(\n async () => ({ id: mockRunId })\n );\n\n mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId1)).returns(\n async () => ({ id: mockRunId1 })\n );\n\n mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(\n async () => ({ state: ExtractorState.Running })\n );\n\n mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId1)).returns(\n async () => ({ state: ExtractorState.Running })\n );\n\n mockGetReportMappings.setup(async (x) => x(moq.It.isAny(), mockReportId)).returns(\n async () => ([{ imodelId: mockIModelId }, { imodelId: mockIModelId1 }])\n );\n\n const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);\n\n await sut.runReportExtractions([mockReportId]);\n\n const result1 = await sut.getIModelState(mockIModelId, \"\", \"\");\n const result2 = await sut.getIModelState(mockIModelId1, \"\", \"\");\n\n assert.strictEqual(result1, ExtractionStates.Running);\n assert.strictEqual(result2, ExtractionStates.Running);\n });\n\n it(\"should return lowest progress status for extractions in report\", async () => {\n mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId)).returns(\n async () => ({ id: mockRunId })\n );\n\n mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId1)).returns(\n async () => ({ id: mockRunId1 })\n );\n\n mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(\n async () => ({ state: ExtractorState.Running })\n );\n\n mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId1)).returns(\n async () => ({ state: ExtractorState.Queued })\n );\n\n mockGetReportMappings.setup(async (x) => x(moq.It.isAny(), mockReportId)).returns(\n async () => ([{ imodelId: mockIModelId }, { imodelId: mockIModelId1 }])\n );\n\n const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);\n\n await sut.runReportExtractions([mockReportId]);\n\n const result = await sut.getReportState(mockReportId);\n assert.strictEqual(result, ExtractionStates.Queued);\n });\n\n it(\"should return status failed if one of the extractions in report failed\", async () => {\n mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId)).returns(\n async () => ({ id: mockRunId })\n );\n\n mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId1)).returns(\n async () => ({ id: mockRunId1 })\n );\n\n mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(\n async () => ({ state: ExtractorState.Succeeded })\n );\n\n mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId1)).returns(\n async () => ({ state: ExtractorState.Failed })\n );\n\n mockGetReportMappings.setup(async (x) => x(moq.It.isAny(), mockReportId)).returns(\n async () => ([{ imodelId: mockIModelId1 }, { imodelId: mockIModelId1 }])\n );\n\n const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);\n\n await sut.runReportExtractions([mockReportId]);\n\n const result = await sut.getReportState(mockReportId);\n assert.strictEqual(result, ExtractionStates.Failed);\n });\n\n it(\"full report extraction status check cycle\", async () => {\n mockRunExtraction.setup(async (x) => x(moq.It.isAny(), mockIModelId)).returns(\n async () => ({ id: mockRunId })\n );\n\n mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(\n async () => ({ state: ExtractorState.Queued })\n );\n\n mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(\n async () => ({ state: ExtractorState.Running })\n );\n\n mockGetStatus.setup(async (x) => x(moq.It.isAny(), mockRunId)).returns(\n async () => ({ state: ExtractorState.Succeeded })\n );\n\n mockGetReportMappings.setup(async (x) => x(moq.It.isAny(), mockReportId)).returns(\n async () => ([{ imodelId: mockIModelId }])\n );\n\n const sut = new BulkExtractor(mockApiConfig, mockToastCallback, mockToastCallback);\n await sut.runReportExtractions([mockReportId]);\n\n let result = await sut.getReportState(mockReportId);\n assert.strictEqual(result, ExtractionStates.Queued);\n\n result = await sut.getReportState(mockReportId);\n assert.strictEqual(result, ExtractionStates.Running);\n\n result = await sut.getReportState(mockReportId);\n assert.strictEqual(result, ExtractionStates.Succeeded);\n });\n});\n"]}
@@ -0,0 +1,2 @@
1
+ import "@testing-library/jest-dom";
2
+ //# sourceMappingURL=DeleteModal.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeleteModal.test.d.ts","sourceRoot":"","sources":["../../../src/test/DeleteModal.test.tsx"],"names":[],"mappings":"AAMA,OAAO,2BAA2B,CAAC"}
@@ -0,0 +1,69 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import React from "react";
6
+ import faker from "@faker-js/faker";
7
+ import "@testing-library/jest-dom";
8
+ import { NoRenderApp } from "@itwin/core-frontend";
9
+ import { render, screen, TestUtils, } from "./test-utils";
10
+ import * as moq from "typemoq";
11
+ import { Presentation, SelectionChangeEvent, } from "@itwin/presentation-frontend";
12
+ import DeleteModal from "../widget/components/DeleteModal";
13
+ import { ReportsConfigWidget } from "../ReportsConfigWidget";
14
+ import { EmptyLocalization } from "@itwin/core-common";
15
+ const mockITwinId = faker.datatype.uuid();
16
+ const mockIModelId1 = faker.datatype.uuid();
17
+ const connectionMock = moq.Mock.ofType();
18
+ const selectionManagerMock = moq.Mock.ofType();
19
+ const selectionScopesManagerMock = moq.Mock.ofType();
20
+ beforeAll(async () => {
21
+ await NoRenderApp.startup({ localization: new EmptyLocalization() });
22
+ await Presentation.initialize();
23
+ const selectionSet = moq.Mock.ofType();
24
+ const onChanged = moq.Mock.ofType();
25
+ selectionSet.setup((x) => x.elements).returns(() => new Set([]));
26
+ selectionSet.setup((x) => x.onChanged).returns(() => onChanged.object);
27
+ connectionMock
28
+ .setup((x) => x.selectionSet)
29
+ .returns(() => selectionSet.object);
30
+ connectionMock.setup((x) => x.iModelId).returns(() => mockIModelId1);
31
+ connectionMock.setup((x) => x.iTwinId).returns(() => mockITwinId);
32
+ selectionManagerMock
33
+ .setup((x) => x.selectionChange)
34
+ .returns(() => new SelectionChangeEvent());
35
+ selectionScopesManagerMock
36
+ .setup(async (x) => x.getSelectionScopes(connectionMock.object))
37
+ .returns(async () => []);
38
+ selectionManagerMock
39
+ .setup((x) => x.scopes)
40
+ .returns(() => selectionScopesManagerMock.object);
41
+ Presentation.setSelectionManager(selectionManagerMock.object);
42
+ await TestUtils.initializeUiFramework(connectionMock.object);
43
+ await ReportsConfigWidget.initialize();
44
+ });
45
+ describe("Delete modal", () => {
46
+ it("should render", () => {
47
+ const { container } = render(React.createElement(DeleteModal, { entityName: "test", show: true, setShow: jest.fn(), onDelete: jest.fn(), refresh: jest.fn() }));
48
+ expect(container).toBeTruthy();
49
+ });
50
+ it("should call onDelete when delete button is clicked", async () => {
51
+ const onDelete = jest.fn();
52
+ const { user } = render(React.createElement(DeleteModal, { entityName: "test", show: true, setShow: jest.fn(), onDelete: onDelete, refresh: jest.fn() }));
53
+ const deleteButton = screen.getByRole("button", {
54
+ name: /delete/i,
55
+ });
56
+ await user.click(deleteButton);
57
+ expect(onDelete).toHaveBeenCalled();
58
+ });
59
+ it("should call setShow when cancel button is clicked", async () => {
60
+ const setShow = jest.fn();
61
+ const { user } = render(React.createElement(DeleteModal, { entityName: "test", show: true, setShow: setShow, onDelete: jest.fn(), refresh: jest.fn() }));
62
+ const cancelButton = screen.getByRole("button", {
63
+ name: /cancel/i,
64
+ });
65
+ await user.click(cancelButton);
66
+ expect(setShow).toHaveBeenCalled();
67
+ });
68
+ });
69
+ //# sourceMappingURL=DeleteModal.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeleteModal.test.js","sourceRoot":"","sources":["../../../src/test/DeleteModal.test.tsx"],"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 React from \"react\";\nimport faker from \"@faker-js/faker\";\nimport \"@testing-library/jest-dom\";\nimport type {\n IModelConnection,\n SelectionSet,\n SelectionSetEvent,\n} from \"@itwin/core-frontend\";\nimport { NoRenderApp } from \"@itwin/core-frontend\";\nimport {\n render,\n screen,\n TestUtils,\n} from \"./test-utils\";\nimport * as moq from \"typemoq\";\nimport type {\n SelectionManager,\n SelectionScopesManager,\n} from \"@itwin/presentation-frontend\";\nimport {\n Presentation,\n SelectionChangeEvent,\n} from \"@itwin/presentation-frontend\";\nimport type { BeEvent } from \"@itwin/core-bentley\";\nimport DeleteModal from \"../widget/components/DeleteModal\";\nimport { ReportsConfigWidget } from \"../ReportsConfigWidget\";\nimport { EmptyLocalization } from \"@itwin/core-common\";\n\nconst mockITwinId = faker.datatype.uuid();\nconst mockIModelId1 = faker.datatype.uuid();\n\nconst connectionMock = moq.Mock.ofType<IModelConnection>();\nconst selectionManagerMock = moq.Mock.ofType<SelectionManager>();\nconst selectionScopesManagerMock = moq.Mock.ofType<SelectionScopesManager>();\n\nbeforeAll(async () => {\n await NoRenderApp.startup({localization: new EmptyLocalization()});\n await Presentation.initialize();\n const selectionSet = moq.Mock.ofType<SelectionSet>();\n const onChanged = moq.Mock.ofType<BeEvent<(ev: SelectionSetEvent) => void>>();\n selectionSet.setup((x) => x.elements).returns(() => new Set([]));\n selectionSet.setup((x) => x.onChanged).returns(() => onChanged.object);\n connectionMock\n .setup((x) => x.selectionSet)\n .returns(() => selectionSet.object);\n connectionMock.setup((x) => x.iModelId).returns(() => mockIModelId1);\n connectionMock.setup((x) => x.iTwinId).returns(() => mockITwinId);\n\n selectionManagerMock\n .setup((x) => x.selectionChange)\n .returns(() => new SelectionChangeEvent());\n\n selectionScopesManagerMock\n .setup(async (x) => x.getSelectionScopes(connectionMock.object))\n .returns(async () => []);\n selectionManagerMock\n .setup((x) => x.scopes)\n .returns(() => selectionScopesManagerMock.object);\n\n Presentation.setSelectionManager(selectionManagerMock.object);\n await TestUtils.initializeUiFramework(connectionMock.object);\n await ReportsConfigWidget.initialize();\n});\n\ndescribe(\"Delete modal\", () => {\n it(\"should render\", () => {\n const { container } = render(\n <DeleteModal\n entityName=\"test\"\n show={true}\n setShow={jest.fn()}\n onDelete={jest.fn()}\n refresh={jest.fn()}\n />\n );\n expect(container).toBeTruthy();\n });\n\n it(\"should call onDelete when delete button is clicked\", async () => {\n const onDelete = jest.fn();\n const { user } = render(\n <DeleteModal\n entityName=\"test\"\n show={true}\n setShow={jest.fn()}\n onDelete={onDelete}\n refresh={jest.fn()}\n />\n );\n const deleteButton = screen.getByRole(\"button\", {\n name: /delete/i,\n });\n await user.click(deleteButton);\n expect(onDelete).toHaveBeenCalled();\n });\n\n it(\"should call setShow when cancel button is clicked\", async () => {\n const setShow = jest.fn();\n const { user } = render(\n <DeleteModal\n entityName=\"test\"\n show={true}\n setShow={setShow}\n onDelete={jest.fn()}\n refresh={jest.fn()}\n />\n );\n const cancelButton = screen.getByRole(\"button\", {\n name: /cancel/i,\n });\n await user.click(cancelButton);\n expect(setShow).toHaveBeenCalled();\n });\n});\n"]}
@@ -15,6 +15,7 @@ import { rest } from "msw";
15
15
  import * as moq from "typemoq";
16
16
  import { REPORTS_CONFIG_BASE_URL } from "../widget/ReportsConfigUiProvider";
17
17
  import { Presentation, SelectionChangeEvent, } from "@itwin/presentation-frontend";
18
+ import { EmptyLocalization } from "@itwin/core-common";
18
19
  const mockITwinId = faker.datatype.uuid();
19
20
  const mockIModelId = faker.datatype.uuid();
20
21
  const connectionMock = moq.Mock.ofType();
@@ -29,9 +30,7 @@ jest.mock("@itwin/appui-react", () => ({
29
30
  }));
30
31
  const server = setupServer();
31
32
  beforeAll(async () => {
32
- // This is required by the i18n module within iTwin.js
33
- global.XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest; // eslint-disable-line @typescript-eslint/no-var-requires
34
- await NoRenderApp.startup();
33
+ await NoRenderApp.startup({ localization: new EmptyLocalization() });
35
34
  await Presentation.initialize();
36
35
  const selectionSet = moq.Mock.ofType();
37
36
  const onChanged = moq.Mock.ofType();