@salesforce/apex-node 2.1.4 → 2.1.6
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/src/common/cancellation.js +6 -17
- package/lib/src/common/cancellation.js.map +1 -1
- package/lib/src/execute/executeService.js +52 -69
- package/lib/src/execute/executeService.js.map +1 -1
- package/lib/src/i18n/index.js.map +1 -1
- package/lib/src/i18n/localization.js.map +1 -1
- package/lib/src/logs/logService.js +73 -101
- package/lib/src/logs/logService.js.map +1 -1
- package/lib/src/reporters/coverageReporter.js +4 -6
- package/lib/src/reporters/coverageReporter.js.map +1 -1
- package/lib/src/reporters/humanReporter.js.map +1 -1
- package/lib/src/reporters/junitReporter.js.map +1 -1
- package/lib/src/reporters/tapReporter.js +1 -1
- package/lib/src/reporters/tapReporter.js.map +1 -1
- package/lib/src/streaming/streamingClient.js +98 -119
- package/lib/src/streaming/streamingClient.js.map +1 -1
- package/lib/src/tests/asyncTests.js +234 -247
- package/lib/src/tests/asyncTests.js.map +1 -1
- package/lib/src/tests/codeCoverage.js +85 -99
- package/lib/src/tests/codeCoverage.js.map +1 -1
- package/lib/src/tests/diagnosticUtil.js +1 -2
- package/lib/src/tests/diagnosticUtil.js.map +1 -1
- package/lib/src/tests/syncTests.js +83 -85
- package/lib/src/tests/syncTests.js.map +1 -1
- package/lib/src/tests/testService.js +235 -273
- package/lib/src/tests/testService.js.map +1 -1
- package/lib/src/tests/utils.d.ts +2 -0
- package/lib/src/tests/utils.js +29 -24
- package/lib/src/tests/utils.js.map +1 -1
- package/lib/src/utils/authUtil.js +3 -14
- package/lib/src/utils/authUtil.js.map +1 -1
- package/lib/src/utils/dateUtil.js.map +1 -1
- package/lib/src/utils/fileSystemHandler.js +7 -18
- package/lib/src/utils/fileSystemHandler.js.map +1 -1
- package/lib/src/utils/table.js.map +1 -1
- package/lib/src/utils/traceFlags.js +95 -122
- package/lib/src/utils/traceFlags.js.map +1 -1
- package/package.json +3 -3
|
@@ -5,15 +5,6 @@
|
|
|
5
5
|
* Licensed under the BSD 3-Clause license.
|
|
6
6
|
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
|
|
7
7
|
*/
|
|
8
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
9
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
10
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
11
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
12
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
13
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
14
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
15
|
-
});
|
|
16
|
-
};
|
|
17
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
9
|
exports.AsyncTests = void 0;
|
|
19
10
|
const i18n_1 = require("../i18n");
|
|
@@ -37,33 +28,31 @@ class AsyncTests {
|
|
|
37
28
|
* @param progress progress reporter
|
|
38
29
|
* @param token cancellation token
|
|
39
30
|
*/
|
|
40
|
-
runTests(options, codeCoverage = false, exitOnTestRunId = false, progress, token) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
token
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
return { testRunId };
|
|
55
|
-
}
|
|
56
|
-
if (token && token.isCancellationRequested) {
|
|
57
|
-
return null;
|
|
58
|
-
}
|
|
59
|
-
const asyncRunResult = yield sClient.subscribe(undefined, testRunId);
|
|
60
|
-
const testRunSummary = yield this.checkRunStatus(asyncRunResult.runId);
|
|
61
|
-
return yield this.formatAsyncResults(asyncRunResult, (0, utils_1.getCurrentTime)(), codeCoverage, testRunSummary, progress);
|
|
31
|
+
async runTests(options, codeCoverage = false, exitOnTestRunId = false, progress, token) {
|
|
32
|
+
try {
|
|
33
|
+
const sClient = new streaming_1.StreamingClient(this.connection, progress);
|
|
34
|
+
await sClient.init();
|
|
35
|
+
await sClient.handshake();
|
|
36
|
+
token &&
|
|
37
|
+
token.onCancellationRequested(async () => {
|
|
38
|
+
const testRunId = await sClient.subscribedTestRunIdPromise;
|
|
39
|
+
await this.abortTestRun(testRunId, progress);
|
|
40
|
+
sClient.disconnect();
|
|
41
|
+
});
|
|
42
|
+
const testRunId = await this.getTestRunRequestAction(options)();
|
|
43
|
+
if (exitOnTestRunId) {
|
|
44
|
+
return { testRunId };
|
|
62
45
|
}
|
|
63
|
-
|
|
64
|
-
|
|
46
|
+
if (token && token.isCancellationRequested) {
|
|
47
|
+
return null;
|
|
65
48
|
}
|
|
66
|
-
|
|
49
|
+
const asyncRunResult = await sClient.subscribe(undefined, testRunId);
|
|
50
|
+
const testRunSummary = await this.checkRunStatus(asyncRunResult.runId);
|
|
51
|
+
return await this.formatAsyncResults(asyncRunResult, (0, utils_1.getCurrentTime)(), codeCoverage, testRunSummary, progress);
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
throw (0, diagnosticUtil_1.formatTestErrors)(e);
|
|
55
|
+
}
|
|
67
56
|
}
|
|
68
57
|
/**
|
|
69
58
|
* Report Asynchronous Test Run Results
|
|
@@ -71,69 +60,65 @@ class AsyncTests {
|
|
|
71
60
|
* @param codeCoverage should report code coverages
|
|
72
61
|
* @param token cancellation token
|
|
73
62
|
*/
|
|
74
|
-
reportAsyncResults(testRunId, codeCoverage = false, token) {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
queueItem = yield sClient.handler(undefined, testRunId);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
queueItem = (yield sClient.subscribe(undefined, testRunId)).queueItem;
|
|
87
|
-
testRunSummary = yield this.checkRunStatus(testRunId);
|
|
88
|
-
}
|
|
89
|
-
token &&
|
|
90
|
-
token.onCancellationRequested(() => __awaiter(this, void 0, void 0, function* () {
|
|
91
|
-
sClient.disconnect();
|
|
92
|
-
}));
|
|
93
|
-
if (token && token.isCancellationRequested) {
|
|
94
|
-
return null;
|
|
95
|
-
}
|
|
96
|
-
return yield this.formatAsyncResults({ queueItem, runId: testRunId }, (0, utils_1.getCurrentTime)(), codeCoverage, testRunSummary);
|
|
97
|
-
}
|
|
98
|
-
catch (e) {
|
|
99
|
-
throw (0, diagnosticUtil_1.formatTestErrors)(e);
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
checkRunStatus(testRunId, progress) {
|
|
104
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
105
|
-
if (!(0, utils_2.isValidTestRunID)(testRunId)) {
|
|
106
|
-
throw new Error(i18n_1.nls.localize('invalidTestRunIdErr', testRunId));
|
|
63
|
+
async reportAsyncResults(testRunId, codeCoverage = false, token) {
|
|
64
|
+
try {
|
|
65
|
+
const sClient = new streaming_1.StreamingClient(this.connection);
|
|
66
|
+
await sClient.init();
|
|
67
|
+
await sClient.handshake();
|
|
68
|
+
let queueItem;
|
|
69
|
+
let testRunSummary = await this.checkRunStatus(testRunId);
|
|
70
|
+
if (testRunSummary !== undefined) {
|
|
71
|
+
queueItem = await sClient.handler(undefined, testRunId);
|
|
107
72
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
testRunSummaryQuery += `FROM ApexTestRunResult WHERE AsyncApexJobId = '${testRunId}'`;
|
|
112
|
-
progress === null || progress === void 0 ? void 0 : progress.report({
|
|
113
|
-
type: 'FormatTestResultProgress',
|
|
114
|
-
value: 'retrievingTestRunSummary',
|
|
115
|
-
message: i18n_1.nls.localize('retrievingTestRunSummary')
|
|
116
|
-
});
|
|
117
|
-
const testRunSummaryResults = (yield this.connection.tooling.query(testRunSummaryQuery, {
|
|
118
|
-
autoFetch: true
|
|
119
|
-
}));
|
|
120
|
-
if (testRunSummaryResults.records.length === 0) {
|
|
121
|
-
throw new Error(i18n_1.nls.localize('noTestResultSummary', testRunId));
|
|
73
|
+
else {
|
|
74
|
+
queueItem = (await sClient.subscribe(undefined, testRunId)).queueItem;
|
|
75
|
+
testRunSummary = await this.checkRunStatus(testRunId);
|
|
122
76
|
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
testRunSummaryResults.records[0].Status ===
|
|
130
|
-
"Passed" /* ApexTestRunResultStatus.Passed */ ||
|
|
131
|
-
testRunSummaryResults.records[0].Status ===
|
|
132
|
-
"Skipped" /* ApexTestRunResultStatus.Skipped */) {
|
|
133
|
-
return testRunSummaryResults.records[0];
|
|
77
|
+
token &&
|
|
78
|
+
token.onCancellationRequested(async () => {
|
|
79
|
+
sClient.disconnect();
|
|
80
|
+
});
|
|
81
|
+
if (token && token.isCancellationRequested) {
|
|
82
|
+
return null;
|
|
134
83
|
}
|
|
135
|
-
return
|
|
84
|
+
return await this.formatAsyncResults({ queueItem, runId: testRunId }, (0, utils_1.getCurrentTime)(), codeCoverage, testRunSummary);
|
|
85
|
+
}
|
|
86
|
+
catch (e) {
|
|
87
|
+
throw (0, diagnosticUtil_1.formatTestErrors)(e);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async checkRunStatus(testRunId, progress) {
|
|
91
|
+
if (!(0, utils_2.isValidTestRunID)(testRunId)) {
|
|
92
|
+
throw new Error(i18n_1.nls.localize('invalidTestRunIdErr', testRunId));
|
|
93
|
+
}
|
|
94
|
+
let testRunSummaryQuery = 'SELECT AsyncApexJobId, Status, ClassesCompleted, ClassesEnqueued, ';
|
|
95
|
+
testRunSummaryQuery +=
|
|
96
|
+
'MethodsEnqueued, StartTime, EndTime, TestTime, UserId ';
|
|
97
|
+
testRunSummaryQuery += `FROM ApexTestRunResult WHERE AsyncApexJobId = '${testRunId}'`;
|
|
98
|
+
progress?.report({
|
|
99
|
+
type: 'FormatTestResultProgress',
|
|
100
|
+
value: 'retrievingTestRunSummary',
|
|
101
|
+
message: i18n_1.nls.localize('retrievingTestRunSummary')
|
|
136
102
|
});
|
|
103
|
+
const testRunSummaryResults = (await this.connection.tooling.query(testRunSummaryQuery, {
|
|
104
|
+
autoFetch: true
|
|
105
|
+
}));
|
|
106
|
+
if (testRunSummaryResults.records.length === 0) {
|
|
107
|
+
throw new Error(i18n_1.nls.localize('noTestResultSummary', testRunId));
|
|
108
|
+
}
|
|
109
|
+
if (testRunSummaryResults.records[0].Status ===
|
|
110
|
+
"Aborted" /* ApexTestRunResultStatus.Aborted */ ||
|
|
111
|
+
testRunSummaryResults.records[0].Status ===
|
|
112
|
+
"Failed" /* ApexTestRunResultStatus.Failed */ ||
|
|
113
|
+
testRunSummaryResults.records[0].Status ===
|
|
114
|
+
"Completed" /* ApexTestRunResultStatus.Completed */ ||
|
|
115
|
+
testRunSummaryResults.records[0].Status ===
|
|
116
|
+
"Passed" /* ApexTestRunResultStatus.Passed */ ||
|
|
117
|
+
testRunSummaryResults.records[0].Status ===
|
|
118
|
+
"Skipped" /* ApexTestRunResultStatus.Skipped */) {
|
|
119
|
+
return testRunSummaryResults.records[0];
|
|
120
|
+
}
|
|
121
|
+
return undefined;
|
|
137
122
|
}
|
|
138
123
|
/**
|
|
139
124
|
* Format the results of a completed asynchronous test run
|
|
@@ -144,170 +129,172 @@ class AsyncTests {
|
|
|
144
129
|
* @param progress progress reporter
|
|
145
130
|
* @returns
|
|
146
131
|
*/
|
|
147
|
-
formatAsyncResults(asyncRunResult, commandStartTime, codeCoverage = false, testRunSummary, progress) {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
const
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
value: 'queryingForAggregateCodeCoverage',
|
|
200
|
-
message: i18n_1.nls.localize('queryingForAggregateCodeCoverage')
|
|
201
|
-
});
|
|
202
|
-
const { codeCoverageResults, totalLines, coveredLines } = yield this.codecoverage.getAggregateCodeCoverage(coveredApexClassIdSet);
|
|
203
|
-
result.codecoverage = codeCoverageResults;
|
|
204
|
-
result.summary.totalLines = totalLines;
|
|
205
|
-
result.summary.coveredLines = coveredLines;
|
|
206
|
-
result.summary.testRunCoverage = (0, utils_2.calculatePercentage)(coveredLines, totalLines);
|
|
207
|
-
result.summary.orgWideCoverage =
|
|
208
|
-
yield this.codecoverage.getOrgWideCoverage();
|
|
209
|
-
}
|
|
210
|
-
return result;
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
getAsyncTestResults(testQueueResult) {
|
|
214
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
215
|
-
let apexTestResultQuery = 'SELECT Id, QueueItemId, StackTrace, Message, ';
|
|
216
|
-
apexTestResultQuery +=
|
|
217
|
-
'RunTime, TestTimestamp, AsyncApexJobId, MethodName, Outcome, ApexLogId, ';
|
|
218
|
-
apexTestResultQuery +=
|
|
219
|
-
'ApexClass.Id, ApexClass.Name, ApexClass.NamespacePrefix ';
|
|
220
|
-
apexTestResultQuery += 'FROM ApexTestResult WHERE QueueItemId IN (%s)';
|
|
221
|
-
const apexResultIds = testQueueResult.records.map((record) => record.Id);
|
|
222
|
-
// iterate thru ids, create query with id, & compare query length to char limit
|
|
223
|
-
const queries = [];
|
|
224
|
-
for (let i = 0; i < apexResultIds.length; i += constants_1.QUERY_RECORD_LIMIT) {
|
|
225
|
-
const recordSet = apexResultIds
|
|
226
|
-
.slice(i, i + constants_1.QUERY_RECORD_LIMIT)
|
|
227
|
-
.map((id) => `'${id}'`);
|
|
228
|
-
const query = util.format(apexTestResultQuery, recordSet.join(','));
|
|
229
|
-
queries.push(query);
|
|
230
|
-
}
|
|
231
|
-
const queryPromises = queries.map((query) => {
|
|
232
|
-
return this.connection.tooling.query(query, {
|
|
233
|
-
autoFetch: true
|
|
234
|
-
});
|
|
132
|
+
async formatAsyncResults(asyncRunResult, commandStartTime, codeCoverage = false, testRunSummary, progress) {
|
|
133
|
+
const coveredApexClassIdSet = new Set();
|
|
134
|
+
const apexTestResults = await this.getAsyncTestResults(asyncRunResult.queueItem);
|
|
135
|
+
const { apexTestClassIdSet, testResults, globalTests } = await this.buildAsyncTestResults(apexTestResults);
|
|
136
|
+
let outcome = testRunSummary.Status;
|
|
137
|
+
if (globalTests.failed > 0) {
|
|
138
|
+
outcome = "Failed" /* ApexTestRunResultStatus.Failed */;
|
|
139
|
+
}
|
|
140
|
+
else if (globalTests.passed === 0) {
|
|
141
|
+
outcome = "Skipped" /* ApexTestRunResultStatus.Skipped */;
|
|
142
|
+
}
|
|
143
|
+
else if (testRunSummary.Status === "Completed" /* ApexTestRunResultStatus.Completed */) {
|
|
144
|
+
outcome = "Passed" /* ApexTestRunResultStatus.Passed */;
|
|
145
|
+
}
|
|
146
|
+
// TODO: deprecate testTotalTime
|
|
147
|
+
const result = {
|
|
148
|
+
summary: {
|
|
149
|
+
outcome,
|
|
150
|
+
testsRan: testResults.length,
|
|
151
|
+
passing: globalTests.passed,
|
|
152
|
+
failing: globalTests.failed,
|
|
153
|
+
skipped: globalTests.skipped,
|
|
154
|
+
passRate: (0, utils_2.calculatePercentage)(globalTests.passed, testResults.length),
|
|
155
|
+
failRate: (0, utils_2.calculatePercentage)(globalTests.failed, testResults.length),
|
|
156
|
+
skipRate: (0, utils_2.calculatePercentage)(globalTests.skipped, testResults.length),
|
|
157
|
+
testStartTime: (0, utils_1.formatStartTime)(testRunSummary.StartTime, 'ISO'),
|
|
158
|
+
testExecutionTimeInMs: testRunSummary.TestTime ?? 0,
|
|
159
|
+
testTotalTimeInMs: testRunSummary.TestTime ?? 0,
|
|
160
|
+
commandTimeInMs: (0, utils_1.getCurrentTime)() - commandStartTime,
|
|
161
|
+
hostname: this.connection.instanceUrl,
|
|
162
|
+
orgId: this.connection.getAuthInfoFields().orgId,
|
|
163
|
+
username: this.connection.getUsername(),
|
|
164
|
+
testRunId: asyncRunResult.runId,
|
|
165
|
+
userId: testRunSummary.UserId
|
|
166
|
+
},
|
|
167
|
+
tests: testResults
|
|
168
|
+
};
|
|
169
|
+
if (codeCoverage) {
|
|
170
|
+
const perClassCovMap = await this.codecoverage.getPerClassCodeCoverage(apexTestClassIdSet);
|
|
171
|
+
result.tests.forEach((item) => {
|
|
172
|
+
const keyCodeCov = `${item.apexClass.id}-${item.methodName}`;
|
|
173
|
+
const perClassCov = perClassCovMap.get(keyCodeCov);
|
|
174
|
+
// Skipped test is not in coverage map, check to see if perClassCov exists first
|
|
175
|
+
if (perClassCov) {
|
|
176
|
+
perClassCov.forEach((classCov) => coveredApexClassIdSet.add(classCov.apexClassOrTriggerId));
|
|
177
|
+
item.perClassCoverage = perClassCov;
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
progress?.report({
|
|
181
|
+
type: 'FormatTestResultProgress',
|
|
182
|
+
value: 'queryingForAggregateCodeCoverage',
|
|
183
|
+
message: i18n_1.nls.localize('queryingForAggregateCodeCoverage')
|
|
235
184
|
});
|
|
236
|
-
const
|
|
237
|
-
|
|
185
|
+
const { codeCoverageResults, totalLines, coveredLines } = await this.codecoverage.getAggregateCodeCoverage(coveredApexClassIdSet);
|
|
186
|
+
result.codecoverage = codeCoverageResults;
|
|
187
|
+
result.summary.totalLines = totalLines;
|
|
188
|
+
result.summary.coveredLines = coveredLines;
|
|
189
|
+
result.summary.testRunCoverage = (0, utils_2.calculatePercentage)(coveredLines, totalLines);
|
|
190
|
+
result.summary.orgWideCoverage =
|
|
191
|
+
await this.codecoverage.getOrgWideCoverage();
|
|
192
|
+
}
|
|
193
|
+
return result;
|
|
194
|
+
}
|
|
195
|
+
async getAsyncTestResults(testQueueResult) {
|
|
196
|
+
let apexTestResultQuery = 'SELECT Id, QueueItemId, StackTrace, Message, ';
|
|
197
|
+
apexTestResultQuery +=
|
|
198
|
+
'RunTime, TestTimestamp, AsyncApexJobId, MethodName, Outcome, ApexLogId, ';
|
|
199
|
+
apexTestResultQuery +=
|
|
200
|
+
'ApexClass.Id, ApexClass.Name, ApexClass.NamespacePrefix ';
|
|
201
|
+
apexTestResultQuery += 'FROM ApexTestResult WHERE QueueItemId IN (%s)';
|
|
202
|
+
const apexResultIds = testQueueResult.records.map((record) => record.Id);
|
|
203
|
+
// iterate thru ids, create query with id, & compare query length to char limit
|
|
204
|
+
const queries = [];
|
|
205
|
+
for (let i = 0; i < apexResultIds.length; i += constants_1.QUERY_RECORD_LIMIT) {
|
|
206
|
+
const recordSet = apexResultIds
|
|
207
|
+
.slice(i, i + constants_1.QUERY_RECORD_LIMIT)
|
|
208
|
+
.map((id) => `'${id}'`);
|
|
209
|
+
const query = util.format(apexTestResultQuery, recordSet.join(','));
|
|
210
|
+
queries.push(query);
|
|
211
|
+
}
|
|
212
|
+
const queryPromises = queries.map((query) => {
|
|
213
|
+
return (0, utils_2.queryAll)(this.connection, query, true);
|
|
238
214
|
});
|
|
215
|
+
const apexTestResults = await Promise.all(queryPromises);
|
|
216
|
+
return apexTestResults;
|
|
239
217
|
}
|
|
240
|
-
buildAsyncTestResults(apexTestResults) {
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
218
|
+
async buildAsyncTestResults(apexTestResults) {
|
|
219
|
+
const apexTestClassIdSet = new Set();
|
|
220
|
+
let passed = 0;
|
|
221
|
+
let failed = 0;
|
|
222
|
+
let skipped = 0;
|
|
223
|
+
// Iterate over test results, format and add them as results.tests
|
|
224
|
+
const testResults = [];
|
|
225
|
+
for (const result of apexTestResults) {
|
|
226
|
+
result.records.forEach((item) => {
|
|
227
|
+
switch (item.Outcome) {
|
|
228
|
+
case "Pass" /* ApexTestResultOutcome.Pass */:
|
|
229
|
+
passed++;
|
|
230
|
+
break;
|
|
231
|
+
case "Fail" /* ApexTestResultOutcome.Fail */:
|
|
232
|
+
case "CompileFail" /* ApexTestResultOutcome.CompileFail */:
|
|
233
|
+
failed++;
|
|
234
|
+
break;
|
|
235
|
+
case "Skip" /* ApexTestResultOutcome.Skip */:
|
|
236
|
+
skipped++;
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
apexTestClassIdSet.add(item.ApexClass.Id);
|
|
240
|
+
// Can only query the FullName field if a single record is returned, so manually build the field
|
|
241
|
+
item.ApexClass.FullName = item.ApexClass.NamespacePrefix
|
|
242
|
+
? `${item.ApexClass.NamespacePrefix}.${item.ApexClass.Name}`
|
|
243
|
+
: item.ApexClass.Name;
|
|
244
|
+
const diagnostic = item.Message || item.StackTrace ? (0, diagnosticUtil_1.getAsyncDiagnostic)(item) : null;
|
|
245
|
+
testResults.push({
|
|
246
|
+
id: item.Id,
|
|
247
|
+
queueItemId: item.QueueItemId,
|
|
248
|
+
stackTrace: item.StackTrace,
|
|
249
|
+
message: item.Message,
|
|
250
|
+
asyncApexJobId: item.AsyncApexJobId,
|
|
251
|
+
methodName: item.MethodName,
|
|
252
|
+
outcome: item.Outcome,
|
|
253
|
+
apexLogId: item.ApexLogId,
|
|
254
|
+
apexClass: {
|
|
255
|
+
id: item.ApexClass.Id,
|
|
256
|
+
name: item.ApexClass.Name,
|
|
257
|
+
namespacePrefix: item.ApexClass.NamespacePrefix,
|
|
258
|
+
fullName: item.ApexClass.FullName
|
|
259
|
+
},
|
|
260
|
+
runTime: item.RunTime ?? 0,
|
|
261
|
+
testTimestamp: item.TestTimestamp, // TODO: convert timestamp
|
|
262
|
+
fullName: `${item.ApexClass.FullName}.${item.MethodName}`,
|
|
263
|
+
...(diagnostic ? { diagnostic } : {})
|
|
275
264
|
});
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
}
|
|
282
|
-
}
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
apexTestClassIdSet,
|
|
269
|
+
testResults,
|
|
270
|
+
globalTests: { passed, failed, skipped }
|
|
271
|
+
};
|
|
283
272
|
}
|
|
284
273
|
/**
|
|
285
274
|
* Abort test run with test run id
|
|
286
275
|
* @param testRunId
|
|
287
276
|
*/
|
|
288
|
-
abortTestRun(testRunId, progress) {
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
testRunId
|
|
306
|
-
});
|
|
277
|
+
async abortTestRun(testRunId, progress) {
|
|
278
|
+
progress?.report({
|
|
279
|
+
type: 'AbortTestRunProgress',
|
|
280
|
+
value: 'abortingTestRun',
|
|
281
|
+
message: i18n_1.nls.localize('abortingTestRun', testRunId),
|
|
282
|
+
testRunId
|
|
283
|
+
});
|
|
284
|
+
const testQueueItems = await this.connection.tooling.query(`SELECT Id, Status FROM ApexTestQueueItem WHERE ParentJobId = '${testRunId}'`);
|
|
285
|
+
for (const record of testQueueItems.records) {
|
|
286
|
+
record.Status = "Aborted" /* ApexTestQueueItemStatus.Aborted */;
|
|
287
|
+
}
|
|
288
|
+
await this.connection.tooling.update('ApexTestQueueItem', testQueueItems.records);
|
|
289
|
+
progress?.report({
|
|
290
|
+
type: 'AbortTestRunProgress',
|
|
291
|
+
value: 'abortingTestRunRequested',
|
|
292
|
+
message: i18n_1.nls.localize('abortingTestRunRequested', testRunId),
|
|
293
|
+
testRunId
|
|
307
294
|
});
|
|
308
295
|
}
|
|
309
296
|
getTestRunRequestAction(options) {
|
|
310
|
-
const requestTestRun = () =>
|
|
297
|
+
const requestTestRun = async () => {
|
|
311
298
|
const url = `${this.connection.tooling._baseUrl()}/runTestsAsynchronous`;
|
|
312
299
|
const request = {
|
|
313
300
|
method: 'POST',
|
|
@@ -316,13 +303,13 @@ class AsyncTests {
|
|
|
316
303
|
headers: { 'content-type': 'application/json' }
|
|
317
304
|
};
|
|
318
305
|
try {
|
|
319
|
-
const testRunId = (
|
|
306
|
+
const testRunId = (await this.connection.tooling.request(request));
|
|
320
307
|
return Promise.resolve(testRunId);
|
|
321
308
|
}
|
|
322
309
|
catch (e) {
|
|
323
310
|
return Promise.reject(e);
|
|
324
311
|
}
|
|
325
|
-
}
|
|
312
|
+
};
|
|
326
313
|
return requestTestRun;
|
|
327
314
|
}
|
|
328
315
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"asyncTests.js","sourceRoot":"","sources":["../../../src/tests/asyncTests.ts"],"names":[],"mappings":";AAAA;;;;;GAKG
|
|
1
|
+
{"version":3,"file":"asyncTests.js","sourceRoot":"","sources":["../../../src/tests/asyncTests.ts"],"names":[],"mappings":"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"}
|