diff options
Diffstat (limited to 'ui/tests/selenium/hosts/testPageMonitoringHosts.php')
-rw-r--r-- | ui/tests/selenium/hosts/testPageMonitoringHosts.php | 1204 |
1 files changed, 1204 insertions, 0 deletions
diff --git a/ui/tests/selenium/hosts/testPageMonitoringHosts.php b/ui/tests/selenium/hosts/testPageMonitoringHosts.php new file mode 100644 index 00000000000..2efb578265a --- /dev/null +++ b/ui/tests/selenium/hosts/testPageMonitoringHosts.php @@ -0,0 +1,1204 @@ +<?php +/* +** Zabbix +** Copyright (C) 2001-2022 Zabbix SIA +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +**/ + + +require_once dirname(__FILE__).'/../../include/CWebTest.php'; +require_once dirname(__FILE__).'/../traits/TableTrait.php'; +require_once dirname(__FILE__).'/../traits/TagTrait.php'; +require_once dirname(__FILE__).'/../../include/helpers/CDataHelper.php'; + +/** + * @backup profiles + * + * @dataSource TagFilter + */ +class testPageMonitoringHosts extends CWebTest { + + use TagTrait; + use TableTrait; + + /** + * Id of host that was updated. + * + * @var integer + */ + protected static $hostid; + + public function testPageMonitoringHosts_CheckLayout() { + $this->page->login()->open('zabbix.php?action=host.view')->waitUntilReady(); + $form = $this->query('name:zbx_filter')->waitUntilPresent()->asForm()->one(); + $table = $this->query('class:list-table')->asTable()->one(); + + // Checking Title, Header and Column names. + $this->page->assertTitle('Hosts'); + $this->page->assertHeader('Hosts'); + $headers = ['Name', 'Interface', 'Availability', 'Tags', 'Status', 'Latest data', 'Problems','Graphs', + 'Dashboards', 'Web']; + $this->assertSame($headers, ($this->query('class:list-table')->asTable()->one())->getHeadersText()); + + // Check filter collapse/expand. + foreach ([true, false] as $status) { + $this->assertTrue($this->query('xpath://ul[@class="ui-sortable-container ui-sortable"]//li[contains(@class, "selected")]') + ->one()->isPresent($status) + ); + $this->query('xpath://a[@aria-label="Home"]')->one()->click(); + } + + // Check fields maximum length. + foreach(['tags[0][tag]', 'tags[0][value]'] as $field) { + $this->assertEquals(255, $form->query('xpath:.//input[@name="'.$field.'"]') + ->one()->getAttribute('maxlength')); + } + + // Check tags maximum length. + foreach(['name', 'ip', 'dns', 'port'] as $field) { + $this->assertEquals(255, $form->query('xpath:.//input[@id="'.$field.'_0"]') + ->one()->getAttribute('maxlength')); + } + + // Check disabled links. + foreach (['Graphs', 'Dashboards', 'Web'] as $disabled) { + $row = $table->findRow('Name', 'Available host'); + $this->assertTrue($row->query('xpath://following::td/span[@class="disabled" and text()="'.$disabled.'"]')->exists()); + } + + // Check tags on the specific host. + $tags = $table->findRow('Name', 'Host for tags filtering - clone')->getColumn('Tags')->query('class:tag')->all(); + $this->assertEquals(['action: clone', 'tag: host'], $tags->asText()); + + foreach ($tags as $tag) { + $tag->click(); + $hint = $this->query('xpath://div[@data-hintboxid]')->asOverlayDialog()->waitUntilPresent()->all()->last(); + $this->assertEquals($tag->getText(), $hint->getText()); + $hint->close(); + } + } + + public static function getCheckFilterData() { + return [ + [ + [ + 'filter' => [ + 'Name' => 'Empty host' + ], + 'expected' => [ + 'Empty host' + ] + ] + ], + [ + [ + 'filter' => [ + 'Host groups' => [ + 'Group to copy all graph' + ] + ], + 'expected' => [ + 'Host with item to copy all graphs 1', + 'Host with item to copy all graphs 2' + ] + ] + ], + [ + [ + 'filter' => [ + 'IP' => '127.0.0.3' + ], + 'expected' => [ + 'Template inheritance test host', + 'Test item host' + ] + ] + ], + [ + [ + 'filter' => [ + 'DNS' => 'zabbixzabbixzabbix.com' + ], + 'expected' => [ + 'Available host', + 'Not available host', + 'Not available host in maintenance', + 'Unknown host', + 'Unknown host in maintenance' + ] + ] + ], + [ + [ + 'filter' => [ + 'Port' => '161' + ], + 'expected' => [ + 'Test item host', + 'Visible host for template linkage' + ] + ] + ], + [ + [ + 'filter' => [ + 'Severity' => [ + 'Not classified' + ] + ], + 'expected' => [ + '1_Host_to_check_Monitoring_Overview', + 'Host for tag permissions' + ] + ] + ], + [ + [ + 'filter' => [ + 'Severity' => [ + 'Warning' + ] + ], + 'expected' => [ + '1_Host_to_check_Monitoring_Overview', + 'ЗАББИКС Сервер' + ] + ] + ], + [ + [ + 'filter' => [ + 'Severity' => [ + 'High' + ] + ], + 'expected' => [ + '1_Host_to_check_Monitoring_Overview' + ] + ] + ], + [ + [ + 'filter' => [ + 'Severity' => [ + 'Information' + ] + ], + 'expected' => [ + '1_Host_to_check_Monitoring_Overview' + ] + ] + ], + [ + [ + 'filter' => [ + 'Severity' => [ + 'Average' + ] + ], + 'expected' => [ + '1_Host_to_check_Monitoring_Overview', + '3_Host_to_check_Monitoring_Overview', + '4_Host_to_check_Monitoring_Overview', + 'Host for triggers filtering', + 'ЗАББИКС Сервер' + ] + ] + ], + [ + [ + 'filter' => [ + 'Severity' => 'Disaster' + ], + 'expected' => [ + '1_Host_to_check_Monitoring_Overview' + ] + ] + ], + [ + [ + 'filter' => [ + 'Status' => 'Disabled', + 'Host groups' => ['Zabbix server'] + ], + 'expected' => [ + 'No data found.' + ] + ] + ], + [ + [ + 'filter' => [ + 'Name' => 'available', + 'Host groups' => [ + 'Group for Host availability widget' + ] + ], + 'expected' => [ + 'Available host', + 'Not available host' + ] + ] + ], + [ + [ + 'filter' => [ + 'Name' => 'for', + 'Host groups' => [ + 'Zabbix servers' + ], + 'IP' => '127.0.5.1' + ], + 'expected' => [ + 'Simple form test host' + ] + ] + ], + [ + [ + 'filter' => [ + 'Name' => 'Unknown', + 'Host groups' => [ + 'Group for Host availability widget'], + 'IP' => '127.0.0.1', + 'DNS' => 'zabbix.com' + ], + 'expected' => [ + 'Unknown host' + ] + ] + ], + [ + [ + 'filter' => [ + 'Name' => 'maintenance', + 'Host groups' => [ + 'Group in maintenance for Host availability widget' + ], + 'IP' => '127.0.0.1', + 'DNS' => 'zab', + 'Port' => '10050' + ], + 'expected' => [ + 'Not available host in maintenance', + 'Unknown host in maintenance' + ] + ] + ], + [ + [ + 'filter' => [ + 'Severity' => [ + 'Not classified', + 'Warning', + 'High', + 'Information', + 'Average', + 'Disaster' + ] + ], + 'expected' => [ + '1_Host_to_check_Monitoring_Overview', + '3_Host_to_check_Monitoring_Overview', + '4_Host_to_check_Monitoring_Overview', + 'Host for tag permissions', + 'Host for triggers filtering', + 'ЗАББИКС Сервер' + ] + ] + ], + [ + [ + 'filter' => [ + 'Name' => 'Tommy' + ], + 'expected' => [] + ] + ], + // With name 'maintenance', exists 3 hosts in maintenance status. Unchecking 'Show hosts in maintenance'. + [ + [ + 'filter' => [ + 'Name' => 'maintenance', + 'Show hosts in maintenance' => false + ], + 'expected' => [] + ] + ], + [ + [ + 'filter' => [ + 'Name' => 'maintenance' + ], + 'expected' => [ + 'Available host in maintenance', + 'Not available host in maintenance', + 'Unknown host in maintenance' + ] + ] + ] + ]; + } + + /** + * @dataProvider getCheckFilterData + */ + public function testPageMonitoringHosts_CheckFilter($data) { + $this->page->login()->open('zabbix.php?action=host.view&filter_reset=1'); + $form = $this->query('name:zbx_filter')->waitUntilPresent()->asForm()->one(); + $form->fill($data['filter']); + $table = $this->query('class:list-table')->waitUntilPresent()->asTable()->one(); + $this->query('button:Apply')->waitUntilClickable()->one()->click(); + $table->waitUntilReloaded(); + $this->assertTableDataColumn($data['expected']); + $this->query('button:Reset')->waitUntilClickable()->one()->click(); + $table->waitUntilReloaded(); + } + + public static function getTagsFilterData() { + return [ + [ + [ + 'tag_options' => [ + 'type' => 'And/Or', + 'tags' => [ + ['name' => 'test', 'value' => 'test_tag', 'operator' => 'Equals'] + ] + ], + 'result' => [ + 'Host for tags filtering' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'And/Or', + 'tags' => [ + ['name' => 'test', 'value' => '', 'operator' => 'Contains'] + ] + ], + 'result' => [ + 'Host for tags filtering' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'Or', + 'tags' => [ + ['name' => 'test', 'value' => 'test_tag', 'operator' => 'Equals'], + ['name' => 'action', 'value' => 'clone', 'operator' => 'Contains'] + ] + ], + 'result' => [ + 'Host for tags filtering', + 'Host for tags filtering - clone' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'Or', + 'tags' => [ + ['name' => 'action', 'value' => 'clone', 'operator' => 'Equals'], + ['name' => 'tag', 'value' => 'host', 'operator' => 'Equals'] + ] + ], + 'result' => [ + 'Host for tags filtering - clone', + 'Host for tags filtering - update' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'And/Or', + 'tags' => [ + ['name' => 'action', 'value' => 'clone', 'operator' => 'Contains'], + ['name' => 'tag', 'value' => 'host', 'operator' => 'Contains'] + ] + ], + 'result' => [ + 'Host for tags filtering - clone' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'Or', + 'tags' => [ + ['name' => 'action', 'value' => 'clone', 'operator' => 'Equals'], + ['name' => 'action', 'value' => 'update', 'operator' => 'Equals'], + ['name' => 'tag', 'value' => 'TEMPLATE', 'operator' => 'Equals'] + ] + ], + 'result' => [ + 'Host for tags filtering', + 'Host for tags filtering - clone', + 'Host for tags filtering - update' + ] + ] + ], + // Wrote 'template' in lowercase. + [ + [ + 'tag_options' => [ + 'type' => 'And/Or', + 'tags' => [ + ['name' => 'tag', 'value' => 'template', 'operator' => 'Equals'] + ] + ], + 'result' => [] + ] + ], + // Non-existing tag. + [ + [ + 'tag_options' => [ + 'type' => 'And/Or', + 'tags' => [ + ['name' => 'Tommy', 'value' => 'train', 'operator' => 'Contains'] + ] + ], + 'result' => [] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'And/Or', + 'tags' => [ + ['name' => 'test', 'operator' => 'Exists'] + ] + ], + 'result' => [ + 'Host for tags filtering' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'Or', + 'tags' => [ + ['name' => 'test', 'operator' => 'Exists'] + ] + ], + 'result' => [ + 'Host for tags filtering' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'And/Or', + 'tags' => [ + ['name' => 'tag', 'operator' => 'Exists'], + ['name' => 'test', 'operator' => 'Exists'] + ] + ], + 'result' => [ + 'Host for tags filtering' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'Or', + 'tags' => [ + ['name' => 'tag', 'operator' => 'Exists'], + ['name' => 'test', 'operator' => 'Exists'] + ] + ], + 'result' => [ + 'Host for tags filtering', + 'Host for tags filtering - clone', + 'Host for tags filtering - update' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'And/Or', + 'tags' => [ + ['name' => 'test', 'operator' => 'Does not exist'] + ] + ], + 'result' => [ + 'Host for tags filtering - clone', + 'Host for tags filtering - update', + 'Simple form test host', + 'SLA reports host', + 'Template inheritance test host', + 'ЗАББИКС Сервер' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'Or', + 'tags' => [ + ['name' => 'test', 'operator' => 'Does not exist'] + ] + ], + 'result' => [ + 'Host for tags filtering - clone', + 'Host for tags filtering - update', + 'Simple form test host', + 'SLA reports host', + 'Template inheritance test host', + 'ЗАББИКС Сервер' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'Or', + 'tags' => [ + ['name' => 'action', 'operator' => 'Does not exist'], + ['name' => 'tag', 'operator' => 'Does not exist'] + ] + ], + 'result' => [ + 'Simple form test host', + 'SLA reports host', + 'Template inheritance test host', + 'ЗАББИКС Сервер' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'And/Or', + 'tags' => [ + ['name' => 'action', 'operator' => 'Does not exist'], + ['name' => 'tag', 'operator' => 'Does not exist'] + ] + ], + 'result' => [ + 'Simple form test host', + 'SLA reports host', + 'Template inheritance test host', + 'ЗАББИКС Сервер' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'And/Or', + 'tags' => [ + ['name' => 'test', 'operator' => 'Does not equal', 'value' => 'test_tag'] + ] + ], + 'result' => [ + 'Host for tags filtering - clone', + 'Host for tags filtering - update', + 'Simple form test host', + 'SLA reports host', + 'Template inheritance test host', + 'ЗАББИКС Сервер' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'Or', + 'tags' => [ + ['name' => 'test', 'operator' => 'Does not equal', 'value' => 'test_tag'] + ] + ], + 'result' => [ + 'Host for tags filtering - clone', + 'Host for tags filtering - update', + 'Simple form test host', + 'SLA reports host', + 'Template inheritance test host', + 'ЗАББИКС Сервер' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'And/Or', + 'tags' => [ + ['name' => 'test', 'operator' => 'Does not equal', 'value' => 'test_tag'], + ['name' => 'action', 'operator' => 'Does not equal', 'value' => 'clone'] + ] + ], + 'result' => [ + 'Host for tags filtering - update', + 'Simple form test host', + 'SLA reports host', + 'Template inheritance test host', + 'ЗАББИКС Сервер' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'Or', + 'tags' => [ + ['name' => 'test', 'operator' => 'Does not equal', 'value' => 'test_tag'], + ['name' => 'action', 'operator' => 'Does not equal', 'value' => 'clone'] + ] + ], + 'result' => [ + 'Host for tags filtering', + 'Host for tags filtering - clone', + 'Host for tags filtering - update', + 'Simple form test host', + 'SLA reports host', + 'Template inheritance test host', + 'ЗАББИКС Сервер' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'And/Or', + 'tags' => [ + ['name' => 'tag', 'operator' => 'Does not contain', 'value' => 'host'] + ] + ], + 'result' => [ + 'Simple form test host', + 'SLA reports host', + 'Template inheritance test host', + 'ЗАББИКС Сервер' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'Or', + 'tags' => [ + ['name' => 'tag', 'operator' => 'Does not contain', 'value' => 'host'] + ] + ], + 'result' => [ + 'Simple form test host', + 'SLA reports host', + 'Template inheritance test host', + 'ЗАББИКС Сервер' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'And/Or', + 'tags' => [ + ['name' => 'action', 'operator' => 'Does not contain', 'value' => 'clone'], + ['name' => 'tag', 'operator' => 'Does not contain', 'value' => 'host'] + ] + ], + 'result' => [ + 'Simple form test host', + 'SLA reports host', + 'Template inheritance test host', + 'ЗАББИКС Сервер' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'Or', + 'tags' => [ + ['name' => 'action', 'operator' => 'Does not contain', 'value' => 'clone'], + ['name' => 'tag', 'operator' => 'Does not contain', 'value' => 'host'] + ] + ], + 'result' => [ + 'Host for tags filtering', + 'Host for tags filtering - update', + 'Simple form test host', + 'SLA reports host', + 'Template inheritance test host', + 'ЗАББИКС Сервер' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'And/Or', + 'tags' => [ + ['name' => 'action', 'operator' => 'Does not contain', 'value' => 'clone'], + ['name' => 'tag', 'operator' => 'Equals', 'value' => 'host'] + ] + ], + 'result' => [ + 'Host for tags filtering - update' + ] + ] + ], + [ + [ + 'tag_options' => [ + 'type' => 'And/Or', + 'tags' => [ + ['name' => 'action', 'operator' => 'Does not contain', 'value' => 'clone'], + ['name' => 'tag', 'operator' => 'Exists'] + ] + ], + 'result' => [ + 'Host for tags filtering', + 'Host for tags filtering - update' + ] + ] + ] + ]; + } + + /** + * @dataProvider getTagsFilterData + */ + public function testPageMonitoringHosts_TagsFilter($data) { + $this->page->login()->open('zabbix.php?port=10051&action=host.view&groupids%5B%5D=4'); + $form = $this->query('name:zbx_filter')->waitUntilPresent()->asForm()->one(); + $table = $this->query('class:list-table')->waitUntilPresent()->one(); + $form->fill(['id:evaltype_0' => $data['tag_options']['type']]); + $this->setTagSelector('id:tags_0'); + $this->setTags($data['tag_options']['tags']); + $this->query('button:Apply')->one()->waitUntilClickable()->click(); + $table->waitUntilReloaded(); + $this->assertTableDataColumn(CTestArrayHelper::get($data, 'result', [])); + $this->query('button:Reset')->one()->waitUntilClickable()->click(); + $table->waitUntilReloaded(); + } + + public function testPageMonitoringHosts_ResetButtonCheck() { + $this->page->login()->open('zabbix.php?action=host.view&filter_reset=1'); + $form = $this->query('name:zbx_filter')->waitUntilPresent()->asForm()->one(); + $this->page->waitUntilReady(); + $table = $this->query('class:list-table')->asTable()->one(); + + // Check table contents before filtering. + $start_rows_count = $table->getRows()->count(); + $this->assertTableStats($start_rows_count); + $start_contents = $this->getTableColumnData('Name'); + + // Filter hosts. + $form->fill(['Name' => 'Empty host']); + $this->query('button:Apply')->one()->waitUntilClickable()->click(); + $table->waitUntilReloaded(); + + // Check that filtered count matches expected. + $this->assertEquals(1, $table->getRows()->count()); + $this->assertTableStats(1); + + // After pressing reset button, check that previous hosts are displayed again. + $this->query('button:Reset')->one()->click(); + $table->waitUntilReloaded(); + $reset_rows_count = $table->getRows()->count(); + $this->assertEquals($start_rows_count, $reset_rows_count); + $this->assertTableStats($reset_rows_count); + $this->assertEquals($start_contents, $this->getTableColumnData('Name')); + } + + // Checking that Show suppressed problems filter works. + public function testPageMonitoringHosts_ShowSuppresed() { + $this->page->login()->open('zabbix.php?action=host.view&filter_reset=1'); + $form = $this->query('name:zbx_filter')->waitUntilPresent()->asForm()->one(); + $this->page->waitUntilReady(); + $table = $this->query('class:list-table')->asTable()->one(); + $form->fill(['Severity' => ['Not classified', 'Information', 'Warning', 'Average', 'High', 'Disaster']]); + $this->query('button:Apply')->one()->waitUntilClickable()->click(); + $table->waitUntilReloaded(); + foreach ([true, false] as $show) { + $form->query('id:show_suppressed_0')->asCheckbox()->one()->fill($show); + $this->query('button:Apply')->one()->waitUntilClickable()->click(); + $table->waitUntilReloaded(); + $this->assertTrue($table->findRow('Name', 'Host for suppression')->isPresent($show)); + } + $this->query('button:Reset')->one()->click(); + } + + public static function getEnabledLinksData() { + return [ + [ + [ + 'name' => 'Dynamic widgets H1', + 'link_name' => 'Graphs', + 'page_header' => 'Graphs' + ] + ], + [ + [ + 'name' => 'Host ZBX6663', + 'link_name' => 'Web', + 'page_header' => 'Web monitoring' + ] + ], + [ + [ + 'name' => 'ЗАББИКС Сервер', + 'link_name' => 'Dashboards', + 'page_header' => 'Network interfaces' + ] + ], + [ + [ + 'name' => 'Empty host', + 'link_name' => 'Problems', + 'page_header' => 'Problems' + ] + ], + [ + [ + 'name' => 'Available host', + 'link_name' => 'Latest data', + 'page_header' => 'Latest data' + ] + ] + ]; + } + + /** + * @dataProvider getEnabledLinksData + * + * Check enabled links and that correct host is displayed. + */ + public function testPageMonitoringHosts_EnabledLinks($data) { + $this->page->login()->open('zabbix.php?action=host.view&filter_reset=1'); + $form = $this->query('name:zbx_filter')->waitUntilPresent()->asForm()->one(); + switch ($data['name']) { + case 'Dynamic widgets H1': + case 'Host ZBX6663': + case 'Available host': + $this->selectLink($data['name'], $data['link_name'], $data['page_header']); + $this->page->waitUntilReady(); + $filter_form = $this->query('name:zbx_filter')->waitUntilPresent()->asForm()->one(); + $filter_form->checkValue(['Hosts' => $data['name']]); + $this->query('button:Reset')->one()->click(); + break; + case 'ЗАББИКС Сервер': + $this->selectLink($data['name'], $data['link_name'], $data['page_header']); + break; + case 'Empty host': + $this->page->waitUntilReady(); + $this->query('xpath://td/a[text()="'.$data['name'].'"]/following::td/a[text()="'.$data['link_name'].'"]') + ->one()->click(); + $this->page->waitUntilReady(); + $this->page->assertHeader($data['page_header']); + $form->checkValue(['Hosts' => $data['name']]); + $this->query('button:Reset')->one()->click(); + break; + } + } + + public static function getHostContextMenuData() { + return [ + [ + [ + 'name' => 'ЗАББИКС Сервер', + 'disabled' => ['Web'], + 'titles' => [ + 'Dashboards', + 'Problems', + 'Latest data', + 'Graphs', + 'Web', + 'Inventory', + 'Host', + 'Items', + 'Triggers', + 'Discovery', + 'Web', + 'Detect operating system', + 'Ping', + 'Script for Clone', + 'Script for Delete', + 'Script for Update', + 'Traceroute' + ] + ] + ], + [ + [ + 'name' => 'Available host', + 'disabled' => ['Web', 'Graphs', 'Dashboards'], + 'titles' => [ + 'Dashboards', + 'Problems', + 'Latest data', + 'Graphs', + 'Web', + 'Inventory', + 'Host', + 'Items', + 'Triggers', + 'Discovery', + 'Web', + 'Detect operating system', + 'Ping', + 'Script for Clone', + 'Script for Delete', + 'Script for Update', + 'Traceroute' + ] + ] + ], + [ + [ + 'name' => 'Dynamic widgets H1', + 'disabled' => ['Dashboards', 'Web'], + 'titles' => [ + 'Dashboards', + 'Problems', + 'Latest data', + 'Graphs', + 'Web', + 'Inventory', + 'Host', + 'Items', + 'Triggers', + 'Discovery', + 'Web', + 'Detect operating system', + 'Ping', + 'Script for Clone', + 'Script for Delete', + 'Script for Update', + 'Traceroute' + ] + ] + ], + [ + [ + 'name' => 'Host ZBX6663', + 'disabled' => ['Dashboards'], + 'titles' => [ + 'Dashboards', + 'Problems', + 'Latest data', + 'Graphs', + 'Web', + 'Inventory', + 'Host', + 'Items', + 'Triggers', + 'Discovery', + 'Web', + 'Detect operating system', + 'Ping', + 'Script for Clone', + 'Script for Delete', + 'Script for Update', + 'Traceroute' + ] + ] + ] + ]; + } + + /** + * @dataProvider getHostContextMenuData + * + * Click on host name from the table and check displayed popup context. + */ + public function testPageMonitoringHosts_HostContextMenu($data) { + $this->page->login()->open('zabbix.php?action=host.view&filter_reset=1')->waitUntilReady(); + $row = $this->query('class:list-table')->asTable()->one()->findRow('Name', $data['name']); + $row->query('link', $data['name'])->one()->click(); + $this->page->waitUntilReady(); + $popup = CPopupMenuElement::find()->waitUntilVisible()->one(); + $this->assertEquals(['VIEW', 'CONFIGURATION', 'SCRIPTS'], $popup->getTitles()->asText()); + $this->assertTrue($popup->hasItems($data['titles'])); + + foreach ($data['disabled'] as $disabled) { + $this->assertTrue($popup->query('xpath://a[@aria-label="View, '. + $disabled.'" and @class="menu-popup-item disabled"]')->one()->isPresent() + ); + } + } + + /** + * Check number of problems displayed on Hosts and Problems page. + */ + public function testPageMonitoringHosts_CountProblems() { + $this->page->login(); + $hosts_names = ['1_Host_to_check_Monitoring_Overview', 'ЗАББИКС Сервер', 'Host for tag permissions', 'Empty host']; + foreach ($hosts_names as $host) { + $this->page->open('zabbix.php?action=host.view&name='.$host)->waitUntilReady(); + $table = $this->query('class:list-table')->asTable()->one(); + + // Get number of problems displayed on icon and it severity level. + if ($host !== 'Empty host') { + $icons = $table->query('xpath:.//*[contains(@class, "problem-icon-list-item")]')->all(); + $results = []; + + foreach ($icons as $icon) { + $amount = $icon->getText(); + $severity = $icon->getAttribute('title'); + $results[$severity] = $amount; + } + } + else { + $this->assertEquals('Problems', $table->getRow(0)->getColumn('Problems')->getText()); + } + + // Navigate to Problems page from Hosts. + $table->getRow(0)->getColumn('Problems')->query('xpath:.//a')->one()->click(); + $this->page->waitUntilReady(); + $this->page->assertTitle('Problems'); + $this->query('name:zbx_filter')->waitUntilPresent()->asForm()->one()->checkValue(['Hosts' => $host]); + + // Count problems of each severity and compare it with problems count from Hosts page. + if ($host !== 'Empty host') { + foreach ($results as $severity => $count) { + $problem_count = $table->query('xpath:.//td[contains(@class, "-bg") and text()="'.$severity.'"]') + ->all()->count(); + $this->assertEquals(strval($problem_count), $count); + } + } + + // Check that table is empty and No data found displayed. + else { + $this->assertTableData(); + } + } + } + + public function prepareUpdateData() { + $response = CDataHelper::call('host.update', ['hostid' => '99013', 'status' => 1]); + $this->assertArrayHasKey('hostids', $response); + self::$hostid = $response['hostids'][0]; + } + + /** + * @backup hosts + * + * @onBeforeOnce prepareUpdateData + */ + public function testPageMonitoringHosts_TableSorting() { + // Sort by name and status. + $this->page->login()->open('zabbix.php?action=host.view&filter_reset=1')->waitUntilReady(); + foreach (['Name', 'Status'] as $listing) { + $query = $this->query('xpath://a[@href and text()="'.$listing.'"]'); + $query->one()->click(); + $this->page->waitUntilReady(); + $after_listing = $this->getTableColumnData($listing); + $query->one()->click(); + $this->page->waitUntilReady(); + $this->assertEquals(array_reverse($after_listing), $this->getTableColumnData($listing)); + } + } + + /** + * Clicking on link from the table and then checking page header + * + * @param string $host_name Host name + * @param string $column Column name + * @param string $page_header Page header name + */ + private function selectLink($host_name, $column, $page_header) { + $this->page->waitUntilReady(); + $this->query('class:list-table')->asTable()->one()->findRow('Name', $host_name)->query('link', $column)->one()->click(); + $this->page->waitUntilReady(); + if ($page_header !== null) { + $this->page->assertHeader($page_header); + } + if ($host_name === 'Dynamic widgets H1' && $this->query('xpath://li[@aria-labelledby="ui-id-2"'. + ' and @aria-selected="false"]')->exists()) { + $this->query('id:ui-id-2')->one()->click(); + } + if ($host_name === 'ЗАББИКС Сервер' && $column === 'Dashboards') { + $this->assertEquals('ЗАББИКС Сервер', $this->query('xpath://ul[@class="breadcrumbs"]/li[2]')->one()->getText()); + } + } + + public static function getCheckCountersData() { + return [ + [ + [ + 'host' => 'Host ZBX6663', + 'counters' => [ + [ + 'column' => 'Latest data', + 'counter' => 14 + ], + [ + 'column' => 'Problems', + 'counter' => null + ], + [ + 'column' => 'Graphs', + 'counter' => 2 + ], + [ + 'column' => 'Web', + 'counter' => 2 + ] + ] + ] + ], + [ + [ + 'host' => 'ЗАББИКС Сервер', + 'counters' => [ + [ + 'column' => 'Dashboards', + 'counter' => 4 + ], + [ + 'column' => 'Problems', + 'counter' => "1\n5" + ] + ] + ] + ] + ]; + } + + /** + * @dataProvider getCheckCountersData + */ + public function testPageMonitoringHosts_CheckCounters($data) { + $this->page->login()->open('zabbix.php?action=host.view')->waitUntilReady(); + $row = $this->query('class:list-table')->asTable()->one()->findRow('Name', $data['host']); + + foreach ($data['counters'] as $counter) { + if ($counter['column'] === 'Problems') { + $text = ($counter['counter'] === null) ? $counter['column'] : $counter['counter']; + $this->assertEquals($text, $row->getColumn($counter['column'])->getText()); + } + else { + $this->assertEquals($counter['column'].' '.$counter['counter'], + $row->getColumn($counter['column'])->getText() + ); + } + } + } +} |