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.
399 lines
9.6 KiB
399 lines
9.6 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__).'/../behaviors/CMessageBehavior.php';
|
||
|
require_once dirname(__FILE__).'/../../include/helpers/CDataHelper.php';
|
||
|
require_once dirname(__FILE__).'/../traits/TableTrait.php';
|
||
|
|
||
|
/**
|
||
|
* @dataSource ScheduledReports, ExecuteNowAction
|
||
|
*
|
||
|
* @backup role
|
||
|
*
|
||
|
* @onBefore prepareRoleData
|
||
|
* @dataSource LoginUsers, ExecuteNowAction
|
||
|
*/
|
||
|
class testPageUserRoles extends CWebTest {
|
||
|
|
||
|
use TableTrait;
|
||
|
|
||
|
/**
|
||
|
* Attach MessageBehavior to the test.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function getBehaviors() {
|
||
|
return [CMessageBehavior::class];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Function used to create roles.
|
||
|
*/
|
||
|
public function prepareRoleData() {
|
||
|
CDataHelper::call('role.create', [
|
||
|
[
|
||
|
'name' => 'Remove_role_1',
|
||
|
'type' => 1
|
||
|
],
|
||
|
[
|
||
|
'name' => 'Remove_role_2',
|
||
|
'type' => 2
|
||
|
],
|
||
|
[
|
||
|
'name' => 'Remove_role_3',
|
||
|
'type' => 3
|
||
|
],
|
||
|
[
|
||
|
'name' => '$^&#%*',
|
||
|
'type' => 1
|
||
|
],
|
||
|
[
|
||
|
'name' => 'role_with_min end',
|
||
|
'type' => 1
|
||
|
]
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check layout in user roles list.
|
||
|
*/
|
||
|
public function testPageUserRoles_Layout() {
|
||
|
$this->page->login()->open('zabbix.php?action=userrole.list');
|
||
|
$this->page->assertTitle('Configuration of user roles');
|
||
|
$this->page->assertHeader('User roles');
|
||
|
|
||
|
// Table headers.
|
||
|
$table = $this->query('class:list-table')->asTable()->one();
|
||
|
$headers = $table->getHeadersText();
|
||
|
array_shift($headers);
|
||
|
$this->assertEquals(['Name', '#', 'Users'], $headers);
|
||
|
|
||
|
// Filter form fields.
|
||
|
$this->assertEquals(['Name'], $this->query('name:zbx_filter')->asForm()->one()->getLabels()->asText());
|
||
|
|
||
|
// Check that non-sortable headers is not clickable.
|
||
|
foreach (['#', 'Users'] as $header) {
|
||
|
$this->assertFalse($table->query('xpath://th/a[text()="'.$header.'"]')->one(false)->isValid());
|
||
|
}
|
||
|
|
||
|
// Check roles list sort order.
|
||
|
$before_listing = $this->getTableColumnData('Name');
|
||
|
$name_header = $this->query('xpath://a[text()="Name"]')->one();
|
||
|
$name_header->click();
|
||
|
$after_listing = $this->getTableColumnData('Name');
|
||
|
$this->assertEquals($after_listing, array_reverse($before_listing));
|
||
|
$name_header->click();
|
||
|
|
||
|
// Check that check boxes for all roles are enabled except Super admin.
|
||
|
$db_roles = CDBHelper::getAll('SELECT roleid, name FROM role');
|
||
|
foreach ($db_roles as $id) {
|
||
|
if ($id['name'] === 'Super admin role') {
|
||
|
$this->assertFalse($this->query('id:roleids_'.$id['roleid'])->one()->isEnabled());
|
||
|
}
|
||
|
else {
|
||
|
$this->assertTrue($this->query('id:roleids_'.$id['roleid'])->one()->isEnabled());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Check number of displayed user roles.
|
||
|
$roles_count = CDBHelper::getCount('SELECT roleid FROM role');
|
||
|
$this->assertTableStats($roles_count);
|
||
|
|
||
|
// Check filter collapse/expand.
|
||
|
$filter_tab = $this->query('xpath://a[contains(@class, "filter-trigger")]')->one();
|
||
|
foreach ([true, false] as $status) {
|
||
|
$this->assertEquals($status, $this->query('xpath://div[contains(@class, "filter-container")]')->one()->isDisplayed());
|
||
|
$filter_tab->click();
|
||
|
}
|
||
|
|
||
|
// Filters buttons are enabled.
|
||
|
foreach (['Apply', 'Reset', 'Create user role'] as $button) {
|
||
|
$this->assertTrue($this->query('button', $button)->one()->isClickable());
|
||
|
}
|
||
|
|
||
|
// Check selected rows counter.
|
||
|
$delete_button = $this->query('button:Delete')->one();
|
||
|
$this->assertFalse($delete_button->isEnabled());
|
||
|
$this->query('id:all_roles')->asCheckbox()->one()->check();
|
||
|
$this->assertTrue($delete_button->isEnabled());
|
||
|
$selected = $table->query('class:row-selected')->all()->count();
|
||
|
$this->assertEquals($roles_count - 1, $selected);
|
||
|
$this->assertEquals($selected.' selected', $this->query('id:selected_count')->one()->getText());
|
||
|
|
||
|
$table_data = [
|
||
|
[
|
||
|
'Name' => '$^&#%*',
|
||
|
'#' => 'Users',
|
||
|
'Users' => ''
|
||
|
],
|
||
|
[
|
||
|
'Name' => 'Admin role',
|
||
|
'#' => 'Users 4',
|
||
|
'Users' => 'admin-zabbix, admin user for testFormScheduledReport, http-auth-admin, user-recipient of the report'
|
||
|
],
|
||
|
[
|
||
|
'Name' => 'Guest role',
|
||
|
'#' => 'Users 1',
|
||
|
'Users' => 'guest'
|
||
|
],
|
||
|
[
|
||
|
'Name' => 'Remove_role_1',
|
||
|
'#' => 'Users',
|
||
|
'Users' => ''
|
||
|
],
|
||
|
[
|
||
|
'Name' => 'Remove_role_2',
|
||
|
'#' => 'Users',
|
||
|
'Users' => ''
|
||
|
],
|
||
|
[
|
||
|
'Name' => 'Remove_role_3',
|
||
|
'#' => 'Users',
|
||
|
'Users' => ''
|
||
|
],
|
||
|
[
|
||
|
'Name' => 'role_with_min end',
|
||
|
'#' => 'Users',
|
||
|
'Users' => ''
|
||
|
],
|
||
|
[
|
||
|
'Name' => 'Super admin role',
|
||
|
'#' => 'Users 6',
|
||
|
'Users' => 'Admin (Zabbix Administrator), filter-create, filter-delete, filter-update, LDAP user, test-timezone'
|
||
|
],
|
||
|
[
|
||
|
'Name' => 'UR1-executenow-on',
|
||
|
'#' => 'Users 1',
|
||
|
'Users' => 'U1-r-on'
|
||
|
],
|
||
|
[
|
||
|
'Name' => 'UR2-executenow-off',
|
||
|
'#' => 'Users 2',
|
||
|
'Users' => 'U2-r-off, U3-rw-off'
|
||
|
],
|
||
|
[
|
||
|
'Name' => 'User role',
|
||
|
'#' => 'Users 6',
|
||
|
'Users' => 'disabled-user, no-access-to-the-frontend, Tag-user, test-user, user-for-blocking, user-zabbix'
|
||
|
]
|
||
|
];
|
||
|
$this->assertTableData($table_data);
|
||
|
}
|
||
|
|
||
|
public static function getFilterData() {
|
||
|
return [
|
||
|
[
|
||
|
[
|
||
|
'name' => 'Admin',
|
||
|
'result' => [
|
||
|
'Admin role',
|
||
|
'Super admin role'
|
||
|
]
|
||
|
]
|
||
|
],
|
||
|
[
|
||
|
[
|
||
|
'name' => 'gu est',
|
||
|
'result' => []
|
||
|
]
|
||
|
],
|
||
|
[
|
||
|
[
|
||
|
'name' => 'min ro',
|
||
|
'result' => [
|
||
|
'Admin role',
|
||
|
'Super admin role'
|
||
|
]
|
||
|
]
|
||
|
],
|
||
|
[
|
||
|
[
|
||
|
'name' => ' ',
|
||
|
'result' => [
|
||
|
'Admin role',
|
||
|
'Guest role',
|
||
|
'role_with_min end',
|
||
|
'Super admin role',
|
||
|
'User role'
|
||
|
]
|
||
|
]
|
||
|
],
|
||
|
[
|
||
|
[
|
||
|
'name' => '',
|
||
|
'result' => [
|
||
|
'$^&#%*',
|
||
|
'Admin role',
|
||
|
'Guest role',
|
||
|
'Remove_role_1',
|
||
|
'Remove_role_2',
|
||
|
'Remove_role_3',
|
||
|
'role_with_min end',
|
||
|
'Super admin role',
|
||
|
'UR1-executenow-on',
|
||
|
'UR2-executenow-off',
|
||
|
'User role'
|
||
|
]
|
||
|
]
|
||
|
],
|
||
|
[
|
||
|
[
|
||
|
'name' => 'Super admin role',
|
||
|
'result' => [
|
||
|
'Super admin role'
|
||
|
]
|
||
|
]
|
||
|
],
|
||
|
[
|
||
|
[
|
||
|
'name' => 'GUEST ROLE',
|
||
|
'result' => [
|
||
|
'Guest role'
|
||
|
]
|
||
|
]
|
||
|
],
|
||
|
[
|
||
|
[
|
||
|
'name' => 'non_existing',
|
||
|
'result' => []
|
||
|
]
|
||
|
],
|
||
|
[
|
||
|
[
|
||
|
'name' => '*',
|
||
|
'result' => [
|
||
|
'$^&#%*'
|
||
|
]
|
||
|
]
|
||
|
]
|
||
|
];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Filter user roles.
|
||
|
*
|
||
|
* @dataProvider getFilterData
|
||
|
*/
|
||
|
public function testPageUserRoles_Filter($data) {
|
||
|
$this->page->login()->open('zabbix.php?action=userrole.list');
|
||
|
$form = $this->query('name:zbx_filter')->waitUntilPresent()->asForm()->one();
|
||
|
$form->fill(['Name' => $data['name']])->submit();
|
||
|
$this->assertTableDataColumn($data['result'], 'Name');
|
||
|
}
|
||
|
|
||
|
public static function getDeleteData() {
|
||
|
return [
|
||
|
[
|
||
|
[
|
||
|
'expected' => TEST_BAD,
|
||
|
'message_header' => 'Cannot delete user roles',
|
||
|
'message_details' => 'Cannot delete assigned user role "Admin role".',
|
||
|
'roles' => [
|
||
|
'Admin role',
|
||
|
'Remove_role_1'
|
||
|
]
|
||
|
]
|
||
|
],
|
||
|
[
|
||
|
[
|
||
|
'expected' => TEST_BAD,
|
||
|
'message_header' => 'Cannot delete user role',
|
||
|
'message_details' => 'Cannot delete assigned user role "Admin role".',
|
||
|
'roles' => [
|
||
|
'Admin role'
|
||
|
]
|
||
|
]
|
||
|
],
|
||
|
[
|
||
|
[
|
||
|
'expected' => TEST_BAD,
|
||
|
'message_header' => 'Cannot delete user roles',
|
||
|
'message_details' => 'Cannot delete assigned user role "User role".',
|
||
|
'roles' => [
|
||
|
'All'
|
||
|
]
|
||
|
]
|
||
|
],
|
||
|
[
|
||
|
[
|
||
|
'message_header' => 'User role deleted',
|
||
|
'roles' => [
|
||
|
'Remove_role_1'
|
||
|
]
|
||
|
]
|
||
|
],
|
||
|
[
|
||
|
[
|
||
|
'message_header' => 'User roles deleted',
|
||
|
'roles' => [
|
||
|
'Remove_role_2',
|
||
|
'Remove_role_3'
|
||
|
]
|
||
|
]
|
||
|
]
|
||
|
];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Delete user roles.
|
||
|
*
|
||
|
* @dataProvider getDeleteData
|
||
|
*/
|
||
|
public function testPageUserRoles_Delete($data) {
|
||
|
if (CTestArrayHelper::get($data, 'expected', TEST_GOOD) === TEST_BAD) {
|
||
|
$hash_before = CDBHelper::getHash('SELECT * FROM role');
|
||
|
}
|
||
|
|
||
|
$this->page->login()->open('zabbix.php?action=userrole.list');
|
||
|
$this->query('button:Reset')->one()->click();
|
||
|
$before_delete = $this->getTableColumnData('Name');
|
||
|
$table = $this->query('class:list-table')->asTable()->one();
|
||
|
|
||
|
foreach ($data['roles'] as $role) {
|
||
|
if ($role === 'All') {
|
||
|
$table->getRows()->select();
|
||
|
}
|
||
|
else {
|
||
|
$table->findRow('Name', $role)->select();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$this->query('button:Delete')->one()->click();
|
||
|
$this->page->acceptAlert();
|
||
|
$this->page->waitUntilReady();
|
||
|
|
||
|
// After deleting role check role list and database.
|
||
|
if (CTestArrayHelper::get($data, 'expected', TEST_GOOD) === TEST_BAD) {
|
||
|
$this->assertMessage(TEST_BAD, $data['message_header'], $data['message_details']);
|
||
|
$this->assertEquals($hash_before, CDBHelper::getHash('SELECT * FROM role'));
|
||
|
}
|
||
|
else {
|
||
|
$this->assertMessage(TEST_GOOD, $data['message_header']);
|
||
|
$after_delete = array_values(array_diff($before_delete, $data['roles']));
|
||
|
$this->assertTableDataColumn($after_delete, 'Name');
|
||
|
foreach ($data['roles'] as $role_name) {
|
||
|
$this->assertEquals(0, CDBHelper::getCount('SELECT null FROM role WHERE name='.zbx_dbstr($role_name)));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|