test-media-list.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import { eq } from 'drizzle-orm';
  2. import { listMedia } 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 list visibility and filters...');
  21. const owner = await upsertUser('media-list-owner@ekb.com', 'Media List Owner');
  22. const outsider = await upsertUser('media-list-outsider@ekb.com', 'Media List Outsider');
  23. const suffix = Date.now();
  24. const [resource] = await db.insert(resources).values({
  25. name: `media-list-${suffix}.mp4`,
  26. path: `/media-list/${suffix}.mp4`,
  27. type: 'file',
  28. ownerId: owner.id,
  29. }).returning();
  30. const [createdMedia] = await db.insert(media).values({
  31. resourceId: resource.id,
  32. filename: `media-list-${suffix}.mp4`,
  33. storageKey: `uploads/media-list-${suffix}.mp4`,
  34. mimeType: 'video/mp4',
  35. size: BigInt(1),
  36. status: 'pending',
  37. }).returning();
  38. const [completedResource] = await db.insert(resources).values({
  39. name: `media-list-filter-${suffix}.mp4`,
  40. path: `/media-list/filter-${suffix}.mp4`,
  41. type: 'file',
  42. ownerId: owner.id,
  43. }).returning();
  44. const [completedMedia] = await db.insert(media).values({
  45. resourceId: completedResource.id,
  46. filename: `media-list-filter-${suffix}.mp4`,
  47. storageKey: `uploads/media-list-filter-${suffix}.mp4`,
  48. mimeType: 'video/mp4',
  49. size: BigInt(1),
  50. status: 'completed',
  51. }).returning();
  52. const ownerList = await listMedia({ auth: { userId: owner.id, groupIds: [] } });
  53. const outsiderList = await listMedia({ auth: { userId: outsider.id, groupIds: [] } });
  54. const ownerCanSee = ownerList.some((item) => item.id === createdMedia.id);
  55. const outsiderCanSee = outsiderList.some((item) => item.id === createdMedia.id);
  56. if (!ownerCanSee || outsiderCanSee) {
  57. console.error('Media list visibility did not respect ownership permissions.');
  58. process.exit(1);
  59. }
  60. const queryList = await listMedia({
  61. auth: { userId: owner.id, groupIds: [] },
  62. query: `filter-${suffix}`,
  63. });
  64. const completedList = await listMedia({
  65. auth: { userId: owner.id, groupIds: [] },
  66. status: 'completed',
  67. });
  68. const queryMatched = queryList.some((item) => item.id === completedMedia.id)
  69. && !queryList.some((item) => item.id === createdMedia.id);
  70. const statusMatched = completedList.some((item) => item.id === completedMedia.id)
  71. && !completedList.some((item) => item.id === createdMedia.id);
  72. if (!queryMatched || !statusMatched) {
  73. console.error('Media list filters did not match expected results.');
  74. process.exit(1);
  75. }
  76. console.log('Media list visibility and filters passed.');
  77. process.exit(0);
  78. }
  79. runTest().catch((error) => {
  80. console.error('Test failed with error:', error);
  81. process.exit(1);
  82. });