Katello/katello

View on GitHub
webpack/scenes/Content/Details/__tests__/contentDetail.test.js

Summary

Maintainability
F
3 days
Test Coverage
import React from 'react';
import { Route } from 'react-router-dom';
import { renderWithRedux, patientlyWaitFor } from 'react-testing-lib-wrapper';
import { nockInstance, assertNockRequest, mockAutocomplete } from '../../../../test-utils/nockWrapper';
import api from '../../../../services/api';
import { CONTENT_ID_KEY } from '../../ContentConstants';
import ContentDetails from '../ContentDetails';
import ContentRepositories from '../ContentRepositories';
import pythonPackageDetailsResponse from './pythonPackageDetails.fixtures.json';
import pythonPackageRepositoryDetailsResponse from './pythonPackageRepositoryDetails.fixtures.json';
import ansibleCollectionDetailsResponse from './ansibleCollectionDetails.fixtures.json';
import ansibleCollectionRepositoryDetailsResponse from './ansibleCollectionRepositoryDetails.fixtures.json';

const pythonPackageDetailsPath = api.getApiUrl('/python_packages/1491');
const ansibleCollectionDetailsPath = api.getApiUrl('/ansible_collections/51');
const contentRepositoryDetailsPath = api.getApiUrl('/repositories');

const withContentRoute = component => <Route path="/content/:content_type([a-z_]+)/:id([0-9]+)">{component}</Route>;

jest.mock('react-intl', () => ({ addLocaleData: () => { }, FormattedDate: () => 'mocked' }));

test('Can call API for Python package details and show details tab on page load', async (done) => {
  const renderOptions = {
    apiNamespace: CONTENT_ID_KEY,
    routerParams: {
      initialEntries: [{ pathname: '/content/python_packages/1491', hash: '#/details' }],
      initialIndex: 1,
    },
  };

  const {
    name, version, filename, additional_metadata: additionalMetadata,
  } = pythonPackageDetailsResponse;
  const pythonPackagesScope = nockInstance
    .get(pythonPackageDetailsPath)
    .query(true)
    .reply(200, pythonPackageDetailsResponse);

  const { queryByText, getAllByText, getByLabelText } =
    renderWithRedux(withContentRoute(<ContentDetails />), renderOptions);

  expect(queryByText(name)).toBeNull();
  await patientlyWaitFor(() => {
    expect(getAllByText(name)[0]).toBeInTheDocument();
    expect(getAllByText(version)[0]).toBeInTheDocument();
    expect(getAllByText(filename)[0]).toBeInTheDocument();
    expect(getAllByText(additionalMetadata.sha256)[0]).toBeInTheDocument();
    expect(getAllByText(additionalMetadata.package_type)[0]).toBeInTheDocument();
    expect(getByLabelText('content_breadcrumb')).toBeInTheDocument();
    expect(getByLabelText('content_breadcrumb_content')).toHaveTextContent(name);
  });

  assertNockRequest(pythonPackagesScope, done);
});

test('Can call API for Python package repository details and show repositories tab', async (done) => {
  const autocompleteUrl = '/repositories/auto_complete_search';
  const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);

  const results = pythonPackageRepositoryDetailsResponse.results[0];
  const repoName = results.name;
  const productName = results.product.name;
  const lastSyncWords = `${results.last_sync_words} ago`;
  const contentCountWords = '1489 Python packages';

  const pythonPackageRepositoryDetailsScope = nockInstance
    .get(contentRepositoryDetailsPath)
    .query(true)
    .reply(200, pythonPackageRepositoryDetailsResponse);

  const { queryByText, getAllByText } =
    renderWithRedux(<ContentRepositories tabKey="repositories" id={1491} contentType="python_packages" />);

  expect(queryByText(repoName)).toBeNull();
  await patientlyWaitFor(() => {
    expect(getAllByText(repoName)[0]).toBeInTheDocument();
    expect(getAllByText(productName)[0]).toBeInTheDocument();
    expect(getAllByText(lastSyncWords)[0]).toBeInTheDocument();
    expect(getAllByText(contentCountWords)[0]).toBeInTheDocument();
  });

  assertNockRequest(autocompleteScope);
  assertNockRequest(pythonPackageRepositoryDetailsScope, done);
});

test('Can call API for Ansible collection details and show details tab on page load', async (done) => {
  const renderOptions = {
    apiNamespace: CONTENT_ID_KEY,
    routerParams: {
      initialEntries: [{ pathname: '/content/ansible_collections/51', hash: '#/details' }],
      initialIndex: 1,
    },
  };

  const { name, version } = ansibleCollectionDetailsResponse;
  const ansibleCollectionsScope = nockInstance
    .get(ansibleCollectionDetailsPath)
    .query(true)
    .reply(200, ansibleCollectionDetailsResponse);

  const { queryByText, getAllByText, getByLabelText } =
    renderWithRedux(withContentRoute(<ContentDetails />), renderOptions);

  expect(queryByText(name)).toBeNull();
  await patientlyWaitFor(() => {
    expect(getAllByText(name)[0]).toBeInTheDocument();
    expect(getAllByText(version)[0]).toBeInTheDocument();
    expect(getByLabelText('content_breadcrumb')).toBeInTheDocument();
    expect(getByLabelText('content_breadcrumb_content')).toHaveTextContent(name);
  });

  assertNockRequest(ansibleCollectionsScope, done);
});

test('Can call API for Ansible collection repository details and show repositories tab', async (done) => {
  const autocompleteUrl = '/repositories/auto_complete_search';
  const autocompleteScope = mockAutocomplete(nockInstance, autocompleteUrl);

  const results = ansibleCollectionRepositoryDetailsResponse.results[0];
  const repoName = results.name;
  const productName = results.product.name;
  const lastSyncWords = `${results.last_sync_words} ago`;
  const contentCountWords = '17 Ansible collections';

  const ansibleCollectionRepositoryDetailsScope = nockInstance
    .get(contentRepositoryDetailsPath)
    .query(true)
    .reply(200, ansibleCollectionRepositoryDetailsResponse);

  const { queryByText, getAllByText } =
    renderWithRedux(<ContentRepositories tabKey="repositories" id={51} contentType="ansible_collections" />);

  expect(queryByText(repoName)).toBeNull();
  await patientlyWaitFor(() => {
    expect(getAllByText(repoName)[0]).toBeInTheDocument();
    expect(getAllByText(productName)[0]).toBeInTheDocument();
    expect(getAllByText(lastSyncWords)[0]).toBeInTheDocument();
    expect(getAllByText(contentCountWords)[0]).toBeInTheDocument();
  });

  assertNockRequest(autocompleteScope);
  assertNockRequest(ansibleCollectionRepositoryDetailsScope, done);
});