@microsoft/power-apps-cli 0.6.0 → 0.6.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/lib/ArgumentProvider.d.ts.map +1 -1
  2. package/lib/ArgumentProvider.js +11 -7
  3. package/lib/ArgumentProvider.js.map +1 -1
  4. package/lib/Authentication/NodeMsalAuthenticationProvider.d.ts +4 -1
  5. package/lib/Authentication/NodeMsalAuthenticationProvider.d.ts.map +1 -1
  6. package/lib/Authentication/NodeMsalAuthenticationProvider.js +5 -1
  7. package/lib/Authentication/NodeMsalAuthenticationProvider.js.map +1 -1
  8. package/lib/Authentication/PacCliAuthenticationProvider.d.ts +2 -1
  9. package/lib/Authentication/PacCliAuthenticationProvider.d.ts.map +1 -1
  10. package/lib/Authentication/PacCliAuthenticationProvider.js +1 -1
  11. package/lib/Authentication/PacCliAuthenticationProvider.js.map +1 -1
  12. package/lib/Authentication/ServicePrincipalAuthenticationProvider.d.ts +3 -1
  13. package/lib/Authentication/ServicePrincipalAuthenticationProvider.d.ts.map +1 -1
  14. package/lib/Authentication/ServicePrincipalAuthenticationProvider.js +4 -2
  15. package/lib/Authentication/ServicePrincipalAuthenticationProvider.js.map +1 -1
  16. package/lib/Cli.d.ts.map +1 -1
  17. package/lib/Cli.js +1 -2
  18. package/lib/Cli.js.map +1 -1
  19. package/lib/CliUtils.d.ts +1 -1
  20. package/lib/CliUtils.d.ts.map +1 -1
  21. package/lib/CliUtils.js +36 -9
  22. package/lib/CliUtils.js.map +1 -1
  23. package/lib/HttpClient/CliHttpClient.d.ts.map +1 -1
  24. package/lib/HttpClient/CliHttpClient.js +2 -1
  25. package/lib/HttpClient/CliHttpClient.js.map +1 -1
  26. package/lib/Types/Cli.types.d.ts +2 -1
  27. package/lib/Types/Cli.types.d.ts.map +1 -1
  28. package/lib/Utils/EnhanceNetworkError.d.ts +14 -0
  29. package/lib/Utils/EnhanceNetworkError.d.ts.map +1 -0
  30. package/lib/Utils/EnhanceNetworkError.js +59 -0
  31. package/lib/Utils/EnhanceNetworkError.js.map +1 -0
  32. package/lib/Verbs/Init.d.ts.map +1 -1
  33. package/lib/Verbs/Init.js +3 -0
  34. package/lib/Verbs/Init.js.map +1 -1
  35. package/lib/__tests__/E2eTests/basicSetup/loggingConfiguration.test.d.ts +5 -0
  36. package/lib/__tests__/E2eTests/basicSetup/loggingConfiguration.test.d.ts.map +1 -0
  37. package/lib/__tests__/E2eTests/basicSetup/loggingConfiguration.test.js +246 -0
  38. package/lib/__tests__/E2eTests/basicSetup/loggingConfiguration.test.js.map +1 -0
  39. package/lib/__tests__/E2eTests/cliUsability/cliHelp.test.d.ts +5 -0
  40. package/lib/__tests__/E2eTests/cliUsability/cliHelp.test.d.ts.map +1 -0
  41. package/lib/__tests__/E2eTests/cliUsability/cliHelp.test.js +162 -0
  42. package/lib/__tests__/E2eTests/cliUsability/cliHelp.test.js.map +1 -0
  43. package/lib/__tests__/E2eTests/cliUsability/logoutReauth.test.d.ts +5 -0
  44. package/lib/__tests__/E2eTests/cliUsability/logoutReauth.test.d.ts.map +1 -0
  45. package/lib/__tests__/E2eTests/cliUsability/logoutReauth.test.js +115 -0
  46. package/lib/__tests__/E2eTests/cliUsability/logoutReauth.test.js.map +1 -0
  47. package/lib/__tests__/E2eTests/cliUsability/missingParameters.test.d.ts +5 -0
  48. package/lib/__tests__/E2eTests/cliUsability/missingParameters.test.d.ts.map +1 -0
  49. package/lib/__tests__/E2eTests/cliUsability/missingParameters.test.js +189 -0
  50. package/lib/__tests__/E2eTests/cliUsability/missingParameters.test.js.map +1 -0
  51. package/lib/__tests__/E2eTests/commonUserWorkflowSmokeTest.test.js +8 -6
  52. package/lib/__tests__/E2eTests/commonUserWorkflowSmokeTest.test.js.map +1 -1
  53. package/lib/__tests__/E2eTests/e2eConfig.d.ts +95 -0
  54. package/lib/__tests__/E2eTests/e2eConfig.d.ts.map +1 -0
  55. package/lib/__tests__/E2eTests/e2eConfig.js +122 -0
  56. package/lib/__tests__/E2eTests/e2eConfig.js.map +1 -0
  57. package/lib/__tests__/UnitTests/CliUtils.spec.d.ts +5 -0
  58. package/lib/__tests__/UnitTests/CliUtils.spec.d.ts.map +1 -0
  59. package/lib/__tests__/UnitTests/CliUtils.spec.js +94 -0
  60. package/lib/__tests__/UnitTests/CliUtils.spec.js.map +1 -0
  61. package/lib/__tests__/UnitTests/ServicePrincipalAuthenticationProvider.spec.js +3 -3
  62. package/lib/__tests__/UnitTests/ServicePrincipalAuthenticationProvider.spec.js.map +1 -1
  63. package/lib/__tests__/UnitTests/enhanceNetworkError.test.d.ts +5 -0
  64. package/lib/__tests__/UnitTests/enhanceNetworkError.test.d.ts.map +1 -0
  65. package/lib/__tests__/UnitTests/enhanceNetworkError.test.js +177 -0
  66. package/lib/__tests__/UnitTests/enhanceNetworkError.test.js.map +1 -0
  67. package/lib/__tests__/helpers/e2eTestHelpers.d.ts.map +1 -1
  68. package/lib/__tests__/helpers/e2eTestHelpers.js +16 -0
  69. package/lib/__tests__/helpers/e2eTestHelpers.js.map +1 -1
  70. package/lib/__tests__/helpers/testHelpers.d.ts +146 -30
  71. package/lib/__tests__/helpers/testHelpers.d.ts.map +1 -1
  72. package/lib/__tests__/helpers/testHelpers.js +245 -74
  73. package/lib/__tests__/helpers/testHelpers.js.map +1 -1
  74. package/lib-cjs/ArgumentProvider.d.ts.map +1 -1
  75. package/lib-cjs/ArgumentProvider.js +7 -1
  76. package/lib-cjs/ArgumentProvider.js.map +1 -1
  77. package/lib-cjs/Authentication/NodeMsalAuthenticationProvider.d.ts +4 -1
  78. package/lib-cjs/Authentication/NodeMsalAuthenticationProvider.d.ts.map +1 -1
  79. package/lib-cjs/Authentication/NodeMsalAuthenticationProvider.js +4 -1
  80. package/lib-cjs/Authentication/NodeMsalAuthenticationProvider.js.map +1 -1
  81. package/lib-cjs/Authentication/PacCliAuthenticationProvider.d.ts +2 -1
  82. package/lib-cjs/Authentication/PacCliAuthenticationProvider.d.ts.map +1 -1
  83. package/lib-cjs/Authentication/PacCliAuthenticationProvider.js +1 -1
  84. package/lib-cjs/Authentication/PacCliAuthenticationProvider.js.map +1 -1
  85. package/lib-cjs/Authentication/ServicePrincipalAuthenticationProvider.d.ts +3 -1
  86. package/lib-cjs/Authentication/ServicePrincipalAuthenticationProvider.d.ts.map +1 -1
  87. package/lib-cjs/Authentication/ServicePrincipalAuthenticationProvider.js +4 -2
  88. package/lib-cjs/Authentication/ServicePrincipalAuthenticationProvider.js.map +1 -1
  89. package/lib-cjs/Cli.d.ts.map +1 -1
  90. package/lib-cjs/Cli.js +14 -18
  91. package/lib-cjs/Cli.js.map +1 -1
  92. package/lib-cjs/CliUtils.d.ts +1 -1
  93. package/lib-cjs/CliUtils.d.ts.map +1 -1
  94. package/lib-cjs/CliUtils.js +38 -11
  95. package/lib-cjs/CliUtils.js.map +1 -1
  96. package/lib-cjs/HttpClient/CliHttpClient.d.ts.map +1 -1
  97. package/lib-cjs/HttpClient/CliHttpClient.js +2 -1
  98. package/lib-cjs/HttpClient/CliHttpClient.js.map +1 -1
  99. package/lib-cjs/Types/Cli.types.d.ts +2 -1
  100. package/lib-cjs/Types/Cli.types.d.ts.map +1 -1
  101. package/lib-cjs/Utils/EnhanceNetworkError.d.ts +13 -0
  102. package/lib-cjs/Utils/EnhanceNetworkError.d.ts.map +1 -0
  103. package/lib-cjs/Utils/EnhanceNetworkError.js +63 -0
  104. package/lib-cjs/Utils/EnhanceNetworkError.js.map +1 -0
  105. package/lib-cjs/Verbs/Init.d.ts.map +1 -1
  106. package/lib-cjs/Verbs/Init.js +4 -0
  107. package/lib-cjs/Verbs/Init.js.map +1 -1
  108. package/lib-cjs/__tests__/E2eTests/basicSetup/loggingConfiguration.test.d.ts +4 -0
  109. package/lib-cjs/__tests__/E2eTests/basicSetup/loggingConfiguration.test.d.ts.map +1 -0
  110. package/lib-cjs/__tests__/E2eTests/basicSetup/loggingConfiguration.test.js +271 -0
  111. package/lib-cjs/__tests__/E2eTests/basicSetup/loggingConfiguration.test.js.map +1 -0
  112. package/lib-cjs/__tests__/E2eTests/cliUsability/cliHelp.test.d.ts +4 -0
  113. package/lib-cjs/__tests__/E2eTests/cliUsability/cliHelp.test.d.ts.map +1 -0
  114. package/lib-cjs/__tests__/E2eTests/cliUsability/cliHelp.test.js +187 -0
  115. package/lib-cjs/__tests__/E2eTests/cliUsability/cliHelp.test.js.map +1 -0
  116. package/lib-cjs/__tests__/E2eTests/cliUsability/logoutReauth.test.d.ts +4 -0
  117. package/lib-cjs/__tests__/E2eTests/cliUsability/logoutReauth.test.d.ts.map +1 -0
  118. package/lib-cjs/__tests__/E2eTests/cliUsability/logoutReauth.test.js +140 -0
  119. package/lib-cjs/__tests__/E2eTests/cliUsability/logoutReauth.test.js.map +1 -0
  120. package/lib-cjs/__tests__/E2eTests/cliUsability/missingParameters.test.d.ts +4 -0
  121. package/lib-cjs/__tests__/E2eTests/cliUsability/missingParameters.test.d.ts.map +1 -0
  122. package/lib-cjs/__tests__/E2eTests/cliUsability/missingParameters.test.js +191 -0
  123. package/lib-cjs/__tests__/E2eTests/cliUsability/missingParameters.test.js.map +1 -0
  124. package/lib-cjs/__tests__/E2eTests/commonUserWorkflowSmokeTest.test.js +5 -5
  125. package/lib-cjs/__tests__/E2eTests/commonUserWorkflowSmokeTest.test.js.map +1 -1
  126. package/lib-cjs/__tests__/E2eTests/e2eConfig.d.ts +94 -0
  127. package/lib-cjs/__tests__/E2eTests/e2eConfig.d.ts.map +1 -0
  128. package/lib-cjs/__tests__/E2eTests/e2eConfig.js +149 -0
  129. package/lib-cjs/__tests__/E2eTests/e2eConfig.js.map +1 -0
  130. package/lib-cjs/__tests__/UnitTests/CliUtils.spec.d.ts +4 -0
  131. package/lib-cjs/__tests__/UnitTests/CliUtils.spec.d.ts.map +1 -0
  132. package/lib-cjs/__tests__/UnitTests/CliUtils.spec.js +97 -0
  133. package/lib-cjs/__tests__/UnitTests/CliUtils.spec.js.map +1 -0
  134. package/lib-cjs/__tests__/UnitTests/ServicePrincipalAuthenticationProvider.spec.js +3 -3
  135. package/lib-cjs/__tests__/UnitTests/ServicePrincipalAuthenticationProvider.spec.js.map +1 -1
  136. package/lib-cjs/__tests__/UnitTests/enhanceNetworkError.test.d.ts +4 -0
  137. package/lib-cjs/__tests__/UnitTests/enhanceNetworkError.test.d.ts.map +1 -0
  138. package/lib-cjs/__tests__/UnitTests/enhanceNetworkError.test.js +179 -0
  139. package/lib-cjs/__tests__/UnitTests/enhanceNetworkError.test.js.map +1 -0
  140. package/lib-cjs/__tests__/helpers/e2eTestHelpers.d.ts.map +1 -1
  141. package/lib-cjs/__tests__/helpers/e2eTestHelpers.js +16 -0
  142. package/lib-cjs/__tests__/helpers/e2eTestHelpers.js.map +1 -1
  143. package/lib-cjs/__tests__/helpers/testHelpers.d.ts +146 -30
  144. package/lib-cjs/__tests__/helpers/testHelpers.d.ts.map +1 -1
  145. package/lib-cjs/__tests__/helpers/testHelpers.js +242 -98
  146. package/lib-cjs/__tests__/helpers/testHelpers.js.map +1 -1
  147. package/node_modules/@microsoft/powerapps-data/package.json +2 -2
  148. package/node_modules/@microsoft/powerapps-player-actions/lib/Actions/ListTables.d.ts +1 -1
  149. package/node_modules/@microsoft/powerapps-player-actions/lib/Actions/ListTables.d.ts.map +1 -1
  150. package/node_modules/@microsoft/powerapps-player-actions/lib/Actions/ListTables.js +11 -2
  151. package/node_modules/@microsoft/powerapps-player-actions/lib/Actions/ListTables.js.map +1 -1
  152. package/node_modules/@microsoft/powerapps-player-actions/lib/CodeGen/modelServiceGenerator.d.ts +10 -0
  153. package/node_modules/@microsoft/powerapps-player-actions/lib/CodeGen/modelServiceGenerator.d.ts.map +1 -1
  154. package/node_modules/@microsoft/powerapps-player-actions/lib/CodeGen/modelServiceGenerator.js +98 -36
  155. package/node_modules/@microsoft/powerapps-player-actions/lib/CodeGen/modelServiceGenerator.js.map +1 -1
  156. package/node_modules/@microsoft/powerapps-player-actions/lib/__tests__/ModelServiceGenerator.spec.js +16 -2
  157. package/node_modules/@microsoft/powerapps-player-actions/lib/__tests__/ModelServiceGenerator.spec.js.map +1 -1
  158. package/node_modules/@microsoft/powerapps-player-actions/lib-cjs/Actions/ListTables.d.ts +1 -1
  159. package/node_modules/@microsoft/powerapps-player-actions/lib-cjs/Actions/ListTables.d.ts.map +1 -1
  160. package/node_modules/@microsoft/powerapps-player-actions/lib-cjs/Actions/ListTables.js +14 -5
  161. package/node_modules/@microsoft/powerapps-player-actions/lib-cjs/Actions/ListTables.js.map +1 -1
  162. package/node_modules/@microsoft/powerapps-player-actions/lib-cjs/CodeGen/modelServiceGenerator.d.ts +10 -0
  163. package/node_modules/@microsoft/powerapps-player-actions/lib-cjs/CodeGen/modelServiceGenerator.d.ts.map +1 -1
  164. package/node_modules/@microsoft/powerapps-player-actions/lib-cjs/CodeGen/modelServiceGenerator.js +139 -65
  165. package/node_modules/@microsoft/powerapps-player-actions/lib-cjs/CodeGen/modelServiceGenerator.js.map +1 -1
  166. package/node_modules/@microsoft/powerapps-player-actions/lib-cjs/__tests__/ModelServiceGenerator.spec.js +31 -1
  167. package/node_modules/@microsoft/powerapps-player-actions/lib-cjs/__tests__/ModelServiceGenerator.spec.js.map +1 -1
  168. package/node_modules/@microsoft/powerapps-player-actions/package.json +2 -2
  169. package/node_modules/@pa-client/powerapps-player-services/lib/Services/Connectivity/__tests__/ApimService.spec.js +3 -0
  170. package/node_modules/@pa-client/powerapps-player-services/lib/Services/Connectivity/__tests__/ApimService.spec.js.map +1 -1
  171. package/node_modules/@pa-client/powerapps-player-services/lib/Services/PlayerLaunchService/PlayerLaunchService.types.d.ts +1 -0
  172. package/node_modules/@pa-client/powerapps-player-services/lib/Services/PlayerLaunchService/PlayerLaunchService.types.d.ts.map +1 -1
  173. package/node_modules/@pa-client/powerapps-player-services/lib-cjs/Services/Connectivity/__tests__/ApimService.spec.js +3 -0
  174. package/node_modules/@pa-client/powerapps-player-services/lib-cjs/Services/Connectivity/__tests__/ApimService.spec.js.map +1 -1
  175. package/node_modules/@pa-client/powerapps-player-services/lib-cjs/Services/PlayerLaunchService/PlayerLaunchService.types.d.ts +1 -0
  176. package/node_modules/@pa-client/powerapps-player-services/lib-cjs/Services/PlayerLaunchService/PlayerLaunchService.types.d.ts.map +1 -1
  177. package/node_modules/@pa-client/powerapps-player-services/package.json +1 -1
  178. package/package.json +4 -4
