mirror of
https://github.com/Cacti/plugin_monitor.git
synced 2026-10-24 12:07:01 +09:00
This plugin had no tests/Security category at all, and setup.php's lifecycle/device-hook functions had zero test coverage (only db_functions.php and the request-output escaping/wiring were tested). Closed both gaps: - Security: added the standard PHP compatibility scan (8.0-8.4 removed/added syntax) and a static structure check (required functions, INFO keys), matching the baseline used across the rest of the plugin fleet. - Unit: plugin_monitor_version(), the lifecycle contract functions (plugin_monitor_uninstall - verifies it drops every table it owns, plugin_monitor_check_config - both the out-of-range and valid monitor_refresh branches, plugin_monitor_upgrade, monitor_check_upgrade()'s page-guard and version-drift branches), the device-list hooks (monitor_device_filters, monitor_device_sql_where, monitor_device_action_array, monitor_device_remove), monitor_draw_navigation_text(), monitor_get_default(), monitor_setup_table() (verifies every table it provisions), and monitor_poller_bottom() (primary-poller and non-primary-poller branches). - Integration: plugin_monitor_install() (verifies every hook, the realm, the tables it provisions, and the config defaults it sets, together, in one pass) - this plugin had no tests/Integration coverage of setup.php before (the existing Integration tests cover request-output wiring, not the plugin lifecycle). No new unserialize() hardening was needed: setup.php's one unserialize() call already goes through sanitize_unserialize_selected_items(). Also fixed tests/.cacti-version, which was pinned to a stale "1.2.31" and failed the bootstrap's version check against any other real Cacti checkout (e.g. a local 1.2.32 checkout); "1.2.x" matches the moving-branch convention used elsewhere in this fleet. Intentionally left uncovered: monitor_device_table_bottom()/monitor_show_tab()/ monitor_top_graph_refresh()/plugin_monitor_page_head() (print-heavy UI rendering), monitor_config_settings()/monitor_config_arrays()/monitor_config_form() (very large), monitor_device_action_execute()/monitor_device_action_prepare() (large, print/DB-heavy confirmation dialogs), and monitor_api_device_save() (moderate complexity, comparatively low value relative to the effort of safely mocking its dependencies) - consistent with similarly-scoped functions skipped elsewhere in this coverage-expansion pass. tests/bootstrap-unit.php gained a fixture-mock DB API (monitor_test_mock_db/monitor_test_reset_db_mocks/monitor_test_db_result, matching the convention used elsewhere in the plugin fleet), api_plugin_register_hook/api_plugin_register_realm call-logging stubs, db_table_exists, and exec_background (call-logging, safe here since setup.php's poller include always goes through $config['library_path'], which points at a throwaway test stub, never Cacti core's real lib/poller.php); read_config_option/set_config_option were rewired from hardcoded no-ops to a real backing store - all needed by the new tests. Verified via a real WSL Cacti install (composer-managed Pest, not a plugin-local vendor tree): 63 passed (303 assertions), up from 31.
80 lines
2.7 KiB
PHP
80 lines
2.7 KiB
PHP
<?php
|
|
/*
|
|
+-------------------------------------------------------------------------+
|
|
| Copyright (C) 2004-2026 The Cacti Group |
|
|
+-------------------------------------------------------------------------+
|
|
*/
|
|
|
|
/*
|
|
* Unit coverage for the device-list filter/action/removal hooks in
|
|
* setup.php: monitor_device_filters(), monitor_device_sql_where(),
|
|
* monitor_device_action_array(), monitor_device_remove(),
|
|
* monitor_draw_navigation_text(), and monitor_get_default().
|
|
*/
|
|
|
|
beforeAll(function () {
|
|
require_once __DIR__ . '/../../setup.php';
|
|
});
|
|
|
|
beforeEach(function () {
|
|
$GLOBALS['__test_db_calls'] = array();
|
|
$GLOBALS['__test_request'] = array();
|
|
$GLOBALS['__test_config_options'] = array();
|
|
});
|
|
|
|
it('adds a criticality drop-down filter without disturbing existing filters', function () {
|
|
$filters = monitor_device_filters(array('other' => array('friendly_name' => 'Other')));
|
|
|
|
expect($filters)->toHaveKey('other');
|
|
expect($filters)->toHaveKey('criticality');
|
|
expect($filters['criticality']['default'])->toBe('-1');
|
|
});
|
|
|
|
it('does not add a criticality clause when criticality is -1 (any)', function () {
|
|
$GLOBALS['__test_request']['criticality'] = '-1';
|
|
|
|
expect(monitor_device_sql_where(''))->toBe('');
|
|
});
|
|
|
|
it('adds a criticality clause when a specific criticality is selected', function () {
|
|
$GLOBALS['__test_request']['criticality'] = '2';
|
|
|
|
expect(monitor_device_sql_where(''))->toBe('WHERE monitor_criticality = 2');
|
|
expect(monitor_device_sql_where('WHERE host_status = 1'))->toBe('WHERE host_status = 1 AND monitor_criticality = 2');
|
|
});
|
|
|
|
it('adds the monitoring actions to the device action dropdown', function () {
|
|
$actions = monitor_device_action_array(array('delete' => 'Delete'));
|
|
|
|
expect($actions)->toHaveKey('delete');
|
|
expect($actions)->toHaveKey('monitor_settings');
|
|
expect($actions)->toHaveKey('monitor_enable');
|
|
expect($actions)->toHaveKey('monitor_disable');
|
|
});
|
|
|
|
it('removes every per-device record on device_remove', function () {
|
|
$result = monitor_device_remove(array(3, 4));
|
|
|
|
expect($GLOBALS['__test_db_calls'])->toHaveCount(3);
|
|
expect($result)->toBe(array(3, 4));
|
|
|
|
foreach ($GLOBALS['__test_db_calls'] as $call) {
|
|
expect($call['sql'])->toContain('IN(3,4)');
|
|
}
|
|
});
|
|
|
|
it('adds the monitor breadcrumb entry without disturbing existing ones', function () {
|
|
$nav = monitor_draw_navigation_text(array('other.php:' => array('title' => 'Other')));
|
|
|
|
expect($nav)->toHaveKey('other.php:');
|
|
expect($nav)->toHaveKey('monitor.php:');
|
|
});
|
|
|
|
it('reads the default monitor state only for a new (unsaved) host', function () {
|
|
$GLOBALS['__test_config_options']['monitor_new_enabled'] = 'on';
|
|
|
|
expect(monitor_get_default(0))->toBe('on');
|
|
expect(monitor_get_default(-1))->toBe('on');
|
|
expect(monitor_get_default(5))->toBe('');
|
|
});
|