sanity
Version:
Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches
60 lines (48 loc) • 1.65 kB
text/typescript
import {expect, test} from '@jest/globals'
import {type ConditionalPropertyCallbackContext, type CurrentUser} from '@sanity/types'
import {userHasRole} from './userHasRole'
const roleLessUser: CurrentUser = {
id: 'pabc123',
email: 'some@user.com',
name: 'Some User',
role: '',
roles: [],
}
const conditionalContextUser: ConditionalPropertyCallbackContext['currentUser'] = {
id: 'pabc123',
email: 'some@user.com',
name: 'Some User',
roles: [{name: 'administrator', title: 'Administrator'}],
}
const adminUser: CurrentUser = {
...roleLessUser,
role: 'administrator', // Legacy
roles: [{name: 'administrator', title: 'Administrator'}],
}
const multiRoleUser: CurrentUser = {
...adminUser,
role: 'editor', // Legacy
roles: [
{name: 'translator', title: 'Translator'},
{name: 'editor', title: 'Editor'},
],
}
test('userHasRole(): no roles', () => {
expect(userHasRole(roleLessUser, 'administrator')).toBe(false)
})
test('userHasRole(): no match', () => {
expect(userHasRole(adminUser, 'dogwalker')).toBe(false)
})
test('userHasRole(): match (single role)', () => {
expect(userHasRole(adminUser, 'administrator')).toBe(true)
})
test('userHasRole(): match (multiple roles)', () => {
expect(userHasRole(multiRoleUser, 'editor')).toBe(true)
})
test('userHasRole(): no match (multiple roles)', () => {
expect(userHasRole(multiRoleUser, 'administrator')).toBe(false)
})
test('userHasRole(): conditional property callback context (no `role` prop)', () => {
expect(userHasRole(conditionalContextUser, 'administrator')).toBe(true)
expect(userHasRole(conditionalContextUser, 'dogwalker')).toBe(false)
})