import * as React from 'react';
import expect from 'expect';
import { render, screen } from '@testing-library/react';
import { Basic } from './useCanAccessResources.stories';
describe('useCanAccessResources', () => {
it('should call authProvider.canAccess for every resource', async () => {
const canAccess = jest.fn().mockImplementation(async () => true);
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();
screen.getByText('LOADING');
expect(canAccess).toBeCalledTimes(3);
expect(canAccess).toBeCalledWith({
action: 'read',
resource: 'posts.id',
signal: undefined,
});
expect(canAccess).toBeCalledWith({
action: 'read',
resource: 'posts.title',
signal: undefined,
});
expect(canAccess).toBeCalledWith({
action: 'read',
resource: 'posts.author',
signal: undefined,
});
await screen.findByText(
JSON.stringify({
'posts.id': true,
'posts.title': true,
'posts.author': true,
})
);
expect(screen.queryByText('LOADING')).toBeNull();
});
it('should grant access to each resource based on canAccess result', async () => {
const canAccess = jest
.fn()
.mockImplementation(
async ({ resource }) => resource !== 'posts.id'
);
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();
screen.getByText('LOADING');
await screen.findByText(
JSON.stringify({
'posts.id': false,
'posts.title': true,
'posts.author': true,
})
);
expect(screen.queryByText('LOADING')).toBeNull();
});
it('should grant access to all resources if no authProvider', async () => {
render();
expect(screen.queryByText('LOADING')).toBeNull();
screen.getByText(
JSON.stringify({
'posts.id': true,
'posts.title': true,
'posts.author': true,
})
);
});
it('should grant access to all resources if no authProvider.canAccess', 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();
expect(screen.queryByText('LOADING')).toBeNull();
screen.getByText(
JSON.stringify({
'posts.id': true,
'posts.title': true,
'posts.author': true,
})
);
});
});