import React from 'react';
import { renderWithRedux, patientlyWaitFor, act } from 'react-testing-lib-wrapper';
import userEvent from '@testing-library/user-event';
import ChangeHostCVModal from '../ChangeHostCVModal';
import mockEnvPaths from './envPaths.fixtures.json';
import mockContentViews from './contentViews.fixtures.json';
import HOST_CV_AND_ENV_KEY from '../HostContentViewConstants';
import { assertNockRequest, nockInstance } from '../../../../../../test-utils/nockWrapper';
import katelloApi from '../../../../../../services/api';
const contentViews = katelloApi.getApiUrl('/content_views');
// const hostDetailsUrl = '/api/hosts/test-host';
const renderOptions = () => ({
apiNamespace: HOST_CV_AND_ENV_KEY,
initialState: {
API: {
HOST_DETAILS: {
response: {
id: 1,
name: 'test-host',
content_facet_attributes: {
content_view_id: 1,
lifecycle_environment_id: 1,
},
organization_id: 1,
},
status: 'RESOLVED',
},
ENVIRONMENT_PATHS: {
response: mockEnvPaths,
status: 'RESOLVED',
},
},
},
});
let firstEnvPath;
let firstCV;
let secondCV;
let firstEnv;
const cvQuery = {
organization_id: 1,
include_permissions: true,
include_default: true,
environment_id: 1,
full_result: true,
order: 'default DESC',
};
beforeEach(() => {
const { results } = mockEnvPaths;
[firstEnvPath] = results;
const { environments: envResults } = firstEnvPath;
[firstEnv] = envResults;
const { results: cvResults } = mockContentViews;
[firstCV, secondCV] = cvResults;
});
jest.mock('foremanReact/common/hooks/API/APIHooks', () => ({
useAPI: jest.fn(),
}));
test('Displays environment paths', async (done) => {
const { getAllByText }
= renderWithRedux(, renderOptions());
await patientlyWaitFor(() =>
expect(getAllByText(firstEnv.name)[0]).toBeInTheDocument());
done();
});
test('Select an env > call CV API > select a CV > Save button is enabled', async (done) => {
const contentViewsScope = nockInstance
.get(contentViews)
.query(cvQuery)
.reply(200, mockContentViews);
const {
getAllByText, getByText,
findByText, getAllByRole,
} = renderWithRedux(, renderOptions());
await patientlyWaitFor(() => {
const envLabel = getAllByText(firstEnv.name)[0];
expect(envLabel).toBeInTheDocument();
});
const envRadio = getAllByRole('radio', { name: firstEnv.name })[0];
expect(envRadio).toBeInTheDocument();
await act(async () => {
userEvent.click(envRadio); // Select the Library environment
const cvDropdown = await findByText('Select a content view');
expect(cvDropdown).toBeInTheDocument();
userEvent.click(cvDropdown); // Open the CV dropdown
[firstCV, secondCV].forEach((cv) => {
expect(getByText(cv.name)).toBeInTheDocument(); // the content view names should be showing
});
userEvent.click(getByText(secondCV.name)); // Select the second content view
});
// find the Save button and assert that it is enabled
const saveButton = getAllByRole('button', { name: 'Save' })[0];
expect(saveButton).toBeInTheDocument();
expect(saveButton).toHaveAttribute('aria-disabled', 'false');
assertNockRequest(contentViewsScope, done);
act(done);
});