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/services/testPageServicesServicesMas...

572 lines
13 KiB

1 year ago
<?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/CWebTest.php';
require_once dirname(__FILE__).'/../traits/TableTrait.php';
require_once dirname(__FILE__).'/../behaviors/CMessageBehavior.php';
/**
* @backup services
*
* @dataSource Services
*/
class testPageServicesServicesMassUpdate extends CWebTest {
use TableTrait;
private static $service_sql = 'SELECT * FROM services ORDER BY serviceid';
/**
* Attach MessageBehavior to the test.
*
* @return array
*/
public function getBehaviors() {
return [CMessageBehavior::class];
}
public function getTagsData() {
return [
// Empty tag name.
[
[
'expected' => TEST_BAD,
'names' => [
'Service with problem',
'Service with problem tags'
],
'Tags' => [
'action' => 'Add',
'tags' => [
[
'action' => USER_ACTION_UPDATE,
'index' => 0,
'value' => 'value1'
]
]
],
'details' => 'Invalid parameter "/1/tags/1/tag": cannot be empty.'
]
],
// TODO: Uncomment this case when ZBX-19263 is fixed.
// Equal tags.
/*
[
[
'expected' => TEST_BAD,
'names' => [
'Service with multiple service tags',
'Service for duplitate check'
],
'Tags' => [
'action' => 'Add',
'tags' => [
[
'action' => USER_ACTION_UPDATE,
'index' => 0,
'tag' => 'tag',
'value' => 'value'
],
[
'tag' => 'tag',
'value' => 'value'
]
]
],
'details' => 'Invalid parameter "/1/tags/2": value (tag, value)=(tag, value) already exists.'
]
],
*/
[
[
'names' => [
'Service with problem',
'Service with multiple service tags'
],
'Tags' => [
'action' => 'Add',
'tags' => []
],
'expected_tags' => [
'Service with problem' => [
[
'tag' => 'old_tag_1',
'value' => 'old_value_1'
]
],
'Service with multiple service tags' => [
[
'tag' => 'problem',
'value' => 'true'
],
[
'tag' => 'test',
'value' => 'test456'
]
]
]
]
],
[
[
'names' => [
'Service with problem',
'Service with multiple service tags'
],
'Tags' => [
'action' => 'Add',
'tags' => [
[
'action' => USER_ACTION_UPDATE,
'index' => 0,
'tag' => 'added_tag_1',
'value' => 'added_value_1'
]
]
],
'expected_tags' => [
'Service with problem' => [
[
'tag' => 'added_tag_1',
'value' => 'added_value_1'
],
[
'tag' => 'old_tag_1',
'value' => 'old_value_1'
]
],
'Service with multiple service tags' => [
[
'tag' => 'added_tag_1',
'value' => 'added_value_1'
],
[
'tag' => 'problem',
'value' => 'true'
],
[
'tag' => 'test',
'value' => 'test456'
]
]
]
]
],
[
[
'names' => [
'Service for mass update',
'Update service'
],
'Tags' => [
'action' => 'Replace',
'tags' => []
],
'expected_tags' => [
'Service for mass update' => [
[
'tag' => '',
'value' => ''
]
],
'Update service' => [
[
'tag' => '',
'value' => ''
]
]
]
]
],
[
[
'names' => [
'Service for mass update',
'Update service'
],
'Tags' => [
'action' => 'Replace',
'tags' => [
[
'action' => USER_ACTION_UPDATE,
'index' => 0,
'tag' => 'replaced_tag',
'value' => 'replaced_value'
]
]
],
'expected_tags' => [
'Service for mass update' => [
[
'tag' => 'replaced_tag',
'value' => 'replaced_value'
]
],
'Update service' => [
[
'tag' => 'replaced_tag',
'value' => 'replaced_value'
]
]
]
]
],
[
[
'names' => [
'Service for delete 2',
'Service for delete'
],
'Tags' => [
'action' => 'Remove',
'tags' => [
[
'tag' => '',
'value' => ''
]
]
],
'expected_tags' => [
'Service for delete 2' => [
[
'tag' => '3rd_tag',
'value' => '3rd_value'
],
[
'tag' => '4th_tag',
'value' => '4th_value'
],
[
'tag' => 'remove_tag_1',
'value' => 'remove_value_1'
],
[
'tag' => 'remove_tag_2',
'value' => 'remove_value_2'
]
],
'Service for delete' => [
[
'tag' => 'remove_tag_2',
'value' => 'remove_value_2'
]
]
]
]
],
[
[
'names' => [
'Service for delete 2',
'Service for delete',
'Parent for child creation'
],
'Tags' => [
'action' => 'Remove',
'tags' => [
[
'action' => USER_ACTION_UPDATE,
'index' => 0,
'tag' => 'remove_tag_2',
'value' => 'remove_value_2'
]
]
],
'expected_tags' => [
'Service for delete 2' => [
[
'tag' => '3rd_tag',
'value' => '3rd_value'
],
[
'tag' => '4th_tag',
'value' => '4th_value'
],
[
'tag' => 'remove_tag_1',
'value' => 'remove_value_1'
]
],
'Service for delete' => [
[
'tag' => '',
'value' => ''
]
],
'Parent for child creation' => [
[
'tag' => 'remove_tag_3',
'value' => 'remove_value_3'
]
]
]
]
],
// Different symbols in tag names and values.
[
[
'names' => [
'Service with problem tags',
'Service for duplitate check'
],
'Tags' => [
'action' => 'Add',
'tags' => [
[
'action' => USER_ACTION_UPDATE,
'index' => 0,
'tag' => '!@#$%^&*()_+<>,.\/',
'value' => '!@#$%^&*()_+<>,.\/'
],
[
'tag' => 'tag1',
'value' => 'value1'
],
[
'tag' => 'tag2'
],
[
'tag' => '{$MACRO:A}',
'value' => '{$MACRO:A}'
],
[
'tag' => '{$MACRO}',
'value' => '{$MACRO}'
],
[
'tag' => 'Таг',
'value' => 'Значение'
]
]
]
]
],
// Two tags with equal tag names.
[
[
'names' => [
'Service with problem tags',
'Service for duplitate check'
],
'Tags' => [
'action' => 'Replace',
'tags' => [
[
'action' => USER_ACTION_UPDATE,
'index' => 0,
'tag' => 'tag3',
'value' => '3'
],
[
'tag' => 'tag3',
'value' => '4'
]
]
]
]
],
// Two tags with equal tag values.
[
[
'names' => [
'Service with problem tags',
'Service for duplitate check'
],
'Tags' => [
'action' => 'Replace',
'tags' => [
[
'action' => USER_ACTION_UPDATE,
'index' => 0,
'tag' => 'tag4',
'value' => '5'
],
[
'tag' => 'tag5',
'value' => '5'
]
]
]
]
],
// Tag with trailing spaces.
[
[
'names' => [
'Service with problem tags',
'Service for duplitate check'
],
'Tags' => [
'action' => 'Replace',
'tags' => [
[
'action' => USER_ACTION_UPDATE,
'index' => 0,
'tag' => ' trimmed tag ',
'value' => ' trimmed value '
]
]
],
'trim' => true
]
],
// Tag with long name and value.
[
[
'names' => [
'Service with problem tags',
'Service for duplitate check'
],
'Tags' => [
'action' => 'Replace',
'tags' => [
[
'action' => USER_ACTION_UPDATE,
'index' => 0,
'tag' => 'Long tag name. Long tag name. Long tag name. Long tag name. Long tag name.'.
' Long tag name. Long tag name. Long tag name.',
'value' => 'Long tag value. Long tag value. Long tag value. Long tag value. Long tag value.'.
' Long tag value. Long tag value. Long tag value. Long tag value.'
]
]
]
]
]
];
}
/**
* Mass update Tags in Services.
*
* @dataProvider getTagsData
*/
public function testPageServicesServicesMassUpdate_Tags($data) {
if (CTestArrayHelper::get($data, 'expected', TEST_GOOD) === TEST_BAD) {
$old_hash = CDBHelper::getHash(self::$service_sql);
}
$this->page->login()->open('zabbix.php?action=service.list.edit');
$this->selectTableRows($data['names']);
$this->query('button:Mass update')->one()->click();
$dialog = COverlayDialogElement::find()->waitUntilReady()->asForm()->one();
$dialog->getLabel('Tags')->click();
$dialog->query('id:mass_update_tags')->asSegmentedRadio()->one()->fill($data['Tags']['action']);
if ($data['Tags']['tags'] !== []) {
$this->query('class:tags-table')->asMultifieldTable()->one()->fill($data['Tags']['tags']);
}
$dialog->submit();
if (CTestArrayHelper::get($data, 'expected', TEST_GOOD) === TEST_BAD) {
$this->assertMessage(TEST_BAD, 'Cannot update services', $data['details']);
$this->assertEquals($old_hash, CDBHelper::getHash(self::$service_sql));
}
else {
COverlayDialogElement::ensureNotPresent();
$this->assertMessage(TEST_GOOD, 'Services updated');
// Check changed fields in saved service form.
foreach ($data['names'] as $name) {
$table = $this->query('id:service-list')->asTable()->one();
$table->findRow('Name', $name)->query('xpath:.//button[@title="Edit"]')->waitUntilClickable()
->one()->click();
$service_dialog = COverlayDialogElement::find()->waitUntilReady()->one();
$service_dialog->asForm()->selectTab('Tags');
$expected = $data['Tags']['tags'];
if (!array_key_exists('expected_tags', $data)) {
// Remove action and index fields for asserting expected result.
foreach ($expected as &$tag) {
unset($tag['action'], $tag['index']);
if (CTestArrayHelper::get($data, 'trim', false) === false) {
continue;
}
// Removing trailing and leading spaces from tag and value for asserting expected result.
foreach ($expected as $i => &$options) {
foreach (['tag', 'value'] as $parameter) {
if (array_key_exists($parameter, $options)) {
$options[$parameter] = trim($options[$parameter]);
}
}
}
unset($options);
}
unset($tag);
}
$expected_tags = array_key_exists('expected_tags', $data) ? $data['expected_tags'][$name] : $expected;
$this->query('class:tags-table')->asMultifieldTable()->one()->checkValue($expected_tags);
$service_dialog->close();
}
}
}
/**
* Cancel Mass updating of Services.
*/
public function testPageServicesServicesMassUpdate_Cancel() {
$old_hash = CDBHelper::getHash(self::$service_sql);
$this->page->login()->open('zabbix.php?action=service.list.edit');
$services = [
'Service with problem',
'Service with multiple service tags',
'Service with problem tags',
'Service for duplitate check'
];
$new_tags = [
[
'action' => USER_ACTION_UPDATE,
'index' => 0,
'tag' => 'new_tag_1',
'value' => 'new_value_1'
],
[
'tag' => 'new_tag_2',
'value' => 'new_value_2'
]
];
$this->selectTableRows($services);
$this->query('button:Mass update')->one()->click();
$dialog = COverlayDialogElement::find()->one()->waitUntilReady();
$dialog->asForm()->getLabel('Tags')->click();
$this->query('class:tags-table')->asMultifieldTable()->one()->fill($new_tags);
$dialog->query('button:Cancel')->waitUntilClickable()->one()->click();
COverlayDialogElement::ensureNotPresent();
// Check that UI returned to previous page and hash remained unchanged.
$this->page->waitUntilReady();
$this->page->assertHeader('Services');
$this->assertEquals($old_hash, CDBHelper::getHash(self::$service_sql));
}
}