blob: c871a6a7be1237fedd27e6a2cde14cace3e50398 [file] [log] [blame]
/**
* 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 { styledMount as mount } from 'spec/helpers/theming';
import { act } from 'react-dom/test-utils';
import { ReactWrapper } from 'enzyme';
import { Provider } from 'react-redux';
import { FilterConfigModal } from 'src/dashboard/components/nativeFilters/FilterConfigModal/FilterConfigModal';
import Alert from 'src/components/Alert';
import waitForComponentToPaint from 'spec/helpers/waitForComponentToPaint';
import { mockStore } from 'spec/fixtures/mockStore';
Object.defineProperty(window, 'matchMedia', {
writable: true,
value: jest.fn().mockImplementation(query => ({
matches: false,
media: query,
onchange: null,
addListener: jest.fn(), // deprecated
removeListener: jest.fn(), // deprecated
addEventListener: jest.fn(),
removeEventListener: jest.fn(),
dispatchEvent: jest.fn(),
})),
});
jest.mock('@superset-ui/core', () => ({
// @ts-ignore
...jest.requireActual('@superset-ui/core'),
getChartMetadataRegistry: () => ({
items: {
filter_select: {
value: {
datasourceCount: 1,
behaviors: ['NATIVE_FILTER'],
},
},
},
}),
}));
describe('FiltersConfigModal', () => {
const mockedProps = {
isOpen: true,
initialFilterId: 'DefaultsID',
createNewOnOpen: true,
onCancel: jest.fn(),
save: jest.fn(),
};
function setup(overridesProps?: any) {
return mount(
<Provider store={mockStore}>
<FilterConfigModal {...mockedProps} {...overridesProps} />
</Provider>,
);
}
it('should be a valid react element', () => {
expect(React.isValidElement(<FilterConfigModal {...mockedProps} />)).toBe(
true,
);
});
it('the form validates required fields', async () => {
const onSave = jest.fn();
const wrapper = setup({ save: onSave });
act(() => {
wrapper
.find('input')
.first()
.simulate('change', { target: { value: 'test name' } });
wrapper.find('.ant-modal-footer button').at(1).simulate('click');
});
await waitForComponentToPaint(wrapper);
expect(onSave.mock.calls).toHaveLength(0);
});
describe('when click cancel', () => {
let onCancel: jest.Mock;
let wrapper: ReactWrapper;
beforeEach(() => {
onCancel = jest.fn();
wrapper = setup({ onCancel, createNewOnOpen: false });
});
async function clickCancel() {
act(() => {
wrapper.find('.ant-modal-footer button').at(0).simulate('click');
});
await waitForComponentToPaint(wrapper);
}
function addFilter() {
act(() => {
wrapper.find('button[aria-label="Add tab"]').at(0).simulate('click');
});
}
it('does not show alert when there is no unsaved filters', async () => {
await clickCancel();
expect(onCancel.mock.calls).toHaveLength(1);
});
it('shows correct alert message for an unsaved filter', async () => {
addFilter();
await clickCancel();
expect(onCancel.mock.calls).toHaveLength(0);
expect(wrapper.find(Alert).text()).toContain(
'Are you sure you want to cancel? "New filter" will not be saved.',
);
});
it('shows correct alert message for 2 unsaved filters', async () => {
addFilter();
addFilter();
await clickCancel();
expect(onCancel.mock.calls).toHaveLength(0);
expect(wrapper.find(Alert).text()).toContain(
'Are you sure you want to cancel? "New filter" and "New filter" will not be saved.',
);
});
});
});