From d5ca33f7ff661b5553a582cbe398b44a26bb5d28 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Kaiser Date: Mon, 17 Mar 2025 13:25:36 +0100 Subject: [PATCH 1/3] (fix)ResourceGuesser: Fix ResourceGuesser ignores recordRepresentation prop --- src/core/ResourceGuesser.test.tsx | 89 +++++++++++++++++++++++++++++++ src/core/ResourceGuesser.tsx | 3 ++ 2 files changed, 92 insertions(+) diff --git a/src/core/ResourceGuesser.test.tsx b/src/core/ResourceGuesser.test.tsx index 8fac3b7c..5ba610a9 100644 --- a/src/core/ResourceGuesser.test.tsx +++ b/src/core/ResourceGuesser.test.tsx @@ -1,6 +1,65 @@ import React from 'react'; +import { + AdminContext, + useGetOne, + useGetRecordRepresentation, +} from 'react-admin'; import ReactTestRenderer from 'react-test-renderer/shallow'; +import { Resource } from '@api-platform/api-doc-parser'; +import { render, screen } from '@testing-library/react'; +import '@testing-library/jest-dom'; import ResourceGuesser from './ResourceGuesser.js'; +import SchemaAnalyzerContext from '../introspection/SchemaAnalyzerContext.js'; +import schemaAnalyzer from '../hydra/schemaAnalyzer.js'; +import type { + ApiPlatformAdminDataProvider, + ApiPlatformAdminRecord, +} from '../types.js'; +import { API_FIELDS_DATA } from '../__fixtures__/parsedData.js'; + +const hydraSchemaAnalyzer = schemaAnalyzer(); +const dataProvider: ApiPlatformAdminDataProvider = { + getList: () => Promise.resolve({ data: [], total: 0 }), + getMany: () => Promise.resolve({ data: [] }), + getManyReference: () => Promise.resolve({ data: [], total: 0 }), + update: () => + Promise.resolve({ data: { id: 'id' } } as { data: RecordType }), + updateMany: () => Promise.resolve({ data: [] }), + create: () => + Promise.resolve({ data: { id: 'id' } } as { data: RecordType }), + delete: () => + Promise.resolve({ data: { id: 'id' } } as { data: RecordType }), + deleteMany: () => Promise.resolve({ data: [] }), + getOne: () => + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + Promise.resolve({ + data: { + id: '/users/123', + fieldA: 'fieldA value', + fieldB: 'fieldB value', + deprecatedField: 'deprecatedField value', + title: 'Title', + body: 'Body', + }, + }), + introspect: () => + Promise.resolve({ + data: { + entrypoint: 'entrypoint', + resources: [ + new Resource('users', '/users', { + fields: API_FIELDS_DATA, + readableFields: API_FIELDS_DATA, + writableFields: API_FIELDS_DATA, + parameters: [], + }), + ], + }, + }), + subscribe: () => Promise.resolve({ data: null }), + unsubscribe: () => Promise.resolve({ data: null }), +}; describe('', () => { const renderer = ReactTestRenderer.createRenderer(); @@ -60,4 +119,34 @@ describe('', () => { expect(renderer.getRenderOutput()).toMatchSnapshot(); }); + + test('renders without show', () => { + renderer.render(); + + expect(renderer.getRenderOutput()).toMatchSnapshot(); + }); + + test('supports recordRepresentation', async () => { + const TestComponent = () => { + const { data: user } = useGetOne('users', { id: '/users/123' }); + const getRecordRepresentation = useGetRecordRepresentation('users'); + if (!user) { + return 'loading'; + } + return getRecordRepresentation(user); + }; + render( + + + } + recordRepresentation="fieldA" + /> + + , + ); + + await screen.findByText('fieldA value'); + }); }); diff --git a/src/core/ResourceGuesser.tsx b/src/core/ResourceGuesser.tsx index 6f74ab4d..f47c8151 100644 --- a/src/core/ResourceGuesser.tsx +++ b/src/core/ResourceGuesser.tsx @@ -58,6 +58,7 @@ export const IntrospectedResourceGuesser = ({ name: resource, icon: props.icon, options: props.options, + recordRepresentation: props.recordRepresentation, hasList, hasEdit, hasCreate, @@ -69,6 +70,7 @@ export const IntrospectedResourceGuesser = ({ resource, props.icon, props.options, + props.recordRepresentation, hasList, hasEdit, hasCreate, @@ -104,6 +106,7 @@ ResourceGuesser.registerResource = ( name: props.name, icon: props.icon, options: props.options, + recordRepresentation: props.recordRepresentation, hasList: true, hasEdit: true, hasCreate: true, From c0d0b0c1742af2e39c4d15819671be935af95d46 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Kaiser Date: Mon, 17 Mar 2025 13:45:36 +0100 Subject: [PATCH 2/3] fix advanced story --- src/stories/custom/AdvancedCustomization.stories.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/stories/custom/AdvancedCustomization.stories.tsx b/src/stories/custom/AdvancedCustomization.stories.tsx index c3c90b84..7955b16d 100644 --- a/src/stories/custom/AdvancedCustomization.stories.tsx +++ b/src/stories/custom/AdvancedCustomization.stories.tsx @@ -231,7 +231,7 @@ export const AdvancedCustomization = () => ( show={BookShow} edit={BookEdit} create={BookCreate} - recordRepresentation="name" + recordRepresentation="title" icon={AutoStoriesIcon} /> Date: Mon, 17 Mar 2025 13:53:38 +0100 Subject: [PATCH 3/3] fix tests --- src/core/ResourceGuesser.test.tsx | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/core/ResourceGuesser.test.tsx b/src/core/ResourceGuesser.test.tsx index 5ba610a9..66f7766d 100644 --- a/src/core/ResourceGuesser.test.tsx +++ b/src/core/ResourceGuesser.test.tsx @@ -120,12 +120,6 @@ describe('', () => { expect(renderer.getRenderOutput()).toMatchSnapshot(); }); - test('renders without show', () => { - renderer.render(); - - expect(renderer.getRenderOutput()).toMatchSnapshot(); - }); - test('supports recordRepresentation', async () => { const TestComponent = () => { const { data: user } = useGetOne('users', { id: '/users/123' });