upskill-event-manager/wordpress-dev/tests/HVAC_Role_Manager_Test.php
bengizmo cade20aa2b feat(testing): Implement HVAC Role Manager component
- Added HVAC_Role_Manager class with role/permission management
- Implemented test cases in HVAC_Role_Manager_Test.php
- Created API documentation in docs/role-manager-api.md
- Updated testing improvement plan with progress
- Added design decisions to memory-bank/decisionLog.md

Includes:
- Role creation/deletion methods
- Permission management system
- Role conflict detection
- Permission inheritance logic
- Comprehensive test coverage
2025-04-14 19:02:22 -03:00

224 lines
No EOL
7 KiB
PHP

<?php
/**
* Tests for the HVAC_Role_Manager class
*
* @package HVAC\Testing
*/
class HVAC_Role_Manager_Test extends HVAC_Base_Test_Case {
/** @var HVAC_Role_Manager */
private $role_manager;
/**
* Set up test environment
*/
public function setUp(): void {
parent::setUp();
$this->role_manager = new HVAC_Role_Manager();
}
/**
* Clean up after each test
*/
public function tearDown(): void {
$this->role_manager->cleanup_transaction_roles();
parent::tearDown();
}
/**
* @testdox Basic role operations create and verify roles correctly
*/
public function test_basic_role_operations(): void {
// Create a basic role
$result = $this->role_manager->create_role(
'test_editor',
'Test Editor',
['edit_posts' => true]
);
$this->assertTrue($result);
$this->assertTrue($this->role_manager->role_exists('test_editor'));
// Verify capabilities
$caps = $this->role_manager->get_role_capabilities('test_editor');
$this->assertArrayHasKey('edit_posts', $caps);
}
/**
* @testdox Role creation validates input parameters
* @dataProvider provide_invalid_role_data
*/
public function test_role_creation_validation(
string $role_name,
string $display_name,
array $capabilities,
string $expected_exception
): void {
$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage($expected_exception);
$this->role_manager->create_role($role_name, $display_name, $capabilities);
}
/**
* Data provider for role creation validation tests
*/
public function provide_invalid_role_data(): array {
return [
'empty_role_name' => [
'',
'Display Name',
['edit_posts' => true],
'Role name and display name are required'
],
'empty_display_name' => [
'role_name',
'',
['edit_posts' => true],
'Role name and display name are required'
],
'duplicate_role' => [
'administrator',
'Admin',
['edit_posts' => true],
"Role 'administrator' already exists"
]
];
}
/**
* @testdox Permission inheritance works correctly
*/
public function test_role_inheritance(): void {
// Create parent role
$this->role_manager->create_role(
'parent_role',
'Parent Role',
['parent_cap' => true]
);
// Create child role inheriting from parent
$result = $this->role_manager->create_role(
'child_role',
'Child Role',
['child_cap' => true],
['parent_role']
);
$this->assertTrue($result);
// Verify inherited capabilities
$caps = $this->role_manager->get_role_capabilities('child_role');
$this->assertArrayHasKey('parent_cap', $caps);
$this->assertArrayHasKey('child_cap', $caps);
}
/**
* @testdox Core WordPress roles cannot be deleted
*/
public function test_core_role_deletion_prevention(): void {
$core_roles = ['administrator', 'editor', 'author', 'contributor', 'subscriber'];
foreach ($core_roles as $role) {
try {
$this->role_manager->delete_role($role);
$this->fail("Expected exception when deleting core role: {$role}");
} catch (InvalidArgumentException $e) {
$this->assertStringContainsString("Cannot delete core WordPress role", $e->getMessage());
}
}
}
/**
* @testdox Capability management functions work correctly
*/
public function test_capability_management(): void {
// Create test role
$this->role_manager->create_role(
'cap_test_role',
'Capability Test Role',
['initial_cap' => true]
);
// Add capabilities
$new_caps = ['new_cap_1', 'new_cap_2'];
$result = $this->role_manager->add_capabilities('cap_test_role', $new_caps);
$this->assertTrue($result);
// Verify added capabilities
$caps = $this->role_manager->get_role_capabilities('cap_test_role');
foreach ($new_caps as $cap) {
$this->assertArrayHasKey($cap, $caps);
}
// Remove capabilities
$result = $this->role_manager->remove_capabilities('cap_test_role', ['new_cap_1']);
$this->assertTrue($result);
// Verify removal
$caps = $this->role_manager->get_role_capabilities('cap_test_role');
$this->assertArrayNotHasKey('new_cap_1', $caps);
$this->assertArrayHasKey('new_cap_2', $caps);
}
/**
* @testdox Role conflict detection works correctly
*/
public function test_role_conflict_detection(): void {
// Create roles with conflicting capabilities
$this->role_manager->create_role(
'role_1',
'Role 1',
['publish_posts' => true]
);
$this->role_manager->create_role(
'role_2',
'Role 2',
['read_only_posts' => true]
);
// Check for conflicts
$conflicts = $this->role_manager->detect_role_conflicts(['role_1', 'role_2']);
$this->assertNotEmpty($conflicts);
$this->assertCount(1, $conflicts);
$this->assertEquals(['publish_posts', 'read_only_posts'], $conflicts[0]['conflicts'][0]);
}
/**
* @testdox TEC capabilities are properly assigned to core roles
*/
public function test_tec_capability_assignment(): void {
// Check administrator capabilities
$admin_caps = $this->role_manager->get_role_capabilities('administrator');
$this->assertArrayHasKey('publish_tribe_events', $admin_caps);
$this->assertArrayHasKey('manage_tribe_event_settings', $admin_caps);
// Check editor capabilities
$editor_caps = $this->role_manager->get_role_capabilities('editor');
$this->assertArrayHasKey('publish_tribe_events', $editor_caps);
$this->assertArrayNotHasKey('manage_tribe_event_settings', $editor_caps);
}
/**
* @testdox Transaction roles are properly cleaned up
*/
public function test_transaction_role_cleanup(): void {
// Create multiple test roles
$test_roles = ['test_role_1', 'test_role_2', 'test_role_3'];
foreach ($test_roles as $role) {
$this->role_manager->create_role($role, "Test Role", ['test_cap' => true]);
$this->assertTrue($this->role_manager->role_exists($role));
}
// Clean up transaction roles
$this->role_manager->cleanup_transaction_roles();
// Verify roles are removed
foreach ($test_roles as $role) {
$this->assertFalse($this->role_manager->role_exists($role));
}
}
}