test-media-permission.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { eq } from 'drizzle-orm';
  2. import { getMediaStatus } from '../src/actions/media';
  3. import { db } from '../src/db';
  4. import { users } from '../src/db/schema/auth';
  5. import { media } from '../src/db/schema/media';
  6. import { resources } from '../src/db/schema/resource';
  7. async function upsertUser(email: string, name: string) {
  8. const [existing] = await db.select().from(users).where(eq(users.email, email)).limit(1);
  9. if (existing) {
  10. return existing;
  11. }
  12. const [created] = await db.insert(users).values({
  13. email,
  14. name,
  15. passwordHash: 'test_password_hash',
  16. }).returning();
  17. return created;
  18. }
  19. async function runTest() {
  20. console.log('🔐 Testing media permission checks...');
  21. const owner = await upsertUser('media-owner@ekb.com', 'Media Owner');
  22. const outsider = await upsertUser('media-outsider@ekb.com', 'Media Outsider');
  23. const [latestCompletedMedia] = await db
  24. .select()
  25. .from(media)
  26. .where(eq(media.status, 'completed'))
  27. .limit(1);
  28. if (!latestCompletedMedia?.metadata) {
  29. console.error('❌ No completed media found. Run npm run test:media-pipeline first.');
  30. process.exit(1);
  31. }
  32. const pathSuffix = `${Date.now()}-permission-test.mp4`;
  33. const [resource] = await db.insert(resources).values({
  34. name: 'permission-test.mp4',
  35. path: `/media/${pathSuffix}`,
  36. type: 'file',
  37. ownerId: owner.id,
  38. }).returning();
  39. const [ownedMedia] = await db.insert(media).values({
  40. resourceId: resource.id,
  41. filename: 'permission-test.mp4',
  42. storageKey: `uploads/${pathSuffix}`,
  43. mimeType: 'video/mp4',
  44. size: BigInt(1),
  45. status: 'completed',
  46. metadata: latestCompletedMedia.metadata,
  47. }).returning();
  48. const ownerStatus = await getMediaStatus(ownedMedia.id, {
  49. auth: { userId: owner.id, groupIds: [] },
  50. });
  51. if (!ownerStatus?.hlsUrl) {
  52. console.error('❌ Owner did not receive playback URL.');
  53. process.exit(1);
  54. }
  55. try {
  56. await getMediaStatus(ownedMedia.id, {
  57. auth: { userId: outsider.id, groupIds: [] },
  58. });
  59. console.error('❌ Outsider unexpectedly received media access.');
  60. process.exit(1);
  61. } catch (error) {
  62. const message = error instanceof Error ? error.message : String(error);
  63. if (!message.includes('No matching permission')) {
  64. throw error;
  65. }
  66. }
  67. console.log('✅ Media permission checks passed.');
  68. process.exit(0);
  69. }
  70. runTest().catch((error) => {
  71. console.error('❌ Test failed with error:', error);
  72. process.exit(1);
  73. });