Set up factories for VSCode VariantAnalysis

In a previous PR [1] we introduced factories for generating variant analyses
(and their associated objects) that were returned from the API.

Let's also introduce factories for generating their VSCode equivalent.

We can immediately use them for generating a VariantAnalysis object for the
monitor tests.

[1]: https://github.com/github/vscode-codeql/pull/1545
This commit is contained in:
Elena Tanasoiu
2022-09-30 16:31:49 +01:00
parent 9422c6d65c
commit 3bf27b3472
4 changed files with 103 additions and 9 deletions

View File

@@ -13,17 +13,18 @@ import {
VariantAnalysisFailureReason
} from '../../../remote-queries/gh-api/variant-analysis';
import { createFailedMockApiResponse, createMockApiResponse } from '../../factories/remote-queries/gh-api/variant-analysis-api-response';
import { VariantAnalysisStatus } from '../../../remote-queries/shared/variant-analysis';
import { VariantAnalysis, VariantAnalysisStatus } from '../../../remote-queries/shared/variant-analysis';
import { createMockScannedRepos } from '../../factories/remote-queries/gh-api/scanned-repositories';
import { processFailureReason } from '../../../remote-queries/variant-analysis-processor';
import { Credentials } from '../../../authentication';
import { createMockVariantAnalysis } from '../../factories/remote-queries/shared/variant-analysis';
describe('Variant Analysis Monitor', async function() {
let sandbox: sinon.SinonSandbox;
let mockGetVariantAnalysis: sinon.SinonStub;
let cancellationToken: CancellationToken;
let variantAnalysisMonitor: VariantAnalysisMonitor;
let variantAnalysis: any;
let variantAnalysis: VariantAnalysis;
beforeEach(async () => {
sandbox = sinon.createSandbox();
@@ -34,10 +35,7 @@ describe('Variant Analysis Monitor', async function() {
isCancellationRequested: false
} as unknown as CancellationToken;
variantAnalysis = {
id: 123,
controllerRepoId: 1,
};
variantAnalysis = createMockVariantAnalysis();
try {
const extension = await extensions.getExtension<CodeQLExtensionInterface | Record<string, never>>('GitHub.vscode-codeql')!.activate();
@@ -93,13 +91,12 @@ describe('Variant Analysis Monitor', async function() {
it('should mark as failed locally and stop monitoring', async () => {
const result = await variantAnalysisMonitor.monitorVariantAnalysis(variantAnalysis, cancellationToken);
variantAnalysis = result.variantAnalysis;
expect(mockGetVariantAnalysis.calledOnce).to.be.true;
expect(result.status).to.eql('Failed');
expect(result.error).to.eql(`Variant Analysis has failed: ${mockFailedApiResponse.failure_reason}`);
expect(variantAnalysis.status).to.equal(VariantAnalysisStatus.Failed);
expect(variantAnalysis.failureReason).to.equal(processFailureReason(mockFailedApiResponse.failure_reason as VariantAnalysisFailureReason));
expect(result?.variantAnalysis?.status).to.equal(VariantAnalysisStatus.Failed);
expect(result?.variantAnalysis?.failureReason).to.equal(processFailureReason(mockFailedApiResponse.failure_reason as VariantAnalysisFailureReason));
});
});

View File

@@ -0,0 +1,33 @@
import { faker } from '@faker-js/faker';
import {
VariantAnalysisRepoStatus,
VariantAnalysisScannedRepository
} from '../../../../remote-queries/shared/variant-analysis';
export function createMockScannedRepo(
name: string,
isPrivate: boolean,
analysisStatus: VariantAnalysisRepoStatus,
): VariantAnalysisScannedRepository {
return {
repository: {
id: faker.datatype.number(),
fullName: 'github/' + name,
private: isPrivate,
},
analysisStatus: analysisStatus,
resultCount: faker.datatype.number(),
artifactSizeInBytes: faker.datatype.number()
};
}
export function createMockScannedRepos(
statuses: VariantAnalysisRepoStatus[] = [
VariantAnalysisRepoStatus.Succeeded,
VariantAnalysisRepoStatus.Pending,
VariantAnalysisRepoStatus.InProgress,
]
): VariantAnalysisScannedRepository[] {
return statuses.map(status => createMockScannedRepo(`mona-${status}`, false, status));
}

View File

@@ -0,0 +1,30 @@
import { faker } from '@faker-js/faker';
import {
VariantAnalysisSkippedRepositories,
VariantAnalysisSkippedRepositoryGroup
} from '../../../../remote-queries/shared/variant-analysis';
export function createMockSkippedRepos(): VariantAnalysisSkippedRepositories {
return {
accessMismatchRepos: createMockSkippedRepoGroup(),
noCodeqlDbRepos: createMockSkippedRepoGroup(),
notFoundRepos: createMockSkippedRepoGroup(),
overLimitRepos: createMockSkippedRepoGroup()
};
}
export function createMockSkippedRepoGroup(): VariantAnalysisSkippedRepositoryGroup {
return {
repositoryCount: 2,
repositories: [
{
id: faker.datatype.number(),
fullName: 'github/' + faker.random.word(),
},
{
id: faker.datatype.number(),
fullName: 'github/' + faker.random.word(),
}
]
};
}

View File

@@ -0,0 +1,34 @@
import {
VariantAnalysis,
VariantAnalysisQueryLanguage,
VariantAnalysisScannedRepository,
VariantAnalysisSkippedRepositories,
VariantAnalysisStatus,
} from '../../../../remote-queries/shared/variant-analysis';
import { createMockScannedRepos } from './scanned-repositories';
import { createMockSkippedRepos } from './skipped-repositories';
export function createMockVariantAnalysis(
status: VariantAnalysisStatus = VariantAnalysisStatus.InProgress,
scannedRepos: VariantAnalysisScannedRepository[] = createMockScannedRepos(),
skippedRepos: VariantAnalysisSkippedRepositories = createMockSkippedRepos()
): VariantAnalysis {
const variantAnalysis: VariantAnalysis = {
id: 123,
controllerRepoId: 456,
query: {
name: 'a-query-name',
filePath: 'a-query-file-path',
language: VariantAnalysisQueryLanguage.Javascript
},
databases: {
repositories: ['1', '2', '3'],
},
status: status,
actionsWorkflowRunId: 789,
scannedRepos: scannedRepos,
skippedRepos: skippedRepos
};
return variantAnalysis;
}