Skip to content

Commit dbdee62

Browse files
authored
test(sanity): update and re-write unit tests (CreateReleaseDialog/useVersionOperations) (#7853)
1 parent 0c715af commit dbdee62

File tree

7 files changed

+104
-75
lines changed

7 files changed

+104
-75
lines changed

packages/sanity/src/core/releases/components/dialog/CreateReleaseDialog.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ export function CreateReleaseDialog(props: CreateReleaseDialogProps): JSX.Elemen
3030
return {
3131
_id: createReleaseId(),
3232
metadata: {
33+
title: '',
34+
description: '',
3335
releaseType: DEFAULT_RELEASE_TYPE,
3436
},
3537
} as const
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,17 @@
1-
import {fireEvent, render, screen} from '@testing-library/react'
2-
import {afterEach, beforeEach, describe, expect, it, type Mock, vi, vitest} from 'vitest'
1+
import {act, fireEvent, render, screen, waitFor} from '@testing-library/react'
2+
import {beforeEach, describe, expect, it, vi} from 'vitest'
33

44
import {createTestProvider} from '../../../../../../test/testUtils/TestProvider'
5+
import {activeASAPRelease} from '../../../__fixtures__/release.fixture'
56
import {type ReleaseDocument} from '../../../index'
6-
import {useReleaseOperations} from '../../../store/useReleaseOperations'
7-
import {useReleases} from '../../../store/useReleases'
7+
import {useReleaseOperationsMockReturn} from '../../../store/__tests__/__mocks/useReleaseOperations.mock'
88
import {CreateReleaseDialog} from '../CreateReleaseDialog'
99

10-
vi.mock('../../../store/useReleases', () => ({
11-
useReleases: vi.fn(),
10+
vi.mock('../../../store/useReleaseOperations', () => ({
11+
useReleaseOperations: vi.fn(() => useReleaseOperationsMockReturn),
1212
}))
1313

14-
vi.mock('../../../../store/release/useReleaseOperations', () => ({
15-
useReleaseOperations: vi.fn().mockReturnValue({
16-
createRelease: vi.fn(),
17-
updateRelease: vi.fn(),
18-
}),
19-
}))
20-
21-
vi.mock('../../../i18n/hooks/useTranslation', () => ({
22-
useTranslate: vi.fn().mockReturnValue({
23-
t: vi.fn(),
24-
}),
25-
}))
26-
27-
const mockUseBundleStore = useReleases as Mock<typeof useReleases>
28-
//const mockUseDateTimeFormat = useDateTimeFormat as Mock
29-
3014
describe('CreateReleaseDialog', () => {
31-
beforeEach(() => {
32-
vi.clearAllMocks()
33-
})
34-
afterEach(() => {
35-
vi.clearAllMocks()
36-
})
37-
3815
describe('when creating a new release', () => {
3916
const onCancelMock = vi.fn()
4017
const onSubmitMock = vi.fn()
@@ -43,23 +20,9 @@ describe('CreateReleaseDialog', () => {
4320
onCancelMock.mockClear()
4421
onSubmitMock.mockClear()
4522

46-
mockUseBundleStore.mockReturnValue({
47-
data: [],
48-
loading: true,
49-
dispatch: vi.fn(),
50-
error: undefined,
51-
releasesIds: [],
52-
archivedReleases: [],
53-
})
54-
55-
//mockUseDateTimeFormat.mockReturnValue({format: vi.fn().mockReturnValue('Mocked date')})
56-
5723
const wrapper = await createTestProvider()
5824
render(<CreateReleaseDialog onCancel={onCancelMock} onSubmit={onSubmitMock} />, {wrapper})
5925
})
60-
afterEach(() => {
61-
vitest.resetAllMocks()
62-
})
6326

6427
it('should render the dialog', () => {
6528
expect(screen.getByRole('dialog')).toBeInTheDocument()
@@ -71,35 +34,27 @@ describe('CreateReleaseDialog', () => {
7134
expect(onCancelMock).toHaveBeenCalled()
7235
})
7336

74-
// TODO: Fix this test
75-
it.skip('should call createRelease and onCreate when form is submitted', async () => {
76-
// const wrapper = await createTestProvider()
77-
// render(<CreateReleaseDialog onCancel={onCancelMock} onSubmit={onSubmitMock} />, {wrapper})
78-
79-
const value: Partial<ReleaseDocument> = {
80-
metadata: {
81-
title: 'Bundle 1',
82-
description: undefined,
83-
intendedPublishAt: undefined,
84-
releaseType: 'asap',
85-
},
86-
}
37+
it('should call createRelease and onCreate when form is submitted', async () => {
38+
const value: Partial<ReleaseDocument> = activeASAPRelease
8739

88-
const titleInput = screen.getByTestId('release-form-title')
89-
fireEvent.change(titleInput, {target: {value: value.metadata?.title}})
40+
act(async () => {
41+
const titleInput = screen.getByTestId('release-form-title')
42+
fireEvent.change(titleInput, {target: {value: value.metadata?.title}})
9043

91-
const submitButton = screen.getByTestId('submit-release-button')
92-
fireEvent.click(submitButton)
44+
const submitButton = screen.getByTestId('submit-release-button')
45+
fireEvent.click(submitButton)
9346

94-
expect(useReleaseOperations().createRelease).toHaveBeenCalledWith(
95-
expect.objectContaining({
96-
_id: expect.stringContaining('releases'),
97-
...value,
98-
}),
99-
)
100-
await Promise.resolve()
47+
waitFor(async () => {
48+
await Promise.resolve()
10149

102-
expect(onSubmitMock).toHaveBeenCalled()
50+
expect(onSubmitMock).toHaveBeenCalledOnce()
51+
expect(useReleaseOperationsMockReturn.createRelease).toHaveBeenCalledWith(
52+
expect.objectContaining({
53+
_id: expect.stringContaining('releases'),
54+
}),
55+
)
56+
})
57+
})
10358
})
10459
})
10560
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import {type Mock, type Mocked, vi} from 'vitest'
2+
3+
import {useVersionOperations, type VersionOperationsValue} from '../../useVersionOperations'
4+
5+
export const useVersionOperationsReturn: Mocked<VersionOperationsValue> = {
6+
createVersion: vi.fn(),
7+
discardVersion: vi.fn(),
8+
}
9+
10+
export const mockUseVersionOperations = useVersionOperations as Mock<typeof useVersionOperations>
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,50 @@
1-
import {beforeEach, describe, it, vi} from 'vitest'
1+
import {act, renderHook} from '@testing-library/react'
2+
import {beforeEach, describe, expect, it, vi} from 'vitest'
3+
4+
import {createTestProvider} from '../../../../../test/testUtils/TestProvider'
5+
import {useReleaseOperationsMockReturn} from '../../store/__tests__/__mocks/useReleaseOperations.mock'
6+
import {useVersionOperations} from '../useVersionOperations'
7+
import {usePerspectiveMockReturn} from './__mocks__/usePerspective.mock'
8+
9+
vi.mock('../../store/useReleaseOperations', () => ({
10+
useReleaseOperations: vi.fn(() => useReleaseOperationsMockReturn),
11+
}))
12+
13+
vi.mock('../usePerspective', () => ({
14+
usePerspective: vi.fn(() => usePerspectiveMockReturn),
15+
}))
216

317
describe('useVersionOperations', () => {
418
beforeEach(() => {
519
vi.clearAllMocks()
620
})
721

8-
it.todo('should create a version successfully', async () => {})
22+
it('should create a version successfully', async () => {
23+
const wrapper = await createTestProvider()
24+
const {result} = renderHook(() => useVersionOperations(), {wrapper})
25+
26+
await act(async () => {
27+
await result.current.createVersion('releaseId', 'documentId')
28+
})
29+
30+
expect(useReleaseOperationsMockReturn.createVersion).toHaveBeenCalledWith(
31+
'releaseId',
32+
'documentId',
33+
)
34+
expect(usePerspectiveMockReturn.setPerspectiveFromReleaseId).toHaveBeenCalledWith('releaseId')
35+
})
36+
37+
it('should discard a version successfully', async () => {
38+
const wrapper = await createTestProvider()
39+
const {result} = renderHook(() => useVersionOperations(), {wrapper})
940

10-
it.todo('should discard a version successfully')
41+
await act(async () => {
42+
await result.current.discardVersion('releaseId', 'documentId')
43+
})
1144

12-
it.todo('should handle discard version failure')
45+
expect(useReleaseOperationsMockReturn.discardVersion).toHaveBeenCalledWith(
46+
'releaseId',
47+
'documentId',
48+
)
49+
})
1350
})

packages/sanity/src/core/releases/hooks/useVersionOperations.tsx

+5-3
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ import {useReleaseOperations} from '../store/useReleaseOperations'
77
import {getCreateVersionOrigin} from '../util/util'
88
import {usePerspective} from './usePerspective'
99

10-
/** @internal */
11-
export function useVersionOperations(): {
10+
export interface VersionOperationsValue {
1211
createVersion: (releaseId: string, documentId: string) => Promise<void>
1312
discardVersion: (releaseId: string, documentId: string) => Promise<void>
14-
} {
13+
}
14+
15+
/** @internal */
16+
export function useVersionOperations(): VersionOperationsValue {
1517
const telemetry = useTelemetry()
1618
const {createVersion, discardVersion} = useReleaseOperations()
1719

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import {type Mock, type Mocked, vi} from 'vitest'
2+
3+
import {
4+
createReleaseOperationsStore,
5+
type ReleaseOperationsStore,
6+
} from '../../createReleaseOperationStore'
7+
8+
export const createReleaseOperationsStoreReturn: Mocked<ReleaseOperationsStore> = {
9+
archive: vi.fn(),
10+
unarchive: vi.fn(),
11+
createRelease: vi.fn(),
12+
createVersion: vi.fn(),
13+
discardVersion: vi.fn(),
14+
publishRelease: vi.fn(),
15+
schedule: vi.fn(),
16+
unschedule: vi.fn(),
17+
updateRelease: vi.fn(),
18+
}
19+
20+
export const mockCreateReleaseOperationsStore = createReleaseOperationsStore as Mock<
21+
typeof createReleaseOperationsStore
22+
>

packages/sanity/src/core/releases/tool/components/ReleaseMenuButton/__tests__/ReleaseMenuButton.test.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ describe('ReleaseMenuButton', () => {
132132
})
133133

134134
test.todo('will unarchive an archived release', async () => {
135+
/** @todo update once unarchive has been implemented */
135136
const archivedRelease: ReleaseDocument = {...activeScheduledRelease, state: 'archived'}
136137

137138
await renderTest({release: archivedRelease})

0 commit comments

Comments
 (0)