import React from 'react';
import { renderWithRedux, patientlyWaitFor, fireEvent, act } from 'react-testing-lib-wrapper';
import { Route } from 'react-router-dom';
import ContentViewFilterDetails from '../ContentViewFilterDetails';
import { cvFilterDetailsKey } from '../../../ContentViewsConstants';
import nock, {
nockInstance,
assertNockRequest,
mockAutocomplete,
mockSetting,
} from '../../../../../test-utils/nockWrapper';
import api from '../../../../../services/api';
import cvFilterDetails from './cvPackageFilterDetail.fixtures.json';
import cvPackageFilterRules from './cvPackageFilterRules.fixtures.json';
import cvFilterFixtures from './contentViewFilters.fixtures.json';
import details from '../../../__tests__/mockDetails.fixtures.json';
const cvFiltersPath = api.getApiUrl('/content_view_filters');
const cvFilterDetailsPath = api.getApiUrl('/content_view_filters/2');
const cvFilterEditDeletePath = api.getApiUrl('/content_view_filters/2/rules/2');
const cvPackageFilterRulesPath = api.getApiUrl('/content_view_filters/2/rules');
const cvPackageFilterRuleCreatePath = api.getApiUrl('/content_view_filters/2/rules');
const autocompleteUrl = '/content_view_filters/2/rules/auto_complete_search';
const renderOptions = {
apiNamespace: cvFilterDetailsKey(1, 2),
routerParams: {
initialEntries: [{ pathname: '/content_views/1#/filters/2', hash: '#/filters' }],
initialIndex: 1,
},
};
const withCVRoute = component => {component};
let searchDelayScope;
let autoSearchScope;
beforeEach(() => {
searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 0);
autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing');
});
afterEach(() => {
assertNockRequest(searchDelayScope);
assertNockRequest(autoSearchScope);
nock.cleanAll();
});
test('Can show filter details and package groups on page load', async (done) => {
const { name: cvFilterName } = cvFilterDetails;
const cvFilterScope = nockInstance
.get(cvFilterDetailsPath)
.query(true)
.reply(200, cvFilterDetails);
const cvFiltersScope = nockInstance
.get(cvFiltersPath)
.query(true)
.reply(200, cvFilterFixtures);
const cvPackageFilterRulesScope = nockInstance
.get(cvPackageFilterRulesPath)
.query(true)
.reply(200, cvPackageFilterRules);
const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
const { getByText, queryByText } =
renderWithRedux(withCVRoute(), renderOptions);
// Nothing will show at first, page is loading
expect(queryByText(cvFilterName)).toBeNull();
await patientlyWaitFor(() => {
expect(getByText(cvFilterName)).toBeInTheDocument();
});
assertNockRequest(autocompleteScope);
assertNockRequest(cvFilterScope);
assertNockRequest(cvFiltersScope);
assertNockRequest(cvPackageFilterRulesScope, done);
act(done);
});
test('Can search for package rules in package filter details', async (done) => {
const firstPackageRule = cvPackageFilterRules.results[0];
const lastPackageRule = cvPackageFilterRules.results[1];
const { name: cvFilterName } = cvFilterDetails;
const { name: firstPackageRuleName } = firstPackageRule;
const { name: lastPackageRuleName } = lastPackageRule;
const searchQueryMatcher = actualParams =>
actualParams?.search?.includes(lastPackageRuleName);
const cvFilterScope = nockInstance
.get(cvFilterDetailsPath)
.query(true)
.reply(200, cvFilterDetails);
const cvFiltersScope = nockInstance
.get(cvFiltersPath)
.query(true)
.reply(200, cvFilterFixtures);
const cvPackageFilterRulesScope = nockInstance
.get(cvPackageFilterRulesPath)
.query(true)
.reply(200, cvPackageFilterRules);
const packageRuleSearchScope = nockInstance
.get(cvPackageFilterRulesPath)
.query(searchQueryMatcher)
.reply(200, { results: [lastPackageRule] });
const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
const withSearchScope = mockAutocomplete(nockInstance, autocompleteUrl, searchQueryMatcher);
const { getByText, queryByText, getByLabelText } =
renderWithRedux(withCVRoute(), renderOptions);
// Basic results showing
await patientlyWaitFor(() => {
expect(getByText(cvFilterName)).toBeInTheDocument();
expect(getByText(firstPackageRuleName)).toBeInTheDocument();
});
// Search and only searched result shows
fireEvent.change(getByLabelText(/text input for search/i), { target: { value: lastPackageRuleName } });
await patientlyWaitFor(() => {
expect(getByText(lastPackageRuleName)).toBeInTheDocument();
expect(queryByText(firstPackageRuleName)).not.toBeInTheDocument();
});
assertNockRequest(autocompleteScope);
assertNockRequest(cvFilterScope);
assertNockRequest(cvFiltersScope);
assertNockRequest(cvPackageFilterRulesScope);
assertNockRequest(withSearchScope);
assertNockRequest(packageRuleSearchScope, done);
});
test('Can add package rules to filter in a self-closing modal', async (done) => {
const { name: cvFilterName } = cvFilterDetails;
const cvFiltersScope = nockInstance
.get(cvFiltersPath)
.query(true)
.reply(200, cvFilterFixtures);
const cvFilterDetailsScope = nockInstance
.get(cvFilterDetailsPath)
.query(true)
.reply(200, cvFilterDetails);
const cvPackageFilterRulesScope = nockInstance
.get(cvPackageFilterRulesPath)
.times(2) // One on initial page load and one after rule create
.query(true)
.reply(200, cvPackageFilterRules);
const newFilterRuleDetails = {
architecture: 'noarch',
name: 'elephant',
};
const createdFilterDetails = {
architecture: 'noarch',
content_view_filter_id: 1,
created_at: '2021-08-06 06:12:10 -0400',
id: 3,
name: 'elephant',
updated_at: '2021-08-06 06:12:10 -0400',
};
const createscope = nockInstance
.post(cvPackageFilterRuleCreatePath, newFilterRuleDetails)
.reply(201, createdFilterDetails);
const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
const { getByText, queryByText, getByLabelText } =
renderWithRedux(withCVRoute(), renderOptions);
// Nothing will show at first, page is loading
expect(queryByText(cvFilterName)).toBeNull();
await patientlyWaitFor(() => {
expect(getByText(cvFilterName)).toBeInTheDocument();
expect(getByLabelText('add_rpm_rule')).toBeInTheDocument();
});
getByLabelText('add_rpm_rule').click();
await patientlyWaitFor(() => {
expect(getByLabelText('input_name')).toBeInTheDocument();
expect(getByLabelText('input_architecture')).toBeInTheDocument();
expect(getByLabelText('add_package_filter_rule')).toBeInTheDocument();
});
fireEvent.change(getByLabelText('input_name'), { target: { value: 'elephant' } });
fireEvent.change(getByLabelText('input_architecture'), { target: { value: 'noarch' } });
fireEvent.submit(getByLabelText('add_package_filter_rule'));
await patientlyWaitFor(() => {
expect(queryByText('Add rule')).not.toBeInTheDocument();
});
assertNockRequest(autocompleteScope);
assertNockRequest(cvFiltersScope);
assertNockRequest(cvFilterDetailsScope);
assertNockRequest(cvPackageFilterRulesScope);
assertNockRequest(createscope);
assertNockRequest(cvPackageFilterRulesScope, done);
});
test('Remove rpm filter rule in a self-closing modal', async (done) => {
const { name: cvFilterName } = cvFilterDetails;
const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
const cvFiltersScope = nockInstance
.get(cvFiltersPath)
.query(true)
.reply(200, cvFilterFixtures);
const cvFilterDetailsScope = nockInstance
.get(cvFilterDetailsPath)
.query(true)
.reply(200, cvFilterDetails);
const cvPackageFilterRulesScope = nockInstance
.get(cvPackageFilterRulesPath)
.times(2) // One on initial page load and one after rule create
.query(true)
.reply(200, cvPackageFilterRules);
const removeScope = nockInstance
.delete(cvFilterEditDeletePath)
.reply(201, {});
const { getByText, queryByText, getAllByLabelText } =
renderWithRedux(withCVRoute(), renderOptions);
// Nothing will show at first, page is loading
expect(queryByText(cvFilterName)).toBeNull();
await patientlyWaitFor(() => {
expect(getByText(cvFilterName)).toBeInTheDocument();
expect(getAllByLabelText('Actions')[0]).toBeInTheDocument();
});
getAllByLabelText('Actions')[0].click();
await patientlyWaitFor(() => {
expect(getByText('Remove')).toBeInTheDocument();
});
getByText('Remove').click();
assertNockRequest(autocompleteScope);
assertNockRequest(cvFiltersScope);
assertNockRequest(cvFilterDetailsScope);
assertNockRequest(cvPackageFilterRulesScope);
assertNockRequest(removeScope);
assertNockRequest(cvPackageFilterRulesScope, done);
});
test('Edit rpm filter rule in a self-closing modal', async (done) => {
const { name: cvFilterName } = cvFilterDetails;
const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
const cvFiltersScope = nockInstance
.get(cvFiltersPath)
.query(true)
.reply(200, cvFilterFixtures);
const cvFilterDetailsScope = nockInstance
.get(cvFilterDetailsPath)
.query(true)
.reply(200, cvFilterDetails);
const cvPackageFilterRulesScope = nockInstance
.get(cvPackageFilterRulesPath)
.times(2) // One on initial page load and one after rule create
.query(true)
.reply(200, cvPackageFilterRules);
const editScope = nockInstance
.put(cvFilterEditDeletePath)
.query(true)
.reply(201, {});
const {
getByText, queryByText, getAllByLabelText, getByLabelText,
} =
renderWithRedux(withCVRoute(), renderOptions);
// Nothing will show at first, page is loading
expect(queryByText(cvFilterName)).toBeNull();
await patientlyWaitFor(() => {
expect(getByText(cvFilterName)).toBeInTheDocument();
expect(getAllByLabelText('Actions')[0]).toBeInTheDocument();
});
getAllByLabelText('Actions')[0].click();
await patientlyWaitFor(() => {
expect(getByText('Edit')).toBeInTheDocument();
});
getByText('Edit').click();
await patientlyWaitFor(() => {
expect(getByText('Edit RPM rule')).toBeInTheDocument();
fireEvent.submit(getByLabelText('add_package_filter_rule'));
});
await patientlyWaitFor(() => {
expect(getByText(cvFilterName)).toBeInTheDocument();
});
assertNockRequest(autocompleteScope);
assertNockRequest(cvFiltersScope);
assertNockRequest(cvFilterDetailsScope);
assertNockRequest(cvPackageFilterRulesScope);
assertNockRequest(editScope, done);
});