test-user-admin.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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. try {
  14. const [viewerRole] = await db.select().from(roles).where(eq(roles.name, 'viewer')).limit(1);
  15. const [engGroup] = await db.select().from(groups).where(eq(groups.name, 'Engineering Department')).limit(1);
  16. if (!viewerRole || !engGroup) {
  17. throw new Error('Required seed role/group missing. Run npx tsx src/db/seed.ts first.');
  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. throw new Error('User admin write flow did not persist expected rows.');
  36. }
  37. const resetPasswordWorks = await verifyPassword('reset-password', updatedUser.passwordHash);
  38. const oldPasswordWorks = await verifyPassword('initial-password', updatedUser.passwordHash);
  39. if (!resetPasswordWorks || oldPasswordWorks) {
  40. throw new Error('Password reset verification failed.');
  41. }
  42. } finally {
  43. await db.delete(users).where(eq(users.id, createdUser.id));
  44. }
  45. console.log('✅ User administration data flow passed.');
  46. process.exit(0);
  47. }
  48. runTest().catch((error) => {
  49. console.error('❌ Test failed with error:', error);
  50. process.exit(1);
  51. });