@wordpress/core-data
Version:
Access to and manipulation of core WordPress entities.
235 lines (218 loc) • 5.02 kB
JavaScript
import triggerFetch from '@wordpress/api-fetch';
import { createRegistry, RegistryProvider } from '@wordpress/data';
jest.mock( '@wordpress/api-fetch' );
import { render, waitFor } from '@testing-library/react';
import { store as coreDataStore } from '../../index';
import useResourcePermissions from '../use-resource-permissions';
describe( 'useResourcePermissions', () => {
let registry;
beforeEach( () => {
registry = createRegistry();
registry.register( coreDataStore );
triggerFetch.mockImplementation( () => ( {
headers: new Headers( {
allow: 'POST',
} ),
} ) );
} );
it( 'retrieves the relevant permissions for a key-less resource', async () => {
let data;
const TestComponent = () => {
data = useResourcePermissions( 'widgets' );
return <div />;
};
render(
<RegistryProvider value={ registry }>
<TestComponent />
</RegistryProvider>
);
expect( data ).toEqual( {
status: 'IDLE',
isResolving: false,
hasResolved: false,
canCreate: false,
canRead: false,
} );
await waitFor( () =>
expect( data ).toEqual( {
status: 'SUCCESS',
isResolving: false,
hasResolved: true,
canCreate: true,
canRead: false,
} )
);
} );
it( 'retrieves the relevant permissions for a resource with a key', async () => {
let data;
const TestComponent = () => {
data = useResourcePermissions( 'widgets', 1 );
return <div />;
};
render(
<RegistryProvider value={ registry }>
<TestComponent />
</RegistryProvider>
);
expect( data ).toEqual( {
status: 'IDLE',
isResolving: false,
hasResolved: false,
canCreate: false,
canRead: false,
canUpdate: false,
canDelete: false,
} );
await waitFor( () =>
expect( data ).toEqual( {
status: 'SUCCESS',
isResolving: false,
hasResolved: true,
canCreate: true,
canRead: false,
canUpdate: false,
canDelete: false,
} )
);
} );
it( 'retrieves the relevant permissions for a id-less entity', async () => {
let data;
const TestComponent = () => {
data = useResourcePermissions( {
kind: 'root',
name: 'user',
} );
return <div />;
};
render(
<RegistryProvider value={ registry }>
<TestComponent />
</RegistryProvider>
);
expect( data ).toEqual( {
status: 'IDLE',
isResolving: false,
hasResolved: false,
canCreate: false,
canRead: false,
} );
await waitFor( () =>
expect( data ).toEqual( {
status: 'SUCCESS',
isResolving: false,
hasResolved: true,
canCreate: true,
canRead: false,
} )
);
} );
it( 'normalizes id-less entity resources before resolving permissions', async () => {
let data;
triggerFetch.mockImplementation( ( options ) => {
if ( options.path === '/wp/v2/types?context=view' ) {
return {
wp_navigation: {
name: 'Navigation Menus',
slug: 'wp_navigation',
rest_base: 'navigation',
rest_namespace: 'wp/v2',
},
};
}
if (
options.path === '/wp/v2/navigation' &&
options.method === 'OPTIONS'
) {
return {
headers: new Headers( { allow: 'GET, POST' } ),
};
}
throw new Error(
`Unexpected request: ${ JSON.stringify( options ) }`
);
} );
const TestComponent = () => {
data = useResourcePermissions( {
kind: 'postType',
name: 'wp_navigation',
id: undefined,
} );
return <div />;
};
render(
<RegistryProvider value={ registry }>
<TestComponent />
</RegistryProvider>
);
await waitFor( () =>
expect( data ).toEqual( {
status: 'SUCCESS',
isResolving: false,
hasResolved: true,
canCreate: true,
canRead: true,
} )
);
expect(
triggerFetch.mock.calls.filter(
( [ options ] ) => options.path === '/wp/v2/navigation'
)
).toHaveLength( 1 );
} );
it( 'retrieves the relevant permissions for an entity', async () => {
let data;
const TestComponent = () => {
data = useResourcePermissions( {
kind: 'root',
name: 'user',
id: 1,
} );
return <div />;
};
render(
<RegistryProvider value={ registry }>
<TestComponent />
</RegistryProvider>
);
expect( data ).toEqual( {
status: 'IDLE',
isResolving: false,
hasResolved: false,
canCreate: false,
canRead: false,
canUpdate: false,
canDelete: false,
} );
await waitFor( () =>
expect( data ).toEqual( {
status: 'SUCCESS',
isResolving: false,
hasResolved: true,
canCreate: true,
canRead: false,
canUpdate: false,
canDelete: false,
} )
);
} );
it( 'should warn when called with incorrect arguments signature', () => {
const TestComponent = () => {
useResourcePermissions(
{
kind: 'root',
name: 'user',
},
1
);
return null;
};
render(
<RegistryProvider value={ registry }>
<TestComponent />
</RegistryProvider>
);
expect( console ).toHaveWarnedWith(
`When 'resource' is an entity object, passing 'id' as a separate argument isn't supported.`
);
} );
} );