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,656 @@
1
+ "use strict";
2
+ /**
3
+ * Comprehensive ProcessService Tests
4
+ * Target: Achieve 80%+ coverage for ProcessService (currently 56%)
5
+ * Testing all process operations including CRUD, execution, debugging, and TI code handling
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ const ProcessService_1 = require("../services/ProcessService");
9
+ const Process_1 = require("../objects/Process");
10
+ const ProcessDebugBreakpoint_1 = require("../objects/ProcessDebugBreakpoint");
11
+ const TM1Exception_1 = require("../exceptions/TM1Exception");
12
+ // Mock dependencies
13
+ jest.mock('../objects/Process');
14
+ jest.mock('../objects/ProcessDebugBreakpoint');
15
+ describe('ProcessService - Comprehensive Tests', () => {
16
+ let processService;
17
+ let mockRestService;
18
+ const mockResponse = (data) => ({
19
+ data: data,
20
+ status: 200,
21
+ statusText: 'OK',
22
+ headers: {},
23
+ config: { headers: {} }
24
+ });
25
+ const mockProcess = {
26
+ name: 'TestProcess',
27
+ body: {
28
+ Name: 'TestProcess',
29
+ PrologProcedure: 'sTest = "Hello World";',
30
+ MetadataProcedure: '',
31
+ DataProcedure: '',
32
+ EpilogProcedure: 'WriteToMessageLog(INFO, sTest);'
33
+ },
34
+ prologProcedure: 'sTest = "Hello World";',
35
+ metadataProcedure: '',
36
+ dataProcedure: '',
37
+ epilogProcedure: 'WriteToMessageLog(INFO, sTest);'
38
+ };
39
+ const mockProcessDebugBreakpoint = {
40
+ lineNumber: 5,
41
+ procedure: 'Prolog',
42
+ body: {
43
+ LineNumber: 5,
44
+ Procedure: 'Prolog'
45
+ }
46
+ };
47
+ beforeEach(() => {
48
+ mockRestService = {
49
+ get: jest.fn(),
50
+ post: jest.fn(),
51
+ patch: jest.fn(),
52
+ put: jest.fn(),
53
+ delete: jest.fn()
54
+ };
55
+ processService = new ProcessService_1.ProcessService(mockRestService);
56
+ // Mock Process.fromDict
57
+ Process_1.Process.fromDict = jest.fn().mockReturnValue(mockProcess);
58
+ // Mock ProcessDebugBreakpoint.fromDict
59
+ ProcessDebugBreakpoint_1.ProcessDebugBreakpoint.fromDict = jest.fn().mockReturnValue(mockProcessDebugBreakpoint);
60
+ });
61
+ afterEach(() => {
62
+ jest.clearAllMocks();
63
+ });
64
+ describe('Constructor and Initialization', () => {
65
+ test('should initialize ProcessService properly', () => {
66
+ expect(processService).toBeDefined();
67
+ expect(processService).toBeInstanceOf(ProcessService_1.ProcessService);
68
+ });
69
+ test('should extend ObjectService', () => {
70
+ expect(processService).toBeInstanceOf(ProcessService_1.ProcessService);
71
+ // Note: ObjectService inheritance tested through functionality
72
+ });
73
+ });
74
+ describe('Process CRUD Operations', () => {
75
+ test('should get process by name', async () => {
76
+ const processData = {
77
+ Name: 'TestProcess',
78
+ PrologProcedure: 'sTest = "Hello";'
79
+ };
80
+ mockRestService.get.mockResolvedValue(mockResponse(processData));
81
+ const result = await processService.get('TestProcess');
82
+ expect(Process_1.Process.fromDict).toHaveBeenCalledWith(processData);
83
+ expect(mockRestService.get).toHaveBeenCalledWith(expect.stringContaining("/Processes('TestProcess')?$select=*,UIData,VariablesUIData,"));
84
+ expect(result).toEqual(mockProcess);
85
+ });
86
+ test('should get all processes', async () => {
87
+ const processesData = {
88
+ value: [
89
+ { Name: 'Process1', PrologProcedure: 'test1;' },
90
+ { Name: 'Process2', PrologProcedure: 'test2;' }
91
+ ]
92
+ };
93
+ mockRestService.get.mockResolvedValue(mockResponse(processesData));
94
+ const result = await processService.getAll();
95
+ expect(result).toHaveLength(2);
96
+ expect(Process_1.Process.fromDict).toHaveBeenCalledTimes(2);
97
+ expect(mockRestService.get).toHaveBeenCalledWith(expect.stringContaining("/Processes?$select=*,UIData,VariablesUIData,"));
98
+ });
99
+ test('should get all processes excluding control processes', async () => {
100
+ const processesData = {
101
+ value: [
102
+ { Name: 'Process1', PrologProcedure: 'test1;' },
103
+ { Name: 'Process2', PrologProcedure: 'test2;' }
104
+ ]
105
+ };
106
+ mockRestService.get.mockResolvedValue(mockResponse(processesData));
107
+ const result = await processService.getAll(true);
108
+ expect(result).toHaveLength(2);
109
+ expect(mockRestService.get).toHaveBeenCalledWith(expect.stringMatching(/.*&\$filter=startswith\(Name,'\}'\) eq false and startswith\(Name,'\{'\) eq false$/));
110
+ });
111
+ test('should get all process names', async () => {
112
+ const processNamesData = {
113
+ value: [
114
+ { Name: 'Process1' },
115
+ { Name: 'Process2' },
116
+ { Name: '}Control' }
117
+ ]
118
+ };
119
+ mockRestService.get.mockResolvedValue(mockResponse(processNamesData));
120
+ const result = await processService.getAllNames();
121
+ expect(result).toEqual(['Process1', 'Process2', '}Control']);
122
+ expect(mockRestService.get).toHaveBeenCalledWith("/Processes?$select=Name");
123
+ });
124
+ test('should get all process names excluding control processes', async () => {
125
+ const processNamesData = {
126
+ value: [
127
+ { Name: 'Process1' },
128
+ { Name: 'Process2' }
129
+ ]
130
+ };
131
+ mockRestService.get.mockResolvedValue(mockResponse(processNamesData));
132
+ const result = await processService.getAllNames(true);
133
+ expect(result).toEqual(['Process1', 'Process2']);
134
+ expect(mockRestService.get).toHaveBeenCalledWith("/Processes?$select=Name&$filter=startswith(Name,'}') eq false and startswith(Name,'{') eq false");
135
+ });
136
+ test('should create process', async () => {
137
+ mockRestService.post.mockResolvedValue(mockResponse({}));
138
+ const result = await processService.create(mockProcess);
139
+ expect(result).toBeDefined();
140
+ expect(mockRestService.post).toHaveBeenCalledWith("/Processes", mockProcess.body);
141
+ });
142
+ test('should update process', async () => {
143
+ mockRestService.patch.mockResolvedValue(mockResponse({}));
144
+ const result = await processService.update(mockProcess);
145
+ expect(result).toBeDefined();
146
+ expect(mockRestService.patch).toHaveBeenCalledWith("/Processes('TestProcess')", mockProcess.body);
147
+ });
148
+ test('should delete process', async () => {
149
+ mockRestService.delete.mockResolvedValue(mockResponse({}));
150
+ const result = await processService.delete('TestProcess');
151
+ expect(result).toBeDefined();
152
+ expect(mockRestService.delete).toHaveBeenCalledWith("/Processes('TestProcess')");
153
+ });
154
+ test('should check if process exists', async () => {
155
+ mockRestService.get.mockResolvedValue(mockResponse(mockProcess));
156
+ const result = await processService.exists('TestProcess');
157
+ expect(result).toBe(true);
158
+ });
159
+ test('should return false when process does not exist', async () => {
160
+ const error = new TM1Exception_1.TM1RestException('Process not found', 404);
161
+ error.statusCode = 404; // Set the statusCode property that ProcessService checks
162
+ mockRestService.get.mockRejectedValue(error);
163
+ const result = await processService.exists('NonExistentProcess');
164
+ expect(result).toBe(false);
165
+ });
166
+ test('should throw error for non-404 errors in exists check', async () => {
167
+ const error = new TM1Exception_1.TM1RestException('Server error', 500);
168
+ error.statusCode = 500; // Set the statusCode property that ProcessService checks
169
+ mockRestService.get.mockRejectedValue(error);
170
+ await expect(processService.exists('TestProcess')).rejects.toThrow('Server error');
171
+ });
172
+ });
173
+ describe('Process Execution Operations', () => {
174
+ test('should execute process without parameters', async () => {
175
+ mockRestService.post.mockResolvedValue(mockResponse({}));
176
+ const result = await processService.execute('TestProcess');
177
+ expect(result).toBeDefined();
178
+ expect(mockRestService.post).toHaveBeenCalledWith("/Processes('TestProcess')/tm1.Execute", "{}");
179
+ });
180
+ test('should execute process with parameters', async () => {
181
+ mockRestService.post.mockResolvedValue(mockResponse({}));
182
+ const parameters = {
183
+ pParam1: 'Value1',
184
+ pParam2: 42,
185
+ pParam3: true
186
+ };
187
+ const result = await processService.execute('TestProcess', parameters);
188
+ expect(result).toBeDefined();
189
+ expect(mockRestService.post).toHaveBeenCalledWith("/Processes('TestProcess')/tm1.Execute", JSON.stringify({
190
+ Parameters: [
191
+ { Name: 'pParam1', Value: 'Value1' },
192
+ { Name: 'pParam2', Value: 42 },
193
+ { Name: 'pParam3', Value: true }
194
+ ]
195
+ }));
196
+ });
197
+ test('should execute process with return', async () => {
198
+ const returnData = {
199
+ ProcessExecuteStatusCode: 'CompletedSuccessfully',
200
+ ErrorLogFile: null
201
+ };
202
+ mockRestService.post.mockResolvedValue(mockResponse(returnData));
203
+ const result = await processService.executeWithReturn('TestProcess');
204
+ expect(result).toEqual(mockResponse(returnData));
205
+ expect(mockRestService.post).toHaveBeenCalledWith("/Processes('TestProcess')/tm1.ExecuteWithReturn?$expand=*", "{}", {});
206
+ });
207
+ test('should execute process with return and parameters', async () => {
208
+ const returnData = {
209
+ ProcessExecuteStatusCode: 'CompletedSuccessfully',
210
+ Parameters: [{ Name: 'pParam1', Value: 'Result1' }]
211
+ };
212
+ mockRestService.post.mockResolvedValue(mockResponse(returnData));
213
+ const parameters = { pParam1: 'Input1' };
214
+ const result = await processService.executeWithReturn('TestProcess', parameters);
215
+ expect(result).toEqual(mockResponse(returnData));
216
+ expect(mockRestService.post).toHaveBeenCalledWith("/Processes('TestProcess')/tm1.ExecuteWithReturn?$expand=*", JSON.stringify({
217
+ Parameters: [{ Name: 'pParam1', Value: 'Input1' }]
218
+ }), {});
219
+ });
220
+ test('should execute process with return and timeout', async () => {
221
+ const returnData = { ProcessExecuteStatusCode: 'CompletedSuccessfully' };
222
+ mockRestService.post.mockResolvedValue(mockResponse(returnData));
223
+ const result = await processService.executeWithReturn('TestProcess', {}, 30);
224
+ expect(result).toEqual(mockResponse(returnData));
225
+ expect(mockRestService.post).toHaveBeenCalledWith("/Processes('TestProcess')/tm1.ExecuteWithReturn?$expand=*", "{}", { timeout: 30000 });
226
+ });
227
+ test('should execute process with return data extraction', async () => {
228
+ const returnData = {
229
+ ProcessExecuteStatusCode: 'CompletedSuccessfully',
230
+ Parameters: [{ Name: 'result', Value: 'success' }]
231
+ };
232
+ mockRestService.post.mockResolvedValue(mockResponse(returnData));
233
+ const result = await processService.executeProcessWithReturn('TestProcess');
234
+ expect(result).toEqual(returnData);
235
+ });
236
+ test('should compile process', async () => {
237
+ mockRestService.post.mockResolvedValue(mockResponse({}));
238
+ const result = await processService.compile('TestProcess');
239
+ expect(result).toBeDefined();
240
+ expect(mockRestService.post).toHaveBeenCalledWith("/Processes('TestProcess')/tm1.Compile", '{}');
241
+ });
242
+ });
243
+ describe('TI Code Execution Operations', () => {
244
+ test('should execute TI code with all sections', async () => {
245
+ mockRestService.post.mockResolvedValue(mockResponse({}));
246
+ const prologLines = ['sMessage = "Starting";', 'WriteToMessageLog(INFO, sMessage);'];
247
+ const metadataLines = ['DimensionCreate("TestDim");'];
248
+ const dataLines = ['CellPutN(100, "TestCube", "Element1");'];
249
+ const epilogLines = ['sMessage = "Completed";', 'WriteToMessageLog(INFO, sMessage);'];
250
+ const result = await processService.executeTiCode(prologLines, metadataLines, dataLines, epilogLines);
251
+ expect(result).toBeDefined();
252
+ expect(mockRestService.post).toHaveBeenCalledWith("/ExecuteProcessWithReturn", JSON.stringify({
253
+ PrologProcedure: prologLines.join('\n'),
254
+ MetadataProcedure: metadataLines.join('\n'),
255
+ DataProcedure: dataLines.join('\n'),
256
+ EpilogProcedure: epilogLines.join('\n')
257
+ }));
258
+ });
259
+ test('should execute TI code with parameters', async () => {
260
+ mockRestService.post.mockResolvedValue(mockResponse({}));
261
+ const prologLines = ['WriteToMessageLog(INFO, pMessage);'];
262
+ const parameters = { pMessage: 'Test Message', pValue: 123 };
263
+ const result = await processService.executeTiCode(prologLines, undefined, undefined, undefined, parameters);
264
+ expect(result).toBeDefined();
265
+ expect(mockRestService.post).toHaveBeenCalledWith("/ExecuteProcessWithReturn", JSON.stringify({
266
+ PrologProcedure: prologLines.join('\n'),
267
+ Parameters: [
268
+ { Name: 'pMessage', Value: 'Test Message' },
269
+ { Name: 'pValue', Value: 123 }
270
+ ]
271
+ }));
272
+ });
273
+ test('should execute TI code with partial sections', async () => {
274
+ mockRestService.post.mockResolvedValue(mockResponse({}));
275
+ const prologLines = ['sTest = "Prolog only";'];
276
+ const result = await processService.executeTiCode(prologLines);
277
+ expect(result).toBeDefined();
278
+ expect(mockRestService.post).toHaveBeenCalledWith("/ExecuteProcessWithReturn", JSON.stringify({
279
+ PrologProcedure: prologLines.join('\n')
280
+ }));
281
+ });
282
+ test('should compile single TI statement', async () => {
283
+ const compilationResult = {
284
+ IsValid: true,
285
+ Errors: []
286
+ };
287
+ mockRestService.post.mockResolvedValue(mockResponse(compilationResult));
288
+ const result = await processService.compileSingleStatement('WriteToMessageLog(INFO, "Test");');
289
+ expect(result).toEqual(mockResponse(compilationResult));
290
+ expect(mockRestService.post).toHaveBeenCalledWith("/CompileStatement", JSON.stringify({
291
+ Statement: 'WriteToMessageLog(INFO, "Test");'
292
+ }));
293
+ });
294
+ });
295
+ describe('Process Search Operations', () => {
296
+ test('should search string in process code', async () => {
297
+ const processes = [
298
+ {
299
+ name: 'Process1',
300
+ prologProcedure: 'WriteToMessageLog(INFO, "Hello");',
301
+ metadataProcedure: '',
302
+ dataProcedure: '',
303
+ epilogProcedure: ''
304
+ },
305
+ {
306
+ name: 'Process2',
307
+ prologProcedure: 'sMessage = "World";',
308
+ metadataProcedure: '',
309
+ dataProcedure: '',
310
+ epilogProcedure: 'WriteToMessageLog(INFO, sMessage);'
311
+ },
312
+ {
313
+ name: 'Process3',
314
+ prologProcedure: 'CellPutN(100, "Cube", "Element");',
315
+ metadataProcedure: '',
316
+ dataProcedure: '',
317
+ epilogProcedure: ''
318
+ }
319
+ ];
320
+ // Mock getAll method
321
+ jest.spyOn(processService, 'getAll').mockResolvedValue(processes);
322
+ const result = await processService.searchStringInCode('WriteToMessageLog');
323
+ expect(result).toEqual(['Process1', 'Process2']);
324
+ expect(processService.getAll).toHaveBeenCalledWith(false);
325
+ });
326
+ test('should search string in process code excluding control processes', async () => {
327
+ const processes = [
328
+ {
329
+ name: 'Process1',
330
+ prologProcedure: 'WriteToMessageLog(INFO, "Test");',
331
+ metadataProcedure: '',
332
+ dataProcedure: '',
333
+ epilogProcedure: ''
334
+ }
335
+ ];
336
+ jest.spyOn(processService, 'getAll').mockResolvedValue(processes);
337
+ const result = await processService.searchStringInCode('WriteToMessageLog', true);
338
+ expect(result).toEqual(['Process1']);
339
+ expect(processService.getAll).toHaveBeenCalledWith(true);
340
+ });
341
+ test('should search string in process names', async () => {
342
+ const processNamesData = {
343
+ value: [
344
+ { Name: 'DataLoad_Sales' },
345
+ { Name: 'DataLoad_Budget' },
346
+ { Name: 'SecuritySetup' }
347
+ ]
348
+ };
349
+ mockRestService.get.mockResolvedValue(mockResponse(processNamesData));
350
+ const result = await processService.searchStringInName('DataLoad');
351
+ expect(result).toEqual(['DataLoad_Sales', 'DataLoad_Budget', 'SecuritySetup']);
352
+ expect(mockRestService.get).toHaveBeenCalledWith("/Processes?$select=Name&$filter=indexof(tolower(Name), 'dataload') ge 0");
353
+ });
354
+ test('should search string in process names excluding control processes', async () => {
355
+ const processNamesData = {
356
+ value: [
357
+ { Name: 'DataLoad_Sales' }
358
+ ]
359
+ };
360
+ mockRestService.get.mockResolvedValue(mockResponse(processNamesData));
361
+ const result = await processService.searchStringInName('DataLoad', true);
362
+ expect(result).toEqual(['DataLoad_Sales']);
363
+ expect(mockRestService.get).toHaveBeenCalledWith("/Processes?$select=Name&$filter=indexof(tolower(Name), 'dataload') ge 0 and not startswith(Name, '}') and not startswith(Name, '{')");
364
+ });
365
+ });
366
+ describe('Process Debug Operations', () => {
367
+ test('should get process debug breakpoints', async () => {
368
+ const breakpointsData = {
369
+ value: [
370
+ { LineNumber: 5, Procedure: 'Prolog' },
371
+ { LineNumber: 10, Procedure: 'Epilog' }
372
+ ]
373
+ };
374
+ mockRestService.get.mockResolvedValue(mockResponse(breakpointsData));
375
+ const result = await processService.getProcessDebugBreakpoints('TestProcess');
376
+ expect(result).toHaveLength(2);
377
+ expect(ProcessDebugBreakpoint_1.ProcessDebugBreakpoint.fromDict).toHaveBeenCalledTimes(2);
378
+ expect(mockRestService.get).toHaveBeenCalledWith("/Processes('TestProcess')/Breakpoints");
379
+ });
380
+ test('should create process debug breakpoint', async () => {
381
+ mockRestService.post.mockResolvedValue(mockResponse({}));
382
+ const result = await processService.createProcessDebugBreakpoint('TestProcess', mockProcessDebugBreakpoint);
383
+ expect(result).toBeDefined();
384
+ expect(mockRestService.post).toHaveBeenCalledWith("/Processes('TestProcess')/Breakpoints", mockProcessDebugBreakpoint.body);
385
+ });
386
+ test('should delete process debug breakpoint', async () => {
387
+ mockRestService.delete.mockResolvedValue(mockResponse({}));
388
+ const result = await processService.deleteProcessDebugBreakpoint('TestProcess', 5);
389
+ expect(result).toBeDefined();
390
+ expect(mockRestService.delete).toHaveBeenCalledWith("/Processes('TestProcess')/Breakpoints(5)");
391
+ });
392
+ test('should debug step over', async () => {
393
+ mockRestService.post.mockResolvedValue(mockResponse({}));
394
+ await processService.debugStepOver('TestProcess');
395
+ expect(mockRestService.post).toHaveBeenCalledWith("/Processes('TestProcess')/tm1.DebugStepOver", {});
396
+ });
397
+ test('should debug step in', async () => {
398
+ mockRestService.post.mockResolvedValue(mockResponse({}));
399
+ await processService.debugStepIn('TestProcess');
400
+ expect(mockRestService.post).toHaveBeenCalledWith("/Processes('TestProcess')/tm1.DebugStepIn", {});
401
+ });
402
+ test('should debug step out', async () => {
403
+ mockRestService.post.mockResolvedValue(mockResponse({}));
404
+ await processService.debugStepOut('TestProcess');
405
+ expect(mockRestService.post).toHaveBeenCalledWith("/Processes('TestProcess')/tm1.DebugStepOut", {});
406
+ });
407
+ test('should debug continue', async () => {
408
+ mockRestService.post.mockResolvedValue(mockResponse({}));
409
+ await processService.debugContinue('TestProcess');
410
+ expect(mockRestService.post).toHaveBeenCalledWith("/Processes('TestProcess')/tm1.DebugContinue", {});
411
+ });
412
+ });
413
+ describe('Error Log Operations', () => {
414
+ test('should get error log file content', async () => {
415
+ const logContent = '2025-01-15 10:00:00 ERROR Process failed at line 5';
416
+ mockRestService.get.mockResolvedValue(mockResponse(logContent));
417
+ const result = await processService.getErrorLogFileContent('TestProcess_20250115.log');
418
+ expect(result).toBe(logContent);
419
+ expect(mockRestService.get).toHaveBeenCalledWith("/Contents('Logs/TestProcess_20250115.log')");
420
+ });
421
+ test('should get error log filenames', async () => {
422
+ const filesData = {
423
+ value: [
424
+ { Name: 'Process1_20250115.log' },
425
+ { Name: 'Process2_20250114.log' },
426
+ { Name: 'Process3_20250113.log' }
427
+ ]
428
+ };
429
+ mockRestService.get.mockResolvedValue(mockResponse(filesData));
430
+ const result = await processService.getErrorLogFilenames();
431
+ expect(result).toEqual(['Process1_20250115.log', 'Process2_20250114.log', 'Process3_20250113.log']);
432
+ expect(mockRestService.get).toHaveBeenCalledWith("/Contents('Logs')?$select=Name&$filter=endswith(Name,'.log')");
433
+ });
434
+ test('should get error log filenames with top limit', async () => {
435
+ const filesData = {
436
+ value: [
437
+ { Name: 'Process1_20250115.log' },
438
+ { Name: 'Process2_20250114.log' }
439
+ ]
440
+ };
441
+ mockRestService.get.mockResolvedValue(mockResponse(filesData));
442
+ const result = await processService.getErrorLogFilenames(2);
443
+ expect(result).toEqual(['Process1_20250115.log', 'Process2_20250114.log']);
444
+ expect(mockRestService.get).toHaveBeenCalledWith("/Contents('Logs')?$select=Name&$filter=endswith(Name,'.log')&$top=2");
445
+ });
446
+ test('should delete error log file', async () => {
447
+ mockRestService.delete.mockResolvedValue(mockResponse({}));
448
+ const result = await processService.deleteErrorLogFile('TestProcess_20250115.log');
449
+ expect(result).toBeDefined();
450
+ expect(mockRestService.delete).toHaveBeenCalledWith("/Contents('Logs/TestProcess_20250115.log')");
451
+ });
452
+ test('should get last message from message log', async () => {
453
+ const result = await processService.getLastMessageFromMessagelog('TestProcess');
454
+ // This method currently returns empty string as per implementation
455
+ expect(result).toBe('');
456
+ });
457
+ });
458
+ describe('Advanced Process Operations', () => {
459
+ test('should update or create process - update existing', async () => {
460
+ jest.spyOn(processService, 'exists').mockResolvedValue(true);
461
+ jest.spyOn(processService, 'update').mockResolvedValue(mockResponse({}));
462
+ const result = await processService.updateOrCreate(mockProcess);
463
+ expect(processService.exists).toHaveBeenCalledWith('TestProcess');
464
+ expect(processService.update).toHaveBeenCalledWith(mockProcess);
465
+ expect(result).toBeDefined();
466
+ });
467
+ test('should update or create process - create new', async () => {
468
+ jest.spyOn(processService, 'exists').mockResolvedValue(false);
469
+ jest.spyOn(processService, 'create').mockResolvedValue(mockResponse({}));
470
+ const result = await processService.updateOrCreate(mockProcess);
471
+ expect(processService.exists).toHaveBeenCalledWith('TestProcess');
472
+ expect(processService.create).toHaveBeenCalledWith(mockProcess);
473
+ expect(result).toBeDefined();
474
+ });
475
+ test('should clone process with data', async () => {
476
+ const sourceProcess = { ...mockProcess, name: 'SourceProcess' };
477
+ jest.spyOn(processService, 'get').mockResolvedValue(sourceProcess);
478
+ jest.spyOn(processService, 'create').mockResolvedValue(mockResponse({}));
479
+ const result = await processService.clone('SourceProcess', 'TargetProcess', true);
480
+ expect(processService.get).toHaveBeenCalledWith('SourceProcess');
481
+ expect(processService.create).toHaveBeenCalledWith(expect.objectContaining({ name: 'TargetProcess' }));
482
+ expect(result).toBeDefined();
483
+ });
484
+ test('should clone process without data', async () => {
485
+ const sourceProcess = { ...mockProcess, name: 'SourceProcess' };
486
+ jest.spyOn(processService, 'get').mockResolvedValue(sourceProcess);
487
+ jest.spyOn(processService, 'create').mockResolvedValue(mockResponse({}));
488
+ const result = await processService.clone('SourceProcess', 'TargetProcess', false);
489
+ expect(processService.get).toHaveBeenCalledWith('SourceProcess');
490
+ expect(processService.create).toHaveBeenCalledWith(expect.objectContaining({ name: 'TargetProcess' }));
491
+ expect(result).toBeDefined();
492
+ });
493
+ });
494
+ describe('Boolean TI Expression Evaluation', () => {
495
+ test('should evaluate boolean TI expression - true result', async () => {
496
+ // Mock the series of REST calls for evaluation
497
+ mockRestService.post
498
+ .mockResolvedValueOnce(mockResponse({})) // Create dimension
499
+ .mockResolvedValueOnce(mockResponse({})) // Create cube
500
+ .mockResolvedValueOnce(mockResponse({})) // Create process
501
+ .mockResolvedValueOnce(mockResponse({})); // Execute process
502
+ mockRestService.get.mockResolvedValue(mockResponse({
503
+ Cells: [{ Value: 1 }]
504
+ }));
505
+ mockRestService.delete
506
+ .mockResolvedValueOnce(mockResponse({})) // Delete process
507
+ .mockResolvedValueOnce(mockResponse({})) // Delete cube
508
+ .mockResolvedValueOnce(mockResponse({})); // Delete dimension
509
+ const result = await processService.evaluateBooleanTiExpression('1 = 1');
510
+ expect(result).toBe(true);
511
+ expect(mockRestService.post).toHaveBeenCalledTimes(4);
512
+ expect(mockRestService.delete).toHaveBeenCalledTimes(3);
513
+ });
514
+ test('should evaluate boolean TI expression - false result', async () => {
515
+ // Mock the series of REST calls for evaluation
516
+ mockRestService.post
517
+ .mockResolvedValueOnce(mockResponse({})) // Create dimension
518
+ .mockResolvedValueOnce(mockResponse({})) // Create cube
519
+ .mockResolvedValueOnce(mockResponse({})) // Create process
520
+ .mockResolvedValueOnce(mockResponse({})); // Execute process
521
+ mockRestService.get.mockResolvedValue(mockResponse({
522
+ Cells: [{ Value: 0 }]
523
+ }));
524
+ mockRestService.delete
525
+ .mockResolvedValueOnce(mockResponse({})) // Delete process
526
+ .mockResolvedValueOnce(mockResponse({})) // Delete cube
527
+ .mockResolvedValueOnce(mockResponse({})); // Delete dimension
528
+ const result = await processService.evaluateBooleanTiExpression('1 = 0');
529
+ expect(result).toBe(false);
530
+ });
531
+ test('should handle evaluation errors and cleanup', async () => {
532
+ mockRestService.post
533
+ .mockResolvedValueOnce(mockResponse({})) // Create dimension
534
+ .mockResolvedValueOnce(mockResponse({})) // Create cube
535
+ .mockRejectedValueOnce(new Error('Process creation failed')); // Fail process creation
536
+ mockRestService.delete
537
+ .mockResolvedValueOnce(mockResponse({})) // Delete cube
538
+ .mockResolvedValueOnce(mockResponse({})); // Delete dimension
539
+ await expect(processService.evaluateBooleanTiExpression('invalid expression'))
540
+ .rejects.toThrow('Process creation failed');
541
+ // Verify cleanup was attempted
542
+ expect(mockRestService.delete).toHaveBeenCalledTimes(2);
543
+ });
544
+ });
545
+ describe('Error Handling', () => {
546
+ test('should handle process retrieval errors', async () => {
547
+ const error = new Error('Process not found');
548
+ mockRestService.get.mockRejectedValue(error);
549
+ await expect(processService.get('NonExistentProcess')).rejects.toThrow('Process not found');
550
+ });
551
+ test('should handle process creation errors', async () => {
552
+ const error = new Error('Process creation failed');
553
+ mockRestService.post.mockRejectedValue(error);
554
+ await expect(processService.create(mockProcess)).rejects.toThrow('Process creation failed');
555
+ });
556
+ test('should handle process execution errors', async () => {
557
+ const error = new Error('Process execution failed');
558
+ mockRestService.post.mockRejectedValue(error);
559
+ await expect(processService.execute('TestProcess')).rejects.toThrow('Process execution failed');
560
+ });
561
+ test('should handle compilation errors', async () => {
562
+ const error = new Error('Compilation failed');
563
+ mockRestService.post.mockRejectedValue(error);
564
+ await expect(processService.compile('TestProcess')).rejects.toThrow('Compilation failed');
565
+ });
566
+ test('should handle debug operation errors', async () => {
567
+ const error = new Error('Debug operation failed');
568
+ mockRestService.post.mockRejectedValue(error);
569
+ await expect(processService.debugStepOver('TestProcess')).rejects.toThrow('Debug operation failed');
570
+ });
571
+ });
572
+ describe('Edge Cases and Special Scenarios', () => {
573
+ test('should handle empty process lists', async () => {
574
+ mockRestService.get.mockResolvedValue(mockResponse({ value: [] }));
575
+ const processes = await processService.getAll();
576
+ const processNames = await processService.getAllNames();
577
+ expect(processes).toEqual([]);
578
+ expect(processNames).toEqual([]);
579
+ });
580
+ test('should handle processes with special characters in names', async () => {
581
+ const specialName = "Process's & \"Special\" Name";
582
+ mockRestService.get.mockResolvedValue(mockResponse({ Name: specialName }));
583
+ await processService.get(specialName);
584
+ // The formatUrl method encodes special characters
585
+ expect(mockRestService.get).toHaveBeenCalledWith(expect.stringContaining("/Processes('Process's%20%26%20%22Special%22%20Name')"));
586
+ });
587
+ test('should handle empty parameter objects', async () => {
588
+ mockRestService.post.mockResolvedValue(mockResponse({}));
589
+ await processService.execute('TestProcess', {});
590
+ expect(mockRestService.post).toHaveBeenCalledWith("/Processes('TestProcess')/tm1.Execute", "{}");
591
+ });
592
+ test('should handle null/undefined parameters gracefully', async () => {
593
+ mockRestService.post.mockResolvedValue(mockResponse({}));
594
+ await processService.execute('TestProcess', undefined);
595
+ await processService.executeWithReturn('TestProcess', null);
596
+ expect(mockRestService.post).toHaveBeenCalledTimes(2);
597
+ });
598
+ test('should handle search with no matches', async () => {
599
+ jest.spyOn(processService, 'getAll').mockResolvedValue([]);
600
+ const result = await processService.searchStringInCode('NonExistentString');
601
+ expect(result).toEqual([]);
602
+ });
603
+ test('should handle large numbers of processes', async () => {
604
+ const largeProcessList = Array.from({ length: 1000 }, (_, i) => ({
605
+ name: `Process${i}`,
606
+ prologProcedure: `WriteToMessageLog(INFO, "Process ${i}");`,
607
+ metadataProcedure: '',
608
+ dataProcedure: '',
609
+ epilogProcedure: ''
610
+ }));
611
+ jest.spyOn(processService, 'getAll').mockResolvedValue(largeProcessList);
612
+ const result = await processService.searchStringInCode('WriteToMessageLog');
613
+ expect(result).toHaveLength(1000);
614
+ });
615
+ });
616
+ describe('Integration Patterns', () => {
617
+ test('should support process lifecycle management', async () => {
618
+ mockRestService.post.mockResolvedValue(mockResponse({}));
619
+ mockRestService.patch.mockResolvedValue(mockResponse({}));
620
+ mockRestService.delete.mockResolvedValue(mockResponse({}));
621
+ jest.spyOn(processService, 'exists').mockResolvedValue(true);
622
+ // Create, execute, update, delete workflow
623
+ await processService.create(mockProcess);
624
+ await processService.execute('TestProcess');
625
+ await processService.update(mockProcess);
626
+ await processService.delete('TestProcess');
627
+ expect(mockRestService.post).toHaveBeenCalledTimes(2); // create + execute
628
+ expect(mockRestService.patch).toHaveBeenCalledTimes(1);
629
+ expect(mockRestService.delete).toHaveBeenCalledTimes(1);
630
+ });
631
+ test('should support debug workflow management', async () => {
632
+ mockRestService.post.mockResolvedValue(mockResponse({}));
633
+ mockRestService.get.mockResolvedValue(mockResponse({ value: [] }));
634
+ mockRestService.delete.mockResolvedValue(mockResponse({}));
635
+ // Debug workflow: set breakpoint, run debug commands, remove breakpoint
636
+ await processService.createProcessDebugBreakpoint('TestProcess', mockProcessDebugBreakpoint);
637
+ await processService.debugStepOver('TestProcess');
638
+ await processService.debugContinue('TestProcess');
639
+ await processService.deleteProcessDebugBreakpoint('TestProcess', 5);
640
+ expect(mockRestService.post).toHaveBeenCalledTimes(3);
641
+ expect(mockRestService.delete).toHaveBeenCalledTimes(1);
642
+ });
643
+ test('should support comprehensive process analysis', async () => {
644
+ const processes = [mockProcess];
645
+ jest.spyOn(processService, 'getAll').mockResolvedValue(processes);
646
+ mockRestService.get.mockResolvedValue(mockResponse({ value: [] }));
647
+ // Analysis workflow: search code, search names, get error logs
648
+ await processService.searchStringInCode('WriteToMessageLog');
649
+ await processService.searchStringInName('Test');
650
+ await processService.getErrorLogFilenames();
651
+ expect(processService.getAll).toHaveBeenCalled();
652
+ expect(mockRestService.get).toHaveBeenCalledTimes(2);
653
+ });
654
+ });
655
+ });
656
+ //# sourceMappingURL=processService.comprehensive.test.js.map
@@ -0,0 +1,6 @@
1
+ /**
2
+ * ProcessService Tests for tm1npm
3
+ * Comprehensive tests for TM1 Process operations with proper mocking
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=processService.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processService.test.d.ts","sourceRoot":"","sources":["../../src/tests/processService.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}