Skip to content

Commit e19637b

Browse files
committed
Extract methods for generating VariantAnalysis objects
We're going to need some of these methods to generate a valid VariantAnalysis. We might as well extract them from the tests for the VariantAnalysisProcessor.
1 parent 066bf3f commit e19637b

5 files changed

Lines changed: 166 additions & 150 deletions

File tree

extensions/ql-vscode/src/vscode-tests/cli-integration/remote-queries/variant-analysis-processor.test.ts

Lines changed: 27 additions & 150 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,28 @@
1-
import { faker } from '@faker-js/faker';
21
import { expect } from 'chai';
32
import {
4-
VariantAnalysis as VariantAnalysisApiResponse,
5-
VariantAnalysisRepoStatus as ApiVariantAnalysisRepoStatus,
63
VariantAnalysisScannedRepository as ApiVariantAnalysisScannedRepository,
74
VariantAnalysisSkippedRepositories as ApiVariantAnalysisSkippedRepositories,
85
VariantAnalysisSkippedRepositoryGroup as ApiVariantAnalysisSkippedRepositoryGroup,
96
VariantAnalysisNotFoundRepositoryGroup as ApiVariantAnalysisNotFoundRepositoryGroup
107
} from '../../../remote-queries/gh-api/variant-analysis';
118
import {
12-
VariantAnalysisSubmission,
139
VariantAnalysisQueryLanguage,
1410
VariantAnalysisSkippedRepositories,
15-
VariantAnalysisSkippedRepositoryGroup
11+
VariantAnalysisSkippedRepositoryGroup,
12+
VariantAnalysisScannedRepository,
13+
VariantAnalysisRepoStatus
1614
} from '../../../remote-queries/shared/variant-analysis';
1715
import { processVariantAnalysis } from '../../../remote-queries/variant-analysis-processor';
16+
import { createMockScannedRepos } from '../../factories/remote-queries/gh-api/scanned-repositories';
17+
import { createMockSkippedRepos } from '../../factories/remote-queries/gh-api/skipped-repositories';
18+
import { createMockApiResponse } from '../../factories/remote-queries/gh-api/variant-analysis-api-response';
19+
import { createMockSubmission } from '../../factories/remote-queries/shared/variant-analysis-submission';
1820

