From 50c5dcbb0aaaa4bfe363a606be30ec70e5b40f91 Mon Sep 17 00:00:00 2001 From: simcha90 <56388545+simcha90@users.noreply.github.com> Date: Mon, 31 May 2021 09:02:46 +0300 Subject: [PATCH] test(native-filters): add test for Select filter (#14919) * fix:fix get permission function * test: tests for select filter --- .../Select/SelectFilterPlugin.test.tsx | 213 ++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 superset-frontend/src/filters/components/Select/SelectFilterPlugin.test.tsx diff --git a/superset-frontend/src/filters/components/Select/SelectFilterPlugin.test.tsx b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.test.tsx new file mode 100644 index 0000000000..c42c1ce3e1 --- /dev/null +++ b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.test.tsx @@ -0,0 +1,213 @@ +/** + * 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 userEvent from '@testing-library/user-event'; +import { AppSection } from '@superset-ui/core'; +import React from 'react'; +import { render, screen } from 'spec/helpers/testing-library'; +import SelectFilterPlugin from './SelectFilterPlugin'; +import transformProps from './transformProps'; + +const selectMultipleProps = { + formData: { + sortAscending: true, + multiSelect: true, + enableEmptyFilter: true, + defaultToFirstItem: false, + inverseSelection: false, + searchAllOptions: true, + datasource: '3__table', + groupby: ['gender'], + adhocFilters: [], + extraFilters: [], + extraFormData: {}, + granularitySqla: 'ds', + metrics: ['count'], + rowLimit: 1000, + showSearch: true, + defaultValue: ['boy'], + timeRangeEndpoints: ['inclusive', 'exclusive'], + urlParams: {}, + vizType: 'filter_select', + inputRef: { current: null }, + }, + height: 20, + hooks: {}, + ownState: { coltypeMap: { gender: 1 }, search: null }, + filterState: { value: ['boy'] }, + queriesData: [ + { + rowcount: 2, + colnames: ['gender'], + coltypes: [1], + data: [{ gender: 'boy' }, { gender: 'girl' }], + applied_filters: [{ column: 'gender' }], + rejected_filters: [], + }, + ], + width: 220, + behaviors: ['NATIVE_FILTER'], + isRefreshing: false, + appSection: AppSection.DASHBOARD, +}; + +describe('SelectFilterPlugin', () => { + const setDataMask = jest.fn(); + const getWrapper = (props = {}) => + render( + // @ts-ignore + , + ); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('Add multiple values with first render', () => { + getWrapper(); + expect(setDataMask).toHaveBeenCalledWith({ + filterState: { + value: ['boy'], + }, + ownState: { + coltypeMap: { + gender: 1, + }, + }, + }); + expect(setDataMask).toHaveBeenCalledWith({ + extraFormData: { + filters: [ + { + col: 'gender', + op: 'IN', + val: ['boy'], + }, + ], + }, + filterState: { + label: 'boy', + value: ['boy'], + }, + ownState: { + coltypeMap: { + gender: 1, + }, + }, + }); + userEvent.click(screen.getByRole('combobox')); + userEvent.click(screen.getByTitle('girl')); + expect(setDataMask).toHaveBeenCalledWith({ + extraFormData: { + filters: [ + { + col: 'gender', + op: 'IN', + val: ['boy', 'girl'], + }, + ], + }, + filterState: { + label: 'boy, girl', + value: ['boy', 'girl'], + }, + ownState: { + coltypeMap: { + gender: 1, + }, + search: null, + }, + }); + }); + + it('Remove multiple values when required', () => { + getWrapper(); + userEvent.click(document.querySelector('[data-icon="close"]')!); + expect(setDataMask).toHaveBeenCalledWith({ + extraFormData: { + adhoc_filters: [ + { + clause: 'WHERE', + expressionType: 'SQL', + sqlExpression: '1 = 0', + }, + ], + }, + filterState: { + label: '', + value: null, + }, + ownState: { + coltypeMap: { + gender: 1, + }, + }, + }); + }); + + it('Remove multiple values when not required', () => { + getWrapper({ enableEmptyFilter: false }); + userEvent.click(document.querySelector('[data-icon="close"]')!); + expect(setDataMask).toHaveBeenCalledWith({ + extraFormData: {}, + filterState: { + label: '', + value: null, + }, + ownState: { + coltypeMap: { + gender: 1, + }, + }, + }); + }); + + it('Select single values with inverse', () => { + getWrapper({ multiSelect: false, inverseSelection: true }); + userEvent.click(screen.getByRole('combobox')); + userEvent.click(screen.getByTitle('girl')); + expect(setDataMask).toHaveBeenCalledWith({ + extraFormData: { + filters: [ + { + col: 'gender', + op: 'NOT IN', + val: ['girl'], + }, + ], + }, + filterState: { + label: 'girl (excluded)', + value: ['girl'], + }, + ownState: { + coltypeMap: { + gender: 1, + }, + search: null, + }, + }); + }); +});