test-media-permission.ts 2.4 KB

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