role.integration.test.ts 6.4 KB

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