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.
268 lines
9.2 KiB
268 lines
9.2 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';
|
|
require_once dirname(__FILE__).'/../traits/TableTrait.php';
|
|
|
|
/**
|
|
* Base class for API tokens page function tests.
|
|
*/
|
|
class testPageApiTokens extends CWebTest {
|
|
|
|
use TableTrait;
|
|
|
|
/**
|
|
* Attach MessageBehavior to the test.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function getBehaviors() {
|
|
return ['class' => CMessageBehavior::class];
|
|
}
|
|
|
|
/**
|
|
* Function that checks the layout of the API token list in Administration or User settings section.
|
|
*
|
|
* @param array $token_data Reference array with expected content of the API tokens list table.
|
|
* @param string $source Section from which the scenario is executed.
|
|
*/
|
|
public function checkLayout($token_data, $source) {
|
|
if ($source === 'user settings') {
|
|
$url = 'zabbix.php?action=user.token.list';
|
|
$filter_fields = ['Name', 'Expires in less than', 'Status'];
|
|
$tokens_count = CDBHelper::getCount('SELECT tokenid FROM token WHERE userid=1');
|
|
$reference_headers = ['Name', 'Expires at', 'Created at', 'Last accessed at', 'Status'];
|
|
}
|
|
else {
|
|
$url = 'zabbix.php?action=token.list';
|
|
$filter_fields = ['Name', 'Users', 'Expires in less than', 'Created by users', 'Status'];
|
|
$tokens_count = CDBHelper::getCount('SELECT tokenid FROM token');
|
|
$reference_headers = ['Name', 'User', 'Expires at', 'Created at', 'Created by user', 'Last accessed at', 'Status'];
|
|
}
|
|
|
|
// Open API tokens page and check header.
|
|
$this->page->login()->open($url);
|
|
$this->page->assertHeader('API tokens');
|
|
|
|
// Check status of buttons on the API tokens page.
|
|
$form_buttons = [
|
|
'Create API token' => true,
|
|
'Enable' => false,
|
|
'Disable' => false,
|
|
'Delete' => false
|
|
];
|
|
|
|
foreach ($form_buttons as $button => $enabled) {
|
|
$this->assertTrue($this->query('button', $button)->one()->isEnabled($enabled));
|
|
}
|
|
|
|
// Check displaying and hiding the filter.
|
|
$filter_form = $this->query('name:zbx_filter')->asForm()->one();
|
|
$filter_tab = $this->query('xpath://a[contains(text(), "Filter")]')->one();
|
|
$filter = $filter_form->query('id:tab_0')->one();
|
|
$this->assertTrue($filter->isDisplayed());
|
|
$filter_tab->click();
|
|
$this->assertFalse($filter->isDisplayed());
|
|
$filter_tab->click();
|
|
$this->assertTrue($filter->isDisplayed());
|
|
|
|
// Check that all filter fields are present.
|
|
$this->assertEquals($filter_fields, $filter_form->getLabels()->asText());
|
|
|
|
// Check the count of returned tokens and the count of selected tokens.
|
|
$this->assertTableStats($tokens_count);
|
|
$selected_count = $this->query('id:selected_count')->one();
|
|
$this->assertEquals('0 selected', $selected_count->getText());
|
|
$all_tokens = $this->query('id:all_tokens')->one()->asCheckbox();
|
|
$all_tokens->set(true);
|
|
$this->assertEquals($tokens_count.' selected', $selected_count->getText());
|
|
|
|
// Check that buttons became enabled.
|
|
foreach (['Enable', 'Disable', 'Delete'] as $button) {
|
|
$this->assertTrue($this->query('button', $button)->one()->isEnabled());
|
|
}
|
|
|
|
$all_tokens->set(false);
|
|
$this->assertEquals('0 selected', $selected_count->getText());
|
|
|
|
// Check tokens table headers.
|
|
$table = $this->query('class:list-table')->asTable()->one();
|
|
$headers = $table->getHeadersText();
|
|
|
|
// Remove empty element from headers array.
|
|
array_shift($headers);
|
|
$this->assertSame($reference_headers, $headers);
|
|
|
|
foreach ($headers as $header) {
|
|
$text = CXPathHelper::escapeQuotes($header);
|
|
if ($header === 'Created at') {
|
|
$this->assertFalse($table->query('xpath:.//a[text()='.$text.']')->one(false)->isValid());
|
|
}
|
|
else {
|
|
$this->assertTrue($table->query('xpath:.//a[contains(text(), '.$text.')]')->one()->isClickable());
|
|
}
|
|
}
|
|
|
|
// Check parameters of tokens in the token list table.
|
|
$this->assertTableData($token_data);
|
|
}
|
|
|
|
/**
|
|
* Function to checks token status change from API tokens list view.
|
|
*
|
|
* @param string $url URL of the view with the API tokens list.
|
|
* @param string $token The name of the token which status is going to be changed.
|
|
*/
|
|
public function checkStatusChange($url, $token) {
|
|
$this->page->login()->open($url);
|
|
|
|
// Disable API token.
|
|
$row = $this->query('class:list-table')->asTable()->one()->findRow('Name', $token);
|
|
$status = $row->getColumn('Status')->query('xpath:.//a')->one();
|
|
$status->click();
|
|
// Check token disabled.
|
|
$this->checkTokenStatus($row, 'disabled', $token);
|
|
|
|
// Enable API token.
|
|
$status->click();
|
|
|
|
// Check token enabled.
|
|
$this->checkTokenStatus($row, 'enabled', $token);
|
|
|
|
// Disable API token via button.
|
|
foreach (['Disable' => 'disabled', 'Enable' => 'enabled'] as $button => $status) {
|
|
$row->select();
|
|
$this->query('button', $button)->one()->waitUntilClickable()->click();
|
|
$this->page->acceptAlert();
|
|
$this->page->waitUntilReady();
|
|
$this->checkTokenStatus($row, $status, $token);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Function that checks the status of the token in the API token list.
|
|
*
|
|
* @param CTableRow $row Table row that contains the token with changes status.
|
|
* @param string $expected Flag that determines if the token should be enabled or disabled.
|
|
* @param string $token Token name which status was changed.
|
|
*/
|
|
private function checkTokenStatus($row, $expected, $token) {
|
|
if ($expected === 'enabled') {
|
|
$message_title = 'API token enabled';
|
|
$column_status = 'Enabled';
|
|
$db_status = '0';
|
|
}
|
|
else {
|
|
$message_title = 'API token disabled';
|
|
$column_status = 'Disabled';
|
|
$db_status = '1';
|
|
}
|
|
|
|
$this->assertMessage(TEST_GOOD, $message_title);
|
|
$this->assertEquals($column_status, $row->getColumn('Status')->getText());
|
|
$this->assertEquals($db_status, CDBHelper::getValue('SELECT status FROM token WHERE name='.zbx_dbstr($token)));
|
|
}
|
|
|
|
/**
|
|
* Function that checks filtering of API tokens list.
|
|
*
|
|
* @param array $data Data provider.
|
|
* @param string $source Section from which the scenario is executed.
|
|
*/
|
|
public function checkFilter($data, $source) {
|
|
if ($source === 'administration') {
|
|
$url = 'zabbix.php?action=token.list';
|
|
$sql = 'SELECT tokenid FROM token';
|
|
}
|
|
else {
|
|
$url = 'zabbix.php?action=user.token.list';
|
|
$sql = 'SELECT tokenid FROM token WHERE userid=1';
|
|
}
|
|
$this->page->login()->open($url);
|
|
|
|
// Apply and submit the filter from data provider.
|
|
$form = $this->query('name:zbx_filter')->asForm()->one();
|
|
|
|
if (array_key_exists('Expires in less than', $data)) {
|
|
$form->query('xpath:.//label[@for="filter-expires-state"]/span')->asCheckbox()->one()->set(true);
|
|
$form->query('xpath:.//input[@id="filter-expires-days"]')->one()->fill($data['Expires in less than']);
|
|
}
|
|
|
|
$form->fill($data['filter']);
|
|
$form->submit();
|
|
$this->page->waitUntilReady();
|
|
|
|
if (CTestArrayHelper::get($data, 'no_data')) {
|
|
$this->assertTableData();
|
|
}
|
|
else {
|
|
// Using token name check that only the expected filters are returned in the list.
|
|
$this->assertTableDataColumn(CTestArrayHelper::get($data, 'expected'));
|
|
}
|
|
|
|
// Reset the filter and check that all API tokens are displayed.
|
|
$this->query('button:Reset')->one()->click();
|
|
$this->assertTableStats(CDBHelper::getCount($sql));
|
|
}
|
|
|
|
/**
|
|
* Function that check sorting tokens by columns in the API tokens list table.
|
|
*
|
|
* @param array $data Data provider.
|
|
* @param string $url URL of the view with the API tokens list.
|
|
*/
|
|
public function checkSorting($data, $url) {
|
|
$this->page->login()->open($url);
|
|
$table = $this->query('class:list-table')->asTable()->one();
|
|
$header = $table->query('xpath:.//a[text()="'.$data['sort_field'].'"]')->one();
|
|
|
|
foreach(['asc', 'desc'] as $sorting) {
|
|
$expected = ($sorting === 'asc') ? $data['expected'] : array_reverse($data['expected']);
|
|
$values = [];
|
|
|
|
$header->click();
|
|
foreach ($table->getRows() as $row) {
|
|
$values[] = $row->getColumn($data['sort_field'])->getText();
|
|
}
|
|
$this->assertEquals($expected, $values);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Function that check deletion of API tokens from the list.
|
|
*
|
|
* @param string $url URL of the view with the API tokens list.
|
|
* @param string $token Name of the token to be deleted.
|
|
*/
|
|
public function checkDelete($url, $token) {
|
|
$this->page->login()->open($url);
|
|
|
|
// Delete API token.
|
|
$this->query('class:list-table')->asTable()->one()->findRow('Name', $token)->select();
|
|
$this->query('button:Delete')->one()->waitUntilClickable()->click();
|
|
$this->page->acceptAlert();
|
|
$this->assertMessage(TEST_GOOD, 'API token deleted');
|
|
|
|
// Check that token is deleted from DB.
|
|
$this->assertEquals(0, CDBHelper::getCount('SELECT tokenid FROM token WHERE name='.zbx_dbstr($token)));
|
|
}
|
|
}
|