Skip to content

Commit d49bffe

Browse files
committed
Decouple VariantAnalysisManager from VariantAnalysisResultsManager
At the moment we create the results manager as a private property on the `VariantAnalysisManager`. If we instead created it at the extension level and passed it to the `VariantAnalysisManager`, we would have more freedom to write unit tests for the `VariantAnalysisManager` without needing to reach into a private results manager property.
1 parent 50ec718 commit d49bffe

File tree

4 files changed

+15
-10
lines changed

4 files changed

+15
-10
lines changed

extensions/ql-vscode/src/extension.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ import {
117117
import { VariantAnalysisManager } from './remote-queries/variant-analysis-manager';
118118
import { createVariantAnalysisContentProvider } from './remote-queries/variant-analysis-content-provider';
119119
import { MockGitHubApiServer } from './mocks/mock-gh-api-server';
120+
import { VariantAnalysisResultsManager } from './remote-queries/variant-analysis-results-manager';
120121

121122
/**
122123
* extension.ts
@@ -490,8 +491,10 @@ async function activateWithInstalledDistribution(
490491
void logger.log('Initializing variant analysis manager.');
491492
const variantAnalysisStorageDir = path.join(ctx.globalStorageUri.fsPath, 'variant-analyses');
492493
await fs.ensureDir(variantAnalysisStorageDir);
493-
const variantAnalysisManager = new VariantAnalysisManager(ctx, cliServer, variantAnalysisStorageDir, logger);
494+
const variantAnalysisResultsManager = new VariantAnalysisResultsManager(cliServer, logger);
495+
const variantAnalysisManager = new VariantAnalysisManager(ctx, variantAnalysisStorageDir, variantAnalysisResultsManager);
494496
ctx.subscriptions.push(variantAnalysisManager);
497+
ctx.subscriptions.push(variantAnalysisResultsManager);
495498
ctx.subscriptions.push(workspace.registerTextDocumentContentProvider('codeql-variant-analysis', createVariantAnalysisContentProvider(variantAnalysisManager)));
496499

497500
void logger.log('Initializing remote queries manager.');

extensions/ql-vscode/src/remote-queries/variant-analysis-manager.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import * as path from 'path';
33
import * as ghApiClient from './gh-api/gh-api-client';
44
import { CancellationToken, commands, EventEmitter, ExtensionContext, window } from 'vscode';
55
import { DisposableObject } from '../pure/disposable-object';
6-
import { Logger } from '../logging';
76
import { Credentials } from '../authentication';
87
import { VariantAnalysisMonitor } from './variant-analysis-monitor';
98
import {
@@ -21,7 +20,6 @@ import { getErrorMessage } from '../pure/helpers-pure';
2120
import { VariantAnalysisView } from './variant-analysis-view';
2221
import { VariantAnalysisViewManager } from './variant-analysis-view-manager';
2322
import { VariantAnalysisResultsManager } from './variant-analysis-results-manager';
24-
import { CodeQLCliServer } from '../cli';
2523
import { getControllerRepo } from './run-remote-query';
2624
import { processUpdatedVariantAnalysis } from './variant-analysis-processor';
2725
import PQueue from 'p-queue';
@@ -40,29 +38,27 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA
4038
public readonly onVariantAnalysisRemoved = this._onVariantAnalysisRemoved.event;
4139

4240
private readonly variantAnalysisMonitor: VariantAnalysisMonitor;
43-
private readonly variantAnalysisResultsManager: VariantAnalysisResultsManager;
4441
private readonly variantAnalyses = new Map<number, VariantAnalysis>();
4542
private readonly views = new Map<number, VariantAnalysisView>();
4643
private static readonly maxConcurrentDownloads = 3;
4744
private readonly queue = new PQueue({ concurrency: VariantAnalysisManager.maxConcurrentDownloads });
4845

4946
constructor(
5047
private readonly ctx: ExtensionContext,
51-
cliServer: CodeQLCliServer,
5248
private readonly storagePath: string,
53-
logger: Logger,
49+
private readonly variantAnalysisResultsManager: VariantAnalysisResultsManager
5450
) {
5551
super();
5652
this.variantAnalysisMonitor = this.push(new VariantAnalysisMonitor(ctx));
5753
this.variantAnalysisMonitor.onVariantAnalysisChange(this.onVariantAnalysisUpdated.bind(this));
5854

59-
this.variantAnalysisResultsManager = this.push(new VariantAnalysisResultsManager(cliServer, logger));
55+
this.variantAnalysisResultsManager = this.push(variantAnalysisResultsManager);
6056
this.variantAnalysisResultsManager.onResultLoaded(this.onRepoResultLoaded.bind(this));
6157
}
6258

6359
public async rehydrateVariantAnalysis(variantAnalysis: VariantAnalysis, status: QueryStatus) {
6460
if (!(await this.variantAnalysisRecordExists(variantAnalysis.id))) {
65-
// In this case, the variant analysis was deleted from disk, most likely because
61+
// In this case, the variant analysis was deleted from disk, most likely because
6662
// it was purged by another workspace.
6763
this._onVariantAnalysisRemoved.fire(variantAnalysis);
6864
} else if (status === QueryStatus.InProgress) {

extensions/ql-vscode/src/vscode-tests/cli-integration/remote-queries/run-remote-query.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { createMockApiResponse } from '../../factories/remote-queries/gh-api/var
2424
import { createMockExtensionContext } from '../../no-workspace';
2525
import { VariantAnalysisManager } from '../../../remote-queries/variant-analysis-manager';
2626
import { OutputChannelLogger } from '../../../logging';
27+
import { VariantAnalysisResultsManager } from '../../../remote-queries/variant-analysis-results-manager';
2728

2829
describe('Remote queries', function() {
2930
const baseDir = path.join(__dirname, '../../../../src/vscode-tests/cli-integration');
@@ -43,6 +44,7 @@ describe('Remote queries', function() {
4344
let ctx: ExtensionContext;
4445
let logger: any;
4546
let variantAnalysisManager: VariantAnalysisManager;
47+
let variantAnalysisResultsManager: VariantAnalysisResultsManager;
4648

4749
// use `function` so we have access to `this`
4850
beforeEach(async function() {
@@ -57,7 +59,8 @@ describe('Remote queries', function() {
5759

5860
ctx = createMockExtensionContext();
5961
logger = new OutputChannelLogger('test-logger');
60-
variantAnalysisManager = new VariantAnalysisManager(ctx, cli, 'fake-storage-dir', logger);
62+
variantAnalysisResultsManager = new VariantAnalysisResultsManager(cli, logger);
63+
variantAnalysisManager = new VariantAnalysisManager(ctx, 'fake-storage-dir', variantAnalysisResultsManager);
6164

6265
if (!(await cli.cliConstraints.supportsRemoteQueries())) {
6366
console.log(`Remote queries are not supported on CodeQL CLI v${CliVersionConstraint.CLI_VERSION_REMOTE_QUERIES

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { createMockScannedRepos } from '../../factories/remote-queries/gh-api/sc
2020
import { createMockVariantAnalysisRepoTask } from '../../factories/remote-queries/gh-api/variant-analysis-repo-task';
2121
import { CodeQLCliServer } from '../../../cli';
2222
import { storagePath } from '../global.helper';
23+
import { VariantAnalysisResultsManager } from '../../../remote-queries/variant-analysis-results-manager';
2324

2425
describe('Variant Analysis Manager', async function() {
2526
let sandbox: sinon.SinonSandbox;
@@ -30,6 +31,7 @@ describe('Variant Analysis Manager', async function() {
3031
let scannedRepos: ApiVariantAnalysisScannedRepository[];
3132
let getVariantAnalysisRepoStub: sinon.SinonStub;
3233
let getVariantAnalysisRepoResultStub: sinon.SinonStub;
34+
let variantAnalysisResultsManager: VariantAnalysisResultsManager;
3335

3436
beforeEach(async () => {
3537
sandbox = sinon.createSandbox();
@@ -46,7 +48,8 @@ describe('Variant Analysis Manager', async function() {
4648
try {
4749
const extension = await extensions.getExtension<CodeQLExtensionInterface | Record<string, never>>('GitHub.vscode-codeql')!.activate();
4850
cli = extension.cliServer;
49-
variantAnalysisManager = new VariantAnalysisManager(extension.ctx, cli, storagePath, logger);
51+
variantAnalysisResultsManager = new VariantAnalysisResultsManager(cli, logger);
52+
variantAnalysisManager = new VariantAnalysisManager(extension.ctx, storagePath, variantAnalysisResultsManager);
5053
} catch (e) {
5154
fail(e as Error);
5255
}

0 commit comments

Comments
 (0)