diff --git a/packages/core/client/src/data-source/__tests__/data-block/DataBlockRequestProvider.test.tsx b/packages/core/client/src/data-source/__tests__/data-block/DataBlockRequestProvider.test.tsx new file mode 100644 index 0000000000..0eaabcd1a3 --- /dev/null +++ b/packages/core/client/src/data-source/__tests__/data-block/DataBlockRequestProvider.test.tsx @@ -0,0 +1,52 @@ +import { requestParentRecordData } from '../../data-block/DataBlockRequestProvider'; + +describe('requestParentRecordData', () => { + it('should return parent record data if parentRecord is provided', async () => { + const parentRecord = { id: 1, name: 'John Doe' }; + const result = await requestParentRecordData({ parentRecord }); + expect(result).toEqual({ data: parentRecord }); + }); + + it('should return undefined if association, sourceKey, or sourceId is missing', async () => { + const result = await requestParentRecordData({}); + expect(result).toEqual({ data: undefined }); + }); + + it('should return undefined if association is missing', async () => { + const sourceId = 1; + const sourceKey = 'filterKey'; + const result = await requestParentRecordData({ sourceId, sourceKey }); + expect(result).toEqual({ data: undefined }); + }); + + it('should return undefined if sourceKey is missing', async () => { + const association = 'Collection.Field'; + const sourceId = 1; + const result = await requestParentRecordData({ association, sourceId }); + expect(result).toEqual({ data: undefined }); + }); + + it('should return undefined if sourceId is missing', async () => { + const association = 'Collection.Field'; + const sourceKey = 'filterKey'; + const result = await requestParentRecordData({ association, sourceKey }); + expect(result).toEqual({ data: undefined }); + }); + + it('should make a request to the correct URL if association is provided', async () => { + const association = 'Collection.Field'; + const sourceId = 1; + const sourceKey = 'filterKey'; + const api = { + request: vi.fn().mockResolvedValue({ data: { id: 1, name: 'John Doe' } }), + }; + const headers = { Authorization: 'Bearer token' }; + + await requestParentRecordData({ association, sourceId, sourceKey, api, headers }); + + expect(api.request).toHaveBeenCalledWith({ + url: 'Collection:get?filter[filterKey]=1', + headers, + }); + }); +}); diff --git a/packages/core/client/src/data-source/data-block/DataBlockRequestProvider.tsx b/packages/core/client/src/data-source/data-block/DataBlockRequestProvider.tsx index a5aa3b153f..87ff04a352 100644 --- a/packages/core/client/src/data-source/data-block/DataBlockRequestProvider.tsx +++ b/packages/core/client/src/data-source/data-block/DataBlockRequestProvider.tsx @@ -1,13 +1,13 @@ import React, { FC, createContext, useContext, useMemo } from 'react'; -import { UseRequestResult, useAPIClient, useRequest } from '../../api-client'; -import { CollectionRecordProvider, CollectionRecord } from '../collection-record'; -import { AllDataBlockProps, useDataBlockProps } from './DataBlockProvider'; -import { useDataBlockResource } from './DataBlockResourceProvider'; -import { useDataSourceHeaders } from '../utils'; import _ from 'lodash'; +import { UseRequestResult, useAPIClient, useRequest } from '../../api-client'; import { useDataLoadingMode } from '../../modules/blocks/data-blocks/details-multi/setDataLoadingModeSettingsItem'; import { useSourceKey } from '../../modules/blocks/useSourceKey'; +import { CollectionRecord, CollectionRecordProvider } from '../collection-record'; +import { useDataSourceHeaders } from '../utils'; +import { AllDataBlockProps, useDataBlockProps } from './DataBlockProvider'; +import { useDataBlockResource } from './DataBlockResourceProvider'; export const BlockRequestContext = createContext>(null); BlockRequestContext.displayName = 'BlockRequestContext'; @@ -43,6 +43,31 @@ function useCurrentRequest(options: Omit) { return request; } +export async function requestParentRecordData({ + sourceId, + association, + parentRecord, + api, + headers, + sourceKey, +}: { + sourceId?: number; + association?: string; + parentRecord?: any; + api?: any; + headers?: any; + sourceKey?: string; +}) { + if (parentRecord) return Promise.resolve({ data: parentRecord }); + if (!association || !sourceKey || !sourceId) return Promise.resolve({ data: undefined }); + // "association": "Collection.Field" + const arr = association.split('.'); + // :get?filter[filterKey]=sourceId + const url = `${arr[0]}:get?filter[${sourceKey}]=${sourceId}`; + const res = await api.request({ url, headers }); + return res.data; +} + function useParentRequest(options: Omit) { const { sourceId, association, parentRecord } = options; const api = useAPIClient(); @@ -50,15 +75,8 @@ function useParentRequest(options: Omit) { const headers = useDataSourceHeaders(dataBlockProps.dataSource); const sourceKey = useSourceKey(association); return useRequest( - async () => { - if (parentRecord) return Promise.resolve({ data: parentRecord }); - if (!association || !sourceKey) return Promise.resolve({ data: undefined }); - // "association": "Collection.Field" - const arr = association.split('.'); - // :get?filter[filterKey]=sourceId - const url = `${arr[0]}:get?filter[${sourceKey}]=${sourceId}`; - const res = await api.request({ url, headers }); - return res.data; + () => { + return requestParentRecordData({ sourceId, association, parentRecord, api, headers, sourceKey }); }, { refreshDeps: [association, parentRecord, sourceId],