role.integration.test.ts 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. import { describe, it, expect, beforeAll, afterAll, beforeEach, afterEach } from 'vitest';
  2. import { DataSource } from 'typeorm';
  3. import { RoleService } from '../../src/services/role.service';
  4. import { Role } from '../../src/entities/role.entity';
  5. import { AppDataSource, initializeDataSource } from '@d8d/shared-utils';
  6. describe('Role Integration Tests', () => {
  7. let dataSource: DataSource;
  8. let roleService: RoleService;
  9. beforeEach(async () => {
  10. initializeDataSource([Role])
  11. dataSource = AppDataSource;
  12. await dataSource.initialize();
  13. roleService = new RoleService(dataSource);
  14. });
  15. afterEach(async () => {
  16. if (dataSource.isInitialized) {
  17. await dataSource.destroy();
  18. }
  19. });
  20. describe('Role CRUD Operations', () => {
  21. it('should create and retrieve a role', async () => {
  22. // Create role
  23. const roleData = {
  24. name: 'admin',
  25. description: 'Administrator role',
  26. permissions: ['user:create', 'user:delete', 'role:manage']
  27. };
  28. const createdRole = await roleService.create(roleData);
  29. expect(createdRole.id).toBeDefined();
  30. expect(createdRole.name).toBe(roleData.name);
  31. expect(createdRole.description).toBe(roleData.description);
  32. expect(createdRole.permissions).toEqual(roleData.permissions);
  33. // Retrieve role
  34. const retrievedRole = await roleService.getById(createdRole.id);
  35. expect(retrievedRole).toBeDefined();
  36. expect(retrievedRole?.name).toBe(roleData.name);
  37. });
  38. it('should update role information', async () => {
  39. // Create role first
  40. const roleData = {
  41. name: 'updaterole',
  42. description: 'Role to be updated',
  43. permissions: ['user:read']
  44. };
  45. const createdRole = await roleService.create(roleData);
  46. // Update role
  47. const updateData = {
  48. description: 'Updated role description',
  49. permissions: ['user:read', 'user:update']
  50. };
  51. const updatedRole = await roleService.update(createdRole.id, updateData);
  52. expect(updatedRole).toBeDefined();
  53. expect(updatedRole?.description).toBe(updateData.description);
  54. expect(updatedRole?.permissions).toEqual(updateData.permissions);
  55. });
  56. it('should delete role', async () => {
  57. // Create role first
  58. const roleData = {
  59. name: 'deleterole',
  60. description: 'Role to be deleted',
  61. permissions: ['user:read']
  62. };
  63. const createdRole = await roleService.create(roleData);
  64. // Delete role
  65. const deleteResult = await roleService.delete(createdRole.id);
  66. expect(deleteResult).toBe(true);
  67. // Verify role is deleted
  68. const retrievedRole = await roleService.getById(createdRole.id);
  69. expect(retrievedRole).toBeNull();
  70. });
  71. it('should get role by name', async () => {
  72. const roleData = {
  73. name: 'specificrole',
  74. description: 'Specific role for testing',
  75. permissions: ['user:read']
  76. };
  77. await roleService.create(roleData);
  78. const foundRole = await roleService.getRoleByName('specificrole');
  79. expect(foundRole).toBeDefined();
  80. expect(foundRole?.name).toBe('specificrole');
  81. });
  82. });
  83. describe('Role List Operations', () => {
  84. it('should get paginated list of roles', async () => {
  85. // Create multiple roles
  86. const rolesData = [
  87. { name: 'role1', description: 'Role 1', permissions: ['user:read'] },
  88. { name: 'role2', description: 'Role 2', permissions: ['user:read'] },
  89. { name: 'role3', description: 'Role 3', permissions: ['user:read'] }
  90. ];
  91. for (const roleData of rolesData) {
  92. await roleService.create(roleData);
  93. }
  94. const [roles, total] = await roleService.getList(1, 10);
  95. expect(total).toBe(3);
  96. expect(roles).toHaveLength(3);
  97. expect(roles.map(r => r.name)).toEqual(
  98. expect.arrayContaining(['role1', 'role2', 'role3'])
  99. );
  100. });
  101. it('should search roles by name', async () => {
  102. // Create roles with different names
  103. await roleService.create({ name: 'admin', description: 'Admin role', permissions: ['user:create'] });
  104. await roleService.create({ name: 'user', description: 'User role', permissions: ['user:read'] });
  105. await roleService.create({ name: 'moderator', description: 'Moderator role', permissions: ['user:update'] });
  106. const [adminRoles] = await roleService.getList(1, 10, 'admin', ['name']);
  107. expect(adminRoles).toHaveLength(1);
  108. expect(adminRoles[0].name).toBe('admin');
  109. const [userRoles] = await roleService.getList(1, 10, 'user', ['name']);
  110. expect(userRoles).toHaveLength(1);
  111. expect(userRoles[0].name).toBe('user');
  112. });
  113. });
  114. describe('Permission Checking', () => {
  115. it('should check if role has permission', async () => {
  116. const roleData = {
  117. name: 'permissionrole',
  118. description: 'Role with specific permissions',
  119. permissions: ['user:create', 'user:read', 'user:update']
  120. };
  121. const role = await roleService.create(roleData);
  122. // Check existing permissions
  123. expect(await roleService.checkPermission(role.id, 'user:create')).toBe(true);
  124. expect(await roleService.checkPermission(role.id, 'user:read')).toBe(true);
  125. expect(await roleService.checkPermission(role.id, 'user:update')).toBe(true);
  126. // Check non-existing permission
  127. expect(await roleService.checkPermission(role.id, 'user:delete')).toBe(false);
  128. });
  129. it('should return false for non-existent role', async () => {
  130. const hasPermission = await roleService.checkPermission(999, 'user:create');
  131. expect(hasPermission).toBe(false);
  132. });
  133. });
  134. describe('Role Validation', () => {
  135. it('should require unique role names', async () => {
  136. const roleData = {
  137. name: 'unique',
  138. description: 'Unique role',
  139. permissions: ['user:read']
  140. };
  141. // Create first role
  142. await roleService.create(roleData);
  143. // Try to create role with same name
  144. await expect(roleService.create(roleData)).rejects.toThrow();
  145. });
  146. it('should require at least one permission', async () => {
  147. const roleData = {
  148. name: 'nopermission',
  149. description: 'Role without permissions',
  150. permissions: []
  151. };
  152. // This should work as TypeORM handles empty arrays
  153. const role = await roleService.create(roleData);
  154. expect(role.permissions).toEqual([]);
  155. });
  156. });
  157. });