test-permission-admin.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import { and, eq } from 'drizzle-orm';
  2. import { db } from '../src/db';
  3. import { permissions, rolePermissions, roles, users } from '../src/db/schema/auth';
  4. import { aclRules, resources } from '../src/db/schema/resource';
  5. async function runTest() {
  6. console.log('🛡️ Testing permission administration data flow...');
  7. const suffix = Date.now();
  8. const [permission] = await db.insert(permissions).values({
  9. action: `read-${suffix}`,
  10. resourceType: 'video',
  11. }).returning();
  12. let resourceId: string | null = null;
  13. try {
  14. const [viewerRole] = await db.select().from(roles).where(eq(roles.name, 'viewer')).limit(1);
  15. const [tester] = await db.select().from(users).where(eq(users.email, 'tester@ekb.com')).limit(1);
  16. if (!viewerRole || !tester) {
  17. throw new Error('Required seed data missing. Run npx tsx src/db/seed.ts first.');
  18. }
  19. await db.insert(rolePermissions).values({
  20. roleId: viewerRole.id,
  21. permissionId: permission.id,
  22. }).onConflictDoNothing();
  23. const [rolePermission] = await db.select().from(rolePermissions).where(and(
  24. eq(rolePermissions.roleId, viewerRole.id),
  25. eq(rolePermissions.permissionId, permission.id),
  26. )).limit(1);
  27. const [resource] = await db.insert(resources).values({
  28. name: `permission-admin-${suffix}.mp4`,
  29. path: `/permission-admin/${suffix}.mp4`,
  30. type: 'file',
  31. }).returning();
  32. resourceId = resource.id;
  33. const [aclRule] = await db.insert(aclRules).values({
  34. resourceId: resource.id,
  35. subjectType: 'user',
  36. subjectId: tester.id,
  37. permissionType: 'deny',
  38. action: 'read',
  39. }).returning();
  40. await db.delete(aclRules).where(eq(aclRules.id, aclRule.id));
  41. const [deletedAcl] = await db.select().from(aclRules).where(eq(aclRules.id, aclRule.id)).limit(1);
  42. if (!rolePermission || deletedAcl) {
  43. throw new Error('Permission admin data flow failed.');
  44. }
  45. } finally {
  46. await db.delete(rolePermissions).where(eq(rolePermissions.permissionId, permission.id));
  47. await db.delete(permissions).where(eq(permissions.id, permission.id));
  48. if (resourceId) {
  49. await db.delete(resources).where(eq(resources.id, resourceId));
  50. }
  51. }
  52. console.log('✅ Permission administration data flow passed.');
  53. process.exit(0);
  54. }
  55. runTest().catch((error) => {
  56. console.error('❌ Test failed with error:', error);
  57. process.exit(1);
  58. });