44 lines
1.6 KiB
TypeScript
44 lines
1.6 KiB
TypeScript
import { existsSync, readFileSync } from 'node:fs'
|
|
import { describe, expect, it } from 'vitest'
|
|
|
|
const ROUTES: Array<[string, string]> = [
|
|
['moderation', 'PERMS.MODERATION_VIEW'],
|
|
['moderation/actions', 'PERMS.MODERATION_EDIT'],
|
|
['moderation/cfh', 'PERMS.MODERATION_VIEW'],
|
|
['moderation/cfh/[id]', 'PERMS.MODERATION_VIEW'],
|
|
['moderation/team', 'PERMS.MODERATION_VIEW'],
|
|
['logs/audit', 'PERMS.LOGS_VIEW'],
|
|
['logs/chat', 'PERMS.LOGS_VIEW'],
|
|
['logs/commands', 'PERMS.LOGS_VIEW'],
|
|
['logs/trades', 'PERMS.LOGS_VIEW'],
|
|
['analytics', 'PERMS.ANALYTICS_VIEW'],
|
|
['analytics/activity', 'PERMS.ANALYTICS_VIEW'],
|
|
['analytics/economy', 'PERMS.ANALYTICS_VIEW'],
|
|
['devops', 'PERMS.DEVOPS_VIEW'],
|
|
['devops/errors', 'PERMS.DEVOPS_VIEW'],
|
|
['online', 'PERMS.USERS_VIEW'],
|
|
]
|
|
|
|
describe('admin operations route contract', () => {
|
|
it.each(ROUTES)('provides and guards /admin/%s', (route, permission) => {
|
|
const path = `src/app/admin/${route}/page.tsx`
|
|
expect(existsSync(path), path).toBe(true)
|
|
expect(readFileSync(path, 'utf8'), path).toContain(permission)
|
|
})
|
|
|
|
it.each([
|
|
['analytics/export', 'PERMS.ANALYTICS_EXPORT'],
|
|
['devops/health', 'PERMS.DEVOPS_VIEW'],
|
|
])('provides and guards /api/admin/%s', (route, permission) => {
|
|
const path = `src/app/api/admin/${route}/route.ts`
|
|
expect(existsSync(path), path).toBe(true)
|
|
expect(readFileSync(path, 'utf8'), path).toContain(permission)
|
|
})
|
|
|
|
it('guards moderation mutations separately from page navigation', () => {
|
|
const source = readFileSync('src/actions/moderation.ts', 'utf8')
|
|
expect(source).toContain('PERMS.MODERATION_EDIT')
|
|
expect(source).toContain('adminAction')
|
|
})
|
|
})
|