1
0
mirror of https://github.com/Unleash/unleash.git synced 2025-11-10 01:19:53 +01:00
unleash.unleash/frontend/src/component/feature/Dependencies/AddDependencyDialogue.test.tsx
Jaanus Sellin 3acb3ad2c2
feat: upgrade from react v17 to v18 (#7265)
**Upgrade to React v18 for Unleash v6. Here's why I think it's a good
time to do it:**
- Command Bar project: We've begun work on the command bar project, and
there's a fantastic library we want to use. However, it requires React
v18 support.
- Straightforward Upgrade: I took a look at the upgrade guide
https://react.dev/blog/2022/03/08/react-18-upgrade-guide and it seems
fairly straightforward. In fact, I was able to get React v18 running
with minimal changes in just 10 minutes!
- Dropping IE Support: React v18 no longer supports Internet Explorer
(IE), which is no longer supported by Microsoft as of June 15, 2022.
Upgrading to v18 in v6 would be a good way to align with this change.

TS updates:
* FC children has to be explicit:
https://stackoverflow.com/questions/71788254/react-18-typescript-children-fc
* forcing version 18 types in resolutions:
https://sentry.io/answers/type-is-not-assignable-to-type-reactnode/

Test updates:
* fixing SWR issue that we have always had but it manifests more in new
React (https://github.com/vercel/swr/issues/2373)

---------

Co-authored-by: kwasniew <kwasniewski.mateusz@gmail.com>
2024-06-11 13:59:52 +03:00

214 lines
5.8 KiB
TypeScript

import { fireEvent, screen, waitFor } from '@testing-library/react';
import { render } from 'utils/testRenderer';
import { AddDependencyDialogue } from './AddDependencyDialogue';
import { testServerRoute, testServerSetup } from 'utils/testServer';
import { http, HttpResponse } from 'msw';
import type { IDependency } from 'interfaces/featureToggle';
import type { IChangeSchema } from 'hooks/api/actions/useChangeRequestApi/useChangeRequestApi';
const server = testServerSetup();
const setupApi = () => {
testServerRoute(server, '/api/admin/ui-config', {
versionInfo: {
current: { oss: 'irrelevant', enterprise: 'some value' },
},
});
testServerRoute(
server,
'/api/admin/projects/default/features/child/dependencies',
{},
'delete',
);
testServerRoute(
server,
'/api/admin/projects/default/features/child/dependencies',
{},
'post',
);
testServerRoute(
server,
'/api/admin/projects/default/features/parentA/parent-variants',
['variantA', 'variantB'],
);
testServerRoute(
server,
'/api/admin/projects/default/features/child/parents',
['parentA', 'parentB'],
);
testServerRoute(server, '/api/admin/projects/default/features/child', {
dependencies: [{ feature: 'parentB', enabled: true, variants: [] }],
});
};
const setupChangeRequestApi = () => {
testServerRoute(
server,
'/api/admin/projects/default/change-requests/config',
[
{
environment: 'development',
type: 'development',
requiredApprovals: null,
changeRequestEnabled: true,
},
],
);
testServerRoute(
server,
'api/admin/projects/default/change-requests/pending',
[],
);
};
test('Delete dependency', async () => {
let closed = false;
setupApi();
render(
<AddDependencyDialogue
project='default'
featureId='child'
showDependencyDialogue={true}
onClose={() => {
closed = true;
}}
/>,
);
const removeDependency = await screen.findByText('Remove');
await waitFor(() => {
expect(removeDependency).not.toBeDisabled();
});
removeDependency.click();
await waitFor(() => {
expect(closed).toBe(true);
});
});
test.skip('Edit dependency', async () => {
let closed = false;
let dependency: IDependency;
setupApi();
server.use(
http.post(
'/api/admin/projects/default/features/child/dependencies',
async ({ request }) => {
dependency = (await request.json()) as IDependency;
return new HttpResponse(null, { status: 200 });
},
),
);
render(
<AddDependencyDialogue
project='default'
featureId='child'
parentDependency={{ feature: 'parentB' }}
showDependencyDialogue={true}
onClose={() => {
closed = true;
}}
/>,
);
const addDependency = await screen.findByText('Add');
await waitFor(() => {
expect(addDependency).not.toBeDisabled();
});
// Open the dropdown by selecting the role.
const [featureDropdown, featureStatusDropdown] =
screen.queryAllByRole('combobox');
await waitFor(() => {
expect(featureDropdown.innerHTML).toBe('parentB');
});
fireEvent.click(featureDropdown);
// select parent
const parentAOption = await screen.findByText('parentA');
fireEvent.click(parentAOption);
// select parent status
await screen.findByText('feature status');
expect(featureStatusDropdown.innerHTML).toBe('enabled');
fireEvent.click(featureStatusDropdown);
const enabledWithVariants = await screen.findByText(
'enabled with variants',
);
fireEvent.click(enabledWithVariants);
// select variant
await screen.findByText('variant');
const variantDropdown = await screen.findByPlaceholderText('Select values');
fireEvent.click(variantDropdown);
const variantA = await screen.findByText('variantA');
fireEvent.click(variantA);
// add dependency
const addButton = await screen.findByText('Add');
fireEvent.click(addButton);
await screen.findByText('Client SDK support for feature dependencies');
await waitFor(() => {
expect(closed).toBe(true);
expect(dependency).toEqual({
feature: 'parentA',
enabled: true,
variants: ['variantA'],
});
});
});
test('Add change to draft', async () => {
let closed = false;
let change: IChangeSchema[];
setupApi();
setupChangeRequestApi();
server.use(
http.post(
'/api/admin/projects/default/environments/development/change-requests',
async ({ request }) => {
change = (await request.json()) as IChangeSchema[];
return new HttpResponse(null, { status: 201 });
},
),
);
render(
<AddDependencyDialogue
project='default'
featureId='child'
parentDependency={{ feature: 'parentB' }}
showDependencyDialogue={true}
onClose={() => {
closed = true;
}}
/>,
);
const addChangeToDraft = await screen.findByText('Add change to draft');
fireEvent.click(addChangeToDraft);
await waitFor(() => {
expect(closed).toBe(true);
expect(change).toEqual([
{
action: 'addDependency',
feature: 'child',
payload: { feature: 'parentB', enabled: true, variants: [] },
},
]);
});
});