<?php
/*
** Copyright (C) 2001-2025 Zabbix SIA
**
** This program is free software: you can redistribute it and/or modify it under the terms of
** the GNU Affero General Public License as published by the Free Software Foundation, version 3.
**
** 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 Affero General Public License for more details.
**
** You should have received a copy of the GNU Affero General Public License along with this program.
** If not, see <https://www.gnu.org/licenses/>.
**/


require_once dirname(__FILE__).'/../include/CAPITest.php';

/**
 * @onBefore prepareTestData
 * @onAfter  cleanTestData
 */
class testTriggerPermissions extends CAPITest {

	public static function prepareTestData(): void {
		CTestDataHelper::createObjects([
			'template_groups' => [
				['name' => 'ug1(W)ug2(R)ug3(D)ug4(N)']
			],
			'host_groups' => [
				['name' => 'ug1(W)ug2(R)ug3(D)ug4(N)'],
				['name' => 'hg.other'],
				['name' => 'mht.hg1'],
				['name' => 'mht.hg2'],
				['name' => 'mht.hg3'],
				['name' => 'mht.hg4'],
				['name' => 'mht.hg.other']
			],
			'templates' => [
				[
					'host' => 't1',
					'groups' => [
						'groupid' => ':template_group:ug1(W)ug2(R)ug3(D)ug4(N)'
					],
					'items' => [
						['key_' => 'i1']
					]
				]
			],
			'hosts' => [
				[
					'host' => 'h1',
					'groups' => [
						'groupid' => ':host_group:ug1(W)ug2(R)ug3(D)ug4(N)'
					],
					'items' => [
						['key_' => 'i1']
					]
				],
				[
					'host' => 'mht.h1',
					'groups' => [
						'groupid' => ':host_group:mht.hg1'
					],
					'items' => [
						['key_' => 'i1']
					]
				],
				[
					'host' => 'mht.h2',
					'groups' => [
						'groupid' => ':host_group:mht.hg2'
					],
					'items' => [
						['key_' => 'i1']
					]
				],
				[
					'host' => 'mht.h3',
					'groups' => [
						'groupid' => ':host_group:mht.hg3'
					],
					'items' => [
						['key_' => 'i1']
					]
				],
				[
					'host' => 'mht.h4',
					'groups' => [
						'groupid' => ':host_group:mht.hg4'
					],
					'items' => [
						['key_' => 'i1']
					]
				]
			],
			'triggers' => [
				'tg1(t1(i1))' => ['description' => 'tg1(t1(i1))', 'expression' => 'last(/t1/i1)=0'],
				'tg1(h1(i1))' => ['description' => 'tg1(h1(i1))', 'expression' => 'last(/h1/i1)=0'],
				'mht.tg1(h1,h2)' => [
					'description' => 'mht.tg1(h1,h2)',
					'expression' => 'last(/mht.h1/i1)=0 and last(/mht.h2/i1)=0'
				],
				'mht.tg1(h1,h3)' => [
					'description' => 'mht.tg1(h1,h3)',
					'expression' => 'last(/mht.h1/i1)=0 and last(/mht.h3/i1)=0'
				],
				'mht.tg1(h1,h4)' => [
					'description' => 'mht.tg1(h1,h4)',
					'expression' => 'last(/mht.h1/i1)=0 and last(/mht.h4/i1)=0'
				],
				'mht.tg1(h2,h3)' => [
					'description' => 'mht.tg1(h2,h3)',
					'expression' => 'last(/mht.h2/i1)=0 and last(/mht.h3/i1)=0'
				],
				'mht.tg1(h2,h4)' => [
					'description' => 'mht.tg1(h2,h4)',
					'expression' => 'last(/mht.h2/i1)=0 and last(/mht.h4/i1)=0'
				],
				'mht.tg1(h3,h4)' => [
					'description' => 'mht.tg1(h3,h4)',
					'expression' => 'last(/mht.h3/i1)=0 and last(/mht.h4/i1)=0'
				]
			],
			'roles' => [
				['name' => 'r1', 'type' => USER_TYPE_ZABBIX_ADMIN]
			],
			'user_groups' => [
				[
					'name' => 'ug1(W)',
					'templategroup_rights' => [
						['id' => ':template_group:ug1(W)ug2(R)ug3(D)ug4(N)', 'permission' => PERM_READ_WRITE]
					],
					'hostgroup_rights' => [
						['id' => ':host_group:ug1(W)ug2(R)ug3(D)ug4(N)', 'permission' => PERM_READ_WRITE]
					]
				],
				[
					'name' => 'ug2(R)',
					'templategroup_rights' => [
						['id' => ':template_group:ug1(W)ug2(R)ug3(D)ug4(N)', 'permission' => PERM_READ]
					],
					'hostgroup_rights' => [
						['id' => ':host_group:ug1(W)ug2(R)ug3(D)ug4(N)', 'permission' => PERM_READ]
					]
				],
				[
					'name' => 'ug3(D)',
					'templategroup_rights' => [
						['id' => ':template_group:ug1(W)ug2(R)ug3(D)ug4(N)', 'permission' => PERM_DENY]
					],
					'hostgroup_rights' => [
						['id' => ':host_group:ug1(W)ug2(R)ug3(D)ug4(N)', 'permission' => PERM_DENY]
					]
				],
				[
					'name' => 'ug4(N)',
					'hostgroup_rights' => [
						['id' => ':host_group:hg.other', 'permission' => PERM_READ]
					]
				],
				[
					'name' => 'mht.ug1(W)',
					'hostgroup_rights' => [
						['id' => ':host_group:mht.hg1', 'permission' => PERM_READ_WRITE]
					]
				],
				[
					'name' => 'mht.ug2(R)',
					'hostgroup_rights' => [
						['id' => ':host_group:mht.hg2', 'permission' => PERM_READ]
					]
				],
				[
					'name' => 'mht.ug3(D)',
					'hostgroup_rights' => [
						['id' => ':host_group:mht.hg3', 'permission' => PERM_DENY]
					]
				],
				[
					'name' => 'mht.ug4(N)',
					'hostgroup_rights' => [
						['id' => ':host_group:mht.hg.other', 'permission' => PERM_READ]
					]
				],
				[
					'name' => 'mt.ug1(W)',
					'templategroup_rights' => [
						['id' => ':template_group:ug1(W)ug2(R)ug3(D)ug4(N)', 'permission' => PERM_READ_WRITE]
					],
					'hostgroup_rights' => [
						['id' => ':host_group:ug1(W)ug2(R)ug3(D)ug4(N)', 'permission' => PERM_READ_WRITE],
						['id' => ':host_group:hg.other', 'permission' => PERM_READ_WRITE],
						['id' => ':host_group:mht.hg1', 'permission' => PERM_READ_WRITE],
						['id' => ':host_group:mht.hg2', 'permission' => PERM_READ_WRITE],
						['id' => ':host_group:mht.hg3', 'permission' => PERM_READ_WRITE],
						['id' => ':host_group:mht.hg4', 'permission' => PERM_READ_WRITE],
						['id' => ':host_group:mht.hg.other', 'permission' => PERM_READ_WRITE]
					]
				],
				[
					'name' => 'mt.ug1(R)',
					'templategroup_rights' => [
						['id' => ':template_group:ug1(W)ug2(R)ug3(D)ug4(N)', 'permission' => PERM_READ]
					],
					'hostgroup_rights' => [
						['id' => ':host_group:ug1(W)ug2(R)ug3(D)ug4(N)', 'permission' => PERM_READ],
						['id' => ':host_group:hg.other', 'permission' => PERM_READ],
						['id' => ':host_group:mht.hg1', 'permission' => PERM_READ],
						['id' => ':host_group:mht.hg2', 'permission' => PERM_READ],
						['id' => ':host_group:mht.hg3', 'permission' => PERM_READ],
						['id' => ':host_group:mht.hg4', 'permission' => PERM_READ],
						['id' => ':host_group:mht.hg.other', 'permission' => PERM_READ]
					]
				],
				[
					'name' => 'mt.ug1(D)',
					'templategroup_rights' => [
						['id' => ':template_group:ug1(W)ug2(R)ug3(D)ug4(N)', 'permission' => PERM_DENY]
					],
					'hostgroup_rights' => [
						['id' => ':host_group:ug1(W)ug2(R)ug3(D)ug4(N)', 'permission' => PERM_DENY],
						['id' => ':host_group:hg.other', 'permission' => PERM_DENY],
						['id' => ':host_group:mht.hg1', 'permission' => PERM_DENY],
						['id' => ':host_group:mht.hg2', 'permission' => PERM_DENY],
						['id' => ':host_group:mht.hg3', 'permission' => PERM_DENY],
						['id' => ':host_group:mht.hg4', 'permission' => PERM_DENY],
						['id' => ':host_group:mht.hg.other', 'permission' => PERM_DENY]
					]
				],
				[
					'name' => 'mt.ug1(N)'
				],
				[
					'name' => 'mt.ug1(mixed)',
					'templategroup_rights' => [
						['id' => ':template_group:ug1(W)ug2(R)ug3(D)ug4(N)', 'permission' => PERM_DENY]
					],
					'hostgroup_rights' => [
						['id' => ':host_group:ug1(W)ug2(R)ug3(D)ug4(N)', 'permission' => PERM_READ_WRITE],
						['id' => ':host_group:hg.other', 'permission' => PERM_READ_WRITE],
						['id' => ':host_group:mht.hg1', 'permission' => PERM_READ_WRITE],
						['id' => ':host_group:mht.hg2', 'permission' => PERM_READ],
						['id' => ':host_group:mht.hg3', 'permission' => PERM_READ],
						['id' => ':host_group:mht.hg4', 'permission' => PERM_DENY]
					]
				]
			],
			'users' => [
				[
					'username' => 'u1',
					'passwd' => '|-|e!1@ (/\)0rLD!',
					'usrgrps' => [
						['usrgrpid' => ':user_group:ug1(W)']
					]
				],
				[
					'username' => 'u2',
					'passwd' => '|-|e!1@ (/\)0rLD!',
					'usrgrps' => [
						['usrgrpid' => ':user_group:ug2(R)']
					]
				],
				[
					'username' => 'u3',
					'passwd' => '|-|e!1@ (/\)0rLD!',
					'usrgrps' => [
						['usrgrpid' => ':user_group:ug3(D)']
					]
				],
				[
					'username' => 'u4',
					'passwd' => '|-|e!1@ (/\)0rLD!',
					'usrgrps' => [
						['usrgrpid' => ':user_group:ug4(N)']
					]
				],
				[
					'username' => 'u1(ug1,ug2)',
					'passwd' => '|-|e!1@ (/\)0rLD!',
					'usrgrps' => [
						['usrgrpid' => ':user_group:ug1(W)'],
						['usrgrpid' => ':user_group:ug2(R)']
					]
				],
				[
					'username' => 'u1(ug1,ug3)',
					'passwd' => '|-|e!1@ (/\)0rLD!',
					'usrgrps' => [
						['usrgrpid' => ':user_group:ug1(W)'],
						['usrgrpid' => ':user_group:ug3(D)']
					]
				],
				[
					'username' => 'u1(ug1,ug4)',
					'passwd' => '|-|e!1@ (/\)0rLD!',
					'usrgrps' => [
						['usrgrpid' => ':user_group:ug1(W)'],
						['usrgrpid' => ':user_group:ug4(N)']
					]
				],
				[
					'username' => 'mht.u1',
					'passwd' => '|-|e!1@ (/\)0rLD!',
					'usrgrps' => [
						['usrgrpid' => ':user_group:mht.ug1(W)'],
						['usrgrpid' => ':user_group:mht.ug2(R)'],
						['usrgrpid' => ':user_group:mht.ug3(D)'],
						['usrgrpid' => ':user_group:mht.ug4(N)']
					]
				],
				[
					'username' => 'mt.u1(W)',
					'passwd' => '|-|e!1@ (/\)0rLD!',
					'usrgrps' => [
						['usrgrpid' => ':user_group:mt.ug1(W)']
					]
				],
				[
					'username' => 'mt.u1(R)',
					'passwd' => '|-|e!1@ (/\)0rLD!',
					'usrgrps' => [
						['usrgrpid' => ':user_group:mt.ug1(R)']
					]
				],
				[
					'username' => 'mt.u1(D)',
					'passwd' => '|-|e!1@ (/\)0rLD!',
					'usrgrps' => [
						['usrgrpid' => ':user_group:mt.ug1(D)']
					]
				],
				[
					'username' => 'mt.u1(N)',
					'passwd' => '|-|e!1@ (/\)0rLD!',
					'usrgrps' => [
						['usrgrpid' => ':user_group:mt.ug1(N)']
					]
				],
				[
					'username' => 'mt.u1(mixed)',
					'passwd' => '|-|e!1@ (/\)0rLD!',
					'usrgrps' => [
						['usrgrpid' => ':user_group:mt.ug1(mixed)']
					]
				]
			]
		]);
	}

