Skip to content

Commit cb61d11

Browse files
fix: allow same name different namespace in apex test suite
1 parent 9908417 commit cb61d11

2 files changed

Lines changed: 32 additions & 9 deletions

File tree

packages/salesforcedx-vscode-apex-testing/src/codecoverage/colorizer.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,23 @@ const getCoverageData = async (): Promise<CoverageItem[] | CodeCoverageResult[]>
8585
throw new Error(nls.localize('colorizer_no_code_coverage_on_test_results', testRunId));
8686
}
8787
const testResultOutput = await readFileUri(testResultUri);
88-
const testResult = JSON.parse(testResultOutput);
88+
type TestResultWithCoverage = {
89+
codecoverage?: CodeCoverageResult[];
90+
coverage?: { coverage: CodeCoverageResult[] };
91+
};
92+
// JSON.parse returns any; shape is validated before use
93+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions -- test result shape from apex-node
94+
const testResult = JSON.parse(testResultOutput) as TestResultWithCoverage;
8995
if (testResult.coverage === undefined && testResult.codecoverage === undefined) {
9096
throw new Error(nls.localize('colorizer_no_code_coverage_on_test_results', testRunId));
9197
}
92-
93-
return testResult.codecoverage ?? testResult.coverage.coverage;
98+
if (testResult.codecoverage !== undefined) {
99+
return testResult.codecoverage;
100+
}
101+
if (testResult.coverage !== undefined) {
102+
return testResult.coverage.coverage;
103+
}
104+
throw new Error(nls.localize('colorizer_no_code_coverage_on_test_results', testRunId));
94105
};
95106

96107
/** Use document.uri.path for Web/Desktop compatibility (fsPath may be empty in Web for some schemes). */
@@ -140,7 +151,8 @@ export class CodeCoverageHandler {
140151
this.uncoveredLines = coverage.uncoveredLines;
141152
this.setCoverageDecorators(editor);
142153
} catch (e) {
143-
void getApexTestingRuntime().runPromise(handleCoverageException(e));
154+
const err = e instanceof Error ? e : new Error(String(e));
155+
void getApexTestingRuntime().runPromise(handleCoverageException(err));
144156
}
145157
}
146158
}
@@ -163,7 +175,8 @@ export class CodeCoverageHandler {
163175
this.setCoverageDecorators(editor);
164176
}
165177
} catch (e) {
166-
void getApexTestingRuntime().runPromise(handleCoverageException(e));
178+
const err = e instanceof Error ? e : new Error(String(e));
179+
void getApexTestingRuntime().runPromise(handleCoverageException(err));
167180
}
168181
this.statusBar.toggle(true);
169182
}

packages/salesforcedx-vscode-apex-testing/src/commands/apexTestSuite.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
SfCommandlet
2323
} from '../utils/commandletHelpers';
2424
import { ApexTestQuickPickItem } from '../utils/fileHelpers';
25+
import { getFullClassName, isFlowTest } from '../utils/testUtils';
2526
import { getTestController } from '../views/testController';
2627
import { ApexLibraryTestRunExecutor } from './apexTestRun';
2728

@@ -30,14 +31,19 @@ type ApexTestSuiteOptions = { suitename: string; tests: string[] };
3031
const listApexClassItems = async (): Promise<ApexTestQuickPickItem[]> => {
3132
const result = await getApexTestingRuntime().runPromise(discoverTests());
3233
return result.classes
34+
.filter(cls => !isFlowTest(cls))
3335
.map(
3436
(cls): ApexTestQuickPickItem => ({
3537
label: cls.name,
3638
description: cls.namespacePrefix ?? '',
37-
type: 'Class'
39+
type: 'Class',
40+
fullClassName: getFullClassName(cls)
3841
})
3942
)
40-
.toSorted((a, b): number => a.label.localeCompare(b.label));
43+
.toSorted((a, b): number => {
44+
const byLabel = a.label.localeCompare(b.label);
45+
return byLabel !== 0 ? byLabel : (a.fullClassName ?? '').localeCompare(b.fullClassName ?? '');
46+
});
4147
};
4248

4349
const listApexTestSuiteItems = async (): Promise<ApexTestQuickPickItem[]> => {
@@ -75,7 +81,9 @@ class TestSuiteBuilder implements ParametersGatherer<ApexTestSuiteOptions> {
7581
if (!apexClassSelection || apexClassSelection.length === 0) {
7682
return { type: 'CANCEL' };
7783
}
78-
const apexClassNames = apexClassSelection.map(selection => selection.label);
84+
const apexClassNames = apexClassSelection.map(
85+
selection => selection.fullClassName ?? selection.label
86+
);
7987
return {
8088
type: 'CONTINUE',
8189
data: { suitename: testSuiteName.label, tests: apexClassNames }
@@ -122,7 +130,9 @@ class TestSuiteCreator implements ParametersGatherer<ApexTestSuiteOptions> {
122130
if (!apexClassSelection || apexClassSelection.length === 0) {
123131
return { type: 'CANCEL' };
124132
}
125-
const apexClassNames = apexClassSelection.map(selection => selection.label);
133+
const apexClassNames = apexClassSelection.map(
134+
selection => selection.fullClassName ?? selection.label
135+
);
126136
return {
127137
type: 'CONTINUE',
128138
data: { suitename: testSuiteName, tests: apexClassNames }

0 commit comments

Comments
 (0)