This is an automated email from the ASF dual-hosted git repository.

villebro pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git


The following commit(s) were added to refs/heads/master by this push:
     new da63b4b  test(native-filters): scoping tree in native filters modal 
(#12655)
da63b4b is described below

commit da63b4b0eaef621201999f3f33eeb7b7d1d7e88b
Author: simchaNielsen <[email protected]>
AuthorDate: Tue Jan 26 14:23:07 2021 +0200

    test(native-filters): scoping tree in native filters modal (#12655)
    
    * test: add test to scoping tree in native filters
    
    * test: rename mocks
---
 .../spec/fixtures/mockDashboardLayout.js           |  43 ++++++++
 superset-frontend/spec/fixtures/mockStore.js       |  17 +++-
 .../components/nativeFilters/FilterScope_spec.tsx  | 110 +++++++++++++++++++++
 .../components/nativeFilters/ScopingTree_spec.tsx  |  61 ------------
 4 files changed, 169 insertions(+), 62 deletions(-)

diff --git a/superset-frontend/spec/fixtures/mockDashboardLayout.js 
b/superset-frontend/spec/fixtures/mockDashboardLayout.js
index 6e28626..bd1f4d1 100644
--- a/superset-frontend/spec/fixtures/mockDashboardLayout.js
+++ b/superset-frontend/spec/fixtures/mockDashboardLayout.js
@@ -189,6 +189,49 @@ export const dashboardLayoutWithTabs = {
   future: [],
 };
 
+export const dashboardLayoutWithChartsInTabsAndRoot = {
+  ...dashboardLayoutWithTabs,
+  present: {
+    ...dashboardLayoutWithTabs.present,
+    [DASHBOARD_ROOT_ID]: {
+      type: DASHBOARD_ROOT_TYPE,
+      id: DASHBOARD_ROOT_ID,
+      children: ['TABS_ID', 'ROW_ID3'],
+    },
+
+    ROW_ID3: {
+      ...newComponentFactory(ROW_TYPE),
+      id: 'ROW_ID3',
+      children: ['CHART_ID3'],
+      parents: ['ROOT_ID'],
+    },
+
+    CHART_ID2: {
+      ...newComponentFactory(CHART_TYPE),
+      id: 'CHART_ID2',
+      parents: ['ROOT_ID', 'TABS_ID', 'TAB_ID2', 'ROW_ID2'],
+      meta: {
+        chartId: 20,
+        width: 3,
+        height: 10,
+        chartName: 'Mock chart name 2',
+      },
+    },
+
+    CHART_ID3: {
+      ...newComponentFactory(CHART_TYPE),
+      id: 'CHART_ID3',
+      parents: ['ROOT_ID', 'ROW_ID3'],
+      meta: {
+        chartId: 19,
+        width: 3,
+        height: 10,
+        chartName: 'Mock chart name',
+      },
+    },
+  },
+};
+
 export const filterComponent = {
   ...newComponentFactory(CHART_TYPE),
   id: 'CHART-rwDfbGqeEn',
diff --git a/superset-frontend/spec/fixtures/mockStore.js 
b/superset-frontend/spec/fixtures/mockStore.js
index faf0833..f4aad15 100644
--- a/superset-frontend/spec/fixtures/mockStore.js
+++ b/superset-frontend/spec/fixtures/mockStore.js
@@ -22,7 +22,10 @@ import thunk from 'redux-thunk';
 import rootReducer from 'src/dashboard/reducers/index';
 
 import mockState from './mockState';
-import { dashboardLayoutWithTabs } from './mockDashboardLayout';
+import {
+  dashboardLayoutWithTabs,
+  dashboardLayoutWithChartsInTabsAndRoot,
+} from './mockDashboardLayout';
 import { sliceId } from './mockChartQueries';
 import { dashboardFilters } from './mockDashboardFilters';
 import { nativeFilters } from './mockNativeFilters';
@@ -47,7 +50,19 @@ export const getMockStoreWithTabs = () =>
     compose(applyMiddleware(thunk)),
   );
 
+export const getMockStoreWithChartsInTabsAndRoot = () =>
+  createStore(
+    rootReducer,
+    {
+      ...mockState,
+      dashboardLayout: dashboardLayoutWithChartsInTabsAndRoot,
+      dashboardFilters: {},
+    },
+    compose(applyMiddleware(thunk)),
+  );
+
 export const mockStoreWithTabs = getMockStoreWithTabs();
+export const mockStoreWithChartsInTabsAndRoot = 
getMockStoreWithChartsInTabsAndRoot();
 
 export const sliceIdWithAppliedFilter = sliceId + 1;
 export const sliceIdWithRejectedFilter = sliceId + 2;
diff --git 
a/superset-frontend/spec/javascripts/dashboard/components/nativeFilters/FilterScope_spec.tsx
 
b/superset-frontend/spec/javascripts/dashboard/components/nativeFilters/FilterScope_spec.tsx
new file mode 100644
index 0000000..2d3eb3e
--- /dev/null
+++ 
b/superset-frontend/spec/javascripts/dashboard/components/nativeFilters/FilterScope_spec.tsx
@@ -0,0 +1,110 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+import { Provider } from 'react-redux';
+import { render, screen, fireEvent } from 'spec/helpers/testing-library';
+import { mockStoreWithChartsInTabsAndRoot } from 'spec/fixtures/mockStore';
+import { Form, FormInstance } from 'src/common/components';
+import { NativeFiltersForm } from 
'src/dashboard/components/nativeFilters/types';
+import FilterConfigForm from 
'src/dashboard/components/nativeFilters/FilterConfigForm';
+
+describe('FilterScope', () => {
+  const save = jest.fn();
+  let form: FormInstance<NativeFiltersForm>;
+  const mockedProps = {
+    filterId: 'DefaultFilterId',
+    restore: jest.fn(),
+    parentFilters: [],
+    save,
+  };
+
+  const MockModal = ({ scope }: { scope: object | undefined }) => {
+    const [newForm] = Form.useForm<NativeFiltersForm>();
+    form = newForm;
+    if (scope) {
+      form.setFieldsValue({
+        filters: {
+          [mockedProps.filterId]: {
+            scope,
+          },
+        },
+      });
+    }
+    return (
+      <Provider store={mockStoreWithChartsInTabsAndRoot}>
+        <Form form={form}>
+          <FilterConfigForm form={form} {...mockedProps} />
+        </Form>
+      </Provider>
+    );
+  };
+
+  const getWrapper = (scope?: object) => {
+    render(<MockModal scope={scope} />);
+  };
+
+  const getTreeSwitcher = (order = 0) =>
+    document.querySelectorAll('.ant-tree-switcher')[order];
+
+  it('renders "apply to all" filter scope', () => {
+    getWrapper();
+    expect(screen.queryByRole('tree')).toBe(null);
+  });
+
+  it('select tree values with 1 excluded', () => {
+    getWrapper();
+    fireEvent.click(screen.getByLabelText('Apply to specific panels'));
+    expect(screen.getByRole('tree')).not.toBe(null);
+    fireEvent.click(getTreeSwitcher(2));
+    fireEvent.click(screen.getByText('CHART_ID2'));
+    
expect(form.getFieldValue('filters')?.[mockedProps.filterId].scope).toEqual(
+      {
+        excluded: [20],
+        rootPath: ['ROOT_ID'],
+      },
+    );
+  });
+
+  it('select 1 value only', () => {
+    getWrapper();
+    fireEvent.click(screen.getByLabelText('Apply to specific panels'));
+    expect(screen.getByRole('tree')).not.toBe(null);
+    fireEvent.click(getTreeSwitcher(2));
+    fireEvent.click(screen.getByText('CHART_ID2'));
+    fireEvent.click(screen.getByText('tab1'));
+    
expect(form.getFieldValue('filters')?.[mockedProps.filterId].scope).toEqual(
+      {
+        excluded: [18, 20],
+        rootPath: ['ROOT_ID'],
+      },
+    );
+  });
+
+  it('correct init tree with values', () => {
+    getWrapper({
+      rootPath: ['TAB_ID'],
+      excluded: [],
+    });
+    fireEvent.click(screen.getByLabelText('Apply to specific panels'));
+    expect(screen.getByRole('tree')).not.toBe(null);
+    
expect(document.querySelectorAll('.ant-tree-checkbox-checked').length).toBe(
+      1,
+    );
+  });
+});
diff --git 
a/superset-frontend/spec/javascripts/dashboard/components/nativeFilters/ScopingTree_spec.tsx
 
b/superset-frontend/spec/javascripts/dashboard/components/nativeFilters/ScopingTree_spec.tsx
deleted file mode 100644
index e263058..0000000
--- 
a/superset-frontend/spec/javascripts/dashboard/components/nativeFilters/ScopingTree_spec.tsx
+++ /dev/null
@@ -1,61 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-import React from 'react';
-import { Provider } from 'react-redux';
-import ScopingTree from 'src/dashboard/components/nativeFilters/ScopingTree';
-import { styledMount as mount } from 'spec/helpers/theming';
-import { mockStore } from 'spec/fixtures/mockStore';
-import { FormInstance } from 'src/common/components';
-import { NativeFiltersForm } from 
'src/dashboard/components/nativeFilters/types';
-import { getDefaultScopeValue } from 
'src/dashboard/components/nativeFilters/FilterScope';
-
-describe('ScopingTree', () => {
-  const filterId = '1';
-  const form = {
-    getFieldValue: () => ({
-      [filterId]: {
-        scope: getDefaultScopeValue(),
-      },
-    }),
-  };
-  const wrapper = mount(
-    <Provider store={mockStore}>
-      <ScopingTree
-        filterId={filterId}
-        initialScope={getDefaultScopeValue()}
-        form={(form as unknown) as FormInstance<NativeFiltersForm>}
-      />
-    </Provider>,
-  );
-  it('is valid', () => {
-    expect(
-      React.isValidElement(
-        <ScopingTree
-          filterId={filterId}
-          initialScope={getDefaultScopeValue()}
-          form={(form as unknown) as FormInstance<NativeFiltersForm>}
-        />,
-      ),
-    ).toBe(true);
-  });
-
-  it('renders a tree', () => {
-    expect(wrapper.find('TreeNode')).toExist();
-  });
-});

Reply via email to