import React from 'react';
import { renderWithRedux, patientlyWaitFor, fireEvent } from 'react-testing-lib-wrapper';
import { nockInstance, assertNockRequest, mockAutocomplete, mockForemanAutocomplete } from '../../../../../../test-utils/nockWrapper';
import api, { foremanApi } from '../../../../../../services/api';
import CONTENT_VIEWS_KEY from '../../../../ContentViewsConstants';
import ContentViewVersions from '../../ContentViewVersions';
import cvVersionsData from './versionsResponseData.fixtures.json';
import environmentPathsData from './versionRemoveEnvPaths.fixtures';
import cvVersionRemoveResponse from './cvVersionRemoveResponse.fixture.json';
import cvDetailData from '../../../../__tests__/mockDetails.fixtures.json';
import affectedHostData from './cvAffectedHosts.fixture';
import affectedActivationKeysData from './cvAffectedActivationKeys.fixture.json';
import cVDropDownOptionsData from './cvDropDownOptionsResponse.fixture';
const environmentPathsPath = api.getApiUrl('/organizations/1/environments/paths');
const renderOptions = { apiNamespace: `${CONTENT_VIEWS_KEY}_2` };
const cvVersions = api.getApiUrl('/content_view_versions');
const autocompleteUrl = '/content_view_versions/auto_complete_search';
const cvVersionRemoveUrl = api.getApiUrl('/content_views/2/remove');
const hostURL = foremanApi.getApiUrl('/hosts');
const activationKeyURL = api.getApiUrl('/activation_keys');
const cVDropDownOptionsPath = api.getApiUrl('/content_views?organization_id=1&include_permissions=true&environment_id=3&include_default=true&full_result=true');
// const taskPollingUrl = '/foreman_tasks/api/tasks/6b900ff8-62bb-42ac-8c45-da86b7258520';
let firstVersion;
let envScope;
beforeEach(() => {
const { results } = cvVersionsData;
[firstVersion] = results;
envScope = nockInstance
.get(environmentPathsPath)
.query(true)
.reply(200, environmentPathsData);
});
afterEach(() => {
assertNockRequest(envScope);
});
test('Can call API and show versions on page load', async (done) => {
const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
const scope = nockInstance
.get(cvVersions)
.query(true)
.reply(200, cvVersionsData);
const { getByText, queryByText } = renderWithRedux(
,
renderOptions,
);
// Nothing will show at first, page is loading
expect(queryByText(`Version ${firstVersion.version}`)).toBeNull();
// Assert that the CV version is now showing on the screen, but wait for it to appear.
await patientlyWaitFor(() => {
expect(getByText(`Version ${firstVersion.version}`)).toBeTruthy();
});
assertNockRequest(autocompleteScope);
assertNockRequest(scope, done);
});
test('Can open Remove wizard and remove version from simple environment', async (done) => {
const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
const scope = nockInstance
.get(cvVersions)
.query(true)
.reply(200, cvVersionsData);
const envPathRemovalScope = nockInstance
.get(environmentPathsPath)
.query(true)
.reply(200, environmentPathsData);
const cvVersionRemoveParams = { id: 2, environment_ids: [4] };
const versionRemovalScope = nockInstance
.put(cvVersionRemoveUrl, cvVersionRemoveParams)
.reply(202, cvVersionRemoveResponse);
const {
getByText, getAllByText, getByLabelText, getAllByLabelText, queryByText,
} = renderWithRedux(
,
renderOptions,
);
// Nothing will show at first, page is loading
expect(queryByText(`Version ${firstVersion.version}`)).toBeNull();
// Assert that the CV version is now showing on the screen, but wait for it to appear.
await patientlyWaitFor(() => {
expect(getByText(`Version ${firstVersion.version}`)).toBeTruthy();
});
// Expand Row Action
expect(getAllByLabelText('Actions')[0]).toHaveAttribute('aria-expanded', 'false');
fireEvent.click(getAllByLabelText('Actions')[0]);
expect(getAllByLabelText('Actions')[0]).toHaveAttribute('aria-expanded', 'true');
fireEvent.click(getByText('Remove from environments'));
await patientlyWaitFor(() => {
expect(getByText('Remove Version')).toBeInTheDocument();
});
fireEvent.click(getByLabelText('Select row 1'));
fireEvent.click(getByText('Next'));
await patientlyWaitFor(() => {
expect(getByText('Review details')).toBeInTheDocument();
});
expect(getAllByText('qa1')[0].closest('a'))
.toHaveAttribute('href', '/lifecycle_environments/4');
fireEvent.click(getAllByText('Remove')[0]);
assertNockRequest(scope);
assertNockRequest(autocompleteScope);
assertNockRequest(envPathRemovalScope);
assertNockRequest(versionRemovalScope, done);
});
test('Can open Remove wizard and remove version from environment with hosts', async (done) => {
const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
const hostAutocompleteUrl = '/hosts/auto_complete_search';
const hostAutocompleteScope = mockForemanAutocomplete(nockInstance, hostAutocompleteUrl);
const scope = nockInstance
.get(cvVersions)
.query(true)
.reply(200, cvVersionsData);
const envPathRemovalScope = nockInstance
.get(environmentPathsPath)
.query(true)
.reply(200, environmentPathsData);
const hostScope = nockInstance
.get(hostURL)
.query(true)
.reply(200, affectedHostData);
const cVDropDownOptionsScope = nockInstance
.get(cVDropDownOptionsPath)
.reply(200, cVDropDownOptionsData);
const cvVersionRemoveParams = {
id: 2, environment_ids: [6], system_content_view_id: 2, system_environment_id: 3,
};
const versionRemovalScope = nockInstance
.put(cvVersionRemoveUrl, cvVersionRemoveParams)
.reply(202, cvVersionRemoveResponse);
const {
getByText, getAllByText, getByLabelText, getAllByLabelText, queryByText, getByPlaceholderText,
} = renderWithRedux(
,
renderOptions,
);
// Nothing will show at first, page is loading
expect(queryByText(`Version ${firstVersion.version}`)).toBeNull();
// Assert that the CV version is now showing on the screen, but wait for it to appear.
await patientlyWaitFor(() => {
expect(getByText(`Version ${firstVersion.version}`)).toBeTruthy();
});
// Expand Row Action
expect(getAllByLabelText('Actions')[0]).toHaveAttribute('aria-expanded', 'false');
fireEvent.click(getAllByLabelText('Actions')[0]);
expect(getAllByLabelText('Actions')[0]).toHaveAttribute('aria-expanded', 'true');
fireEvent.click(getByText('Remove from environments'));
await patientlyWaitFor(() => {
expect(getByText('Remove Version')).toBeInTheDocument();
});
fireEvent.click(getByLabelText('Select row 3'));
fireEvent.click(getByText('Next'));
await patientlyWaitFor(() => {
expect(getByText('Select lifecycle environment')).toBeInTheDocument();
expect(getByText('Show hosts')).toBeInTheDocument();
});
expect(getByText('affectedHost.example.com')).toBeInTheDocument();
fireEvent.click(getByLabelText('test1'));
await patientlyWaitFor(() => {
expect(getByText('Select content view')).toBeInTheDocument();
expect(getByPlaceholderText('Select a content view')).toBeInTheDocument();
});
fireEvent.click(getByPlaceholderText('Select a content view'));
await patientlyWaitFor(() => {
expect(getByText('cv2')).toBeInTheDocument();
});
fireEvent.click(getByText('cv2'));
fireEvent.click(getByText('Next'));
await patientlyWaitFor(() => {
expect(getByText('Review details')).toBeInTheDocument();
expect(getByText('1 host will be moved to content view cv2 in')).toBeInTheDocument();
});
fireEvent.click(getAllByText('Remove')[0]);
assertNockRequest(scope);
assertNockRequest(autocompleteScope);
assertNockRequest(hostAutocompleteScope);
assertNockRequest(hostScope);
assertNockRequest(cVDropDownOptionsScope);
assertNockRequest(envPathRemovalScope);
assertNockRequest(versionRemovalScope, done);
});
test('Can open Remove wizard and remove version from environment with activation keys', async (done) => {
const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);
const akAutocompleteUrl = '/activation_keys/auto_complete_search';
const akAutocompleteScope = mockAutocomplete(nockInstance, akAutocompleteUrl);
const scope = nockInstance
.get(cvVersions)
.query(true)
.reply(200, cvVersionsData);
const envPathRemovalScope = nockInstance
.get(environmentPathsPath)
.query(true)
.reply(200, environmentPathsData);
const activationKeysScope = nockInstance
.get(activationKeyURL)
.query(true)
.reply(200, affectedActivationKeysData);
const cVDropDownOptionsScope = nockInstance
.get(cVDropDownOptionsPath)
.reply(200, cVDropDownOptionsData);
const cvVersionRemoveParams = {
id: 2, environment_ids: [7], key_content_view_id: 2, key_environment_id: 3,
};
const versionRemovalScope = nockInstance
.put(cvVersionRemoveUrl, cvVersionRemoveParams)
.reply(202, cvVersionRemoveResponse);
const {
getByText, getAllByText, getByLabelText, getAllByLabelText, queryByText, getByPlaceholderText,
} = renderWithRedux(
,
renderOptions,
);
// Nothing will show at first, page is loading
expect(queryByText(`Version ${firstVersion.version}`)).toBeNull();
// Assert that the CV version is now showing on the screen, but wait for it to appear.
await patientlyWaitFor(() => {
expect(getByText(`Version ${firstVersion.version}`)).toBeTruthy();
});
// Expand Row Action
expect(getAllByLabelText('Actions')[0]).toHaveAttribute('aria-expanded', 'false');
fireEvent.click(getAllByLabelText('Actions')[0]);
expect(getAllByLabelText('Actions')[0]).toHaveAttribute('aria-expanded', 'true');
fireEvent.click(getByText('Remove from environments'));
await patientlyWaitFor(() => {
expect(getByText('Remove Version')).toBeInTheDocument();
});
fireEvent.click(getByLabelText('Select row 4'));
fireEvent.click(getByText('Next'));
await patientlyWaitFor(() => {
expect(getByText('Select lifecycle environment')).toBeInTheDocument();
expect(getByText('Show activation keys')).toBeInTheDocument();
});
expect(getByText('test activation key')).toBeInTheDocument();
fireEvent.click(getByLabelText('test1'));
await patientlyWaitFor(() => {
expect(getByText('Select content view')).toBeInTheDocument();
expect(getByPlaceholderText('Select a content view')).toBeInTheDocument();
});
fireEvent.click(getByPlaceholderText('Select a content view'));
await patientlyWaitFor(() => {
expect(getByText('cv2')).toBeInTheDocument();
});
fireEvent.click(getByText('cv2'));
fireEvent.click(getByText('Next'));
await patientlyWaitFor(() => {
expect(getByText('Review details')).toBeInTheDocument();
expect(getByText('1 activation key will be moved to content view cv2 in')).toBeInTheDocument();
});
fireEvent.click(getAllByText('Remove')[0]);
assertNockRequest(scope);
assertNockRequest(autocompleteScope);
assertNockRequest(akAutocompleteScope);
assertNockRequest(activationKeysScope);
assertNockRequest(cVDropDownOptionsScope);
assertNockRequest(envPathRemovalScope);
assertNockRequest(versionRemovalScope, done);
});