Skip to content

Commit

Permalink
Resolve drs query param
Browse files Browse the repository at this point in the history
  • Loading branch information
kevinmarete committed Feb 7, 2025
1 parent 6346dac commit 9ee5cc4
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 2 deletions.
9 changes: 7 additions & 2 deletions src/import-data/ImportDataPage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand All @@ -19,11 +20,15 @@ const styles = {
},
} as const satisfies Record<string, CSSProperties>;

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'],
Expand Down
56 changes: 56 additions & 0 deletions src/import-data/useImportDrsRequest.test.ts
Original file line number Diff line number Diff line change
@@ -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);
});
});
});
29 changes: 29 additions & 0 deletions src/import-data/useImportDrsRequest.ts
Original file line number Diff line number Diff line change
@@ -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]);
};

0 comments on commit 9ee5cc4

Please sign in to comment.