#!/usr/share/ucs-test/runner bash
## desc: Test uidNumber attribute at zarafa objects
## bugs: [31870]
## packages:
##  - zarafa4ucs
## tags:
##  - apptest
## exposure: dangerous

. "$TESTLIBPATH/base.sh" || exit 137
. "$TESTLIBPATH/user.sh" || exit 137
. "$TESTLIBPATH/random.sh" || exit 137
. "/usr/share/univention-lib/all.sh" || exit 137

eval "$(/usr/sbin/ucr shell)"

RETVAL=100

stop_udm_cli_server

createZarafaUser () {
	# $1 == username
	# $2 == role (contact, user, admin, store)
	local OPTIONS=""
	if [ "$2" = "contact" ] ; then
		OPTIONS="--option=person --option=mail"
	fi
	udm-test users/user create \
		--position "cn=users,$ldap_base" \
		--set username="$1" \
		--set firstname="Firstname" \
		--set lastname="Lastname" \
		--set password="univention" \
		--set mailPrimaryAddress="$(random_mailaddress)@$domainname" \
		$OPTIONS \
		--set zarafa-role="$2"
	[ ! "$?" = "0" ] && fail_test 140 "cannot create contact $1"
}

changeRoleZarafaUser () {
	# $1 == username
	# $2 == role (contact, user, admin, store)
	udm-test users/user modify \
		--dn "uid=$1,cn=users,$ldap_base" \
		--set zarafa-role="$2"
	[ ! "$?" = "0" ] && fail_test 140 "cannot change role of $1 to $2"
}

checkRoleZarafaUser () {
	# $1 == username
	# $2 == role (contact, user, admin, store)
	attrs="$(univention-ldapsearch -xLLL -b "uid=$1,cn=users,$ldap_base")"
	zAccount="0"
	zAdmin="0"
	zShareStoreOnly="0"
	zContact="0"
	echo "$attrs" | egrep "^zarafaAccount: 1$" && zAccount="1"
	echo "$attrs" | egrep "^zarafaAdmin: 1$" && zAdmin="1"
	echo "$attrs" | egrep "^zarafaSharedStoreOnly: 1$" && zShareStoreOnly="1"
	echo "$attrs" | egrep "^objectClass: zarafa-contact$" && zContact="1"

	case $2 in
		user)
			[ "$zAccount" = "1" -a "$zAdmin" = "0" -a "$zShareStoreOnly" = "0" -a "$zContact" = "0" ]
			return
			;;
		admin)
			[ "$zAccount" = "1" -a "$zAdmin" = "1" -a "$zShareStoreOnly" = "0" -a "$zContact" = "0" ]
			return
			;;
		store)
			[ "$zAccount" = "1" -a "$zAdmin" = "0" -a "$zShareStoreOnly" = "1" -a "$zContact" = "0" ]
			return
			;;
		contact)
			[ "$zAccount" = "1" -a "$zAdmin" = "0" -a "$zShareStoreOnly" = "0" -a "$zContact" = "1" ]
			return
			;;
		none)
			[ "$zAccount" = "0" -a "$zAdmin" = "0" -a "$zShareStoreOnly" = "0" -a "$zContact" = "0" ]
			return
			;;
		*)
			echo "UNKNOWN ZARAFA ROLE: $2"
			return 1
			;;
	esac
}

# $zarafatype does not contain "contact" since contact objects cannot be changed into something else 
# (UDM options cannot be added afterwards)
for zarafatype in store user admin none ; do
	for zarafatypeB in contact store user admin none ; do
		# skip noop-changes
		[ "$zarafatype" = "$zarafatypeB" ] && continue
		echo "Testing $zarafatype ==> $zarafatypeB ..."

		USERNAME="z${zarafatype}-$(user_randomname)"
		createZarafaUser "$USERNAME" "$zarafatype"
		wait_for_replication
		changeRoleZarafaUser "$USERNAME" "$zarafatypeB"
		wait_for_replication
		checkRoleZarafaUser "$USERNAME" "$zarafatypeB" || fail_test 110 "Failed to switch from $zarafatype to $zarafatypeB:"
		wait_for_replication
		user_remove "$USERNAME"
		wait_for_replication
	done
done

exit $RETVAL
