assertTrue(WordPressMock::get_option('care_booking_activated'));
$this->assertEquals('1.0.0', WordPressMock::get_option('care_booking_version'));
// Verify hook was registered
$hooks = WordPressMock::getActions('plugins_loaded');
$this->assertCount(1, $hooks);
}
/**
* Test admin menu registration
*
* @return void
* @since 1.0.0
*/
public function testAdminMenuRegistration(): void
{
$menuCallback = function() {
WordPressMock::update_option('admin_menu_registered', true);
};
WordPressMock::add_action('admin_menu', $menuCallback);
// Simulate admin menu loading
WordPressMock::do_action('admin_menu');
// Verify menu was registered
$this->assertTrue(WordPressMock::get_option('admin_menu_registered'));
$hooks = WordPressMock::getActions('admin_menu');
$this->assertCount(1, $hooks);
}
/**
* Test AJAX endpoints registration
*
* @return void
* @since 1.0.0
*/
public function testAjaxEndpointsRegistration(): void
{
// Register AJAX actions
$ajaxActions = [
'wp_ajax_care_booking_toggle_restriction',
'wp_ajax_care_booking_get_restrictions',
'wp_ajax_care_booking_add_restriction'
];
foreach ($ajaxActions as $action) {
$callback = function() use ($action) {
WordPressMock::update_option("executed_{$action}", true);
};
WordPressMock::add_action($action, $callback);
}
// Simulate AJAX calls
foreach ($ajaxActions as $action) {
WordPressMock::do_action($action);
$this->assertTrue(WordPressMock::get_option("executed_{$action}"));
}
// Verify all hooks registered
foreach ($ajaxActions as $action) {
$hooks = WordPressMock::getActions($action);
$this->assertCount(1, $hooks);
}
}
/**
* Test CSS injection filter
*
* @return void
* @since 1.0.0
*/
public function testCssInjectionFilter(): void
{
$cssFilter = function($css) {
$restrictionCss = '.doctor-123 { display: none !important; }';
return $css . $restrictionCss;
};
WordPressMock::add_filter('wp_head', $cssFilter);
$originalCss = '';
$filteredCss = WordPressMock::apply_filters('wp_head', $originalCss);
$this->assertStringContains('display: none', $filteredCss);
$this->assertStringContains('doctor-123', $filteredCss);
$this->assertStringContains('body { margin: 0; }', $filteredCss);
}
/**
* Test content filtering for appointment forms
*
* @return void
* @since 1.0.0
*/
public function testContentFiltering(): void
{
$contentFilter = function($content) {
// Add CSS classes to appointment form elements
if (strpos($content, 'kivicare-appointment') !== false) {
$content = str_replace(
'data-doctor="123"',
'data-doctor="123" class="restricted-doctor"',
$content
);
}
return $content;
};
WordPressMock::add_filter('the_content', $contentFilter);
$originalContent = '
Appointment Form
';
$filteredContent = WordPressMock::apply_filters('the_content', $originalContent);
$this->assertStringContains('restricted-doctor', $filteredContent);
$this->assertStringContains('data-doctor="123"', $filteredContent);
}
/**
* Test shortcode registration and processing
*
* @return void
* @since 1.0.0
*/
public function testShortcodeRegistration(): void
{
$shortcodeCallback = function($atts) {
$attributes = array_merge([
'doctor_id' => 0,
'service_id' => 0,
'show_restrictions' => 'false'
], $atts);
return 'Booking Widget
';
};
// Mock shortcode registration
WordPressMock::add_filter('do_shortcode_tag', $shortcodeCallback);
// Simulate shortcode processing
$shortcodeOutput = WordPressMock::apply_filters('do_shortcode_tag', '', ['doctor_id' => 123]);
$this->assertStringContains('care-booking-shortcode', $shortcodeOutput);
$this->assertStringContains('data-doctor="123"', $shortcodeOutput);
}
/**
* Test database query filters
*
* @return void
* @since 1.0.0
*/
public function testDatabaseQueryFilters(): void
{
$queryFilter = function($query) {
// Mock adding WHERE clause to filter out restricted doctors
if (strpos($query, 'kc_doctors') !== false) {
$query .= ' AND status = 1 AND id NOT IN (123, 456)';
}
return $query;
};
WordPressMock::add_filter('query', $queryFilter);
$originalQuery = 'SELECT * FROM kc_doctors WHERE clinic_id = 1';
$filteredQuery = WordPressMock::apply_filters('query', $originalQuery);
$this->assertStringContains('NOT IN (123, 456)', $filteredQuery);
$this->assertStringContains('status = 1', $filteredQuery);
}
/**
* Test user capability filters
*
* @return void
* @since 1.0.0
*/
public function testUserCapabilityFilters(): void
{
$capabilityFilter = function($capabilities, $cap, $userId) {
// Mock adding custom capability for care booking management
if (in_array('manage_care_bookings', $cap)) {
$capabilities[] = 'manage_care_bookings';
}
return $capabilities;
};
WordPressMock::add_filter('user_has_cap', $capabilityFilter);
// Mock the filter parameters
$userCaps = ['read' => true];
$requestedCap = ['manage_care_bookings'];
$userId = 1;
$filteredCaps = WordPressMock::apply_filters('user_has_cap', $userCaps, $requestedCap, $userId);
$this->assertContains('manage_care_bookings', $filteredCaps);
}
/**
* Test hook priority ordering
*
* @return void
* @since 1.0.0
*/
public function testHookPriorityOrdering(): void
{
$executionOrder = [];
// Register hooks with different priorities
WordPressMock::add_action('init', function() use (&$executionOrder) {
$executionOrder[] = 'high_priority';
}, 5); // Higher priority (executes first)
WordPressMock::add_action('init', function() use (&$executionOrder) {
$executionOrder[] = 'low_priority';
}, 15); // Lower priority (executes last)
WordPressMock::add_action('init', function() use (&$executionOrder) {
$executionOrder[] = 'default_priority';
}); // Default priority (10)
// Execute hooks
WordPressMock::do_action('init');
// Verify execution order (in our mock, they execute in registration order)
// In real WordPress, they would execute by priority
$this->assertCount(3, $executionOrder);
$this->assertContains('high_priority', $executionOrder);
$this->assertContains('low_priority', $executionOrder);
$this->assertContains('default_priority', $executionOrder);
}
/**
* Test conditional hook registration
*
* @return void
* @since 1.0.0
*/
public function testConditionalHookRegistration(): void
{
// Mock different WordPress contexts
$contexts = [
'is_admin' => true,
'is_ajax' => false,
'is_frontend' => false
];
foreach ($contexts as $context => $isActive) {
if ($isActive) {
$callback = function() use ($context) {
WordPressMock::update_option("context_{$context}", true);
};
WordPressMock::add_action('wp_loaded', $callback);
}
}
WordPressMock::do_action('wp_loaded');
// Verify only active context hooks executed
$this->assertTrue(WordPressMock::get_option('context_is_admin'));
$this->assertFalse(WordPressMock::get_option('context_is_ajax', false));
$this->assertFalse(WordPressMock::get_option('context_is_frontend', false));
}
/**
* Test custom post type hooks
*
* @return void
* @since 1.0.0
*/
public function testCustomPostTypeHooks(): void
{
$postTypeCallback = function() {
WordPressMock::update_option('custom_post_type_registered', 'care_booking_restriction');
};
WordPressMock::add_action('init', $postTypeCallback);
WordPressMock::do_action('init');
$this->assertEquals('care_booking_restriction', WordPressMock::get_option('custom_post_type_registered'));
}
/**
* Test meta box registration hooks
*
* @return void
* @since 1.0.0
*/
public function testMetaBoxRegistration(): void
{
$metaBoxCallback = function() {
WordPressMock::update_option('meta_boxes_registered', [
'care_booking_restrictions',
'care_booking_settings',
'care_booking_stats'
]);
};
WordPressMock::add_action('add_meta_boxes', $metaBoxCallback);
WordPressMock::do_action('add_meta_boxes');
$metaBoxes = WordPressMock::get_option('meta_boxes_registered');
$this->assertIsArray($metaBoxes);
$this->assertCount(3, $metaBoxes);
$this->assertContains('care_booking_restrictions', $metaBoxes);
}
}