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.
246 lines
6.1 KiB
246 lines
6.1 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';
|
||
|
|
||
|
/**
|
||
|
* Trait for filter related tests.
|
||
|
*/
|
||
|
trait TableTrait {
|
||
|
|
||
|
/**
|
||
|
* Table column names.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
protected $column_names = null;
|
||
|
|
||
|
/**
|
||
|
* Set names of columns.
|
||
|
*
|
||
|
* @param array $names column names
|
||
|
*/
|
||
|
protected function setColumnNames($names) {
|
||
|
$this->column_names = $names;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Perform data array normalization.
|
||
|
*
|
||
|
* @param array $data
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
protected function normalizeData($data) {
|
||
|
foreach ($data as &$values) {
|
||
|
foreach ($values as &$value) {
|
||
|
if (!is_array($value)) {
|
||
|
$value = ['text' => $value];
|
||
|
}
|
||
|
}
|
||
|
unset($value);
|
||
|
}
|
||
|
unset($values);
|
||
|
|
||
|
return $data;
|
||
|
}
|
||
|
|
||
|
protected function getTable($selector = null) {
|
||
|
if ($selector === null) {
|
||
|
$selector = 'class:list-table';
|
||
|
}
|
||
|
|
||
|
$table = $this->query($selector)->asTable()->one();
|
||
|
if ($this->column_names !== null) {
|
||
|
$table->setColumnNames($this->column_names);
|
||
|
}
|
||
|
|
||
|
return $table;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if values in table rows match data from data provider.
|
||
|
*
|
||
|
* @param array $data data array to be match with result in table
|
||
|
* @param string $selector table selector
|
||
|
*/
|
||
|
public function assertTableData($data = [], $selector = null) {
|
||
|
$rows = $this->getTable($selector)->getRows();
|
||
|
if (!$data) {
|
||
|
// Check that table contain one row with text "No data found."
|
||
|
$this->assertEquals(['No data found.'], $rows->asText());
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$this->assertEquals(count($data), $rows->count(), 'Rows count does not match results count in data provider.');
|
||
|
$this->assertEquals(array_keys($data), array_keys($rows->asArray()),
|
||
|
'Row indices don\'t not match indices in data provider.'
|
||
|
);
|
||
|
|
||
|
foreach ($this->normalizeData($data) as $i => $values) {
|
||
|
$row = $rows->get($i);
|
||
|
|
||
|
foreach ($values as $name => $value) {
|
||
|
if (($text = $row->getColumnData($name, $value)) === null) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$this->assertEquals($value['text'], $text);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if values in table rows have data from data provider.
|
||
|
*
|
||
|
* @param array $data data array to be matched with result in table
|
||
|
* @param string $selector table selector
|
||
|
*
|
||
|
* @throws Exception
|
||
|
*/
|
||
|
public function assertTableHasData($data = [], $selector = null) {
|
||
|
$table = $this->getTable($selector);
|
||
|
|
||
|
if (!$data) {
|
||
|
// Check that table contains one row with text "No data found."
|
||
|
$this->assertEquals(['No data found.'], $table->getRows()->asText());
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
foreach ($data as $data_row) {
|
||
|
$found = false;
|
||
|
|
||
|
foreach ($table->index() as $table_row) {
|
||
|
$match = true;
|
||
|
|
||
|
foreach ($data_row as $key => $value) {
|
||
|
if (!isset($table_row[$key]) || $table_row[$key] != $data_row[$key]) {
|
||
|
$match = false;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ($match) {
|
||
|
$found = true;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!$found) {
|
||
|
throw new \Exception('Row ('.implode(', ', array_map(function ($value) {
|
||
|
return '"'.$value.'"';
|
||
|
}, $data_row)).') was not found in table.');
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if values in table column match data from data provider.
|
||
|
*
|
||
|
* @param array $rows data array to be match with result in table
|
||
|
* @param string $field table column name
|
||
|
*/
|
||
|
public function assertTableDataColumn($rows = [], $field = 'Name', $selector = 'class:list-table') {
|
||
|
$data = [];
|
||
|
foreach ($rows as $row) {
|
||
|
$data[] = [$field => $row];
|
||
|
}
|
||
|
|
||
|
$this->assertTableData($data, $selector);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if values in table column have data from data provider.
|
||
|
*
|
||
|
* @param array $rows data array to be matched with result in table
|
||
|
* @param string $field table column name
|
||
|
*/
|
||
|
public function assertTableHasDataColumn($rows = [], $field = 'Name', $selector = 'class:list-table') {
|
||
|
$data = [];
|
||
|
foreach ($rows as $row) {
|
||
|
$data[] = [$field => $row];
|
||
|
}
|
||
|
|
||
|
$this->assertTableHasData($data, $selector);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Select table rows.
|
||
|
*
|
||
|
* @param mixed $data rows to be selected
|
||
|
* @param string $column column name
|
||
|
* @param string $selector table selector
|
||
|
*/
|
||
|
public function selectTableRows($data = [], $column = 'Name', $selector = null) {
|
||
|
$table = $this->getTable($selector);
|
||
|
|
||
|
if (!$data) {
|
||
|
// Select all rows in table.
|
||
|
$table->query('xpath:./thead/tr/th/input[@type="checkbox"]')->asCheckbox()->one()->check();
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$table->findRows($column, $data)->select();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Assert text of displayed rows amount.
|
||
|
*
|
||
|
* @param integer $count rows count per page
|
||
|
* @param integer $total total rows count
|
||
|
*/
|
||
|
public function assertTableStats($count, $total = null) {
|
||
|
if ($total === null) {
|
||
|
$total = $count;
|
||
|
}
|
||
|
$this->assertEquals('Displaying '.$count.' of '.$count.' found',
|
||
|
$this->query('xpath://div[@class="table-stats"]')->one()->getText()
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get data from chosen column.
|
||
|
*
|
||
|
* @param string $column column name, where value should be checked
|
||
|
* @param string $selector table selector
|
||
|
*/
|
||
|
private function getTableColumnData($column, $selector = null) {
|
||
|
$table = $this->getTable($selector);
|
||
|
$result = [];
|
||
|
foreach ($table->getRows() as $row) {
|
||
|
$result[] = $row->getColumn($column)->getText();
|
||
|
}
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Assert text of selected rows amount.
|
||
|
*
|
||
|
* @param integer $count selected rows count
|
||
|
*/
|
||
|
public function assertSelectedCount($count) {
|
||
|
$this->assertEquals($count.' selected', $this->query('id:selected_count')->one()->getText());
|
||
|
}
|
||
|
}
|