Only update the details view when data has changed
This commit is contained in:
@@ -34,16 +34,27 @@ export class ModelDetailsDataProvider
|
|||||||
return this.onDidChangeTreeDataEmitter.event;
|
return this.onDidChangeTreeDataEmitter.event;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the data displayed in the tree view.
|
||||||
|
*
|
||||||
|
* Will only trigger an update if the data has changed. This relies on
|
||||||
|
* object identity, so be sure to not mutate the data passed to this
|
||||||
|
* method and instead always pass new objects/arrays.
|
||||||
|
*/
|
||||||
public async setState(
|
public async setState(
|
||||||
externalApiUsages: ExternalApiUsage[],
|
externalApiUsages: ExternalApiUsage[],
|
||||||
databaseItem: DatabaseItem,
|
databaseItem: DatabaseItem,
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
this.externalApiUsages = externalApiUsages;
|
if (
|
||||||
this.databaseItem = databaseItem;
|
this.externalApiUsages !== externalApiUsages ||
|
||||||
this.sourceLocationPrefix = await this.databaseItem.getSourceLocationPrefix(
|
this.databaseItem !== databaseItem
|
||||||
this.cliServer,
|
) {
|
||||||
);
|
this.externalApiUsages = externalApiUsages;
|
||||||
this.onDidChangeTreeDataEmitter.fire();
|
this.databaseItem = databaseItem;
|
||||||
|
this.sourceLocationPrefix =
|
||||||
|
await this.databaseItem.getSourceLocationPrefix(this.cliServer);
|
||||||
|
this.onDidChangeTreeDataEmitter.fire();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getTreeItem(item: ModelDetailsTreeViewItem): TreeItem {
|
getTreeItem(item: ModelDetailsTreeViewItem): TreeItem {
|
||||||
|
|||||||
@@ -0,0 +1,66 @@
|
|||||||
|
import { CodeQLCliServer } from "../../../../../src/codeql-cli/cli";
|
||||||
|
import { ExternalApiUsage } from "../../../../../src/data-extensions-editor/external-api-usage";
|
||||||
|
import { ModelDetailsDataProvider } from "../../../../../src/data-extensions-editor/model-details/model-details-data-provider";
|
||||||
|
import { DatabaseItem } from "../../../../../src/databases/local-databases";
|
||||||
|
import { mockedObject } from "../../../utils/mocking.helpers";
|
||||||
|
|
||||||
|
describe("ModelDetailsDataProvider", () => {
|
||||||
|
const mockCliServer = mockedObject<CodeQLCliServer>({});
|
||||||
|
|
||||||
|
describe("setState", () => {
|
||||||
|
it("should emit onDidChangeTreeData event when state has changed", async () => {
|
||||||
|
const externalApiUsages: ExternalApiUsage[] = [];
|
||||||
|
const dbItem = mockedObject<DatabaseItem>({
|
||||||
|
getSourceLocationPrefix: () => "test",
|
||||||
|
});
|
||||||
|
|
||||||
|
const dataProvider = new ModelDetailsDataProvider(mockCliServer);
|
||||||
|
await dataProvider.setState(externalApiUsages, dbItem);
|
||||||
|
|
||||||
|
const onDidChangeTreeDataListener = jest.fn();
|
||||||
|
dataProvider.onDidChangeTreeData(onDidChangeTreeDataListener);
|
||||||
|
|
||||||
|
await dataProvider.setState(externalApiUsages, dbItem);
|
||||||
|
|
||||||
|
expect(onDidChangeTreeDataListener).toHaveBeenCalledTimes(0);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should emit onDidChangeTreeData event when externalApiUsages has changed", async () => {
|
||||||
|
const externalApiUsages1: ExternalApiUsage[] = [];
|
||||||
|
const externalApiUsages2: ExternalApiUsage[] = [];
|
||||||
|
const dbItem = mockedObject<DatabaseItem>({
|
||||||
|
getSourceLocationPrefix: () => "test",
|
||||||
|
});
|
||||||
|
|
||||||
|
const dataProvider = new ModelDetailsDataProvider(mockCliServer);
|
||||||
|
await dataProvider.setState(externalApiUsages1, dbItem);
|
||||||
|
|
||||||
|
const onDidChangeTreeDataListener = jest.fn();
|
||||||
|
dataProvider.onDidChangeTreeData(onDidChangeTreeDataListener);
|
||||||
|
|
||||||
|
await dataProvider.setState(externalApiUsages2, dbItem);
|
||||||
|
|
||||||
|
expect(onDidChangeTreeDataListener).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should emit onDidChangeTreeData event when dbItem has changed", async () => {
|
||||||
|
const externalApiUsages: ExternalApiUsage[] = [];
|
||||||
|
const dbItem1 = mockedObject<DatabaseItem>({
|
||||||
|
getSourceLocationPrefix: () => "test",
|
||||||
|
});
|
||||||
|
const dbItem2 = mockedObject<DatabaseItem>({
|
||||||
|
getSourceLocationPrefix: () => "test",
|
||||||
|
});
|
||||||
|
|
||||||
|
const dataProvider = new ModelDetailsDataProvider(mockCliServer);
|
||||||
|
await dataProvider.setState(externalApiUsages, dbItem1);
|
||||||
|
|
||||||
|
const onDidChangeTreeDataListener = jest.fn();
|
||||||
|
dataProvider.onDidChangeTreeData(onDidChangeTreeDataListener);
|
||||||
|
|
||||||
|
await dataProvider.setState(externalApiUsages, dbItem2);
|
||||||
|
|
||||||
|
expect(onDidChangeTreeDataListener).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user