Merge pull request #10665 from keithjgrant/disallow-test-network-requests

Disallow network requests in tests
This commit is contained in:
Keith Grant 2021-07-21 09:32:47 -07:00 committed by GitHub
commit 9704c57d6b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 85 additions and 76 deletions

View File

@ -3,7 +3,7 @@ import React, { useState } from 'react';
import PropTypes from 'prop-types';
import { t } from '@lingui/macro';
import { withRouter } from 'react-router-dom';
import { useLocation } from 'react-router-dom';
import {
Button,
ButtonVariant,
@ -36,7 +36,6 @@ function Search({
onReplaceSearch,
onRemove,
qsConfig,
location,
searchableKeys,
relatedSearchableKeys,
onShowAdvancedSearch,
@ -45,6 +44,7 @@ function Search({
enableNegativeFiltering,
enableRelatedFuzzyFiltering,
}) {
const location = useLocation();
const [isSearchDropdownOpen, setIsSearchDropdownOpen] = useState(false);
const [searchKey, setSearchKey] = useState(
(() => {
@ -341,4 +341,4 @@ Search.defaultProps = {
enableRelatedFuzzyFiltering: true,
};
export default withRouter(Search);
export default Search;

View File

@ -1,7 +1,7 @@
import React, { useState } from 'react';
import PropTypes from 'prop-types';
import { useLocation, withRouter } from 'react-router-dom';
import { useLocation } from 'react-router-dom';
import { t } from '@lingui/macro';
import {
Button,
@ -147,7 +147,4 @@ Sort.defaultProps = {
onSort: null,
};
export { Sort as _Sort };
const Wrapped = withRouter(Sort);
Wrapped.displayName = 'Sort';
export default Wrapped;
export default Sort;

View File

@ -6,7 +6,7 @@ import {
waitForElement,
} from '../../../testUtils/enzymeHelpers';
import Sort, { _Sort as SortUnwrapped } from './Sort';
import Sort from './Sort';
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom'),
@ -168,7 +168,7 @@ describe('<Sort />', () => {
const numericColumns = [{ name: 'ID', key: 'id' }];
const wrapper = shallow(
<SortUnwrapped
<Sort
qsConfig={qsConfigNumDown}
columns={numericColumns}
onSort={jest.fn()}
@ -187,7 +187,7 @@ describe('<Sort />', () => {
const numericColumns = [{ name: 'ID', key: 'id' }];
const wrapper = shallow(
<SortUnwrapped
<Sort
qsConfig={qsConfigNumUp}
columns={numericColumns}
onSort={jest.fn()}
@ -206,7 +206,7 @@ describe('<Sort />', () => {
const alphaColumns = [{ name: 'Name', key: 'name' }];
const wrapper = shallow(
<SortUnwrapped
<Sort
qsConfig={qsConfigAlphaDown}
columns={alphaColumns}
onSort={jest.fn()}
@ -225,7 +225,7 @@ describe('<Sort />', () => {
const alphaColumns = [{ name: 'Name', key: 'name' }];
const wrapper = shallow(
<SortUnwrapped
<Sort
qsConfig={qsConfigAlphaDown}
columns={alphaColumns}
onSort={jest.fn()}

View File

@ -199,13 +199,6 @@ describe('<UserAndTeamAccessAdd/>', () => {
})
);
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom'),
useParams: () => ({
id: 'a',
}),
}));
await act(async () =>
wrapper.find('SelectableCard[label="Job templates"]').prop('onClick')({
fetchItems: JobTemplatesAPI.read,

View File

@ -1,21 +1,18 @@
import React from 'react';
import { mountWithContexts } from '../../../testUtils/enzymeHelpers';
import { shallow } from 'enzyme';
import InstanceGroups from './InstanceGroups';
describe('<InstanceGroups/>', () => {
let pageWrapper;
let pageSections;
test('should set breadcrumbs', () => {
const wrapper = shallow(<InstanceGroups />);
beforeEach(() => {
pageWrapper = mountWithContexts(<InstanceGroups />);
pageSections = pageWrapper.find('PageSection');
});
test('initially renders without crashing', () => {
expect(pageWrapper.length).toBe(1);
expect(pageSections.length).toBe(1);
expect(pageSections.first().props().variant).toBe('light');
const header = wrapper.find('ScreenHeader');
expect(header.prop('streamType')).toEqual('instance_group');
expect(header.prop('breadcrumbConfig')).toEqual({
'/instance_groups': 'Instance Groups',
'/instance_groups/add': 'Create new instance group',
'/instance_groups/container_group/add': 'Create new container group',
});
});
});

View File

@ -119,7 +119,7 @@ function Job({ setBreadcrumb }) {
<PageSection>
<Card>
<ContentError error={error}>
{error.response.status === 404 && (
{error.response?.status === 404 && (
<span>
{t`The page you requested could not be found.`}{' '}
<Link to="/jobs">{t`View all Jobs.`}</Link>

View File

@ -1,15 +1,22 @@
import React from 'react';
import { act } from 'react-dom/test-utils';
import { mountWithContexts } from '../../../testUtils/enzymeHelpers';
import Job from './Job';
jest.mock('../../api');
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom'),
useParams: () => ({
id: 1,
typeSegment: 'project',
}),
}));
describe('<Job />', () => {
test('initially renders successfully', () => {
mountWithContexts(<Job />);
test('initially renders successfully', async () => {
await act(async () => {
await mountWithContexts(<Job setBreadcrumb={() => {}} />);
});
});
});

View File

@ -2,6 +2,14 @@ import React from 'react';
import { mountWithContexts } from '../../../testUtils/enzymeHelpers';
import SettingList from './SettingList';
jest.mock('../../api');
jest.mock('hooks/useBrandName', () => ({
__esModule: true,
default: () => ({
current: 'AWX',
}),
}));
describe('<SettingList />', () => {
let wrapper;
beforeEach(() => {

View File

@ -1,39 +1,11 @@
import React from 'react';
import { Route } from 'react-router-dom';
import { act } from 'react-dom/test-utils';
import { createMemoryHistory } from 'history';
import {
mountWithContexts,
waitForElement,
} from '../../../../testUtils/enzymeHelpers';
import { shallow } from 'enzyme';
import UserOrganizations from './UserOrganizations';
describe('<UserOrganizations />', () => {
test('userOrganizations mounts successfully', () => {
const history = createMemoryHistory({
initialEntries: ['/users/1/organizations'],
});
let wrapper;
act(() => {
wrapper = mountWithContexts(
<Route
path="/users/:id/organizations"
component={() => <UserOrganizations />}
/>,
{
context: {
router: {
history,
route: {
location: history.location,
match: { params: { id: 1 } },
},
},
},
}
);
});
waitForElement(wrapper, 'UserOrganizationList');
test('should render UserOrganizationList', () => {
const wrapper = shallow(<UserOrganizations />);
expect(wrapper.find('UserOrganizationList')).toHaveLength(1);
});
});

View File

@ -5,14 +5,11 @@ import { mountWithContexts } from '../../../../testUtils/enzymeHelpers';
import UserTokens from './UserTokens';
jest.mock('../../../api');
describe('<UserTokens />', () => {
let wrapper;
test('renders successfully', () => {
wrapper = mountWithContexts(<UserTokens />);
expect(wrapper.length).toBe(1);
});
test('shows Application information modal after successful creation', async () => {
const history = createMemoryHistory({
initialEntries: ['/users/1/tokens/add'],

View File

@ -16,6 +16,7 @@ export const asyncFlush = () => new Promise((resolve) => setImmediate(resolve));
let hasConsoleError = false;
let hasConsoleWarn = false;
let networkRequestUrl = false;
const { error, warn } = global.console;
global.console = {
@ -26,8 +27,10 @@ global.console = {
// fail tests that log errors.
// adapted from https://github.com/facebook/jest/issues/6121#issuecomment-708330601
error: (...args) => {
hasConsoleError = true;
error(...args);
if (!networkRequestUrl) {
hasConsoleError = true;
error(...args);
}
},
warn: (...args) => {
hasConsoleWarn = true;
@ -35,7 +38,39 @@ global.console = {
},
};
const logNetworkRequestError = url => {
networkRequestUrl = url || true;
return {
status: 200,
data: {},
};
};
jest.mock('axios', () => {
return {
create: () => ({
get: logNetworkRequestError,
post: logNetworkRequestError,
delete: logNetworkRequestError,
put: logNetworkRequestError,
patch: logNetworkRequestError,
options: logNetworkRequestError,
interceptors: {
response: {
use: () => {},
},
},
}),
};
});
afterEach(() => {
if (networkRequestUrl) {
const url = networkRequestUrl;
networkRequestUrl = false;
throw new Error(
`Network request was attempted to URL ${url} — API should be stubbed using jest.mock()`
);
}
if (hasConsoleError) {
hasConsoleError = false;
throw new Error('Error logged to console');

View File

@ -23,6 +23,9 @@ jest.mock('../api/models/WorkflowJobTemplates');
jest.mock('../api/models/WorkflowJobTemplateNodes');
jest.mock('../api/models/CredentialInputSources');
jest.mock('../api/models/ExecutionEnvironments');
jest.mock('../api/models/Applications');
jest.mock('../api/models/NotificationTemplates');
jest.mock('../api/models/Teams');
describe('delete details', () => {
afterEach(() => {