Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
84 changes: 84 additions & 0 deletions __tests__/viewModelBuilders/dataset-export.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,17 @@ import { FileFacet } from "@databiosphere/findable-ui/lib/hooks/useFileManifest/
import { FileManifestState } from "@databiosphere/findable-ui/lib/providers/fileManifestState";
import { DatasetsResponse } from "../../app/apis/azul/anvil-cmg/common/responses";
import {
TERRA_EXPORT_UNAVAILABLE_DATASET_MESSAGE,
TERRA_EXPORT_UNAVAILABLE_DATASET_TITLES,
} from "../../app/viewModelBuilders/azul/anvil-cmg/common/constants";
import {
buildDatasetExportMethodTerra,
buildDatasetExportToPlatform,
buildDatasetExportToPlatformHero,
buildDatasetExportToPlatformMethod,
isDatasetTerraExportUnavailable,
renderDatasetTerraExport,
renderDatasetTerraExportUnavailable,
} from "../../app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders";
import { ANVIL_CMG_CATEGORY_KEY } from "../../site-config/anvil-cmg/category";
import {
Expand Down Expand Up @@ -380,3 +388,79 @@ describe("buildDatasetExportToPlatformMethod", () => {
});
});
});

/**
* Creates a mock DatasetsResponse with the given dataset title.
* @param title - Dataset title.
* @returns Mock DatasetsResponse.
*/
const createMockDatasetsResponseWithTitle = (title: string): DatasetsResponse =>
createMockDatasetsResponse({
datasets: [
{
accessible: true,
dataset_id: "test-dataset-id",
title,
},
],
} as Partial<DatasetsResponse>);

describe("isDatasetTerraExportUnavailable", () => {
it.each(TERRA_EXPORT_UNAVAILABLE_DATASET_TITLES)(
"returns true for %s",
(title) => {
const response = createMockDatasetsResponseWithTitle(title);

expect(isDatasetTerraExportUnavailable(response)).toBe(true);
}
);

it("returns false for any other dataset", () => {
const response = createMockDatasetsResponse();

expect(isDatasetTerraExportUnavailable(response)).toBe(false);
});
});

describe("buildDatasetExportMethodTerra", () => {
it("returns inaccessible with footnote when Terra export is unavailable", () => {
const response = createMockDatasetsResponseWithTitle(
TERRA_EXPORT_UNAVAILABLE_DATASET_TITLES[0]
);

const result = buildDatasetExportMethodTerra(response);

expect(result.isAccessible).toBe(false);
expect(result.footnote).toBe(TERRA_EXPORT_UNAVAILABLE_DATASET_MESSAGE);
});

it("returns accessible without footnote when Terra export is available", () => {
const response = createMockDatasetsResponse();

const result = buildDatasetExportMethodTerra(response);

expect(result.isAccessible).toBe(true);
expect(result.footnote).toBeNull();
expect(result.route).toBe(
"/datasets/test-dataset-id/export/export-to-terra"
);
});
});

