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.

1195 lines
34 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__).'/../../include/helpers/CDataHelper.php';
require_once dirname(__FILE__).'/../traits/TableTrait.php';
require_once dirname(__FILE__).'/../behaviors/CMessageBehavior.php';
/**
* @backup widget, profiles
*
* @onBefore prepareClockWidgetData
*/
class testDashboardClockWidget extends CWebTest {
use TableTrait;
/**
* Id of the dashboard with widgets.
*
* @var integer
*/
protected static $dashboardid;
/**
* Attach MessageBehavior to the test.
*
* @return array
*/
public function getBehaviors() {
return ['class' => CMessageBehavior::class];
}
/**
* SQL query to get widget and widget_field tables to compare hash values, but without widget_fieldid
* because it can change.
*/
private $sql = 'SELECT wf.widgetid, wf.type, wf.name, wf.value_int, wf.value_str, wf.value_groupid, wf.value_hostid,'.
' wf.value_itemid, wf.value_graphid, wf.value_sysmapid, w.widgetid, w.dashboard_pageid, w.type, w.name, w.x, w.y,'.
' w.width, w.height'.
' FROM widget_field wf'.
' INNER JOIN widget w'.
' ON w.widgetid=wf.widgetid '.
' ORDER BY wf.widgetid, wf.name, wf.value_int, wf.value_str, wf.value_groupid, wf.value_itemid, wf.value_graphid';
/**
* Create data for autotests which use ClockWidget.
*
* @return array
*/
public static function prepareClockWidgetData() {
CDataHelper::call('hostgroup.create', [
[
'name' => 'Host group for clock widget'
]
]);
$hostgrpid = CDataHelper::getIds('name');
CDataHelper::call('host.create', [
'host' => 'Host for clock widget',
'groups' => [
[
'groupid' => $hostgrpid['Host group for clock widget']
]
],
'interfaces' => [
'type'=> 1,
'main' => 1,
'useip' => 1,
'ip' => '192.168.3.217',
'dns' => '',
'port' => '10050'
]
]);
$hostid = CDataHelper::getIds('host');
$interfaceid = CDBHelper::getValue('SELECT interfaceid FROM interface WHERE hostid='.
$hostid['Host for clock widget']
);
CDataHelper::call('item.create', [
[
'hostid' => $hostid['Host for clock widget'],
'name' => 'Item for clock widget',
'key_' => 'system.localtime[local]',
'type' => 0,
'value_type' => 1,
'interfaceid' => $interfaceid,
'delay' => '5s'
],
[
'hostid' => $hostid['Host for clock widget'],
'name' => 'Item for clock widget 2',
'key_' => 'system.localtime[local2]',
'type' => 0,
'value_type' => 1,
'interfaceid' => $interfaceid,
'delay' => '5s'
]
]);
$itemid = CDataHelper::getIds('name');
CDataHelper::call('dashboard.create', [
[
'name' => 'Dashboard for creating clock widgets',
'display_period' => 60,
'auto_start' => 0,
'pages' => [
[
'name' => 'First page',
'widgets' => [
[
'type' => 'clock',
'name' => 'DeleteClock',
'x' => 5,
'y' => 0,
'width' => 5,
'height' => 5
],
[
'type' => 'clock',
'name' => 'CancelClock',
'x' => 0,
'y' => 0,
'width' => 5,
'height' => 5
],
[
'type' => 'clock',
'name' => 'LayoutClock',
'x' => 10,
'y' => 0,
'width' => 5,
'height' => 5,
'fields' => [
[
'type' => 4,
'name' => 'itemid',
'value' => $itemid['Item for clock widget']
],
[
'type' => 0,
'name' => 'time_type',
'value' => 2
]
]
]
]
],
[
'name' => 'Second page'
]
]
],
[
'name' => 'Dashboard for updating clock widgets',
'pages' => [
[
'widgets' => [
[
'type' => 'clock',
'name' => 'UpdateClock',
'x' => 0,
'y' => 0,
'width' => 5,
'height' => 5
]
]
]
]
]
]);
self::$dashboardid = CDataHelper::getIds('name');
}
/**
* Check clock widgets layout.
*/
public function testDashboardClockWidget_Layout() {
$this->page->login()->open('zabbix.php?action=dashboard.view&dashboardid='.
self::$dashboardid['Dashboard for creating clock widgets']);
$dialog = CDashboardElement::find()->one()->edit()->addWidget();
$form = $dialog->asForm();
$this->assertEquals('Add widget', $dialog->getTitle());
$form->fill(['Type' => CFormElement::RELOADABLE_FILL('Clock')]);
$form->checkValue([
'Name' => '',
'Refresh interval' => 'Default (15 minutes)',
'Time type' => 'Local time',
'Clock type' => 'Analog',
'id:show_header' => true
]);
// Check fields "Refresh interval" and "Time type" values.
$dropdowns = [
'Refresh interval' => ['Default (15 minutes)', 'No refresh', '10 seconds', '30 seconds', '1 minute',
'2 minutes', '10 minutes', '15 minutes'
],
'Time type' => ['Local time', 'Server time', 'Host time']
];
foreach ($dropdowns as $field => $options) {
$this->assertEquals($options, $form->getField($field)->asDropdown()->getOptions()->asText());
}
// Check that it's possible to select host items, when time type is "Host Time".
$fields = ['Type', 'Show header', 'Name', 'Refresh interval', 'Time type', 'Clock type'];
foreach (['Local time', 'Server time', 'Host time'] as $type) {
$form->fill(['Time type' => CFormElement::RELOADABLE_FILL($type)]);
/**
* If the clock widgets type equals to "Host time", then additional field appears - 'Item',
* which requires to select item of the "Host", in this case array_splice function allows us to put
* this fields name into the array. Positive offset (4) starts from the beginning of the array,
* while - (0) length parameter - specifies how many elements will be removed.
*/
if ($type === 'Host time') {
array_splice($fields, 5, 0, ['Item']);
$form->checkValue(['Item' => '']);
$form->isRequired('Item');
}
$this->assertEquals($fields, $form->getLabels(CElementFilter::VISIBLE)->asText());
}
// Check if Apply and Cancel button are clickable and there are two of them.
$dialog->invalidate();
$this->assertEquals(2, $dialog->getFooter()->query('button', ['Add', 'Cancel'])->all()
->filter(new CElementFilter(CElementFilter::CLICKABLE))->count()
);
// Check fileds' visibility depending on Analog or Digital clock type.
foreach (['Analog' => false, 'Digital' => true] as $type => $status) {
$form->fill(['Clock type' => $type]);
// Check "Advanced configuration" visibility.
$form->getField('Advanced configuration')->isVisible($status);
// Check Show checkboxes visibility and values. (Only Time is checked by default).
foreach (['show_1' => false, 'show_2' => true, 'show_3' => false] as $id => $checked) {
$checkbox = $form->query('id', $id)->asCheckbox()->one();
$this->assertTrue($checkbox->isVisible($status));
$this->assertTrue($checkbox->isChecked($checked));
}
if ($status) {
// Check that advanced configuration is closed.
$form->checkValue(['Advanced configuration' => false]);
$this->assertTrue($form->isRequired('Show'));
// Open "Advanced configuration" block to check its fields.
$form->fill(['Advanced configuration' => true]);
// Check that only Background color and Time fields are visible (because only Time checkbox is checked).
// There are two labels "Time zone", so the xpath is used for the container.
foreach (['Background color' => true, 'Date' => false, 'Time' => true,
'xpath:.//div[@class="fields-group fields-group-tzone"]' => false] as $name => $visible) {
$this->assertTrue($form->getField($name)->isVisible($visible));
}
// Fill other Show checkboxes and get other Advanced config fields.
$form->fill(['id:show_1' => true, 'id:show_3' => true]);
$advanced_configuration = [
'Date' => ['id:date_size' => 20, 'id:date_bold' => false, 'id:date_color' => null],
'Time' => ['id:time_size' => 30, 'id:time_bold' => false, 'id:time_color' => null,
'id:time_sec' => true, 'id:time_format' => '24-hour'
],
// This is Time zone field found by xpath, because we have one more field with Time zone label.
'xpath:.//div[@class="fields-group fields-group-tzone"]' => ['id:tzone_size' => 20, 'id:tzone_bold' => false,
'id:tzone_color' => null, 'id:tzone_timezone' => 'Local default: (UTC+03:00) Europe/Riga',
'id:tzone_format' => 'Short'
]
];
// Check Advanced config fields depending on Time type.
foreach (['Local time', 'Server time', 'Host time'] as $type) {
$form->fill(['Time type' => CFormElement::RELOADABLE_FILL($type)]);
$form->fill(['Advanced configuration' => true]);
// Check that with Host time 'Time zone' and 'Format' fields disappear.
if ($type === 'Host time') {
$advanced_configuration['xpath:.//div[@class="fields-group fields-group-tzone"]'] =
['id:tzone_size' => 20,'id:tzone_bold' => false, 'id:tzone_color' => null];
foreach (['id:tzone_timezone', 'id:tzone_format'] as $id) {
$this->assertFalse($form->getField($id)->isVisible());
}
}
// Check Advanced fields' visibility and values.
foreach ($advanced_configuration as $field => $config) {
$advanced_field = $form->getField($field);
$this->assertTrue($advanced_field->isClickable());
foreach ($config as $id => $value) {
$advanced_subfield = $form->getField($id);
$this->assertEquals($value, $advanced_subfield->getValue());
$this->assertTrue($advanced_subfield->isEnabled());
}
}
}
// Check form fields' maximal lengths.
foreach (['Name' => 255, 'id:date_size' => 3, 'id:time_size' => 3, 'id:tzone_size' => 3]
as $field => $length) {
$this->assertEquals($length, $form->getField($field)->getAttribute('maxlength'));
}
// Now remove the Time checkbox from Show field and check that only its Advanced config disappeared.
$form->fill(['id:show_2' => false]);
foreach ( ['Date' => true, 'Time' => false, 'xpath:.//div[@class="fields-group fields-group-tzone"]' => true]
as $name => $visible) {
$this->assertTrue($form->getField($name)->isVisible($visible));
}
}
}
}
/**
* Function checks specific scenario when Clock widget has "Time type" as "Host time"
* and name for widget itself isn't provided, after creating widget, host name should be displayed on widget as
* the widget name.
*/
public function testDashboardClockWidget_CheckClockWidgetsName() {
$this->page->login()->open('zabbix.php?action=dashboard.view&dashboardid='.
self::$dashboardid['Dashboard for creating clock widgets']);
$dashboard = CDashboardElement::find()->one();
$form = $dashboard->getWidget('LayoutClock')->edit();
$form->fill(['Name' => '']);
$this->query('button', 'Apply')->waitUntilClickable()->one()->click();
$this->page->waitUntilReady();
$dashboard->save();
$this->assertMessage(TEST_GOOD, 'Dashboard updated');
$this->assertTrue($dashboard->getWidget('Host for clock widget', false)->isValid());
$dashboard->getWidget('Host for clock widget')->edit()->fill(['Name' => 'LayoutClock']);
$this->query('button', 'Apply')->waitUntilClickable()->one()->click();
$this->page->waitUntilReady();
$dashboard->save();
$this->assertMessage(TEST_GOOD, 'Dashboard updated');
$this->assertEquals('LayoutClock', $dashboard->getWidget('LayoutClock')->getHeaderText());
}
public static function getClockWidgetCommonData() {
return [
// #0 Name and show header change.
[
[
'check_dialog_properties' => true,
'expected' => TEST_GOOD,
'fields' => [
'Show header' => true,
'Name' => 'Name and show header name'
]
]
],
// #1 Refresh interval change.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Refresh interval' => '10 seconds',
'Name' => 'Refresh interval change name'
]
]
],
// #2 Time type changed to Server time.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Time type changed to Server time',
'Time type' => CFormElement::RELOADABLE_FILL('Server time')
]
]
],
// #3 Time type changed to Local time.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Time type changed to Local time',
'Time type' => CFormElement::RELOADABLE_FILL('Local time')
]
]
],
// #4 Time type and refresh interval changed.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Type' => 'Clock',
'Time type' => CFormElement::RELOADABLE_FILL('Server time'),
'Refresh interval' => '10 seconds',
'Name' => 'Time type and refresh interval changed'
]
]
],
// #5 Empty name added.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => ''
]
]
],
// #6 Symbols/numbers name added.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => '!@#$%^&*()1234567890-='
]
]
],
// #7 Cyrillic added in name.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Имя кирилицей'
]
]
],
// #8 all fields changed.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Show header' => true,
'Name' => 'Updated_name',
'Refresh interval' => '10 minutes',
'Time type' => CFormElement::RELOADABLE_FILL('Server time')
]
]
],
// #9 Host time without item.
[
[
'expected' => TEST_BAD,
'fields' => [
'Show header' => false,
'Name' => 'ClockWithoutItem',
'Refresh interval' => '30 seconds',
'Time type' => CFormElement::RELOADABLE_FILL('Host time'),
'Clock type' => 'Analog'
],
'Error message' => [
'Invalid parameter "Item": cannot be empty.'
]
]
],
// #10 Time type with item.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Time type with item',
'Time type' => CFormElement::RELOADABLE_FILL('Host time'),
'Item' => 'Item for clock widget'
]
]
],
// #11 Update item.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Name' => 'Update item',
'Time type' => CFormElement::RELOADABLE_FILL('Host time'),
'Item' => 'Item for clock widget 2'
]
]
],
// #12.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Show header' => true,
'Name' => 'HostTimeClock',
'Refresh interval' => '30 seconds',
'Time type' => CFormElement::RELOADABLE_FILL('Host time'),
'Item' => 'Item for clock widget',
'Clock type' => 'Analog'
]
]
],
// #13.
[
[
'expected' => TEST_GOOD,
'fields' => [
'Show header' => true,
'Name' => 'LocalTimeClock123',
'Refresh interval' => '30 seconds',
'Time type' => CFormElement::RELOADABLE_FILL('Local time'),
'Clock type' => 'Analog'
]
]
],
// #14.
[
[
'expected' => TEST_GOOD,
'second_page' => true,
'fields' => [
'Show header' => true,
'Name' => '1233212',
'Refresh interval' => '30 seconds',
'Time type' => CFormElement::RELOADABLE_FILL('Local time'),
'Clock type' => 'Analog'
]
]
],
// #15.
[
[
'expected' => TEST_GOOD,
'second_page' => true,
'fields' => [
'Show header' => true,
'Name' => 'DigitalClock',
'Refresh interval' => '30 seconds',
'Time type' => CFormElement::RELOADABLE_FILL('Local time'),
'Clock type' => 'Digital',
'id:show_1' => true,
'id:show_2' => false,
'id:show_3' => false
]
]
],
// #16.
[
[
'expected' => TEST_GOOD,
'second_page' => true,
'fields' => [
'Show header' => true,
'Name' => 'DigitalClock2',
'Refresh interval' => '30 seconds',
'Time type' => CFormElement::RELOADABLE_FILL('Local time'),
'Clock type' => 'Digital',
'id:show_1' => true,
'id:show_2' => true,
'id:show_3' => false
]
]
],
// #15.
[
[
'expected' => TEST_GOOD,
'second_page' => true,
'fields' => [
'Show header' => true,
'Name' => 'DigitalClock3',
'Refresh interval' => '30 seconds',
'Time type' => CFormElement::RELOADABLE_FILL('Local time'),
'Clock type' => 'Digital',
'id:show_1' => true,
'id:show_2' => true,
'id:show_3' => true
]
]
],
// #16.
[
[
'expected' => TEST_GOOD,
'second_page' => true,
'fields' => [
'Show header' => true,
'Name' => 'DigitalClock4',
'Refresh interval' => '30 seconds',
'Time type' => CFormElement::RELOADABLE_FILL('Local time'),
'Clock type' => 'Digital',
'id:show_1' => true,
'id:show_2' => false,
'id:show_3' => false,
'Advanced configuration' => true
]
]
],
// #17.
[
[
'expected' => TEST_GOOD,
'second_page' => true,
'fields' => [
'Show header' => true,
'Name' => 'DigitalClock5',
'Refresh interval' => '30 seconds',
'Time type' => CFormElement::RELOADABLE_FILL('Local time'),
'Clock type' => 'Digital',
'id:show_1' => true,
'id:show_2' => false,
'id:show_3' => false,
'Advanced configuration' => true,
'Background color' => 'FFEB3B',
'id:date_size' => '50',
'id:date_bold' => true,
'xpath://button[@id="lbl_date_color"]/..' => 'F57F17'
]
]
],
// #18.
[
[
'expected' => TEST_GOOD,
'second_page' => true,
'fields' => [
'Show header' => true,
'Name' => 'DigitalClock6',
'Refresh interval' => '30 seconds',
'Time type' => CFormElement::RELOADABLE_FILL('Local time'),
'Clock type' => 'Digital',
'id:show_1' => true,
'id:show_2' => true,
'id:show_3' => false,
'Advanced configuration' => true,
'Background color' => '7B1FA2',
'id:date_size' => '15',
'id:date_bold' => true,
'xpath://button[@id="lbl_date_color"]/..' => '002B4D',
'id:time_size' => '30',
'id:time_bold' => false,
'xpath://button[@id="lbl_time_color"]/..' => '00897B',
'id:time_sec' => true,
'id:time_format' => '24-hour'
]
]
],
// #19.
[
[
'expected' => TEST_GOOD,
'second_page' => true,
'fields' => [
'Show header' => true,
'Name' => 'DigitalClock7',
'Refresh interval' => '30 seconds',
'Time type' => CFormElement::RELOADABLE_FILL('Local time'),
'Clock type' => 'Digital',
'id:show_1' => true,
'id:show_2' => true,
'id:show_3' => false,
'Advanced configuration' => true,
'Background color' => '43A047',
'id:date_size' => '55',
'id:date_bold' => true,
'xpath://button[@id="lbl_date_color"]/..' => '64B5F6',
'id:time_size' => '25',
'id:time_bold' => true,
'xpath://button[@id="lbl_time_color"]/..' => '180D49',
'id:time_sec' => false,
'id:time_format' => '12-hour'
]
]
],
// #20.
[
[
'expected' => TEST_GOOD,
'second_page' => true,
'fields' => [
'Show header' => true,
'Name' => 'DigitalClock8',
'Refresh interval' => '30 seconds',
'Time type' => CFormElement::RELOADABLE_FILL('Local time'),
'Clock type' => 'Digital',
'id:show_1' => true,
'id:show_2' => true,
'id:show_3' => true,
'Advanced configuration' => true,
'Background color' => 'C62828',
'id:date_size' => '40',
'id:date_bold' => true,
'xpath://button[@id="lbl_date_color"]/..' => 'FDD835',
'id:time_size' => '15',
'id:time_bold' => true,
'xpath://button[@id="lbl_time_color"]/..' => '1B5E20',
'id:time_sec' => false,
'id:time_format' => '12-hour',
'id:tzone_size' => '20',
'id:tzone_bold' => false,
'xpath://button[@id="lbl_tzone_color"]/..' => '06081F',
'xpath://button[@id="label-tzone_timezone"]/..'
=> CDateTimeHelper::getTimeZoneFormat('Atlantic/Stanley'),
'id:time_format' => '24-hour'
]
]
],
// #21.
[
[
'expected' => TEST_GOOD,
'second_page' => true,
'fields' => [
'Show header' => true,
'Name' => 'DigitalClock9',
'Refresh interval' => '30 seconds',
'Time type' => CFormElement::RELOADABLE_FILL('Local time'),
'Clock type' => 'Digital',
'id:show_1' => true,
'id:show_2' => true,
'id:show_3' => true,
'Advanced configuration' => true,
'Background color' => '001819',
'id:date_size' => '33',
'id:date_bold' => true,
'xpath://button[@id="lbl_date_color"]/..' => '607D8B',
'id:time_size' => '12',
'id:time_bold' => true,
'xpath://button[@id="lbl_time_color"]/..' => '1565C0',
'id:time_sec' => false,
'id:time_format' => '12-hour',
'id:tzone_size' => '35',
'id:tzone_bold' => true,
'xpath://button[@id="lbl_tzone_color"]/..' => 'CDDC39',
'xpath://button[@id="label-tzone_timezone"]/..'
=> CDateTimeHelper::getTimeZoneFormat('Africa/Bangui'),
'id:time_format' => '12-hour'
]
]
],
// #22 Empty Size fields.
[
[
'expected' => TEST_BAD,
'second_page' => true,
'fields' => [
'Clock type' => 'Digital',
'id:show_1' => true,
'id:show_2' => true,
'id:show_3' => true,
'Advanced configuration' => true,
'id:date_size' => '',
'id:time_size' => '',
'id:tzone_size' => ''
],
'Error message' => [
'Invalid parameter "Size": value must be one of 1-100.',
'Invalid parameter "Size": value must be one of 1-100.',
'Invalid parameter "Size": value must be one of 1-100.'
]
]
],
// #23 Characters in Size fields.
[
[
'expected' => TEST_BAD,
'second_page' => true,
'fields' => [
'Clock type' => 'Digital',
'id:show_1' => true,
'id:show_2' => true,
'id:show_3' => true,
'Advanced configuration' => true,
'id:date_size' => 'tes',
'id:time_size' => 'tfi',
'id:tzone_size' => 'eld'
],
'Error message' => [
'Invalid parameter "Size": value must be one of 1-100.',
'Invalid parameter "Size": value must be one of 1-100.',
'Invalid parameter "Size": value must be one of 1-100.'
]
]
],
// #24 Zeros in Size fields.
[
[
'expected' => TEST_BAD,
'second_page' => true,
'fields' => [
'Clock type' => 'Digital',
'id:show_1' => true,
'id:show_2' => true,
'id:show_3' => true,
'Advanced configuration' => true,
'id:date_size' => 0,
'id:time_size' => 0,
'id:tzone_size' => 0
],
'Error message' => [
'Invalid parameter "Size": value must be one of 1-100.',
'Invalid parameter "Size": value must be one of 1-100.',
'Invalid parameter "Size": value must be one of 1-100.'
]
]
],
// #25 Negatives in Size fields.
[
[
'expected' => TEST_BAD,
'second_page' => true,
'fields' => [
'Clock type' => 'Digital',
'id:show_1' => true,
'id:show_2' => true,
'id:show_3' => true,
'Advanced configuration' => true,
'id:date_size' => -1,
'id:time_size' => -12,
'id:tzone_size' => -99
],
'Error message' => [
'Invalid parameter "Size": value must be one of 1-100.',
'Invalid parameter "Size": value must be one of 1-100.',
'Invalid parameter "Size": value must be one of 1-100.'
]
]
],
// #26 Floats in Size fields.
[
[
'expected' => TEST_BAD,
'second_page' => true,
'fields' => [
'Clock type' => 'Digital',
'id:show_1' => true,
'id:show_2' => true,
'id:show_3' => true,
'Advanced configuration' => true,
'id:date_size' => 0.5,
'id:time_size' => 1.3,
'id:tzone_size' => 9.9
],
'Error message' => [
'Invalid parameter "Size": value must be one of 1-100.',
'Invalid parameter "Size": value must be one of 1-100.',
'Invalid parameter "Size": value must be one of 1-100.'
]
]
],
// #27.
[
[
'expected' => TEST_BAD,
'second_page' => true,
'fields' => [
'Show header' => true,
'Name' => 'DigitalClock12',
'Refresh interval' => '30 seconds',
'Time type' => CFormElement::RELOADABLE_FILL('Local time'),
'Clock type' => 'Digital',
'id:show_1' => true,
'id:show_2' => true,
'id:show_3' => true,
'Advanced configuration' => true,
'Background color' => '001819',
'id:date_size' => '333',
'id:date_bold' => true,
'xpath://button[@id="lbl_date_color"]/..' => '607D8B',
'id:time_size' => '123',
'id:time_bold' => true,
'xpath://button[@id="lbl_time_color"]/..' => '1565C0',
'id:time_sec' => false,
'id:time_format' => '12-hour',
'id:tzone_size' => '353',
'id:tzone_bold' => true,
'xpath://button[@id="lbl_tzone_color"]/..' => 'CDDC39',
'xpath://button[@id="label-tzone_timezone"]/..'
=> CDateTimeHelper::getTimeZoneFormat('Africa/Bangui'),
'id:time_format' => '12-hour'
],
'Error message' => [
'Invalid parameter "Size": value must be one of 1-100.',
'Invalid parameter "Size": value must be one of 1-100.',
'Invalid parameter "Size": value must be one of 1-100.'
]
]
],
// #28.
[
[
'expected' => TEST_BAD,
'second_page' => true,
'fields' => [
'Show header' => true,
'Name' => 'DigitalClock13',
'Refresh interval' => '30 seconds',
'Time type' => CFormElement::RELOADABLE_FILL('Host time'),
'Clock type' => 'Digital',
'id:show_1' => true,
'id:show_2' => true,
'id:show_3' => true,
'Advanced configuration' => true,
'Background color' => '001819',
'id:date_size' => '33',
'id:date_bold' => true,
'xpath://button[@id="lbl_date_color"]/..' => '607D8B',
'id:time_size' => '23',
'id:time_bold' => true,
'xpath://button[@id="lbl_time_color"]/..' => '1565C0',
'id:time_sec' => false,
'id:time_format' => '12-hour',
'id:tzone_size' => '33',
'id:tzone_bold' => true,
'xpath://button[@id="lbl_tzone_color"]/..' => 'CDDC39'
],
'Error message' => [
'Invalid parameter "Item": cannot be empty.'
]
]
]
];
}
/**
* Function for checking Clock widget form.
*
* @param array $data data provider
* @param boolean $update true if update scenario, false if create
*
* @dataProvider getClockWidgetCommonData
*/
public function checkFormClockWidget($data, $update = false) {
if (CTestArrayHelper::get($data, 'expected', TEST_GOOD) === TEST_BAD) {
$old_hash = CDBHelper::getHash($this->sql);
}
$linkid = $update
? self::$dashboardid['Dashboard for updating clock widgets']
: self::$dashboardid['Dashboard for creating clock widgets'];
$this->page->login()->open('zabbix.php?action=dashboard.view&dashboardid='.$linkid);
$dashboard = CDashboardElement::find()->one()->waitUntilVisible();
if (array_key_exists('second_page', $data) && $update === false) {
$dashboard->selectPage('Second page');
$dashboard->invalidate();
}
$form = $update
? $dashboard->getWidgets()->last()->edit()
: $dashboard->edit()->addWidget()->asForm();
$dialog = COverlayDialogElement::find()->one();
if (CTestArrayHelper::get($data, 'check_dialog_properties', false) && $update === true) {
$this->assertEquals('Edit widget', $dialog->getTitle());
$form->checkValue(['Type' => 'Clock']);
}
if (!$update) {
$form->fill(['Type' => CFormElement::RELOADABLE_FILL('Clock')]);
}
$form->fill($data['fields']);
$form->submit();
if ($data['expected'] === TEST_GOOD) {
$dashboard->save();
$this->assertMessage(TEST_GOOD, 'Dashboard updated');
/**
* After saving dashboard, it returns you to first page, if widget created in 2nd page,
* then it needs to be opened.
*/
if (array_key_exists('second_page', $data) && $update === false) {
$dashboard->selectPage('Second page');
$dashboard->invalidate();
}
if (array_key_exists('Item', $data['fields'])) {
$data['fields'] = array_replace($data['fields'], ['Item' => 'Host for clock widget: '.
$data['fields']['Item']]);
}
// Check that widget updated.
$dashboard->edit();
$widget = $dashboard->getWidgets()->last()->edit();
// Open "Advanced configuration" block if it was filled with data.
if (CTestArrayHelper::get($data, 'fields.Advanced configuration', false)) {
// After form submit "Advanced configuration" is closed.
$widget->checkValue(['Advanced configuration' => false]);
$widget->fill(['Advanced configuration' => true]);
}
$widget->checkValue($data['fields']);
// Check that widget is saved in DB.
$this->assertEquals(1, CDBHelper::getCount('SELECT *'.
' FROM widget w'.
' WHERE EXISTS ('.
' SELECT NULL'.
' FROM dashboard_page dp'.
' WHERE w.dashboard_pageid=dp.dashboard_pageid'.
' AND dp.dashboardid='.$linkid.
' AND w.name ='.zbx_dbstr(CTestArrayHelper::get($data['fields'], 'Name', '')).
')'
));
}
else {
$this->assertMessage(TEST_BAD, null, $data['Error message']);
// Check that DB hash is not changed.
$this->assertEquals($old_hash, CDBHelper::getHash($this->sql));
}
}
/**
* Function for checking Clock Widgets creation.
*
* @param array $data data provider
*
* @dataProvider getClockWidgetCommonData
*/
public function testDashboardClockWidget_Create($data) {
$this->checkFormClockWidget($data);
}
/**
* Function for checking Clock Widgets successful update.
*
* @param array $data data provider
*
* @dataProvider getClockWidgetCommonData
*/
public function testDashboardClockWidget_Update($data) {
$this->checkFormClockWidget($data, true);
}
public function testDashboardClockWidget_SimpleUpdate() {
$this->checkNoChanges();
}
public static function getCancelData() {
return [
// Cancel creating widget with saving the dashboard.
[
[
'cancel_form' => true,
'create_widget' => true,
'save_dashboard' => true
]
],
// Cancel updating widget with saving the dashboard.
[
[
'cancel_form' => true,
'create_widget' => false,
'save_dashboard' => true
]
],
// Create widget without saving the dashboard.
[
[
'cancel_form' => false,
'create_widget' => false,
'save_dashboard' => false
]
],
// Update widget without saving the dashboard.
[
[
'cancel_form' => false,
'create_widget' => false,
'save_dashboard' => false
]
]
];
}
/**
* @dataProvider getCancelData
*/
public function testDashboardClockWidget_Cancel($data) {
$this->checkNoChanges($data['cancel_form'], $data['create_widget'], $data['save_dashboard']);
}
/**
* Function for checking canceling form or submitting without any changes.
*
* @param boolean $cancel true if cancel scenario, false if form is submitted
* @param boolean $create true if create scenario, false if update
* @param boolean $save_dashboard true if dashboard will be saved, false if not
*/
private function checkNoChanges($cancel = false, $create = false, $save_dashboard = true) {
$old_hash = CDBHelper::getHash($this->sql);
$this->page->login()->open('zabbix.php?action=dashboard.view&dashboardid='.
self::$dashboardid['Dashboard for creating clock widgets']);
$dashboard = CDashboardElement::find()->one();
$old_widget_count = $dashboard->getWidgets()->count();
$form = $create
? $dashboard->edit()->addWidget()->asForm()
: $dashboard->getWidget('CancelClock')->edit();
$dialog = COverlayDialogElement::find()->one()->waitUntilReady();
if (!$create) {
$values = $form->getFields()->asValues();
}
else {
$form->fill(['Type' => 'Clock']);
}
if ($cancel || !$save_dashboard) {
$form->fill([
'Name' => 'Widget to be cancelled',
'Refresh interval' => '10 minutes',
'Time type' => CFormElement::RELOADABLE_FILL('Local time'),
'Clock type' => 'Digital',
'id:show_1' => true,
'id:show_2' => false,
'id:show_3' => false,
'Advanced configuration' => true,
'Background color' => '001819'
]);
}
if ($cancel) {
$dialog->query('button:Cancel')->one()->click();
}
else {
$form->submit();
}
COverlayDialogElement::ensureNotPresent();
if (!$cancel) {
$dashboard->getWidget(!$save_dashboard ? 'Widget to be cancelled' : 'CancelClock')->waitUntilReady();
}
if ($save_dashboard) {
$dashboard->save();
$this->assertMessage(TEST_GOOD, 'Dashboard updated');
}
else {
$dashboard->cancelEditing();
}
$this->assertEquals($old_widget_count, $dashboard->getWidgets()->count());
// Check that updating widget form values did not change in frontend.
if (!$create && !$save_dashboard) {
$this->assertEquals($values, $dashboard->getWidget('CancelClock')->edit()->getFields()->asValues());
}
// Check that DB hash is not changed.
$this->assertEquals($old_hash, CDBHelper::getHash($this->sql));
}
/**
* Check clock widgets deletion.
*/
public function testDashboardClockWidget_Delete() {
$this->page->login()->open('zabbix.php?action=dashboard.view&dashboardid='.
self::$dashboardid['Dashboard for creating clock widgets']);
$dashboard = CDashboardElement::find()->one();
$widget = $dashboard->edit()->getWidget('DeleteClock');
$this->assertTrue($widget->isEditable());
$dashboard->deleteWidget('DeleteClock');
$dashboard->save();
$this->page->waitUntilReady();
$this->assertMessage(TEST_GOOD, 'Dashboard updated');
// Check that widget is not present on dashboard and in DB.
$this->assertFalse($dashboard->getWidget('DeleteClock', false)->isValid());
$this->assertEquals(0, CDBHelper::getCount('SELECT *'.
' FROM widget_field wf'.
' LEFT JOIN widget w'.
' ON w.widgetid=wf.widgetid'.
' WHERE w.name='.zbx_dbstr('DeleteClock')
));
}
}