From ea0810fa8c34748c6426e4daa8c70b64d638a24d Mon Sep 17 00:00:00 2001 From: Gunnar Wrobel Date: Thu, 22 Oct 2009 12:19:00 +0200 Subject: [PATCH] Refactored the mock driver into a mock LDAP connection to adapt it to the new structure. Fixed the server factory. Fixed some of the unit tests. --- .../lib/Horde/Kolab/Server/Cleaner.php | 268 +++++++++ .../lib/Horde/Kolab/Server/Composite.php | 7 +- .../Kolab/Server/{Ldap => Connection}/File.php | 0 .../Kolab/Server/{Ldap => Connection}/Mock.php | 606 +++++++-------------- .../Horde/Kolab/Server/Connection/Mock/Search.php | 78 +++ .../lib/Horde/Kolab/Server/Factory.php | 262 +++++---- .../Kolab_Server/lib/Horde/Kolab/Server/Ldap.php | 10 +- .../lib/Horde/Kolab/Server/List/Base.php | 2 +- .../Kolab_Server/lib/Horde/Kolab/Server/Logged.php | 117 ++-- .../Kolab_Server/lib/Horde/Kolab/Server/Mapped.php | 37 +- .../Kolab_Server/lib/Horde/Kolab/Server/Object.php | 14 +- .../lib/Horde/Kolab/Server/Object/Base.php | 1 + .../lib/Horde/Kolab/Server/Object/Groupofnames.php | 6 +- .../Kolab/Server/Object/Kolab/Domainmaintainer.php | 2 +- .../lib/Horde/Kolab/Server/Object/Kolab/User.php | 2 +- .../Kolab/Server/Object/Kolabgroupofnames.php | 2 +- .../Kolab/Server/Object/Kolabinetorgperson.php | 8 +- .../lib/Horde/Kolab/Server/Object/Person.php | 118 ++-- .../lib/Horde/Kolab/Server/Object/Top.php | 26 +- .../lib/Horde/Kolab/Server/Objects/Base.php | 19 +- .../lib/Horde/Kolab/Server/Schema/Base.php | 23 +- .../lib/Horde/Kolab/Server/Structure/Ldap.php | 2 +- framework/Kolab_Server/package.xml | 68 ++- .../test/Horde/Kolab/Server/Autoload.php | 6 +- .../Horde/Kolab/Server/Connection/MockTest.php | 235 ++++++++ .../{Object => Integration}/AddingObjectsTest.php | 6 +- .../Server/{Object => Integration}/AdminTest.php | 6 +- .../DistListHandlingTest.php | 6 +- .../{Object => Integration}/GroupHandlingTest.php | 6 +- .../Server/{Object => Integration}/GroupTest.php | 6 +- .../{Object => Integration}/InetorgpersonTest.php | 20 +- .../KolabgermanbankarrangementTest.php | 10 +- .../KolabinetorgpersonTest.php | 36 +- .../Kolabpop3accountTest.php | 10 +- .../Server/{Server => Integration}/MockTest.php | 237 +------- .../Server/{Object => Integration}/ObjectTest.php | 6 +- .../{Object => Integration}/OrgPersonTest.php | 24 +- .../Server/{Object => Integration}/PersonTest.php | 86 +-- .../Kolab/Server/{ => Integration}/Scenario.php | 23 +- .../{Object => Integration}/UserHandlingTest.php | 6 +- .../Server/{Object => Integration}/UserTest.php | 6 +- .../test/Horde/Kolab/Server/LdapBase.php | 2 +- .../Server/{Server => Objects}/ServerTest.php | 2 +- .../test/Horde/Kolab/Server/Query/LdapTest.php | 2 +- .../test/Horde/Kolab/Server/Result/LdapTest.php | 17 +- .../test/Horde/Kolab/Server/Server/FactoryTest.php | 164 ++++-- .../Horde/Kolab/Server/Structure/KolabTest.php | 4 +- .../test/Horde/Kolab/Server/Structure/LdapTest.php | 4 +- 48 files changed, 1494 insertions(+), 1114 deletions(-) create mode 100644 framework/Kolab_Server/lib/Horde/Kolab/Server/Cleaner.php rename framework/Kolab_Server/lib/Horde/Kolab/Server/{Ldap => Connection}/File.php (100%) rename framework/Kolab_Server/lib/Horde/Kolab/Server/{Ldap => Connection}/Mock.php (60%) create mode 100644 framework/Kolab_Server/lib/Horde/Kolab/Server/Connection/Mock/Search.php create mode 100644 framework/Kolab_Server/test/Horde/Kolab/Server/Connection/MockTest.php rename framework/Kolab_Server/test/Horde/Kolab/Server/{Object => Integration}/AddingObjectsTest.php (86%) rename framework/Kolab_Server/test/Horde/Kolab/Server/{Object => Integration}/AdminTest.php (94%) rename framework/Kolab_Server/test/Horde/Kolab/Server/{Object => Integration}/DistListHandlingTest.php (85%) rename framework/Kolab_Server/test/Horde/Kolab/Server/{Object => Integration}/GroupHandlingTest.php (98%) rename framework/Kolab_Server/test/Horde/Kolab/Server/{Object => Integration}/GroupTest.php (95%) rename framework/Kolab_Server/test/Horde/Kolab/Server/{Object => Integration}/InetorgpersonTest.php (93%) rename framework/Kolab_Server/test/Horde/Kolab/Server/{Object => Integration}/KolabgermanbankarrangementTest.php (94%) rename framework/Kolab_Server/test/Horde/Kolab/Server/{Object => Integration}/KolabinetorgpersonTest.php (92%) rename framework/Kolab_Server/test/Horde/Kolab/Server/{Object => Integration}/Kolabpop3accountTest.php (95%) rename framework/Kolab_Server/test/Horde/Kolab/Server/{Server => Integration}/MockTest.php (66%) rename framework/Kolab_Server/test/Horde/Kolab/Server/{Object => Integration}/ObjectTest.php (97%) rename framework/Kolab_Server/test/Horde/Kolab/Server/{Object => Integration}/OrgPersonTest.php (86%) rename framework/Kolab_Server/test/Horde/Kolab/Server/{Object => Integration}/PersonTest.php (62%) rename framework/Kolab_Server/test/Horde/Kolab/Server/{ => Integration}/Scenario.php (97%) rename framework/Kolab_Server/test/Horde/Kolab/Server/{Object => Integration}/UserHandlingTest.php (99%) rename framework/Kolab_Server/test/Horde/Kolab/Server/{Object => Integration}/UserTest.php (94%) rename framework/Kolab_Server/test/Horde/Kolab/Server/{Server => Objects}/ServerTest.php (98%) diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Cleaner.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Cleaner.php new file mode 100644 index 000000000..adb685fd5 --- /dev/null +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Cleaner.php @@ -0,0 +1,268 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Server + */ + +/** + * A cleanup decoration for Kolab Servers that allows to remove all added + * objects. + * + * Copyright 2008-2009 The Horde Project (http://www.horde.org/) + * + * See the enclosed file COPYING for license information (LGPL). If you + * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html. + * + * @category Kolab + * @package Kolab_Server + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Server + */ +class Horde_Kolab_Server_Cleaner implements Horde_Kolab_Server +{ + /** + * The server we delegate to. + * + * @var Horde_Kolab_Server + */ + private $_server; + + /** + * The objects added. + * + * @var array + */ + private $_added = array(); + + /** + * Constructor. + * + * @param Horde_Kolab_Server $server The base server connection. + */ + public function __construct(Horde_Kolab_Server $server) + { + $this->_server = $server; + } + + /** + * Connect to the server. + * + * @param string $guid The global unique id of the user. + * @param string $pass The password. + * + * @return NULL. + * + * @throws Horde_Kolab_Server_Exception If the connection failed. + */ + public function connectGuid($guid = null, $pass = null) + { + $this->_server->connectGuid($guid, $pass); + } + + /** + * Get the current GUID + * + * @return string The GUID of the connected user. + */ + public function getGuid() + { + $this->_server->getGuid(); + } + + /** + * Get the base GUID of this server + * + * @return string The base GUID of this server. + */ + public function getBaseGuid() + { + $this->_server->getBaseGuid(); + } + + /** + * Low level access to reading object data. + * + * @param string $guid The object to retrieve. + * @param array $attrs Restrict to these attributes. + * + * @return array An array of attributes. + * + * @throws Horde_Kolab_Server_Exception If the search operation hit an error + * or returned no result. + */ + public function read($guid, array $attrs = array()) + { + return $this->_server->read($guid); + } + + /** + * Low level access to reading some object attributes. + * + * @param string $guid The object to retrieve. + * @param string $attrs Restrict to these attributes. + * + * @return array An array of attributes. + * + * @throws Horde_Kolab_Server_Exception + * + * @see Horde_Kolab_Server::read + */ + public function readAttributes($guid, array $attrs) + { + return $this->_server->readAttributes($guid, $attrs); + } + + /** + * Finds object data matching a given set of criteria. + * + * @param Horde_Kolab_Server_Query_Element $criteria The criteria for the search. + * @param array $params Additional search parameters. + * + * @return Horde_Kolab_Server_Result The result object. + * + * @throws Horde_Kolab_Server_Exception + */ + public function find( + Horde_Kolab_Server_Query_Element $criteria, + array $params = array() + ) { + return $this->_server->find($criteria, $params); + } + + /** + * Finds all object data below a parent matching a given set of criteria. + * + * @param Horde_Kolab_Server_Query_Element $criteria The criteria for the search. + * @param string $parent The parent to search below. + * @param array $params Additional search parameters. + * + * @return Horde_Kolab_Server_Result The result object. + * + * @throws Horde_Kolab_Server_Exception + */ + public function findBelow( + Horde_Kolab_Server_Query_Element $criteria, + $parent, + array $params = array() + ) { + return $this->_server->findBelow($criteria, $parent, $params); + } + + /** + * Modify existing object data. + * + * @param Horde_Kolab_Server_Object $object The object to be modified. + * @param array $data The attributes of the object + * to be stored. + * + * @return NULL + * + * @throws Horde_Kolab_Server_Exception + */ + public function save(Horde_Kolab_Server_Object $object, array $data) + { + $this->_server->save($object, $data); + } + + /** + * Add new object data. + * + * @param Horde_Kolab_Server_Object $object The object to be added. + * @param array $data The attributes of the object + * to be added. + * + * @return NULL + * + * @throws Horde_Kolab_Server_Exception + */ + public function add(Horde_Kolab_Server_Object $object, array $data) + { + $this->_server->add($object, $data); + $this->_added[] = $object->getGuid(); + } + + /** + * Delete an object. + * + * @param string $guid The GUID of the object to be deleted. + * + * @return NULL + * + * @throws Horde_Kolab_Server_Exception + */ + public function delete($guid) + { + $this->_server->delete($guid); + if (in_array($guid, $this->_added)) { + $this->_added = array_diff($this->_added, array($guid)); + } + } + + /** + * Rename an object. + * + * @param string $guid The GUID of the object to be renamed. + * @param string $new The new GUID of the object. + * + * @return NULL + * + * @throws Horde_Kolab_Server_Exception + */ + public function rename($guid, $new) + { + $this->_server->rename($guid, $new); + } + + /** + * Return the ldap schema. + * + * @return Net_LDAP2_Schema The LDAP schema. + * + * @throws Horde_Kolab_Server_Exception If retrieval of the schema failed. + */ + public function getSchema() + { + return $this->_server->getSchema(); + } + + /** + * Get the parent GUID of this object. + * + * @param string $guid The GUID of the child. + * + * @return string the parent GUID of this object. + */ + public function getParentGuid($guid) + { + return $this->_server->getParentGuid($guid); + } + + /** + * Cleanup the server. + * + * @return NULL + */ + public function cleanup() + { + foreach ($this->_added as $guid) { + $this->delete($guid); + } + } + + /** + * Destructor. + */ + public function __destruct() + { + $this->cleanup(); + } +} diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Composite.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Composite.php index 058af2500..caeda199f 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Composite.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Composite.php @@ -98,12 +98,11 @@ class Horde_Kolab_Server_Composite * * @throws Horde_Kolab_Server_Exception If the connection failed. */ - protected function _connect($user = null, $pass = null) + public function connect($user = null, $pass = null) { /** Bind anonymously first. */ - $this->connectUid(); + $this->server->connectGuid(); $guid = $this->structure->getGuidForUser($user); - $this->connectUid($guid, $pass); - return $this->structure->getUserForUser($user); + $this->server->connectGuid($guid, $pass); } } diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Ldap/File.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Connection/File.php similarity index 100% rename from framework/Kolab_Server/lib/Horde/Kolab/Server/Ldap/File.php rename to framework/Kolab_Server/lib/Horde/Kolab/Server/Connection/File.php diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Ldap/Mock.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Connection/Mock.php similarity index 60% rename from framework/Kolab_Server/lib/Horde/Kolab/Server/Ldap/Mock.php rename to framework/Kolab_Server/lib/Horde/Kolab/Server/Connection/Mock.php index ddcbc322f..3a1ecffa1 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Ldap/Mock.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Connection/Mock.php @@ -25,7 +25,8 @@ * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Ldap_Mock extends Horde_Kolab_Server_Ldap_Standard +class Horde_Kolab_Server_Connection_Mock +implements Horde_Kolab_Server_Connection { /** @@ -33,7 +34,7 @@ class Horde_Kolab_Server_Ldap_Mock extends Horde_Kolab_Server_Ldap_Standard * * @var array */ - protected $data; + protected $data = array(); /** * Indicates if we are bound. @@ -91,17 +92,10 @@ class Horde_Kolab_Server_Ldap_Mock extends Horde_Kolab_Server_Ldap_Standard * * @return NULL */ - public function setParams(array $params) + public function __construct(array $params) { - //@todo Load when connecting - //$this->load(); - if (isset($params['data'])) { $this->data = $params['data']; - } else { - if (!isset($this->data)) { - $this->data = array(); - } } if (isset($this->params['admin']) @@ -114,65 +108,26 @@ class Horde_Kolab_Server_Ldap_Mock extends Horde_Kolab_Server_Ldap_Standard $admin->save(); } } - - //@todo Load when connecting - //$this->store(); - - parent::setParams($params); - } - - /** - * Connect to the LDAP server. - * - * @param string $uid The unique id of the user. - * @param string $pass The password. - * - * @return NULL. - * - * @throws Horde_Kolab_Server_Exception If the connection failed. - */ - protected function _connectUid($uid = null, $pass = null) - { - //@todo - } - - /** - * Load the current state of the database. - * - * @return NULL - */ - protected function load() - { - //@todo: remove the global - if (isset($GLOBALS['KOLAB_SERVER_TEST_DATA'])) { - $this->data = $GLOBALS['KOLAB_SERVER_TEST_DATA']; - } else { - $this->data = array(); - } } /** - * Store the current state of the database. + * Get the server read connection. * - * @return NULL + * @return mixed The connection for reading data. */ - protected function store() + public function getRead() { - $GLOBALS['KOLAB_SERVER_TEST_DATA'] = $this->data; + return $this; } /** - * Cleans the current state of the database. + * Get the server write connection. * - * @return NULL + * @return mixed The connection for writing data. */ - public function clean() + public function getWrite() { - $this->unbind(); - - $GLOBALS['KOLAB_SERVER_TEST_DATA'] = array(); - - $this->data = array(); + return $this; } /** @@ -188,8 +143,12 @@ class Horde_Kolab_Server_Ldap_Mock extends Horde_Kolab_Server_Ldap_Standard * password or anonymous binding is not * allowed. */ - protected function bind($dn = false, $pw = '') + public function bind($dn = '', $pw = '') { + if ($this->bound && empty($dn) && empty($pw)) { + return true; + } + if (!$dn) { if (isset($this->params['uid'])) { $dn = $this->params['uid']; @@ -230,17 +189,106 @@ class Horde_Kolab_Server_Ldap_Mock extends Horde_Kolab_Server_Ldap_Standard } else { $this->bound = true; } + + if ($this->bound) { + $this->load(); + } + return $this->bound; } /** - * Disconnect from LDAP. + * Get a specific entry based on the DN + * + * @param string $dn DN of the entry that should be fetched + * @param array $attr Array of Attributes to select. If ommitted, all attributes are fetched. + * + * @return Net_LDAP2_Entry|Net_LDAP2_Error Reference to a Net_LDAP2_Entry object or Net_LDAP2_Error object + * @todo Maybe check against the shema should be done to be sure the attribute type exists + */ + public function getEntry($dn, $attr = array()) + { + if (!is_array($attr)) { + $attr = array($attr); + } + $result = $this->search($dn, '(objectClass=*)', + array('scope' => 'base', 'attributes' => $attr)); + if ($result->count() == 0) { + throw new Horde_Kolab_Server_Exception('Could not fetch entry '.$dn.': no entry found'); + } + $entry = $result->shiftEntry(); + if (false == $entry) { + throw new Horde_Kolab_Server_Exception('Could not fetch entry (error retrieving entry from search result)'); + } + return $entry; + } + + /** + * Search for object data. * - * @return NULL + * @param string $base The search base + * @param string $filter The LDAP search filter. + * @param string $params Additional search parameters. + * + * @return array The result array. + * + * @throws Horde_Kolab_Server_Exception If the search operation encountered + * a problem. */ - public function unbind() + public function search($base = null, $filter = null, $params = array()) { - $this->bound = false; + $this->bind(); + + $filter = $this->parse($filter); + if (isset($params['attributes'])) { + $attributes = $params['attributes']; + if (!is_array($attributes)) { + $attributes = array($attributes); + } + } else { + $attributes = array(); + } + + $result = $this->doSearch($filter, $attributes); + + if (empty($result)) { + $search = new Horde_Kolab_Server_Connection_Mock_Search(array()); + return $search; + } + + if (!empty($base)) { + $subtree = array(); + foreach ($result as $entry) { + if (strpos($entry['dn'], $base)) { + $subtree[] = $entry; + } + } + $result = $subtree; + } + + $search = new Horde_Kolab_Server_Connection_Mock_Search($this->getEntries($result)); + return $search; + } + + /** + * Return the entries of a result. + * + * @param array $result The LDAP search result. + * + * @return mixed The entries of the result or false. + */ + public function getEntries($result) + { + if (is_array($result)) { + $data = array(); + foreach ($result as $entry) { + $t = $entry['data']; + $t['dn'] = $entry['dn']; + $data[$entry['dn']] = $t; + } + return $data; + } + return false; } /** @@ -323,53 +371,6 @@ class Horde_Kolab_Server_Ldap_Mock extends Horde_Kolab_Server_Ldap_Standard } /** - * Search for object data. - * - * @param string $filter The LDAP search filter. - * @param string $params Additional search parameters. - * @param string $base The search base - * - * @return array The result array. - * - * @throws Horde_Kolab_Server_Exception If the search operation encountered - * a problem. - */ - public function search($filter = null, $params = array(), $base = null) - { - if (!$this->bound) { - $result = $this->bind(); - } - - $filter = $this->parse($filter); - if (isset($params['attributes'])) { - $attributes = $params['attributes']; - if (!is_array($attributes)) { - $attributes = array($attributes); - } - $this->mapKeys($attributes); - } else { - $attributes = array(); - } - $result = $this->doSearch($filter, $attributes); - if (empty($result)) { - return array(); - } - if ($base) { - $subtree = array(); - foreach ($result as $entry) { - if (strpos($entry['dn'], $base)) { - $subtree[] = $entry; - } - } - $result = $subtree; - } - - $this->unmapAttributes($result); - - return $this->getEntries($result); - } - - /** * Perform the search. * * @param array $filter Filter criteria- @@ -381,7 +382,7 @@ class Horde_Kolab_Server_Ldap_Mock extends Horde_Kolab_Server_Ldap_Standard * @throws Horde_Kolab_Server_Exception If the search operation is not * available. */ - protected function doSearch($filter, $attributes = null) + public function doSearch($filter, $attributes = null) { if (isset($filter['log'])) { $result = array(); @@ -483,153 +484,95 @@ class Horde_Kolab_Server_Ldap_Mock extends Horde_Kolab_Server_Ldap_Standard } /** - * Read object data. - * - * @param string $dn The object to retrieve. - * @param string $attrs Restrict to these attributes - * - * @return array An array of attributes. - * - * @throws Horde_Kolab_Server_Exception If the object does not exist. - */ - public function read($uid, array $attrs = array()) + * Add a new entryobject to a directory. + * + * @param Net_LDAP2_Entry $entry Net_LDAP2_Entry + * + * @return Net_LDAP2_Error|true Net_LDAP2_Error object or true + */ + public function add($entry) { - if (!$this->bound) { - $result = $this->bind(); - } + $this->bind(); - if (!isset($this->data[$dn])) { - throw new Horde_Kolab_Server_MissingObjectException(sprintf("No such object: %s", - $dn)); - } - if (empty($attrs)) { - $data = $this->data[$dn]['data']; - $this->unmapAttributes($data); - return $data; - } else { - $this->mapKeys($attrs); + $ldap_data = $this->toStorage($entry->getValues()); - $result = array(); - $data = $this->data[$dn]['data']; + $guid = $entry->getDn(); - foreach ($attrs as $attr) { - if (isset($data[$attr])) { - $result[$attr] = $data[$attr]; - } - } - - $this->unmapAttributes($result); + $this->data[$guid] = array( + 'dn' => $guid, + 'data' => array_merge($ldap_data, + array('dn' => $guid)), + ); - return $result; - } + $this->store(); } /** - * Save an object. - * - * @param string $uid The UID of the object to be added. - * @param array $data The attributes of the object to be added/replaced. - * @param boolean $exists Does the object already exist on the server? - * - * @return NULL - */ - public function save($uid, array $data, $exists = false) + * Modify an ldapentry directly on the server + * + * @param string|Net_LDAP2_Entry &$entry DN-string or Net_LDAP2_Entry + * @param array $parms Array of changes + * + * @access public + * @return Net_LDAP2_Error|true Net_LDAP2_Error object or true + */ + public function modify($entry, $data = array()) { - if (!$this->bound) { - $result = $this->bind(); - } - - if ($exists === false) { + $this->bind(); - $ldap_data = $this->_toStorage($data['add']); - - $this->data[$uid] = array( - 'dn' => $uid, - 'data' => array_merge($ldap_data, - array('dn' => $uid)), - ); - } else { + $guid = $entry->getDn(); - if (isset($data['delete'])) { - foreach ($data['delete'] as $k => $v) { - if (is_int($k)) { - $w = $this->mapField($v); - if (isset($this->data[$uid]['data'][$w])) { - /** Delete a complete attribute */ - unset($this->data[$uid]['data'][$w]); + if (isset($data['delete'])) { + foreach ($data['delete'] as $k => $v) { + if (is_int($k)) { + if (isset($this->data[$guid]['data'][$w])) { + /** Delete a complete attribute */ + unset($this->data[$guid]['data'][$w]); + } + } else { + if (isset($this->data[$guid]['data'][$l])) { + if (!is_array($v)) { + $v = array($v); } - } else { - $l = $this->mapField($k); - if (isset($this->data[$uid]['data'][$l])) { - if (!is_array($v)) { - $v = array($v); - } - foreach ($v as $w) { - $key = array_search($w, $this->data[$uid]['data'][$l]); - if ($key !== false) { - /** Delete a single value */ - unset($this->data[$uid]['data'][$l][$key]); - } + foreach ($v as $w) { + $key = array_search($w, $this->data[$guid]['data'][$l]); + if ($key !== false) { + /** Delete a single value */ + unset($this->data[$guid]['data'][$l][$key]); } } } } } + } - if (isset($data['replace'])) { - $ldap_data = $this->_toStorage($data['replace']); + if (isset($data['replace'])) { + $ldap_data = $this->toStorage($data['replace']); - $this->data[$uid] = array( - 'dn' => $uid, - 'data' => array_merge($this->data[$uid]['data'], - $ldap_data, - array('dn' => $uid)), - ); - } + $this->data[$guid] = array( + 'dn' => $guid, + 'data' => array_merge($this->data[$guid]['data'], + $ldap_data, + array('dn' => $guid)), + ); + } - if (isset($data['add'])) { - $ldap_data = $this->_toStorage($data['add']); + if (isset($data['add'])) { + $ldap_data = $this->toStorage($data['add']); - foreach ($ldap_data as $k => $v) { - if (is_array($v)) { - foreach ($v as $w) { - $this->data[$uid]['data'][$k][] = $w; - } - } else { - $this->data[$uid]['data'][$k][] = $v; + foreach ($ldap_data as $k => $v) { + if (is_array($v)) { + foreach ($v as $w) { + $this->data[$guid]['data'][$k][] = $w; } - $this->data[$uid]['data'][$k] = array_values($this->data[$uid]['data'][$k]); + } else { + $this->data[$guid]['data'][$k][] = $v; } + $this->data[$guid]['data'][$k] = array_values($this->data[$guid]['data'][$k]); } } $this->store(); - - if (isset($this->logger)) { - $this->logger->debug(sprintf('The object \"%s\" has been successfully saved!', - $uid)); - } - } - - /** - * Rewrite a data array to our internal storage format. - * - * @param array $data The attributes of the object to be added/replaced. - * - * @return array The transformed data set. - */ - private function _toStorage($data) - { - $this->mapAttributes($data); - - $ldap_data = array(); - foreach ($data as $key => $val) { - if (!is_array($val)) { - $val = array($val); - } - $ldap_data[$key] = $val; - } - return $ldap_data; } /** @@ -649,11 +592,8 @@ class Horde_Kolab_Server_Ldap_Mock extends Horde_Kolab_Server_Ldap_Standard throw new Horde_Kolab_Server_MissingObjectException(sprintf("No such object: %s", $uid)); } + $this->store(); - if (isset($this->logger)) { - $this->logger->debug(sprintf('The object \"%s\" has been successfully deleted!', - $uid)); - } } /** @@ -666,212 +606,88 @@ class Horde_Kolab_Server_Ldap_Mock extends Horde_Kolab_Server_Ldap_Standard * * @throws Horde_Kolab_Server_Exception */ - public function rename($uid, $new) + public function move($uid, $new) { if (isset($this->data[$uid])) { $this->data[$new] = $this->data[$uid]; unset($this->data[$uid]); } - $this->store(); - if (isset($this->logger)) { - $this->logger->debug(sprintf('The object \"%s\" has been successfully renamed to \"%s\"!', - $uid, $new)); - } - } - /** - * Return the schema for the given objectClass. - * - * @param string $objectclass Fetch the schema for this objectClass. - * - * @return array The schema for the given objectClass. - * - * @throws Horde_Kolab_Server_Exception If retrieval of the schema failed. - */ - public function getObjectclassSchema($objectclass) - { - return array(); + $this->store(); } - /** - * Return the schema for the given attribute. - * - * @param string $attribute Fetch the schema for this attribute. - * - * @return array The schema for the given attribute. - * - * @throws Horde_Kolab_Server_Exception If retrieval of the schema failed. - */ - public function getAttributeSchema($attribute) + public function schema() { - return array(); + //@todo: implement } /** - * Return the current entry of a result. + * Cleans the current state of the database. * - * @return mixe The current entry of the result or false. + * @return NULL */ - protected function fetchEntry() + public function clean() { - if (is_array($this->_current_result) - && $this->_current_index < count($this->_current_result)) { - - $data = array_keys($this->_current_result[$this->_current_index]['data']); - - $data['dn'] = array($this->_current_result[$this->_current_index]['dn']); - - foreach ($this->_current_result[$this->_current_index]['data'] - as $attr => $value) { - if (!is_array($value)) { - $value = array($value); - } - $data[$attr] = $value; - } - $this->_current_index++; - return $data; - } - return false; - } + $this->unbind(); - /** - * Return the first entry of a result. - * - * @param array $result The LDAP search result. - * - * @return mixed The first entry of the result or false. - */ - protected function firstEntry($result) - { - $this->_current_result = $result; - $this->_current_index = 0; - return $this->fetchEntry(); - } + $GLOBALS['KOLAB_SERVER_TEST_DATA'] = array(); - /** - * Return the next entry of a result. - * - * @param resource $entry The current LDAP entry. - * - * @return resource The next entry of the result. - */ - protected function nextEntry($entry) - { - return $this->fetchEntry(); + $this->data = array(); } /** - * Return the entries of a result. - * - * @param array $result The LDAP search result. + * Disconnect from LDAP. * - * @return mixed The entries of the result or false. + * @return NULL */ - protected function getEntries($result) + public function unbind() { - if (is_array($result)) { - $data = array(); - foreach ($result as $entry) { - $t = $entry['data']; - $t['dn'] = $entry['dn']; - $data[$entry['dn']] = $t; - } - return $data; - } - return false; + $this->bound = false; } /** - * Sort the entries of a result. - * - * @param resource &$result The LDAP search result. - * @param string $attribute The attribute used for sorting. + * Load the current state of the database. * - * @return boolean True if sorting succeeded. + * @return NULL */ - public function sort(&$result, $attribute) + protected function load() { - if (empty($result)) { - return $result; + /** + * @todo: remove as it does not make much sense. The file based handler + * can do the same thing as a decorator. + */ + if (isset($GLOBALS['KOLAB_SERVER_TEST_DATA'])) { + $this->data = $GLOBALS['KOLAB_SERVER_TEST_DATA']; } - - $this->_sort_by = $attribute; - usort($result, array($this, 'resultSort')); - return false; } /** - * Sort two entries. - * - * @param array $a First entry. - * @param array $b Second entry. + * Store the current state of the database. * - * @return int Comparison result. + * @return NULL */ - protected function resultSort($a, $b) + protected function store() { - $x = isset($a['data'][$this->_sort_by][0])?$a['data'][$this->_sort_by][0]:''; - $y = isset($b['data'][$this->_sort_by][0])?$b['data'][$this->_sort_by][0]:''; - return strcasecmp($x, $y); + $GLOBALS['KOLAB_SERVER_TEST_DATA'] = $this->data; } /** - * Return the current LDAP error number. - * - * @return int The current LDAP error number. - */ - protected function errno() - { - return $this->_errno; - } - - /** - * Return the current LDAP error description. - * - * @return string The current LDAP error description. - */ - protected function error() - { - return $this->_error; - } - - /** - * Identify the DN of the first result entry. - * - * @todo Check if this could be reintegrated with the code in the LDAP handler - * again. - * - * @param array $result The LDAP search result. - * @param int $restrict A Horde_Kolab_Server::RESULT_* result restriction. + * Rewrite a data array to our internal storage format. * - * @return boolean|string|array The DN(s) or false if there was no result. + * @param array $data The attributes of the object to be added/replaced. * - * @throws Horde_Kolab_Server_Exception If the number of results did not - * meet the expectations. + * @return array The transformed data set. */ - protected function dnFromResult($result, - $restrict = Horde_Kolab_Server::RESULT_SINGLE) + protected function toStorage($data) { - if (empty($result)) { - return false; - } - $dns = array(); - foreach ($result as $entry) { - $dns[] = $entry['dn']; - } - - switch ($restrict) { - case self::RESULT_STRICT: - if (count($dns) > 1) { - throw new Horde_Kolab_Server_Exception(sprintf("Found %s results when expecting only one!", - $count)); + $ldap_data = array(); + foreach ($data as $key => $val) { + if (!is_array($val)) { + $val = array($val); } - case self::RESULT_SINGLE: - return $dns[0]; - case self::RESULT_MANY: - return $dns; + $ldap_data[$key] = $val; } + return $ldap_data; } - } diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Connection/Mock/Search.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Connection/Mock/Search.php new file mode 100644 index 000000000..d6a9a6c60 --- /dev/null +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Connection/Mock/Search.php @@ -0,0 +1,78 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Server + */ + +/** + * A mockup class to simulate LDAP search results. + * + * Copyright 2008-2009 The Horde Project (http://www.horde.org/) + * + * See the enclosed file COPYING for license information (LGPL). If you + * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html. + * + * @category Kolab + * @package Kolab_Server + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Server + */ +class Horde_Kolab_Server_Connection_Mock_Search +extends Net_LDAP2_Search +{ + /** + * The search result. + * + * @var array + */ + private $_result; + + /** + * Constructor. + * + * @param array $result The search result. + */ + public function __construct(array $result) + { + $this->_result = $result; + } + + /** + * The number of result entries. + * + * @return int The number of elements. + */ + public function count() + { + return count($this->_result); + } + + /** + * Test if the last search exceeded the size limit. + * + * @return boolean True if the last search exceeded the size limit. + */ + public function sizeLimitExceeded() + { + return false; + } + + /** + * Return the result as an array. + * + * @return array The resulting array. + */ + public function as_struct() + { + return $this->_result; + } + +} diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Factory.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Factory.php index 2d026852b..1a881c340 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Factory.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Factory.php @@ -43,34 +43,23 @@ class Horde_Kolab_Server_Factory * * @return NULL */ - static public function setup(array $configuration, Horde_Injector $injector) + static public function setup(Horde_Injector $injector, array $configuration) { self::setupObjects($injector); self::setupSearch($injector); self::setupSchema($injector); self::setupStructure( + $injector, isset($configuration['structure']) - ? $configuration['structure'] : array(), - $injector + ? $configuration['structure'] : array() ); unset($configuration['structure']); - self::setupCache( - $injector, - isset($configuration['cache']) - ? $configuration['cache'] : null - ); - unset($configuration['cache']); - - self::setupLogger( - $injector, - isset($configuration['logger']) - ? $configuration['logger'] : null - ); - unset($configuration['logger']); + self::setupConfiguration($injector, $configuration); - self::setupServer($configuration, $injector); + self::setupServer($injector); + self::setupComposite($injector); } /** @@ -99,8 +88,8 @@ class Horde_Kolab_Server_Factory * @return NULL */ static protected function setupStructure( - array $configuration, - Horde_Injector $injector + Horde_Injector $injector, + array $configuration ) { if (!isset($configuration['driver'])) { $configuration['driver'] = 'Horde_Kolab_Server_Structure_Kolab'; @@ -151,112 +140,165 @@ class Horde_Kolab_Server_Factory } /** - * Provide a cache handler for Horde_Kolab_Server. + * Inject the server configuration. * - * @param Horde_Injector $injector The object providing our dependencies. - * @param mixed $instance The cache handler or empty if it - * should be created. + * @param Horde_Injector $injector The object providing our dependencies. + * @param array $configuration The parameters required to create + * the desired Horde_Kolab_Server. * * @return NULL */ - static protected function setupCache( + static protected function setupConfiguration( Horde_Injector $injector, - $instance = null + array $configuration ) { - if (empty($instance)) { - $instance = new Horde_Cache_Null(); - } - $injector->setInstance('Horde_Kolab_Server_Cache', $instance); + $injector->setInstance('Horde_Kolab_Server_Config', $configuration); } /** - * Provide a log handler for Horde_Kolab_Server. + * Setup the machinery to create a Horde_Kolab_Server. * - * @param Horde_Injector $injector The object providing our dependencies. - * @param mixed $instance The log handler or empty if it - * should be created. + * @param array $configuration The parameters required to create + * the desired Horde_Kolab_Server. + * @param Horde_Injector $injector The object providing our dependencies. * * @return NULL */ - static protected function setupLogger( - Horde_Injector $injector, - $instance = null - ) { - if (empty($instance)) { - $instance = new Horde_Log_Logger(new Horde_Log_Handler_Null()); - } - $injector->setInstance('Horde_Kolab_Server_Logger', $instance); + static protected function setupServer(Horde_Injector $injector) { + $injector->bindFactory( + 'Horde_Kolab_Server', + 'Horde_Kolab_Server_Factory', + 'getServer' + ); } /** - * Setup the machinery to create a Horde_Kolab_Server. + * Attempts to return a concrete Horde_Kolab_Server instance. * - * @param array $configuration The parameters required to create - * the desired Horde_Kolab_Server. - * @param Horde_Injector $injector The object providing our dependencies. + * @param Horde_Injector $injector The object providing our dependencies. * - * @return NULL + * @return Horde_Kolab_Server The newly created concrete Horde_Kolab_Server + * instance. */ - static protected function setupServer( - array $configuration, - Horde_Injector $injector - ) { + static public function getServer(Horde_Injector $injector) + { + $configuration = $injector->getInstance('Horde_Kolab_Server_Config'); + if (empty($configuration['driver'])) { - $configuration['driver'] = 'Horde_Kolab_Server_Ldap'; + $configuration['driver'] = 'Ldap'; } - - $config = new stdClass; - switch (ucfirst(strtolower($configuration['driver']))) { + if (isset($configuration['params'])) { + $params = $configuration['params']; + } else { + $params = $configuration; + } + + $driver = ucfirst(strtolower($configuration['driver'])); + switch ($driver) { case 'Ldap': case 'Test': case 'File': - $config->driver = 'Horde_Kolab_Server_' - . ucfirst(strtolower($configuration['driver'])); + $server = self::getLdapServer($driver, $params); break; default: - $config->driver = $configuration['driver']; - break; + throw new Horde_Kolab_Server_Exception('Invalid server configuration!'); } - $config->params = isset($configuration['params']) - ? $configuration['params'] : array(); - - $injector->setInstance('Horde_Kolab_Server_Config', $config); + if (isset($params['map'])) { + $server = new Horde_Kolab_Server_Mapped($server, $params['map']); + } + if (isset($configuration['logger'])) { + $server = new Horde_Kolab_Server_Logged($server, $configuration['logger']); + } + if (isset($configuration['cache'])) { + $server = new Horde_Kolab_Server_Cached($server, $configuration['cache']); + } - $injector->bindFactory( - 'Horde_Kolab_Server', - 'Horde_Kolab_Server_Factory', - 'getServer' - ); + return $server; } /** - * Attempts to return a concrete Horde_Kolab_Server instance. + * Attempts to return a concrete Horde_Kolab_Server_Ldap instance. * - * @param Horde_Injector $injector The object providing our dependencies. + * @param array $params LDAP connection parameters. * - * @return Horde_Kolab_Server The newly created concrete Horde_Kolab_Server - * instance. + * @return Horde_Kolab_Server_Ldap The newly created concrete + * Horde_Kolab_Server_Ldap instance. */ - static public function &getServer(Horde_Injector $injector) + static protected function getLdapServer($driver, array $params) { - $config = $injector->getInstance('Horde_Kolab_Server_Config'); - $driver = $config->driver; - $server = new $driver( - $injector->getInstance('Horde_Kolab_Server_Objects'), - $injector->getInstance('Horde_Kolab_Server_Structure'), - $injector->getInstance('Horde_Kolab_Server_Search'), - $injector->getInstance('Horde_Kolab_Server_Schema') - ); - $server->setParams($config->params); - $server->setCache($injector->getInstance('Horde_Kolab_Server_Cache')); - $server->setLogger($injector->getInstance('Horde_Kolab_Server_Logger')); + if (!isset($params['basedn'])) { + throw new Horde_Kolab_Server_Exception('The base DN is missing'); + } + + if (isset($params['server'])) { + $params['host'] = $params['server']; + unset($params['server']); + } + + if (isset($params['phpdn'])) { + $params['binddn'] = $params['phpdn']; + unset($params['phpdn']); + } + + if (isset($params['phppw'])) { + $params['bindpw'] = $params['phppw']; + unset($params['phppw']); + } + + //@todo: Place this is a specific connection factory. + switch ($driver) { + case 'Ldap': + $ldap_read = new Net_LDAP2($params); + if (isset($params['host_master'])) { + $params['host'] = $params['host_master']; + $ldap_write = new Net_LDAP2($params); + $connection = new Horde_Kolab_Server_Connection_Splittedldap( + $ldap_read, $ldap_write + ); + } else { + $connection = new Horde_Kolab_Server_Connection_Simpleldap( + $ldap_read + ); + } + break; + case 'File': + case 'Test': + $connection = new Horde_Kolab_Server_Connection_Mock($params); + break; + } + if (!isset($params['filter'])) { + $server = new Horde_Kolab_Server_Ldap_Standard( + $connection, + $params['basedn'] + ); + } else { + $server = new Horde_Kolab_Server_Ldap_Filtered( + $connection, + $params['basedn'], + $params['filter'] + ); + } return $server; } /** + * Setup the machinery to create a Horde_Kolab_Server_Composite server. + * + * @param Horde_Injector $injector The object providing our dependencies. + * + * @return NULL + */ + static protected function setupComposite(Horde_Injector $injector) + { + /** + * Nothing to do here for now as class and interface name are the same. + */ + } + + /** * Attempts to return a reference to a concrete Horde_Kolab_Server * instance based on $driver. It will only create a new instance * if no Horde_Kolab_Server instance with the same parameters currently @@ -273,52 +315,32 @@ class Horde_Kolab_Server_Factory */ static public function &singleton($params = array()) { - $signature = hash('md5', serialize(ksort($params))); + global $conf; + if (empty($params) && isset($conf['kolab']['ldap'])) { + $params = $conf['kolab']['ldap']; + } + + ksort($params); + $signature = hash('md5', serialize($params)); if (!isset(self::$_instances[$signature])) { - $params['cache'] = Horde_Cache::singleton( - $GLOBALS['conf']['cache']['driver'], - //@todo: Can we omit Horde:: here? - Horde::getDriverConfig( - 'cache', - $GLOBALS['conf']['cache']['driver'] - ) - ); + /** @todo: The caching decorator is still missing. +/* $params['cache'] = Horde_Cache::singleton( */ +/* $GLOBALS['conf']['cache']['driver'], */ +/* //@todo: Can we omit Horde:: here? */ +/* Horde::getDriverConfig( */ +/* 'cache', */ +/* $GLOBALS['conf']['cache']['driver'] */ +/* ) */ +/* ); */ $params['logger'] = Horde::getLogger(); $injector = new Horde_Injector(new Horde_Injector_TopLevel()); - self::setup($params, $injector); + self::setup($injector, $params); self::$_instances[$signature] = $injector->getInstance( 'Horde_Kolab_Server' ); } -/* if (empty($this->_ldap_read)) { */ -/* $this->handleError( */ -/* Net_LDAP2::checkLDAPExtension(), */ -/* Horde_Kolab_Server_Exception::MISSING_LDAP_EXTENSION */ -/* ); */ - -/* $this->_ldap_read = new Net_LDAP2($this->params); */ - -/* if (isset($this->params['host_master']) */ -/* && $this->params['host_master'] == $this->params['host'] */ -/* ) { */ - -/* $params = $this->params; */ -/* $params['host'] = $this->params['host_master']; */ - -/* $this->_ldap_write = new Net_LDAP2($params); */ -/* } else { */ -/* $this->_ldap_write = $this->_ldap_read; */ -/* } */ -/* } */ - -/* if ($write) { */ -/* return $this->_ldap_write; */ -/* } else { */ -/* return $this->_ldap_read; */ -/* } */ - return self::$_instances[$signature]; } } \ No newline at end of file diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Ldap.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Ldap.php index 0e76479ef..cf5d7862a 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Ldap.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Ldap.php @@ -59,11 +59,15 @@ abstract class Horde_Kolab_Server_Ldap implements Horde_Kolab_Server */ public function __construct( Horde_Kolab_Server_Connection $connection, - $base_dn, - $filter = null + $base_dn ) { $this->_conn = $connection; $this->_base_dn = $base_dn; + + $this->_handleError( + Net_LDAP2::checkLDAPExtension(), + Horde_Kolab_Server_Exception::MISSING_LDAP_EXTENSION + ); } /** @@ -190,11 +194,11 @@ abstract class Horde_Kolab_Server_Ldap implements Horde_Kolab_Server */ public function save(Horde_Kolab_Server_Object $object, array $data) { + $changes = new Horde_Kolab_Server_Ldap_Changes($object, $data); $entry = $this->_conn->getWrite()->getEntry( $object->getGuid(), array_keys($data) ); $this->_handleError($entry, Horde_Kolab_Server_Exception::SYSTEM); - $changes = new Horde_Kolab_Server_Ldap_Changes($object, $data); $this->_handleError( $this->_conn->getWrite()->modify($entry, $changes->getChangeset()), Horde_Kolab_Server_Exception::SYSTEM diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/List/Base.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/List/Base.php index 2c5785650..e70abd263 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/List/Base.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/List/Base.php @@ -64,7 +64,7 @@ class Horde_Kolab_Server_List_Base implements Horde_Kolab_Server_List } if ($sort) { - /* FIXME */ + /* @todo: sorting */ /* $data = $result->as_sorted_struct(); */ /*$this->sort($result, $sort); */ } diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Logged.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Logged.php index fdd194b32..1644b88e6 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Logged.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Logged.php @@ -45,12 +45,11 @@ class Horde_Kolab_Server_Logged implements Horde_Kolab_Server * Constructor. * * @param Horde_Kolab_Server $server The base server connection. - * @param Horde_Log_Logger $logger THe log handler. + * @param mixed $logger The log handler. The class must at + * least provide the info() method. */ - public function __construct( - Horde_Kolab_Server $server, - Horde_Log_Logger $logger - ) { + public function __construct(Horde_Kolab_Server $server, $logger) + { $this->_server = $server; $this->_logger = $logger; } @@ -67,7 +66,22 @@ class Horde_Kolab_Server_Logged implements Horde_Kolab_Server */ public function connectGuid($guid = null, $pass = null) { - $this->_server->connectGuid($guid, $pass); + try { + $this->_server->connectGuid($guid, $pass); + $this->_logger->info( + sprintf( + "Successfully connected to the Kolab Server as \"%s\".", + $guid + ) + ); + } catch (Horde_Kolab_Server_Exception $e) { + $this->_logger->info( + sprintf( + "Failed saving object \"%s\"! Error: %s", + $object->getGuid(), $e->getMessage() + ) + ); + } } /** @@ -172,13 +186,23 @@ class Horde_Kolab_Server_Logged implements Horde_Kolab_Server */ public function save(Horde_Kolab_Server_Object $object, array $data) { - $this->_server->save($object, $data); - $this->_logger->info( - sprintf( - "The object \"%s\" has been successfully saved!", - $object->getGuid() - ) - ); + try { + $this->_server->save($object, $data); + $this->_logger->info( + sprintf( + "The object \"%s\" has been successfully saved!", + $object->getGuid() + ) + ); + } catch (Horde_Kolab_Server_Exception $e) { + $this->_logger->info( + sprintf( + "Failed saving object \"%s\"! Error: %s", + $object->getGuid(), $e->getMessage() + ) + ); + + } } /** @@ -194,13 +218,23 @@ class Horde_Kolab_Server_Logged implements Horde_Kolab_Server */ public function add(Horde_Kolab_Server_Object $object, array $data) { - $this->_server->add($object, $data); - $this->_logger->info( - sprintf( - "The object \"%s\" has been successfully added!", - $object->getGuid() - ) - ); + try { + $this->_server->add($object, $data); + $this->_logger->info( + sprintf( + "The object \"%s\" has been successfully added!", + $object->getGuid() + ) + ); + } catch (Horde_Kolab_Server_Exception $e) { + $this->_logger->info( + sprintf( + "Failed adding object \"%s\"! Error: %s", + $object->getGuid(), $e->getMessage() + ) + ); + + } } /** @@ -214,10 +248,21 @@ class Horde_Kolab_Server_Logged implements Horde_Kolab_Server */ public function delete($guid) { - $this->_server->delete($guid); - $this->_logger->info( - sprintf("The object \"%s\" has been successfully deleted!", $guid) - ); + try { + $this->_server->delete($guid); + $this->_logger->info( + sprintf("The object \"%s\" has been successfully deleted!", $guid) + ); + } catch (Horde_Kolab_Server_Exception $e) { + $this->_logger->info( + sprintf( + "Failed deleting object \"%s\"! Error: %s", + $object->getGuid(), $e->getMessage() + ) + ); + + } + } /** @@ -232,13 +277,23 @@ class Horde_Kolab_Server_Logged implements Horde_Kolab_Server */ public function rename($guid, $new) { - $this->_server->rename($guid, $new); - $this->_logger->info( - sprintf( - "The object \"%s\" has been successfully renamed to \"%s\"!", - $guid, $new - ) - ); + try { + $this->_server->rename($guid, $new); + $this->_logger->info( + sprintf( + "The object \"%s\" has been successfully renamed to \"%s\"!", + $guid, $new + ) + ); + } catch (Horde_Kolab_Server_Exception $e) { + $this->_logger->info( + sprintf( + "Failed saving object \"%s\"! Error: %s", + $object->getGuid(), $e->getMessage() + ) + ); + + } } /** diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Mapped.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Mapped.php index 456653edb..2bdc92a50 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Mapped.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Mapped.php @@ -153,8 +153,10 @@ class Horde_Kolab_Server_Mapped implements Horde_Kolab_Server * * @throws Horde_Kolab_Server_Exception */ - public function find(array $criteria, array $params = array()) - { + public function find( + Horde_Kolab_Server_Query_Element $criteria, + array $params = array() + ) { $criteria = new Horde_Kolab_Server_Query_Element_Mapped($criteria, $this); $data = $this->_server->find($criteria, $params); $this->unmapAttributes($data); @@ -172,8 +174,11 @@ class Horde_Kolab_Server_Mapped implements Horde_Kolab_Server * * @throws Horde_Kolab_Server_Exception */ - public function findBelow(array $criteria, $parent, array $params = array()) - { + public function findBelow( + Horde_Kolab_Server_Query_Element $criteria, + $parent, + array $params = array() + ) { $criteria = new Horde_Kolab_Server_Query_Element_Mapped($criteria, $this); $data = $this->_server->findBelow($criteria, $parent, $params); $this->unmapAttributes($data); @@ -191,10 +196,12 @@ class Horde_Kolab_Server_Mapped implements Horde_Kolab_Server * * @throws Horde_Kolab_Server_Exception */ - public function save($guid, array $data) + public function save(Horde_Kolab_Server_Object $object, array $data) { + //@todo: This will not work this way as we need to map internal + // attributes. $this->mapAttributes($data); - $this->_server->save($guid, $data); + $this->_server->save($object, $data); } /** @@ -207,10 +214,12 @@ class Horde_Kolab_Server_Mapped implements Horde_Kolab_Server * * @throws Horde_Kolab_Server_Exception */ - public function add($guid, array $data) + public function add(Horde_Kolab_Server_Object $object, array $data) { + //@todo: This will not work this way as we need to map internal + // attributes. $this->mapAttributes($data); - $this->_server->add($guid, $data); + $this->_server->add($object, $data); } /** @@ -326,4 +335,16 @@ class Horde_Kolab_Server_Mapped implements Horde_Kolab_Server } return $field; } + + /** + * Get the parent GUID of this object. + * + * @param string $guid The GUID of the child. + * + * @return string the parent GUID of this object. + */ + public function getParentGuid($guid) + { + return $this->_server->getParentGuid($guid); + } } diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object.php index 93248fb65..bd13a29e1 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object.php @@ -109,13 +109,6 @@ interface Horde_Kolab_Server_Object public function delete(); /** - * Returns the set of actions supported by this object type. - * - * @return array An array of supported actions. - */ - public function getActions(); - - /** * Generates an ID for the given information. * * @param array &$info The data of the object. @@ -135,4 +128,11 @@ interface Horde_Kolab_Server_Object */ public function prepareObjectInformation(array &$info); + /** + * Returns the set of actions supported by this object type. + * + * @return array An array of supported actions. + */ + public function getActions(); + } diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Base.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Base.php index e56315e52..17e6d149a 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Base.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Base.php @@ -159,6 +159,7 @@ implements Horde_Kolab_Server_Object $class = 'Horde_Kolab_Server_Object_Attribute_' . $attr; if (!in_array($attr, $this->getExternalAttributes()) || !class_exists($class)) { + //@todo: Consider support for external classes. throw new Horde_Kolab_Server_Exception( sprintf("Attribute \"%s\" not supported!", $attr) ); diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Groupofnames.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Groupofnames.php index 588478a22..ad68cdeb6 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Groupofnames.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Groupofnames.php @@ -127,7 +127,7 @@ class Horde_Kolab_Server_Object_Groupofnames extends Horde_Kolab_Server_Object_T { $members = $this->getMembers(); if (in_array($member, $members)) { - //FIXME: As the member attribute is required we may not remove the last member + //@todo: As the member attribute is required we may not remove the last member $this->_cache[self::ATTRIBUTE_MEMBER] = array_diff($this->_cache[self::ATTRIBUTE_MEMBER], array($member)); @@ -175,7 +175,7 @@ class Horde_Kolab_Server_Object_Groupofnames extends Horde_Kolab_Server_Object_T } /** - * FIXME: This method belongs somewhere where we are aware of groups + * @todo: This method belongs somewhere where we are aware of groups * Identify the GID for the first group found using the specified * search criteria * @@ -187,7 +187,7 @@ class Horde_Kolab_Server_Object_Groupofnames extends Horde_Kolab_Server_Object_T * @throws Horde_Kolab_Server_Exception */ static public function gidForSearch($server, $criteria, - $restrict = Horde_Kolab_Server_Object::RESULT_SINGLE) + $restrict = 0) { $groups = array('field' => self::ATTRIBUTE_OC, 'op' => '=', diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Domainmaintainer.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Domainmaintainer.php index 6db3c0844..e831975a1 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Domainmaintainer.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/Domainmaintainer.php @@ -84,7 +84,7 @@ class Horde_Kolab_Server_Object_Kolab_Domainmaintainer extends Horde_Kolab_Serve $domain_uid = sprintf('cn=%s,cn=domain,cn=internal,%s', $domain, $this->server->getBaseUid()); - //FIXME: This should be made easier by the group object + //@todo: This should be made easier by the group object $domain_group = $this->server->fetch($domain_uid, 'Horde_Kolab_Server_Object_Kolabgroupofnames'); if ($domain_group instanceOf PEAR_Error) { diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/User.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/User.php index cbdc7f933..344afdaa6 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/User.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolab/User.php @@ -131,7 +131,7 @@ class Horde_Kolab_Server_Object_Kolab_User extends Horde_Kolab_Server_Object_Kol /** * Get the "first name" attribute of this object * - * FIXME: This should get refactored to be combined with the Id value. + * @todo: This should get refactored to be combined with the Id value. * * @return string the "first name" of this object */ diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabgroupofnames.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabgroupofnames.php index bfc88bfc3..d32071765 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabgroupofnames.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabgroupofnames.php @@ -180,7 +180,7 @@ class Horde_Kolab_Server_Object_Kolabgroupofnames extends Horde_Kolab_Server_Obj * @throws Horde_Kolab_Server_Exception */ static public function gidForMail($server, $mail, - $restrict = Horde_Kolab_Server_Object::RESULT_SINGLE) + $restrict = 0) { $criteria = array('AND' => array(array('field' => self::ATTRIBUTE_MAIL, 'op' => '=', diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabinetorgperson.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabinetorgperson.php index 9e891a9a6..b3d03e357 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabinetorgperson.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Kolabinetorgperson.php @@ -404,7 +404,7 @@ class Horde_Kolab_Server_Object_Kolabinetorgperson extends Horde_Kolab_Server_Ob * @throws Horde_Kolab_Server_Exception */ static public function uidForSearch($server, $criteria, - $restrict = Horde_Kolab_Server_Object::RESULT_SINGLE) + $restrict = 0) { $users = array('field' => self::ATTRIBUTE_OC, 'op' => '=', @@ -429,7 +429,7 @@ class Horde_Kolab_Server_Object_Kolabinetorgperson extends Horde_Kolab_Server_Ob * @throws Horde_Kolab_Server_Exception */ static public function uidForId($server, $id, - $restrict = Horde_Kolab_Server_Object::RESULT_SINGLE) + $restrict = 0) { $criteria = array('AND' => array(array('field' => self::ATTRIBUTE_SID, 'op' => '=', @@ -451,7 +451,7 @@ class Horde_Kolab_Server_Object_Kolabinetorgperson extends Horde_Kolab_Server_Ob * @throws Horde_Kolab_Server_Exception */ static public function uidForMail($server, $mail, - $restrict = Horde_Kolab_Server_Object::RESULT_SINGLE) + $restrict = 0) { $criteria = array('AND' => array(array('field' => self::ATTRIBUTE_MAIL, 'op' => '=', @@ -498,7 +498,7 @@ class Horde_Kolab_Server_Object_Kolabinetorgperson extends Horde_Kolab_Server_Ob * @throws Horde_Kolab_Server_Exception */ static public function uidForAlias($server, $mail, - $restrict = Horde_Kolab_Server_Object::RESULT_SINGLE) + $restrict = 0) { $criteria = array('AND' => array(array('field' => self::ATTRIBUTE_ALIAS, 'op' => '=', diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Person.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Person.php index 0344eb539..469347b00 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Person.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Person.php @@ -27,23 +27,6 @@ */ class Horde_Kolab_Server_Object_Person extends Horde_Kolab_Server_Object_Top { - /** Define attributes specific to this object type */ - - /** The common name */ - const ATTRIBUTE_CN = 'cn'; - - /** The surname */ - const ATTRIBUTE_SN = 'sn'; - - /** A password for this person */ - const ATTRIBUTE_USERPASSWORD = 'userPassword'; - - /** A password for this person */ - const ATTRIBUTE_USERPASSWORDRAW = 'userPasswordRaw'; - - /** A telephone number for this person */ - const ATTRIBUTE_TELNO = 'telephoneNumber'; - /** The specific object class of this object type */ const OBJECTCLASS_PERSON = 'person'; @@ -53,36 +36,37 @@ class Horde_Kolab_Server_Object_Person extends Horde_Kolab_Server_Object_Top * @var array */ static public $init_attributes = array( - 'defined' => array( - self::ATTRIBUTE_CN, - self::ATTRIBUTE_SN, - self::ATTRIBUTE_USERPASSWORD, - self::ATTRIBUTE_TELNO, - ), - 'derived' => array( - self::ATTRIBUTE_USERPASSWORD => array( - 'base' => array( - self::ATTRIBUTE_USERPASSWORD - ), - 'method' => 'getEmpty', - ), - self::ATTRIBUTE_USERPASSWORDRAW => array( - 'base' => array( - self::ATTRIBUTE_USERPASSWORD - ), - 'method' => '_get', - 'args' => array( - self::ATTRIBUTE_USERPASSWORD, - ), - ), - ), - 'required' => array( - self::ATTRIBUTE_CN, - self::ATTRIBUTE_SN, - ), - 'object_classes' => array( - self::OBJECTCLASS_PERSON - ), + 'Cn', 'Sn', 'Userpassword', 'Userpasswordraw', 'Telephonenumber' +/* 'defined' => array( */ +/* self::ATTRIBUTE_CN, */ +/* self::ATTRIBUTE_SN, */ +/* self::ATTRIBUTE_USERPASSWORD, */ +/* self::ATTRIBUTE_TELNO, */ +/* ), */ +/* 'derived' => array( */ +/* self::ATTRIBUTE_USERPASSWORD => array( */ +/* 'base' => array( */ +/* self::ATTRIBUTE_USERPASSWORD */ +/* ), */ +/* 'method' => 'getEmpty', */ +/* ), */ +/* self::ATTRIBUTE_USERPASSWORDRAW => array( */ +/* 'base' => array( */ +/* self::ATTRIBUTE_USERPASSWORD */ +/* ), */ +/* 'method' => '_get', */ +/* 'args' => array( */ +/* self::ATTRIBUTE_USERPASSWORD, */ +/* ), */ +/* ), */ +/* ), */ +/* 'required' => array( */ +/* self::ATTRIBUTE_CN, */ +/* self::ATTRIBUTE_SN, */ +/* ), */ +/* 'object_classes' => array( */ +/* self::OBJECTCLASS_PERSON */ +/* ), */ ); /** @@ -165,12 +149,10 @@ class Horde_Kolab_Server_Object_Person extends Horde_Kolab_Server_Object_Top */ public static function getFilter() { - $criteria = array('AND' => array(array('field' => self::ATTRIBUTE_OC, - 'op' => '=', - 'test' => self::OBJECTCLASS_PERSON), - ), + return new Horde_Kolab_Server_Query_Element_Equals( + Horde_Kolab_Server_Object_Attribute_Objectclass::NAME, + self::OBJECTCLASS_PERSON ); - return $criteria; } /** @@ -184,28 +166,30 @@ class Horde_Kolab_Server_Object_Person extends Horde_Kolab_Server_Object_Top */ public function generateId(array &$info) { + $cn = Horde_Kolab_Server_Object_Attribute_Cn::NAME; + $sn = Horde_Kolab_Server_Object_Attribute_Sn::NAME; if ($this->exists()) { - if (!isset($info[self::ATTRIBUTE_CN]) - && !isset($info[self::ATTRIBUTE_SN])) { - return false; + if (!isset($info[$cn]) + && !isset($info[$sn])) { + return $this->getGuid(); } - if (!isset($info[self::ATTRIBUTE_CN])) { - $old = $this->get(self::ATTRIBUTE_CN); + if (!isset($info[$cn])) { + $old = $this->getInternal($cn); if (!empty($old)) { - return false; + return $this->getGuid(); } } } - if (!empty($info[self::ATTRIBUTE_CN])) { - $id = $info[self::ATTRIBUTE_CN]; + if (!empty($info[$cn])) { + $id = $info[$cn]; } else { - $id = $info[self::ATTRIBUTE_SN]; + $id = $info[$sn]; } if (is_array($id)) { $id = $id[0]; } - return self::ATTRIBUTE_CN . '=' . $this->server->structure->quoteForUid($id); + return $cn . '=' . $this->server->structure->quoteForUid($id); } /** @@ -219,10 +203,10 @@ class Horde_Kolab_Server_Object_Person extends Horde_Kolab_Server_Object_Top */ public function prepareObjectInformation(array &$info) { - if (!$this->exists() - && empty($info[self::ATTRIBUTE_CN]) - && !empty($info[self::ATTRIBUTE_SN])) { - $info[self::ATTRIBUTE_CN] = $info[self::ATTRIBUTE_SN]; + $cn = Horde_Kolab_Server_Object_Attribute_Cn::NAME; + $sn = Horde_Kolab_Server_Object_Attribute_Sn::NAME; + if (!$this->exists() && empty($info[$cn]) && !empty($info[$sn])) { + $info[$cn] = $info[$sn]; } if (!empty($info[self::ATTRIBUTE_USERPASSWORD])) { @@ -258,7 +242,7 @@ class Horde_Kolab_Server_Object_Person extends Horde_Kolab_Server_Object_Top * @throws Horde_Kolab_Server_Exception */ static public function uidForCn($server, $cn, - $restrict = Horde_Kolab_Server_Object::RESULT_SINGLE) + $restrict = 0) { $criteria = array('AND' => array(array('field' => self::ATTRIBUTE_CN, 'op' => '=', diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Top.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Top.php index bac365bad..21cabf950 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Top.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Object/Top.php @@ -27,7 +27,7 @@ * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_Top +abstract class Horde_Kolab_Server_Object_Top extends Horde_Kolab_Server_Object_Base implements Horde_Kolab_Server_Object_Searches { @@ -73,30 +73,6 @@ implements Horde_Kolab_Server_Object_Searches } /** - * Generates an ID for the given information. - * - * @param array &$info The data of the object. - * - * @return string The ID. - */ - public function generateId(array &$info) - { - if ($this->exists() && empty($info['Id'])) { - return false; - } - - if (!empty($info['Id'])) { - if (is_array($info['Id'])) { - $id = $info['Id'][0]; - } else { - $id = $info['Id']; - } - return $this->_composite->server->quoteForGuid($id); - } - return $this->composite->server->quoteForGuid(hash('sha256', uniqid(mt_rand(), true))); - } - - /** * Distill the server side object information to save. * * @param array &$info The information about the object. diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Objects/Base.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Objects/Base.php index d2edfca77..36a242367 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Objects/Base.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Objects/Base.php @@ -29,20 +29,23 @@ class Horde_Kolab_Server_Objects_Base implements Horde_Kolab_Server_Objects { /** - * A link to the server handler. + * A link to the composite server handler. * - * @var Horde_Kolab_Server + * @var Horde_Kolab_Server_Composite */ - protected $server; + protected $composite; /** - * Set the server reference for this object. + * Set the composite server reference for this object. * - * @param Horde_Kolab_Server &$server A link to the server handler. + * @param Horde_Kolab_Server_Composite $composite A link to the composite + * server handler. + * + * @return NULL */ - public function setServer($server) + public function setComposite(Horde_Kolab_Server_Composite $composite) { - $this->server = $server; + $this->composite = $composite; } /** @@ -204,7 +207,7 @@ class Horde_Kolab_Server_Objects_Base implements Horde_Kolab_Server_Objects } if ($sort) { - /* FIXME */ + /* @todo: sorting */ /* $data = $result->as_sorted_struct(); */ /*$this->sort($result, $sort); */ } diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Schema/Base.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Schema/Base.php index 9ed27a7f4..4193e93c9 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Schema/Base.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Schema/Base.php @@ -39,20 +39,23 @@ class Horde_Kolab_Server_Schema_Base implements Horde_Kolab_Server_Schema protected $attributes; /** - * A link to the server handler. + * A link to the composite server handler. * - * @var Horde_Kolab_Server + * @var Horde_Kolab_Server_Composite */ - protected $server; + protected $composite; /** - * Set the server reference for this object. + * Set the composite server reference for this object. * - * @param Horde_Kolab_Server &$server A link to the server handler. + * @param Horde_Kolab_Server_Composite $composite A link to the composite + * server handler. + * + * @return NULL */ - public function setServer($server) + public function setComposite(Horde_Kolab_Server_Composite $composite) { - $this->server = $server; + $this->composite = $composite; } /** @@ -104,7 +107,7 @@ class Horde_Kolab_Server_Schema_Base implements Horde_Kolab_Server_Schema * * @throws Horde_Kolab_Server_Exception If the schema analysis fails. */ - public function &getAttributes($class) + public function getExternalAttributes($class) { if (!isset($this->attributes)) { if (isset($this->cache)) { @@ -253,6 +256,10 @@ class Horde_Kolab_Server_Schema_Base implements Horde_Kolab_Server_Schema return $this->attributes[$class]; } + public function getInternalAttributes($class) + { + } + /** * Stores the attribute definitions in the cache. * diff --git a/framework/Kolab_Server/lib/Horde/Kolab/Server/Structure/Ldap.php b/framework/Kolab_Server/lib/Horde/Kolab/Server/Structure/Ldap.php index f3c0499e8..3e1639eb4 100644 --- a/framework/Kolab_Server/lib/Horde/Kolab/Server/Structure/Ldap.php +++ b/framework/Kolab_Server/lib/Horde/Kolab/Server/Structure/Ldap.php @@ -72,7 +72,7 @@ class Horde_Kolab_Server_Structure_Ldap extends Horde_Kolab_Server_Structure_Bas foreach ($ocs as $oc) { try { $class_name = 'Horde_Kolab_Server_Object_' . ucfirst(strtolower($oc)); - Horde_Kolab_Server_Object::loadClass($class_name); + Horde_Kolab_Server_Object_Factory::loadClass($class_name); return $class_name; } catch (Horde_Kolab_Server_Exception $e) { } diff --git a/framework/Kolab_Server/package.xml b/framework/Kolab_Server/package.xml index 3ad9d2802..2c3f1345d 100644 --- a/framework/Kolab_Server/package.xml +++ b/framework/Kolab_Server/package.xml @@ -64,6 +64,11 @@ http://pear.php.net/dtd/package-2.0.xsd"> + + + + + @@ -75,12 +80,11 @@ http://pear.php.net/dtd/package-2.0.xsd"> - - + @@ -104,6 +108,7 @@ http://pear.php.net/dtd/package-2.0.xsd"> + @@ -183,14 +188,13 @@ http://pear.php.net/dtd/package-2.0.xsd"> + - - + - @@ -198,12 +202,21 @@ http://pear.php.net/dtd/package-2.0.xsd"> + + + + + + + + + @@ -211,7 +224,6 @@ http://pear.php.net/dtd/package-2.0.xsd"> - @@ -220,8 +232,6 @@ http://pear.php.net/dtd/package-2.0.xsd"> - - @@ -266,6 +276,9 @@ http://pear.php.net/dtd/package-2.0.xsd"> + + + @@ -273,11 +286,10 @@ http://pear.php.net/dtd/package-2.0.xsd"> - - + @@ -298,6 +310,7 @@ http://pear.php.net/dtd/package-2.0.xsd"> + @@ -349,35 +362,36 @@ http://pear.php.net/dtd/package-2.0.xsd"> + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - + - - - diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Autoload.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Autoload.php index b1d01ba36..780b43c8c 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Autoload.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Autoload.php @@ -18,10 +18,8 @@ if (!spl_autoload_functions()) { '$filename = str_replace(array(\'::\', \'_\'), \'/\', $class);' . '$err_mask = E_ALL ^ E_WARNING;' . '$oldErrorReporting = error_reporting($err_mask);' - . '$included = include "$filename.php";' + . 'include "$filename.php";' . 'error_reporting($oldErrorReporting);' ) ); -} - -require_once dirname(__FILE__) . '/Scenario.php'; \ No newline at end of file +} \ No newline at end of file diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Connection/MockTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Connection/MockTest.php new file mode 100644 index 000000000..6801ca533 --- /dev/null +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Connection/MockTest.php @@ -0,0 +1,235 @@ + + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Server + */ + +/** + * Require our basic test case definition + */ +require_once dirname(__FILE__) . '/../LdapBase.php'; + +/** + * Test the test backend. + * + * Copyright 2008-2009 The Horde Project (http://www.horde.org/) + * + * See the enclosed file COPYING for license information (LGPL). If you + * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html. + * + * @category Kolab + * @package Kolab_Server + * @author Gunnar Wrobel + * @license http://www.fsf.org/copyleft/lgpl.html LGPL + * @link http://pear.horde.org/index.php?package=Kolab_Server + */ +class Horde_Kolab_Server_Connection_MockTest extends Horde_Kolab_Server_LdapBase +{ + + /** + * Test parsing of LDAP filters. + * + * @return NULL + */ + public function testFilterParse() + { + $conn = new Horde_Kolab_Server_Connection_Mock(array()); + + $a = $conn->parse('(a=b)'); + $this->assertEquals(array('att' => 'a', 'log' => '=', 'val' => 'b'), + $a); + + $a = $conn->parse('(&(a=b)(c=d))'); + $this->assertEquals(array('op' => '&', 'sub' => array( + array('att' => 'a', 'log' => '=', 'val' => 'b'), + array('att' => 'c', 'log' => '=', 'val' => 'd'), + )), $a); + + $a = $conn->parse('(&(a=1)(|(b=2)(c=3)))'); + $this->assertEquals(array('op' => '&', 'sub' => array( + array('att' => 'a', 'log' => '=', 'val' => '1'), + array('op' => '|', 'sub' => + array( + array('att' => 'b', 'log' => '=', 'val' => '2'), + array('att' => 'c', 'log' => '=', 'val' => '3'), + )))), $a); + + $a = $conn->parseSub('(!(x=2))(b=1)'); + $this->assertEquals(array(array('op' => '!', 'sub' => + array( + array('att' => 'x', 'log' => '=', 'val' => '2'), + ) + ), + array('att' => 'b', 'log' => '=', 'val' => '1'), + ), $a); + + $a = $conn->parse('(&(!(x=2))(b=1))'); + $this->assertEquals(array('op' => '&', 'sub' => array( + array('op' => '!', 'sub' => + array( + array('att' => 'x', 'log' => '=', 'val' => '2'), + ) + ), + array('att' => 'b', 'log' => '=', 'val' => '1'), + )), $a); + + } + + /** + * Test searching in the simulated LDAP data. + * + * @return NULL + */ + public function testSearch() + { + $conn = new Horde_Kolab_Server_Connection_Mock( + array( + 'data' => + array( + 'cn=a' => array( + 'dn' => 'cn=a', + 'data' => array( + 'a' => '1', + 'b' => '1', + 'c' => '1', + ) + ), + 'cn=b' => array( + 'dn' => 'cn=b', + 'data' => array( + 'a' => '1', + 'b' => '2', + 'c' => '2', + ) + ), + 'cn=c' => array( + 'dn' => 'cn=c', + 'data' => array( + 'a' => '1', + 'b' => '2', + 'c' => '3', + ) + ), + 'cn=d' => array( + 'dn' => 'cn=d', + 'data' => array( + 'a' => '2', + 'b' => '2', + 'c' => '1', + ) + ), + ) + ) + ); + + $a = $conn->search(null, '(c=1)'); + $this->assertEquals( + array( + 'cn=a' => array( + 'a' => '1', + 'b' => '1', + 'c' => '1', + 'dn' => 'cn=a', + ), + 'cn=d' => array( + 'a' => '2', + 'b' => '2', + 'c' => '1', + 'dn' => 'cn=d', + ), + ), + $a->as_struct() + ); + + $a = $conn->search(null, '(c=3)'); + $this->assertEquals( + array( + 'cn=c' => array( + 'a' => '1', + 'b' => '2', + 'c' => '3', + 'dn' => 'cn=c', + ), + ), + $a->as_struct() + ); + + $a = $conn->search(null, '(c=3)', array('attributes' => array('a'))); + $this->assertEquals( + array( + 'cn=c' => array( + 'a' => '1', + 'dn' => 'cn=c', + ), + ), + $a->as_struct() + ); + + $a = $conn->search(null, '(&(a=1)(b=2))', array('attributes' => array('a', 'b'))); + $this->assertEquals( + array( + 'cn=b' => array( + 'a' => '1', + 'b' => '2', + 'dn' => 'cn=b', + ), + 'cn=c' => array( + 'a' => '1', + 'b' => '2', + 'dn' => 'cn=c', + ), + ), + $a->as_struct() + ); + + $a = $conn->search(null, '(&(b=2))', array('attributes' => array('b'))); + $this->assertEquals( + array( + 'cn=b' => array( + 'b' => '2', + 'dn' => 'cn=b', + ), + 'cn=c' => array( + 'b' => '2', + 'dn' => 'cn=c', + ), + 'cn=d' => array( + 'b' => '2', + 'dn' => 'cn=d', + ), + ), + $a->as_struct() + ); + + $a = $conn->search(null, '(!(b=2))', array('attributes' => array('a', 'b'))); + $this->assertEquals( + array( + 'cn=a' => array( + 'a' => '1', + 'b' => '1', + 'dn' => 'cn=a', + ), + ), + $a->as_struct() + ); + + $a = $conn->search(null, '(&(!(x=2))(b=1))', array('attributes' => array('b'))); + $this->assertEquals( + array( + 'cn=a' => array( + 'b' => '1', + 'dn' => 'cn=a', + ), + ), + $a->as_struct() + ); + } + +} diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/AddingObjectsTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/AddingObjectsTest.php similarity index 86% rename from framework/Kolab_Server/test/Horde/Kolab/Server/Object/AddingObjectsTest.php rename to framework/Kolab_Server/test/Horde/Kolab/Server/Integration/AddingObjectsTest.php index d0cfe0786..da7370250 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/AddingObjectsTest.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/AddingObjectsTest.php @@ -12,9 +12,9 @@ */ /** - * Prepare the test setup. + * Require our basic test case definition */ -require_once dirname(__FILE__) . '/../Autoload.php'; +require_once dirname(__FILE__) . '/Scenario.php'; /** * Adding objects to the server. @@ -30,7 +30,7 @@ require_once dirname(__FILE__) . '/../Autoload.php'; * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_AddingObjectsTest extends Horde_Kolab_Server_Scenario +class Horde_Kolab_Server_Integration_AddingObjectsTest extends Horde_Kolab_Server_Integration_Scenario { /** * Test adding valid users. diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/AdminTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/AdminTest.php similarity index 94% rename from framework/Kolab_Server/test/Horde/Kolab/Server/Object/AdminTest.php rename to framework/Kolab_Server/test/Horde/Kolab/Server/Integration/AdminTest.php index 1503cfb3a..1f4ab274e 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/AdminTest.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/AdminTest.php @@ -12,9 +12,9 @@ */ /** - * Prepare the test setup. + * Require our basic test case definition */ -require_once dirname(__FILE__) . '/../Autoload.php'; +require_once dirname(__FILE__) . '/Scenario.php'; /** * Test the admin object. @@ -30,7 +30,7 @@ require_once dirname(__FILE__) . '/../Autoload.php'; * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_AdminTest extends Horde_Kolab_Server_Scenario +class Horde_Kolab_Server_Integration_AdminTest extends Horde_Kolab_Server_Integration_Scenario { /** diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/DistListHandlingTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/DistListHandlingTest.php similarity index 85% rename from framework/Kolab_Server/test/Horde/Kolab/Server/Object/DistListHandlingTest.php rename to framework/Kolab_Server/test/Horde/Kolab/Server/Integration/DistListHandlingTest.php index dbc4693e5..3a1bb87ee 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/DistListHandlingTest.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/DistListHandlingTest.php @@ -12,9 +12,9 @@ */ /** - * Prepare the test setup. + * Require our basic test case definition */ -require_once dirname(__FILE__) . '/../Autoload.php'; +require_once dirname(__FILE__) . '/Scenario.php'; /** * Handling distribution lists. @@ -30,7 +30,7 @@ require_once dirname(__FILE__) . '/../Autoload.php'; * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_DistListHandlingTest extends Horde_Kolab_Server_Scenario +class Horde_Kolab_Server_Integration_DistListHandlingTest extends Horde_Kolab_Server_Integration_Scenario { /** diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/GroupHandlingTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/GroupHandlingTest.php similarity index 98% rename from framework/Kolab_Server/test/Horde/Kolab/Server/Object/GroupHandlingTest.php rename to framework/Kolab_Server/test/Horde/Kolab/Server/Integration/GroupHandlingTest.php index 1dd05c8a5..460f7d359 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/GroupHandlingTest.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/GroupHandlingTest.php @@ -12,9 +12,9 @@ */ /** - * Prepare the test setup. + * Require our basic test case definition */ -require_once dirname(__FILE__) . '/../Autoload.php'; +require_once dirname(__FILE__) . '/Scenario.php'; /** * Handling groups. @@ -30,7 +30,7 @@ require_once dirname(__FILE__) . '/../Autoload.php'; * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_GroupHandlingTest extends Horde_Kolab_Server_Scenario +class Horde_Kolab_Server_Integration_GroupHandlingTest extends Horde_Kolab_Server_Integration_Scenario { /** * Test listing groups if there are no groups. diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/GroupTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/GroupTest.php similarity index 95% rename from framework/Kolab_Server/test/Horde/Kolab/Server/Object/GroupTest.php rename to framework/Kolab_Server/test/Horde/Kolab/Server/Integration/GroupTest.php index 698257ebc..bf0fdb0de 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/GroupTest.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/GroupTest.php @@ -12,9 +12,9 @@ */ /** - * Prepare the test setup. + * Require our basic test case definition */ -require_once dirname(__FILE__) . '/../Autoload.php'; +require_once dirname(__FILE__) . '/Scenario.php'; /** * Test the group object. @@ -30,7 +30,7 @@ require_once dirname(__FILE__) . '/../Autoload.php'; * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_GroupTest extends Horde_Kolab_Server_Scenario +class Horde_Kolab_Server_Integration_GroupTest extends Horde_Kolab_Server_Integration_Scenario { /** diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/InetorgpersonTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/InetorgpersonTest.php similarity index 93% rename from framework/Kolab_Server/test/Horde/Kolab/Server/Object/InetorgpersonTest.php rename to framework/Kolab_Server/test/Horde/Kolab/Server/Integration/InetorgpersonTest.php index 157238bb4..1fb72f61e 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/InetorgpersonTest.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/InetorgpersonTest.php @@ -12,9 +12,9 @@ */ /** - * Prepare the test setup. + * Require our basic test case definition */ -require_once dirname(__FILE__) . '/../Autoload.php'; +require_once dirname(__FILE__) . '/Scenario.php'; /** * Test the inetOrgPerson object. @@ -30,7 +30,7 @@ require_once dirname(__FILE__) . '/../Autoload.php'; * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_InetorgpersonTest extends Horde_Kolab_Server_Scenario +class Horde_Kolab_Server_Integration_InetorgpersonTest extends Horde_Kolab_Server_Integration_Scenario { /** * Objects used within this test @@ -42,22 +42,22 @@ class Horde_Kolab_Server_Object_InetorgpersonTest extends Horde_Kolab_Server_Sce array( 'type' => 'Horde_Kolab_Server_Object_Inetorgperson', Horde_Kolab_Server_Object_Inetorgperson::ATTRIBUTE_GIVENNAME => 'Frank', - Horde_Kolab_Server_Object_Inetorgperson::ATTRIBUTE_SN => 'Mustermann', - Horde_Kolab_Server_Object_Inetorgperson::ATTRIBUTE_USERPASSWORD => 'Kolab_Server_OrgPersonTest_123', + 'Sn' => 'Mustermann', + 'Userpassword' => 'Kolab_Server_OrgPersonTest_123', ), /* Invalid person (no sn) */ array( 'type' => 'Horde_Kolab_Server_Object_Inetorgperson', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN => 'Kolab_Server_OrgPersonTest_123', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_USERPASSWORD => 'Kolab_Server_OrgPersonTest_123', + 'Cn' => 'Kolab_Server_OrgPersonTest_123', + 'Userpassword' => 'Kolab_Server_OrgPersonTest_123', ), /* Person with middle names */ array( 'type' => 'Horde_Kolab_Server_Object_Inetorgperson', Horde_Kolab_Server_Object_Inetorgperson::ATTRIBUTE_GIVENNAME => 'Frank', Horde_Kolab_Server_Object_Inetorgperson::ATTRIBUTE_MIDDLENAMES => 'Günter Eloic', - Horde_Kolab_Server_Object_Inetorgperson::ATTRIBUTE_SN => 'Mustermann', - Horde_Kolab_Server_Object_Inetorgperson::ATTRIBUTE_USERPASSWORD => 'Kolab_Server_OrgPersonTest_123', + 'Sn' => 'Mustermann', + 'Userpassword' => 'Kolab_Server_OrgPersonTest_123', ), ); @@ -192,7 +192,7 @@ class Horde_Kolab_Server_Object_InetorgpersonTest extends Horde_Kolab_Server_Sce */ public function testHandlingHomePostalAddress() { - //FIXME + //@todo } /** diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/KolabgermanbankarrangementTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/KolabgermanbankarrangementTest.php similarity index 94% rename from framework/Kolab_Server/test/Horde/Kolab/Server/Object/KolabgermanbankarrangementTest.php rename to framework/Kolab_Server/test/Horde/Kolab/Server/Integration/KolabgermanbankarrangementTest.php index 3cf9637d2..39fc2a0a4 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/KolabgermanbankarrangementTest.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/KolabgermanbankarrangementTest.php @@ -12,9 +12,9 @@ */ /** - * Prepare the test setup. + * Require our basic test case definition */ -require_once dirname(__FILE__) . '/../Autoload.php'; +require_once dirname(__FILE__) . '/Scenario.php'; /** * Test the kolabGermanBankArrangement object. @@ -30,7 +30,7 @@ require_once dirname(__FILE__) . '/../Autoload.php'; * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_KolabgermanbankarrangementTest extends Horde_Kolab_Server_Scenario +class Horde_Kolab_Server_Integration_KolabgermanbankarrangementTest extends Horde_Kolab_Server_Integration_Scenario { /** * Objects used within this test @@ -42,8 +42,8 @@ class Horde_Kolab_Server_Object_KolabgermanbankarrangementTest extends Horde_Kol array( 'type' => 'Horde_Kolab_Server_Object_Kolabinetorgperson', Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_GIVENNAME => 'Frank', - Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_SN => 'Mustermann', - Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_USERPASSWORD => 'Kolab_Server_OrgPersonTest_123', + 'Sn' => 'Mustermann', + 'Userpassword' => 'Kolab_Server_OrgPersonTest_123', ), /* Default account */ array( diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/KolabinetorgpersonTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/KolabinetorgpersonTest.php similarity index 92% rename from framework/Kolab_Server/test/Horde/Kolab/Server/Object/KolabinetorgpersonTest.php rename to framework/Kolab_Server/test/Horde/Kolab/Server/Integration/KolabinetorgpersonTest.php index 54584220b..6a3a0a969 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/KolabinetorgpersonTest.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/KolabinetorgpersonTest.php @@ -12,9 +12,9 @@ */ /** - * Prepare the test setup. + * Require our basic test case definition */ -require_once dirname(__FILE__) . '/../Autoload.php'; +require_once dirname(__FILE__) . '/Scenario.php'; /** * Test the kolabInetOrgPerson object. @@ -30,7 +30,7 @@ require_once dirname(__FILE__) . '/../Autoload.php'; * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_KolabinetorgpersonTest extends Horde_Kolab_Server_Scenario +class Horde_Kolab_Server_Integration_KolabinetorgpersonTest extends Horde_Kolab_Server_Integration_Scenario { /** * Objects used within this test @@ -42,14 +42,14 @@ class Horde_Kolab_Server_Object_KolabinetorgpersonTest extends Horde_Kolab_Serve array( 'type' => 'Horde_Kolab_Server_Object_Kolabinetorgperson', Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_GIVENNAME => 'Frank', - Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_SN => 'Mustermann', - Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_USERPASSWORD => 'Kolab_Server_OrgPersonTest_123', + 'Sn' => 'Mustermann', + 'Userpassword' => 'Kolab_Server_OrgPersonTest_123', ), /* Invalid person (no sn) */ array( 'type' => 'Horde_Kolab_Server_Object_Kolabinetorgperson', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN => 'Kolab_Server_OrgPersonTest_123', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_USERPASSWORD => 'Kolab_Server_OrgPersonTest_123', + 'Cn' => 'Kolab_Server_OrgPersonTest_123', + 'Userpassword' => 'Kolab_Server_OrgPersonTest_123', ), ); @@ -171,7 +171,7 @@ class Horde_Kolab_Server_Object_KolabinetorgpersonTest extends Horde_Kolab_Serve Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_COUNTRYCITIZENSHIP => array( 'DE', 'SE', - //FIXME: "null" does not work. Why? + //@todo: "null" does not work. Why? //null, 'DE', ), @@ -181,7 +181,7 @@ class Horde_Kolab_Server_Object_KolabinetorgpersonTest extends Horde_Kolab_Serve null, 'Freelancer', ), - // FIXME: Undefined in object class + // @todo: Undefined in object class /* Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_REGISTEREDCAPITAL => array( */ /* '1212121211', */ /* '0', */ @@ -189,7 +189,7 @@ class Horde_Kolab_Server_Object_KolabinetorgpersonTest extends Horde_Kolab_Serve /* '' */ /* ), */ - // FIXME: Undefined in object class + // @todo: Undefined in object class /* Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_BYLAWURI => array( */ /* 'something', */ /* 'somewhere', */ @@ -198,12 +198,12 @@ class Horde_Kolab_Server_Object_KolabinetorgpersonTest extends Horde_Kolab_Serve /* '', */ /* ), */ - //FIXME: Alias support + //@todo: Alias support /* Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_DATEOFINCORPORATION => array( */ /* '199911220707Z', */ /* ), */ - // FIXME: Undefined in object class + // @todo: Undefined in object class /* Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_LEGALREPRESENTATIONPOLICY => array( */ /* 'something', */ /* 'somewhere', */ @@ -219,7 +219,7 @@ class Horde_Kolab_Server_Object_KolabinetorgpersonTest extends Horde_Kolab_Serve array('a', 'b'), ), - //FIXME: Undefined + //@todo: Undefined /* Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_OTHERLEGAL => array( */ /* 'something', */ /* 'somewhere', */ @@ -227,7 +227,7 @@ class Horde_Kolab_Server_Object_KolabinetorgpersonTest extends Horde_Kolab_Serve /* array('a', 'b'), */ /* ), */ - // FIXME: Undefined in object class + // @todo: Undefined in object class /* Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_INLIQUIDATION => array( */ /* 'TRUE', */ /* 'FALSE', */ @@ -235,7 +235,7 @@ class Horde_Kolab_Server_Object_KolabinetorgpersonTest extends Horde_Kolab_Serve /* array('TRUE', 'FALSE'), */ /* ), */ - // FIXME: Undefined in object class + // @todo: Undefined in object class /* Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_TRTYPE => array( */ /* 'something', */ /* 'somewhere', */ @@ -257,7 +257,7 @@ class Horde_Kolab_Server_Object_KolabinetorgpersonTest extends Horde_Kolab_Serve 'somewhere', ), - // FIXME: Undefined in object class + // @todo: Undefined in object class /* Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_TRURI => array( */ /* 'something', */ /* 'somewhere', */ @@ -265,7 +265,7 @@ class Horde_Kolab_Server_Object_KolabinetorgpersonTest extends Horde_Kolab_Serve /* array('a', 'b'), */ /* ), */ - // FIXME: Undefined in object class + // @todo: Undefined in object class /* Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_TRLASTCHANGED => array( */ /* 'something', */ /* 'somewhere', */ @@ -273,7 +273,7 @@ class Horde_Kolab_Server_Object_KolabinetorgpersonTest extends Horde_Kolab_Serve /* array('a', 'b'), */ /* ), */ - // FIXME: Undefined in object class + // @todo: Undefined in object class /* Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_DC => array( */ /* 'something', */ /* 'somewhere', */ diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/Kolabpop3accountTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/Kolabpop3accountTest.php similarity index 95% rename from framework/Kolab_Server/test/Horde/Kolab/Server/Object/Kolabpop3accountTest.php rename to framework/Kolab_Server/test/Horde/Kolab/Server/Integration/Kolabpop3accountTest.php index 6aa372653..084d6a138 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/Kolabpop3accountTest.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/Kolabpop3accountTest.php @@ -12,9 +12,9 @@ */ /** - * Prepare the test setup. + * Require our basic test case definition */ -require_once dirname(__FILE__) . '/../Autoload.php'; +require_once dirname(__FILE__) . '/Scenario.php'; /** * Test the kolabExternalPop3Account object. @@ -30,7 +30,7 @@ require_once dirname(__FILE__) . '/../Autoload.php'; * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_Kolabpop3accountTest extends Horde_Kolab_Server_Scenario +class Horde_Kolab_Server_Integration_Kolabpop3accountTest extends Horde_Kolab_Server_Integration_Scenario { /** * Objects used within this test @@ -42,8 +42,8 @@ class Horde_Kolab_Server_Object_Kolabpop3accountTest extends Horde_Kolab_Server_ array( 'type' => 'Horde_Kolab_Server_Object_Kolabinetorgperson', Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_GIVENNAME => 'Frank', - Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_SN => 'Mustermann', - Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_USERPASSWORD => 'Kolab_Server_OrgPersonTest_123', + 'Sn' => 'Mustermann', + 'Userpassword' => 'Kolab_Server_OrgPersonTest_123', ), /* Default account */ array( diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Server/MockTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/MockTest.php similarity index 66% rename from framework/Kolab_Server/test/Horde/Kolab/Server/Server/MockTest.php rename to framework/Kolab_Server/test/Horde/Kolab/Server/Integration/MockTest.php index 78bb162e6..7433cdb6e 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Server/MockTest.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/MockTest.php @@ -12,9 +12,9 @@ */ /** - * Prepare the test setup. + * Require our basic test case definition */ -require_once dirname(__FILE__) . '/../Autoload.php'; +require_once dirname(__FILE__) . '/Scenario.php'; /** * Test the test backend. @@ -30,7 +30,7 @@ require_once dirname(__FILE__) . '/../Autoload.php'; * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Server_MockTest extends Horde_Kolab_Server_Scenario +class Horde_Kolab_Server_Integration_MockTest extends Horde_Kolab_Server_Integration_Scenario { /** The file based mock environment */ @@ -77,10 +77,25 @@ class Horde_Kolab_Server_Server_MockTest extends Horde_Kolab_Server_Scenario * * @return NULL */ - protected function setUp() + public function setUp() { parent::setUp(); + if (!extension_loaded('ldap') && !@dl('ldap.' . PHP_SHLIB_SUFFIX)) { + $this->markTestSuiteSkipped('Ldap extension is missing!'); + }; + + /** Hide strict errors from the Net_LDAP2 library */ + $error_reporting = error_reporting(); + error_reporting($error_reporting & ~E_STRICT); + + if (!class_exists('Net_LDAP2')) { + $this->markTestSuiteSkipped('PEAR package Net_LDAP2 is not installed!'); + } + + /** Reactivate original error reporting */ + error_reporting($error_reporting); + $this->markTestIncomplete('Needs to be fixed'); $this->initializeEnvironments(); @@ -150,14 +165,14 @@ class Horde_Kolab_Server_Server_MockTest extends Horde_Kolab_Server_Scenario foreach ($this->servers as $server) { $filter = '(&(objectClass=kolabInetOrgPerson)(uid=*)(mail=*)(sn=*))'; $attributes = array( - Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_SN, - Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_CN, + 'Sn', + 'Cn', Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_UID, Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_MAIL, Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_DELETED, ); - $sort = Horde_Kolab_Server_Object_Kolabinetorgperson::ATTRIBUTE_SN; + $sort = 'Sn'; $result = $server->search($filter); $this->assertEquals(2, count($result)); @@ -417,212 +432,4 @@ class Horde_Kolab_Server_Server_MockTest extends Horde_Kolab_Server_Scenario } } - /** - * Test parsing of LDAP filters. - * - * @return NULL - */ - public function testFilterParse() - { - $db = $this->getKolabMockServer(); - - $a = $db->parse('(a=b)'); - $this->assertEquals(array('att' => 'a', 'log' => '=', 'val' => 'b'), - $a); - - $a = $db->parse('(&(a=b)(c=d))'); - $this->assertEquals(array('op' => '&', 'sub' => array( - array('att' => 'a', 'log' => '=', 'val' => 'b'), - array('att' => 'c', 'log' => '=', 'val' => 'd'), - )), $a); - - $a = $db->parse('(&(a=1)(|(b=2)(c=3)))'); - $this->assertEquals(array('op' => '&', 'sub' => array( - array('att' => 'a', 'log' => '=', 'val' => '1'), - array('op' => '|', 'sub' => - array( - array('att' => 'b', 'log' => '=', 'val' => '2'), - array('att' => 'c', 'log' => '=', 'val' => '3'), - )))), $a); - - $a = $db->parseSub('(!(x=2))(b=1)'); - $this->assertEquals(array(array('op' => '!', 'sub' => - array( - array('att' => 'x', 'log' => '=', 'val' => '2'), - ) - ), - array('att' => 'b', 'log' => '=', 'val' => '1'), - ), $a); - - $a = $db->parse('(&(!(x=2))(b=1))'); - $this->assertEquals(array('op' => '&', 'sub' => array( - array('op' => '!', 'sub' => - array( - array('att' => 'x', 'log' => '=', 'val' => '2'), - ) - ), - array('att' => 'b', 'log' => '=', 'val' => '1'), - )), $a); - - } - - /** - * Test searching in the simulated LDAP data. - * - * @return NULL - */ - public function testSearch() - { - $injector = new Horde_Injector(new Horde_Injector_TopLevel()); - $config = new stdClass; - $config->driver = 'test'; - $config->params = array( - 'data' => - array( - 'cn=a' => array( - 'dn' => 'cn=a', - 'data' => array( - 'a' => '1', - 'b' => '1', - 'c' => '1', - ) - ), - 'cn=b' => array( - 'dn' => 'cn=b', - 'data' => array( - 'a' => '1', - 'b' => '2', - 'c' => '2', - ) - ), - 'cn=c' => array( - 'dn' => 'cn=c', - 'data' => array( - 'a' => '1', - 'b' => '2', - 'c' => '3', - ) - ), - 'cn=d' => array( - 'dn' => 'cn=d', - 'data' => array( - 'a' => '2', - 'b' => '2', - 'c' => '1', - ) - ), - ) - ); - $injector->setInstance('Horde_Kolab_Server_Config', $config); - $injector->bindFactory('Horde_Kolab_Server_Structure', - 'Horde_Kolab_Server_Factory', - 'getStructure'); - $injector->bindFactory('Horde_Kolab_Server', - 'Horde_Kolab_Server_Factory', - 'getServer'); - $db = $injector->getInstance('Horde_Kolab_Server'); - - $a = $db->search('(c=1)'); - $this->assertEquals( - array( - 'cn=a' => array( - 'a' => '1', - 'b' => '1', - 'c' => '1', - 'dn' => 'cn=a', - ), - 'cn=d' => array( - 'a' => '2', - 'b' => '2', - 'c' => '1', - 'dn' => 'cn=d', - ), - ), - $a - ); - - $a = $db->search('(c=3)'); - $this->assertEquals( - array( - 'cn=c' => array( - 'a' => '1', - 'b' => '2', - 'c' => '3', - 'dn' => 'cn=c', - ), - ), - $a - ); - - $a = $db->search('(c=3)', array('attributes' => array('a'))); - $this->assertEquals( - array( - 'cn=c' => array( - 'a' => '1', - 'dn' => 'cn=c', - ), - ), - $a - ); - - $a = $db->search('(&(a=1)(b=2))', array('attributes' => array('a', 'b'))); - $this->assertEquals( - array( - 'cn=b' => array( - 'a' => '1', - 'b' => '2', - 'dn' => 'cn=b', - ), - 'cn=c' => array( - 'a' => '1', - 'b' => '2', - 'dn' => 'cn=c', - ), - ), - $a - ); - - $a = $db->search('(&(b=2))', array('attributes' => array('b'))); - $this->assertEquals( - array( - 'cn=b' => array( - 'b' => '2', - 'dn' => 'cn=b', - ), - 'cn=c' => array( - 'b' => '2', - 'dn' => 'cn=c', - ), - 'cn=d' => array( - 'b' => '2', - 'dn' => 'cn=d', - ), - ), - $a - ); - - $a = $db->search('(!(b=2))', array('attributes' => array('a', 'b'))); - $this->assertEquals( - array( - 'cn=a' => array( - 'a' => '1', - 'b' => '1', - 'dn' => 'cn=a', - ), - ), - $a - ); - - $a = $db->search('(&(!(x=2))(b=1))', array('attributes' => array('b'))); - $this->assertEquals( - array( - 'cn=a' => array( - 'b' => '1', - 'dn' => 'cn=a', - ), - ), - $a - ); - } - } diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/ObjectTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/ObjectTest.php similarity index 97% rename from framework/Kolab_Server/test/Horde/Kolab/Server/Object/ObjectTest.php rename to framework/Kolab_Server/test/Horde/Kolab/Server/Integration/ObjectTest.php index f34fa6a0f..187b34ffe 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/ObjectTest.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/ObjectTest.php @@ -12,9 +12,9 @@ */ /** - * Prepare the test setup. + * Require our basic test case definition */ -require_once dirname(__FILE__) . '/../Autoload.php'; +require_once dirname(__FILE__) . '/Scenario.php'; /** * The the handling of objects. @@ -30,7 +30,7 @@ require_once dirname(__FILE__) . '/../Autoload.php'; * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_ObjectTest extends Horde_Kolab_Server_Scenario +class Horde_Kolab_Server_Integration_ObjectTest extends Horde_Kolab_Server_Integration_Scenario { /** diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/OrgPersonTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/OrgPersonTest.php similarity index 86% rename from framework/Kolab_Server/test/Horde/Kolab/Server/Object/OrgPersonTest.php rename to framework/Kolab_Server/test/Horde/Kolab/Server/Integration/OrgPersonTest.php index 9ff4ce96f..f46ff75aa 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/OrgPersonTest.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/OrgPersonTest.php @@ -12,9 +12,9 @@ */ /** - * Prepare the test setup. + * Require our basic test case definition */ -require_once dirname(__FILE__) . '/../Autoload.php'; +require_once dirname(__FILE__) . '/Scenario.php'; /** * Test the organizationalPerson object. @@ -30,7 +30,7 @@ require_once dirname(__FILE__) . '/../Autoload.php'; * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_OrgPersonTest extends Horde_Kolab_Server_Scenario +class Horde_Kolab_Server_Integration_OrgPersonTest extends Horde_Kolab_Server_Integration_Scenario { /** * Objects used within this test @@ -41,15 +41,15 @@ class Horde_Kolab_Server_Object_OrgPersonTest extends Horde_Kolab_Server_Scenari /* Default organizationalPerson */ array( 'type' => 'Horde_Kolab_Server_Object_Organizationalperson', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN => 'Kolab_Server_OrgPersonTest_123', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_SN => 'Kolab_Server_OrgPersonTest_123', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_USERPASSWORD => 'Kolab_Server_OrgPersonTest_123', + 'Cn' => 'Kolab_Server_OrgPersonTest_123', + 'Sn' => 'Kolab_Server_OrgPersonTest_123', + 'Userpassword' => 'Kolab_Server_OrgPersonTest_123', ), /* Invalid person (no sn) */ array( 'type' => 'Horde_Kolab_Server_Object_Organizationalperson', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN => 'Kolab_Server_OrgPersonTest_123', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_USERPASSWORD => 'Kolab_Server_OrgPersonTest_123', + 'Cn' => 'Kolab_Server_OrgPersonTest_123', + 'Userpassword' => 'Kolab_Server_OrgPersonTest_123', ), ); @@ -120,11 +120,11 @@ class Horde_Kolab_Server_Object_OrgPersonTest extends Horde_Kolab_Server_Scenari array(Horde_Kolab_Server_Object_Organizationalperson::ATTRIBUTE_POSTALADDRESS => 'Kolab_Server_OrgPersonTest_123$$ ')); $this->assertStoreFetch($person, $server, - array(Horde_Kolab_Server_Object_Organizationalperson::ATTRIBUTE_SN => 'Kolab_Server_OrgPersonTest_456'), + array('Sn' => 'Kolab_Server_OrgPersonTest_456'), array(Horde_Kolab_Server_Object_Organizationalperson::ATTRIBUTE_POSTALADDRESS => array('Kolab_Server_OrgPersonTest_456$$ '))); $this->assertStoreFetch($person, $server, - array(Horde_Kolab_Server_Object_Organizationalperson::ATTRIBUTE_SN => 'Kolab_Server_OrgPersonTest_123', + array('Sn' => 'Kolab_Server_OrgPersonTest_123', Horde_Kolab_Server_Object_Organizationalperson::ATTRIBUTE_STREET => 'Street 1', Horde_Kolab_Server_Object_Organizationalperson::ATTRIBUTE_POSTALCODE => '12345', Horde_Kolab_Server_Object_Organizationalperson::ATTRIBUTE_CITY => 'Nowhere'), @@ -137,7 +137,7 @@ class Horde_Kolab_Server_Object_OrgPersonTest extends Horde_Kolab_Server_Scenari $this->assertStoreFetch($person, $server, array(Horde_Kolab_Server_Object_Organizationalperson::ATTRIBUTE_STREET => null, Horde_Kolab_Server_Object_Organizationalperson::ATTRIBUTE_POSTALCODE => null, - //FIXME: Why does this need a string? + //@todo: Why does this need a string? Horde_Kolab_Server_Object_Organizationalperson::ATTRIBUTE_POSTALADDRESS => '', Horde_Kolab_Server_Object_Organizationalperson::ATTRIBUTE_POSTOFFICEBOX => null, Horde_Kolab_Server_Object_Organizationalperson::ATTRIBUTE_CITY => null), @@ -171,7 +171,7 @@ class Horde_Kolab_Server_Object_OrgPersonTest extends Horde_Kolab_Server_Scenari '+1234567890', array('1', '2'), '0', - //FIXME: How to delete? + //@todo: How to delete? //null ) ) diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/PersonTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/PersonTest.php similarity index 62% rename from framework/Kolab_Server/test/Horde/Kolab/Server/Object/PersonTest.php rename to framework/Kolab_Server/test/Horde/Kolab/Server/Integration/PersonTest.php index cfdc297b2..3dd2fa2d2 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/PersonTest.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/PersonTest.php @@ -12,9 +12,9 @@ */ /** - * Prepare the test setup. + * Require our basic test case definition */ -require_once dirname(__FILE__) . '/../Autoload.php'; +require_once dirname(__FILE__) . '/Scenario.php'; /** * Test the person object. @@ -30,7 +30,7 @@ require_once dirname(__FILE__) . '/../Autoload.php'; * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_PersonTest extends Horde_Kolab_Server_Scenario +class Horde_Kolab_Server_Integration_PersonTest extends Horde_Kolab_Server_Integration_Scenario { public $cn = 'Kolab_Server_PersonTest'; @@ -44,65 +44,65 @@ class Horde_Kolab_Server_Object_PersonTest extends Horde_Kolab_Server_Scenario /* Default dummy person */ array( 'type' => 'Horde_Kolab_Server_Object_Person', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN => 'Kolab_Server_PersonTest_123', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_SN => 'Kolab_Server_PersonTest_123', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_USERPASSWORD => 'Kolab_Server_PersonTest_123', + 'Cn' => 'Kolab_Server_PersonTest_123', + 'Sn' => 'Kolab_Server_PersonTest_123', + 'Userpassword' => 'Kolab_Server_PersonTest_123', ), /* Invalid person (no sn) */ array( 'type' => 'Horde_Kolab_Server_Object_Person', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN => 'Kolab_Server_PersonTest_123', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_USERPASSWORD => 'Kolab_Server_PersonTest_123', + 'Cn' => 'Kolab_Server_PersonTest_123', + 'Userpassword' => 'Kolab_Server_PersonTest_123', ), /* Person with problematic characters */ array( 'type' => 'Horde_Kolab_Server_Object_Person', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN => 'Kolab_Server_PersonTest_!"$%&()=?', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_SN => 'Kolab_Server_PersonTest_!"$%&()=?', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_USERPASSWORD => 'Kolab_Server_PersonTest_!"$%&()=?', + 'Cn' => 'Kolab_Server_PersonTest_!"$%&()=?', + 'Sn' => 'Kolab_Server_PersonTest_!"$%&()=?', + 'Userpassword' => 'Kolab_Server_PersonTest_!"$%&()=?', ), /* Person with difficult encoding */ array( 'type' => 'Horde_Kolab_Server_Object_Person', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN => 'Kolab_Server_PersonTest_ügöräß§', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_SN => 'Kolab_Server_PersonTest_ügöräß§', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_USERPASSWORD => 'Kolab_Server_PersonTest_ügöräß§', + 'Cn' => 'Kolab_Server_PersonTest_ügöräß§', + 'Sn' => 'Kolab_Server_PersonTest_ügöräß§', + 'Userpassword' => 'Kolab_Server_PersonTest_ügöräß§', ), /* Person with forward slash */ array( 'type' => 'Horde_Kolab_Server_Object_Person', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN => 'Kolab_Server_PersonTest_/', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_SN => 'Kolab_Server_PersonTest_/', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_USERPASSWORD => 'Kolab_Server_PersonTest_/', + 'Cn' => 'Kolab_Server_PersonTest_/', + 'Sn' => 'Kolab_Server_PersonTest_/', + 'Userpassword' => 'Kolab_Server_PersonTest_/', ), /* Person with double cn */ array( 'type' => 'Horde_Kolab_Server_Object_Person', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN => array('Kolab_Server_PersonTest_cn1', + 'Cn' => array('Kolab_Server_PersonTest_cn1', 'Kolab_Server_PersonTest_cn2'), - Horde_Kolab_Server_Object_Person::ATTRIBUTE_SN => 'Kolab_Server_PersonTest_cncn', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_USERPASSWORD => 'Kolab_Server_PersonTest_cncn', + 'Sn' => 'Kolab_Server_PersonTest_cncn', + 'Userpassword' => 'Kolab_Server_PersonTest_cncn', ), /* Person with name suffix*/ array( 'type' => 'Horde_Kolab_Server_Object_Person', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN => 'Kolab_Server_PersonTest_123', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_SN => 'Kolab_Server_PersonTest_123', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_USERPASSWORD => 'Kolab_Server_PersonTest_123', + 'Cn' => 'Kolab_Server_PersonTest_123', + 'Sn' => 'Kolab_Server_PersonTest_123', + 'Userpassword' => 'Kolab_Server_PersonTest_123', ), /* Person for telephone number handling*/ array( 'type' => 'Horde_Kolab_Server_Object_Person', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN => 'Kolab_Server_PersonTest_123456', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_SN => 'Kolab_Server_PersonTest_123456', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_USERPASSWORD => 'Kolab_Server_PersonTest_123456', + 'Cn' => 'Kolab_Server_PersonTest_123456', + 'Sn' => 'Kolab_Server_PersonTest_123456', + 'Userpassword' => 'Kolab_Server_PersonTest_123456', ), /* Person with a creation date*/ array( 'type' => 'Horde_Kolab_Server_Object_Person', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN => 'Kolab_Server_PersonTest_123456', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_SN => 'Kolab_Server_PersonTest_123456', - Horde_Kolab_Server_Object_Person::ATTRIBUTE_USERPASSWORD => 'Kolab_Server_PersonTest_123456', + 'Cn' => 'Kolab_Server_PersonTest_123456', + 'Sn' => 'Kolab_Server_PersonTest_123456', + 'Userpassword' => 'Kolab_Server_PersonTest_123456', 'Creationdate' => '191008030000Z', ), ); @@ -129,7 +129,7 @@ class Horde_Kolab_Server_Object_PersonTest extends Horde_Kolab_Server_Scenario { foreach ($this->servers as $server) { $a = new Horde_Kolab_Server_Object_Person($server, null, $this->objects[0]); - $this->assertContains(Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN . '=' . $this->objects[0][Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN], + $this->assertContains('Cn' . '=' . $this->objects[0]['Cn'], $a->get(Horde_Kolab_Server_Object_Person::ATTRIBUTE_UID)); } } @@ -158,23 +158,23 @@ class Horde_Kolab_Server_Object_PersonTest extends Horde_Kolab_Server_Scenario foreach ($adds as $add) { $result = $server->add($this->objects[$add]); $this->assertNoError($result); - $cn_result = $server->uidForCn($this->objects[$add][Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN]); + $cn_result = $server->uidForCn($this->objects[$add]['Cn']); $this->assertNoError($cn_result); $dn_parts = Net_LDAP2_Util::ldap_explode_dn($cn_result, array('casefold' => 'lower')); $dnpart = Net_LDAP2_Util::unescape_dn_value($dn_parts[0]); /** - * FIXME: I currently do not really understand why the forward slash + * @todo: I currently do not really understand why the forward slash * is not correctly converted back but I lack the time to analyse it * in detail. The server entry looks okay. */ $dnpart = str_replace('\/', '/', $dnpart); - $this->assertContains(Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN . '=' . $this->objects[$add][Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN], + $this->assertContains('Cn' . '=' . $this->objects[$add]['Cn'], $dnpart[0]); $result = $server->delete($cn_result); $this->assertNoError($result); - $cn_result = $server->uidForCn($this->objects[$add][Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN]); + $cn_result = $server->uidForCn($this->objects[$add]['Cn']); $this->assertNoError($cn_result); - $this->assertFalse($server->uidForCn($this->objects[$add][Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN])); + $this->assertFalse($server->uidForCn($this->objects[$add]['Cn'])); } } } @@ -188,9 +188,9 @@ class Horde_Kolab_Server_Object_PersonTest extends Horde_Kolab_Server_Scenario { foreach ($this->servers as $server) { $person = $this->assertAdd($server, $this->objects[2], - array(Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN => $this->objects[2][Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN])); + array('Cn' => $this->objects[2]['Cn'])); $this->assertSimpleSequence($person, $server, - Horde_Kolab_Server_Object_Person::ATTRIBUTE_SN, + 'Sn', array('modified', 'modified_again'), true); } } @@ -209,13 +209,13 @@ class Horde_Kolab_Server_Object_PersonTest extends Horde_Kolab_Server_Scenario $person = $server->fetch($person->getUid()); - $this->assertEquals($this->objects[2][Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN], - $person->get(Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN)); + $this->assertEquals($this->objects[2]['Cn'], + $person->get('Cn')); - $result = $person->save(array(Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN => 'Kolab_Server_PersonTest_äö')); + $result = $person->save(array('Cn' => 'Kolab_Server_PersonTest_äö')); $cn_result = $server->uidForCn('Kolab_Server_PersonTest_äö'); $person = $server->fetch($cn_result); - $this->assertEquals($person->get(Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN), + $this->assertEquals($person->get('Cn'), 'Kolab_Server_PersonTest_äö'); $result = $server->delete($cn_result); $this->assertNoError($result); @@ -236,11 +236,11 @@ class Horde_Kolab_Server_Object_PersonTest extends Horde_Kolab_Server_Scenario $person = $this->assertAdd($server, $this->objects[5], array()); - $cn_result = $server->uidForCn($this->objects[5][Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN][0]); + $cn_result = $server->uidForCn($this->objects[5]['Cn'][0]); $this->assertNoError($cn_result); $dn_parts = Net_LDAP2_Util::ldap_explode_dn($cn_result, array('casefold' => 'lower')); $dnpart = Net_LDAP2_Util::unescape_dn_value($dn_parts[0]); - $this->assertContains(Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN . '=' . $this->objects[5][Horde_Kolab_Server_Object_Person::ATTRIBUTE_CN][0], + $this->assertContains('Cn' . '=' . $this->objects[5]['Cn'][0], $dnpart[0]); } } diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Scenario.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/Scenario.php similarity index 97% rename from framework/Kolab_Server/test/Horde/Kolab/Server/Scenario.php rename to framework/Kolab_Server/test/Horde/Kolab/Server/Integration/Scenario.php index 9248f8fff..e89160f82 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Scenario.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/Scenario.php @@ -12,6 +12,11 @@ */ /** + * Require our basic test case definition + */ +require_once dirname(__FILE__) . '/../Autoload.php'; + +/** * Base for PHPUnit scenarios. * * Copyright 2008-2009 The Horde Project (http://www.horde.org/) @@ -25,7 +30,7 @@ * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Share */ -class Horde_Kolab_Server_Scenario extends PHPUnit_Extensions_Story_TestCase +class Horde_Kolab_Server_Integration_Scenario extends PHPUnit_Extensions_Story_TestCase { /** The mock environment */ const ENVIRONMENT_MOCK = 'mock'; @@ -573,7 +578,7 @@ class Horde_Kolab_Server_Scenario extends PHPUnit_Extensions_Story_TestCase { return array('type' => 'Horde_Kolab_Server_Object_Kolab_Address', Horde_Kolab_Server_Object_Kolab_Administrator::ATTRIBUTE_GIVENNAME => 'Test', - Horde_Kolab_Server_Object_Kolab_Administrator::ATTRIBUTE_SN => 'Address', + 'Sn' => 'Address', Horde_Kolab_Server_Object_Kolab_Administrator::ATTRIBUTE_MAIL => 'address@example.org', ); } @@ -587,9 +592,9 @@ class Horde_Kolab_Server_Scenario extends PHPUnit_Extensions_Story_TestCase { return array('type' => 'Horde_Kolab_Server_Object_Kolab_Administrator', Horde_Kolab_Server_Object_Kolab_Administrator::ATTRIBUTE_GIVENNAME => 'The', - Horde_Kolab_Server_Object_Kolab_Administrator::ATTRIBUTE_SN => 'Administrator', + 'Sn' => 'Administrator', Horde_Kolab_Server_Object_Kolab_Administrator::ATTRIBUTE_SID => 'admin', - Horde_Kolab_Server_Object_Kolab_Administrator::ATTRIBUTE_USERPASSWORD => 'none', + 'Userpassword' => 'none', ); } @@ -602,9 +607,9 @@ class Horde_Kolab_Server_Scenario extends PHPUnit_Extensions_Story_TestCase { return array('type' => 'Horde_Kolab_Server_Object_Kolab_Maintainer', Horde_Kolab_Server_Object_Kolab_Maintainer::ATTRIBUTE_GIVENNAME => 'Main', - Horde_Kolab_Server_Object_Kolab_Maintainer::ATTRIBUTE_SN => 'Tainer', + 'Sn' => 'Tainer', Horde_Kolab_Server_Object_Kolab_Maintainer::ATTRIBUTE_SID => 'maintainer', - Horde_Kolab_Server_Object_Kolab_Maintainer::ATTRIBUTE_USERPASSWORD => 'none', + 'Userpassword' => 'none', ); } @@ -617,9 +622,9 @@ class Horde_Kolab_Server_Scenario extends PHPUnit_Extensions_Story_TestCase { return array('type' => 'Horde_Kolab_Server_Object_Kolab_Domainmaintainer', Horde_Kolab_Server_Object_Kolab_Domainmaintainer::ATTRIBUTE_GIVENNAME => 'Domain', - Horde_Kolab_Server_Object_Kolab_Domainmaintainer::ATTRIBUTE_SN => 'Maintainer', + 'Sn' => 'Maintainer', Horde_Kolab_Server_Object_Kolab_Domainmaintainer::ATTRIBUTE_SID => 'domainmaintainer', - Horde_Kolab_Server_Object_Kolab_Domainmaintainer::ATTRIBUTE_USERPASSWORD => 'none', + 'Userpassword' => 'none', Horde_Kolab_Server_Object_Kolab_Domainmaintainer::ATTRIBUTE_DOMAIN => array('example.com'), ); @@ -775,7 +780,7 @@ class Horde_Kolab_Server_Scenario extends PHPUnit_Extensions_Story_TestCase ); } - /** FIXME: Prefix the stuff below with provide...() */ + /** @todo: Prefix the stuff below with provide...() */ public function validUsers() { diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/UserHandlingTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/UserHandlingTest.php similarity index 99% rename from framework/Kolab_Server/test/Horde/Kolab/Server/Object/UserHandlingTest.php rename to framework/Kolab_Server/test/Horde/Kolab/Server/Integration/UserHandlingTest.php index a12e306b2..28078c35b 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/UserHandlingTest.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/UserHandlingTest.php @@ -12,9 +12,9 @@ */ /** - * Prepare the test setup. + * Require our basic test case definition */ -require_once dirname(__FILE__) . '/../Autoload.php'; +require_once dirname(__FILE__) . '/Scenario.php'; /** * Handling users. @@ -30,7 +30,7 @@ require_once dirname(__FILE__) . '/../Autoload.php'; * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_UserHandlingTest extends Horde_Kolab_Server_Scenario +class Horde_Kolab_Server_Integration_UserHandlingTest extends Horde_Kolab_Server_Integration_Scenario { /** diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/UserTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/UserTest.php similarity index 94% rename from framework/Kolab_Server/test/Horde/Kolab/Server/Object/UserTest.php rename to framework/Kolab_Server/test/Horde/Kolab/Server/Integration/UserTest.php index 8acceaf6d..423f86067 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Object/UserTest.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Integration/UserTest.php @@ -12,9 +12,9 @@ */ /** - * Prepare the test setup. + * Require our basic test case definition */ -require_once dirname(__FILE__) . '/../Autoload.php'; +require_once dirname(__FILE__) . '/Scenario.php'; /** * Test the user object. @@ -30,7 +30,7 @@ require_once dirname(__FILE__) . '/../Autoload.php'; * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Object_UserTest extends Horde_Kolab_Server_Scenario +class Horde_Kolab_Server_Integration_UserTest extends Horde_Kolab_Server_Integration_Scenario { /** diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/LdapBase.php b/framework/Kolab_Server/test/Horde/Kolab/Server/LdapBase.php index 6580c3fea..c7026d9f5 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/LdapBase.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/LdapBase.php @@ -40,7 +40,7 @@ class Horde_Kolab_Server_LdapBase extends PHPUnit_Framework_TestCase /** Hide strict errors from the Net_LDAP2 library */ $error_reporting = error_reporting(); - error_reporting($error_reporting ^ E_STRICT); + error_reporting($error_reporting & ~E_STRICT); if (!class_exists('Net_LDAP2')) { $this->markTestSuiteSkipped('PEAR package Net_LDAP2 is not installed!'); diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Server/ServerTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Objects/ServerTest.php similarity index 98% rename from framework/Kolab_Server/test/Horde/Kolab/Server/Server/ServerTest.php rename to framework/Kolab_Server/test/Horde/Kolab/Server/Objects/ServerTest.php index ee7c12aa6..415540e08 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Server/ServerTest.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Objects/ServerTest.php @@ -30,7 +30,7 @@ require_once dirname(__FILE__) . '/../Autoload.php'; * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Server_ServerTest extends PHPUnit_Framework_TestCase +class Horde_Kolab_Server_Objects_ServerTest extends PHPUnit_Framework_TestCase { public function setUp() { diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Query/LdapTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Query/LdapTest.php index f01a7944f..2f6eef172 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Query/LdapTest.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Query/LdapTest.php @@ -174,7 +174,7 @@ class Horde_Kolab_Server_Query_LdapTest extends Horde_Kolab_Server_LdapBase /** Hide strict errors from the Net_LDAP2 library */ $error_reporting = error_reporting(); - error_reporting($error_reporting ^ E_STRICT); + error_reporting($error_reporting & ~E_STRICT); try { $query->convertOr($or)->asString(); diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Result/LdapTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Result/LdapTest.php index 4da773a7b..668a68e4f 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Result/LdapTest.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Result/LdapTest.php @@ -12,9 +12,9 @@ */ /** - * Prepare the test setup. + * Require our basic test case definition */ -require_once dirname(__FILE__) . '/../Autoload.php'; +require_once dirname(__FILE__) . '/../LdapBase.php'; /** * Test the LDAP result handler. @@ -30,19 +30,8 @@ require_once dirname(__FILE__) . '/../Autoload.php'; * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Result_LdapTest extends PHPUnit_Framework_TestCase +class Horde_Kolab_Server_Result_LdapTest extends Horde_Kolab_Server_LdapBase { - public function setUp() - { - if (!extension_loaded('ldap') && !@dl('ldap.' . PHP_SHLIB_SUFFIX)) { - $this->markTestSuiteSkipped('Ldap extension is missing!'); - }; - - if (!class_exists('Net_LDAP2')) { - $this->markTestSuiteSkipped('PEAR package Net_LDAP2 is not installed!'); - } - } - public function testMethodConstructHasParameterNetldap2searchSearchResult() { $search = $this->getMock( diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Server/FactoryTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Server/FactoryTest.php index b9b043319..99faf2c66 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Server/FactoryTest.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Server/FactoryTest.php @@ -30,96 +30,198 @@ require_once dirname(__FILE__) . '/../Autoload.php'; * @license http://www.fsf.org/copyleft/lgpl.html LGPL * @link http://pear.horde.org/index.php?package=Kolab_Server */ -class Horde_Kolab_Server_Server_FactoryTest extends Horde_Kolab_Server_Scenario +class Horde_Kolab_Server_Server_FactoryTest extends PHPUnit_Framework_TestCase { public function setUp() { - $this->markTestIncomplete('Needs to be fixed'); + $this->injector = new Horde_Injector(new Horde_Injector_TopLevel()); } public function testMethodSetupHasPostconditionThatAObjectHandlerOfTypeBaseIsBoundToObjects() { - $injector = new Horde_Injector(new Horde_Injector_TopLevel()); - Horde_Kolab_Server_Factory::setup(array(), $injector); + Horde_Kolab_Server_Factory::setup($this->injector, array()); $this->assertType( 'Horde_Kolab_Server_Objects_Base', - $injector->getInstance('Horde_Kolab_Server_Objects') + $this->injector->getInstance('Horde_Kolab_Server_Objects') ); } public function testMethodSetupHasPostconditionThatASchemaHandlerOfTypeBaseIsBoundToSchema() { - $injector = new Horde_Injector(new Horde_Injector_TopLevel()); - Horde_Kolab_Server_Factory::setup(array(), $injector); + Horde_Kolab_Server_Factory::setup($this->injector, array()); $this->assertType( 'Horde_Kolab_Server_Schema_Base', - $injector->getInstance('Horde_Kolab_Server_Schema') + $this->injector->getInstance('Horde_Kolab_Server_Schema') ); } public function testMethodSetupHasPostconditionThatASearchHandlerOfTypeBaseIsBoundToSearch() { - $injector = new Horde_Injector(new Horde_Injector_TopLevel()); - Horde_Kolab_Server_Factory::setup(array(), $injector); + Horde_Kolab_Server_Factory::setup($this->injector, array()); $this->assertType( 'Horde_Kolab_Server_Search_Base', - $injector->getInstance('Horde_Kolab_Server_Search') + $this->injector->getInstance('Horde_Kolab_Server_Search') ); } - public function testMethodSetupHasPostconditionThatAStructureOfTypeBaseIsBoundToStructure() + public function testMethodSetupHasPostconditionThatAStructureOfTypeKolabIsBoundToStructure() { - $injector = new Horde_Injector(new Horde_Injector_TopLevel()); - Horde_Kolab_Server_Factory::setup(array(), $injector); + Horde_Kolab_Server_Factory::setup($this->injector, array()); $this->assertType( 'Horde_Kolab_Server_Structure_Kolab', - $injector->getInstance('Horde_Kolab_Server_Structure') + $this->injector->getInstance('Horde_Kolab_Server_Structure') ); } public function testMethodSetupHasPostconditionThatAStructureHandlerOfTypeLdapIsBoundToStructureIfConfiguredThatWay() { - $injector = new Horde_Injector(new Horde_Injector_TopLevel()); Horde_Kolab_Server_Factory::setup( - array('structure' => array('driver' => 'ldap')), - $injector + $this->injector, + array('structure' => array('driver' => 'ldap')) ); $this->assertType( 'Horde_Kolab_Server_Structure_Ldap', - $injector->getInstance('Horde_Kolab_Server_Structure') + $this->injector->getInstance('Horde_Kolab_Server_Structure') ); } public function testMethodSetupHasPostconditionThatAServerOfTypeLdapIsBoundToServer() { - $injector = new Horde_Injector(new Horde_Injector_TopLevel()); - Horde_Kolab_Server_Factory::setup(array(), $injector); + Horde_Kolab_Server_Factory::setup($this->injector, array('basedn' => 'dc=example,dc=com')); $this->assertType( - 'Horde_Kolab_Server_Ldap', - $injector->getInstance('Horde_Kolab_Server') + 'Horde_Kolab_Server_Ldap_Standard', + $this->injector->getInstance('Horde_Kolab_Server') ); } - public function testMethodSetupHasPostconditionThatAServerOfTypeLdapIsBoundToServerIfConfiguredThatWay() + public function testMethodSetupHasPostconditionThatAServerOfTypeFileIsBoundToServerIfConfiguredThatWay() { - $injector = new Horde_Injector(new Horde_Injector_TopLevel()); Horde_Kolab_Server_Factory::setup( - array('driver' => 'file', 'params' => array('file' => '/tmp/nix')), - $injector + $this->injector, + array('driver' => 'file', 'params' => array('basedn' => '', 'file' => '/tmp/nix')) ); $this->assertType( - 'Horde_Kolab_Server_File', - $injector->getInstance('Horde_Kolab_Server') + 'Horde_Kolab_Server_Ldap_Standard', + $this->injector->getInstance('Horde_Kolab_Server') ); } + public function testMethodSetupHasPostconditionThatAServerOfTypeFilteredLdapIsBoundToServerIfAFilterHasBeenProvided() + { + Horde_Kolab_Server_Factory::setup( + $this->injector, + array('basedn' => 'dc=example,dc=com', 'filter' => 'test') + ); + $this->assertType( + 'Horde_Kolab_Server_Ldap_Filtered', + $this->injector->getInstance('Horde_Kolab_Server') + ); + } + + public function testMethodSetupHasPostconditionThatAMappedServerIsBoundToServerIfAMapHasBeenProvided() + { + Horde_Kolab_Server_Factory::setup( + $this->injector, + array( + 'basedn' => 'dc=example,dc=com', + 'map' => array('a' => 'b'), + ) + ); + $this->assertType( + 'Horde_Kolab_Server_Mapped', + $this->injector->getInstance('Horde_Kolab_Server') + ); + } + + public function testMethodSetupHasPostconditionThatALoggedServerIsBoundToServerIfALoggerHasBeenProvided() + { + Horde_Kolab_Server_Factory::setup( + $this->injector, + array( + 'basedn' => 'dc=example,dc=com', + 'logger' => $this->getMock('Horde_Log_Logger'), + ) + ); + $this->assertType( + 'Horde_Kolab_Server_Logged', + $this->injector->getInstance('Horde_Kolab_Server') + ); + } + + public function testMethodGetserverHasPostconditionThatTheConnectionParametersGetRewrittenIfNecessary() + { + Horde_Kolab_Server_Factory::setup( + $this->injector, + array( + 'server' => 'localhost', + 'phpdn' => 'a', + 'phppw' => 'a', + 'basedn' => 'dc=example,dc=com' + ) + ); + $this->injector->getInstance('Horde_Kolab_Server'); + /**@todo: Actually not testable as we can't read the configuration again */ + } + + public function testMethodGetserverHasPostconditionThatTheConnectionIsSplittedIfRequired() + { + Horde_Kolab_Server_Factory::setup( + $this->injector, + array( + 'host' => 'localhost', + 'host_master' => 'writehost', + 'basedn' => 'dc=example,dc=com' + ) + ); + $this->injector->getInstance('Horde_Kolab_Server'); + /**@todo: Actually not testable as we can't read the configuration again */ + } + + public function testMethodGetserverThrowsExceptionIfTheBasednIsMissing() + { + try { + Horde_Kolab_Server_Factory::setup( + $this->injector, + array('dummy') + ); + $this->injector->getInstance('Horde_Kolab_Server'); + $this->fail('No exception!'); + } catch (Horde_Kolab_Server_Exception $e) { + $this->assertEquals( + 'The base DN is missing', $e->getMessage() + ); + } + } + + public function testMethodGetserverThrowsExceptionIfTheDriverIsUnknown() + { + try { + Horde_Kolab_Server_Factory::setup( + $this->injector, + array('driver' => 'unknown') + ); + $this->injector->getInstance('Horde_Kolab_Server'); + $this->fail('No exception!'); + } catch (Horde_Kolab_Server_Exception $e) { + $this->assertEquals( + 'Invalid server configuration!', $e->getMessage() + ); + } + } + public function testMethodSingletonReturnsTheSameInstanceWithTheSameParameters() { - Horde_Kolab_Server_Factory::singleton(); + $result1 = Horde_Kolab_Server_Factory::singleton(array('basedn' => 'dc=example,dc=com')); + $result2 = Horde_Kolab_Server_Factory::singleton(array('basedn' => 'dc=example,dc=com')); + $this->assertSame($result1, $result2); } public function testMethodSingletonReturnsDifferentInstancesWithDifferentParameters() { - Horde_Kolab_Server_Factory::singleton(); + global $conf; + $conf['kolab']['ldap']['basedn'] = 'test'; + $result1 = Horde_Kolab_Server_Factory::singleton(array('basedn' => 'dc=example,dc=com')); + $result2 = Horde_Kolab_Server_Factory::singleton(); + $this->assertTrue($result1 !== $result2); } } \ No newline at end of file diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Structure/KolabTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Structure/KolabTest.php index fa72c920a..2ff1ff110 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Structure/KolabTest.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Structure/KolabTest.php @@ -34,8 +34,6 @@ class Horde_Kolab_Server_Structure_KolabTest extends PHPUnit_Framework_TestCase { public function setUp() { - $this->markTestIncomplete('Needs to be fixed'); - $server = $this->getMock('Horde_Kolab_Server'); $this->composite = new Horde_Kolab_Server_Composite( $server, @@ -84,7 +82,7 @@ class Horde_Kolab_Server_Structure_KolabTest extends PHPUnit_Framework_TestCase ->method('read') ->with('guid') ->will($this->returnValue(array('objectClass' => array('top')))); - $this->assertEquals('Horde_Kolab_Server_Object', $this->composite->structure->determineType('guid')); + $this->assertEquals('Horde_Kolab_Server_Object_Top', $this->composite->structure->determineType('guid')); } public function testMethodDeterminetypeHasResultStringTheObjectclassOfTheGivenGuid5() diff --git a/framework/Kolab_Server/test/Horde/Kolab/Server/Structure/LdapTest.php b/framework/Kolab_Server/test/Horde/Kolab/Server/Structure/LdapTest.php index 7c9630e40..95ed217be 100644 --- a/framework/Kolab_Server/test/Horde/Kolab/Server/Structure/LdapTest.php +++ b/framework/Kolab_Server/test/Horde/Kolab/Server/Structure/LdapTest.php @@ -34,8 +34,6 @@ class Horde_Kolab_Server_Structure_LdapTest extends PHPUnit_Framework_TestCase { public function setUp() { - $this->markTestIncomplete('Needs to be fixed'); - $server = $this->getMock('Horde_Kolab_Server'); $this->composite = new Horde_Kolab_Server_Composite( $server, @@ -66,7 +64,7 @@ class Horde_Kolab_Server_Structure_LdapTest extends PHPUnit_Framework_TestCase ->method('read') ->with('guid') ->will($this->returnValue(array('objectClass' => array('TOP')))); - $this->assertEquals('Horde_Kolab_Server_Object', $this->composite->structure->determineType('guid')); + $this->assertEquals('Horde_Kolab_Server_Object_Top', $this->composite->structure->determineType('guid')); } public function testMethodDeterminetypeHasResultStringTheObjectclassOfTheGivenGuid2() -- 2.11.0