import * as React from 'react';
import { render, screen } from '@testing-library/react';
import {
AccessControlWithLinkTypeProvided,
InferredEditLink,
InferredEditLinkWithAccessControl,
InferredShowLink,
InferredShowLinkWithAccessControl,
NoAuthProvider,
SlowLoading,
} from './useGetPathForRecord.stories';
import { AuthProvider } from '../types';
describe('useGetPathForRecord', () => {
it('should return an edit path for a record when there is no authProvider', async () => {
render();
expect(
(await screen.findByText('Edit', { selector: 'a' })).getAttribute(
'href'
)
).toEqual('/posts/123');
});
it('should return a show path for a record when there is no authProvider', async () => {
render();
expect(
(await screen.findByText('Show', { selector: 'a' })).getAttribute(
'href'
)
).toEqual('/posts/123/show');
});
it('should infer an edit path for a record when there is no authProvider and no show view for the resource', async () => {
render();
expect(
(await screen.findByText('Link', { selector: 'a' })).getAttribute(
'href'
)
).toEqual('/posts/123');
});
it('should infer a show path for a record when there is no authProvider and a show view for the resource', async () => {
render();
expect(
(await screen.findByText('Link', { selector: 'a' })).getAttribute(
'href'
)
).toEqual('/posts/123/show');
});
it('should not check for access right when the link type is provided', async () => {
const authProvider: AuthProvider = {
login: () => Promise.resolve(),
logout: () => Promise.resolve(),
checkAuth: () => Promise.resolve(),
checkError: () => Promise.resolve(),
getPermissions: () => Promise.resolve(),
canAccess: jest.fn(),
};
render(
);
expect(
(await screen.findByText('Edit', { selector: 'a' })).getAttribute(
'href'
)
).toEqual('/posts/123');
expect(
(await screen.findByText('Show', { selector: 'a' })).getAttribute(
'href'
)
).toEqual('/posts/123/show');
expect(authProvider.canAccess).not.toHaveBeenCalled();
});
it('should infer an edit path for a record when users have access to the edit action and no show view for the resource', async () => {
render();
expect(
(await screen.findByText('Link', { selector: 'a' })).getAttribute(
'href'
)
).toEqual('/posts/123');
});
it('should infer a show path for a record when users have access to the edit action and a show view for the resource', async () => {
render();
expect(
(await screen.findByText('Link', { selector: 'a' })).getAttribute(
'href'
)
).toEqual('/posts/123/show');
});
it('should recompute the path when the record changes', async () => {
render();
await screen.findByText('Show no link');
screen.getByText('Load record').click();
const link = await screen.findByText('Show', { selector: 'a' });
expect(link.getAttribute('href')).toEqual('/posts/123/show');
});
});