From cefc9916eaf07bcb4ad33b03b24ec48b27cce080 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Mangeonjean?= Date: Thu, 29 Feb 2024 15:15:29 +0100 Subject: [PATCH] fix: update tests --- browserMock.js | 17 ++-- package-lock.json | 166 ++----------------------------- package.json | 3 +- src/tests/infrastructure.test.ts | 41 +++++--- src/tests/tools.ts | 27 +++-- 5 files changed, 63 insertions(+), 191 deletions(-) diff --git a/browserMock.js b/browserMock.js index c9f4b80..8480046 100644 --- a/browserMock.js +++ b/browserMock.js @@ -1,5 +1,6 @@ import fs from 'fs/promises' import { performance } from 'perf_hooks' +import { fetch as fetchPolyfill } from 'whatwg-fetch' Object.defineProperty(document, 'queryCommandSupported', { value: jest.fn().mockImplementation(() => true), @@ -22,12 +23,16 @@ Object.defineProperty(window, 'matchMedia', { }); Object.defineProperty(window, 'fetch', { - value: jest.fn(async (url) => { - const content = await fs.readFile(new URL(url).pathname) - return { - json: async () => JSON.stringify(JSON.parse(content.toString())), - arrayBuffer: async () => content.buffer.slice(content.byteOffset, content.byteOffset + content.byteLength), - status: 200 + value: jest.fn(async (url, options) => { + if (url.startsWith('file:')) { + const content = await fs.readFile(new URL(url).pathname) + return { + json: async () => JSON.stringify(JSON.parse(content.toString())), + arrayBuffer: async () => content.buffer.slice(content.byteOffset, content.byteOffset + content.byteLength), + status: 200 + } + } else { + return fetchPolyfill(url, options) } }) }) diff --git a/package-lock.json b/package-lock.json index 33f45ec..b4bc63e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,7 +66,8 @@ "rollup-plugin-visualizer": "5.12.0", "tslib": "^2.6.2", "typescript": "5.4.2", - "vscode-languageserver": "~9.0.1" + "vscode-languageserver": "~9.0.1", + "whatwg-fetch": "^3.6.20" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -5103,110 +5104,6 @@ } } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.1.tgz", - "integrity": "sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.1.tgz", - "integrity": "sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.1.tgz", - "integrity": "sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.1.tgz", - "integrity": "sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.1.tgz", - "integrity": "sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.1.tgz", - "integrity": "sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.1.tgz", - "integrity": "sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.1.tgz", - "integrity": "sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.1.tgz", @@ -5233,45 +5130,6 @@ "linux" ] }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.1.tgz", - "integrity": "sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.1.tgz", - "integrity": "sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.1.tgz", - "integrity": "sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@semantic-release/commit-analyzer": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/@semantic-release/commit-analyzer/-/commit-analyzer-11.1.0.tgz", @@ -9609,20 +9467,6 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -19703,6 +19547,12 @@ "node": ">=12" } }, + "node_modules/whatwg-fetch": { + "version": "3.6.20", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", + "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", + "dev": true + }, "node_modules/whatwg-mimetype": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", diff --git a/package.json b/package.json index ab8a479..f02eb6a 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,8 @@ "rollup-plugin-visualizer": "5.12.0", "tslib": "^2.6.2", "typescript": "5.4.2", - "vscode-languageserver": "~9.0.1" + "vscode-languageserver": "~9.0.1", + "whatwg-fetch": "^3.6.20" }, "resolutions": { "eslint": "8.57.0" diff --git a/src/tests/infrastructure.test.ts b/src/tests/infrastructure.test.ts index b3c2d2c..d695dac 100644 --- a/src/tests/infrastructure.test.ts +++ b/src/tests/infrastructure.test.ts @@ -8,7 +8,7 @@ import { createModelReference } from 'vscode/monaco' import * as vscode from 'vscode' import { RegisteredFileSystemProvider, RegisteredMemoryFile, registerFileSystemOverlay } from '@codingame/monaco-vscode-files-service-override' import pDefer, { TestInfrastructure, waitClientNotification, waitClientRequest } from './tools' -import { GetTextDocumentParams, getTextDocumentRequestType, GetTextDocumentResult, saveTextDocumentRequestType } from '../customRequests' +import { getFileStatsRequestType, ReadFileParams, readFileRequestType, ReadFileResult, StatFileParams, StatFileResult, WriteFileParams, writeFileRequestType } from '../customRequests' import { createLanguageClientManager, LanguageClientManager, getLanguageClientOptions, StaticLanguageClientId } from '..' async function initializeLanguageClientAndGetConnection ( @@ -181,17 +181,28 @@ async function testLanguageClient ( return editor }) - const [getDocumentRequest, sendGetDocumentRequestResponse] = await waitClientRequest(handler => connection.onRequest(getTextDocumentRequestType, handler)) - expect(getDocumentRequest).toEqual({ - textDocument: { - uri: 'file:///tmp/project/src/main/Otherfile.java' - } + const readFileRequestPromise = waitClientRequest(handler => connection.onRequest(readFileRequestType, handler)) + const [getFileStatsRequest, sendGetFileStatsRequestResponse] = await waitClientRequest(handler => connection.onRequest(getFileStatsRequestType, handler)) + expect(getFileStatsRequest).toEqual({ + uri: 'file:///tmp/project/src/main/Otherfile.java' + }) + + sendGetFileStatsRequestResponse({ + mtime: 0, + name: 'Otherfile.java', + size: 50, + type: 'file' + }) + + const [readFileRequest, sendReadFileRequestResponse] = await readFileRequestPromise + expect(readFileRequest).toEqual({ + uri: 'file:///tmp/project/src/main/Otherfile.java' }) const openNotificationPromise = waitClientNotification(connection.onDidOpenTextDocument) - sendGetDocumentRequestResponse({ - text: 'other file content' + sendReadFileRequestResponse({ + content: btoa('other file content') }) // Expect the model to be open @@ -218,7 +229,7 @@ async function testLanguageClient ( // Expect the model to be saved const willSavePromise = waitClientNotification(connection.onWillSaveTextDocument) - const saveRequestPromise = waitClientRequest(handler => connection.onRequest(saveTextDocumentRequestType, handler)) + const writeFileRequestPromise = waitClientRequest(handler => connection.onRequest(writeFileRequestType, handler)) const didSavePromise = waitClientNotification(connection.onDidSaveTextDocument) expect(await willSavePromise).toEqual({ @@ -227,14 +238,12 @@ async function testLanguageClient ( }, reason: vscode.TextDocumentSaveReason.Manual }) - const [saveRequest, sendSaveRequestResponse] = await saveRequestPromise - expect(await saveRequest).toEqual({ - textDocument: { - uri: mainFileUri.toString(), - text: modelRef.object.textEditorModel!.getValue() - } + const [writeFileRequest, sendWriteFileResponse] = await writeFileRequestPromise + expect(writeFileRequest).toEqual({ + uri: mainFileUri.toString(), + content: btoa(modelRef.object.textEditorModel!.getValue()) }) - sendSaveRequestResponse(null) + sendWriteFileResponse() expect(await didSavePromise).toEqual({ textDocument: { diff --git a/src/tests/tools.ts b/src/tests/tools.ts index c2de974..d46cf27 100644 --- a/src/tests/tools.ts +++ b/src/tests/tools.ts @@ -1,4 +1,3 @@ -import { Uri } from 'monaco-editor' import { AbstractMessageReader, AbstractMessageWriter, createMessageConnection, DataCallback, Disposable, Message, MessageReader, MessageWriter, NotificationHandler, RequestHandler } from 'vscode-languageserver-protocol' import { createConnection, @@ -8,7 +7,7 @@ import { } from 'vscode-languageserver/lib/common/api' import { monaco } from '@codingame/monaco-editor-wrapper' import { MessageTransports } from 'vscode-languageclient' -import { getFile, updateFile } from '../customRequests' +import { getFileStats, listFiles, StatFileResult, readFile, writeFile } from '../customRequests' import { Infrastructure, LanguageClientId, LanguageClientManager, LanguageClientOptions } from '../' class PipedMessageReader extends AbstractMessageReader { @@ -131,18 +130,26 @@ export class TestInfrastructure implements Infrastructure { } // use same method as CodinGameInfrastructure to be able to simply catch it - async getFileContent (resource: Uri, languageClient: LanguageClientManager): Promise { - try { - return (await getFile(resource.toString(true), languageClient)).text - } catch (error) { - return undefined - } + public async readFile (resource: monaco.Uri, languageClient: LanguageClientManager): Promise { + return (await readFile(resource.toString(true), languageClient)).content } // use same method as CodinGameInfrastructure to be able to simply catch it - public async saveFileContent (document: monaco.Uri, content: string, languageClient: LanguageClientManager): Promise { + public async writeFile (document: monaco.Uri, content: string, languageClient: LanguageClientManager): Promise { if (languageClient.isConnected()) { - await updateFile(document.toString(), content, languageClient) + await writeFile(document.toString(), content, languageClient) + } + } + + public async getFileStats (directory: monaco.Uri, languageClient: LanguageClientManager): Promise { + return (await getFileStats(directory.toString(true), languageClient)) + } + + public async listFiles (directory: monaco.Uri, languageClient: LanguageClientManager): Promise { + try { + return (await listFiles(directory.toString(true), languageClient)).files + } catch (error) { + return [] } }