describe("renderDatasetTerraExport and renderDatasetTerraExportUnavailable", () => {
it("renders the warning, not the Terra export, when Terra export is unavailable", () => {
const response = createMockDatasetsResponseWithTitle(
TERRA_EXPORT_UNAVAILABLE_DATASET_TITLES[0]
);

expect(renderDatasetTerraExport(response).isIn).toBe(false);
expect(renderDatasetTerraExportUnavailable(response).isIn).toBe(true);
});

it("renders the Terra export, not the warning, when Terra export is available", () => {
const response = createMockDatasetsResponse();

expect(renderDatasetTerraExport(response).isIn).toBe(true);
expect(renderDatasetTerraExportUnavailable(response).isIn).toBe(false);
});
});
160 changes: 160 additions & 0 deletions __tests__/viewModelBuilders/export.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,16 @@ import { Breadcrumb } from "@databiosphere/findable-ui/lib/components/common/Bre
import { ViewContext } from "@databiosphere/findable-ui/lib/config/entities";
import { FileFacet } from "@databiosphere/findable-ui/lib/hooks/useFileManifest/common/entities";
import { FileManifestState } from "@databiosphere/findable-ui/lib/providers/fileManifestState";
import { TERRA_EXPORT_UNAVAILABLE_DATASET_TITLES } from "../../app/viewModelBuilders/azul/anvil-cmg/common/constants";
import {
buildAlertTerraExportUnavailable,
buildExportMethodTerra,
buildExportToPlatform,
buildExportToPlatformHero,
buildExportToPlatformMethod,
getSelectedTerraExportUnavailableDatasetTitles,
renderCohortTerraExport,
renderCohortTerraExportUnavailable,
} from "../../app/viewModelBuilders/azul/anvil-cmg/common/viewModelBuilders";
import { ANVIL_CMG_CATEGORY_KEY } from "../../site-config/anvil-cmg/category";
import {
Expand Down Expand Up @@ -339,3 +345,157 @@ describe("buildExportToPlatformMethod", () => {
});
});
});

/**
* Creates a mock ViewContext with the given dataset title filter selected.
* @param datasetTitles - Selected dataset titles.
* @returns Mock ViewContext.
*/
const createMockViewContextWithDatasetTitles = (
datasetTitles: string[]
): ViewContext<unknown> => {
const viewContext = createMockViewContext();
viewContext.exploreState.filterState = [
{ categoryKey: ANVIL_CMG_CATEGORY_KEY.DATASET_TITLE, value: datasetTitles },
];
return viewContext;
};

describe("getSelectedTerraExportUnavailableDatasetTitles", () => {
it("returns selected datasets that cannot be exported to Terra", () => {
const [unavailableTitle] = TERRA_EXPORT_UNAVAILABLE_DATASET_TITLES;

const result = getSelectedTerraExportUnavailableDatasetTitles([
{
categoryKey: ANVIL_CMG_CATEGORY_KEY.DATASET_TITLE,
value: [unavailableTitle, "ANVIL_Other_Dataset"],
},
]);

expect(result).toEqual([unavailableTitle]);
});

it("returns an empty array when no dataset title filter is selected", () => {
const result = getSelectedTerraExportUnavailableDatasetTitles([
{ categoryKey: "test.filter", value: ["value1"] },
]);

expect(result).toEqual([]);
});

it("returns an empty array when only other datasets are selected", () => {
const result = getSelectedTerraExportUnavailableDatasetTitles([
{
categoryKey: ANVIL_CMG_CATEGORY_KEY.DATASET_TITLE,
value: ["ANVIL_Other_Dataset"],
},
]);

expect(result).toEqual([]);
});
});

describe("buildExportMethodTerra", () => {
it("ignores the selected datasets before the files facets have loaded", () => {
const viewContext = createMockViewContextWithDatasetTitles([
TERRA_EXPORT_UNAVAILABLE_DATASET_TITLES[0],
]);
viewContext.fileManifestState = createMockFileManifestState({
isFacetsSuccess: false,
});

const result = buildExportMethodTerra(undefined, viewContext);

expect(result.isAccessible).toBe(false);
expect(result.footnote).toBeNull();
});

it("returns inaccessible with footnote naming the selected unavailable datasets", () => {
const [unavailableTitle] = TERRA_EXPORT_UNAVAILABLE_DATASET_TITLES;
const viewContext = createMockViewContextWithDatasetTitles([
unavailableTitle,
]);

const result = buildExportMethodTerra(undefined, viewContext);

expect(result.isAccessible).toBe(false);
expect(result.footnote).toContain(unavailableTitle);
});

it("returns file manifest accessibility when no unavailable dataset is selected", () => {
const fileManifestState = createMockFileManifestState({
filesFacets: [createMockFileFacet()],
isFacetsSuccess: true,
summary: { fileCount: 10 },
});
const viewContext = createMockViewContext({ fileManifestState });

const result = buildExportMethodTerra(undefined, viewContext);

expect(result.isAccessible).toBe(true);
expect(result.footnote).toBeNull();
});
});

