From 21a61068fb5b336408808f94b63edc56b30728c4 Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Sun, 12 Jul 2026 20:01:25 +0200 Subject: [PATCH] test: define admin operations contracts --- src/lib/admin-operations-contract.test.ts | 43 +++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/lib/admin-operations-contract.test.ts diff --git a/src/lib/admin-operations-contract.test.ts b/src/lib/admin-operations-contract.test.ts new file mode 100644 index 00000000..752c629a --- /dev/null +++ b/src/lib/admin-operations-contract.test.ts @@ -0,0 +1,43 @@ +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') + }) +})