#!/usr/share/ucs-test/runner python
## -*- coding: utf-8 -*-
## desc: test account deactivation, locking, expiration
## tags: [apptest]
## exposure: dangerous
## packages:
##   - univention-office365

import time
import datetime

import univention.testing.ucr as ucr_test
import univention.testing.udm as udm_test
import univention.testing.utils as utils

from helpers.office365_test_helpers import listener_attributes_data, udm_user_args, check_udm2azure_user, print_users
from univention.office365.listener import Office365Listener


def _test(udm_args, a_user, check_complete):
	success, errors = check_udm2azure_user(udm_args, a_user, check_complete)
	if success:
		print("*** all attributes were synced correctly")
	else:
		utils.fail("One or more properties were not synced correctly:\n{}".format("\n".join(map(str, errors))))

with utils.AutomaticListenerRestart():
	with udm_test.UCSTestUDM() as udm:
		with ucr_test.UCSTestConfigRegistry() as ucr:
			ucr.load()
			class _listener(object):
				configRegistry = ucr
			ol = Office365Listener(_listener(), "ucs-test", listener_attributes_data, {}, "dn")

			user_args = udm_user_args(ucr, minimal=True)
			user_args["set"]["UniventionOffice365Enabled"] = 1

			print("*** Creating user...")
			user_dn, username = udm.create_user(check_for_drs_replication=True, **user_args)
			time.sleep(5)

			print("*** Checking that user was created (UniventionOffice365ObjectID in UDM object)...")
			udm_user = ol.udm.get_udm_user(user_dn)
			user_id = udm_user.get("UniventionOffice365ObjectID")
			if not user_id:
				utils.fail("User was not created properly (no UniventionOffice365ObjectID).")

			print("*** Checking sync of properties...")
			fake_listener_new = dict(
				entryUUID=[udm_user.dn],
				univentionOffice365ObjectID=[user_id]
			)
			azure_user = ol.get_user(fake_listener_new)
			_test(user_args, azure_user, check_complete=False)

			print("*** Deactivating office365-option (should deactivate azure-user)...")
			udm.modify_object(modulename="users/user", dn=user_dn, set={"UniventionOffice365Enabled": 0})
			time.sleep(5)
			azure_user = ol.get_user(fake_listener_new)
			print_users(azure_user, short=True)
			if azure_user["accountEnabled"]:
				utils.fail("Account was not deactivated.")

			print("*** Activating office365-option (should activate azure-user)...")
			udm.modify_object(modulename="users/user", dn=user_dn, set={"UniventionOffice365Enabled": 1})
			time.sleep(5)
			azure_user = ol.get_user(fake_listener_new)
			print_users(azure_user, short=True)
			if not azure_user["accountEnabled"]:
				utils.fail("Account was not activated.")

			print("*** Setting account expired for user (should deactivate azure-user)...")
			udm.modify_object(modulename="users/user", dn=user_dn, set={"userexpiry": datetime.datetime.now().strftime("%Y-%m-%d")})
			time.sleep(5)
			azure_user = ol.get_user(fake_listener_new)
			print_users(azure_user, short=True)
			if azure_user["accountEnabled"]:
				utils.fail("Account was not deactivated.")

			print("*** Unsetting account expired for user (should activate azure-user)...")
			udm.modify_object(modulename="users/user", dn=user_dn, set={"userexpiry": ""})
			time.sleep(5)
			azure_user = ol.get_user(fake_listener_new)
			print_users(azure_user, short=True)
			if not azure_user["accountEnabled"]:
				utils.fail("Account was not activated.")

			for account_state in ["all", "kerberos", "posix", "posix_kerberos", "windows", "windows_kerberos", "windows_posix"]:
				print("*** Deactivating UDM-user (method %s) (should deactivate azure-user)..." % account_state)
				udm.modify_object(modulename="users/user", dn=user_dn, set={"disabled": account_state})
				time.sleep(5)
				azure_user = ol.get_user(fake_listener_new)
				print_users(azure_user, short=True)
				if azure_user["accountEnabled"]:
					utils.fail("Account was not deactivated.")
				print("*** Reactivating UDM-user (should activate azure-user)...")
				udm.modify_object(modulename="users/user", dn=user_dn, set={"disabled": "none"})
				time.sleep(5)
				azure_user = ol.get_user(fake_listener_new)
				print_users(azure_user, short=True)
				if not azure_user["accountEnabled"]:
					utils.fail("Account was not activated.")

			for lock_state in ["all", "posix", "windows"]:
				print("*** Locking UDM-user (method %s) (should deactivate azure-user)..." % lock_state)
				udm.modify_object(modulename="users/user", dn=user_dn, set={"locked": lock_state})
				time.sleep(5)
				azure_user = ol.get_user(fake_listener_new)
				print_users(azure_user, short=True)
				if azure_user["accountEnabled"]:
					utils.fail("Account was not deactivated.")
				print("*** Unlocking UDM-user (should activate azure-user)...")
				udm.modify_object(modulename="users/user", dn=user_dn, set={"locked": "none"})
				time.sleep(5)
				azure_user = ol.get_user(fake_listener_new)
				print_users(azure_user, short=True)
				if not azure_user["accountEnabled"]:
					utils.fail("Account was not activated.")

			print("*** All tests succeeded.")
