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,933 @@
1
+ /**
2
+ * Comprehensive ProcessService Tests
3
+ * Target: Achieve 80%+ coverage for ProcessService (currently 56%)
4
+ * Testing all process operations including CRUD, execution, debugging, and TI code handling
5
+ */
6
+
7
+ import { ProcessService } from '../services/ProcessService';
8
+ import { RestService } from '../services/RestService';
9
+ import { Process } from '../objects/Process';
10
+ import { ProcessDebugBreakpoint } from '../objects/ProcessDebugBreakpoint';
11
+ import { TM1RestException } from '../exceptions/TM1Exception';
12
+
13
+ // Mock dependencies
14
+ jest.mock('../objects/Process');
15
+ jest.mock('../objects/ProcessDebugBreakpoint');
16
+
17
+ describe('ProcessService - Comprehensive Tests', () => {
18
+ let processService: ProcessService;
19
+ let mockRestService: jest.Mocked<RestService>;
20
+
21
+ const mockResponse = (data: any) => ({
22
+ data: data,
23
+ status: 200,
24
+ statusText: 'OK',
25
+ headers: {},
26
+ config: { headers: {} }
27
+ } as any);
28
+
29
+ const mockProcess = {
30
+ name: 'TestProcess',
31
+ body: {
32
+ Name: 'TestProcess',
33
+ PrologProcedure: 'sTest = "Hello World";',
34
+ MetadataProcedure: '',
35
+ DataProcedure: '',
36
+ EpilogProcedure: 'WriteToMessageLog(INFO, sTest);'
37
+ },
38
+ prologProcedure: 'sTest = "Hello World";',
39
+ metadataProcedure: '',
40
+ dataProcedure: '',
41
+ epilogProcedure: 'WriteToMessageLog(INFO, sTest);'
42
+ } as any;
43
+
44
+ const mockProcessDebugBreakpoint = {
45
+ lineNumber: 5,
46
+ procedure: 'Prolog',
47
+ body: {
48
+ LineNumber: 5,
49
+ Procedure: 'Prolog'
50
+ }
51
+ } as any;
52
+
53
+ beforeEach(() => {
54
+ mockRestService = {
55
+ get: jest.fn(),
56
+ post: jest.fn(),
57
+ patch: jest.fn(),
58
+ put: jest.fn(),
59
+ delete: jest.fn()
60
+ } as any;
61
+
62
+ processService = new ProcessService(mockRestService);
63
+
64
+ // Mock Process.fromDict
65
+ (Process as any).fromDict = jest.fn().mockReturnValue(mockProcess);
66
+
67
+ // Mock ProcessDebugBreakpoint.fromDict
68
+ (ProcessDebugBreakpoint as any).fromDict = jest.fn().mockReturnValue(mockProcessDebugBreakpoint);
69
+ });
70
+
71
+ afterEach(() => {
72
+ jest.clearAllMocks();
73
+ });
74
+
75
+ describe('Constructor and Initialization', () => {
76
+ test('should initialize ProcessService properly', () => {
77
+ expect(processService).toBeDefined();
78
+ expect(processService).toBeInstanceOf(ProcessService);
79
+ });
80
+
81
+ test('should extend ObjectService', () => {
82
+ expect(processService).toBeInstanceOf(ProcessService);
83
+ // Note: ObjectService inheritance tested through functionality
84
+ });
85
+ });
86
+
87
+ describe('Process CRUD Operations', () => {
88
+ test('should get process by name', async () => {
89
+ const processData = {
90
+ Name: 'TestProcess',
91
+ PrologProcedure: 'sTest = "Hello";'
92
+ };
93
+ mockRestService.get.mockResolvedValue(mockResponse(processData));
94
+
95
+ const result = await processService.get('TestProcess');
96
+
97
+ expect(Process.fromDict).toHaveBeenCalledWith(processData);
98
+ expect(mockRestService.get).toHaveBeenCalledWith(
99
+ expect.stringContaining("/Processes('TestProcess')?$select=*,UIData,VariablesUIData,")
100
+ );
101
+ expect(result).toEqual(mockProcess);
102
+ });
103
+
104
+ test('should get all processes', async () => {
105
+ const processesData = {
106
+ value: [
107
+ { Name: 'Process1', PrologProcedure: 'test1;' },
108
+ { Name: 'Process2', PrologProcedure: 'test2;' }
109
+ ]
110
+ };
111
+ mockRestService.get.mockResolvedValue(mockResponse(processesData));
112
+
113
+ const result = await processService.getAll();
114
+
115
+ expect(result).toHaveLength(2);
116
+ expect(Process.fromDict).toHaveBeenCalledTimes(2);
117
+ expect(mockRestService.get).toHaveBeenCalledWith(
118
+ expect.stringContaining("/Processes?$select=*,UIData,VariablesUIData,")
119
+ );
120
+ });
121
+
122
+ test('should get all processes excluding control processes', async () => {
123
+ const processesData = {
124
+ value: [
125
+ { Name: 'Process1', PrologProcedure: 'test1;' },
126
+ { Name: 'Process2', PrologProcedure: 'test2;' }
127
+ ]
128
+ };
129
+ mockRestService.get.mockResolvedValue(mockResponse(processesData));
130
+
131
+ const result = await processService.getAll(true);
132
+
133
+ expect(result).toHaveLength(2);
134
+ expect(mockRestService.get).toHaveBeenCalledWith(
135
+ expect.stringMatching(/.*&\$filter=startswith\(Name,'\}'\) eq false and startswith\(Name,'\{'\) eq false$/)
136
+ );
137
+ });
138
+
139
+ test('should get all process names', async () => {
140
+ const processNamesData = {
141
+ value: [
142
+ { Name: 'Process1' },
143
+ { Name: 'Process2' },
144
+ { Name: '}Control' }
145
+ ]
146
+ };
147
+ mockRestService.get.mockResolvedValue(mockResponse(processNamesData));
148
+
149
+ const result = await processService.getAllNames();
150
+
151
+ expect(result).toEqual(['Process1', 'Process2', '}Control']);
152
+ expect(mockRestService.get).toHaveBeenCalledWith("/Processes?$select=Name");
153
+ });
154
+
155
+ test('should get all process names excluding control processes', async () => {
156
+ const processNamesData = {
157
+ value: [
158
+ { Name: 'Process1' },
159
+ { Name: 'Process2' }
160
+ ]
161
+ };
162
+ mockRestService.get.mockResolvedValue(mockResponse(processNamesData));
163
+
164
+ const result = await processService.getAllNames(true);
165
+
166
+ expect(result).toEqual(['Process1', 'Process2']);
167
+ expect(mockRestService.get).toHaveBeenCalledWith(
168
+ "/Processes?$select=Name&$filter=startswith(Name,'}') eq false and startswith(Name,'{') eq false"
169
+ );
170
+ });
171
+
172
+ test('should create process', async () => {
173
+ mockRestService.post.mockResolvedValue(mockResponse({}));
174
+
175
+ const result = await processService.create(mockProcess);
176
+
177
+ expect(result).toBeDefined();
178
+ expect(mockRestService.post).toHaveBeenCalledWith("/Processes", mockProcess.body);
179
+ });
180
+
181
+ test('should update process', async () => {
182
+ mockRestService.patch.mockResolvedValue(mockResponse({}));
183
+
184
+ const result = await processService.update(mockProcess);
185
+
186
+ expect(result).toBeDefined();
187
+ expect(mockRestService.patch).toHaveBeenCalledWith("/Processes('TestProcess')", mockProcess.body);
188
+ });
189
+
190
+ test('should delete process', async () => {
191
+ mockRestService.delete.mockResolvedValue(mockResponse({}));
192
+
193
+ const result = await processService.delete('TestProcess');
194
+
195
+ expect(result).toBeDefined();
196
+ expect(mockRestService.delete).toHaveBeenCalledWith("/Processes('TestProcess')");
197
+ });
198
+
199
+ test('should check if process exists', async () => {
200
+ mockRestService.get.mockResolvedValue(mockResponse(mockProcess));
201
+
202
+ const result = await processService.exists('TestProcess');
203
+
204
+ expect(result).toBe(true);
205
+ });
206
+
207
+ test('should return false when process does not exist', async () => {
208
+ const error = new TM1RestException('Process not found', 404);
209
+ error.statusCode = 404; // Set the statusCode property that ProcessService checks
210
+ mockRestService.get.mockRejectedValue(error);
211
+
212
+ const result = await processService.exists('NonExistentProcess');
213
+
214
+ expect(result).toBe(false);
215
+ });
216
+
217
+ test('should throw error for non-404 errors in exists check', async () => {
218
+ const error = new TM1RestException('Server error', 500);
219
+ error.statusCode = 500; // Set the statusCode property that ProcessService checks
220
+ mockRestService.get.mockRejectedValue(error);
221
+
222
+ await expect(processService.exists('TestProcess')).rejects.toThrow('Server error');
223
+ });
224
+ });
225
+
226
+ describe('Process Execution Operations', () => {
227
+ test('should execute process without parameters', async () => {
228
+ mockRestService.post.mockResolvedValue(mockResponse({}));
229
+
230
+ const result = await processService.execute('TestProcess');
231
+
232
+ expect(result).toBeDefined();
233
+ expect(mockRestService.post).toHaveBeenCalledWith(
234
+ "/Processes('TestProcess')/tm1.Execute",
235
+ "{}"
236
+ );
237
+ });
238
+
239
+ test('should execute process with parameters', async () => {
240
+ mockRestService.post.mockResolvedValue(mockResponse({}));
241
+
242
+ const parameters = {
243
+ pParam1: 'Value1',
244
+ pParam2: 42,
245
+ pParam3: true
246
+ };
247
+
248
+ const result = await processService.execute('TestProcess', parameters);
249
+
250
+ expect(result).toBeDefined();
251
+ expect(mockRestService.post).toHaveBeenCalledWith(
252
+ "/Processes('TestProcess')/tm1.Execute",
253
+ JSON.stringify({
254
+ Parameters: [
255
+ { Name: 'pParam1', Value: 'Value1' },
256
+ { Name: 'pParam2', Value: 42 },
257
+ { Name: 'pParam3', Value: true }
258
+ ]
259
+ })
260
+ );
261
+ });
262
+
263
+ test('should execute process with return', async () => {
264
+ const returnData = {
265
+ ProcessExecuteStatusCode: 'CompletedSuccessfully',
266
+ ErrorLogFile: null
267
+ };
268
+ mockRestService.post.mockResolvedValue(mockResponse(returnData));
269
+
270
+ const result = await processService.executeWithReturn('TestProcess');
271
+
272
+ expect(result).toEqual(mockResponse(returnData));
273
+ expect(mockRestService.post).toHaveBeenCalledWith(
274
+ "/Processes('TestProcess')/tm1.ExecuteWithReturn?$expand=*",
275
+ "{}",
276
+ {}
277
+ );
278
+ });
279
+
280
+ test('should execute process with return and parameters', async () => {
281
+ const returnData = {
282
+ ProcessExecuteStatusCode: 'CompletedSuccessfully',
283
+ Parameters: [{ Name: 'pParam1', Value: 'Result1' }]
284
+ };
285
+ mockRestService.post.mockResolvedValue(mockResponse(returnData));
286
+
287
+ const parameters = { pParam1: 'Input1' };
288
+ const result = await processService.executeWithReturn('TestProcess', parameters);
289
+
290
+ expect(result).toEqual(mockResponse(returnData));
291
+ expect(mockRestService.post).toHaveBeenCalledWith(
292
+ "/Processes('TestProcess')/tm1.ExecuteWithReturn?$expand=*",
293
+ JSON.stringify({
294
+ Parameters: [{ Name: 'pParam1', Value: 'Input1' }]
295
+ }),
296
+ {}
297
+ );
298
+ });
299
+
300
+ test('should execute process with return and timeout', async () => {
301
+ const returnData = { ProcessExecuteStatusCode: 'CompletedSuccessfully' };
302
+ mockRestService.post.mockResolvedValue(mockResponse(returnData));
303
+
304
+ const result = await processService.executeWithReturn('TestProcess', {}, 30);
305
+
306
+ expect(result).toEqual(mockResponse(returnData));
307
+ expect(mockRestService.post).toHaveBeenCalledWith(
308
+ "/Processes('TestProcess')/tm1.ExecuteWithReturn?$expand=*",
309
+ "{}",
310
+ { timeout: 30000 }
311
+ );
312
+ });
313
+
314
+ test('should execute process with return data extraction', async () => {
315
+ const returnData = {
316
+ ProcessExecuteStatusCode: 'CompletedSuccessfully',
317
+ Parameters: [{ Name: 'result', Value: 'success' }]
318
+ };
319
+ mockRestService.post.mockResolvedValue(mockResponse(returnData));
320
+
321
+ const result = await processService.executeProcessWithReturn('TestProcess');
322
+
323
+ expect(result).toEqual(returnData);
324
+ });
325
+
326
+ test('should compile process', async () => {
327
+ mockRestService.post.mockResolvedValue(mockResponse({}));
328
+
329
+ const result = await processService.compile('TestProcess');
330
+
331
+ expect(result).toBeDefined();
332
+ expect(mockRestService.post).toHaveBeenCalledWith("/Processes('TestProcess')/tm1.Compile", '{}');
333
+ });
334
+ });
335
+
336
+ describe('TI Code Execution Operations', () => {
337
+ test('should execute TI code with all sections', async () => {
338
+ mockRestService.post.mockResolvedValue(mockResponse({}));
339
+
340
+ const prologLines = ['sMessage = "Starting";', 'WriteToMessageLog(INFO, sMessage);'];
341
+ const metadataLines = ['DimensionCreate("TestDim");'];
342
+ const dataLines = ['CellPutN(100, "TestCube", "Element1");'];
343
+ const epilogLines = ['sMessage = "Completed";', 'WriteToMessageLog(INFO, sMessage);'];
344
+
345
+ const result = await processService.executeTiCode(
346
+ prologLines,
347
+ metadataLines,
348
+ dataLines,
349
+ epilogLines
350
+ );
351
+
352
+ expect(result).toBeDefined();
353
+ expect(mockRestService.post).toHaveBeenCalledWith(
354
+ "/ExecuteProcessWithReturn",
355
+ JSON.stringify({
356
+ PrologProcedure: prologLines.join('\n'),
357
+ MetadataProcedure: metadataLines.join('\n'),
358
+ DataProcedure: dataLines.join('\n'),
359
+ EpilogProcedure: epilogLines.join('\n')
360
+ })
361
+ );
362
+ });
363
+
364
+ test('should execute TI code with parameters', async () => {
365
+ mockRestService.post.mockResolvedValue(mockResponse({}));
366
+
367
+ const prologLines = ['WriteToMessageLog(INFO, pMessage);'];
368
+ const parameters = { pMessage: 'Test Message', pValue: 123 };
369
+
370
+ const result = await processService.executeTiCode(
371
+ prologLines,
372
+ undefined,
373
+ undefined,
374
+ undefined,
375
+ parameters
376
+ );
377
+
378
+ expect(result).toBeDefined();
379
+ expect(mockRestService.post).toHaveBeenCalledWith(
380
+ "/ExecuteProcessWithReturn",
381
+ JSON.stringify({
382
+ PrologProcedure: prologLines.join('\n'),
383
+ Parameters: [
384
+ { Name: 'pMessage', Value: 'Test Message' },
385
+ { Name: 'pValue', Value: 123 }
386
+ ]
387
+ })
388
+ );
389
+ });
390
+
391
+ test('should execute TI code with partial sections', async () => {
392
+ mockRestService.post.mockResolvedValue(mockResponse({}));
393
+
394
+ const prologLines = ['sTest = "Prolog only";'];
395
+
396
+ const result = await processService.executeTiCode(prologLines);
397
+
398
+ expect(result).toBeDefined();
399
+ expect(mockRestService.post).toHaveBeenCalledWith(
400
+ "/ExecuteProcessWithReturn",
401
+ JSON.stringify({
402
+ PrologProcedure: prologLines.join('\n')
403
+ })
404
+ );
405
+ });
406
+
407
+ test('should compile single TI statement', async () => {
408
+ const compilationResult = {
409
+ IsValid: true,
410
+ Errors: []
411
+ };
412
+ mockRestService.post.mockResolvedValue(mockResponse(compilationResult));
413
+
414
+ const result = await processService.compileSingleStatement('WriteToMessageLog(INFO, "Test");');
415
+
416
+ expect(result).toEqual(mockResponse(compilationResult));
417
+ expect(mockRestService.post).toHaveBeenCalledWith(
418
+ "/CompileStatement",
419
+ JSON.stringify({
420
+ Statement: 'WriteToMessageLog(INFO, "Test");'
421
+ })
422
+ );
423
+ });
424
+ });
425
+
426
+ describe('Process Search Operations', () => {
427
+ test('should search string in process code', async () => {
428
+ const processes = [
429
+ {
430
+ name: 'Process1',
431
+ prologProcedure: 'WriteToMessageLog(INFO, "Hello");',
432
+ metadataProcedure: '',
433
+ dataProcedure: '',
434
+ epilogProcedure: ''
435
+ },
436
+ {
437
+ name: 'Process2',
438
+ prologProcedure: 'sMessage = "World";',
439
+ metadataProcedure: '',
440
+ dataProcedure: '',
441
+ epilogProcedure: 'WriteToMessageLog(INFO, sMessage);'
442
+ },
443
+ {
444
+ name: 'Process3',
445
+ prologProcedure: 'CellPutN(100, "Cube", "Element");',
446
+ metadataProcedure: '',
447
+ dataProcedure: '',
448
+ epilogProcedure: ''
449
+ }
450
+ ];
451
+
452
+ // Mock getAll method
453
+ jest.spyOn(processService, 'getAll').mockResolvedValue(processes as any);
454
+
455
+ const result = await processService.searchStringInCode('WriteToMessageLog');
456
+
457
+ expect(result).toEqual(['Process1', 'Process2']);
458
+ expect(processService.getAll).toHaveBeenCalledWith(false);
459
+ });
460
+
461
+ test('should search string in process code excluding control processes', async () => {
462
+ const processes = [
463
+ {
464
+ name: 'Process1',
465
+ prologProcedure: 'WriteToMessageLog(INFO, "Test");',
466
+ metadataProcedure: '',
467
+ dataProcedure: '',
468
+ epilogProcedure: ''
469
+ }
470
+ ];
471
+
472
+ jest.spyOn(processService, 'getAll').mockResolvedValue(processes as any);
473
+
474
+ const result = await processService.searchStringInCode('WriteToMessageLog', true);
475
+
476
+ expect(result).toEqual(['Process1']);
477
+ expect(processService.getAll).toHaveBeenCalledWith(true);
478
+ });
479
+
480
+ test('should search string in process names', async () => {
481
+ const processNamesData = {
482
+ value: [
483
+ { Name: 'DataLoad_Sales' },
484
+ { Name: 'DataLoad_Budget' },
485
+ { Name: 'SecuritySetup' }
486
+ ]
487
+ };
488
+ mockRestService.get.mockResolvedValue(mockResponse(processNamesData));
489
+
490
+ const result = await processService.searchStringInName('DataLoad');
491
+
492
+ expect(result).toEqual(['DataLoad_Sales', 'DataLoad_Budget', 'SecuritySetup']);
493
+ expect(mockRestService.get).toHaveBeenCalledWith(
494
+ "/Processes?$select=Name&$filter=indexof(tolower(Name), 'dataload') ge 0"
495
+ );
496
+ });
497
+
498
+ test('should search string in process names excluding control processes', async () => {
499
+ const processNamesData = {
500
+ value: [
501
+ { Name: 'DataLoad_Sales' }
502
+ ]
503
+ };
504
+ mockRestService.get.mockResolvedValue(mockResponse(processNamesData));
505
+
506
+ const result = await processService.searchStringInName('DataLoad', true);
507
+
508
+ expect(result).toEqual(['DataLoad_Sales']);
509
+ expect(mockRestService.get).toHaveBeenCalledWith(
510
+ "/Processes?$select=Name&$filter=indexof(tolower(Name), 'dataload') ge 0 and not startswith(Name, '}') and not startswith(Name, '{')"
511
+ );
512
+ });
513
+ });
514
+
515
+ describe('Process Debug Operations', () => {
516
+ test('should get process debug breakpoints', async () => {
517
+ const breakpointsData = {
518
+ value: [
519
+ { LineNumber: 5, Procedure: 'Prolog' },
520
+ { LineNumber: 10, Procedure: 'Epilog' }
521
+ ]
522
+ };
523
+ mockRestService.get.mockResolvedValue(mockResponse(breakpointsData));
524
+
525
+ const result = await processService.getProcessDebugBreakpoints('TestProcess');
526
+
527
+ expect(result).toHaveLength(2);
528
+ expect(ProcessDebugBreakpoint.fromDict).toHaveBeenCalledTimes(2);
529
+ expect(mockRestService.get).toHaveBeenCalledWith("/Processes('TestProcess')/Breakpoints");
530
+ });
531
+
532
+ test('should create process debug breakpoint', async () => {
533
+ mockRestService.post.mockResolvedValue(mockResponse({}));
534
+
535
+ const result = await processService.createProcessDebugBreakpoint(
536
+ 'TestProcess',
537
+ mockProcessDebugBreakpoint
538
+ );
539
+
540
+ expect(result).toBeDefined();
541
+ expect(mockRestService.post).toHaveBeenCalledWith(
542
+ "/Processes('TestProcess')/Breakpoints",
543
+ mockProcessDebugBreakpoint.body
544
+ );
545
+ });
546
+
547
+ test('should delete process debug breakpoint', async () => {
548
+ mockRestService.delete.mockResolvedValue(mockResponse({}));
549
+
550
+ const result = await processService.deleteProcessDebugBreakpoint('TestProcess', 5);
551
+
552
+ expect(result).toBeDefined();
553
+ expect(mockRestService.delete).toHaveBeenCalledWith("/Processes('TestProcess')/Breakpoints(5)");
554
+ });
555
+
556
+ test('should debug step over', async () => {
557
+ mockRestService.post.mockResolvedValue(mockResponse({}));
558
+
559
+ await processService.debugStepOver('TestProcess');
560
+
561
+ expect(mockRestService.post).toHaveBeenCalledWith(
562
+ "/Processes('TestProcess')/tm1.DebugStepOver",
563
+ {}
564
+ );
565
+ });
566
+
567
+ test('should debug step in', async () => {
568
+ mockRestService.post.mockResolvedValue(mockResponse({}));
569
+
570
+ await processService.debugStepIn('TestProcess');
571
+
572
+ expect(mockRestService.post).toHaveBeenCalledWith(
573
+ "/Processes('TestProcess')/tm1.DebugStepIn",
574
+ {}
575
+ );
576
+ });
577
+
578
+ test('should debug step out', async () => {
579
+ mockRestService.post.mockResolvedValue(mockResponse({}));
580
+
581
+ await processService.debugStepOut('TestProcess');
582
+
583
+ expect(mockRestService.post).toHaveBeenCalledWith(
584
+ "/Processes('TestProcess')/tm1.DebugStepOut",
585
+ {}
586
+ );
587
+ });
588
+
589
+ test('should debug continue', async () => {
590
+ mockRestService.post.mockResolvedValue(mockResponse({}));
591
+
592
+ await processService.debugContinue('TestProcess');
593
+
594
+ expect(mockRestService.post).toHaveBeenCalledWith(
595
+ "/Processes('TestProcess')/tm1.DebugContinue",
596
+ {}
597
+ );
598
+ });
599
+ });
600
+
601
+ describe('Error Log Operations', () => {
602
+ test('should get error log file content', async () => {
603
+ const logContent = '2025-01-15 10:00:00 ERROR Process failed at line 5';
604
+ mockRestService.get.mockResolvedValue(mockResponse(logContent));
605
+
606
+ const result = await processService.getErrorLogFileContent('TestProcess_20250115.log');
607
+
608
+ expect(result).toBe(logContent);
609
+ expect(mockRestService.get).toHaveBeenCalledWith("/Contents('Logs/TestProcess_20250115.log')");
610
+ });
611
+
612
+ test('should get error log filenames', async () => {
613
+ const filesData = {
614
+ value: [
615
+ { Name: 'Process1_20250115.log' },
616
+ { Name: 'Process2_20250114.log' },
617
+ { Name: 'Process3_20250113.log' }
618
+ ]
619
+ };
620
+ mockRestService.get.mockResolvedValue(mockResponse(filesData));
621
+
622
+ const result = await processService.getErrorLogFilenames();
623
+
624
+ expect(result).toEqual(['Process1_20250115.log', 'Process2_20250114.log', 'Process3_20250113.log']);
625
+ expect(mockRestService.get).toHaveBeenCalledWith(
626
+ "/Contents('Logs')?$select=Name&$filter=endswith(Name,'.log')"
627
+ );
628
+ });
629
+
630
+ test('should get error log filenames with top limit', async () => {
631
+ const filesData = {
632
+ value: [
633
+ { Name: 'Process1_20250115.log' },
634
+ { Name: 'Process2_20250114.log' }
635
+ ]
636
+ };
637
+ mockRestService.get.mockResolvedValue(mockResponse(filesData));
638
+
639
+ const result = await processService.getErrorLogFilenames(2);
640
+
641
+ expect(result).toEqual(['Process1_20250115.log', 'Process2_20250114.log']);
642
+ expect(mockRestService.get).toHaveBeenCalledWith(
643
+ "/Contents('Logs')?$select=Name&$filter=endswith(Name,'.log')&$top=2"
644
+ );
645
+ });
646
+
647
+ test('should delete error log file', async () => {
648
+ mockRestService.delete.mockResolvedValue(mockResponse({}));
649
+
650
+ const result = await processService.deleteErrorLogFile('TestProcess_20250115.log');
651
+
652
+ expect(result).toBeDefined();
653
+ expect(mockRestService.delete).toHaveBeenCalledWith("/Contents('Logs/TestProcess_20250115.log')");
654
+ });
655
+
656
+ test('should get last message from message log', async () => {
657
+ const result = await processService.getLastMessageFromMessagelog('TestProcess');
658
+
659
+ // This method currently returns empty string as per implementation
660
+ expect(result).toBe('');
661
+ });
662
+ });
663
+
664
+ describe('Advanced Process Operations', () => {
665
+ test('should update or create process - update existing', async () => {
666
+ jest.spyOn(processService, 'exists').mockResolvedValue(true);
667
+ jest.spyOn(processService, 'update').mockResolvedValue(mockResponse({}));
668
+
669
+ const result = await processService.updateOrCreate(mockProcess);
670
+
671
+ expect(processService.exists).toHaveBeenCalledWith('TestProcess');
672
+ expect(processService.update).toHaveBeenCalledWith(mockProcess);
673
+ expect(result).toBeDefined();
674
+ });
675
+
676
+ test('should update or create process - create new', async () => {
677
+ jest.spyOn(processService, 'exists').mockResolvedValue(false);
678
+ jest.spyOn(processService, 'create').mockResolvedValue(mockResponse({}));
679
+
680
+ const result = await processService.updateOrCreate(mockProcess);
681
+
682
+ expect(processService.exists).toHaveBeenCalledWith('TestProcess');
683
+ expect(processService.create).toHaveBeenCalledWith(mockProcess);
684
+ expect(result).toBeDefined();
685
+ });
686
+
687
+ test('should clone process with data', async () => {
688
+ const sourceProcess = { ...mockProcess, name: 'SourceProcess' };
689
+ jest.spyOn(processService, 'get').mockResolvedValue(sourceProcess as any);
690
+ jest.spyOn(processService, 'create').mockResolvedValue(mockResponse({}));
691
+
692
+ const result = await processService.clone('SourceProcess', 'TargetProcess', true);
693
+
694
+ expect(processService.get).toHaveBeenCalledWith('SourceProcess');
695
+ expect(processService.create).toHaveBeenCalledWith(
696
+ expect.objectContaining({ name: 'TargetProcess' })
697
+ );
698
+ expect(result).toBeDefined();
699
+ });
700
+
701
+ test('should clone process without data', async () => {
702
+ const sourceProcess = { ...mockProcess, name: 'SourceProcess' };
703
+ jest.spyOn(processService, 'get').mockResolvedValue(sourceProcess as any);
704
+ jest.spyOn(processService, 'create').mockResolvedValue(mockResponse({}));
705
+
706
+ const result = await processService.clone('SourceProcess', 'TargetProcess', false);
707
+
708
+ expect(processService.get).toHaveBeenCalledWith('SourceProcess');
709
+ expect(processService.create).toHaveBeenCalledWith(
710
+ expect.objectContaining({ name: 'TargetProcess' })
711
+ );
712
+ expect(result).toBeDefined();
713
+ });
714
+ });
715
+
716
+ describe('Boolean TI Expression Evaluation', () => {
717
+ test('should evaluate boolean TI expression - true result', async () => {
718
+ // Mock the series of REST calls for evaluation
719
+ mockRestService.post
720
+ .mockResolvedValueOnce(mockResponse({})) // Create dimension
721
+ .mockResolvedValueOnce(mockResponse({})) // Create cube
722
+ .mockResolvedValueOnce(mockResponse({})) // Create process
723
+ .mockResolvedValueOnce(mockResponse({})); // Execute process
724
+
725
+ mockRestService.get.mockResolvedValue(mockResponse({
726
+ Cells: [{ Value: 1 }]
727
+ }));
728
+
729
+ mockRestService.delete
730
+ .mockResolvedValueOnce(mockResponse({})) // Delete process
731
+ .mockResolvedValueOnce(mockResponse({})) // Delete cube
732
+ .mockResolvedValueOnce(mockResponse({})); // Delete dimension
733
+
734
+ const result = await processService.evaluateBooleanTiExpression('1 = 1');
735
+
736
+ expect(result).toBe(true);
737
+ expect(mockRestService.post).toHaveBeenCalledTimes(4);
738
+ expect(mockRestService.delete).toHaveBeenCalledTimes(3);
739
+ });
740
+
741
+ test('should evaluate boolean TI expression - false result', async () => {
742
+ // Mock the series of REST calls for evaluation
743
+ mockRestService.post
744
+ .mockResolvedValueOnce(mockResponse({})) // Create dimension
745
+ .mockResolvedValueOnce(mockResponse({})) // Create cube
746
+ .mockResolvedValueOnce(mockResponse({})) // Create process
747
+ .mockResolvedValueOnce(mockResponse({})); // Execute process
748
+
749
+ mockRestService.get.mockResolvedValue(mockResponse({
750
+ Cells: [{ Value: 0 }]
751
+ }));
752
+
753
+ mockRestService.delete
754
+ .mockResolvedValueOnce(mockResponse({})) // Delete process
755
+ .mockResolvedValueOnce(mockResponse({})) // Delete cube
756
+ .mockResolvedValueOnce(mockResponse({})); // Delete dimension
757
+
758
+ const result = await processService.evaluateBooleanTiExpression('1 = 0');
759
+
760
+ expect(result).toBe(false);
761
+ });
762
+
763
+ test('should handle evaluation errors and cleanup', async () => {
764
+ mockRestService.post
765
+ .mockResolvedValueOnce(mockResponse({})) // Create dimension
766
+ .mockResolvedValueOnce(mockResponse({})) // Create cube
767
+ .mockRejectedValueOnce(new Error('Process creation failed')); // Fail process creation
768
+
769
+ mockRestService.delete
770
+ .mockResolvedValueOnce(mockResponse({})) // Delete cube
771
+ .mockResolvedValueOnce(mockResponse({})); // Delete dimension
772
+
773
+ await expect(processService.evaluateBooleanTiExpression('invalid expression'))
774
+ .rejects.toThrow('Process creation failed');
775
+
776
+ // Verify cleanup was attempted
777
+ expect(mockRestService.delete).toHaveBeenCalledTimes(2);
778
+ });
779
+ });
780
+
781
+ describe('Error Handling', () => {
782
+ test('should handle process retrieval errors', async () => {
783
+ const error = new Error('Process not found');
784
+ mockRestService.get.mockRejectedValue(error);
785
+
786
+ await expect(processService.get('NonExistentProcess')).rejects.toThrow('Process not found');
787
+ });
788
+
789
+ test('should handle process creation errors', async () => {
790
+ const error = new Error('Process creation failed');
791
+ mockRestService.post.mockRejectedValue(error);
792
+
793
+ await expect(processService.create(mockProcess)).rejects.toThrow('Process creation failed');
794
+ });
795
+
796
+ test('should handle process execution errors', async () => {
797
+ const error = new Error('Process execution failed');
798
+ mockRestService.post.mockRejectedValue(error);
799
+
800
+ await expect(processService.execute('TestProcess')).rejects.toThrow('Process execution failed');
801
+ });
802
+
803
+ test('should handle compilation errors', async () => {
804
+ const error = new Error('Compilation failed');
805
+ mockRestService.post.mockRejectedValue(error);
806
+
807
+ await expect(processService.compile('TestProcess')).rejects.toThrow('Compilation failed');
808
+ });
809
+
810
+ test('should handle debug operation errors', async () => {
811
+ const error = new Error('Debug operation failed');
812
+ mockRestService.post.mockRejectedValue(error);
813
+
814
+ await expect(processService.debugStepOver('TestProcess')).rejects.toThrow('Debug operation failed');
815
+ });
816
+ });
817
+
818
+ describe('Edge Cases and Special Scenarios', () => {
819
+ test('should handle empty process lists', async () => {
820
+ mockRestService.get.mockResolvedValue(mockResponse({ value: [] }));
821
+
822
+ const processes = await processService.getAll();
823
+ const processNames = await processService.getAllNames();
824
+
825
+ expect(processes).toEqual([]);
826
+ expect(processNames).toEqual([]);
827
+ });
828
+
829
+ test('should handle processes with special characters in names', async () => {
830
+ const specialName = "Process's & \"Special\" Name";
831
+ mockRestService.get.mockResolvedValue(mockResponse({ Name: specialName }));
832
+
833
+ await processService.get(specialName);
834
+
835
+ // The formatUrl method encodes special characters
836
+ expect(mockRestService.get).toHaveBeenCalledWith(
837
+ expect.stringContaining("/Processes('Process's%20%26%20%22Special%22%20Name')")
838
+ );
839
+ });
840
+
841
+ test('should handle empty parameter objects', async () => {
842
+ mockRestService.post.mockResolvedValue(mockResponse({}));
843
+
844
+ await processService.execute('TestProcess', {});
845
+
846
+ expect(mockRestService.post).toHaveBeenCalledWith(
847
+ "/Processes('TestProcess')/tm1.Execute",
848
+ "{}"
849
+ );
850
+ });
851
+
852
+ test('should handle null/undefined parameters gracefully', async () => {
853
+ mockRestService.post.mockResolvedValue(mockResponse({}));
854
+
855
+ await processService.execute('TestProcess', undefined);
856
+ await processService.executeWithReturn('TestProcess', null as any);
857
+
858
+ expect(mockRestService.post).toHaveBeenCalledTimes(2);
859
+ });
860
+
861
+ test('should handle search with no matches', async () => {
862
+ jest.spyOn(processService, 'getAll').mockResolvedValue([]);
863
+
864
+ const result = await processService.searchStringInCode('NonExistentString');
865
+
866
+ expect(result).toEqual([]);
867
+ });
868
+
869
+ test('should handle large numbers of processes', async () => {
870
+ const largeProcessList = Array.from({ length: 1000 }, (_, i) => ({
871
+ name: `Process${i}`,
872
+ prologProcedure: `WriteToMessageLog(INFO, "Process ${i}");`,
873
+ metadataProcedure: '',
874
+ dataProcedure: '',
875
+ epilogProcedure: ''
876
+ }));
877
+
878
+ jest.spyOn(processService, 'getAll').mockResolvedValue(largeProcessList as any);
879
+
880
+ const result = await processService.searchStringInCode('WriteToMessageLog');
881
+
882
+ expect(result).toHaveLength(1000);
883
+ });
884
+ });
885
+
886
+ describe('Integration Patterns', () => {
887
+ test('should support process lifecycle management', async () => {
888
+ mockRestService.post.mockResolvedValue(mockResponse({}));
889
+ mockRestService.patch.mockResolvedValue(mockResponse({}));
890
+ mockRestService.delete.mockResolvedValue(mockResponse({}));
891
+ jest.spyOn(processService, 'exists').mockResolvedValue(true);
892
+
893
+ // Create, execute, update, delete workflow
894
+ await processService.create(mockProcess);
895
+ await processService.execute('TestProcess');
896
+ await processService.update(mockProcess);
897
+ await processService.delete('TestProcess');
898
+
899
+ expect(mockRestService.post).toHaveBeenCalledTimes(2); // create + execute
900
+ expect(mockRestService.patch).toHaveBeenCalledTimes(1);
901
+ expect(mockRestService.delete).toHaveBeenCalledTimes(1);
902
+ });
903
+
904
+ test('should support debug workflow management', async () => {
905
+ mockRestService.post.mockResolvedValue(mockResponse({}));
906
+ mockRestService.get.mockResolvedValue(mockResponse({ value: [] }));
907
+ mockRestService.delete.mockResolvedValue(mockResponse({}));
908
+
909
+ // Debug workflow: set breakpoint, run debug commands, remove breakpoint
910
+ await processService.createProcessDebugBreakpoint('TestProcess', mockProcessDebugBreakpoint);
911
+ await processService.debugStepOver('TestProcess');
912
+ await processService.debugContinue('TestProcess');
913
+ await processService.deleteProcessDebugBreakpoint('TestProcess', 5);
914
+
915
+ expect(mockRestService.post).toHaveBeenCalledTimes(3);
916
+ expect(mockRestService.delete).toHaveBeenCalledTimes(1);
917
+ });
918
+
919
+ test('should support comprehensive process analysis', async () => {
920
+ const processes = [mockProcess];
921
+ jest.spyOn(processService, 'getAll').mockResolvedValue(processes as any);
922
+ mockRestService.get.mockResolvedValue(mockResponse({ value: [] }));
923
+
924
+ // Analysis workflow: search code, search names, get error logs
925
+ await processService.searchStringInCode('WriteToMessageLog');
926
+ await processService.searchStringInName('Test');
927
+ await processService.getErrorLogFilenames();
928
+
929
+ expect(processService.getAll).toHaveBeenCalled();
930
+ expect(mockRestService.get).toHaveBeenCalledTimes(2);
931
+ });
932
+ });
933
+ });