You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by yj...@apache.org on 2020/10/29 05:45:00 UTC
[incubator-superset] 17/33: update test part 1
This is an automated email from the ASF dual-hosted git repository.
yjc pushed a commit to branch home-screen-mvp
in repository https://gitbox.apache.org/repos/asf/incubator-superset.git
commit aa704b094902dc64c9fed338b9b93274a735f344
Author: Phillip Kelley-Dotson <pk...@yahoo.com>
AuthorDate: Mon Oct 19 13:54:32 2020 -0700
update test part 1
---
.../views/CRUD/welcome/ActivityTable_spec.tsx | 4 --
.../views/CRUD/welcome/DashboardTable_spec.tsx | 15 ++---
.../{SavedQueries_spec.tsx => EmptyState_spec.tsx} | 36 ++++-------
.../views/CRUD/welcome/SavedQueries_spec.tsx | 72 +++++++++++++++++++---
.../src/views/CRUD/chart/ChartList.tsx | 4 +-
superset-frontend/src/views/CRUD/types.ts | 2 +-
.../src/views/CRUD/welcome/ActivityTable.tsx | 1 +
.../src/views/CRUD/welcome/ChartTable.tsx | 9 ---
.../src/views/CRUD/welcome/EmptyState.tsx | 17 +++--
.../src/views/CRUD/welcome/SavedQueries.tsx | 16 ++---
10 files changed, 104 insertions(+), 72 deletions(-)
diff --git a/superset-frontend/spec/javascripts/views/CRUD/welcome/ActivityTable_spec.tsx b/superset-frontend/spec/javascripts/views/CRUD/welcome/ActivityTable_spec.tsx
index 2f54d58..19fb397 100644
--- a/superset-frontend/spec/javascripts/views/CRUD/welcome/ActivityTable_spec.tsx
+++ b/superset-frontend/spec/javascripts/views/CRUD/welcome/ActivityTable_spec.tsx
@@ -79,10 +79,6 @@ describe('ActivityTable', () => {
expect(wrapper.find(ActivityTable)).toExist();
});
- it('renders a EmptyState', () => {
- console.log('wrapper', wrapper.debug())
- });
-
it('calls batch method and renders ListViewCArd', () => {
const chartCall = fetchMock.calls(/chart\/\?q/);
const dashboardCall = fetchMock.calls(/dashboard\/\?q/);
diff --git a/superset-frontend/spec/javascripts/views/CRUD/welcome/DashboardTable_spec.tsx b/superset-frontend/spec/javascripts/views/CRUD/welcome/DashboardTable_spec.tsx
index dd1e92a..013d3b3 100644
--- a/superset-frontend/spec/javascripts/views/CRUD/welcome/DashboardTable_spec.tsx
+++ b/superset-frontend/spec/javascripts/views/CRUD/welcome/DashboardTable_spec.tsx
@@ -44,7 +44,6 @@ const mockDashboards = [
];
fetchMock.get(dashboardsEndpoint, { result: mockDashboards });
-//fetchMock.get(dashboardsEndpointNoData, { result: [] });
fetchMock.get(chartsInfoEndpoint, {
permissions: ['can_list', 'can_edit', 'can_delete'],
});
@@ -59,8 +58,6 @@ describe('DashboardTable', () => {
const wrapper = mount(<DashboardTable {...dashboardProps} />, {
context: { store },
});
- // console.log('wrapper', wrapper.debug())
- // beforeEach(fetchMock.resetHistory);
beforeAll(async () => {
await waitForComponentToPaint(wrapper);
@@ -68,13 +65,12 @@ describe('DashboardTable', () => {
it('renders', () => {
expect(wrapper.find(DashboardTable)).toExist();
- console.log('wrapper', wrapper.debug())
});
it('render a submenu with clickable tabs and buttons', async () => {
expect(wrapper.find(SubMenu)).toExist();
expect(wrapper.find('MenuItem')).toHaveLength(2);
- expect(wrapper.find('Button')).toHaveLength(2);
+ expect(wrapper.find('Button')).toHaveLength(4);
act(() => {
wrapper.find('MenuItem').at(1).simulate('click');
});
@@ -87,8 +83,9 @@ describe('DashboardTable', () => {
wrapper.setState({ dashboards: mockDashboards });
expect(wrapper.find(DashboardCard)).toExist();
});
- /*it('display EmptyState if there is no data', ()=>{
- (const wrapper = mount(<DashboardTable {...dashboardProps} />)
- console.log('wrapper', wrapper);
- });*/
+
+ it('display EmptyState if there is no data', () => {
+ fetchMock.resetHistory();
+ expect(wrapper.find('EmptyState')).toExist();
+ });
});
diff --git a/superset-frontend/spec/javascripts/views/CRUD/welcome/SavedQueries_spec.tsx b/superset-frontend/spec/javascripts/views/CRUD/welcome/EmptyState_spec.tsx
similarity index 57%
copy from superset-frontend/spec/javascripts/views/CRUD/welcome/SavedQueries_spec.tsx
copy to superset-frontend/spec/javascripts/views/CRUD/welcome/EmptyState_spec.tsx
index fd367a1..b6e5175 100644
--- a/superset-frontend/spec/javascripts/views/CRUD/welcome/SavedQueries_spec.tsx
+++ b/superset-frontend/spec/javascripts/views/CRUD/welcome/EmptyState_spec.tsx
@@ -17,30 +17,20 @@
* under the License.
*/
import React from 'react';
-import SavedQueries from 'src/views/CRUD/welcome/SavedQueries';
-import { mount } from 'enzyme';
-import thunk from 'redux-thunk';
+import { styledMount as mount } from 'spec/helpers/theming';
+import { act } from 'react-dom/test-utils';
-import configureStore from 'redux-mock-store';
-// store needed for withToasts(DashboardTable)
-const mockStore = configureStore([thunk]);
-const store = mockStore({});
+import waitForComponentToPaint from 'spec/helpers/waitForComponentToPaint';
+import EmptyState from 'src/views/CRUD/welcome/EmptyState';
-describe('SavedQueries', () => {
- const savedQueryProps = {
- user: {
- userId: '1',
- },
- activityFilter: 'Edit',
- };
-
- const wrapper = mount(<SavedQueries {...savedQueryProps} />);
-
- it('is valid', () => {
- expect(React.isValidElement(<SavedQueries />)).toBe(true);
+describe('EmptyState', () => {
+ it('it renders an favorite dashboard empty state', () => {
+ const props = {
+ tab: 'Favorite',
+ tableName: 'DASHBOARDS',
+ };
+ const wrapper = mount(<EmptyState {...props} />);
+ expect(wrapper).toExist();
+ console.log('wrapper', wrapper.debug());
});
- it('takes in props', () => {
-
- // expect()
- });
});
diff --git a/superset-frontend/spec/javascripts/views/CRUD/welcome/SavedQueries_spec.tsx b/superset-frontend/spec/javascripts/views/CRUD/welcome/SavedQueries_spec.tsx
index fd367a1..28173f2 100644
--- a/superset-frontend/spec/javascripts/views/CRUD/welcome/SavedQueries_spec.tsx
+++ b/superset-frontend/spec/javascripts/views/CRUD/welcome/SavedQueries_spec.tsx
@@ -17,30 +17,84 @@
* under the License.
*/
import React from 'react';
-import SavedQueries from 'src/views/CRUD/welcome/SavedQueries';
-import { mount } from 'enzyme';
import thunk from 'redux-thunk';
-
+import { styledMount as mount } from 'spec/helpers/theming';
+import fetchMock from 'fetch-mock';
import configureStore from 'redux-mock-store';
+import { act } from 'react-dom/test-utils';
+
+import waitForComponentToPaint from 'spec/helpers/waitForComponentToPaint';
+import SubMenu from 'src/components/Menu/SubMenu';
+import SavedQueries from 'src/views/CRUD/welcome/SavedQueries';
+
// store needed for withToasts(DashboardTable)
const mockStore = configureStore([thunk]);
const store = mockStore({});
+const queriesEndpoint = 'glob:*/api/v1/saved_queries/?*';
+
+const mockqueries = [...new Array(3)].map((_, i) => ({
+ created_by: {
+ id: i,
+ first_name: `user`,
+ last_name: `${i}`,
+ },
+ created_on: `${i}-2020`,
+ database: {
+ database_name: `db ${i}`,
+ id: i,
+ },
+ changed_on_delta_humanized: '1 day ago',
+ db_id: i,
+ description: `SQL for ${i}`,
+ id: i,
+ label: `query ${i}`,
+ schema: 'public',
+ sql: `SELECT ${i} FROM table`,
+ sql_tables: [
+ {
+ catalog: null,
+ schema: null,
+ table: `${i}`,
+ },
+ ],
+}));
+
+fetchMock.get(queriesEndpoint, {
+ result: mockqueries,
+});
+
describe('SavedQueries', () => {
const savedQueryProps = {
user: {
userId: '1',
},
- activityFilter: 'Edit',
};
- const wrapper = mount(<SavedQueries {...savedQueryProps} />);
+ const wrapper = mount(<SavedQueries {...savedQueryProps} />, {
+ context: { store },
+ });
+ beforeAll(async () => {
+ await waitForComponentToPaint(wrapper);
+ });
it('is valid', () => {
- expect(React.isValidElement(<SavedQueries />)).toBe(true);
+ expect(wrapper.find(SavedQueries)).toExist();
});
- it('takes in props', () => {
- // expect()
- });
+ it('it renders a submenu with clickable tabls and buttons', async () => {
+ expect(wrapper.find(SubMenu)).toExist();
+ expect(wrapper.find('MenuItem')).toHaveLength(2);
+ expect(wrapper.find('Button')).toHaveLength(4);
+ act(() => {
+ wrapper.find('MenuItem').at(1).simulate('click');
+ });
+ await waitForComponentToPaint(wrapper);
+ expect(fetchMock.calls(/chart\/\?q/)).toHaveLength(1);
+ });
+
+ it('fetches queries favorites and renders chart cards', () => {
+ expect(fetchMock.calls(/chart\/\?q/)).toHaveLength(1);
+ expect(wrapper.find('ListViewCard')).toExist();
+ });
});
diff --git a/superset-frontend/src/views/CRUD/chart/ChartList.tsx b/superset-frontend/src/views/CRUD/chart/ChartList.tsx
index ec0722e..8a0b8b7 100644
--- a/superset-frontend/src/views/CRUD/chart/ChartList.tsx
+++ b/superset-frontend/src/views/CRUD/chart/ChartList.tsx
@@ -17,7 +17,7 @@
* under the License.
*/
import { SupersetClient, getChartMetadataRegistry, t } from '@superset-ui/core';
-import React, { useState, useMemo } from 'react';
+import React, { useMemo } from 'react';
import rison from 'rison';
import { uniqBy } from 'lodash';
import { isFeatureEnabled, FeatureFlag } from 'src/featureFlags';
@@ -416,7 +416,7 @@ function ChartList(props: ChartListProps) {
openChartEditModal={openChartEditModal}
bulkSelectEnabled={bulkSelectEnabled}
addDangerToast={props.addDangerToast}
- addSuccessToast={addSuccessToast}
+ addSuccessToast={props.addSuccessToast}
refreshData={refreshData}
loading={loading}
/>
diff --git a/superset-frontend/src/views/CRUD/types.ts b/superset-frontend/src/views/CRUD/types.ts
index 1070f57..0946247 100644
--- a/superset-frontend/src/views/CRUD/types.ts
+++ b/superset-frontend/src/views/CRUD/types.ts
@@ -68,4 +68,4 @@ export type SavedQueryObject = {
schema: string;
sql: string;
sql_tables: Array<{ catalog?: string; schema: string; table: string }>;
-};
\ No newline at end of file
+};
diff --git a/superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx b/superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx
index 02d2cbc..c9f0883 100644
--- a/superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx
+++ b/superset-frontend/src/views/CRUD/welcome/ActivityTable.tsx
@@ -143,6 +143,7 @@ export default function ActivityTable({ user }: ActivityProps) {
Created: [...r.createdByChart, ...r.createdByDash],
Edited: [...r.editedChart, ...r.editedDash],
};
+ console.log('r.viewed', r)
if (r.viewed) {
const filtered = reject(r.viewed, ['item_url', null]).map(r => r);
data.Viewed = filtered;
diff --git a/superset-frontend/src/views/CRUD/welcome/ChartTable.tsx b/superset-frontend/src/views/CRUD/welcome/ChartTable.tsx
index 99d51c0..c2784d1 100644
--- a/superset-frontend/src/views/CRUD/welcome/ChartTable.tsx
+++ b/superset-frontend/src/views/CRUD/welcome/ChartTable.tsx
@@ -77,15 +77,6 @@ function ChartTable({
value: true,
});
}
- // Do we need search?
- /* filters.concat([
- {
- id: 'dashboard_title',
- operator: 'ct',
- value: search,
- },
- ]);
- */
return filters;
};
diff --git a/superset-frontend/src/views/CRUD/welcome/EmptyState.tsx b/superset-frontend/src/views/CRUD/welcome/EmptyState.tsx
index e1c2936..fe06a18 100644
--- a/superset-frontend/src/views/CRUD/welcome/EmptyState.tsx
+++ b/superset-frontend/src/views/CRUD/welcome/EmptyState.tsx
@@ -32,7 +32,7 @@ const Container = styled.div`
flex-direction: column;
justify-content: center;
img {
- width: 87px;
+ width: 114px;
display: block;
margin: 0 auto;
}
@@ -73,13 +73,19 @@ export default function EmptyState({ tableName, tab }: EmptyStateProps) {
}}
>
<IconContainer>
- <Icon name="plus-small" /> {tableName}
+ <Icon name="plus-small" />{' '}
+ {tableName === 'SAVED_QUERIES'
+ ? 'SQL LAB QUERY'
+ : tableName
+ .split('')
+ .slice(0, tableName.length - 1)
+ .join('')}{' '}
</IconContainer>
</Button>
</div>
);
const span = (
- <div>
+ <div className="no-recents">
Recently viewed charts, dashboards, and saved queries will appear here
</div>
);
@@ -97,14 +103,15 @@ export default function EmptyState({ tableName, tab }: EmptyStateProps) {
<Container>
<img src="/static/assets/images/star-circle.png" alt="star.png" />
<div>
- <div>You don't have any favorites yets!</div>
+ <div className="no-favorites">You don't have any favorites yet!</div>
<Button
buttonStyle="primary"
onClick={() => {
window.location = favRedirects[tableName];
}}
>
- SEE ALL {tableName}
+ SEE ALL{' '}
+ {tableName === 'SAVED_QUERIES' ? 'SQL LAB QUERIES' : tableName }
</Button>
</div>
</Container>
diff --git a/superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx b/superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx
index 333d394..5a49ee5 100644
--- a/superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx
+++ b/superset-frontend/src/views/CRUD/welcome/SavedQueries.tsx
@@ -17,7 +17,7 @@
* under the License.
*/
import React, { useEffect, useState } from 'react';
-import { t, styled, SupersetClient } from '@superset-ui/core';
+import { t, SupersetClient } from '@superset-ui/core';
import withToasts from 'src/messageToasts/enhancers/withToasts';
import { Dropdown, Menu } from 'src/common/components';
import { useListViewResource, copyQueryLink } from 'src/views/CRUD/hooks';
@@ -41,7 +41,6 @@ interface Query {
rows: string;
description: string;
end_time: string;
- addDangerToast: () => void;
label: string;
}
@@ -50,15 +49,10 @@ interface SavedQueriesProps {
userId: string | number;
};
queryFilter: string;
+ addDangerToast: (arg0: string) => void;
+ addSuccessToast: (arg0: string) => void;
}
-const NoData = styled.div`
- .create-your-query {
- display: block;
- margin: 0 auto;
- }
-`;
-
const SavedQueries = ({
user,
addDangerToast,
@@ -139,7 +133,9 @@ const SavedQueries = ({
)}
<Menu.Item
onClick={() => copyQueryLink(query.id, addDangerToast, addSuccessToast)}
- >Share</Menu.Item>
+ >
+ Share
+ </Menu.Item>
{canDelete && (
<Menu.Item
onClick={() => {