Skip to content

Commit

Permalink
fix(core): add permission limitation for discarding version in docume…
Browse files Browse the repository at this point in the history
…nt picker
  • Loading branch information
RitaDias committed Feb 14, 2025
1 parent 3524672 commit 2c086d6
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,7 @@ export const VersionChip = memo(function VersionChip(props: {
disabled={contextMenuDisabled}
onCreateVersion={handleAddVersion}
locked={locked}
type={documentType}
/>
}
fallbackPlacements={[]}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ import {styled} from 'styled-components'
import {MenuGroup} from '../../../../../ui-components/menuGroup/MenuGroup'
import {MenuItem} from '../../../../../ui-components/menuItem/MenuItem'
import {useTranslation} from '../../../../i18n/hooks/useTranslation'
import {isPublishedId} from '../../../../util/draftUtils'
import {useDocumentPairPermissions} from '../../../../store/_legacy/grants/documentPairPermissions'
import {getPublishedId, isDraftId, isPublishedId} from '../../../../util/draftUtils'
import {useReleasesUpsell} from '../../../contexts/upsell/useReleasesUpsell'
import {type ReleaseDocument} from '../../../store/types'
import {useReleaseOperations} from '../../../store/useReleaseOperations'
Expand All @@ -33,6 +34,7 @@ export const VersionContextMenu = memo(function VersionContextMenu(props: {
onCreateVersion: (targetId: string) => void
disabled?: boolean
locked?: boolean
type: string
}) {
const {
documentId,
Expand All @@ -45,6 +47,7 @@ export const VersionContextMenu = memo(function VersionContextMenu(props: {
onCreateVersion,
disabled,
locked,
type,
} = props
const {t} = useTranslation()
const {mode} = useReleasesUpsell()
Expand All @@ -58,6 +61,13 @@ export const VersionContextMenu = memo(function VersionContextMenu(props: {
const [hasCreatePermission, setHasCreatePermission] = useState<boolean | null>(null)

const releaseId = isVersion ? fromRelease : documentId
const [permissions, isPermissionsLoading] = useDocumentPairPermissions({
id: getPublishedId(documentId),
type,
version: releaseId,
permission: isDraftId(documentId) ? 'discardDraft' : 'discardVersion',
})
const hasDiscardPermission = !isPermissionsLoading && permissions?.granted

useEffect(() => {
checkWithPermissionGuard(createRelease, DEFAULT_RELEASE).then(setHasCreatePermission)
Expand Down Expand Up @@ -115,7 +125,10 @@ export const VersionContextMenu = memo(function VersionContextMenu(props: {
icon={TrashIcon}
onClick={onDiscard}
text={t('release.action.discard-version')}
disabled={disabled || locked}
disabled={disabled || locked || !hasDiscardPermission}
tooltipProps={{
content: !hasDiscardPermission && t('release.action.permission.error'),
}}
/>
</>
)}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {act, fireEvent, render, screen, waitFor} from '@testing-library/react'
import {describe, expect, it, vi} from 'vitest'

import {useDocumentPairPermissionsMockReturn} from '../../../../../../../test/mocks/useDocumentPairPermissions.mock'
import {createTestProvider} from '../../../../../../../test/testUtils/TestProvider'
import {
mockUseReleasePermissions,
Expand All @@ -21,6 +22,10 @@ vi.mock('../../../../store/useReleasePermissions', () => ({
useReleasePermissions: vi.fn(() => useReleasePermissionsMockReturn),
}))

vi.mock('../../../../../store/_legacy/grants/documentPairPermissions', () => ({
useDocumentPairPermissions: vi.fn(() => useDocumentPairPermissionsMockReturn),
}))

describe('VersionContextMenu', () => {
const mockReleases: ReleaseDocument[] = [
{
Expand Down Expand Up @@ -63,6 +68,7 @@ describe('VersionContextMenu', () => {
onCreateRelease: vi.fn(),
onCreateVersion: vi.fn(),
disabled: false,
type: 'document',
}

it('renders the menu items correctly', async () => {
Expand Down Expand Up @@ -94,6 +100,7 @@ describe('VersionContextMenu', () => {
mockUseReleasePermissions.mockReturnValue({
checkWithPermissionGuard: async () => true,
})

const wrapper = await createTestProvider()

render(<VersionContextMenu {...defaultProps} />, {wrapper})
Expand All @@ -118,6 +125,7 @@ describe('VersionContextMenu', () => {
mockUseReleasePermissions.mockReturnValue({
checkWithPermissionGuard: async () => true,
})

const wrapper = await createTestProvider()
const publishedProps = {
...defaultProps,
Expand All @@ -134,11 +142,16 @@ describe('VersionContextMenu', () => {
mockUseReleasePermissions.mockReturnValue({
checkWithPermissionGuard: async () => true,
})

const wrapper = await createTestProvider()

render(<VersionContextMenu {...defaultProps} />, {wrapper})

await waitFor(() => {
expect(screen.getByText('Discard version')).not.toBeDisabled()
})

await act(() => {
fireEvent.click(screen.getByText('Discard version'))
})
expect(defaultProps.onDiscard).toHaveBeenCalled()
Expand All @@ -148,6 +161,7 @@ describe('VersionContextMenu', () => {
mockUseReleasePermissions.mockReturnValue({
checkWithPermissionGuard: async () => true,
})

const wrapper = await createTestProvider()

render(<VersionContextMenu {...defaultProps} />, {wrapper})
Expand All @@ -172,6 +186,7 @@ describe('VersionContextMenu', () => {
mockUseReleasePermissions.mockReturnValue({
checkWithPermissionGuard: async () => true,
})

const wrapper = await createTestProvider()

render(<VersionContextMenu {...defaultProps} />, {wrapper})
Expand Down
11 changes: 11 additions & 0 deletions packages/sanity/test/mocks/useDocumentPairPermissions.mock.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import {type Mock, type Mocked} from 'vitest'

import {useDocumentPairPermissions} from '../../src/core/store/_legacy/grants/documentPairPermissions'

export const useDocumentPairPermissionsMockReturn: Mocked<
ReturnType<typeof useDocumentPairPermissions>
> = [{granted: true, reason: ''}, false]

export const mockUseDocumentPairPermissions = useDocumentPairPermissions as Mock<
typeof useDocumentPairPermissions
>

0 comments on commit 2c086d6

Please sign in to comment.