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.

1099 lines
25 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/CAPITest.php';
/**
* @backup valuemap
*/
class testValuemap extends CAPITest {
public static function valuemap_create() {
return [
[
'valuemap' => [
'name' => 'non existent parameter',
'valuemapid' => 4,
'mappings' => [
[
'value' => '0',
'newvalue' => 'Down'
]
]
],
'expected_error' => 'Invalid parameter "/1": unexpected parameter "valuemapid".'
],
// Check valuemap name.
[
'valuemap' => [
'mappings' => [
[
'value' => '0',
'newvalue' => 'Down'
]
]
],
'expected_error' => 'Invalid parameter "/1": the parameter "hostid" is missing.'
],
[
'valuemap' => [
'hostid' => '',
'mappings' => [
[
'value' => '0',
'newvalue' => 'Down'
]
]
],
'expected_error' => 'Invalid parameter "/1/hostid": a number is expected.'
],
[
'valuemap' => [
'hostid' => '123123123',
'name' => 'unknown hostid',
'mappings' => [
[
'value' => '0',
'newvalue' => 'Down'
]
]
],
'expected_error' => 'No permissions to referred object or it does not exist!'
],
// Check valuemap name.
[
'valuemap' => [
'hostid' => '1',
'mappings' => [
[
'value' => '0',
'newvalue' => 'Down'
]
]
],
'expected_error' => 'Invalid parameter "/1": the parameter "name" is missing.'
],
[
'valuemap' => [
'hostid' => '1',
'name' => '',
'mappings' => [
[
'value' => '0',
'newvalue' => 'Down'
]
]
],
'expected_error' => 'Invalid parameter "/1/name": cannot be empty.'
],
[
'valuemap' => [
'hostid' => '1',
'name' => 'Pellentesque rutrum, odio at imperdiet venenatis, mauris mauris65',
'mappings' => [
[
'value' => '0',
'newvalue' => 'Down'
]
]
],
'expected_error' => 'Invalid parameter "/1/name": value is too long.'
],
[
'valuemap' => [
'hostid' => '50009',
'name' => 'API value duplicate',
'mappings' => [
[
'value' => '0',
'newvalue' => 'Down'
]
]
],
'expected_error' => 'Value map "API value duplicate" already exists.'
],
[
'valuemap' => [
[
'hostid' => '50009',
'name' => 'Valuemaps with the same names',
'mappings' => [
[
'value' => '0',
'newvalue' => 'Down'
]
]
],
[
'hostid' => '50009',
'name' => 'Valuemaps with the same names',
'mappings' => [
[
'value' => '0',
'newvalue' => 'Down'
]
]
]
],
'expected_error' => 'Invalid parameter "/2": value (hostid, name)=(50009, Valuemaps with the same names) already exists.'
],
// Check valuemap mappings.
[
'valuemap' => [
'hostid' => '1',
'name' => 'non existent parameter',
'mappings' => [
[
'value' => '0',
'newvalue' => 'Down',
'mappingid' => '4'
]
]
],
'expected_error' => 'Invalid parameter "/1/mappings/1": unexpected parameter "mappingid".'
],
[
'valuemap' => [
'hostid' => '1',
'name' => 'without mappings'
],
'expected_error' => 'Invalid parameter "/1": the parameter "mappings" is missing.'
],
[
'valuemap' => [
'hostid' => '1',
'name' => 'without mapping parameters',
'mappings' => []
],
'expected_error' => 'Invalid parameter "/1/mappings": cannot be empty.'
],
[
'valuemap' => [
'hostid' => '1',
'name' => 'without mapping value',
'mappings' => [
[
'newvalue' => 'Down'
]
]
],
'expected_error' => 'Invalid parameter "/1/mappings/1": the parameter "value" is missing.'
],
[
'valuemap' => [
'hostid' => '1',
'name' => 'without mapping newvalue',
'mappings' => [
[
'value' => '0'
]
]
],
'expected_error' => 'Invalid parameter "/1/mappings/1": the parameter "newvalue" is missing.'
],
[
'valuemap' => [
'hostid' => '1',
'name' => 'long value',
'mappings' => [
[
'value' => 'Pellentesque rutrum, odio at imperdiet venenatis, mauris mauris65',
'newvalue' => 'test'
]
]
],
'expected_error' => 'Invalid parameter "/1/mappings/1/value": value is too long.'
],
[
'valuemap' => [
'hostid' => '1',
'name' => 'long newvalue',
'mappings' => [
[
'value' => '0',
'newvalue' => 'Pellentesque rutrum, odio at imperdiet venenatis, mauris mauris65'
]
]
],
'expected_error' => 'Invalid parameter "/1/mappings/1/newvalue": value is too long.'
],
[
'valuemap' => [
'hostid' => '1',
'name' => 'the same mapping values',
'mappings' => [
[
'value' => '0',
'newvalue' => 'Down'
],
[
'value' => '0',
'newvalue' => 'Up'
]
]
],
'expected_error' => 'Invalid parameter "/1/mappings/2": value (value)=(0) already exists.'
],
[
'valuemap' => [
[
'hostid' => '50009',
'name' => 'API value is required for type equal',
'mappings' => [
[
'type' => VALUEMAP_MAPPING_TYPE_EQUAL,
'newvalue' => 'fail'
]
]
]
],
'expected_error' => 'Invalid parameter "/1/mappings/1": the parameter "value" is missing.'
],
[
'valuemap' => [
[
'hostid' => '50009',
'name' => 'API value is required for type greater or equal',
'mappings' => [
[
'type' => VALUEMAP_MAPPING_TYPE_GREATER_EQUAL,
'newvalue' => 'fail'
]
]
]
],
'expected_error' => 'Invalid parameter "/1/mappings/1": the parameter "value" is missing.'
],
[
'valuemap' => [
[
'hostid' => '50009',
'name' => 'API value is required for type less or equal',
'mappings' => [
[
'type' => VALUEMAP_MAPPING_TYPE_LESS_EQUAL,
'newvalue' => 'fail'
]
]
]
],
'expected_error' => 'Invalid parameter "/1/mappings/1": the parameter "value" is missing.'
],
[
'valuemap' => [
[
'hostid' => '50009',
'name' => 'API value is required for type range',
'mappings' => [
[
'type' => VALUEMAP_MAPPING_TYPE_IN_RANGE,
'newvalue' => 'fail'
]
]
]
],
'expected_error' => 'Invalid parameter "/1/mappings/1": the parameter "value" is missing.'
],
[
'valuemap' => [
[
'hostid' => '50009',
'name' => 'API value is required for type greater or equal',
'mappings' => [
[
'type' => VALUEMAP_MAPPING_TYPE_REGEXP,
'newvalue' => 'fail'
]
]
]
],
'expected_error' => 'Invalid parameter "/1/mappings/1": the parameter "value" is missing.'
],
[
'valuemap' => [
[
'hostid' => '50009',
'name' => 'API value should be empty for type default',
'mappings' => [
[
'type' => VALUEMAP_MAPPING_TYPE_DEFAULT,
'value' => 'fail',
'newvalue' => 'fail'
]
]
]
],
'expected_error' => 'Invalid parameter "/1/mappings/1/value": should be empty.'
],
[
'valuemap' => [
[
'hostid' => '50009',
'name' => 'type and value combination should be unique',
'mappings' => [
[
'type' => VALUEMAP_MAPPING_TYPE_EQUAL,
'value' => '10',
'newvalue' => '1 fail'
],
[
'type' => VALUEMAP_MAPPING_TYPE_EQUAL,
'value' => '10',
'newvalue' => '2 fail'
]
]
]
],
'expected_error' => 'Invalid parameter "/1/mappings/2": value (value)=(10) already exists.'
],
[
'valuemap' => [
[
'hostid' => '50009',
'name' => 'API only one type default is allowed',
'mappings' => [
[
'type' => VALUEMAP_MAPPING_TYPE_DEFAULT,
'newvalue' => '1 fail'
],
[
'type' => VALUEMAP_MAPPING_TYPE_DEFAULT,
'value' => '',
'newvalue' => '2 fail'
]
]
]
],
'expected_error' => 'Invalid parameter "/1/mappings/2": value (type)=(5) already exists.'
],
[
'valuemap' => [
[
'hostid' => '50009',
'name' => 'API float value with zero suffix check for geq mapping',
'mappings' => [
[
'type' => VALUEMAP_MAPPING_TYPE_GREATER_EQUAL,
'value' => '7',
'newvalue' => '1 fail'
],
[
'type' => VALUEMAP_MAPPING_TYPE_GREATER_EQUAL,
'value' => '7.00',
'newvalue' => '2 fail'
]
]
]
],
'expected_error' => 'Invalid parameter "/1/mappings/2": value (value)=(7) already exists.'
],
// Successfully create.
[
'valuemap' => [
[
'hostid' => '50009',
'name' => 'API equal value uniqueness check as string for eq mapping',
'mappings' => [
[
'type' => VALUEMAP_MAPPING_TYPE_EQUAL,
'value' => '5',
'newvalue' => '5'
],
[
'type' => VALUEMAP_MAPPING_TYPE_EQUAL,
'value' => '5.00',
'newvalue' => '5.00'
]
]
]
],
'expected_error' => null
],
[
'valuemap' => [
[
'hostid' => '50009',
'name' => 'API float value uniqueness validation for geq mapping',
'mappings' => [
[
'type' => VALUEMAP_MAPPING_TYPE_GREATER_EQUAL,
'value' => '5',
'newvalue' => '5'
],
[
'type' => VALUEMAP_MAPPING_TYPE_GREATER_EQUAL,
'value' => '5.001',
'newvalue' => '5.001'
]
]
]
],
'expected_error' => null
],
[
'valuemap' => [
[
'hostid' => '50009',
'name' => 'API value map created',
'mappings' => [
[
'value' => '123',
'newvalue' => 'api_value'
]
]
]
],
'expected_error' => null
],
[
'valuemap' => [
[
'hostid' => '50009',
'name' => 'АПИ УТФ-8',
'mappings' => [
[
'value' => 'один',
'newvalue' => 'два'
]
]
]
],
'expected_error' => null
],
[
'valuemap' => [
[
'hostid' => '50009',
'name' => 'API create value map with two values',
'mappings' => [
[
'value' => '0',
'newvalue' => 'Down'
],
[
'value' => '1',
'newvalue' => 'Up'
]
]
]
],
'expected_error' => null
],
[
'valuemap' => [
[
'hostid' => '50009',
'name' => 'API create valuemap one',
'mappings' => [
[
'value' => '0',
'newvalue' => 'Down'
]
]
],
[
'hostid' => '50009',
'name' => 'æų',
'mappings' => [
[
'value' => 'æų',
'newvalue' => 'æų'
]
]
]
],
'expected_error' => null
],
[
'valuemap' => [
[
'hostid' => '50009',
'name' => 'API create value map with mapping types',
'mappings' => [
[
'type' => VALUEMAP_MAPPING_TYPE_DEFAULT,
'newvalue' => 'default'
],
[
'type' => VALUEMAP_MAPPING_TYPE_REGEXP,
'value' => '/[0-9]{3,}/',
'newvalue' => 'regexp'
],
[
'type' => VALUEMAP_MAPPING_TYPE_IN_RANGE,
'value' => '10-20,-20--10,20,0.5-0.7,-0.7--0.5',
'newvalue' => 'range'
],
[
'type' => VALUEMAP_MAPPING_TYPE_LESS_EQUAL,
'value' => '10',
'newvalue' => '<=10'
],
[
'type' => VALUEMAP_MAPPING_TYPE_GREATER_EQUAL,
'value' => '10',
'newvalue' => '>=10'
],
[
'type' => VALUEMAP_MAPPING_TYPE_EQUAL,
'value' => '10',
'newvalue' => '10'
],
[
'type' => VALUEMAP_MAPPING_TYPE_EQUAL,
'value' => 'A',
'newvalue' => 'A'
],
[
'type' => VALUEMAP_MAPPING_TYPE_EQUAL,
'value' => '0.5',
'newvalue' => '0.5'
]
]
]
],
'expected_error' => null
],
[
'valuemap' => [
[
'hostid' => '50009',
'name' => 'API mapping type default value can be empty when defined',
'mappings' => [
[
'type' => VALUEMAP_MAPPING_TYPE_DEFAULT,
'value' => '',
'newvalue' => 'default'
]
]
]
],
'expected_error' => null
]
];
}
/**
* @dataProvider valuemap_create
*/
public function testValuemap_Create($valuemap, $expected_error) {
$result = $this->call('valuemap.create', $valuemap, $expected_error);
if ($expected_error === null) {
foreach ($result['result']['valuemapids'] as $key => $id) {
$dbResult = DBSelect('select * from valuemap where valuemapid='.zbx_dbstr($id));
$dbRow = DBFetch($dbResult);
$this->assertEquals($dbRow['name'], $valuemap[$key]['name']);
foreach ($valuemap[$key]['mappings'] as $values) {
$values += ['value' => ''];
$this->assertEquals(1, CDBHelper::getCount('select * from valuemap_mapping where valuemapid='.zbx_dbstr($id).
' and value='.zbx_dbstr($values['value']).' and newvalue='.zbx_dbstr($values['newvalue']))
);
}
}
}
}
public static function valuemap_update() {
return [
[
'valuemap' => [[
'valuemapid' => '18',
'name' => 'API update non existent parameter',
'value' => 4
]],
'expected_error' => 'Invalid parameter "/1": unexpected parameter "value".'
],
// Check valuemap id.
[
'valuemap' => [[
'name' => 'API valuemap updated'
]],
'expected_error' => 'Invalid parameter "/1": the parameter "valuemapid" is missing.'
],
[
'valuemap' => [[
'valuemapid' => '',
'name' => 'API valuemap updated'
]],
'expected_error' => 'Invalid parameter "/1/valuemapid": a number is expected.'
],
[
'valuemap' => [[
'valuemapid' => '123456',
'hostid' => '',
'name' => 'API valuemap updated'
]],
'expected_error' => 'Invalid parameter "/1": unexpected parameter "hostid".'
],
[
'valuemap' => [[
'valuemapid' => '123456',
'name' => 'API valuemap updated'
]],
'expected_error' => 'No permissions to referred object or it does not exist!'
],
[
'valuemap' => [[
'valuemapid' => 'abc',
'name' => 'API valuemap updated'
]],
'expected_error' => 'Invalid parameter "/1/valuemapid": a number is expected.'
],
[
'valuemap' => [[
'valuemapid' => '0.0',
'name' => 'API valuemap udated'
]],
'expected_error' => 'Invalid parameter "/1/valuemapid": a number is expected.'
],
[
'valuemap' => [
[
'valuemapid' => '19',
'name' => 'API valuemap with the same ids1'
],
[
'valuemapid' => '19',
'name' => 'API valuemap with the same ids2'
]
],
'expected_error' => 'Invalid parameter "/2": value (valuemapid)=(19) already exists.'
],
// Check valuemap name.
[
'valuemap' => [[
'valuemapid' => '18',
'name' => ''
]],
'expected_error' => 'Invalid parameter "/1/name": cannot be empty.'
],
[
'valuemap' => [[
'valuemapid' => '18',
'name' => 'Pellentesque rutrum, odio at imperdiet venenatis, mauris mauris65',
'mappings' => [
[
'value' => '0',
'newvalue' => 'Down'
]
]
]],
'expected_error' => 'Invalid parameter "/1/name": value is too long.'
],
// Check valuemap mappings.
[
'valuemap' => [[
'valuemapid' => '18',
'name' => 'API update without mappings',
'mappings' => []
]],
'expected_error' => 'Invalid parameter "/1/mappings": cannot be empty.'
],
[
'valuemap' => [[
'valuemapid' => '18',
'name' => 'API update without mapping newvalue',
'mappings' => [
[
'value' => '0'
]
]
]],
'expected_error' => 'Invalid parameter "/1/mappings/1": the parameter "newvalue" is missing.'
],
[
'valuemap' => [[
'valuemapid' => '18',
'name' => 'API update long newvalue',
'mappings' => [
[
'value' => '0',
'newvalue' => 'Pellentesque rutrum, odio at imperdiet venenatis, mauris mauris65'
]
]
]],
'expected_error' => 'Invalid parameter "/1/mappings/1/newvalue": value is too long.'
],
[
'valuemap' => [[
'valuemapid' => '18',
'name' => 'API update without mapping value',
'mappings' => [
[
'newvalue' => 'Down'
]
]
]],
'expected_error' => 'Invalid parameter "/1/mappings/1": the parameter "value" is missing.'
],
[
'valuemap' => [[
'valuemapid' => '18',
'name' => 'API update long value',
'mappings' => [
[
'value' => 'Pellentesque rutrum, odio at imperdiet venenatis, mauris mauris65',
'newvalue' => 'Up'
]
]
]],
'expected_error' => 'Invalid parameter "/1/mappings/1/value": value is too long.'
],
[
'valuemap' => [[
'valuemapid' => '18',
'name' => 'API update non existent parameter',
'mappings' => [
[
'value' => '0',
'newvalue' => 'Down',
'mappingid' => 4
]
]
]],
'expected_error' => 'Invalid parameter "/1/mappings/1": unexpected parameter "mappingid".'
],
[
'valuemap' => [[
'valuemapid' => '18',
'name' => 'API update with the same mapping values',
'mappings' => [
[
'value' => '0',
'newvalue' => 'Down'
],
[
'value' => '0',
'newvalue' => 'Up'
]
]
]],
'expected_error' => 'Invalid parameter "/1/mappings/2": value (value)=(0) already exists.'
],
// Check successfully update.
[
'valuemap' => [
[
'valuemapid' => '19',
'name' => 'API valuemap name updated'
]
],
'expected_error' => null
],
[
'valuemap' => [
[
'valuemapid' => '18',
'name' => 'API mappings updated',
'mappings' => [
[
'value' => '123',
'newvalue' => 'api_value'
]
]
]
],
'expected_error' => null
],
[
'valuemap' => [
[
'valuemapid' => '18',
'name' => 'Апи обновление',
'mappings' => [
[
'value' => 'параметр',
'newvalue' => 'значение'
]
]
]
],
'expected_error' => null
],
[
'valuemap' => [
[
'valuemapid' => '18',
'name' => 'API update valuemap with two values',
'mappings' => [
[
'value' => 'æų',
'newvalue' => 'æų'
],
[
'value' => '1',
'newvalue' => 'Up'
]
]
]
],
'expected_error' => null
],
[
'valuemap' => [
[
'valuemapid' => '18',
'name' => 'API update valuemap one',
'mappings' => [
[
'value' => 'abc',
'newvalue' => '123'
]
]
],
[
'valuemapid' => '19',
'name' => 'API update valuemap two',
'mappings' => [
[
'value' => 'def',
'newvalue' => '456'
]
]
]
],
'expected_error' => null
],
[
'valuemap' => [
[
'valuemapid' => '18',
'name' => 'API update valuemap one',
'mappings' => [
[
'type' => VALUEMAP_MAPPING_TYPE_DEFAULT,
'newvalue' => 'default'
],
[
'type' => VALUEMAP_MAPPING_TYPE_REGEXP,
'value' => '/[0-9]{3,}/',
'newvalue' => 'regexp'
],
[
'type' => VALUEMAP_MAPPING_TYPE_IN_RANGE,
'value' => '10-20,-20--10,20,0.5-0.7,-0.7--0.5',
'newvalue' => 'range'
],
[
'type' => VALUEMAP_MAPPING_TYPE_LESS_EQUAL,
'value' => '10.5',
'newvalue' => '<=10.5'
],
[
'type' => VALUEMAP_MAPPING_TYPE_GREATER_EQUAL,
'value' => '20.5',
'newvalue' => '>=20.5'
],
[
'type' => VALUEMAP_MAPPING_TYPE_EQUAL,
'value' => 'A',
'newvalue' => 'A'
],
[
'type' => VALUEMAP_MAPPING_TYPE_EQUAL,
'value' => '10',
'newvalue' => '10'
],
[
'type' => VALUEMAP_MAPPING_TYPE_EQUAL,
'value' => '0.5',
'newvalue' => '0.5'
]
]
]
],
'expected_error' => null
]
];
}
/**
* @dataProvider valuemap_update
*/
public function testValuemap_Update($valuemaps, $expected_error) {
$result = $this->call('valuemap.update', $valuemaps, $expected_error);
if ($expected_error === null) {
foreach ($result['result']['valuemapids'] as $key => $id) {
$dbResult = DBSelect('select * from valuemap where valuemapid='.zbx_dbstr($id));
$dbRow = DBFetch($dbResult);
$this->assertEquals($dbRow['name'], $valuemaps[$key]['name']);
if (array_key_exists('mappings', $valuemaps[$key])){
$db_mappings = CDBHelper::getAll(
'SELECT type,value,newvalue'.
' FROM valuemap_mapping'.
' WHERE valuemapid='.zbx_dbstr($id).
' ORDER BY sortorder ASC'
);
foreach ($valuemaps[$key]['mappings'] as $i => $mapping) {
$mapping = $mapping + ['type' => VALUEMAP_MAPPING_TYPE_EQUAL, 'value' => ''];
$this->assertEquals($mapping, $db_mappings[$i]);
}
}
}
}
else {
foreach ($valuemaps as $valuemap) {
if (array_key_exists('name', $valuemap) && $valuemap['name'] !== 'APC Battery Replacement Status'){
$this->assertEquals(0, CDBHelper::getCount('select * from valuemap where name='.zbx_dbstr($valuemap['name'])));
}
}
}
}
public static function valuemap_delete() {
return [
[
'valuemap' => [],
'expected_error' => 'Invalid parameter "/": cannot be empty.'
],
[
'valuemap' => [
''
],
'expected_error' => 'Invalid parameter "/1": a number is expected.'
],
[
'valuemap' => [
'123456'
],
'expected_error' => 'No permissions to referred object or it does not exist!'
],
[
'valuemap' => [
'abc'
],
'expected_error' => 'Invalid parameter "/1": a number is expected.'
],
[
'valuemap' => [
'.'
],
'expected_error' => 'Invalid parameter "/1": a number is expected.'
],
[
'valuemap' => [
'20',
'123456'
],
'expected_error' => 'No permissions to referred object or it does not exist!'
],
[
'valuemap' => [
'20',
'abc'
],
'expected_error' => 'Invalid parameter "/2": a number is expected.'
],
[
'valuemap' => [
'20',
''
],
'expected_error' => 'Invalid parameter "/2": a number is expected.'
],
[
'valuemap' => [
'20',
'20'
],
'expected_error' => 'Invalid parameter "/2": value (20) already exists.'
],
[
'valuemap' => [
'21'
],
'expected_error' => null
],
[
'valuemap' => [
'22',
'23'
],
'expected_error' => null
]
];
}
/**
* @dataProvider valuemap_delete
*/
public function testValuemap_Delete($valuemap, $expected_error) {
$result = $this->call('valuemap.delete', $valuemap, $expected_error);
if ($expected_error === null) {
foreach ($result['result']['valuemapids'] as $id) {
$this->assertEquals(0, CDBHelper::getCount('select * from valuemap where valuemapid='.zbx_dbstr($id)));
$this->assertEquals(0, CDBHelper::getCount('select * from valuemap_mapping where valuemapid='.zbx_dbstr($id)));
}
}
}
public static function valuemap_user_permission() {
return [
[
'method' => 'valuemap.create',
'user' => ['user' => 'zabbix-user', 'password' => 'zabbix'],
'valuemap' => [
'hostid' => '50009',
'name' => 'API value create as zabbix user',
'mappings' =>[
[
'value' => '123',
'newvalue' => 'api_value'
]
]
],
'expected_error' => 'No permissions to call "valuemap.create".'
],
[
'method' => 'valuemap.update',
'user' => ['user' => 'zabbix-user', 'password' => 'zabbix'],
'valuemap' => [
'valuemapid' => '19',
'name' => 'API value update as zabbix user'
],
'expected_error' => 'No permissions to call "valuemap.update".'
],
[
'method' => 'valuemap.delete',
'user' => ['user' => 'zabbix-user', 'password' => 'zabbix'],
'valuemap' => [
'20'
],
'expected_error' => 'No permissions to call "valuemap.delete".'
]
];
}
/**
* @dataProvider valuemap_user_permission
*/
public function testValuemap_UserPermissions($method, $user, $valuemap, $expected_error) {
$this->authorize($user['user'], $user['password']);
$this->call($method, $valuemap, $expected_error);
}
}