@gooddata/react-components
Version:
GoodData.UI - A powerful JavaScript library for building analytical applications
190 lines (168 loc) • 7.5 kB
text/typescript
// (C) 2019 GoodData Corporation
import * as fixtures from "../../../../../stories/test_data/fixtures";
import { createAgGridDataSource, executionToAGGridAdapter } from "../agGridDataSource";
import { GroupingProviderFactory } from "../GroupingProvider";
import { createIntlMock } from "../../../visualizations/utils/intlUtils";
const pivotTableWithColumnAndRowAttributes = fixtures.pivotTableWithColumnAndRowAttributes;
const intl = createIntlMock();
describe("getGridDataSource", () => {
function createMockedDataSource(customGridApiProps?: any) {
const resultSpec = pivotTableWithColumnAndRowAttributes.executionRequest.resultSpec;
const getPage = jest.fn().mockReturnValue(Promise.resolve(pivotTableWithColumnAndRowAttributes));
const successCallback = jest.fn();
const failCallback = jest.fn();
const cancelPagePromises = jest.fn();
const onSuccess = jest.fn();
const getGridApi = () => ({
setPinnedBottomRowData: jest.fn(),
getPinnedBottomRowCount: jest.fn(),
paginationProxy: {
bottomRowIndex: 32,
},
...customGridApiProps,
});
const getExecution = () => pivotTableWithColumnAndRowAttributes;
const groupingProvider = GroupingProviderFactory.createProvider(true);
const gridDataSource = createAgGridDataSource(
resultSpec,
getPage,
getExecution,
onSuccess,
getGridApi,
intl,
[],
() => groupingProvider,
cancelPagePromises,
);
return {
gridDataSource,
getPage,
failCallback,
successCallback,
onSuccess,
cancelPagePromises,
};
}
// tslint:disable-next-line:max-line-length
it("should return AGGrid dataSource that calls getPage, successCallback, onSuccess, then cancelPagePromises on destroy", async () => {
const resultSpec = pivotTableWithColumnAndRowAttributes.executionRequest.resultSpec;
const {
getPage,
successCallback,
gridDataSource,
onSuccess,
cancelPagePromises,
} = createMockedDataSource();
await gridDataSource.getRows({ startRow: 0, endRow: 0, successCallback, sortModel: [] } as any);
expect(getPage).toHaveBeenCalledWith(resultSpec, [0, undefined], [0, undefined]);
expect(successCallback.mock.calls[0]).toMatchSnapshot();
expect(onSuccess.mock.calls[0]).toMatchSnapshot();
gridDataSource.destroy();
expect(cancelPagePromises).toHaveBeenCalledTimes(1);
});
it("should return null from getRows promise result when startRow is out of total rows boundary", async () => {
const {
getPage,
successCallback,
gridDataSource,
failCallback,
onSuccess,
cancelPagePromises,
} = createMockedDataSource();
const getRowsResult = await gridDataSource.getRows({
startRow: 100,
endRow: 200,
successCallback,
failCallback,
sortModel: [],
} as any);
expect(getRowsResult).toEqual(null);
expect(getPage).not.toHaveBeenCalled();
expect(successCallback).not.toHaveBeenCalled();
expect(onSuccess).not.toHaveBeenCalled();
expect(failCallback).toHaveBeenCalled();
gridDataSource.destroy();
expect(cancelPagePromises).toHaveBeenCalledTimes(1);
});
it("should ignore getRowsRequest validation when gridApi is not providing expected data", async () => {
const resultSpec = pivotTableWithColumnAndRowAttributes.executionRequest.resultSpec;
const {
getPage,
successCallback,
gridDataSource,
onSuccess,
cancelPagePromises,
} = createMockedDataSource({
paginationProxy: {},
});
await gridDataSource.getRows({ startRow: 0, endRow: 0, successCallback, sortModel: [] } as any);
expect(getPage).toHaveBeenCalledWith(resultSpec, [0, undefined], [0, undefined]);
expect(successCallback).toHaveBeenCalled();
expect(onSuccess).toHaveBeenCalled();
gridDataSource.destroy();
expect(cancelPagePromises).toHaveBeenCalledTimes(1);
});
it("should ignore getRowsRequest when called on destroyed data source", async () => {
const {
getPage,
successCallback,
gridDataSource,
onSuccess,
cancelPagePromises,
} = createMockedDataSource({
paginationProxy: {},
});
gridDataSource.destroy();
expect(cancelPagePromises).toHaveBeenCalledTimes(1);
await gridDataSource.getRows({ startRow: 0, endRow: 0, successCallback, sortModel: [] } as any);
expect(getPage).not.toHaveBeenCalled();
expect(successCallback).not.toHaveBeenCalled();
expect(onSuccess).not.toHaveBeenCalled();
});
it("should call getPage only once when requesting the same page", async () => {
const { getPage, successCallback, gridDataSource, onSuccess } = createMockedDataSource();
await gridDataSource.getRows({ startRow: 0, endRow: 0, successCallback, sortModel: [] } as any);
await gridDataSource.getRows({ startRow: 0, endRow: 0, successCallback, sortModel: [] } as any);
expect(getPage).toHaveBeenCalledTimes(1);
expect(successCallback).toHaveBeenCalledTimes(2);
expect(onSuccess).toHaveBeenCalledTimes(2);
});
it("should call getPage only for unique request but not for the same page", async () => {
const { getPage, successCallback, gridDataSource, onSuccess } = createMockedDataSource();
await gridDataSource.getRows({ startRow: 0, endRow: 0, successCallback, sortModel: [] } as any);
await gridDataSource.getRows({ startRow: 0, endRow: 0, successCallback, sortModel: [] } as any);
expect(getPage).toHaveBeenCalledTimes(1);
expect(successCallback).toHaveBeenCalledTimes(2);
expect(onSuccess).toHaveBeenCalledTimes(2);
await gridDataSource.getRows({ startRow: 0, endRow: 2, successCallback, sortModel: [] } as any);
expect(getPage).toHaveBeenCalledTimes(2);
expect(successCallback).toHaveBeenCalledTimes(3);
expect(onSuccess).toHaveBeenCalledTimes(3);
});
});
describe("executionToAGGridAdapter", () => {
it("should return grid data for executionResult", () => {
expect(
executionToAGGridAdapter(
{
executionResponse: fixtures.pivotTableWithColumnAndRowAttributes.executionResponse,
executionResult: fixtures.pivotTableWithColumnAndRowAttributes.executionResult,
},
{},
intl,
),
).toMatchSnapshot();
});
it("should return grid data for executionResult with rowGroups and loadingRenderer", () => {
expect(
executionToAGGridAdapter(
{
executionResponse: fixtures.barChartWithStackByAndOnlyOneStack.executionResponse,
executionResult: fixtures.barChartWithStackByAndOnlyOneStack.executionResult,
},
{},
intl,
),
).toMatchSnapshot();
});
});