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.
310 lines
11 KiB
310 lines
11 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/CLegacyWebTest.php';
|
||
|
require_once dirname(__FILE__).'/traits/TableTrait.php';
|
||
|
require_once dirname(__FILE__).'/behaviors/CMessageBehavior.php';
|
||
|
|
||
|
use Facebook\WebDriver\WebDriverBy;
|
||
|
|
||
|
/**
|
||
|
* Tests for "Configuration -> Maintenance".
|
||
|
*
|
||
|
* Forms:
|
||
|
* - Create maintenance.
|
||
|
* - Clone maintenance.
|
||
|
* - Delete maintenance.
|
||
|
*
|
||
|
* @backup maintenances
|
||
|
*/
|
||
|
class testFormMaintenance extends CLegacyWebTest {
|
||
|
|
||
|
use TableTrait;
|
||
|
|
||
|
/**
|
||
|
* Attach MessageBehavior to the test.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function getBehaviors() {
|
||
|
return [CMessageBehavior::class];
|
||
|
}
|
||
|
|
||
|
public $name = 'Test maintenance';
|
||
|
public $periods_table = 'id:timeperiods';
|
||
|
|
||
|
/**
|
||
|
* Create maintenance with periods and host group.
|
||
|
*/
|
||
|
public function testFormMaintenance_Create() {
|
||
|
$this->page->login()->open('zabbix.php?action=maintenance.list')->waitUntilReady();
|
||
|
$this->page->assertTitle('Configuration of maintenance periods');
|
||
|
$this->page->assertHeader('Maintenance periods');
|
||
|
$this->query('button:Create maintenance period')->one()->waitUntilClickable()->click();
|
||
|
|
||
|
// Type maintenance name.
|
||
|
$form = COverlayDialogElement::find()->waitUntilReady()->asForm()->one();
|
||
|
$form->fill(['Name' => $this->name, 'Host groups' => 'Zabbix servers', 'id:tags_evaltype' => 'Or']);
|
||
|
|
||
|
$periods = [
|
||
|
[
|
||
|
'fields' => '',
|
||
|
'result' => [['Period type' => 'One time only']]
|
||
|
],
|
||
|
[
|
||
|
'fields' => [
|
||
|
'Period type' => 'Daily'
|
||
|
],
|
||
|
'result' => [['Period type' => 'Daily', 'Schedule' => 'At 00:00 every day']]
|
||
|
],
|
||
|
[
|
||
|
'fields' => [
|
||
|
'Period type' => 'Weekly',
|
||
|
'Monday' => true,
|
||
|
'Sunday' => true
|
||
|
],
|
||
|
'result' => [['Period type' => 'Weekly', 'Schedule' => 'At 00:00 Monday, Sunday of every week']]
|
||
|
],
|
||
|
[
|
||
|
'fields' => [
|
||
|
'Period type' => 'Monthly',
|
||
|
'January' => true,
|
||
|
'November' => true
|
||
|
],
|
||
|
'result' => [['Period type' => 'Monthly', 'Schedule' => 'At 00:00 on day 1 of every January, November']]
|
||
|
]
|
||
|
];
|
||
|
foreach ($periods as $period) {
|
||
|
$form->query('button:Add')->one()->click();
|
||
|
$period_overlay = COverlayDialogElement::find()->waitUntilReady()->all()->last()->asForm();
|
||
|
$period_overlay->fill($period['fields']);
|
||
|
$period_overlay->submit();
|
||
|
$period_overlay->waitUntilNotVisible();
|
||
|
$this->assertTableHasData($period['result'], $this->periods_table);
|
||
|
}
|
||
|
|
||
|
// Add problem tags.
|
||
|
$value = 'Value';
|
||
|
$tags = [
|
||
|
[
|
||
|
'action' => USER_ACTION_UPDATE,
|
||
|
'index' => 0,
|
||
|
'tag' => 'Tag1',
|
||
|
'value' => $value
|
||
|
],
|
||
|
[
|
||
|
'tag' => 'Tag2',
|
||
|
'value' => $value
|
||
|
],
|
||
|
[
|
||
|
'tag' => 'Tag3',
|
||
|
'value' => $value
|
||
|
]
|
||
|
];
|
||
|
$this->query('id:tags')->asMultifieldTable()->one()->fill($tags);
|
||
|
|
||
|
// Create maintenance and check the results in frontend.
|
||
|
$form->submit();
|
||
|
COverlayDialogElement::ensureNotPresent();
|
||
|
$this->assertMessage(TEST_GOOD, 'Maintenance period created');
|
||
|
$this->assertTableHasData([['Name' => $this->name, 'Type' => 'With data collection']]);
|
||
|
|
||
|
$this->assertEquals(1, CDBHelper::getCount('SELECT NULL FROM maintenances WHERE name='.zbx_dbstr($this->name)));
|
||
|
$this->assertEquals(3, CDBHelper::getCount('SELECT NULL FROM maintenance_tag WHERE value='.zbx_dbstr($value)));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Changes not preserve when close edit form using cancel button.
|
||
|
*
|
||
|
* @depends testFormMaintenance_Create
|
||
|
*/
|
||
|
public function testFromMaintenance_Cancel() {
|
||
|
$sql_hash = 'SELECT * FROM maintenances ORDER BY maintenanceid';
|
||
|
$old_hash = CDBHelper::getHash($sql_hash);
|
||
|
|
||
|
// Open form and change maintenance name.
|
||
|
$this->page->login()->open('zabbix.php?action=maintenance.list')->waitUntilReady();
|
||
|
$this->query('link', $this->name)->one()->waitUntilClickable()->click();
|
||
|
$form = COverlayDialogElement::find()->waitUntilReady()->asForm()->one();
|
||
|
$form->fill(['Name' => 'Some random text']);
|
||
|
|
||
|
// Remove 4th defined period.
|
||
|
$form->query('xpath:.//td[contains(text(), "Monthly")]/..//button[text()="Remove"]')->one()->click()->waitUntilNotvisible();
|
||
|
|
||
|
// Close the form.
|
||
|
$this->query('button:Cancel')->one()->click();
|
||
|
COverlayDialogElement::ensureNotPresent();
|
||
|
|
||
|
// Check the result in DB.
|
||
|
$this->assertEquals($old_hash, CDBHelper::getHash($sql_hash));
|
||
|
|
||
|
// Open form to check changes was not saved.
|
||
|
$this->query('link', $this->name)->one()->waitUntilClickable()->click();
|
||
|
$form->invalidate();
|
||
|
$form->checkValue(['Name' => $this->name]);
|
||
|
|
||
|
// Check that 4th period exist.
|
||
|
$this->assertTableHasData([['Period type' => 'Monthly']], $this->periods_table);
|
||
|
$this->query('button:Cancel')->one()->click();
|
||
|
COverlayDialogElement::ensureNotPresent();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Test update by changing maintenance period and type.
|
||
|
*
|
||
|
* @depends testFormMaintenance_Create
|
||
|
*/
|
||
|
public function testFormMaintenance_Update() {
|
||
|
$this->page->login()->open('zabbix.php?action=maintenance.list')->waitUntilReady();
|
||
|
$this->query('link', $this->name)->one()->waitUntilClickable()->click();
|
||
|
$form = COverlayDialogElement::find()->waitUntilReady()->asForm()->one();
|
||
|
|
||
|
// Change maintenance type.
|
||
|
$form->fill(['Maintenance type' => 'No data collection']);
|
||
|
|
||
|
// Remove "One time only".
|
||
|
$table = $this->query($this->periods_table)->asTable()->one();
|
||
|
$table->findRow('Period type', 'One time only')->getColumn('Action')->query('button:Remove')->one()->click()->waitUntilNotvisible();
|
||
|
|
||
|
$periods = [
|
||
|
[
|
||
|
'schedule' => 'Weekly',
|
||
|
'fields' => [
|
||
|
'Wednesday' => true,
|
||
|
'Friday' => true
|
||
|
],
|
||
|
'result' => [['Period type' => 'Weekly', 'Schedule' => 'At 00:00 Monday, Wednesday, Friday, Sunday of every week']]
|
||
|
],
|
||
|
[
|
||
|
'schedule' => 'Monthly',
|
||
|
'fields' => [
|
||
|
'Date' => 'Day of week',
|
||
|
'June' => true,
|
||
|
'September' => true
|
||
|
],
|
||
|
'result' => [['Period type' => 'Monthly', 'Schedule' => 'At 00:00 on first Wednesday of every January, June, September, November']]
|
||
|
]
|
||
|
];
|
||
|
foreach ($periods as $period) {
|
||
|
$table->findRow('Period type', $period['schedule'])->getColumn('Action')->query('button:Edit')->one()->click();
|
||
|
$period_overlay = COverlayDialogElement::find()->waitUntilReady()->all()->last()->asForm();
|
||
|
$period_overlay->fill($period['fields']);
|
||
|
|
||
|
if ($period['schedule'] === 'Monthly') {
|
||
|
$this->query('id:monthly_days_4')->waitUntilPresent()->asCheckbox()->one()->check();
|
||
|
}
|
||
|
|
||
|
$period_overlay->submit();
|
||
|
$period_overlay->waitUntilNotVisible();
|
||
|
$this->assertTableHasData($period['result'], $this->periods_table);
|
||
|
}
|
||
|
|
||
|
// Check the results in frontend.
|
||
|
$form->submit();
|
||
|
COverlayDialogElement::ensureNotPresent();
|
||
|
$this->assertMessage(TEST_GOOD, 'Maintenance period updated');
|
||
|
$this->assertTableHasData([['Name' => $this->name, 'Type' => 'No data collection']]);
|
||
|
|
||
|
// Check the results in DB.
|
||
|
$this->assertEquals(1, CDBHelper::getCount('SELECT NULL FROM maintenances WHERE name='.zbx_dbstr($this->name)));
|
||
|
}
|
||
|
|
||
|
public function testFormMaintenance_UpdateTags() {
|
||
|
$maintenance = 'Maintenance for update (data collection)';
|
||
|
$this->page->login()->open('zabbix.php?action=maintenance.list')->waitUntilReady();
|
||
|
$this->query('link', $maintenance)->one()->waitUntilClickable()->click();
|
||
|
$form = COverlayDialogElement::find()->waitUntilReady()->asForm()->one();
|
||
|
$form->fill(['id:tags_evaltype' => 'And/Or']);
|
||
|
|
||
|
// Update tags.
|
||
|
$tag = 'Tag';
|
||
|
$tags = [
|
||
|
[
|
||
|
'action' => USER_ACTION_UPDATE,
|
||
|
'index' => 0,
|
||
|
'tag' => 'Tag',
|
||
|
'value' => 'A1'
|
||
|
],
|
||
|
[
|
||
|
'action' => USER_ACTION_UPDATE,
|
||
|
'index' => 1,
|
||
|
'tag' => 'Tag',
|
||
|
'value' => 'B1'
|
||
|
]
|
||
|
];
|
||
|
$this->query('id:tags')->asMultifieldTable()->one()->fill($tags);
|
||
|
$this->query('xpath://label[@for="tags_0_operator_1"]')->one()->click();
|
||
|
$this->query('xpath://label[@for="tags_1_operator_0"]')->one()->click();
|
||
|
|
||
|
$form->submit();
|
||
|
COverlayDialogElement::ensureNotPresent();
|
||
|
$this->assertMessage(TEST_GOOD, 'Maintenance period updated');
|
||
|
|
||
|
$this->assertEquals(2, CDBHelper::getCount('SELECT NULL FROM maintenance_tag WHERE tag='.zbx_dbstr($tag)));
|
||
|
$this->assertEquals(1, CDBHelper::getCount('SELECT NULL FROM maintenance_tag WHERE value=\'A1\' AND operator=0'));
|
||
|
$this->assertEquals(1, CDBHelper::getCount('SELECT NULL FROM maintenance_tag WHERE value=\'B1\' AND operator=2'));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Test cloning of maintenance.
|
||
|
*
|
||
|
* @depends testFormMaintenance_Create
|
||
|
*/
|
||
|
public function testFormMaintenance_Clone() {
|
||
|
$suffix = ' (clone)';
|
||
|
$this->page->login()->open('zabbix.php?action=maintenance.list')->waitUntilReady();
|
||
|
$this->query('link', $this->name)->one()->waitUntilClickable()->click();
|
||
|
COverlayDialogElement::find()->waitUntilReady();
|
||
|
|
||
|
// Clone maintenance, rename the clone and save it.
|
||
|
$this->query('button:Clone')->one()->click()->waitUntilNotVisible();
|
||
|
$form = COverlayDialogElement::find()->waitUntilReady()->asForm()->one();
|
||
|
$form->fill(['Name' => $this->name.$suffix]);
|
||
|
$form->submit();
|
||
|
COverlayDialogElement::ensureNotPresent();
|
||
|
|
||
|
// Check the result in frontend.
|
||
|
$this->assertMessage(TEST_GOOD, 'Maintenance period created');
|
||
|
$this->assertTableHasData([['Name' => $this->name], ['Name' => $this->name.$suffix]]);
|
||
|
|
||
|
$this->assertEquals(1, CDBHelper::getCount('SELECT NULL FROM maintenances WHERE name='.zbx_dbstr($this->name)));
|
||
|
$this->assertEquals(1, CDBHelper::getCount('SELECT NULL FROM maintenances WHERE name='.zbx_dbstr($this->name.$suffix)));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Test deleting of maintenance.
|
||
|
*
|
||
|
* @depends testFormMaintenance_Create
|
||
|
*/
|
||
|
public function testFormMaintenance_Delete() {
|
||
|
$this->page->login()->open('zabbix.php?action=maintenance.list')->waitUntilReady();
|
||
|
$this->query('link', $this->name)->one()->waitUntilClickable()->click();
|
||
|
$dialog = COverlayDialogElement::find()->waitUntilReady()->one();
|
||
|
|
||
|
// Delete a maintenance and check the result in frontend.
|
||
|
$dialog->getFooter()->query('button:Delete')->one()->click();
|
||
|
$this->page->acceptAlert();
|
||
|
COverlayDialogElement::ensureNotPresent();
|
||
|
$this->assertMessage(TEST_GOOD, 'Maintenance period deleted');
|
||
|
|
||
|
$this->assertEquals(0, CDBHelper::getCount('SELECT NULL FROM maintenances WHERE name='.zbx_dbstr($this->name)));
|
||
|
}
|
||
|
}
|