From 776f24ddb7455afed9a737fc307681554fcdc9fe Mon Sep 17 00:00:00 2001 From: Ellen Kraffmiller Date: Wed, 8 Jul 2026 13:22:23 -0400 Subject: [PATCH 1/6] redirect to draft version of dataset after editing terms --- .../EditDatasetTermsHelper.ts | 25 +++ .../edit-guestbook/EditGuestbook.tsx | 33 ++-- .../EditLicenseAndTerms.tsx | 31 ++-- .../EditTermsOfAccess.tsx | 36 ++-- .../EditDatasetTerms.spec.tsx | 172 ++++++++++++++++-- 5 files changed, 227 insertions(+), 70 deletions(-) diff --git a/src/sections/edit-dataset-terms/EditDatasetTermsHelper.ts b/src/sections/edit-dataset-terms/EditDatasetTermsHelper.ts index 8b80e2be2..9a20e41b0 100644 --- a/src/sections/edit-dataset-terms/EditDatasetTermsHelper.ts +++ b/src/sections/edit-dataset-terms/EditDatasetTermsHelper.ts @@ -1,3 +1,10 @@ +import { + DatasetNonNumericVersionSearchParam, + DatasetPublishingStatus +} from '@/dataset/domain/models/Dataset' +import type { Dataset } from '@/dataset/domain/models/Dataset' +import { QueryParamKey, Route } from '@/sections/Route.enum' + export class EditDatasetTermsHelper { static EDIT_DATASET_TERMS_TABS_KEYS = { datasetTerms: 'datasetTerms', @@ -16,7 +23,25 @@ export class EditDatasetTermsHelper { ] ?? this.EDIT_DATASET_TERMS_TABS_KEYS.datasetTerms ) } + + public static buildDatasetPageUrl( + dataset: Dataset, + version: EditDatasetTermsDatasetPageVersion = 'current' + ): string { + const searchParams = new URLSearchParams() + searchParams.set(QueryParamKey.PERSISTENT_ID, dataset.persistentId) + + if (version === 'draft' || dataset.version.publishingStatus === DatasetPublishingStatus.DRAFT) { + searchParams.set(QueryParamKey.VERSION, DatasetNonNumericVersionSearchParam.DRAFT) + } else { + searchParams.set(QueryParamKey.VERSION, dataset.version.number.toString()) + } + + return `${Route.DATASETS}?${searchParams.toString()}` + } } export type EditDatasetTermsTabKey = (typeof EditDatasetTermsHelper.EDIT_DATASET_TERMS_TABS_KEYS)[keyof typeof EditDatasetTermsHelper.EDIT_DATASET_TERMS_TABS_KEYS] + +export type EditDatasetTermsDatasetPageVersion = 'current' | 'draft' diff --git a/src/sections/edit-dataset-terms/edit-guestbook/EditGuestbook.tsx b/src/sections/edit-dataset-terms/edit-guestbook/EditGuestbook.tsx index d91e7185b..ec47ec515 100644 --- a/src/sections/edit-dataset-terms/edit-guestbook/EditGuestbook.tsx +++ b/src/sections/edit-dataset-terms/edit-guestbook/EditGuestbook.tsx @@ -5,16 +5,15 @@ import { useNavigate } from 'react-router-dom' import { toast } from 'react-toastify' import { Guestbook } from '@/guestbooks/domain/models/Guestbook' import { GuestbookRepository } from '@/guestbooks/domain/repositories/GuestbookRepository' -import { - DatasetNonNumericVersionSearchParam, - DatasetPublishingStatus -} from '@/dataset/domain/models/Dataset' import { useGetGuestbooksByCollectionId } from '@/sections/guestbooks/useGetGuestbooksByCollectionId' -import { QueryParamKey, Route } from '@/sections/Route.enum' import { useAssignDatasetGuestbook } from './useAssignDatasetGuestbook' import { useRemoveDatasetGuestbook } from './useRemoveDatasetGuestbook' import { useDataset } from '../../dataset/DatasetContext' import { PreviewGuestbookModal } from '@/sections/guestbooks/preview-modal/PreviewGuestbookModal' +import { + EditDatasetTermsDatasetPageVersion, + EditDatasetTermsHelper +} from '../EditDatasetTermsHelper' import styles from './EditGuestbook.module.scss' interface EditGuestbookProps { @@ -37,20 +36,14 @@ export function EditGuestbook({ const collectionIdOrAlias = dataset?.parentCollectionNode?.id const collectionName = dataset?.parentCollectionNode?.name ?? '' - const navigateToDatasetView = useCallback(() => { - if (!dataset) return - - const searchParams = new URLSearchParams() - searchParams.set(QueryParamKey.PERSISTENT_ID, dataset.persistentId) + const navigateToDatasetView = useCallback( + (version?: EditDatasetTermsDatasetPageVersion) => { + if (!dataset) return - if (dataset.version.publishingStatus === DatasetPublishingStatus.DRAFT) { - searchParams.set(QueryParamKey.VERSION, DatasetNonNumericVersionSearchParam.DRAFT) - } else { - searchParams.set(QueryParamKey.VERSION, dataset.version.number.toString()) - } - - navigate(`${Route.DATASETS}?${searchParams.toString()}`) - }, [dataset, navigate]) + navigate(EditDatasetTermsHelper.buildDatasetPageUrl(dataset, version)) + }, + [dataset, navigate] + ) const handleCancel = () => { navigateToDatasetView() @@ -70,7 +63,7 @@ export function EditGuestbook({ onSuccessfulAssignDatasetGuestbook: () => { toast.success(t('alerts.termsUpdated.alertText')) refreshDataset() - navigateToDatasetView() + navigateToDatasetView('draft') } }) const { @@ -82,7 +75,7 @@ export function EditGuestbook({ onSuccessfulRemoveDatasetGuestbook: () => { toast.success(t('alerts.termsUpdated.alertText')) refreshDataset() - navigateToDatasetView() + navigateToDatasetView('draft') } }) diff --git a/src/sections/edit-dataset-terms/edit-license-and-terms/EditLicenseAndTerms.tsx b/src/sections/edit-dataset-terms/edit-license-and-terms/EditLicenseAndTerms.tsx index ef5b96f84..026211269 100644 --- a/src/sections/edit-dataset-terms/edit-license-and-terms/EditLicenseAndTerms.tsx +++ b/src/sections/edit-dataset-terms/edit-license-and-terms/EditLicenseAndTerms.tsx @@ -9,12 +9,11 @@ import { LicenseRepository } from '../../../licenses/domain/repositories/License import { useGetLicenses } from './useGetLicenses' import { useDataset } from '../../dataset/DatasetContext' import { useUpdateDatasetLicense } from './useUpdateDatasetLicense' -import { Route, QueryParamKey } from '../../Route.enum' -import { - DatasetNonNumericVersionSearchParam, - DatasetPublishingStatus -} from '../../../dataset/domain/models/Dataset' import { useDatasetRepositories } from '@/shared/contexts/repositories/RepositoriesProvider' +import { + EditDatasetTermsDatasetPageVersion, + EditDatasetTermsHelper +} from '../EditDatasetTermsHelper' import styles from './EditLicenseAndTerms.module.scss' const CUSTOM_LICENSE_VALUE = 'CUSTOM' as const @@ -46,27 +45,21 @@ export function EditLicenseAndTerms({ autoFetch: true }) - const navigateToDatasetView = useCallback(() => { - if (!dataset) return + const navigateToDatasetView = useCallback( + (version?: EditDatasetTermsDatasetPageVersion) => { + if (!dataset) return - const searchParams = new URLSearchParams() - searchParams.set(QueryParamKey.PERSISTENT_ID, dataset.persistentId) - - if (dataset.version.publishingStatus === DatasetPublishingStatus.DRAFT) { - searchParams.set(QueryParamKey.VERSION, DatasetNonNumericVersionSearchParam.DRAFT) - } else { - searchParams.set(QueryParamKey.VERSION, dataset.version.number.toString()) - } - - navigate(`${Route.DATASETS}?${searchParams.toString()}`) - }, [dataset, navigate]) + navigate(EditDatasetTermsHelper.buildDatasetPageUrl(dataset, version)) + }, + [dataset, navigate] + ) const { handleUpdateLicense, isLoading, error } = useUpdateDatasetLicense({ datasetRepository, onSuccessfulUpdateLicense: () => { toast.success(t('alerts.licenseUpdated.alertText')) refreshDataset() - navigateToDatasetView() + navigateToDatasetView('draft') } }) diff --git a/src/sections/edit-dataset-terms/edit-terms-of-access/EditTermsOfAccess.tsx b/src/sections/edit-dataset-terms/edit-terms-of-access/EditTermsOfAccess.tsx index bd96bdf24..e03bce82d 100644 --- a/src/sections/edit-dataset-terms/edit-terms-of-access/EditTermsOfAccess.tsx +++ b/src/sections/edit-dataset-terms/edit-terms-of-access/EditTermsOfAccess.tsx @@ -1,19 +1,18 @@ -import { useEffect, useMemo, useRef } from 'react' +import { useCallback, useEffect, useMemo, useRef } from 'react' import { useTranslation } from 'react-i18next' import { useForm, Controller, FormProvider, useWatch } from 'react-hook-form' import { toast } from 'react-toastify' import { Form, Row, Col, Button, Alert } from '@iqss/dataverse-design-system' import styles from '../edit-license-and-terms/EditLicenseAndTerms.module.scss' -import { - DatasetNonNumericVersionSearchParam, - DatasetPublishingStatus, - TermsOfAccess -} from '@/dataset/domain/models/Dataset' +import { TermsOfAccess } from '@/dataset/domain/models/Dataset' import { useDataset } from '../../dataset/DatasetContext' import { useUpdateTermsOfAccess } from './useUpdateTermsOfAccess' -import { QueryParamKey, Route } from '@/sections/Route.enum' import { useNavigate } from 'react-router-dom' import { useDatasetRepositories } from '@/shared/contexts/repositories/RepositoriesProvider' +import { + EditDatasetTermsDatasetPageVersion, + EditDatasetTermsHelper +} from '../EditDatasetTermsHelper' interface EditTermsOfAccessProps { onFormStateChange?: (isDirty: boolean) => void @@ -41,11 +40,21 @@ export function EditTermsOfAccess({ onFormStateChange }: EditTermsOfAccessProps) (dataset?.termsOfUse.termsOfAccess as TermsOfAccess) ?? defaultTermsOfAccess const formContainerRef = useRef(null) + const navigateToDatasetView = useCallback( + (version?: EditDatasetTermsDatasetPageVersion) => { + if (!dataset) return + + navigate(EditDatasetTermsHelper.buildDatasetPageUrl(dataset, version)) + }, + [dataset, navigate] + ) + const { handleUpdateTermsOfAccess, isLoading, error } = useUpdateTermsOfAccess({ datasetRepository, onSuccessfulUpdateTermsOfAccess: () => { toast.success(t('alerts.termsUpdated.alertText')) refreshDataset() + navigateToDatasetView('draft') } }) @@ -117,18 +126,7 @@ export function EditTermsOfAccess({ onFormStateChange }: EditTermsOfAccessProps) }, [initialTermsOfAccess, isRequestAccessEnabled, t]) const handleCancel = () => { - if (!dataset) return - - const searchParams = new URLSearchParams() - searchParams.set(QueryParamKey.PERSISTENT_ID, dataset.persistentId) - - if (dataset.version.publishingStatus === DatasetPublishingStatus.DRAFT) { - searchParams.set(QueryParamKey.VERSION, DatasetNonNumericVersionSearchParam.DRAFT) - } else { - searchParams.set(QueryParamKey.VERSION, dataset.version.number.toString()) - } - - navigate(`${Route.DATASETS}?${searchParams.toString()}`) + navigateToDatasetView() } return ( diff --git a/tests/component/sections/edit-dataset-terms/EditDatasetTerms.spec.tsx b/tests/component/sections/edit-dataset-terms/EditDatasetTerms.spec.tsx index 0caf998fd..41ab21e09 100644 --- a/tests/component/sections/edit-dataset-terms/EditDatasetTerms.spec.tsx +++ b/tests/component/sections/edit-dataset-terms/EditDatasetTerms.spec.tsx @@ -1,4 +1,5 @@ import { ReactNode } from 'react' +import { useLocation } from 'react-router-dom' import { EditDatasetTerms } from '@/sections/edit-dataset-terms/EditDatasetTerms' import { DatasetProvider } from '@/sections/dataset/DatasetProvider' import { LicenseRepository } from '@/licenses/domain/repositories/LicenseRepository' @@ -7,7 +8,10 @@ import { EditDatasetTermsHelper, EditDatasetTermsTabKey } from '@/sections/edit-dataset-terms/EditDatasetTermsHelper' -import { DatasetMother } from '@tests/component/dataset/domain/models/DatasetMother' +import { + DatasetMother, + DatasetVersionMother +} from '@tests/component/dataset/domain/models/DatasetMother' import { TermsOfUseMother, TermsOfAccessMother @@ -88,8 +92,14 @@ const mockGuestbooks: Guestbook[] = [ } ] +const LocationDisplay = () => { + const location = useLocation() + + return
{`${location.pathname}${location.search}`}
+} + describe('EditDatasetTerms', () => { - const withProviders = (component: ReactNode, dataset: Dataset) => { + const withProviders = (component: ReactNode, dataset: Dataset | undefined) => { datasetRepository.getByPersistentId = cy.stub().resolves(dataset) datasetRepository.getByPrivateUrlToken = cy.stub().resolves(dataset) return ( @@ -138,22 +148,54 @@ describe('EditDatasetTerms', () => { EditDatasetTermsHelper.EDIT_DATASET_TERMS_TABS_KEYS.datasetTerms ) }) + + it('builds a dataset page URL for the current dataset version', () => { + const dataset = DatasetMother.create({ + persistentId: 'some-persistent-id', + version: DatasetVersionMother.createReleased() + }) + + expect(EditDatasetTermsHelper.buildDatasetPageUrl(dataset)).to.equal( + '/datasets?persistentId=some-persistent-id&version=1.0' + ) + }) + + it('builds a dataset page URL for the draft dataset version', () => { + const dataset = DatasetMother.create({ + persistentId: 'some-persistent-id', + version: DatasetVersionMother.createReleased() + }) + + expect(EditDatasetTermsHelper.buildDatasetPageUrl(dataset, 'draft')).to.equal( + '/datasets?persistentId=some-persistent-id&version=DRAFT' + ) + }) + + it('keeps draft datasets on the draft version when building current dataset page URLs', () => { + const dataset = DatasetMother.create({ + persistentId: 'some-persistent-id', + version: DatasetVersionMother.createDraftAsLatestVersion() + }) + + expect(EditDatasetTermsHelper.buildDatasetPageUrl(dataset)).to.equal( + '/datasets?persistentId=some-persistent-id&version=DRAFT' + ) + }) }) it('renders NotFoundPage when dataset is missing', () => { datasetRepository.getByPersistentId = cy.stub().resolves(undefined) datasetRepository.getByPrivateUrlToken = cy.stub().resolves(undefined) - + const dataset = DatasetMother.createEmpty() cy.customMount( - + withProviders( - + guestbookRepository={guestbookRepository} + />, + dataset + ) ) cy.findByTestId('not-found-page').should('exist') @@ -343,7 +385,6 @@ describe('EditDatasetTerms', () => { , dataset @@ -367,7 +408,7 @@ describe('EditDatasetTerms', () => { // Force an invalid key to hit the default branch in getCurrentFormDirtyState defaultActiveTabKey={'unknown-tab' as unknown as EditDatasetTermsTabKey} licenseRepository={licenseRepository} - datasetRepository={datasetRepository} + guestbookRepository={guestbookRepository} />, dataset ) @@ -389,7 +430,7 @@ describe('EditDatasetTerms', () => { , dataset ) @@ -444,6 +485,39 @@ describe('EditDatasetTerms', () => { cy.findByTestId('customTerms.termsOfUse').should('exist') cy.findByRole('button', { name: 'Save Changes' }).should('exist') }) + + it('navigates to the draft dataset version after saving license edits', () => { + const dataset = DatasetMother.create({ + persistentId: 'some-persistent-id', + version: DatasetVersionMother.createReleased(), + license: mockLicenses[0], + termsOfUse: TermsOfUseMother.withoutCustomTerms() + }) + datasetRepository.updateDatasetLicense = cy.stub().resolves() + + cy.customMount( + withProviders( + <> + + + , + dataset + ) + ) + + cy.get('select').select('CC BY 4.0') + cy.findByRole('button', { name: 'Save Changes' }).click() + + cy.wrap(datasetRepository.updateDatasetLicense).should('have.been.called') + cy.findByTestId('current-location').should( + 'have.text', + '/datasets?persistentId=some-persistent-id&version=DRAFT' + ) + }) }) describe('Restricted Files Tab Integration', () => { @@ -523,6 +597,48 @@ describe('EditDatasetTerms', () => { cy.findByRole('button', { name: 'Save Changes' }).should('be.enabled') }) + + it('navigates to the draft dataset version after saving restricted file terms edits', () => { + const dataset = DatasetMother.create({ + persistentId: 'some-persistent-id', + version: DatasetVersionMother.createReleased(), + license: mockLicenses[0], + termsOfUse: TermsOfUseMother.withoutCustomTerms({ + termsOfAccess: TermsOfAccessMother.create({ + fileAccessRequest: true, + termsOfAccessForRestrictedFiles: 'Existing access terms' + }) + }) + }) + datasetRepository.updateTermsOfAccess = cy.stub().resolves() + + cy.customMount( + withProviders( + <> + + + , + dataset + ) + ) + + cy.findByLabelText(/Terms of Access for Restricted Files/i) + .clear() + .type('Updated access terms') + cy.findByRole('button', { name: 'Save Changes' }).click() + + cy.wrap(datasetRepository.updateTermsOfAccess).should('have.been.called') + cy.findByTestId('current-location').should( + 'have.text', + '/datasets?persistentId=some-persistent-id&version=DRAFT' + ) + }) }) describe('Guestbook Tab Integration', () => { @@ -600,6 +716,38 @@ describe('EditDatasetTerms', () => { cy.findByText(/Email/).should('exist') }) }) + + it('navigates to the draft dataset version after saving guestbook edits', () => { + const dataset = DatasetMother.create({ + persistentId: 'some-persistent-id', + version: DatasetVersionMother.createReleased(), + license: mockLicenses[0], + guestbookId: mockGuestbooks[0].id + }) + + cy.customMount( + withProviders( + <> + + + , + dataset + ) + ) + + cy.findByLabelText('Secondary Guestbook').click() + cy.findByRole('button', { name: 'Save Changes' }).click() + + cy.wrap(guestbookRepository.assignDatasetGuestbook).should('have.been.called') + cy.findByTestId('current-location').should( + 'have.text', + '/datasets?persistentId=some-persistent-id&version=DRAFT' + ) + }) }) describe('Tab State Guard Branches', () => { From 7af09ec40a7df1c90fb2c16f83e3e37970393c7e Mon Sep 17 00:00:00 2001 From: Ellen Kraffmiller Date: Wed, 8 Jul 2026 16:30:40 -0400 Subject: [PATCH 2/6] fix component test --- .../sections/edit-dataset-terms/EditGuestbook.spec.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/component/sections/edit-dataset-terms/EditGuestbook.spec.tsx b/tests/component/sections/edit-dataset-terms/EditGuestbook.spec.tsx index 3dff96744..49fcbd936 100644 --- a/tests/component/sections/edit-dataset-terms/EditGuestbook.spec.tsx +++ b/tests/component/sections/edit-dataset-terms/EditGuestbook.spec.tsx @@ -331,7 +331,7 @@ describe('EditGuestbook', () => { ) }) - it('navigates with numeric version query param after successful submit for non-draft datasets', () => { + it('navigates with Draft param after successful submit for non-draft datasets', () => { ;(guestbookRepository.assignDatasetGuestbook as Cypress.Agent).resolves( undefined ) @@ -356,7 +356,7 @@ describe('EditGuestbook', () => { cy.findByRole('button', { name: 'Save Changes' }).click() cy.findByTestId('location-display').should( 'have.text', - '/datasets?persistentId=doi%3A10.5072%2FFK2%2FRELEASEDPID&version=1.0' + '/datasets?persistentId=doi%3A10.5072%2FFK2%2FRELEASEDPID&version=DRAFT' ) }) From b6edd2c2c4ff7cbc080e8de9787749810f0ca7ec Mon Sep 17 00:00:00 2001 From: Ellen Kraffmiller Date: Wed, 8 Jul 2026 16:45:39 -0400 Subject: [PATCH 3/6] update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 46e13f875..279bc9970 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ This changelog follows the principles of [Keep a Changelog](https://keepachangel ### Fixed +- Edit Dataset Terms: navigate to the draft version of the dataset after saving changes to the terms, instead of the latest published version. + ### Removed --- From 7dec3329c5295bed84848ca7329c715ba75f049d Mon Sep 17 00:00:00 2001 From: Ellen Kraffmiller Date: Wed, 8 Jul 2026 17:24:54 -0400 Subject: [PATCH 4/6] increase test coverage --- .../EditDatasetTerms.spec.tsx | 163 ++++++++++++++++++ 1 file changed, 163 insertions(+) diff --git a/tests/component/sections/edit-dataset-terms/EditDatasetTerms.spec.tsx b/tests/component/sections/edit-dataset-terms/EditDatasetTerms.spec.tsx index 41ab21e09..da8db641c 100644 --- a/tests/component/sections/edit-dataset-terms/EditDatasetTerms.spec.tsx +++ b/tests/component/sections/edit-dataset-terms/EditDatasetTerms.spec.tsx @@ -518,6 +518,70 @@ describe('EditDatasetTerms', () => { '/datasets?persistentId=some-persistent-id&version=DRAFT' ) }) + + it('navigates to the draft dataset version after saving custom terms edits', () => { + const dataset = DatasetMother.create({ + persistentId: 'some-persistent-id', + version: DatasetVersionMother.createReleased(), + license: mockLicenses[0], + termsOfUse: TermsOfUseMother.withoutCustomTerms() + }) + datasetRepository.updateDatasetLicense = cy.stub().resolves() + + cy.customMount( + withProviders( + <> + + + , + dataset + ) + ) + + cy.get('select').select('Custom Dataset Terms') + cy.findByTestId('customTerms.termsOfUse').type('Updated custom terms') + cy.findByRole('button', { name: 'Save Changes' }).click() + + cy.wrap(datasetRepository.updateDatasetLicense).should('have.been.called') + cy.findByTestId('current-location').should( + 'have.text', + '/datasets?persistentId=some-persistent-id&version=DRAFT' + ) + }) + + it('navigates to the current dataset version after canceling license edits', () => { + const dataset = DatasetMother.create({ + persistentId: 'some-persistent-id', + version: DatasetVersionMother.createReleased(), + license: mockLicenses[0], + termsOfUse: TermsOfUseMother.withoutCustomTerms() + }) + + cy.customMount( + withProviders( + <> + + + , + dataset + ) + ) + + cy.findByRole('button', { name: 'Cancel' }).click() + + cy.findByTestId('current-location').should( + 'have.text', + '/datasets?persistentId=some-persistent-id&version=1.0' + ) + }) }) describe('Restricted Files Tab Integration', () => { @@ -639,6 +703,43 @@ describe('EditDatasetTerms', () => { '/datasets?persistentId=some-persistent-id&version=DRAFT' ) }) + + it('navigates to the current dataset version after canceling restricted file terms edits', () => { + const dataset = DatasetMother.create({ + persistentId: 'some-persistent-id', + version: DatasetVersionMother.createReleased(), + license: mockLicenses[0], + termsOfUse: TermsOfUseMother.withoutCustomTerms({ + termsOfAccess: TermsOfAccessMother.create({ + fileAccessRequest: true, + termsOfAccessForRestrictedFiles: 'Existing access terms' + }) + }) + }) + + cy.customMount( + withProviders( + <> + + + , + dataset + ) + ) + + cy.findByRole('button', { name: 'Cancel' }).click() + + cy.findByTestId('current-location').should( + 'have.text', + '/datasets?persistentId=some-persistent-id&version=1.0' + ) + }) }) describe('Guestbook Tab Integration', () => { @@ -748,6 +849,68 @@ describe('EditDatasetTerms', () => { '/datasets?persistentId=some-persistent-id&version=DRAFT' ) }) + + it('navigates to the draft dataset version after removing a guestbook', () => { + const dataset = DatasetMother.create({ + persistentId: 'some-persistent-id', + version: DatasetVersionMother.createReleased(), + license: mockLicenses[0], + guestbookId: mockGuestbooks[0].id + }) + + cy.customMount( + withProviders( + <> + + + , + dataset + ) + ) + + cy.findByRole('button', { name: 'Clear Selection' }).click() + cy.findByRole('button', { name: 'Save Changes' }).click() + + cy.wrap(guestbookRepository.removeDatasetGuestbook).should('have.been.called') + cy.findByTestId('current-location').should( + 'have.text', + '/datasets?persistentId=some-persistent-id&version=DRAFT' + ) + }) + + it('navigates to the current draft dataset version after canceling guestbook edits', () => { + const dataset = DatasetMother.create({ + persistentId: 'some-persistent-id', + version: DatasetVersionMother.createDraftAsLatestVersion(), + license: mockLicenses[0], + guestbookId: mockGuestbooks[0].id + }) + + cy.customMount( + withProviders( + <> + + + , + dataset + ) + ) + + cy.findByRole('button', { name: 'Cancel' }).click() + + cy.findByTestId('current-location').should( + 'have.text', + '/datasets?persistentId=some-persistent-id&version=DRAFT' + ) + }) }) describe('Tab State Guard Branches', () => { From 88017e62b7aea7bd1144c76ff848c96c6092e855 Mon Sep 17 00:00:00 2001 From: Ellen Kraffmiller Date: Thu, 9 Jul 2026 13:55:55 -0400 Subject: [PATCH 5/6] increase test coverage --- .../sections/dataset/DatasetProvider.spec.tsx | 26 ++++++++- .../sections/route-enum/Route.spec.ts | 54 +++++++++++++++++++ 2 files changed, 79 insertions(+), 1 deletion(-) diff --git a/tests/component/sections/dataset/DatasetProvider.spec.tsx b/tests/component/sections/dataset/DatasetProvider.spec.tsx index 9e7d4962b..95b1d34ae 100644 --- a/tests/component/sections/dataset/DatasetProvider.spec.tsx +++ b/tests/component/sections/dataset/DatasetProvider.spec.tsx @@ -99,19 +99,43 @@ describe('DatasetProvider', () => { }) it('stops loading if error happens', () => { + cy.stub(console, 'error').as('consoleError') datasetRepository.getByPersistentId = cy.stub().rejects(new Error('some error')) cy.mount( + searchParams={{ persistentId: dataset.persistentId }}> ) cy.findByText('Loading...').should('exist') + cy.wrap(datasetRepository.getByPersistentId).should('have.been.calledOnce') + cy.get('@consoleError').should( + 'have.been.calledWithMatch', + 'There was an error getting the dataset' + ) cy.findByText('Dataset Not Found').should('exist') cy.findByText('Loading...').should('not.exist') }) + + it('does not fetch the dataset while publishing', () => { + cy.mount( + + + + + + ) + + cy.wrap(datasetRepository.getByPersistentId).should('not.have.been.called') + cy.wrap(datasetRepository.getByPrivateUrlToken).should('not.have.been.called') + cy.findByText('Loading...').should('exist') + cy.findByText('Dataset Not Found').should('exist') + }) }) diff --git a/tests/component/sections/route-enum/Route.spec.ts b/tests/component/sections/route-enum/Route.spec.ts index 5c1b69ed5..825a5a79f 100644 --- a/tests/component/sections/route-enum/Route.spec.ts +++ b/tests/component/sections/route-enum/Route.spec.ts @@ -1,4 +1,6 @@ import { Route, RouteWithParams } from '@/sections/Route.enum' +import { EditFileMetadataReferrer } from '@/sections/edit-file-metadata/EditFileMetadata' +import { ReplaceFileReferrer } from '@/sections/replace-file/ReplaceFile' describe('Route.enum.ts', () => { describe('RouteWithParams', () => { @@ -18,5 +20,57 @@ describe('Route.enum.ts', () => { it('should return the correct route for CREATE_DATASET', () => { expect(RouteWithParams.CREATE_DATASET('123')).to.be.equal(`/datasets/123/create`) }) + + it('should return the correct route for EDIT_FEATURED_ITEMS', () => { + expect(RouteWithParams.EDIT_FEATURED_ITEMS('123')).to.be.equal( + `/collections/123/edit-featured-items` + ) + }) + + it('should return the correct route for collection templates', () => { + expect(RouteWithParams.COLLECTION_TEMPLATES('root')).to.be.equal('/root/templates') + expect(RouteWithParams.TEMPLATES_CREATE('root')).to.be.equal('/root/templates/create') + expect(RouteWithParams.TEMPLATES_EDIT_METADATA('root', 10)).to.be.equal( + '/root/templates/10/edit/metadata' + ) + expect(RouteWithParams.TEMPLATES_EDIT_TERMS('root', 'template-10')).to.be.equal( + '/root/templates/template-10/edit/terms' + ) + }) + + it('should return the correct route for EDIT_FILE_METADATA', () => { + expect( + RouteWithParams.EDIT_FILE_METADATA( + 'doi:10.5072/FK2/ABC', + 'draft', + 5, + EditFileMetadataReferrer.DATASET + ) + ).to.be.equal( + '/files/edit-metadata?id=5&persistentId=doi%3A10.5072%2FFK2%2FABC&datasetVersion=draft&referrer=dataset' + ) + }) + + it('should return the correct route for FILES_REPLACE', () => { + expect(RouteWithParams.FILES_REPLACE('doi:10.5072/FK2/ABC', 'draft', 5)).to.be.equal( + '/files/replace?id=5&persistentId=doi%3A10.5072%2FFK2%2FABC&datasetVersion=draft' + ) + + expect( + RouteWithParams.FILES_REPLACE('doi:10.5072/FK2/ABC', 'draft', 5, ReplaceFileReferrer.FILE) + ).to.be.equal( + '/files/replace?id=5&persistentId=doi%3A10.5072%2FFK2%2FABC&datasetVersion=draft&referrer=file' + ) + }) + + it('should return the correct route for FEATURED_ITEM', () => { + expect(RouteWithParams.FEATURED_ITEM('parent', 'item')).to.be.equal( + '/featured-item/parent/item' + ) + }) + + it('should return the correct route for ADVANCED_SEARCH', () => { + expect(RouteWithParams.ADVANCED_SEARCH('root')).to.be.equal('/collections/root/search') + }) }) }) From 1878f74ecf1a46b62612644b040d1c3019c39f25 Mon Sep 17 00:00:00 2001 From: Ellen Kraffmiller Date: Thu, 9 Jul 2026 14:43:15 -0400 Subject: [PATCH 6/6] fix flaky test --- .../e2e/sections/edit-dataset-terms/EditDatasetTerms.spec.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/e2e-integration/e2e/sections/edit-dataset-terms/EditDatasetTerms.spec.tsx b/tests/e2e-integration/e2e/sections/edit-dataset-terms/EditDatasetTerms.spec.tsx index f30c0f89a..a44fd151a 100644 --- a/tests/e2e-integration/e2e/sections/edit-dataset-terms/EditDatasetTerms.spec.tsx +++ b/tests/e2e-integration/e2e/sections/edit-dataset-terms/EditDatasetTerms.spec.tsx @@ -117,7 +117,7 @@ describe('Edit Dataset Terms', () => { cy.findByLabelText('Size of Collection').type('500 MB') cy.findByRole('button', { name: 'Save Changes' }).click() - cy.findByRole('button', { name: 'Cancel' }).click() + cy.findByText(/The terms for this dataset have been updated./i).should('exist') cy.findByRole('tab', { name: /^Terms(?: and Guestbook)?$/ }).click() cy.findByText(/Data can be accessed through the university data center/i).should('exist')