test-user-admin.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import { eq } from 'drizzle-orm';
  2. import { db } from '../src/db';
  3. import { groups, roles, userGroups, userRoles, users } from '../src/db/schema/auth';
  4. import { hashPassword, verifyPassword } from '../src/lib/auth/password';
  5. async function runTest() {
  6. console.log('👤 Testing user administration data flow...');
  7. const email = `admin-flow-${Date.now()}@ekb.com`;
  8. const [createdUser] = await db.insert(users).values({
  9. email,
  10. name: 'Admin Flow User',
  11. passwordHash: await hashPassword('initial-password'),
  12. }).returning();
  13. const [viewerRole] = await db.select().from(roles).where(eq(roles.name, 'viewer')).limit(1);
  14. const [engGroup] = await db.select().from(groups).where(eq(groups.name, 'Engineering Department')).limit(1);
  15. if (!viewerRole || !engGroup) {
  16. console.error('❌ Required seed role/group missing. Run npx tsx src/db/seed.ts first.');
  17. process.exit(1);
  18. }
  19. await db.insert(userRoles).values({
  20. userId: createdUser.id,
  21. roleId: viewerRole.id,
  22. }).onConflictDoNothing();
  23. await db.insert(userGroups).values({
  24. userId: createdUser.id,
  25. groupId: engGroup.id,
  26. }).onConflictDoNothing();
  27. const newPasswordHash = await hashPassword('reset-password');
  28. await db.update(users)
  29. .set({ passwordHash: newPasswordHash, updatedAt: new Date() })
  30. .where(eq(users.id, createdUser.id));
  31. const [updatedUser] = await db.select().from(users).where(eq(users.id, createdUser.id)).limit(1);
  32. const [assignedRole] = await db.select().from(userRoles).where(eq(userRoles.userId, createdUser.id)).limit(1);
  33. const [assignedGroup] = await db.select().from(userGroups).where(eq(userGroups.userId, createdUser.id)).limit(1);
  34. if (!updatedUser || !assignedRole || !assignedGroup) {
  35. console.error('❌ User admin write flow did not persist expected rows.');
  36. process.exit(1);
  37. }
  38. const resetPasswordWorks = await verifyPassword('reset-password', updatedUser.passwordHash);
  39. const oldPasswordWorks = await verifyPassword('initial-password', updatedUser.passwordHash);
  40. if (!resetPasswordWorks || oldPasswordWorks) {
  41. console.error('❌ Password reset verification failed.');
  42. process.exit(1);
  43. }
  44. console.log('✅ User administration data flow passed.');
  45. process.exit(0);
  46. }
  47. runTest().catch((error) => {
  48. console.error('❌ Test failed with error:', error);
  49. process.exit(1);
  50. });