import * as React from 'react';
import expect from 'expect';
import { waitFor, render, fireEvent, screen } from '@testing-library/react';
import { Basic } from './useCanAccessCallback.stories';
describe('useCanAccessCallback', () => {
it('should return a function allowing to call authProvider.canAccess', async () => {
const canAccess = jest
.fn()
.mockImplementation(async ({ action }) => action === 'read');
const authProvider = {
login: () => Promise.reject('bad method'),
logout: () => Promise.reject('bad method'),
checkAuth: () => Promise.reject('bad method'),
checkError: () => Promise.reject('bad method'),
getPermissions: () => Promise.reject('bad method'),
canAccess,
};
render();
fireEvent.click(screen.getByText('Can I read posts'));
await waitFor(() => {
expect(canAccess).toBeCalledWith({
resource: 'posts',
action: 'read',
});
});
await screen.findByText('canAccess: YES');
fireEvent.click(screen.getByText('Can I write posts'));
await waitFor(() => {
expect(canAccess).toBeCalledWith({
resource: 'posts',
action: 'write',
});
});
await screen.findByText('canAccess: NO');
fireEvent.click(screen.getByText('Can I read comments'));
await waitFor(() => {
expect(canAccess).toBeCalledWith({
resource: 'comments',
action: 'read',
record: {
foo: 'bar',
},
});
});
await screen.findByText('canAccess: YES');
expect(canAccess).toBeCalledTimes(3);
});
it('should reject when an error is thrown by canAccess', async () => {
const canAccess = jest
.fn()
.mockRejectedValue(new Error('uh oh, something went wrong'));
const authProvider = {
login: () => Promise.reject('bad method'),
logout: () => Promise.reject('bad method'),
checkAuth: () => Promise.reject('bad method'),
checkError: () => Promise.reject('bad method'),
getPermissions: () => Promise.reject('bad method'),
canAccess,
};
render();
fireEvent.click(screen.getByText('Can I read posts'));
await waitFor(() => {
expect(canAccess).toBeCalledWith({
resource: 'posts',
action: 'read',
});
});
await screen.findByText('uh oh, something went wrong');
expect(screen.queryByText('canAccess: YES')).toBeNull();
});
it('should return a function always allowing access when no authProvider', async () => {
render();
fireEvent.click(screen.getByText('Can I read posts'));
await screen.findByText('canAccess: YES');
fireEvent.click(screen.getByText('Can I write posts'));
await screen.findByText('canAccess: YES');
fireEvent.click(screen.getByText('Can I read comments'));
await screen.findByText('canAccess: YES');
});
it('should return a function always allowing access when authProvider has no canAccess method', async () => {
const authProvider = {
login: () => Promise.reject('bad method'),
logout: () => Promise.reject('bad method'),
checkAuth: () => Promise.reject('bad method'),
checkError: () => Promise.reject('bad method'),
getPermissions: () => Promise.reject('bad method'),
};
render();
fireEvent.click(screen.getByText('Can I read posts'));
await screen.findByText('canAccess: YES');
fireEvent.click(screen.getByText('Can I write posts'));
await screen.findByText('canAccess: YES');
fireEvent.click(screen.getByText('Can I read comments'));
await screen.findByText('canAccess: YES');
});
});