From 97dd108b32a6366cdb3d4e3b377b3ddf1a6fa909 Mon Sep 17 00:00:00 2001 From: Krist Wongsuphasawat Date: Fri, 5 Jun 2020 11:56:03 -0700 Subject: [PATCH] feat(query): add more query wrappers (#570) * feat: add more api wrappers * test: add unit tests --- .../src/api/legacy/fetchExploreJson.ts | 7 ++- .../src/api/legacy/getDatasourceMetadata.ts | 20 ++++++++ .../src/api/legacy/getFormData.ts | 26 ++++++++++ .../superset-ui-query/src/api/legacy/index.ts | 3 ++ .../superset-ui-query/src/api/types.ts | 10 ++++ .../superset-ui-query/src/api/v1/index.ts | 2 + .../src/api/v1/postChartData.ts | 7 ++- .../packages/superset-ui-query/src/index.ts | 7 ++- .../test/api/fixtures/constants.ts | 1 - .../test/api/legacy/fetchExploreJson.test.ts | 11 ++--- .../api/legacy/getDatasourceMetadata.test.ts | 24 +++++++++ .../test/api/legacy/getFormData.test.ts | 49 +++++++++++++++++++ .../test/api/setupClientForTest.ts | 11 +++++ .../test/api/v1/postChartData.test.ts | 12 ++--- 14 files changed, 163 insertions(+), 27 deletions(-) create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/legacy/getDatasourceMetadata.ts create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/legacy/getFormData.ts create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/legacy/index.ts create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/types.ts create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/v1/index.ts delete mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/fixtures/constants.ts create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/legacy/getDatasourceMetadata.test.ts create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/legacy/getFormData.test.ts create mode 100644 superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/setupClientForTest.ts diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/legacy/fetchExploreJson.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/legacy/fetchExploreJson.ts index 16278b2b1f56..f858455f7d34 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/legacy/fetchExploreJson.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/legacy/fetchExploreJson.ts @@ -1,11 +1,10 @@ -import { SupersetClientInterface, SupersetClient, RequestConfig } from '@superset-ui/connection'; +import { SupersetClient, RequestConfig } from '@superset-ui/connection'; import { QueryFormData } from '../../types/QueryFormData'; import { LegacyChartDataResponse } from './types'; +import { BaseParams } from '../types'; -export interface Params { - client?: SupersetClientInterface; +export interface Params extends BaseParams { method?: 'GET' | 'POST'; - requestConfig?: Partial; url?: string; formData: QueryFormData; } diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/legacy/getDatasourceMetadata.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/legacy/getDatasourceMetadata.ts new file mode 100644 index 000000000000..43fc3779d7d3 --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/legacy/getDatasourceMetadata.ts @@ -0,0 +1,20 @@ +import { SupersetClient, RequestConfig } from '@superset-ui/connection'; +import { Datasource } from '../../types/Datasource'; +import { BaseParams } from '../types'; + +export interface Params extends BaseParams { + datasourceKey: string; +} + +export default function getDatasourceMetadata({ + client = SupersetClient, + datasourceKey, + requestConfig, +}: Params) { + return client + .get({ + endpoint: `/superset/fetch_datasource_metadata?datasourceKey=${datasourceKey}`, + ...requestConfig, + } as RequestConfig) + .then(response => response.json as Datasource); +} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/legacy/getFormData.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/legacy/getFormData.ts new file mode 100644 index 000000000000..2d709ab29b55 --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/legacy/getFormData.ts @@ -0,0 +1,26 @@ +import { SupersetClient, RequestConfig } from '@superset-ui/connection'; +import { BaseParams } from '../types'; +import { QueryFormData } from '../../types/QueryFormData'; + +export interface Params extends BaseParams { + sliceId: number; + overrideFormData?: Partial; +} + +export default function getFormData({ + client = SupersetClient, + sliceId, + overrideFormData, + requestConfig, +}: Params) { + const promise = client + .get({ + endpoint: `/api/v1/form_data/?slice_id=${sliceId}`, + ...requestConfig, + } as RequestConfig) + .then(response => response.json as QueryFormData); + + return overrideFormData + ? promise.then(formData => ({ ...formData, ...overrideFormData })) + : promise; +} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/legacy/index.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/legacy/index.ts new file mode 100644 index 000000000000..402d01f2c38e --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/legacy/index.ts @@ -0,0 +1,3 @@ +export { default as fetchExploreJson } from './fetchExploreJson'; +export { default as getFormData } from './getFormData'; +export { default as getDatasourceMetadata } from './getDatasourceMetadata'; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/types.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/types.ts new file mode 100644 index 000000000000..5e422e1be678 --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/types.ts @@ -0,0 +1,10 @@ +import { + RequestConfig, + SupersetClientInterface, + SupersetClientClass, +} from '@superset-ui/connection'; + +export interface BaseParams { + client?: SupersetClientInterface | SupersetClientClass; + requestConfig?: Partial; +} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/v1/index.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/v1/index.ts new file mode 100644 index 000000000000..55e94e76b3c8 --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/v1/index.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line import/prefer-default-export +export { default as postChartData } from './postChartData'; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/v1/postChartData.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/v1/postChartData.ts index 0b55989f7bb4..d42fd8a552c8 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/v1/postChartData.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/api/v1/postChartData.ts @@ -1,10 +1,9 @@ -import { SupersetClientInterface, SupersetClient, RequestConfig } from '@superset-ui/connection'; +import { SupersetClient, RequestConfig } from '@superset-ui/connection'; import { QueryContext } from '../../types/Query'; +import { BaseParams } from '../types'; import { V1ChartDataResponse } from './types'; -export interface Params { - client?: SupersetClientInterface; - requestConfig?: Partial; +export interface Params extends BaseParams { queryContext: QueryContext; } diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/index.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/index.ts index 44b5ac9c51eb..86c38e3d00d4 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/index.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/src/index.ts @@ -1,3 +1,7 @@ +// API Calls +import * as ApiLegacy from './api/legacy'; +import * as ApiV1 from './api/v1'; + export { default as buildQueryContext } from './buildQueryContext'; export { default as buildQueryObject } from './buildQueryObject'; export { default as convertFilter } from './convertFilter'; @@ -11,8 +15,7 @@ export * from './types/Metric'; export * from './types/Query'; // API Calls -export { default as fetchExploreJson } from './api/legacy/fetchExploreJson'; -export { default as postChartData } from './api/v1/postChartData'; +export { ApiLegacy, ApiV1 }; export * from './api/legacy/types'; export * from './api/v1/types'; diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/fixtures/constants.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/fixtures/constants.ts deleted file mode 100644 index 4457bc011519..000000000000 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/fixtures/constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const LOGIN_GLOB = 'glob:*superset/csrf_token/*'; // eslint-disable-line import/prefer-default-export diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/legacy/fetchExploreJson.test.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/legacy/fetchExploreJson.test.ts index e7b30bb43449..89e9fbfa8ab0 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/legacy/fetchExploreJson.test.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/legacy/fetchExploreJson.test.ts @@ -1,14 +1,9 @@ import fetchMock from 'fetch-mock'; -import { SupersetClient } from '@superset-ui/connection'; -import { LOGIN_GLOB } from '../fixtures/constants'; -import { fetchExploreJson } from '../../../src'; +import { fetchExploreJson } from '../../../src/api/legacy'; +import setupClientForTest from '../setupClientForTest'; describe('fetchExploreJson()', () => { - beforeAll(() => { - fetchMock.get(LOGIN_GLOB, { csrf_token: '1234' }); - SupersetClient.reset(); - SupersetClient.configure().init(); - }); + beforeAll(setupClientForTest); afterEach(fetchMock.restore); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/legacy/getDatasourceMetadata.test.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/legacy/getDatasourceMetadata.test.ts new file mode 100644 index 000000000000..a2f032f391a0 --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/legacy/getDatasourceMetadata.test.ts @@ -0,0 +1,24 @@ +import fetchMock from 'fetch-mock'; +import setupClientForTest from '../setupClientForTest'; +import { getDatasourceMetadata } from '../../../src/api/legacy'; + +describe('getFormData()', () => { + beforeAll(setupClientForTest); + + afterEach(fetchMock.restore); + + it('returns datasource metadata for given datasource key', () => { + const mockData = { + field1: 'abc', + field2: 'def', + }; + + fetchMock.get('glob:*/superset/fetch_datasource_metadata?datasourceKey=1__table', mockData); + + return expect( + getDatasourceMetadata({ + datasourceKey: '1__table', + }), + ).resolves.toEqual(mockData); + }); +}); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/legacy/getFormData.test.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/legacy/getFormData.test.ts new file mode 100644 index 000000000000..867e3fa4887a --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/legacy/getFormData.test.ts @@ -0,0 +1,49 @@ +import fetchMock from 'fetch-mock'; +import setupClientForTest from '../setupClientForTest'; +import { getFormData } from '../../../src/api/legacy'; + +describe('getFormData()', () => { + beforeAll(setupClientForTest); + + afterEach(fetchMock.restore); + + const mockData = { + datasource: '1__table', + viz_type: 'sankey', + slice_id: 1, + url_params: {}, + granularity_sqla: null, + time_grain_sqla: 'P1D', + time_range: 'Last week', + groupby: ['source', 'target'], + metric: 'sum__value', + adhoc_filters: [], + row_limit: 1000, + }; + + it('returns formData for given slice id', () => { + fetchMock.get(`glob:*/api/v1/form_data/?slice_id=1`, mockData); + + return expect( + getFormData({ + sliceId: 1, + }), + ).resolves.toEqual(mockData); + }); + + it('overrides formData when overrideFormData is specified', () => { + fetchMock.get(`glob:*/api/v1/form_data/?slice_id=1`, mockData); + + return expect( + getFormData({ + sliceId: 1, + overrideFormData: { + metric: 'avg__value', + }, + }), + ).resolves.toEqual({ + ...mockData, + metric: 'avg__value', + }); + }); +}); diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/setupClientForTest.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/setupClientForTest.ts new file mode 100644 index 000000000000..62656589952b --- /dev/null +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/setupClientForTest.ts @@ -0,0 +1,11 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import fetchMock from 'fetch-mock'; +import { SupersetClient } from '@superset-ui/connection'; + +const LOGIN_GLOB = 'glob:*superset/csrf_token/*'; + +export default function setupClientForTest() { + fetchMock.get(LOGIN_GLOB, { csrf_token: '1234' }); + SupersetClient.reset(); + SupersetClient.configure().init(); +} diff --git a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/v1/postChartData.test.ts b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/v1/postChartData.test.ts index e10246eb5260..04c9f7957dbf 100644 --- a/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/v1/postChartData.test.ts +++ b/superset-frontend/temporary_superset_ui/superset-ui/packages/superset-ui-query/test/api/v1/postChartData.test.ts @@ -1,14 +1,10 @@ import fetchMock from 'fetch-mock'; -import { SupersetClient } from '@superset-ui/connection'; -import { LOGIN_GLOB } from '../fixtures/constants'; -import { postChartData, buildQueryContext } from '../../../src'; +import { buildQueryContext } from '../../../src'; +import { postChartData } from '../../../src/api/v1'; +import setupClientForTest from '../setupClientForTest'; describe('postChartData()', () => { - beforeAll(() => { - fetchMock.get(LOGIN_GLOB, { csrf_token: '1234' }); - SupersetClient.reset(); - SupersetClient.configure().init(); - }); + beforeAll(setupClientForTest); afterEach(fetchMock.restore);