Skip to content

Commit abc22f6

Browse files
authored
(fix)ResourceGuesser: Fix <ResourceGuesser> ignores recordRepresentation prop (#611)
* (fix)ResourceGuesser: Fix ResourceGuesser ignores recordRepresentation prop * fix advanced story * fix tests
1 parent 590ba9c commit abc22f6

File tree

3 files changed

+87
-1
lines changed

3 files changed

+87
-1
lines changed

src/core/ResourceGuesser.test.tsx

+83
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,65 @@
11
import React from 'react';
2+
import {
3+
AdminContext,
4+
useGetOne,
5+
useGetRecordRepresentation,
6+
} from 'react-admin';
27
import ReactTestRenderer from 'react-test-renderer/shallow';
8+
import { Resource } from '@api-platform/api-doc-parser';
9+
import { render, screen } from '@testing-library/react';
10+
import '@testing-library/jest-dom';
311
import ResourceGuesser from './ResourceGuesser.js';
12+
import SchemaAnalyzerContext from '../introspection/SchemaAnalyzerContext.js';
13+
import schemaAnalyzer from '../hydra/schemaAnalyzer.js';
14+
import type {
15+
ApiPlatformAdminDataProvider,
16+
ApiPlatformAdminRecord,
17+
} from '../types.js';
18+
import { API_FIELDS_DATA } from '../__fixtures__/parsedData.js';
19+
20+
const hydraSchemaAnalyzer = schemaAnalyzer();
21+
const dataProvider: ApiPlatformAdminDataProvider = {
22+
getList: () => Promise.resolve({ data: [], total: 0 }),
23+
getMany: () => Promise.resolve({ data: [] }),
24+
getManyReference: () => Promise.resolve({ data: [], total: 0 }),
25+
update: <RecordType extends ApiPlatformAdminRecord>() =>
26+
Promise.resolve({ data: { id: 'id' } } as { data: RecordType }),
27+
updateMany: () => Promise.resolve({ data: [] }),
28+
create: <RecordType extends ApiPlatformAdminRecord>() =>
29+
Promise.resolve({ data: { id: 'id' } } as { data: RecordType }),
30+
delete: <RecordType extends ApiPlatformAdminRecord>() =>
31+
Promise.resolve({ data: { id: 'id' } } as { data: RecordType }),
32+
deleteMany: () => Promise.resolve({ data: [] }),
33+
getOne: () =>
34+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
35+
// @ts-ignore
36+
Promise.resolve({
37+
data: {
38+
id: '/users/123',
39+
fieldA: 'fieldA value',
40+
fieldB: 'fieldB value',
41+
deprecatedField: 'deprecatedField value',
42+
title: 'Title',
43+
body: 'Body',
44+
},
45+
}),
46+
introspect: () =>
47+
Promise.resolve({
48+
data: {
49+
entrypoint: 'entrypoint',
50+
resources: [
51+
new Resource('users', '/users', {
52+
fields: API_FIELDS_DATA,
53+
readableFields: API_FIELDS_DATA,
54+
writableFields: API_FIELDS_DATA,
55+
parameters: [],
56+
}),
57+
],
58+
},
59+
}),
60+
subscribe: () => Promise.resolve({ data: null }),
61+
unsubscribe: () => Promise.resolve({ data: null }),
62+
};
463

564
describe('<ResourceGuesser />', () => {
665
const renderer = ReactTestRenderer.createRenderer();
@@ -60,4 +119,28 @@ describe('<ResourceGuesser />', () => {
60119

61120
expect(renderer.getRenderOutput()).toMatchSnapshot();
62121
});
122+
123+
test('supports recordRepresentation', async () => {
124+
const TestComponent = () => {
125+
const { data: user } = useGetOne('users', { id: '/users/123' });
126+
const getRecordRepresentation = useGetRecordRepresentation('users');
127+
if (!user) {
128+
return 'loading';
129+
}
130+
return getRecordRepresentation(user);
131+
};
132+
render(
133+
<AdminContext dataProvider={dataProvider}>
134+
<SchemaAnalyzerContext.Provider value={hydraSchemaAnalyzer}>
135+
<ResourceGuesser
136+
name="users"
137+
list={<TestComponent />}
138+
recordRepresentation="fieldA"
139+
/>
140+
</SchemaAnalyzerContext.Provider>
141+
</AdminContext>,
142+
);
143+
144+
await screen.findByText('fieldA value');
145+
});
63146
});

src/core/ResourceGuesser.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ export const IntrospectedResourceGuesser = ({
5858
name: resource,
5959
icon: props.icon,
6060
options: props.options,
61+
recordRepresentation: props.recordRepresentation,
6162
hasList,
6263
hasEdit,
6364
hasCreate,
@@ -69,6 +70,7 @@ export const IntrospectedResourceGuesser = ({
6970
resource,
7071
props.icon,
7172
props.options,
73+
props.recordRepresentation,
7274
hasList,
7375
hasEdit,
7476
hasCreate,
@@ -104,6 +106,7 @@ ResourceGuesser.registerResource = (
104106
name: props.name,
105107
icon: props.icon,
106108
options: props.options,
109+
recordRepresentation: props.recordRepresentation,
107110
hasList: true,
108111
hasEdit: true,
109112
hasCreate: true,

src/stories/custom/AdvancedCustomization.stories.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ export const AdvancedCustomization = () => (
231231
show={BookShow}
232232
edit={BookEdit}
233233
create={BookCreate}
234-
recordRepresentation="name"
234+
recordRepresentation="title"
235235
icon={AutoStoriesIcon}
236236
/>
237237
<ResourceGuesser

0 commit comments

Comments
 (0)