Skip to content

Commit 7c1e54f

Browse files
committed
fix: increase test coverage
1 parent 2e0d904 commit 7c1e54f

File tree

10 files changed

+376
-34
lines changed

10 files changed

+376
-34
lines changed

src/dataset/domain/useCases/updateDatasetLicense.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,5 @@ export function updateDatasetLicense(
66
datasetId: string | number,
77
licenseUpdateRequest: DatasetLicenseUpdateRequest
88
): Promise<void> {
9-
return datasetRepository
10-
.updateDatasetLicense(datasetId, licenseUpdateRequest)
11-
.catch((error: Error) => {
12-
throw new Error(error.message)
13-
})
9+
return datasetRepository.updateDatasetLicense(datasetId, licenseUpdateRequest)
1410
}

src/dataset/domain/useCases/updateTermsOfAccess.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,5 @@ export function updateTermsOfAccess(
66
datasetId: string | number,
77
termsOfAccess: TermsOfAccess
88
): Promise<void> {
9-
return datasetRepository.updateTermsOfAccess(datasetId, termsOfAccess).catch((error: Error) => {
10-
throw new Error(error.message)
11-
})
9+
return datasetRepository.updateTermsOfAccess(datasetId, termsOfAccess)
1210
}

src/sections/shared/form/TemplateMetadataForm/TemplateForm/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ export const TemplateForm = ({
9292
const templateFields = datasetDto.metadataBlocks.flatMap((metadataBlock) =>
9393
MetadataFieldsHelper.buildTemplateFieldsFromMetadataValues(
9494
metadataBlock.fields,
95-
metadataFieldsForMapping[metadataBlock.name] ?? {}
95+
metadataFieldsForMapping[metadataBlock.name]
9696
)
9797
)
9898

tests/component/sections/collection/edit-collection-dropdown/EditCollectionDropdown.spec.tsx

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,4 +279,48 @@ describe('EditCollectionDropdown', () => {
279279
)
280280
})
281281
})
282+
283+
describe('DatasetTemplates', () => {
284+
it('does not render Dataset Templates link when dropdown is closed', () => {
285+
cy.mountAuthenticated(
286+
<EditCollectionDropdown
287+
collection={rootCollection}
288+
collectionRepository={collectionRepository}
289+
canUserDeleteCollection={false}
290+
/>
291+
)
292+
293+
cy.findByRole('link', { name: 'Dataset Templates' }).should('not.exist')
294+
})
295+
296+
it('updates Dataset Templates link when collection id changes', () => {
297+
const anotherCollection = CollectionMother.create({
298+
id: 'science',
299+
name: 'Science',
300+
contacts: [{ email: 'science@test.com', displayOrder: 0 }],
301+
hierarchy: UpwardHierarchyNodeMother.createCollection({
302+
id: 'science',
303+
name: 'Science'
304+
}),
305+
isFacetRoot: true,
306+
isMetadataBlockRoot: true
307+
})
308+
309+
cy.mountAuthenticated(
310+
<EditCollectionDropdown
311+
collection={anotherCollection}
312+
collectionRepository={collectionRepository}
313+
canUserDeleteCollection={false}
314+
/>
315+
)
316+
317+
openDropdown()
318+
319+
cy.findByRole('link', { name: 'Dataset Templates' }).should(
320+
'have.attr',
321+
'href',
322+
'/science/templates'
323+
)
324+
})
325+
})
282326
})

tests/component/sections/edit-dataset-terms/EditDatasetTerms.spec.tsx

Lines changed: 161 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,17 @@ import { EditDatasetTerms } from '@/sections/edit-dataset-terms/EditDatasetTerms
33
import { DatasetProvider } from '@/sections/dataset/DatasetProvider'
44
import { LicenseRepository } from '@/licenses/domain/repositories/LicenseRepository'
55
import { DatasetRepository } from '@/dataset/domain/repositories/DatasetRepository'
6-
import { EditDatasetTermsHelper } from '@/sections/edit-dataset-terms/EditDatasetTermsHelper'
6+
import {
7+
EditDatasetTermsHelper,
8+
EditDatasetTermsTabKey
9+
} from '@/sections/edit-dataset-terms/EditDatasetTermsHelper'
710
import { DatasetMother } from '@tests/component/dataset/domain/models/DatasetMother'
811
import {
912
TermsOfUseMother,
1013
TermsOfAccessMother
1114
} from '@tests/component/dataset/domain/models/TermsOfUseMother'
1215
import { Dataset } from '@/dataset/domain/models/Dataset'
1316
import { License } from '@/licenses/domain/models/License'
14-
1517
const licenseRepository: LicenseRepository = {} as LicenseRepository
1618
const datasetRepository: DatasetRepository = {} as DatasetRepository
1719

