<?php
/*
** Zabbix
** Copyright (C) 2001-2022 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/CLegacyWebTest.php';

class testFormAdministrationGeneralHousekeeper extends CLegacyWebTest {

	public function testFormAdministrationGeneralHousekeeper_CheckLayout() {
		$this->zbxTestLogin('zabbix.php?action=housekeeping.edit');

		$this->zbxTestCheckTitle('Configuration of housekeeping');
		$this->zbxTestCheckHeader('Housekeeping');

		// events and alerts

		$this->zbxTestTextPresent('Events and alerts');
		$this->zbxTestTextPresent('Enable internal housekeeping');
		$this->zbxTestAssertElementPresentId('hk_events_mode');
		$this->assertTrue($this->zbxTestCheckboxSelected('hk_events_mode'));

		$this->zbxTestTextPresent('Trigger data storage period');
		$this->zbxTestAssertElementPresentId('hk_events_trigger');
		$this->zbxTestAssertAttribute("//input[@id='hk_events_trigger']", "maxlength", 255);
		$this->zbxTestAssertAttribute("//input[@id='hk_events_trigger']", "value", '365d');
		$this->zbxTestAssertElementNotPresentXpath("//input[@id='hk_events_trigger'][@disabled]");

		$this->zbxTestTextPresent('Internal data storage period');
		$this->zbxTestAssertElementPresentId('hk_events_internal');
		$this->zbxTestAssertAttribute("//input[@id='hk_events_internal']", "maxlength", 255);
		$this->zbxTestAssertAttribute("//input[@id='hk_events_internal']", "value", '1d');
		$this->zbxTestAssertElementNotPresentXpath("//input[@id='hk_events_internal'][@disabled]");

		$this->zbxTestTextPresent('Network discovery data storage period');
		$this->zbxTestAssertElementPresentId('hk_events_discovery');
		$this->zbxTestAssertAttribute("//input[@id='hk_events_discovery']", "maxlength", 255);
		$this->zbxTestAssertAttribute("//input[@id='hk_events_discovery']", "value", '1d');
		$this->zbxTestAssertElementNotPresentXpath("//input[@id='hk_events_discovery'][@disabled]");

		$this->zbxTestTextPresent('Autoregistration data storage period');
		$this->zbxTestAssertElementPresentId('hk_events_autoreg');
		$this->zbxTestAssertAttribute("//input[@id='hk_events_autoreg']", "maxlength", 255);
		$this->zbxTestAssertAttribute("//input[@id='hk_events_autoreg']", "value", '1d');
		$this->zbxTestAssertElementNotPresentXpath("//input[@id='hk_events_autoreg'][@disabled]");

		$this->zbxTestCheckboxSelect('hk_events_mode', false);
		$this->zbxTestAssertElementPresentXpath("//input[@id='hk_events_trigger'][@disabled]");
		$this->zbxTestAssertElementPresentXpath("//input[@id='hk_events_internal'][@disabled]");
		$this->zbxTestAssertElementPresentXpath("//input[@id='hk_events_discovery'][@disabled]");
		$this->zbxTestAssertElementPresentXpath("//input[@id='hk_events_autoreg'][@disabled]");

		// Services

		$this->zbxTestTextPresent('Services');
		$this->zbxTestTextPresent('Enable internal housekeeping');
		$this->zbxTestAssertElementPresentId('hk_services_mode');
		$this->assertTrue($this->zbxTestCheckboxSelected('hk_services_mode'));

		$this->zbxTestTextPresent('Data storage period');
		$this->zbxTestAssertElementPresentId('hk_services');
		$this->zbxTestAssertAttribute("//input[@id='hk_services']", "maxlength", 255);
		$this->zbxTestAssertAttribute("//input[@id='hk_services']", "value", '365d');
		$this->zbxTestAssertElementNotPresentXpath("//input[@id='hk_services'][@disabled]");

		$this->zbxTestCheckboxSelect('hk_services_mode', false);
		$this->zbxTestAssertElementPresentXpath("//input[@id='hk_services'][@disabled]");

		// audit

		$this->zbxTestTextPresent('Audit');
		$this->zbxTestTextPresent('Enable internal housekeeping');
		$this->zbxTestAssertElementPresentId('hk_audit_mode');
		$this->assertTrue($this->zbxTestCheckboxSelected('hk_audit_mode'));

		$this->zbxTestTextPresent('Data storage period');
		$this->zbxTestAssertElementPresentId('hk_audit');
		$this->zbxTestAssertAttribute("//input[@id='hk_audit']", "maxlength", 255);
		$this->zbxTestAssertAttribute("//input[@id='hk_audit']", "value", '365d');
		$this->zbxTestAssertElementNotPresentXpath("//input[@id='hk_audit'][@disabled]");

		$this->zbxTestCheckboxSelect('hk_audit_mode', false);
		$this->zbxTestAssertElementPresentXpath("//input[@id='hk_audit'][@disabled]");

		//	user sessions

		$this->zbxTestTextPresent('User sessions');
		$this->zbxTestTextPresent('Enable internal housekeeping');
		$this->zbxTestAssertElementPresentId('hk_sessions_mode');
		$this->assertTrue($this->zbxTestCheckboxSelected('hk_sessions_mode'));

		$this->zbxTestTextPresent('Data storage period');
		$this->zbxTestAssertVisibleId('hk_sessions');
		$this->zbxTestAssertAttribute("//input[@id='hk_sessions']", "maxlength", 255);
		$this->zbxTestAssertAttribute("//input[@id='hk_sessions']", "value", '365d');
		$this->zbxTestAssertElementNotPresentXpath("//input[@id='hk_sessions'][@disabled]");

		$this->zbxTestCheckboxSelect('hk_sessions_mode', false);
		$this->zbxTestAssertElementPresentXpath("//input[@id='hk_sessions'][@disabled]");

		// history

		$this->zbxTestTextPresent('History');
		$this->zbxTestTextPresent('Enable internal housekeeping');
		$this->zbxTestAssertElementPresentId('hk_history_mode');
		$this->assertTrue($this->zbxTestCheckboxSelected('hk_history_mode'));

		$this->zbxTestTextPresent('Override item history period');
		$this->zbxTestAssertElementPresentId('hk_history_global');
		$this->assertFalse($this->zbxTestCheckboxSelected('hk_history_global'));

		$this->zbxTestTextPresent('Data storage period');
		$this->zbxTestAssertVisibleId('hk_history');
		$this->zbxTestAssertAttribute("//input[@id='hk_history']", "maxlength", 255);
		$this->zbxTestAssertAttribute("//input[@id='hk_history']", "value", '90d');
		$this->zbxTestAssertElementPresentXpath("//input[@id='hk_history'][@disabled]");

		$this->zbxTestCheckboxSelect('hk_history_global');
		$this->zbxTestAssertElementNotPresentXpath("//input[@id='hk_history'][@disabled]");

		$this->zbxTestCheckboxSelect('hk_history_mode', false);
		$this->zbxTestAssertElementNotPresentXpath("//input[@id='hk_history_global'][@disabled]");
		$this->zbxTestAssertElementNotPresentXpath("//input[@id='hk_history'][@disabled]");

		// trends

		$this->zbxTestTextPresent('Trends');
		$this->zbxTestTextPresent('Enable internal housekeeping');
		$this->zbxTestAssertElementPresentId('hk_trends_mode');
		$this->assertTrue($this->zbxTestCheckboxSelected('hk_trends_mode'));

		$this->zbxTestTextPresent('Override item trend period');
		$this->zbxTestAssertElementPresentId('hk_trends_global');
		$this->assertFalse($this->zbxTestCheckboxSelected('hk_trends_global'));

		$this->zbxTestTextPresent('Data storage period');
		$this->zbxTestAssertVisibleId('hk_trends');
		$this->zbxTestAssertAttribute("//input[@id='hk_trends']", "maxlength", 255);
		$this->zbxTestAssertAttribute("//input[@id='hk_trends']", "value", '365d');
		$this->zbxTestAssertElementPresentXpath("//input[@id='hk_trends'][@disabled]");

		$this->zbxTestCheckboxSelect('hk_trends_global');
		$this->zbxTestAssertElementNotPresentXpath("//input[@id='hk_trends'][@disabled]");

		$this->zbxTestCheckboxSelect('hk_trends_mode', false);
		$this->zbxTestAssertElementNotPresentXpath("//input[@id='hk_trends_global'][@disabled]");
		$this->zbxTestAssertElementNotPresentXpath("//input[@id='hk_trends'][@disabled]");

		// buttons

		$this->zbxTestAssertVisibleId('update');
		$this->zbxTestAssertElementValue('update', 'Update');

		$this->zbxTestAssertVisibleId('resetDefaults');
		$this->zbxTestAssertElementText("//button[@id='resetDefaults']", "Reset defaults");
	}

	public static function update() {
		return [
			[
				[
					'expected' => TEST_GOOD,
					'hk_events_mode' => true,
					'hk_events_trigger' => 86400,
					'hk_events_internal' => 86400,
					'hk_events_discovery' => 86400,
					'hk_events_autoreg' => 86400,
					'hk_services_mode' => true,
					'hk_services' => 86400,
					'hk_audit_mode' => true,
					'hk_audit' => 86400,
					'hk_sessions_mode' => true,
					'hk_sessions' => 86400,
					'hk_history_mode' => true,
					'hk_history_global' => true,
					'hk_history' => 3600,
					'hk_trends_mode' => true,
					'hk_trends_global' => true,
					'hk_trends' => 86400
				]
			],
			[
				[
					'expected' => TEST_GOOD,
					'hk_events_mode' => false,
					'hk_services_mode' => false,
					'hk_audit_mode' => false,
					'hk_sessions_mode' => false,
					'hk_history_mode' => false,
					'hk_trends_mode' => false
				]
			],
			[
				[
					'expected' => TEST_GOOD,
					'hk_events_mode' => true,
					'hk_services_mode' => true,
					'hk_audit_mode' => true,
					'hk_sessions_mode' => true,
					'hk_history_mode' => true,
					'hk_history_global' => false,
					'hk_trends_mode' => true,
					'hk_trends_global' => false
				]
			],
			[
				[
					'expected' => TEST_BAD,
					'hk_events_mode' => true,
					'hk_events_trigger' => 0,
					'errors' => [
						'Invalid trigger data storage period: value must be one of 86400-788400000'
					]
				]
			],
			[
				[
					'expected' => TEST_BAD,
					'hk_events_mode' => true,
					'hk_events_trigger' => '1439m',
					'errors' => [
						'Invalid trigger data storage period: value must be one of 86400-788400000'
					]
				]
			],
			[
				[
					'expected' => TEST_BAD,
					'hk_events_mode' => true,
					'hk_events_trigger' => '23h',
					'errors' => [
						'Invalid trigger data storage period: value must be one of 86400-788400000'
					]
				]
			],
			[
				[
					'expected' => TEST_BAD,
					'hk_events_mode' => true,
					'hk_events_trigger' => '13140001m',
					'errors' => [
						'Invalid trigger data storage period: value must be one of 86400-788400000'
					]
				]
			],
			[
				[
					'expected' => TEST_BAD,
					'hk_events_mode' => true,
					'hk_events_trigger' => '219001h',
					'errors' => [
						'Invalid trigger data storage period: value must be one of 86400-788400000'
					]
				]
			],
			[
				[
					'expected' => TEST_BAD,
					'hk_events_mode' => true,
					'hk_events_trigger' => '9126d',
					'errors' => [
						'Invalid trigger data storage period: value must be one of 86400-788400000'
					]
				]
			],
			[
				[
					'expected' => TEST_BAD,
					'hk_events_mode' => true,
					'hk_events_trigger' => '1304w',
					'errors' => [
						'Invalid trigger data storage period: value must be one of 86400-788400000'
					]
				]
			],
			[
				[
					'expected' => TEST_BAD,
					'hk_events_mode' => true,
					'hk_events_internal' => 0,
					'errors' => [
						'Invalid internal data storage period: value must be one of 86400-788400000'
					]
				]
			],
			[
				[
					'expected' => TEST_BAD,
					'hk_events_mode' => true,
					'hk_events_discovery' => 0,
					'errors' => [
						'Invalid network discovery data storage period: value must be one of 86400-788400000'
					]
				]
			],
			[
				[
					'expected' => TEST_BAD,
					'hk_events_mode' => true,
					'hk_events_autoreg' => 0,
					'errors' => [
						'Invalid autoregistration data storage period: value must be one of 86400-788400000'
					]
				]
			],
			[
				[
					'expected' => TEST_BAD,
					'hk_services_mode' => true,
					'hk_services' => 0,
					'errors' => [
						'Invalid data storage period for services: value must be one of 86400-788400000'
					]
				]
			],
			[
				[
					'expected' => TEST_BAD,
					'hk_audit_mode' => true,
					'hk_audit' => 0,
					'errors' => [
						'Invalid audit data storage period: value must be one of 86400-788400000'
					]
				]
			],
			[
				[
					'expected' => TEST_BAD,
					'hk_sessions_mode' => true,
					'hk_sessions' => 0,
					'errors' => [
						'Invalid user sessions data storage period: value must be one of 86400-788400000'
					]
				]
			],
			[
				[
					'expected' => TEST_BAD,
					'hk_history_mode' => true,
					'hk_history_global' => true,
					'hk_history' => -1,
					'errors' => [
						'Invalid history data storage period: a time unit is expected.'
					]
				]
			],
			[
				[
					'expected' => TEST_BAD,
					'hk_trends_mode' => true,
					'hk_trends_global' => true,
					'hk_trends' => -1,
					'errors' => [
						'Invalid trends data storage period: a time unit is expected.'
					]
				]
			],
			[
				[
					'expected' => TEST_GOOD,
					'resetDefaults' => true,
					'hk_events_mode' => true,
					'hk_events_trigger' => '365d',
					'hk_events_internal' => '1d',
					'hk_events_discovery' => '1d',
					'hk_events_autoreg' => '1d',
					'hk_services_mode' => true,
					'hk_services' => '365d',
					'hk_audit_mode' => true,
					'hk_audit' => '365d',
					'hk_sessions_mode' => true,
					'hk_sessions' => '365d',
					'hk_history_mode' => true,
					'hk_history_global' => false,
					'hk_trends_mode' => true,
					'hk_trends_global' => false
				]
			]
		];
	}

	/**
	 * @dataProvider update
	 */
	public function testFormAdministrationGeneralHousekeeper_SimpleUpdate($data) {
		$this->zbxTestLogin('zabbix.php?action=housekeeping.edit');

		if (isset($data['resetDefaults'])) {
			$this->zbxTestClick('resetDefaults');
			$this->zbxTestClickXpath('//div[contains(@class, "overlay-dialogue modal")]//button[text()="Reset defaults"]');
		}
		else {
			// events and alerts

			if (isset($data['hk_events_mode'])) {
				$this->zbxTestCheckboxSelect('hk_events_mode', $data['hk_events_mode']);
			}

			if (isset($data['hk_events_trigger'])) {
				$this->zbxTestInputTypeOverwrite('hk_events_trigger', $data['hk_events_trigger']);
			}

			if (isset($data['hk_events_internal'])) {
				$this->zbxTestInputTypeOverwrite('hk_events_internal', $data['hk_events_internal']);
			}

			if (isset($data['hk_events_discovery'])) {
				$this->zbxTestInputTypeOverwrite('hk_events_discovery', $data['hk_events_discovery']);
			}

			if (isset($data['hk_events_autoreg'])) {
				$this->zbxTestInputTypeOverwrite('hk_events_autoreg', $data['hk_events_autoreg']);
			}

			// Services

			if (isset($data['hk_services_mode'])) {
				$this->zbxTestCheckboxSelect('hk_services_mode', $data['hk_services_mode']);
			}

			if (isset($data['hk_services'])) {
				$this->zbxTestInputTypeOverwrite('hk_services', $data['hk_services']);
			}

			// audit

			if (isset($data['hk_audit_mode'])) {
				$this->zbxTestCheckboxSelect('hk_audit_mode', $data['hk_audit_mode']);
			}

			if (isset($data['hk_audit'])) {
				$this->zbxTestInputTypeOverwrite('hk_audit', $data['hk_audit']);
			}

			// user sessions

			if (isset($data['hk_sessions_mode'])) {
				$this->zbxTestCheckboxSelect('hk_sessions_mode', $data['hk_sessions_mode']);
			}

			if (isset($data['hk_sessions'])) {
				$this->zbxTestInputTypeOverwrite('hk_sessions', $data['hk_sessions']);
			}

			// history

			if (isset($data['hk_history_mode'])) {
				$this->zbxTestCheckboxSelect('hk_history_mode', $data['hk_history_mode']);
			}

			if (isset($data['hk_history_global'])) {
				$this->zbxTestCheckboxSelect('hk_history_global', $data['hk_history_global']);
			}

			if (isset($data['hk_history'])) {
				$this->zbxTestInputTypeOverwrite('hk_history', $data['hk_history']);
			}

			// trends

			if (isset($data['hk_trends_mode'])) {
				$this->zbxTestCheckboxSelect('hk_trends_mode', $data['hk_trends_mode']);
			}

			if (isset($data['hk_trends_global'])) {
				$this->zbxTestCheckboxSelect('hk_trends_global', $data['hk_trends_global']);
			}

			if (isset($data['hk_trends'])) {
				$this->zbxTestInputTypeOverwrite('hk_trends', $data['hk_trends']);
			}
		}

		$this->zbxTestClickWait('update');
		$this->zbxTestCheckTitle('Configuration of housekeeping');
		$this->zbxTestCheckHeader('Housekeeping');

		switch ($data['expected']) {
			case TEST_GOOD:
				$this->zbxTestTextPresent('Configuration updated');
				break;

			case TEST_BAD:
				$this->zbxTestTextNotPresent('Configuration updated');
				$this->zbxTestWaitUntilMessageTextPresent('msg-bad', 'Cannot update configuration');
				$this->zbxTestTextPresent($data['errors']);
				break;
		}

		if ($data['expected'] == TEST_GOOD) {
			// events and alerts

			if (isset($data['hk_events_mode'])) {
				$this->assertEquals($this->zbxTestCheckboxSelected('hk_events_mode'), $data['hk_events_mode']);
			}

			if (isset($data['hk_events_trigger'])) {
				$this->zbxTestAssertElementValue('hk_events_trigger', $data['hk_events_trigger']);
			}

			if (isset($data['hk_events_internal'])) {
				$this->zbxTestAssertElementValue('hk_events_internal', $data['hk_events_internal']);
			}

			if (isset($data['hk_events_discovery'])) {
				$this->zbxTestAssertElementValue('hk_events_discovery', $data['hk_events_discovery']);
			}

			if (isset($data['hk_events_autoreg'])) {
				$this->zbxTestAssertElementValue('hk_events_autoreg', $data['hk_events_autoreg']);
			}

			// Services

			if (isset($data['hk_services_mode'])) {
				$this->assertEquals($this->zbxTestCheckboxSelected('hk_services_mode'), $data['hk_services_mode']);
			}

			if (isset($data['hk_services'])) {
				$this->zbxTestAssertElementValue('hk_services', $data['hk_services']);
			}

			// audit

			if (isset($data['hk_audit_mode'])) {
				$this->assertEquals($this->zbxTestCheckboxSelected('hk_audit_mode'), $data['hk_audit_mode']);
			}

			if (isset($data['hk_audit'])) {
				$this->zbxTestAssertElementValue('hk_audit', $data['hk_audit']);
			}

			// user sessions

			if (isset($data['hk_sessions_mode'])) {
				$this->assertEquals($this->zbxTestCheckboxSelected('hk_sessions_mode'), $data['hk_sessions_mode']);
			}

			if (isset($data['hk_sessions'])) {
				$this->zbxTestAssertElementValue('hk_sessions', $data['hk_sessions']);
			}

			// history

			if (isset($data['hk_history_mode'])) {
				$this->assertEquals($this->zbxTestCheckboxSelected('hk_history_mode'), $data['hk_history_mode']);
			}

			if (isset($data['hk_history_global'])) {
				$this->assertEquals($this->zbxTestCheckboxSelected('hk_history_global'), $data['hk_history_global']);
			}

			if (isset($data['hk_history'])) {
				$this->zbxTestAssertElementValue('hk_history', $data['hk_history']);
			}

			// trends

			if (isset($data['hk_trends_mode'])) {
				$this->assertEquals($this->zbxTestCheckboxSelected('hk_trends_mode'), $data['hk_trends_mode']);
			}

			if (isset($data['hk_trends_global'])) {
				$this->assertEquals($this->zbxTestCheckboxSelected('hk_trends_global'), $data['hk_trends_global']);
			}

			if (isset($data['hk_trends'])) {
				$this->zbxTestAssertElementValue('hk_trends', $data['hk_trends']);
			}
		}
	}
}