@plone/volto
Version:
Volto
231 lines (211 loc) • 6.19 kB
JSX
import React from 'react';
import renderer from 'react-test-renderer';
import { Provider } from 'react-intl-redux';
import configureStore from 'redux-mock-store';
import { render } from '@testing-library/react';
import { MemoryRouter } from 'react-router-dom';
import UniversalLink from './UniversalLink';
import config from '@plone/volto/registry';
const mockStore = configureStore();
const store = mockStore({
userSession: {
token: null,
},
intl: {
locale: 'en',
messages: {},
},
});
global.console.error = jest.fn();
describe('UniversalLink', () => {
it('renders a UniversalLink component with internal link', () => {
const component = renderer.create(
<Provider store={store}>
<MemoryRouter>
<UniversalLink href={'/en/welcome-to-volto'}>
<h1>Title</h1>
</UniversalLink>
</MemoryRouter>
</Provider>,
);
const json = component.toJSON();
expect(json).toMatchSnapshot();
});
it('renders a UniversalLink component with external link', () => {
const component = renderer.create(
<Provider store={store}>
<MemoryRouter>
<UniversalLink href="https://github.com/plone/volto">
<h1>Title</h1>
</UniversalLink>
</MemoryRouter>
</Provider>,
);
const json = component.toJSON();
expect(json).toMatchSnapshot();
});
it('renders a UniversalLink component if no external(href) link passed', () => {
const component = renderer.create(
<Provider store={store}>
<MemoryRouter>
<UniversalLink
item={{
'@id': 'http://localhost:3000/en/welcome-to-volto',
}}
>
<h1>Title</h1>
</UniversalLink>
</MemoryRouter>
</Provider>,
);
const json = component.toJSON();
expect(json).toMatchSnapshot();
});
it('check UniversalLink set rel attribute for ext links', () => {
const { getByTitle } = render(
<Provider store={store}>
<MemoryRouter>
<UniversalLink
href="https://github.com/plone/volto"
title="Volto GitHub repository"
>
<h1>Title</h1>
</UniversalLink>
</MemoryRouter>
</Provider>,
);
expect(getByTitle('Volto GitHub repository').getAttribute('rel')).toBe(
'noopener noreferrer',
);
});
it('check UniversalLink set target attribute for ext links', () => {
const { getByTitle } = render(
<Provider store={store}>
<MemoryRouter>
<UniversalLink
href="https://github.com/plone/volto"
title="Volto GitHub repository"
>
<h1>Title</h1>
</UniversalLink>
</MemoryRouter>
</Provider>,
);
expect(getByTitle('Volto GitHub repository').getAttribute('target')).toBe(
'_blank',
);
});
it('check UniversalLink can unset target for ext links with prop', () => {
const { getByTitle } = render(
<Provider store={store}>
<MemoryRouter>
<UniversalLink
href="https://github.com/plone/volto"
title="Volto GitHub repository"
openLinkInNewTab={false}
>
<h1>Title</h1>
</UniversalLink>
</MemoryRouter>
</Provider>,
);
expect(getByTitle('Volto GitHub repository').getAttribute('target')).toBe(
null,
);
});
it('check UniversalLink renders ext link for blacklisted urls', () => {
config.settings.externalRoutes = [
{
match: {
path: '/external-app',
exact: true,
strict: false,
},
url(payload) {
return payload.location.pathname;
},
},
];
const { getByTitle } = render(
<Provider store={store}>
<MemoryRouter>
<UniversalLink
href="http://localhost:3000/external-app"
title="Blacklisted route"
>
<h1>Title</h1>
</UniversalLink>
</MemoryRouter>
</Provider>,
);
expect(getByTitle('Blacklisted route').getAttribute('target')).toBe(
'_blank',
);
});
it('UniversalLink renders external link where link is blacklisted', () => {
const notInEN =
/^(?!.*(#|\/en|\/static|\/controlpanel|\/cypress|\/login|\/logout|\/contact-form)).*$/;
config.settings.externalRoutes = [
{
match: {
path: notInEN,
exact: false,
strict: false,
},
url(payload) {
return payload.location.pathname;
},
},
];
const { getByTitle } = render(
<Provider store={store}>
<MemoryRouter>
<UniversalLink
href="http://localhost:3000/blacklisted-app"
title="External blacklisted app"
>
<h1>Title</h1>
</UniversalLink>
</MemoryRouter>
</Provider>,
);
expect(getByTitle('External blacklisted app').getAttribute('target')).toBe(
'_blank',
);
expect(getByTitle('External blacklisted app').getAttribute('rel')).toBe(
'noopener noreferrer',
);
});
it('check UniversalLink does not break with error in item', () => {
const component = renderer.create(
<Provider store={store}>
<MemoryRouter>
<UniversalLink
item={{
error: 'Error while fetching content',
message: 'Something went wrong',
}}
>
<h1>Title</h1>
</UniversalLink>
</MemoryRouter>
</Provider>,
);
const json = component.toJSON();
expect(json).toMatchSnapshot();
expect(global.console.error).toHaveBeenCalled();
});
});
it('renders a UniversalLink component when url ends with @@display-file', () => {
const component = renderer.create(
<Provider store={store}>
<MemoryRouter>
<UniversalLink href="http://localhost:3000/en/welcome-to-volto/@@display-file">
<h1>Title</h1>
</UniversalLink>
</MemoryRouter>
</Provider>,
);
const json = component.toJSON();
expect(json).toMatchSnapshot();
});