diff --git a/src/components/Map/Drawer/ProjectInfoDrawer/ProjectInfoDrawer.component.test.tsx b/src/components/Map/Drawer/ProjectInfoDrawer/ProjectInfoDrawer.component.test.tsx index e7e1a3ef90baa3db35e2a7779e0661d633a3a7ea..ef21f2dc7f3df531e4a1bc64d988af4546dceac7 100644 --- a/src/components/Map/Drawer/ProjectInfoDrawer/ProjectInfoDrawer.component.test.tsx +++ b/src/components/Map/Drawer/ProjectInfoDrawer/ProjectInfoDrawer.component.test.tsx @@ -69,12 +69,14 @@ describe('ProjectInfoDrawer', () => { const diseaseLink = screen.getByText(/Disease:/i); expect(diseaseLink).toBeInTheDocument(); - const linkelement = screen.getByRole('link', { name: projectFixture.diseaseName }); + const linkelement = screen.getByRole('link', { + name: projectFixture.diseaseName ? projectFixture.diseaseName : 'xyz', + }); expect(linkelement).toBeInTheDocument(); - expect(linkelement).toHaveAttribute('href', projectFixture.disease.link); + expect(linkelement).toHaveAttribute('href', projectFixture.disease?.link); }); - it('should fetch diesease name when diseaseId is provided', async () => { + it('should fetch disease name when diseaseId is provided', async () => { await act(() => { renderComponent(MOCKED_STORE); }); @@ -82,9 +84,11 @@ describe('ProjectInfoDrawer', () => { const organismLink = screen.getByText(/Organism:/i); expect(organismLink).toBeInTheDocument(); - const linkelement = screen.getByRole('link', { name: projectFixture.organismName }); + const linkelement = screen.getByRole('link', { + name: projectFixture.organismName ? projectFixture.organismName : 'xyz', + }); expect(linkelement).toBeInTheDocument(); - expect(linkelement).toHaveAttribute('href', projectFixture.organism.link); + expect(linkelement).toHaveAttribute('href', projectFixture.organism?.link); }); it('should render the source file download button', () => { diff --git a/src/components/Map/Drawer/ProjectInfoDrawer/ProjectInfoDrawer.component.tsx b/src/components/Map/Drawer/ProjectInfoDrawer/ProjectInfoDrawer.component.tsx index 73894aaf3e30bd33be35ea4d55c02b8d57b0227c..5a04b6fabcedce598ad481a6059e5ab30ee8c502 100644 --- a/src/components/Map/Drawer/ProjectInfoDrawer/ProjectInfoDrawer.component.tsx +++ b/src/components/Map/Drawer/ProjectInfoDrawer/ProjectInfoDrawer.component.tsx @@ -63,28 +63,32 @@ export const ProjectInfoDrawer = (): JSX.Element => { Manual </a> </li> - <li className="mt-2 text-hyperlink-blue"> - <span className="text-black">Disease: </span> - <a - href={diseaseLink} - target="_blank" - rel="noopener noreferrer" - className="font-semibold hover:underline" - > - {diseaseName} - </a> - </li> - <li className="mt-2 text-hyperlink-blue"> - <span className="text-black">Organism: </span> - <a - href={organismLink} - target="_blank" - rel="noopener noreferrer" - className="font-semibold hover:underline" - > - {organismName} - </a> - </li> + {diseaseName && ( + <li className="mt-2 text-hyperlink-blue"> + <span className="text-black">Disease: </span> + <a + href={diseaseLink} + target="_blank" + rel="noopener noreferrer" + className="font-semibold hover:underline" + > + {diseaseName} + </a> + </li> + )} + {organismName && ( + <li className="mt-2 text-hyperlink-blue"> + <span className="text-black">Organism: </span> + <a + href={organismLink} + target="_blank" + rel="noopener noreferrer" + className="font-semibold hover:underline" + > + {organismName} + </a> + </li> + )} </ul> <LinkButton className="mt-6" href={sourceDownloadLink} download="sourceFile.txt"> Download source file diff --git a/src/models/fixtures/projectFixture.ts b/src/models/fixtures/projectFixture.ts index 06868af6d5692a22d0e0e5d733508cf56357d781..f228879defbd3933931013a7df3df918f342e40e 100644 --- a/src/models/fixtures/projectFixture.ts +++ b/src/models/fixtures/projectFixture.ts @@ -1,9 +1,22 @@ import { ZOD_SEED } from '@/constants'; // eslint-disable-next-line import/no-extraneous-dependencies -import { createFixture } from 'zod-fixture'; +import { Fixture } from 'zod-fixture'; +import { diseaseNameGenerator } from '@/models/generators/diseaseNameGenerator'; +import { diseaseGenerator } from '@/models/generators/diseaseGenerator'; +import { organismGenerator } from '@/models/generators/organismGenerator'; +import { organismNameGenerator } from '@/models/generators/organismNameGenerator'; +import { topOverviewImageGenerator } from '@/models/generators/topOverviewImageGenerator'; import { projectSchema } from '../projectSchema'; -export const projectFixture = createFixture(projectSchema, { +const projectFixtureGenerator = new Fixture({ seed: ZOD_SEED }).extend([ + diseaseNameGenerator, + diseaseGenerator, + organismNameGenerator, + organismGenerator, + topOverviewImageGenerator, +]); + +export const projectFixture = projectFixtureGenerator.fromSchema(projectSchema, { seed: ZOD_SEED, array: { min: 1, max: 1 }, }); diff --git a/src/models/generators/diseaseGenerator.ts b/src/models/generators/diseaseGenerator.ts new file mode 100644 index 0000000000000000000000000000000000000000..1e8ae525f101fe84da27ec49f665e0481af429aa --- /dev/null +++ b/src/models/generators/diseaseGenerator.ts @@ -0,0 +1,18 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import { createFixture, Generator } from 'zod-fixture'; +import { disease } from '@/models/disease'; +import { ZOD_SEED } from '@/constants'; +import { ZodNullable } from 'zod'; + +export const diseaseGenerator = Generator({ + schema: ZodNullable, + filter: ({ context }) => { + // eslint-disable-next-line no-magic-numbers + return context.path.at(-1) === 'disease'; + }, + output: () => + createFixture(disease, { + seed: ZOD_SEED, + array: { min: 2, max: 2 }, + }), +}); diff --git a/src/models/generators/diseaseNameGenerator.ts b/src/models/generators/diseaseNameGenerator.ts new file mode 100644 index 0000000000000000000000000000000000000000..427c74b810e0b03f51711bd63c5dc25c1dbc5b3a --- /dev/null +++ b/src/models/generators/diseaseNameGenerator.ts @@ -0,0 +1,10 @@ +import { ZodNullable, ZodString } from 'zod'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Generator } from 'zod-fixture'; + +export const diseaseNameGenerator = Generator({ + schema: ZodNullable<ZodString>, + // eslint-disable-next-line no-magic-numbers + filter: ({ context }) => context.path.at(-1) === 'diseaseName', + output: ({ transform }) => transform.utils.random.string({}), +}); diff --git a/src/models/generators/organismGenerator.ts b/src/models/generators/organismGenerator.ts new file mode 100644 index 0000000000000000000000000000000000000000..ae654656ca5554f2364c9e6fb8b46bdd3a919bdc --- /dev/null +++ b/src/models/generators/organismGenerator.ts @@ -0,0 +1,16 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import { createFixture, Generator } from 'zod-fixture'; +import { ZOD_SEED } from '@/constants'; +import { ZodNullable } from 'zod'; +import { organism } from '@/models/organism'; + +export const organismGenerator = Generator({ + schema: ZodNullable, + // eslint-disable-next-line no-magic-numbers + filter: ({ context }) => context.path.at(-1) === 'organism', + output: () => + createFixture(organism, { + seed: ZOD_SEED, + array: { min: 2, max: 2 }, + }), +}); diff --git a/src/models/generators/organismNameGenerator.ts b/src/models/generators/organismNameGenerator.ts new file mode 100644 index 0000000000000000000000000000000000000000..25bd5c0fa491a874a4d08e471cfc5ae033ee35a9 --- /dev/null +++ b/src/models/generators/organismNameGenerator.ts @@ -0,0 +1,10 @@ +import { ZodNullable, ZodString } from 'zod'; +// eslint-disable-next-line import/no-extraneous-dependencies +import { Generator } from 'zod-fixture'; + +export const organismNameGenerator = Generator({ + schema: ZodNullable<ZodString>, + // eslint-disable-next-line no-magic-numbers + filter: ({ context }) => context.path.at(-1) === 'organismName', + output: ({ transform }) => transform.utils.random.string({}), +}); diff --git a/src/models/generators/topOverviewImageGenerator.ts b/src/models/generators/topOverviewImageGenerator.ts new file mode 100644 index 0000000000000000000000000000000000000000..fbdb047cac3cfa0de0a97e74e77b6a821ecbbbca --- /dev/null +++ b/src/models/generators/topOverviewImageGenerator.ts @@ -0,0 +1,16 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import { createFixture, Generator } from 'zod-fixture'; +import { ZOD_SEED } from '@/constants'; +import { ZodNullable } from 'zod'; +import { overviewImageView } from '@/models/overviewImageView'; + +export const topOverviewImageGenerator = Generator({ + schema: ZodNullable, + // eslint-disable-next-line no-magic-numbers + filter: ({ context }) => context.path.at(-1) === 'topOverviewImage', + output: () => + createFixture(overviewImageView, { + seed: ZOD_SEED, + array: { min: 2, max: 2 }, + }), +}); diff --git a/src/models/projectSchema.ts b/src/models/projectSchema.ts index 611b93a7ef6b0fa9cb76d5ef4d8cdfb92f8e9432..d3eeeb2a7a6ddc75c825c3bdb34e8f6caf99e74d 100644 --- a/src/models/projectSchema.ts +++ b/src/models/projectSchema.ts @@ -5,10 +5,10 @@ import { overviewImageView } from './overviewImageView'; export const projectSchema = z.object({ version: z.string(), - disease, - diseaseName: z.string(), - organism, - organismName: z.string(), + disease: disease.nullable(), + diseaseName: z.string().nullable(), + organism: organism.nullable(), + organismName: z.string().nullable(), status: z.string(), directory: z.string(), progress: z.number(), diff --git a/src/redux/project/project.selectors.ts b/src/redux/project/project.selectors.ts index aa0c62aee628115e23e91adb0099a84490989218..7ab9a0c284f2677f824887e702c7f2eaa334b859 100644 --- a/src/redux/project/project.selectors.ts +++ b/src/redux/project/project.selectors.ts @@ -49,12 +49,12 @@ export const diseaseNameSelector = createSelector( export const diseaseLinkSelector = createSelector( projectDataSelector, - projectData => projectData?.disease.link, + projectData => projectData?.disease?.link, ); export const organismLinkSelector = createSelector( projectDataSelector, - projectData => projectData?.organism.link, + projectData => projectData?.organism?.link, ); export const organismNameSelector = createSelector(