test-media-delete.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { eq } from 'drizzle-orm';
  2. import { deleteMedia } 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 minioClient from '../src/lib/minio';
  8. import { mediaBucketName } from '../src/lib/config';
  9. async function upsertUser(email: string, name: string) {
  10. const [existing] = await db.select().from(users).where(eq(users.email, email)).limit(1);
  11. if (existing) return existing;
  12. const [created] = await db.insert(users).values({ email, name, passwordHash: 'test_password_hash' }).returning();
  13. return created;
  14. }
  15. async function runTest() {
  16. console.log('🧹 Testing media delete...');
  17. const owner = await upsertUser('media-delete-owner@ekb.com', 'Media Delete Owner');
  18. const outsider = await upsertUser('media-delete-outsider@ekb.com', 'Media Delete Outsider');
  19. const suffix = Date.now();
  20. const storageKey = `uploads/delete-test-${suffix}.txt`;
  21. const exists = await minioClient.bucketExists(mediaBucketName);
  22. if (!exists) await minioClient.makeBucket(mediaBucketName);
  23. await minioClient.putObject(mediaBucketName, storageKey, Buffer.from('delete test'));
  24. const [resource] = await db.insert(resources).values({
  25. name: `delete-test-${suffix}.txt`,
  26. path: `/delete-test/${suffix}.txt`,
  27. type: 'file',
  28. ownerId: owner.id,
  29. }).returning();
  30. const [mediaRecord] = await db.insert(media).values({
  31. resourceId: resource.id,
  32. filename: `delete-test-${suffix}.txt`,
  33. storageKey,
  34. mimeType: 'text/plain',
  35. size: BigInt(11),
  36. status: 'completed',
  37. }).returning();
  38. try {
  39. await deleteMedia(mediaRecord.id, { auth: { userId: outsider.id, groupIds: [] } });
  40. console.error('❌ Outsider unexpectedly deleted media.');
  41. process.exit(1);
  42. } catch {
  43. // Expected.
  44. }
  45. const result = await deleteMedia(mediaRecord.id, { auth: { userId: owner.id, groupIds: [] } });
  46. const [deletedMedia] = await db.select().from(media).where(eq(media.id, mediaRecord.id)).limit(1);
  47. const [deletedResource] = await db.select().from(resources).where(eq(resources.id, resource.id)).limit(1);
  48. if (!result.deleted || deletedMedia || deletedResource) {
  49. console.error('❌ Media delete did not remove expected database rows.');
  50. process.exit(1);
  51. }
  52. console.log('✅ Media delete passed.');
  53. process.exit(0);
  54. }
  55. runTest().catch((error) => {
  56. console.error('❌ Test failed with error:', error);
  57. process.exit(1);
  58. });