diff --git a/vscode/extension/tests/broken_project.spec.ts b/vscode/extension/tests/broken_project.spec.ts index 5638d167b2..d030f9224a 100644 --- a/vscode/extension/tests/broken_project.spec.ts +++ b/vscode/extension/tests/broken_project.spec.ts @@ -3,7 +3,11 @@ import fs from 'fs-extra' import os from 'os' import path from 'path' import { openLineageView, saveFile, SUSHI_SOURCE_PATH } from './utils' -import { startCodeServer, stopCodeServer } from './utils_code_server' +import { + createPythonInterpreterSettingsSpecifier, + startCodeServer, + stopCodeServer, +} from './utils_code_server' test('bad project, double model', async ({ page }) => { const tempDir = await fs.mkdtemp( @@ -25,8 +29,8 @@ test('bad project, double model', async ({ page }) => { const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) try { await page.goto(`http://127.0.0.1:${context.codeServerPort}`) @@ -60,8 +64,8 @@ test('working project, then broken through adding double model, then refixed', a const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) try { await page.goto(`http://127.0.0.1:${context.codeServerPort}`) await page.waitForLoadState('networkidle') @@ -173,8 +177,8 @@ test('bad project, double model, then fixed', async ({ page }) => { const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) try { await page.goto(`http://127.0.0.1:${context.codeServerPort}`) @@ -246,8 +250,8 @@ test('bad project, double model, check lineage', async ({ page }) => { const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) try { await page.goto(`http://127.0.0.1:${context.codeServerPort}`) await page.waitForLoadState('networkidle') diff --git a/vscode/extension/tests/completions.spec.ts b/vscode/extension/tests/completions.spec.ts index 02ad2a2b79..c5921204b0 100644 --- a/vscode/extension/tests/completions.spec.ts +++ b/vscode/extension/tests/completions.spec.ts @@ -3,7 +3,11 @@ import path from 'path' import fs from 'fs-extra' import os from 'os' import { SUSHI_SOURCE_PATH } from './utils' -import { startCodeServer, stopCodeServer } from './utils_code_server' +import { + createPythonInterpreterSettingsSpecifier, + startCodeServer, + stopCodeServer, +} from './utils_code_server' test('Autocomplete for model names', async ({ page }) => { const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'vscode-test-sushi-')) @@ -11,8 +15,8 @@ test('Autocomplete for model names', async ({ page }) => { const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) try { await page.goto(`http://127.0.0.1:${context.codeServerPort}`) @@ -74,8 +78,8 @@ test.describe('Macro Completions', () => { const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) try { await page.goto(`http://127.0.0.1:${context.codeServerPort}`) @@ -132,8 +136,8 @@ test.describe('Macro Completions', () => { const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) try { await page.goto(`http://127.0.0.1:${context.codeServerPort}`) diff --git a/vscode/extension/tests/diagnostics.spec.ts b/vscode/extension/tests/diagnostics.spec.ts index 4566102d95..b2b21911d5 100644 --- a/vscode/extension/tests/diagnostics.spec.ts +++ b/vscode/extension/tests/diagnostics.spec.ts @@ -3,7 +3,11 @@ import path from 'path' import fs from 'fs-extra' import os from 'os' import { runCommand, SUSHI_SOURCE_PATH } from './utils' -import { startCodeServer, stopCodeServer } from './utils_code_server' +import { + createPythonInterpreterSettingsSpecifier, + startCodeServer, + stopCodeServer, +} from './utils_code_server' test('Workspace diagnostics show up in the diagnostics panel', async ({ page, @@ -13,8 +17,8 @@ test('Workspace diagnostics show up in the diagnostics panel', async ({ const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) const configPath = path.join(tempDir, 'config.py') const configContent = await fs.readFile(configPath, 'utf8') diff --git a/vscode/extension/tests/find_references.spec.ts b/vscode/extension/tests/find_references.spec.ts index f7880094ca..5ea00848db 100644 --- a/vscode/extension/tests/find_references.spec.ts +++ b/vscode/extension/tests/find_references.spec.ts @@ -7,6 +7,7 @@ import { startCodeServer, stopCodeServer, CodeServerContext, + createPythonInterpreterSettingsSpecifier, } from './utils_code_server' // Helper function to set up a test environment for model references @@ -15,8 +16,8 @@ async function setupModelTestEnvironment(): Promise { await fs.copy(SUSHI_SOURCE_PATH, tempDir) const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) return context } diff --git a/vscode/extension/tests/format.spec.ts b/vscode/extension/tests/format.spec.ts index 3f979d8222..be304c00cd 100644 --- a/vscode/extension/tests/format.spec.ts +++ b/vscode/extension/tests/format.spec.ts @@ -3,7 +3,11 @@ import path from 'path' import fs from 'fs-extra' import os from 'os' import { runCommand, SUSHI_SOURCE_PATH } from './utils' -import { startCodeServer, stopCodeServer } from './utils_code_server' +import { + createPythonInterpreterSettingsSpecifier, + startCodeServer, + stopCodeServer, +} from './utils_code_server' test('Format project works correctly', async ({ page }) => { const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'vscode-test-sushi-')) @@ -11,8 +15,8 @@ test('Format project works correctly', async ({ page }) => { const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) try { await page.goto(`http://127.0.0.1:${context.codeServerPort}`) diff --git a/vscode/extension/tests/go_to_definition.spec.ts b/vscode/extension/tests/go_to_definition.spec.ts index 241b2062df..3ef20628dd 100644 --- a/vscode/extension/tests/go_to_definition.spec.ts +++ b/vscode/extension/tests/go_to_definition.spec.ts @@ -3,7 +3,11 @@ import path from 'path' import fs from 'fs-extra' import os from 'os' import { goToDefinition, SUSHI_SOURCE_PATH } from './utils' -import { startCodeServer, stopCodeServer } from './utils_code_server' +import { + createPythonInterpreterSettingsSpecifier, + startCodeServer, + stopCodeServer, +} from './utils_code_server' test('Stop server works', async ({ page }) => { const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'vscode-test-sushi-')) @@ -11,8 +15,8 @@ test('Stop server works', async ({ page }) => { const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) try { // Navigate to code-server instance @@ -53,8 +57,8 @@ test('Go to definition for model', async ({ page }) => { const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) try { // Navigate to code-server instance diff --git a/vscode/extension/tests/hints.spec.ts b/vscode/extension/tests/hints.spec.ts index 6486e1bba6..eded1a97e4 100644 --- a/vscode/extension/tests/hints.spec.ts +++ b/vscode/extension/tests/hints.spec.ts @@ -3,7 +3,11 @@ import path from 'path' import fs from 'fs-extra' import os from 'os' import { SUSHI_SOURCE_PATH } from './utils' -import { startCodeServer, stopCodeServer } from './utils_code_server' +import { + createPythonInterpreterSettingsSpecifier, + startCodeServer, + stopCodeServer, +} from './utils_code_server' test('Model type hinting', async ({ page }) => { const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'vscode-test-sushi-')) @@ -11,8 +15,8 @@ test('Model type hinting', async ({ page }) => { const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) try { // Navigate to code-server instance diff --git a/vscode/extension/tests/lineage.spec.ts b/vscode/extension/tests/lineage.spec.ts index 6b2c3d3861..110dd08f61 100644 --- a/vscode/extension/tests/lineage.spec.ts +++ b/vscode/extension/tests/lineage.spec.ts @@ -4,7 +4,11 @@ import fs from 'fs-extra' import os from 'os' import { openLineageView, SUSHI_SOURCE_PATH } from './utils' import { writeFileSync } from 'fs' -import { startCodeServer, stopCodeServer } from './utils_code_server' +import { + createPythonInterpreterSettingsSpecifier, + startCodeServer, + stopCodeServer, +} from './utils_code_server' /** * Helper function to launch VS Code and test lineage with given project path config @@ -24,8 +28,8 @@ test('Lineage panel renders correctly - no project path config (default)', async const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) try { await page.goto(`http://127.0.0.1:${context.codeServerPort}`) @@ -146,8 +150,8 @@ test('Lineage panel renders correctly - absolute path project outside of workspa await fs.ensureDir(workspaceDir) const context = await startCodeServer({ tempDir: workspaceDir, - placeFileWithPythonInterpreter: false, }) + await createPythonInterpreterSettingsSpecifier(workspaceDir) const settings = { 'sqlmesh.projectPath': projectDir, @@ -203,8 +207,8 @@ test.skip('Lineage panel renders correctly - multiworkspace setup', async ({ const context = await startCodeServer({ tempDir: workspaceDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(workspaceDir) const settings = { 'python.defaultInterpreterPath': context.defaultPythonInterpreter, diff --git a/vscode/extension/tests/lineage_settings.spec.ts b/vscode/extension/tests/lineage_settings.spec.ts index c4b5a39dfa..ce50e7275e 100644 --- a/vscode/extension/tests/lineage_settings.spec.ts +++ b/vscode/extension/tests/lineage_settings.spec.ts @@ -3,7 +3,11 @@ import path from 'path' import fs from 'fs-extra' import os from 'os' import { openLineageView, SUSHI_SOURCE_PATH } from './utils' -import { startCodeServer, stopCodeServer } from './utils_code_server' +import { + createPythonInterpreterSettingsSpecifier, + startCodeServer, + stopCodeServer, +} from './utils_code_server' test('Settings button is visible in the lineage view', async ({ page }) => { const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'vscode-test-sushi-')) @@ -11,8 +15,8 @@ test('Settings button is visible in the lineage view', async ({ page }) => { const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) try { await page.goto(`http://127.0.0.1:${context.codeServerPort}`) diff --git a/vscode/extension/tests/python_env.spec.ts b/vscode/extension/tests/python_env.spec.ts index fe6b9024a1..7c7b6f96ce 100644 --- a/vscode/extension/tests/python_env.spec.ts +++ b/vscode/extension/tests/python_env.spec.ts @@ -35,6 +35,7 @@ if test_var is None or test_var == "": async function runTest(page: Page, context: CodeServerContext): Promise { await page.goto(`http://127.0.0.1:${context.codeServerPort}`) + await page.waitForSelector('text=models') await openLineageView(page) } diff --git a/vscode/extension/tests/rename_cte.spec.ts b/vscode/extension/tests/rename_cte.spec.ts index 8dc96a6e25..39fb62162f 100644 --- a/vscode/extension/tests/rename_cte.spec.ts +++ b/vscode/extension/tests/rename_cte.spec.ts @@ -3,7 +3,11 @@ import path from 'path' import fs from 'fs-extra' import os from 'os' import { findAllReferences, renameSymbol, SUSHI_SOURCE_PATH } from './utils' -import { startCodeServer, stopCodeServer } from './utils_code_server' +import { + createPythonInterpreterSettingsSpecifier, + startCodeServer, + stopCodeServer, +} from './utils_code_server' async function setupTestEnvironment({ page }: { page: Page }) { const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'vscode-test-sushi-')) @@ -11,8 +15,8 @@ async function setupTestEnvironment({ page }: { page: Page }) { const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) // Navigate to code-server instance await page.goto(`http://127.0.0.1:${context.codeServerPort}`) diff --git a/vscode/extension/tests/render.spec.ts b/vscode/extension/tests/render.spec.ts index 2e9132e8ae..6593708976 100644 --- a/vscode/extension/tests/render.spec.ts +++ b/vscode/extension/tests/render.spec.ts @@ -3,7 +3,11 @@ import path from 'path' import fs from 'fs-extra' import os from 'os' import { openLineageView, runCommand, SUSHI_SOURCE_PATH } from './utils' -import { startCodeServer, stopCodeServer } from './utils_code_server' +import { + createPythonInterpreterSettingsSpecifier, + startCodeServer, + stopCodeServer, +} from './utils_code_server' test('Render works correctly', async ({ page }) => { const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'vscode-test-sushi-')) @@ -11,8 +15,8 @@ test('Render works correctly', async ({ page }) => { const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) try { await page.goto(`http://127.0.0.1:${context.codeServerPort}`) @@ -55,8 +59,8 @@ test('Render works correctly with model without a description', async ({ const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) try { await page.goto(`http://127.0.0.1:${context.codeServerPort}`) @@ -99,8 +103,8 @@ test('Render works correctly with every rendered model opening a new tab', async const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) try { await page.goto(`http://127.0.0.1:${context.codeServerPort}`) @@ -153,8 +157,8 @@ test('Render shows model picker when no active editor is open', async ({ const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) try { // Navigate to code-server instance diff --git a/vscode/extension/tests/stop.spec.ts b/vscode/extension/tests/stop.spec.ts index 911c791720..2cd126f413 100644 --- a/vscode/extension/tests/stop.spec.ts +++ b/vscode/extension/tests/stop.spec.ts @@ -3,7 +3,11 @@ import { runCommand, SUSHI_SOURCE_PATH } from './utils' import os from 'os' import { test } from '@playwright/test' import fs from 'fs-extra' -import { startCodeServer, stopCodeServer } from './utils_code_server' +import { + createPythonInterpreterSettingsSpecifier, + startCodeServer, + stopCodeServer, +} from './utils_code_server' test('Stop server works', async ({ page }) => { const tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'vscode-test-sushi-')) @@ -11,8 +15,8 @@ test('Stop server works', async ({ page }) => { const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) try { // Navigate to code-server instance diff --git a/vscode/extension/tests/tcloud.spec.ts b/vscode/extension/tests/tcloud.spec.ts index 5bebfee781..c72e3ddca3 100644 --- a/vscode/extension/tests/tcloud.spec.ts +++ b/vscode/extension/tests/tcloud.spec.ts @@ -9,7 +9,11 @@ import { SUSHI_SOURCE_PATH, } from './utils' import { setTcloudVersion, setupAuthenticatedState } from './tcloud_utils' -import { startCodeServer, stopCodeServer } from './utils_code_server' +import { + createPythonInterpreterSettingsSpecifier, + startCodeServer, + stopCodeServer, +} from './utils_code_server' /** * Helper function to create and set up a Python virtual environment @@ -384,8 +388,8 @@ test.skip('tcloud not signed in and not installed, shows sign in window and then // Start VS Code const context = await startCodeServer({ tempDir, - placeFileWithPythonInterpreter: true, }) + await createPythonInterpreterSettingsSpecifier(tempDir) await page.goto(`http://127.0.0.1:${context.codeServerPort}`) try { diff --git a/vscode/extension/tests/utils_code_server.ts b/vscode/extension/tests/utils_code_server.ts index db6c426912..68bf2ed597 100644 --- a/vscode/extension/tests/utils_code_server.ts +++ b/vscode/extension/tests/utils_code_server.ts @@ -28,6 +28,30 @@ function getExtensionsDir(): string { return extensionsDir } +/** + * Creates a .vscode/settings.json specifier for the Python interpreter + */ +export const createPythonInterpreterSettingsSpecifier = async ( + directory: string, +): Promise => { + const defaultPythonInterpreter = path.join( + __dirname, + '..', + '..', + '..', + '.venv', + 'bin', + 'python', + ) + const vscodeDir = path.join(directory, '.vscode') + await fs.ensureDir(vscodeDir) + const settingsFilePath = path.join(vscodeDir, 'settings.json') + await fs.writeJson(settingsFilePath, { + 'python.defaultInterpreterPath': defaultPythonInterpreter, + }) + return settingsFilePath +} + /** * @param tempDir - The temporary directory to use for the code-server instance * @param placeFileWithPythonInterpreter - Whether to place a vscode/settings.json file in the temp directory that points to the python interpreter of the environmen the test is running in. @@ -35,10 +59,8 @@ function getExtensionsDir(): string { */ export async function startCodeServer({ tempDir, - placeFileWithPythonInterpreter = false, }: { tempDir: string - placeFileWithPythonInterpreter?: boolean }): Promise { // Get the extensions directory set up by global setup const extensionsDir = getExtensionsDir() @@ -59,20 +81,6 @@ export async function startCodeServer({ path.join(os.tmpdir(), 'vscode-test-sushi-user-data-dir-'), ) - // Create .vscode/settings.json with Python interpreter if requested - if (placeFileWithPythonInterpreter) { - const vscodeDir = path.join(tempDir, '.vscode') - await fs.ensureDir(vscodeDir) - - const settings = { - 'python.defaultInterpreterPath': defaultPythonInterpreter, - } - - await fs.writeJson(path.join(vscodeDir, 'settings.json'), settings, { - spaces: 2, - }) - } - // Start code-server instance using the shared extensions directory const codeServerProcess = spawn( 'pnpm', diff --git a/vscode/extension/tests/venv_naming.spec.ts b/vscode/extension/tests/venv_naming.spec.ts index f20246c9bb..37cffb8da3 100644 --- a/vscode/extension/tests/venv_naming.spec.ts +++ b/vscode/extension/tests/venv_naming.spec.ts @@ -40,6 +40,7 @@ test('venv being named .env', async ({ page }, testInfo) => { try { await page.goto(`http://127.0.0.1:${context.codeServerPort}`) + await page.waitForSelector('text=models') await openLineageView(page) await page.waitForSelector('text=Loaded SQLMesh Context') } finally {