all: add MockMemento for use during mocha test
This CL adds a class MockMemento, which extends vscode's memento to provide a substitute for Memento during testing. Update golang/vscode-go#357 Change-Id: I694d5b1883feb54750fc4e207a62a718262ef25b Reviewed-on: https://go-review.googlesource.com/c/vscode-go/+/244060 Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
This commit is contained in:
Родитель
908dd2a11e
Коммит
92b8c737e7
|
@ -160,6 +160,9 @@ export async function chooseGoEnvironment() {
|
|||
* update the selected go path and label in the workspace state
|
||||
*/
|
||||
export async function setSelectedGo(goOption: GoEnvironmentOption, promptReload = true) {
|
||||
if (!goOption) {
|
||||
return;
|
||||
}
|
||||
const execFile = promisify(cp.execFile);
|
||||
// if the selected go version is not installed, install it
|
||||
if (goOption.binpath?.startsWith('go get')) {
|
||||
|
@ -253,7 +256,6 @@ export async function setSelectedGo(goOption: GoEnvironmentOption, promptReload
|
|||
return;
|
||||
}
|
||||
|
||||
console.log('updating selectedGo: ', goOption);
|
||||
await updateWorkspaceState('selectedGo', goOption);
|
||||
goEnvStatusbarItem.text = goOption.label;
|
||||
}
|
||||
|
|
|
@ -43,3 +43,7 @@ export function updateWorkspaceState(key: string, value: any) {
|
|||
export function setWorkspaceState(state: vscode.Memento) {
|
||||
workspaceState = state;
|
||||
}
|
||||
|
||||
export function getWorkspaceState(): vscode.Memento {
|
||||
return workspaceState;
|
||||
}
|
||||
|
|
|
@ -23,8 +23,10 @@ import {
|
|||
setSelectedGo,
|
||||
} from '../../src/goEnvironmentStatus';
|
||||
import { updateGoVarsFromConfig } from '../../src/goInstallTools';
|
||||
import { getWorkspaceState, setWorkspaceState } from '../../src/stateUtils';
|
||||
import ourutil = require('../../src/util');
|
||||
import { getCurrentGoRoot } from '../../src/utils/goPath';
|
||||
import { MockMemento } from '../mocks/MockMemento';
|
||||
|
||||
describe('#initGoStatusBar()', function () {
|
||||
this.beforeAll(async () => {
|
||||
|
@ -50,15 +52,21 @@ describe('#initGoStatusBar()', function () {
|
|||
});
|
||||
});
|
||||
|
||||
describe.skip('#setSelectedGo()', function () {
|
||||
// TODO: reenable this once the problem is fixed https://github.com/golang/vscode-go/issues/357
|
||||
describe('#setSelectedGo()', async function () {
|
||||
this.timeout(40000);
|
||||
let sandbox: sinon.SinonSandbox | undefined;
|
||||
let goOption: GoEnvironmentOption;
|
||||
let defaultGoConfig: vscode.WorkspaceConfiguration;
|
||||
let defaultMemento: vscode.Memento;
|
||||
const version = await ourutil.getGoVersion();
|
||||
const defaultGoOption = new GoEnvironmentOption(version.binaryPath, formatGoVersion(version.format()));
|
||||
|
||||
this.beforeAll(async () => {
|
||||
defaultGoConfig = ourutil.getGoConfig();
|
||||
defaultMemento = getWorkspaceState();
|
||||
setWorkspaceState(new MockMemento());
|
||||
await setSelectedGo(defaultGoOption);
|
||||
});
|
||||
this.afterAll(async () => {
|
||||
setWorkspaceState(defaultMemento);
|
||||
});
|
||||
this.beforeEach(async () => {
|
||||
goOption = await getSelectedGo();
|
||||
|
@ -69,34 +77,13 @@ describe.skip('#setSelectedGo()', function () {
|
|||
sandbox.restore();
|
||||
});
|
||||
|
||||
it('should update the workspace settings.json', async () => {
|
||||
let tmpAltToolsWorkspace: any = {};
|
||||
let tmpAltToolsGlobal: any = {};
|
||||
const getGoConfigStub = sandbox.stub(ourutil, 'getGoConfig').returns({
|
||||
get: (s: string) => {
|
||||
if (s === 'alternateTools') { return tmpAltToolsWorkspace || tmpAltToolsGlobal; }
|
||||
return defaultGoConfig.get(s);
|
||||
},
|
||||
update: (key: string, value: any, scope: vscode.ConfigurationTarget) => {
|
||||
if (key === 'alternateTools') {
|
||||
if (scope === vscode.ConfigurationTarget.Global) {
|
||||
tmpAltToolsGlobal = value;
|
||||
} else {
|
||||
tmpAltToolsWorkspace = value;
|
||||
}
|
||||
}
|
||||
},
|
||||
} as vscode.WorkspaceConfiguration);
|
||||
|
||||
it('should update the workspace memento storage', async () => {
|
||||
// set workspace setting
|
||||
const workspaceTestOption = new GoEnvironmentOption('workspacetestpath', 'testlabel');
|
||||
await setSelectedGo(workspaceTestOption, false);
|
||||
|
||||
// check that the stub was called
|
||||
sandbox.assert.calledWith(getGoConfigStub);
|
||||
|
||||
// check that the new config is set
|
||||
assert.equal(tmpAltToolsWorkspace['go'], 'workspacetestpath');
|
||||
assert.equal(getSelectedGo()?.binpath, 'workspacetestpath');
|
||||
});
|
||||
|
||||
it('should download an uninstalled version of Go', async () => {
|
||||
|
@ -104,24 +91,6 @@ describe.skip('#setSelectedGo()', function () {
|
|||
return;
|
||||
}
|
||||
|
||||
let tmpAltToolsWorkspace = {};
|
||||
let tmpAltToolsGlobal = {};
|
||||
const getGoConfigStub = sandbox.stub(ourutil, 'getGoConfig').returns({
|
||||
get: (s: string) => {
|
||||
if (s === 'alternateTools') { return tmpAltToolsWorkspace || tmpAltToolsGlobal; }
|
||||
return defaultGoConfig.get(s);
|
||||
},
|
||||
update: (key: string, value: any, scope: vscode.ConfigurationTarget) => {
|
||||
if (key === 'alternateTools') {
|
||||
if (scope === vscode.ConfigurationTarget.Global) {
|
||||
tmpAltToolsGlobal = value;
|
||||
} else {
|
||||
tmpAltToolsWorkspace = value;
|
||||
}
|
||||
}
|
||||
},
|
||||
} as vscode.WorkspaceConfiguration);
|
||||
|
||||
// setup tmp home directory for sdk installation
|
||||
const envCache = Object.assign({}, process.env);
|
||||
process.env.HOME = os.tmpdir();
|
||||
|
@ -129,7 +98,6 @@ describe.skip('#setSelectedGo()', function () {
|
|||
// set selected go as a version to download
|
||||
const option = new GoEnvironmentOption('go get golang.org/dl/go1.13.12', 'Go 1.13.12');
|
||||
await setSelectedGo(option, false);
|
||||
sandbox.assert.calledWith(getGoConfigStub);
|
||||
|
||||
// the temp sdk directory should now contain go1.13.12
|
||||
const subdirs = await fs.readdir(path.join(os.tmpdir(), 'sdk'));
|
||||
|
@ -140,17 +108,20 @@ describe.skip('#setSelectedGo()', function () {
|
|||
});
|
||||
});
|
||||
|
||||
describe.skip('#updateGoVarsFromConfig()', function () {
|
||||
// TODO: reenable this once the problem is fixed: https://github.com/golang/vscode-go/issues/357
|
||||
describe('#updateGoVarsFromConfig()', async function () {
|
||||
this.timeout(10000);
|
||||
|
||||
let defaultGoConfig: vscode.WorkspaceConfiguration | undefined;
|
||||
let defaultMemento: vscode.Memento;
|
||||
let tmpRoot: string | undefined;
|
||||
let tmpRootBin: string | undefined;
|
||||
let sandbox: sinon.SinonSandbox | undefined;
|
||||
const version = await ourutil.getGoVersion();
|
||||
const defaultGoOption = new GoEnvironmentOption(version.binaryPath, formatGoVersion(version.format()));
|
||||
|
||||
this.beforeAll(async () => {
|
||||
defaultGoConfig = ourutil.getGoConfig();
|
||||
defaultMemento = getWorkspaceState();
|
||||
setWorkspaceState(new MockMemento());
|
||||
await setSelectedGo(defaultGoOption);
|
||||
|
||||
tmpRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'rootchangetest'));
|
||||
tmpRootBin = path.join(tmpRoot, 'bin');
|
||||
|
@ -161,7 +132,7 @@ describe.skip('#updateGoVarsFromConfig()', function () {
|
|||
const fixtureSourcePath = path.join(__dirname, '..', '..', '..', 'test', 'fixtures', 'testhelpers');
|
||||
const execFile = util.promisify(cp.execFile);
|
||||
const goRuntimePath = ourutil.getBinPath('go');
|
||||
const { stdout, stderr } = await execFile(
|
||||
const { stderr } = await execFile(
|
||||
goRuntimePath, ['build', '-o', path.join(tmpRootBin, 'go'), path.join(fixtureSourcePath, 'fakego.go')]);
|
||||
if (stderr) {
|
||||
assert.fail(`failed to build the fake go binary required for testing: ${stderr}`);
|
||||
|
@ -169,6 +140,7 @@ describe.skip('#updateGoVarsFromConfig()', function () {
|
|||
});
|
||||
|
||||
this.afterAll(async () => {
|
||||
setWorkspaceState(defaultMemento);
|
||||
ourutil.rmdirRecursive(tmpRoot);
|
||||
await updateGoVarsFromConfig();
|
||||
});
|
||||
|
@ -201,21 +173,12 @@ describe.skip('#updateGoVarsFromConfig()', function () {
|
|||
});
|
||||
|
||||
it('should recognize the adjusted goroot using go.goroot', async () => {
|
||||
// stub geteGoConfig to return "go.goroot": tmpRoot.
|
||||
const getGoConfigStub = sandbox.stub(ourutil, 'getGoConfig').returns({
|
||||
get: (s: string) => {
|
||||
if (s === 'goroot') { return tmpRoot; }
|
||||
return defaultGoConfig.get(s);
|
||||
},
|
||||
} as vscode.WorkspaceConfiguration);
|
||||
|
||||
// adjust the fake go binary's behavior.
|
||||
process.env['FAKEGOROOT'] = tmpRoot;
|
||||
process.env['FAKEGOVERSION'] = 'go version go2.0.0 darwin/amd64';
|
||||
|
||||
await updateGoVarsFromConfig();
|
||||
|
||||
sandbox.assert.calledWith(getGoConfigStub);
|
||||
assert.equal((await ourutil.getGoVersion()).format(), '2.0.0');
|
||||
assert.equal(getGoEnvironmentStatusbarItem().text, 'Go 2.0.0');
|
||||
assert.equal(pathEnvVar()[0], [path.join(getCurrentGoRoot(), 'bin')],
|
||||
|
@ -226,21 +189,11 @@ describe.skip('#updateGoVarsFromConfig()', function () {
|
|||
// "go.alternateTools" : {"go": "go3"}
|
||||
fs.copyFileSync(path.join(tmpRootBin, 'go'), path.join(tmpRootBin, 'go3'));
|
||||
|
||||
const getGoConfigStub = sandbox.stub(ourutil, 'getGoConfig').returns({
|
||||
get: (s: string) => {
|
||||
if (s === 'alternateTools') {
|
||||
return { go: path.join(tmpRootBin, 'go3') };
|
||||
}
|
||||
return defaultGoConfig.get(s);
|
||||
},
|
||||
} as vscode.WorkspaceConfiguration);
|
||||
|
||||
process.env['FAKEGOROOT'] = tmpRoot;
|
||||
process.env['FAKEGOVERSION'] = 'go version go3.0.0 darwin/amd64';
|
||||
|
||||
await updateGoVarsFromConfig();
|
||||
|
||||
sandbox.assert.calledWith(getGoConfigStub);
|
||||
assert.equal((await ourutil.getGoVersion()).format(), '3.0.0');
|
||||
assert.equal(getGoEnvironmentStatusbarItem().text, 'Go 3.0.0');
|
||||
assert.equal(pathEnvVar()[0], [path.join(getCurrentGoRoot(), 'bin')],
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
/*---------------------------------------------------------
|
||||
* Copyright (C) Microsoft Corporation. All rights reserved.
|
||||
* Modification copyright 2020 The Go Authors. All rights reserved.
|
||||
* Licensed under the MIT License. See LICENSE in the project root for license information.
|
||||
*--------------------------------------------------------*/
|
||||
|
||||
import { Memento } from 'vscode';
|
||||
|
||||
export class MockMemento implements Memento {
|
||||
// _value must be named this way in order to match vscode's memento
|
||||
private _value: Record<string, {}> = {};
|
||||
|
||||
public get(key: any, defaultValue?: any): any;
|
||||
public get<T>(key: string, defaultValue?: T): T {
|
||||
const exists = this._value.hasOwnProperty(key);
|
||||
return exists ? this._value[key] : (defaultValue! as any);
|
||||
}
|
||||
|
||||
public update(key: string, value: any): Thenable<void> {
|
||||
this._value[key] = value;
|
||||
return Promise.resolve();
|
||||
}
|
||||
public clear() {
|
||||
this._value = {};
|
||||
}
|
||||
}
|
|
@ -151,7 +151,8 @@
|
|||
true,
|
||||
"ban-keywords",
|
||||
"check-format",
|
||||
"allow-pascal-case"
|
||||
"allow-pascal-case",
|
||||
"allow-leading-underscore"
|
||||
],
|
||||
"whitespace": [
|
||||
true,
|
||||
|
|
Загрузка…
Ссылка в новой задаче