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.

921 lines
26 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__).'/../traits/TableTrait.php';
/**
* @backup dashboard, profiles
*
* @onBefore prepareDashboardData
*
* @dataSource LoginUsers
*/
class testDashboardForm extends CWebTest {
use TableTrait;
/**
* Dashboard ids grouped by name.
*
* @var array
*/
protected static $ids;
/**
* Get all dashboard related tables hash values.
*/
public static function getHash() {
return [
'dashboard' => CDBHelper::getHash('SELECT * FROM dashboard'),
'dashboard_user' => CDBHelper::getHash('SELECT * FROM dashboard_user ORDER by dashboard_userid'),
'dashboard_usrgrp' => CDBHelper::getHash('SELECT * FROM dashboard_usrgrp ORDER by dashboard_usrgrpid'),
'dashboard_page' => CDBHelper::getHash('SELECT * FROM dashboard_page ORDER by dashboard_pageid'),
'widget' => CDBHelper::getHash('SELECT * FROM widget ORDER by widgetid')
];
}
/**
* Default values of dashboard properties.
*/
private $default_values = [
'Owner' => 'Admin (Zabbix Administrator)',
'Name' => 'New dashboard',
'Default page display period' => '30 seconds',
'Start slideshow automatically' => true
];
/**
* Dashboard properties for cancellation test.
*/
private $update_values = [
'Owner' => 'guest',
'Name' => 'Dashboard to test properties changes',
'Default page display period' => '1 hour',
'Start slideshow automatically' => false
];
/**
* Attach MessageBehavior to the test.
*
* @return array
*/
public function getBehaviors() {
return ['class' => CMessageBehavior::class];
}
public function prepareDashboardData() {
$response = CDataHelper::call('dashboard.create', [
[
'name' => 'Dashboard for update',
'userid' => 2,
'display_period' => 60,
'auto_start' => 0,
'private' => 1,
'pages' => [[]]
],
[
'name' => 'Dashboard for clone and delete',
'userid' => 2,
'display_period' => 3600,
'auto_start' => 0,
'private' => 0,
'pages' => [
[
'name' => 'Page name',
'display_period' => 1800,
'widgets' => [
[
'type' => 'clock',
'name' => 'Custom clock name',
'x' => 0,
'y' => 0,
'width' => 12,
'height' => 4,
'fields' => [
[
'type' => 0,
'name' => 'rf_rate',
'value' => 0
],
[
'type' => 0,
'name' => 'time_type',
'value' => 1
]
]
]
]
]
],
'users' => [
[
'userid' => 1,
'permission' => 3
]
],
'userGroups' => [
[
'usrgrpid' => 7,
'permission' => 2
]
]
],
[
'name' => 'Dashboard for share',
'userid' => 1,
'pages' => [[]],
'users' => [
[
'userid' => 40,
'permission' => 3
],
[
'userid' => CDataHelper::get('LoginUsers.userids.disabled-user'),
'permission' => 2
]
],
'userGroups' => [
[
'usrgrpid' => 11,
'permission' => 2
],
[
'usrgrpid' => 12,
'permission' => 3
]
]
]
]);
$this->assertArrayHasKey('dashboardids', $response);
self::$ids = CDataHelper::getIds('name');
}
public function testDashboardForm_Layout() {
$this->page->login()->open('zabbix.php?action=dashboard.list')->waitUntilReady();
$this->query('button:Create dashboard')->one()->click();
$this->page->assertHeader('New dashboard');
$this->page->assertTitle('Dashboard');
$dialog = COverlayDialogElement::find()->one()->waitUntilReady();
$this->assertEquals('Dashboard properties', $dialog->getTitle());
$form = $dialog->asForm();
// Check default values.
$form->checkValue($this->default_values);
$this->assertEquals('255', $form->query('id:name')->one()->getAttribute('maxlength'));
// Check available display periods.
$this->assertEquals(['10 seconds', '30 seconds', '1 minute', '2 minutes', '10 minutes', '30 minutes', '1 hour'],
$form->getField('Default page display period')->getOptions()->asText()
);
// Close the dialog.
$dialog->query('button:Cancel')->one()->click();
COverlayDialogElement::ensureNotPresent();
// Check if dashboard is empty.
$dashboard = CDashboardElement::find()->one();
$this->assertTrue($dashboard->isEmpty());
// Cancel dashboard editing.
$dashboard->cancelEditing();
}
public static function getPropertiesData() {
return [
[
[
'expected' => TEST_BAD,
'dashboard_properties' => [
'Name' => ''
],
'error_message' => 'Incorrect value for field "name": cannot be empty.'
]
],
[
[
'expected' => TEST_BAD,
'dashboard_properties' => [
'Name' => ' '
],
'error_message' => 'Incorrect value for field "name": cannot be empty.'
]
],
[
[
'expected' => TEST_BAD,
'dashboard_properties' => [
'Owner' => ''
],
'error_message' => 'Field "userid" is mandatory.'
]
],
[
[
'expected' => TEST_BAD,
'dashboard_properties' => [
'Name' => 'Global view'
],
'error_message' => 'Dashboard "Global view" already exists.',
'save_dashboard' => true
]
],
// Creation with default values or simple update without data changes.
[
[
'expected' => TEST_GOOD,
'dashboard_properties' => []
]
],
[
[
'expected' => TEST_GOOD,
'dashboard_properties' => [
'Name' => 'Empty dashboard'
]
]
],
[
[
'expected' => TEST_GOOD,
'dashboard_properties' => [
'Name' => '!@#$%^&*()_+=-09[]{};:\'"',
'Default page display period' => '10 seconds'
]
]
],
[
[
'expected' => TEST_GOOD,
'dashboard_properties' => [
'Owner' => 'guest',
'Name' => 'кириллица',
'Start slideshow automatically' => false
]
]
],
[
[
'expected' => TEST_GOOD,
'dashboard_properties' => [
'Owner' => 'guest',
'Name' => '☺æų☺',
'Default page display period' => '1 minute',
'Start slideshow automatically' => false
]
]
],
[
[
'expected' => TEST_GOOD,
'dashboard_properties' => [
'Name' => ' Trailing & leading spaces ',
'Start slideshow automatically' => false
],
'trim' => true
]
]
];
}
/**
* Check validation of the Dashboard properties overlay dialog when creating a dashboard.
*
* @dataProvider getPropertiesData
*/
public function testDashboardForm_Create($data) {
$old_hash = ($data['expected'] === TEST_BAD) ? $this->getHash() : null;
$this->page->login()->open('zabbix.php?action=dashboard.view&new=1');
$dashboard = CDashboardElement::find()->one();
$dialog = COverlayDialogElement::find()->one()->waitUntilReady();
$this->checkProperties($data, 'create', $dashboard, $dialog, $old_hash);
}
/**
* Check validation of the Dashboard properties overlay dialog when updating a dashboard.
*
* @dataProvider getPropertiesData
*/
public function testDashboardForm_Update($data) {
$old_hash = ($data['expected'] === TEST_BAD || empty($data['dashboard_properties'])) ? $this->getHash() : null;
if (CTestArrayHelper::get($data, 'dashboard_properties.Name', false) && $data['expected'] === TEST_GOOD) {
$data['dashboard_properties']['Name'] = $data['dashboard_properties']['Name'].microtime();
}
$this->page->login()->open('zabbix.php?action=dashboard.view&dashboardid='.self::$ids['Dashboard for update']);
$dashboard = CDashboardElement::find()->one();
$dashboard->edit();
$dialog = $dashboard->editProperties();
$this->checkProperties($data, 'update', $dashboard, $dialog, $old_hash);
}
/**
* Check dashboard properties after form submit.
*
* @param array $data data provider
* @param string $action action that should be checked, create or update dashboard
* @param CDashboardElement $dashboard dashboard element
* @param COverlayDialogElement $dialog dashboard properties overlay dialog
* @param array $old_hash hashes values before form submit
*/
private function checkProperties($data, $action, $dashboard, $dialog, $old_hash = null) {
$form = $dialog->asForm();
$form->fill($data['dashboard_properties']);
$form->submit();
if (CTestArrayHelper::get($data, 'trim', false)) {
$data['dashboard_properties']['Name'] = trim($data['dashboard_properties']['Name']);
}
if (CTestArrayHelper::get($data, 'expected', TEST_GOOD) === TEST_BAD) {
if (CTestArrayHelper::get($data, 'save_dashboard')) {
$this->query('button:Save changes')->one()->click();
$this->assertMessage(TEST_BAD, 'Failed to '.$action.' dashboard', $data['error_message']);
}
else {
$this->assertMessage(TEST_BAD, null, $data['error_message']);
$form->invalidate();
$form->checkValue($data['dashboard_properties']);
$dialog->close();
}
$dashboard->cancelEditing();
$this->assertEquals($old_hash, $this->getHash());
}
else {
COverlayDialogElement::ensureNotPresent();
$dashboard->save();
$this->page->waitUntilReady();
$this->assertMessage(TEST_GOOD, 'Dashboard '.$action.'d');
$default_name = ($action === 'create') ? $this->default_values['Name'] : 'Dashboard for update';
if (CTestArrayHelper::get($data, 'trim', false)) {
$title = trim(preg_replace('/\s\s+/', ' ', str_replace("\n", " ", $data['dashboard_properties']['Name'])));
}
else {
$title = CTestArrayHelper::get($data, 'dashboard_properties.Name', $default_name);
}
$this->assertEquals($title, $dashboard->getTitle());
// Open dashboard from dashboard list.
$this->page->login()->open('zabbix.php?action=dashboard.list')->waitUntilReady();
$this->query('link', $title)->one()->waitUntilClickable()->click();
$this->page->waitUntilReady();
$dashboard->edit();
if (empty($data['dashboard_properties'])) {
if ($action === 'create') {
$data['dashboard_properties'] = $this->default_values;
}
else {
$this->assertEquals($old_hash, $this->getHash());
}
}
// Check dashboard properties.
$dashboard->editProperties();
$form->invalidate();
$form->checkValue($data['dashboard_properties']);
$dashboard->cancelEditing();
}
}
public static function getCancelCreateData() {
return [
[
[
'save_properties' => true
]
],
[
[
'save_properties' => false,
'opened_dashboard' => 'Global view'
]
]
];
}
/**
* Test cancelling dashboard creation and remembering the previous dashboard page.
*
* @dataProvider getCancelCreateData
*/
public function testDashboardForm_CancelCreate($data) {
$old_hash = $this->getHash();
$this->page->login()->open('zabbix.php?action=dashboard.list')->waitUntilReady();
if (CTestArrayHelper::get($data, 'opened_dashboard', false)) {
$this->query('link', $data['opened_dashboard'])->one()->click();
$this->page->assertHeader($data['opened_dashboard']);
$this->page->assertTitle('Dashboard');
$this->query('id:dashboard-actions')->one()->click();
CPopupMenuElement::find()->waitUntilVisible()->one()->select('Create new');
}
else {
$this->query('button:Create dashboard')->one()->click();
}
$dashboard = CDashboardElement::find()->one();
$dialog = COverlayDialogElement::find()->one()->waitUntilReady();
$form = $dialog->asForm();
$form->fill($this->update_values);
// Save dashboard properties or discard changes to the dashboard properties.
if ($data['save_properties']) {
$form->submit();
}
else {
$dialog->close();
}
$dashboard->cancelEditing();
if (CTestArrayHelper::get($data, 'opened_dashboard', false)) {
$url = 'zabbix.php?action=dashboard.view&cancel=1';
$title = $data['opened_dashboard'];
}
else {
$url = 'zabbix.php?action=dashboard.list';
$title = 'Dashboards';
}
$this->page->assertHeader($title);
$this->assertEquals(PHPUNIT_URL . $url, $this->page->getCurrentUrl());
$this->assertEquals($old_hash, $this->getHash());
}
public static function getCancelData() {
return [
[
[
'action' => 'update',
'save_properties' => true
]
],
[
[
'action' => 'update',
'save_properties' => false
]
],
[
[
'action' => 'Delete'
]
],
[
[
'action' => 'Clone',
'save_properties' => true
]
]
];
}
/**
* Test cancel dashboard update, delete and clone.
*
* @dataProvider getCancelData
*/
public function testDashboardForm_Cancel($data) {
$old_hash = $this->getHash();
$this->page->login()->open('zabbix.php?action=dashboard.view&dashboardid='.self::$ids['Dashboard for update']);
$dashboard = CDashboardElement::find()->one();
// Open dashboard properties overlay dialog for update and clone action.
if ($data['action'] === 'update') {
$dashboard->edit();
$dialog = $dashboard->editProperties();
}
else {
$this->query('id:dashboard-actions')->one()->click();
CPopupMenuElement::find()->waitUntilVisible()->one()->select($data['action']);
if ($data['action'] === 'Delete') {
$this->assertEquals('Delete dashboard?', $this->page->getAlertText());
$this->page->dismissAlert();
$this->assertEquals($old_hash, $this->getHash());
return;
}
$dialog = COverlayDialogElement::find()->one()->waitUntilReady();
}
// Change dashboard properties.
$form = $dialog->asForm();
$form->fill($this->update_values);
if ($data['save_properties']) {
$form->submit();
// Cancel saving the dashboard if the dashboard properties have changed.
$dashboard->cancelEditing();
}
else {
$dialog->close();
// Save the dashboard if the dashboard properties haven't changed.
$dashboard->save();
}
$this->assertEquals($old_hash, $this->getHash());
}
public function testDashboardForm_Clone() {
$original_values = [
'Name' => 'Dashboard for clone and delete',
'Owner' => 'guest',
'Default page display period' => '1 hour',
'Start slideshow automatically' => false
];
$cloned_name = 'Cloned dashboard';
$original_hashes = $this->getDashboardHashes($original_values['Name']);
$this->page->login()->open('zabbix.php?action=dashboard.view&dashboardid='.
self::$ids['Dashboard for clone and delete'])->waitUntilReady();
$dashboard = CDashboardElement::find()->one();
// Clone dashboard.
$this->query('id:dashboard-actions')->one()->click();
CPopupMenuElement::find()->waitUntilVisible()->one()->select('Clone');
$this->assertEquals($original_values['Name'], $dashboard->getTitle());
$dialog = COverlayDialogElement::find()->one()->waitUntilReady();
$this->assertEquals('Dashboard properties', $dialog->getTitle());
$form = $dialog->asForm();
// Check the properties values of the cloned dashboard.
$original_values['Owner'] = 'Admin (Zabbix Administrator)';
$form->checkValue($original_values);
// Change name and save dashboard properties.
$form->fill(['Name' => $cloned_name]);
$original_values['Name'] = $cloned_name;
$form->submit();
$dashboard->save();
$this->page->waitUntilReady();
$this->assertMessage(TEST_GOOD, 'Dashboard created');
$this->assertEquals($cloned_name, $dashboard->getTitle());
$dashboard->getWidget('Custom clock name');
$dashboard->edit();
$dashboard->editProperties();
$form->invalidate();
// Check and compare dashboard properties and hashes.
$form->checkValue($original_values);
$actual_hashes = $this->getDashboardHashes($cloned_name);
$this->assertEquals($original_hashes, $actual_hashes);
$dashboard->cancelEditing();
}
/**
* Get all related dashboard tables hashes for cloning test.
*
* @param string $name dashboard name
*
* @return array
*/
private function getDashboardHashes($name) {
$ids = [];
$query_value = $name;
$query_id = [
'dashboardid' => 'SELECT dashboardid FROM dashboard WHERE name=',
'pageid' => 'SELECT dashboard_pageid FROM dashboard_page WHERE dashboardid=',
'widgetid' => 'SELECT widgetid FROM widget WHERE dashboard_pageid='
];
foreach ($query_id as $id => $hash) {
$ids[$id] = CDBHelper::getValue($hash . zbx_dbstr($query_value));
// Save previous id value for next query.
$query_value = $ids[$id];
}
$result = [];
$query_hash = [
'dashboard' => 'SELECT private, templateid, display_period, auto_start, uuid FROM dashboard WHERE dashboardid='.$ids['dashboardid'],
'dashboard_user' => 'SELECT userid, permission FROM dashboard_user WHERE dashboardid='.$ids['dashboardid'],
'dashboard_usrgrp' => 'SELECT usrgrpid, permission FROM dashboard_usrgrp WHERE dashboardid='.$ids['dashboardid'],
'dashboard_page' => 'SELECT name, display_period, sortorder FROM dashboard_page WHERE dashboard_pageid='.$ids['pageid'],
'widget' => 'SELECT type, name, x, y, width, height, view_mode FROM widget WHERE dashboard_pageid='.$ids['pageid'],
'widget_field' => 'SELECT type, name, value_int, value_str, value_groupid FROM widget_field WHERE widgetid='.$ids['widgetid']
];
foreach ($query_hash as $table => $hash) {
$result[$table] = CDBHelper::getHash($hash);
}
return $result;
}
public static function getShareData() {
return [
// Add new user.
[
[
'dashboard' => 'Dashboard for update',
'groups' => [
[
'name' => 'Zabbix administrators'
]
]
]
],
// Add new group.
[
[
'dashboard' => 'Dashboard for update',
'users' => [
[
'name' => 'Admin',
'full_name' => 'Admin (Zabbix Administrator)'
]
]
]
],
// Add new user and group.
[
[
'dashboard' => 'Dashboard for update',
'type' => 'Public',
'groups' => [
[
'name' => 'Guests'
]
],
'users' => [
[
'name' => 'guest'
]
]
]
],
// Update existen user and group permissions.
[
[
'dashboard' => 'Dashboard for clone and delete',
'type' => 'Private',
'groups' => [
[
'action' => USER_ACTION_UPDATE,
'name' => 'Zabbix administrators',
'permissions' => 'Read-write'
]
],
'users' => [
[
'action' => USER_ACTION_UPDATE,
'name' => 'Admin (Zabbix Administrator)',
'permissions' => 'Read-only'
]
]
]
],
// Add, update and remove user and groups.
[
[
'dashboard' => 'Dashboard for share',
'groups' => [
[
'name' => 'Selenium user group',
'permissions' => 'Read-only'
],
[
'action' => USER_ACTION_UPDATE,
'name' => 'Enabled debug mode',
'permissions' => 'Read-write'
],
[
'action' => USER_ACTION_REMOVE,
'name' => 'No access to the frontend'
]
],
'users' => [
[
'name' => 'user-zabbix',
'permission' => 'Read-write'
],
[
'action' => USER_ACTION_UPDATE,
'name' => 'admin-zabbix',
'permissions' => 'Read-only'
],
[
'action' => USER_ACTION_REMOVE,
'name' => 'disabled-user'
]
]
]
],
// Add all users and groups.
[
[
'dashboard' => 'Dashboard for share',
'groups' => ['all'],
'users' => ['all']
]
]
];
}
/**
* Test dashboard sharing form.
*
* @dataProvider getShareData
*/
public function testDashboardForm_SharingPopup($data) {
$this->page->login()->open('zabbix.php?action=dashboard.view&dashboardid='.self::$ids[$data['dashboard']]);
CDashboardElement::find()->one()->waitUntilReady();
$this->query('id:dashboard-actions')->one()->click();
CPopupMenuElement::find()->waitUntilVisible()->one()->select('Sharing');
$dialog = COverlayDialogElement::find()->one()->waitUntilReady();
$this->assertEquals('Dashboard sharing', $dialog->getTitle());
$form = $dialog->asForm();
// Fill form.
$type = CTestArrayHelper::get($data, 'type', 'Private');
$form->fill(['Type' => $type]);
$this->fillSharingForm(CTestArrayHelper::get($data, 'groups', false), 'User groups');
$this->fillSharingForm(CTestArrayHelper::get($data, 'users', false), 'Users');
$form->submit();
COverlayDialogElement::ensureNotPresent();
$this->assertMessage(TEST_GOOD, 'Dashboard updated');
// Check sharing popup form.
$this->query('id:dashboard-actions')->one()->click();
CPopupMenuElement::find()->waitUntilVisible()->one()->select('Sharing');
$form->invalidate();
$form->checkValue(['Type' => $type]);
$this->checkSharingForm(CTestArrayHelper::get($data, 'users', false), 'Users', $form, $type);
$this->checkSharingForm(CTestArrayHelper::get($data, 'groups', false), 'User groups', $form, $type);
$dialog->close();
}
/**
* Fill dashboard sharing form.
*
* @param array $data users or user groups data
* @param string $list users or user groups list
*/
private function fillSharingForm($data, $list) {
if ($data) {
$dialog = COverlayDialogElement::find()->one();
$form = $dialog->asForm();
$table = $form->getField(($list === 'Users') ? 'List of user shares' : 'List of user group shares')->asTable();
foreach ($data as $share) {
$action = CTestArrayHelper::get($share, 'action', USER_ACTION_ADD);
switch ($action) {
case USER_ACTION_ADD;
$rows = $table->getRows()->count();
$table->query('button:Add')->one()->click();
$dialog = COverlayDialogElement::find()->all()->last()->waitUntilReady();
if ($share === 'all') {
// Count row with Add button.
$rows = 1;
$add_rows = $dialog->asTable()->getRows()->count();
$this->selectTableRows();
$dialog->query('button:Select')->one()->click();
}
else {
$dialog->query('link', $share['name'])->one()->click();
$add_rows = 1;
}
// Wait until new table row appears.
$table->query('xpath://tbody/tr['.($rows + $add_rows).']')->waitUntilPresent();
if (CTestArrayHelper::get($share, 'permissions', false)) {
$row = $table->findRow($list, $share['name']);
$row->getColumn('Permissions')->asSegmentedRadio()->fill($share['permissions']);
}
break;
case USER_ACTION_UPDATE;
$row = $table->findRow($list, $share['name']);
$row->getColumn('Permissions')->asSegmentedRadio()->fill($share['permissions']);
break;
case USER_ACTION_REMOVE;
$row = $table->findRow($list, $share['name']);
$row->getColumn('Action')->query('button:Remove')->one()->click();
// Wait until table row disappears.
$row->waitUntilNotPresent();
break;
}
}
}
}
/**
* Check form of dashboard share after changes.
*
* @param array $data users or user groups data
* @param string $list users or user groups list of shares
* @param CFormElement $form form element of dashboard share
* @param string $type dashboard sharing type, private or public
*/
private function checkSharingForm($data, $list, $form, $type) {
if ($data) {
$table = $form->getField(($list === 'Users') ? 'List of user shares' : 'List of user group shares')->asTable();
if ($data[0] === 'all') {
if ($list === 'Users') {
$query = 'SELECT username FROM users';
$key = 'username';
$selector = 'xpath://label[text()="List of user shares"]/ancestor::li//table';
}
else {
$query = 'SELECT name FROM usrgrp';
$key = 'name';
$selector = 'xpath://label[text()="List of user group shares"]/ancestor::li//table';
}
$db_names = CDBHelper::getAll($query);
// Database reult format is [['username' => 'Admin'], ['username' => 'Tag-user']]
foreach ($db_names as $array) {
// Result format should be ['Admin', 'Tag-user'] to compare with table result in UI.
$result[] = $array[$key];
}
natcasesort($result);
$result = array_values($result);
// Add name and surname to Admin user.
if ($list === 'Users' && $result[0] === 'Admin') {
$result[0] = 'Admin (Zabbix Administrator)';
}
$this->assertTableHasDataColumn($result, $list, $selector);
return;
}
foreach ($data as $share) {
$action = CTestArrayHelper::get($share, 'action', USER_ACTION_ADD);
if ($action === USER_ACTION_ADD || $action === USER_ACTION_UPDATE) {
// Default permission value depends on the sharing type.
$default_permissions = ($type === 'Private') ? 'Read-only' : 'Read-write';
$row = $table->findRow($list, CTestArrayHelper::get($share, 'full_name', $share['name']));
$this->assertEquals(CTestArrayHelper::get($share, 'permissions', $default_permissions),
$row->getColumn('Permissions')->asSegmentedRadio()->getValue()
);
}
else {
$this->assertFalse($table->query('xpath://tbody/tr/td[text()='.
CXPathHelper::escapeQuotes($share['name']).']')->one(false)->isValid()
);
}
}
}
}
public function testDashboardForm_Delete() {
$pageid = CDBHelper::getValue('SELECT dashboard_pageid FROM dashboard_page WHERE dashboardid='.
zbx_dbstr(self::$ids['Dashboard for clone and delete']));
$widgetid = CDBHelper::getValue('SELECT widgetid FROM widget WHERE dashboard_pageid='.zbx_dbstr($pageid));
$this->page->login()->open('zabbix.php?action=dashboard.view&dashboardid='.self::$ids['Dashboard for clone and delete']);
CDashboardElement::find()->one()->waitUntilReady();
$this->query('id:dashboard-actions')->one()->click();
CPopupMenuElement::find()->waitUntilVisible()->one()->select('Delete');
$this->page->acceptAlert();
$this->assertMessage(TEST_GOOD, 'Dashboard deleted');
// Check related dashboard tables.
$tables = [
'SELECT NULL FROM dashboard_page dp INNER JOIN dashboard d'.
' ON d.dashboardid=dp.dashboardid WHERE d.dashboardid='.zbx_dbstr(self::$ids['Dashboard for clone and delete']),
'SELECT NULL FROM dashboard_user WHERE dashboardid='.zbx_dbstr(self::$ids['Dashboard for clone and delete']),
'SELECT NULL FROM dashboard_usrgrp WHERE dashboardid='.zbx_dbstr(self::$ids['Dashboard for clone and delete']),
'SELECT NULL FROM widget_field wf INNER JOIN widget w ON w.widgetid=wf.widgetid WHERE w.widgetid='.$widgetid
];
foreach ($tables as $query) {
$this->assertEquals(0, CDBHelper::getCount($query));
}
}
}