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.

463 lines
14 KiB

<?php
/*
** Zabbix
** Copyright (C) 2001-2023 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/CLegacyWebTest.php';
require_once dirname(__FILE__).'/../traits/TagTrait.php';
require_once dirname(__FILE__).'/../traits/TableTrait.php';
require_once dirname(__FILE__).'/../behaviors/CMessageBehavior.php';
/**
* @backup profiles
*
* @dataSource TagFilter, EntitiesTags, WebScenarios
*/
class testPageTemplates extends CLegacyWebTest {
public $templateName = 'Huawei OceanStor 5300 V5 by SNMP';
use TagTrait;
use TableTrait;
/**
* Attach MessageBehavior to the test.
*
* @return array
*/
public function getBehaviors() {
return ['class' => CMessageBehavior::class];
}
public static function allTemplates() {
return CDBHelper::getRandomizedDataProvider(
'SELECT * FROM hosts WHERE status IN ('.HOST_STATUS_TEMPLATE.')', 25
);
}
public function testPageTemplates_CheckLayout() {
$this->zbxTestLogin('zabbix.php?action=template.list');
$this->zbxTestCheckTitle('Configuration of templates');
$this->zbxTestCheckHeader('Templates');
$table = $this->query('class:list-table')->asTable()->one();
$filter = $this->query('name:zbx_filter')->asForm()->one();
$filter->getField('Template groups')->select('Templates/SAN');
$filter->submit();
$table->waitUntilReloaded();
$this->zbxTestTextPresent($this->templateName);
$headers = ['', 'Name', 'Hosts', 'Items', 'Triggers', 'Graphs', 'Dashboards', 'Discovery', 'Web', 'Vendor',
'Version', 'Linked templates', 'Linked to templates', 'Tags'
];
$this->assertSame($headers, $table->getHeadersText());
foreach (['Export', 'Mass update', 'Delete', 'Delete and clear'] as $button) {
$element = $this->query('button', $button)->one();
$this->assertTrue($element->isPresent());
$this->assertFalse($element->isEnabled());
}
$this->zbxTestAssertElementPresentXpath("//div[@class='table-stats'][contains(text(),'Displaying')]");
}
/**
* @dataProvider allTemplates
*/
public function testPageTemplates_SimpleUpdate($template) {
$host = $template['host'];
$name = $template['name'];
$sqlTemplate = "select * from hosts where host='$host'";
$oldHashTemplate = CDBHelper::getHash($sqlTemplate);
$sqlHosts =
'SELECT hostid,proxyid,host,status,ipmi_authtype,ipmi_privilege,ipmi_username,'.
'ipmi_password,maintenanceid,maintenance_status,maintenance_type,maintenance_from,'.
'name,flags,templateid,description,tls_connect,tls_accept'.
' FROM hosts'.
' ORDER BY hostid';
$oldHashHosts = CDBHelper::getHash($sqlHosts);
$sqlItems = "select * from items order by itemid";
$oldHashItems = CDBHelper::getHash($sqlItems);
$sqlTriggers = "select triggerid,expression,description,url,status,value,priority,comments,error,templateid,type,state,flags from triggers order by triggerid";
$oldHashTriggers = CDBHelper::getHash($sqlTriggers);
$this->zbxTestLogin('zabbix.php?action=template.list');
$this->query('button:Reset')->one()->click();
// Filter necessary Template name.
$form = $this->query('name:zbx_filter')->asForm()->waitUntilVisible()->one();
$form->fill(['Name' => $name]);
$this->query('button:Apply')->one()->waitUntilClickable()->click();
$this->query('xpath://table[@class="list-table"]')->asTable()->waitUntilVisible()->one()->findRow('Name', $name)
->getColumn('Name')->query('link', $name)->one()->click();
$modal = COverlayDialogElement::find()->waitUntilReady()->one();
$this->assertEquals('Template', $modal->getTitle());
$modal->query('button:Update')->WaitUntilClickable()->one()->click();
$this->assertMessage(TEST_GOOD, 'Template updated');
$this->zbxTestTextPresent($name);
$this->assertEquals($oldHashTemplate, CDBHelper::getHash($sqlTemplate));
$this->assertEquals($oldHashHosts, CDBHelper::getHash($sqlHosts));
$this->assertEquals($oldHashItems, CDBHelper::getHash($sqlItems));
$this->assertEquals($oldHashTriggers, CDBHelper::getHash($sqlTriggers));
}
public function testPageTemplates_FilterTemplateByName() {
$this->zbxTestLogin('zabbix.php?action=template.list');
$filter = $this->query('name:zbx_filter')->asForm()->one();
$filter->getField('Template groups')->select('Templates/SAN');
$filter->getField('Name')->fill($this->templateName);
$filter->submit();
$this->assertTableDataColumn([$this->templateName]);
$this->assertTableStats(1);
}
public function testPageTemplates_FilterByLinkedTemplate() {
$this->zbxTestLogin('zabbix.php?action=template.list');
$this->query('button:Reset')->one()->click();
$filter = $this->query('name:zbx_filter')->asForm()->one();
$filter->getField('Linked templates')->fill([
'values' => 'Template ZBX6663 Second',
'context' => 'Templates'
]);
$filter->submit();
$this->zbxTestWaitForPageToLoad();
$this->assertTableDataColumn(['Template ZBX6663 First']);
$this->assertTableDataColumn(['Template ZBX6663 Second'], 'Linked templates');
$this->assertTableStats(1);
}
public function testPageTemplates_FilterNone() {
$this->zbxTestLogin('zabbix.php?action=template.list');
$filter = $this->query('name:zbx_filter')->asForm()->one();
$filter->fill([
'Template groups' => 'Templates',
'Name' => '123template!@#$%^&*()_"='
]);
$filter->submit();
$this->assertTableStats(0);
$this->zbxTestInputTypeOverwrite('filter_name', '%');
$this->zbxTestClickButtonText('Apply');
$this->assertTableStats(0);
}
public function testPageTemplates_FilterReset() {
$this->zbxTestLogin('zabbix.php?action=template.list');
$this->query('button:Reset')->one()->click();
$this->zbxTestTextNotPresent('Displaying 0 of 0 found');
}
public static function getFilterByTagsData() {
return [
// "And" and "And/Or" checks.
[
[
'evaluation_type' => 'And/Or',
'tags' => [
['name' => 'tag', 'operator' => 'Contains', 'value' => 'template'],
['name' => 'test', 'operator' => 'Contains', 'value' => 'test_tag']
],
'expected_templates' => [
'Template for tags filtering'
]
]
],
[
[
'evaluation_type' => 'Or',
'tags' => [
['name' => 'tag', 'operator' => 'Contains', 'value' => 'template'],
['name' => 'test', 'operator' => 'Contains', 'value' => 'test_tag']
],
'expected_templates' => [
'Template for tags filtering',
'Template for tags filtering - clone',
'Template for tags filtering - update',
'Template for tags testing'
]
]
],
// "Contains" and "Equals" checks.
[
[
'evaluation_type' => 'And/Or',
'tags' => [
['name' => 'tag', 'operator' => 'Contains', 'value' => 'TEMPLATE']
],
'expected_templates' => [
'Template for tags filtering',
'Template for tags filtering - clone',
'Template for tags filtering - update',
'Template for tags testing'
]
]
],
[
[
'evaluation_type' => 'And/Or',
'tags' => [
['name' => 'tag', 'operator' => 'Equals', 'value' => 'TEMPLATE']
],
'expected_templates' => [
'Template for tags filtering',
'Template for tags testing'
]
]
],
[
[
'evaluation_type' => 'And/Or',
'tags' => [
['name' => 'action', 'operator' => 'Contains']
],
'expected_templates' => [
'Template for tags filtering',
'Template for tags filtering - clone',
'Template for tags filtering - update',
'Template for tags testing'
]
]
],
[
[
'evaluation_type' => 'And/Or',
'tags' => [
['name' => 'action', 'operator' => 'Equals']
],
'expected_templates' => []
]
],
[
[
'evaluation_type' => 'And/Or',
'tags' => [
['name' => 'test', 'operator' => 'Exists']
],
'expected_templates' => [
'Template for tags filtering'
]
]
],
[
[
'evaluation_type' => 'Or',
'tags' => [
['name' => 'action', 'operator' => 'Exists'],
['name' => 'test', 'operator' => 'Exists']
],
'expected_templates' => [
'Template for tags filtering',
'Template for tags filtering - clone',
'Template for tags filtering - update',
'Template for tags testing'
]
]
],
[
[
'Name' => 'template',
'evaluation_type' => 'And/Or',
'tags' => [
['name' => 'test', 'operator' => 'Does not exist'],
['name' => 'tag', 'operator' => 'Does not exist']
],
'absent_templates' => [
'Template for tags filtering',
'Template for tags filtering - clone',
'Template for tags filtering - update'
]
]
],
[
[
'evaluation_type' => 'Or',
'tags' => [
['name' => 'test', 'operator' => 'Does not exist'],
['name' => 'tag', 'operator' => 'Does not exist']
],
'absent_templates' => [
'Template for tags filtering'
]
]
],
[
[
'evaluation_type' => 'And/Or',
'tags' => [
['name' => 'test', 'operator' => 'Does not equal', 'value' => 'test_tag']
],
'absent_templates' => [
'Template for tags filtering'
]
]
],
[
[
'evaluation_type' => 'Or',
'tags' => [
['name' => 'test', 'operator' => 'Does not equal', 'value' => 'test_tag']
],
'absent_templates' => [
'Template for tags filtering'
]
]
],
[
[
'evaluation_type' => 'Or',
'tags' => [
['name' => 'test', 'operator' => 'Does not equal', 'value' => 'test_tag'],
['name' => 'tag', 'operator' => 'Does not equal', 'value' => 'TEMPLATE']
],
'absent_templates' => [
'Template for tags filtering'
]
]
],
[
[
'evaluation_type' => 'And/Or',
'tags' => [
['name' => 'test', 'operator' => 'Does not equal', 'value' => 'test_tag'],
['name' => 'action', 'operator' => 'Does not equal', 'value' => 'update']
],
'absent_templates' => [
'Template for tags filtering',
'Template for tags filtering - update'
]
]
],
[
[
'evaluation_type' => 'And/Or',
'tags' => [
['name' => 'test', 'operator' => 'Does not contain', 'value' => 'test_']
],
'absent_templates' => [
'Template for tags filtering'
]
]
],
[
[
'evaluation_type' => 'Or',
'tags' => [
['name' => 'test', 'operator' => 'Does not contain', 'value' => 'test_']
],
'absent_templates' => [
'Template for tags filtering'
]
]
],
[
[
'evaluation_type' => 'And/Or',
'tags' => [
['name' => 'test', 'operator' => 'Does not contain', 'value' => 'test_'],
['name' => 'action', 'operator' => 'Does not contain', 'value' => 'clo']
],
'absent_templates' => [
'Template for tags filtering',
'Template for tags filtering - clone'
]
]
],
[
[
'evaluation_type' => 'Or',
'tags' => [
['name' => 'tag', 'operator' => 'Does not contain', 'value' => 'temp'],
['name' => 'action', 'operator' => 'Does not contain', 'value' => 'upd']
],
'absent_templates' => [
'Template for tags filtering - update'
]
]
]
];
}
/**
* @dataProvider getFilterByTagsData
*/
public function testPageTemplates_FilterByTags($data) {
$this->page->login()->open('zabbix.php?action=template.list&filter_name=template+for+tags&filter_evaltype=0&filter_tags%5B0%5D%5Btag%5D='.
'&filter_tags%5B0%5D%5Boperator%5D=0&filter_tags%5B0%5D%5Bvalue%5D=&filter_set=1');
$form = $this->query('name:zbx_filter')->waitUntilPresent()->asForm()->one();
if (array_key_exists('Name', $data)) {
$form->fill(['Name' => $data['Name']]);
}
$form->fill(['id:filter_evaltype' => $data['evaluation_type']]);
$this->setTags($data['tags']);
$form->submit();
$this->page->waitUntilReady();
// Check that correct result displayed.
if (array_key_exists('absent_templates', $data)) {
$filtering = $this->getTableColumnData('Name');
foreach ($data['absent_templates'] as $absence) {
if (($key = array_search($absence, $filtering))) {
unset($filtering[$key]);
}
}
$filtering = array_values($filtering);
$this->assertTableDataColumn($filtering, 'Name');
}
else {
$this->assertTableDataColumn(CTestArrayHelper::get($data, 'expected_templates', []));
}
// Reset filter due to not influence further tests.
$form->query('button:Reset')->one()->click();
}
/**
* Test opening Hosts filtered by corresponding Template.
*/
public function testPageTemplates_CheckHostsColumn() {
$template = 'Template for web scenario testing';
$hosts = ['Simple form test host'];
$this->page->login()->open('zabbix.php?action=template.list&page=3');
// Click on Hosts link in Template row.
$table = $this->query('class:list-table')->asTable()->one();
$table->findRow('Name', $template)->query('link:Hosts')->one()->click();
// Check that Hosts page is opened.
$this->page->assertHeader('Hosts');
$filter = $this->query('name:zbx_filter')->waitUntilPresent()->asForm()->one();
$table->invalidate();
// Check that correct Hosts are filtered.
$this->assertEquals([$template], $filter->getField('Templates')->getValue());
$this->assertTableDataColumn($hosts);
$this->assertTableStats(count($hosts));
// Reset Hosts filter after scenario.
$this->resetFilter();
}
private function resetFilter() {
$filter = $this->query('name:zbx_filter')->waitUntilPresent()->asForm()->one();
$filter->query('button:Reset')->one()->click();
}
}