From 24d43a3ce98627650d91b7a0062807a4a94c4eb3 Mon Sep 17 00:00:00 2001 From: Ben Houston Date: Thu, 1 Oct 2026 00:01:55 -0400 Subject: [PATCH] test: smoke-test the built VS Code extension bundle Closes #83 --- .../src/extensionBundle.test.ts | 34 +++++++++++++++++++ vitest.config.ts | 1 + 2 files changed, 35 insertions(+) create mode 100644 packages/hdrify-vscode-extension/src/extensionBundle.test.ts diff --git a/packages/hdrify-vscode-extension/src/extensionBundle.test.ts b/packages/hdrify-vscode-extension/src/extensionBundle.test.ts new file mode 100644 index 0000000..8e0f868 --- /dev/null +++ b/packages/hdrify-vscode-extension/src/extensionBundle.test.ts @@ -0,0 +1,34 @@ +import Module, { createRequire } from 'node:module'; +import path from 'node:path'; +import { expect, it } from 'vitest'; + +// Loads the built bundle (what ships), not the TS source, so packaging/interop +// breakage like `x_1.default is not a function` fails here instead of in users' editors. +// Requires `pnpm build` first (CI runs it before `pnpm test`). +type Loader = { _load: (...args: unknown[]) => unknown }; +const loader = Module as unknown as Loader; + +// Any property is a callable stub returning another stub: enough for activate() to run. +const stub = (): object => + new Proxy(function () {}, { get: (_t, key) => (key === 'then' ? undefined : stub()), apply: stub, construct: stub }); +// esbuild's interop copies own keys of the required module, so the namespaces must be real properties. +const vscodeStub = Object.fromEntries( + ['window', 'workspace', 'commands', 'env', 'Uri', 'ProgressLocation', 'ViewColumn', 'Disposable', 'EventEmitter'].map( + (k) => [k, stub()], + ), +); + +it('built extension bundle loads and activates', () => { + const load = loader._load; + loader._load = function (this: unknown, request: unknown, ...rest: unknown[]) { + return request === 'vscode' ? vscodeStub : load.call(this, request, ...rest); + }; + try { + const bundle = createRequire(__filename)(path.resolve(__dirname, '../dist/extension.js')); + const context = { subscriptions: [] as unknown[], extensionUri: stub(), extensionPath: '' }; + expect(() => bundle.activate(context)).not.toThrow(); + expect(context.subscriptions.length).toBeGreaterThan(0); + } finally { + loader._load = load; + } +}); diff --git a/vitest.config.ts b/vitest.config.ts index 1800a90..f9fefbb 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -8,6 +8,7 @@ export default defineConfig({ 'packages/hdrify/src/**/*.test.ts', 'packages/hdrify-tests/src/**/*.test.ts', 'packages/cli-tests/src/**/*.test.ts', + 'packages/hdrify-vscode-extension/src/**/*.test.ts', ], environment: 'node', watch: false,