You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
zabbix/ui/tests/selenium/graphs/testPageMonitoringHostsGrap...

951 lines
21 KiB

1 year ago
<?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';
/**
* @backup profiles, hosts
*
* @onBefore prepareGraphsData
*/
class testPageMonitoringHostsGraph extends CWebTest {
use TableTrait;
/**
* ID of the item used for graph creation and check.
*
* @var integer
*/
private static $itemids;
/**
* ID of the graph used for result check.
*
* @var integer
*/
private static $graphids;
public static function prepareGraphsData() {
CDataHelper::call('host.create', [
[
'host' => 'Host_for_monitoring_graphs_1',
'groups' => [
'groupid' => 4
],
'interfaces' => [
'type' => 1,
'main' => 1,
'useip' => 1,
'ip' => '127.0.0.1',
'dns' => '',
'port' => '10050'
]
],
[
'host' => 'Host_for_monitoring_graphs_2',
'groups' => [
'groupid' => 4
],
'interfaces' => [
'type' => 1,
'main' => 1,
'useip' => 1,
'ip' => '127.0.0.1',
'dns' => '',
'port' => '10050'
]
]
]);
$hostid = CDataHelper::getIds('host');
CDataHelper::call('item.create', [
[
'name' => 'Item_for_graph_1',
'key_' => 'trap_1',
'hostid' => $hostid['Host_for_monitoring_graphs_1'],
'type' => 2,
'value_type' => 0,
'tags' => [
[
'tag' => 'tag_name_1',
'value' => 'tag_value_1'
]
]
],
[
'name' => 'Item_for_graph_2',
'key_' => 'trap_2',
'hostid' => $hostid['Host_for_monitoring_graphs_1'],
'type' => 2,
'value_type' => 0,
'tags' => [
[
'tag' => 'tag_name_2',
'value' => 'tag_value_2'
]
]
],
[
'name' => 'Item_for_graph_3',
'key_' => 'trap_3',
'hostid' => $hostid['Host_for_monitoring_graphs_1'],
'type' => 2,
'value_type' => 0,
'tags' => [
[
'tag' => 'tag_name_3',
'value' => 'tag_value_3'
]
]
],
[
'name' => 'Item_for_graph_4',
'key_' => 'trap_4',
'hostid' => $hostid['Host_for_monitoring_graphs_2'],
'type' => 2,
'value_type' => 0
]
]);
self::$itemids = CDataHelper::getIds('name');
CDataHelper::call('graph.create', [
[
'name' => 'Graph_1',
'gitems' => [
[
'itemid' => self::$itemids['Item_for_graph_1'],
'color' => '00AA00'
]
]
],
[
'name' => 'Graph_2',
'gitems' => [
[
'itemid' => self::$itemids['Item_for_graph_2'],
'color' => '00AA00'
],
[
'itemid' => self::$itemids['Item_for_graph_2'],
'color' => '00AA00'
]
]
],
[
'name' => 'Graph_3',
'gitems' => [
[
'itemid' => self::$itemids['Item_for_graph_2'],
'color' => '00AA00'
],
[
'itemid' => self::$itemids['Item_for_graph_3'],
'color' => '00AA00'
]
]
],
[
'name' => 'Graph_4',
'gitems' => [
[
'itemid' => self::$itemids['Item_for_graph_4'],
'color' => '00AA00'
]
]
]
]);
self::$graphids = CDataHelper::getIds('name');
}
/**
* Check graph page layout.
*/
public function testPageMonitoringHostsGraph_Layout() {
$this->page->login()->open('zabbix.php?view_as=showgraph&action=charts.view&filter_search_type=0&filter_set=1')->waitUntilReady();
$this->page->assertHeader('Graphs');
$this->page->assertTitle('Custom graphs');
// If the time selector is not visible - enable it.
if ($this->query('xpath://li[@aria-labelledby="ui-id-1" and @aria-selected="false"]')->exists()) {
$this->query('id:ui-id-1')->one()->click();
}
// Check that time selector set to display Last hour data.
$this->assertTrue($this->query('xpath://a[@data-label="Last 1 hour"]')->one()->hasClass('selected'));
// Enable filter and check filter labels.
$this->query('id:ui-id-2')->one()->click();
$form = $this->query('name:zbx_filter')->asform()->one();
$this->assertEquals(['Hosts', 'Name', 'Show'], $form->getLabels()->asText());
// Check Show parameters and default value.
$radio = $this->query('id:filter_show')->asSegmentedRadio()->one();
$this->assertEquals(['All graphs', 'Host graphs', 'Simple graphs'], $radio->getLabels()->asText());
$this->assertEquals('All graphs', $radio->getSelected());
// Check placeholder for Hosts.
$this->assertEquals('type here to search', $form->getField('id:filter_hostids__ms')->getAttribute('placeholder'));
// Check filter buttons.
foreach (['Apply', 'Reset'] as $button) {
$this->assertTrue($form->query('xpath:.//div[@class="filter-forms"]/button[text()="'.$button.'"]')
->one()->isClickable()
);
}
// Check that the table is empty by default.
$this->assertEquals('Specify host to see the graphs.', $this->query('class:nothing-to-show')->one()->getText());
}
public static function getCheckFilterData() {
return [
// #0 One host with several items and graphs. Show all graphs.
[
[
'filter' => [
'Hosts' => 'Host_for_monitoring_graphs_1',
'Show' => 'All graphs'
],
'graphs_amount' => 6,
'graph_names' => [
'Graph_1',
'Graph_2',
'Graph_3'
],
'item_names' => [
'Item_for_graph_1',
'Item_for_graph_2',
'Item_for_graph_3'
]
]
],
// #1 Show host graphs for host.
[
[
'filter' => [
'Hosts' => 'Host_for_monitoring_graphs_1',
'Show' => 'Host graphs'
],
'graphs_amount' => 3,
'graph_names' => [
'Graph_1',
'Graph_2',
'Graph_3'
]
]
],
// #2 Show simple graphs for host.
[
[
'filter' => [
'Hosts' => 'Host_for_monitoring_graphs_1',
'Show' => 'Simple graphs'
],
'graphs_amount' => 3,
'item_names' => [
'Item_for_graph_1',
'Item_for_graph_2',
'Item_for_graph_3'
]
]
],
// #3 Show all graphs for host with graph name.
[
[
'filter' => [
'Hosts' => 'Host_for_monitoring_graphs_1',
'Name' => 'Graph_2',
'Show' => 'All graphs'
],
'graphs_amount' => 3,
'graph_names' => [
'Graph_2',
'Graph_3'
],
'item_names' => [
'Item_for_graph_2'
]
]
],
// #4 Show host graphs for host with graph name.
[
[
'filter' => [
'Hosts' => 'Host_for_monitoring_graphs_1',
'Name' => 'Graph_2',
'Show' => 'Host graphs'
],
'graphs_amount' => 2,
'graph_names' => [
'Graph_2',
'Graph_3'
]
]
],
// #5 Show simple graphs for host with graph name.
[
[
'filter' => [
'Hosts' => 'Host_for_monitoring_graphs_1',
'Name' => 'Graph_2',
'Show' => 'Simple graphs'
],
'graphs_amount' => 1,
'item_names' => [
'Item_for_graph_2'
]
]
],
// #6 Show all graphs with not existing graph name.
[
[
'filter' => [
'Hosts' => 'Host_for_monitoring_graphs_1',
'Name' => 'Nothing here',
'Show' => 'All graphs'
]
]
],
// #7 Show host graphs with not existing graph name.
[
[
'filter' => [
'Hosts' => 'Host_for_monitoring_graphs_1',
'Name' => 'Nothing here',
'Show' => 'Host graphs'
]
]
],
// #8 Show simple graphs with not existing graph name.
[
[
'filter' => [
'Hosts' => 'Host_for_monitoring_graphs_1',
'Name' => 'Nothing here',
'Show' => 'Simple graphs'
]
]
],
// #9 Show all graphs with partial graph name.
[
[
'filter' => [
'Hosts' => 'Host_for_monitoring_graphs_1',
'Name' => 'gr',
'Show' => 'All graphs'
],
'graphs_amount' => 6,
'graph_names' => [
'Graph_1',
'Graph_2',
'Graph_3'
],
'item_names' => [
'Item_for_graph_1',
'Item_for_graph_2',
'Item_for_graph_3'
]
]
],
// #10 Show host graphs with partial graph name.
[
[
'filter' => [
'Hosts' => 'Host_for_monitoring_graphs_1',
'Name' => 'gr',
'Show' => 'Host graphs'
],
'graphs_amount' => 3,
'graph_names' => [
'Graph_1',
'Graph_2',
'Graph_3'
]
]
],
// #11 Show simple graphs with partial graph name.
[
[
'filter' => [
'Hosts' => 'Host_for_monitoring_graphs_1',
'Name' => 'gr',
'Show' => 'Simple graphs'
],
'graphs_amount' => 3,
'item_names' => [
'Item_for_graph_1',
'Item_for_graph_2',
'Item_for_graph_3'
]
]
],
// #12 Show graphs without Hosts - all graphs.
[
[
'filter' => [
'Show' => 'All graphs'
]
]
],
// #13 Show graphs without Hosts - host graphs.
[
[
'filter' => [
'Show' => 'Host graphs'
]
]
],
// #14 Show graphs without Hosts - simple graphs.
[
[
'filter' => [
'Show' => 'Simple graphs'
]
]
],
// #15 Show graphs with correct graph name and without Hosts - all graphs.
[
[
'filter' => [
'Name' => 'Graph_2',
'Show' => 'All graphs'
]
]
],
// #16 Show graphs with correct graph name and without Hosts - host graphs.
[
[
'filter' => [
'Name' => 'Graph_2',
'Show' => 'Host graphs'
]
]
],
// #17 Show graphs with correct graph name and without Hosts - simple graphs.
[
[
'filter' => [
'Name' => 'Graph_2',
'Show' => 'Simple graphs'
]
]
],
// #18 Two hosts with several items and graphs. Show all graphs.
[
[
'filter' => [
'Hosts' => [
'Host_for_monitoring_graphs_1',
'Host_for_monitoring_graphs_2'
],
'Show' => 'All graphs'
],
'graphs_amount' => 8,
'graph_names' => [
'Graph_1',
'Graph_2',
'Graph_3',
'Graph_4'
],
'item_names' => [
'Item_for_graph_1',
'Item_for_graph_2',
'Item_for_graph_3',
'Item_for_graph_4'
]
]
],
// #19 Two hosts with several items and graphs. Show Host graphs.
[
[
'filter' => [
'Hosts' => [
'Host_for_monitoring_graphs_1',
'Host_for_monitoring_graphs_2'
],
'Show' => 'Host graphs'
],
'graphs_amount' => 4,
'graph_names' => [
'Graph_1',
'Graph_2',
'Graph_3',
'Graph_4'
]
]
],
// #20 Two hosts with several items and graphs. Show Simple graphs.
[
[
'filter' => [
'Hosts' => [
'Host_for_monitoring_graphs_1',
'Host_for_monitoring_graphs_2'
],
'Show' => 'Simple graphs'
],
'graphs_amount' => 4,
'item_names' => [
'Item_for_graph_1',
'Item_for_graph_2',
'Item_for_graph_3',
'Item_for_graph_4'
]
]
],
// #21 Graph from another host.
[
[
'filter' => [
'Hosts' => 'Host_for_monitoring_graphs_1',
'Name' => 'Graph_4'
]
]
],
// #22 All graphs - filter by Tags.
[
[
'filter' => [
'Show' => 'All graphs'
],
'subfilter' => [
'Tags' => [
'tag_name_2'
]
],
'graphs_amount' => 3,
'graph_names' => [
'Graph_2',
'Graph_3'
],
'item_names' => [
'Item_for_graph_2'
]
]
],
// #23 Host graphs - filter by Tags.
[
[
'filter' => [
'Show' => 'Host graphs'
],
'subfilter' => [
'Tags' => [
'tag_name_2'
]
],
'graphs_amount' => 2,
'graph_names' => [
'Graph_2',
'Graph_3'
]
]
],
// #24 Simple graphs - filter by Tags.
[
[
'filter' => [
'Show' => 'Simple graphs'
],
'subfilter' => [
'Tags' => [
'tag_name_2'
]
],
'graphs_amount' => 1,
'item_names' => [
'Item_for_graph_2'
]
]
],
// #25 All graphs - filter by 2 Tags.
[
[
'filter' => [
'Show' => 'All graphs'
],
'subfilter' => [
'Tags' => [
'tag_name_2',
'tag_name_1'
]
],
'graphs_amount' => 5,
'graph_names' => [
'Graph_1',
'Graph_2',
'Graph_3'
],
'item_names' => [
'Item_for_graph_1',
'Item_for_graph_2'
]
]
],
// #26 Host graphs - filter by 2 Tags.
[
[
'filter' => [
'Show' => 'Host graphs'
],
'subfilter' => [
'Tags' => [
'tag_name_2',
'tag_name_1'
]
],
'graphs_amount' => 3,
'graph_names' => [
'Graph_1',
'Graph_2',
'Graph_3'
]
]
],
// #27 Simple graphs - filter by 2 Tags.
[
[
'filter' => [
'Show' => 'Simple graphs'
],
'subfilter' => [
'Tags' => [
'tag_name_2',
'tag_name_1'
]
],
'graphs_amount' => 2,
'item_names' => [
'Item_for_graph_1',
'Item_for_graph_2'
]
]
],
// #28 All graphs - filter by Tags and Tag value.
[
[
'filter' => [
'Show' => 'All graphs'
],
'subfilter' => [
'Tags' => [
'tag_name_2'
],
'Tag values' => [
'tag_value_3'
]
],
'graphs_amount' => 1,
'graph_names' => [
'Graph_3'
]
]
],
// #29 Host graphs - filter by Tag and Tag value.
[
[
'filter' => [
'Show' => 'Host graphs'
],
'subfilter' => [
'Tags' => [
'tag_name_2'
],
'Tag values' => [
'tag_value_3'
]
],
'graphs_amount' => 1,
'graph_names' => [
'Graph_2'
]
]
],
// #30 Simple graphs - filter by Tag and Tag value.
[
[
'filter' => [
'Show' => 'Simple graphs'
],
'subfilter' => [
'Tags' => [
'tag_name_2'
],
'Tag values' => [
'tag_value_3'
]
]
]
],
// #31 All graphs - filter by 2 Tags and Tag value.
[
[
'filter' => [
'Show' => 'All graphs'
],
'subfilter' => [
'Tags' => [
'tag_name_1',
'tag_name_2'
],
'Tag values' => [
'tag_value_3'
]
],
'graphs_amount' => 1,
'graph_names' => [
'Graph_3'
]
]
],
// #32 Host graphs - filter by 2 Tags and Tag value.
[
[
'filter' => [
'Show' => 'Host graphs'
],
'subfilter' => [
'Tags' => [
'tag_name_1',
'tag_name_2'
],
'Tag values' => [
'tag_value_3'
]
],
'graphs_amount' => 1,
'graph_names' => [
'Graph_3'
]
]
],
// #33 Simple graphs - filter by 2 Tags and Tag value.
[
[
'filter' => [
'Show' => 'Simple graphs'
],
'subfilter' => [
'Tags' => [
'tag_name_1',
'tag_name_2'
],
'Tag values' => [
'tag_value_3'
]
]
]
],
// #34 All graphs - filter by 2 Tags and 2 Tag value.
[
[
'filter' => [
'Show' => 'All graphs'
],
'subfilter' => [
'Tags' => [
'tag_name_1',
'tag_name_2'
],
'Tag values' => [
'tag_value_2',
'tag_value_1'
]
],
'graphs_amount' => 5,
'graph_names' => [
'Graph_1',
'Graph_2',
'Graph_3'
],
'item_names' => [
'Item_for_graph_1',
'Item_for_graph_2'
]
]
],
// #35 Host graphs - filter by 2 Tags and 2 Tag value.
[
[
'filter' => [
'Show' => 'Host graphs'
],
'subfilter' => [
'Tags' => [
'tag_name_1',
'tag_name_2'
],
'Tag values' => [
'tag_value_2',
'tag_value_1'
]
],
'graphs_amount' => 3,
'graph_names' => [
'Graph_1',
'Graph_2',
'Graph_3'
]
]
],
// #36 Simple graphs - filter by 2 Tags and 2 Tag value.
[
[
'filter' => [
'Show' => 'Simple graphs'
],
'subfilter' => [
'Tags' => [
'tag_name_1',
'tag_name_2'
],
'Tag values' => [
'tag_value_2',
'tag_value_1'
]
],
'graphs_amount' => 2,
'item_names' => [
'Item_for_graph_1',
'Item_for_graph_2'
]
]
]
];
}
/**
* Check graph page filter.
*
* @dataProvider getCheckFilterData
*/
public function testPageMonitoringHostsGraph_CheckFilter($data) {
$this->page->login()->open('zabbix.php?view_as=showgraph&action=charts.view&from=now-1h&to='.
'now&filter_search_type=0&filter_set=1')->waitUntilReady();
// If the filter is not visible - enable it.
if ($this->query('xpath://li[@aria-labelledby="ui-id-2" and @aria-selected="false"]')->exists()) {
$this->query('id:ui-id-2')->one()->click();
}
$form = $this->query('name:zbx_filter')->asForm()->one();
$form->query('button:Reset')->one()->click();
// Filter using tags.
if (array_key_exists('subfilter', $data)) {
$form->fill(['Hosts' => 'Host_for_monitoring_graphs_1', 'Show' => 'All graphs'])->submit();
$this->page->waitUntilReady();
// Click on subfilter.
foreach ($data['subfilter'] as $header => $values) {
foreach ($values as $value) {
$this->query("xpath://h3[text()=".CXPathHelper::escapeQuotes($header)."]/..//a[text()=".
CXPathHelper::escapeQuotes($value)."]")->waitUntilClickable()->one()->click();
$this->query("xpath://h3[text()=".CXPathHelper::escapeQuotes($header)."]/..//a[text()=".
CXPathHelper::escapeQuotes($value)."]/ancestor::span")->one()->
waitUntilAttributesPresent(['class' => 'subfilter subfilter-enabled']);
$this->page->waitUntilReady();
}
}
}
$form->fill($data['filter'])->submit();
$this->page->waitUntilReady();
// Check result amount and graph/item ids.
if (array_key_exists('graphs_amount', $data)) {
$this->assertEquals($data['graphs_amount'],
$this->query('xpath://tbody/tr/div[@class="flickerfreescreen"]')->all()->count());
$this->assertTableStats($data['graphs_amount']);
// Find links with graphs and items ids.
$graph_sources = [];
foreach ($this->query("xpath://tbody//img")->all() as $source) {
$graph_sources[] = $source->getAttribute('src');
}
// Check that displayed graphs have correct ids.
if (array_key_exists('graph_name', $data)) {
$this->checkGraphsIds($data['graph_names'], $graph_sources);
}
// Check that displayed item graphs have correct ids.
if (array_key_exists('item_names', $data)) {
$this->checkGraphsIds($data['item_names'], $graph_sources, false);
}
}
else {
$message = (array_key_exists('Hosts', $data['filter']) || array_key_exists('subfilter', $data))
? 'No data found.'
: 'Specify host to see the graphs.';
$this->assertEquals($message, $this->query('class:nothing-to-show')->one()->getText());
}
}
/**
* Check graph page in kiosk mode.
*/
public function testPageMonitoringHostsGraph_KioskMode() {
$this->page->login()->open('zabbix.php?view_as=showgraph&action=charts.view&from=now-1h&to'.
'=now&filter_search_type=0&filter_set=1')->waitUntilReady();
// Check Kiosk mode.
$this->query('xpath://button[@title="Kiosk mode"]')->one()->click();
$this->page->waitUntilReady();
// Check that Header and Filter disappeared.
$this->query('xpath://h1[@id="page-title-general"]')->waitUntilNotVisible();
$this->assertFalse($this->query('xpath://div[@aria-label="Filter"]')->exists());
// Return to normal view.
$this->query('xpath://button[@title="Normal view"]')->waitUntilPresent()->one()->click(true);
$this->page->waitUntilReady();
// Check that Header and Filter are visible again.
$this->query('xpath://h1[@id="page-title-general"]')->waitUntilVisible();
$this->assertTrue($this->query('xpath://div[@aria-label="Filter"]')->exists());
}
/**
* Find and check graphs and items ids in graphs links.
*
* @param array $names items or graph names list
* @param array $graph_sources displayed graphs src attribute values
* @param boolean $graph true if graph id need to be checked, false if simple graph id need to be checked
*/
private function checkGraphsIds($names, $graph_sources, $graph = true) {
foreach ($names as $name) {
$array_count = count($graph_sources);
$id = ($graph) ? self::$graphids[$name] : self::$itemids[$name];
foreach ($graph_sources as $source) {
if (str_contains($source, '='.$id)) {
$graph_sources = array_values(array_diff($graph_sources, [$source]));
}
}
$this->assertEquals($array_count - 1, count($graph_sources));
}
}
}