@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.
- package/lib/ArgumentProvider.d.ts.map +1 -1
- package/lib/ArgumentProvider.js +11 -7
- package/lib/ArgumentProvider.js.map +1 -1
- package/lib/Authentication/NodeMsalAuthenticationProvider.d.ts +4 -1
- package/lib/Authentication/NodeMsalAuthenticationProvider.d.ts.map +1 -1
- package/lib/Authentication/NodeMsalAuthenticationProvider.js +5 -1
- package/lib/Authentication/NodeMsalAuthenticationProvider.js.map +1 -1
- package/lib/Authentication/PacCliAuthenticationProvider.d.ts +2 -1
- package/lib/Authentication/PacCliAuthenticationProvider.d.ts.map +1 -1
- package/lib/Authentication/PacCliAuthenticationProvider.js +1 -1
- package/lib/Authentication/PacCliAuthenticationProvider.js.map +1 -1
- package/lib/Authentication/ServicePrincipalAuthenticationProvider.d.ts +3 -1
- package/lib/Authentication/ServicePrincipalAuthenticationProvider.d.ts.map +1 -1
- package/lib/Authentication/ServicePrincipalAuthenticationProvider.js +4 -2
- package/lib/Authentication/ServicePrincipalAuthenticationProvider.js.map +1 -1
- package/lib/Cli.d.ts.map +1 -1
- package/lib/Cli.js +1 -2
- package/lib/Cli.js.map +1 -1
- package/lib/CliUtils.d.ts +1 -1
- package/lib/CliUtils.d.ts.map +1 -1
- package/lib/CliUtils.js +36 -9
- package/lib/CliUtils.js.map +1 -1
- package/lib/HttpClient/CliHttpClient.d.ts.map +1 -1
- package/lib/HttpClient/CliHttpClient.js +2 -1
- package/lib/HttpClient/CliHttpClient.js.map +1 -1
- package/lib/Types/Cli.types.d.ts +2 -1
- package/lib/Types/Cli.types.d.ts.map +1 -1
- package/lib/Utils/EnhanceNetworkError.d.ts +14 -0
- package/lib/Utils/EnhanceNetworkError.d.ts.map +1 -0
- package/lib/Utils/EnhanceNetworkError.js +59 -0
- package/lib/Utils/EnhanceNetworkError.js.map +1 -0
- package/lib/Verbs/Init.d.ts.map +1 -1
- package/lib/Verbs/Init.js +3 -0
- package/lib/Verbs/Init.js.map +1 -1
- package/lib/__tests__/E2eTests/basicSetup/loggingConfiguration.test.d.ts +5 -0
- package/lib/__tests__/E2eTests/basicSetup/loggingConfiguration.test.d.ts.map +1 -0
- package/lib/__tests__/E2eTests/basicSetup/loggingConfiguration.test.js +246 -0
- package/lib/__tests__/E2eTests/basicSetup/loggingConfiguration.test.js.map +1 -0
- package/lib/__tests__/E2eTests/cliUsability/cliHelp.test.d.ts +5 -0
- package/lib/__tests__/E2eTests/cliUsability/cliHelp.test.d.ts.map +1 -0
- package/lib/__tests__/E2eTests/cliUsability/cliHelp.test.js +162 -0
- package/lib/__tests__/E2eTests/cliUsability/cliHelp.test.js.map +1 -0
- package/lib/__tests__/E2eTests/cliUsability/logoutReauth.test.d.ts +5 -0
- package/lib/__tests__/E2eTests/cliUsability/logoutReauth.test.d.ts.map +1 -0
- package/lib/__tests__/E2eTests/cliUsability/logoutReauth.test.js +115 -0
- package/lib/__tests__/E2eTests/cliUsability/logoutReauth.test.js.map +1 -0
- package/lib/__tests__/E2eTests/cliUsability/missingParameters.test.d.ts +5 -0
- package/lib/__tests__/E2eTests/cliUsability/missingParameters.test.d.ts.map +1 -0
- package/lib/__tests__/E2eTests/cliUsability/missingParameters.test.js +189 -0
- package/lib/__tests__/E2eTests/cliUsability/missingParameters.test.js.map +1 -0
- package/lib/__tests__/E2eTests/commonUserWorkflowSmokeTest.test.js +8 -6
- package/lib/__tests__/E2eTests/commonUserWorkflowSmokeTest.test.js.map +1 -1
- package/lib/__tests__/E2eTests/e2eConfig.d.ts +95 -0
- package/lib/__tests__/E2eTests/e2eConfig.d.ts.map +1 -0
- package/lib/__tests__/E2eTests/e2eConfig.js +122 -0
- package/lib/__tests__/E2eTests/e2eConfig.js.map +1 -0
- package/lib/__tests__/UnitTests/CliUtils.spec.d.ts +5 -0
- package/lib/__tests__/UnitTests/CliUtils.spec.d.ts.map +1 -0
- package/lib/__tests__/UnitTests/CliUtils.spec.js +94 -0
- package/lib/__tests__/UnitTests/CliUtils.spec.js.map +1 -0
- package/lib/__tests__/UnitTests/ServicePrincipalAuthenticationProvider.spec.js +3 -3
- package/lib/__tests__/UnitTests/ServicePrincipalAuthenticationProvider.spec.js.map +1 -1
- package/lib/__tests__/UnitTests/enhanceNetworkError.test.d.ts +5 -0
- package/lib/__tests__/UnitTests/enhanceNetworkError.test.d.ts.map +1 -0
- package/lib/__tests__/UnitTests/enhanceNetworkError.test.js +177 -0
- package/lib/__tests__/UnitTests/enhanceNetworkError.test.js.map +1 -0
- package/lib/__tests__/helpers/e2eTestHelpers.d.ts.map +1 -1
- package/lib/__tests__/helpers/e2eTestHelpers.js +16 -0
- package/lib/__tests__/helpers/e2eTestHelpers.js.map +1 -1
- package/lib/__tests__/helpers/testHelpers.d.ts +146 -30
- package/lib/__tests__/helpers/testHelpers.d.ts.map +1 -1
- package/lib/__tests__/helpers/testHelpers.js +245 -74
- package/lib/__tests__/helpers/testHelpers.js.map +1 -1
- package/lib-cjs/ArgumentProvider.d.ts.map +1 -1
- package/lib-cjs/ArgumentProvider.js +7 -1
- package/lib-cjs/ArgumentProvider.js.map +1 -1
- package/lib-cjs/Authentication/NodeMsalAuthenticationProvider.d.ts +4 -1
- package/lib-cjs/Authentication/NodeMsalAuthenticationProvider.d.ts.map +1 -1
- package/lib-cjs/Authentication/NodeMsalAuthenticationProvider.js +4 -1
- package/lib-cjs/Authentication/NodeMsalAuthenticationProvider.js.map +1 -1
- package/lib-cjs/Authentication/PacCliAuthenticationProvider.d.ts +2 -1
- package/lib-cjs/Authentication/PacCliAuthenticationProvider.d.ts.map +1 -1
- package/lib-cjs/Authentication/PacCliAuthenticationProvider.js +1 -1
- package/lib-cjs/Authentication/PacCliAuthenticationProvider.js.map +1 -1
- package/lib-cjs/Authentication/ServicePrincipalAuthenticationProvider.d.ts +3 -1
- package/lib-cjs/Authentication/ServicePrincipalAuthenticationProvider.d.ts.map +1 -1
- package/lib-cjs/Authentication/ServicePrincipalAuthenticationProvider.js +4 -2
- package/lib-cjs/Authentication/ServicePrincipalAuthenticationProvider.js.map +1 -1
- package/lib-cjs/Cli.d.ts.map +1 -1
- package/lib-cjs/Cli.js +14 -18
- package/lib-cjs/Cli.js.map +1 -1
- package/lib-cjs/CliUtils.d.ts +1 -1
- package/lib-cjs/CliUtils.d.ts.map +1 -1
- package/lib-cjs/CliUtils.js +38 -11
- package/lib-cjs/CliUtils.js.map +1 -1
- package/lib-cjs/HttpClient/CliHttpClient.d.ts.map +1 -1
- package/lib-cjs/HttpClient/CliHttpClient.js +2 -1
- package/lib-cjs/HttpClient/CliHttpClient.js.map +1 -1
- package/lib-cjs/Types/Cli.types.d.ts +2 -1
- package/lib-cjs/Types/Cli.types.d.ts.map +1 -1
- package/lib-cjs/Utils/EnhanceNetworkError.d.ts +13 -0
- package/lib-cjs/Utils/EnhanceNetworkError.d.ts.map +1 -0
- package/lib-cjs/Utils/EnhanceNetworkError.js +63 -0
- package/lib-cjs/Utils/EnhanceNetworkError.js.map +1 -0
- package/lib-cjs/Verbs/Init.d.ts.map +1 -1
- package/lib-cjs/Verbs/Init.js +4 -0
- package/lib-cjs/Verbs/Init.js.map +1 -1
- package/lib-cjs/__tests__/E2eTests/basicSetup/loggingConfiguration.test.d.ts +4 -0
- package/lib-cjs/__tests__/E2eTests/basicSetup/loggingConfiguration.test.d.ts.map +1 -0
- package/lib-cjs/__tests__/E2eTests/basicSetup/loggingConfiguration.test.js +271 -0
- package/lib-cjs/__tests__/E2eTests/basicSetup/loggingConfiguration.test.js.map +1 -0
- package/lib-cjs/__tests__/E2eTests/cliUsability/cliHelp.test.d.ts +4 -0
- package/lib-cjs/__tests__/E2eTests/cliUsability/cliHelp.test.d.ts.map +1 -0
- package/lib-cjs/__tests__/E2eTests/cliUsability/cliHelp.test.js +187 -0
- package/lib-cjs/__tests__/E2eTests/cliUsability/cliHelp.test.js.map +1 -0
- package/lib-cjs/__tests__/E2eTests/cliUsability/logoutReauth.test.d.ts +4 -0
- package/lib-cjs/__tests__/E2eTests/cliUsability/logoutReauth.test.d.ts.map +1 -0
- package/lib-cjs/__tests__/E2eTests/cliUsability/logoutReauth.test.js +140 -0
- package/lib-cjs/__tests__/E2eTests/cliUsability/logoutReauth.test.js.map +1 -0
- package/lib-cjs/__tests__/E2eTests/cliUsability/missingParameters.test.d.ts +4 -0
- package/lib-cjs/__tests__/E2eTests/cliUsability/missingParameters.test.d.ts.map +1 -0
- package/lib-cjs/__tests__/E2eTests/cliUsability/missingParameters.test.js +191 -0
- package/lib-cjs/__tests__/E2eTests/cliUsability/missingParameters.test.js.map +1 -0
- package/lib-cjs/__tests__/E2eTests/commonUserWorkflowSmokeTest.test.js +5 -5
- package/lib-cjs/__tests__/E2eTests/commonUserWorkflowSmokeTest.test.js.map +1 -1
- package/lib-cjs/__tests__/E2eTests/e2eConfig.d.ts +94 -0
- package/lib-cjs/__tests__/E2eTests/e2eConfig.d.ts.map +1 -0
- package/lib-cjs/__tests__/E2eTests/e2eConfig.js +149 -0
- package/lib-cjs/__tests__/E2eTests/e2eConfig.js.map +1 -0
- package/lib-cjs/__tests__/UnitTests/CliUtils.spec.d.ts +4 -0
- package/lib-cjs/__tests__/UnitTests/CliUtils.spec.d.ts.map +1 -0
- package/lib-cjs/__tests__/UnitTests/CliUtils.spec.js +97 -0
- package/lib-cjs/__tests__/UnitTests/CliUtils.spec.js.map +1 -0
- package/lib-cjs/__tests__/UnitTests/ServicePrincipalAuthenticationProvider.spec.js +3 -3
- package/lib-cjs/__tests__/UnitTests/ServicePrincipalAuthenticationProvider.spec.js.map +1 -1
- package/lib-cjs/__tests__/UnitTests/enhanceNetworkError.test.d.ts +4 -0
- package/lib-cjs/__tests__/UnitTests/enhanceNetworkError.test.d.ts.map +1 -0
- package/lib-cjs/__tests__/UnitTests/enhanceNetworkError.test.js +179 -0
- package/lib-cjs/__tests__/UnitTests/enhanceNetworkError.test.js.map +1 -0
- package/lib-cjs/__tests__/helpers/e2eTestHelpers.d.ts.map +1 -1
- package/lib-cjs/__tests__/helpers/e2eTestHelpers.js +16 -0
- package/lib-cjs/__tests__/helpers/e2eTestHelpers.js.map +1 -1
- package/lib-cjs/__tests__/helpers/testHelpers.d.ts +146 -30
- package/lib-cjs/__tests__/helpers/testHelpers.d.ts.map +1 -1
- package/lib-cjs/__tests__/helpers/testHelpers.js +242 -98
- package/lib-cjs/__tests__/helpers/testHelpers.js.map +1 -1
- package/node_modules/@microsoft/powerapps-data/package.json +2 -2
- package/node_modules/@microsoft/powerapps-player-actions/lib/Actions/ListTables.d.ts +1 -1
- package/node_modules/@microsoft/powerapps-player-actions/lib/Actions/ListTables.d.ts.map +1 -1
- package/node_modules/@microsoft/powerapps-player-actions/lib/Actions/ListTables.js +11 -2
- package/node_modules/@microsoft/powerapps-player-actions/lib/Actions/ListTables.js.map +1 -1
- package/node_modules/@microsoft/powerapps-player-actions/lib/CodeGen/modelServiceGenerator.d.ts +10 -0
- package/node_modules/@microsoft/powerapps-player-actions/lib/CodeGen/modelServiceGenerator.d.ts.map +1 -1
- package/node_modules/@microsoft/powerapps-player-actions/lib/CodeGen/modelServiceGenerator.js +98 -36
- package/node_modules/@microsoft/powerapps-player-actions/lib/CodeGen/modelServiceGenerator.js.map +1 -1
- package/node_modules/@microsoft/powerapps-player-actions/lib/__tests__/ModelServiceGenerator.spec.js +16 -2
- package/node_modules/@microsoft/powerapps-player-actions/lib/__tests__/ModelServiceGenerator.spec.js.map +1 -1
- package/node_modules/@microsoft/powerapps-player-actions/lib-cjs/Actions/ListTables.d.ts +1 -1
- package/node_modules/@microsoft/powerapps-player-actions/lib-cjs/Actions/ListTables.d.ts.map +1 -1
- package/node_modules/@microsoft/powerapps-player-actions/lib-cjs/Actions/ListTables.js +14 -5
- package/node_modules/@microsoft/powerapps-player-actions/lib-cjs/Actions/ListTables.js.map +1 -1
- package/node_modules/@microsoft/powerapps-player-actions/lib-cjs/CodeGen/modelServiceGenerator.d.ts +10 -0
- package/node_modules/@microsoft/powerapps-player-actions/lib-cjs/CodeGen/modelServiceGenerator.d.ts.map +1 -1
- package/node_modules/@microsoft/powerapps-player-actions/lib-cjs/CodeGen/modelServiceGenerator.js +139 -65
- package/node_modules/@microsoft/powerapps-player-actions/lib-cjs/CodeGen/modelServiceGenerator.js.map +1 -1
- package/node_modules/@microsoft/powerapps-player-actions/lib-cjs/__tests__/ModelServiceGenerator.spec.js +31 -1
- package/node_modules/@microsoft/powerapps-player-actions/lib-cjs/__tests__/ModelServiceGenerator.spec.js.map +1 -1
- package/node_modules/@microsoft/powerapps-player-actions/package.json +2 -2
- package/node_modules/@pa-client/powerapps-player-services/lib/Services/Connectivity/__tests__/ApimService.spec.js +3 -0
- package/node_modules/@pa-client/powerapps-player-services/lib/Services/Connectivity/__tests__/ApimService.spec.js.map +1 -1
- package/node_modules/@pa-client/powerapps-player-services/lib/Services/PlayerLaunchService/PlayerLaunchService.types.d.ts +1 -0
- package/node_modules/@pa-client/powerapps-player-services/lib/Services/PlayerLaunchService/PlayerLaunchService.types.d.ts.map +1 -1
- package/node_modules/@pa-client/powerapps-player-services/lib-cjs/Services/Connectivity/__tests__/ApimService.spec.js +3 -0
- package/node_modules/@pa-client/powerapps-player-services/lib-cjs/Services/Connectivity/__tests__/ApimService.spec.js.map +1 -1
- package/node_modules/@pa-client/powerapps-player-services/lib-cjs/Services/PlayerLaunchService/PlayerLaunchService.types.d.ts +1 -0
- package/node_modules/@pa-client/powerapps-player-services/lib-cjs/Services/PlayerLaunchService/PlayerLaunchService.types.d.ts.map +1 -1
- package/node_modules/@pa-client/powerapps-player-services/package.json +1 -1
- 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 @@
|
|
|
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":"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"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"missingParameters.test.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/E2eTests/cliUsability/missingParameters.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|