import React from 'react';
import { renderWithRedux, patientlyWaitFor, fireEvent } from 'react-testing-lib-wrapper';
import { assertNockRequest, nockInstance } from '../../../../test-utils/nockWrapper';
import ActivationKeyDetails from '../ActivationKeyDetails';
import katelloApi from '../../../../services/api/index';
const akDetails = katelloApi.getApiUrl('/activation_keys/1');
const baseAKDetails = {
id: 1,
name: 'test',
description: 'test description',
unlimited_hosts: false,
usage_count: 1,
max_hosts: 4,
};
const renderOptions = {
initialState: {
// This is the API state that your tests depend on for their data
// You can cross reference the needed useSelectors from your tested components
// with the data found within the redux chrome add-on to help determine this fixture data.
katello: {
hostDetails: {},
},
},
};
test('Makes API call and displays AK details on screen', async (done) => {
const akScope = nockInstance
.get(akDetails)
.reply(200, baseAKDetails);
// eslint-disable-next-line max-len
const { getByText, getByRole } = renderWithRedux(, renderOptions);
await patientlyWaitFor(() => expect(getByRole('heading', { name: 'test' })).toBeInTheDocument());
expect(getByText('test description')).toBeInTheDocument();
expect(getByText('1/4')).toBeInTheDocument();
assertNockRequest(akScope, done);
});
test('Displays placeholder when description is missing', async (done) => {
const akScope = nockInstance
.get(akDetails)
.reply(
200,
{
...baseAKDetails,
description: '',
},
);
// eslint-disable-next-line max-len
const { getByText, getByRole } = renderWithRedux(, renderOptions);
await patientlyWaitFor(() => expect(getByRole('heading', { name: 'test' })).toBeInTheDocument());
expect(getByText('No description provided')).toBeInTheDocument();
assertNockRequest(akScope, done);
});
test('Delete menu appears when toggle is clicked', async (done) => {
const akScope = nockInstance
.get(akDetails)
.reply(200, baseAKDetails);
// eslint-disable-next-line max-len
const { getByText, getByLabelText } = renderWithRedux(, renderOptions);
const deleteToggle = getByLabelText('delete-toggle');
fireEvent.click(deleteToggle);
await patientlyWaitFor(() => expect(getByText('Delete')).toBeInTheDocument());
assertNockRequest(akScope, done);
});
test('Edit modal appears when button is clicked', async (done) => {
const akScope = nockInstance
.get(akDetails)
.reply(200, baseAKDetails);
const { getByLabelText, getByText } = renderWithRedux(, renderOptions);
const editButton = getByLabelText('edit-button');
fireEvent.click(editButton);
await patientlyWaitFor(() => expect(getByText('Edit activation key')).toBeInTheDocument());
assertNockRequest(akScope, done);
});
test('Page displays 0 when usage count is null', async (done) => {
const akScope = nockInstance
.get(akDetails)
.reply(
200,
{
...baseAKDetails,
usage_count: null,
},
);
const { getByText, getByRole } = renderWithRedux(, renderOptions);
await patientlyWaitFor(() => expect(getByRole('heading', { name: 'test' })).toBeInTheDocument());
expect(getByText('0/4')).toBeInTheDocument();
assertNockRequest(akScope, done);
});
test('Delete modal appears when link is clicked', async (done) => {
const akScope = nockInstance
.get(akDetails)
.reply(200, baseAKDetails);
// eslint-disable-next-line max-len
const { getByText, getByLabelText } = renderWithRedux(, renderOptions);
const deleteToggle = getByLabelText('delete-toggle');
fireEvent.click(deleteToggle);
await patientlyWaitFor(() => expect(getByText('Delete')).toBeInTheDocument());
const deleteLink = getByLabelText('delete-link');
fireEvent.click(deleteLink);
await patientlyWaitFor(() => expect(getByText('Activation Key will no longer be available for use. This operation cannot be undone.')).toBeInTheDocument());
assertNockRequest(akScope, done);
});