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,301 @@
|
|
|
1
|
+
import { ElementService } from '../services/ElementService';
|
|
2
|
+
import { RestService } from '../services/RestService';
|
|
3
|
+
import { Element } from '../objects/Element';
|
|
4
|
+
import axios, { AxiosResponse } from 'axios';
|
|
5
|
+
|
|
6
|
+
// Mock axios
|
|
7
|
+
jest.mock('axios');
|
|
8
|
+
const mockedAxios = axios as jest.Mocked<typeof axios>;
|
|
9
|
+
|
|
10
|
+
describe('Enhanced ElementService Tests', () => {
|
|
11
|
+
let elementService: ElementService;
|
|
12
|
+
let mockRestService: jest.Mocked<RestService>;
|
|
13
|
+
|
|
14
|
+
const createMockResponse = (data: any, status: number = 200): AxiosResponse => ({
|
|
15
|
+
data,
|
|
16
|
+
status,
|
|
17
|
+
statusText: status === 200 ? 'OK' : status === 201 ? 'Created' : 'Error',
|
|
18
|
+
headers: {},
|
|
19
|
+
config: {} as any
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
beforeEach(() => {
|
|
23
|
+
mockRestService = {
|
|
24
|
+
get: jest.fn(),
|
|
25
|
+
post: jest.fn(),
|
|
26
|
+
patch: jest.fn(),
|
|
27
|
+
delete: jest.fn(),
|
|
28
|
+
put: jest.fn()
|
|
29
|
+
} as any;
|
|
30
|
+
|
|
31
|
+
elementService = new ElementService(mockRestService);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
describe('Bulk Operations', () => {
|
|
35
|
+
test('deleteElements should delete multiple elements via REST', async () => {
|
|
36
|
+
const elementNames = ['Element1', 'Element2', 'Element3'];
|
|
37
|
+
|
|
38
|
+
mockRestService.delete.mockResolvedValue(createMockResponse({}));
|
|
39
|
+
|
|
40
|
+
await elementService.deleteElements('TestDim', 'TestHier', elementNames, false);
|
|
41
|
+
|
|
42
|
+
expect(mockRestService.delete).toHaveBeenCalledTimes(3);
|
|
43
|
+
expect(mockRestService.delete).toHaveBeenCalledWith(
|
|
44
|
+
"/Dimensions('TestDim')/Hierarchies('TestHier')/Elements('Element1')"
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
console.log('✅ deleteElements via REST test passed');
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test('deleteElements should delete multiple elements via TI', async () => {
|
|
51
|
+
const elementNames = ['Element1', 'Element2'];
|
|
52
|
+
|
|
53
|
+
mockRestService.post.mockResolvedValue(createMockResponse({
|
|
54
|
+
ProcessExecuteStatusCode: 'CompletedSuccessfully'
|
|
55
|
+
}));
|
|
56
|
+
|
|
57
|
+
await elementService.deleteElements('TestDim', 'TestHier', elementNames, true);
|
|
58
|
+
|
|
59
|
+
expect(mockRestService.post).toHaveBeenCalledWith(
|
|
60
|
+
'/ExecuteProcessWithReturn',
|
|
61
|
+
expect.objectContaining({
|
|
62
|
+
PrologProcedure: expect.stringContaining("HierarchyElementDelete('TestDim','TestHier','Element1')")
|
|
63
|
+
})
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
console.log('✅ deleteElements via TI test passed');
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
test('addEdges should create parent-child relationships', async () => {
|
|
70
|
+
const edges = [
|
|
71
|
+
{ parent: 'Total', child: 'Region1', weight: 1 },
|
|
72
|
+
{ parent: 'Total', child: 'Region2', weight: 2 }
|
|
73
|
+
];
|
|
74
|
+
|
|
75
|
+
mockRestService.post.mockResolvedValue(createMockResponse({}));
|
|
76
|
+
|
|
77
|
+
await elementService.addEdges('TestDim', 'TestHier', edges);
|
|
78
|
+
|
|
79
|
+
expect(mockRestService.post).toHaveBeenCalledTimes(2);
|
|
80
|
+
expect(mockRestService.post).toHaveBeenCalledWith(
|
|
81
|
+
"/Dimensions('TestDim')/Hierarchies('TestHier')/Elements('Total')/Components",
|
|
82
|
+
{ Name: 'Region1', Weight: 1 }
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
console.log('✅ addEdges test passed');
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
test('deleteEdges should remove parent-child relationships via REST', async () => {
|
|
89
|
+
const edges = [
|
|
90
|
+
{ parent: 'Total', child: 'Region1' },
|
|
91
|
+
{ parent: 'Total', child: 'Region2' }
|
|
92
|
+
];
|
|
93
|
+
|
|
94
|
+
mockRestService.delete.mockResolvedValue(createMockResponse({}));
|
|
95
|
+
|
|
96
|
+
await elementService.deleteEdges('TestDim', 'TestHier', edges, false);
|
|
97
|
+
|
|
98
|
+
expect(mockRestService.delete).toHaveBeenCalledTimes(2);
|
|
99
|
+
expect(mockRestService.delete).toHaveBeenCalledWith(
|
|
100
|
+
"/Dimensions('TestDim')/Hierarchies('TestHier')/Elements('Total')/Components('Region1')"
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
console.log('✅ deleteEdges via REST test passed');
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test('deleteEdges should remove parent-child relationships via TI', async () => {
|
|
107
|
+
const edges = [{ parent: 'Total', child: 'Region1' }];
|
|
108
|
+
|
|
109
|
+
mockRestService.post.mockResolvedValue(createMockResponse({}));
|
|
110
|
+
|
|
111
|
+
await elementService.deleteEdges('TestDim', 'TestHier', edges, true);
|
|
112
|
+
|
|
113
|
+
expect(mockRestService.post).toHaveBeenCalledWith(
|
|
114
|
+
'/ExecuteProcessWithReturn',
|
|
115
|
+
expect.objectContaining({
|
|
116
|
+
PrologProcedure: expect.stringContaining("HierarchyElementComponentDelete('TestDim','TestHier','Total','Region1')")
|
|
117
|
+
})
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
console.log('✅ deleteEdges via TI test passed');
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
describe('DataFrame Integration', () => {
|
|
125
|
+
test('getElementsDataframe should return tabular data', async () => {
|
|
126
|
+
mockRestService.get.mockResolvedValue(createMockResponse({
|
|
127
|
+
value: [
|
|
128
|
+
{ Name: 'Element1', Type: 'Numeric', Attributes: { Code: 'E1', Description: 'First' } },
|
|
129
|
+
{ Name: 'Element2', Type: 'String', Attributes: { Code: 'E2', Description: 'Second' } }
|
|
130
|
+
]
|
|
131
|
+
}));
|
|
132
|
+
|
|
133
|
+
const result = await elementService.getElementsDataframe('TestDim', 'TestHier', ['Code', 'Description']);
|
|
134
|
+
|
|
135
|
+
expect(result).toEqual([
|
|
136
|
+
['Name', 'Type', 'Code', 'Description'],
|
|
137
|
+
['Element1', 'Numeric', 'E1', 'First'],
|
|
138
|
+
['Element2', 'String', 'E2', 'Second']
|
|
139
|
+
]);
|
|
140
|
+
|
|
141
|
+
console.log('✅ getElementsDataframe test passed');
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
test('createHierarchyFromDataframe should create elements and relationships', async () => {
|
|
145
|
+
const dataFrame = [
|
|
146
|
+
['Name', 'Type', 'Parent1', 'Weight1'],
|
|
147
|
+
['Total', 'Consolidated', '', ''],
|
|
148
|
+
['Region1', 'Numeric', 'Total', '1'],
|
|
149
|
+
['Region2', 'Numeric', 'Total', '2']
|
|
150
|
+
];
|
|
151
|
+
|
|
152
|
+
mockRestService.post.mockResolvedValue(createMockResponse({}));
|
|
153
|
+
|
|
154
|
+
await elementService.createHierarchyFromDataframe('TestDim', 'TestHier', dataFrame);
|
|
155
|
+
|
|
156
|
+
// Should create 3 elements
|
|
157
|
+
expect(mockRestService.post).toHaveBeenCalledTimes(5); // 3 creates + 2 edges
|
|
158
|
+
|
|
159
|
+
// Check element creation calls
|
|
160
|
+
expect(mockRestService.post).toHaveBeenCalledWith(
|
|
161
|
+
"/Dimensions('TestDim')/Hierarchies('TestHier')/Elements",
|
|
162
|
+
JSON.stringify({
|
|
163
|
+
Name: 'Total',
|
|
164
|
+
Type: 'Consolidated'
|
|
165
|
+
})
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
console.log('✅ createHierarchyFromDataframe test passed');
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
describe('Enhanced Element Retrieval', () => {
|
|
173
|
+
test('getElementsCount should return element count', async () => {
|
|
174
|
+
mockRestService.get.mockResolvedValue(createMockResponse('25'));
|
|
175
|
+
|
|
176
|
+
const count = await elementService.getElementsCount('TestDim', 'TestHier');
|
|
177
|
+
|
|
178
|
+
expect(count).toBe(25);
|
|
179
|
+
expect(mockRestService.get).toHaveBeenCalledWith(
|
|
180
|
+
"/Dimensions('TestDim')/Hierarchies('TestHier')/Elements/$count"
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
console.log('✅ getElementsCount test passed');
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
test('getElementsCount should filter consolidated elements', async () => {
|
|
187
|
+
mockRestService.get.mockResolvedValue(createMockResponse('15'));
|
|
188
|
+
|
|
189
|
+
const count = await elementService.getElementsCount('TestDim', 'TestHier', true);
|
|
190
|
+
|
|
191
|
+
expect(count).toBe(15);
|
|
192
|
+
expect(mockRestService.get).toHaveBeenCalledWith(
|
|
193
|
+
"/Dimensions('TestDim')/Hierarchies('TestHier')/Elements/$count?$filter=Type ne 'Consolidated'"
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
console.log('✅ getElementsCount with filter test passed');
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
test('getLeafElements should return non-consolidated elements', async () => {
|
|
200
|
+
mockRestService.get.mockResolvedValue(createMockResponse({
|
|
201
|
+
value: [
|
|
202
|
+
{ Name: 'Element1', Type: 'Numeric' },
|
|
203
|
+
{ Name: 'Element2', Type: 'String' }
|
|
204
|
+
]
|
|
205
|
+
}));
|
|
206
|
+
|
|
207
|
+
const elements = await elementService.getLeafElements('TestDim', 'TestHier');
|
|
208
|
+
|
|
209
|
+
expect(elements).toHaveLength(2);
|
|
210
|
+
expect(mockRestService.get).toHaveBeenCalledWith(
|
|
211
|
+
"/Dimensions('TestDim')/Hierarchies('TestHier')/Elements?$expand=*&$filter=Type ne 'Consolidated'"
|
|
212
|
+
);
|
|
213
|
+
|
|
214
|
+
console.log('✅ getLeafElements test passed');
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
test('getConsolidatedElements should return consolidated elements only', async () => {
|
|
218
|
+
mockRestService.get.mockResolvedValue(createMockResponse({
|
|
219
|
+
value: [
|
|
220
|
+
{ Name: 'Total', Type: 'Consolidated' },
|
|
221
|
+
{ Name: 'Region', Type: 'Consolidated' }
|
|
222
|
+
]
|
|
223
|
+
}));
|
|
224
|
+
|
|
225
|
+
const elements = await elementService.getConsolidatedElements('TestDim', 'TestHier');
|
|
226
|
+
|
|
227
|
+
expect(elements).toHaveLength(2);
|
|
228
|
+
expect(mockRestService.get).toHaveBeenCalledWith(
|
|
229
|
+
"/Dimensions('TestDim')/Hierarchies('TestHier')/Elements?$expand=*&$filter=Type eq 'Consolidated'"
|
|
230
|
+
);
|
|
231
|
+
|
|
232
|
+
console.log('✅ getConsolidatedElements test passed');
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
describe('Element Attributes', () => {
|
|
237
|
+
test('updateElementAttribute should update attribute value', async () => {
|
|
238
|
+
mockRestService.patch.mockResolvedValue(createMockResponse({}));
|
|
239
|
+
|
|
240
|
+
await elementService.updateElementAttribute('TestDim', 'TestHier', 'Element1', 'Code', 'E1-NEW');
|
|
241
|
+
|
|
242
|
+
expect(mockRestService.patch).toHaveBeenCalledWith(
|
|
243
|
+
"/Dimensions('TestDim')/Hierarchies('TestHier')/Elements('Element1')/Attributes('Code')",
|
|
244
|
+
{ Value: 'E1-NEW' }
|
|
245
|
+
);
|
|
246
|
+
|
|
247
|
+
console.log('✅ updateElementAttribute test passed');
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
describe('MDX Operations', () => {
|
|
252
|
+
test('executeSetMdxElementNames should return element names from MDX set', async () => {
|
|
253
|
+
mockRestService.post.mockResolvedValue(createMockResponse({
|
|
254
|
+
value: ['Element1', 'Element2', 'Element3']
|
|
255
|
+
}));
|
|
256
|
+
|
|
257
|
+
const elements = await elementService.executeSetMdxElementNames(
|
|
258
|
+
'TestDim',
|
|
259
|
+
'TestHier',
|
|
260
|
+
'{[TestDim].[TestHier].Members}'
|
|
261
|
+
);
|
|
262
|
+
|
|
263
|
+
expect(elements).toEqual(['Element1', 'Element2', 'Element3']);
|
|
264
|
+
expect(mockRestService.post).toHaveBeenCalledWith(
|
|
265
|
+
'/ExecuteMDXSetExpression',
|
|
266
|
+
{
|
|
267
|
+
MDX: '{[TestDim].[TestHier].Members}',
|
|
268
|
+
Dimension: 'TestDim',
|
|
269
|
+
Hierarchy: 'TestHier'
|
|
270
|
+
}
|
|
271
|
+
);
|
|
272
|
+
|
|
273
|
+
console.log('✅ executeSetMdxElementNames test passed');
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
describe('Error Handling', () => {
|
|
278
|
+
test('should handle empty element list gracefully', async () => {
|
|
279
|
+
await elementService.deleteElements('TestDim', 'TestHier', [], true);
|
|
280
|
+
|
|
281
|
+
// Should not make any API calls
|
|
282
|
+
expect(mockRestService.post).not.toHaveBeenCalled();
|
|
283
|
+
expect(mockRestService.delete).not.toHaveBeenCalled();
|
|
284
|
+
|
|
285
|
+
console.log('✅ Empty element list handling test passed');
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
test('should handle invalid DataFrame format', async () => {
|
|
289
|
+
const invalidDataFrame = [
|
|
290
|
+
['InvalidColumn', 'AnotherColumn'],
|
|
291
|
+
['Data1', 'Data2']
|
|
292
|
+
];
|
|
293
|
+
|
|
294
|
+
await expect(
|
|
295
|
+
elementService.createHierarchyFromDataframe('TestDim', 'TestHier', invalidDataFrame)
|
|
296
|
+
).rejects.toThrow('DataFrame must contain Name and Type columns');
|
|
297
|
+
|
|
298
|
+
console.log('✅ Invalid DataFrame handling test passed');
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
});
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import { ViewService } from '../services/ViewService';
|
|
2
|
+
import { RestService } from '../services/RestService';
|
|
3
|
+
import { NativeView } from '../objects/NativeView';
|
|
4
|
+
import { MDXView } from '../objects/MDXView';
|
|
5
|
+
import axios, { AxiosResponse } from 'axios';
|
|
6
|
+
|
|
7
|
+
// Mock axios
|
|
8
|
+
jest.mock('axios');
|
|
9
|
+
const mockedAxios = axios as jest.Mocked<typeof axios>;
|
|
10
|
+
|
|
11
|
+
describe('Enhanced ViewService Tests', () => {
|
|
12
|
+
let viewService: ViewService;
|
|
13
|
+
let mockRestService: jest.Mocked<RestService>;
|
|
14
|
+
|
|
15
|
+
const createMockResponse = (data: any, status: number = 200): AxiosResponse => ({
|
|
16
|
+
data,
|
|
17
|
+
status,
|
|
18
|
+
statusText: status === 200 ? 'OK' : status === 201 ? 'Created' : 'Error',
|
|
19
|
+
headers: {},
|
|
20
|
+
config: {} as any
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
mockRestService = {
|
|
25
|
+
get: jest.fn(),
|
|
26
|
+
post: jest.fn(),
|
|
27
|
+
patch: jest.fn(),
|
|
28
|
+
delete: jest.fn(),
|
|
29
|
+
put: jest.fn()
|
|
30
|
+
} as any;
|
|
31
|
+
|
|
32
|
+
viewService = new ViewService(mockRestService);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
describe('View Search Functions', () => {
|
|
36
|
+
test('searchStringInName should find views by name substring', async () => {
|
|
37
|
+
mockRestService.get.mockResolvedValue(createMockResponse({
|
|
38
|
+
value: [
|
|
39
|
+
{ Name: 'Sales_View_Q1' },
|
|
40
|
+
{ Name: 'Sales_View_Q2' },
|
|
41
|
+
{ Name: 'Budget_View_2024' }
|
|
42
|
+
]
|
|
43
|
+
}));
|
|
44
|
+
|
|
45
|
+
const result = await viewService.searchStringInName('TestCube', 'Sales');
|
|
46
|
+
|
|
47
|
+
expect(result).toEqual(['Sales_View_Q1', 'Sales_View_Q2', 'Budget_View_2024']);
|
|
48
|
+
expect(mockRestService.get).toHaveBeenCalledWith(
|
|
49
|
+
"/Cubes('TestCube')/Views?$select=Name&$filter=indexof(tolower(Name), 'sales') ge 0"
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
console.log('✅ searchStringInName test passed');
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test('searchStringInName should search private views', async () => {
|
|
56
|
+
mockRestService.get.mockResolvedValue(createMockResponse({
|
|
57
|
+
value: [
|
|
58
|
+
{ Name: 'Private_Sales_View' }
|
|
59
|
+
]
|
|
60
|
+
}));
|
|
61
|
+
|
|
62
|
+
const result = await viewService.searchStringInName('TestCube', 'Sales', true);
|
|
63
|
+
|
|
64
|
+
expect(result).toEqual(['Private_Sales_View']);
|
|
65
|
+
expect(mockRestService.get).toHaveBeenCalledWith(
|
|
66
|
+
"/Cubes('TestCube')/PrivateViews?$select=Name&$filter=indexof(tolower(Name), 'sales') ge 0"
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
console.log('✅ searchStringInName private views test passed');
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test('searchStringInMdx should find views by MDX content', async () => {
|
|
73
|
+
mockRestService.get.mockResolvedValue(createMockResponse({
|
|
74
|
+
value: [
|
|
75
|
+
{ Name: 'MDXView1', MDX: 'SELECT {[Year].Members} ON 0 FROM [SalesCube]' },
|
|
76
|
+
{ Name: 'MDXView2', MDX: 'SELECT {[Product].Members} ON 0 FROM [BudgetCube]' },
|
|
77
|
+
{ Name: 'NativeView1', MDX: null }
|
|
78
|
+
]
|
|
79
|
+
}));
|
|
80
|
+
|
|
81
|
+
const result = await viewService.searchStringInMdx('TestCube', 'SalesCube');
|
|
82
|
+
|
|
83
|
+
expect(result).toEqual(['MDXView1']);
|
|
84
|
+
expect(mockRestService.get).toHaveBeenCalledWith(
|
|
85
|
+
"/Cubes('TestCube')/Views?$select=Name,MDX"
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
console.log('✅ searchStringInMdx test passed');
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test('searchStringInMdx should be case insensitive by default', async () => {
|
|
92
|
+
mockRestService.get.mockResolvedValue(createMockResponse({
|
|
93
|
+
value: [
|
|
94
|
+
{ Name: 'MDXView1', MDX: 'SELECT {[YEAR].Members} ON 0 FROM [SalesCube]' }
|
|
95
|
+
]
|
|
96
|
+
}));
|
|
97
|
+
|
|
98
|
+
const result = await viewService.searchStringInMdx('TestCube', 'year');
|
|
99
|
+
|
|
100
|
+
expect(result).toEqual(['MDXView1']);
|
|
101
|
+
|
|
102
|
+
console.log('✅ searchStringInMdx case insensitive test passed');
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test('searchStringInMdx should respect case sensitivity when disabled', async () => {
|
|
106
|
+
mockRestService.get.mockResolvedValue(createMockResponse({
|
|
107
|
+
value: [
|
|
108
|
+
{ Name: 'MDXView1', MDX: 'SELECT {[YEAR].Members} ON 0 FROM [SalesCube]' }
|
|
109
|
+
]
|
|
110
|
+
}));
|
|
111
|
+
|
|
112
|
+
const result = await viewService.searchStringInMdx('TestCube', 'year', false, false);
|
|
113
|
+
|
|
114
|
+
expect(result).toEqual([]);
|
|
115
|
+
|
|
116
|
+
console.log('✅ searchStringInMdx case sensitive test passed');
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
describe('View Type Detection', () => {
|
|
121
|
+
test('isMdxView should return true for MDX views', async () => {
|
|
122
|
+
mockRestService.get.mockResolvedValue(createMockResponse({
|
|
123
|
+
MDX: 'SELECT {[Year].Members} ON 0 FROM [TestCube]'
|
|
124
|
+
}));
|
|
125
|
+
|
|
126
|
+
const result = await viewService.isMdxView('TestCube', 'TestView');
|
|
127
|
+
|
|
128
|
+
expect(result).toBe(true);
|
|
129
|
+
expect(mockRestService.get).toHaveBeenCalledWith(
|
|
130
|
+
"/Cubes('TestCube')/Views('TestView')/?$select=MDX"
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
console.log('✅ isMdxView positive test passed');
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
test('isMdxView should return false for native views', async () => {
|
|
137
|
+
mockRestService.get.mockResolvedValue(createMockResponse({
|
|
138
|
+
MDX: null
|
|
139
|
+
}));
|
|
140
|
+
|
|
141
|
+
const result = await viewService.isMdxView('TestCube', 'TestView');
|
|
142
|
+
|
|
143
|
+
expect(result).toBe(false);
|
|
144
|
+
|
|
145
|
+
console.log('✅ isMdxView negative test passed');
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test('isNativeView should return opposite of isMdxView', async () => {
|
|
149
|
+
mockRestService.get.mockResolvedValue(createMockResponse({
|
|
150
|
+
MDX: null
|
|
151
|
+
}));
|
|
152
|
+
|
|
153
|
+
const result = await viewService.isNativeView('TestCube', 'TestView');
|
|
154
|
+
|
|
155
|
+
expect(result).toBe(true);
|
|
156
|
+
|
|
157
|
+
console.log('✅ isNativeView test passed');
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
test('isMdxView should check private views', async () => {
|
|
161
|
+
mockRestService.get.mockResolvedValue(createMockResponse({
|
|
162
|
+
MDX: 'SELECT {[Product].Members} ON 0 FROM [TestCube]'
|
|
163
|
+
}));
|
|
164
|
+
|
|
165
|
+
const result = await viewService.isMdxView('TestCube', 'PrivateView', true);
|
|
166
|
+
|
|
167
|
+
expect(result).toBe(true);
|
|
168
|
+
expect(mockRestService.get).toHaveBeenCalledWith(
|
|
169
|
+
"/Cubes('TestCube')/PrivateViews('PrivateView')/?$select=MDX"
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
console.log('✅ isMdxView private view test passed');
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
describe('View Count Functions', () => {
|
|
177
|
+
test('getViewCount should return total count for both view types', async () => {
|
|
178
|
+
mockRestService.get
|
|
179
|
+
.mockResolvedValueOnce(createMockResponse('5')) // private count
|
|
180
|
+
.mockResolvedValueOnce(createMockResponse('10')); // public count
|
|
181
|
+
|
|
182
|
+
const result = await viewService.getViewCount('TestCube');
|
|
183
|
+
|
|
184
|
+
expect(result).toBe(15);
|
|
185
|
+
expect(mockRestService.get).toHaveBeenCalledTimes(2);
|
|
186
|
+
expect(mockRestService.get).toHaveBeenCalledWith(
|
|
187
|
+
"/Cubes('TestCube')/PrivateViews/$count"
|
|
188
|
+
);
|
|
189
|
+
expect(mockRestService.get).toHaveBeenCalledWith(
|
|
190
|
+
"/Cubes('TestCube')/Views/$count"
|
|
191
|
+
);
|
|
192
|
+
|
|
193
|
+
console.log('✅ getViewCount total test passed');
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
test('getViewCount should return private view count only', async () => {
|
|
197
|
+
mockRestService.get.mockResolvedValue(createMockResponse('3'));
|
|
198
|
+
|
|
199
|
+
const result = await viewService.getViewCount('TestCube', true);
|
|
200
|
+
|
|
201
|
+
expect(result).toBe(3);
|
|
202
|
+
expect(mockRestService.get).toHaveBeenCalledWith(
|
|
203
|
+
"/Cubes('TestCube')/PrivateViews/$count"
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
console.log('✅ getViewCount private test passed');
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
test('getViewCount should return public view count only', async () => {
|
|
210
|
+
mockRestService.get.mockResolvedValue(createMockResponse('7'));
|
|
211
|
+
|
|
212
|
+
const result = await viewService.getViewCount('TestCube', false);
|
|
213
|
+
|
|
214
|
+
expect(result).toBe(7);
|
|
215
|
+
expect(mockRestService.get).toHaveBeenCalledWith(
|
|
216
|
+
"/Cubes('TestCube')/Views/$count"
|
|
217
|
+
);
|
|
218
|
+
|
|
219
|
+
console.log('✅ getViewCount public test passed');
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
describe('View Name Retrieval by Type', () => {
|
|
224
|
+
test('getMdxViewNames should return only MDX view names', async () => {
|
|
225
|
+
mockRestService.get.mockResolvedValue(createMockResponse({
|
|
226
|
+
value: [
|
|
227
|
+
{ Name: 'MDXView1', MDX: 'SELECT {[Year].Members} ON 0 FROM [TestCube]' },
|
|
228
|
+
{ Name: 'NativeView1', MDX: null },
|
|
229
|
+
{ Name: 'MDXView2', MDX: 'SELECT {[Product].Members} ON 0 FROM [TestCube]' }
|
|
230
|
+
]
|
|
231
|
+
}));
|
|
232
|
+
|
|
233
|
+
const result = await viewService.getMdxViewNames('TestCube');
|
|
234
|
+
|
|
235
|
+
expect(result).toEqual(['MDXView1', 'MDXView2']);
|
|
236
|
+
expect(mockRestService.get).toHaveBeenCalledWith(
|
|
237
|
+
"/Cubes('TestCube')/Views?$select=Name,MDX"
|
|
238
|
+
);
|
|
239
|
+
|
|
240
|
+
console.log('✅ getMdxViewNames test passed');
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
test('getNativeViewNames should return only native view names', async () => {
|
|
244
|
+
mockRestService.get.mockResolvedValue(createMockResponse({
|
|
245
|
+
value: [
|
|
246
|
+
{ Name: 'MDXView1', MDX: 'SELECT {[Year].Members} ON 0 FROM [TestCube]' },
|
|
247
|
+
{ Name: 'NativeView1', MDX: null },
|
|
248
|
+
{ Name: 'NativeView2', MDX: null }
|
|
249
|
+
]
|
|
250
|
+
}));
|
|
251
|
+
|
|
252
|
+
const result = await viewService.getNativeViewNames('TestCube');
|
|
253
|
+
|
|
254
|
+
expect(result).toEqual(['NativeView1', 'NativeView2']);
|
|
255
|
+
expect(mockRestService.get).toHaveBeenCalledWith(
|
|
256
|
+
"/Cubes('TestCube')/Views?$select=Name,MDX"
|
|
257
|
+
);
|
|
258
|
+
|
|
259
|
+
console.log('✅ getNativeViewNames test passed');
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
test('getMdxViewNames should work with private views', async () => {
|
|
263
|
+
mockRestService.get.mockResolvedValue(createMockResponse({
|
|
264
|
+
value: [
|
|
265
|
+
{ Name: 'PrivateMDXView', MDX: 'SELECT {[Month].Members} ON 0 FROM [TestCube]' }
|
|
266
|
+
]
|
|
267
|
+
}));
|
|
268
|
+
|
|
269
|
+
const result = await viewService.getMdxViewNames('TestCube', true);
|
|
270
|
+
|
|
271
|
+
expect(result).toEqual(['PrivateMDXView']);
|
|
272
|
+
expect(mockRestService.get).toHaveBeenCalledWith(
|
|
273
|
+
"/Cubes('TestCube')/PrivateViews?$select=Name,MDX"
|
|
274
|
+
);
|
|
275
|
+
|
|
276
|
+
console.log('✅ getMdxViewNames private test passed');
|
|
277
|
+
});
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
describe('Update or Create Functionality', () => {
|
|
281
|
+
test('updateOrCreate should update existing view', async () => {
|
|
282
|
+
const mockView = {
|
|
283
|
+
cube: 'TestCube',
|
|
284
|
+
name: 'TestView',
|
|
285
|
+
mdx: 'SELECT {[Year].Members} ON 0 FROM [TestCube]'
|
|
286
|
+
} as any;
|
|
287
|
+
|
|
288
|
+
// Mock exists to return true
|
|
289
|
+
jest.spyOn(viewService, 'exists').mockResolvedValue(true);
|
|
290
|
+
jest.spyOn(viewService, 'update').mockResolvedValue(createMockResponse({}));
|
|
291
|
+
|
|
292
|
+
await viewService.updateOrCreate(mockView, false);
|
|
293
|
+
|
|
294
|
+
expect(viewService.update).toHaveBeenCalledWith(mockView, false);
|
|
295
|
+
|
|
296
|
+
console.log('✅ updateOrCreate update test passed');
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
test('updateOrCreate should create non-existing view', async () => {
|
|
300
|
+
const mockView = {
|
|
301
|
+
cube: 'TestCube',
|
|
302
|
+
name: 'NewView',
|
|
303
|
+
mdx: 'SELECT {[Product].Members} ON 0 FROM [TestCube]'
|
|
304
|
+
} as any;
|
|
305
|
+
|
|
306
|
+
// Mock exists to return false
|
|
307
|
+
jest.spyOn(viewService, 'exists').mockResolvedValue(false);
|
|
308
|
+
jest.spyOn(viewService, 'create').mockResolvedValue(createMockResponse({}));
|
|
309
|
+
|
|
310
|
+
await viewService.updateOrCreate(mockView, false);
|
|
311
|
+
|
|
312
|
+
expect(viewService.create).toHaveBeenCalledWith(mockView, false);
|
|
313
|
+
|
|
314
|
+
console.log('✅ updateOrCreate create test passed');
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
test('updateOrCreate should handle complex exists response for private views', async () => {
|
|
318
|
+
const mockView = {
|
|
319
|
+
cube: 'TestCube',
|
|
320
|
+
name: 'TestView'
|
|
321
|
+
} as any;
|
|
322
|
+
|
|
323
|
+
// Mock exists to return [true, false] (private exists, public doesn't)
|
|
324
|
+
jest.spyOn(viewService, 'exists').mockResolvedValue([true, false]);
|
|
325
|
+
jest.spyOn(viewService, 'update').mockResolvedValue(createMockResponse({}));
|
|
326
|
+
|
|
327
|
+
await viewService.updateOrCreate(mockView, true);
|
|
328
|
+
|
|
329
|
+
expect(viewService.update).toHaveBeenCalledWith(mockView, true);
|
|
330
|
+
|
|
331
|
+
console.log('✅ updateOrCreate complex exists test passed');
|
|
332
|
+
});
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
describe('Error Handling', () => {
|
|
336
|
+
test('should handle empty search results gracefully', async () => {
|
|
337
|
+
mockRestService.get.mockResolvedValue(createMockResponse({
|
|
338
|
+
value: []
|
|
339
|
+
}));
|
|
340
|
+
|
|
341
|
+
const result = await viewService.searchStringInName('TestCube', 'NonExistent');
|
|
342
|
+
|
|
343
|
+
expect(result).toEqual([]);
|
|
344
|
+
|
|
345
|
+
console.log('✅ Empty search results handling test passed');
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
test('should handle invalid count responses', async () => {
|
|
349
|
+
mockRestService.get.mockResolvedValue(createMockResponse('invalid'));
|
|
350
|
+
|
|
351
|
+
const result = await viewService.getViewCount('TestCube', false);
|
|
352
|
+
|
|
353
|
+
expect(result).toBe(0);
|
|
354
|
+
|
|
355
|
+
console.log('✅ Invalid count handling test passed');
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
test('should handle views without MDX in search', async () => {
|
|
359
|
+
mockRestService.get.mockResolvedValue(createMockResponse({
|
|
360
|
+
value: [
|
|
361
|
+
{ Name: 'NativeView1', MDX: null },
|
|
362
|
+
{ Name: 'NativeView2', MDX: undefined }
|
|
363
|
+
]
|
|
364
|
+
}));
|
|
365
|
+
|
|
366
|
+
const result = await viewService.searchStringInMdx('TestCube', 'SELECT');
|
|
367
|
+
|
|
368
|
+
expect(result).toEqual([]);
|
|
369
|
+
|
|
370
|
+
console.log('✅ Views without MDX handling test passed');
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
});
|