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,237 @@
1
+ import { CellService } from '../services/CellService';
2
+ import { RestService } from '../services/RestService';
3
+ import axios, { AxiosResponse } from 'axios';
4
+
5
+ // Mock axios
6
+ jest.mock('axios');
7
+ const mockedAxios = axios as jest.Mocked<typeof axios>;
8
+
9
+ describe('Enhanced CellService Tests', () => {
10
+ let cellService: CellService;
11
+ let mockRestService: jest.Mocked<RestService>;
12
+
13
+ const createMockResponse = (data: any, status: number = 200): AxiosResponse => ({
14
+ data,
15
+ status,
16
+ statusText: status === 200 ? 'OK' : status === 201 ? 'Created' : 'Error',
17
+ headers: {},
18
+ config: {} as any
19
+ });
20
+
21
+ beforeEach(() => {
22
+ mockRestService = {
23
+ get: jest.fn(),
24
+ post: jest.fn(),
25
+ patch: jest.fn(),
26
+ delete: jest.fn(),
27
+ put: jest.fn()
28
+ } as any;
29
+
30
+ cellService = new CellService(mockRestService);
31
+ });
32
+
33
+ describe('Enhanced Data Writing Functions', () => {
34
+ test('writeDataframe should write tabular data to cube', async () => {
35
+ const dataFrame = [
36
+ ['2024', 'Actual', 'London', 100],
37
+ ['2024', 'Forecast', 'Paris', 200]
38
+ ];
39
+ const dimensions = ['Year', 'Version', 'Region'];
40
+
41
+ mockRestService.patch.mockResolvedValue(createMockResponse({}));
42
+
43
+ await cellService.writeDataframe('SalesCube', dataFrame, dimensions);
44
+
45
+ expect(mockRestService.patch).toHaveBeenCalledWith(
46
+ "/Cubes('SalesCube')/tm1.Update",
47
+ expect.objectContaining({
48
+ Cells: expect.arrayContaining([
49
+ expect.objectContaining({
50
+ Coordinates: [
51
+ { Name: '2024' },
52
+ { Name: 'Actual' },
53
+ { Name: 'London' }
54
+ ],
55
+ Value: 100
56
+ })
57
+ ])
58
+ })
59
+ );
60
+
61
+ console.log('✅ writeDataframe test passed');
62
+ });
63
+
64
+ test('writeAsync should return async operation ID', async () => {
65
+ const cellset = { '2024,Actual,London': 100 };
66
+
67
+ mockRestService.patch.mockResolvedValue(createMockResponse(
68
+ { ID: 'async-123' }
69
+ ));
70
+
71
+ const asyncId = await cellService.writeAsync('SalesCube', cellset);
72
+
73
+ expect(asyncId).toBe('async-123');
74
+ expect(mockRestService.patch).toHaveBeenCalledWith(
75
+ "/Cubes('SalesCube')/tm1.UpdateAsync",
76
+ expect.objectContaining({
77
+ Cells: expect.any(Array)
78
+ })
79
+ );
80
+
81
+ console.log('✅ writeAsync test passed');
82
+ });
83
+
84
+ test('writeThroughUnboundProcess should execute TI statements', async () => {
85
+ const cellset = { '2024,Actual,London': 100 };
86
+
87
+ mockRestService.post.mockResolvedValue(createMockResponse({
88
+ ProcessExecuteStatusCode: 'CompletedSuccessfully'
89
+ }));
90
+
91
+ const result = await cellService.writeThroughUnboundProcess('SalesCube', cellset);
92
+
93
+ expect(mockRestService.post).toHaveBeenCalledWith(
94
+ '/ExecuteProcessWithReturn',
95
+ expect.objectContaining({
96
+ PrologProcedure: expect.stringContaining("CubeDataSet('SalesCube'")
97
+ })
98
+ );
99
+
100
+ console.log('✅ writeThroughUnboundProcess test passed');
101
+ });
102
+
103
+ test('writeThroughBlob should upload CSV and load from blob', async () => {
104
+ const csvData = "Year,Version,Region,Value\\n2024,Actual,London,100";
105
+
106
+ mockRestService.post
107
+ .mockResolvedValueOnce(createMockResponse({ ID: 'blob-123' })) // Blob upload
108
+ .mockResolvedValueOnce(createMockResponse({})); // Cube load
109
+
110
+ await cellService.writeThroughBlob('SalesCube', csvData);
111
+
112
+ expect(mockRestService.post).toHaveBeenCalledTimes(2);
113
+ expect(mockRestService.post).toHaveBeenNthCalledWith(1, '/Blobs', csvData, {
114
+ headers: { 'Content-Type': 'text/csv' }
115
+ });
116
+ expect(mockRestService.post).toHaveBeenNthCalledWith(2,
117
+ "/Cubes('SalesCube')/tm1.LoadFromBlob",
118
+ { BlobId: 'blob-123' }
119
+ );
120
+
121
+ console.log('✅ writeThroughBlob test passed');
122
+ });
123
+ });
124
+
125
+ describe('Enhanced Data Reading Functions', () => {
126
+ test('executeMdxElementsValueDict should return element-value dictionary', async () => {
127
+ const mockData = { 'London': 100, 'Paris': 200, 'Berlin': 150 };
128
+
129
+ mockRestService.post.mockResolvedValue(createMockResponse(mockData));
130
+
131
+ const result = await cellService.executeMdxElementsValueDict(
132
+ 'SELECT NON EMPTY {[Region].Members} ON 0 FROM [SalesCube]'
133
+ );
134
+
135
+ expect(result).toEqual(mockData);
136
+ expect(mockRestService.post).toHaveBeenCalledWith(
137
+ '/ExecuteMDXElementsValue',
138
+ { MDX: 'SELECT NON EMPTY {[Region].Members} ON 0 FROM [SalesCube]' }
139
+ );
140
+
141
+ console.log('✅ executeMdxElementsValueDict test passed');
142
+ });
143
+ });
144
+
145
+ describe('Advanced Operations', () => {
146
+ test('clearWithDataframe should clear based on DataFrame coordinates', async () => {
147
+ const dataFrame = [
148
+ ['2024', 'Actual', 'London'],
149
+ ['2024', 'Forecast', 'Paris']
150
+ ];
151
+ const dimensions = ['Year', 'Version', 'Region'];
152
+
153
+ mockRestService.post.mockResolvedValue(createMockResponse({}));
154
+
155
+ await cellService.clearWithDataframe('SalesCube', dataFrame, dimensions);
156
+
157
+ expect(mockRestService.post).toHaveBeenCalledWith(
158
+ "/Cubes('SalesCube')/tm1.Clear",
159
+ expect.objectContaining({
160
+ MDX: expect.stringContaining("('2024','Actual','London')")
161
+ })
162
+ );
163
+
164
+ console.log('✅ clearWithDataframe test passed');
165
+ });
166
+
167
+ test('relativeProportionalSpread should execute proportional spread', async () => {
168
+ const coordinates = ['2024', 'Actual', 'Total'];
169
+
170
+ mockRestService.post.mockResolvedValue(createMockResponse({}));
171
+
172
+ await cellService.relativeProportionalSpread('SalesCube', coordinates, 1000);
173
+
174
+ expect(mockRestService.post).toHaveBeenCalledWith(
175
+ "/Cubes('SalesCube')/tm1.ProportionalSpread(coordinates=['2024','Actual','Total'],value=1000)"
176
+ );
177
+
178
+ console.log('✅ relativeProportionalSpread test passed');
179
+ });
180
+
181
+ test('clearSpread should execute clear spread', async () => {
182
+ const coordinates = ['2024', 'Actual', 'Total'];
183
+
184
+ mockRestService.post.mockResolvedValue(createMockResponse({}));
185
+
186
+ await cellService.clearSpread('SalesCube', coordinates);
187
+
188
+ expect(mockRestService.post).toHaveBeenCalledWith(
189
+ "/Cubes('SalesCube')/tm1.ClearSpread(coordinates=['2024','Actual','Total'])"
190
+ );
191
+
192
+ console.log('✅ clearSpread test passed');
193
+ });
194
+
195
+ test('checkCellFeeders should return feeder status', async () => {
196
+ const coordinates = ['2024', 'Actual', 'London'];
197
+
198
+ mockRestService.get.mockResolvedValue(createMockResponse({ value: true }));
199
+
200
+ const hasFeeders = await cellService.checkCellFeeders('SalesCube', coordinates);
201
+
202
+ expect(hasFeeders).toBe(true);
203
+ expect(mockRestService.get).toHaveBeenCalledWith(
204
+ "/Cubes('SalesCube')/tm1.CheckCellFeeders(coordinates=['2024','Actual','London'])"
205
+ );
206
+
207
+ console.log('✅ checkCellFeeders test passed');
208
+ });
209
+ });
210
+
211
+ describe('Error Handling', () => {
212
+ test('should handle write errors gracefully', async () => {
213
+ const cellset = { '2024,Actual,London': 100 };
214
+
215
+ mockRestService.patch.mockRejectedValue(new Error('Server Error'));
216
+
217
+ await expect(cellService.write('SalesCube', cellset)).rejects.toThrow('Server Error');
218
+
219
+ console.log('✅ Error handling test passed');
220
+ });
221
+
222
+ test('should handle sandbox operations', async () => {
223
+ const cellset = { '2024,Actual,London': 100 };
224
+
225
+ mockRestService.patch.mockResolvedValue(createMockResponse({}));
226
+
227
+ await cellService.write('SalesCube', cellset, undefined, { sandbox_name: 'TestSandbox' });
228
+
229
+ expect(mockRestService.patch).toHaveBeenCalledWith(
230
+ "/Cubes('SalesCube')/tm1.Update?$sandbox=TestSandbox",
231
+ expect.any(Object)
232
+ );
233
+
234
+ console.log('✅ Sandbox operations test passed');
235
+ });
236
+ });
237
+ });
@@ -0,0 +1,384 @@
1
+ import { CubeService } from '../services/CubeService';
2
+ import { RestService } from '../services/RestService';
3
+ import { Cube } from '../objects/Cube';
4
+ import { Rules } from '../objects/Rules';
5
+ import axios, { AxiosResponse } from 'axios';
6
+
7
+ // Mock axios
8
+ jest.mock('axios');
9
+ const mockedAxios = axios as jest.Mocked<typeof axios>;
10
+
11
+ describe('Enhanced CubeService Tests', () => {
12
+ let cubeService: CubeService;
13
+ let mockRestService: jest.Mocked<RestService>;
14
+
15
+ const createMockResponse = (data: any, status: number = 200): AxiosResponse => ({
16
+ data,
17
+ status,
18
+ statusText: status === 200 ? 'OK' : status === 201 ? 'Created' : 'Error',
19
+ headers: {},
20
+ config: {} as any
21
+ });
22
+
23
+ const mockCube = {
24
+ name: 'TestCube',
25
+ dimensions: ['Year', 'Region', 'Product'],
26
+ rules: { text: 'RULE; C: = 1; FEEDERS;' }
27
+ };
28
+
29
+ beforeEach(() => {
30
+ mockRestService = {
31
+ get: jest.fn(),
32
+ post: jest.fn(),
33
+ patch: jest.fn(),
34
+ delete: jest.fn(),
35
+ put: jest.fn()
36
+ } as any;
37
+
38
+ cubeService = new CubeService(mockRestService);
39
+ });
40
+
41
+ describe('Cube Analysis Functions', () => {
42
+ test('searchForDimensionSubstring should find cubes with matching dimensions', async () => {
43
+ const mockCubes = [
44
+ { name: 'SalesCube', dimensions: ['Year', 'Region', 'Product'] },
45
+ { name: 'BudgetCube', dimensions: ['Year', 'Department', 'Account'] },
46
+ { name: 'PlanningCube', dimensions: ['Month', 'Region', 'Scenario'] }
47
+ ];
48
+
49
+ jest.spyOn(cubeService, 'getAll').mockResolvedValue(mockCubes as any);
50
+
51
+ const result = await cubeService.searchForDimensionSubstring('Reg');
52
+
53
+ expect(result).toEqual({
54
+ 'SalesCube': ['Region'],
55
+ 'PlanningCube': ['Region']
56
+ });
57
+
58
+ console.log('✅ searchForDimensionSubstring test passed');
59
+ });
60
+
61
+ test('searchForRuleSubstring should find cubes with matching rules', async () => {
62
+ const mockCubes = [
63
+ {
64
+ name: 'TestCube1',
65
+ dimensions: ['Year'],
66
+ rules: { text: 'RULE; N: C = 1; FEEDERS;' }
67
+ },
68
+ {
69
+ name: 'TestCube2',
70
+ dimensions: ['Month'],
71
+ rules: { text: 'RULE; S: C = "Test"; FEEDERS;' }
72
+ }
73
+ ];
74
+
75
+ jest.spyOn(cubeService, 'getAll').mockResolvedValue(mockCubes as any);
76
+
77
+ const result = await cubeService.searchForRuleSubstring('RULE');
78
+
79
+ expect(result).toHaveLength(2);
80
+ expect(result[0].name).toBe('TestCube1');
81
+ expect(result[1].name).toBe('TestCube2');
82
+
83
+ console.log('✅ searchForRuleSubstring test passed');
84
+ });
85
+
86
+ test('getStorageDimensionOrder should return ordered dimension names', async () => {
87
+ mockRestService.get.mockResolvedValue(createMockResponse({
88
+ value: [
89
+ { Name: 'Year' },
90
+ { Name: 'Region' },
91
+ { Name: 'Product' }
92
+ ]
93
+ }));
94
+
95
+ const result = await cubeService.getStorageDimensionOrder('TestCube');
96
+
97
+ expect(result).toEqual(['Year', 'Region', 'Product']);
98
+ expect(mockRestService.get).toHaveBeenCalledWith(
99
+ "/Cubes('TestCube')/Dimensions?$select=Name"
100
+ );
101
+
102
+ console.log('✅ getStorageDimensionOrder test passed');
103
+ });
104
+
105
+ test('updateStorageDimensionOrder should reorder dimensions', async () => {
106
+ const newOrder = ['Product', 'Region', 'Year'];
107
+
108
+ mockRestService.post.mockResolvedValue(createMockResponse({}));
109
+
110
+ await cubeService.updateStorageDimensionOrder('TestCube', newOrder);
111
+
112
+ expect(mockRestService.post).toHaveBeenCalledWith(
113
+ "/Cubes('TestCube')/tm1.UpdateStorageOrder",
114
+ { Dimensions: newOrder }
115
+ );
116
+
117
+ console.log('✅ updateStorageDimensionOrder test passed');
118
+ });
119
+
120
+ test('getRandomIntersection should return random intersection', async () => {
121
+ mockRestService.get.mockResolvedValue(createMockResponse({
122
+ value: ['2024', 'North', 'ProductA']
123
+ }));
124
+
125
+ const result = await cubeService.getRandomIntersection('TestCube');
126
+
127
+ expect(result).toEqual(['2024', 'North', 'ProductA']);
128
+ expect(mockRestService.get).toHaveBeenCalledWith(
129
+ "/Cubes('TestCube')/tm1.GetRandomIntersection"
130
+ );
131
+
132
+ console.log('✅ getRandomIntersection test passed');
133
+ });
134
+
135
+ test('getRandomIntersection with unique names should include uniqueNames parameter', async () => {
136
+ mockRestService.get.mockResolvedValue(createMockResponse({
137
+ value: ['[Year].[2024]', '[Region].[North]', '[Product].[ProductA]']
138
+ }));
139
+
140
+ const result = await cubeService.getRandomIntersection('TestCube', true);
141
+
142
+ expect(result).toEqual(['[Year].[2024]', '[Region].[North]', '[Product].[ProductA]']);
143
+ expect(mockRestService.get).toHaveBeenCalledWith(
144
+ "/Cubes('TestCube')/tm1.GetRandomIntersection?uniqueNames=true"
145
+ );
146
+
147
+ console.log('✅ getRandomIntersection with unique names test passed');
148
+ });
149
+ });
150
+
151
+ describe('Memory Management Functions', () => {
152
+ test('load should load cube into memory', async () => {
153
+ mockRestService.post.mockResolvedValue(createMockResponse({}));
154
+
155
+ await cubeService.load('TestCube');
156
+
157
+ expect(mockRestService.post).toHaveBeenCalledWith(
158
+ "/Cubes('TestCube')/tm1.Load"
159
+ );
160
+
161
+ console.log('✅ load test passed');
162
+ });
163
+
164
+ test('unload should unload cube from memory', async () => {
165
+ mockRestService.post.mockResolvedValue(createMockResponse({}));
166
+
167
+ await cubeService.unload('TestCube');
168
+
169
+ expect(mockRestService.post).toHaveBeenCalledWith(
170
+ "/Cubes('TestCube')/tm1.Unload"
171
+ );
172
+
173
+ console.log('✅ unload test passed');
174
+ });
175
+
176
+ test('lock should lock cube', async () => {
177
+ mockRestService.post.mockResolvedValue(createMockResponse({}));
178
+
179
+ await cubeService.lock('TestCube');
180
+
181
+ expect(mockRestService.post).toHaveBeenCalledWith(
182
+ "/Cubes('TestCube')/tm1.Lock"
183
+ );
184
+
185
+ console.log('✅ lock test passed');
186
+ });
187
+
188
+ test('unlock should unlock cube', async () => {
189
+ mockRestService.post.mockResolvedValue(createMockResponse({}));
190
+
191
+ await cubeService.unlock('TestCube');
192
+
193
+ expect(mockRestService.post).toHaveBeenCalledWith(
194
+ "/Cubes('TestCube')/tm1.Unlock"
195
+ );
196
+
197
+ console.log('✅ unlock test passed');
198
+ });
199
+
200
+ test('cubeSaveData should save cube data to disk', async () => {
201
+ mockRestService.post.mockResolvedValue(createMockResponse({}));
202
+
203
+ await cubeService.cubeSaveData('TestCube');
204
+
205
+ expect(mockRestService.post).toHaveBeenCalledWith(
206
+ "/Cubes('TestCube')/tm1.SaveData"
207
+ );
208
+
209
+ console.log('✅ cubeSaveData test passed');
210
+ });
211
+ });
212
+
213
+ describe('Memory Configuration Functions', () => {
214
+ test('getVmm should get view storage max memory', async () => {
215
+ mockRestService.get.mockResolvedValue(createMockResponse('256'));
216
+
217
+ const result = await cubeService.getVmm('TestCube');
218
+
219
+ expect(result).toBe(256);
220
+ expect(mockRestService.get).toHaveBeenCalledWith(
221
+ "/Cubes('TestCube')/ViewStorageMaxMemory/$value"
222
+ );
223
+
224
+ console.log('✅ getVmm test passed');
225
+ });
226
+
227
+ test('setVmm should set view storage max memory', async () => {
228
+ mockRestService.patch.mockResolvedValue(createMockResponse({}));
229
+
230
+ await cubeService.setVmm('TestCube', 512);
231
+
232
+ expect(mockRestService.patch).toHaveBeenCalledWith(
233
+ "/Cubes('TestCube')/ViewStorageMaxMemory",
234
+ { Value: 512 }
235
+ );
236
+
237
+ console.log('✅ setVmm test passed');
238
+ });
239
+
240
+ test('getVmt should get view storage min time', async () => {
241
+ mockRestService.get.mockResolvedValue(createMockResponse('30'));
242
+
243
+ const result = await cubeService.getVmt('TestCube');
244
+
245
+ expect(result).toBe(30);
246
+ expect(mockRestService.get).toHaveBeenCalledWith(
247
+ "/Cubes('TestCube')/ViewStorageMinTime/$value"
248
+ );
249
+
250
+ console.log('✅ getVmt test passed');
251
+ });
252
+
253
+ test('setVmt should set view storage min time', async () => {
254
+ mockRestService.patch.mockResolvedValue(createMockResponse({}));
255
+
256
+ await cubeService.setVmt('TestCube', 60);
257
+
258
+ expect(mockRestService.patch).toHaveBeenCalledWith(
259
+ "/Cubes('TestCube')/ViewStorageMinTime",
260
+ { Value: 60 }
261
+ );
262
+
263
+ console.log('✅ setVmt test passed');
264
+ });
265
+ });
266
+
267
+ describe('Rules Management Functions', () => {
268
+ test('checkRules should validate cube rules syntax', async () => {
269
+ mockRestService.post.mockResolvedValue(createMockResponse({
270
+ Errors: [],
271
+ Valid: true
272
+ }));
273
+
274
+ const result = await cubeService.checkRules('TestCube');
275
+
276
+ expect(result.data.Valid).toBe(true);
277
+ expect(mockRestService.post).toHaveBeenCalledWith(
278
+ "/Cubes('TestCube')/tm1.CheckRules"
279
+ );
280
+
281
+ console.log('✅ checkRules test passed');
282
+ });
283
+
284
+ test('updateOrCreateRules should update rules with string input', async () => {
285
+ const rulesText = 'RULE; N: = C * 1.1; FEEDERS;';
286
+
287
+ mockRestService.patch.mockResolvedValue(createMockResponse({}));
288
+
289
+ await cubeService.updateOrCreateRules('TestCube', rulesText);
290
+
291
+ expect(mockRestService.patch).toHaveBeenCalledWith(
292
+ "/Cubes('TestCube')/Rules",
293
+ { Text: rulesText }
294
+ );
295
+
296
+ console.log('✅ updateOrCreateRules with string test passed');
297
+ });
298
+
299
+ test('updateOrCreateRules should create rules if update fails', async () => {
300
+ const rulesText = 'RULE; N: = C * 1.1; FEEDERS;';
301
+
302
+ mockRestService.patch.mockRejectedValue(new Error('Not Found'));
303
+ mockRestService.post.mockResolvedValue(createMockResponse({}));
304
+
305
+ await cubeService.updateOrCreateRules('TestCube', rulesText);
306
+
307
+ expect(mockRestService.patch).toHaveBeenCalled();
308
+ expect(mockRestService.post).toHaveBeenCalledWith(
309
+ "/Cubes('TestCube')/Rules",
310
+ { Text: rulesText }
311
+ );
312
+
313
+ console.log('✅ updateOrCreateRules fallback to create test passed');
314
+ });
315
+ });
316
+
317
+ describe('Error Handling', () => {
318
+ test('should handle empty search results', async () => {
319
+ const mockCubes = [
320
+ { name: 'TestCube', dimensions: ['Year', 'Month'], rules: null }
321
+ ];
322
+
323
+ jest.spyOn(cubeService, 'getAll').mockResolvedValue(mockCubes as any);
324
+
325
+ const result = await cubeService.searchForDimensionSubstring('NonExistent');
326
+
327
+ expect(result).toEqual({});
328
+
329
+ console.log('✅ Empty search results handling test passed');
330
+ });
331
+
332
+ test('should handle cubes without rules in rule search', async () => {
333
+ const mockCubes = [
334
+ { name: 'TestCube', dimensions: ['Year'], rules: null }
335
+ ];
336
+
337
+ jest.spyOn(cubeService, 'getAll').mockResolvedValue(mockCubes as any);
338
+
339
+ const result = await cubeService.searchForRuleSubstring('RULE');
340
+
341
+ expect(result).toEqual([]);
342
+
343
+ console.log('✅ No rules handling test passed');
344
+ });
345
+
346
+ test('should handle invalid memory values gracefully', async () => {
347
+ mockRestService.get.mockResolvedValue(createMockResponse('invalid'));
348
+
349
+ const result = await cubeService.getVmm('TestCube');
350
+
351
+ expect(result).toBe(0);
352
+
353
+ console.log('✅ Invalid memory value handling test passed');
354
+ });
355
+ });
356
+
357
+ describe('Integration Tests', () => {
358
+ test('should perform complete cube memory management workflow', async () => {
359
+ mockRestService.post.mockResolvedValue(createMockResponse({}));
360
+ mockRestService.patch.mockResolvedValue(createMockResponse({}));
361
+ mockRestService.get.mockResolvedValue(createMockResponse('128'));
362
+
363
+ // Load cube
364
+ await cubeService.load('TestCube');
365
+
366
+ // Set memory configuration
367
+ await cubeService.setVmm('TestCube', 256);
368
+ await cubeService.setVmt('TestCube', 30);
369
+
370
+ // Verify settings
371
+ const vmm = await cubeService.getVmm('TestCube');
372
+
373
+ // Save and unload
374
+ await cubeService.cubeSaveData('TestCube');
375
+ await cubeService.unload('TestCube');
376
+
377
+ expect(mockRestService.post).toHaveBeenCalledTimes(3); // load, save, unload
378
+ expect(mockRestService.patch).toHaveBeenCalledTimes(2); // set vmm, set vmt
379
+ expect(vmm).toBe(128);
380
+
381
+ console.log('✅ Complete memory management workflow test passed');
382
+ });
383
+ });
384
+ });