diff --git a/editors/vscode/.oxlintrc.json b/editors/vscode/.oxlintrc.json index 4b8c9578b7b39..871a07040d5df 100644 --- a/editors/vscode/.oxlintrc.json +++ b/editors/vscode/.oxlintrc.json @@ -2,5 +2,8 @@ "categories": { "correctness": "error", "perf": "error" - } + }, + "ignorePatterns": [ + "**/fixtures" + ] } diff --git a/editors/vscode/client/extension.spec.ts b/editors/vscode/client/extension.spec.ts index e1e6774cca287..c6e71a853dd8a 100644 --- a/editors/vscode/client/extension.spec.ts +++ b/editors/vscode/client/extension.spec.ts @@ -1,5 +1,4 @@ import { deepStrictEqual, notEqual, strictEqual } from 'assert'; -import { readFile } from 'fs/promises'; import { CodeAction, commands, @@ -14,28 +13,20 @@ import { import { activateExtension, createOxlintConfiguration, - deleteOxlintConfiguration, + getDiagnostics, + loadFixture, sleep, WORKSPACE_DIR, } from './test-helpers'; import assert = require('assert'); -const filePath = WORKSPACE_DIR + '/debugger.js'; -const fileUri = Uri.parse(filePath); +const fileUri = Uri.joinPath(WORKSPACE_DIR, 'debugger.js'); -suite('commands', () => { - setup(async () => { - await activateExtension(); - }); - - suiteTeardown(async () => { - const edit = new WorkspaceEdit(); - edit.deleteFile(fileUri, { - ignoreIfNotExists: true, - }); - await workspace.applyEdit(edit); - }); +setup(async () => { + await activateExtension(); +}); +suite('commands', () => { test('listed commands', async () => { const oxcCommands = (await commands.getCommands(true)).filter(x => x.startsWith('oxc.')); @@ -76,6 +67,7 @@ suite('commands', () => { const edit = new WorkspaceEdit(); edit.createFile(fileUri, { contents: Buffer.from('/* 😊 */debugger;'), + overwrite: true, }); await workspace.applyEdit(edit); @@ -85,54 +77,18 @@ suite('commands', () => { }); await workspace.saveAll(); - const content = await readFile(fileUri.fsPath, { - encoding: 'utf8', - }); + const content = await workspace.fs.readFile(fileUri); - strictEqual(content, '/* 😊 */'); + strictEqual(content.toString(), '/* 😊 */'); }); }); -suite('E2E Diagnostics', () => { - setup(async () => { - await activateExtension(); - }); - - teardown(async () => { - const edit = new WorkspaceEdit(); - edit.deleteFile(fileUri, { - ignoreIfNotExists: true, - }); - await workspace.applyEdit(edit); - await deleteOxlintConfiguration(); - }); - - test('simple debugger statement', async () => { - const edit = new WorkspaceEdit(); - edit.createFile(fileUri, { - contents: Buffer.from('/* 😊 */debugger;'), - overwrite: true, - }); - - await workspace.applyEdit(edit); - await window.showTextDocument(fileUri); - const diagnostics = languages.getDiagnostics(fileUri); - - strictEqual(diagnostics.length, 1); - assert(typeof diagnostics[0].code == 'object'); - strictEqual(diagnostics[0].code.target.authority, 'oxc.rs'); - strictEqual(diagnostics[0].message, '`debugger` statement is not allowed\nhelp: Remove the debugger statement'); - strictEqual(diagnostics[0].severity, DiagnosticSeverity.Warning); - strictEqual(diagnostics[0].range.start.line, 0); - strictEqual(diagnostics[0].range.start.character, 8); - strictEqual(diagnostics[0].range.end.line, 0); - strictEqual(diagnostics[0].range.end.character, 17); - }); - - test('code actions', async () => { +suite('code actions', () => { + test('listed code actions', async () => { const edit = new WorkspaceEdit(); edit.createFile(fileUri, { contents: Buffer.from('debugger;'), + overwrite: true, }); await workspace.applyEdit(edit); @@ -172,19 +128,27 @@ suite('E2E Diagnostics', () => { ], ); }); +}); - test('empty oxlint configuration behaves like default configuration', async () => { - await createOxlintConfiguration({}); +suite('E2E Diagnostics', () => { + test('simple debugger statement', async () => { + await loadFixture('debugger'); + const diagnostics = await getDiagnostics('debugger.js'); - const edit = new WorkspaceEdit(); - edit.createFile(fileUri, { - contents: Buffer.from('/* 😊 */debugger;'), - overwrite: true, - }); + strictEqual(diagnostics.length, 1); + assert(typeof diagnostics[0].code == 'object'); + strictEqual(diagnostics[0].code.target.authority, 'oxc.rs'); + strictEqual(diagnostics[0].message, '`debugger` statement is not allowed\nhelp: Remove the debugger statement'); + strictEqual(diagnostics[0].severity, DiagnosticSeverity.Warning); + strictEqual(diagnostics[0].range.start.line, 0); + strictEqual(diagnostics[0].range.start.character, 8); + strictEqual(diagnostics[0].range.end.line, 0); + strictEqual(diagnostics[0].range.end.character, 17); + }); - await workspace.applyEdit(edit); - await window.showTextDocument(fileUri); - const diagnostics = languages.getDiagnostics(fileUri); + test('empty oxlint configuration behaves like default configuration', async () => { + await loadFixture('debugger_empty_config'); + const diagnostics = await getDiagnostics('debugger.js'); strictEqual(diagnostics.length, 1); assert(typeof diagnostics[0].code == 'object'); @@ -195,8 +159,6 @@ suite('E2E Diagnostics', () => { strictEqual(diagnostics[0].range.start.character, 8); strictEqual(diagnostics[0].range.end.line, 0); strictEqual(diagnostics[0].range.end.character, 17); - - await deleteOxlintConfiguration(); }); test('setting rule to error, will report the diagnostic as error', async () => { @@ -208,6 +170,7 @@ suite('E2E Diagnostics', () => { await workspace.applyEdit(edit); await window.showTextDocument(fileUri); + await sleep(500); const diagnosticsWarning = languages.getDiagnostics(fileUri); strictEqual(diagnosticsWarning.length, 1); @@ -258,11 +221,9 @@ suite('E2E Diagnostics', () => { }); await workspace.saveAll(); - const content = await readFile(fileUri.fsPath, { - encoding: 'utf8', - }); + const content = await workspace.fs.readFile(fileUri); - strictEqual(content, originalContent); + strictEqual(content.toString(), originalContent); await workspace.getConfiguration('oxc').update('flags', { fix_kind: 'all', @@ -274,11 +235,10 @@ suite('E2E Diagnostics', () => { await commands.executeCommand('oxc.fixAll', { uri: fileUri.toString(), }); + await sleep(500); await workspace.saveAll(); - const contentWithFixAll = await readFile(fileUri.fsPath, { - encoding: 'utf8', - }); + const contentWithFixAll = await workspace.fs.readFile(fileUri); - strictEqual(contentWithFixAll, 'if (foo === null) { bar();}'); + strictEqual(contentWithFixAll.toString(), 'if (foo === null) { bar();}'); }); }); diff --git a/editors/vscode/client/test-helpers.ts b/editors/vscode/client/test-helpers.ts index 0f683c2604e7a..5e2a882affa48 100644 --- a/editors/vscode/client/test-helpers.ts +++ b/editors/vscode/client/test-helpers.ts @@ -1,4 +1,5 @@ -import { extensions, Uri, workspace, WorkspaceEdit } from 'vscode'; +import { commands, Diagnostic, extensions, languages, Uri, window, workspace, WorkspaceEdit } from 'vscode'; +import path = require('path'); type OxlintConfigPlugins = string[]; type OxlintConfigCategories = Record; @@ -28,7 +29,7 @@ export type OxlintConfig = { ignorePatterns?: OxlintConfigIgnorePatterns; }; -export const WORKSPACE_DIR = workspace.workspaceFolders![0].uri.toString(); +export const WORKSPACE_DIR = workspace.workspaceFolders![0].uri; const rootOxlintConfigPath = WORKSPACE_DIR + '/.oxlintrc.json'; const rootOxlintConfigUri = Uri.parse(rootOxlintConfigPath); @@ -53,11 +54,17 @@ export async function createOxlintConfiguration(configuration: OxlintConfig): Pr await workspace.applyEdit(edit); } -export async function deleteOxlintConfiguration(): Promise { - const edit = new WorkspaceEdit(); - edit.deleteFile(rootOxlintConfigUri, { - ignoreIfNotExists: true, - }); - await workspace.applyEdit(edit); +export async function loadFixture(fixture: string): Promise { + const absolutePath = path.resolve(`${__dirname}/../fixtures/${fixture}`); + // do not copy directly into the workspace folder. FileWatcher will detect them as a deletion and stop itself. + await workspace.fs.copy(Uri.file(absolutePath), Uri.joinPath(WORKSPACE_DIR, 'diagnostic'), { overwrite: true }); +} + +export async function getDiagnostics(file: string): Promise { + const fileUri = Uri.joinPath(WORKSPACE_DIR, 'diagnostic', file); + await window.showTextDocument(fileUri); await sleep(500); + const diagnostics = languages.getDiagnostics(fileUri); + await commands.executeCommand('workbench.action.closeActiveEditor'); + return diagnostics; } diff --git a/editors/vscode/fixtures/debugger/debugger.js b/editors/vscode/fixtures/debugger/debugger.js new file mode 100644 index 0000000000000..d360b2d7a29fa --- /dev/null +++ b/editors/vscode/fixtures/debugger/debugger.js @@ -0,0 +1 @@ +/* 😊 */debugger; diff --git a/editors/vscode/fixtures/debugger_empty_config/.oxlintrc.json b/editors/vscode/fixtures/debugger_empty_config/.oxlintrc.json new file mode 100644 index 0000000000000..0967ef424bce6 --- /dev/null +++ b/editors/vscode/fixtures/debugger_empty_config/.oxlintrc.json @@ -0,0 +1 @@ +{} diff --git a/editors/vscode/fixtures/debugger_empty_config/debugger.js b/editors/vscode/fixtures/debugger_empty_config/debugger.js new file mode 100644 index 0000000000000..d360b2d7a29fa --- /dev/null +++ b/editors/vscode/fixtures/debugger_empty_config/debugger.js @@ -0,0 +1 @@ +/* 😊 */debugger;