/* eslint-disable no-useless-escape */ import React from 'react'; import { renderWithRedux, patientlyWaitFor, fireEvent } from 'react-testing-lib-wrapper'; import api, { foremanApi } from '../../../../services/api'; import nock, { nockInstance, assertNockRequest, mockAutocomplete, mockSetting, mockForemanAutocomplete, } from '../../../../test-utils/nockWrapper'; import CONTENT_VIEWS_KEY from '../../ContentViewsConstants'; import ContentViewsPage from '../../ContentViewsPage.js'; import cvIndexData from './CvData.fixtures.json'; import environmentPathsData from './envPathData.fixtures.json'; import cvVersionsData from './cvVersionsData.fixtures.json'; import cvDetailsData from './cvDetails.fixtures.json'; import affectedActivationKeysData from '../../Details/Versions/Delete/__tests__/cvAffectedActivationKeys.fixture.json'; import affectedHostData from './affectedHosts.fixtures.json'; import cVDropDownOptionsData from '../../Details/Versions/Delete/__tests__/cvDropDownOptionsResponse.fixture.json'; import cvDeleteResponse from '../../Details/Versions/Delete/__tests__/cvVersionRemoveResponse.fixture.json'; const cvIndexPath = api.getApiUrl('/content_views?organization_id=1&nondefault=true&include_permissions=true&per_page=20&page=1'); const autocompleteUrl = '/content_views/auto_complete_search'; const renderOptions = { apiNamespace: CONTENT_VIEWS_KEY }; const environmentPathsPath = api.getApiUrl('/organizations/1/environments/paths'); const cvVersionsPath = api.getApiUrl('/content_view_versions'); const cvDetailsPath = api.getApiUrl('/content_views/20'); const activationKeyURL = api.getApiUrl('/activation_keys'); const hostURL = foremanApi.getApiUrl('/hosts'); const cVDropDownOptionsPath = api.getApiUrl('/content_views?organization_id=1&environment_id=9&include_default=true&include_permissions=true&full_result=true'); const cvDeleteUrl = api.getApiUrl('/content_views/20/remove'); let scopeBookmark; let firstCV; let searchDelayScope; let autoSearchScope; beforeEach(() => { const { results } = cvIndexData; [firstCV] = results; scopeBookmark = nockInstance .get('/api/v2/bookmarks') .query(true) .reply(200, {}); searchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 500); autoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', true); }); afterEach(() => { nock.cleanAll(); assertNockRequest(searchDelayScope); assertNockRequest(autoSearchScope); }); test('Can call API for CVs and show Delete Wizard for the row', async (done) => { const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl); const scope = nockInstance .get(cvIndexPath) .reply(200, cvIndexData); const envPathDeleteScope = nockInstance .get(environmentPathsPath) .query(true) .reply(200, environmentPathsData); const cvVersionsScope = nockInstance .get(cvVersionsPath) .query(true) .reply(200, cvVersionsData); const cvDetailsScope = nockInstance .get(cvDetailsPath) .query(true) .reply(200, cvDetailsData); const { getAllByText, getByText, getAllByLabelText, queryByText, } = renderWithRedux(, renderOptions); expect(queryByText(firstCV.name)).toBeNull(); // Assert that the CV name is now showing on the screen, but wait for it to appear. await patientlyWaitFor(() => expect(queryByText(firstCV.name)).toBeInTheDocument()); expect(getAllByLabelText('Actions')[0]).toHaveAttribute('aria-expanded', 'false'); fireEvent.click(getAllByLabelText('Actions')[0]); expect(getAllByLabelText('Actions')[0]).toHaveAttribute('aria-expanded', 'true'); fireEvent.click(getByText('Delete')); await patientlyWaitFor(() => expect(getAllByText('Remove versions from environments')[1]).toBeInTheDocument()); assertNockRequest(scope); assertNockRequest(scopeBookmark); assertNockRequest(autocompleteScope); assertNockRequest(envPathDeleteScope); assertNockRequest(cvDetailsScope); assertNockRequest(cvVersionsScope, done); }); test('Can open Delete wizard and delete CV with all steps', async (done) => { const hostAutocompleteUrl = '/hosts/auto_complete_search'; const hostAutocompleteScope = mockForemanAutocomplete(nockInstance, hostAutocompleteUrl); const hostSearchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 500); const hostAutoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', true); const akAutocompleteUrl = '/activation_keys/auto_complete_search'; const akAutocompleteScope = mockAutocomplete(nockInstance, akAutocompleteUrl); const akSearchDelayScope = mockSetting(nockInstance, 'autosearch_delay', 500); const akAutoSearchScope = mockSetting(nockInstance, 'autosearch_while_typing', true); const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl); const scope = nockInstance .get(cvIndexPath) .reply(200, cvIndexData); const envPathDeleteScope = nockInstance .get(environmentPathsPath) .query(true) .reply(200, environmentPathsData); const cvVersionsScope = nockInstance .get(cvVersionsPath) .query(true) .reply(200, cvVersionsData); const cvDetailsScope = nockInstance .get(cvDetailsPath) .query(true) .reply(200, cvDetailsData); const cvRedirectScope = nockInstance .get(api.getApiUrl('/content_views?organization_id=1&nondefault=true&include_permissions=true')) .reply(200, cvIndexData); const cvDeleteParams = { destroy_content_view: true, system_content_view_id: 2, system_environment_id: 9, key_content_view_id: 2, key_environment_id: 9, id: 20, }; const cvDeleteScope = nockInstance .put(cvDeleteUrl, cvDeleteParams) .reply(202, cvDeleteResponse); const hostScope = nockInstance .get(hostURL) .query(true) .reply(200, affectedHostData); const activationKeysScope = nockInstance .get(activationKeyURL) .query(true) .reply(200, affectedActivationKeysData); const cVDropDownOptionsScope = nockInstance .get(cVDropDownOptionsPath) .times(2) .reply(200, cVDropDownOptionsData); const { getByText, getByLabelText, getAllByLabelText, getAllByText, queryByText, } = renderWithRedux(, renderOptions); expect(queryByText(firstCV.name)).toBeNull(); // Assert that the CV name is now showing on the screen, but wait for it to appear. await patientlyWaitFor(() => expect(queryByText(firstCV.name)).toBeInTheDocument()); expect(getAllByLabelText('Actions')[0]).toHaveAttribute('aria-expanded', 'false'); fireEvent.click(getAllByLabelText('Actions')[0]); expect(getAllByLabelText('Actions')[0]).toHaveAttribute('aria-expanded', 'true'); fireEvent.click(getByText('Delete')); await patientlyWaitFor(() => { expect(getAllByText('Remove versions from environments')[1]).toBeInTheDocument(); expect(queryByText('Version 1.0')).toBeInTheDocument(); }); fireEvent.click(getByText('Next')); await patientlyWaitFor(() => { expect(getByText('Select lifecycle environment')).toBeInTheDocument(); expect(getByText('Show hosts')).toBeInTheDocument(); }); fireEvent.click(getByText('Show hosts')); await patientlyWaitFor(() => { expect(getByText('affectedHost.example.com')).toBeInTheDocument(); }); fireEvent.click(getByLabelText('test1')); await patientlyWaitFor(() => { expect(getByText('Select content view')).toBeInTheDocument(); expect(getByText('Select a content view')).toBeInTheDocument(); }); fireEvent.click(getByText('Select a content view')); await patientlyWaitFor(() => { expect(getByText('cv2')).toBeInTheDocument(); }); fireEvent.click(getByText('cv2')); fireEvent.click(getByText('Next')); await patientlyWaitFor(() => { expect(getByText('Select lifecycle environment')).toBeInTheDocument(); expect(getByText('Show activation keys')).toBeInTheDocument(); }); fireEvent.click(getByText('Show activation keys')); await patientlyWaitFor(() => { expect(getByText('test activation key')).toBeInTheDocument(); }); fireEvent.click(getByLabelText('test1')); await patientlyWaitFor(() => { expect(getByText('Select content view')).toBeInTheDocument(); expect(getByText('Select a content view')).toBeInTheDocument(); }); fireEvent.click(getByText('Select a content view')); await patientlyWaitFor(() => { expect(getByText('cv2')).toBeInTheDocument(); }); fireEvent.click(getByText('cv2')); // Move to Review fireEvent.click(getByText('Next')); await patientlyWaitFor(() => { expect(getAllByText('Review details')[1]).toBeInTheDocument(); expect(getByText('Environments')).toBeInTheDocument(); expect(getByText('Content hosts')).toBeInTheDocument(); expect(getByText('1 host will be moved to content view cv2 in')).toBeInTheDocument(); expect(getByText('Activation keys')).toBeInTheDocument(); expect(getByText('1 activation key will be moved to content view cv2 in')).toBeInTheDocument(); }); // Delete CV fireEvent.click(getAllByText('Delete')[0]); assertNockRequest(scope); assertNockRequest(scopeBookmark); assertNockRequest(autocompleteScope); assertNockRequest(envPathDeleteScope); assertNockRequest(cvDetailsScope); assertNockRequest(cvVersionsScope); assertNockRequest(hostAutocompleteScope); assertNockRequest(hostSearchDelayScope); assertNockRequest(hostAutoSearchScope); assertNockRequest(hostScope); assertNockRequest(cVDropDownOptionsScope); assertNockRequest(akAutocompleteScope); assertNockRequest(akSearchDelayScope); assertNockRequest(akAutoSearchScope); assertNockRequest(activationKeysScope); assertNockRequest(cVDropDownOptionsScope); assertNockRequest(cvDeleteScope); assertNockRequest(cvRedirectScope, done); });