Skip to content

Commit 9cb3b43

Browse files
charlespwdclaude
andcommitted
Add watch mode for browser test development (#1113)
* Add watch mode for browser test development Introduces infrastructure for developing browser tests with live reload: - Add test:web:debug script that builds once and launches browser - Configure webpack to output debug bundle to separate file - Add dynamic test discovery to support single-file test runs This enables a faster development loop: edit tests, refresh browser, see results immediately without rebuilding. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * Add browser e2e test for Liquid object autocomplete Tests that Liquid object completions (e.g., 'product') appear when triggered inside {{ }} delimiters. This validates the end-to-end autocomplete flow in the browser test environment. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 3a943b9 commit 9cb3b43

4 files changed

Lines changed: 47 additions & 2 deletions

File tree

packages/vscode-extension/package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,10 @@
5454
"test": "vitest",
5555
"pretest:web": "[ -d .tmp/dawn ] || git clone --depth 1 https://github.com/Shopify/dawn.git .tmp/dawn",
5656
"build:test": "webpack --config webpack.test.config.js --mode development",
57-
"build:test:debug": "DEBUG_DELAY=10000 webpack --config webpack.test.config.js --mode development",
57+
"build:test:debug": "WATCH_MODE=1 DEBUG_DELAY=10000 webpack --config webpack.test.config.js --mode development",
58+
"build:test:watch": "WATCH_MODE=1 webpack --config webpack.test.config.js --mode development --watch",
5859
"test:web": "yarn build && yarn build:test && vscode-test-web --browserType=chromium --headless --extensionDevelopmentPath=. --extensionTestsPath=./dist/browser/test/suite/index.js .tmp/dawn",
59-
"test:web:debug": "yarn build && yarn build:test:debug && vscode-test-web --browserType=chromium --extensionDevelopmentPath=. --extensionTestsPath=./dist/browser/test/suite/index.js .tmp/dawn",
60+
"test:web:debug": "vscode-test-web --browserType=chromium --extensionDevelopmentPath=. --extensionTestsPath=./dist/browser/test/suite/index.js .tmp/dawn",
6061
"type-check:test": "tsc --project test/tsconfig.json --noEmit",
6162
"type-check": "tsc --noEmit"
6263
},

packages/vscode-extension/test/browser/suite/activation.test.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,41 @@ suite('Browser Extension Activation', () => {
3535
`Critical errors found: ${criticalErrors.join('; ')}`,
3636
);
3737
});
38+
39+
test('Autocomplete suggests "product" for Liquid objects', async function () {
40+
this.timeout(30000); // LSP may take time to initialize
41+
42+
// 1. Get workspace file URI
43+
const wsFolder = vscode.workspace.workspaceFolders![0].uri;
44+
const fileUri = vscode.Uri.joinPath(wsFolder, 'layout', 'theme.liquid');
45+
46+
// 2. Open and show document
47+
const doc = await vscode.workspace.openTextDocument(fileUri);
48+
const editor = await vscode.window.showTextDocument(doc);
49+
50+
// 3. Insert text at beginning
51+
const position = new vscode.Position(0, 0);
52+
await editor.edit((editBuilder) => {
53+
editBuilder.insert(position, '{{ prod');
54+
});
55+
56+
// 4. Wait for LSP to be ready (may need small delay)
57+
await new Promise((resolve) => setTimeout(resolve, 2000));
58+
59+
// 5. Trigger completions at cursor (after "{{ prod")
60+
const completions = await vscode.commands.executeCommand<vscode.CompletionList>(
61+
'vscode.executeCompletionItemProvider',
62+
doc.uri,
63+
new vscode.Position(0, 7), // position after "{{ prod"
64+
);
65+
66+
// 6. Assert "product" is in suggestions
67+
const labels = completions!.items.map((item) =>
68+
typeof item.label === 'string' ? item.label : item.label.label,
69+
);
70+
assert.ok(
71+
labels.includes('product'),
72+
`Expected "product" in completions, got: ${labels.slice(0, 10).join(', ')}`,
73+
);
74+
});
3875
});

packages/vscode-extension/test/browser/suite/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ export async function run(): Promise<void> {
2121

2222
try {
2323
mocha.run((failures) => {
24+
// In watch mode, never resolve the promise so browser stays open
25+
if (process.env.WATCH_MODE) {
26+
console.log('[Watch Mode] Tests complete. Browser staying open. Refresh to re-run.');
27+
return; // Never resolve - browser stays open
28+
}
29+
2430
if (failures > 0) {
2531
reject(new Error(`${failures} tests failed.`));
2632
} else {

packages/vscode-extension/webpack.test.config.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ const browserTestConfig = {
7171
new webpack.DefinePlugin({
7272
'process.env.WEBPACK_MODE': true,
7373
'process.env.DEBUG_DELAY': JSON.stringify(process.env.DEBUG_DELAY || '0'),
74+
'process.env.WATCH_MODE': JSON.stringify(process.env.WATCH_MODE || ''),
7475
}),
7576
],
7677
devtool: 'source-map',

0 commit comments

Comments
 (0)