Skip to content

Commit 91162fb

Browse files
committed
move update notifications store to after publish is complete, update component test
1 parent 291fa41 commit 91162fb

3 files changed

Lines changed: 72 additions & 29 deletions

File tree

src/sections/collection/publish-collection/usePublishCollection.tsx

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { CollectionRepository } from '../../../collection/domain/repositories/Co
33
import { publishCollection } from '../../../collection/domain/useCases/publishCollection'
44

55
import { SubmissionStatus } from '../../shared/form/DatasetMetadataForm/useSubmitDataset'
6-
import { needsUpdateStore } from '@/notifications/domain/hooks/needsUpdateStore'
76

87
type UsePublishCollectionReturnType =
98
| {
@@ -37,7 +36,6 @@ export function usePublishCollection(
3736
.then(() => {
3837
setPublishError(null)
3938
setSubmissionStatus(SubmissionStatus.SubmitComplete)
40-
needsUpdateStore.setNeedsUpdate(true)
4139
onPublishSucceed()
4240
return
4341
})

src/sections/dataset/useCheckPublishCompleted.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { getDatasetLocks } from '../../dataset/domain/useCases/getDatasetLocks'
33
import { Dataset } from '../../dataset/domain/models/Dataset'
44
import { DatasetRepository } from '../../dataset/domain/repositories/DatasetRepository'
55
import { PUBLISH_DATASET_POLL_INTERVAL } from './config'
6+
import { needsUpdateStore } from '@/notifications/domain/hooks/needsUpdateStore'
67

78
const useCheckPublishCompleted = (
89
publishInProgress: boolean | undefined,
@@ -11,22 +12,27 @@ const useCheckPublishCompleted = (
1112
): boolean => {
1213
const [publishCompleted, setPublishCompleted] = useState(false)
1314

15+
const handlePublishCompleted = () => {
16+
setPublishCompleted(true)
17+
needsUpdateStore.setNeedsUpdate(true)
18+
}
19+
1420
useEffect(() => {
1521
let intervalId: NodeJS.Timeout | null = null
1622

1723
if (publishInProgress && dataset) {
1824
const waitForDatasetLocksReleased = async () => {
1925
const initialLocks = await getDatasetLocks(datasetRepository, dataset.persistentId)
2026
if (initialLocks.length === 0) {
21-
setPublishCompleted(true)
27+
handlePublishCompleted()
2228
} else {
2329
intervalId = setInterval(() => {
2430
const pollLocks = async () => {
2531
try {
2632
const locks = await getDatasetLocks(datasetRepository, dataset.persistentId)
2733
if (locks.length === 0) {
2834
if (intervalId) clearInterval(intervalId)
29-
setPublishCompleted(true)
35+
handlePublishCompleted()
3036
}
3137
} catch (error) {
3238
if (intervalId) clearInterval(intervalId)
Lines changed: 64 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
/// <reference types="cypress" />
22

3+
import { needsUpdateStore } from '@/notifications/domain/hooks/needsUpdateStore'
4+
import { Dataset } from '../../../../src/dataset/domain/models/Dataset'
35
import { DatasetRepository } from '../../../../src/dataset/domain/repositories/DatasetRepository'
4-
import { renderHook } from '@testing-library/react'
56
import useCheckPublishCompleted from '../../../../src/sections/dataset/useCheckPublishCompleted'
6-
import { DatasetMother } from '../../dataset/domain/models/DatasetMother'
77
import { DatasetMockRepository } from '../../../../src/stories/dataset/DatasetMockRepository'
8-
import { Dataset } from '../../../../src/dataset/domain/models/Dataset'
8+
import { DatasetMother } from '../../dataset/domain/models/DatasetMother'
99

1010
interface TestComponentProps {
1111
publishInProgress: boolean | undefined
@@ -19,46 +19,75 @@ function TestComponent({ publishInProgress, dataset, datasetRepository }: TestCo
1919
}
2020

2121
describe('useCheckPublishCompleted Hook', () => {
22+
beforeEach(() => {
23+
cy.stub(needsUpdateStore, 'setNeedsUpdate').as('setNeedsUpdate')
24+
})
25+
2226
it('should not set publishCompleted if publishInProgress is false', () => {
2327
const datasetRepository: DatasetRepository = {} as DatasetRepository
24-
const { result } = renderHook(() =>
25-
useCheckPublishCompleted(false, DatasetMother.create(), datasetRepository)
28+
29+
cy.clock()
30+
cy.customMount(
31+
<TestComponent
32+
publishInProgress={false}
33+
dataset={DatasetMother.create()}
34+
datasetRepository={datasetRepository}
35+
/>
2636
)
27-
cy.wait(3000).then(() => {
28-
cy.wrap(result.current).should('equal', false)
29-
})
37+
38+
cy.get('[data-testid="publish-completed"]').should('have.text', 'false')
39+
cy.tick(10_000)
40+
cy.get('[data-testid="publish-completed"]').should('have.text', 'false')
41+
cy.get('@setNeedsUpdate').should('not.have.been.called')
3042
})
43+
3144
it('should not set publishCompleted to true when locks are found initially', () => {
3245
const datasetRepository: DatasetMockRepository = new DatasetMockRepository()
3346
cy.stub(datasetRepository, 'getLocks').resolves([{ lockId: 'test-lock' }])
3447

35-
const { result } = renderHook(() =>
36-
useCheckPublishCompleted(true, DatasetMother.create(), datasetRepository)
48+
cy.clock()
49+
cy.customMount(
50+
<TestComponent
51+
publishInProgress={true}
52+
dataset={DatasetMother.create()}
53+
datasetRepository={datasetRepository}
54+
/>
3755
)
3856

39-
cy.wait(3000).then(() => {
40-
cy.wrap(result.current).should('equal', false)
41-
})
57+
cy.get('[data-testid="publish-completed"]').should('have.text', 'false')
58+
cy.tick(10_000)
59+
cy.get('[data-testid="publish-completed"]').should('have.text', 'false')
60+
cy.get('@setNeedsUpdate').should('not.have.been.called')
4261
})
43-
it('should set publishCompleted to true when no locks are found initially', () => {
62+
63+
it('should set publishCompleted to true (and mark needsUpdate) when no locks are found initially', () => {
4464
const datasetRepository: DatasetRepository = {} as DatasetRepository
4565
datasetRepository.getLocks = cy.stub().resolves([])
4666

47-
const { result } = renderHook(() =>
48-
useCheckPublishCompleted(true, DatasetMother.create(), datasetRepository)
67+
cy.clock()
68+
cy.customMount(
69+
<TestComponent
70+
publishInProgress={true}
71+
dataset={DatasetMother.create()}
72+
datasetRepository={datasetRepository}
73+
/>
4974
)
50-
cy.wait(3000).then(() => {
51-
cy.wrap(result.current).should('equal', true)
52-
})
75+
76+
cy.get('[data-testid="publish-completed"]').should('have.text', 'false')
77+
cy.tick(2_000)
78+
cy.get('[data-testid="publish-completed"]').should('have.text', 'true')
79+
cy.get('@setNeedsUpdate').should('have.been.calledOnceWith', true)
5380
})
5481

55-
it('should set publishCompleted to true after polling finds no locks', () => {
82+
it('should set publishCompleted to true (and mark needsUpdate) after polling finds no locks', () => {
5683
const datasetRepository: DatasetMockRepository = new DatasetMockRepository()
5784
const getLocksStub = cy.stub(datasetRepository, 'getLocks')
5885

59-
// First call finds locks, subsequent calls find no locks
86+
// First lock check still sees the publish lock; the next one sees it cleared.
6087
getLocksStub.onFirstCall().resolves([{ lockId: 'test-lock' }])
61-
getLocksStub.callsFake(() => Promise.resolve([]))
88+
getLocksStub.onSecondCall().resolves([])
89+
90+
cy.clock()
6291

6392
cy.customMount(
6493
<TestComponent
@@ -67,9 +96,19 @@ describe('useCheckPublishCompleted Hook', () => {
6796
datasetRepository={datasetRepository}
6897
/>
6998
)
99+
70100
cy.get('[data-testid="publish-completed"]').should('have.text', 'false')
71-
cy.wait(3000).then(() => {
72-
cy.get('[data-testid="publish-completed"]').should('have.text', 'true')
73-
})
101+
102+
// Initial lock check waits 2s before calling getLocks.
103+
cy.tick(2_000)
104+
cy.wrap(getLocksStub).should('have.been.calledOnce')
105+
cy.get('[data-testid="publish-completed"]').should('have.text', 'false')
106+
107+
// Polling waits 2s to fire, then the follow-up lock check waits another 2s.
108+
cy.tick(4_000)
109+
110+
cy.get('[data-testid="publish-completed"]').should('have.text', 'true')
111+
cy.wrap(getLocksStub).should('have.been.calledTwice')
112+
cy.get('@setNeedsUpdate').should('have.been.calledOnceWith', true)
74113
})
75114
})

0 commit comments

Comments
 (0)