#!/usr/share/ucs-test/runner python
## -*- coding: utf-8 -*-
## desc: test UDM hook for oxDisplayName
## tags: [apptest]
## exposure: dangerous
## packages:
##   - univention-ox
## bugs: [44961]

import os
import univention.testing.udm as testing_udm
import univention.testing.ucr as testing_ucr
import univention.testing.strings as uts
import univention.testing.utils as utils


MACHINE_SECRET_FILE = '/etc/machine.secret'


class Bunch(object):
	"""
	>>> y = Bunch(foo=42, bar='TEST')
	>>> print repr(y.foo), repr(y.bar)
	42 'TEST'

	>>> x = Bunch()
	>>> x.a = 4
	>>> print x.a
	4
	"""
	def __init__(self, **kwds):
		self.__dict__.update(kwds)

	def __str__(self):
		result = []
		for key, value in self.__dict__.iteritems():
			result.append('%s=%r' % (key, value))
		return 'Bunch(' + ', '.join(result) + ')'

	def __repr__(self):
		return str(self)


def main():
	with testing_udm.UCSTestUDM() as udm, testing_ucr.UCSTestConfigRegistry() as ucr:
		mail_domain = ucr['mail/hosteddomains'].split()[0]

		print('\n*** Creating OX user...')
		user = Bunch(
			firstname=uts.random_string(),
			lastname=uts.random_string(),
			password=uts.random_string(),
			mailPrimaryAddress='{}@{}'.format(uts.random_username(), mail_domain),
		)
		user.displayname = '%s %s' % (user.firstname, user.lastname)
		user.dn, user.username = udm.create_user(
			firstname=user.firstname,
			lastname=user.lastname,
			mailPrimaryAddress=user.mailPrimaryAddress,
			password=user.password,
			isOxUser='OK')
		utils.verify_ldap_object(user.dn, {
			'oxAccess': ['premium'],
			'givenName': [user.firstname],
			'sn': [user.lastname],
			'oxDisplayName': [user.displayname],
		})
		print('''\n*** Modifying OX user's first name separately ...''')
		user.firstname = uts.random_string()
		user.displayname = '%s %s' % (user.firstname, user.lastname)
		udm.modify_object('users/user', dn=user.dn, firstname=user.firstname)
		utils.verify_ldap_object(user.dn, {
			'oxAccess': ['premium'],
			'givenName': [user.firstname],
			'sn': [user.lastname],
			'oxDisplayName': [user.displayname],
		})
		print('''\n*** Modifying OX user's last name separately ...''')
		user.lastname = uts.random_string()
		user.displayname = '%s %s' % (user.firstname, user.lastname)
		udm.modify_object('users/user', dn=user.dn, lastname=user.lastname)
		utils.verify_ldap_object(user.dn, {
			'oxAccess': ['premium'],
			'givenName': [user.firstname],
			'sn': [user.lastname],
			'oxDisplayName': [user.displayname],
		})
		print('''\n*** Modifying OX user's first and last name ...''')
		user.firstname = uts.random_string()
		user.lastname = uts.random_string()
		user.displayname = '%s %s' % (user.firstname, user.lastname)
		udm.modify_object('users/user', dn=user.dn, firstname=user.firstname, lastname=user.lastname)
		utils.verify_ldap_object(user.dn, {
			'oxAccess': ['premium'],
			'givenName': [user.firstname],
			'sn': [user.lastname],
			'oxDisplayName': [user.displayname],
		})
		print('''\n*** Set custom OX display name ...''')
		user.displayname = '%s %s (FOO)' % (user.firstname, user.lastname)
		udm.modify_object('users/user', dn=user.dn, oxDisplayName=user.displayname)
		utils.verify_ldap_object(user.dn, {
			'oxAccess': ['premium'],
			'givenName': [user.firstname],
			'sn': [user.lastname],
			'oxDisplayName': [user.displayname],
		})
		print('''\n*** Modifying OX user's first and last name (OX display name should be kept) ...''')
		user.firstname = uts.random_string()
		user.lastname = uts.random_string()
		udm.modify_object('users/user', dn=user.dn, firstname=user.firstname, lastname=user.lastname)
		utils.verify_ldap_object(user.dn, {
			'oxAccess': ['premium'],
			'givenName': [user.firstname],
			'sn': [user.lastname],
			'oxDisplayName': [user.displayname],
		})
		print('''\n*** Set OX display name to default ...''')
		user.displayname = '%s %s' % (user.firstname, user.lastname)
		udm.modify_object('users/user', dn=user.dn, oxDisplayName=user.displayname)
		utils.verify_ldap_object(user.dn, {
			'oxAccess': ['premium'],
			'givenName': [user.firstname],
			'sn': [user.lastname],
			'oxDisplayName': [user.displayname],
		})
		print('''\n*** Modifying OX user's first and last name again ...''')
		user.firstname = uts.random_string()
		user.lastname = uts.random_string()
		user.displayname = '%s %s' % (user.firstname, user.lastname)
		udm.modify_object('users/user', dn=user.dn, firstname=user.firstname, lastname=user.lastname)
		utils.verify_ldap_object(user.dn, {
			'oxAccess': ['premium'],
			'givenName': [user.firstname],
			'sn': [user.lastname],
			'oxDisplayName': [user.displayname],
		})
		print('''\n*** Modifying OX user's first and last name and OX display name ...''')
		user.firstname = uts.random_string()
		user.lastname = uts.random_string()
		user.displayname = '%s %s TEST2' % (user.firstname, user.lastname)
		udm.modify_object('users/user', dn=user.dn, firstname=user.firstname, lastname=user.lastname, oxDisplayName=user.displayname)
		utils.verify_ldap_object(user.dn, {
			'oxAccess': ['premium'],
			'givenName': [user.firstname],
			'sn': [user.lastname],
			'oxDisplayName': [user.displayname],
		})
		print('\n*** Creating OX user with custom displayName...')
		user = Bunch(
			firstname=uts.random_string(),
			lastname=uts.random_string(),
			password=uts.random_string(),
			mailPrimaryAddress='{}@{}'.format(uts.random_username(), mail_domain),
		)
		user.displayname = '%s %s %s' % (user.firstname, user.lastname, uts.random_username())
		user.dn, user.username = udm.create_user(
			firstname=user.firstname,
			lastname=user.lastname,
			oxDisplayName=user.displayname,
			mailPrimaryAddress=user.mailPrimaryAddress,
			password=user.password,
			isOxUser='OK')
		utils.verify_ldap_object(user.dn, {
			'oxAccess': ['premium'],
			'givenName': [user.firstname],
			'sn': [user.lastname],
			'oxDisplayName': [user.displayname],
			'mailPrimaryAddress': [user.mailPrimaryAddress],
		})

if __name__ == '__main__':
	main()
