blob: 60b0d219be90a8476d79848db88b60de21f8f0ae [file] [log] [blame]
/*---------------------------------------------------------
* Copyright 2022 The Go Authors. All rights reserved.
* Licensed under the MIT License. See LICENSE in the project root for license information.
*--------------------------------------------------------*/
import assert from 'assert';
import path = require('path');
import vscode = require('vscode');
import { extensionId } from '../../src/const';
import goVulncheck = require('../../src/goVulncheck');
suite('vulncheck result viewer tests', () => {
const webviewId = 'vulncheck';
const extensionUri = vscode.extensions.getExtension(extensionId)!.extensionUri;
const fixtureDir = path.join(__dirname, '..', '..', '..', 'test', 'testdata', 'vuln');
const disposables: vscode.Disposable[] = [];
function _register<T extends vscode.Disposable>(disposable: T) {
disposables.push(disposable);
return disposable;
}
let provider: goVulncheck.VulncheckResultViewProvider;
setup(() => {
provider = new goVulncheck.VulncheckResultViewProvider(extensionUri);
});
teardown(async () => {
await vscode.commands.executeCommand('workbench.action.closeAllEditors');
vscode.Disposable.from(...disposables).dispose();
});
test('populates webview', async function () {
this.timeout(5000);
const webviewPanel = _register(
vscode.window.createWebviewPanel(webviewId, 'title', { viewColumn: vscode.ViewColumn.One }, {})
);
const source = path.join(fixtureDir, 'test.vulncheck.json');
const doc = await vscode.workspace.openTextDocument(source);
const canceller = new vscode.CancellationTokenSource();
_register(canceller);
const watcher = getMessage<{ type: string; target?: string }>(webviewPanel);
await provider.resolveCustomTextEditor(doc, webviewPanel, canceller.token);
webviewPanel.reveal();
// Trigger snapshotContent that sends `snapshot-result` as a result.
webviewPanel.webview.postMessage({ type: 'snapshot-request' });
const res = await watcher;
assert.deepStrictEqual(res.type, 'snapshot-result', `want snapshot-result, got ${JSON.stringify(res)}`);
assert(res.target && res.target.includes('GO-2021-0113'), res.target);
});
test('handles invalid input', async () => {
const webviewPanel = _register(
vscode.window.createWebviewPanel(webviewId, 'title', { viewColumn: vscode.ViewColumn.One }, {})
);
// Empty doc.
const doc = await vscode.workspace.openTextDocument(
vscode.Uri.file('bogus.vulncheck.json').with({ scheme: 'untitled' })
);
const canceller = new vscode.CancellationTokenSource();
_register(canceller);
const watcher = getMessage<{ type: string; target?: string }>(webviewPanel);
await provider.resolveCustomTextEditor(doc, webviewPanel, canceller.token);
webviewPanel.reveal();
// Trigger snapshotContent that sends `snapshot-result` as a result.
webviewPanel.webview.postMessage({ type: 'snapshot-request' });
const res = await watcher;
assert.deepStrictEqual(res.type, 'snapshot-result', `want snapshot-result, got ${JSON.stringify(res)}`);
assert(!res.target, res.target);
});
});
function getMessage<R = { type: string; target?: string }>(webview: vscode.WebviewPanel): Promise<R> {
return new Promise<R>((resolve) => {
const sub = webview.webview.onDidReceiveMessage((message) => {
sub.dispose();
resolve(message);
});
});
}