From 375af20ad67959dd336bf203e998f168d2bf1810 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sun, 8 Mar 2026 01:15:38 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=AA=20[testing=20improvement]=20Add=20?= =?UTF-8?q?tests=20for=20getQueryTimeout=20and=20getMaximumFileSizeBytes?= =?UTF-8?q?=20and=20refactor=20into=20config.ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: zknpr <96851588+zknpr@users.noreply.github.com> --- src/config.ts | 26 ++++++++++ src/databaseModel.ts | 4 +- src/workerFactory.ts | 30 +----------- tests/unit/config.test.ts | 85 +++++++++++++++++++++++++++++++++ tests/unit/vscode_mock_setup.ts | 15 ++++++ 5 files changed, 129 insertions(+), 31 deletions(-) create mode 100644 tests/unit/config.test.ts diff --git a/src/config.ts b/src/config.ts index d3aa6bac..3f67fc1e 100644 --- a/src/config.ts +++ b/src/config.ts @@ -39,3 +39,29 @@ export const Title = 'SQLite Explorer'; // Copilot integration export const CopilotChatId = 'github.copilot-chat'; + +import * as vsc from 'vscode'; + +/** + * Retrieve maximum file size from user configuration. + * + * @returns Maximum size in bytes (0 = unlimited) + */ +export function getMaximumFileSizeBytes(): number { + const config = vsc.workspace.getConfiguration(ConfigurationSection); + const sizeMB = config.get('maxFileSize') ?? 200; + return sizeMB * (2 ** 20); +} + +/** Default query timeout in milliseconds (30 seconds) */ +export const DEFAULT_QUERY_TIMEOUT_MS = 30000; + +/** + * Retrieve query timeout from user configuration. + * + * @returns Query timeout in milliseconds + */ +export function getQueryTimeout(): number { + const config = vsc.workspace.getConfiguration(ConfigurationSection); + return config.get('queryTimeout', DEFAULT_QUERY_TIMEOUT_MS); +} diff --git a/src/databaseModel.ts b/src/databaseModel.ts index 3850b403..8321b7f8 100644 --- a/src/databaseModel.ts +++ b/src/databaseModel.ts @@ -10,14 +10,14 @@ import type { DatabaseViewerProvider } from './editorController'; import * as vsc from 'vscode'; -import { ConfigurationSection, FullExtensionId } from './config'; +import { ConfigurationSection, FullExtensionId, getMaximumFileSizeBytes } from './config'; import { Disposable } from './lifecycle'; import { cancelTokenToAbortSignal, getUriParts, generateDatabaseDocumentKey } from './helpers'; import { HostBridge } from './hostBridge'; import { DatabaseConnectionBundle } from './connectionTypes'; import { DocumentRegistry } from './documentRegistry'; -import { createDatabaseConnection, getMaximumFileSizeBytes } from './workerFactory'; +import { createDatabaseConnection } from './workerFactory'; import { GlobalOutputChannel } from './main'; import { ModificationTracker } from './core/undo-history'; diff --git a/src/workerFactory.ts b/src/workerFactory.ts index 77922f1a..df409aef 100644 --- a/src/workerFactory.ts +++ b/src/workerFactory.ts @@ -29,7 +29,7 @@ import type { import { Worker } from './platform/threadPool'; import type { DatabaseConnectionBundle } from './connectionTypes'; -import { ConfigurationSection } from './config'; +import { getMaximumFileSizeBytes, getQueryTimeout } from './config'; // Native worker support (only in Node.js environment) let nativeSupport: { @@ -51,34 +51,6 @@ if (!import.meta.env.VSCODE_BROWSER_EXT) { // Constants // ============================================================================ -// ============================================================================ -// Configuration -// ============================================================================ - -/** - * Retrieve maximum file size from user configuration. - * - * @returns Maximum size in bytes (0 = unlimited) - */ -export function getMaximumFileSizeBytes(): number { - const config = vsc.workspace.getConfiguration(ConfigurationSection); - const sizeMB = config.get('maxFileSize') ?? 200; - return sizeMB * (2 ** 20); -} - -/** Default query timeout in milliseconds (30 seconds) */ -const DEFAULT_QUERY_TIMEOUT_MS = 30000; - -/** - * Retrieve query timeout from user configuration. - * - * @returns Query timeout in milliseconds - */ -export function getQueryTimeout(): number { - const config = vsc.workspace.getConfiguration(ConfigurationSection); - return config.get('queryTimeout', DEFAULT_QUERY_TIMEOUT_MS); -} - // ============================================================================ // Worker Interface Types // ============================================================================ diff --git a/tests/unit/config.test.ts b/tests/unit/config.test.ts new file mode 100644 index 00000000..2ccac5b9 --- /dev/null +++ b/tests/unit/config.test.ts @@ -0,0 +1,85 @@ +import './vscode_mock_setup'; +import assert from 'node:assert'; +import { test, describe, beforeEach, afterEach } from 'node:test'; +import * as vscode from 'vscode'; +import { getQueryTimeout, getMaximumFileSizeBytes } from '../../src/config'; + +describe('Configuration Retrievers', () => { + let originalGetConfiguration: any; + + beforeEach(() => { + originalGetConfiguration = vscode.workspace.getConfiguration; + }); + + afterEach(() => { + vscode.workspace.getConfiguration = originalGetConfiguration; + }); + + describe('getQueryTimeout', () => { + test('should return default timeout (30000ms) when not configured', () => { + vscode.workspace.getConfiguration = (section) => { + assert.strictEqual(section, 'sqliteExplorer'); + return { + get: (key: string, defaultValue: any) => { + assert.strictEqual(key, 'queryTimeout'); + return defaultValue; + }, + update: () => Promise.resolve() + } as any; + }; + + const timeout = getQueryTimeout(); + assert.strictEqual(timeout, 30000); + }); + + test('should return configured timeout when defined', () => { + vscode.workspace.getConfiguration = (section) => { + assert.strictEqual(section, 'sqliteExplorer'); + return { + get: (key: string, defaultValue: any) => { + assert.strictEqual(key, 'queryTimeout'); + return 15000; + }, + update: () => Promise.resolve() + } as any; + }; + + const timeout = getQueryTimeout(); + assert.strictEqual(timeout, 15000); + }); + }); + + describe('getMaximumFileSizeBytes', () => { + test('should return default size (200MB) when not configured', () => { + vscode.workspace.getConfiguration = (section) => { + assert.strictEqual(section, 'sqliteExplorer'); + return { + get: (key: string, defaultValue: any) => { + assert.strictEqual(key, 'maxFileSize'); + return undefined; // Not configured + }, + update: () => Promise.resolve() + } as any; + }; + + const size = getMaximumFileSizeBytes(); + assert.strictEqual(size, 200 * (2 ** 20)); + }); + + test('should return configured size in bytes', () => { + vscode.workspace.getConfiguration = (section) => { + assert.strictEqual(section, 'sqliteExplorer'); + return { + get: (key: string, defaultValue: any) => { + assert.strictEqual(key, 'maxFileSize'); + return 50; // 50MB + }, + update: () => Promise.resolve() + } as any; + }; + + const size = getMaximumFileSizeBytes(); + assert.strictEqual(size, 50 * (2 ** 20)); + }); + }); +}); diff --git a/tests/unit/vscode_mock_setup.ts b/tests/unit/vscode_mock_setup.ts index 5b5358ab..c49a9b99 100644 --- a/tests/unit/vscode_mock_setup.ts +++ b/tests/unit/vscode_mock_setup.ts @@ -12,3 +12,18 @@ Module._load = function (request, parent, isMain) { } return originalLoad(request, parent, isMain); }; + +mockVscode.extensions = { + getExtension: () => ({ packageJSON: { version: '1.0.0' }, extensionUri: mockVscode.Uri.file('/fake/path') }) +}; + +// Polyfill import.meta.env for tsx runner +// @ts-ignore +if (typeof process !== 'undefined') { + // @ts-ignore + globalThis.import = globalThis.import || {}; + // @ts-ignore + globalThis.import.meta = globalThis.import.meta || {}; + // @ts-ignore + globalThis.import.meta.env = globalThis.import.meta.env || { VSCODE_BROWSER_EXT: false }; +}