tm1npm 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (451) hide show
  1. package/.env.example +16 -0
  2. package/.eslintrc.js +28 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +36 -0
  4. package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  5. package/.github/ISSUE_TEMPLATE/question.md +24 -0
  6. package/.github/workflows/publish-npm.yml +53 -0
  7. package/.github/workflows/test-on-tag.yml +172 -0
  8. package/DEVELOPMENT_GUIDE.md +587 -0
  9. package/LICENSE +21 -0
  10. package/README.md +580 -0
  11. package/jest.ci.config.js +83 -0
  12. package/jest.config.js +68 -0
  13. package/lib/exceptions/TM1Exception.d.ts +17 -0
  14. package/lib/exceptions/TM1Exception.d.ts.map +1 -0
  15. package/lib/exceptions/TM1Exception.js +36 -0
  16. package/lib/exceptions/TM1RestException.d.ts +10 -0
  17. package/lib/exceptions/TM1RestException.d.ts.map +1 -0
  18. package/lib/exceptions/TM1RestException.js +17 -0
  19. package/lib/exceptions/TM1TimeoutException.d.ts +9 -0
  20. package/lib/exceptions/TM1TimeoutException.d.ts.map +1 -0
  21. package/lib/exceptions/TM1TimeoutException.js +16 -0
  22. package/lib/index.d.ts +41 -0
  23. package/lib/index.d.ts.map +1 -0
  24. package/lib/index.js +132 -0
  25. package/lib/objects/Annotation.d.ts +36 -0
  26. package/lib/objects/Annotation.d.ts.map +1 -0
  27. package/lib/objects/Annotation.js +134 -0
  28. package/lib/objects/Application.d.ts +67 -0
  29. package/lib/objects/Application.d.ts.map +1 -0
  30. package/lib/objects/Application.js +125 -0
  31. package/lib/objects/Axis.d.ts +36 -0
  32. package/lib/objects/Axis.d.ts.map +1 -0
  33. package/lib/objects/Axis.js +103 -0
  34. package/lib/objects/Chore.d.ts +43 -0
  35. package/lib/objects/Chore.d.ts.map +1 -0
  36. package/lib/objects/Chore.js +129 -0
  37. package/lib/objects/ChoreFrequency.d.ts +23 -0
  38. package/lib/objects/ChoreFrequency.d.ts.map +1 -0
  39. package/lib/objects/ChoreFrequency.js +61 -0
  40. package/lib/objects/ChoreStartTime.d.ts +15 -0
  41. package/lib/objects/ChoreStartTime.d.ts.map +1 -0
  42. package/lib/objects/ChoreStartTime.js +85 -0
  43. package/lib/objects/ChoreTask.d.ts +28 -0
  44. package/lib/objects/ChoreTask.d.ts.map +1 -0
  45. package/lib/objects/ChoreTask.js +66 -0
  46. package/lib/objects/Cube.d.ts +26 -0
  47. package/lib/objects/Cube.d.ts.map +1 -0
  48. package/lib/objects/Cube.js +109 -0
  49. package/lib/objects/Dimension.d.ts +26 -0
  50. package/lib/objects/Dimension.d.ts.map +1 -0
  51. package/lib/objects/Dimension.js +86 -0
  52. package/lib/objects/Element.d.ts +35 -0
  53. package/lib/objects/Element.d.ts.map +1 -0
  54. package/lib/objects/Element.js +115 -0
  55. package/lib/objects/ElementAttribute.d.ts +28 -0
  56. package/lib/objects/ElementAttribute.d.ts.map +1 -0
  57. package/lib/objects/ElementAttribute.js +97 -0
  58. package/lib/objects/Git.d.ts +21 -0
  59. package/lib/objects/Git.d.ts.map +1 -0
  60. package/lib/objects/Git.js +49 -0
  61. package/lib/objects/GitCommit.d.ts +12 -0
  62. package/lib/objects/GitCommit.d.ts.map +1 -0
  63. package/lib/objects/GitCommit.js +26 -0
  64. package/lib/objects/GitPlan.d.ts +35 -0
  65. package/lib/objects/GitPlan.d.ts.map +1 -0
  66. package/lib/objects/GitPlan.js +78 -0
  67. package/lib/objects/GitRemote.d.ts +12 -0
  68. package/lib/objects/GitRemote.d.ts.map +1 -0
  69. package/lib/objects/GitRemote.js +26 -0
  70. package/lib/objects/Hierarchy.d.ts +47 -0
  71. package/lib/objects/Hierarchy.d.ts.map +1 -0
  72. package/lib/objects/Hierarchy.js +165 -0
  73. package/lib/objects/MDXView.d.ts +19 -0
  74. package/lib/objects/MDXView.d.ts.map +1 -0
  75. package/lib/objects/MDXView.js +67 -0
  76. package/lib/objects/NativeView.d.ts +39 -0
  77. package/lib/objects/NativeView.d.ts.map +1 -0
  78. package/lib/objects/NativeView.js +209 -0
  79. package/lib/objects/Process.d.ts +70 -0
  80. package/lib/objects/Process.d.ts.map +1 -0
  81. package/lib/objects/Process.js +210 -0
  82. package/lib/objects/ProcessDebugBreakpoint.d.ts +60 -0
  83. package/lib/objects/ProcessDebugBreakpoint.d.ts.map +1 -0
  84. package/lib/objects/ProcessDebugBreakpoint.js +168 -0
  85. package/lib/objects/ProcessParameter.d.ts +23 -0
  86. package/lib/objects/ProcessParameter.d.ts.map +1 -0
  87. package/lib/objects/ProcessParameter.js +55 -0
  88. package/lib/objects/ProcessVariable.d.ts +26 -0
  89. package/lib/objects/ProcessVariable.d.ts.map +1 -0
  90. package/lib/objects/ProcessVariable.js +63 -0
  91. package/lib/objects/Rules.d.ts +30 -0
  92. package/lib/objects/Rules.d.ts.map +1 -0
  93. package/lib/objects/Rules.js +103 -0
  94. package/lib/objects/Sandbox.d.ts +21 -0
  95. package/lib/objects/Sandbox.d.ts.map +1 -0
  96. package/lib/objects/Sandbox.js +64 -0
  97. package/lib/objects/Server.d.ts +27 -0
  98. package/lib/objects/Server.d.ts.map +1 -0
  99. package/lib/objects/Server.js +26 -0
  100. package/lib/objects/Subset.d.ts +44 -0
  101. package/lib/objects/Subset.d.ts.map +1 -0
  102. package/lib/objects/Subset.js +222 -0
  103. package/lib/objects/TM1Object.d.ts +8 -0
  104. package/lib/objects/TM1Object.d.ts.map +1 -0
  105. package/lib/objects/TM1Object.js +17 -0
  106. package/lib/objects/TM1Project.d.ts +74 -0
  107. package/lib/objects/TM1Project.d.ts.map +1 -0
  108. package/lib/objects/TM1Project.js +409 -0
  109. package/lib/objects/User.d.ts +42 -0
  110. package/lib/objects/User.d.ts.map +1 -0
  111. package/lib/objects/User.js +157 -0
  112. package/lib/objects/View.d.ts +19 -0
  113. package/lib/objects/View.d.ts.map +1 -0
  114. package/lib/objects/View.js +33 -0
  115. package/lib/objects/index.d.ts +30 -0
  116. package/lib/objects/index.d.ts.map +1 -0
  117. package/lib/objects/index.js +68 -0
  118. package/lib/services/AnnotationService.d.ts +17 -0
  119. package/lib/services/AnnotationService.d.ts.map +1 -0
  120. package/lib/services/AnnotationService.js +91 -0
  121. package/lib/services/ApplicationService.d.ts +21 -0
  122. package/lib/services/ApplicationService.d.ts.map +1 -0
  123. package/lib/services/ApplicationService.js +227 -0
  124. package/lib/services/AuditLogService.d.ts +15 -0
  125. package/lib/services/AuditLogService.d.ts.map +1 -0
  126. package/lib/services/AuditLogService.js +153 -0
  127. package/lib/services/CellService.d.ts +191 -0
  128. package/lib/services/CellService.d.ts.map +1 -0
  129. package/lib/services/CellService.js +597 -0
  130. package/lib/services/ChoreService.d.ts +24 -0
  131. package/lib/services/ChoreService.d.ts.map +1 -0
  132. package/lib/services/ChoreService.js +219 -0
  133. package/lib/services/ConfigurationService.d.ts +18 -0
  134. package/lib/services/ConfigurationService.d.ts.map +1 -0
  135. package/lib/services/ConfigurationService.js +60 -0
  136. package/lib/services/CubeService.d.ts +43 -0
  137. package/lib/services/CubeService.d.ts.map +1 -0
  138. package/lib/services/CubeService.js +296 -0
  139. package/lib/services/DimensionService.d.ts +21 -0
  140. package/lib/services/DimensionService.d.ts.map +1 -0
  141. package/lib/services/DimensionService.js +146 -0
  142. package/lib/services/ElementService.d.ts +132 -0
  143. package/lib/services/ElementService.d.ts.map +1 -0
  144. package/lib/services/ElementService.js +579 -0
  145. package/lib/services/FileService.d.ts +14 -0
  146. package/lib/services/FileService.d.ts.map +1 -0
  147. package/lib/services/FileService.js +65 -0
  148. package/lib/services/GitService.d.ts +23 -0
  149. package/lib/services/GitService.d.ts.map +1 -0
  150. package/lib/services/GitService.js +225 -0
  151. package/lib/services/HierarchyService.d.ts +32 -0
  152. package/lib/services/HierarchyService.d.ts.map +1 -0
  153. package/lib/services/HierarchyService.js +235 -0
  154. package/lib/services/JobService.d.ts +13 -0
  155. package/lib/services/JobService.d.ts.map +1 -0
  156. package/lib/services/JobService.js +83 -0
  157. package/lib/services/LoggerService.d.ts +16 -0
  158. package/lib/services/LoggerService.d.ts.map +1 -0
  159. package/lib/services/LoggerService.js +101 -0
  160. package/lib/services/ManageService.d.ts +47 -0
  161. package/lib/services/ManageService.d.ts.map +1 -0
  162. package/lib/services/ManageService.js +221 -0
  163. package/lib/services/MessageLogService.d.ts +13 -0
  164. package/lib/services/MessageLogService.d.ts.map +1 -0
  165. package/lib/services/MessageLogService.js +175 -0
  166. package/lib/services/MonitoringService.d.ts +29 -0
  167. package/lib/services/MonitoringService.d.ts.map +1 -0
  168. package/lib/services/MonitoringService.js +86 -0
  169. package/lib/services/ObjectService.d.ts +8 -0
  170. package/lib/services/ObjectService.d.ts.map +1 -0
  171. package/lib/services/ObjectService.js +20 -0
  172. package/lib/services/PowerBiService.d.ts +13 -0
  173. package/lib/services/PowerBiService.d.ts.map +1 -0
  174. package/lib/services/PowerBiService.js +52 -0
  175. package/lib/services/ProcessService.d.ts +57 -0
  176. package/lib/services/ProcessService.d.ts.map +1 -0
  177. package/lib/services/ProcessService.js +499 -0
  178. package/lib/services/RestService.d.ts +68 -0
  179. package/lib/services/RestService.d.ts.map +1 -0
  180. package/lib/services/RestService.js +166 -0
  181. package/lib/services/SandboxService.d.ts +28 -0
  182. package/lib/services/SandboxService.d.ts.map +1 -0
  183. package/lib/services/SandboxService.js +197 -0
  184. package/lib/services/SecurityService.d.ts +33 -0
  185. package/lib/services/SecurityService.d.ts.map +1 -0
  186. package/lib/services/SecurityService.js +249 -0
  187. package/lib/services/ServerService.d.ts +55 -0
  188. package/lib/services/ServerService.d.ts.map +1 -0
  189. package/lib/services/ServerService.js +247 -0
  190. package/lib/services/SessionService.d.ts +15 -0
  191. package/lib/services/SessionService.d.ts.map +1 -0
  192. package/lib/services/SessionService.js +68 -0
  193. package/lib/services/SubsetService.d.ts +13 -0
  194. package/lib/services/SubsetService.d.ts.map +1 -0
  195. package/lib/services/SubsetService.js +46 -0
  196. package/lib/services/TM1Service.d.ts +39 -0
  197. package/lib/services/TM1Service.d.ts.map +1 -0
  198. package/lib/services/TM1Service.js +94 -0
  199. package/lib/services/ThreadService.d.ts +15 -0
  200. package/lib/services/ThreadService.d.ts.map +1 -0
  201. package/lib/services/ThreadService.js +104 -0
  202. package/lib/services/TransactionLogService.d.ts +11 -0
  203. package/lib/services/TransactionLogService.d.ts.map +1 -0
  204. package/lib/services/TransactionLogService.js +124 -0
  205. package/lib/services/UserService.d.ts +14 -0
  206. package/lib/services/UserService.d.ts.map +1 -0
  207. package/lib/services/UserService.js +103 -0
  208. package/lib/services/ViewService.d.ts +30 -0
  209. package/lib/services/ViewService.d.ts.map +1 -0
  210. package/lib/services/ViewService.js +331 -0
  211. package/lib/services/index.d.ts +26 -0
  212. package/lib/services/index.d.ts.map +1 -0
  213. package/lib/services/index.js +56 -0
  214. package/lib/tests/100PercentParityCheck.test.d.ts +6 -0
  215. package/lib/tests/100PercentParityCheck.test.d.ts.map +1 -0
  216. package/lib/tests/100PercentParityCheck.test.js +143 -0
  217. package/lib/tests/basic.test.d.ts +6 -0
  218. package/lib/tests/basic.test.d.ts.map +1 -0
  219. package/lib/tests/basic.test.js +52 -0
  220. package/lib/tests/cellService.test.d.ts +6 -0
  221. package/lib/tests/cellService.test.d.ts.map +1 -0
  222. package/lib/tests/cellService.test.js +311 -0
  223. package/lib/tests/ciSetup.d.ts +6 -0
  224. package/lib/tests/ciSetup.d.ts.map +1 -0
  225. package/lib/tests/ciSetup.js +23 -0
  226. package/lib/tests/comprehensive.service.test.d.ts +6 -0
  227. package/lib/tests/comprehensive.service.test.d.ts.map +1 -0
  228. package/lib/tests/comprehensive.service.test.js +507 -0
  229. package/lib/tests/connection.test.d.ts +6 -0
  230. package/lib/tests/connection.test.d.ts.map +1 -0
  231. package/lib/tests/connection.test.js +89 -0
  232. package/lib/tests/cubeService.test.d.ts +6 -0
  233. package/lib/tests/cubeService.test.d.ts.map +1 -0
  234. package/lib/tests/cubeService.test.js +368 -0
  235. package/lib/tests/dimensionService.comprehensive.test.d.ts +7 -0
  236. package/lib/tests/dimensionService.comprehensive.test.d.ts.map +1 -0
  237. package/lib/tests/dimensionService.comprehensive.test.js +614 -0
  238. package/lib/tests/dimensionService.test.d.ts +6 -0
  239. package/lib/tests/dimensionService.test.d.ts.map +1 -0
  240. package/lib/tests/dimensionService.test.js +293 -0
  241. package/lib/tests/edgeCases.test.d.ts +6 -0
  242. package/lib/tests/edgeCases.test.d.ts.map +1 -0
  243. package/lib/tests/edgeCases.test.js +301 -0
  244. package/lib/tests/elementService.comprehensive.test.d.ts +7 -0
  245. package/lib/tests/elementService.comprehensive.test.d.ts.map +1 -0
  246. package/lib/tests/elementService.comprehensive.test.js +846 -0
  247. package/lib/tests/elementService.test.d.ts +6 -0
  248. package/lib/tests/elementService.test.d.ts.map +1 -0
  249. package/lib/tests/elementService.test.js +350 -0
  250. package/lib/tests/enhancedCellService.test.d.ts +2 -0
  251. package/lib/tests/enhancedCellService.test.d.ts.map +1 -0
  252. package/lib/tests/enhancedCellService.test.js +152 -0
  253. package/lib/tests/enhancedCubeService.test.d.ts +2 -0
  254. package/lib/tests/enhancedCubeService.test.d.ts.map +1 -0
  255. package/lib/tests/enhancedCubeService.test.js +246 -0
  256. package/lib/tests/enhancedElementService.test.d.ts +2 -0
  257. package/lib/tests/enhancedElementService.test.d.ts.map +1 -0
  258. package/lib/tests/enhancedElementService.test.js +199 -0
  259. package/lib/tests/enhancedViewService.test.d.ts +2 -0
  260. package/lib/tests/enhancedViewService.test.d.ts.map +1 -0
  261. package/lib/tests/enhancedViewService.test.js +260 -0
  262. package/lib/tests/errorHandling.test.d.ts +6 -0
  263. package/lib/tests/errorHandling.test.d.ts.map +1 -0
  264. package/lib/tests/errorHandling.test.js +227 -0
  265. package/lib/tests/exceptions.test.d.ts +7 -0
  266. package/lib/tests/exceptions.test.d.ts.map +1 -0
  267. package/lib/tests/exceptions.test.js +257 -0
  268. package/lib/tests/hierarchyService.test.d.ts +6 -0
  269. package/lib/tests/hierarchyService.test.d.ts.map +1 -0
  270. package/lib/tests/hierarchyService.test.js +294 -0
  271. package/lib/tests/index.test.d.ts +6 -0
  272. package/lib/tests/index.test.d.ts.map +1 -0
  273. package/lib/tests/index.test.js +346 -0
  274. package/lib/tests/integration.test.d.ts +6 -0
  275. package/lib/tests/integration.test.d.ts.map +1 -0
  276. package/lib/tests/integration.test.js +302 -0
  277. package/lib/tests/integrationTests.test.d.ts +2 -0
  278. package/lib/tests/integrationTests.test.d.ts.map +1 -0
  279. package/lib/tests/integrationTests.test.js +252 -0
  280. package/lib/tests/mdx.advanced.test.d.ts +6 -0
  281. package/lib/tests/mdx.advanced.test.d.ts.map +1 -0
  282. package/lib/tests/mdx.advanced.test.js +437 -0
  283. package/lib/tests/objects.improved.test.d.ts +7 -0
  284. package/lib/tests/objects.improved.test.d.ts.map +1 -0
  285. package/lib/tests/objects.improved.test.js +302 -0
  286. package/lib/tests/performance.test.d.ts +6 -0
  287. package/lib/tests/performance.test.d.ts.map +1 -0
  288. package/lib/tests/performance.test.js +264 -0
  289. package/lib/tests/processService.comprehensive.test.d.ts +7 -0
  290. package/lib/tests/processService.comprehensive.test.d.ts.map +1 -0
  291. package/lib/tests/processService.comprehensive.test.js +656 -0
  292. package/lib/tests/processService.test.d.ts +6 -0
  293. package/lib/tests/processService.test.d.ts.map +1 -0
  294. package/lib/tests/processService.test.js +322 -0
  295. package/lib/tests/restService.test.d.ts +6 -0
  296. package/lib/tests/restService.test.d.ts.map +1 -0
  297. package/lib/tests/restService.test.js +177 -0
  298. package/lib/tests/security.advanced.test.d.ts +6 -0
  299. package/lib/tests/security.advanced.test.d.ts.map +1 -0
  300. package/lib/tests/security.advanced.test.js +407 -0
  301. package/lib/tests/security.test.d.ts +6 -0
  302. package/lib/tests/security.test.d.ts.map +1 -0
  303. package/lib/tests/security.test.js +204 -0
  304. package/lib/tests/securityService.comprehensive.test.d.ts +7 -0
  305. package/lib/tests/securityService.comprehensive.test.d.ts.map +1 -0
  306. package/lib/tests/securityService.comprehensive.test.js +457 -0
  307. package/lib/tests/setup.d.ts +4 -0
  308. package/lib/tests/setup.d.ts.map +1 -0
  309. package/lib/tests/setup.js +40 -0
  310. package/lib/tests/simpleCoverage.test.d.ts +6 -0
  311. package/lib/tests/simpleCoverage.test.d.ts.map +1 -0
  312. package/lib/tests/simpleCoverage.test.js +236 -0
  313. package/lib/tests/stress.performance.test.d.ts +6 -0
  314. package/lib/tests/stress.performance.test.d.ts.map +1 -0
  315. package/lib/tests/stress.performance.test.js +423 -0
  316. package/lib/tests/subsetService.test.d.ts +6 -0
  317. package/lib/tests/subsetService.test.d.ts.map +1 -0
  318. package/lib/tests/subsetService.test.js +271 -0
  319. package/lib/tests/testConfig.d.ts +18 -0
  320. package/lib/tests/testConfig.d.ts.map +1 -0
  321. package/lib/tests/testConfig.js +38 -0
  322. package/lib/tests/testUtils.d.ts +9 -0
  323. package/lib/tests/testUtils.d.ts.map +1 -0
  324. package/lib/tests/testUtils.js +100 -0
  325. package/lib/tests/tm1Service.test.d.ts +7 -0
  326. package/lib/tests/tm1Service.test.d.ts.map +1 -0
  327. package/lib/tests/tm1Service.test.js +290 -0
  328. package/lib/tests/viewService.test.d.ts +6 -0
  329. package/lib/tests/viewService.test.d.ts.map +1 -0
  330. package/lib/tests/viewService.test.js +240 -0
  331. package/lib/utils/Utils.d.ts +90 -0
  332. package/lib/utils/Utils.d.ts.map +1 -0
  333. package/lib/utils/Utils.js +379 -0
  334. package/package.json +81 -0
  335. package/run-all-tests.js +296 -0
  336. package/src/exceptions/TM1Exception.ts +38 -0
  337. package/src/exceptions/TM1RestException.ts +17 -0
  338. package/src/exceptions/TM1TimeoutException.ts +15 -0
  339. package/src/index.ts +94 -0
  340. package/src/objects/Annotation.ts +194 -0
  341. package/src/objects/Application.ts +146 -0
  342. package/src/objects/Axis.ts +149 -0
  343. package/src/objects/Chore.ts +174 -0
  344. package/src/objects/ChoreFrequency.ts +83 -0
  345. package/src/objects/ChoreStartTime.ts +111 -0
  346. package/src/objects/ChoreTask.ts +92 -0
  347. package/src/objects/Cube.ts +125 -0
  348. package/src/objects/Dimension.ts +107 -0
  349. package/src/objects/Element.ts +153 -0
  350. package/src/objects/ElementAttribute.ts +115 -0
  351. package/src/objects/Git.ts +86 -0
  352. package/src/objects/GitCommit.ts +31 -0
  353. package/src/objects/GitPlan.ts +121 -0
  354. package/src/objects/GitRemote.ts +31 -0
  355. package/src/objects/Hierarchy.ts +229 -0
  356. package/src/objects/MDXView.ts +91 -0
  357. package/src/objects/NativeView.ts +268 -0
  358. package/src/objects/Process.ts +320 -0
  359. package/src/objects/ProcessDebugBreakpoint.ts +239 -0
  360. package/src/objects/ProcessParameter.ts +76 -0
  361. package/src/objects/ProcessVariable.ts +89 -0
  362. package/src/objects/Rules.ts +117 -0
  363. package/src/objects/Sandbox.ts +90 -0
  364. package/src/objects/Server.ts +45 -0
  365. package/src/objects/Subset.ts +323 -0
  366. package/src/objects/TM1Object.ts +17 -0
  367. package/src/objects/TM1Project.ts +587 -0
  368. package/src/objects/User.ts +198 -0
  369. package/src/objects/View.ts +43 -0
  370. package/src/objects/index.ts +36 -0
  371. package/src/services/AnnotationService.ts +107 -0
  372. package/src/services/ApplicationService.ts +279 -0
  373. package/src/services/AuditLogService.ts +172 -0
  374. package/src/services/CellService.ts +814 -0
  375. package/src/services/ChoreService.ts +219 -0
  376. package/src/services/ConfigurationService.ts +69 -0
  377. package/src/services/CubeService.ts +338 -0
  378. package/src/services/DimensionService.ts +168 -0
  379. package/src/services/ElementService.ts +966 -0
  380. package/src/services/FileService.ts +67 -0
  381. package/src/services/GitService.ts +324 -0
  382. package/src/services/HierarchyService.ts +284 -0
  383. package/src/services/JobService.ts +59 -0
  384. package/src/services/LoggerService.ts +118 -0
  385. package/src/services/ManageService.ts +322 -0
  386. package/src/services/MessageLogService.ts +211 -0
  387. package/src/services/MonitoringService.ts +105 -0
  388. package/src/services/ObjectService.ts +21 -0
  389. package/src/services/PowerBiService.ts +85 -0
  390. package/src/services/ProcessService.ts +589 -0
  391. package/src/services/RestService.ts +224 -0
  392. package/src/services/SandboxService.ts +217 -0
  393. package/src/services/SecurityService.ts +284 -0
  394. package/src/services/ServerService.ts +313 -0
  395. package/src/services/SessionService.ts +81 -0
  396. package/src/services/SubsetService.ts +52 -0
  397. package/src/services/TM1Service.ts +133 -0
  398. package/src/services/ThreadService.ts +83 -0
  399. package/src/services/TransactionLogService.ts +148 -0
  400. package/src/services/UserService.ts +77 -0
  401. package/src/services/ViewService.ts +398 -0
  402. package/src/services/index.ts +28 -0
  403. package/src/tests/100PercentParityCheck.test.ts +166 -0
  404. package/src/tests/basic.test.ts +59 -0
  405. package/src/tests/cellService.test.ts +405 -0
  406. package/src/tests/ciSetup.ts +26 -0
  407. package/src/tests/comprehensive.service.test.ts +653 -0
  408. package/src/tests/config.ini.template +23 -0
  409. package/src/tests/connection.test.ts +90 -0
  410. package/src/tests/cubeService.test.ts +458 -0
  411. package/src/tests/dimensionService.comprehensive.test.ts +786 -0
  412. package/src/tests/dimensionService.test.ts +373 -0
  413. package/src/tests/edgeCases.test.ts +358 -0
  414. package/src/tests/elementService.comprehensive.test.ts +1190 -0
  415. package/src/tests/elementService.test.ts +472 -0
  416. package/src/tests/enhancedCellService.test.ts +237 -0
  417. package/src/tests/enhancedCubeService.test.ts +384 -0
  418. package/src/tests/enhancedElementService.test.ts +301 -0
  419. package/src/tests/enhancedViewService.test.ts +373 -0
  420. package/src/tests/errorHandling.test.ts +264 -0
  421. package/src/tests/exceptions.test.ts +313 -0
  422. package/src/tests/hierarchyService.test.ts +386 -0
  423. package/src/tests/index.test.ts +376 -0
  424. package/src/tests/integration.test.ts +333 -0
  425. package/src/tests/integrationTests.test.ts +302 -0
  426. package/src/tests/mdx.advanced.test.ts +513 -0
  427. package/src/tests/objects.improved.test.ts +385 -0
  428. package/src/tests/performance.test.ts +314 -0
  429. package/src/tests/processService.comprehensive.test.ts +933 -0
  430. package/src/tests/processService.test.ts +409 -0
  431. package/src/tests/restService.test.ts +218 -0
  432. package/src/tests/security.advanced.test.ts +464 -0
  433. package/src/tests/security.test.ts +233 -0
  434. package/src/tests/securityService.comprehensive.test.ts +582 -0
  435. package/src/tests/setup.ts +42 -0
  436. package/src/tests/simpleCoverage.test.ts +287 -0
  437. package/src/tests/stress.performance.test.ts +531 -0
  438. package/src/tests/subsetService.test.ts +350 -0
  439. package/src/tests/testConfig.ts +53 -0
  440. package/src/tests/testUtils.ts +94 -0
  441. package/src/tests/tm1Service.test.ts +361 -0
  442. package/src/tests/viewService.test.ts +324 -0
  443. package/src/utils/Utils.ts +395 -0
  444. package/tests/README.md +57 -0
  445. package/tests/connection/test-connection.ts +86 -0
  446. package/tests/edge-cases/edge-cases-test.ts +244 -0
  447. package/tests/integration/working-test.ts +193 -0
  448. package/tests/performance/performance-test.ts +133 -0
  449. package/tests/run-all-tests.sh +106 -0
  450. package/tests/security/security-test.ts +103 -0
  451. package/tsconfig.json +20 -0
