Skip to content

Commit

Permalink
improve coverage for Organizations component
Browse files Browse the repository at this point in the history
  • Loading branch information
Harshvardhan-91 committed Jan 26, 2025
1 parent 5fdeaf2 commit bd49d3c
Show file tree
Hide file tree
Showing 2 changed files with 184 additions and 43 deletions.
155 changes: 155 additions & 0 deletions src/screens/UserPortal/Organizations/Organizations.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,65 @@ const MOCKS = [
},
},
];
// Error mocks
const ERROR_MOCKS = [
{
request: {
query: USER_ORGANIZATION_CONNECTION,
variables: { filter: '' },
},
error: new Error('Failed to fetch organizations'),
},
{
request: {
query: USER_JOINED_ORGANIZATIONS,
variables: { id: getItem('userId') },
},
error: new Error('Failed to fetch joined organizations'),
},
];

// Empty data mocks
const EMPTY_MOCKS = [
{
request: {
query: USER_ORGANIZATION_CONNECTION,
variables: { filter: '' },
},
result: {
data: {
organizationsConnection: [],
},
},
},
{
request: {
query: USER_JOINED_ORGANIZATIONS,
variables: { id: getItem('userId') },
},
result: {
data: {
users: [],
},
},
},
];

// Loading state mock
const LOADING_MOCKS = [
{
request: {
query: USER_ORGANIZATION_CONNECTION,
variables: { filter: '' },
},
result: {
data: {
organizationsConnection: [],
},
},
delay: 2000, // Simulates loading state
},
];
/**
* Custom Mock Link for handling static GraphQL mocks.
*/
Expand Down Expand Up @@ -591,4 +649,101 @@ describe('Testing Organizations Screen [User Portal]', () => {
const searchInput = screen.getByPlaceholderText('Search Organization');
expect(searchInput).toBeInTheDocument();
});
// New test cases
test('handles pagination changes correctly', async () => {
render(
<MockedProvider addTypename={false} link={link}>
<BrowserRouter>
<Provider store={store}>
<I18nextProvider i18n={i18nForTest}>
<Organizations />
</I18nextProvider>
</Provider>
</BrowserRouter>
</MockedProvider>,
);

await wait();
const rowsPerPageSelect = screen.getByTestId('table-pagination');
fireEvent.change(rowsPerPageSelect, { target: { value: '10' } });
expect(screen.getByText('10')).toBeInTheDocument();

const nextPageButton = screen.getByLabelText('Go to next page');
fireEvent.click(nextPageButton);
});

test('handles loading state correctly', async () => {
const loadingLink = new StaticMockLink(LOADING_MOCKS, true);
render(
<MockedProvider addTypename={false} link={loadingLink}>
<BrowserRouter>
<Provider store={store}>
<I18nextProvider i18n={i18nForTest}>
<Organizations />
</I18nextProvider>
</Provider>
</BrowserRouter>
</MockedProvider>,
);

expect(screen.getByText('Loading...')).toBeInTheDocument();
});

test('handles empty state correctly', async () => {
const emptyLink = new StaticMockLink(EMPTY_MOCKS, true);
render(
<MockedProvider addTypename={false} link={emptyLink}>
<BrowserRouter>
<Provider store={store}>
<I18nextProvider i18n={i18nForTest}>
<Organizations />
</I18nextProvider>
</Provider>
</BrowserRouter>
</MockedProvider>,
);

await wait();
expect(screen.getByText('nothingToShow')).toBeInTheDocument();
});

test('handles error state correctly', async () => {
const errorLink = new StaticMockLink(ERROR_MOCKS, true);
render(
<MockedProvider addTypename={false} link={errorLink}>
<BrowserRouter>
<Provider store={store}>
<I18nextProvider i18n={i18nForTest}>
<Organizations />
</I18nextProvider>
</Provider>
</BrowserRouter>
</MockedProvider>,
);

await wait();
expect(
screen.getByText('Failed to fetch organizations'),
).toBeInTheDocument();
});