@@ -46,6 +48,50 @@ const mockLicenses: License[] = [
4648
}
4749
]
4850

51+
describe('EditDatasetTermsHelper', () => {
52+
describe('defineSelectedTabKey', () => {
53+
it('should return the correct tab key when a tab query param is present in the URL', () => {
54+
const searchParams = new URLSearchParams()
55+
searchParams.set(
56+
EditDatasetTermsHelper.EDIT_DATASET_TERMS_TAB_QUERY_KEY,
57+
'restrictedFilesTerms'
58+
)
59+
60+
const result = EditDatasetTermsHelper.defineSelectedTabKey(searchParams)
61+
62+
expect(result).to.equal(
63+
EditDatasetTermsHelper.EDIT_DATASET_TERMS_TABS_KEYS.restrictedFilesTerms
64+
)
65+
})
66+
67+
it('should return the correct tab key for guestBook', () => {
68+
const searchParams = new URLSearchParams()
69+
searchParams.set(EditDatasetTermsHelper.EDIT_DATASET_TERMS_TAB_QUERY_KEY, 'guestBook')
70+
71+
const result = EditDatasetTermsHelper.defineSelectedTabKey(searchParams)
72+
73+
expect(result).to.equal(EditDatasetTermsHelper.EDIT_DATASET_TERMS_TABS_KEYS.guestBook)
74+
})
75+
76+
it('should return the dataset terms tab key as default if the tab query param is not present in the URL', () => {
77+
const searchParams = new URLSearchParams()
78+
79+
const result = EditDatasetTermsHelper.defineSelectedTabKey(searchParams)
80+
81+
expect(result).to.equal(EditDatasetTermsHelper.EDIT_DATASET_TERMS_TABS_KEYS.datasetTerms)
82+
})
83+
84+
it('should return the dataset terms tab key as default if the tab query param is invalid', () => {
85+
const searchParams = new URLSearchParams()
86+
searchParams.set(EditDatasetTermsHelper.EDIT_DATASET_TERMS_TAB_QUERY_KEY, 'doesNotExist')
87+
88+
const result = EditDatasetTermsHelper.defineSelectedTabKey(searchParams)
89+
90+
expect(result).to.equal(EditDatasetTermsHelper.EDIT_DATASET_TERMS_TABS_KEYS.datasetTerms)
91+
})
92+
})
93+
})
94+
4995
describe('EditDatasetTerms', () => {
5096
const withProviders = (component: ReactNode, dataset: Dataset) => {
5197
datasetRepository.getByPersistentId = cy.stub().resolves(dataset)
@@ -64,6 +110,25 @@ describe('EditDatasetTerms', () => {
64110
licenseRepository.getAvailableStandardLicenses = cy.stub().resolves(mockLicenses)
65111
})
66112

113+
it('renders NotFoundPage when dataset is missing', () => {
114+
datasetRepository.getByPersistentId = cy.stub().resolves(undefined)
115+
datasetRepository.getByPrivateUrlToken = cy.stub().resolves(undefined)
116+
117+
cy.customMount(
118+
<DatasetProvider
119+
searchParams={{ persistentId: 'some-persistent-id', version: 'some-version' }}
120+
repository={datasetRepository}>
121+
<EditDatasetTerms
122+
defaultActiveTabKey={EditDatasetTermsHelper.EDIT_DATASET_TERMS_TABS_KEYS.datasetTerms}
123+
licenseRepository={licenseRepository}
124+
datasetRepository={datasetRepository}
125+
/>
126+
</DatasetProvider>
127+
)
128+
129+
cy.findByTestId('not-found-page').should('exist')
130+
})
131+
67132
describe('Tab Navigation', () => {
68133
it('renders all three tabs', () => {
69134
const dataset = DatasetMother.create({
@@ -236,6 +301,100 @@ describe('EditDatasetTerms', () => {
236301
'true'
237302
)
238303
})
304+
305+
it('shows unsaved changes modal when restricted files form is dirty', () => {
306+
const dataset = DatasetMother.create({
307+
license: mockLicenses[0],
308+
termsOfUse: TermsOfUseMother.withoutCustomTerms()
309+
})
310+
311+
cy.customMount(
312+
withProviders(
313+
<EditDatasetTerms
314+
defaultActiveTabKey={
315+
EditDatasetTermsHelper.EDIT_DATASET_TERMS_TABS_KEYS.restrictedFilesTerms
316+
}
317+
licenseRepository={licenseRepository}
318+
datasetRepository={datasetRepository}
319+
/>,
320+
dataset
321+
)
322+
)
323+
324+
cy.findByLabelText('Terms of Access for Restricted Files').clear().type('Updated terms')
325+
326+
cy.findByRole('tab', { name: 'Dataset Terms' }).click()
327+
328+
cy.findByText('Unsaved Changes').should('exist')
329+
})
330+
331+
it('switches tabs without unsaved modal when active tab is guest book', () => {
332+
const dataset = DatasetMother.create({
333+
license: mockLicenses[0],
334+
termsOfUse: TermsOfUseMother.withoutCustomTerms()
335+
})
336+
337+
cy.customMount(
338+
withProviders(
339+
<EditDatasetTerms
340+
defaultActiveTabKey={EditDatasetTermsHelper.EDIT_DATASET_TERMS_TABS_KEYS.guestBook}
341+
licenseRepository={licenseRepository}
342+
datasetRepository={datasetRepository}
343+
/>,
344+
dataset
345+
)
346+
)
347+
348+
cy.findByRole('tab', { name: 'Dataset Terms' }).click()
349+
cy.findByText('Unsaved Changes').should('not.exist')
350+
cy.findByRole('tab', { name: 'Dataset Terms' }).should('have.attr', 'aria-selected', 'true')
351+
})
352+
353+
it('switches tabs without unsaved modal when active tab key is unknown', () => {
354+
const dataset = DatasetMother.create({
355+
license: mockLicenses[0],
356+
termsOfUse: TermsOfUseMother.withoutCustomTerms()
357+
})
358+
359+
cy.customMount(
360+
withProviders(
361+
<EditDatasetTerms
362+
// Force an invalid key to hit the default branch in getCurrentFormDirtyState
363+
defaultActiveTabKey={'unknown-tab' as unknown as EditDatasetTermsTabKey}
364+
licenseRepository={licenseRepository}
365+
datasetRepository={datasetRepository}
366+
/>,
367+
dataset
368+
)
369+
)
370+
371+
cy.findByRole('tab', { name: 'Dataset Terms' }).click()
372+
cy.findByText('Unsaved Changes').should('not.exist')
373+
cy.findByRole('tab', { name: 'Dataset Terms' }).should('have.attr', 'aria-selected', 'true')
374+
})
375+
376+
it('does nothing when selecting the currently active tab', () => {
377+
const dataset = DatasetMother.create({
378+
license: mockLicenses[0],
379+
termsOfUse: TermsOfUseMother.withoutCustomTerms()
380+
})
381+
382+
cy.customMount(
383+
withProviders(
384+
<EditDatasetTerms
385+
defaultActiveTabKey={EditDatasetTermsHelper.EDIT_DATASET_TERMS_TABS_KEYS.datasetTerms}
386+
licenseRepository={licenseRepository}
387+
datasetRepository={datasetRepository}
388+
/>,
389+
dataset
390+
)
391+
)
392+
393+
cy.get('select').select('CC BY 4.0')
394+
cy.findByRole('tab', { name: 'Dataset Terms' }).click()
395+
cy.findByText('Unsaved Changes').should('not.exist')
396+
cy.findByRole('tab', { name: 'Dataset Terms' }).should('have.attr', 'aria-selected', 'true')
397+
})
239398
})
240399

241400
describe('Dataset Terms Tab Integration', () => {

tests/component/sections/edit-dataset-terms/EditTermsOfAccess.spec.tsx

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,12 +144,16 @@ describe('EditTermsOfAccess', () => {
144144
})
145145

146146
it('submits form data when save is clicked', () => {
147+
datasetRepository.updateTermsOfAccess = cy.stub().resolves()
148+
147149
cy.customMount(
148150
withProviders(<EditTermsOfAccess datasetRepository={datasetRepository} />, mockDataset)
149151
)
150152

151153
cy.findByLabelText('Terms of Access for Restricted Files').clear().type('New terms')
152154
cy.findByRole('button', { name: 'Save Changes' }).click()
155+
156+
cy.wrap(datasetRepository.updateTermsOfAccess).should('have.been.calledOnce')
153157
})
154158
})
155159

@@ -211,6 +215,46 @@ describe('EditTermsOfAccess', () => {
211215
})
212216
})
213217

218+
it('reports dirty state changes via onFormStateChange', () => {
219+
const onFormStateChange = cy.stub().as('onFormStateChange')
220+
221+
cy.customMount(
222+
withProviders(
223+
<EditTermsOfAccess
224+
datasetRepository={datasetRepository}
225+
onFormStateChange={onFormStateChange}
226+
/>,
227+
mockDataset
228+
)
229+
)
230+
231+
cy.findByLabelText('Terms of Access for Restricted Files').clear().type('Updated terms')
232+
233+
cy.wrap(onFormStateChange).should('have.been.calledWith', true)
234+
})
235+
236+
it('shows a saving state while update is in progress', () => {
237+
let resolveUpdate: () => void
238+
datasetRepository.updateTermsOfAccess = cy.stub().callsFake(
239+
() =>
240+
new Cypress.Promise<void>((resolve) => {
241+
resolveUpdate = resolve
242+
})
243+
)
244+
245+
cy.customMount(
246+
withProviders(<EditTermsOfAccess datasetRepository={datasetRepository} />, mockDataset)
247+
)
248+
249+
cy.findByRole('button', { name: 'Save Changes' }).click()
250+
251+
cy.findByRole('button', { name: 'Saving' }).should('be.disabled')
252+
253+
cy.wrap(null).then(() => resolveUpdate())
254+
255+
cy.findByText('The terms for this dataset have been updated.').should('exist')
256+
})
257+
214258
describe('Toast Notifications', () => {
215259
it('displays success toast when terms of access are updated successfully', () => {
216260
const termsOfAccess = TermsOfAccessMother.create({
@@ -260,4 +304,20 @@ describe('EditTermsOfAccess', () => {
260304
cy.findByText('The terms for this dataset have been updated.').should('exist')
261305
})
262306
})
307+
308+
describe('Error Handling', () => {
309+
it('displays error when updating terms of access fails', () => {
310+
datasetRepository.updateTermsOfAccess = cy.stub().rejects(new Error('Update failed'))
311+
312+
cy.customMount(
313+
withProviders(<EditTermsOfAccess datasetRepository={datasetRepository} />, mockDataset)
314+
)
315+
316+
cy.findByRole('button', { name: 'Save Changes' }).click()
317+
318+
cy.findByText(
319+
/An error occurred while updating the dataset terms of access. Please try again./i
320+
).should('exist')
321+
})
322+
})
263323
})

tests/component/sections/edit-dataset-terms/useUpdateDatasetLicense.spec.tsx

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,7 @@ describe('useUpdateDatasetLicense', () => {
8989
})
9090

9191
it('should handle WriteError and prefer the reason without status code when available', async () => {
92-
const mockWriteError = new WriteError(
93-
'Error [500] Reason was: [500] An error occurred while updating the dataset license. Please try again.'
94-
)
92+
const mockWriteError = new WriteError('Custom error message')
9593
datasetRepository.updateDatasetLicense = cy.stub().rejects(mockWriteError)
9694

9795
const { result } = renderHook(() =>
@@ -108,14 +106,11 @@ describe('useUpdateDatasetLicense', () => {
108106
expect(datasetRepository.updateDatasetLicense).to.have.been.calledWith(123, request)
109107
expect(onSuccessfulUpdateLicense).to.not.have.been.called
110108
expect(result.current.isLoading).to.deep.equal(false)
111-
expect(result.current.error).to.deep.equal(
112-
'An error occurred while updating the dataset license. Please try again.'
113-
)
109+
expect(result.current.error).to.deep.equal('Custom error message')
114110
})
115111

116112
it('should handle WriteError and fall back to the error message when no reason is present', async () => {
117-
const message = 'An error occurred while updating the dataset license. Please try again.'
118-
const mockWriteError = new WriteError(message)
113+
const mockWriteError = new WriteError('')
119114
datasetRepository.updateDatasetLicense = cy.stub().rejects(mockWriteError)
120115

121116
const { result } = renderHook(() =>
@@ -132,9 +127,7 @@ describe('useUpdateDatasetLicense', () => {
132127
expect(datasetRepository.updateDatasetLicense).to.have.been.calledWith(123, request)
133128
expect(onSuccessfulUpdateLicense).to.not.have.been.called
134129
expect(result.current.isLoading).to.deep.equal(false)
135-
expect(result.current.error).to.deep.equal(
136-
'An error occurred while updating the dataset license. Please try again.'
137-
)
130+
expect(result.current.error).to.deep.equal('There was an error when writing the resource.')
138131
})
139132

140133
it('should handle unknown errors and set default error message', async () => {

0 commit comments

Comments
 (0)