Skip to content

Commit d5ca33f

Browse files
committed
(fix)ResourceGuesser: Fix ResourceGuesser ignores recordRepresentation prop
1 parent 590ba9c commit d5ca33f

File tree

2 files changed

+92
-0
lines changed

2 files changed

+92
-0
lines changed

src/core/ResourceGuesser.test.tsx

+89
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,34 @@ describe('<ResourceGuesser />', () => {
60119

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

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,

0 commit comments

Comments
 (0)