#!/usr/share/ucs-test/runner python
## -*- coding: utf-8 -*-
## desc: test --no-delete option and force mode=D (Bug 41775, 41350)
## tags: [apptest,ucsschool,skip_in_multiserver,ucsschool_import]
## roles: [domaincontroller_master]
## exposure: dangerous
## packages:
##   - ucs-school-import
## bugs: [41350, 41775]

import copy
import univention.testing.strings as uts
from essential.importusers_cli_v2 import CLI_Import_v2_Tester
from essential.importusers import Person


class Test(CLI_Import_v2_Tester):

	def __init__(self):
		self.ou_B = None
		self.ou_C = None
		super(Test, self).__init__()

	def test(self):  # formally test_no_delete_option()
		"""
		Bug #41775, #41350: test --no-delete option:
		- with[out] --no-delete
		- with[out] explicit mode=D  -> should delete even when --no-delete is on
		"""
		config = copy.deepcopy(self.default_config)
		source_uid = 'sourceUID-%s' % (uts.random_string(),)
		config.update_entry('sourceUID', source_uid)

		for role in ('student', 'teacher', 'staff', 'teacher_and_staff'):
			self.log.info('*** Testing "--no-delete" option for role %r.', role)

			config.update_entry('user_role', role)

			person = Person(self.ou_A.name, role)
			fn_csv = self.create_csv_file(person_list=[person], mapping=config['csv']['mapping'])
			config.update_entry('input:filename', fn_csv)
			fn_config = self.create_config_json(config=config)
			# save ldap state for later comparison
			self.save_ldap_status()

			# start import
			self.log.info('*** Importing a user')
			self.run_import(['-c', fn_config, '-i', fn_csv])

			# check for new users in LDAP
			self.check_new_and_removed_users(1, 0)

			self.log.info('*** Importing a user, NOT deleting previous user (running with "--no-delete")')
			person = Person(self.ou_A.name, role)
			fn_csv = self.create_csv_file(person_list=[person], mapping=config['csv']['mapping'])
			self.save_ldap_status()
			self.run_import(['-c', fn_config, '-i', fn_csv, '--no-delete'])

			# check for new users in LDAP
			self.check_new_and_removed_users(1, 0)

			self.log.info('*** Importing a user, deleting previous two users (running without "--no-delete")')
			person = Person(self.ou_A.name, role)
			fn_csv = self.create_csv_file(person_list=[person], mapping=config['csv']['mapping'])
			self.save_ldap_status()
			self.run_import(['-c', fn_config, '-i', fn_csv])

			# check for new users in LDAP
			self.check_new_and_removed_users(1, 2)

			self.log.info('*** Importing a user, deleting previous user')
			person = Person(self.ou_A.name, role)
			fn_csv = self.create_csv_file(person_list=[person], mapping=config['csv']['mapping'])
			self.save_ldap_status()
			self.run_import(['-c', fn_config, '-i', fn_csv])

			# check for new users in LDAP
			self.check_new_and_removed_users(1, 1)

			self.log.info('*** Importing same user and running with "--no-delete"')
			person.set_mode_to_delete()
			fn_csv = self.create_csv_file(person_list=[person], mapping=config['csv']['mapping'])
			self.save_ldap_status()
			self.run_import(['-c', fn_config, '-i', fn_csv, '--no-delete'])

			# check for new users in LDAP
			self.check_new_and_removed_users(0, 0)

			self.log.info('*** Importing same user with action="D" and running with "--no-delete"')
			person.set_mode_to_delete()
			config_d = copy.deepcopy(config)
			config_d.update_entry('csv:mapping:Aktion', '__action')
			fn_config_d = self.create_config_json(config=config_d)
			fn_csv = self.create_csv_file(person_list=[person], mapping=config_d['csv']['mapping'])
			self.save_ldap_status()
			self.run_import(['-c', fn_config_d, '-i', fn_csv, '--no-delete'])

			# check for new users in LDAP
			self.check_new_and_removed_users(0, 1)


def main():
	tester = Test()
	try:
		tester.run()
	finally:
		tester.cleanup()


if __name__ == '__main__':
	main()
