Skip to content

Commit c36f942

Browse files
committed
Test coverage: use-link-handler
1 parent 83853da commit c36f942

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

src/app/components/shell/router-helpers/use-link-handler.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export default function useLinkHandler() {
3939
(path: Location['href'], state: State = {x: 0, y: 0}) => {
4040
let adjustedPath = linkHelper.stripOpenStaxDomain(path);
4141

42-
if (portal && !adjustedPath.startsWith(`/${portal}`)) {
42+
if (portal) {
4343
adjustedPath = `/${portal}${adjustedPath}`;
4444
}
4545
navigate(adjustedPath, state);

test/src/components/shell/use-link-handler.test.tsx

+32-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ import useLinkHandler, {
77
} from '~/components/shell/router-helpers/use-link-handler';
88
import linkHelper from '~/helpers/link';
99
import {useNavigate, MemoryRouter} from 'react-router-dom';
10+
import * as PC from '~/contexts/portal';
11+
12+
// @ts-expect-error does not exist on
13+
const {routerFuture} = global;
14+
const saveError = console.error;
1015

1116
jest.mock('react-router-dom', () => ({
1217
...jest.requireActual('react-router-dom'),
@@ -36,7 +41,7 @@ describe('use-link-handler', () => {
3641
return <a href="https://dev.openstax.org/some-url" onClick={onClick} />;
3742
};
3843
const Component = (props: Parameters<typeof InnerComponent>[0]) => (
39-
<MemoryRouter initialEntries={['/']}>
44+
<MemoryRouter initialEntries={['/']} future={routerFuture}>
4045
<InnerComponent {...props} />
4146
</MemoryRouter>
4247
);
@@ -77,10 +82,32 @@ describe('use-link-handler', () => {
7782
(useNavigate as jest.Mock).mockReturnValue(navigate);
7883

7984
render(<Component />);
85+
console.error = jest.fn();
8086
await user.click(screen.getByRole('link'));
87+
console.error = saveError;
8188
expect(notPrevented).not.toBeCalled();
8289
expect(navigate).toBeCalledWith('whatever', {x: 0, y: 0});
8390
});
91+
it('rewrites URL when in portal', async () => {
92+
const navigate = jest.fn();
93+
const el = document.createElement('a');
94+
95+
jest.spyOn(linkHelper, 'validUrlClick').mockReturnValue(el);
96+
jest.spyOn(linkHelper, 'stripOpenStaxDomain').mockReturnValue(
97+
'/whatever'
98+
);
99+
const spyPC = jest.spyOn(PC, 'default').mockReturnValueOnce({portal: 'a-portal', setPortal: jest.fn()});
100+
101+
(useNavigate as jest.Mock).mockReturnValue(navigate);
102+
103+
render(<Component />);
104+
console.error = jest.fn();
105+
await user.click(screen.getByRole('link'));
106+
console.error = saveError;
107+
expect(notPrevented).not.toBeCalled();
108+
expect(navigate).toBeCalledWith('/a-portal/whatever', {x: 0, y: 0});
109+
spyPC.mockRestore();
110+
});
84111
it('calls piTracker if available', async () => {
85112
type WindowWithPiTracker = (typeof window) & {
86113
piTracker: (path: string) => void;
@@ -123,7 +150,9 @@ describe('use-link-handler', () => {
123150
(useNavigate as jest.Mock).mockReturnValue(navigate);
124151

125152
render(<Component />);
153+
console.error = jest.fn();
126154
await user.click(screen.getByRole('link'));
155+
console.error = saveError;
127156
expect(notPrevented).not.toBeCalled();
128157
expect(navigate).not.toBeCalled();
129158
});
@@ -144,7 +173,9 @@ describe('use-link-handler', () => {
144173
(useNavigate as jest.Mock).mockReturnValue(navigate);
145174

146175
render(<Component />);
176+
console.error = jest.fn();
147177
await user.click(screen.getByRole('link'));
178+
console.error = saveError;
148179
expect(notPrevented).not.toBeCalled();
149180
expect(navigate).not.toBeCalled();
150181
});

0 commit comments

Comments
 (0)