1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-06-04 01:18:20 +02:00

refactor: custom render should provide container (#4938)

This commit is contained in:
Mateusz Kwasniewski 2023-10-06 09:19:49 +02:00 committed by GitHub
parent bed26a938c
commit 80eb6e12c6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 261 additions and 320 deletions

View File

@ -5,7 +5,6 @@ import { ChangeRequestState } from 'component/changeRequest/changeRequest.types'
import userEvent from '@testing-library/user-event'; import userEvent from '@testing-library/user-event';
import { testServerRoute, testServerSetup } from 'utils/testServer'; import { testServerRoute, testServerSetup } from 'utils/testServer';
import { render } from 'utils/testRenderer'; import { render } from 'utils/testRenderer';
import { UIProviderContainer } from 'component/providers/UIProvider/UIProviderContainer';
const changeRequest = { const changeRequest = {
id: 3, id: 3,
@ -50,11 +49,7 @@ const TestComponent: FC = () => {
test('can edit and save title', async () => { test('can edit and save title', async () => {
const user = userEvent.setup(); const user = userEvent.setup();
render( render(<TestComponent />);
<UIProviderContainer>
<TestComponent />
</UIProviderContainer>,
);
const editButton = await screen.findByTestId('EditIcon'); const editButton = await screen.findByTestId('EditIcon');
await user.click(editButton); await user.click(editButton);

View File

@ -4,7 +4,6 @@ import { screen, waitFor } from '@testing-library/react';
import { render } from 'utils/testRenderer'; import { render } from 'utils/testRenderer';
import { testServerRoute, testServerSetup } from 'utils/testServer'; import { testServerRoute, testServerSetup } from 'utils/testServer';
import { FeatureArchiveDialog } from './FeatureArchiveDialog'; import { FeatureArchiveDialog } from './FeatureArchiveDialog';
import { UIProviderContainer } from 'component/providers/UIProvider/UIProviderContainer';
const server = testServerSetup(); const server = testServerSetup();
const setupHappyPathForChangeRequest = () => { const setupHappyPathForChangeRequest = () => {
@ -38,7 +37,6 @@ test('Add single archive feature change to change request', async () => {
const onConfirm = vi.fn(); const onConfirm = vi.fn();
setupHappyPathForChangeRequest(); setupHappyPathForChangeRequest();
render( render(
<UIProviderContainer>
<FeatureArchiveDialog <FeatureArchiveDialog
featureIds={['featureA']} featureIds={['featureA']}
projectId={'projectId'} projectId={'projectId'}
@ -46,8 +44,7 @@ test('Add single archive feature change to change request', async () => {
onClose={onClose} onClose={onClose}
onConfirm={onConfirm} onConfirm={onConfirm}
featuresWithUsage={[]} featuresWithUsage={[]}
/> />,
</UIProviderContainer>,
); );
expect(screen.getByText('Archive feature toggle')).toBeInTheDocument(); expect(screen.getByText('Archive feature toggle')).toBeInTheDocument();
@ -66,7 +63,6 @@ test('Add multiple archive feature changes to change request', async () => {
const onConfirm = vi.fn(); const onConfirm = vi.fn();
setupHappyPathForChangeRequest(); setupHappyPathForChangeRequest();
render( render(
<UIProviderContainer>
<FeatureArchiveDialog <FeatureArchiveDialog
featureIds={['featureA', 'featureB']} featureIds={['featureA', 'featureB']}
projectId={'projectId'} projectId={'projectId'}
@ -74,8 +70,7 @@ test('Add multiple archive feature changes to change request', async () => {
onClose={onClose} onClose={onClose}
onConfirm={onConfirm} onConfirm={onConfirm}
featuresWithUsage={[]} featuresWithUsage={[]}
/> />,
</UIProviderContainer>,
); );
await screen.findByText('Archive feature toggles'); await screen.findByText('Archive feature toggles');
@ -94,7 +89,6 @@ test('Skip change request', async () => {
const onConfirm = vi.fn(); const onConfirm = vi.fn();
setupHappyPathForChangeRequest(); setupHappyPathForChangeRequest();
render( render(
<UIProviderContainer>
<FeatureArchiveDialog <FeatureArchiveDialog
featureIds={['featureA', 'featureB']} featureIds={['featureA', 'featureB']}
projectId={'projectId'} projectId={'projectId'}
@ -102,8 +96,7 @@ test('Skip change request', async () => {
onClose={onClose} onClose={onClose}
onConfirm={onConfirm} onConfirm={onConfirm}
featuresWithUsage={[]} featuresWithUsage={[]}
/> />,
</UIProviderContainer>,
{ permissions: [{ permission: 'SKIP_CHANGE_REQUEST' }] }, { permissions: [{ permission: 'SKIP_CHANGE_REQUEST' }] },
); );

View File

@ -1,12 +1,10 @@
import { createLocalStorage } from 'utils/createLocalStorage'; import { createLocalStorage } from 'utils/createLocalStorage';
import { render } from 'utils/testRenderer'; import { render } from 'utils/testRenderer';
import { fireEvent, screen } from '@testing-library/react'; import { fireEvent, screen } from '@testing-library/react';
import { UIProviderContainer } from '../../providers/UIProvider/UIProviderContainer';
import { Search } from './Search'; import { Search } from './Search';
import { SEARCH_INPUT } from 'utils/testIds'; import { SEARCH_INPUT } from 'utils/testIds';
const testDisplayComponent = ( const testDisplayComponent = (
<UIProviderContainer>
<Search <Search
hasFilters hasFilters
onChange={() => {}} onChange={() => {}}
@ -17,7 +15,6 @@ const testDisplayComponent = (
searchValue: '', searchValue: '',
})} })}
/> />
</UIProviderContainer>
); );
test('should read saved query from local storage', async () => { test('should read saved query from local storage', async () => {

View File

@ -2,7 +2,6 @@ import { screen } from '@testing-library/react';
import { render } from 'utils/testRenderer'; import { render } from 'utils/testRenderer';
import { StrategyItemContainer } from './StrategyItemContainer'; import { StrategyItemContainer } from './StrategyItemContainer';
import { IFeatureStrategy } from 'interfaces/strategy'; import { IFeatureStrategy } from 'interfaces/strategy';
import { UIProviderContainer } from '../../providers/UIProvider/UIProviderContainer';
test('should render strategy name, custom title and description', async () => { test('should render strategy name, custom title and description', async () => {
const strategy: IFeatureStrategy = { const strategy: IFeatureStrategy = {
@ -14,12 +13,10 @@ test('should render strategy name, custom title and description', async () => {
}; };
render( render(
<UIProviderContainer>
<StrategyItemContainer <StrategyItemContainer
strategy={strategy} strategy={strategy}
description={'description'} description={'description'}
/> />,
</UIProviderContainer>,
); );
expect(screen.getByText('strategy name')).toBeInTheDocument(); expect(screen.getByText('strategy name')).toBeInTheDocument();

View File

@ -1,8 +1,7 @@
import { render } from '../../../utils/testRenderer'; import { render } from 'utils/testRenderer';
import { screen } from '@testing-library/react'; import { screen } from '@testing-library/react';
import React from 'react'; import React from 'react';
import { testServerRoute, testServerSetup } from '../../../utils/testServer'; import { testServerRoute, testServerSetup } from 'utils/testServer';
import { UIProviderContainer } from '../../providers/UIProvider/UIProviderContainer';
import { ContextFieldUsage } from './ContextFieldUsage'; import { ContextFieldUsage } from './ContextFieldUsage';
const server = testServerSetup(); const server = testServerSetup();
@ -38,11 +37,7 @@ test('should show usage of context field', async () => {
setupRoutes(); setupRoutes();
const contextFieldName = 'appName'; const contextFieldName = 'appName';
render( render(<ContextFieldUsage contextName={contextFieldName} />);
<UIProviderContainer>
<ContextFieldUsage contextName={contextFieldName} />
</UIProviderContainer>,
);
await screen.findByText('Usage of this context field:'); await screen.findByText('Usage of this context field:');
await screen.findByText('tests (Gradual rollout)'); await screen.findByText('tests (Gradual rollout)');

View File

@ -1,8 +1,7 @@
import { render } from '../../../../utils/testRenderer'; import { render } from 'utils/testRenderer';
import { screen } from '@testing-library/react'; import { screen } from '@testing-library/react';
import React from 'react'; import React from 'react';
import { testServerRoute, testServerSetup } from '../../../../utils/testServer'; import { testServerRoute, testServerSetup } from '../../../../utils/testServer';
import { UIProviderContainer } from 'component/providers/UIProvider/UIProviderContainer';
import ContextList from './ContextList'; import ContextList from './ContextList';
const server = testServerSetup(); const server = testServerSetup();
@ -26,9 +25,7 @@ test('should show the count of projects and features used in', async () => {
setupRoutes(); setupRoutes();
render( render(
<UIProviderContainer> <ContextList />,
<ContextList />
</UIProviderContainer>,
); );
await screen.findByText('2 feature toggles'); await screen.findByText('2 feature toggles');

View File

@ -3,7 +3,6 @@ import userEvent from '@testing-library/user-event';
import { render } from 'utils/testRenderer'; import { render } from 'utils/testRenderer';
import { AddDependencyDialogue } from './AddDependencyDialogue'; import { AddDependencyDialogue } from './AddDependencyDialogue';
import { testServerRoute, testServerSetup } from 'utils/testServer'; import { testServerRoute, testServerSetup } from 'utils/testServer';
import { UIProviderContainer } from '../../providers/UIProvider/UIProviderContainer';
const server = testServerSetup(); const server = testServerSetup();
@ -39,7 +38,6 @@ test('Delete dependency', async () => {
let closed = false; let closed = false;
setupApi(); setupApi();
render( render(
<UIProviderContainer>
<AddDependencyDialogue <AddDependencyDialogue
project='default' project='default'
featureId='child' featureId='child'
@ -47,8 +45,7 @@ test('Delete dependency', async () => {
onClose={() => { onClose={() => {
closed = true; closed = true;
}} }}
/> />,
</UIProviderContainer>,
); );
const removeDependency = await screen.findByText('Remove'); const removeDependency = await screen.findByText('Remove');
@ -68,7 +65,6 @@ test('Add dependency', async () => {
let closed = false; let closed = false;
setupApi(); setupApi();
render( render(
<UIProviderContainer>
<AddDependencyDialogue <AddDependencyDialogue
project='default' project='default'
featureId='child' featureId='child'
@ -76,8 +72,7 @@ test('Add dependency', async () => {
onClose={() => { onClose={() => {
closed = true; closed = true;
}} }}
/> />,
</UIProviderContainer>,
); );
const removeDependency = await screen.findByText('Remove'); const removeDependency = await screen.findByText('Remove');

View File

@ -3,7 +3,6 @@ import { render } from 'utils/testRenderer';
import { testServerRoute, testServerSetup } from 'utils/testServer'; import { testServerRoute, testServerSetup } from 'utils/testServer';
import FeatureSettingsProjectConfirm from './FeatureSettingsProjectConfirm'; import FeatureSettingsProjectConfirm from './FeatureSettingsProjectConfirm';
import { IFeatureToggle } from 'interfaces/featureToggle'; import { IFeatureToggle } from 'interfaces/featureToggle';
import { UIProviderContainer } from '../../../../../providers/UIProvider/UIProviderContainer';
import { Route, Routes } from 'react-router-dom'; import { Route, Routes } from 'react-router-dom';
import React from 'react'; import React from 'react';
import userEvent from '@testing-library/user-event'; import userEvent from '@testing-library/user-event';
@ -22,7 +21,6 @@ test('Cannot change project for feature with dependencies', async () => {
let closed = false; let closed = false;
setupApi(); setupApi();
render( render(
<UIProviderContainer>
<Routes> <Routes>
<Route <Route
path={'projects/:projectId/features/:featureId/settings'} path={'projects/:projectId/features/:featureId/settings'}
@ -45,8 +43,7 @@ test('Cannot change project for feature with dependencies', async () => {
/> />
} }
/> />
</Routes> </Routes>,
</UIProviderContainer>,
{ {
route: 'projects/default/features/parent/settings', route: 'projects/default/features/parent/settings',
}, },

View File

@ -1,19 +1,15 @@
import { screen } from '@testing-library/react'; import { screen } from '@testing-library/react';
import { render } from 'utils/testRenderer'; import { render } from 'utils/testRenderer';
import { UIProviderContainer } from '../../providers/UIProvider/UIProviderContainer';
import AdvancedPlayground from './AdvancedPlayground'; import AdvancedPlayground from './AdvancedPlayground';
import { createLocalStorage } from 'utils/createLocalStorage'; import { createLocalStorage } from 'utils/createLocalStorage';
import { testServerRoute, testServerSetup } from 'utils/testServer'; import { testServerRoute, testServerSetup } from 'utils/testServer';
import userEvent from '@testing-library/user-event'; import userEvent from '@testing-library/user-event';
const testDisplayComponent = ( const testDisplayComponent = (
<UIProviderContainer>
<AdvancedPlayground <AdvancedPlayground
FormComponent={(props) => ( FormComponent={(props) => (
<div> <div>
<div data-id='projects'> <div data-id='projects'>{JSON.stringify(props.projects)}</div>
{JSON.stringify(props.projects)}
</div>
<div data-id='environments'> <div data-id='environments'>
{JSON.stringify(props.environments)} {JSON.stringify(props.environments)}
</div> </div>
@ -21,11 +17,9 @@ const testDisplayComponent = (
</div> </div>
)} )}
/> />
</UIProviderContainer>
); );
const testEvaluateComponent = ( const testEvaluateComponent = (
<UIProviderContainer>
<AdvancedPlayground <AdvancedPlayground
FormComponent={(props) => ( FormComponent={(props) => (
<form onSubmit={props.onSubmit}> <form onSubmit={props.onSubmit}>
@ -33,7 +27,6 @@ const testEvaluateComponent = (
</form> </form>
)} )}
/> />
</UIProviderContainer>
); );
afterEach(() => { afterEach(() => {

View File

@ -1,11 +1,9 @@
import { screen } from '@testing-library/react'; import { screen } from '@testing-library/react';
import { render } from 'utils/testRenderer'; import { render } from 'utils/testRenderer';
import { UIProviderContainer } from 'component/providers/UIProvider/UIProviderContainer';
import { AdvancedPlaygroundResultsTable } from './AdvancedPlaygroundResultsTable'; import { AdvancedPlaygroundResultsTable } from './AdvancedPlaygroundResultsTable';
test('should render advanced playground table', async () => { test('should render advanced playground table', async () => {
render( render(
<UIProviderContainer>
<AdvancedPlaygroundResultsTable <AdvancedPlaygroundResultsTable
loading={false} loading={false}
features={[ features={[
@ -31,8 +29,7 @@ test('should render advanced playground table', async () => {
}, },
result: { result: {
enabled: true, enabled: true,
evaluationStatus: evaluationStatus: 'complete',
'complete',
}, },
constraints: [], constraints: [],
segments: [], segments: [],
@ -47,8 +44,7 @@ test('should render advanced playground table', async () => {
parameters: {}, parameters: {},
result: { result: {
enabled: true, enabled: true,
evaluationStatus: evaluationStatus: 'complete',
'complete',
}, },
constraints: [], constraints: [],
segments: [], segments: [],
@ -102,8 +98,7 @@ test('should render advanced playground table', async () => {
appName: 'MyApp', appName: 'MyApp',
}, },
}} }}
/> />,
</UIProviderContainer>,
); );
expect(screen.getByText('Infinite')).toBeInTheDocument(); expect(screen.getByText('Infinite')).toBeInTheDocument();

View File

@ -1,7 +1,6 @@
import { screen } from '@testing-library/react'; import { screen } from '@testing-library/react';
import { render } from 'utils/testRenderer'; import { render } from 'utils/testRenderer';
import { PlaygroundEnvironmentDiffTable } from './PlaygroundEnvironmentDiffTable'; import { PlaygroundEnvironmentDiffTable } from './PlaygroundEnvironmentDiffTable';
import { UIProviderContainer } from '../../../providers/UIProvider/UIProviderContainer';
const irrelevantDetails = { const irrelevantDetails = {
strategies: { strategies: {
@ -23,7 +22,6 @@ const irrelevantDetails = {
test('should render environment diff table', async () => { test('should render environment diff table', async () => {
render( render(
<UIProviderContainer>
<PlaygroundEnvironmentDiffTable <PlaygroundEnvironmentDiffTable
features={{ features={{
development: [ development: [
@ -53,8 +51,7 @@ test('should render environment diff table', async () => {
}, },
], ],
}} }}
/> />,
</UIProviderContainer>,
); );
expect(screen.getByText('web')).toBeInTheDocument(); expect(screen.getByText('web')).toBeInTheDocument();

View File

@ -1,11 +1,9 @@
import { screen } from '@testing-library/react'; import { screen } from '@testing-library/react';
import { render } from 'utils/testRenderer'; import { render } from 'utils/testRenderer';
import { PlaygroundEnvironmentTable } from './PlaygroundEnvironmentTable'; import { PlaygroundEnvironmentTable } from './PlaygroundEnvironmentTable';
import { UIProviderContainer } from '../../../providers/UIProvider/UIProviderContainer';
test('should render environment table', async () => { test('should render environment table', async () => {
render( render(
<UIProviderContainer>
<PlaygroundEnvironmentTable <PlaygroundEnvironmentTable
features={[ features={[
{ {
@ -34,8 +32,7 @@ test('should render environment table', async () => {
}, },
}, },
]} ]}
/> />,
</UIProviderContainer>,
); );
expect(screen.getByText('web')).toBeInTheDocument(); expect(screen.getByText('web')).toBeInTheDocument();

View File

@ -1,8 +1,7 @@
import { render } from '../../../utils/testRenderer'; import { render } from 'utils/testRenderer';
import { screen } from '@testing-library/react'; import { screen } from '@testing-library/react';
import { SegmentTable } from './SegmentTable'; import { SegmentTable } from './SegmentTable';
import { testServerRoute, testServerSetup } from '../../../utils/testServer'; import { testServerRoute, testServerSetup } from 'utils/testServer';
import { UIProviderContainer } from '../../providers/UIProvider/UIProviderContainer';
const server = testServerSetup(); const server = testServerSetup();
@ -31,11 +30,7 @@ const setupRoutes = () => {
test('should show the count of projects and features used in', async () => { test('should show the count of projects and features used in', async () => {
setupRoutes(); setupRoutes();
render( render(<SegmentTable />);
<UIProviderContainer>
<SegmentTable />
</UIProviderContainer>,
);
await screen.findByText('2 feature toggles'); await screen.findByText('2 feature toggles');
await screen.findByText('3 projects'); await screen.findByText('3 projects');

View File

@ -3,7 +3,6 @@ import { render } from 'utils/testRenderer';
import { testServerRoute, testServerSetup } from 'utils/testServer'; import { testServerRoute, testServerSetup } from 'utils/testServer';
import { PasswordTab } from './PasswordTab'; import { PasswordTab } from './PasswordTab';
import userEvent from '@testing-library/user-event'; import userEvent from '@testing-library/user-event';
import { UIProviderContainer } from '../../../providers/UIProvider/UIProviderContainer';
const server = testServerSetup(); const server = testServerSetup();
testServerRoute(server, '/api/admin/ui-config', {}); testServerRoute(server, '/api/admin/ui-config', {});
@ -16,11 +15,7 @@ testServerRoute(server, '/auth/reset/validate-password', {}, 'post');
test('should render authorization error on missing old password', async () => { test('should render authorization error on missing old password', async () => {
const user = userEvent.setup(); const user = userEvent.setup();
render( render(<PasswordTab />);
<UIProviderContainer>
<PasswordTab />
</UIProviderContainer>,
);
await screen.findByText('Change password'); await screen.findByText('Change password');
const passwordInput = await screen.findByLabelText('Password'); const passwordInput = await screen.findByLabelText('Password');

View File

@ -6,6 +6,7 @@ import { ThemeProvider } from 'themes/ThemeProvider';
import { IPermission } from 'interfaces/user'; import { IPermission } from 'interfaces/user';
import { AnnouncerProvider } from 'component/common/Announcer/AnnouncerProvider/AnnouncerProvider'; import { AnnouncerProvider } from 'component/common/Announcer/AnnouncerProvider/AnnouncerProvider';
import { AccessProviderMock } from 'component/providers/AccessProvider/AccessProviderMock'; import { AccessProviderMock } from 'component/providers/AccessProvider/AccessProviderMock';
import { UIProviderContainer } from '../component/providers/UIProvider/UIProviderContainer';
export const render = ( export const render = (
ui: JSX.Element, ui: JSX.Element,
@ -21,6 +22,7 @@ export const render = (
window.history.pushState({}, 'Test page', route); window.history.pushState({}, 'Test page', route);
const Wrapper: FC = ({ children }) => ( const Wrapper: FC = ({ children }) => (
<UIProviderContainer>
<SWRConfig value={{ provider: () => new Map() }}> <SWRConfig value={{ provider: () => new Map() }}>
<AccessProviderMock permissions={permissions}> <AccessProviderMock permissions={permissions}>
<ThemeProvider> <ThemeProvider>
@ -30,6 +32,7 @@ export const render = (
</ThemeProvider> </ThemeProvider>
</AccessProviderMock> </AccessProviderMock>
</SWRConfig> </SWRConfig>
</UIProviderContainer>
); );
return rtlRender(ui, { return rtlRender(ui, {