Skip to content

Commit 543a726

Browse files
committed
feat: more apex templates, move to metadata ext
1 parent 6adb5cc commit 543a726

32 files changed

Lines changed: 150 additions & 565 deletions

.claude/skills/playwright-e2e/references/local-setup.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Prereq: authenticated Dev Hub (`sf org login web --set-default-dev-hub` or simil
2424
```bash
2525
mkdir -p /tmp/minimal-project/force-app
2626
echo '{"packageDirectories":[{"path":"force-app","default":true}],"namespace":"","sfdcLoginUrl":"https://login.salesforce.com","sourceApiVersion":"64.0"}' > /tmp/minimal-project/sfdx-project.json
27-
cd /tmp/minimal-project && sf org create scratch -d -w 10 -a minimalTestOrg --wait 30 --json
27+
cd /tmp/minimal-project && sf org create scratch -d -w 10 -a minimalTestOrg --edition developer --json
2828
```
2929

3030
## Non-tracking
@@ -36,7 +36,7 @@ cd /tmp/minimal-project && sf org create scratch -d -w 10 -a minimalTestOrg --wa
3636
```bash
3737
mkdir -p /tmp/non-tracking-project/force-app
3838
echo '{"packageDirectories":[{"path":"force-app","default":true}],"namespace":"","sfdcLoginUrl":"https://login.salesforce.com","sourceApiVersion":"64.0"}' > /tmp/non-tracking-project/sfdx-project.json
39-
cd /tmp/non-tracking-project && sf org create scratch -d -w 10 -a nonTrackingTestOrg --wait 30 --no-track-source --json
39+
cd /tmp/non-tracking-project && sf org create scratch -d -w 10 -a nonTrackingTestOrg --edition developer --no-track-source --json
4040
```
4141

4242
**Note:** Non-tracking test skips on web locally — requires Dev Hub aliased as `hub`. Desktop and CI work.

eslint.config.mjs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,10 @@ export default [
5858
'packages/salesforcedx-lightning-lsp-common/src/html-language-service/**',
5959
'**/.vscode-test-web/**',
6060
'**/.vscode-test/**',
61-
'**/playwright-report/**'
61+
'**/playwright-report/**',
62+
'**/playwright-report/',
63+
'**/test-results/**',
64+
'**/test-results/'
6265
]
6366
},
6467
{

packages/playwright-vscode-ext/src/utils/fileHelpers.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,16 +78,18 @@ export const createApexClass = async (page: Page, className: string, content?: s
7878

7979
await executeCommandWithCommandPalette(page, 'SFDX: Create Apex Class');
8080

81-
// First prompt: "Enter Apex class name"
82-
// Wait for widget to appear first (command palette closes, new prompt opens)
83-
// Then wait for text to render (CI can be slower)
81+
// First prompt: Quick Pick to select template - press Enter to accept default (DefaultApexClass)
8482
const quickInput = page.locator(QUICK_INPUT_WIDGET);
8583
await quickInput.waitFor({ state: 'visible', timeout: 10_000 });
84+
await page.locator(QUICK_INPUT_LIST_ROW).first().waitFor({ state: 'visible', timeout: 5000 });
85+
await page.keyboard.press('Enter');
86+
87+
// Second prompt: "Enter Apex class name"
8688
await quickInput.getByText(/Enter Apex class name/i).waitFor({ state: 'visible', timeout: 10_000 });
8789
await page.keyboard.type(className);
8890
await page.keyboard.press('Enter');
8991

90-
// Second prompt: Quick Pick to select output directory - just press Enter to accept default
92+
// Third prompt: Quick Pick to select output directory - just press Enter to accept default
9193
await page.locator(QUICK_INPUT_LIST_ROW).first().waitFor({ state: 'visible', timeout: 5000 });
9294
await page.keyboard.press('Enter');
9395

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { ExtensionProviderService, type SalesforceVSCodeServicesApi } from '@sal
99
import * as Effect from 'effect/Effect';
1010
import * as vscode from 'vscode';
1111
import { Utils, URI } from 'vscode-uri';
12+
import { APEX_CLASS_NAME_MAX_LENGTH } from '../constants';
1213
import { nls } from '../messages';
1314

1415
type SfProject = Effect.Effect.Success<
@@ -58,6 +59,8 @@ const promptForClassName = (): Promise<string | undefined> =>
5859
if (!value || value.trim().length === 0) return 'Class name cannot be empty';
5960
if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(value))
6061
return 'Class name must start with a letter and contain only alphanumeric characters and underscores';
62+
if (value.length > APEX_CLASS_NAME_MAX_LENGTH)
63+
return nls.localize('apex_test_class_name_max_length_error', APEX_CLASS_NAME_MAX_LENGTH);
6164
return undefined;
6265
}
6366
})

packages/salesforcedx-vscode-apex-testing/src/constants.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
* For full license text, see LICENSE.txt file in the repo root or https://opensource.org/licenses/BSD-3-Clause
66
*/
77

8+
export const APEX_CLASS_NAME_MAX_LENGTH = 40;
9+
810
export const PASS_RESULT = 'Pass';
911
export const FAIL_RESULT = 'Fail';
1012
export const SKIP_RESULT = 'Skip';