@@ -0,0 +1,246 @@
1
+ /*!
2
+ * Copyright (C) Microsoft Corporation. All rights reserved.
3
+ */
4
+ /**
5
+ * E2E Tests: Basic Setup - Logging Configuration
6
+ *
7
+ * Tests that the CLI logging and telemetry configuration works correctly.
8
+ * Test Cases:
9
+ * - TC 35840167: Logging Configuration Baseline
10
+ * - TC 35840168: Telemetry Event Emission on Command Execution
11
+ */
12
+ import { afterAll, beforeAll, beforeEach, describe, expect, it } from '@jest/globals';
13
+ import * as fs from 'fs';
14
+ import * as path from 'path';
15
+ import { describeE2E } from '../../helpers/e2eTestHelpers';
16
+ import { setupE2eTest } from '../../helpers/testHelpers';
17
+ import { E2E_CONFIG } from '../e2eConfig';
18
+ const TEST_FOLDER_NAME = 'loggingConfigTests';
19
+ describeE2E('Basic Setup - Logging Configuration (TC: 35840167, 35840168)', () => {
20
+ let testSetup;
21
+ beforeAll(() => {
22
+ testSetup = setupE2eTest({
23
+ testFolderName: TEST_FOLDER_NAME,
24
+ tempBaseDir: E2E_CONFIG.tempBaseDir,
25
+ });
26
+ // Create power.config.json
27
+ const configPath = path.join(testSetup.projectRoot, 'power.config.json');
28
+ fs.writeFileSync(configPath, JSON.stringify({
29
+ version: '1.0',
30
+ appId: null,
31
+ appDisplayName: 'Logging Config Test App',
32
+ region: E2E_CONFIG.region,
33
+ environmentId: E2E_CONFIG.environmentId,
34
+ connectionReferences: {},
35
+ databaseReferences: {},
36
+ }));
37
+ });
38
+ afterAll(() => {
39
+ testSetup.cleanup();
40
+ });
41
+ describe('default logging behavior (TC: 35840167)', () => {
42
+ beforeEach(() => {
43
+ // Remove user settings to test defaults
44
+ if (fs.existsSync(testSetup.userSettingsPath)) {
45
+ fs.unlinkSync(testSetup.userSettingsPath);
46
+ }
47
+ });
48
+ it('CLI runs without user settings file', () => {
49
+ expect(fs.existsSync(testSetup.userSettingsPath)).toBe(false);
50
+ const result = testSetup.execute('logout', []);
51
+ // Should succeed even without settings
52
+ expect(result.stderr).toBe('');
53
+ expect(result.stdout.includes('Successfully logged out') || result.stdout.includes('No user found')).toBe(true);
54
+ });
55
+ it('--help works without any configuration', () => {
56
+ const result = testSetup.execute('', ['--help']);
57
+ expect(result.exitCode).toBe(0);
58
+ expect(result.stderr).toBe('');
59
+ expect(result.stdout).toContain('Usage:');
60
+ });
61
+ it('default output is user-friendly (not verbose telemetry)', () => {
62
+ const result = testSetup.execute('logout', []);
63
+ // Default output should be clean, not full of telemetry
64
+ expect(result.stdout).not.toContain('[scenario:start]');
65
+ expect(result.stdout).not.toContain('[scenario:complete]');
66
+ expect(result.stdout).not.toContain('scenarioGuid');
67
+ });
68
+ it('errors are displayed in user-friendly format', () => {
69
+ const result = testSetup.execute('add-data-source', []);
70
+ // Error output should be readable
71
+ expect(result.stderr.length + result.stdout.length).toBeGreaterThan(0);
72
+ // Should not be a raw stack trace by default
73
+ const combinedOutput = `${result.stdout} ${result.stderr}`;
74
+ // Check it's not just a stack trace
75
+ if (result.exitCode !== 0) {
76
+ expect(combinedOutput.toLowerCase().includes('required') ||
77
+ combinedOutput.toLowerCase().includes('missing') ||
78
+ combinedOutput.toLowerCase().includes('usage') ||
79
+ combinedOutput.toLowerCase().includes('error') ||
80
+ combinedOutput.includes('--')).toBe(true);
81
+ }
82
+ });
83
+ });
84
+ describe('telemetry settings persistence', () => {
85
+ it('settings persist across command executions', () => {
86
+ // Write settings
87
+ fs.writeFileSync(testSetup.userSettingsPath, JSON.stringify({
88
+ enabled: true,
89
+ consoleOnly: true,
90
+ outputToConsole: true,
91
+ }));
92
+ // Run multiple commands
93
+ const result1 = testSetup.execute('logout', []);
94
+ const result2 = testSetup.execute('logout', []);
95
+ // Settings should still exist
96
+ expect(fs.existsSync(testSetup.userSettingsPath)).toBe(true);
97
+ // Both should have similar behavior
98
+ expect(result1.exitCode).toBe(result2.exitCode);
99
+ });
100
+ it('invalid settings file is handled gracefully', () => {
101
+ // Write invalid JSON
102
+ fs.writeFileSync(testSetup.userSettingsPath, '{ invalid json }');
103
+ const result = testSetup.execute('logout', []);
104
+ // Should either recover gracefully or report clear error
105
+ // Should not crash with unhandled exception
106
+ expect(result.stdout.length + result.stderr.length).toBeGreaterThan(0);
107
+ });
108
+ it('empty settings file is handled gracefully', () => {
109
+ fs.writeFileSync(testSetup.userSettingsPath, '');
110
+ const result = testSetup.execute('logout', []);
111
+ // Should handle gracefully
112
+ expect(result.stdout.length + result.stderr.length).toBeGreaterThan(0);
113
+ });
114
+ });
115
+ describe('telemetry event emission (TC: 35840168)', () => {
116
+ beforeEach(() => {
117
+ // Enable console telemetry
118
+ fs.writeFileSync(testSetup.userSettingsPath, JSON.stringify({
119
+ enabled: true,
120
+ consoleOnly: true,
121
+ outputToConsole: true,
122
+ }));
123
+ });
124
+ it('emits telemetry for logout command', () => {
125
+ const result = testSetup.execute('logout', []);
126
+ const output = `${result.stdout} ${result.stderr}`;
127
+ // With telemetry enabled, should see events
128
+ const hasEvents = output.includes('[scenario:') || output.includes('scenarioGuid') || output.includes('elapsedTime');
129
+ // If events are emitted, they should be properly formatted
130
+ if (hasEvents) {
131
+ expect(output).not.toContain('undefined');
132
+ expect(output).not.toContain('[object Object]');
133
+ }
134
+ });
135
+ it('emits telemetry for init --help command', () => {
136
+ const result = testSetup.execute('init', ['--help']);
137
+ const output = `${result.stdout} ${result.stderr}`;
138
+ // Help commands should also emit telemetry if enabled
139
+ const hasEvents = output.includes('[scenario:') || output.includes('scenarioGuid') || output.includes('elapsedTime');
140
+ if (hasEvents) {
141
+ expect(output).not.toContain('NaN');
142
+ }
143
+ });
144
+ it('emits telemetry for list-codeapps command', () => {
145
+ const result = testSetup.execute('list-codeapps', []);
146
+ const output = `${result.stdout} ${result.stderr}`;
147
+ // Should have some telemetry output
148
+ const hasEvents = output.includes('[scenario:') || output.includes('scenarioGuid') || output.includes('elapsedTime');
149
+ if (hasEvents) {
150
+ // Verify no malformed output
151
+ expect(output).not.toContain('undefined');
152
+ }
153
+ });
154
+ it('emits telemetry for failing commands', () => {
155
+ const result = testSetup.execute('add-data-source', []);
156
+ const output = `${result.stdout} ${result.stderr}`;
157
+ // Failed commands should also emit telemetry
158
+ expect(result.exitCode).not.toBe(0);
159
+ // Should have some output
160
+ expect(output.length).toBeGreaterThan(0);
161
+ });
162
+ it('telemetry events have timestamps', () => {
163
+ const result = testSetup.execute('logout', []);
164
+ const output = `${result.stdout} ${result.stderr}`;
165
+ // If telemetry is present, check for timestamps
166
+ if (output.includes('[scenario:')) {
167
+ // Should have time-based information
168
+ const hasTimestamp = /\d{2}:\d{2}:\d{2}/.test(output) || // HH:MM:SS format
169
+ /scenarioStartTime/.test(output) ||
170
+ /elapsedTime/.test(output);
171
+ expect(hasTimestamp).toBe(true);
172
+ }
173
+ });
174
+ });
175
+ describe('telemetry disable functionality', () => {
176
+ it('telemetry is suppressed when disabled', () => {
177
+ fs.writeFileSync(testSetup.userSettingsPath, JSON.stringify({
178
+ enabled: false,
179
+ consoleOnly: false,
180
+ outputToConsole: false,
181
+ }));
182
+ const result = testSetup.execute('logout', []);
183
+ const output = `${result.stdout} ${result.stderr}`;
184
+ // Should not have verbose telemetry
185
+ expect(output).not.toContain('[scenario:start]');
186
+ expect(output).not.toContain('[scenario:complete]');
187
+ expect(output).not.toContain('scenarioGuid');
188
+ });
189
+ it('command output is cleaner when telemetry disabled', () => {
190
+ // With telemetry enabled
191
+ fs.writeFileSync(testSetup.userSettingsPath, JSON.stringify({
192
+ enabled: true,
193
+ consoleOnly: true,
194
+ outputToConsole: true,
195
+ }));
196
+ const enabledResult = testSetup.execute('logout', []);
197
+ const enabledOutput = `${enabledResult.stdout} ${enabledResult.stderr}`;
198
+ // With telemetry disabled
199
+ fs.writeFileSync(testSetup.userSettingsPath, JSON.stringify({
200
+ enabled: false,
201
+ consoleOnly: false,
202
+ outputToConsole: false,
203
+ }));
204
+ const disabledResult = testSetup.execute('logout', []);
205
+ const disabledOutput = `${disabledResult.stdout} ${disabledResult.stderr}`;
206
+ // Disabled output should be shorter or equal (less verbose)
207
+ if (enabledOutput.includes('[scenario:')) {
208
+ expect(disabledOutput.length).toBeLessThanOrEqual(enabledOutput.length);
209
+ }
210
+ });
211
+ });
212
+ describe('CLI config directory behavior', () => {
213
+ it('uses POWERAPPS_CLI_CONFIG_DIR environment variable', () => {
214
+ // Our test setup already uses this, verify it works
215
+ fs.writeFileSync(testSetup.userSettingsPath, JSON.stringify({
216
+ testMarker: 'isolated-config-test',
217
+ }));
218
+ // Verify file is in the isolated directory
219
+ expect(testSetup.userSettingsPath).toContain(TEST_FOLDER_NAME);
220
+ expect(fs.existsSync(testSetup.userSettingsPath)).toBe(true);
221
+ const settings = JSON.parse(fs.readFileSync(testSetup.userSettingsPath, 'utf-8'));
222
+ expect(settings.testMarker).toBe('isolated-config-test');
223
+ });
224
+ it('different test suites have isolated configs', () => {
225
+ // Create another isolated config using setupE2eTest
226
+ const otherSetup = setupE2eTest({
227
+ testFolderName: 'otherTestIsolation',
228
+ tempBaseDir: E2E_CONFIG.tempBaseDir,
229
+ });
230
+ try {
231
+ fs.writeFileSync(testSetup.userSettingsPath, JSON.stringify({ source: 'main-test' }));
232
+ fs.writeFileSync(otherSetup.userSettingsPath, JSON.stringify({ source: 'other-test' }));
233
+ // Verify they're different
234
+ const mainSettings = JSON.parse(fs.readFileSync(testSetup.userSettingsPath, 'utf-8'));
235
+ const otherSettings = JSON.parse(fs.readFileSync(otherSetup.userSettingsPath, 'utf-8'));
236
+ expect(mainSettings.source).toBe('main-test');
237
+ expect(otherSettings.source).toBe('other-test');
238
+ expect(testSetup.userSettingsPath).not.toBe(otherSetup.userSettingsPath);
239
+ }
240
+ finally {
241
+ otherSetup.cleanup();
242
+ }
243
+ });
244
+ });
245
+ });
246
+ //# sourceMappingURL=loggingConfiguration.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loggingConfiguration.test.js","sourceRoot":"","sources":["../../../../src/__tests__/E2eTests/basicSetup/loggingConfiguration.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /*!
2
+ * Copyright (C) Microsoft Corporation. All rights reserved.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=cliHelp.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliHelp.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/E2eTests/cliUsability/cliHelp.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,162 @@
1
+ /*!
2
+ * Copyright (C) Microsoft Corporation. All rights reserved.
3
+ */
4
+ /**
5
+ * The goal of these tests is to verify that the CLI help output is shown correctly
6
+ * in various scenarios, including when no verb is provided, when the help verb
7
+ * is explicitly requested, and when help for a specific verb is requested.
8
+ */
9
+ import { afterAll, beforeAll, beforeEach, describe, expect, it } from '@jest/globals';
10
+ import { HelpStrings } from '../../../Constants/HelpStrings';
11
+ import { VERB_HELP_REGISTRY } from '../../../Constants/VerbRegistry';
12
+ import { normalizeWhitespace, setupE2eTest } from '../../helpers/testHelpers';
13
+ import { describeE2E } from '../../helpers/e2eTestHelpers';
14
+ import { E2E_CONFIG } from '../e2eConfig';
15
+ const TEST_FOLDER_NAME = 'cliHelpTests';
16
+ // Central list of verbs whose --help we want to validate.
17
+ // '' represents "no verb" (top-level/global help).
18
+ const VERBS_UNDER_TEST = [
19
+ {
20
+ verb: '',
21
+ usage: 'Usage: power-apps [option] [command] [<args>]',
22
+ expectedText: HelpStrings.Global.ProgramDescription,
23
+ },
24
+ {
25
+ verb: 'init',
26
+ usage: 'Usage: power-apps init',
27
+ expectedText: HelpStrings.Verbs.Init.Description,
28
+ options: HelpStrings.Verbs.Init.Options,
29
+ },
30
+ {
31
+ verb: 'add-data-source',
32
+ usage: 'Usage: power-apps add-data-source',
33
+ expectedText: HelpStrings.Verbs['Add-data-source'].Description,
34
+ options: HelpStrings.Verbs['Add-data-source'].Options,
35
+ },
36
+ {
37
+ verb: 'delete-data-source',
38
+ usage: 'Usage: power-apps delete-data-source',
39
+ expectedText: HelpStrings.Verbs['Delete-data-source'].Description,
40
+ options: HelpStrings.Verbs['Delete-data-source'].Options,
41
+ },
42
+ {
43
+ verb: 'list-codeapps',
44
+ usage: 'Usage: power-apps list-codeapps',
45
+ expectedText: HelpStrings.Verbs['List-codeapps'].Description,
46
+ },
47
+ {
48
+ verb: 'list-sqlStoredProcedures',
49
+ usage: 'Usage: power-apps list-sqlStoredProcedures',
50
+ expectedText: HelpStrings.Verbs['List-sqlStoredProcedures'].Description,
51
+ options: HelpStrings.Verbs['List-sqlStoredProcedures'].Options,
52
+ },
53
+ {
54
+ verb: 'list-datasets',
55
+ usage: 'Usage: power-apps list-datasets',
56
+ expectedText: HelpStrings.Verbs['List-datasets'].Description,
57
+ options: HelpStrings.Verbs['List-datasets'].Options,
58
+ },
59
+ {
60
+ verb: 'list-tables',
61
+ usage: 'Usage: power-apps list-tables',
62
+ expectedText: HelpStrings.Verbs['List-tables'].Description,
63
+ options: HelpStrings.Verbs['List-tables'].Options,
64
+ },
65
+ {
66
+ verb: 'list-environment-variables',
67
+ usage: 'Usage: power-apps list-environment-variables',
68
+ expectedText: HelpStrings.Verbs['List-environment-variables'].Description,
69
+ options: HelpStrings.Verbs['List-environment-variables'].Options,
70
+ },
71
+ {
72
+ verb: 'list-connection-references',
73
+ usage: 'Usage: power-apps list-connection-references',
74
+ expectedText: HelpStrings.Verbs['List-connection-references'].Description,
75
+ options: HelpStrings.Verbs['List-connection-references'].Options,
76
+ },
77
+ {
78
+ verb: 'logout',
79
+ usage: 'Usage: power-apps logout',
80
+ expectedText: HelpStrings.Verbs.Logout.Description,
81
+ },
82
+ {
83
+ verb: 'push',
84
+ usage: 'Usage: power-apps push',
85
+ expectedText: HelpStrings.Verbs.Push.Description,
86
+ options: HelpStrings.Verbs.Push.Options,
87
+ },
88
+ {
89
+ verb: 'run',
90
+ usage: 'Usage: power-apps run',
91
+ expectedText: HelpStrings.Verbs.Run.Description,
92
+ options: HelpStrings.Verbs.Run.Options,
93
+ },
94
+ ];
95
+ describeE2E('power-apps help output', () => {
96
+ let testSetup;
97
+ const originalEnv = { ...process.env };
98
+ beforeEach(() => {
99
+ process.env = { ...originalEnv };
100
+ });
101
+ beforeAll(() => {
102
+ testSetup = setupE2eTest({
103
+ tempBaseDir: E2E_CONFIG.tempBaseDir,
104
+ testFolderName: TEST_FOLDER_NAME,
105
+ });
106
+ });
107
+ afterAll(() => {
108
+ process.env = originalEnv;
109
+ testSetup.cleanup();
110
+ });
111
+ it('shows help when no verb is passed', () => {
112
+ const { stdout, stderr } = testSetup.execute('', []);
113
+ expect(stderr).toBe('');
114
+ expect(stdout.length).toBeGreaterThan(0);
115
+ expect(normalizeWhitespace(stdout)).toContain(normalizeWhitespace(HelpStrings.Global.ProgramDescription));
116
+ });
117
+ it('global help includes global option descriptions', () => {
118
+ const { stdout } = testSetup.execute('', ['--help']);
119
+ const normalizedOutput = normalizeWhitespace(stdout);
120
+ expect(normalizedOutput).toContain(`Usage: power-apps [option] [command] [<args>]
121
+
122
+ Power Apps CLI for managing Power Apps code apps.
123
+
124
+ Options:
125
+ -v, --version output the current version
126
+ -h, --help display help for command`);
127
+ });
128
+ it('global help includes verb table with all verbs', () => {
129
+ const { stdout } = testSetup.execute('', ['--help']);
130
+ // Verify the "Available Commands:" header appears
131
+ expect(stdout).toContain('Available Commands:');
132
+ expect(stdout).toContain('Command');
133
+ expect(stdout).toContain('Description');
134
+ // Verify each verb from the registry appears in the help output
135
+ // Note: VERB_REGISTRY is guaranteed to be complete via compile-time type checks
136
+ Object.entries(VERB_HELP_REGISTRY).forEach(([verb, verbMetadata]) => {
137
+ expect(stdout).toContain(verb);
138
+ expect(stdout).toContain(verbMetadata.description);
139
+ });
140
+ });
141
+ describe('--help for each verb', () => {
142
+ it.each(VERBS_UNDER_TEST)('prints help for %s', ({ verb, usage, expectedText, options }) => {
143
+ const { stdout, stderr } = verb === '' ? testSetup.execute('', ['--help']) : testSetup.execute(verb, ['--help']);
144
+ expect(stderr).toBe('');
145
+ expect(stdout.length).toBeGreaterThan(0);
146
+ // Verify the expected usage line appears in help output.
147
+ expect(stdout).toContain(usage);
148
+ const normalizedOutput = normalizeWhitespace(stdout);
149
+ // Verify the expected description text appears in help output.
150
+ if (expectedText) {
151
+ expect(normalizedOutput).toContain(normalizeWhitespace(expectedText));
152
+ }
153
+ // Verify all option descriptions appear in help output.
154
+ if (options) {
155
+ Object.values(options).forEach((optionDesc) => {
156
+ expect(normalizedOutput).toContain(normalizeWhitespace(optionDesc));
157
+ });
158
+ }
159
+ });
160
+ });
161
+ });
162
+ //# sourceMappingURL=cliHelp.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliHelp.test.js","sourceRoot":"","sources":["../../../../src/__tests__/E2eTests/cliUsability/cliHelp.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AACtF,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAgB,mBAAmB,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC5F,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAExC,0DAA0D;AAC1D,mDAAmD;AACnD,MAAM,gBAAgB,GAKjB;IACH;QACE,IAAI,EAAE,EAAE;QACR,KAAK,EAAE,+CAA+C;QACtD,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,kBAAkB;KACpD;IACD;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,wBAAwB;QAC/B,YAAY,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW;QAChD,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO;KACxC;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,KAAK,EAAE,mCAAmC;QAC1C,YAAY,EAAE,WAAW,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,WAAW;QAC9D,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,OAAO;KACtD;IACD;QACE,IAAI,EAAE,oBAAoB;QAC1B,KAAK,EAAE,sCAAsC;QAC7C,YAAY,EAAE,WAAW,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,WAAW;QACjE,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,OAAO;KACzD;IACD;QACE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,iCAAiC;QACxC,YAAY,EAAE,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,WAAW;KAC7D;IACD;QACE,IAAI,EAAE,0BAA0B;QAChC,KAAK,EAAE,4CAA4C;QACnD,YAAY,EAAE,WAAW,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,WAAW;QACvE,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,OAAO;KAC/D;IACD;QACE,IAAI,EAAE,eAAe;QACrB,KAAK,EAAE,iCAAiC;QACxC,YAAY,EAAE,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,WAAW;QAC5D,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,OAAO;KACpD;IACD;QACE,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,+BAA+B;QACtC,YAAY,EAAE,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,WAAW;QAC1D,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,OAAO;KAClD;IACD;QACE,IAAI,EAAE,4BAA4B;QAClC,KAAK,EAAE,8CAA8C;QACrD,YAAY,EAAE,WAAW,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,WAAW;QACzE,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,OAAO;KACjE;IACD;QACE,IAAI,EAAE,4BAA4B;QAClC,KAAK,EAAE,8CAA8C;QACrD,YAAY,EAAE,WAAW,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,WAAW;QACzE,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,OAAO;KACjE;IACD;QACE,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,0BAA0B;QACjC,YAAY,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW;KACnD;IACD;QACE,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,wBAAwB;QAC/B,YAAY,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW;QAChD,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO;KACxC;IACD;QACE,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,uBAAuB;QAC9B,YAAY,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW;QAC/C,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO;KACvC;CACF,CAAC;AAEF,WAAW,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACzC,IAAI,SAAuB,CAAC;IAC5B,MAAM,WAAW,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAEvC,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,CAAC,GAAG,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,GAAG,YAAY,CAAC;YACvB,WAAW,EAAE,UAAU,CAAC,WAAW;YACnC,cAAc,EAAE,gBAAgB;SACjC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,EAAE;QACZ,OAAO,CAAC,GAAG,GAAG,WAAW,CAAC;QAC1B,SAAS,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAErD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAEzC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,WAAW,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC5G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAErD,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC;;;;;;0CAMG,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QAErD,kDAAkD;QAClD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAExC,gEAAgE;QAChE,gFAAgF;QAChF,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,EAAE;YAClE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE;YACzF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GACtB,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YAExF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAEzC,yDAAyD;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAEhC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAErD,+DAA+D;YAC/D,IAAI,YAAY,EAAE;gBAChB,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC;aACvE;YAED,wDAAwD;YACxD,IAAI,OAAO,EAAE;gBACX,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;oBAC5C,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC;gBACtE,CAAC,CAAC,CAAC;aACJ;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ /*!
2
+ * Copyright (C) Microsoft Corporation. All rights reserved.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=logoutReauth.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logoutReauth.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/E2eTests/cliUsability/logoutReauth.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,115 @@
1
+ /*!
2
+ * Copyright (C) Microsoft Corporation. All rights reserved.
3
+ */
4
+ /**
5
+ * E2E Tests: CLI Usability - Logout and Reauthentication
6
+ *
7
+ * Tests that the CLI properly handles logout and subsequent commands that require auth.
8
+ * Test Case: TC 35840928 - Logout Requires Reauthentication
9
+ */
10
+ import { afterAll, beforeAll, describe, expect, it } from '@jest/globals';
11
+ import * as fs from 'fs';
12
+ import * as path from 'path';
13
+ import { describeE2E } from '../../helpers/e2eTestHelpers';
14
+ import { getAuthCachePath, setupE2eTest, writeMinimalConfig } from '../../helpers/testHelpers';
15
+ import { E2E_CONFIG } from '../e2eConfig';
16
+ const TEST_FOLDER_NAME = 'logoutReauthTests';
17
+ describeE2E('CLI Usability - Logout and Reauthentication (TC: 35840928)', () => {
18
+ let testSetup;
19
+ beforeAll(() => {
20
+ testSetup = setupE2eTest({
21
+ testFolderName: TEST_FOLDER_NAME,
22
+ tempBaseDir: E2E_CONFIG.tempBaseDir,
23
+ });
24
+ });
25
+ afterAll(() => {
26
+ testSetup.cleanup();
27
+ });
28
+ describe('logout command behavior', () => {
29
+ it('logout reports success or no user found', () => {
30
+ const result = testSetup.execute('logout', []);
31
+ // Logout should succeed with one of two messages
32
+ expect(result.stdout.includes('Successfully logged out') || result.stdout.includes('No user found')).toBe(true);
33
+ expect(result.stderr).toBe('');
34
+ });
35
+ it('logout is idempotent - running twice does not error', () => {
36
+ // First logout
37
+ const result1 = testSetup.execute('logout', []);
38
+ expect(result1.stderr).toBe('');
39
+ expect(result1.exitCode).toBe(0);
40
+ // Second logout should also succeed
41
+ const result2 = testSetup.execute('logout', []);
42
+ expect(result2.stderr).toBe('');
43
+ expect(result2.exitCode).toBe(0);
44
+ });
45
+ });
46
+ describe('commands after logout require reauthentication', () => {
47
+ // with the CI setup using service principal auth, these commands should succeed automatically
48
+ beforeAll(() => {
49
+ // Ensure we're logged out
50
+ testSetup.execute('logout', []);
51
+ // Verify no user is cached by checking auth cache directory doesn't exist
52
+ const authCacheDir = getAuthCachePath(testSetup);
53
+ if (fs.existsSync(authCacheDir)) {
54
+ throw new Error(`Auth cache directory still exists after logout: ${authCacheDir}`);
55
+ }
56
+ // Create a power.config.json for commands that need it
57
+ writeMinimalConfig(testSetup, {
58
+ region: E2E_CONFIG.region,
59
+ environmentId: E2E_CONFIG.environmentId,
60
+ });
61
+ });
62
+ it('list-codeapps after logout succeeds with service principal', () => {
63
+ // After logout, list-codeapps should succeed if using service principal auth (E2E test mode)
64
+ const result = testSetup.execute('list-codeapps', []);
65
+ expect(result.exitCode).toBe(0);
66
+ expect(result.stderr).toBe('');
67
+ expect(result.stdout).toBe('');
68
+ });
69
+ it('add-data-source after logout succeeds with service principal', () => {
70
+ // After logout, add-data-source should succeed if using service principal auth (E2E test mode)
71
+ const result = testSetup.execute('add-data-source', [
72
+ '--apiId',
73
+ 'dataverse',
74
+ '--resourceName',
75
+ 'contact',
76
+ ]);
77
+ expect(result.exitCode).toBe(0);
78
+ expect(result.stderr).toBe('');
79
+ expect(result.stdout).toBe('');
80
+ });
81
+ });
82
+ describe('logout clears cached credentials', () => {
83
+ it('auth cache directory is cleared after logout', () => {
84
+ // This test verifies the implementation detail from Logout.ts
85
+ // AUTH_CACHE_DIRECTORY is CLI_CONFIG_DIRECTORY/cache/auth
86
+ const authCacheDir = getAuthCachePath(testSetup);
87
+ // Create the auth cache directory to simulate a logged-in user
88
+ fs.mkdirSync(authCacheDir, { recursive: true });
89
+ // Add a dummy cache file
90
+ fs.writeFileSync(path.join(authCacheDir, 'token-cache.json'), '{}');
91
+ expect(fs.existsSync(authCacheDir)).toBe(true);
92
+ // Run logout - should clear the directory
93
+ const logoutResult = testSetup.execute('logout', []);
94
+ expect(logoutResult.stderr).toBe('');
95
+ expect(logoutResult.stdout.includes('Successfully logged out')).toBe(true);
96
+ // Verify the auth cache directory is removed
97
+ expect(fs.existsSync(authCacheDir)).toBe(false);
98
+ });
99
+ it('logout reports no user when auth cache does not exist', () => {
100
+ const authCacheDir = getAuthCachePath(testSetup);
101
+ // Ensure auth cache doesn't exist
102
+ if (fs.existsSync(authCacheDir)) {
103
+ fs.rmSync(authCacheDir, { recursive: true, force: true });
104
+ }
105
+ expect(fs.existsSync(authCacheDir)).toBe(false);
106
+ // Run logout - should report no user
107
+ const logoutResult = testSetup.execute('logout', []);
108
+ expect(logoutResult.stderr).toBe('');
109
+ expect(logoutResult.stdout.includes('No user found')).toBe(true);
110
+ // Directory should still not exist
111
+ expect(fs.existsSync(authCacheDir)).toBe(false);
112
+ });
113
+ });
114
+ });
115
+ //# sourceMappingURL=logoutReauth.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logoutReauth.test.js","sourceRoot":"","sources":["../../../../src/__tests__/E2eTests/cliUsability/logoutReauth.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /*!
2
+ * Copyright (C) Microsoft Corporation. All rights reserved.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=missingParameters.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"missingParameters.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/E2eTests/cliUsability/missingParameters.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}