diff --git a/src/import-data/ImportDataPage.ts b/src/import-data/ImportDataPage.ts index f8e0ea2274..2bab092e21 100644 --- a/src/import-data/ImportDataPage.ts +++ b/src/import-data/ImportDataPage.ts @@ -4,6 +4,7 @@ import { div, h, img } from 'react-hyperscript-helpers'; import FooterWrapper from 'src/components/FooterWrapper'; import { TopBar } from 'src/components/TopBar'; import scienceBackground from 'src/images/science-background.jpg'; +import { useImportDrsRequest } from 'src/import-data/useImportDrsRequest'; import * as Nav from 'src/libs/nav'; import * as Utils from 'src/libs/utils'; @@ -19,11 +20,15 @@ const styles = { }, } as const satisfies Record; -const ImportDataPage = () => { +export const ImportDataPage = () => { const { - query: { format, referrer }, + query: { format, referrer, drs }, } = Nav.useRoute(); + // Check if DRS URI is present and resolve it + const drsUri = drs ? decodeURIComponent(drs) : undefined; + useImportDrsRequest(drsUri); + const isDataset = !_.includes(format, ['snapshot', 'tdrexport']); const title = Utils.cond( [referrer === 'data-catalog', () => 'Catalog'], diff --git a/src/import-data/useImportDrsRequest.test.ts b/src/import-data/useImportDrsRequest.test.ts new file mode 100644 index 0000000000..e98279cbf0 --- /dev/null +++ b/src/import-data/useImportDrsRequest.test.ts @@ -0,0 +1,56 @@ +import { screen, waitFor } from '@testing-library/react'; +import { h } from 'react-hyperscript-helpers'; +import { ImportDataPage } from 'src/import-data/ImportDataPage'; +import { useImportDrsRequest } from 'src/import-data/useImportDrsRequest'; +import * as Nav from 'src/libs/nav'; +import { renderWithAppContexts } from 'src/testing/test-utils'; + +jest.mock('src/libs/nav', () => ({ + ...jest.requireActual('src/libs/nav'), + getCurrentUrl: jest.fn().mockReturnValue(new URL('https://app.terra.bio')), + getLink: jest.fn().mockImplementation((_) => _), + goToPath: jest.fn(), + useRoute: jest.fn().mockReturnValue({ query: {} }), +})); + +jest.mock('src/import-data/useImportDrsRequest', () => ({ + useImportDrsRequest: jest.fn(), +})); + +describe('ImportDataPage', () => { + it('renders the ImportDataPage component with the correct title and content', async () => { + // Arrange + (Nav.useRoute as jest.Mock).mockReturnValue({ + query: { format: 'dataset', referrer: 'data-catalog', drs: 'drs://example.com' }, + }); + + // Act + renderWithAppContexts(h(ImportDataPage)); + + // Assert + await waitFor(() => { + expect(screen.getByText('Catalog')).toBeInTheDocument(); + expect(screen.getByRole('main')).toBeInTheDocument(); + expect(screen.getByAltText('')).toBeInTheDocument(); + expect(useImportDrsRequest).toHaveBeenCalledWith('drs://example.com'); + }); + }); + + it('renders the ImportDataPage component with the default title when referrer is not data-catalog', async () => { + // Arrange + (Nav.useRoute as jest.Mock).mockReturnValue({ + query: { format: 'snapshot', referrer: 'other', drs: undefined }, + }); + + // Act + renderWithAppContexts(h(ImportDataPage)); + + // Assert + await waitFor(() => { + expect(screen.getByText('Import Snapshot')).toBeInTheDocument(); + expect(screen.getByRole('main')).toBeInTheDocument(); + expect(screen.getByAltText('')).toBeInTheDocument(); + expect(useImportDrsRequest).toHaveBeenCalledWith(undefined); + }); + }); +}); diff --git a/src/import-data/useImportDrsRequest.ts b/src/import-data/useImportDrsRequest.ts new file mode 100644 index 0000000000..7d0d583c1a --- /dev/null +++ b/src/import-data/useImportDrsRequest.ts @@ -0,0 +1,29 @@ +import { useEffect } from 'react'; +import { DrsUriResolver } from 'src/libs/ajax/drs/DrsUriResolver'; +import * as Nav from 'src/libs/nav'; +import { useCancellation } from 'src/libs/react-utils'; + +export const useImportDrsRequest = (drsUri: string | undefined) => { + const signal = useCancellation(); + + useEffect(() => { + if (!drsUri) return; + + const fetchData = async () => { + try { + const { contentType, accessUrl } = await DrsUriResolver(signal).getDataObjectMetadata( + decodeURIComponent(drsUri), + ['contentType', 'accessUrl'] + ); + + if (contentType === 'application/pfb' && accessUrl) { + Nav.updateSearch({ url: accessUrl }); + } + } catch (error) { + console.error('Error fetching DRS URI metadata:', error); + } + }; + + fetchData().then(); + }, [drsUri, signal]); +};