role.integration.test.ts 6.5 KB

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