Skip to content

Commit 54fee0b

Browse files
committed
Add unit tests for event emitting in database manager
1 parent 6bc7204 commit 54fee0b

3 files changed

Lines changed: 92 additions & 6 deletions

File tree

extensions/ql-vscode/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
- Fix proper escaping of backslashes in SARIF message strings.
1111
- Allow setting `codeQL.runningQueries.numberOfThreads` and `codeQL.runningTests.numberOfThreads` to 0, (which is interpreted as 'use one thread per core on the machine').
1212
- Clear the problems view of all Code QL problems when a database is removed.
13+
- Clear the problems view of all CodeQL query results when a database is removed.
1314

1415
## 1.3.3 - 16 September 2020
1516

extensions/ql-vscode/src/databases.ts

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -273,10 +273,12 @@ class DatabaseItemImpl implements DatabaseItem {
273273
/** A cache of database info */
274274
private _dbinfo: cli.DbInfo | undefined;
275275

276-
public constructor(public readonly databaseUri: vscode.Uri,
277-
contents: DatabaseContents | undefined, private options: FullDatabaseOptions,
278-
private readonly onChanged: (event: DatabaseChangedEvent) => void) {
279-
276+
public constructor(
277+
public readonly databaseUri: vscode.Uri,
278+
contents: DatabaseContents | undefined,
279+
private options: FullDatabaseOptions,
280+
private readonly onChanged: (event: DatabaseChangedEvent) => void
281+
) {
280282
this._contents = contents;
281283
}
282284

@@ -483,9 +485,11 @@ export class DatabaseManager extends DisposableObject {
483485
private readonly _databaseItems: DatabaseItemImpl[] = [];
484486
private _currentDatabaseItem: DatabaseItem | undefined = undefined;
485487

486-
constructor(private ctx: ExtensionContext,
488+
constructor(
489+
private ctx: ExtensionContext,
487490
public config: QueryServerConfig,
488-
public logger: Logger) {
491+
public logger: Logger
492+
) {
489493
super();
490494

491495
this.loadPersistedState(); // Let this run async.
@@ -655,6 +659,7 @@ export class DatabaseManager extends DisposableObject {
655659
private async addDatabaseItem(item: DatabaseItemImpl) {
656660
this._databaseItems.push(item);
657661
this.updatePersistedDatabaseList();
662+
// note that we use undefined as the item in order to reset the entire tree
658663
this._onDidChangeDatabaseItem.fire({
659664
item: undefined,
660665
kind: DatabaseEventKind.Add
@@ -694,6 +699,7 @@ export class DatabaseManager extends DisposableObject {
694699
e => logger.log(`Failed to delete '${item.databaseUri.path}'. Reason: ${e.message}`));
695700
}
696701

702+
// note that we use undefined as the item in order to reset the entire tree
697703
this._onDidChangeDatabaseItem.fire({
698704
item: undefined,
699705
kind: DatabaseEventKind.Remove
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import 'vscode-test';
2+
import 'mocha';
3+
import * as sinon from 'sinon';
4+
import { expect } from 'chai';
5+
import { ExtensionContext } from 'vscode';
6+
7+
import { DatabaseEventKind, DatabaseItem, DatabaseManager } from '../../databases';
8+
import { QueryServerConfig } from '../../config';
9+
import { Logger } from '../../logging';
10+
11+
describe('databases', () => {
12+
let databaseManager: DatabaseManager;
13+
let updateSpy: sinon.SinonSpy;
14+
15+
beforeEach(() => {
16+
updateSpy = sinon.spy();
17+
databaseManager = new DatabaseManager(
18+
{
19+
workspaceState: {
20+
update: updateSpy
21+
}
22+
} as unknown as ExtensionContext,
23+
{} as QueryServerConfig,
24+
{} as Logger,
25+
);
26+
});
27+
28+
it('should fire events when adding and removing a db item', () => {
29+
const mockDbItem = {
30+
databaseUri: 'file:/abc',
31+
getPersistedState() {
32+
return this.databaseUri;
33+
}
34+
};
35+
const spy = sinon.spy();
36+
databaseManager.onDidChangeDatabaseItem(spy);
37+
(databaseManager as any).addDatabaseItem(mockDbItem);
38+
39+
expect((databaseManager as any)._databaseItems).to.deep.eq([mockDbItem]);
40+
expect(updateSpy).to.have.been.calledWith('databaseList', ['file:/abc']);
41+
expect(spy).to.have.been.calledWith({
42+
item: undefined,
43+
kind: DatabaseEventKind.Add
44+
});
45+
46+
sinon.reset();
47+
48+
// now remove the item
49+
databaseManager.removeDatabaseItem(mockDbItem as unknown as DatabaseItem);
50+
expect((databaseManager as any)._databaseItems).to.deep.eq([]);
51+
expect(updateSpy).to.have.been.calledWith('databaseList', []);
52+
expect(spy).to.have.been.calledWith({
53+
item: undefined,
54+
kind: DatabaseEventKind.Remove
55+
});
56+
});
57+
58+
it('should rename a db item and emit an event', () => {
59+
const mockDbItem = {
60+
databaseUri: 'file:/abc',
61+
name: 'abc',
62+
getPersistedState() {
63+
return this.name;
64+
}
65+
};
66+
const spy = sinon.spy();
67+
databaseManager.onDidChangeDatabaseItem(spy);
68+
(databaseManager as any).addDatabaseItem(mockDbItem);
69+
70+
databaseManager.renameDatabaseItem(mockDbItem as unknown as DatabaseItem, 'new name');
71+
72+
expect(mockDbItem.name).to.eq('new name');
73+
expect(updateSpy).to.have.been.calledWith('databaseList', ['new name']);
74+
expect(spy).to.have.been.calledWith({
75+
item: undefined,
76+
kind: DatabaseEventKind.Rename
77+
});
78+
});
79+
});

0 commit comments

Comments
 (0)