Skip to content

Commit

Permalink
fix: update tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Loïc Mangeonjean committed Mar 7, 2024
1 parent 3976cf8 commit cefc991
Show file tree
Hide file tree
Showing 5 changed files with 63 additions and 191 deletions.
17 changes: 11 additions & 6 deletions browserMock.js
Original file line number Diff line number Diff line change
@@ -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),
Expand All @@ -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)
}
})
})
Expand Down
166 changes: 8 additions & 158 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
41 changes: 25 additions & 16 deletions src/tests/infrastructure.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand Down Expand Up @@ -181,17 +181,28 @@ async function testLanguageClient (
return editor
})

const [getDocumentRequest, sendGetDocumentRequestResponse] = await waitClientRequest<GetTextDocumentParams, GetTextDocumentResult, never>(handler => connection.onRequest(getTextDocumentRequestType, handler))
expect(getDocumentRequest).toEqual({
textDocument: {
uri: 'file:///tmp/project/src/main/Otherfile.java'
}
const readFileRequestPromise = waitClientRequest<ReadFileParams, ReadFileResult, never>(handler => connection.onRequest(readFileRequestType, handler))
const [getFileStatsRequest, sendGetFileStatsRequestResponse] = await waitClientRequest<StatFileParams, StatFileResult, never>(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
Expand All @@ -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<WriteFileParams, void, never>(handler => connection.onRequest(writeFileRequestType, handler))
const didSavePromise = waitClientNotification(connection.onDidSaveTextDocument)

expect(await willSavePromise).toEqual({
Expand All @@ -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: {
Expand Down
27 changes: 17 additions & 10 deletions src/tests/tools.ts
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -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 {
Expand Down Expand Up @@ -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<string | undefined> {
try {
return (await getFile(resource.toString(true), languageClient)).text
} catch (error) {
return undefined
}
public async readFile (resource: monaco.Uri, languageClient: LanguageClientManager): Promise<string> {
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<void> {
public async writeFile (document: monaco.Uri, content: string, languageClient: LanguageClientManager): Promise<void> {
if (languageClient.isConnected()) {
await updateFile(document.toString(), content, languageClient)
await writeFile(document.toString(), content, languageClient)
}
}

public async getFileStats (directory: monaco.Uri, languageClient: LanguageClientManager): Promise<StatFileResult> {
return (await getFileStats(directory.toString(true), languageClient))
}

public async listFiles (directory: monaco.Uri, languageClient: LanguageClientManager): Promise<string[]> {
try {
return (await listFiles(directory.toString(true), languageClient)).files
} catch (error) {
return []
}
}

Expand Down

0 comments on commit cefc991

Please sign in to comment.