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.

257 lines
7.5 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/CWebTest.php';
require_once dirname(__FILE__).'/behaviors/CMessageBehavior.php';
/**
* @backup users, config
*/
class testTimezone extends CWebTest {
/**
* Attach MessageBehavior to the test.
*
* @return array
*/
public function getBehaviors() {
return [CMessageBehavior::class];
}
/**
* Change zabbix timezone from GUI and check that system time displayed correctly according to timezone.
*/
public function testTimezone_Gui() {
$this->page->userLogin('Admin', 'zabbix');
$this->setTimezone('System', 'gui');
$this->page->open('zabbix.php?action=problem.view');
$etc_time = $this->getProblemTime('Trigger for tag permissions Oracle');
// UTC -3 hours.
$this->setTimezone('UTC', 'gui');
date_modify($etc_time,'-3 hours');
// Return to problem page and check time.
$this->page->open('zabbix.php?action=problem.view');
$utc_time = $this->getProblemTime('Trigger for tag permissions Oracle');
$this->assertEquals($etc_time, $utc_time);
}
public static function getUserSettingsData() {
return [
[
[
'user_timezone' => 'UTC',
'timezone_db' => 'UTC',
'time_diff' => '-3 hours'
]
],
[
[
'user_timezone' => 'System default',
'timezone_db' => 'default',
'time_diff' => '+0 hours'
]
],
[
[
'user_timezone' => 'Pacific/Niue',
'timezone_db' => 'Pacific/Niue',
'time_diff' => '-14 hours'
]
],
[
[
'user_timezone' => 'Asia/Magadan',
'timezone_db' => 'Asia/Magadan',
'time_diff' => '+8 hours'
]
]
];
}
/**
* @dataProvider getUserSettingsData
*
* Change timezones for user, from user setting. Check that time for user displayed correctly according
* to chosen timezone.
*/
public function testTimezone_UserSettings($data) {
// Set system timezone.
$this->page->userLogin('Admin', 'zabbix');
$this->setTimezone('System', 'gui');
$this->page->open('zabbix.php?action=problem.view');
$system_time = $this->getProblemTime('Trigger for tag permissions Oracle');
$this->page->logout();
// User timezone change.
$this->page->userLogin('test-timezone', 'zabbix');
$this->setTimezone($data['user_timezone'], 'userprofile');
date_modify($system_time, $data['time_diff']);
// User timezone check.
$this->page->open('zabbix.php?action=problem.view');
$user_time = $this->getProblemTime('Trigger for tag permissions Oracle');
$this->assertEquals($system_time, $user_time);
$this->assertEquals($data['timezone_db'], CDBHelper::getValue('SELECT timezone FROM users WHERE username='.zbx_dbstr('test-timezone')));
$this->assertEquals('system', CDBHelper::getValue('SELECT default_timezone FROM config WHERE configid='.zbx_dbstr('1')));
$this->page->logout();
}
public static function getCreateUsersData() {
return [
[
[
'fields' => [
'Username' => 'test_utc',
'Groups' => [
'Selenium user group'
],
'Password' => 'test4567',
'Password (once again)' => 'test4567',
'Time zone' => 'UTC'
],
'time_diff' => '-3 hours',
'timezone_db' => 'UTC'
]
],
[
[
'fields' => [
'Username' => 'test_def',
'Groups' => [
'Selenium user group'
],
'Password' => 'test4567',
'Password (once again)' => 'test4567',
'Time zone' => 'System default'
],
'time_diff' => '+0 hours',
'timezone_db' => 'default'
]
],
[
[
'fields' => [
'Username' => 'test_amer',
'Groups' => [
'Selenium user group'
],
'Password' => 'test4567',
'Password (once again)' => 'test4567',
'Time zone' => 'Pacific/Niue'
],
'time_diff' => '-14 hours',
'timezone_db' => 'Pacific/Niue'
]
],
[
[
'fields' => [
'Username' => 'test_asia',
'Groups' => [
'Selenium user group'
],
'Password' => 'test4567',
'Password (once again)' => 'test4567',
'Time zone' => 'Asia/Magadan'
],
'time_diff' => '+8 hours',
'timezone_db' => 'Asia/Magadan'
]
]
];
}
/**
* @dataProvider getCreateUsersData
*
* Create users with different timezones and check that time displayed for them correctly, according
* to chosen timezone.
*/
public function testTimezone_CreateUsers($data) {
$this->page->userLogin('Admin', 'zabbix');
$this->setTimezone('System', 'gui');
$this->page->open('zabbix.php?action=problem.view');
$system_time = $this->getProblemTime('Trigger for tag permissions Oracle');
$this->page->open('zabbix.php?action=user.edit');
$form = $this->query('name:user_form')->asForm()->waitUntilVisible()->one();
if (CTestArrayHelper::get($data, 'fields.Time zone')) {
$data['fields']['Time zone'] = CDateTimeHelper::getTimeZoneFormat($data['fields']['Time zone']);
}
$form->fill($data['fields']);
$form->selectTab('Permissions');
$form->fill(['Role' => 'Super admin role']);
$form->submit();
$this->assertMessage(TEST_GOOD, 'User added');
$this->page->logout();
$this->page->userLogin($data['fields']['Username'], $data['fields']['Password']);
$this->page->open('zabbix.php?action=problem.view');
// Expected time after timezone change.
date_modify($system_time, $data['time_diff']);
// Actual time after timezone change.
$this->page->open('zabbix.php?action=problem.view');
$user_time = $this->getProblemTime('Trigger for tag permissions Oracle');
$this->assertEquals($system_time, $user_time);
$this->assertEquals($data['timezone_db'], CDBHelper::getValue('SELECT timezone FROM users WHERE username='.
zbx_dbstr($data['fields']['Username'])));
$this->assertEquals('system', CDBHelper::getValue('SELECT default_timezone FROM config WHERE configid='.zbx_dbstr('1')));
$this->page->logout();
}
/**
* Time received from Monitoring->Problems table.
*
* @param string $problem problem name from monitoring->problems
*/
private function getProblemTime($problem) {
$table = $this->query('class:list-table')->asTable()->one();
$row = $table->findRow('Problem', $problem);
return date_create($row->getColumn('Time')->getText());
}
/**
* Change time zone in GUI or in user settings.
*
* @param string $timezone time zone
* @param string $page part of page link you want to open
*/
private function setTimezone($timezone, $page) {
if ($page === 'gui') {
$field_name = 'Default time zone';
$message = 'Configuration updated';
}
else {
$field_name = 'Time zone';
$message = 'User updated';
}
$this->page->open('zabbix.php?action='.$page.'.edit');
$form = $this->query('xpath://form[@aria-labelledby="page-title-general"]')->one()->asForm();
$timezone = CDateTimeHelper::getTimeZoneFormat($timezone);
$form->fill([$field_name => $timezone]);
$form->submit();
$this->page->waitUntilReady();
$this->assertMessage(TEST_GOOD, $message);
}
}