1
1
import { act , fireEvent , render , screen , waitFor , within } from '@testing-library/react'
2
+ import { format , set } from 'date-fns'
2
3
import { useRouter } from 'sanity/router'
3
4
import { beforeEach , describe , expect , it , vi } from 'vitest'
4
5
5
6
import { getByDataUi , queryByDataUi } from '../../../../../../test/setup/customQueries'
6
7
import { createTestProvider } from '../../../../../../test/testUtils/TestProvider'
8
+ import {
9
+ getLocalTimeZoneMockReturn ,
10
+ mockGetLocaleTimeZone ,
11
+ mockUseTimeZone ,
12
+ useTimeZoneMockReturn ,
13
+ } from '../../../../scheduledPublishing/hooks/__tests__/__mocks__/useTimeZone.mock'
7
14
import {
8
15
activeASAPRelease ,
9
16
activeScheduledRelease ,
@@ -30,7 +37,12 @@ import {type ReleasesMetadata} from '../../../store/useReleasesMetadata'
30
37
import { useBundleDocumentsMockReturnWithResults } from '../../detail/__tests__/__mocks__/useBundleDocuments.mock'
31
38
import { ReleasesOverview } from '../ReleasesOverview'
32
39
33
- const TODAY = new Date ( )
40
+ const TODAY = set ( new Date ( ) , {
41
+ hours : 22 ,
42
+ minutes : 0 ,
43
+ seconds : 0 ,
44
+ milliseconds : 0 ,
45
+ } )
34
46
35
47
vi . mock ( 'sanity' , ( ) => ( {
36
48
SANITY_VERSION : '0.0.0' ,
@@ -59,6 +71,12 @@ vi.mock('../../../hooks/usePerspective', () => ({
59
71
usePerspective : vi . fn ( ( ) => usePerspectiveMockReturn ) ,
60
72
} ) )
61
73
74
+ vi . mock ( '../../../../scheduledPublishing/hooks/useTimeZone' , async ( importOriginal ) => ( {
75
+ ...( await importOriginal ( ) ) ,
76
+ getLocalTimeZone : vi . fn ( ( ) => getLocalTimeZoneMockReturn ) ,
77
+ default : vi . fn ( ( ) => useTimeZoneMockReturn ) ,
78
+ } ) )
79
+
62
80
describe ( 'ReleasesOverview' , ( ) => {
63
81
beforeEach ( ( ) => {
64
82
mockUseReleases . mockRestore ( )
@@ -132,7 +150,10 @@ describe('ReleasesOverview', () => {
132
150
const releases : ReleaseDocument [ ] = [
133
151
{
134
152
...activeScheduledRelease ,
135
- metadata : { ...activeScheduledRelease . metadata , intendedPublishAt : TODAY . toISOString ( ) } ,
153
+ metadata : {
154
+ ...activeScheduledRelease . metadata ,
155
+ intendedPublishAt : TODAY . toISOString ( ) ,
156
+ } ,
136
157
} ,
137
158
activeASAPRelease ,
138
159
activeUndecidedRelease ,
@@ -142,6 +163,7 @@ describe('ReleasesOverview', () => {
142
163
let activeRender : ReturnType < typeof render >
143
164
144
165
beforeEach ( async ( ) => {
166
+ mockUseTimeZone . mockRestore ( )
145
167
mockUseReleases . mockReturnValue ( {
146
168
...useReleasesMockReturn ,
147
169
archivedReleases : [ archivedScheduledRelease , publishedASAPRelease ] ,
@@ -191,6 +213,13 @@ describe('ReleasesOverview', () => {
191
213
within ( asapReleaseRow ) . getByText ( 'Undecided' )
192
214
} )
193
215
216
+ it ( 'shows time for scheduled releases' , ( ) => {
217
+ const scheduledReleaseRow = screen . getAllByTestId ( 'table-row' ) [ 2 ]
218
+
219
+ const date = format ( TODAY , 'MMM d, yyyy' )
220
+ within ( scheduledReleaseRow ) . getByText ( `${ date } , 10:00:00 PM` )
221
+ } )
222
+
194
223
it ( 'has release menu actions for each release' , ( ) => {
195
224
const releaseRows = screen . getAllByTestId ( 'table-row' )
196
225
releaseRows . forEach ( ( row ) => {
@@ -283,6 +312,65 @@ describe('ReleasesOverview', () => {
283
312
} )
284
313
} )
285
314
315
+ describe ( 'timezone selection' , ( ) => {
316
+ it ( 'shows the selected timezone' , ( ) => {
317
+ screen . getByText ( 'SCT (Sanity/Oslo)' )
318
+ } )
319
+
320
+ it ( 'opens the timezone selector' , ( ) => {
321
+ fireEvent . click ( screen . getByText ( 'SCT (Sanity/Oslo)' ) )
322
+
323
+ within ( getByDataUi ( document . body , 'DialogCard' ) ) . getByText ( 'Select time zone' )
324
+ } )
325
+
326
+ it ( 'shows dates with timezone abbreviation when it is not the locale' , ( ) => {
327
+ mockGetLocaleTimeZone . mockReturnValue ( {
328
+ abbreviation : 'NST' , // Not Sanity Time
329
+ namePretty : 'Not Sanity Time' ,
330
+ offset : '+00:00' ,
331
+ name : 'NST' ,
332
+ alternativeName : 'Not Sanity Time' ,
333
+ mainCities : 'Not Sanity City' ,
334
+ value : 'Not Sanity Time' ,
335
+ } )
336
+
337
+ activeRender . rerender ( < ReleasesOverview /> )
338
+
339
+ const scheduledReleaseRow = screen . getAllByTestId ( 'table-row' ) [ 2 ]
340
+
341
+ const date = format ( TODAY , 'MMM d, yyyy' )
342
+ within ( scheduledReleaseRow ) . getByText ( `${ date } , 10:00:00 PM (SCT)` )
343
+ } )
344
+
345
+ describe ( 'when a different timezone is selected' , ( ) => {
346
+ beforeEach ( ( ) => {
347
+ mockUseTimeZone . mockReturnValue ( {
348
+ ...useTimeZoneMockReturn ,
349
+ // spoof a timezone that is 8 hours ahead of UTC
350
+ zoneDateToUtc : vi . fn ( ( date ) => set ( date , { hours : new Date ( date ) . getHours ( ) - 8 } ) ) ,
351
+ } )
352
+
353
+ activeRender . rerender ( < ReleasesOverview /> )
354
+ } )
355
+
356
+ it ( 'shows today as having no releases' , ( ) => {
357
+ const todayTile = within ( getByDataUi ( document . body , 'Calendar' ) ) . getByText (
358
+ TODAY . getDate ( ) ,
359
+ )
360
+ expect ( todayTile . parentNode ) . not . toHaveStyle ( 'font-weight: 700' )
361
+ } )
362
+
363
+ it ( 'shows no releases when filtered by today' , ( ) => {
364
+ const todayTile = within ( getByDataUi ( document . body , 'Calendar' ) ) . getByText (
365
+ TODAY . getDate ( ) ,
366
+ )
367
+ fireEvent . click ( todayTile )
368
+
369
+ expect ( screen . queryAllByTestId ( 'table-row' ) ) . toHaveLength ( 0 )
370
+ } )
371
+ } )
372
+ } )
373
+
286
374
describe ( 'archived releases' , ( ) => {
287
375
beforeEach ( ( ) => {
288
376
fireEvent . click ( screen . getByText ( 'Archived' ) )
0 commit comments