40 行
1.6 KiB
TypeScript
40 行
1.6 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
|
|
import { menuOutline } from '@/components/TopNav'
|
|
import { buildUser } from '@/test/factories'
|
|
|
|
const submenuItem = (role: 'guest' | 'member' | 'admin', section: string, item: string) => {
|
|
const menu = menuOutline ({
|
|
user: buildUser ({ role }),
|
|
wikiId: section === 'Wiki' ? 10 : null,
|
|
pathName: section === 'Wiki' ? '/wiki/page' : '/posts' })
|
|
return menu.find (entry => entry.name === section)?.subMenu.find (
|
|
subMenuItem => subMenuItem.name === item)
|
|
}
|
|
|
|
describe ('menuOutline', () => {
|
|
it ('uses content-edit permission for post, material, and Wiki actions', () => {
|
|
for (const role of ['member', 'admin'] as const)
|
|
{
|
|
expect (submenuItem (role, '広場', '追加')?.visible).toBe (true)
|
|
expect (submenuItem (role, '素材', '追加')?.visible).toBe (true)
|
|
expect (submenuItem (role, 'Wiki', '新規')?.visible).toBe (true)
|
|
expect (submenuItem (role, 'Wiki', '編輯')?.visible).toBe (true)
|
|
}
|
|
|
|
expect (submenuItem ('guest', '広場', '追加')?.visible).toBe (false)
|
|
expect (submenuItem ('guest', '素材', '追加')?.visible).toBe (false)
|
|
expect (submenuItem ('guest', 'Wiki', '新規')?.visible).toBe (false)
|
|
expect (submenuItem ('guest', 'Wiki', '編輯')?.visible).toBe (false)
|
|
})
|
|
|
|
it ('uses /posts/new as the post creation entrypoint', () => {
|
|
expect (submenuItem ('member', '広場', '追加')?.to).toBe ('/posts/new')
|
|
})
|
|
|
|
it ('keeps material suppression admin-only', () => {
|
|
expect (submenuItem ('member', '素材', '抑止')?.visible).toBe (false)
|
|
expect (submenuItem ('admin', '素材', '抑止')?.visible).toBe (true)
|
|
})
|
|
})
|