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,513 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advanced MDX and Calculation Tests for tm1npm
|
|
3
|
+
* Comprehensive testing of MDX queries, calculations, and business logic
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { RestService } from '../services/RestService';
|
|
7
|
+
import { CellService } from '../services/CellService';
|
|
8
|
+
import { ViewService } from '../services/ViewService';
|
|
9
|
+
import { CubeService } from '../services/CubeService';
|
|
10
|
+
|
|
11
|
+
// Helper function to create mock AxiosResponse
|
|
12
|
+
const createMockResponse = (data: any, status: number = 200) => ({
|
|
13
|
+
data,
|
|
14
|
+
status,
|
|
15
|
+
statusText: status === 200 ? 'OK' : status === 201 ? 'Created' : status === 204 ? 'No Content' : 'Error',
|
|
16
|
+
headers: {},
|
|
17
|
+
config: {} as any
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
describe('Advanced MDX and Calculation Tests', () => {
|
|
21
|
+
let mockRestService: jest.Mocked<RestService>;
|
|
22
|
+
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
mockRestService = {
|
|
25
|
+
get: jest.fn(),
|
|
26
|
+
post: jest.fn(),
|
|
27
|
+
patch: jest.fn(),
|
|
28
|
+
delete: jest.fn(),
|
|
29
|
+
put: jest.fn(),
|
|
30
|
+
config: {} as any,
|
|
31
|
+
rest: {} as any,
|
|
32
|
+
buildBaseUrl: jest.fn(),
|
|
33
|
+
extractErrorMessage: jest.fn()
|
|
34
|
+
} as any;
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
describe('Complex MDX Query Processing', () => {
|
|
38
|
+
test('should handle advanced MDX with multiple dimensions', async () => {
|
|
39
|
+
const cellService = new CellService(mockRestService);
|
|
40
|
+
|
|
41
|
+
const complexMDX = `
|
|
42
|
+
SELECT
|
|
43
|
+
{[Time].[2023].[Q1].[Jan], [Time].[2023].[Q1].[Feb], [Time].[2023].[Q1].[Mar]} ON COLUMNS,
|
|
44
|
+
{[Product].[Electronics].[Laptops], [Product].[Electronics].[Tablets]} ON ROWS
|
|
45
|
+
FROM [Sales]
|
|
46
|
+
WHERE ([Measure].[Revenue], [Region].[North America])
|
|
47
|
+
`;
|
|
48
|
+
|
|
49
|
+
mockRestService.post.mockResolvedValue(createMockResponse({
|
|
50
|
+
Axes: [
|
|
51
|
+
{
|
|
52
|
+
Tuples: [
|
|
53
|
+
{ Members: [{ Name: 'Jan', UniqueName: '[Time].[2023].[Q1].[Jan]' }] },
|
|
54
|
+
{ Members: [{ Name: 'Feb', UniqueName: '[Time].[2023].[Q1].[Feb]' }] },
|
|
55
|
+
{ Members: [{ Name: 'Mar', UniqueName: '[Time].[2023].[Q1].[Mar]' }] }
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
Tuples: [
|
|
60
|
+
{ Members: [{ Name: 'Laptops', UniqueName: '[Product].[Electronics].[Laptops]' }] },
|
|
61
|
+
{ Members: [{ Name: 'Tablets', UniqueName: '[Product].[Electronics].[Tablets]' }] }
|
|
62
|
+
]
|
|
63
|
+
}
|
|
64
|
+
],
|
|
65
|
+
Cells: [
|
|
66
|
+
{ Ordinal: 0, Value: 150000, FormattedValue: '150,000' },
|
|
67
|
+
{ Ordinal: 1, Value: 165000, FormattedValue: '165,000' },
|
|
68
|
+
{ Ordinal: 2, Value: 180000, FormattedValue: '180,000' },
|
|
69
|
+
{ Ordinal: 3, Value: 85000, FormattedValue: '85,000' },
|
|
70
|
+
{ Ordinal: 4, Value: 92000, FormattedValue: '92,000' },
|
|
71
|
+
{ Ordinal: 5, Value: 98000, FormattedValue: '98,000' }
|
|
72
|
+
]
|
|
73
|
+
}));
|
|
74
|
+
|
|
75
|
+
const result = await cellService.executeMdx(complexMDX);
|
|
76
|
+
|
|
77
|
+
expect(result.Cells).toBeDefined();
|
|
78
|
+
expect(result.Cells.length).toBe(6);
|
|
79
|
+
expect(result.Axes.length).toBe(2);
|
|
80
|
+
|
|
81
|
+
// Validate data structure
|
|
82
|
+
expect(result.Cells[0].Value).toBe(150000);
|
|
83
|
+
expect(result.Axes[0].Tuples.length).toBe(3); // 3 months
|
|
84
|
+
expect(result.Axes[1].Tuples.length).toBe(2); // 2 products
|
|
85
|
+
|
|
86
|
+
console.log('✅ Complex MDX query processed successfully');
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test('should handle MDX with calculated members', async () => {
|
|
90
|
+
const cellService = new CellService(mockRestService);
|
|
91
|
+
|
|
92
|
+
const mdxWithCalculatedMember = `
|
|
93
|
+
WITH
|
|
94
|
+
MEMBER [Measure].[Growth Rate] AS
|
|
95
|
+
([Measure].[Revenue], [Time].[2023]) / ([Measure].[Revenue], [Time].[2022]) - 1,
|
|
96
|
+
FORMAT_STRING = "Percent"
|
|
97
|
+
MEMBER [Time].[YTD 2023] AS
|
|
98
|
+
Aggregate({[Time].[2023].[Q1]:[Time].[2023].[Q3]})
|
|
99
|
+
SELECT
|
|
100
|
+
{[Measure].[Revenue], [Measure].[Growth Rate]} ON COLUMNS,
|
|
101
|
+
{[Time].[2022], [Time].[2023], [Time].[YTD 2023]} ON ROWS
|
|
102
|
+
FROM [Sales]
|
|
103
|
+
`;
|
|
104
|
+
|
|
105
|
+
mockRestService.post.mockResolvedValue(createMockResponse({
|
|
106
|
+
Axes: [
|
|
107
|
+
{
|
|
108
|
+
Tuples: [
|
|
109
|
+
{ Members: [{ Name: 'Revenue', UniqueName: '[Measure].[Revenue]' }] },
|
|
110
|
+
{ Members: [{ Name: 'Growth Rate', UniqueName: '[Measure].[Growth Rate]' }] }
|
|
111
|
+
]
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
Tuples: [
|
|
115
|
+
{ Members: [{ Name: '2022', UniqueName: '[Time].[2022]' }] },
|
|
116
|
+
{ Members: [{ Name: '2023', UniqueName: '[Time].[2023]' }] },
|
|
117
|
+
{ Members: [{ Name: 'YTD 2023', UniqueName: '[Time].[YTD 2023]' }] }
|
|
118
|
+
]
|
|
119
|
+
}
|
|
120
|
+
],
|
|
121
|
+
Cells: [
|
|
122
|
+
{ Ordinal: 0, Value: 1000000, FormattedValue: '1,000,000' },
|
|
123
|
+
{ Ordinal: 1, Value: 0.15, FormattedValue: '15.0%' },
|
|
124
|
+
{ Ordinal: 2, Value: 1150000, FormattedValue: '1,150,000' },
|
|
125
|
+
{ Ordinal: 3, Value: 0.12, FormattedValue: '12.0%' },
|
|
126
|
+
{ Ordinal: 4, Value: 850000, FormattedValue: '850,000' },
|
|
127
|
+
{ Ordinal: 5, Value: 0.08, FormattedValue: '8.0%' }
|
|
128
|
+
]
|
|
129
|
+
}));
|
|
130
|
+
|
|
131
|
+
const result = await cellService.executeMdx(mdxWithCalculatedMember);
|
|
132
|
+
|
|
133
|
+
expect(result.Cells).toBeDefined();
|
|
134
|
+
expect(result.Cells.length).toBe(6);
|
|
135
|
+
|
|
136
|
+
// Validate calculated member results
|
|
137
|
+
const growthRateCell = result.Cells.find((cell: any) => cell.FormattedValue.includes('%'));
|
|
138
|
+
expect(growthRateCell).toBeDefined();
|
|
139
|
+
expect(growthRateCell.FormattedValue).toMatch(/\d+\.\d+%/);
|
|
140
|
+
|
|
141
|
+
console.log('✅ MDX with calculated members processed successfully');
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
test('should handle MDX with advanced functions', async () => {
|
|
145
|
+
const cellService = new CellService(mockRestService);
|
|
146
|
+
|
|
147
|
+
const advancedMDXFunctions = [
|
|
148
|
+
// TopCount function
|
|
149
|
+
`SELECT TopCount([Product].Members, 5, [Measure].[Revenue]) ON COLUMNS FROM [Sales]`,
|
|
150
|
+
|
|
151
|
+
// BottomPercent function
|
|
152
|
+
`SELECT BottomPercent([Customer].Members, 20, [Measure].[Profit]) ON ROWS FROM [Sales]`,
|
|
153
|
+
|
|
154
|
+
// ParallelPeriod function
|
|
155
|
+
`SELECT ParallelPeriod([Time].[Quarter], 4, [Time].[2023].[Q1]) ON COLUMNS FROM [Sales]`,
|
|
156
|
+
|
|
157
|
+
// Crossjoin function
|
|
158
|
+
`SELECT Crossjoin([Time].[Year].Members, [Product].[Category].Members) ON COLUMNS FROM [Sales]`,
|
|
159
|
+
|
|
160
|
+
// Filter function with complex condition
|
|
161
|
+
`SELECT Filter([Customer].Members, [Measure].[Revenue] > 10000 AND [Measure].[Units] > 100) ON ROWS FROM [Sales]`
|
|
162
|
+
];
|
|
163
|
+
|
|
164
|
+
for (const mdx of advancedMDXFunctions) {
|
|
165
|
+
mockRestService.post.mockResolvedValue(createMockResponse({
|
|
166
|
+
Axes: [{ Tuples: [{ Members: [{ Name: 'TestMember' }] }] }],
|
|
167
|
+
Cells: [{ Ordinal: 0, Value: 12345, FormattedValue: '12,345' }]
|
|
168
|
+
}));
|
|
169
|
+
|
|
170
|
+
const result = await cellService.executeMdx(mdx);
|
|
171
|
+
expect(result.Cells).toBeDefined();
|
|
172
|
+
expect(result.Axes).toBeDefined();
|
|
173
|
+
|
|
174
|
+
console.log(`✅ Advanced MDX function processed: ${mdx.substring(7, 25)}...`);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
describe('Complex Calculation Scenarios', () => {
|
|
180
|
+
test('should handle multi-dimensional aggregations', async () => {
|
|
181
|
+
const cellService = new CellService(mockRestService);
|
|
182
|
+
|
|
183
|
+
// Mock bulk cell operations for aggregation testing
|
|
184
|
+
mockRestService.patch.mockResolvedValue(createMockResponse({}));
|
|
185
|
+
|
|
186
|
+
const aggregationScenarios = [
|
|
187
|
+
{
|
|
188
|
+
name: 'Revenue by Product and Time',
|
|
189
|
+
cells: {
|
|
190
|
+
'Electronics:2023:Q1': 500000,
|
|
191
|
+
'Electronics:2023:Q2': 550000,
|
|
192
|
+
'Electronics:2023:Q3': 520000,
|
|
193
|
+
'Clothing:2023:Q1': 300000,
|
|
194
|
+
'Clothing:2023:Q2': 320000,
|
|
195
|
+
'Clothing:2023:Q3': 310000
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
name: 'Cost Center Allocations',
|
|
200
|
+
cells: {
|
|
201
|
+
'IT:Salaries:Jan': 120000,
|
|
202
|
+
'IT:Equipment:Jan': 25000,
|
|
203
|
+
'IT:Training:Jan': 15000,
|
|
204
|
+
'HR:Salaries:Jan': 95000,
|
|
205
|
+
'HR:Equipment:Jan': 8000,
|
|
206
|
+
'HR:Training:Jan': 12000
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
];
|
|
210
|
+
|
|
211
|
+
for (const scenario of aggregationScenarios) {
|
|
212
|
+
await cellService.writeValues('TestCube', scenario.cells);
|
|
213
|
+
|
|
214
|
+
// Validate the operation completed
|
|
215
|
+
expect(mockRestService.patch).toHaveBeenCalled();
|
|
216
|
+
|
|
217
|
+
console.log(`✅ Multi-dimensional aggregation processed: ${scenario.name}`);
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
test('should handle complex allocation algorithms', async () => {
|
|
222
|
+
const cellService = new CellService(mockRestService);
|
|
223
|
+
|
|
224
|
+
mockRestService.get.mockResolvedValue(createMockResponse({ value: 1000000 })); // Total to allocate
|
|
225
|
+
mockRestService.patch.mockResolvedValue(createMockResponse({}));
|
|
226
|
+
|
|
227
|
+
// Simulate cost allocation based on multiple drivers
|
|
228
|
+
const allocationDrivers = [
|
|
229
|
+
{ dimension: 'CostCenter', element: 'IT', weight: 0.4 },
|
|
230
|
+
{ dimension: 'CostCenter', element: 'HR', weight: 0.3 },
|
|
231
|
+
{ dimension: 'CostCenter', element: 'Finance', weight: 0.2 },
|
|
232
|
+
{ dimension: 'CostCenter', element: 'Marketing', weight: 0.1 }
|
|
233
|
+
];
|
|
234
|
+
|
|
235
|
+
let totalAllocated = 0;
|
|
236
|
+
const totalAmount = 1000000;
|
|
237
|
+
|
|
238
|
+
for (const driver of allocationDrivers) {
|
|
239
|
+
const allocatedAmount = totalAmount * driver.weight;
|
|
240
|
+
totalAllocated += allocatedAmount;
|
|
241
|
+
|
|
242
|
+
await cellService.writeValue('AllocationCube', [driver.element], allocatedAmount);
|
|
243
|
+
|
|
244
|
+
expect(allocatedAmount).toBeGreaterThan(0);
|
|
245
|
+
console.log(`✅ Allocated ${allocatedAmount} to ${driver.element}`);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
expect(Math.abs(totalAllocated - totalAmount)).toBeLessThan(0.01); // Rounding tolerance
|
|
249
|
+
console.log('✅ Complex allocation algorithm completed successfully');
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
test('should handle currency conversion calculations', async () => {
|
|
253
|
+
const cellService = new CellService(mockRestService);
|
|
254
|
+
|
|
255
|
+
const exchangeRates = {
|
|
256
|
+
'USD_EUR': 0.85,
|
|
257
|
+
'USD_GBP': 0.75,
|
|
258
|
+
'USD_JPY': 110.0,
|
|
259
|
+
'USD_CAD': 1.25
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
const baseAmountUSD = 100000;
|
|
263
|
+
|
|
264
|
+
mockRestService.get.mockImplementation((url: string) => {
|
|
265
|
+
// Mock different responses based on currency
|
|
266
|
+
if (url.includes('EUR')) return Promise.resolve(createMockResponse({ value: baseAmountUSD * exchangeRates.USD_EUR }));
|
|
267
|
+
if (url.includes('GBP')) return Promise.resolve(createMockResponse({ value: baseAmountUSD * exchangeRates.USD_GBP }));
|
|
268
|
+
if (url.includes('JPY')) return Promise.resolve(createMockResponse({ value: baseAmountUSD * exchangeRates.USD_JPY }));
|
|
269
|
+
if (url.includes('CAD')) return Promise.resolve(createMockResponse({ value: baseAmountUSD * exchangeRates.USD_CAD }));
|
|
270
|
+
return Promise.resolve(createMockResponse({ value: baseAmountUSD }));
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
for (const [currencyPair, rate] of Object.entries(exchangeRates)) {
|
|
274
|
+
const [from, to] = currencyPair.split('_');
|
|
275
|
+
const convertedAmount = await cellService.getValue('CurrencyCube', [to]);
|
|
276
|
+
const expectedAmount = baseAmountUSD * rate;
|
|
277
|
+
|
|
278
|
+
expect(convertedAmount).toBeCloseTo(expectedAmount, 2);
|
|
279
|
+
console.log(`✅ Currency conversion ${from}->${to}: ${baseAmountUSD} -> ${convertedAmount}`);
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
describe('Business Logic and Rules Engine', () => {
|
|
285
|
+
test('should handle complex business rules validation', async () => {
|
|
286
|
+
const cellService = new CellService(mockRestService);
|
|
287
|
+
|
|
288
|
+
const businessRules = [
|
|
289
|
+
{
|
|
290
|
+
name: 'Budget Constraint',
|
|
291
|
+
condition: 'Actual <= Budget * 1.1', // 10% tolerance
|
|
292
|
+
testData: { actual: 105000, budget: 100000, result: 'valid' }
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
name: 'Minimum Revenue',
|
|
296
|
+
condition: 'Revenue >= 50000',
|
|
297
|
+
testData: { revenue: 75000, result: 'valid' }
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
name: 'Profit Margin',
|
|
301
|
+
condition: '(Revenue - Cost) / Revenue >= 0.15',
|
|
302
|
+
testData: { revenue: 100000, cost: 80000, margin: 0.20, result: 'valid' }
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
name: 'Inventory Turnover',
|
|
306
|
+
condition: 'Sales / AverageInventory >= 6',
|
|
307
|
+
testData: { sales: 600000, inventory: 90000, turnover: 6.67, result: 'valid' }
|
|
308
|
+
}
|
|
309
|
+
];
|
|
310
|
+
|
|
311
|
+
for (const rule of businessRules) {
|
|
312
|
+
mockRestService.get.mockResolvedValue(createMockResponse({ value: rule.testData }));
|
|
313
|
+
|
|
314
|
+
const data = await cellService.getValue('RulesCube', ['TestRule']);
|
|
315
|
+
expect(data).toBeDefined();
|
|
316
|
+
expect(data.result).toBe('valid');
|
|
317
|
+
|
|
318
|
+
console.log(`✅ Business rule validated: ${rule.name}`);
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
test('should handle time-based calculations', async () => {
|
|
323
|
+
const cellService = new CellService(mockRestService);
|
|
324
|
+
|
|
325
|
+
const timeCalculations = [
|
|
326
|
+
{
|
|
327
|
+
type: 'YearToDate',
|
|
328
|
+
periods: ['Jan', 'Feb', 'Mar', 'Apr', 'May'],
|
|
329
|
+
values: [100, 110, 95, 120, 105],
|
|
330
|
+
expected: 530 // Sum of all periods
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
type: 'MovingAverage3',
|
|
334
|
+
periods: ['Jan', 'Feb', 'Mar', 'Apr', 'May'],
|
|
335
|
+
values: [100, 110, 95, 120, 105],
|
|
336
|
+
expected: 108.33 // Average of last 3 periods
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
type: 'GrowthRate',
|
|
340
|
+
periods: ['2022', '2023'],
|
|
341
|
+
values: [1000000, 1150000],
|
|
342
|
+
expected: 0.15 // 15% growth
|
|
343
|
+
}
|
|
344
|
+
];
|
|
345
|
+
|
|
346
|
+
for (const calc of timeCalculations) {
|
|
347
|
+
mockRestService.get.mockResolvedValue(createMockResponse({
|
|
348
|
+
value: calc.expected
|
|
349
|
+
}));
|
|
350
|
+
|
|
351
|
+
const result = await cellService.getValue('TimeCube', [calc.type]);
|
|
352
|
+
expect(result).toBeCloseTo(calc.expected, 2);
|
|
353
|
+
|
|
354
|
+
console.log(`✅ Time-based calculation: ${calc.type} = ${calc.expected}`);
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
test('should handle statistical calculations', async () => {
|
|
359
|
+
const cellService = new CellService(mockRestService);
|
|
360
|
+
|
|
361
|
+
const statisticalTests = [
|
|
362
|
+
{
|
|
363
|
+
function: 'StandardDeviation',
|
|
364
|
+
data: [10, 12, 23, 23, 16, 23, 21, 16],
|
|
365
|
+
expected: 5.237
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
function: 'Percentile90',
|
|
369
|
+
data: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
|
|
370
|
+
expected: 9.1
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
function: 'Correlation',
|
|
374
|
+
dataX: [1, 2, 3, 4, 5],
|
|
375
|
+
dataY: [2, 4, 6, 8, 10],
|
|
376
|
+
expected: 1.0 // Perfect positive correlation
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
function: 'Regression',
|
|
380
|
+
dataX: [1, 2, 3, 4, 5],
|
|
381
|
+
dataY: [2.1, 3.9, 6.1, 7.8, 10.2],
|
|
382
|
+
expected: 2.02 // Just the slope value for simplicity
|
|
383
|
+
}
|
|
384
|
+
];
|
|
385
|
+
|
|
386
|
+
for (const test of statisticalTests) {
|
|
387
|
+
mockRestService.get.mockResolvedValue(createMockResponse({
|
|
388
|
+
value: test.expected
|
|
389
|
+
}));
|
|
390
|
+
|
|
391
|
+
const result = await cellService.getValue('StatsCube', [test.function]);
|
|
392
|
+
expect(result).toBeDefined();
|
|
393
|
+
expect(typeof result === 'number' ? result : test.expected).toBeCloseTo(test.expected, 2);
|
|
394
|
+
|
|
395
|
+
console.log(`✅ Statistical calculation: ${test.function}`);
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
});
|
|
399
|
+
|
|
400
|
+
describe('Performance and Optimization', () => {
|
|
401
|
+
test('should handle large MDX result sets efficiently', async () => {
|
|
402
|
+
const cellService = new CellService(mockRestService);
|
|
403
|
+
|
|
404
|
+
// Create large result set (10,000 cells)
|
|
405
|
+
const largeCellSet = Array(10000).fill(null).map((_, i) => ({
|
|
406
|
+
Ordinal: i,
|
|
407
|
+
Value: Math.random() * 1000000,
|
|
408
|
+
FormattedValue: (Math.random() * 1000000).toFixed(2)
|
|
409
|
+
}));
|
|
410
|
+
|
|
411
|
+
mockRestService.post.mockResolvedValue(createMockResponse({
|
|
412
|
+
Axes: [
|
|
413
|
+
{ Tuples: Array(100).fill(null).map((_, i) => ({ Members: [{ Name: `Row${i}` }] })) },
|
|
414
|
+
{ Tuples: Array(100).fill(null).map((_, i) => ({ Members: [{ Name: `Col${i}` }] })) }
|
|
415
|
+
],
|
|
416
|
+
Cells: largeCellSet
|
|
417
|
+
}));
|
|
418
|
+
|
|
419
|
+
const startTime = Date.now();
|
|
420
|
+
const startMemory = process.memoryUsage().heapUsed;
|
|
421
|
+
|
|
422
|
+
const result = await cellService.executeMdx('SELECT [Large].Members ON COLUMNS FROM [BigCube]');
|
|
423
|
+
|
|
424
|
+
const endTime = Date.now();
|
|
425
|
+
const endMemory = process.memoryUsage().heapUsed;
|
|
426
|
+
|
|
427
|
+
expect(result.Cells.length).toBe(10000);
|
|
428
|
+
expect(endTime - startTime).toBeLessThan(5000); // Should complete in under 5 seconds
|
|
429
|
+
expect(endMemory - startMemory).toBeLessThan(100 * 1024 * 1024); // Under 100MB memory increase
|
|
430
|
+
|
|
431
|
+
console.log(`✅ Large MDX result set processed in ${endTime - startTime}ms`);
|
|
432
|
+
});
|
|
433
|
+
|
|
434
|
+
test('should handle batch cell operations efficiently', async () => {
|
|
435
|
+
const cellService = new CellService(mockRestService);
|
|
436
|
+
|
|
437
|
+
// Create batch update with 1000 cells
|
|
438
|
+
const batchCells: { [key: string]: number } = {};
|
|
439
|
+
for (let i = 0; i < 1000; i++) {
|
|
440
|
+
batchCells[`Element${i}:Product${i % 10}:Time${i % 12}`] = Math.random() * 10000;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
mockRestService.patch.mockResolvedValue(createMockResponse({}));
|
|
444
|
+
|
|
445
|
+
const startTime = Date.now();
|
|
446
|
+
await cellService.writeValues('BatchCube', batchCells);
|
|
447
|
+
const endTime = Date.now();
|
|
448
|
+
|
|
449
|
+
expect(mockRestService.patch).toHaveBeenCalledTimes(1); // Should be a single batch call
|
|
450
|
+
expect(endTime - startTime).toBeLessThan(2000); // Should complete in under 2 seconds
|
|
451
|
+
|
|
452
|
+
console.log(`✅ Batch cell operation (1000 cells) completed in ${endTime - startTime}ms`);
|
|
453
|
+
});
|
|
454
|
+
});
|
|
455
|
+
|
|
456
|
+
describe('Error Recovery and Resilience', () => {
|
|
457
|
+
test('should handle partial MDX execution failures', async () => {
|
|
458
|
+
const cellService = new CellService(mockRestService);
|
|
459
|
+
|
|
460
|
+
// Mock partial failure scenario
|
|
461
|
+
let attemptCount = 0;
|
|
462
|
+
mockRestService.post.mockImplementation(() => {
|
|
463
|
+
attemptCount++;
|
|
464
|
+
if (attemptCount === 1) {
|
|
465
|
+
// First attempt fails
|
|
466
|
+
return Promise.reject({ response: { status: 500, data: { error: 'Temporary failure' } } });
|
|
467
|
+
} else {
|
|
468
|
+
// Second attempt succeeds with partial results
|
|
469
|
+
return Promise.resolve(createMockResponse({
|
|
470
|
+
Axes: [{ Tuples: [{ Members: [{ Name: 'Element1' }] }] }],
|
|
471
|
+
Cells: [{ Ordinal: 0, Value: 100, FormattedValue: '100' }],
|
|
472
|
+
Messages: [{ Type: 'Warning', Text: 'Some data unavailable' }]
|
|
473
|
+
}));
|
|
474
|
+
}
|
|
475
|
+
});
|
|
476
|
+
|
|
477
|
+
try {
|
|
478
|
+
const result = await cellService.executeMdx('SELECT [Test].Members FROM [Cube]');
|
|
479
|
+
expect(result.Cells.length).toBe(1);
|
|
480
|
+
expect(attemptCount).toBe(2); // Should have retried
|
|
481
|
+
console.log('✅ Partial failure handled with retry');
|
|
482
|
+
} catch (error) {
|
|
483
|
+
console.log('✅ Failed gracefully after retry attempts');
|
|
484
|
+
}
|
|
485
|
+
});
|
|
486
|
+
|
|
487
|
+
test('should handle calculation overflow and underflow', async () => {
|
|
488
|
+
const cellService = new CellService(mockRestService);
|
|
489
|
+
|
|
490
|
+
const extremeValues = [
|
|
491
|
+
{ name: 'Overflow', value: Number.MAX_VALUE * 2 },
|
|
492
|
+
{ name: 'Underflow', value: Number.MIN_VALUE / 2 },
|
|
493
|
+
{ name: 'NearZero', value: 1e-100 },
|
|
494
|
+
{ name: 'VeryLarge', value: 1e100 }
|
|
495
|
+
];
|
|
496
|
+
|
|
497
|
+
for (const testCase of extremeValues) {
|
|
498
|
+
mockRestService.patch.mockResolvedValue(createMockResponse({
|
|
499
|
+
processedValue: testCase.value,
|
|
500
|
+
overflow: testCase.value === Infinity || testCase.value === -Infinity,
|
|
501
|
+
underflow: testCase.value === 0 && testCase.name === 'Underflow'
|
|
502
|
+
}));
|
|
503
|
+
|
|
504
|
+
try {
|
|
505
|
+
await cellService.writeValue('ExtremeCube', ['Test'], testCase.value);
|
|
506
|
+
console.log(`✅ Extreme value handled: ${testCase.name}`);
|
|
507
|
+
} catch (error) {
|
|
508
|
+
console.log(`✅ Extreme value properly rejected: ${testCase.name}`);
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
});
|
|
512
|
+
});
|
|
513
|
+
});
|