test('handles window resize events correctly', async () => {
render(
<MockedProvider addTypename={false} link={link}>
<BrowserRouter>
<Provider store={store}>
<I18nextProvider i18n={i18nForTest}>
<Organizations />
</I18nextProvider>
</Provider>
</BrowserRouter>
</MockedProvider>,
);

await wait();
resizeWindow(1000);
expect(screen.getByTestId('closeMenu')).toBeInTheDocument();
resizeWindow(800);
expect(screen.getByTestId('openMenu')).toBeInTheDocument();
});
});
72 changes: 29 additions & 43 deletions src/screens/UserPortal/Organizations/Organizations.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,6 @@ export default function organizations(): JSX.Element {
* @param _event - The event triggering the page change.
* @param newPage - The new page number.
*/
/* istanbul ignore next */
const handleChangePage = (
_event: React.MouseEvent<HTMLButtonElement> | null,
newPage: number,
Expand All @@ -152,12 +151,10 @@ export default function organizations(): JSX.Element {
*
* @param event - The event triggering the change.
*/
/* istanbul ignore next */
const handleChangeRowsPerPage = (
event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,
): void => {
const newRowsPerPage = event.target.value;

setRowsPerPage(parseInt(newRowsPerPage, 10));
setPage(0);
};
Expand Down Expand Up @@ -202,7 +199,6 @@ export default function organizations(): JSX.Element {
/**
* Updates the list of organizations based on query results and selected mode.
*/
/* istanbul ignore next */
useEffect(() => {
if (data) {
const organizations = data.organizationsConnection.map(
Expand All @@ -226,52 +222,42 @@ export default function organizations(): JSX.Element {
);
setOrganizations(organizations);
}
}, [data]);
}, [data, userId]);

/**
* Updates the list of organizations based on the selected mode and query results.
*/
/* istanbul ignore next */
useEffect(() => {
if (mode === 0) {
if (data) {
const organizations = data.organizationsConnection.map(
(organization: InterfaceOrganization) => {
let membershipRequestStatus = '';
if (
organization.members.find(
(member: { _id: string }) => member._id === userId,
)
if (mode === 0 && data) {
const organizations = data.organizationsConnection.map(
(organization: InterfaceOrganization) => {
let membershipRequestStatus = '';
if (
organization.members.find(
(member: { _id: string }) => member._id === userId,
)
membershipRequestStatus = 'accepted';
else if (
organization.membershipRequests.find(
(request: { user: { _id: string } }) =>
request.user._id === userId,
)
)
membershipRequestStatus = 'accepted';
else if (
organization.membershipRequests.find(
(request: { user: { _id: string } }) =>
request.user._id === userId,
)
membershipRequestStatus = 'pending';
return { ...organization, membershipRequestStatus };
},
);
setOrganizations(organizations);
}
} else if (mode === 1) {
if (joinedOrganizationsData && joinedOrganizationsData.users.length > 0) {
const organizations =
joinedOrganizationsData.users[0]?.user?.joinedOrganizations || [];
setOrganizations(organizations);
}
} else if (mode === 2) {
if (
createdOrganizationsData &&
createdOrganizationsData.users.length > 0
) {
const organizations =
createdOrganizationsData.users[0]?.appUserProfile
?.createdOrganizations || [];
setOrganizations(organizations);
}
)
membershipRequestStatus = 'pending';
return { ...organization, membershipRequestStatus };
},
);
setOrganizations(organizations);
} else if (mode === 1 && joinedOrganizationsData?.users?.length > 0) {
const organizations =
joinedOrganizationsData.users[0]?.user?.joinedOrganizations || [];
setOrganizations(organizations);
} else if (mode === 2 && createdOrganizationsData?.users?.length > 0) {
const organizations =
createdOrganizationsData.users[0]?.appUserProfile
?.createdOrganizations || [];
setOrganizations(organizations);
}
}, [mode, data, joinedOrganizationsData, createdOrganizationsData, userId]);

Expand Down

0 comments on commit bd49d3c

Please sign in to comment.