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.
- package/.env.example +16 -0
- package/.eslintrc.js +28 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +36 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- package/.github/ISSUE_TEMPLATE/question.md +24 -0
- package/.github/workflows/publish-npm.yml +53 -0
- package/.github/workflows/test-on-tag.yml +172 -0
- package/DEVELOPMENT_GUIDE.md +587 -0
- package/LICENSE +21 -0
- package/README.md +580 -0
- package/jest.ci.config.js +83 -0
- package/jest.config.js +68 -0
- package/lib/exceptions/TM1Exception.d.ts +17 -0
- package/lib/exceptions/TM1Exception.d.ts.map +1 -0
- package/lib/exceptions/TM1Exception.js +36 -0
- package/lib/exceptions/TM1RestException.d.ts +10 -0
- package/lib/exceptions/TM1RestException.d.ts.map +1 -0
- package/lib/exceptions/TM1RestException.js +17 -0
- package/lib/exceptions/TM1TimeoutException.d.ts +9 -0
- package/lib/exceptions/TM1TimeoutException.d.ts.map +1 -0
- package/lib/exceptions/TM1TimeoutException.js +16 -0
- package/lib/index.d.ts +41 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +132 -0
- package/lib/objects/Annotation.d.ts +36 -0
- package/lib/objects/Annotation.d.ts.map +1 -0
- package/lib/objects/Annotation.js +134 -0
- package/lib/objects/Application.d.ts +67 -0
- package/lib/objects/Application.d.ts.map +1 -0
- package/lib/objects/Application.js +125 -0
- package/lib/objects/Axis.d.ts +36 -0
- package/lib/objects/Axis.d.ts.map +1 -0
- package/lib/objects/Axis.js +103 -0
- package/lib/objects/Chore.d.ts +43 -0
- package/lib/objects/Chore.d.ts.map +1 -0
- package/lib/objects/Chore.js +129 -0
- package/lib/objects/ChoreFrequency.d.ts +23 -0
- package/lib/objects/ChoreFrequency.d.ts.map +1 -0
- package/lib/objects/ChoreFrequency.js +61 -0
- package/lib/objects/ChoreStartTime.d.ts +15 -0
- package/lib/objects/ChoreStartTime.d.ts.map +1 -0
- package/lib/objects/ChoreStartTime.js +85 -0
- package/lib/objects/ChoreTask.d.ts +28 -0
- package/lib/objects/ChoreTask.d.ts.map +1 -0
- package/lib/objects/ChoreTask.js +66 -0
- package/lib/objects/Cube.d.ts +26 -0
- package/lib/objects/Cube.d.ts.map +1 -0
- package/lib/objects/Cube.js +109 -0
- package/lib/objects/Dimension.d.ts +26 -0
- package/lib/objects/Dimension.d.ts.map +1 -0
- package/lib/objects/Dimension.js +86 -0
- package/lib/objects/Element.d.ts +35 -0
- package/lib/objects/Element.d.ts.map +1 -0
- package/lib/objects/Element.js +115 -0
- package/lib/objects/ElementAttribute.d.ts +28 -0
- package/lib/objects/ElementAttribute.d.ts.map +1 -0
- package/lib/objects/ElementAttribute.js +97 -0
- package/lib/objects/Git.d.ts +21 -0
- package/lib/objects/Git.d.ts.map +1 -0
- package/lib/objects/Git.js +49 -0
- package/lib/objects/GitCommit.d.ts +12 -0
- package/lib/objects/GitCommit.d.ts.map +1 -0
- package/lib/objects/GitCommit.js +26 -0
- package/lib/objects/GitPlan.d.ts +35 -0
- package/lib/objects/GitPlan.d.ts.map +1 -0
- package/lib/objects/GitPlan.js +78 -0
- package/lib/objects/GitRemote.d.ts +12 -0
- package/lib/objects/GitRemote.d.ts.map +1 -0
- package/lib/objects/GitRemote.js +26 -0
- package/lib/objects/Hierarchy.d.ts +47 -0
- package/lib/objects/Hierarchy.d.ts.map +1 -0
- package/lib/objects/Hierarchy.js +165 -0
- package/lib/objects/MDXView.d.ts +19 -0
- package/lib/objects/MDXView.d.ts.map +1 -0
- package/lib/objects/MDXView.js +67 -0
- package/lib/objects/NativeView.d.ts +39 -0
- package/lib/objects/NativeView.d.ts.map +1 -0
- package/lib/objects/NativeView.js +209 -0
- package/lib/objects/Process.d.ts +70 -0
- package/lib/objects/Process.d.ts.map +1 -0
- package/lib/objects/Process.js +210 -0
- package/lib/objects/ProcessDebugBreakpoint.d.ts +60 -0
- package/lib/objects/ProcessDebugBreakpoint.d.ts.map +1 -0
- package/lib/objects/ProcessDebugBreakpoint.js +168 -0
- package/lib/objects/ProcessParameter.d.ts +23 -0
- package/lib/objects/ProcessParameter.d.ts.map +1 -0
- package/lib/objects/ProcessParameter.js +55 -0
- package/lib/objects/ProcessVariable.d.ts +26 -0
- package/lib/objects/ProcessVariable.d.ts.map +1 -0
- package/lib/objects/ProcessVariable.js +63 -0
- package/lib/objects/Rules.d.ts +30 -0
- package/lib/objects/Rules.d.ts.map +1 -0
- package/lib/objects/Rules.js +103 -0
- package/lib/objects/Sandbox.d.ts +21 -0
- package/lib/objects/Sandbox.d.ts.map +1 -0
- package/lib/objects/Sandbox.js +64 -0
- package/lib/objects/Server.d.ts +27 -0
- package/lib/objects/Server.d.ts.map +1 -0
- package/lib/objects/Server.js +26 -0
- package/lib/objects/Subset.d.ts +44 -0
- package/lib/objects/Subset.d.ts.map +1 -0
- package/lib/objects/Subset.js +222 -0
- package/lib/objects/TM1Object.d.ts +8 -0
- package/lib/objects/TM1Object.d.ts.map +1 -0
- package/lib/objects/TM1Object.js +17 -0
- package/lib/objects/TM1Project.d.ts +74 -0
- package/lib/objects/TM1Project.d.ts.map +1 -0
- package/lib/objects/TM1Project.js +409 -0
- package/lib/objects/User.d.ts +42 -0
- package/lib/objects/User.d.ts.map +1 -0
- package/lib/objects/User.js +157 -0
- package/lib/objects/View.d.ts +19 -0
- package/lib/objects/View.d.ts.map +1 -0
- package/lib/objects/View.js +33 -0
- package/lib/objects/index.d.ts +30 -0
- package/lib/objects/index.d.ts.map +1 -0
- package/lib/objects/index.js +68 -0
- package/lib/services/AnnotationService.d.ts +17 -0
- package/lib/services/AnnotationService.d.ts.map +1 -0
- package/lib/services/AnnotationService.js +91 -0
- package/lib/services/ApplicationService.d.ts +21 -0
- package/lib/services/ApplicationService.d.ts.map +1 -0
- package/lib/services/ApplicationService.js +227 -0
- package/lib/services/AuditLogService.d.ts +15 -0
- package/lib/services/AuditLogService.d.ts.map +1 -0
- package/lib/services/AuditLogService.js +153 -0
- package/lib/services/CellService.d.ts +191 -0
- package/lib/services/CellService.d.ts.map +1 -0
- package/lib/services/CellService.js +597 -0
- package/lib/services/ChoreService.d.ts +24 -0
- package/lib/services/ChoreService.d.ts.map +1 -0
- package/lib/services/ChoreService.js +219 -0
- package/lib/services/ConfigurationService.d.ts +18 -0
- package/lib/services/ConfigurationService.d.ts.map +1 -0
- package/lib/services/ConfigurationService.js +60 -0
- package/lib/services/CubeService.d.ts +43 -0
- package/lib/services/CubeService.d.ts.map +1 -0
- package/lib/services/CubeService.js +296 -0
- package/lib/services/DimensionService.d.ts +21 -0
- package/lib/services/DimensionService.d.ts.map +1 -0
- package/lib/services/DimensionService.js +146 -0
- package/lib/services/ElementService.d.ts +132 -0
- package/lib/services/ElementService.d.ts.map +1 -0
- package/lib/services/ElementService.js +579 -0
- package/lib/services/FileService.d.ts +14 -0
- package/lib/services/FileService.d.ts.map +1 -0
- package/lib/services/FileService.js +65 -0
- package/lib/services/GitService.d.ts +23 -0
- package/lib/services/GitService.d.ts.map +1 -0
- package/lib/services/GitService.js +225 -0
- package/lib/services/HierarchyService.d.ts +32 -0
- package/lib/services/HierarchyService.d.ts.map +1 -0
- package/lib/services/HierarchyService.js +235 -0
- package/lib/services/JobService.d.ts +13 -0
- package/lib/services/JobService.d.ts.map +1 -0
- package/lib/services/JobService.js +83 -0
- package/lib/services/LoggerService.d.ts +16 -0
- package/lib/services/LoggerService.d.ts.map +1 -0
- package/lib/services/LoggerService.js +101 -0
- package/lib/services/ManageService.d.ts +47 -0
- package/lib/services/ManageService.d.ts.map +1 -0
- package/lib/services/ManageService.js +221 -0
- package/lib/services/MessageLogService.d.ts +13 -0
- package/lib/services/MessageLogService.d.ts.map +1 -0
- package/lib/services/MessageLogService.js +175 -0
- package/lib/services/MonitoringService.d.ts +29 -0
- package/lib/services/MonitoringService.d.ts.map +1 -0
- package/lib/services/MonitoringService.js +86 -0
- package/lib/services/ObjectService.d.ts +8 -0
- package/lib/services/ObjectService.d.ts.map +1 -0
- package/lib/services/ObjectService.js +20 -0
- package/lib/services/PowerBiService.d.ts +13 -0
- package/lib/services/PowerBiService.d.ts.map +1 -0
- package/lib/services/PowerBiService.js +52 -0
- package/lib/services/ProcessService.d.ts +57 -0
- package/lib/services/ProcessService.d.ts.map +1 -0
- package/lib/services/ProcessService.js +499 -0
- package/lib/services/RestService.d.ts +68 -0
- package/lib/services/RestService.d.ts.map +1 -0
- package/lib/services/RestService.js +166 -0
- package/lib/services/SandboxService.d.ts +28 -0
- package/lib/services/SandboxService.d.ts.map +1 -0
- package/lib/services/SandboxService.js +197 -0
- package/lib/services/SecurityService.d.ts +33 -0
- package/lib/services/SecurityService.d.ts.map +1 -0
- package/lib/services/SecurityService.js +249 -0
- package/lib/services/ServerService.d.ts +55 -0
- package/lib/services/ServerService.d.ts.map +1 -0
- package/lib/services/ServerService.js +247 -0
- package/lib/services/SessionService.d.ts +15 -0
- package/lib/services/SessionService.d.ts.map +1 -0
- package/lib/services/SessionService.js +68 -0
- package/lib/services/SubsetService.d.ts +13 -0
- package/lib/services/SubsetService.d.ts.map +1 -0
- package/lib/services/SubsetService.js +46 -0
- package/lib/services/TM1Service.d.ts +39 -0
- package/lib/services/TM1Service.d.ts.map +1 -0
- package/lib/services/TM1Service.js +94 -0
- package/lib/services/ThreadService.d.ts +15 -0
- package/lib/services/ThreadService.d.ts.map +1 -0
- package/lib/services/ThreadService.js +104 -0
- package/lib/services/TransactionLogService.d.ts +11 -0
- package/lib/services/TransactionLogService.d.ts.map +1 -0
- package/lib/services/TransactionLogService.js +124 -0
- package/lib/services/UserService.d.ts +14 -0
- package/lib/services/UserService.d.ts.map +1 -0
- package/lib/services/UserService.js +103 -0
- package/lib/services/ViewService.d.ts +30 -0
- package/lib/services/ViewService.d.ts.map +1 -0
- package/lib/services/ViewService.js +331 -0
- package/lib/services/index.d.ts +26 -0
- package/lib/services/index.d.ts.map +1 -0
- package/lib/services/index.js +56 -0
- package/lib/tests/100PercentParityCheck.test.d.ts +6 -0
- package/lib/tests/100PercentParityCheck.test.d.ts.map +1 -0
- package/lib/tests/100PercentParityCheck.test.js +143 -0
- package/lib/tests/basic.test.d.ts +6 -0
- package/lib/tests/basic.test.d.ts.map +1 -0
- package/lib/tests/basic.test.js +52 -0
- package/lib/tests/cellService.test.d.ts +6 -0
- package/lib/tests/cellService.test.d.ts.map +1 -0
- package/lib/tests/cellService.test.js +311 -0
- package/lib/tests/ciSetup.d.ts +6 -0
- package/lib/tests/ciSetup.d.ts.map +1 -0
- package/lib/tests/ciSetup.js +23 -0
- package/lib/tests/comprehensive.service.test.d.ts +6 -0
- package/lib/tests/comprehensive.service.test.d.ts.map +1 -0
- package/lib/tests/comprehensive.service.test.js +507 -0
- package/lib/tests/connection.test.d.ts +6 -0
- package/lib/tests/connection.test.d.ts.map +1 -0
- package/lib/tests/connection.test.js +89 -0
- package/lib/tests/cubeService.test.d.ts +6 -0
- package/lib/tests/cubeService.test.d.ts.map +1 -0
- package/lib/tests/cubeService.test.js +368 -0
- package/lib/tests/dimensionService.comprehensive.test.d.ts +7 -0
- package/lib/tests/dimensionService.comprehensive.test.d.ts.map +1 -0
- package/lib/tests/dimensionService.comprehensive.test.js +614 -0
- package/lib/tests/dimensionService.test.d.ts +6 -0
- package/lib/tests/dimensionService.test.d.ts.map +1 -0
- package/lib/tests/dimensionService.test.js +293 -0
- package/lib/tests/edgeCases.test.d.ts +6 -0
- package/lib/tests/edgeCases.test.d.ts.map +1 -0
- package/lib/tests/edgeCases.test.js +301 -0
- package/lib/tests/elementService.comprehensive.test.d.ts +7 -0
- package/lib/tests/elementService.comprehensive.test.d.ts.map +1 -0
- package/lib/tests/elementService.comprehensive.test.js +846 -0
- package/lib/tests/elementService.test.d.ts +6 -0
- package/lib/tests/elementService.test.d.ts.map +1 -0
- package/lib/tests/elementService.test.js +350 -0
- package/lib/tests/enhancedCellService.test.d.ts +2 -0
- package/lib/tests/enhancedCellService.test.d.ts.map +1 -0
- package/lib/tests/enhancedCellService.test.js +152 -0
- package/lib/tests/enhancedCubeService.test.d.ts +2 -0
- package/lib/tests/enhancedCubeService.test.d.ts.map +1 -0
- package/lib/tests/enhancedCubeService.test.js +246 -0
- package/lib/tests/enhancedElementService.test.d.ts +2 -0
- package/lib/tests/enhancedElementService.test.d.ts.map +1 -0
- package/lib/tests/enhancedElementService.test.js +199 -0
- package/lib/tests/enhancedViewService.test.d.ts +2 -0
- package/lib/tests/enhancedViewService.test.d.ts.map +1 -0
- package/lib/tests/enhancedViewService.test.js +260 -0
- package/lib/tests/errorHandling.test.d.ts +6 -0
- package/lib/tests/errorHandling.test.d.ts.map +1 -0
- package/lib/tests/errorHandling.test.js +227 -0
- package/lib/tests/exceptions.test.d.ts +7 -0
- package/lib/tests/exceptions.test.d.ts.map +1 -0
- package/lib/tests/exceptions.test.js +257 -0
- package/lib/tests/hierarchyService.test.d.ts +6 -0
- package/lib/tests/hierarchyService.test.d.ts.map +1 -0
- package/lib/tests/hierarchyService.test.js +294 -0
- package/lib/tests/index.test.d.ts +6 -0
- package/lib/tests/index.test.d.ts.map +1 -0
- package/lib/tests/index.test.js +346 -0
- package/lib/tests/integration.test.d.ts +6 -0
- package/lib/tests/integration.test.d.ts.map +1 -0
- package/lib/tests/integration.test.js +302 -0
- package/lib/tests/integrationTests.test.d.ts +2 -0
- package/lib/tests/integrationTests.test.d.ts.map +1 -0
- package/lib/tests/integrationTests.test.js +252 -0
- package/lib/tests/mdx.advanced.test.d.ts +6 -0
- package/lib/tests/mdx.advanced.test.d.ts.map +1 -0
- package/lib/tests/mdx.advanced.test.js +437 -0
- package/lib/tests/objects.improved.test.d.ts +7 -0
- package/lib/tests/objects.improved.test.d.ts.map +1 -0
- package/lib/tests/objects.improved.test.js +302 -0
- package/lib/tests/performance.test.d.ts +6 -0
- package/lib/tests/performance.test.d.ts.map +1 -0
- package/lib/tests/performance.test.js +264 -0
- package/lib/tests/processService.comprehensive.test.d.ts +7 -0
- package/lib/tests/processService.comprehensive.test.d.ts.map +1 -0
- package/lib/tests/processService.comprehensive.test.js +656 -0
- package/lib/tests/processService.test.d.ts +6 -0
- package/lib/tests/processService.test.d.ts.map +1 -0
- package/lib/tests/processService.test.js +322 -0
- package/lib/tests/restService.test.d.ts +6 -0
- package/lib/tests/restService.test.d.ts.map +1 -0
- package/lib/tests/restService.test.js +177 -0
- package/lib/tests/security.advanced.test.d.ts +6 -0
- package/lib/tests/security.advanced.test.d.ts.map +1 -0
- package/lib/tests/security.advanced.test.js +407 -0
- package/lib/tests/security.test.d.ts +6 -0
- package/lib/tests/security.test.d.ts.map +1 -0
- package/lib/tests/security.test.js +204 -0
- package/lib/tests/securityService.comprehensive.test.d.ts +7 -0
- package/lib/tests/securityService.comprehensive.test.d.ts.map +1 -0
- package/lib/tests/securityService.comprehensive.test.js +457 -0
- package/lib/tests/setup.d.ts +4 -0
- package/lib/tests/setup.d.ts.map +1 -0
- package/lib/tests/setup.js +40 -0
- package/lib/tests/simpleCoverage.test.d.ts +6 -0
- package/lib/tests/simpleCoverage.test.d.ts.map +1 -0
- package/lib/tests/simpleCoverage.test.js +236 -0
- package/lib/tests/stress.performance.test.d.ts +6 -0
- package/lib/tests/stress.performance.test.d.ts.map +1 -0
- package/lib/tests/stress.performance.test.js +423 -0
- package/lib/tests/subsetService.test.d.ts +6 -0
- package/lib/tests/subsetService.test.d.ts.map +1 -0
- package/lib/tests/subsetService.test.js +271 -0
- package/lib/tests/testConfig.d.ts +18 -0
- package/lib/tests/testConfig.d.ts.map +1 -0
- package/lib/tests/testConfig.js +38 -0
- package/lib/tests/testUtils.d.ts +9 -0
- package/lib/tests/testUtils.d.ts.map +1 -0
- package/lib/tests/testUtils.js +100 -0
- package/lib/tests/tm1Service.test.d.ts +7 -0
- package/lib/tests/tm1Service.test.d.ts.map +1 -0
- package/lib/tests/tm1Service.test.js +290 -0
- package/lib/tests/viewService.test.d.ts +6 -0
- package/lib/tests/viewService.test.d.ts.map +1 -0
- package/lib/tests/viewService.test.js +240 -0
- package/lib/utils/Utils.d.ts +90 -0
- package/lib/utils/Utils.d.ts.map +1 -0
- package/lib/utils/Utils.js +379 -0
- package/package.json +81 -0
- package/run-all-tests.js +296 -0
- package/src/exceptions/TM1Exception.ts +38 -0
- package/src/exceptions/TM1RestException.ts +17 -0
- package/src/exceptions/TM1TimeoutException.ts +15 -0
- package/src/index.ts +94 -0
- package/src/objects/Annotation.ts +194 -0
- package/src/objects/Application.ts +146 -0
- package/src/objects/Axis.ts +149 -0
- package/src/objects/Chore.ts +174 -0
- package/src/objects/ChoreFrequency.ts +83 -0
- package/src/objects/ChoreStartTime.ts +111 -0
- package/src/objects/ChoreTask.ts +92 -0
- package/src/objects/Cube.ts +125 -0
- package/src/objects/Dimension.ts +107 -0
- package/src/objects/Element.ts +153 -0
- package/src/objects/ElementAttribute.ts +115 -0
- package/src/objects/Git.ts +86 -0
- package/src/objects/GitCommit.ts +31 -0
- package/src/objects/GitPlan.ts +121 -0
- package/src/objects/GitRemote.ts +31 -0
- package/src/objects/Hierarchy.ts +229 -0
- package/src/objects/MDXView.ts +91 -0
- package/src/objects/NativeView.ts +268 -0
- package/src/objects/Process.ts +320 -0
- package/src/objects/ProcessDebugBreakpoint.ts +239 -0
- package/src/objects/ProcessParameter.ts +76 -0
- package/src/objects/ProcessVariable.ts +89 -0
- package/src/objects/Rules.ts +117 -0
- package/src/objects/Sandbox.ts +90 -0
- package/src/objects/Server.ts +45 -0
- package/src/objects/Subset.ts +323 -0
- package/src/objects/TM1Object.ts +17 -0
- package/src/objects/TM1Project.ts +587 -0
- package/src/objects/User.ts +198 -0
- package/src/objects/View.ts +43 -0
- package/src/objects/index.ts +36 -0
- package/src/services/AnnotationService.ts +107 -0
- package/src/services/ApplicationService.ts +279 -0
- package/src/services/AuditLogService.ts +172 -0
- package/src/services/CellService.ts +814 -0
- package/src/services/ChoreService.ts +219 -0
- package/src/services/ConfigurationService.ts +69 -0
- package/src/services/CubeService.ts +338 -0
- package/src/services/DimensionService.ts +168 -0
- package/src/services/ElementService.ts +966 -0
- package/src/services/FileService.ts +67 -0
- package/src/services/GitService.ts +324 -0
- package/src/services/HierarchyService.ts +284 -0
- package/src/services/JobService.ts +59 -0
- package/src/services/LoggerService.ts +118 -0
- package/src/services/ManageService.ts +322 -0
- package/src/services/MessageLogService.ts +211 -0
- package/src/services/MonitoringService.ts +105 -0
- package/src/services/ObjectService.ts +21 -0
- package/src/services/PowerBiService.ts +85 -0
- package/src/services/ProcessService.ts +589 -0
- package/src/services/RestService.ts +224 -0
- package/src/services/SandboxService.ts +217 -0
- package/src/services/SecurityService.ts +284 -0
- package/src/services/ServerService.ts +313 -0
- package/src/services/SessionService.ts +81 -0
- package/src/services/SubsetService.ts +52 -0
- package/src/services/TM1Service.ts +133 -0
- package/src/services/ThreadService.ts +83 -0
- package/src/services/TransactionLogService.ts +148 -0
- package/src/services/UserService.ts +77 -0
- package/src/services/ViewService.ts +398 -0
- package/src/services/index.ts +28 -0
- package/src/tests/100PercentParityCheck.test.ts +166 -0
- package/src/tests/basic.test.ts +59 -0
- package/src/tests/cellService.test.ts +405 -0
- package/src/tests/ciSetup.ts +26 -0
- package/src/tests/comprehensive.service.test.ts +653 -0
- package/src/tests/config.ini.template +23 -0
- package/src/tests/connection.test.ts +90 -0
- package/src/tests/cubeService.test.ts +458 -0
- package/src/tests/dimensionService.comprehensive.test.ts +786 -0
- package/src/tests/dimensionService.test.ts +373 -0
- package/src/tests/edgeCases.test.ts +358 -0
- package/src/tests/elementService.comprehensive.test.ts +1190 -0
- package/src/tests/elementService.test.ts +472 -0
- package/src/tests/enhancedCellService.test.ts +237 -0
- package/src/tests/enhancedCubeService.test.ts +384 -0
- package/src/tests/enhancedElementService.test.ts +301 -0
- package/src/tests/enhancedViewService.test.ts +373 -0
- package/src/tests/errorHandling.test.ts +264 -0
- package/src/tests/exceptions.test.ts +313 -0
- package/src/tests/hierarchyService.test.ts +386 -0
- package/src/tests/index.test.ts +376 -0
- package/src/tests/integration.test.ts +333 -0
- package/src/tests/integrationTests.test.ts +302 -0
- package/src/tests/mdx.advanced.test.ts +513 -0
- package/src/tests/objects.improved.test.ts +385 -0
- package/src/tests/performance.test.ts +314 -0
- package/src/tests/processService.comprehensive.test.ts +933 -0
- package/src/tests/processService.test.ts +409 -0
- package/src/tests/restService.test.ts +218 -0
- package/src/tests/security.advanced.test.ts +464 -0
- package/src/tests/security.test.ts +233 -0
- package/src/tests/securityService.comprehensive.test.ts +582 -0
- package/src/tests/setup.ts +42 -0
- package/src/tests/simpleCoverage.test.ts +287 -0
- package/src/tests/stress.performance.test.ts +531 -0
- package/src/tests/subsetService.test.ts +350 -0
- package/src/tests/testConfig.ts +53 -0
- package/src/tests/testUtils.ts +94 -0
- package/src/tests/tm1Service.test.ts +361 -0
- package/src/tests/viewService.test.ts +324 -0
- package/src/utils/Utils.ts +395 -0
- package/tests/README.md +57 -0
- package/tests/connection/test-connection.ts +86 -0
- package/tests/edge-cases/edge-cases-test.ts +244 -0
- package/tests/integration/working-test.ts +193 -0
- package/tests/performance/performance-test.ts +133 -0
- package/tests/run-all-tests.sh +106 -0
- package/tests/security/security-test.ts +103 -0
- 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
|
+
});
|