	public static function cleanTestData(): void {
		CTestDataHelper::cleanUp();
	}

	public static function getTriggerPermissions() {
		return [
			'User with W permissions on template trigger requests it in editable mode' => [
				'login' => ['username' => 'u1', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(t1(i1))'],
				'editable' => true,
				'expected_triggerids' => [':trigger:tg1(t1(i1))']
			],
			'User with W permissions on template trigger requests it' => [
				'login' => ['username' => 'u1', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(t1(i1))'],
				'editable' => false,
				'expected_triggerids' => [':trigger:tg1(t1(i1))']
			],
			'User with W permissions on host trigger requests it in editable mode' => [
				'login' => ['username' => 'u1', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(h1(i1))'],
				'editable' => true,
				'expected_triggerids' => [':trigger:tg1(h1(i1))']
			],
			'User with W permissions on host trigger requests it' => [
				'login' => ['username' => 'u1', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(h1(i1))'],
				'editable' => false,
				'expected_triggerids' => [':trigger:tg1(h1(i1))']
			],
			'User with R permissions on template trigger requests it in editable mode' => [
				'login' => ['username' => 'u2', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(t1(i1))'],
				'editable' => true,
				'expected_triggerids' => []
			],
			'User with R permissions on template trigger requests it' => [
				'login' => ['username' => 'u2', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(t1(i1))'],
				'editable' => false,
				'expected_triggerids' => [':trigger:tg1(t1(i1))']
			],
			'User with R permissions on host trigger requests it in editable mode' => [
				'login' => ['username' => 'u2', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(h1(i1))'],
				'editable' => true,
				'expected_triggerids' => []
			],
			'User with R permissions on host trigger requests it' => [
				'login' => ['username' => 'u2', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(h1(i1))'],
				'editable' => false,
				'expected_triggerids' => [':trigger:tg1(h1(i1))']
			],
			'User with D permissions on template trigger requests it in editable mode' => [
				'login' => ['username' => 'u3', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(t1(i1))'],
				'editable' => true,
				'expected_triggerids' => []
			],
			'User with D permissions on template trigger requests it' => [
				'login' => ['username' => 'u3', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(t1(i1))'],
				'editable' => false,
				'expected_triggerids' => []
			],
			'User with D permissions on host trigger requests it in editable mode' => [
				'login' => ['username' => 'u3', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(h1(i1))'],
				'editable' => true,
				'expected_triggerids' => []
			],
			'User with D permissions on host trigger requests it' => [
				'login' => ['username' => 'u3', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(h1(i1))'],
				'editable' => false,
				'expected_triggerids' => []
			],
			'User with N permissions on template trigger requests it in editable mode' => [
				'login' => ['username' => 'u4', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(t1(i1))'],
				'editable' => true,
				'expected_triggerids' => []
			],
			'User with N permissions on template trigger requests it' => [
				'login' => ['username' => 'u4', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(t1(i1))'],
				'editable' => false,
				'expected_triggerids' => []
			],
			'User with N permissions on host trigger requests it in editable mode' => [
				'login' => ['username' => 'u4', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(h1(i1))'],
				'editable' => true,
				'expected_triggerids' => []
			],
			'User with N permissions on host trigger requests it' => [
				'login' => ['username' => 'u4', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(h1(i1))'],
				'editable' => false,
				'expected_triggerids' => []
			],
			'User with WR permission on host trigger requests it in editable mode' => [
				'login' => ['username' => 'u1(ug1,ug2)', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(h1(i1))'],
				'editable' => true,
				'expected_triggerids' => [':trigger:tg1(h1(i1))']
			],
			'User with WR permission on host trigger requests it' => [
				'login' => ['username' => 'u1(ug1,ug2)', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(h1(i1))'],
				'editable' => false,
				'expected_triggerids' => [':trigger:tg1(h1(i1))']
			],
			'User with WD permission on host trigger requests it in editable mode' => [
				'login' => ['username' => 'u1(ug1,ug3)', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(h1(i1))'],
				'editable' => true,
				'expected_triggerids' => []
			],
			'User with WD permission on host trigger requests it' => [
				'login' => ['username' => 'u1(ug1,ug3)', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(h1(i1))'],
				'editable' => false,
				'expected_triggerids' => []
			],
			'User with WN permission on host trigger requests it in editable mode' => [
				'login' => ['username' => 'u1(ug1,ug4)', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(h1(i1))'],
				'editable' => true,
				'expected_triggerids' => [':trigger:tg1(h1(i1))']
			],
			'User with WN permission on host trigger requests it' => [
				'login' => ['username' => 'u1(ug1,ug4)', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:tg1(h1(i1))'],
				'editable' => false,
				'expected_triggerids' => [':trigger:tg1(h1(i1))']
			],
			'User with WR permission on trigger with multiple hosts requests it in editable mode' => [
				'login' => ['username' => 'mht.u1', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:mht.tg1(h1,h2)'],
				'editable' => true,
				'expected_triggerids' => [':trigger:mht.tg1(h1,h2)']
			],
			'User with WR permission on trigger with multiple hosts requests it' => [
				'login' => ['username' => 'mht.u1', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:mht.tg1(h1,h2)'],
				'editable' => false,
				'expected_triggerids' => [':trigger:mht.tg1(h1,h2)']
			],
			'User with WD permission on trigger with multiple hosts requests it in editable mode' => [
				'login' => ['username' => 'mht.u1', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:mht.tg1(h1,h3)'],
				'editable' => true,
				'expected_triggerids' => []
			],
			'User with WD permission on trigger with multiple hosts requests it' => [
				'login' => ['username' => 'mht.u1', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:mht.tg1(h1,h3)'],
				'editable' => false,
				'expected_triggerids' => []
			],
			'User with WN permission on trigger with multiple hosts requests it in editable mode' => [
				'login' => ['username' => 'mht.u1', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:mht.tg1(h1,h4)'],
				'editable' => true,
				'expected_triggerids' => []
			],
			'User with WN permission on trigger with multiple hosts requests it' => [
				'login' => ['username' => 'mht.u1', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:mht.tg1(h1,h4)'],
				'editable' => false,
				'expected_triggerids' => []
			],
			'User with RD permission on trigger with multiple hosts requests it in editable mode' => [
				'login' => ['username' => 'mht.u1', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:mht.tg1(h2,h3)'],
				'editable' => true,
				'expected_triggerids' => []
			],
			'User with RD permission on trigger with multiple hosts requests it' => [
				'login' => ['username' => 'mht.u1', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:mht.tg1(h2,h3)'],
				'editable' => false,
				'expected_triggerids' => []
			],
			'User with RN permission on trigger with multiple hosts requests it in editable mode' => [
				'login' => ['username' => 'mht.u1', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:mht.tg1(h2,h4)'],
				'editable' => true,
				'expected_triggerids' => []
			],
			'User with RN permission on trigger with multiple hosts requests it' => [
				'login' => ['username' => 'mht.u1', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:mht.tg1(h2,h4)'],
				'editable' => false,
				'expected_triggerids' => []
			],
			'User with DN permission on trigger with multiple hosts requests it in editable mode' => [
				'login' => ['username' => 'mht.u1', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:mht.tg1(h3,h4)'],
				'editable' => true,
				'expected_triggerids' => []
			],
			'User with DN permission on trigger with multiple hosts requests it' => [
				'login' => ['username' => 'mht.u1', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [':trigger:mht.tg1(h3,h4)'],
				'editable' => false,
				'expected_triggerids' => []
			],
			'User with W permission on all triggers requests them in editable mode' => [
				'login' => ['username' => 'mt.u1(W)', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [
					':trigger:tg1(t1(i1))',
					':trigger:tg1(h1(i1))',
					':trigger:mht.tg1(h1,h2)',
					':trigger:mht.tg1(h1,h3)',
					':trigger:mht.tg1(h1,h4)',
					':trigger:mht.tg1(h2,h3)',
					':trigger:mht.tg1(h2,h4)',
					':trigger:mht.tg1(h3,h4)'
				],
				'editable' => true,
				'expected_triggerids' => [
					':trigger:tg1(t1(i1))',
					':trigger:tg1(h1(i1))',
					':trigger:mht.tg1(h1,h2)',
					':trigger:mht.tg1(h1,h3)',
					':trigger:mht.tg1(h1,h4)',
					':trigger:mht.tg1(h2,h3)',
					':trigger:mht.tg1(h2,h4)',
					':trigger:mht.tg1(h3,h4)'
				]
			],
			'User with W permission on all triggers requests them' => [
				'login' => ['username' => 'mt.u1(W)', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [
					':trigger:tg1(t1(i1))',
					':trigger:tg1(h1(i1))',
					':trigger:mht.tg1(h1,h2)',
					':trigger:mht.tg1(h1,h3)',
					':trigger:mht.tg1(h1,h4)',
					':trigger:mht.tg1(h2,h3)',
					':trigger:mht.tg1(h2,h4)',
					':trigger:mht.tg1(h3,h4)'
				],
				'editable' => false,
				'expected_triggerids' => [
					':trigger:tg1(t1(i1))',
					':trigger:tg1(h1(i1))',
					':trigger:mht.tg1(h1,h2)',
					':trigger:mht.tg1(h1,h3)',
					':trigger:mht.tg1(h1,h4)',
					':trigger:mht.tg1(h2,h3)',
					':trigger:mht.tg1(h2,h4)',
					':trigger:mht.tg1(h3,h4)'
				]
			],
			'User with R permission on all triggers requests them in editable mode' => [
				'login' => ['username' => 'mt.u1(R)', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [
					':trigger:tg1(t1(i1))',
					':trigger:tg1(h1(i1))',
					':trigger:mht.tg1(h1,h2)',
					':trigger:mht.tg1(h1,h3)',
					':trigger:mht.tg1(h1,h4)',
					':trigger:mht.tg1(h2,h3)',
					':trigger:mht.tg1(h2,h4)',
					':trigger:mht.tg1(h3,h4)'
				],
				'editable' => true,
				'expected_triggerids' => []
			],
			'User with R permission on all triggers requests them' => [
				'login' => ['username' => 'mt.u1(R)', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [
					':trigger:tg1(t1(i1))',
					':trigger:tg1(h1(i1))',
					':trigger:mht.tg1(h1,h2)',
					':trigger:mht.tg1(h1,h3)',
					':trigger:mht.tg1(h1,h4)',
					':trigger:mht.tg1(h2,h3)',
					':trigger:mht.tg1(h2,h4)',
					':trigger:mht.tg1(h3,h4)'
				],
				'editable' => false,
				'expected_triggerids' => [
					':trigger:tg1(t1(i1))',
					':trigger:tg1(h1(i1))',
					':trigger:mht.tg1(h1,h2)',
					':trigger:mht.tg1(h1,h3)',
					':trigger:mht.tg1(h1,h4)',
					':trigger:mht.tg1(h2,h3)',
					':trigger:mht.tg1(h2,h4)',
					':trigger:mht.tg1(h3,h4)'
				]
			],
			'User with D permission on all triggers requests them in editable mode' => [
				'login' => ['username' => 'mt.u1(D)', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [
					':trigger:tg1(t1(i1))',
					':trigger:tg1(h1(i1))',
					':trigger:mht.tg1(h1,h2)',
					':trigger:mht.tg1(h1,h3)',
					':trigger:mht.tg1(h1,h4)',
					':trigger:mht.tg1(h2,h3)',
					':trigger:mht.tg1(h2,h4)',
					':trigger:mht.tg1(h3,h4)'
				],
				'editable' => true,
				'expected_triggerids' => []
			],
			'User with D permission on all triggers requests them' => [
				'login' => ['username' => 'mt.u1(D)', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [
					':trigger:tg1(t1(i1))',
					':trigger:tg1(h1(i1))',
					':trigger:mht.tg1(h1,h2)',
					':trigger:mht.tg1(h1,h3)',
					':trigger:mht.tg1(h1,h4)',
					':trigger:mht.tg1(h2,h3)',
					':trigger:mht.tg1(h2,h4)',
					':trigger:mht.tg1(h3,h4)'
				],
				'editable' => false,
				'expected_triggerids' => []
			],
			'User with N permission on all triggers requests them in editable mode' => [
				'login' => ['username' => 'mt.u1(N)', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [
					':trigger:tg1(t1(i1))',
					':trigger:tg1(h1(i1))',
					':trigger:mht.tg1(h1,h2)',
					':trigger:mht.tg1(h1,h3)',
					':trigger:mht.tg1(h1,h4)',
					':trigger:mht.tg1(h2,h3)',
					':trigger:mht.tg1(h2,h4)',
					':trigger:mht.tg1(h3,h4)'
				],
				'editable' => true,
				'expected_triggerids' => []
			],
			'User with N permission on all triggers requests them' => [
				'login' => ['username' => 'mt.u1(N)', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [
					':trigger:tg1(t1(i1))',
					':trigger:tg1(h1(i1))',
					':trigger:mht.tg1(h1,h2)',
					':trigger:mht.tg1(h1,h3)',
					':trigger:mht.tg1(h1,h4)',
					':trigger:mht.tg1(h2,h3)',
					':trigger:mht.tg1(h2,h4)',
					':trigger:mht.tg1(h3,h4)'
				],
				'editable' => false,
				'expected_triggerids' => []
			],
			'User with mixed permission on different triggers requests them with other triggers in editable mode' => [
				'login' => ['username' => 'mt.u1(mixed)', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [
					':trigger:tg1(t1(i1))',
					':trigger:tg1(h1(i1))',
					':trigger:mht.tg1(h1,h2)',
					':trigger:mht.tg1(h1,h3)',
					':trigger:mht.tg1(h1,h4)',
					':trigger:mht.tg1(h2,h3)',
					':trigger:mht.tg1(h2,h4)',
					':trigger:mht.tg1(h3,h4)'
				],
				'editable' => true,
				'expected_triggerids' => [
					':trigger:tg1(h1(i1))',
					':trigger:mht.tg1(h1,h2)',
					':trigger:mht.tg1(h1,h3)'
				]
			],
			'User with mixed permission on different triggers requests them with other triggers' => [
				'login' => ['username' => 'mt.u1(mixed)', 'password'=> '|-|e!1@ (/\)0rLD!'],
				'triggerids' => [
					':trigger:tg1(t1(i1))',
					':trigger:tg1(h1(i1))',
					':trigger:mht.tg1(h1,h2)',
					':trigger:mht.tg1(h1,h3)',
					':trigger:mht.tg1(h1,h4)',
					':trigger:mht.tg1(h2,h3)',
					':trigger:mht.tg1(h2,h4)',
					':trigger:mht.tg1(h3,h4)'
				],
				'editable' => false,
				'expected_triggerids' => [
					':trigger:tg1(h1(i1))',
					':trigger:mht.tg1(h1,h2)',
					':trigger:mht.tg1(h1,h3)',
					':trigger:mht.tg1(h2,h3)'
				]
			]
		];
	}

	/**
	 * @dataProvider getTriggerPermissions
	 */
	public function testTriggerPermissions_get(array $login, array $triggerids, bool $editable,
			array $expected_triggerids): void {
		$this->authorize($login['username'], $login['password']);

		CTestDataHelper::convertValueReferences($triggerids);

		$result = $this->call('trigger.get', [
			'output' => [],
			'triggerids' => $triggerids,
			'editable' => $editable,
			'preservekeys' => true
		], null);

		$converted_expected_triggerids = CTestDataHelper::getConvertedValueReferences($expected_triggerids);

		$db_triggerids = array_keys($result['result']);

		foreach ($db_triggerids as &$db_actionid) {
			$i = array_search($db_actionid, $converted_expected_triggerids);

			if ($i !== false) {
				$db_actionid = $expected_triggerids[$i];
			}
		}
		unset($db_actionid);

		sort($expected_triggerids);
		sort($db_triggerids);

		$this->assertSame($expected_triggerids, $db_triggerids);
	}
}