The main problem this commit fixes is with vscode 1.67.0, an error is thrown when inside of integration tests and a dialog box is opened. We were opening the telemetry dialog box. Now, an env variable is set during cli-integration tests that prevents the dialog from being opened. There are also other cleanups and improvements with cli-integration tests that assist with running locally: - `vscode-test` dependency has been renamed to `@vscode/test-electron`, so use that instead and make the small API changes to support it. - Commit the codeql-pack.lock.yml file so it isn't recreated on each test run. - Ensure all databases are removed before _and after_ each test run that manipulates the set of installed databases - Similarly, for quick query files, delete them before and after each test. - Change some async `forEach` blocks to for loops in order to support sequential operations more easily.
125 lines
3.8 KiB
TypeScript
125 lines
3.8 KiB
TypeScript
import * as sinon from 'sinon';
|
|
import { expect } from 'chai';
|
|
import { window } from 'vscode';
|
|
import * as pq from 'proxyquire';
|
|
import { UserCancellationException } from '../../../commandRunner';
|
|
|
|
const proxyquire = pq.noPreserveCache();
|
|
|
|
describe('repository-selection', function() {
|
|
|
|
describe('getRepositorySelection', () => {
|
|
let sandbox: sinon.SinonSandbox;
|
|
let quickPickSpy: sinon.SinonStub;
|
|
let showInputBoxSpy: sinon.SinonStub;
|
|
let getRemoteRepositoryListsSpy: sinon.SinonStub;
|
|
let mod: any;
|
|
beforeEach(() => {
|
|
sandbox = sinon.createSandbox();
|
|
quickPickSpy = sandbox.stub(window, 'showQuickPick');
|
|
showInputBoxSpy = sandbox.stub(window, 'showInputBox');
|
|
getRemoteRepositoryListsSpy = sandbox.stub();
|
|
mod = proxyquire('../../../remote-queries/repository-selection', {
|
|
'../config': {
|
|
getRemoteRepositoryLists: getRemoteRepositoryListsSpy
|
|
},
|
|
});
|
|
});
|
|
|
|
afterEach(() => {
|
|
sandbox.restore();
|
|
});
|
|
|
|
it('should allow selection from repo lists from your pre-defined config', async () => {
|
|
// fake return values
|
|
quickPickSpy.resolves(
|
|
{ repositories: ['foo/bar', 'foo/baz'] }
|
|
);
|
|
getRemoteRepositoryListsSpy.returns(
|
|
{
|
|
'list1': ['foo/bar', 'foo/baz'],
|
|
'list2': [],
|
|
}
|
|
);
|
|
|
|
// make the function call
|
|
const repoSelection = await mod.getRepositorySelection();
|
|
|
|
// Check that the return value is correct
|
|
expect(repoSelection.repositoryLists).to.be.undefined;
|
|
expect(repoSelection.repositories).to.deep.eq(
|
|
['foo/bar', 'foo/baz']
|
|
);
|
|
});
|
|
|
|
it('should allow selection from repo lists defined at the system level', async () => {
|
|
// fake return values
|
|
quickPickSpy.resolves(
|
|
{ repositoryList: 'top_100' }
|
|
);
|
|
getRemoteRepositoryListsSpy.returns(
|
|
{
|
|
'list1': ['foo/bar', 'foo/baz'],
|
|
'list2': [],
|
|
}
|
|
);
|
|
|
|
// make the function call
|
|
const repoSelection = await mod.getRepositorySelection();
|
|
|
|
// Check that the return value is correct
|
|
expect(repoSelection.repositories).to.be.undefined;
|
|
expect(repoSelection.repositoryLists).to.deep.eq(
|
|
['top_100']
|
|
);
|
|
});
|
|
|
|
// Test the regex in various "good" cases
|
|
const goodRepos = [
|
|
'owner/repo',
|
|
'owner-with-hyphens/repo-with-hyphens_and_underscores',
|
|
'ownerWithNumbers58/repoWithNumbers37'
|
|
];
|
|
goodRepos.forEach(repo => {
|
|
it(`should run on a valid repo that you enter in the text box: ${repo}`, async () => {
|
|
// fake return values
|
|
quickPickSpy.resolves(
|
|
{ useCustomRepository: true }
|
|
);
|
|
getRemoteRepositoryListsSpy.returns({}); // no pre-defined repo lists
|
|
showInputBoxSpy.resolves(repo);
|
|
|
|
// make the function call
|
|
const repoSelection = await mod.getRepositorySelection();
|
|
|
|
// Check that the return value is correct
|
|
expect(repoSelection.repositories).to.deep.equal(
|
|
[repo]
|
|
);
|
|
});
|
|
});
|
|
|
|
// Test the regex in various "bad" cases
|
|
const badRepos = [
|
|
'invalid_owner/repo',
|
|
'owner/repo+some&invalid&stuff',
|
|
'owner-with-no-repo/',
|
|
'/repo-with-no-owner'
|
|
];
|
|
badRepos.forEach(repo => {
|
|
it(`should show an error message if you enter an invalid repo in the text box: ${repo}`, async () => {
|
|
// fake return values
|
|
quickPickSpy.resolves(
|
|
{ useCustomRepository: true }
|
|
);
|
|
getRemoteRepositoryListsSpy.returns({}); // no pre-defined repo lists
|
|
showInputBoxSpy.resolves(repo);
|
|
|
|
// function call should throw a UserCancellationException
|
|
await expect(mod.getRepositorySelection()).to.be.rejectedWith(UserCancellationException, 'Invalid repository format');
|
|
});
|
|
});
|
|
|
|
});
|
|
});
|