@@ -0,0 +1,614 @@
1
+ "use strict";
2
+ /**
3
+ * Comprehensive DimensionService Tests
4
+ * Target: Achieve 80%+ coverage for DimensionService (currently 45%)
5
+ * Testing all dimension operations including CRUD, hierarchy management, and service integration
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ const DimensionService_1 = require("../services/DimensionService");
9
+ const HierarchyService_1 = require("../services/HierarchyService");
10
+ const SubsetService_1 = require("../services/SubsetService");
11
+ const Dimension_1 = require("../objects/Dimension");
12
+ const TM1Exception_1 = require("../exceptions/TM1Exception");
13
+ // Mock dependencies
14
+ jest.mock('../services/HierarchyService');
15
+ jest.mock('../services/SubsetService');
16
+ jest.mock('../objects/Dimension');
17
+ jest.mock('../objects/Hierarchy');
18
+ describe('DimensionService - Comprehensive Tests', () => {
19
+ let dimensionService;
20
+ let mockRestService;
21
+ let mockHierarchyService;
22
+ let mockSubsetService;
23
+ const mockResponse = (data) => ({
24
+ data: data,
25
+ status: 200,
26
+ statusText: 'OK',
27
+ headers: {},
28
+ config: { headers: {} }
29
+ });
30
+ const mockDimension = {
31
+ name: 'TestDimension',
32
+ hierarchies: [
33
+ { name: 'TestDimension', dimensionName: 'TestDimension' },
34
+ { name: 'AltHierarchy', dimensionName: 'TestDimension' }
35
+ ],
36
+ hierarchyNames: ['TestDimension', 'AltHierarchy'],
37
+ defaultHierarchy: { name: 'TestDimension', dimensionName: 'TestDimension' },
38
+ body: {
39
+ Name: 'TestDimension',
40
+ Hierarchies: [
41
+ { Name: 'TestDimension' },
42
+ { Name: 'AltHierarchy' }
43
+ ]
44
+ },
45
+ addHierarchy: jest.fn(),
46
+ [Symbol.iterator]: function* () {
47
+ yield* this.hierarchies;
48
+ }
49
+ };
50
+ const mockHierarchy = {
51
+ name: 'TestHierarchy',
52
+ dimensionName: 'TestDimension'
53
+ };
54
+ beforeEach(() => {
55
+ mockRestService = {
56
+ get: jest.fn(),
57
+ post: jest.fn(),
58
+ patch: jest.fn(),
59
+ put: jest.fn(),
60
+ delete: jest.fn()
61
+ };
62
+ // Mock the constructor-injected services
63
+ mockHierarchyService = {
64
+ getAllNames: jest.fn(),
65
+ exists: jest.fn(),
66
+ update: jest.fn(),
67
+ create: jest.fn(),
68
+ delete: jest.fn(),
69
+ updateElementAttributes: jest.fn()
70
+ };
71
+ mockSubsetService = {};
72
+ // Mock the service constructors to return our mocks
73
+ HierarchyService_1.HierarchyService.mockImplementation(() => mockHierarchyService);
74
+ SubsetService_1.SubsetService.mockImplementation(() => mockSubsetService);
75
+ dimensionService = new DimensionService_1.DimensionService(mockRestService);
76
+ // Mock Dimension.fromJSON and fromDict
77
+ Dimension_1.Dimension.fromJSON = jest.fn().mockReturnValue(mockDimension);
78
+ Dimension_1.Dimension.fromDict = jest.fn().mockReturnValue(mockDimension);
79
+ // Note: formatUrl and caseAndSpaceInsensitiveEquals are inherited from ObjectService
80
+ });
81
+ afterEach(() => {
82
+ jest.clearAllMocks();
83
+ jest.restoreAllMocks();
84
+ });
85
+ describe('Constructor and Initialization', () => {
86
+ test('should initialize DimensionService with sub-services', () => {
87
+ expect(dimensionService).toBeDefined();
88
+ expect(dimensionService).toBeInstanceOf(DimensionService_1.DimensionService);
89
+ expect(HierarchyService_1.HierarchyService).toHaveBeenCalledWith(mockRestService);
90
+ expect(SubsetService_1.SubsetService).toHaveBeenCalledWith(mockRestService);
91
+ });
92
+ test('should extend ObjectService', () => {
93
+ expect(dimensionService).toBeInstanceOf(DimensionService_1.DimensionService);
94
+ });
95
+ });
96
+ describe('Dimension CRUD Operations', () => {
97
+ test('should create dimension successfully', async () => {
98
+ jest.spyOn(dimensionService, 'exists').mockResolvedValue(false);
99
+ mockRestService.post.mockResolvedValue(mockResponse({}));
100
+ mockHierarchyService.updateElementAttributes.mockResolvedValue();
101
+ const result = await dimensionService.create(mockDimension);
102
+ expect(dimensionService.exists).toHaveBeenCalledWith('TestDimension');
103
+ expect(mockRestService.post).toHaveBeenCalledWith('/Dimensions', mockDimension.body);
104
+ expect(mockHierarchyService.updateElementAttributes).toHaveBeenCalledTimes(2); // For non-Leaves hierarchies
105
+ expect(result).toBeDefined();
106
+ });
107
+ test('should throw error when creating existing dimension', async () => {
108
+ jest.spyOn(dimensionService, 'exists').mockResolvedValue(true);
109
+ await expect(dimensionService.create(mockDimension))
110
+ .rejects.toThrow("Dimension 'TestDimension' already exists");
111
+ expect(mockRestService.post).not.toHaveBeenCalled();
112
+ });
113
+ test('should handle creation failure and cleanup', async () => {
114
+ jest.spyOn(dimensionService, 'exists')
115
+ .mockResolvedValueOnce(false) // Initial check
116
+ .mockResolvedValueOnce(true); // Check during cleanup
117
+ jest.spyOn(dimensionService, 'delete').mockResolvedValue(mockResponse({}));
118
+ const error = new Error('Creation failed');
119
+ mockRestService.post.mockRejectedValue(error);
120
+ await expect(dimensionService.create(mockDimension)).rejects.toThrow('Creation failed');
121
+ expect(dimensionService.delete).toHaveBeenCalledWith('TestDimension');
122
+ });
123
+ test('should skip Leaves hierarchy during creation', async () => {
124
+ const dimensionWithLeaves = {
125
+ ...mockDimension,
126
+ hierarchies: [
127
+ { name: 'TestDimension', dimensionName: 'TestDimension' },
128
+ { name: 'Leaves', dimensionName: 'TestDimension' },
129
+ { name: 'AltHierarchy', dimensionName: 'TestDimension' }
130
+ ],
131
+ [Symbol.iterator]: function* () {
132
+ yield* this.hierarchies;
133
+ }
134
+ };
135
+ jest.spyOn(dimensionService, 'exists').mockResolvedValue(false);
136
+ mockRestService.post.mockResolvedValue(mockResponse({}));
137
+ mockHierarchyService.updateElementAttributes.mockResolvedValue();
138
+ await dimensionService.create(dimensionWithLeaves);
139
+ // Should skip 'Leaves' hierarchy, so only 2 calls instead of 3
140
+ expect(mockHierarchyService.updateElementAttributes).toHaveBeenCalledTimes(2);
141
+ });
142
+ test('should get dimension by name', async () => {
143
+ const dimensionData = {
144
+ Name: 'TestDimension',
145
+ Hierarchies: [{ Name: 'TestDimension' }]
146
+ };
147
+ mockRestService.get.mockResolvedValue(mockResponse(dimensionData));
148
+ const result = await dimensionService.get('TestDimension');
149
+ expect(mockRestService.get).toHaveBeenCalledWith("/Dimensions('TestDimension')?$expand=Hierarchies($expand=*)");
150
+ expect(Dimension_1.Dimension.fromJSON).toHaveBeenCalledWith(JSON.stringify(dimensionData));
151
+ expect(result).toEqual(mockDimension);
152
+ });
153
+ test('should update dimension with existing hierarchies', async () => {
154
+ mockHierarchyService.getAllNames.mockResolvedValue(['TestDimension', 'OldHierarchy', 'AltHierarchy']);
155
+ mockHierarchyService.exists.mockResolvedValue(true);
156
+ mockHierarchyService.update.mockResolvedValue();
157
+ mockHierarchyService.delete.mockResolvedValue(mockResponse({}));
158
+ await dimensionService.update(mockDimension);
159
+ expect(mockHierarchyService.getAllNames).toHaveBeenCalledWith('TestDimension');
160
+ expect(mockHierarchyService.update).toHaveBeenCalledTimes(2); // For TestDimension and AltHierarchy
161
+ expect(mockHierarchyService.delete).toHaveBeenCalledWith('TestDimension', 'OldHierarchy'); // Remove old hierarchy
162
+ });
163
+ test('should update dimension and create new hierarchies', async () => {
164
+ mockHierarchyService.getAllNames.mockResolvedValue(['TestDimension']);
165
+ mockHierarchyService.exists
166
+ .mockResolvedValueOnce(true) // TestDimension exists
167
+ .mockResolvedValueOnce(false); // AltHierarchy doesn't exist
168
+ mockHierarchyService.update.mockResolvedValue();
169
+ mockHierarchyService.create.mockResolvedValue(mockResponse({}));
170
+ await dimensionService.update(mockDimension);
171
+ expect(mockHierarchyService.update).toHaveBeenCalledTimes(1); // For existing TestDimension
172
+ expect(mockHierarchyService.create).toHaveBeenCalledTimes(1); // For new AltHierarchy
173
+ });
174
+ test('should update dimension with keepExistingAttributes flag', async () => {
175
+ mockHierarchyService.getAllNames.mockResolvedValue(['TestDimension']);
176
+ mockHierarchyService.exists.mockResolvedValue(true);
177
+ mockHierarchyService.update.mockResolvedValue();
178
+ await dimensionService.update(mockDimension, true);
179
+ expect(mockHierarchyService.update).toHaveBeenCalledWith(mockDimension.hierarchies[0], true // keepExistingAttributes
180
+ );
181
+ });
182
+ test('should skip Leaves hierarchy during update', async () => {
183
+ const dimensionWithLeaves = {
184
+ ...mockDimension,
185
+ hierarchies: [
186
+ { name: 'TestDimension', dimensionName: 'TestDimension' },
187
+ { name: 'Leaves', dimensionName: 'TestDimension' }
188
+ ],
189
+ hierarchyNames: ['TestDimension', 'Leaves'],
190
+ [Symbol.iterator]: function* () {
191
+ yield* this.hierarchies;
192
+ }
193
+ };
194
+ mockHierarchyService.getAllNames.mockResolvedValue(['TestDimension', 'Leaves']);
195
+ mockHierarchyService.exists.mockResolvedValue(true);
196
+ mockHierarchyService.update.mockResolvedValue();
197
+ await dimensionService.update(dimensionWithLeaves);
198
+ // Should only update TestDimension, skip Leaves
199
+ expect(mockHierarchyService.update).toHaveBeenCalledTimes(1);
200
+ expect(mockHierarchyService.delete).not.toHaveBeenCalledWith('TestDimension', 'Leaves');
201
+ });
202
+ test('should delete dimension', async () => {
203
+ mockRestService.delete.mockResolvedValue(mockResponse({}));
204
+ const result = await dimensionService.delete('TestDimension');
205
+ expect(mockRestService.delete).toHaveBeenCalledWith("/Dimensions('TestDimension')");
206
+ expect(result).toBeDefined();
207
+ });
208
+ test('should check if dimension exists', async () => {
209
+ mockRestService.get.mockResolvedValue(mockResponse({}));
210
+ const result = await dimensionService.exists('TestDimension');
211
+ expect(result).toBe(true);
212
+ expect(mockRestService.get).toHaveBeenCalledWith("/Dimensions('TestDimension')");
213
+ });
214
+ test('should return false when dimension does not exist', async () => {
215
+ const error = new TM1Exception_1.TM1RestException('Not found', 404);
216
+ error.statusCode = 404; // Set the statusCode property that DimensionService checks
217
+ mockRestService.get.mockRejectedValue(error);
218
+ const result = await dimensionService.exists('NonExistent');
219
+ expect(result).toBe(false);
220
+ });
221
+ test('should throw error for non-404 errors in exists check', async () => {
222
+ const error = new TM1Exception_1.TM1RestException('Server error', 500);
223
+ mockRestService.get.mockRejectedValue(error);
224
+ await expect(dimensionService.exists('TestDimension')).rejects.toThrow('Server error');
225
+ });
226
+ });
227
+ describe('Dimension Retrieval Operations', () => {
228
+ test('should get all dimension names', async () => {
229
+ const dimensionsData = {
230
+ value: [
231
+ { Name: 'Dimension1' },
232
+ { Name: 'Dimension2' },
233
+ { Name: '}Stats' }
234
+ ]
235
+ };
236
+ mockRestService.get.mockResolvedValue(mockResponse(dimensionsData));
237
+ const result = await dimensionService.getAllNames();
238
+ expect(result).toEqual(['Dimension1', 'Dimension2', '}Stats']);
239
+ expect(mockRestService.get).toHaveBeenCalledWith('/Dimensions?$select=Name');
240
+ });
241
+ test('should get all dimension names excluding control dimensions', async () => {
242
+ const dimensionsData = {
243
+ value: [
244
+ { Name: 'Dimension1' },
245
+ { Name: 'Dimension2' }
246
+ ]
247
+ };
248
+ mockRestService.get.mockResolvedValue(mockResponse(dimensionsData));
249
+ const result = await dimensionService.getAllNames(true);
250
+ expect(result).toEqual(['Dimension1', 'Dimension2']);
251
+ expect(mockRestService.get).toHaveBeenCalledWith("/Dimensions?$select=Name&$filter=not startswith(Name,'}')");
252
+ });
253
+ test('should get all dimensions', async () => {
254
+ const dimensionsData = {
255
+ value: [
256
+ { Name: 'Dimension1', Hierarchies: [{ Name: 'Dimension1' }] },
257
+ { Name: 'Dimension2', Hierarchies: [{ Name: 'Dimension2' }] }
258
+ ]
259
+ };
260
+ mockRestService.get.mockResolvedValue(mockResponse(dimensionsData));
261
+ const result = await dimensionService.getAll();
262
+ expect(result).toHaveLength(2);
263
+ expect(Dimension_1.Dimension.fromDict).toHaveBeenCalledTimes(2);
264
+ expect(mockRestService.get).toHaveBeenCalledWith('/Dimensions?$expand=Hierarchies($expand=*)');
265
+ });
266
+ test('should get all dimensions excluding control dimensions', async () => {
267
+ const dimensionsData = {
268
+ value: [
269
+ { Name: 'Dimension1', Hierarchies: [{ Name: 'Dimension1' }] }
270
+ ]
271
+ };
272
+ mockRestService.get.mockResolvedValue(mockResponse(dimensionsData));
273
+ const result = await dimensionService.getAll(true);
274
+ expect(result).toHaveLength(1);
275
+ expect(mockRestService.get).toHaveBeenCalledWith("/Dimensions?$expand=Hierarchies($expand=*)&$filter=not startswith(Name,'}')");
276
+ });
277
+ test('should get dimension names from cube', async () => {
278
+ const cubeData = {
279
+ Dimensions: [
280
+ { Name: 'Time' },
281
+ { Name: 'Account' },
282
+ { Name: 'Version' }
283
+ ]
284
+ };
285
+ mockRestService.get.mockResolvedValue(mockResponse(cubeData));
286
+ const result = await dimensionService.getDimensionNames('SalesCube');
287
+ expect(result).toEqual(['Time', 'Account', 'Version']);
288
+ expect(mockRestService.get).toHaveBeenCalledWith("/Cubes('SalesCube')?$select=Dimensions");
289
+ });
290
+ });
291
+ describe('Dimension Cloning Operations', () => {
292
+ test('should clone dimension with all hierarchies', async () => {
293
+ jest.spyOn(dimensionService, 'exists').mockResolvedValue(false);
294
+ jest.spyOn(dimensionService, 'get').mockResolvedValue(mockDimension);
295
+ jest.spyOn(dimensionService, 'create').mockResolvedValue(mockResponse({}));
296
+ const result = await dimensionService.clone('SourceDim', 'TargetDim', true);
297
+ expect(dimensionService.exists).toHaveBeenCalledWith('TargetDim');
298
+ expect(dimensionService.get).toHaveBeenCalledWith('SourceDim');
299
+ expect(dimensionService.create).toHaveBeenCalled();
300
+ expect(result).toBeDefined();
301
+ });
302
+ test('should clone dimension without additional hierarchies', async () => {
303
+ const sourceDimensionWithMultipleHierarchies = {
304
+ ...mockDimension,
305
+ hierarchies: [
306
+ { name: 'SourceDim', dimensionName: 'SourceDim' },
307
+ { name: 'AltHierarchy', dimensionName: 'SourceDim' },
308
+ { name: 'AnotherHierarchy', dimensionName: 'SourceDim' }
309
+ ],
310
+ defaultHierarchy: { name: 'SourceDim', dimensionName: 'SourceDim' },
311
+ addHierarchy: jest.fn()
312
+ };
313
+ jest.spyOn(dimensionService, 'exists').mockResolvedValue(false);
314
+ jest.spyOn(dimensionService, 'get').mockResolvedValue(sourceDimensionWithMultipleHierarchies);
315
+ jest.spyOn(dimensionService, 'create').mockResolvedValue(mockResponse({}));
316
+ await dimensionService.clone('SourceDim', 'TargetDim', false);
317
+ expect(sourceDimensionWithMultipleHierarchies.hierarchies.length).toBe(0);
318
+ expect(sourceDimensionWithMultipleHierarchies.addHierarchy).toHaveBeenCalledWith(expect.objectContaining({ name: 'TargetDim' }));
319
+ });
320
+ test('should rename hierarchies to match target dimension name', async () => {
321
+ const sourceDimension = {
322
+ name: 'SourceDim',
323
+ hierarchies: [
324
+ { name: 'SourceDim', dimensionName: 'SourceDim' }, // Should be renamed
325
+ { name: 'CustomHierarchy', dimensionName: 'SourceDim' } // Should not be renamed
326
+ ],
327
+ hierarchyNames: ['SourceDim', 'CustomHierarchy'],
328
+ defaultHierarchy: { name: 'SourceDim', dimensionName: 'SourceDim' },
329
+ body: {},
330
+ addHierarchy: jest.fn(),
331
+ [Symbol.iterator]: function* () {
332
+ yield* this.hierarchies;
333
+ }
334
+ };
335
+ jest.spyOn(dimensionService, 'exists').mockResolvedValue(false);
336
+ jest.spyOn(dimensionService, 'get').mockResolvedValue(sourceDimension);
337
+ jest.spyOn(dimensionService, 'create').mockResolvedValue(mockResponse({}));
338
+ await dimensionService.clone('SourceDim', 'TargetDim', true);
339
+ expect(sourceDimension.hierarchies[0].name).toBe('TargetDim'); // Renamed
340
+ expect(sourceDimension.hierarchies[1].name).toBe('CustomHierarchy'); // Not renamed
341
+ });
342
+ test('should throw error when cloning to existing dimension', async () => {
343
+ jest.spyOn(dimensionService, 'exists').mockResolvedValue(true);
344
+ await expect(dimensionService.clone('SourceDim', 'ExistingDim'))
345
+ .rejects.toThrow("Dimension 'ExistingDim' already exists");
346
+ });
347
+ test('should handle cloning when default hierarchy is null', async () => {
348
+ const sourceDimensionNoDefault = {
349
+ ...mockDimension,
350
+ defaultHierarchy: null
351
+ };
352
+ jest.spyOn(dimensionService, 'exists').mockResolvedValue(false);
353
+ jest.spyOn(dimensionService, 'get').mockResolvedValue(sourceDimensionNoDefault);
354
+ jest.spyOn(dimensionService, 'create').mockResolvedValue(mockResponse({}));
355
+ await dimensionService.clone('SourceDim', 'TargetDim', false);
356
+ expect(dimensionService.create).toHaveBeenCalled();
357
+ });
358
+ });
359
+ describe('Dimension Statistics Operations', () => {
360
+ test('should get elements count for dimension', async () => {
361
+ mockRestService.get.mockResolvedValue(mockResponse('150'));
362
+ const result = await dimensionService.getElementsCount('TestDimension');
363
+ expect(result).toBe(150);
364
+ expect(mockRestService.get).toHaveBeenCalledWith("/Dimensions('TestDimension')/Hierarchies('TestDimension')/Elements/$count");
365
+ });
366
+ test('should get elements count for specific hierarchy', async () => {
367
+ mockRestService.get.mockResolvedValue(mockResponse('75'));
368
+ const result = await dimensionService.getElementsCount('TestDimension', 'CustomHierarchy');
369
+ expect(result).toBe(75);
370
+ expect(mockRestService.get).toHaveBeenCalledWith("/Dimensions('TestDimension')/Hierarchies('CustomHierarchy')/Elements/$count");
371
+ });
372
+ test('should get hierarchies count for dimension', async () => {
373
+ mockRestService.get.mockResolvedValue(mockResponse('3'));
374
+ const result = await dimensionService.getHierarchiesCount('TestDimension');
375
+ expect(result).toBe(3);
376
+ expect(mockRestService.get).toHaveBeenCalledWith("/Dimensions('TestDimension')/Hierarchies/$count");
377
+ });
378
+ test('should handle non-numeric count responses', async () => {
379
+ mockRestService.get.mockResolvedValue(mockResponse('invalid'));
380
+ const result = await dimensionService.getElementsCount('TestDimension');
381
+ expect(isNaN(result)).toBe(true);
382
+ });
383
+ });
384
+ describe('Error Handling', () => {
385
+ test('should handle dimension retrieval errors', async () => {
386
+ const error = new Error('Dimension not found');
387
+ mockRestService.get.mockRejectedValue(error);
388
+ await expect(dimensionService.get('NonExistent')).rejects.toThrow('Dimension not found');
389
+ });
390
+ test('should handle dimension creation errors', async () => {
391
+ jest.spyOn(dimensionService, 'exists').mockResolvedValue(false);
392
+ const error = new Error('Creation failed');
393
+ mockRestService.post.mockRejectedValue(error);
394
+ await expect(dimensionService.create(mockDimension)).rejects.toThrow('Creation failed');
395
+ });
396
+ test('should handle dimension deletion errors', async () => {
397
+ const error = new Error('Deletion failed');
398
+ mockRestService.delete.mockRejectedValue(error);
399
+ await expect(dimensionService.delete('TestDimension')).rejects.toThrow('Deletion failed');
400
+ });
401
+ test('should handle hierarchy service errors during creation', async () => {
402
+ jest.spyOn(dimensionService, 'exists').mockResolvedValue(false);
403
+ mockRestService.post.mockResolvedValue(mockResponse({}));
404
+ mockHierarchyService.updateElementAttributes.mockRejectedValue(new Error('Hierarchy error'));
405
+ await expect(dimensionService.create(mockDimension)).rejects.toThrow('Hierarchy error');
406
+ });
407
+ test('should handle hierarchy service errors during update', async () => {
408
+ mockHierarchyService.getAllNames.mockRejectedValue(new Error('Hierarchy access failed'));
409
+ await expect(dimensionService.update(mockDimension)).rejects.toThrow('Hierarchy access failed');
410
+ });
411
+ test('should handle cube dimension retrieval errors', async () => {
412
+ const error = new Error('Cube not found');
413
+ mockRestService.get.mockRejectedValue(error);
414
+ await expect(dimensionService.getDimensionNames('NonExistentCube')).rejects.toThrow('Cube not found');
415
+ });
416
+ });
417
+ describe('Edge Cases and Special Scenarios', () => {
418
+ test('should handle empty dimension lists', async () => {
419
+ mockRestService.get.mockResolvedValue(mockResponse({ value: [] }));
420
+ const names = await dimensionService.getAllNames();
421
+ const dimensions = await dimensionService.getAll();
422
+ expect(names).toEqual([]);
423
+ expect(dimensions).toEqual([]);
424
+ });
425
+ test('should handle special characters in dimension names', async () => {
426
+ const specialName = "Dimension's & \"Special\" Name";
427
+ mockRestService.get.mockResolvedValue(mockResponse({}));
428
+ await dimensionService.exists(specialName);
429
+ // The formatUrl method encodes special characters
430
+ expect(mockRestService.get).toHaveBeenCalledWith(expect.stringContaining("Dimension's%20%26%20%22Special%22%20Name"));
431
+ });
432
+ test('should handle dimension with no hierarchies', async () => {
433
+ const emptyDimension = {
434
+ name: 'EmptyDimension',
435
+ hierarchies: [],
436
+ hierarchyNames: [],
437
+ body: { Name: 'EmptyDimension', Hierarchies: [] },
438
+ [Symbol.iterator]: function* () {
439
+ yield* this.hierarchies;
440
+ }
441
+ };
442
+ jest.spyOn(dimensionService, 'exists').mockResolvedValue(false);
443
+ mockRestService.post.mockResolvedValue(mockResponse({}));
444
+ await dimensionService.create(emptyDimension);
445
+ expect(mockHierarchyService.updateElementAttributes).not.toHaveBeenCalled();
446
+ });
447
+ test('should handle dimension update with no hierarchy changes', async () => {
448
+ mockHierarchyService.getAllNames.mockResolvedValue(['TestDimension', 'AltHierarchy']);
449
+ mockHierarchyService.exists.mockResolvedValue(true);
450
+ mockHierarchyService.update.mockResolvedValue();
451
+ await dimensionService.update(mockDimension);
452
+ expect(mockHierarchyService.delete).not.toHaveBeenCalled(); // No hierarchies to remove
453
+ expect(mockHierarchyService.create).not.toHaveBeenCalled(); // No new hierarchies
454
+ });
455
+ test('should handle large dimension lists efficiently', async () => {
456
+ const largeDimensionList = Array.from({ length: 1000 }, (_, i) => ({
457
+ Name: `Dimension${i}`
458
+ }));
459
+ mockRestService.get.mockResolvedValue(mockResponse({ value: largeDimensionList }));
460
+ const result = await dimensionService.getAllNames();
461
+ expect(result).toHaveLength(1000);
462
+ expect(result[0]).toBe('Dimension0');
463
+ expect(result[999]).toBe('Dimension999');
464
+ });
465
+ test('should handle cube with no dimensions', async () => {
466
+ mockRestService.get.mockResolvedValue(mockResponse({ Dimensions: [] }));
467
+ const result = await dimensionService.getDimensionNames('EmptyCube');
468
+ expect(result).toEqual([]);
469
+ });
470
+ test('should handle null/undefined values gracefully', async () => {
471
+ const malformedResponse = {
472
+ value: [
473
+ { Name: 'ValidDimension' },
474
+ { Name: null },
475
+ { Name: undefined },
476
+ {} // No Name property
477
+ ]
478
+ };
479
+ mockRestService.get.mockResolvedValue(mockResponse(malformedResponse));
480
+ const result = await dimensionService.getAllNames();
481
+ // Should handle malformed data gracefully
482
+ expect(result).toContain('ValidDimension');
483
+ });
484
+ });
485
+ describe('Service Integration', () => {
486
+ test('should integrate with HierarchyService for dimension operations', async () => {
487
+ jest.spyOn(dimensionService, 'exists').mockResolvedValue(false);
488
+ mockRestService.post.mockResolvedValue(mockResponse({}));
489
+ mockHierarchyService.updateElementAttributes.mockResolvedValue();
490
+ await dimensionService.create(mockDimension);
491
+ expect(mockHierarchyService.updateElementAttributes).toHaveBeenCalledWith(mockDimension.hierarchies[0]);
492
+ });
493
+ test('should coordinate hierarchy updates during dimension update', async () => {
494
+ // Create a fresh dimension object for this test
495
+ const testDimension = {
496
+ name: 'TestDimension',
497
+ hierarchies: [
498
+ { name: 'TestDimension', dimensionName: 'TestDimension' },
499
+ { name: 'AltHierarchy', dimensionName: 'TestDimension' }
500
+ ],
501
+ hierarchyNames: ['TestDimension', 'AltHierarchy'],
502
+ body: {},
503
+ [Symbol.iterator]: function* () {
504
+ yield* this.hierarchies;
505
+ }
506
+ };
507
+ // Clear any previous calls first
508
+ mockHierarchyService.getAllNames.mockClear();
509
+ mockHierarchyService.exists.mockClear();
510
+ mockHierarchyService.create.mockClear();
511
+ mockHierarchyService.delete.mockClear();
512
+ mockHierarchyService.getAllNames.mockResolvedValue(['OldHierarchy']);
513
+ mockHierarchyService.exists.mockResolvedValue(false);
514
+ mockHierarchyService.create.mockResolvedValue(mockResponse({}));
515
+ mockHierarchyService.delete.mockResolvedValue(mockResponse({}));
516
+ await dimensionService.update(testDimension);
517
+ expect(mockHierarchyService.create).toHaveBeenCalledTimes(2); // Create new hierarchies
518
+ expect(mockHierarchyService.delete).toHaveBeenLastCalledWith('TestDimension', 'OldHierarchy'); // Remove old
519
+ });
520
+ test('should handle hierarchy service initialization', () => {
521
+ const newService = new DimensionService_1.DimensionService(mockRestService);
522
+ expect(HierarchyService_1.HierarchyService).toHaveBeenCalledWith(mockRestService);
523
+ expect(SubsetService_1.SubsetService).toHaveBeenCalledWith(mockRestService);
524
+ });
525
+ test('should maintain service state across operations', async () => {
526
+ // Test that the service maintains its internal state properly
527
+ jest.spyOn(dimensionService, 'exists').mockResolvedValue(true);
528
+ const exists1 = await dimensionService.exists('Dimension1');
529
+ const exists2 = await dimensionService.exists('Dimension2');
530
+ expect(exists1).toBe(true);
531
+ expect(exists2).toBe(true);
532
+ expect(dimensionService.exists).toHaveBeenCalledTimes(2);
533
+ });
534
+ });
535
+ describe('Complex Workflow Scenarios', () => {
536
+ test('should support complete dimension lifecycle', async () => {
537
+ // Create, update, clone, delete workflow
538
+ jest.spyOn(dimensionService, 'exists')
539
+ .mockResolvedValueOnce(false) // Create check
540
+ .mockResolvedValueOnce(false) // Clone target check
541
+ .mockResolvedValue(true); // Other operations
542
+ jest.spyOn(dimensionService, 'get').mockResolvedValue(mockDimension);
543
+ jest.spyOn(dimensionService, 'create').mockResolvedValue(mockResponse({}));
544
+ mockRestService.post.mockResolvedValue(mockResponse({}));
545
+ mockRestService.delete.mockResolvedValue(mockResponse({}));
546
+ mockHierarchyService.updateElementAttributes.mockResolvedValue();
547
+ mockHierarchyService.getAllNames.mockResolvedValue(['TestDimension']);
548
+ mockHierarchyService.exists.mockResolvedValue(true);
549
+ mockHierarchyService.update.mockResolvedValue();
550
+ // Full lifecycle
551
+ await dimensionService.create(mockDimension);
552
+ await dimensionService.update(mockDimension);
553
+ await dimensionService.clone('TestDimension', 'ClonedDimension');
554
+ await dimensionService.delete('TestDimension');
555
+ expect(dimensionService.create).toHaveBeenCalledTimes(2); // Original + clone
556
+ expect(mockHierarchyService.update).toHaveBeenCalled();
557
+ expect(mockRestService.delete).toHaveBeenCalled();
558
+ });
559
+ test('should handle complex hierarchy management scenario', async () => {
560
+ const complexDimension = {
561
+ name: 'ComplexDim',
562
+ hierarchies: [
563
+ { name: 'ComplexDim', dimensionName: 'ComplexDim' },
564
+ { name: 'NewHierarchy', dimensionName: 'ComplexDim' },
565
+ { name: 'Leaves', dimensionName: 'ComplexDim' } // Should be skipped
566
+ ],
567
+ hierarchyNames: ['ComplexDim', 'NewHierarchy', 'Leaves'],
568
+ body: {},
569
+ [Symbol.iterator]: function* () {
570
+ yield* this.hierarchies;
571
+ }
572
+ };
573
+ mockHierarchyService.getAllNames.mockResolvedValue(['ComplexDim', 'OldHierarchy', 'Leaves']);
574
+ mockHierarchyService.exists
575
+ .mockResolvedValueOnce(true) // ComplexDim exists
576
+ .mockResolvedValueOnce(false); // NewHierarchy doesn't exist
577
+ mockHierarchyService.update.mockResolvedValue();
578
+ mockHierarchyService.create.mockResolvedValue(mockResponse({}));
579
+ mockHierarchyService.delete.mockResolvedValue(mockResponse({}));
580
+ await dimensionService.update(complexDimension);
581
+ expect(mockHierarchyService.update).toHaveBeenCalledTimes(1); // ComplexDim updated
582
+ expect(mockHierarchyService.create).toHaveBeenCalledTimes(1); // NewHierarchy created
583
+ expect(mockHierarchyService.delete).toHaveBeenCalledWith('ComplexDim', 'OldHierarchy'); // Remove old
584
+ expect(mockHierarchyService.delete).not.toHaveBeenCalledWith('ComplexDim', 'Leaves'); // Skip Leaves
585
+ });
586
+ test('should handle error recovery during complex operations', async () => {
587
+ // Create a fresh dimension object for this test
588
+ const testDimension = {
589
+ name: 'TestDimension',
590
+ hierarchies: [
591
+ { name: 'TestDimension', dimensionName: 'TestDimension' }
592
+ ],
593
+ hierarchyNames: ['TestDimension'],
594
+ body: {},
595
+ [Symbol.iterator]: function* () {
596
+ yield* this.hierarchies;
597
+ }
598
+ };
599
+ // Create fresh spies for this test to avoid interference
600
+ const existsSpy = jest.spyOn(dimensionService, 'exists')
601
+ .mockResolvedValueOnce(false) // Initial check passes
602
+ .mockResolvedValueOnce(true); // Cleanup check - dimension was created
603
+ const deleteSpy = jest.spyOn(dimensionService, 'delete').mockResolvedValue(mockResponse({}));
604
+ mockRestService.post.mockClear().mockResolvedValue(mockResponse({})); // Creation succeeds
605
+ mockHierarchyService.updateElementAttributes.mockClear().mockRejectedValue(new Error('Hierarchy update failed')); // But hierarchy update fails
606
+ await expect(dimensionService.create(testDimension)).rejects.toThrow('Hierarchy update failed');
607
+ expect(deleteSpy).toHaveBeenLastCalledWith('TestDimension'); // Cleanup performed
608
+ // Clean up spies
609
+ existsSpy.mockRestore();
610
+ deleteSpy.mockRestore();
611
+ });
612
+ });
613
+ });
614
+ //# sourceMappingURL=dimensionService.comprehensive.test.js.map
@@ -0,0 +1,6 @@
1
+ /**
2
+ * DimensionService Tests for tm1npm
3
+ * Comprehensive tests for TM1 Dimension operations with proper mocking
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=dimensionService.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dimensionService.test.d.ts","sourceRoot":"","sources":["../../src/tests/dimensionService.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}