packages/salesforcedx-vscode-apex-testing/src/messages/i18n.ja.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import type { MessageKey } from './i18n';
1010
export const messages: Partial<Record<MessageKey, string>> = {
1111
apex_generate_unit_test_class_text: 'SFDX: Apex ユニットテストクラスを作成',
1212
apex_test_class_output_dir_prompt: '出力ディレクトリを選択',
13+
apex_test_class_name_max_length_error: 'クラス名は %d 文字を超えることはできません',
1314
apex_test_class_name_prompt: 'Apex テストクラス名を入力',
1415
apex_test_class_name_placeholder: 'マイテスト',
1516
apex_unit_test_template_description: 'サンプルテストメソッド付きテンプレート',

packages/salesforcedx-vscode-apex-testing/src/messages/i18n.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ export const messages = {
7474
apex_test_error_api_message: 'The org returned an error: %s',
7575
apex_generate_unit_test_class_text: 'SFDX: Create Apex Unit Test Class',
7676
apex_test_class_output_dir_prompt: 'Select output directory',
77+
apex_test_class_name_max_length_error: 'Class name cannot exceed %d characters',
7778
apex_test_class_name_prompt: 'Enter Apex test class name',
7879
apex_test_class_name_placeholder: 'MyTest',
7980
apex_unit_test_template_description: 'Template with sample test method',

packages/salesforcedx-vscode-automation-tests/test/specs/templates.e2e.ts

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -55,32 +55,7 @@ describe('Templates', () => {
5555
projectName = testSetup.tempProjectName;
5656
});
5757

58-
// Apex Class
59-
it('Create an Apex Class', async () => {
60-
logTestStart(testSetup, 'Create an Apex Class');
61-
// Using the Command palette, run SFDX: Create Apex Class.
62-
await createCommand('Apex Class', 'ApexClass1', 'classes', 'cls');
63-
64-
// Check for expected items in the Explorer view.
65-
const workbench = getWorkbench();
66-
67-
// Get the matching (visible) items within the tree which contains "ApexClass1".
68-
const filteredTreeViewItems = await getFilteredVisibleTreeViewItemLabels(workbench, projectName, 'ApexClass1');
69-
70-
expect(filteredTreeViewItems.includes('ApexClass1.cls')).to.equal(true);
71-
expect(filteredTreeViewItems.includes('ApexClass1.cls-meta.xml')).to.equal(true);
72-
});
73-
74-
it('Verify the contents of the Apex Class', async () => {
75-
logTestStart(testSetup, 'Verify the contents of the Apex Class');
76-
const expectedText = ['public with sharing class ApexClass1 {', ' public ApexClass1() {', '', ' }', '}'].join(
77-
'\n'
78-
);
79-
const workbench = getWorkbench();
80-
const textEditor = await getTextEditor(workbench, 'ApexClass1.cls');
81-
const textGeneratedFromTemplate = (await textEditor.getText()).trimEnd().replaceAll('\r\n', '\n');
82-
expect(textGeneratedFromTemplate).to.equal(expectedText);
83-
});
58+
// Apex Class is covered in apexGenerateClass.headless.spec.ts (salesforcedx-vscode-metadata)
8459

8560
// Apex Unit Test Class is covered in apexTestClassCreate.headless.spec.ts
8661

packages/salesforcedx-vscode-core/package.json

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -257,10 +257,6 @@
257257
"command": "sf.internal.lightning.generate.lwc",
258258
"when": "explorerResourceIsFolder && sf:internal_dev"
259259
},
260-
{
261-
"command": "sf.apex.generate.class",
262-
"when": "explorerResourceIsFolder && resourcePath =~ /classes/ && sf:project_opened && sf:show_shared_commands"
263-
},
264260
{
265261
"command": "sf.folder.diff",
266262
"when": "explorerResourceIsFolder && sf:project_opened && sf:has_target_org && sf:show_shared_commands"
@@ -383,10 +379,6 @@
383379
"command": "sf.view.remote.changes",
384380
"when": "sf:project_opened && !sf:isv_debug_project && sf:target_org_has_change_tracking && sf:show_shared_commands"
385381
},
386-
{
387-
"command": "sf.apex.generate.class",
388-
"when": "sf:project_opened && sf:show_shared_commands"
389-
},
390382
{
391383
"command": "sf.analytics.generate.template",
392384
"when": "sf:project_opened"
@@ -550,10 +542,6 @@
550542
"command": "sf.view.remote.changes",
551543
"title": "%view_remote_changes_text%"
552544
},
553-
{
554-
"command": "sf.apex.generate.class",
555-
"title": "%apex_generate_class_text%"
556-
},
557545
{
558546
"command": "sf.analytics.generate.template",
559547
"title": "%analytics_generate_template_text%"

packages/salesforcedx-vscode-core/src/commands/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ export { projectRetrieveStart } from './projectRetrieveStart';
2929
export { viewAllChanges, viewLocalChanges, viewRemoteChanges } from './source/viewChanges';
3030
export {
3131
analyticsGenerateTemplate,
32-
apexGenerateClass,
3332
apexGenerateTrigger,
3433
internalLightningGenerateApp,
3534
internalLightningGenerateAuraComponent,

0 commit comments

Comments
 (0)