1921
describe('Variant Analysis processor', function() {
20-
let mockApiResponse: VariantAnalysisApiResponse;
21-
let mockSubmission: VariantAnalysisSubmission;
22-
let scannedRepo1: ApiVariantAnalysisScannedRepository;
23-
let scannedRepo2: ApiVariantAnalysisScannedRepository;
24-
let scannedRepo3: ApiVariantAnalysisScannedRepository;
25-
let skippedRepos: ApiVariantAnalysisSkippedRepositories;
26-
27-
beforeEach(() => {
28-
scannedRepo1 = createMockScannedRepo('mona1', false, 'succeeded');
29-
scannedRepo2 = createMockScannedRepo('mona2', false, 'pending');
30-
scannedRepo3 = createMockScannedRepo('mona3', false, 'in_progress');
31-
skippedRepos = createMockSkippedRepos();
32-
33-
mockApiResponse = createMockApiResponse();
34-
mockSubmission = createMockSubmission();
35-
});
22+
const scannedRepos = createMockScannedRepos();
23+
const skippedRepos = createMockSkippedRepos();
24+
const mockApiResponse = createMockApiResponse(scannedRepos, skippedRepos);
25+
const mockSubmission = createMockSubmission();
3626

3727
it('should process an API response and return a variant analysis', () => {
3828
const result = processVariantAnalysis(mockSubmission, mockApiResponse);
@@ -42,7 +32,7 @@ describe('Variant Analysis processor', function() {
4232
'controllerRepoId': 456,
4333
'query': {
4434
'filePath': 'query-file-path',
45-
'language': 'javascript',
35+
'language': VariantAnalysisQueryLanguage.Javascript,
4636
'name': 'query-name',
4737
},
4838
'databases': {
@@ -52,142 +42,29 @@ describe('Variant Analysis processor', function() {
5242
},
5343
'status': 'succeeded',
5444
'actionsWorkflowRunId': 456,
55-
'failureReason': 'internal_error',
5645
'scannedRepos': [
57-
{
58-
'analysisStatus': 'succeeded',
59-
'artifactSizeInBytes': scannedRepo1.artifact_size_in_bytes,
60-
'failureMessage': '',
61-
'repository': {
62-
'fullName': scannedRepo1.repository.full_name,
63-
'id': scannedRepo1.repository.id,
64-
'private': scannedRepo1.repository.private,
65-
},
66-
'resultCount': scannedRepo1.result_count
67-
},
68-
{
69-
'analysisStatus': 'pending',
70-
'artifactSizeInBytes': scannedRepo2.artifact_size_in_bytes,
71-
'failureMessage': '',
72-
'repository': {
73-
'fullName': scannedRepo2.repository.full_name,
74-
'id': scannedRepo2.repository.id,
75-
'private': scannedRepo2.repository.private,
76-
},
77-
'resultCount': scannedRepo2.result_count
78-
},
79-
{
80-
'analysisStatus': 'inProgress',
81-
'artifactSizeInBytes': scannedRepo3.artifact_size_in_bytes,
82-
'failureMessage': '',
83-
'repository': {
84-
'fullName': scannedRepo3.repository.full_name,
85-
'id': scannedRepo3.repository.id,
86-
'private': scannedRepo3.repository.private,
87-
},
88-
'resultCount': scannedRepo3.result_count
89-
}
46+
transformScannedRepo(VariantAnalysisRepoStatus.Succeeded, scannedRepos[0]),
47+
transformScannedRepo(VariantAnalysisRepoStatus.Pending, scannedRepos[1]),
48+
transformScannedRepo(VariantAnalysisRepoStatus.InProgress, scannedRepos[2]),
9049
],
9150
'skippedRepos': transformSkippedRepos(skippedRepos)
9251
});
9352
});
9453

95-
function createMockApiResponse(): VariantAnalysisApiResponse {
96-
const variantAnalysis: VariantAnalysisApiResponse = {
97-
id: 123,
98-
controller_repo: {
99-
id: 456,
100-
name: 'pickles',
101-
full_name: 'github/pickles',
102-
private: false,
103-
},
104-
actor_id: 123,
105-
query_language: 'javascript',
106-
query_pack_url: 'https://example.com/foo',
107-
status: 'in_progress',
108-
actions_workflow_run_id: 456,
109-
failure_reason: 'internal_error',
110-
scanned_repositories: [scannedRepo1, scannedRepo2, scannedRepo3],
111-
skipped_repositories: skippedRepos
112-
};
113-
114-
return variantAnalysis;
115-
}
116-
117-
function createMockScannedRepo(
118-
name: string,
119-
isPrivate: boolean,
120-
analysisStatus: ApiVariantAnalysisRepoStatus,
121-
): ApiVariantAnalysisScannedRepository {
122-
return {
123-
repository: {
124-
id: faker.datatype.number(),
125-
name: name,
126-
full_name: 'github/' + name,
127-
private: isPrivate,
128-
},
129-
analysis_status: analysisStatus,
130-
result_count: faker.datatype.number(),
131-
artifact_size_in_bytes: faker.datatype.number(),
132-
failure_message: ''
133-
};
134-
}
135-
136-
function createMockSubmission(): VariantAnalysisSubmission {
54+
function transformScannedRepo(
55+
status: VariantAnalysisRepoStatus,
56+
scannedRepo: ApiVariantAnalysisScannedRepository
57+
): VariantAnalysisScannedRepository {
13758
return {
138-
startTime: 1234,
139-
controllerRepoId: 5678,
140-
actionRepoRef: 'repo-ref',
141-
query: {
142-
name: 'query-name',
143-
filePath: 'query-file-path',
144-
language: VariantAnalysisQueryLanguage.Javascript,
145-
pack: 'base64-encoded-string',
59+
'analysisStatus': status,
60+
'artifactSizeInBytes': scannedRepo.artifact_size_in_bytes,
61+
'failureMessage': scannedRepo.failure_message,
62+
'repository': {
63+
'fullName': scannedRepo.repository.full_name,
64+
'id': scannedRepo.repository.id,
65+
'private': scannedRepo.repository.private,
14666
},
147-
databases: {
148-
repositories: ['1', '2', '3'],
149-
repositoryLists: ['top10', 'top100'],
150-
repositoryOwners: ['mona', 'lisa'],
151-
}
152-
};
153-
}
154-
155-
function createMockSkippedRepos(): ApiVariantAnalysisSkippedRepositories {
156-
return {
157-
access_mismatch_repos: createMockSkippedRepoGroup(),
158-
no_codeql_db_repos: createMockSkippedRepoGroup(),
159-
not_found_repo_nwos: createMockNotFoundSkippedRepoGroup(),
160-
over_limit_repos: createMockSkippedRepoGroup()
161-
};
162-
}
163-
164-
function createMockSkippedRepoGroup(): ApiVariantAnalysisSkippedRepositoryGroup {
165-
return {
166-
repository_count: 2,
167-
repositories: [
168-
{
169-
id: faker.datatype.number(),
170-
name: faker.random.word(),
171-
full_name: 'github/' + faker.random.word(),
172-
private: true
173-
},
174-
{
175-
id: faker.datatype.number(),
176-
name: faker.random.word(),
177-
full_name: 'github/' + faker.random.word(),
178-
private: false
179-
}
180-
]
181-
};
182-
}
183-
184-
function createMockNotFoundSkippedRepoGroup(): ApiVariantAnalysisNotFoundRepositoryGroup {
185-
const repoName1 = 'github' + faker.random.word();
186-
const repoName2 = 'github' + faker.random.word();
187-
188-
return {
189-
repository_count: 2,
190-
repository_nwos: [repoName1, repoName2]
67+
'resultCount': scannedRepo.result_count
19168
};
19269
}
19370

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { faker } from '@faker-js/faker';
2+
import {
3+
VariantAnalysisRepoStatus,
4+
VariantAnalysisScannedRepository
5+
} from '../../../../remote-queries/gh-api/variant-analysis';
6+
7+
export function createMockScannedRepo(
8+
name: string,
9+
isPrivate: boolean,
10+
analysisStatus: VariantAnalysisRepoStatus,
11+
): VariantAnalysisScannedRepository {
12+
return {
13+
repository: {
14+
id: faker.datatype.number(),
15+
name: name,
16+
full_name: 'github/' + name,
17+
private: isPrivate,
18+
},
19+
analysis_status: analysisStatus,
20+
result_count: faker.datatype.number(),
21+
artifact_size_in_bytes: faker.datatype.number(),
22+
failure_message: ''
23+
};
24+
}
25+
26+
export function createMockScannedRepos(
27+
statuses: VariantAnalysisRepoStatus[] = ['succeeded', 'pending', 'in_progress']
28+
): VariantAnalysisScannedRepository[] {
29+
return statuses.map(status => createMockScannedRepo(`mona-${status}`, false, status));
30+
}
31+
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { faker } from '@faker-js/faker';
2+
import {
3+
VariantAnalysisNotFoundRepositoryGroup,
4+
VariantAnalysisSkippedRepositories,
5+
VariantAnalysisSkippedRepositoryGroup
6+
} from '../../../../remote-queries/gh-api/variant-analysis';
7+
8+
export function createMockSkippedRepos(): VariantAnalysisSkippedRepositories {
9+
return {
10+
access_mismatch_repos: createMockSkippedRepoGroup(),
11+
no_codeql_db_repos: createMockSkippedRepoGroup(),
12+
not_found_repo_nwos: createMockNotFoundSkippedRepoGroup(),
13+
over_limit_repos: createMockSkippedRepoGroup()
14+
};
15+
}
16+
17+
export function createMockSkippedRepoGroup(): VariantAnalysisSkippedRepositoryGroup {
18+
return {
19+
repository_count: 2,
20+
repositories: [
21+
{
22+
id: faker.datatype.number(),
23+
name: faker.random.word(),
24+
full_name: 'github/' + faker.random.word(),
25+
private: true
26+
},
27+
{
28+
id: faker.datatype.number(),
29+
name: faker.random.word(),
30+
full_name: 'github/' + faker.random.word(),
31+
private: false
32+
}
33+
]
34+
};
35+
}
36+
37+
export function createMockNotFoundSkippedRepoGroup(): VariantAnalysisNotFoundRepositoryGroup {
38+
const repoName1 = 'github' + faker.random.word();
39+
const repoName2 = 'github' + faker.random.word();
40+
41+
return {
42+
repository_count: 2,
43+
repository_nwos: [repoName1, repoName2]
44+
};
45+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import {
2+
VariantAnalysis as VariantAnalysisApiResponse,
3+
VariantAnalysisScannedRepository,
4+
VariantAnalysisSkippedRepositories,
5+
} from '../../../../remote-queries/gh-api/variant-analysis';
6+
import {
7+
VariantAnalysisQueryLanguage
8+
} from '../../../../remote-queries/shared/variant-analysis';
9+
10+
export function createMockApiResponse(
11+
scannedRepos: VariantAnalysisScannedRepository[],
12+
skippedRepos: VariantAnalysisSkippedRepositories
13+
): VariantAnalysisApiResponse {
14+
const variantAnalysis: VariantAnalysisApiResponse = {
15+
id: 123,
16+
controller_repo: {
17+
id: 456,
18+
name: 'pickles',
19+
full_name: 'github/pickles',
20+
private: false,
21+
},
22+
actor_id: 123,
23+
query_language: VariantAnalysisQueryLanguage.Javascript,
24+
query_pack_url: 'https://example.com/foo',
25+
status: 'in_progress',
26+
actions_workflow_run_id: 456,
27+
scanned_repositories: scannedRepos,
28+
skipped_repositories: skippedRepos
29+
};
30+
31+
return variantAnalysis;
32+
}
33+
34+
export function createFailedMockApiResponse(
35+
scannedRepos: VariantAnalysisScannedRepository[],
36+
skippedRepos: VariantAnalysisSkippedRepositories
37+
): VariantAnalysisApiResponse {
38+
const variantAnalysis = createMockApiResponse(scannedRepos, skippedRepos);
39+
variantAnalysis.status = 'completed';
40+
variantAnalysis.failure_reason = 'internal_error';
41+
42+
return variantAnalysis;
43+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { VariantAnalysisQueryLanguage, VariantAnalysisSubmission } from '../../../../remote-queries/shared/variant-analysis';
2+
3+
export function createMockSubmission(): VariantAnalysisSubmission {
4+
return {
5+
startTime: 1234,
6+
controllerRepoId: 5678,
7+
actionRepoRef: 'repo-ref',
8+
query: {
9+
name: 'query-name',
10+
filePath: 'query-file-path',
11+
language: VariantAnalysisQueryLanguage.Javascript,
12+
pack: 'base64-encoded-string',
13+
},
14+
databases: {
15+
repositories: ['1', '2', '3'],
16+
repositoryLists: ['top10', 'top100'],
17+
repositoryOwners: ['mona', 'lisa'],
18+
}
19+
};
20+
}

0 commit comments

Comments
 (0)