Add tests on Editable relation (#188)
This commit is contained in:
@ -130,7 +130,7 @@
|
|||||||
"workerDirectory": "public"
|
"workerDirectory": "public"
|
||||||
},
|
},
|
||||||
"nyc": {
|
"nyc": {
|
||||||
"lines": 60,
|
"lines": 65,
|
||||||
"statements": 60
|
"statements": 65
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,16 +4,17 @@ import { userEvent, within } from '@storybook/testing-library';
|
|||||||
|
|
||||||
import People from '../People';
|
import People from '../People';
|
||||||
import { Story } from './People.stories';
|
import { Story } from './People.stories';
|
||||||
import { mocks, render } from './shared';
|
import { render } from './shared';
|
||||||
|
import { graphqlMocks } from '../../../testing/graphqlMocks';
|
||||||
|
|
||||||
const meta: Meta<typeof People> = {
|
const meta: Meta<typeof People> = {
|
||||||
title: 'Pages/People',
|
title: 'Pages/People/FilterBy',
|
||||||
component: People,
|
component: People,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default meta;
|
export default meta;
|
||||||
|
|
||||||
export const FilterByEmail: Story = {
|
export const Email: Story = {
|
||||||
render,
|
render,
|
||||||
play: async ({ canvasElement }) => {
|
play: async ({ canvasElement }) => {
|
||||||
const canvas = within(canvasElement);
|
const canvas = within(canvasElement);
|
||||||
@ -36,11 +37,11 @@ export const FilterByEmail: Story = {
|
|||||||
expect(await canvas.findByText('Contains al')).toBeInTheDocument();
|
expect(await canvas.findByText('Contains al')).toBeInTheDocument();
|
||||||
},
|
},
|
||||||
parameters: {
|
parameters: {
|
||||||
msw: mocks,
|
msw: graphqlMocks,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export const FilterByCompanyName: Story = {
|
export const CompanyName: Story = {
|
||||||
render,
|
render,
|
||||||
play: async ({ canvasElement }) => {
|
play: async ({ canvasElement }) => {
|
||||||
const canvas = within(canvasElement);
|
const canvas = within(canvasElement);
|
||||||
@ -66,6 +67,6 @@ export const FilterByCompanyName: Story = {
|
|||||||
expect(await canvas.findByText('Is Qonto')).toBeInTheDocument();
|
expect(await canvas.findByText('Is Qonto')).toBeInTheDocument();
|
||||||
},
|
},
|
||||||
parameters: {
|
parameters: {
|
||||||
msw: mocks,
|
msw: graphqlMocks,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@ -4,18 +4,22 @@ import { userEvent, within } from '@storybook/testing-library';
|
|||||||
|
|
||||||
import People from '../People';
|
import People from '../People';
|
||||||
import { Story } from './People.stories';
|
import { Story } from './People.stories';
|
||||||
import { mocks, render } from './shared';
|
import { render } from './shared';
|
||||||
import { mockedPeopleData } from '../../../testing/mock-data/people';
|
import { mockedPeopleData } from '../../../testing/mock-data/people';
|
||||||
import { sleep } from '../../../testing/sleep';
|
import { sleep } from '../../../testing/sleep';
|
||||||
|
import { graphqlMocks } from '../../../testing/graphqlMocks';
|
||||||
|
import { graphql } from 'msw';
|
||||||
|
import { fetchOneFromData } from '../../../testing/mock-data';
|
||||||
|
import { GraphqlQueryCompany } from '../../../interfaces/entities/company.interface';
|
||||||
|
|
||||||
const meta: Meta<typeof People> = {
|
const meta: Meta<typeof People> = {
|
||||||
title: 'Pages/People',
|
title: 'Pages/People/Input',
|
||||||
component: People,
|
component: People,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default meta;
|
export default meta;
|
||||||
|
|
||||||
export const ChangeEmail: Story = {
|
export const InteractWithManyRows: Story = {
|
||||||
render,
|
render,
|
||||||
play: async ({ canvasElement }) => {
|
play: async ({ canvasElement }) => {
|
||||||
const canvas = within(canvasElement);
|
const canvas = within(canvasElement);
|
||||||
@ -55,16 +59,16 @@ export const ChangeEmail: Story = {
|
|||||||
).toBeInTheDocument();
|
).toBeInTheDocument();
|
||||||
},
|
},
|
||||||
parameters: {
|
parameters: {
|
||||||
msw: mocks,
|
msw: graphqlMocks,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export const Checkbox: Story = {
|
export const CheckCheckboxes: Story = {
|
||||||
render,
|
render,
|
||||||
play: async ({ canvasElement }) => {
|
play: async ({ canvasElement }) => {
|
||||||
const canvas = within(canvasElement);
|
const canvas = within(canvasElement);
|
||||||
|
|
||||||
await sleep(500);
|
await canvas.findByText(mockedPeopleData[0].email);
|
||||||
|
|
||||||
const inputCheckboxContainers = await canvas.findAllByTestId(
|
const inputCheckboxContainers = await canvas.findAllByTestId(
|
||||||
'input-checkbox-cell-container',
|
'input-checkbox-cell-container',
|
||||||
@ -86,6 +90,62 @@ export const Checkbox: Story = {
|
|||||||
expect(secondCheckbox.checked).toBe(false);
|
expect(secondCheckbox.checked).toBe(false);
|
||||||
},
|
},
|
||||||
parameters: {
|
parameters: {
|
||||||
msw: mocks,
|
msw: graphqlMocks,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export const EditRelation: Story = {
|
||||||
|
render,
|
||||||
|
play: async ({ canvasElement }) => {
|
||||||
|
const canvas = within(canvasElement);
|
||||||
|
|
||||||
|
const secondRowCompanyCell = await canvas.findByText(
|
||||||
|
mockedPeopleData[1].company.name,
|
||||||
|
);
|
||||||
|
|
||||||
|
await userEvent.click(secondRowCompanyCell);
|
||||||
|
|
||||||
|
const relationInput = await canvas.findByPlaceholderText('Company');
|
||||||
|
|
||||||
|
await userEvent.type(relationInput, 'Air', {
|
||||||
|
delay: 200,
|
||||||
|
});
|
||||||
|
|
||||||
|
const airbnbChip = await canvas.findByText('Airbnb', {
|
||||||
|
selector: 'div > span',
|
||||||
|
});
|
||||||
|
|
||||||
|
await userEvent.click(airbnbChip);
|
||||||
|
|
||||||
|
const newSecondRowCompanyCell = await canvas.findByText('Airbnb');
|
||||||
|
|
||||||
|
await userEvent.click(newSecondRowCompanyCell);
|
||||||
|
},
|
||||||
|
parameters: {
|
||||||
|
actions: {},
|
||||||
|
msw: [
|
||||||
|
...graphqlMocks.filter((graphqlMock) => {
|
||||||
|
return graphqlMock.info.operationName !== 'UpdatePeople';
|
||||||
|
}),
|
||||||
|
...[
|
||||||
|
graphql.mutation('UpdatePeople', (req, res, ctx) => {
|
||||||
|
return res(
|
||||||
|
ctx.data({
|
||||||
|
updateOnePerson: {
|
||||||
|
...fetchOneFromData(mockedPeopleData, req.variables.id),
|
||||||
|
...{
|
||||||
|
company: {
|
||||||
|
id: req.variables.companyId,
|
||||||
|
name: 'Airbnb',
|
||||||
|
domainName: 'airbnb.com',
|
||||||
|
__typename: 'Company',
|
||||||
|
} satisfies GraphqlQueryCompany,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
],
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@ -4,16 +4,17 @@ import { userEvent, within } from '@storybook/testing-library';
|
|||||||
|
|
||||||
import People from '../People';
|
import People from '../People';
|
||||||
import { Story } from './People.stories';
|
import { Story } from './People.stories';
|
||||||
import { mocks, render } from './shared';
|
import { render } from './shared';
|
||||||
|
import { graphqlMocks } from '../../../testing/graphqlMocks';
|
||||||
|
|
||||||
const meta: Meta<typeof People> = {
|
const meta: Meta<typeof People> = {
|
||||||
title: 'Pages/People',
|
title: 'Pages/People/SortBy',
|
||||||
component: People,
|
component: People,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default meta;
|
export default meta;
|
||||||
|
|
||||||
export const SortByEmail: Story = {
|
export const Email: Story = {
|
||||||
render,
|
render,
|
||||||
play: async ({ canvasElement }) => {
|
play: async ({ canvasElement }) => {
|
||||||
const canvas = within(canvasElement);
|
const canvas = within(canvasElement);
|
||||||
@ -33,6 +34,24 @@ export const SortByEmail: Story = {
|
|||||||
return item.getAttribute('id');
|
return item.getAttribute('id');
|
||||||
})[1],
|
})[1],
|
||||||
).toStrictEqual('person-selected-7dfbc3f7-6e5e-4128-957e-8d86808cdf6b');
|
).toStrictEqual('person-selected-7dfbc3f7-6e5e-4128-957e-8d86808cdf6b');
|
||||||
|
},
|
||||||
|
parameters: {
|
||||||
|
msw: graphqlMocks,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export const Cancel: Story = {
|
||||||
|
render,
|
||||||
|
play: async ({ canvasElement }) => {
|
||||||
|
const canvas = within(canvasElement);
|
||||||
|
|
||||||
|
const sortButton = canvas.getByText('Sort');
|
||||||
|
await userEvent.click(sortButton);
|
||||||
|
|
||||||
|
const emailSortButton = canvas.getByText('Email', { selector: 'li' });
|
||||||
|
await userEvent.click(emailSortButton);
|
||||||
|
|
||||||
|
expect(await canvas.getByTestId('remove-icon-email')).toBeInTheDocument();
|
||||||
|
|
||||||
const cancelButton = canvas.getByText('Cancel');
|
const cancelButton = canvas.getByText('Cancel');
|
||||||
await userEvent.click(cancelButton);
|
await userEvent.click(cancelButton);
|
||||||
@ -42,6 +61,6 @@ export const SortByEmail: Story = {
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
parameters: {
|
parameters: {
|
||||||
msw: mocks,
|
msw: graphqlMocks,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@ -2,7 +2,8 @@ import type { Meta, StoryObj } from '@storybook/react';
|
|||||||
|
|
||||||
import People from '../People';
|
import People from '../People';
|
||||||
|
|
||||||
import { render, mocks } from './shared';
|
import { render } from './shared';
|
||||||
|
import { graphqlMocks } from '../../../testing/graphqlMocks';
|
||||||
|
|
||||||
const meta: Meta<typeof People> = {
|
const meta: Meta<typeof People> = {
|
||||||
title: 'Pages/People',
|
title: 'Pages/People',
|
||||||
@ -16,6 +17,6 @@ export type Story = StoryObj<typeof People>;
|
|||||||
export const Default: Story = {
|
export const Default: Story = {
|
||||||
render,
|
render,
|
||||||
parameters: {
|
parameters: {
|
||||||
msw: mocks,
|
msw: graphqlMocks,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1,49 +1,13 @@
|
|||||||
import { graphql } from 'msw';
|
|
||||||
import { RecoilRoot } from 'recoil';
|
import { RecoilRoot } from 'recoil';
|
||||||
import { ThemeProvider } from '@emotion/react';
|
import { ThemeProvider } from '@emotion/react';
|
||||||
import { MemoryRouter } from 'react-router-dom';
|
import { MemoryRouter } from 'react-router-dom';
|
||||||
import { ApolloProvider } from '@apollo/client';
|
import { ApolloProvider } from '@apollo/client';
|
||||||
|
|
||||||
import { filterAndSortData } from '../../../testing/mock-data';
|
|
||||||
import { mockedPeopleData } from '../../../testing/mock-data/people';
|
|
||||||
import { mockedCompaniesData } from '../../../testing/mock-data/companies';
|
|
||||||
import { GraphqlQueryCompany } from '../../../interfaces/entities/company.interface';
|
|
||||||
import { GraphqlQueryPerson } from '../../../interfaces/entities/person.interface';
|
|
||||||
|
|
||||||
import { lightTheme } from '../../../layout/styles/themes';
|
import { lightTheme } from '../../../layout/styles/themes';
|
||||||
import { FullHeightStorybookLayout } from '../../../testing/FullHeightStorybookLayout';
|
import { FullHeightStorybookLayout } from '../../../testing/FullHeightStorybookLayout';
|
||||||
import { mockedClient } from '../../../testing/mockedClient';
|
import { mockedClient } from '../../../testing/mockedClient';
|
||||||
import People from '../People';
|
import People from '../People';
|
||||||
|
|
||||||
export const mocks = [
|
|
||||||
graphql.query('GetPeople', (req, res, ctx) => {
|
|
||||||
const returnedMockedData = filterAndSortData<GraphqlQueryPerson>(
|
|
||||||
mockedPeopleData,
|
|
||||||
req.variables.where,
|
|
||||||
req.variables.orderBy,
|
|
||||||
req.variables.limit,
|
|
||||||
);
|
|
||||||
return res(
|
|
||||||
ctx.data({
|
|
||||||
people: returnedMockedData,
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}),
|
|
||||||
graphql.query('SearchCompanyQuery', (req, res, ctx) => {
|
|
||||||
const returnedMockedData = filterAndSortData<GraphqlQueryCompany>(
|
|
||||||
mockedCompaniesData,
|
|
||||||
req.variables.where,
|
|
||||||
req.variables.orderBy,
|
|
||||||
req.variables.limit,
|
|
||||||
);
|
|
||||||
return res(
|
|
||||||
ctx.data({
|
|
||||||
searchResults: returnedMockedData,
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}),
|
|
||||||
];
|
|
||||||
|
|
||||||
export function render() {
|
export function render() {
|
||||||
return (
|
return (
|
||||||
<RecoilRoot>
|
<RecoilRoot>
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { graphql } from 'msw';
|
import { graphql } from 'msw';
|
||||||
import { filterAndSortData } from './mock-data';
|
import { filterAndSortData, updateOneFromData } from './mock-data';
|
||||||
import { GraphqlQueryCompany } from '../interfaces/entities/company.interface';
|
import { GraphqlQueryCompany } from '../interfaces/entities/company.interface';
|
||||||
import { mockedCompaniesData } from './mock-data/companies';
|
import { mockedCompaniesData } from './mock-data/companies';
|
||||||
import { GraphqlQueryUser } from '../interfaces/entities/user.interface';
|
import { GraphqlQueryUser } from '../interfaces/entities/user.interface';
|
||||||
@ -61,7 +61,6 @@ export const graphqlMocks = [
|
|||||||
req.variables.orderBy,
|
req.variables.orderBy,
|
||||||
req.variables.limit,
|
req.variables.limit,
|
||||||
);
|
);
|
||||||
console.log({ returnedMockedData });
|
|
||||||
return res(
|
return res(
|
||||||
ctx.data({
|
ctx.data({
|
||||||
users: returnedMockedData,
|
users: returnedMockedData,
|
||||||
@ -81,4 +80,15 @@ export const graphqlMocks = [
|
|||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
}),
|
}),
|
||||||
|
graphql.mutation('UpdatePeople', (req, res, ctx) => {
|
||||||
|
return res(
|
||||||
|
ctx.data({
|
||||||
|
updateOnePerson: updateOneFromData(
|
||||||
|
mockedPeopleData,
|
||||||
|
req.variables.id,
|
||||||
|
req.variables,
|
||||||
|
),
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}),
|
||||||
];
|
];
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
import { GraphQLVariables } from 'msw';
|
||||||
import {
|
import {
|
||||||
CompanyOrderByWithRelationInput,
|
CompanyOrderByWithRelationInput,
|
||||||
PersonOrderByWithRelationInput,
|
PersonOrderByWithRelationInput,
|
||||||
@ -112,3 +113,21 @@ export function filterAndSortData<DataT>(
|
|||||||
|
|
||||||
return filteredData;
|
return filteredData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function fetchOneFromData<DataT extends { id: string }>(
|
||||||
|
data: Array<DataT>,
|
||||||
|
id: string,
|
||||||
|
): DataT | undefined {
|
||||||
|
return data.filter((item) => item.id === id)[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
export function updateOneFromData<DataT extends { id: string }>(
|
||||||
|
data: Array<DataT>,
|
||||||
|
id: string,
|
||||||
|
payload: GraphQLVariables,
|
||||||
|
): DataT | undefined {
|
||||||
|
const object = data.filter((item) => item.id === id)[0];
|
||||||
|
const newObject = Object.assign(object, payload);
|
||||||
|
|
||||||
|
return newObject;
|
||||||
|
}
|
||||||
|
|||||||
@ -3,14 +3,4 @@ import { ApolloClient, InMemoryCache } from '@apollo/client';
|
|||||||
export const mockedClient = new ApolloClient({
|
export const mockedClient = new ApolloClient({
|
||||||
uri: process.env.REACT_APP_API_URL,
|
uri: process.env.REACT_APP_API_URL,
|
||||||
cache: new InMemoryCache(),
|
cache: new InMemoryCache(),
|
||||||
defaultOptions: {
|
|
||||||
watchQuery: {
|
|
||||||
fetchPolicy: 'no-cache',
|
|
||||||
errorPolicy: 'all',
|
|
||||||
},
|
|
||||||
query: {
|
|
||||||
fetchPolicy: 'no-cache',
|
|
||||||
errorPolicy: 'all',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user