describe("renderCohortTerraExport and renderCohortTerraExportUnavailable", () => {
it("renders neither the warning nor the Terra export before the file manifest is enabled", () => {
const viewContext = createMockViewContextWithDatasetTitles([
TERRA_EXPORT_UNAVAILABLE_DATASET_TITLES[0],
]);
viewContext.fileManifestState = createMockFileManifestState({
isEnabled: false,
});

expect(renderCohortTerraExport(undefined, viewContext).isIn).toBe(false);
expect(
renderCohortTerraExportUnavailable(undefined, viewContext).isIn
).toBe(false);
});

it("renders the warning, not the Terra export, when an unavailable dataset is selected", () => {
const viewContext = createMockViewContextWithDatasetTitles([
TERRA_EXPORT_UNAVAILABLE_DATASET_TITLES[0],
]);

expect(renderCohortTerraExport(undefined, viewContext).isIn).toBe(false);
expect(
renderCohortTerraExportUnavailable(undefined, viewContext).isIn
).toBe(true);
});

it("renders the Terra export, not the warning, when no unavailable dataset is selected", () => {
const viewContext = createMockViewContext();

expect(renderCohortTerraExport(undefined, viewContext).isIn).toBe(true);
expect(
renderCohortTerraExportUnavailable(undefined, viewContext).isIn
).toBe(false);
});
});

describe("buildAlertTerraExportUnavailable", () => {
it("uses singular wording when one unavailable dataset is selected", () => {
const [title] = TERRA_EXPORT_UNAVAILABLE_DATASET_TITLES;
const viewContext = createMockViewContextWithDatasetTitles([title]);

const result = buildAlertTerraExportUnavailable(undefined, viewContext);

expect(result.content).toBe(
`Export to Terra is unavailable for ${title} because its metadata is too large for Terra to import. Remove this dataset from the selection to export to Terra.`
);
});

it("uses plural wording when several unavailable datasets are selected", () => {
const [firstTitle, secondTitle] = TERRA_EXPORT_UNAVAILABLE_DATASET_TITLES;
const viewContext = createMockViewContextWithDatasetTitles([
firstTitle,
secondTitle,
]);

const result = buildAlertTerraExportUnavailable(undefined, viewContext);

expect(result.content).toBe(
`Export to Terra is unavailable for ${firstTitle}, ${secondTitle} because their metadata is too large for Terra to import. Remove these datasets from the selection to export to Terra.`
);
});
});
22 changes: 22 additions & 0 deletions app/viewModelBuilders/azul/anvil-cmg/common/constants.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/**
* Titles of datasets that cannot be exported to Terra. Their verbatim PFB manifests are too large to generate,
* and Terra is unable to import them.
* See https://github.com/DataBiosphere/azul/issues/8134.
*/
export const TERRA_EXPORT_UNAVAILABLE_DATASET_TITLES = [
"ANVIL_eMERGE_GWAS_GRU",
"ANVIL_eMERGE_GWAS_HMB_GSO",
"ANVIL_eMERGE_GWAS_HMB_MDS",
"ANVIL_eMERGE_GWAS_HMB_PUB_GSO",
];

/**
* Reason Terra export is unavailable, shared by the dataset and cohort explanations.
*/
export const TERRA_EXPORT_UNAVAILABLE_REASON =
"metadata is too large for Terra to import";

/**
* Explanation displayed when Terra export is unavailable for a dataset.
*/
export const TERRA_EXPORT_UNAVAILABLE_DATASET_MESSAGE = `Export to Terra is unavailable for this dataset because its ${TERRA_EXPORT_UNAVAILABLE_REASON}.`;
Loading
Loading