11/// <reference types="cypress" />
22
3+ import { needsUpdateStore } from '@/notifications/domain/hooks/needsUpdateStore'
4+ import { Dataset } from '../../../../src/dataset/domain/models/Dataset'
35import { DatasetRepository } from '../../../../src/dataset/domain/repositories/DatasetRepository'
4- import { renderHook } from '@testing-library/react'
56import useCheckPublishCompleted from '../../../../src/sections/dataset/useCheckPublishCompleted'
6- import { DatasetMother } from '../../dataset/domain/models/DatasetMother'
77import { DatasetMockRepository } from '../../../../src/stories/dataset/DatasetMockRepository'
8- import { Dataset } from '../../../../src/ dataset/domain/models/Dataset '
8+ import { DatasetMother } from '../../dataset/domain/models/DatasetMother '
99
1010interface TestComponentProps {
1111 publishInProgress : boolean | undefined
@@ -19,46 +19,75 @@ function TestComponent({ publishInProgress, dataset, datasetRepository }: TestCo
1919}
2020
2121describe ( '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