diff --git a/SeedDMS_Core/Core/inc.AccessUtils.php b/SeedDMS_Core/Core/inc.AccessUtils.php deleted file mode 100644 index 1edbce647..000000000 --- a/SeedDMS_Core/Core/inc.AccessUtils.php +++ /dev/null @@ -1,94 +0,0 @@ - - * @copyright Copyright (C) 2002-2005 Markus Westphal, - * 2006-2008 Malcolm Cowe, 2010 Uwe Steinmann - * @version Release: @package_version@ - */ - -/** - * Used to indicate that a search should return all - * results in the ACL table. See {@link SeedDMS_Core_Folder::getAccessList()} - */ -define("M_ANY", -1); - -/** - * No rights at all - */ -define("M_NONE", 1); - -/** - * Read access only - */ -define("M_READ", 2); - -/** - * Read and write access only - */ -define("M_READWRITE", 3); - -/** - * Unrestricted access - */ -define("M_ALL", 4); - -/* - * Lowest and highest access right - */ -define("M_LOWEST_RIGHT", 1); -define("M_HIGHEST_RIGHT", 4); - -define ("O_GTEQ", ">="); -define ("O_LTEQ", "<="); -define ("O_EQ", "="); - -/** - * Folder notification - */ -define("T_FOLDER", 1); //TargetType = Folder - -/** - * Document notification - */ -define("T_DOCUMENT", 2); // " = Document - -/** - * Notify on all actions on the folder/document - */ -define("N_ALL", 0); - -/** - * Notify when object has been deleted - */ -define("N_DELETE", 1); - -/** - * Notify when object has been moved - */ -define("N_MOVE", 2); - -/** - * Notify when object has been updated (no new version) - */ -define("N_UPDATE", 3); - -/** - * Notify when document has new version - */ -define("N_NEW_VERSION", 4); - -/** - * Notify when version of document was deleted - */ -define("N_DELETE_VERSION", 5); - -/** - * Notify when version of document was deleted - */ -define("N_ADD_DOCUMENT", 6); diff --git a/SeedDMS_Core/Core/inc.ClassAccess.php b/SeedDMS_Core/Core/inc.ClassAccess.php deleted file mode 100644 index c9ef9ffcd..000000000 --- a/SeedDMS_Core/Core/inc.ClassAccess.php +++ /dev/null @@ -1,122 +0,0 @@ - - * @copyright Copyright (C) 2002-2005 Markus Westphal, 2006-2008 Malcolm Cowe, - * 2010 Uwe Steinmann - * @version Release: @package_version@ - */ - -/** - * Class to represent a user access right. - * This class cannot be used to modify access rights. - * - * @category DMS - * @package SeedDMS_Core - * @author Markus Westphal, Malcolm Cowe, Uwe Steinmann - * @copyright Copyright (C) 2002-2005 Markus Westphal, 2006-2008 Malcolm Cowe, - * 2010 Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_Core_UserAccess { /* {{{ */ - - /** - * @var SeedDMS_Core_User - */ - var $_user; - - /** - * @var - */ - var $_mode; - - /** - * SeedDMS_Core_UserAccess constructor. - * @param $user - * @param $mode - */ - function __construct($user, $mode) { - $this->_user = $user; - $this->_mode = $mode; - } - - /** - * @return int - */ - function getUserID() { return $this->_user->getID(); } - - /** - * @return mixed - */ - function getMode() { return $this->_mode; } - - /** - * @return bool - */ - function isAdmin() { - return ($this->_mode == SeedDMS_Core_User::role_admin); - } - - /** - * @return SeedDMS_Core_User - */ - function getUser() { - return $this->_user; - } -} /* }}} */ - - -/** - * Class to represent a group access right. - * This class cannot be used to modify access rights. - * - * @category DMS - * @package SeedDMS_Core - * @author Markus Westphal, Malcolm Cowe, Uwe Steinmann - * @copyright Copyright (C) 2002-2005 Markus Westphal, 2006-2008 Malcolm Cowe, 2010 Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_Core_GroupAccess { /* {{{ */ - - /** - * @var SeedDMS_Core_Group - */ - var $_group; - - /** - * @var - */ - var $_mode; - - /** - * SeedDMS_Core_GroupAccess constructor. - * @param $group - * @param $mode - */ - function __construct($group, $mode) { - $this->_group = $group; - $this->_mode = $mode; - } - - /** - * @return int - */ - function getGroupID() { return $this->_group->getID(); } - - /** - * @return mixed - */ - function getMode() { return $this->_mode; } - - /** - * @return SeedDMS_Core_Group - */ - function getGroup() { - return $this->_group; - } -} /* }}} */ diff --git a/SeedDMS_Core/Core/inc.ClassAttribute.php b/SeedDMS_Core/Core/inc.ClassAttribute.php deleted file mode 100644 index 945b1b0c2..000000000 --- a/SeedDMS_Core/Core/inc.ClassAttribute.php +++ /dev/null @@ -1,1401 +0,0 @@ - - * @copyright Copyright (C) 2012 Uwe Steinmann - * @version Release: @package_version@ - */ - -/** - * Class to represent an attribute in the document management system - * - * Attributes are key/value pairs which can be attachted to documents, - * folders and document content. The number of attributes is unlimited. - * Each attribute has a value and is related to an attribute definition, - * which holds the name and other information about the attribute. - * - * @see SeedDMS_Core_AttributeDefinition - * - * @category DMS - * @package SeedDMS_Core - * @author Uwe Steinmann - * @copyright Copyright (C) 2012-2013 Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_Core_Attribute { /* {{{ */ - /** - * @var integer id of attribute - * - * @access protected - */ - protected $_id; - - /** - * @var SeedDMS_Core_Folder|SeedDMS_Core_Document|SeedDMS_Core_DocumentContent SeedDMS_Core_Object folder, document or document content - * this attribute belongs to - * - * @access protected - */ - protected $_obj; - - /** - * @var SeedDMS_Core_AttributeDefinition definition of this attribute - * - * @access protected - */ - protected $_attrdef; - - /** - * @var mixed value of this attribute - * - * @access protected - */ - protected $_value; - - /** - * @var integer validation error - * - * @access protected - */ - protected $_validation_error; - - /** - * @var SeedDMS_Core_DMS reference to the dms instance this attribute belongs to - * - * @access protected - */ - protected $_dms; - - /** - * SeedDMS_Core_Attribute constructor. - * @param $id - * @param $obj - * @param $attrdef - * @param $value - */ - function __construct($id, $obj, $attrdef, $value) { /* {{{ */ - $this->_id = $id; - $this->_obj = $obj; - $this->_attrdef = $attrdef; - $this->_value = $value; - $this->_validation_error = 0; - $this->_dms = null; - } /* }}} */ - - /** - * Set reference to dms - * - * @param SeedDMS_Core_DMS $dms - */ - function setDMS($dms) { /* {{{ */ - $this->_dms = $dms; - } /* }}} */ - - /** - * Get dms of attribute - * - * @return object $dms - */ - function getDMS() { return $this->_dms; } - - /** - * Get internal id of attribute - * - * @return integer id - */ - function getID() { return $this->_id; } - - /** - * Return attribute value as stored in database - * - * This function will return the value of multi value attributes - * including the separator char. - * - * @return string the attribute value as it is stored in the database. - */ - function getValue() { return $this->_value; } - - /** - * Return attribute value parsed into a php type or object - * - * This function will return the value of multi value attributes - * including the separator char. - * - * @return string the attribute value as it is stored in the database. - */ - function getParsedValue() { /* {{{ */ - switch($this->_attrdef->getType()) { - case SeedDMS_Core_AttributeDefinition::type_float: - return (float) $this->_value; - case SeedDMS_Core_AttributeDefinition::type_boolean: - return (bool) $this->_value; - case SeedDMS_Core_AttributeDefinition::type_int: - return (int) $this->_value; - default: - return $this->_value; - } - } /* }}} */ - - /** - * Return attribute values as an array - * - * This function returns the attribute value as an array. The array - * has one element for non multi value attributes and n elements for - * multi value attributes. - * - * @return array the attribute values - */ - function getValueAsArray() { /* {{{ */ - if($this->_attrdef->getMultipleValues()) { - /* If the value doesn't start with the separator used in the value set, - * then assume that the value was not saved with a leading separator. - * This can happen, if the value was previously a single value from - * the value set and later turned into a multi value attribute. - */ - $sep = substr($this->_value, 0, 1); - if(!($vsep = $this->_attrdef->getValueSetSeparator())) - $vsep = $sep; - if($sep == $vsep) - return(explode($sep, substr($this->_value, 1))); - else - return(array($this->_value)); - } else { - return array($this->_value); - } - } /* }}} */ - - /** - * Set a value of an attribute - * - * The attribute is completely deleted if the value is an empty string - * or empty array. An array of values is only allowed if the attribute may - * have multiple values. If an array is passed and the attribute may - * have only a single value, then the first element of the array will - * be taken. - * - * @param string $values value as string or array to be set - * @return boolean true if operation was successfull, otherwise false - */ - function setValue($values) { /* {{{*/ - $db = $this->_dms->getDB(); - - if($this->_attrdef->getMultipleValues()) { - $valuesetstr = $this->_attrdef->getValueSet(); - /* Multiple values without a value set is not allowed */ - /* No need to have valueset anymore. If none is given, the values are - * expected to be separated by ',' - if(!$valuesetstr) - return false; - */ - $valueset = $this->_attrdef->getValueSetAsArray(); - - if(is_array($values)) { - if($values) { - $vsep = $this->_attrdef->getValueSetSeparator(); - if($valueset) { - /* Validation should have been done before - $error = false; - foreach($values as $v) { - if(!in_array($v, $valueset)) { $error = true; break; } - } - if($error) - return false; - */ - $valuesetstr = $this->_attrdef->getValueSet(); - $value = $vsep.implode($vsep, $values); - } else { - $value = $vsep.implode($vsep, $values); - } - } else { - $value = ''; - } - } else { - if($values) { - if($valuesetstr) { - if($valuesetstr[0] != $values[0]) - $values = explode($valuesetstr[0], $values); - else - $values = explode($valuesetstr[0], substr($values, 1)); - } else { - $values = explode(',', substr($values, 1)); - } - - if($valueset) { - /* Validation should have been done before - $error = false; - foreach($values as $v) { - if(!in_array($v, $valueset)) { $error = true; break; } - } - if($error) - return false; - */ - $value = $valuesetstr[0].implode($valuesetstr[0], $values); - } else { - $value = ','.implode(',', $values); - } - } else { - $value = $values; - } - } - } else { - if(is_array($values)) { - if($values) - $value = $values[0]; - else - $value = ''; - } else { - $value = $values; - } - } - - switch(get_class($this->_obj)) { - case $this->_dms->getClassname('document'): - if(trim($value) === '') - $queryStr = "DELETE FROM `tblDocumentAttributes` WHERE `document` = " . $this->_obj->getID() . " AND `attrdef` = " . $this->_attrdef->getId(); - else - $queryStr = "UPDATE `tblDocumentAttributes` SET `value` = ".$db->qstr($value)." WHERE `document` = " . $this->_obj->getID() . " AND `attrdef` = " . $this->_attrdef->getId(); - break; - case $this->_dms->getClassname('documentcontent'): - if(trim($value) === '') - $queryStr = "DELETE FROM `tblDocumentContentAttributes` WHERE `content` = " . $this->_obj->getID() . " AND `attrdef` = " . $this->_attrdef->getId(); - else - $queryStr = "UPDATE `tblDocumentContentAttributes` SET `value` = ".$db->qstr($value)." WHERE `content` = " . $this->_obj->getID() . " AND `attrdef` = " . $this->_attrdef->getId(); - break; - case $this->_dms->getClassname('folder'): - if(trim($value) === '') - $queryStr = "DELETE FROM `tblFolderAttributes` WHERE `folder` = " . $this->_obj->getID() . " AND `attrdef` = " . $this->_attrdef->getId(); - else - $queryStr = "UPDATE `tblFolderAttributes` SET `value` = ".$db->qstr($value)." WHERE `folder` = " . $this->_obj->getID() . " AND `attrdef` = " . $this->_attrdef->getId(); - break; - default: - return false; - } - if (!$db->getResult($queryStr)) - return false; - - $oldvalue = $this->_value; - $this->_value = $value; - - /* Check if 'onPostUpdateAttribute' callback is set */ - if(isset($this->_dms->callbacks['onPostUpdateAttribute'])) { - foreach($this->_dms->callbacks['onPostUpdateAttribute'] as $callback) { - if(!call_user_func($callback[0], $callback[1], $this->_obj, $this->_attrdef, $value, $oldvalue)) { - } - } - } - - return true; - } /* }}} */ - - /** - * Validate attribute value - * - * This function checks if the attribute values fits the attribute - * definition. - * If the validation fails the validation error will be set which - * can be requested by SeedDMS_Core_Attribute::getValidationError() - * - * @return boolean true if validation succeeds, otherwise false - */ - function validate() { /* {{{ */ - /** @var SeedDMS_Core_AttributeDefinition $attrdef */ - $attrdef = $this->_attrdef; - $result = $attrdef->validate($this->_value); - $this->_validation_error = $attrdef->getValidationError(); - return $result; - } /* }}} */ - - /** - * Get validation error from last validation - * - * @return integer error code - */ - function getValidationError() { return $this->_validation_error; } - - /** - * Set validation error - * - * @param integer error code - */ - function setValidationError($error) { $this->_validation_error = $error; } - - /** - * Get definition of attribute - * - * @return object attribute definition - */ - function getAttributeDefinition() { return $this->_attrdef; } - -} /* }}} */ - -/** - * Class to represent an attribute definition in the document management system - * - * Attribute definitions specify the name, type, object type, minimum and - * maximum values and a value set. The object type determines the object - * an attribute may be attached to. If the object type is set to object_all - * the attribute can be used for documents, document content and folders. - * - * The type of an attribute specifies the skalar data type. - * - * Attributes for which multiple values are allowed must have the - * multiple flag set to true and specify a value set. A value set - * is a string consisting of n separated values. The separator is the - * first char of the value set. A possible value could be '|REV-A|REV-B' - * If multiple values are allowed, then minvalues and maxvalues may - * restrict the allowed number of values. - * - * @see SeedDMS_Core_Attribute - * - * @category DMS - * @package SeedDMS_Core - * @author Markus Westphal, Malcolm Cowe, Uwe Steinmann - * @copyright Copyright (C) 2012 Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_Core_AttributeDefinition { /* {{{ */ - /** - * @var integer id of attribute definition - * - * @access protected - */ - protected $_id; - - /** - * @var string name of attribute definition - * - * @access protected - */ - protected $_name; - - /** - * @var string object type of attribute definition. This can be one of - * type_int, type_float, type_string, type_boolean, type_url, or type_email. - * - * @access protected - */ - protected $_type; - - /** - * @var string type of attribute definition. This can be one of objtype_all, - * objtype_folder, objtype_document, or objtype_documentcontent. - * - * @access protected - */ - protected $_objtype; - - /** - * @var boolean whether an attribute can have multiple values - * - * @access protected - */ - protected $_multiple; - - /** - * @var integer minimum values of an attribute - * - * @access protected - */ - protected $_minvalues; - - /** - * @var integer maximum values of an attribute - * - * @access protected - */ - protected $_maxvalues; - - /** - * @var string list of possible values of an attribute - * - * @access protected - */ - protected $_valueset; - - /** - * @var string regular expression the value must match - * - * @access protected - */ - protected $_regex; - - /** - * @var integer validation error - * - * @access protected - */ - protected $_validation_error; - - /** - * @var SeedDMS_Core_DMS reference to the dms instance this attribute definition belongs to - * - * @access protected - */ - protected $_dms; - - /** - * @var string just the separator of a value set (not used) - * - * @access protected - */ - protected $_separator; - - /* - * Possible skalar data types of an attribute - */ - const type_int = '1'; - const type_float = '2'; - const type_string = '3'; - const type_boolean = '4'; - const type_url = '5'; - const type_email = '6'; - const type_date = '7'; - - /* - * Addtional data types of an attribute representing objects in seeddms - */ - const type_folder = '101'; - const type_document = '102'; - //const type_documentcontent = '103'; - const type_user = '104'; - const type_group = '105'; - - /* - * The object type for which a attribute may be used - */ - const objtype_all = '0'; - const objtype_folder = '1'; - const objtype_document = '2'; - const objtype_documentcontent = '3'; - - /* - * The validation error codes - */ - const val_error_none = 0; - const val_error_min_values = 1; - const val_error_max_values = 2; - const val_error_boolean = 8; - const val_error_int = 6; - const val_error_date = 9; - const val_error_float = 7; - const val_error_regex = 3; - const val_error_email = 5; - const val_error_url = 4; - const val_error_document = 10; - const val_error_folder = 11; - const val_error_user = 12; - const val_error_group = 13; - const val_error_valueset = 14; - - /** - * Constructor - * - * @param integer $id internal id of attribute definition - * @param string $name name of attribute - * @param integer $objtype type of object for which this attribute definition - * may be used. - * @param integer $type skalar type of attribute - * @param boolean $multiple set to true if multiple values are allowed - * @param integer $minvalues minimum number of values - * @param integer $maxvalues maximum number of values - * @param string $valueset separated list of allowed values, the first char - * is taken as the separator - * @param $regex - */ - function __construct($id, $name, $objtype, $type, $multiple, $minvalues, $maxvalues, $valueset, $regex) { /* {{{ */ - $this->_id = $id; - $this->_name = $name; - $this->_type = $type; - $this->_objtype = $objtype; - $this->_multiple = $multiple; - $this->_minvalues = $minvalues; - $this->_maxvalues = $maxvalues; - $this->_valueset = $valueset; - $this->_separator = substr($valueset, 0, 1); - $this->_regex = $regex; - $this->_dms = null; - $this->_validation_error = SeedDMS_Core_AttributeDefinition::val_error_none; - } /* }}} */ - - /** - * Set reference to dms - * - * @param SeedDMS_Core_DMS $dms - */ - function setDMS($dms) { /* {{{ */ - $this->_dms = $dms; - } /* }}} */ - - /** - * Get dms of attribute definition - * - * @return object $dms - */ - function getDMS() { return $this->_dms; } - - /** - * Get internal id of attribute definition - * - * @return integer id - */ - function getID() { return $this->_id; } - - /** - * Get name of attribute definition - * - * @return string name - */ - function getName() { return $this->_name; } - - function setName($name) { /* {{{ */ - $db = $this->_dms->getDB(); - - $queryStr = "UPDATE `tblAttributeDefinitions` SET `name` =".$db->qstr($name)." WHERE `id` = " . $this->_id; - $res = $db->getResult($queryStr); - if (!$res) - return false; - - $this->_name = $name; - return true; - } /* }}} */ - - /** - * Get object type of attribute definition - * - * This can be one of objtype_all, - * objtype_folder, objtype_document, or objtype_documentcontent. - * - * @return integer type - */ - function getObjType() { return $this->_objtype; } - - /** - * Set object type of attribute definition - * - * This can be one of objtype_all, - * objtype_folder, objtype_document, or objtype_documentcontent. - * - * @param integer $objtype type - * @return bool - */ - function setObjType($objtype) { /* {{{ */ - $db = $this->_dms->getDB(); - - $queryStr = "UPDATE `tblAttributeDefinitions` SET `objtype` =".intval($objtype)." WHERE `id` = " . $this->_id; - $res = $db->getResult($queryStr); - if (!$res) - return false; - - $this->_objtype = $objtype; - return true; - } /* }}} */ - - /** - * Get type of attribute definition - * - * This can be one of type_int, type_float, type_string, type_boolean, - * type_url, type_email. - * - * @return integer type - */ - function getType() { return $this->_type; } - - /** - * Set type of attribute definition - * - * This can be one of type_int, type_float, type_string, type_boolean, - * type_url, type_email. - * - * @param integer $type type - * @return bool - */ - function setType($type) { /* {{{ */ - $db = $this->_dms->getDB(); - - $queryStr = "UPDATE `tblAttributeDefinitions` SET `type` =".intval($type)." WHERE `id` = " . $this->_id; - $res = $db->getResult($queryStr); - if (!$res) - return false; - - $this->_type = $type; - return true; - } /* }}} */ - - /** - * Check if attribute definition allows multi values for attribute - * - * @return boolean true if attribute may have multiple values - */ - function getMultipleValues() { return $this->_multiple; } - - /** - * Set if attribute definition allows multi values for attribute - * - * @param boolean $mv true if attribute may have multiple values, otherwise - * false - * @return bool - */ - function setMultipleValues($mv) { /* {{{ */ - $db = $this->_dms->getDB(); - - $queryStr = "UPDATE `tblAttributeDefinitions` SET `multiple` =".intval($mv)." WHERE `id` = " . $this->_id; - $res = $db->getResult($queryStr); - if (!$res) - return false; - - $this->_multiple = $mv; - return true; - } /* }}} */ - - /** - * Return minimum number of values for attributes - * - * Attributes with multiple values may be limited to a range - * of values. This functions returns the minimum number of values. - * - * @return integer minimum number of values - */ - function getMinValues() { return $this->_minvalues; } - - function setMinValues($minvalues) { /* {{{ */ - $db = $this->_dms->getDB(); - - $queryStr = "UPDATE `tblAttributeDefinitions` SET `minvalues` =".intval($minvalues)." WHERE `id` = " . $this->_id; - $res = $db->getResult($queryStr); - if (!$res) - return false; - - $this->_minvalues = $minvalues; - return true; - } /* }}} */ - - /** - * Return maximum number of values for attributes - * - * Attributes with multiple values may be limited to a range - * of values. This functions returns the maximum number of values. - * - * @return integer maximum number of values - */ - function getMaxValues() { return $this->_maxvalues; } - - function setMaxValues($maxvalues) { /* {{{ */ - $db = $this->_dms->getDB(); - - $queryStr = "UPDATE `tblAttributeDefinitions` SET `maxvalues` =".intval($maxvalues)." WHERE `id` = " . $this->_id; - $res = $db->getResult($queryStr); - if (!$res) - return false; - - $this->_maxvalues = $maxvalues; - return true; - } /* }}} */ - - /** - * Get the value set as saved in the database - * - * This is a string containing the list of valueѕ separated by a - * delimiter which also precedes the whole string, e.g. '|Yes|No' - * - * Use {@link SeedDMS_Core_AttributeDefinition::getValueSetAsArray()} - * for a list of values returned as an array. - * - * @return string value set - */ - function getValueSet() { /* {{{ */ - return $this->_valueset; - } /* }}} */ - - /** - * Get the separator used for the value set - * - * This is the first char of the value set string. - * - * @return string separator or an empty string if a value set is not set - */ - function getValueSetSeparator() { /* {{{ */ - if(strlen($this->_valueset) > 1) { - return $this->_valueset[0]; - } elseif($this->_multiple) { - if($this->_type == SeedDMS_Core_AttributeDefinition::type_boolean) - return ''; - else - return ','; - } else { - return ''; - } - } /* }}} */ - - /** - * Get the whole value set as an array - * - * Each element is trimmed. - * - * @return array values of value set or false if the value set has - * less than 2 chars - */ - function getValueSetAsArray() { /* {{{ */ - if(strlen($this->_valueset) > 1) - return array_map('trim', explode($this->_valueset[0], substr($this->_valueset, 1))); - else - return array(); - } /* }}} */ - - /** - * Get the n'th trimmed value of a value set - * - * @param $ind starting from 0 for the first element in the value set - * @return string n'th value of value set or false if the index is - * out of range or the value set has less than 2 chars - * @internal param int $index - */ - function getValueSetValue($ind) { /* {{{ */ - if(strlen($this->_valueset) > 1) { - $tmp = explode($this->_valueset[0], substr($this->_valueset, 1)); - if(isset($tmp[$ind])) - return trim($tmp[$ind]); - else - return false; - } else - return false; - } /* }}} */ - - /** - * Set the value set - * - * A value set is a list of values allowed for an attribute. The values - * are separated by a char which must also be the first char of the - * value set string. The method decomposes the value set, removes all - * leading and trailing white space from the elements and recombines them - * into a string. - * - * @param string $valueset - * @return boolean true if value set could be set, otherwise false - */ - function setValueSet($valueset) { /* {{{ */ - /* - $tmp = array(); - foreach($valueset as $value) { - $tmp[] = str_replace('"', '""', $value); - } - $valuesetstr = implode(",", $tmp); - */ - $valueset = trim($valueset); - if($valueset) { - $valuesetarr = array_map('trim', explode($valueset[0], substr($valueset, 1))); - $valuesetstr = $valueset[0].implode($valueset[0], $valuesetarr); - } else { - $valuesetstr = ''; - } - - $db = $this->_dms->getDB(); - - $queryStr = "UPDATE `tblAttributeDefinitions` SET `valueset` =".$db->qstr($valuesetstr)." WHERE `id` = " . $this->_id; - $res = $db->getResult($queryStr); - if (!$res) - return false; - - $this->_valueset = $valuesetstr; - $this->_separator = substr($valuesetstr, 0, 1); - return true; - } /* }}} */ - - /** - * Get the regular expression as saved in the database - * - * @return string regular expression - */ - function getRegex() { /* {{{ */ - return $this->_regex; - } /* }}} */ - - /** - * Set the regular expression - * - * A value of the attribute must match this regular expression. - * - * The methods checks if the regular expression is valid by running - * preg_match() on an empty string and see if it fails. Trying to set - * an invalid regular expression will not overwrite the current - * regular expression. - * - * All leading and trailing spaces of $regex will be removed. - * - * @param string $regex - * @return boolean true if regex could be set or is invalid, otherwise false - */ - function setRegex($regex) { /* {{{ */ - $db = $this->_dms->getDB(); - - $regex = trim($regex); - if($regex && @preg_match($regex, '') === false) - return false; - - $queryStr = "UPDATE `tblAttributeDefinitions` SET `regex` =".$db->qstr($regex)." WHERE `id` = " . $this->_id; - $res = $db->getResult($queryStr); - if (!$res) - return false; - - $this->_regex = $regex; - return true; - } /* }}} */ - - /** - * Check if the attribute definition is used - * - * Checks all documents, folders and document content whether at least - * one of them referenceѕ this attribute definition - * - * @return boolean true if attribute definition is used, otherwise false - */ - function isUsed() { /* {{{ */ - $db = $this->_dms->getDB(); - - $queryStr = "SELECT * FROM `tblDocumentAttributes` WHERE `attrdef`=".$this->_id; - $resArr = $db->getResultArray($queryStr); - if (is_array($resArr) && count($resArr) == 0) { - $queryStr = "SELECT * FROM `tblFolderAttributes` WHERE `attrdef`=".$this->_id; - $resArr = $db->getResultArray($queryStr); - if (is_array($resArr) && count($resArr) == 0) { - $queryStr = "SELECT * FROM `tblDocumentContentAttributes` WHERE `attrdef`=".$this->_id; - $resArr = $db->getResultArray($queryStr); - if (is_array($resArr) && count($resArr) == 0) { - - return false; - } - } - } - return true; - } /* }}} */ - - /** - * Parse a given value according to attribute definition - * - * The return value is always an array, even if the attribute is a single - * value attribute. If the type of attribute is any of document, folder, user, - * or group then this method will fetch each object from the database and - * return an array of SeedDMS_Core_Document, SeedDMS_Core_Folder, etc. - * - * @param $value string - * @return array|bool - */ - function parseValue(string $value) { /* {{{ */ - if($this->getMultipleValues()) { - /* If the value doesn't start with the separator used in the value set, - * then assume that the value was not saved with a leading separator. - * This can happen, if the value was previously a single value from - * the value set and later turned into a multi value attribute. - */ - $sep = substr($value, 0, 1); - $vsep = $this->getValueSetSeparator(); - if($sep == $vsep) - $values = explode($sep, substr($value, 1)); - else - $values = array($value); - } else { - $values = array($value); - } - - switch((string) $this->getType()) { - case self::type_document: - foreach($values as $value) { - if($u = $this->_dms->getDocument((int) $value)) - $tmp[] = $u->getName(); - else - $tmp[] = '???'; - } - $values = $tmp; - break; - case self::type_folder: - foreach($values as $value) { - if($u = $this->_dms->getFolder((int) $value)) - $tmp[] = $u->getName(); - else - $tmp[] = '???'; - } - $values = $tmp; - break; - case self::type_user: - foreach($values as $value) { - if($u = $this->_dms->getUser((int) $value)) - $tmp[] = $u->getLogin(); - else - $tmp[] = '???'; - } - $values = $tmp; - break; - case self::type_group: - foreach($values as $value) { - if($u = $this->_dms->getGroup((int) $value)) - $tmp[] = $u->getName(); - else - $tmp[] = '???'; - } - $values = $tmp; - break; - } - return $values; - } /* }}} */ - - /** - * Return a list of documents, folders, document contents where this - * attribute definition is used - * - * @param integer $limit return not more the n objects of each type - * @return array|bool - */ - function getStatistics($limit=0) { /* {{{ */ - $db = $this->_dms->getDB(); - - $result = array('docs'=>array(), 'folders'=>array(), 'contents'=>array()); - if($this->_objtype == SeedDMS_Core_AttributeDefinition::objtype_all || - $this->_objtype == SeedDMS_Core_AttributeDefinition::objtype_document) { - $queryStr = "SELECT * FROM `tblDocumentAttributes` WHERE `attrdef`=".$this->_id; - if($limit) - $queryStr .= " limit ".(int) $limit; - $resArr = $db->getResultArray($queryStr); - if($resArr) { - foreach($resArr as $rec) { - if($doc = $this->_dms->getDocument($rec['document'])) { - $result['docs'][] = $doc; - } - } - } - $valueset = $this->getValueSetAsArray(); - $possiblevalues = array(); - foreach($valueset as $value) { - $possiblevalues[md5($value)] = array('value'=>$value, 'c'=>0); - } - $queryStr = "SELECT count(*) c, `value` FROM `tblDocumentAttributes` WHERE `attrdef`=".$this->_id." GROUP BY `value` ORDER BY c DESC"; - $resArr = $db->getResultArray($queryStr); - if($resArr) { - foreach($resArr as $row) { - $tmpattr = new SeedDMS_Core_Attribute(0, null, $this, $row['value']); - foreach($tmpattr->getValueAsArray() as $value) { - if(isset($possiblevalues[md5($value)])) { - $possiblevalues[md5($value)]['c'] += $row['c']; - } else { - $possiblevalues[md5($value)] = array('value'=>$value, 'c'=>$row['c']); - } - } - } - $result['frequencies']['document'] = $possiblevalues; - } - } - - if($this->_objtype == SeedDMS_Core_AttributeDefinition::objtype_all || - $this->_objtype == SeedDMS_Core_AttributeDefinition::objtype_folder) { - $queryStr = "SELECT * FROM `tblFolderAttributes` WHERE `attrdef`=".$this->_id; - if($limit) - $queryStr .= " limit ".(int) $limit; - $resArr = $db->getResultArray($queryStr); - if($resArr) { - foreach($resArr as $rec) { - if($folder = $this->_dms->getFolder($rec['folder'])) { - $result['folders'][] = $folder; - } - } - } - $valueset = $this->getValueSetAsArray(); - $possiblevalues = array(); - foreach($valueset as $value) { - $possiblevalues[md5($value)] = array('value'=>$value, 'c'=>0); - } - $queryStr = "SELECT count(*) c, `value` FROM `tblFolderAttributes` WHERE `attrdef`=".$this->_id." GROUP BY `value` ORDER BY c DESC"; - $resArr = $db->getResultArray($queryStr); - if($resArr) { - foreach($resArr as $row) { - $tmpattr = new SeedDMS_Core_Attribute(0, null, $this, $row['value']); - foreach($tmpattr->getValueAsArray() as $value) { - if(isset($possiblevalues[md5($value)])) { - $possiblevalues[md5($value)]['c'] += $row['c']; - } else { - $possiblevalues[md5($value)] = array('value'=>$value, 'c'=>$row['c']); - } - } - } - $result['frequencies']['folder'] = $possiblevalues; - } - } - - if($this->_objtype == SeedDMS_Core_AttributeDefinition::objtype_all || - $this->_objtype == SeedDMS_Core_AttributeDefinition::objtype_documentcontent) { - $queryStr = "SELECT * FROM `tblDocumentContentAttributes` WHERE `attrdef`=".$this->_id; - if($limit) - $queryStr .= " limit ".(int) $limit; - $resArr = $db->getResultArray($queryStr); - if($resArr) { - foreach($resArr as $rec) { - if($content = $this->_dms->getDocumentContent($rec['content'])) { - $result['contents'][] = $content; - } - } - } - $valueset = $this->getValueSetAsArray(); - $possiblevalues = array(); - foreach($valueset as $value) { - $possiblevalues[md5($value)] = array('value'=>$value, 'c'=>0); - } - $queryStr = "SELECT count(*) c, `value` FROM `tblDocumentContentAttributes` WHERE `attrdef`=".$this->_id." GROUP BY `value` ORDER BY c DESC"; - $resArr = $db->getResultArray($queryStr); - if($resArr) { - foreach($resArr as $row) { - $tmpattr = new SeedDMS_Core_Attribute(0, null, $this, $row['value']); - foreach($tmpattr->getValueAsArray() as $value) { - if(isset($possiblevalues[md5($value)])) { - $possiblevalues[md5($value)]['c'] += $row['c']; - } else { - $possiblevalues[md5($value)] = array('value'=>$value, 'c'=>$row['c']); - } - } - } - $result['frequencies']['content'] = $possiblevalues; - } - } - - return $result; - } /* }}} */ - - /** - * Remove the attribute definition - * Removal is only executed when the definition is not used anymore. - * - * @return boolean true on success or false in case of an error - */ - function remove() { /* {{{ */ - $db = $this->_dms->getDB(); - - if($this->isUsed()) - return false; - - // Delete user itself - $queryStr = "DELETE FROM `tblAttributeDefinitions` WHERE `id` = " . $this->_id; - if (!$db->getResult($queryStr)) return false; - - return true; - } /* }}} */ - - /** - * Get all documents and folders by a given attribute value - * - * @param string $attrvalue value of attribute - * @param integer $limit limit number of documents/folders - * @return array array containing list of documents and folders - */ - public function getObjects($attrvalue, $limit=0, $op=O_EQ) { /* {{{ */ - $db = $this->_dms->getDB(); - - $result = array('docs'=>array(), 'folders'=>array(), 'contents'=>array()); - if($this->_objtype == SeedDMS_Core_AttributeDefinition::objtype_all || - $this->_objtype == SeedDMS_Core_AttributeDefinition::objtype_document) { - $queryStr = "SELECT * FROM `tblDocumentAttributes` WHERE `attrdef`=".$this->_id; - if($attrvalue != null) { - $queryStr .= " AND "; - if($this->getMultipleValues()) { - $sep = $this->getValueSetSeparator(); - $queryStr .= "(`value` like ".$db->qstr($sep.$attrvalue.'%')." OR `value` like ".$db->qstr('%'.$sep.$attrvalue.$sep.'%')." OR `value` like ".$db->qstr('%'.$sep.$attrvalue).")"; - } else { - $queryStr .= "`value`".$op.$db->qstr($attrvalue); - } - } - if($limit) - $queryStr .= " limit ".(int) $limit; - $resArr = $db->getResultArray($queryStr); - if($resArr) { - foreach($resArr as $rec) { - if($doc = $this->_dms->getDocument($rec['document'])) { - $result['docs'][] = $doc; - } - } - } - } - - if($this->_objtype == SeedDMS_Core_AttributeDefinition::objtype_all || - $this->_objtype == SeedDMS_Core_AttributeDefinition::objtype_folder) { - $queryStr = "SELECT * FROM `tblFolderAttributes` WHERE `attrdef`=".$this->_id." AND "; - if($this->getMultipleValues()) { - $sep = $this->getValueSetSeparator(); - $queryStr .= "(`value` like ".$db->qstr($sep.$attrvalue.'%')." OR `value` like ".$db->qstr('%'.$sep.$attrvalue.$sep.'%')." OR `value` like ".$db->qstr('%'.$sep.$attrvalue).")"; - } else { - $queryStr .= "`value`=".$db->qstr($attrvalue); - } - if($limit) - $queryStr .= " limit ".(int) $limit; - $resArr = $db->getResultArray($queryStr); - if($resArr) { - foreach($resArr as $rec) { - if($folder = $this->_dms->getFolder($rec['folder'])) { - $result['folders'][] = $folder; - } - } - } - } - - return $result; - } /* }}} */ - - /** - * Remove a given attribute value from all documents, versions and folders - * - * @param string $attrvalue value of attribute - * @return array array containing list of documents and folders - */ - public function removeValue($attrvalue) { /* {{{ */ - $db = $this->_dms->getDB(); - - foreach(array('document', 'documentcontent', 'folder') as $type) { - if($type == 'document') { - $tablename = "tblDocumentAttributes"; - $objtype = SeedDMS_Core_AttributeDefinition::objtype_document; - } elseif($type == 'documentcontent') { - $tablename = "tblDocumentContentAttributes"; - $objtype = SeedDMS_Core_AttributeDefinition::objtype_documentcontent; - } elseif($type == 'folder') { - $tablename = "tblFolderAttributes"; - $objtype = SeedDMS_Core_AttributeDefinition::objtype_folder; - } - if($this->_objtype == SeedDMS_Core_AttributeDefinition::objtype_all || $objtype) { - $queryStr = "SELECT * FROM `".$tablename."` WHERE `attrdef`=".$this->_id." AND "; - if($this->getMultipleValues()) { - $sep = $this->getValueSetSeparator(); - $queryStr .= "(`value` like ".$db->qstr($sep.$attrvalue.'%')." OR `value` like ".$db->qstr('%'.$sep.$attrvalue.$sep.'%')." OR `value` like ".$db->qstr('%'.$sep.$attrvalue).")"; - } else { - $queryStr .= "`value`=".$db->qstr($attrvalue); - } - - $resArr = $db->getResultArray($queryStr); - if($resArr) { - $db->startTransaction(); - foreach($resArr as $rec) { - if($rec['value'] == $attrvalue) { - $queryStr = "DELETE FROM `".$tablename."` WHERE `id`=".$rec['id']; - } else { - if($this->getMultipleValues()) { - $sep = substr($rec['value'], 0, 1); - $vsep = $this->getValueSetSeparator(); - if($sep == $vsep) - $values = explode($sep, substr($rec['value'], 1)); - else - $values = array($rec['value']); - if (($key = array_search($attrvalue, $values)) !== false) { - unset($values[$key]); - } - if($values) { - $queryStr = "UPDATE `".$tablename."` SET `value`=".$db->qstr($sep.implode($sep, $values))." WHERE `id`=".$rec['id']; - } else { - $queryStr = "DELETE FROM `".$tablename."` WHERE `id`=".$rec['id']; - } - } else { - } - } - if (!$db->getResult($queryStr)) { - $db->rollbackTransaction(); - return false; - } - } - $db->commitTransaction(); - } - } - } - return true; - } /* }}} */ - - /** - * Validate value against attribute definition - * - * This function checks if the given value fits the attribute - * definition. - * If the validation fails the validation error will be set which - * can be requested by SeedDMS_Core_Attribute::getValidationError() - * Set $new to true if the value to be checked isn't saved to the database - * already. It will just be passed to the callback onAttributeValidate where - * it could be used to, e.g. check if a value is unique once it is saved to - * the database. $object is set to a folder, document or documentcontent - * if the attribute belongs to such an object. This will be null, if a - * new object is created. - * - * @param string|array $attrvalue attribute value - * @param object $object set if the current attribute is saved for this object - * (this will only be passed to the onAttributeValidate callback) - * @param boolean $new set to true if the value is new value and not taken from - * an existing attribute - * (this will only be passed to the onAttributeValidate callback) - * @return boolean true if validation succeeds, otherwise false - */ - function validate($attrvalue, $object=null, $new=false) { /* {{{ */ - /* Check if 'onAttributeValidate' callback is set */ - if(isset($this->_dms->callbacks['onAttributeValidate'])) { - foreach($this->_dms->callbacks['onAttributeValidate'] as $callback) { - $ret = call_user_func($callback[0], $callback[1], $this, $attrvalue, $object, $new); - if(is_bool($ret)) - return $ret; - } - } - - /* Turn $attrvalue into an array of values. Checks if $attrvalue starts - * with a separator char as set in the value set and use it to explode - * the $attrvalue. If the separator doesn't match or this attribute - * definition doesn't have a value set, then just create a one element - * array. if $attrvalue is empty, then create an empty array. - */ - if($this->getMultipleValues()) { - if(is_string($attrvalue) && $attrvalue) { - $sep = $attrvalue[0]; - $vsep = $this->getValueSetSeparator(); - if($sep == $vsep) - $values = explode($attrvalue[0], substr($attrvalue, 1)); - else - $values = array($attrvalue); - } elseif(is_array($attrvalue)) { - $values = $attrvalue; - } elseif(is_string($attrvalue) && !$attrvalue) { - $values = array(); - } else - $values = array($attrvalue); - } elseif($attrvalue !== null) { - $values = array($attrvalue); - } else { - $values = array(); - } - - /* Check if attribute value has at least the minimum number of values */ - $this->_validation_error = SeedDMS_Core_AttributeDefinition::val_error_none; - if($this->getMinValues() > count($values)) { - $this->_validation_error = SeedDMS_Core_AttributeDefinition::val_error_min_values; - return false; - } - /* Check if attribute value has not more than maximum number of values */ - if($this->getMaxValues() && $this->getMaxValues() < count($values)) { - $this->_validation_error = SeedDMS_Core_AttributeDefinition::val_error_max_values; - return false; - } - - $success = true; - switch((string) $this->getType()) { - case self::type_boolean: - foreach($values as $value) { - $success = $success && (preg_match('/^[01]$/', $value) ? true : false); - } - if(!$success) - $this->_validation_error = SeedDMS_Core_AttributeDefinition::val_error_boolean; - break; - case self::type_int: - foreach($values as $value) { - $success = $success && (preg_match('/^[0-9]*$/', $value) ? true : false); - } - if(!$success) - $this->_validation_error = SeedDMS_Core_AttributeDefinition::val_error_int; - break; - case self::type_date: - foreach($values as $value) { - $d = explode('-', $value, 3); - $success = $success && (count($d) == 3)&& checkdate((int) $d[1], (int) $d[2], (int) $d[0]); - } - if(!$success) - $this->_validation_error = SeedDMS_Core_AttributeDefinition::val_error_date; - break; - case self::type_float: - foreach($values as $value) { - $success = $success && is_numeric($value); - } - if(!$success) - $this->_validation_error = SeedDMS_Core_AttributeDefinition::val_error_float; - break; - case self::type_string: - if(trim($this->getRegex()) != '') { - foreach($values as $value) { - $success = $success && (preg_match($this->getRegex(), $value) ? true : false); - } - } - if(!$success) - $this->_validation_error = SeedDMS_Core_AttributeDefinition::val_error_regex; - break; - case self::type_email: - foreach($values as $value) { - //$success &= filter_var($value, FILTER_VALIDATE_EMAIL) ? true : false; - $success = $success && (preg_match('/^[a-z0-9._-]+@[a-z0-9-]{2,63}(\.[a-z0-9-]{2,63})*\.[a-z]{2,63}$/i', $value) ? true : false); - } - if(!$success) - $this->_validation_error = SeedDMS_Core_AttributeDefinition::val_error_email; - break; - case self::type_url: - foreach($values as $value) { - $success = $success && (preg_match('/^http(s)?:\/\/[a-z0-9_-]+(\.[a-z0-9-]{2,63})*(:[0-9]+)?(\/.*)?$/i', $value) ? true : false); - } - if(!$success) - $this->_validation_error = SeedDMS_Core_AttributeDefinition::val_error_url; - break; - case self::type_document: - foreach($values as $value) { - $success = true; - if(!$this->_dms->getDocument((int) $value)) - $success = false; - } - if(!$success) - $this->_validation_error = SeedDMS_Core_AttributeDefinition::val_error_document; - break; - case self::type_folder: - foreach($values as $value) { - $success = true; - if(!$this->_dms->getFolder((int) $value)) - $success = false; - } - if(!$success) - $this->_validation_error = SeedDMS_Core_AttributeDefinition::val_error_folder; - break; - case self::type_user: - foreach($values as $value) { - $success = true; - if(!$this->_dms->getUser((int) $value)) - $success = false; - } - if(!$success) - $this->_validation_error = SeedDMS_Core_AttributeDefinition::val_error_user; - break; - case self::type_group: - foreach($values as $value) { - $success = true; - if(!$this->_dms->getGroup((int) $value)) - $success = false; - } - if(!$success) - $this->_validation_error = SeedDMS_Core_AttributeDefinition::val_error_group; - break; - } - - if(!$success) - return $success; - - /* Check if value is in value set */ - if($valueset = $this->getValueSetAsArray()) { - /* An empty value cannot be the value set */ - if(!$values) { - $success = false; - $this->_validation_error = SeedDMS_Core_AttributeDefinition::val_error_valueset; - } else { - foreach($values as $value) { - if(!in_array($value, $valueset)) { - $success = false; - $this->_validation_error = SeedDMS_Core_AttributeDefinition::val_error_valueset; - } - } - } - } - - return $success; - - } /* }}} */ - - /** - * Get validation error from last validation - * - * @return integer error code - */ - function getValidationError() { return $this->_validation_error; } - -} /* }}} */ diff --git a/SeedDMS_Core/Core/inc.ClassDecorator.php b/SeedDMS_Core/Core/inc.ClassDecorator.php deleted file mode 100644 index 9450d5fef..000000000 --- a/SeedDMS_Core/Core/inc.ClassDecorator.php +++ /dev/null @@ -1,42 +0,0 @@ - - * @copyright Copyright (C) 2010, Uwe Steinmann - * @version Release: @package_version@ - */ - - -/** - * Class which implements a simple decorator pattern - * - * @category DMS - * @package SeedDMS_Core - * @version @version@ - * @author Uwe Steinmann - * @copyright Copyright (C) 2010, Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_Core_Decorator { - protected $o; - - public function __construct($object) { - $this->o = $object; - } - - public function __call($method, $args) - { - if (!method_exists($this->o, $method)) { - throw new Exception("Undefined method $method attempt."); - } - /* In case the called method returns the object itself, then return this object */ - $result = call_user_func_array(array($this->o, $method), $args); - return $result === $this->o ? $this : $result; - } -} - diff --git a/SeedDMS_Core/Core/inc.ClassDocumentCategory.php b/SeedDMS_Core/Core/inc.ClassDocumentCategory.php deleted file mode 100644 index 4f39e2ef9..000000000 --- a/SeedDMS_Core/Core/inc.ClassDocumentCategory.php +++ /dev/null @@ -1,124 +0,0 @@ - - * @copyright Copyright (C) 2010 Uwe Steinmann - * @version Release: @package_version@ - */ - -/** - * Class to represent a document category in the document management system - * - * @category DMS - * @package SeedDMS_Core - * @author Uwe Steinmann - * @copyright Copyright (C)2011 Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_Core_DocumentCategory { - /** - * @var integer $_id id of document category - * @access protected - */ - protected $_id; - - /** - * @var string $_name name of category - * @access protected - */ - protected $_name; - - /** - * @var object $_dms reference to dms this category belongs to - * @access protected - */ - protected $_dms; - - function __construct($id, $name) { /* {{{ */ - $this->_id = $id; - $this->_name = $name; - $this->_dms = null; - } /* }}} */ - - function setDMS($dms) { /* {{{ */ - $this->_dms = $dms; - } /* }}} */ - - function getID() { return $this->_id; } - - function getName() { return $this->_name; } - - function setName($newName) { /* {{{ */ - $newName = trim($newName); - if(!$newName) - return false; - - $db = $this->_dms->getDB(); - - $queryStr = "UPDATE `tblCategory` SET `name` = ".$db->qstr($newName)." WHERE `id` = ". $this->_id; - if (!$db->getResult($queryStr)) - return false; - - $this->_name = $newName; - return true; - } /* }}} */ - - function isUsed() { /* {{{ */ - $db = $this->_dms->getDB(); - - $queryStr = "SELECT * FROM `tblDocumentCategory` WHERE `categoryID`=".$this->_id; - $resArr = $db->getResultArray($queryStr); - if (is_array($resArr) && count($resArr) == 0) - return false; - return true; - } /* }}} */ - - function remove() { /* {{{ */ - $db = $this->_dms->getDB(); - - $queryStr = "DELETE FROM `tblCategory` WHERE `id` = " . $this->_id; - if (!$db->getResult($queryStr)) - return false; - - return true; - } /* }}} */ - - function getDocumentsByCategory($limit=0, $offset=0) { /* {{{ */ - $db = $this->_dms->getDB(); - - $queryStr = "SELECT * FROM `tblDocumentCategory` where `categoryID`=".$this->_id; - if($limit && is_numeric($limit)) - $queryStr .= " LIMIT ".(int) $limit; - if($offset && is_numeric($offset)) - $queryStr .= " OFFSET ".(int) $offset; - $resArr = $db->getResultArray($queryStr); - if (is_bool($resArr) && !$resArr) - return false; - - $documents = array(); - foreach ($resArr as $row) { - if($doc = $this->_dms->getDocument($row["documentID"])) - array_push($documents, $doc); - } - return $documents; - } /* }}} */ - - function countDocumentsByCategory() { /* {{{ */ - $db = $this->_dms->getDB(); - - $queryStr = "SELECT COUNT(*) as `c` FROM `tblDocumentCategory` where `categoryID`=".$this->_id; - $resArr = $db->getResultArray($queryStr); - if (is_bool($resArr) && !$resArr) - return false; - - return $resArr[0]['c']; - } /* }}} */ - -} - -?> diff --git a/SeedDMS_Core/Core/inc.ClassIterator.php b/SeedDMS_Core/Core/inc.ClassIterator.php deleted file mode 100644 index ffb8133dc..000000000 --- a/SeedDMS_Core/Core/inc.ClassIterator.php +++ /dev/null @@ -1,231 +0,0 @@ - - * @copyright Copyright (C) 2010, Uwe Steinmann - * @version Release: @package_version@ - */ - -class DocumentIterator implements \Iterator { - /** - * @var object folder - */ - protected $_folder; - - /** - * @var object dms - */ - protected $_dms; - - /** - * @var array documents - */ - protected $_documents; - - public function __construct($folder) { - $this->_folder = $folder; - $this->_dms = $folder->getDMS(); - $this->_documents = array(); - $this->_pointer = 0; - $this->_cache = array(); - $this->populate(); - } - - public function rewind() { - $this->_pointer = 0; - } - - public function valid() { - return isset($this->_documents[$this->_pointer]); - } - - public function next() { - $this->_pointer++; - } - - public function key() { - return $this->_folders[$this->_pointer]; - } - - public function current() { - if($this->_documents[$this->_pointer]) { - $documentid = $this->_documents[$this->_pointer]['id']; - if(!isset($this->_cache[$documentid])) { -// echo $documentid." not cached
"; - $this->_cache[$documentid] = $this->_dms->getdocument($documentid); - } - return $this->_cache[$documentid]; - } - return null; - } - - private function populate($orderby="", $dir="asc", $limit=0, $offset=0) { /* {{{ */ - $db = $this->_dms->getDB(); - - $queryStr = "SELECT `id` FROM `tblDocuments` WHERE `folder` = " . $this->_folder->getID(); - - if ($orderby && $orderby[0]=="n") $queryStr .= " ORDER BY `name`"; - elseif ($orderby && $orderby[0]=="s") $queryStr .= " ORDER BY `sequence`"; - elseif ($orderby && $orderby[0]=="d") $queryStr .= " ORDER BY `date`"; - if($dir == 'desc') - $queryStr .= " DESC"; - if(is_int($limit) && $limit > 0) { - $queryStr .= " LIMIT ".$limit; - if(is_int($offset) && $offset > 0) - $queryStr .= " OFFSET ".$offset; - } - - $resArr = $db->getResultArray($queryStr); - if (is_bool($resArr) && $resArr == false) - return false; - - $this->_documents = $resArr; - } /* }}} */ -} - -class FolderIterator implements \Iterator { /* {{{ */ - /** - * @var object folder - */ - protected $_folder; - - /** - * @var object dms - */ - protected $_dms; - - /** - * @var array documents - */ - protected $_folders; - - public function __construct($folder) { /* {{{ */ - $this->_folder = $folder; - $this->_dms = $folder->getDMS(); - $this->_folders = array(); - $this->_pointer = 0; - $this->_cache = array(); - $this->populate(); - } /* }}} */ - - public function rewind() { /* {{{ */ - $this->_pointer = 0; - } /* }}} */ - - public function valid() { /* {{{ */ - return isset($this->_folders[$this->_pointer]); - } /* }}} */ - - public function next() { /* {{{ */ - $this->_pointer++; - } /* }}} */ - - public function key() { /* {{{ */ - return $this->_folders[$this->_pointer]; - } /* }}} */ - - public function current() { /* {{{ */ - if($this->_folders[$this->_pointer]) { - $folderid = $this->_folders[$this->_pointer]['id']; - if(!isset($this->_cache[$folderid])) { -// echo $folderid." not cached
"; - $this->_cache[$folderid] = $this->_dms->getFolder($folderid); - } - return $this->_cache[$folderid]; - } - return null; - } /* }}} */ - - private function populate($orderby="", $dir="asc", $limit=0, $offset=0) { /* {{{ */ - $db = $this->_dms->getDB(); - - $queryStr = "SELECT `id` FROM `tblFolders` WHERE `parent` = " . $this->_folder->getID(); - - if ($orderby && $orderby[0]=="n") $queryStr .= " ORDER BY `name`"; - elseif ($orderby && $orderby[0]=="s") $queryStr .= " ORDER BY `sequence`"; - elseif ($orderby && $orderby[0]=="d") $queryStr .= " ORDER BY `date`"; - if($dir == 'desc') - $queryStr .= " DESC"; - if(is_int($limit) && $limit > 0) { - $queryStr .= " LIMIT ".$limit; - if(is_int($offset) && $offset > 0) - $queryStr .= " OFFSET ".$offset; - } - - $resArr = $db->getResultArray($queryStr); - if (is_bool($resArr) && $resArr == false) - return false; - - $this->_folders = $resArr; - } /* }}} */ -} /* }}} */ - -/** - * The FolderFilterIterator checks if the given user has access on - * the current folder. - * FilterIterator uses an inner iterator passed to the constructor - * to iterate over the sub folders of a folder. - * - $iter = new FolderIterator($folder); - $iter2 = new FolderFilterIterator($iter, $user); - foreach($iter2 as $ff) { - echo $ff->getName()."
"; - } - */ -class FolderFilterIterator extends \FilterIterator { /* {{{ */ - public function __construct(Iterator $iterator , $filter ) { - parent::__construct($iterator); - $this->userFilter = $filter; - } - public function accept() { /* {{{ */ - $folder = $this->getInnerIterator()->current(); - echo "accept() for ".$folder->getName()."
"; - return true; - } /* }}} */ -} /* }}} */ - -/** - $iter = new RecursiveFolderIterator($folder); - $iter2 = new RecursiveIteratorIterator($iter, RecursiveIteratorIterator::SELF_FIRST); - foreach($iter2 as $ff) { - echo $ff->getID().': '.$ff->getName()."
"; - } - */ -class RecursiveFolderIterator extends FolderIterator implements \RecursiveIterator { /* {{{ */ - - public function hasChildren() { /* {{{ */ - $db = $this->_dms->getDB(); - $queryStr = "SELECT id FROM `tblFolders` WHERE `parent` = ".(int) $this->current()->getID(); - $resArr = $db->getResultArray($queryStr); - if (is_bool($resArr) && !$resArr) - return false; - return true; - } /* }}} */ - - public function getChildren() { /* {{{ */ - return new RecursiveFolderIterator($this->current()); - } /* }}} */ -} /* }}} */ - -class RecursiveFolderFilterIterator extends FolderFilterIterator { /* {{{ */ - public function hasChildren() { /* {{{ */ - $db = $this->_dms->getDB(); - $queryStr = "SELECT id FROM `tblFolders` WHERE `parent` = ".(int) $this->current()->getID(); - $resArr = $db->getResultArray($queryStr); - if (is_bool($resArr) && !$resArr) - return false; - return true; - } /* }}} */ - - public function getChildren() { /* {{{ */ - return new RecursiveFolderIterator($this->current()); - } /* }}} */ - -} /* }}} */ diff --git a/SeedDMS_Core/Core/inc.ClassKeywords.php b/SeedDMS_Core/Core/inc.ClassKeywords.php deleted file mode 100644 index 16afc994f..000000000 --- a/SeedDMS_Core/Core/inc.ClassKeywords.php +++ /dev/null @@ -1,207 +0,0 @@ - - * @copyright Copyright (C) 2002-2005 Markus Westphal, 2006-2008 Malcolm Cowe, - * 2010-2023 Uwe Steinmann - * @version Release: @package_version@ - */ - -/** - * Class to represent a keyword category in the document management system - * - * @category DMS - * @package SeedDMS_Core - * @author Markus Westphal, Malcolm Cowe, Uwe Steinmann - * @copyright Copyright (C) 2002-2005 Markus Westphal, 2006-2008 Malcolm Cowe, - * 2010-2023 Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_Core_KeywordCategory { - /** - * @var integer $_id id of keyword category - * @access protected - */ - protected $_id; - - /** - * @var integer $_ownerID id of user who is the owner - * @access protected - */ - protected $_ownerID; - - /** - * @var string $_name name of category - * @access protected - */ - protected $_name; - - /** - * @var SeedDMS_Core_DMS $_dms reference to dms this category belongs to - * @access protected - */ - protected $_dms; - - /** - * SeedDMS_Core_KeywordCategory constructor. - * @param $id - * @param $ownerID - * @param $name - */ - function __construct($id, $ownerID, $name) { /* {{{ */ - $this->_id = $id; - $this->_name = $name; - $this->_ownerID = $ownerID; - $this->_dms = null; - } /* }}} */ - - /** - * @param SeedDMS_Core_DMS $dms - */ - function setDMS($dms) { /* {{{ */ - $this->_dms = $dms; - } /* }}} */ - - /** - * @return int - */ - function getID() { return $this->_id; } - - /** - * @return string - */ - function getName() { return $this->_name; } - - /** - * @return bool|SeedDMS_Core_User - */ - function getOwner() { /* {{{ */ - if (!isset($this->_owner)) - $this->_owner = $this->_dms->getUser($this->_ownerID); - return $this->_owner; - } /* }}} */ - - /** - * @param $newName - * @return bool - */ - function setName($newName) { /* {{{ */ - $newName = trim($newName); - if(!$newName) - return false; - - $db = $this->_dms->getDB(); - - $queryStr = "UPDATE `tblKeywordCategories` SET `name` = ".$db->qstr($newName)." WHERE `id` = ". $this->_id; - if (!$db->getResult($queryStr)) - return false; - - $this->_name = $newName; - return true; - } /* }}} */ - - /** - * @param SeedDMS_Core_User $user - * @return bool - */ - function setOwner($user) { /* {{{ */ - if(!$user || !$user->isType('user')) - return false; - - $db = $this->_dms->getDB(); - - $queryStr = "UPDATE `tblKeywordCategories` SET `owner` = " . $user->getID() . " WHERE `id` = " . $this->_id; - if (!$db->getResult($queryStr)) - return false; - - $this->_ownerID = $user->getID(); - $this->_owner = $user; - return true; - } /* }}} */ - - /** - * @return array keywords in this list - */ - function getKeywordLists() { /* {{{ */ - $db = $this->_dms->getDB(); - - $queryStr = "SELECT * FROM `tblKeywords` WHERE `category` = " . $this->_id . " order by `keywords`"; - return $db->getResultArray($queryStr); - } - - /** - * @return integer number of keywords in this list - */ - function countKeywordLists() { /* {{{ */ - $db = $this->_dms->getDB(); - - $queryStr = "SELECT COUNT(*) as `c` FROM `tblKeywords` where `category`=".$this->_id; - $resArr = $db->getResultArray($queryStr); - if (is_bool($resArr) && !$resArr) - return false; - - return $resArr[0]['c']; - } /* }}} */ - - /** - * @param $listID - * @param $keywords - * @return bool - */ - function editKeywordList($listID, $keywords) { /* {{{ */ - $db = $this->_dms->getDB(); - - $queryStr = "UPDATE `tblKeywords` SET `keywords` = ".$db->qstr($keywords)." WHERE `id` = $listID"; - return $db->getResult($queryStr); - } /* }}} */ - - /** - * @param $keywords - * @return bool - */ - function addKeywordList($keywords) { /* {{{ */ - $db = $this->_dms->getDB(); - - $queryStr = "INSERT INTO `tblKeywords` (`category`, `keywords`) VALUES (" . $this->_id . ", ".$db->qstr($keywords).")"; - return $db->getResult($queryStr); - } /* }}} */ - - /** - * @param $listID - * @return bool - */ - function removeKeywordList($listID) { /* {{{ */ - $db = $this->_dms->getDB(); - - $queryStr = "DELETE FROM `tblKeywords` WHERE `id` = $listID"; - return $db->getResult($queryStr); - } /* }}} */ - - /** - * @return bool - */ - function remove() { /* {{{ */ - $db = $this->_dms->getDB(); - - $db->startTransaction(); - $queryStr = "DELETE FROM `tblKeywords` WHERE `category` = " . $this->_id; - if (!$db->getResult($queryStr)) { - $db->rollbackTransaction(); - return false; - } - - $queryStr = "DELETE FROM `tblKeywordCategories` WHERE `id` = " . $this->_id; - if (!$db->getResult($queryStr)) { - $db->rollbackTransaction(); - return false; - } - - $db->commitTransaction(); - return true; - } /* }}} */ -} diff --git a/SeedDMS_Core/Core/inc.ClassNotification.php b/SeedDMS_Core/Core/inc.ClassNotification.php deleted file mode 100644 index e4c70804d..000000000 --- a/SeedDMS_Core/Core/inc.ClassNotification.php +++ /dev/null @@ -1,116 +0,0 @@ - - * @copyright Copyright (C) 2010 Uwe Steinmann - * @version Release: @package_version@ - */ - -/** - * Class to represent a notification - * - * @category DMS - * @package SeedDMS_Core - * @author Uwe Steinmann - * @copyright Copyright (C) 2010 Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_Core_Notification { /* {{{ */ - /** - * @var integer id of target (document or folder) - * - * @access protected - */ - protected $_target; - - /** - * @var integer document or folder - * - * @access protected - */ - protected $_targettype; - - /** - * @var integer id of user to notify - * - * @access protected - */ - protected $_userid; - - /** - * @var integer id of group to notify - * - * @access protected - */ - protected $_groupid; - - /** - * @var object reference to the dms instance this user belongs to - * - * @access protected - */ - protected $_dms; - - /** - * Constructor - * - * @param integer $target id of document/folder this notification is - * attached to. - * @param integer $targettype 1 = target is document, 2 = target is a folder - * @param integer $userid id of user. The id is -1 if the notification is - * for a group. - * @param integer $groupid id of group. The id is -1 if the notification is - * for a user. - */ - function __construct($target, $targettype, $userid, $groupid) { /* {{{ */ - $this->_target = $target; - $this->_targettype = $targettype; - $this->_userid = $userid; - $this->_groupid = $groupid; - } /* }}} */ - - /** - * Set instance of dms this object belongs to - * - * @param object $dms instance of dms - */ - function setDMS($dms) { /* {{{ */ - $this->_dms = $dms; - } /* }}} */ - - /** - * Get id of target (document/object) this notification is attachted to - * - * @return integer id of target - */ - function getTarget() { return $this->_target; } - - /** - * Get type of target - * - * @return integer type of target (1=document/2=object) - */ - function getTargetType() { return $this->_targettype; } - - /** - * Get user for this notification - * - * @return integer id of user or -1 if this notification does not belong - * to a user - */ - function getUser() { return $this->_dms->getUser($this->_userid); } - - /** - * Get group for this notification - * - * @return integer id of group or -1 if this notification does not belong - * to a group - */ - function getGroup() { return $this->_dms->getGroup($this->_groupid); } -} /* }}} */ -?> diff --git a/SeedDMS_Core/Core/inc.ClassObject.php b/SeedDMS_Core/Core/inc.ClassObject.php deleted file mode 100644 index 8bcc68a15..000000000 --- a/SeedDMS_Core/Core/inc.ClassObject.php +++ /dev/null @@ -1,331 +0,0 @@ - - * @copyright Copyright (C) 2010-2012 Uwe Steinmann - * @version Release: @package_version@ - */ - - -/** - * Class to represent a generic object in the document management system - * - * This is the base class for generic objects in SeedDMS. - * - * @category DMS - * @package SeedDMS_Core - * @author Uwe Steinmann - * @copyright Copyright (C) 2010-2012 Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_Core_Object { /* {{{ */ - /** - * @var integer unique id of object - */ - protected $_id; - - /** - * @var array list of attributes - */ - protected $_attributes; - - /** - * @var SeedDMS_Core_DMS back reference to document management system - */ - public $_dms; - - /** - * SeedDMS_Core_Object constructor. - * @param $id - */ - function __construct($id) { /* {{{ */ - $this->_id = $id; - $this->_dms = null; - } /* }}} */ - - /** - * Check if this object is of a given type. - * - * This method must be implemened in the child class - * - * @param string $type type of object - */ - public function isType($type) {return false;} - - /** - * Set dms this object belongs to. - * - * Each object needs a reference to the dms it belongs to. It will be - * set when the object is created. - * The dms has a references to the currently logged in user - * and the database connection. - * - * @param SeedDMS_Core_DMS $dms reference to dms - */ - public function setDMS($dms) { /* {{{ */ - $this->_dms = $dms; - } /* }}} */ - - public function getDMS() { /* {{{ */ - return $this->_dms; - } /* }}} */ - - /** - * Return the internal id of the document - * - * @return integer id of document - */ - public function getID() { return $this->_id; } - - /** - * Returns all attributes set for the object - * - * @return array|bool - */ - public function getAttributes() { /* {{{ */ - if (!$this->_attributes) { - $db = $this->_dms->getDB(); - - switch(get_class($this)) { - case $this->_dms->getClassname('document'): - $queryStr = "SELECT a.* FROM `tblDocumentAttributes` a LEFT JOIN `tblAttributeDefinitions` b ON a.`attrdef`=b.`id` WHERE a.`document` = " . $this->_id." ORDER BY b.`name`"; - break; - case $this->_dms->getClassname('documentcontent'): - $queryStr = "SELECT a.* FROM `tblDocumentContentAttributes` a LEFT JOIN `tblAttributeDefinitions` b ON a.`attrdef`=b.`id` WHERE a.`content` = " . $this->_id." ORDER BY b.`name`"; - break; - case $this->_dms->getClassname('folder'): - $queryStr = "SELECT a.* FROM `tblFolderAttributes` a LEFT JOIN `tblAttributeDefinitions` b ON a.`attrdef`=b.`id` WHERE a.`folder` = " . $this->_id." ORDER BY b.`name`"; - break; - default: - return false; - } - $resArr = $db->getResultArray($queryStr); - if (is_bool($resArr) && !$resArr) return false; - - $this->_attributes = array(); - - foreach ($resArr as $row) { - $attrdef = $this->_dms->getAttributeDefinition($row['attrdef']); - $attr = new SeedDMS_Core_Attribute($row["id"], $this, $attrdef, $row["value"]); - $attr->setDMS($this->_dms); - $this->_attributes[$attrdef->getId()] = $attr; - } - } - return $this->_attributes; - - } /* }}} */ - - /** - * Returns an attribute of the object for the given attribute definition - * - * @param SeedDMS_Core_AttributeDefinition $attrdef - * @return array|string value of attritbute or false. The value is an array - * if the attribute is defined as multi value - */ - public function getAttribute($attrdef) { /* {{{ */ - if (!$this->_attributes) { - $this->getAttributes(); - } - - if (isset($this->_attributes[$attrdef->getId()])) { - return $this->_attributes[$attrdef->getId()]; - } else { - return false; - } - - } /* }}} */ - - /** - * Returns an attribute value of the object for the given attribute definition - * - * @param SeedDMS_Core_AttributeDefinition $attrdef - * @return array|string value of attritbute or false. The value is an array - * if the attribute is defined as multi value - */ - public function getAttributeValue($attrdef) { /* {{{ */ - if (!$this->_attributes) { - $this->getAttributes(); - } - - if (isset($this->_attributes[$attrdef->getId()])) { - $value = $this->_attributes[$attrdef->getId()]->getValue(); - if($attrdef->getMultipleValues()) { - $sep = substr($value, 0, 1); - $vsep = $attrdef->getValueSetSeparator(); - /* If the value doesn't start with the separator used in the value set, - * then assume that the value was not saved with a leading separator. - * This can happen, if the value was previously a single value from - * the value set and later turned into a multi value attribute. - */ - if($sep == $vsep) - return(explode($sep, substr($value, 1))); - else - return(array($value)); - } else { - return $this->_attributes[$attrdef->getId()]->getParsedValue(); - } - } else - return false; - - } /* }}} */ - - /** - * Returns an attribute value of the object for the given attribute definition - * - * This is a short cut for getAttribute($attrdef)->getValueAsArray() but - * first checks if the object has an attribute for the given attribute - * definition. - * - * @param SeedDMS_Core_AttributeDefinition $attrdef - * @return array|bool - * even if the attribute is not defined as multi value - */ - public function getAttributeValueAsArray($attrdef) { /* {{{ */ - if (!$this->_attributes) { - $this->getAttributes(); - } - - if (isset($this->_attributes[$attrdef->getId()])) { - return $this->_attributes[$attrdef->getId()]->getValueAsArray(); - } else - return false; - - } /* }}} */ - - /** - * Returns an attribute value of the object for the given attribute definition - * - * This is a short cut for getAttribute($attrdef)->getValueAsString() but - * first checks if the object has an attribute for the given attribute - * definition. - * - * @param SeedDMS_Core_AttributeDefinition $attrdef - * @return string value of attritbute or false. The value is always a string - * even if the attribute is defined as multi value - */ - public function getAttributeValueAsString($attrdef) { /* {{{ */ - if (!$this->_attributes) { - $this->getAttributes(); - } - - if (isset($this->_attributes[$attrdef->getId()])) { - return $this->_attributes[$attrdef->getId()]->getValue(); - } else - return false; - - } /* }}} */ - - /** - * Set an attribute of the object for the given attribute definition - * - * @param SeedDMS_Core_AttributeDefinition $attrdef definition of attribute - * @param array|string $value value of attribute, for multiple values this - * must be an array - * @return boolean true if operation was successful, otherwise false - */ - public function setAttributeValue($attrdef, $value) { /* {{{ */ - $db = $this->_dms->getDB(); - if (!$this->_attributes) { - $this->getAttributes(); - } - switch($attrdef->getType()) { - case SeedDMS_Core_AttributeDefinition::type_boolean: - $value = ($value === true || $value != '' || $value == 1) ? 1 : 0; - break; - } - if($attrdef->getMultipleValues() && is_array($value)) { - if(in_array($attrdef->getType(), array(SeedDMS_Core_AttributeDefinition::type_user, SeedDMS_Core_AttributeDefinition::type_group))) - $sep = ','; - else - $sep = substr($attrdef->getValueSet(), 0, 1); - $value = $sep.implode($sep, $value); - } - /* Handle the case if an attribute is not set already */ - if(!isset($this->_attributes[$attrdef->getId()])) { - switch(get_class($this)) { - case $this->_dms->getClassname('document'): - $tablename = 'tblDocumentAttributes'; - $queryStr = "INSERT INTO `tblDocumentAttributes` (`document`, `attrdef`, `value`) VALUES (".$this->_id.", ".$attrdef->getId().", ".$db->qstr($value).")"; - break; - case $this->_dms->getClassname('documentcontent'): - $tablename = 'tblDocumentContentAttributes'; - $queryStr = "INSERT INTO `tblDocumentContentAttributes` (`content`, `attrdef`, `value`) VALUES (".$this->_id.", ".$attrdef->getId().", ".$db->qstr($value).")"; - break; - case $this->_dms->getClassname('folder'): - $tablename = 'tblFolderAttributes'; - $queryStr = "INSERT INTO `tblFolderAttributes` (`folder`, `attrdef`, `value`) VALUES (".$this->_id.", ".$attrdef->getId().", ".$db->qstr($value).")"; - break; - default: - return false; - } - $res = $db->getResult($queryStr); - if (!$res) - return false; - - $attr = new SeedDMS_Core_Attribute($db->getInsertID($tablename), $this, $attrdef, $value); - $attr->setDMS($this->_dms); - $this->_attributes[$attrdef->getId()] = $attr; - - /* Check if 'onPostAddAttribute' callback is set */ - if(isset($this->_dms->callbacks['onPostAddAttribute'])) { - foreach($this->_dms->callbacks['onPostAddAttribute'] as $callback) { - if(!call_user_func($callback[0], $callback[1], $this, $attrdef, $value)) { - } - } - } - - return true; - } - - /* The attribute already exists. setValue() will either update or delete it. */ - $this->_attributes[$attrdef->getId()]->setValue($value); - - return true; - } /* }}} */ - - /** - * Remove an attribute of the object for the given attribute definition - * @param SeedDMS_Core_AttributeDefinition $attrdef - * @return boolean true if operation was successful, otherwise false - */ - public function removeAttribute($attrdef) { /* {{{ */ - $db = $this->_dms->getDB(); - if (!$this->_attributes) { - $this->getAttributes(); - } - if(isset($this->_attributes[$attrdef->getId()])) { - $oldvalue = $this->_attributes[$attrdef->getId()]->getValue(); - switch(get_class($this)) { - case $this->_dms->getClassname('document'): - $queryStr = "DELETE FROM `tblDocumentAttributes` WHERE `document`=".$this->_id." AND `attrdef`=".$attrdef->getId(); - break; - case $this->_dms->getClassname('documentcontent'): - $queryStr = "DELETE FROM `tblDocumentContentAttributes` WHERE `content`=".$this->_id." AND `attrdef`=".$attrdef->getId(); - break; - case $this->_dms->getClassname('folder'): - $queryStr = "DELETE FROM `tblFolderAttributes` WHERE `folder`=".$this->_id." AND `attrdef`=".$attrdef->getId(); - break; - default: - return false; - } - $res = $db->getResult($queryStr); - if (!$res) - return false; - - /* Check if 'onPostRemoveAttribute' callback is set */ - if(isset($this->_dms->callbacks['onPostRemoveAttribute'])) { - foreach($this->_dms->callbacks['onPostRemoveAttribute'] as $callback) { - if(!call_user_func($callback[0], $callback[1], $this, $attrdef, $oldvalue)) { - } - } - } - - unset($this->_attributes[$attrdef->getId()]); - } - return true; - } /* }}} */ -} /* }}} */ diff --git a/SeedDMS_Core/Core/inc.FileUtils.php b/SeedDMS_Core/Core/inc.FileUtils.php deleted file mode 100644 index 43289fce8..000000000 --- a/SeedDMS_Core/Core/inc.FileUtils.php +++ /dev/null @@ -1,529 +0,0 @@ - - * @copyright Copyright (C) 2002-2005 Markus Westphal, - * 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli, - * 2010-2022 Uwe Steinmann - * @version Release: @package_version@ - */ - -/** - * Class to file operation in the document management system - * Use the methods of this class only for files below the content - * directory but not for temporäry files, cache files or log files. - * - * @category DMS - * @package SeedDMS_Core - * @author Markus Westphal, Malcolm Cowe, Uwe Steinmann - * @copyright Copyright (C) 2002-2005 Markus Westphal, - * 2006-2008 Malcolm Cowe, 2010 Matteo Lucarelli, - * 2010-2022 Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_Core_File { - /** - * @param $old - * @param $new - * @return bool - */ - static function renameFile($old, $new) { /* {{{ */ - return @rename($old, $new); - } /* }}} */ - - /** - * @param $file - * @return bool - */ - static function removeFile($file) { /* {{{ */ - return @unlink($file); - } /* }}} */ - - /** - * @param $source - * @param $target - * @return bool - */ - static function copyFile($source, $target) { /* {{{ */ - return @copy($source, $target); - } /* }}} */ - - /** - * @param $source - * @param $target - * @return bool - */ - static function moveFile($source, $target) { /* {{{ */ - /** @noinspection PhpUndefinedFunctionInspection */ - if (!self::copyFile($source, $target)) - return false; - /** @noinspection PhpUndefinedFunctionInspection */ - return self::removeFile($source); - } /* }}} */ - - /** - * @param $file - * @return bool|int - */ - static function fileSize($file) { /* {{{ */ - if(!$a = @fopen($file, 'r')) - return false; - fseek($a, 0, SEEK_END); - $filesize = ftell($a); - fclose($a); - return $filesize; - } /* }}} */ - - /** - * Return the mimetype of a given file - * - * This method uses finfo to determine the mimetype - * but will correct some mimetypes which are - * not propperly determined or could be more specific, e.g. text/plain - * when it is actually text/markdown. In thoses cases - * the file extension will be taken into account. - * - * @param string $filename name of file on disc - * @return string mimetype - */ - static function mimetype($filename) { /* {{{ */ - $finfo = finfo_open(FILEINFO_MIME_TYPE); - $mimetype = finfo_file($finfo, $filename); - - switch($mimetype) { - case 'application/octet-stream': - case 'text/plain': - $lastDotIndex = strrpos($filename, "."); - if($lastDotIndex === false) $fileType = "."; - else $fileType = substr($filename, $lastDotIndex); - if($fileType == '.md') - $mimetype = 'text/markdown'; - break; - } - return $mimetype; - } /* }}} */ - - /** - * @param integer $size - * @param array $sizes list of units for 10^0, 10^3, 10^6, ..., 10^(n*3) bytes - * @return string - */ - static function format_filesize($size, $sizes = array('Bytes', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB')) { /* {{{ */ - if ($size == 0) return('0 Bytes'); - if ($size == 1) return('1 Byte'); - /** @noinspection PhpIllegalArrayKeyTypeInspection */ - return (round($size/pow(1024, ($i = floor(log($size, 1024)))), 2) . ' ' . $sizes[$i]); - } /* }}} */ - - /** - * Parses a string like '[0-9]+ *[BKMGT]*' into an integer - * B,K,M,G,T stand for byte, kilo byte, mega byte, giga byte, tera byte - * If the last character is omitted, bytes are assumed. - * - * @param $str - * @return bool|int - */ - static function parse_filesize($str) { /* {{{ */ - if(!preg_match('/^([0-9]+) *([BKMGT]*)$/', trim($str), $matches)) - return false; - $value = $matches[1]; - $unit = $matches[2] ? $matches[2] : 'B'; - switch($unit) { - case 'T': - return $value * 1024 * 1024 * 1024 *1024; - break; - case 'G': - return $value * 1024 * 1024 * 1024; - break; - case 'M': - return $value * 1024 * 1024; - break; - case 'K': - return $value * 1024; - break; - default; - return (int) $value; - break; - } - /** @noinspection PhpUnreachableStatementInspection */ - return false; - } /* }}} */ - - /** - * @param $file - * @return string - */ - static function file_exists($file) { /* {{{ */ - return file_exists($file); - } /* }}} */ - - /** - * @param $file - * @return string - */ - static function checksum($file) { /* {{{ */ - return md5_file($file); - } /* }}} */ - - /** - * @param $string mimetype - * @return string file extension with the dot or an empty string - */ - static function fileExtension($mimetype) { /* {{{ */ - switch($mimetype) { - case "application/pdf": - case "image/png": - case "image/gif": - case "image/jpg": - $expect = substr($mimetype, -3, 3); - break; - default: - $mime_map = [ - 'video/3gpp2' => '3g2', - 'video/3gp' => '3gp', - 'video/3gpp' => '3gp', - 'application/x-compressed' => '7zip', - 'audio/x-acc' => 'aac', - 'audio/ac3' => 'ac3', - 'application/postscript' => 'ai', - 'audio/x-aiff' => 'aif', - 'audio/aiff' => 'aif', - 'audio/x-au' => 'au', - 'video/x-msvideo' => 'avi', - 'video/msvideo' => 'avi', - 'video/avi' => 'avi', - 'application/x-troff-msvideo' => 'avi', - 'application/macbinary' => 'bin', - 'application/mac-binary' => 'bin', - 'application/x-binary' => 'bin', - 'application/x-macbinary' => 'bin', - 'image/bmp' => 'bmp', - 'image/x-bmp' => 'bmp', - 'image/x-bitmap' => 'bmp', - 'image/x-xbitmap' => 'bmp', - 'image/x-win-bitmap' => 'bmp', - 'image/x-windows-bmp' => 'bmp', - 'image/ms-bmp' => 'bmp', - 'image/x-ms-bmp' => 'bmp', - 'application/bmp' => 'bmp', - 'application/x-bmp' => 'bmp', - 'application/x-win-bitmap' => 'bmp', - 'application/cdr' => 'cdr', - 'application/coreldraw' => 'cdr', - 'application/x-cdr' => 'cdr', - 'application/x-coreldraw' => 'cdr', - 'image/cdr' => 'cdr', - 'image/x-cdr' => 'cdr', - 'zz-application/zz-winassoc-cdr' => 'cdr', - 'application/mac-compactpro' => 'cpt', - 'application/pkix-crl' => 'crl', - 'application/pkcs-crl' => 'crl', - 'application/x-x509-ca-cert' => 'crt', - 'application/pkix-cert' => 'crt', - 'text/css' => 'css', - 'text/x-comma-separated-values' => 'csv', - 'text/comma-separated-values' => 'csv', - 'application/vnd.msexcel' => 'csv', - 'application/x-director' => 'dcr', - 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' => 'docx', - 'application/x-dvi' => 'dvi', - 'message/rfc822' => 'eml', - 'application/x-msdownload' => 'exe', - 'video/x-f4v' => 'f4v', - 'audio/x-flac' => 'flac', - 'video/x-flv' => 'flv', - 'image/gif' => 'gif', - 'application/gpg-keys' => 'gpg', - 'application/x-gtar' => 'gtar', - 'application/x-gzip' => 'gzip', - 'application/mac-binhex40' => 'hqx', - 'application/mac-binhex' => 'hqx', - 'application/x-binhex40' => 'hqx', - 'application/x-mac-binhex40' => 'hqx', - 'text/html' => 'html', - 'image/x-icon' => 'ico', - 'image/x-ico' => 'ico', - 'image/vnd.microsoft.icon' => 'ico', - 'text/calendar' => 'ics', - 'application/java-archive' => 'jar', - 'application/x-java-application' => 'jar', - 'application/x-jar' => 'jar', - 'image/jp2' => 'jp2', - 'video/mj2' => 'jp2', - 'image/jpx' => 'jp2', - 'image/jpm' => 'jp2', - 'image/jpeg' => 'jpeg', - 'image/pjpeg' => 'jpeg', - 'application/x-javascript' => 'js', - 'application/json' => 'json', - 'text/json' => 'json', - 'application/vnd.google-earth.kml+xml' => 'kml', - 'application/vnd.google-earth.kmz' => 'kmz', - 'text/x-log' => 'log', - 'audio/x-m4a' => 'm4a', - 'application/vnd.mpegurl' => 'm4u', - 'text/markdown' => 'md', - 'audio/midi' => 'mid', - 'application/vnd.mif' => 'mif', - 'video/quicktime' => 'mov', - 'video/x-sgi-movie' => 'movie', - 'audio/mpeg' => 'mp3', - 'audio/mpg' => 'mp3', - 'audio/mpeg3' => 'mp3', - 'audio/mp3' => 'mp3', - 'video/mp4' => 'mp4', - 'video/mpeg' => 'mpeg', - 'application/oda' => 'oda', - 'audio/ogg' => 'ogg', - 'video/ogg' => 'ogg', - 'application/ogg' => 'ogg', - 'application/x-pkcs10' => 'p10', - 'application/pkcs10' => 'p10', - 'application/x-pkcs12' => 'p12', - 'application/x-pkcs7-signature' => 'p7a', - 'application/pkcs7-mime' => 'p7c', - 'application/x-pkcs7-mime' => 'p7c', - 'application/x-pkcs7-certreqresp' => 'p7r', - 'application/pkcs7-signature' => 'p7s', - 'application/pdf' => 'pdf', - 'application/octet-stream' => 'pdf', - 'application/x-x509-user-cert' => 'pem', - 'application/x-pem-file' => 'pem', - 'application/pgp' => 'pgp', - 'application/x-httpd-php' => 'php', - 'application/php' => 'php', - 'application/x-php' => 'php', - 'text/php' => 'php', - 'text/x-php' => 'php', - 'application/x-httpd-php-source' => 'php', - 'image/png' => 'png', - 'image/x-png' => 'png', - 'application/powerpoint' => 'ppt', - 'application/vnd.ms-powerpoint' => 'ppt', - 'application/vnd.ms-office' => 'ppt', - 'application/msword' => 'doc', - 'application/vnd.openxmlformats-officedocument.presentationml.presentation' => 'pptx', - 'application/x-photoshop' => 'psd', - 'image/vnd.adobe.photoshop' => 'psd', - 'audio/x-realaudio' => 'ra', - 'audio/x-pn-realaudio' => 'ram', - 'application/x-rar' => 'rar', - 'application/rar' => 'rar', - 'application/x-rar-compressed' => 'rar', - 'audio/x-pn-realaudio-plugin' => 'rpm', - 'application/x-pkcs7' => 'rsa', - 'text/rtf' => 'rtf', - 'text/richtext' => 'rtx', - 'video/vnd.rn-realvideo' => 'rv', - 'application/x-stuffit' => 'sit', - 'application/smil' => 'smil', - 'text/srt' => 'srt', - 'image/svg+xml' => 'svg', - 'application/x-shockwave-flash' => 'swf', - 'application/x-tar' => 'tar', - 'application/x-gzip-compressed' => 'tgz', - 'image/tiff' => 'tiff', - 'text/plain' => 'txt', - 'text/x-vcard' => 'vcf', - 'application/videolan' => 'vlc', - 'text/vtt' => 'vtt', - 'audio/x-wav' => 'wav', - 'audio/wave' => 'wav', - 'audio/wav' => 'wav', - 'application/wbxml' => 'wbxml', - 'video/webm' => 'webm', - 'audio/x-ms-wma' => 'wma', - 'application/wmlc' => 'wmlc', - 'video/x-ms-wmv' => 'wmv', - 'video/x-ms-asf' => 'wmv', - 'application/xhtml+xml' => 'xhtml', - 'application/excel' => 'xl', - 'application/msexcel' => 'xls', - 'application/x-msexcel' => 'xls', - 'application/x-ms-excel' => 'xls', - 'application/x-excel' => 'xls', - 'application/x-dos_ms_excel' => 'xls', - 'application/xls' => 'xls', - 'application/x-xls' => 'xls', - 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' => 'xlsx', - 'application/vnd.ms-excel' => 'xlsx', - 'application/xml' => 'xml', - 'text/xml' => 'xml', - 'text/xsl' => 'xsl', - 'application/xspf+xml' => 'xspf', - 'application/x-compress' => 'z', - 'application/x-zip' => 'zip', - 'application/zip' => 'zip', - 'application/x-zip-compressed' => 'zip', - 'application/s-compressed' => 'zip', - 'multipart/x-zip' => 'zip', - 'text/x-scriptzsh' => 'zsh', - ]; - $expect = isset($mime_map[$mimetype]) === true ? $mime_map[$mimetype] : ''; - } - return $expect; - } /* }}} */ - - /** - * @param $old - * @param $new - * @return bool - */ - static function renameDir($old, $new) { /* {{{ */ - return @rename($old, $new); - } /* }}} */ - - /** - * @param $path - * @return bool - */ - static function makeDir($path) { /* {{{ */ - - if( !is_dir( $path ) ){ - $res=@mkdir( $path , 0777, true); - if (!$res) return false; - } - - return true; - -/* some old code - if (strncmp($path, DIRECTORY_SEPARATOR, 1) == 0) { - $mkfolder = DIRECTORY_SEPARATOR; - } - else { - $mkfolder = ""; - } - $path = preg_split( "/[\\\\\/]/" , $path ); - for( $i=0 ; isset( $path[$i] ) ; $i++ ) - { - if(!strlen(trim($path[$i])))continue; - $mkfolder .= $path[$i]; - - if( !is_dir( $mkfolder ) ){ - $res=@mkdir( "$mkfolder" , 0777); - if (!$res) return false; - } - $mkfolder .= DIRECTORY_SEPARATOR; - } - - return true; - - // patch from alekseynfor safe_mod or open_basedir - - global $settings; - $path = substr_replace ($path, "/", 0, strlen($settings->_contentDir)); - $mkfolder = $settings->_contentDir; - - $path = preg_split( "/[\\\\\/]/" , $path ); - - for( $i=0 ; isset( $path[$i] ) ; $i++ ) - { - if(!strlen(trim($path[$i])))continue; - $mkfolder .= $path[$i]; - - if( !is_dir( $mkfolder ) ){ - $res= @mkdir( "$mkfolder" , 0777); - if (!$res) return false; - } - $mkfolder .= DIRECTORY_SEPARATOR; - } - - return true; -*/ - } /* }}} */ - - /** - * @param $path - * @return bool - */ - static function removeDir($path) { /* {{{ */ - $handle = @opendir($path); - while ($entry = @readdir($handle) ) - { - if ($entry == ".." || $entry == ".") - continue; - else if (is_dir($path . DIRECTORY_SEPARATOR . $entry)) - { - if (!self::removeDir($path . DIRECTORY_SEPARATOR . $entry )) - return false; - } - else - { - if (!@unlink($path . DIRECTORY_SEPARATOR . $entry)) - return false; - } - } - @closedir($handle); - return @rmdir($path); - } /* }}} */ - - /** - * @param $sourcePath - * @param $targetPath - * @return bool - */ - static function copyDir($sourcePath, $targetPath) { /* {{{ */ - if (mkdir($targetPath, 0777)) { - $handle = @opendir($sourcePath); - while ($entry = @readdir($handle) ) { - if ($entry == ".." || $entry == ".") - continue; - else if (is_dir($sourcePath . $entry)) { - if (!self::copyDir($sourcePath . DIRECTORY_SEPARATOR . $entry, $targetPath . DIRECTORY_SEPARATOR . $entry)) - return false; - } else { - if (!@copy($sourcePath . DIRECTORY_SEPARATOR . $entry, $targetPath . DIRECTORY_SEPARATOR . $entry)) - return false; - } - } - @closedir($handle); - } - else - return false; - - return true; - } /* }}} */ - - /** - * @param $sourcePath - * @param $targetPath - * @return bool - */ - static function moveDir($sourcePath, $targetPath) { /* {{{ */ - /** @noinspection PhpUndefinedFunctionInspection */ - if (!self::copyDir($sourcePath, $targetPath)) - return false; - /** @noinspection PhpUndefinedFunctionInspection */ - return self::removeDir($sourcePath); - } /* }}} */ - - // code by Kioob (php.net manual) - /** - * @param $source - * @param bool $level - * @return bool|string - */ - static function gzcompressfile($source, $level=false) { /* {{{ */ - $dest=$source.'.gz'; - $mode='wb'.$level; - $error=false; - if($fp_out=@gzopen($dest,$mode)) { - if($fp_in=@fopen($source,'rb')) { - while(!feof($fp_in)) - @gzwrite($fp_out,fread($fp_in,1024*512)); - @fclose($fp_in); - } - else $error=true; - @gzclose($fp_out); - } - else $error=true; - - if($error) return false; - else return $dest; - } /* }}} */ -} diff --git a/SeedDMS_Core/bootstrap-5.php b/SeedDMS_Core/bootstrap-5.php deleted file mode 100644 index 5d0d0e4a5..000000000 --- a/SeedDMS_Core/bootstrap-5.php +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/SeedDMS_Core/oldtests/getfoldertree.php b/SeedDMS_Core/oldtests/getfoldertree.php deleted file mode 100644 index a5f12f160..000000000 --- a/SeedDMS_Core/oldtests/getfoldertree.php +++ /dev/null @@ -1,25 +0,0 @@ -connect() or die ("Could not connect to db-server \"" . $g_config['hostname'] . "\""); - -$dms = new SeedDMS_Core_DMS($db, $g_config['contentDir'], $g_config['contentOffsetDir']); - -function tree($folder, $indent='') { - echo $indent."D ".$folder->getName()."\n"; - $subfolders = $folder->getSubFolders(); - foreach($subfolders as $subfolder) { - tree($subfolder, $indent.' '); - } - $documents = $folder->getDocuments(); - foreach($documents as $document) { - echo $indent." ".$document->getName()."\n"; - } -} - -$folder = $dms->getFolder(1); -tree($folder); - -?> diff --git a/SeedDMS_Core/oldtests/getusers.php b/SeedDMS_Core/oldtests/getusers.php deleted file mode 100644 index 083718ab2..000000000 --- a/SeedDMS_Core/oldtests/getusers.php +++ /dev/null @@ -1,14 +0,0 @@ -connect() or die ("Could not connect to db-server \"" . $g_config['hostname'] . "\""); - -$dms = new SeedDMS_Core_DMS($db, $g_config['contentDir'], $g_config['contentOffsetDir']); - -$users = $dms->getAllUsers(); -foreach($users as $user) - echo $user->getId()." ".$user->getLogin()." ".$user->getFullname()."\n"; - -?> diff --git a/SeedDMS_Core/oldtests/reverselookup.php b/SeedDMS_Core/oldtests/reverselookup.php deleted file mode 100644 index 93abec009..000000000 --- a/SeedDMS_Core/oldtests/reverselookup.php +++ /dev/null @@ -1,44 +0,0 @@ -connect() or die ("Could not connect to db-server \"" . $g_config['hostname'] . "\""); - -$dms = new SeedDMS_Core_DMS($db, $g_config['contentDir'], $g_config['contentOffsetDir']); - -$path = '/Test 1/'; -echo "Searching for folder or document with path '".$path."'\n"; - -$root = $dms->getRootFolder(); -if($path[0] == '/') { - $path = substr($path, 1); -} -$patharr = explode('/', $path); -/* The last entry is always the document, though if the path ends in '/' the - * document name will be empty. - */ -$docname = array_pop($patharr); -$parentfolder = $root; - -foreach($patharr as $pathseg) { - if($folder = $dms->getFolderByName($pathseg, $parentfolder)) { - $parentfolder = $folder; - } -} -if($folder) { - if($docname) { - if($document = $dms->getDocumentByName($docname, $folder)) { - echo "Given path is document '".$document->getName()."'\n"; - } else { - echo "No object found\n"; - } - } else { - echo "Given path is a folder '".$folder->getName()."'\n"; - } -} else { - echo "No object found\n"; -} - -?> - diff --git a/SeedDMS_Core/phpunit.xml b/SeedDMS_Core/phpunit.xml deleted file mode 100644 index 103f11089..000000000 --- a/SeedDMS_Core/phpunit.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - tests - - - - - - Core - - - diff --git a/SeedDMS_Core/tests/.phpunit.result.cache b/SeedDMS_Core/tests/.phpunit.result.cache deleted file mode 100644 index 007ae03d8..000000000 --- a/SeedDMS_Core/tests/.phpunit.result.cache +++ /dev/null @@ -1 +0,0 @@ -C:37:"PHPUnit\Runner\DefaultTestResultCache":106:{a:2:{s:7:"defects";a:1:{s:17:"DmsTest::testInit";i:3;}s:5:"times";a:1:{s:17:"DmsTest::testInit";d:0.002;}}} \ No newline at end of file diff --git a/SeedDMS_Core/tests/AttributeDefinitionTest.php b/SeedDMS_Core/tests/AttributeDefinitionTest.php deleted file mode 100644 index f6276e536..000000000 --- a/SeedDMS_Core/tests/AttributeDefinitionTest.php +++ /dev/null @@ -1,574 +0,0 @@ - - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version @package_version@ - * @link https://www.seeddms.org - */ - -use PHPUnit\Framework\TestCase; - -/** - * Attribute definition test class - * - * @category SeedDMS - * @package Tests - * @author Uwe Steinmann - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version Release: @package_version@ - * @link https://www.seeddms.org - */ -class AttributeDefinitionTest extends TestCase -{ - - /** - * Create a real dms object with a mocked db - * - * This mock is only used if \SeedDMS_Core_DatabaseAccess::getResult() is - * called once. This is the case for all \SeedDMS_Core_AttributeDefinition::setXXX() - * methods like setName(). - * - * @return \SeedDMS_Core_DMS - */ - protected function getDmsWithMockedDb() : \SeedDMS_Core_DMS - { - $db = $this->createMock(\SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE ")) - ->willReturn(true); - $dms = new \SeedDMS_Core_DMS($db, ''); - return $dms; - } - - /** - * Create a mocked dms - * - * @return \SeedDMS_Core_DMS - */ - protected function getDmsMock() : \SeedDMS_Core_DMS - { - $dms = $this->createMock(\SeedDMS_Core_DMS::class); - $dms->expects($this->any()) - ->method('getDocument') - ->with(1) - ->willReturn(true); - $dms->expects($this->any()) - ->method('getFolder') - ->with(1) - ->willReturn(true); - $dms->expects($this->any()) - ->method('getUser') - ->will( - $this->returnValueMap( - array( - array(1, new \SeedDMS_Core_User(1, 'admin', 'pass', 'Joe Foo', 'baz@foo.de', 'en_GB', 'bootstrap', 'My comment', \SeedDMS_Core_User::role_admin)), - array(2, new \SeedDMS_Core_User(2, 'admin2', 'pass', 'Joe Bar', 'bar@foo.de', 'en_GB', 'bootstrap', 'My comment', \SeedDMS_Core_User::role_admin)), - array(3, null) - ) - ) - ); - $dms->expects($this->any()) - ->method('getGroup') - ->will( - $this->returnValueMap( - array( - array(1, new \SeedDMS_Core_Group(1, 'admin group 1', 'My comment')), - array(2, new \SeedDMS_Core_Group(2, 'admin group 2', 'My comment')), - array(3, null) - ) - ) - ); - return $dms; - } - - /** - * Create a mock attribute definition object - * - * @param int $type type of attribute - * @param boolean $multiple set to true for multi value attributes - * @param int $minvalues minimum number of attribute values - * @param int $maxvalues maximum number of attribute values - * @param string $valueset list of allowed values separated by the first char - * @param string $regex regular expression that must match the attribute value - * - * @return \SeedDMS_Core_AttributeDefinition - */ - protected function getAttributeDefinition($type, $multiple=false, $minvalues=0, $maxvalues=0, $valueset='', $regex='') - { - $attrdef = new \SeedDMS_Core_AttributeDefinition(1, 'foo attr', \SeedDMS_Core_AttributeDefinition::objtype_folder, $type, $multiple, $minvalues, $maxvalues, $valueset, $regex); - return $attrdef; - } - - /** - * Test getId() - * - * @return void - */ - public function testGetId() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_int); - $this->assertEquals(1, $attrdef->getId()); - } - - /** - * Test getName() - * - * @return void - */ - public function testGetName() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_int); - $this->assertEquals('foo attr', $attrdef->getName()); - } - - /** - * Test setName() - * - * @return void - */ - public function testSetName() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_int); - /* A mocked dms is needed for updating the database */ - $attrdef->setDMS(self::getDmsWithMockedDb()); - $attrdef->setName('bar attr'); - $this->assertEquals('bar attr', $attrdef->getName()); - } - - /** - * Test getObjType() - * - * @return void - */ - public function testGetObjType() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_int); - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::objtype_folder, $attrdef->getObjType()); - } - - /** - * Test setObjType() - * - * @return void - */ - public function testSetObjType() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_int); - /* A mocked dms is needed for updating the database */ - $attrdef->setDMS(self::getDmsWithMockedDb()); - $attrdef->setObjType(\SeedDMS_Core_AttributeDefinition::objtype_document); - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::objtype_document, $attrdef->getObjType()); - } - - /** - * Test getType() - * - * @return void - */ - public function testGetType() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_int); - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::type_int, $attrdef->getType()); - } - - /** - * Test setType() - * - * @return void - */ - public function testSetType() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_int); - /* A mocked dms is needed for updating the database */ - $attrdef->setDMS(self::getDmsWithMockedDb()); - $attrdef->setType(\SeedDMS_Core_AttributeDefinition::type_string); - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::type_string, $attrdef->getType()); - } - - /** - * Test getMultipleValues() - * - * @return void - */ - public function testGetMultipleValues() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_int); - $this->assertEquals(false, $attrdef->getMultipleValues()); - } - - /** - * Test setMultipleValues() - * - * @return void - */ - public function testSetMultipleValues() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_int); - /* A mocked dms is needed for updating the database */ - $attrdef->setDMS(self::getDmsWithMockedDb()); - /* Toogle the current value of multiple values */ - $oldvalue = $attrdef->getMultipleValues(); - $attrdef->setMultipleValues(!$oldvalue); - $this->assertEquals(!$oldvalue, $attrdef->getMultipleValues()); - } - - /** - * Test getMinValues() - * - * @return void - */ - public function testGetMinValues() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_int); - $this->assertEquals(0, $attrdef->getMinValues()); - } - - /** - * Test setMinValues() - * - * @return void - */ - public function testSetMinValues() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_int); - /* A mocked dms is needed for updating the database */ - $attrdef->setDMS(self::getDmsWithMockedDb()); - /* add 5 to value of min values */ - $oldvalue = $attrdef->getMinValues(); - $attrdef->setMinValues($oldvalue+5); - $this->assertEquals($oldvalue+5, $attrdef->getMinValues()); - } - - /** - * Test getMaxValues() - * - * @return void - */ - public function testGetMaxValues() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_int); - $this->assertEquals(0, $attrdef->getMaxValues()); - } - - /** - * Test setMaxValues() - * - * @return void - */ - public function testSetMaxValues() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_int); - /* A mocked dms is needed for updating the database */ - $attrdef->setDMS(self::getDmsWithMockedDb()); - /* add 5 to value of max values */ - $oldvalue = $attrdef->getMaxValues(); - $attrdef->setMaxValues($oldvalue+5); - $this->assertEquals($oldvalue+5, $attrdef->getMaxValues()); - } - - /** - * Test getValueSet() - * - * @return void - */ - public function testGetValueSet() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_string, false, 0, 0, '|foo|bar|baz'); - $this->assertEquals('|foo|bar|baz', $attrdef->getValueSet()); - } - - /** - * Test getValueSetSeparator() - * - * @return void - */ - public function testGetValueSetSeparator() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_string, false, 0, 0, '|foo|bar|baz'); - $this->assertEquals('|', $attrdef->getValueSetSeparator()); - /* No value set will return no separator */ - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_int); - $this->assertEmpty($attrdef->getValueSetSeparator()); - /* Even a 1 char value set will return no separator */ - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_string, false, 0, 0, '|'); - $this->assertEmpty($attrdef->getValueSetSeparator()); - /* Multiple users or groups always use a ',' as a separator */ - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_user, true); - $this->assertEquals(',', $attrdef->getValueSetSeparator()); - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_group, true); - $this->assertEquals(',', $attrdef->getValueSetSeparator()); - } - - /** - * Test getValueSetAsArray() - * - * @return void - */ - public function testGetValueSetAsArray() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_string, false, 0, 0, '|foo|bar|baz '); - $valueset = $attrdef->getValueSetAsArray(); - $this->assertIsArray($valueset); - $this->assertCount(3, $valueset); - /* value set must contain 'baz' though 'baz ' was originally set */ - $this->assertContains('baz', $valueset); - /* No value set will return an empty array */ - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_string); - $valueset = $attrdef->getValueSetAsArray(); - $this->assertIsArray($valueset); - $this->assertEmpty($valueset); - } - - /** - * Test getValueSetValue() - * - * @return void - */ - public function testGetValueSetValue() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_string, false, 0, 0, '|foo|bar|baz '); - $this->assertEquals('foo', $attrdef->getValueSetValue(0)); - /* Check if trimming of 'baz ' worked */ - $this->assertEquals('baz', $attrdef->getValueSetValue(2)); - /* Getting the value of a none existing index returns false */ - $this->assertFalse($attrdef->getValueSetValue(3)); - - /* Getting a value from a none existing value set returns false as well */ - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_string); - $this->assertFalse($attrdef->getValueSetValue(0)); - } - - /** - * Test setValueSet() - * - * @return void - */ - public function testSetValueSet() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_int); - /* A mocked dms is needed for updating the database */ - $attrdef->setDMS(self::getDmsWithMockedDb()); - /* add 5 to value of min values */ - $attrdef->setValueSet(' |foo|bar | baz '); - $this->assertEquals('|foo|bar|baz', $attrdef->getValueSet()); - } - - /** - * Test getRegex() - * - * @return void - */ - public function testGetRegex() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_string, false, 0, 0, '', '[0-9].*'); - $this->assertEquals('[0-9].*', $attrdef->getRegex()); - } - - /** - * Test setRegex() - * - * @return void - */ - public function testSetRegex() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_string); - /* A mocked dms is needed for updating the database */ - $attrdef->setDMS(self::getDmsWithMockedDb()); - /* set a new valid regex */ - $this->assertTrue($attrdef->setRegex(' /[0-9].*/i ')); - $this->assertEquals('/[0-9].*/i', $attrdef->getRegex()); - /* set a new invalid regex will return false and keep the old regex */ - $this->assertFalse($attrdef->setRegex(' /([0-9].*/i ')); - $this->assertEquals('/[0-9].*/i', $attrdef->getRegex()); - } - - /** - * Test setEmptyRegex() - * - * @return void - */ - public function testSetEmptyRegex() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_string); - /* A mocked dms is needed for updating the database */ - $attrdef->setDMS(self::getDmsWithMockedDb()); - /* set an empty regex */ - $this->assertTrue($attrdef->setRegex('')); - } - - /** - * Test parseValue() - * - * @return void - */ - public function testParseValue() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_string); - $value = $attrdef->parseValue('foo'); - $this->assertIsArray($value); - $this->assertCount(1, $value); - $this->assertContains('foo', $value); - /* An attribute definition with multiple values will split the value by the first char */ - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_string, true, 0, 0, '|baz|bar|foo'); - $value = $attrdef->parseValue('|bar|baz'); - $this->assertIsArray($value); - $this->assertCount(2, $value); - /* An attribute definition without multiple values, will treat the value as a string */ - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_string, false, 0, 0, '|baz|bar|foo'); - $value = $attrdef->parseValue('|bar|baz'); - $this->assertIsArray($value); - $this->assertCount(1, $value); - $this->assertContains('|bar|baz', $value); - } - - /** - * Test validate() - * - * @TODO Instead of having a lengthy list of assert calls, this could be - * implemented with data providers for each attribute type - * - * @return void - */ - public function testValidate() - { - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_string); - $this->assertTrue($attrdef->validate('')); // even an empty string is valid - $this->assertTrue($attrdef->validate('foo')); // there is no invalid string - - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_string, false, 0, 0, '', '/[0-9]*S/'); - $this->assertFalse($attrdef->validate('foo')); // doesn't match the regex - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_regex, $attrdef->getValidationError()); - $this->assertTrue($attrdef->validate('S')); // no leading numbers needed - $this->assertTrue($attrdef->validate('8980S')); // leading numbers are ok - - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_string, false, 0, 0, '|foo|bar|baz', ''); - $this->assertTrue($attrdef->validate('foo')); // is part of value map - $this->assertFalse($attrdef->validate('foz')); // is not part of value map - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_valueset, $attrdef->getValidationError()); - - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_string, true, 0, 0, '|foo|bar|baz', ''); - $this->assertTrue($attrdef->validate('foo')); // is part of value map - $this->assertFalse($attrdef->validate('')); // an empty value cannot be in the valueset - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_valueset, $attrdef->getValidationError()); - $this->assertTrue($attrdef->validate('|foo|baz')); // both are part of value map - $this->assertFalse($attrdef->validate('|foz|baz')); // 'foz' is not part of value map - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_valueset, $attrdef->getValidationError()); - - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_string, true, 1, 1, '|foo|bar|baz', ''); - $this->assertTrue($attrdef->validate('foo')); // is part of value map - $this->assertFalse($attrdef->validate('')); // empty string is invalid because of min values = 1 - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_min_values, $attrdef->getValidationError()); - $this->assertFalse($attrdef->validate('|foo|baz')); // both are part of value map, but only value is allowed - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_max_values, $attrdef->getValidationError()); - - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_boolean); - $this->assertTrue($attrdef->validate(0)); - $this->assertTrue($attrdef->validate(1)); - $this->assertFalse($attrdef->validate(2)); - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_boolean, $attrdef->getValidationError()); - - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_int); - $this->assertTrue($attrdef->validate(0)); - $this->assertTrue($attrdef->validate('0')); - $this->assertFalse($attrdef->validate('a')); - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_int, $attrdef->getValidationError()); - - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_date); - $this->assertTrue($attrdef->validate('2021-09-30')); - $this->assertTrue($attrdef->validate('1968-02-29')); // 1968 was a leap year - $this->assertTrue($attrdef->validate('2000-02-29')); // 2000 was a leap year - $this->assertFalse($attrdef->validate('1900-02-29')); // 1900 didn't was a leap year - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_date, $attrdef->getValidationError()); - $this->assertFalse($attrdef->validate('1970-02-29')); // 1970 didn't was a leap year - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_date, $attrdef->getValidationError()); - $this->assertFalse($attrdef->validate('2010/02/28')); // This has the wrong format - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_date, $attrdef->getValidationError()); - $this->assertFalse($attrdef->validate('1970-00-29')); // 0 month is not allowed - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_date, $attrdef->getValidationError()); - $this->assertFalse($attrdef->validate('1970-01-00')); // 0 day is not allowed - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_date, $attrdef->getValidationError()); - - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_float); - $this->assertTrue($attrdef->validate('0.567')); - $this->assertTrue($attrdef->validate('1000')); - $this->assertTrue($attrdef->validate('1000e3')); - $this->assertTrue($attrdef->validate('1000e-3')); - $this->assertTrue($attrdef->validate('-1000')); - $this->assertTrue($attrdef->validate('+1000')); - $this->assertFalse($attrdef->validate('0,567')); // wrong decimal point - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_float, $attrdef->getValidationError()); - $this->assertFalse($attrdef->validate('0.56.7')); // two decimal point - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_float, $attrdef->getValidationError()); - - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_email); - $this->assertTrue($attrdef->validate('info@seeddms.org')); - $this->assertTrue($attrdef->validate('info@seeddms.verylongtopleveldomain')); - $this->assertFalse($attrdef->validate('@seeddms.org')); // no user - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_email, $attrdef->getValidationError()); - $this->assertFalse($attrdef->validate('info@localhost')); // no tld - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_email, $attrdef->getValidationError()); - $this->assertFalse($attrdef->validate('info@@seeddms.org')); // double @ - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_email, $attrdef->getValidationError()); - $this->assertTrue($attrdef->validate('info@subsubdomain.subdomain.seeddms.org')); // multiple subdomains are ok - $this->assertFalse($attrdef->validate('info@seeddms..org')); // double . is not allowed - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_email, $attrdef->getValidationError()); - $this->assertFalse($attrdef->validate('info@s.org')); // 2nd level domain name is too short - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_email, $attrdef->getValidationError()); - $this->assertFalse($attrdef->validate('info@seeddms.o')); // top level domain name is too short - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_email, $attrdef->getValidationError()); - $this->assertTrue($attrdef->validate('info@0123456789-0123456789-0123456789-0123456789-0123456789-01234567.org')); // domain name is 63 chars long, which is the max length - $this->assertFalse($attrdef->validate('info@0123456789-0123456789-0123456789-0123456789-0123456789-012345678.org')); // domain name is 1 char longer than 63 chars - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_email, $attrdef->getValidationError()); - - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_url); - $this->assertTrue($attrdef->validate('http://seeddms.org')); - $this->assertTrue($attrdef->validate('https://seeddms.org')); - $this->assertFalse($attrdef->validate('ftp://seeddms.org')); // ftp is not allowed - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_url, $attrdef->getValidationError()); - $this->assertTrue($attrdef->validate('http://localhost')); // no tld is just fine - $this->assertFalse($attrdef->validate('http://localhost.o')); // tld is to short - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_url, $attrdef->getValidationError()); - - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_user); - $attrdef->setDMS(self::getDmsMock()); - $this->assertTrue($attrdef->validate(1)); - $this->assertFalse($attrdef->validate(3)); - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_user, $attrdef->getValidationError()); - - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_group); - $attrdef->setDMS(self::getDmsMock()); - $this->assertTrue($attrdef->validate('1')); - $this->assertTrue($attrdef->validate('2')); - $this->assertFalse($attrdef->validate('3')); // there is no group with id=3 - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_group, $attrdef->getValidationError()); - - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_group, true); - $attrdef->setDMS(self::getDmsMock()); - $this->assertTrue($attrdef->validate(',1,2')); - $this->assertFalse($attrdef->validate(',1,2,3')); // there is no group with id=3 - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_group, $attrdef->getValidationError()); - - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_user); - $attrdef->setDMS(self::getDmsMock()); - $this->assertTrue($attrdef->validate('1')); - $this->assertTrue($attrdef->validate('2')); - $this->assertFalse($attrdef->validate('3')); // there is no user with id=3 - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_user, $attrdef->getValidationError()); - - $attrdef = self::getAttributeDefinition(\SeedDMS_Core_AttributeDefinition::type_user, true); - $attrdef->setDMS(self::getDmsMock()); - $this->assertTrue($attrdef->validate(',1,2')); - $this->assertFalse($attrdef->validate(',1,2,3')); // there is no user with id=3 - $this->assertEquals(\SeedDMS_Core_AttributeDefinition::val_error_user, $attrdef->getValidationError()); - } - -} diff --git a/SeedDMS_Core/tests/AttributeTest.php b/SeedDMS_Core/tests/AttributeTest.php deleted file mode 100644 index 66d7dba84..000000000 --- a/SeedDMS_Core/tests/AttributeTest.php +++ /dev/null @@ -1,155 +0,0 @@ - - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version @package_version@ - * @link https://www.seeddms.org - */ - -use PHPUnit\Framework\TestCase; - -/** - * Attribute and attribute definition test class - * - * @category SeedDMS - * @package Tests - * @author Uwe Steinmann - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version Release: @package_version@ - * @link https://www.seeddms.org - */ -class AttributeTest extends TestCase -{ - - /** - * Create a mock dms object - * - * @return SeedDMS_Core_DMS - */ - protected function getMockDMS() : SeedDMS_Core_DMS - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->any()) - ->method('getResult') - ->with($this->stringContains("UPDATE ")) - ->willReturn(true); - $dms = new SeedDMS_Core_DMS($db, ''); - return $dms; - } - - /** - * Create a mock attribute definition object - * - * @param int $type type of attribute - * @param boolean $multiple true if multiple values are allowed - * @param int $minvalues minimum number of required values - * @param int $maxvalues maximum number of required value - * @param string $valueset list of allowed values separated by the first char - * @param string $regex regular expression the attribute value must match - * - * @return SeedDMS_Core_AttributeDefinition - */ - protected function getAttributeDefinition($type, $multiple=false, $minvalues=0, $maxvalues=0, $valueset='', $regex='') - { - $attrdef = new SeedDMS_Core_AttributeDefinition(1, 'foo attrdef', SeedDMS_Core_AttributeDefinition::objtype_folder, $type, $multiple, $minvalues, $maxvalues, $valueset, $regex); - return $attrdef; - } - - /** - * Create a mock attribute object - * - * @param SeedDMS_Core_AttributeDefinition $attrdef attribute defintion of attribute - * @param mixed $value value of attribute - * - * @return SeedDMS_Core_Attribute - */ - static protected function getAttribute($attrdef, $value) - { - $folder = new SeedDMS_Core_Folder(1, 'Folder', null, '', '', '', 0, 0, 0); - $attribute = new SeedDMS_Core_Attribute(1, $folder, $attrdef, $value); - $attribute->setDMS($attrdef->getDMS()); - return $attribute; - } - - /** - * Test getId() - * - * @return void - */ - public function testGetId() - { - $attrdef = self::getAttributeDefinition(SeedDMS_Core_AttributeDefinition::type_int); - $attribute = self::getAttribute($attrdef, ''); - $this->assertEquals(1, $attribute->getId()); - } - - /** - * Test getValue() - * - * @return void - */ - public function testGetValue() - { - $attrdef = self::getAttributeDefinition(SeedDMS_Core_AttributeDefinition::type_int); - $attribute = self::getAttribute($attrdef, 7); - $this->assertEquals(7, $attribute->getValue()); - } - - /** - * Test getValueAsArray() - * - * @return void - */ - public function testGetValueAsArray() - { - $attrdef = self::getAttributeDefinition(SeedDMS_Core_AttributeDefinition::type_int); - $attribute = self::getAttribute($attrdef, 7); - $this->assertIsArray($attribute->getValueAsArray()); - $this->assertCount(1, $attribute->getValueAsArray()); - $this->assertContains(7, $attribute->getValueAsArray()); - - /* Test a multi value integer */ - $attrdef = self::getAttributeDefinition(SeedDMS_Core_AttributeDefinition::type_int, true); - $attribute = self::getAttribute($attrdef, ',3,4,6'); - $value = $attribute->getValueAsArray(); - $this->assertIsArray($attribute->getValueAsArray()); - $this->assertCount(3, $attribute->getValueAsArray()); - $this->assertContains('6', $attribute->getValueAsArray()); - } - - /** - * Test setValue() - * - * @return void - */ - public function testSetValue() - { - $attrdef = self::getAttributeDefinition(SeedDMS_Core_AttributeDefinition::type_int); - $attrdef->setDMS(self::getMockDMS()); - $attribute = self::getAttribute($attrdef, 0); - $this->assertTrue($attribute->setValue(9)); - $this->assertEquals(9, $attribute->getValue()); - /* Setting an array of values for a none multi value attribute will just take the - * element of the array. - */ - $this->assertTrue($attribute->setValue([8,9])); - $this->assertEquals(8, $attribute->getValue()); - - $attrdef = self::getAttributeDefinition(SeedDMS_Core_AttributeDefinition::type_int, true); - $attrdef->setDMS(self::getMockDMS()); - $attribute = self::getAttribute($attrdef, ',3,4,6'); - $attribute->setValue([8,9,10]); - $this->assertEquals(',8,9,10', $attribute->getValue()); - $this->assertIsArray($attribute->getValueAsArray()); - $this->assertCount(3, $attribute->getValueAsArray()); - $this->assertContains('9', $attribute->getValueAsArray()); - } -} diff --git a/SeedDMS_Core/tests/DatabaseTest.php b/SeedDMS_Core/tests/DatabaseTest.php deleted file mode 100644 index bfbc5ce42..000000000 --- a/SeedDMS_Core/tests/DatabaseTest.php +++ /dev/null @@ -1,324 +0,0 @@ - - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version @package_version@ - * @link https://www.seeddms.org - */ - -namespace PHPUnit\Framework; - -use PHPUnit\Framework\SeedDmsTest; - -require_once('SeedDmsBase.php'); - -/** - * Low level Database test class - * - * @category SeedDMS - * @package Tests - * @author Uwe Steinmann - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version Release: @package_version@ - * @link https://www.seeddms.org - */ -class DatabaseTest extends SeedDmsTest -{ - - /** - * Create a sqlite database in memory - * - * @return void - */ - protected function setUp(): void - { - self::$dbh = self::createInMemoryDatabase(); - } - - /** - * Clean up at tear down - * - * @return void - */ - protected function tearDown(): void - { - self::$dbh = null; - } - - /** - * Check if connection to database exists - * - * @return void - */ - public function testIsConnected() - { - $this->assertTrue(self::$dbh->ensureConnected()); - } - - /** - * Test for number of tables in database - * - * @return void - */ - public function testTableList() - { - $tablelist = self::$dbh->TableList(); - $this->assertIsArray($tablelist); - // There are just 42 tables in SeedDMS5 and 55 tables in SeedDMS6, - // but one additional - // table 'sqlite_sequence' - $dms = new \SeedDMS_Core_DMS(null, ''); - if($dms->version[0] == '5') - $this->assertCount(43, $tablelist); - else - $this->assertCount(56, $tablelist); - } - - /** - * Test createTemporaryTable() - * - * @return void - */ - public function testCreateTemporaryTable() - { - foreach (['ttreviewid', 'ttapproveid', 'ttstatid', 'ttcontentid'] as $temp) { - $ret = self::$dbh->createTemporaryTable($temp); - $rec = self::$dbh->getResultArray("SELECT * FROM `".$temp."`"); - $this->assertIsArray($rec); - } - /* Running it again will not harm */ - foreach (['ttreviewid', 'ttapproveid', 'ttstatid', 'ttcontentid'] as $temp) { - $ret = self::$dbh->createTemporaryTable($temp); - $rec = self::$dbh->getResultArray("SELECT * FROM `".$temp."`"); - $this->assertIsArray($rec); - } - /* Running it again and overwrite the old table contents */ - foreach (['ttreviewid', 'ttapproveid', 'ttstatid', 'ttcontentid'] as $temp) { - $ret = self::$dbh->createTemporaryTable($temp, true); - $rec = self::$dbh->getResultArray("SELECT * FROM `".$temp."`"); - $this->assertIsArray($rec); - } - } - - /** - * Test createTemporaryTable() based on views - * - * @return void - */ - public function testCreateTemporaryTableBasedOnViews() - { - self::$dbh->useViews(true); - foreach (['ttreviewid', 'ttapproveid', 'ttstatid', 'ttcontentid'] as $temp) { - $ret = self::$dbh->createTemporaryTable($temp); - $rec = self::$dbh->getResultArray("SELECT * FROM `".$temp."`"); - $this->assertIsArray($rec); - } - $viewlist = self::$dbh->ViewList(); - $this->assertIsArray($viewlist); - $this->assertCount(4, $viewlist); - - /* Running it again will not harm */ - foreach (['ttreviewid', 'ttapproveid', 'ttstatid', 'ttcontentid'] as $temp) { - $ret = self::$dbh->createTemporaryTable($temp); - $rec = self::$dbh->getResultArray("SELECT * FROM `".$temp."`"); - $this->assertIsArray($rec); - } - /* Running it again and replace the old view */ - foreach (['ttreviewid', 'ttapproveid', 'ttstatid', 'ttcontentid'] as $temp) { - $ret = self::$dbh->createTemporaryTable($temp, true); - $rec = self::$dbh->getResultArray("SELECT * FROM `".$temp."`"); - $this->assertIsArray($rec); - } - } - - /** - * Test for number of views in database - * - * @return void - */ - public function testViewList() - { - $viewlist = self::$dbh->ViewList(); - $this->assertIsArray($viewlist); - // There are 0 views - $this->assertCount(0, $viewlist); - } - - /** - * Test getDriver() - * - * @return void - */ - public function testGetDriver() - { - $driver = self::$dbh->getDriver(); - $this->assertEquals('sqlite', $driver); - } - - /** - * Test rbt() - * - * @return void - */ - public function testRbt() - { - $str = self::$dbh->rbt("SELECT * FROM `tblUsers`"); - $this->assertEquals('SELECT * FROM "tblUsers"', $str); - } - - /** - * Test if table tblFolders has root folder - * - * @return void - */ - public function testInitialRootFolder() - { - $this->assertTrue(self::$dbh->hasTable('tblFolders')); - $query = 'SELECT * FROM `tblFolders`'; - $recs = self::$dbh->getResultArray($query); - $this->assertIsArray($recs); - $this->assertCount(1, $recs); - } - - /** - * Test if table tblUsers has two initial users - * - * @return void - */ - public function testInitialUsers() - { - $this->assertTrue(self::$dbh->hasTable('tblUsers')); - $query = 'SELECT * FROM `tblUsers`'; - $recs = self::$dbh->getResultArray($query); - $this->assertIsArray($recs); - $this->assertCount(2, $recs); - } - - /** - * Test getCurrentDatetime() - * - * @return void - */ - public function testGetCurrentDatetime() - { - $query = 'SELECT '.self::$dbh->getCurrentDatetime().' as a'; - $recs = self::$dbh->getResultArray($query); - $now = date('Y-m-d H:i:s'); - $this->assertIsArray($recs); - $this->assertEquals($now, $recs[0]['a'], 'Make sure php.ini has the proper timezone configured'); - } - - /** - * Test getCurrentTimestamp() - * - * @return void - */ - public function testGetCurrentTimestamp() - { - $query = 'SELECT '.self::$dbh->getCurrentTimestamp().' as a'; - $recs = self::$dbh->getResultArray($query); - $now = time(); - $this->assertIsArray($recs); - $this->assertEquals($now, $recs[0]['a'], 'Make sure php.ini has the proper timezone configured'); - } - - /** - * Test concat() - * - * @return void - */ - public function testConcat() - { - $query = 'SELECT '.self::$dbh->concat(["'foo'", "'baz'", "'bar'"]).' as a'; - $recs = self::$dbh->getResultArray($query); - $this->assertIsArray($recs); - $this->assertEquals('foobazbar', $recs[0]['a']); - } - - /** - * Test qstr() - * - * @return void - */ - public function testQstr() - { - $str = self::$dbh->qstr("bar"); - $this->assertEquals("'bar'", $str); - } - - /** - * Test getResult() if the sql fails - * - * @return void - */ - public function testGetResultSqlFail() - { - $ret = self::$dbh->getResult("UPDATE FOO SET `name`='foo'"); - $this->assertFalse($ret); - $errmsg = self::$dbh->getErrorMsg(); - $this->assertStringContainsString('no such table: FOO', $errmsg); - } - - /** - * Test getResultArray() if the sql fails - * - * @return void - */ - public function testGetResultArraySqlFail() - { - $ret = self::$dbh->getResultArray("SELECT * FROM FOO"); - $this->assertFalse($ret); - $errmsg = self::$dbh->getErrorMsg(); - $this->assertStringContainsString('no such table: FOO', $errmsg); - } - - /** - * Test logging into file - * - * @return void - */ - public function testLogging() - { - $fp = fopen('php://memory', 'r+'); - self::$dbh->setLogFp($fp); - $sql = "SELECT * FROM `tblUsers`"; - $ret = self::$dbh->getResultArray($sql); - $this->assertIsArray($ret); - fseek($fp, 0); - $contents = fread($fp, 200); - /* Check if sql statement was logged into file */ - $this->assertStringContainsString($sql, $contents); - fclose($fp); - } - - /** - * Test createDump() - * - * @return void - */ - public function testCreateDump() - { - $fp = fopen('php://memory', 'r+'); - $ret = self::$dbh->createDump($fp); - $this->assertTrue($ret); - $stat = fstat($fp); - $this->assertIsArray($stat); - $dms = new \SeedDMS_Core_DMS(null, ''); - if($dms->version[0] == '5') - $this->assertEquals(1724, $stat['size']); - else - $this->assertEquals(2272, $stat['size']); -// fseek($fp, 0); -// echo fread($fp, 200); - fclose($fp); - } -} - diff --git a/SeedDMS_Core/tests/DmsTest.php b/SeedDMS_Core/tests/DmsTest.php deleted file mode 100644 index a6811c5d6..000000000 --- a/SeedDMS_Core/tests/DmsTest.php +++ /dev/null @@ -1,2956 +0,0 @@ - - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version @package_version@ - * @link https://www.seeddms.org - */ - -use PHPUnit\Framework\SeedDmsTest; - -/** - * DMS test class - * - * @category SeedDMS - * @package Tests - * @author Uwe Steinmann - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version Release: @package_version@ - * @link https://www.seeddms.org - */ -class DmsTest extends SeedDmsTest -{ - - /** - * Create a real sqlite database in memory - * - * @return void - */ - protected function setUp(): void - { - self::$dbh = self::createInMemoryDatabase(); - self::$contentdir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'phpunit-'.time(); - mkdir(self::$contentdir); - // echo "Creating temp content dir: ".self::$contentdir."\n"; - self::$dms = new SeedDMS_Core_DMS(self::$dbh, self::$contentdir); - self::$dbversion = self::$dms->getDBVersion(); - } - - /** - * Clean up at tear down - * - * @return void - */ - protected function tearDown(): void - { - self::$dbh = null; - // echo "\nRemoving temp. content dir: ".self::$contentdir."\n"; - exec('rm -rf '.self::$contentdir); - } - - /** - * Create a mock admin role object (only used for SeedDMS 6) - * - * @return SeedDMS_Core_User - */ - protected function getAdminRole() - { - $role = new SeedDMS_Core_Role(1, 'admin', SeedDMS_Core_Role::role_admin); - return $role; - } - - /** - * Test checkIfEqual() - * - * @return void - */ - public function testCheckIfEqual() - { - $user1 = new SeedDMS_Core_User(1, 'user 1', '', '', '', '', '', '', 1); - $group1 = new SeedDMS_Core_Group(1, 'group 1', ''); - $group1n = new SeedDMS_Core_Group(1, 'group 1n', ''); - $group1c = clone $group1; - $group2 = new SeedDMS_Core_Group(2, 'group 1', ''); - $dms = new SeedDMS_Core_DMS(null, ''); - $this->assertFalse($dms->checkIfEqual($group1, $user1)); // different classes - $this->assertFalse($dms->checkIfEqual($group1, $group2)); // different id - $this->assertTrue($dms->checkIfEqual($group1, $group1c)); // a clone is always equal - $this->assertTrue($dms->checkIfEqual($group1, $group1n)); // different instances but same id is sufficient to be equal - } /* }}} */ - - /** - * Test checkDate() - * - * @return void - */ - public function testCheckDate() - { - $dms = new SeedDMS_Core_DMS(null, ''); - $this->assertTrue($dms->checkDate('2020-02-28 10:12:34')); - $this->assertTrue($dms->checkDate('2020-02-29 10:12:34')); // a leap year - $this->assertFalse($dms->checkDate('2020-02-30 10:12:34')); // feb has never 30 days - $this->assertFalse($dms->checkDate('2021-02-29 10:12:34')); // not a leap year - $this->assertFalse($dms->checkDate('2020-02-28 24:12:34')); // hour is out of range - $this->assertFalse($dms->checkDate('2020-02-28 23:60:34')); // minute is out of range - $this->assertFalse($dms->checkDate('2020-02-28 23:59:60')); // second is out of range - $this->assertFalse($dms->checkDate('2020-02-28 23:59:')); // second is missing - $this->assertTrue($dms->checkDate('2020-02-28', 'Y-m-d')); // just checking the date - $this->assertFalse($dms->checkDate('28.2.2020', 'd.m.Y')); // month must be 01-12 - $this->assertTrue($dms->checkDate('28.2.2020', 'd.n.Y')); // month must be 1-12 - $this->assertFalse($dms->checkDate('28.02.2020', 'd.n.Y')); // month must be 1-12 - } /* }}} */ - - /** - * Test getClassname() - * - * @return void - */ - public function testGetClassName() - { - /* Do not mess up the global instance self::$dms, but create my own */ - $dms = new SeedDMS_Core_DMS(null, ''); - $this->assertEquals('SeedDMS_Core_Folder', $dms->getClassname('folder')); - $this->assertEquals('SeedDMS_Core_Document', $dms->getClassname('document')); - $this->assertEquals('SeedDMS_Core_DocumentContent', $dms->getClassname('documentcontent')); - $this->assertEquals('SeedDMS_Core_User', $dms->getClassname('user')); - $this->assertEquals('SeedDMS_Core_Group', $dms->getClassname('group')); - $this->assertFalse($dms->getClassname('foo')); - } - - /** - * Test setClassname() - * - * @return void - */ - public function testSetClassName() - { - /* Do not mess up the global instance self::$dms, but create my own */ - $dms = new SeedDMS_Core_DMS(null, ''); - $this->assertEquals('SeedDMS_Core_Folder', $dms->setClassname('folder', 'MyNewFolderClass')); - $this->assertEquals('MyNewFolderClass', $dms->getClassname('folder')); - $this->assertEquals('MyNewFolderClass', $dms->setClassname('folder', 'MySuperNewFolderClass')); - $this->assertFalse($dms->setClassname('foo', 'MyNewFolderClass')); - } - - /** - * Test addCallback() - * - * @return void - */ - public function testAddCallback() - { - /* Do not mess up the global instance self::$dms, but create my own */ - $dms = new SeedDMS_Core_DMS(null, ''); - /* Add a closure as a callback is just fine */ - $this->assertTrue( - $dms->addCallback( - 'onPostSomething', function () { - } - ) - ); - /* An empty callback will make addCallback() fail */ - $this->assertFalse( - $dms->addCallback( - '', function () { - } - ) - ); - /* Passing a class method is ok */ - $this->assertTrue($dms->addCallback('onPostSomething', 'DmsTest::testAddCallback')); - /* Passing a none existing class mehtod makes addCallback() fail */ - $this->assertFalse($dms->addCallback('onPostSomething', 'DmsTest::thisMethodDoesNotExist')); - } - - /** - * Test for hasCallback - * - * @return void - */ - public function testHasCallback() - { - /* Do not mess up the global instance self::$dms, but create my own */ - $dms = new SeedDMS_Core_DMS(null, ''); - /* Add a closure as a callback is just fine */ - $this->assertTrue( - $dms->addCallback( - 'onPostSomething', function () { - } - ) - ); - $this->assertTrue($dms->hasCallback('onPostSomething')); - $this->assertFalse($dms->hasCallback('thisOneDoesNotExist')); - } - - /** - * Test for getDecorators - * - * @return void - */ - public function testGetDecorators() - { - /* Do not mess up the global instance self::$dms, but create my own */ - $dms = new SeedDMS_Core_DMS(null, ''); - $this->assertFalse($dms->getDecorators('folder')); - } - - /** - * Test for addDecorator - * - * @return void - */ - public function testaddDecorator() - { - /* Do not mess up the global instance self::$dms, but create my own */ - $dms = new SeedDMS_Core_DMS(null, ''); - $this->assertTrue($dms->addDecorator('folder', 'MyNewDecorator')); - $decorators = $dms->getDecorators('folder'); - $this->assertIsArray($decorators); - $this->assertCount(1, $decorators); - } - - /** - * Test getDb() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDb() - { - $this->assertEquals(self::$dbh, self::$dms->getDb()); - } - - /** - * Test getDBVersion() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDbVersion() - { - $version = self::$dms->getDBVersion(); - $this->assertCount(4, $version); - $this->assertGreaterThanOrEqual(5, $version['major']); - $this->assertGreaterThanOrEqual(0, $version['minor']); - } - - /** - * Test getDBVersionFailMissingTable() - * - * This method checks if getDBVersion() returns false if the table - * list of the database does not contain the table 'tblVersion' - * - * @return void - */ - public function testGetDbVersionFailMissingTable() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('TableList') - ->willReturn(['tblFolders', 'tblDocuments']); - $dms = new SeedDMS_Core_DMS($db, ''); - $version = $dms->getDBVersion(); - $this->assertFalse($version); - } - - /** - * Test getDBVersionSqlFail() - * - * This method checks if getDBVersion() returns false if the sql - * for selecting the records in table 'tblVersion' fail - * - * @return void - */ - public function testGetDbVersionSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with("SELECT * FROM `tblVersion` ORDER BY `major`,`minor`,`subminor` LIMIT 1") - ->willReturn(false); - $db->expects($this->once()) - ->method('TableList') - ->willReturn(['tblVersion', 'tblFolders', 'tblDocuments']); - $dms = new SeedDMS_Core_DMS($db, ''); - $version = $dms->getDBVersion(); - $this->assertFalse($version); - } - - /** - * Test getDBVersionNoRecord() - * - * This method checks if getDBVersion() returns false a table 'tblVersion' - * exists but has no record - * - * @return void - */ - public function testGetDbVersionNoRecord() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with("SELECT * FROM `tblVersion` ORDER BY `major`,`minor`,`subminor` LIMIT 1") - ->willReturn(array()); - $db->expects($this->once()) - ->method('TableList') - ->willReturn(['tblVersion', 'tblFolders', 'tblDocuments']); - $dms = new SeedDMS_Core_DMS($db, ''); - $version = $dms->getDBVersion(); - $this->assertFalse($version); - } - - /** - * Test checkVersion() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testCheckVersion() - { - $this->assertTrue(self::$dms->checkVersion()); - } - - /** - * Test checkVersionFail() - * - * This method checks if checkVersion() returns false if the version - * in table 'tblVersion' does not match the version in the class variable - * $version. To make this method independant of version changes, the - * current version is taken from SeedDMS_Core_DMS::version and modified - * in order to differ from the version stored in the database. - * - * @return void - */ - public function testcheckVersionFail() - { - $verstr = (new SeedDMS_Core_DMS(null, ''))->version; - $verarr = explode('.', $verstr); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with("SELECT * FROM `tblVersion` ORDER BY `major`,`minor`,`subminor` LIMIT 1") - ->willReturn([['major'=>$verarr[0], 'minor'=>$verarr[1]+1]]); - $db->expects($this->once()) - ->method('TableList') - ->willReturn(['tblVersion', 'tblFolders', 'tblDocuments']); - $dms = new SeedDMS_Core_DMS($db, ''); - $version = $dms->checkVersion(); - $this->assertFalse($version); - } - - /** - * Test checkVersionSqlFail() - * - * This method checks if checkVersion() returns false if the sql - * for selecting the records in table 'tblVersion' fail - * - * @return void - */ - public function testcheckVersionSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with("SELECT * FROM `tblVersion` ORDER BY `major`,`minor`,`subminor` LIMIT 1") - ->willReturn(false); - $db->expects($this->once()) - ->method('TableList') - ->willReturn(['tblVersion', 'tblFolders', 'tblDocuments']); - $dms = new SeedDMS_Core_DMS($db, ''); - $version = $dms->checkVersion(); - $this->assertFalse($version); - } - - /** - * Test checkVersionFailMissingTable() - * - * This method checks if checkVersion() returns false if the table - * list of the database does not contain the table 'tblVersion' - * - * @return void - */ - public function testCheckVersionFailMissingTable() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('TableList') - ->willReturn(['tblFolders', 'tblDocuments']); - $dms = new SeedDMS_Core_DMS($db, ''); - $version = $dms->checkVersion(); - $this->assertTrue($version); // A missing table tblVersion returns true! - } - - /** - * Test checkVersionNoRecord() - * - * This method checks if checkVersion() returns false a table 'tblVersion' - * exists but has no record - * - * @return void - */ - public function testCheckVersionNoRecord() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with("SELECT * FROM `tblVersion` ORDER BY `major`,`minor`,`subminor` LIMIT 1") - ->willReturn(array()); - $db->expects($this->once()) - ->method('TableList') - ->willReturn(['tblVersion', 'tblFolders', 'tblDocuments']); - $dms = new SeedDMS_Core_DMS($db, ''); - $version = $dms->checkVersion(); - $this->assertFalse($version); - } - - /** - * Test setRootFolderID() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testSetRootFolderID() - { - /* Setting the same root folder is ok */ - $oldid = self::$dms->setRootFolderID(1); - $this->assertEquals(1, $oldid); - /* Setting a none existing root folder id will not change the root folder */ - $oldid = self::$dms->setRootFolderID(2); - $this->assertFalse($oldid); - /* Make sure the old root folder is still set */ - $rootfolder = self::$dms->getRootFolder(); - $this->assertInstanceOf(SeedDMS_Core_Folder::class, $rootfolder); - $this->assertEquals(1, $rootfolder->getId()); - } - - /** - * Test getRootFolder() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetRootFolder() - { - $rootfolder = self::$dms->getRootFolder(); - $this->assertInstanceOf(SeedDMS_Core_Folder::class, $rootfolder); - $this->assertEquals(1, $rootfolder->getId()); - } - - /** - * Test setUser() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testSetUser() - { - $user = self::$dms->getUser(1); - $olduser = self::$dms->setUser($user); // returns null because there is no old user - $this->assertNull($olduser); - $olduser = self::$dms->setUser($user); // second call will return the user set before - $this->assertIsObject($olduser); - $olduser = self::$dms->setUser(null); // old user is still an object - $this->assertIsObject($olduser); - $olduser = self::$dms->setUser(8); // invalid user - $this->assertFalse($olduser); - } - - /** - * Test getLoggedInUser() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetLoggedInUser() - { - $olduser = self::$dms->getLoggedInUser(); // initially this is set to null - $this->assertNull($olduser); - $user = self::$dms->getUser(1); - self::$dms->setUser($user); - $olduser = self::$dms->getLoggedInUser(); - $this->assertEquals($olduser->getId(), $user->getId()); - } - - /** - * Test getDocument() - * - * As there is currently no document, getDocument() must return null. - * If false was returned it would indicated an sql error. - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDocument() - { - $document = self::$dms->getDocument(1); - $this->assertNull($document); - } - - /** - * Test getDocumentsByUser() - * - * As there is currently no document, getDocumentsByUser() must return - * an empty array. - * If false was returned it would indicated an sql error. - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDocumentsByUser() - { - $documents = self::$dms->getDocumentsByUser(self::$dms->getUser(1)); - $this->assertIsArray($documents); - $this->assertCount(0, $documents); - } - - /** - * Test getDocumentsLockedByUser() - * - * As there is currently no document, getDocumentsLockedByUser() must return - * an empty array. - * If false was returned it would indicated an sql error. - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDocumentsLockedByUser() - { - $documents = self::$dms->getDocumentsLockedByUser(self::$dms->getUser(1)); - $this->assertIsArray($documents); - $this->assertCount(0, $documents); - } - - /** - * Test makeTimeStamp() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testMakeTimeStamp() - { - /* Assert correct date */ - $this->assertEquals(0, self::$dms->makeTimeStamp(1, 0, 0, 1970, 1, 1)); - $this->assertEquals(68166000, self::$dms->makeTimeStamp(0, 0, 0, 1972, 2, 29)); - /* Assert incorrect dates */ - $this->assertFalse(self::$dms->makeTimeStamp(0, 0, 0, 1970, 13, 1), 'Incorrect month not recognized'); - $this->assertFalse(self::$dms->makeTimeStamp(0, 0, 0, 1970, 1, 32), 'Incorrect day in january not recognized'); - $this->assertFalse(self::$dms->makeTimeStamp(0, 0, 0, 1970, 4, 31), 'Incorrect day in april not recognized'); - $this->assertFalse(self::$dms->makeTimeStamp(0, 0, 0, 1970, 2, 29), 'Incorrect day in february not recognized'); - $this->assertFalse(self::$dms->makeTimeStamp(24, 0, 0, 1970, 1, 1), 'Incorrect hour not recognized'); - $this->assertFalse(self::$dms->makeTimeStamp(0, 60, 0, 1970, 1, 1), 'Incorrect minute not recognized'); - $this->assertFalse(self::$dms->makeTimeStamp(0, 0, 60, 1970, 1, 1), 'Incorrect second not recognized'); - } - - /** - * Test search() - * - * Just search the root folder in different ways. Because the initial database - * does not have any documents, this method will test various ways to - * find the root folder 'DMS' with id=1 - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testSearchRootFolder() - { - /* searching for folders/documents in any field */ - $result = self::$dms->search( - array( - 'query'=>'DMS' - ) - ); - $this->assertEquals(1, $result['totalFolders']); - $this->assertCount(1, $result['folders']); - $this->assertEquals(0, $result['totalDocs']); - $this->assertCount(0, $result['docs']); - - /* searching for folders in any field */ - $result = self::$dms->search( - array( - 'query'=>'DMS', - 'mode'=>0x2 - ) - ); - $this->assertEquals(1, $result['totalFolders']); - $this->assertCount(1, $result['folders']); - $this->assertEquals(0, $result['totalDocs']); - $this->assertCount(0, $result['docs']); - - /* searching for documents in any field will not return any folders*/ - $result = self::$dms->search( - array( - 'query'=>'DMS', - 'mode'=>0x1 - ) - ); - $this->assertEquals(0, $result['totalFolders']); - $this->assertCount(0, $result['folders']); - $this->assertEquals(0, $result['totalDocs']); - $this->assertCount(0, $result['docs']); - - /* searching for folders with a bogus name may not return any folders */ - $result = self::$dms->search( - array( - 'query'=>'foo', - 'mode'=>0x2 - ) - ); - $this->assertEquals(0, $result['totalFolders']); - $this->assertCount(0, $result['folders']); - - /* searching for folders by its id */ - $result = self::$dms->search( - array( - 'query'=>'1', - 'mode'=>0x2 - ) - ); - $this->assertEquals(1, $result['totalFolders']); - $this->assertCount(1, $result['folders']); - - /* searching for folders by an unknown id */ - $result = self::$dms->search( - array( - 'query'=>'2', - 'mode'=>0x2 - ) - ); - $this->assertEquals(0, $result['totalFolders']); - $this->assertCount(0, $result['folders']); - - /* searching for folders with two terms ANDed, but only one matches */ - $result = self::$dms->search( - array( - 'query'=>'DMS foo', - 'mode'=>0x2, - 'logicalmode'=>'AND', - ) - ); - $this->assertEquals(0, $result['totalFolders']); - $this->assertCount(0, $result['folders']); - - /* searching for folders with two terms ORed, but only one matches */ - $result = self::$dms->search( - array( - 'query'=>'DMS foo', - 'mode'=>0x2, - 'logicalmode'=>'OR', - ) - ); - $this->assertEquals(1, $result['totalFolders']); - $this->assertCount(1, $result['folders']); - - /* searching for folders with two terms ANDed, both match, but in different fields (name and id) */ - $result = self::$dms->search( - array( - 'query'=>'DMS 1', - 'mode'=>0x2, - 'logicalmode'=>'AND', - ) - ); - $this->assertEquals(1, $result['totalFolders']); - $this->assertCount(1, $result['folders']); - - /* searching for folders with two terms ANDed, both match, but in different fields (name and id). But only one field is searched. */ - $result = self::$dms->search( - array( - 'query'=>'DMS 1', - 'mode'=>0x2, - 'logicalmode'=>'AND', - 'searchin'=>array(2,3), // name, comment - ) - ); - $this->assertEquals(0, $result['totalFolders']); - $this->assertCount(0, $result['folders']); - - /* searching for folders below a start folder will not find the folder 'DMS' - * anymore, because the start folder itself will not be found. - */ - $result = self::$dms->search( - array( - 'query'=>'DMS', - 'mode'=>0x2, - 'startFolder'=>self::$dms->getRootFolder() - ) - ); - $this->assertEquals(0, $result['totalFolders']); - $this->assertCount(0, $result['folders']); - - /* Restrict search to the owner of the folder 'DMS' - */ - $result = self::$dms->search( - array( - 'query'=>'DMS', - 'mode'=>0x2, - 'owner'=>self::$dms->getUser(1) - ) - ); - $this->assertEquals(1, $result['totalFolders']); - $this->assertCount(1, $result['folders']); - - /* Restrict search to user who does not own a document - */ - $result = self::$dms->search( - array( - 'query'=>'DMS', - 'mode'=>0x2, - 'owner'=>self::$dms->getUser(2) - ) - ); - $this->assertEquals(0, $result['totalFolders']); - $this->assertCount(0, $result['folders']); - - /* Restrict search to a list of owners (in this case all users) - */ - $result = self::$dms->search( - array( - 'query'=>'DMS', - 'mode'=>0x2, - 'owner'=>self::$dms->getAllUsers() - ) - ); - $this->assertEquals(1, $result['totalFolders']); - $this->assertCount(1, $result['folders']); - - } - - /** - * Test getFolder() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetFolder() - { - $folder = self::$dms->getFolder(1); - $this->assertInstanceOf(SeedDMS_Core_Folder::class, $folder); - $this->assertEquals(1, $folder->getId()); - } - - /** - * Test getFolderByName() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetFolderByName() - { - $folder = self::$dms->getFolderByName('DMS'); - $this->assertInstanceOf(SeedDMS_Core_Folder::class, $folder); - $this->assertEquals(1, $folder->getId()); - $folder = self::$dms->getFolderByName('FOO'); - $this->assertNull($folder); - } - - /** - * Test checkFolders() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testCheckFolders() - { - $errors = self::$dms->checkFolders(); - $this->assertIsArray($errors); - $this->assertCount(0, $errors); - } - - /** - * Test checkFoldersSqlFail() - * - * This test catches the case when the sql statement for getting all - * folders fails. - * - * @return void - */ - public function testCheckFoldersSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with("SELECT * FROM `tblFolders`") - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $this->assertFalse($dms->checkFolders()); - } - - /** - * Test checkFoldersFailNoParent() - * - * This test catches the case when a folder's parent is not present - * - * @return void - */ - public function testCheckFoldersFailNoParent() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with("SELECT * FROM `tblFolders`") - ->willReturn( - array( - array('id'=>1, 'name'=>'DMS', 'parent'=>0, 'folderList'=>''), - array('id'=>5, 'name'=>'Subfolder', 'parent'=>3, 'folderList'=>':1:'), - ) - ); - $dms = new SeedDMS_Core_DMS($db, ''); - $errors = $dms->checkFolders(); - $this->assertIsArray($errors); - $this->assertCount(1, $errors); // there should be 1 error - $this->assertArrayHasKey(5, $errors); // folder with id=5 has the wrong parent - $this->assertEquals('Missing parent', $errors[5]['msg']); - } - - /** - * Test checkFoldersFailWrongFolderList() - * - * This test catches the case when a folder's parent is not present - * - * @return void - */ - public function testCheckFoldersFailWrongFolderList() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with("SELECT * FROM `tblFolders`") - ->willReturn( - array( - array('id'=>1, 'name'=>'DMS', 'parent'=>0, 'folderList'=>''), - array('id'=>5, 'name'=>'Subfolder', 'parent'=>1, 'folderList'=>':1:2:'), - ) - ); - $dms = new SeedDMS_Core_DMS($db, ''); - $errors = $dms->checkFolders(); - $this->assertIsArray($errors); - $this->assertCount(1, $errors); // there should be 1 error - $this->assertArrayHasKey(5, $errors); // folder with id=5 has the wrong parent - $this->assertStringContainsString('Wrong folder list', $errors[5]['msg']); - } - - /** - /** - * Test checkDocuments() - * - * The intitial database does not have any documents which makes this - * test less usefull. - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testCheckDocuments() - { - $errors = self::$dms->checkDocuments(); - $this->assertIsArray($errors); - $this->assertCount(0, $errors); - } - - /** - * Test checkDocumentsSqlFoldersFail() - * - * This test catches the case when the sql statement for getting all - * folders fails. - * - * @return void - */ - public function testCheckDocumentsSqlFoldersFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with("SELECT * FROM `tblFolders`") - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $this->assertFalse($dms->checkDocuments()); - } - - /** - * Test checkDocumentsSqlDocumentsFail() - * - * This test catches the case when the sql statement for getting all - * documents fails, after getting all folders succeeded. - * - * @return void - */ - public function testCheckDocumentsSqlDocumentsFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->exactly(2)) - ->method('getResultArray') - ->will( - $this->returnValueMap( - array( - array("SELECT * FROM `tblFolders`", true, array( - array('id'=>1, 'name'=>'DMS', 'parent'=>0, 'folderList'=>'') - )), - array("SELECT * FROM `tblDocuments`", true, false) - ) - ) - ); - $dms = new SeedDMS_Core_DMS($db, ''); - $this->assertFalse($dms->checkDocuments()); - } - - /** - * Test checkDocumentsFailNoParent() - * - * This test catches the case when a documents's parent is not present - * - * @return void - */ - public function testCheckDocumentsFailNoParent() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->exactly(2)) - ->method('getResultArray') - ->will( - $this->returnValueMap( - array( - array("SELECT * FROM `tblFolders`", true, array( - array('id'=>1, 'name'=>'DMS', 'parent'=>0, 'folderList'=>''), - array('id'=>5, 'name'=>'Subfolder', 'parent'=>1, 'folderList'=>':1:'), - )), - array("SELECT * FROM `tblDocuments`", true, array( - array('id'=>1, 'name'=>'Document 1', 'folder'=>1, 'folderList'=>':1:'), - array('id'=>2, 'name'=>'Document 2', 'folder'=>2, 'folderList'=>':1:5:'), - )) - ) - ) - ); - $dms = new SeedDMS_Core_DMS($db, ''); - $errors = $dms->checkDocuments(); - $this->assertIsArray($errors); - $this->assertCount(1, $errors); // there should be 1 error - $this->assertArrayHasKey(2, $errors); // document with id=2 has the wrong parent - $this->assertEquals('Missing parent', $errors[2]['msg']); - } - - /** - * Test checkDocumentsFailWrongFolderList() - * - * This test catches the case when a documents's parent is not present - * - * @return void - */ - public function testCheckDocumentsFailWrongFolderList() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->exactly(2)) - ->method('getResultArray') - ->will( - $this->returnValueMap( - array( - array("SELECT * FROM `tblFolders`", true, array( - array('id'=>1, 'name'=>'DMS', 'parent'=>0, 'folderList'=>''), - array('id'=>5, 'name'=>'Subfolder', 'parent'=>1, 'folderList'=>':1:'), - )), - array("SELECT * FROM `tblDocuments`", true, array( - array('id'=>1, 'name'=>'Document 1', 'folder'=>1, 'folderList'=>':1:'), - array('id'=>2, 'name'=>'Document 2', 'folder'=>5, 'folderList'=>':1:2:'), - )) - ) - ) - ); - $dms = new SeedDMS_Core_DMS($db, ''); - $errors = $dms->checkDocuments(); - $this->assertIsArray($errors); - $this->assertCount(1, $errors); // there should be 1 error - $this->assertArrayHasKey(2, $errors); // document with id=2 has the wrong parent - $this->assertStringContainsString('Wrong folder list', $errors[2]['msg']); - } - - /** - * Test getUser() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetUser() - { - $user = self::$dms->getUser(1); - $this->assertInstanceOf(SeedDMS_Core_User::class, $user); - $this->assertEquals(1, $user->getId()); - } - - /** - * Test getUserByLogin() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetUserByLogin() - { - $user = self::$dms->getUserByLogin('admin'); - $this->assertInstanceOf(SeedDMS_Core_User::class, $user); - $this->assertEquals('admin', $user->getLogin()); - } - - /** - * Test getUserByEmail() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetUserByEmail() - { - $user = self::$dms->getUserByEmail('info@seeddms.org'); - $this->assertInstanceOf(SeedDMS_Core_User::class, $user); - $this->assertEquals('admin', $user->getLogin()); - } - - /** - * Test getAllUsers() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAllUsers() - { - $users = self::$dms->getAllUsers(); - $this->assertIsArray($users); - $this->assertCount(2, $users); - } - - /** - * Test addUser() - * - * Add a new user and retrieve it afterwards. Also check if the number - * of users has increased by one. Add a user with the same name a - * second time and check if it returns false. - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddUser() - { - /* Adding a new user */ - $user = self::$dms->addUser('new user', 'pwd', 'Full Name', 'newuser@seeddms.org', 'en_GB', 'bootstrap', 'with comment'); - $this->assertIsObject($user); - $this->assertEquals('new user', $user->getLogin()); - $this->assertEquals('with comment', $user->getComment()); - - /* Adding a user with the same login must fail */ - $user = self::$dms->addUser('new user', 'pwd', 'Full Name', 'newuser@seeddms.org', 'en_GB', 'bootstrap', 'with comment'); - $this->assertFalse($user); - - /* There should be 3 users now */ - $users = self::$dms->getAllUsers(); - $this->assertIsArray($users); - $this->assertCount(3, $users); - - /* Check if setting the password expiration to 'now' works */ - $now = date('Y-m-d H:i:s'); - $user = self::$dms->addUser('new user pwdexpiration 1', 'pwd', 'Full Name', 'newuser@seeddms.org', 'en_GB', 'bootstrap', 'with comment', '', false, false, 'now'); - $this->assertEquals($now, $user->getPwdExpiration()); - $now = date('Y-m-d H:i:s'); - $user = self::$dms->addUser('new user pwdexpiration 2', 'pwd', 'Full Name', 'newuser@seeddms.org', 'en_GB', 'bootstrap', 'with comment', '', false, false, $now); - $this->assertEquals($now, $user->getPwdExpiration()); - } - - /** - * Test addUserWithPostAddHook() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddUserWithPostAddHook() - { - /* Add the 'onPostAddUser' callback */ - $ret = 0; - $callback = function ($param, $user) use (&$ret) { - $ret = 1; - }; - self::$dms->addCallback('onPostAddUser', $callback, 1); - /* Adding a new user */ - $user = self::$dms->addUser('new user', 'pwd', 'Full Name', 'newuser@seeddms.org', 'en_GB', 'bootstrap', 'with comment'); - $this->assertIsObject($user); - $this->assertEquals('new user', $user->getLogin()); - $this->assertEquals(1, $ret); - } - - /** - * Test addUser() with sql failure - * - * @return void - */ - public function testAddUserSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("INSERT INTO `tblUsers`")) - ->willReturn(false); - $db->expects($this->once()) - ->method('getResultArray') - ->with("SELECT * FROM `tblUsers` WHERE `login` = ") - ->willReturn([]); - $dms = new SeedDMS_Core_DMS($db, ''); - if(self::$dbversion['major'] < 6) - $role = 1; - else - $role = $this->getAdminRole(); - $user = $dms->addUser('new user', 'pwd', 'Full Name', 'newuser@seeddms.org', 'en_GB', 'bootstrap', 'with comment', $role); - $this->assertFalse($user); - } - - /** - * Test getGroup() - * - * Get a group by its id - * - * @return void - */ - public function testGetGroup() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with("SELECT * FROM `tblGroups` WHERE `id` = 1") - ->willReturn([['id'=>1, 'name'=>'foo', 'comment'=>'']]); - $dms = new SeedDMS_Core_DMS($db, ''); - $group = $dms->getGroup(1); - $this->assertIsObject($group); - $this->assertEquals(1, $group->getId()); - } - - /** - * Test getGroupByName() - * - * Get a group by its name - * - * qstr must be mocked because it is used in the sql statement to quote - * the name. - * - * @return void - */ - public function testGetGroupByName() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with("SELECT * FROM `tblGroups` WHERE `name` = 'foo'") - ->willReturn([['id'=>1, 'name'=>'foo', 'comment'=>'']]); - $db->expects($this->once()) - ->method('qstr') - ->will( - $this->returnCallback( - function ($a) { - return "'".$a."'"; - } - ) - ); - $dms = new SeedDMS_Core_DMS($db, ''); - $group = $dms->getGroupByName('foo'); - $this->assertIsObject($group); - $this->assertEquals('foo', $group->getName()); - } - - /** - * Test getAllGroups() - * - * The intitial database does not have any groups - * - * @return void - */ - public function testGetAllGroups() - { - $groups = self::$dms->getAllGroups(); - $this->assertIsArray($groups); - $this->assertCount(0, $groups); - } - - /** - * Test addGroup() - * - * Add a new group and retrieve it afterwards. Also check if the number - * of groups has increased by one. Add a group with the same name a - * second time and check if it returns false. - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddGroup() - { - /* Adding a new group */ - $group = self::$dms->addGroup('new group', 'with comment'); - $this->assertIsObject($group); - $this->assertEquals('new group', $group->getName()); - /* Adding a group with the same name must fail */ - $group = self::$dms->addGroup('new group', 'with comment'); - $this->assertFalse($group); - /* There should be one group now */ - $groups = self::$dms->getAllGroups(); - $this->assertIsArray($groups); - $this->assertCount(1, $groups); - } - - /** - * Test addGroupWithPostAddHook() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddGroupWithPostAddHook() - { - /* Add the 'onPostAddGroup' callback */ - $ret = 0; - $callback = function ($param, $group) use (&$ret) { - $ret = 1; - }; - self::$dms->addCallback('onPostAddGroup', $callback, 1); - /* Adding a new group */ - $group = self::$dms->addGroup('new group', 'with comment'); - $this->assertIsObject($group); - $this->assertEquals('new group', $group->getName()); - $this->assertEquals(1, $ret); - } - - /** - * Test addGroup() with sql failure - * - * @return void - */ - public function testAddGroupSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("INSERT INTO `tblGroups`")) - ->willReturn(false); - $db->expects($this->once()) - ->method('getResultArray') - ->with("SELECT * FROM `tblGroups` WHERE `name` = ") - ->willReturn([]); - $dms = new SeedDMS_Core_DMS($db, ''); - $group = $dms->addGroup('new group', 'with comment'); - $this->assertFalse($group); - } - - /** - * Test getAllKeywordCategories() - * - * The intitial database does not have any keyword categories - * - * @return void - */ - public function testGetAllKeywordCategories() - { - $cats = self::$dms->getAllKeywordCategories(); - $this->assertIsArray($cats); - $this->assertCount(0, $cats); - /* Even passing bogus ids is handled propperly */ - $cats = self::$dms->getAllKeywordCategories(['kk', '0', 3, true]); - $this->assertIsArray($cats); - $this->assertCount(0, $cats); - } - - /** - * Test getAllUserKeywordCategories() - * - * Method getAllUserKeywordCategories() actually uses - * getAllKeywordCategories() - * - * The intitial database does not have any keyword categories - * - * @return void - */ - public function testGetAllUserKeywordCategories() - { - $cats = self::$dms->getAllUserKeywordCategories(1); - $this->assertIsArray($cats); - $this->assertCount(0, $cats); - /* Passing a none existing user id will return an empty array */ - $cats = self::$dms->getAllUserKeywordCategories(3); - $this->assertIsArray($cats); - $this->assertCount(0, $cats); - /* Passing an invalid user id will return false */ - $cats = self::$dms->getAllUserKeywordCategories(0); - $this->assertFalse($cats); - } - - /** - * Test getAllKeywordCategories() with sql failure - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAllKeywordCategoriesSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblKeywordCategories`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $cats = $dms->getAllKeywordCategories(); - $this->assertFalse($cats); - } - - /** - * Test addKeywordCategory() - * - * Add a new keyword category and retrieve it afterwards. Also check if the - * number of keyword categories has increased by one. Add a keyword category - * with the same name a second time and check if it returns false. - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddKeywordCategory() - { - /* Adding a new keyword category */ - $cat = self::$dms->addKeywordCategory(1, 'new category'); - $this->assertIsObject($cat); - $this->assertEquals('new category', $cat->getName()); - - /* Adding a keyword category for the same user and with the same name must fail */ - $cat = self::$dms->addKeywordCategory(1, 'new category'); - $this->assertFalse($cat); - - /* Adding a keyword category with a non existing user id must fail */ - $cat = self::$dms->addKeywordCategory(0, 'new category'); - $this->assertFalse($cat); - - /* Adding a keyword category with an empty name must fail */ - $cat = self::$dms->addKeywordCategory(1, ' '); - $this->assertFalse($cat); - - /* Adding a keyword category with a non existing user id must fail */ - // $cat = self::$dms->addKeywordCategory(3, 'new category'); - // $this->assertFalse($cat); - - /* There should be 1 keyword category now */ - $cats = self::$dms->getAllKeywordCategories(); - $this->assertIsArray($cats); - $this->assertCount(1, $cats); - } - - /** - * Test addKeywordCategoryWithPostAddHook() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddKeywordCategoryWithPostAddHook() - { - /* Add the 'onPostAddKeywordCategory' callback */ - $ret = 0; - $callback = function ($param, $cat) use (&$ret) { - $ret = 1; - }; - self::$dms->addCallback('onPostAddKeywordCategory', $callback, 1); - /* Adding a new keyword category */ - $cat = self::$dms->addKeywordCategory(1, 'new category'); - $this->assertIsObject($cat); - $this->assertEquals('new category', $cat->getName()); - $this->assertEquals(1, $ret); - } - - /** - * Test addKeywordCategory() with sql failure - * - * @return void - */ - public function testAddKeywordCategorySqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("INSERT INTO `tblKeywordCategories`")) - ->willReturn(false); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblKeywordCategories` WHERE `name` =")) - ->willReturn([]); - $dms = new SeedDMS_Core_DMS($db, ''); - $cat = $dms->addKeywordCategory(1, 'new category'); - $this->assertFalse($cat); - } - - /** - * Test getKeywordCategory() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetKeywordCategory() - { - $cat = self::$dms->addKeywordCategory(1, 'new category'); - $cat = self::$dms->getKeywordCategory(1); - $this->assertInstanceOf(SeedDMS_Core_Keywordcategory::class, $cat); - $this->assertEquals(1, $cat->getId()); - /* Return false if the id is invalid */ - $cat = self::$dms->getKeywordCategory(0); - $this->assertFalse($cat); - /* Return null if the keyword category with the id does not exist */ - $cat = self::$dms->getKeywordCategory(2); - $this->assertNull($cat); - } - - /** - * Test getKeywordCategory() with sql failure - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetKeywordCategorySqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with("SELECT * FROM `tblKeywordCategories` WHERE `id` = 1") - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $cat = $dms->getKeywordCategory(1); - $this->assertFalse($cat); - } - - /** - * Test getKeywordCategoryByName() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetKeywordCategoryByName() - { - $cat = self::$dms->addKeywordCategory(1, 'new category'); - $cat = self::$dms->getKeywordCategory(1); - $this->assertInstanceOf(SeedDMS_Core_Keywordcategory::class, $cat); - $this->assertEquals(1, $cat->getId()); - /* Return false if the user id is invalid */ - $cat = self::$dms->getKeywordCategoryByName('new category', 0); - $this->assertFalse($cat); - /* Return null if the keyword category with the passed name does not exist */ - $cat = self::$dms->getKeywordCategoryByName('foo', 1); - $this->assertNull($cat); - /* Return category if the keyword category with the passed name exists */ - $cat = self::$dms->getKeywordCategoryByName('new category', 1); - $this->assertIsObject($cat); - $this->assertInstanceOf(SeedDMS_Core_Keywordcategory::class, $cat); - } - - /** - * Test getKeywordCategoryByName() with sql failure - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetKeywordCategoryByNameSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblKeywordCategories` WHERE `name` =")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $cat = $dms->getKeywordCategoryByName('foo', 1); - $this->assertFalse($cat); - } - - /** - * Test getDocumentCategories() - * - * The intitial database does not have any document categories - * - * @return void - */ - public function testGetDocumentCategories() - { - $cats = self::$dms->getDocumentCategories(); - $this->assertIsArray($cats); - $this->assertCount(0, $cats); - } - - /** - * Test getDocumentCategories() with sql failure - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDocumentCategoriesNameSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblCategory`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $cats = $dms->getDocumentCategories(); - $this->assertFalse($cats); - } - - /** - * Test getDocumentCategory() - * - * The intitial database does not have any document categories - * - * @return void - */ - public function testGetDocumentCategory() - { - /* Adding a new keyword category */ - $cat = self::$dms->addDocumentCategory('new category'); - $this->assertIsObject($cat); - $this->assertEquals('new category', $cat->getName()); - - $cat = self::$dms->getDocumentCategory($cat->getId()); - $this->assertIsObject($cat); - - /* Return false if the id is out of range */ - $cat = self::$dms->getDocumentCategory(0); - $this->assertFalse($cat); - - /* Return null if the keyword category with the id does not exist */ - $cat = self::$dms->getDocumentCategory(2); - $this->assertNull($cat); - } - - /** - * Test getDocumentCategory() with sql failure - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDocumentCategorySqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with("SELECT * FROM `tblCategory` WHERE `id` = 1") - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $cat = $dms->getDocumentCategory(1); - $this->assertFalse($cat); - } - - /** - * Test getDocumentCategoryByName() - * - * The intitial database does not have any document categories - * - * @return void - */ - public function testGetDocumentCategoryByName() - { - /* Adding a new keyword category with leading and trailing spaces*/ - $cat = self::$dms->addDocumentCategory(' new category '); - $this->assertIsObject($cat); - $this->assertEquals('new category', $cat->getName()); - - $cat = self::$dms->getDocumentCategoryByName($cat->getName()); - $this->assertIsObject($cat); - - $cat = self::$dms->getDocumentCategoryByName(' '); - $this->assertFalse($cat); - } - - /** - * Test getDocumentCategoryByName() with sql failure - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDocumentCategoryByNameSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblCategory` WHERE `name`=")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $cat = $dms->getDocumentCategoryByName('foo'); - $this->assertFalse($cat); - } - - /** - * Test addDocumentCategory() - * - * Add a new keyword category and retrieve it afterwards. Also check if the - * number of keyword categories has increased by one. Add a keyword category - * with the same name a second time and check if it returns false. - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddDocumentCategory() - { - /* Adding a new keyword category */ - $cat = self::$dms->addDocumentCategory('new category'); - $this->assertIsObject($cat); - $this->assertEquals('new category', $cat->getName()); - - /* Adding a document category with the same name must fail */ - $cat = self::$dms->addDocumentCategory('new category'); - $this->assertFalse($cat); - - /* Adding a document category with an empty name must fail */ - $cat = self::$dms->addDocumentCategory(' '); - $this->assertFalse($cat); - - /* There should be 1 document category now */ - $cats = self::$dms->getDocumentCategories(); - $this->assertIsArray($cats); - $this->assertCount(1, $cats); - } - - /** - * Test addDocumentCategoryWithPostAddHook() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddDocumentCategoryWithPostAddHook() - { - /* Add the 'onPostAddDocumentCategory' callback */ - $ret = 0; - $callback = function ($param, $group) use (&$ret) { - $ret = 1; - }; - self::$dms->addCallback('onPostAddDocumentCategory', $callback, 1); - /* Adding a new group */ - $cat = self::$dms->addDocumentCategory('new category'); - $this->assertIsObject($cat); - $this->assertEquals('new category', $cat->getName()); - $this->assertEquals(1, $ret); - } - - /** - * Test addDocumentCategory() with sql failure - * - * @return void - */ - public function testAddDocumentCategorySqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("INSERT INTO `tblCategory`")) - ->willReturn(false); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblCategory` WHERE `name`=")) - ->willReturn([]); - $dms = new SeedDMS_Core_DMS($db, ''); - $cat = $dms->addDocumentCategory('new category'); - $this->assertFalse($cat); - } - - /** - * Test getAttributeDefinition() with a none existing workflow - * - * The intitial database does not have any workflows - * - * @return void - */ - public function testGetAttributeDefinitionNoExists() - { - $workflow = self::$dms->getAttributeDefinition(1); - $this->assertNull($workflow); - /* Passing an id not a numeric value returns false */ - $workflow = self::$dms->getAttributeDefinition('foo'); - $this->assertFalse($workflow); - /* Passing an id out of range returns false */ - $workflow = self::$dms->getAttributeDefinition(0); - $this->assertFalse($workflow); - } - - /** - * Test getAttributeDefinition() with sql failure - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAttributeDefinitionSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblAttributeDefinitions` WHERE `id` =")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $attrdef = $dms->getAttributeDefinition(1); - $this->assertFalse($attrdef); - } - - /** - * Test getAttributeDefinitionByName() with a none existing workflow - * - * The intitial database does not have any workflows - * - * @return void - */ - public function testGetAttributeDefinitionByNameNoExists() - { - $workflow = self::$dms->getAttributeDefinitionByName('foo'); - $this->assertNull($workflow); - } - - /** - * Test getAttributeDefinitionByName() with sql failure - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAttributeDefinitionByNameSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblAttributeDefinitions` WHERE `name` =")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $attrdef = $dms->getAttributeDefinitionByName('foo'); - $this->assertFalse($attrdef); - } - - /** - * Test getAllAttributeDefinitions() - * - * The intitial database does not have any attribute definitions - * - * @return void - */ - public function testGetAllAttributeDefinitions() - { - $attrdefs = self::$dms->getAllAttributeDefinitions(); - $this->assertIsArray($attrdefs); - $this->assertCount(0, $attrdefs); - } - - /** - * Test getAllAttributeDefinitions() with sql failure - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAllAttributeDefinitionsSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblAttributeDefinitions`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $attrdef = $dms->getAllAttributeDefinitions(); - $this->assertFalse($attrdef); - } - - /** - * Test addAttributeDefinition() - * - * Add a new group and retrieve it afterwards. Also check if the number - * of groups has increased by one. Add a group with the same name a - * second time and check if it returns false. - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddAttributeDefinition() - { - /* Adding a new attribute definition */ - $attrdef = self::$dms->addAttributeDefinition('new attribute definition', SeedDMS_Core_AttributeDefinition::objtype_folder, SeedDMS_Core_AttributeDefinition::type_int, false, 0, 0, '', ''); - $this->assertIsObject($attrdef); - $this->assertEquals('new attribute definition', $attrdef->getName()); - /* Get the new attribute definition by its id */ - $newattrdef = self::$dms->getAttributeDefinition($attrdef->getId()); - $this->assertIsObject($newattrdef); - $this->assertEquals($attrdef->getId(), $newattrdef->getId()); - /* Get the new attribute definition by its name */ - $newattrdef = self::$dms->getAttributeDefinitionByName('new attribute definition'); - $this->assertIsObject($newattrdef); - $this->assertEquals($attrdef->getId(), $newattrdef->getId()); - /* Adding an attribute definition with the same name must fail */ - $attrdef = self::$dms->addAttributeDefinition('new attribute definition', SeedDMS_Core_AttributeDefinition::objtype_folder, SeedDMS_Core_AttributeDefinition::type_int, false, 0, 0, '', ''); - $this->assertFalse($attrdef); - /* Adding an attribute definition with an empty name must fail */ - $attrdef = self::$dms->addAttributeDefinition(' ', SeedDMS_Core_AttributeDefinition::objtype_folder, SeedDMS_Core_AttributeDefinition::type_int, false, 0, 0, '', ''); - $this->assertFalse($attrdef); - /* Adding an attribute definition with an invalid object type must fail */ - $attrdef = self::$dms->addAttributeDefinition('no object type', -1, SeedDMS_Core_AttributeDefinition::type_int, false, 0, 0, '', ''); - $this->assertFalse($attrdef); - /* Adding an attribute definition without a type must fail */ - $attrdef = self::$dms->addAttributeDefinition('no type', SeedDMS_Core_AttributeDefinition::objtype_folder, 0, 0, '', ''); - $this->assertFalse($attrdef); - /* There should be one attribute definition now */ - $attrdefs = self::$dms->getAllAttributeDefinitions(); - $this->assertIsArray($attrdefs); - $this->assertCount(1, $attrdefs); - /* There should be one attribute definition of object type folder now */ - $attrdefs = self::$dms->getAllAttributeDefinitions(SeedDMS_Core_AttributeDefinition::objtype_folder); - $this->assertIsArray($attrdefs); - $this->assertCount(1, $attrdefs); - /* The object type can also be passed as an array */ - $attrdefs = self::$dms->getAllAttributeDefinitions([SeedDMS_Core_AttributeDefinition::objtype_folder]); - $this->assertIsArray($attrdefs); - $this->assertCount(1, $attrdefs); - /* Adding more attribute definitions of different object type */ - $attrdef = self::$dms->addAttributeDefinition('new attribute definition all', SeedDMS_Core_AttributeDefinition::objtype_all, SeedDMS_Core_AttributeDefinition::type_int, false, 0, 0, '', ''); - $this->assertIsObject($attrdef); - $this->assertEquals('new attribute definition all', $attrdef->getName()); - $attrdef = self::$dms->addAttributeDefinition('new attribute definition document', SeedDMS_Core_AttributeDefinition::objtype_all, SeedDMS_Core_AttributeDefinition::type_int, false, 0, 0, '', ''); - $this->assertIsObject($attrdef); - $this->assertEquals('new attribute definition document', $attrdef->getName()); - $attrdef = self::$dms->addAttributeDefinition('new attribute definition documentcontent', SeedDMS_Core_AttributeDefinition::objtype_all, SeedDMS_Core_AttributeDefinition::type_int, false, 0, 0, '', ''); - $this->assertIsObject($attrdef); - $this->assertEquals('new attribute definition documentcontent', $attrdef->getName()); - /* There should be four attribute definitions now */ - $attrdefs = self::$dms->getAllAttributeDefinitions(); - $this->assertIsArray($attrdefs); - $this->assertCount(4, $attrdefs); - } - - /** - * Test getAllWorkflows() - * - * The intitial database does not have any workflows - * - * @return void - */ - public function testGetAllWorkflows() - { - $workflows = self::$dms->getAllWorkflows(); - $this->assertIsArray($workflows); - $this->assertCount(0, $workflows); - } - - /** - * Test getAllWorkflows() with sql failure - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAllWorkflowsSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblWorkflows`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $workflows = $dms->getAllWorkflows(); - $this->assertFalse($workflows); - } - - /** - * Test getWorkflow() with a none existing workflow - * - * The intitial database does not have any workflows - * - * @return void - */ - public function testGetWorkflowNoExists() - { - $workflow = self::$dms->getWorkflow(1); - $this->assertNull($workflow); - /* Passing an id not a numeric value returns false */ - $workflow = self::$dms->getWorkflow('foo'); - $this->assertFalse($workflow); - /* Passing an id out of range returns false */ - $workflow = self::$dms->getWorkflow(0); - $this->assertFalse($workflow); - } - - /** - * Test getWorkflow() with sql failure - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetWorkflowSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblWorkflows` WHERE `id`=")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $workflow = $dms->getWorkflow(1); - $this->assertFalse($workflow); - } - - /** - * Test getWorkflowByName() with a none existing workflow - * - * The intitial database does not have any workflows - * - * @return void - */ - public function testGetWorkflowByNameNoExists() - { - $workflow = self::$dms->getWorkflowByName('foo'); - $this->assertNull($workflow); - } - - /** - * Test getWorkflowByName() with sql failure - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetWorkflowByNameSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblWorkflows` WHERE `name`=")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $workflow = $dms->getWorkflowByName('foo'); - $this->assertFalse($workflow); - } - - /** - * Test addWorkflow() - * - * Add a new workflow and retrieve it afterwards. Also check if the number - * of workflows has increased by one. Add a workflow with the same name a - * second time and check if it returns false. - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddWorkflow() - { - /* Adding a new workflow */ - $workflowstate = self::$dms->addWorkflowState('new workflow state', S_RELEASED); - $workflow = self::$dms->addWorkflow('new workflow', $workflowstate); - $this->assertIsObject($workflow); - $this->assertEquals('new workflow', $workflow->getName()); - /* Adding a workflow with the same name must fail */ - $workflow = self::$dms->addWorkflow('new workflow', $workflowstate); - $this->assertFalse($workflow); - /* Adding a workflow with an empty name must fail */ - $workflow = self::$dms->addWorkflow(' ', $workflowstate); - $this->assertFalse($workflow); - /* There should be one workflow now */ - $workflows = self::$dms->getAllWorkflows(); - $this->assertIsArray($workflows); - $this->assertCount(1, $workflows); - } - - /** - * Test getAllWorkflowStates() - * - * The intitial database does not have any workflow states - * - * @return void - */ - public function testGetAllWorkflowStates() - { - $states = self::$dms->getAllWorkflowStates(); - $this->assertIsArray($states); - $this->assertCount(0, $states); - } - - /** - * Test getAllWorkflowStates() with sql failure - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAllWorkflowStatesSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblWorkflowStates`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $states = $dms->getAllWorkflowStates(); - $this->assertFalse($states); - } - - /** - * Test getWorkflowState() with a none existing workflow state - * - * The intitial database does not have any workflow states - * - * @return void - */ - public function testGetWorkflowStateNoExists() - { - $workflowstate = self::$dms->getWorkflowState(1); - $this->assertNull($workflowstate); - /* Passing an id not a numeric value returns false */ - $workflowstate = self::$dms->getWorkflowState('foo'); - $this->assertFalse($workflowstate); - /* Passing an id out of range returns false */ - $workflowstate = self::$dms->getWorkflowState(0); - $this->assertFalse($workflowstate); - } - - /** - * Test getWorkflowState() with sql failure - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetWorkflowStateSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblWorkflowStates` WHERE `id` =")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $state = $dms->getWorkflowState(1); - $this->assertFalse($state); - } - - /** - * Test getWorkflowStateByName() with a none existing workflow state - * - * The intitial database does not have any workflow states - * - * @return void - */ - public function testGetWorkflowStateByNameNoExists() - { - $workflowstate = self::$dms->getWorkflowStateByName('foo'); - $this->assertNull($workflowstate); - } - - /** - * Test getWorkflowStateByName() with sql failure - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetWorkflowStateByNameSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblWorkflowStates` WHERE `name`=")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $state = $dms->getWorkflowStateByName('foo'); - $this->assertFalse($state); - } - - /** - * Test addWorkflowState() - * - * Add a new workflow state and retrieve it afterwards. Also check if the number - * of workflow states has increased by one. Add a workflow state with the same name a - * second time and check if it returns false. - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddWorkflowState() - { - /* Adding a new workflow state */ - $workflowstate = self::$dms->addWorkflowState('new workflow state', S_RELEASED); - $this->assertIsObject($workflowstate); - $this->assertEquals('new workflow state', $workflowstate->getName()); - /* Adding a workflow state with the same name must fail */ - $workflowstate = self::$dms->addWorkflowState('new workflow state', S_RELEASED); - $this->assertFalse($workflowstate); - /* Adding a workflow state with an empty name must fail */ - $workflowstate = self::$dms->addWorkflowState(' ', S_RELEASED); - $this->assertFalse($workflowstate); - /* There should be one workflow state now */ - $workflowstates = self::$dms->getAllWorkflowStates(); - $this->assertIsArray($workflowstates); - $this->assertCount(1, $workflowstates); - } - - /** - * Test getAllWorkflowActions() - * - * The intitial database does not have any workflow actions - * - * @return void - */ - public function testGetAllWorkflowActions() - { - $actions = self::$dms->getAllWorkflowActions(); - $this->assertIsArray($actions); - $this->assertCount(0, $actions); - } - - /** - * Test getAllWorkflowActions() with sql failure - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAllWorkflowActionsSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblWorkflowActions`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $actions = $dms->getAllWorkflowActions(); - $this->assertFalse($actions); - } - - /** - * Test getWorkflowAction() with a none existing workflow - * - * The intitial database does not have any workflow actions - * - * @return void - */ - public function testGetWorkflowActionNoExists() - { - $workflowaction = self::$dms->getWorkflowAction(1); - $this->assertNull($workflowaction); - /* Passing an id not a numeric value returns false */ - $workflowaction = self::$dms->getWorkflowAction('foo'); - $this->assertFalse($workflowaction); - /* Passing an id out of range returns false */ - $workflowaction = self::$dms->getWorkflowAction(0); - $this->assertFalse($workflowaction); - } - - /** - * Test getWorkflowAction() with sql failure - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetWorkflowActionSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblWorkflowActions` WHERE `id` =")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $action = $dms->getWorkflowAction(1); - $this->assertFalse($action); - } - - /** - * Test getWorkflowActionByName() with a none existing workflow action - * - * The intitial database does not have any workflow actions - * - * @return void - */ - public function testGetWorkflowActionByNameNoExists() - { - $workflowaction = self::$dms->getWorkflowActionByName('foo'); - $this->assertNull($workflowaction); - } - - /** - * Test getWorkflowActionByName() with sql failure - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetWorkflowActionByNameSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblWorkflowActions` WHERE `name` =")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $action = $dms->getWorkflowActionByName('foo'); - $this->assertFalse($action); - } - - /** - * Test addWorkflowAction() - * - * Add a new workflow state and retrieve it afterwards. Also check if the number - * of workflow states has increased by one. Add a workflow state with the same name a - * second time and check if it returns false. - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddWorkflowAction() - { - /* Adding a new workflow action */ - $workflowaction = self::$dms->addWorkflowAction('new workflow action', S_RELEASED); - $this->assertIsObject($workflowaction); - $this->assertEquals('new workflow action', $workflowaction->getName()); - /* Adding a workflow action with the same name must fail */ - $workflowaction = self::$dms->addWorkflowAction('new workflow action', S_RELEASED); - $this->assertFalse($workflowaction); - /* Adding a workflow action with an empty name must fail */ - $workflowaction = self::$dms->addWorkflowAction(' ', S_RELEASED); - $this->assertFalse($workflowaction); - /* There should be one workflow action now */ - $workflowactions = self::$dms->getAllWorkflowActions(); - $this->assertIsArray($workflowactions); - $this->assertCount(1, $workflowactions); - } - - /** - * Test getStatisticalData() - * - * @return void - */ - public function testGetStatisticalData() - { - /* There should one folder (root folder) */ - $data = self::$dms->getStatisticalData('foldersperuser'); - $this->assertIsArray($data); - $this->assertEquals(1, $data[0]['total']); - /* There should be no documents */ - foreach (array('docsperuser', 'docspermimetype', 'docspercategory', 'docspermonth', 'docsperstatus', 'docsaccumulated', 'sizeperuser') as $type) { - $data = self::$dms->getStatisticalData($type); - $this->assertIsArray($data); - $this->assertCount(0, $data); - } - /* Passing an unknown name returns an empty array */ - $data = self::$dms->getStatisticalData('foo'); - $this->assertIsArray($data); - $this->assertCount(0, $data); - } - - /** - * Test getStatisticalDataFail() - * - * Check if getStatisticalData() fails if the sql statements fail - * - * @return void - */ - public function testGetStatisticalDataFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->any()) - ->method('getResultArray') - ->with($this->stringContains("SELECT ")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - foreach (array('foldersperuser', 'docsperuser', 'docspermimetype', 'docspercategory', 'docspermonth', 'docsperstatus', 'docsaccumulated', 'sizeperuser') as $type) { - $data = $dms->getStatisticalData($type); - $this->assertFalse($data); - } - } - - /** - * Test createPasswordRequest() and checkPasswordRequest() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testCreateAndCheckAndDeletePasswordRequest() - { - $user = self::$dms->getUser(1); - $hash = self::$dms->createPasswordRequest($user); - $this->assertIsString($hash); - $user = self::$dms->checkPasswordRequest($hash); - $this->assertIsObject($user); - $this->assertEquals(1, $user->getId()); - /* Check a non existing hash */ - $user = self::$dms->checkPasswordRequest('foo'); - $this->assertFalse($user); - /* Delete the hash */ - $ret = self::$dms->deletePasswordRequest($hash); - $this->assertTrue($ret); - /* Checking the hash again must return false, because it was deleted */ - $user = self::$dms->checkPasswordRequest($hash); - $this->assertFalse($user); - } - - /** - * Test method checkPasswordRequest() with sql failure - * - * @return void - */ - public function testCheckPasswordRequestSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblUserPasswordRequest`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $this->assertFalse($dms->checkPasswordRequest('foo')); - } - - /** - * Test method deletePasswordRequest() with sql failure - * - * @return void - */ - public function testDeletePasswordRequestSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("DELETE FROM `tblUserPasswordRequest`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $this->assertFalse($dms->deletePasswordRequest('foo')); - } - - /** - * Test getTimeline() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetTimeline() - { - $timeline = self::$dms->getTimeline(); - $this->assertIsArray($timeline); - } - - /** - * Test getUnlinkedDocumentContent() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetUnlinkedDocumentContent() - { - $contents = self::$dms->getUnlinkedDocumentContent(); - $this->assertIsArray($contents); - $this->assertCount(0, $contents); - } - - /** - * Test getNoFileSizeDocumentContent() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetNoFileSizeDocumentContent() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $document = self::createDocument($rootfolder, $user, 'Document 1'); - $contents = self::$dms->getNoFileSizeDocumentContent(); - $this->assertIsArray($contents); - $this->assertCount(0, $contents); - /* Manipulate the file size right in the database */ - $dbh = self::$dms->getDB(); - $ret = $dbh->getResult("UPDATE `tblDocumentContent` SET `fileSize` = 0"); - $this->assertTrue($ret); - $contents = self::$dms->getNoFileSizeDocumentContent(); - $this->assertIsArray($contents); - $this->assertCount(1, $contents); - } - - /** - * Test getNoFileSizeDocumentContent() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetNoFileSizeDocumentContentSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblDocumentContent` WHERE `fileSize`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $this->assertFalse($dms->getNoFileSizeDocumentContent()); - } - - /** - * Test getNoChecksumDocumentContent() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetNoChecksumDocumentContent() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $document = self::createDocument($rootfolder, $user, 'Document 1'); - $contents = self::$dms->getNoChecksumDocumentContent(); - $this->assertIsArray($contents); - $this->assertCount(0, $contents); - /* Manipulate the checksum right in the database */ - $dbh = self::$dms->getDB(); - $ret = $dbh->getResult("UPDATE `tblDocumentContent` SET `checksum` = null"); - $this->assertTrue($ret); - $contents = self::$dms->getNoChecksumDocumentContent(); - $this->assertIsArray($contents); - $this->assertCount(1, $contents); - } - - /** - * Test getNoChecksumDocumentContent() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetNoChecksumDocumentContentSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblDocumentContent` WHERE `checksum`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $this->assertFalse($dms->getNoChecksumDocumentContent()); - } - - /** - * Test getDuplicateDocumentContent() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDuplicateDocumentContent() - { - $contents = self::$dms->getDuplicateDocumentContent(); - $this->assertIsArray($contents); - $this->assertCount(0, $contents); - } - - /** - * Test getDuplicateDocumentContent() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDuplicateDocumentContentWithDuplicates() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $document1 = self::createDocument($rootfolder, $user, 'Document 1'); - - $filename = self::createTempFile(200); - list($document2, $res) = $rootfolder->addDocument( - 'Documet 2', // name - '', // comment - null, // no expiration - $user, // owner - '', // keywords - [], // categories - $filename, // name of file - 'file1.txt', // original file name - '.txt', // file type - 'text/plain', // mime type - 1.0 // sequence - ); - list($document3, $res) = $rootfolder->addDocument( - 'Documet 3', // name - '', // comment - null, // no expiration - $user, // owner - '', // keywords - [], // categories - $filename, // name of file - 'file1.txt', // original file name - '.txt', // file type - 'text/plain', // mime type - 1.0 // sequence - ); - $this->assertTrue(SeedDMS_Core_File::removeFile($filename)); - - $contents = self::$dms->getDuplicateDocumentContent(); - $this->assertIsArray($contents); - $this->assertCount(1, $contents); - } - - /** - * Test method getDuplicateDocumentContent() with sql failure - * - * @return void - */ - public function testGetDuplicateDocumentContentSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT a.*, b.`id` as dupid FROM `tblDocumentContent`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $this->assertFalse($dms->getDuplicateDocumentContent()); - } - - /** - * Test getNotificationsByUser() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetNotificationsByUser() - { - $user = self::$dms->getUser(1); - $notifications = self::$dms->getNotificationsByUser($user, 0); - $this->assertIsArray($notifications); - $this->assertCount(0, $notifications); - $notifications = self::$dms->getNotificationsByUser($user, 1); - $this->assertIsArray($notifications); - $this->assertCount(0, $notifications); - } - - /** - * Test getNotificationsByGroup() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetNotificationsByGroup() - { - $group = self::$dms->addGroup('new group', 'with comment'); - $this->assertIsObject($group); - $notifications = self::$dms->getNotificationsByGroup($group, 0); - $this->assertIsArray($notifications); - $this->assertCount(0, $notifications); - $notifications = self::$dms->getNotificationsByGroup($group, 1); - $this->assertIsArray($notifications); - $this->assertCount(0, $notifications); - } - - /** - * Test getDocumentsExpired() - * - * Check if getDocumentsExpired() fails if the parameters are wrong - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDocumentsExpiredFail() - { - $documents = self::$dms->getDocumentsExpired(false); - $this->assertFalse($documents); - $documents = self::$dms->getDocumentsExpired('2021-04'); - $this->assertFalse($documents); - $documents = self::$dms->getDocumentsExpired('2021-01-32'); - $this->assertFalse($documents); - $documents = self::$dms->getDocumentsExpired('2021-01-31'); // valid date - $this->assertIsArray($documents); - } - - /** - * Test method getDocumentsExpired() with sql failure - * - * @return void - */ - public function testGetDocumentsExpiredSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('createTemporaryTable') - ->with('ttstatid') - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $this->assertFalse($dms->getDocumentsExpired(1)); - } - - /** - * Test getDocumentByName() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDocumentByName() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $this->assertInstanceOf(SeedDMS_Core_Folder::class, $rootfolder); - $subfolder = $rootfolder->addSubFolder('Subfolder 1', '', $user, 2.0); - $this->assertInstanceOf(SeedDMS_Core_Folder::class, $subfolder); - - /* Add a new document */ - $filename = self::createTempFile(200); - list($document, $res) = $subfolder->addDocument( - 'Document 1', // name - '', // comment - null, // no expiration - $user, // owner - '', // keywords - [], // categories - $filename, // name of file - 'file1.txt', // original file name - '.txt', // file type - 'text/plain', // mime type - 1.0 // sequence - ); - $this->assertIsObject($document); - $this->assertTrue(SeedDMS_Core_File::removeFile($filename)); - /* Search without a parent folder restriction */ - $document = self::$dms->getDocumentByName('Document 1'); - $this->assertInstanceOf(SeedDMS_Core_Document::class, $document); - /* Searching in the root folder will return no document */ - $document = self::$dms->getDocumentByName('Document 1', $rootfolder); - $this->assertNull($document); - /* Searching in the sub folder will return the document */ - $document = self::$dms->getDocumentByName('Document 1', $subfolder); - $this->assertInstanceOf(SeedDMS_Core_Document::class, $document); - /* Searching for an empty name returns false */ - $document = self::$dms->getDocumentByName(' '); - $this->assertFalse($document); - } - - /** - * Test getDocumentByName() with sql failure - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDocumentByNameSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT `tblDocuments`.*, `tblDocumentLocks`.`userID` as `lockUser`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document = $dms->getDocumentByName('foo'); - $this->assertFalse($document); - } - - /** - * Test getDocumentByOriginalFilename() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDocumentByOriginalFilename() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $this->assertInstanceOf(SeedDMS_Core_Folder::class, $rootfolder); - $subfolder = $rootfolder->addSubFolder('Subfolder 1', '', $user, 2.0); - $this->assertInstanceOf(SeedDMS_Core_Folder::class, $subfolder); - - /* Add a new document */ - $filename = self::createTempFile(200); - list($document, $res) = $subfolder->addDocument( - 'Document 1', // name - '', // comment - null, // no expiration - $user, // owner - '', // keywords - [], // categories - $filename, // name of file - 'file1.txt', // original file name - '.txt', // file type - 'text/plain', // mime type - 1.0 // sequence - ); - $this->assertIsObject($document); - $this->assertTrue(SeedDMS_Core_File::removeFile($filename)); - /* Search without a parent folder restriction */ - $document = self::$dms->getDocumentByOriginalFilename('file1.txt'); - $this->assertInstanceOf(SeedDMS_Core_Document::class, $document); - /* Searching in the root folder will return no document */ - $document = self::$dms->getDocumentByOriginalFilename('file1.txt', $rootfolder); - $this->assertNull($document); - /* Searching in the sub folder will return the document */ - $document = self::$dms->getDocumentByOriginalFilename('file1.txt', $subfolder); - $this->assertInstanceOf(SeedDMS_Core_Document::class, $document); - /* Searching for an empty name returns false */ - $document = self::$dms->getDocumentByOriginalFilename(' '); - $this->assertFalse($document); - } - - /** - * Test method getDocumentByOriginalFilename() with sql failure - * - * @return void - */ - public function testGetDocumentByOriginalFilenameSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('createTemporaryTable') - ->with('ttcontentid') - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $this->assertFalse($dms->getDocumentByOriginalFilename(1)); - } - - /** - * Test getDocumentList() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDocumentList() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $this->assertInstanceOf(SeedDMS_Core_Folder::class, $rootfolder); - - /* Add a new document */ - $filename = self::createTempFile(200); - list($document, $res) = $rootfolder->addDocument( - 'Document 1', // name - '', // comment - null, // no expiration - $user, // owner - '', // keywords - [], // categories - $filename, // name of file - 'file1.txt', // original file name - '.txt', // file type - 'text/plain', // mime type - 1.0 // sequence - ); - $this->assertTrue(SeedDMS_Core_File::removeFile($filename)); - $this->assertIsObject($document); - - /* Add a second new document */ - $filename = self::createTempFile(200); - list($document, $res) = $rootfolder->addDocument( - 'Document 2', // name - '', // comment - mktime(0, 0, 0), // expires today - $user, // owner - '', // keywords - [], // categories - $filename, // name of file - 'file2.txt', // original file name - '.txt', // file type - 'text/plain', // mime type - 1.0 // sequence - ); - $this->assertTrue(SeedDMS_Core_File::removeFile($filename)); - $this->assertIsObject($document); - - $documents = self::$dms->getDocumentList('MyDocs', $user); - $this->assertIsArray($documents); - $this->assertCount(2, $documents); - /* All documents expiring from 1 year ago till today */ - $documents = self::$dms->getDocumentList('ExpiredOwner', $user); - $this->assertIsArray($documents); - $this->assertCount(1, $documents); - /* All documents expiring today */ - $documents = self::$dms->getDocumentList('ExpiredOwner', $user, 0); - $this->assertIsArray($documents); - $this->assertCount(1, $documents); - /* All documents expiring tomorrow */ - $documents = self::$dms->getDocumentList('ExpiredOwner', $user, date("Y-m-d", time()+86400)); - $this->assertIsArray($documents); - $this->assertCount(1, $documents); - /* Get unknown list */ - $documents = self::$dms->getDocumentList('foo', $user); - $this->assertFalse($documents); - } - - /** - * Test search() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testSearch() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $this->assertInstanceOf(SeedDMS_Core_Folder::class, $rootfolder); - $subfolder = $rootfolder->addSubFolder('Subfolder 1', '', $user, 2.0); - $this->assertInstanceOf(SeedDMS_Core_Folder::class, $subfolder); - - /* Add a new document to the subfolder*/ - $filename = self::createTempFile(200); - list($document, $res) = $subfolder->addDocument( - 'Document 1', // name - '', // comment - null, // no expiration - $user, // owner - '', // keywords - [], // categories - $filename, // name of file - 'file1.txt', // original file name - '.txt', // file type - 'text/plain', // mime type - 1.0 // sequence - ); - $this->assertTrue(SeedDMS_Core_File::removeFile($filename)); - /* Add a new document to the root folder. All documents expire. The first - * expires today, the second expires tomorrow, etc. - */ - for ($i=2; $i<=30; $i++) { - $filename = self::createTempFile(200); - list($document, $res) = $rootfolder->addDocument( - 'Document '.$i, // name - '', // comment - mktime(0, 0, 0)+($i-2)*86400, // expires in $i-2 days - $user, // owner - '', // keywords - [], // categories - $filename, // name of file - 'file'.$i.'.txt', // original file name - '.txt', // file type - 'text/plain', // mime type - 1.0+$i // sequence - ); - $this->assertTrue(SeedDMS_Core_File::removeFile($filename)); - } - $hits = self::$dms->search(['query'=>'Document']); - $this->assertIsArray($hits); - $this->assertCount(5, $hits); - $this->assertEquals(30, $hits['totalDocs']); - $this->assertCount(30, $hits['docs']); - /* Limit number of documents to 10 */ - $hits = self::$dms->search(['query'=>'Document', 'limit'=>10]); - $this->assertIsArray($hits); - $this->assertCount(5, $hits); - $this->assertEquals(30, $hits['totalDocs']); - $this->assertCount(10, $hits['docs']); - /* Same number of documents if startFolder is the root folder */ - $hits = self::$dms->search(['query'=>'Document', 'startFolder'=>$rootfolder]); - $this->assertIsArray($hits); - $this->assertCount(5, $hits); - $this->assertEquals(30, $hits['totalDocs']); - $this->assertCount(30, $hits['docs']); - /* There is just one document below the sub folder */ - $hits = self::$dms->search(['query'=>'Document', 'startFolder'=>$subfolder]); - $this->assertIsArray($hits); - $this->assertCount(5, $hits); - $this->assertEquals(1, $hits['totalDocs']); - /* Get documents with a given expiration date in the future - * All documents in subfolder, but not the one in the root folder - */ - $expts = mktime(0, 0, 0); - $expstart = [ - 'year'=>date('Y', $expts), - 'month'=>date('m', $expts), - 'day'=>date('d', $expts), - 'hour'=>date('H', $expts), - 'minute'=>date('i', $expts), - 'second'=>date('s', $expts) - ]; - $hits = self::$dms->search(['query'=>'Document', 'expirationstartdate'=>$expstart]); - $this->assertIsArray($hits); - $this->assertCount(5, $hits); - $this->assertEquals(29, $hits['totalDocs']); - /* Get documents with a given expiration date in the future, starting tomorrow - * All documents in subfolder - 1 - */ - $expts = mktime(0, 0, 0)+86400; - $expstart = [ - 'year'=>date('Y', $expts), - 'month'=>date('m', $expts), - 'day'=>date('d', $expts), - 'hour'=>date('H', $expts), - 'minute'=>date('i', $expts), - 'second'=>date('s', $expts) - ]; - $hits = self::$dms->search(['query'=>'Document', 'expirationstartdate'=>$expstart]); - $this->assertIsArray($hits); - $this->assertCount(5, $hits); - $this->assertEquals(28, $hits['totalDocs']); - /* Get documents expire today or tomorrow - * 2 documents in subfolder - */ - $expts = mktime(0, 0, 0); - $expstart = [ - 'year'=>date('Y', $expts), - 'month'=>date('m', $expts), - 'day'=>date('d', $expts), - 'hour'=>date('H', $expts), - 'minute'=>date('i', $expts), - 'second'=>date('s', $expts) - ]; - $expts += 1*86400; - $expstop = [ - 'year'=>date('Y', $expts), - 'month'=>date('m', $expts), - 'day'=>date('d', $expts), - 'hour'=>date('H', $expts), - 'minute'=>date('i', $expts), - 'second'=>date('s', $expts) - ]; - $hits = self::$dms->search(['query'=>'Document', 'expirationstartdate'=>$expstart, 'expirationenddate'=>$expstop]); - $this->assertIsArray($hits); - $this->assertCount(5, $hits); - $this->assertEquals(2, $hits['totalDocs']); - /* Get documents expire before and tomorrow - * 2 documents in subfolder - */ - $expts = mktime(0, 0, 0); // Start of today - $expts += 1*86400; // Start of tomorrow - $expstop = [ - 'year'=>date('Y', $expts), - 'month'=>date('m', $expts), - 'day'=>date('d', $expts), - 'hour'=>date('H', $expts), - 'minute'=>date('i', $expts), - 'second'=>date('s', $expts) - ]; - $hits = self::$dms->search(['query'=>'Document', 'expirationenddate'=>$expstop]); - $this->assertIsArray($hits); - $this->assertCount(5, $hits); - $this->assertEquals(2, $hits['totalDocs']); - } - -} - diff --git a/SeedDMS_Core/tests/DmsWithDataTest.php b/SeedDMS_Core/tests/DmsWithDataTest.php deleted file mode 100644 index 17fde09e7..000000000 --- a/SeedDMS_Core/tests/DmsWithDataTest.php +++ /dev/null @@ -1,290 +0,0 @@ - - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version @package_version@ - * @link https://www.seeddms.org - */ - -use PHPUnit\Framework\SeedDmsTest; - -/** - * DMS test class - * - * @category SeedDMS - * @package Tests - * @author Uwe Steinmann - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version Release: @package_version@ - * @link https://www.seeddms.org - */ -class DmsWithDataTest extends SeedDmsTest -{ - - /** - * Create a real sqlite database in memory - * - * @return void - */ - protected function setUp(): void - { - self::$dbh = self::createInMemoryDatabase(); - self::$contentdir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'phpunit-'.time(); - mkdir(self::$contentdir); - // echo "Creating temp content dir: ".self::$contentdir."\n"; - self::$dms = new SeedDMS_Core_DMS(self::$dbh, self::$contentdir); - } - - /** - * Clean up at tear down - * - * @return void - */ - protected function tearDown(): void - { - self::$dbh = null; - // echo "\nRemoving temp. content dir: ".self::$contentdir."\n"; - exec('rm -rf '.self::$contentdir); - } - - /** - * Test getFoldersMinMax() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetFoldersMinMax() - { - self::createSimpleFolderStructure(); - $rootfolder = self::$dms->getRootFolder(); - $minmax = $rootfolder->getFoldersMinMax(); - $this->assertIsArray($minmax); - $this->assertCount(2, $minmax); - $this->assertEquals(0.5, $minmax['min']); - $this->assertEquals(2.0, $minmax['max']); - } - - /** - * Test method getFoldersMinMax() - * - * @return void - */ - public function testGetFoldersMinMaxSqlFail() - { - $rootfolder = $this->getMockedRootFolder(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT min(`sequence`) AS `min`, max(`sequence`) AS `max` FROM `tblFolders`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $rootfolder->setDMS($dms); - $this->assertFalse($rootfolder->getFoldersMinMax()); - } - - /** - * Test getDocumentsMinMax() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDocumentsMinMax() - { - self::createSimpleFolderStructureWithDocuments(); - $subfolder = self::$dms->getFolderByName('Subfolder 1'); - $this->assertIsObject($subfolder); - $minmax = $subfolder->getDocumentsMinMax(); - $this->assertIsArray($minmax); - $this->assertCount(2, $minmax); - $this->assertEquals(2.0, $minmax['min']); - $this->assertEquals(16.0, $minmax['max']); - } - - /** - * Test method getDocumentsMinMax() - * - * @return void - */ - public function testGetDocumentsMinMaxSqlFail() - { - $rootfolder = $this->getMockedRootFolder(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT min(`sequence`) AS `min`, max(`sequence`) AS `max` FROM `tblDocuments`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $rootfolder->setDMS($dms); - $this->assertFalse($rootfolder->getDocumentsMinMax()); - } - - /** - * Test addDocument() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddDocument() - { - self::createSimpleFolderStructure(); - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $this->assertInstanceOf(SeedDMS_Core_Folder::class, $rootfolder); - $this->assertEquals(1, $rootfolder->getId()); - /* Add a new document */ - $filename = self::createTempFile(200); - list($document, $res) = $rootfolder->addDocument( - 'Document 1', // name - '', // comment - null, // expiration - $user, // owner - '', // keywords - [], // categories - $filename, // name of file - 'file1.txt', // original file name - '.txt', // file type - 'text/plain', // mime type - 1.0 // sequence - ); - $this->assertTrue(SeedDMS_Core_File::removeFile($filename)); - $this->assertIsObject($document); - $this->assertInstanceOf(SeedDMS_Core_Document::class, $document); - $this->assertEquals('Document 1', $document->getName()); - } - - /** - * Test getDocumentsExpired() - * - * Create two documents which will expired today and tomorrow - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDocumentsExpiredFuture() - { - self::createSimpleFolderStructure(); - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $this->assertInstanceOf(SeedDMS_Core_Folder::class, $rootfolder); - $this->assertEquals(1, $rootfolder->getId()); - /* Add a new document */ - $filename = self::createTempFile(200); - list($document, $res) = $rootfolder->addDocument( - 'Document 1', // name - '', // comment - mktime(23,59,59), // expiration is still today at 23:59:59 - $user, // owner - '', // keywords - [], // categories - $filename, // name of file - 'file1.txt', // original file name - '.txt', // file type - 'text/plain', // mime type - 1.0 // sequence - ); - $this->assertIsObject($document); - list($document, $res) = $rootfolder->addDocument( - 'Document 2', // name - '', // comment - mktime(23,59,59)+1, // expiration is tomorrow today at 0:00:00 - $user, // owner - '', // keywords - [], // categories - $filename, // name of file - 'file1.txt', // original file name - '.txt', // file type - 'text/plain', // mime type - 1.0 // sequence - ); - $this->assertIsObject($document); - $this->assertTrue(SeedDMS_Core_File::removeFile($filename)); - $documents = self::$dms->getDocumentsExpired(0); /* Docs expire today */ - $this->assertIsArray($documents); - $this->assertCount(1, $documents); - $documents = self::$dms->getDocumentsExpired(date('Y-m-d')); /* Docs expire today */ - $this->assertIsArray($documents); - $this->assertCount(1, $documents); - $documents = self::$dms->getDocumentsExpired(1); /* Docs expire till tomorrow 23:59:59 */ - $this->assertIsArray($documents); - $this->assertCount(2, $documents); - $documents = self::$dms->getDocumentsExpired(date('Y-m-d', time()+86400)); /* Docs expire till tomorrow 23:59:59 */ - $this->assertIsArray($documents); - $this->assertCount(2, $documents); - $documents = self::$dms->getDocumentsExpired(date('Y-m-d', time()+86400), $user); /* Docs expire till tomorrow 23:59:59 owned by $user */ - $this->assertIsArray($documents); - $this->assertCount(2, $documents); - } - - /** - * Test getDocumentsExpired() - * - * Create two documents which have expired yesterday and the day before - * yesterday - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDocumentsExpiredPast() - { - self::createSimpleFolderStructure(); - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $this->assertInstanceOf(SeedDMS_Core_Folder::class, $rootfolder); - $this->assertEquals(1, $rootfolder->getId()); - /* Add a new document */ - $filename = self::createTempFile(200); - list($document, $res) = $rootfolder->addDocument( - 'Document 1', // name - '', // comment - mktime(0,0,0)-1, // expiration was yesterday - $user, // owner - '', // keywords - [], // categories - $filename, // name of file - 'file1.txt', // original file name - '.txt', // file type - 'text/plain', // mime type - 1.0 // sequence - ); - $this->assertIsObject($document); - list($document, $res) = $rootfolder->addDocument( - 'Document 2', // name - '', // comment - mktime(0,0,0)-1-86400, // expiration the day before yesterday - $user, // owner - '', // keywords - [], // categories - $filename, // name of file - 'file1.txt', // original file name - '.txt', // file type - 'text/plain', // mime type - 1.0 // sequence - ); - $this->assertTrue(SeedDMS_Core_File::removeFile($filename)); - $this->assertIsObject($document); - $documents = self::$dms->getDocumentsExpired(0); /* No Docs expire today */ - $this->assertIsArray($documents); - $this->assertCount(0, $documents); - $documents = self::$dms->getDocumentsExpired(-1); /* Docs expired yesterday */ - $this->assertIsArray($documents); - $this->assertCount(1, $documents); - $documents = self::$dms->getDocumentsExpired(-2); /* Docs expired since the day before yesterday */ - $this->assertIsArray($documents); - $this->assertCount(2, $documents); - } - - -} diff --git a/SeedDMS_Core/tests/DocumentCategoryTest.php b/SeedDMS_Core/tests/DocumentCategoryTest.php deleted file mode 100644 index 37309d9a1..000000000 --- a/SeedDMS_Core/tests/DocumentCategoryTest.php +++ /dev/null @@ -1,295 +0,0 @@ - - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version @package_version@ - * @link https://www.seeddms.org - */ - -use PHPUnit\Framework\SeedDmsTest; - -/** - * User test class - * - * @category SeedDMS - * @package Tests - * @author Uwe Steinmann - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version Release: @package_version@ - * @link https://www.seeddms.org - */ -class DocumentCategoryTest extends SeedDmsTest -{ - - /** - * Create a real sqlite database in memory - * - * @return void - */ - protected function setUp(): void - { - self::$dbh = self::createInMemoryDatabase(); - self::$contentdir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'phpunit-'.time(); - mkdir(self::$contentdir); - // echo "Creating temp content dir: ".self::$contentdir."\n"; - self::$dms = new SeedDMS_Core_DMS(self::$dbh, self::$contentdir); - } - - /** - * Clean up at tear down - * - * @return void - */ - protected function tearDown(): void - { - self::$dbh = null; - // echo "\nRemoving temp. content dir: ".self::$contentdir."\n"; - exec('rm -rf '.self::$contentdir); - } - - /** - * Test method getName() and setName() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetName() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $cat = self::$dms->addDocumentCategory('Category 1'); - $name = $cat->getName(); - $ret = $cat->setName('foo'); - $this->assertTrue($ret); - $name = $cat->getName(); - $this->assertEquals('foo', $name); - $ret = $cat->setName(' '); - $this->assertFalse($ret); - } - - /** - * Test method addCategories(), hasCategory(), setCategory() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddCategoryToDocument() - { - $rootfolder = self::$dms->getRootFolder(); - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - - /* Add a new document and two categories */ - $document = self::createDocument($rootfolder, $user, 'Document 1'); - $cat1 = self::$dms->addDocumentCategory('Category 1'); - $cat2 = self::$dms->addDocumentCategory('Category 2'); - - /* There are no categories yet */ - $ret = $document->hasCategory($cat1); - $this->assertFalse($ret); - - /* Not passing a category yields on error */ - $ret = $document->hasCategory(null); - $this->assertFalse($ret); - - /* Adding a category ... */ - $ret = $document->addCategories([$cat1]); - $this->assertTrue($ret); - - /* ... and check if it is there */ - $ret = $document->hasCategory($cat1); - $this->assertTrue($ret); - - /* There should be one category now */ - $cats = $document->getCategories(); - $this->assertIsArray($cats); - $this->assertCount(1, $cats); - $this->assertEquals($cat1->getName(), $cats[0]->getName()); - - /* Adding the same category shouldn't change anything */ - $ret = $document->addCategories([$cat1]); - $this->assertTrue($ret); - - /* Check if category is used */ - $ret = $cat1->isUsed(); - $this->assertTrue($ret); - $ret = $cat2->isUsed(); - $this->assertFalse($ret); - - /* There is one document with cat 1 but none with cat 2 */ - $docs = $cat1->getDocumentsByCategory(); - $this->assertIsArray($docs); - $this->assertCount(1, $docs); - $num = $cat1->countDocumentsByCategory(); - $this->assertEquals(1, $num); - $docs = $cat2->getDocumentsByCategory(); - $this->assertIsArray($docs); - $this->assertCount(0, $docs); - $num = $cat2->countDocumentsByCategory(); - $this->assertEquals(0, $num); - - /* Still only one category */ - $cats = $document->getCategories(); - $this->assertIsArray($cats); - $this->assertCount(1, $cats); - - /* Setting new categories will replace the old ones */ - $ret = $document->setCategories([$cat1, $cat2]); - $this->assertTrue($ret); - - /* Now we have two categories */ - $cats = $document->getCategories(); - $this->assertIsArray($cats); - $this->assertCount(2, $cats); - - /* Remove a category */ - $ret = $document->removeCategories([$cat1]); - $this->assertTrue($ret); - - /* Removing the same category again does not harm*/ - $ret = $document->removeCategories([$cat1]); - $this->assertTrue($ret); - - /* We are back to one category */ - $cats = $document->getCategories(); - $this->assertIsArray($cats); - $this->assertCount(1, $cats); - - /* Remove the remaining category from the document */ - $ret = $document->removeCategories($cats); - $this->assertTrue($ret); - - /* No category left */ - $cats = $document->getCategories(); - $this->assertIsArray($cats); - $this->assertCount(0, $cats); - - /* Remove the category itself */ - $cats = self::$dms->getDocumentCategories(); - $this->assertIsArray($cats); - $this->assertCount(2, $cats); - $ret = $cat1->remove(); - $cats = self::$dms->getDocumentCategories(); - $this->assertIsArray($cats); - $this->assertCount(1, $cats); - } - - /** - * Test method getCategories() with sql fail - * - * @return void - */ - public function testGetCategoriesSqlFail() - { - $document = $this->getMockedDocument(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblCategory` WHERE")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document->setDMS($dms); - $this->assertFalse($document->getCategories()); - } - - /** - * Test method addCategories() with sql fail - * - * @return void - */ - public function testAddCategoriesSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - /* mock sql statement in getCategories() which is called in addCategories() */ - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblCategory` WHERE")) - ->willReturn([]); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("INSERT INTO `tblDocumentCategory`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document = $this->getMockedDocument(); - $document->setDMS($dms); - $cat = new SeedDMS_Core_DocumentCategory(1, 'Category'); - $cat->setDMS($dms); - $this->assertFalse($document->addCategories([$cat])); - } - - /** - * Test method removeCategories() with sql fail - * - * @return void - */ - public function testRemoveCategoriesSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("DELETE FROM `tblDocumentCategory` WHERE")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document = $this->getMockedDocument(); - $document->setDMS($dms); - $cat = new SeedDMS_Core_DocumentCategory(1, 'Category'); - $cat->setDMS($dms); - $this->assertFalse($document->removeCategories([$cat])); - } - - /** - * Test method setCategories() with sql fail when deleting categories - * - * @return void - */ - public function testSetCategoriesSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("DELETE FROM `tblDocumentCategory` WHERE")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document = $this->getMockedDocument(); - $document->setDMS($dms); - $cat = new SeedDMS_Core_DocumentCategory(1, 'Category'); - $cat->setDMS($dms); - $this->assertFalse($document->setCategories([$cat])); - } - - /** - * Test method setCategories() with sql fail when inserting new categories - * - * @return void - */ - public function testSetCategoriesSqlFail2() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->exactly(2)) - ->method('getResult') - ->will( - $this->returnValueMap( - array( - array("DELETE FROM `tblDocumentCategory` WHERE `documentID` = 1", true, true), - array("INSERT INTO `tblDocumentCategory`", true, false) - ) - ) - ); - $dms = new SeedDMS_Core_DMS($db, ''); - $document = $this->getMockedDocument(); - $document->setDMS($dms); - $cat = new SeedDMS_Core_DocumentCategory(1, 'Category'); - $cat->setDMS($dms); - $this->assertFalse($document->setCategories([$cat])); - } - -} - diff --git a/SeedDMS_Core/tests/DocumentContentTest.php b/SeedDMS_Core/tests/DocumentContentTest.php deleted file mode 100644 index 9a8e9a14b..000000000 --- a/SeedDMS_Core/tests/DocumentContentTest.php +++ /dev/null @@ -1,593 +0,0 @@ - - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version @package_version@ - * @link https://www.seeddms.org - */ - -use PHPUnit\Framework\SeedDmsTest; - -/** - * Group test class - * - * @category SeedDMS - * @package Tests - * @author Uwe Steinmann - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version Release: @package_version@ - * @link https://www.seeddms.org - */ -class DocumentContentTest extends SeedDmsTest -{ - - /** - * Create a real sqlite database in memory - * - * @return void - */ - protected function setUp(): void - { - self::$dbh = self::createInMemoryDatabase(); - self::$contentdir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'phpunit-'.time(); - mkdir(self::$contentdir); - // echo "Creating temp content dir: ".self::$contentdir."\n"; - self::$dms = new SeedDMS_Core_DMS(self::$dbh, self::$contentdir); - } - - /** - * Clean up at tear down - * - * @return void - */ - protected function tearDown(): void - { - self::$dbh = null; - // echo "\nRemoving temp. content dir: ".self::$contentdir."\n"; - exec('rm -rf '.self::$contentdir); - } - - /** - * Test method getContent(), getContentByVersion(), getLatestContent() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetContent() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - /* Add a new document */ - $document = self::createDocument($rootfolder, $user, 'Document 1'); - $this->assertIsObject($document); - $lcontent = $document->getLatestContent(); - $this->assertIsObject($lcontent); - $version = $document->getContentByVersion(1); - $this->assertIsObject($version); - $this->assertEquals($version->getId(), $lcontent->getId()); - $content = $document->getContent(); - $this->assertIsArray($content); - $this->assertCount(1, $content); - $this->assertEquals($version->getId(), $content[0]->getId()); - } - - /** - * Test method getContent() mit sql fail - * - * @return void - */ - public function testGetContentSqlFail() - { - $document = $this->getMockedDocument(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblDocumentContent` WHERE `document` ")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document->setDMS($dms); - $this->assertFalse($document->getContent()); - } - - /** - * Test method getContentByVersion() mit sql fail - * - * @return void - */ - public function testGetContentByVersionSqlFail() - { - $document = $this->getMockedDocument(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblDocumentContent` WHERE `document` ")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document->setDMS($dms); - $this->assertFalse($document->getContentByVersion(1)); - } - - /** - * Test method getLatestContent() mit sql fail - * - * @return void - */ - public function testGetLatestContentSqlFail() - { - $document = $this->getMockedDocument(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblDocumentContent` WHERE `document` ")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document->setDMS($dms); - $this->assertFalse($document->getLatestContent()); - } - - /** - * Test method removeContent() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testRemoveContent() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - /* Add a new document */ - $document = self::createDocument($rootfolder, $user, 'Document 1'); - $this->assertIsObject($document); - $lcontent = $document->getLatestContent(); - $this->assertIsObject($lcontent); - - /* Removing the only version will fail */ - $ret = $document->removeContent($lcontent); - $this->assertFalse($ret); - - /* Add a new version */ - $filename = self::createTempFile(300); - $result = $document->addContent('', $user, $filename, 'file2.txt', '.txt', 'text/plain'); - $this->assertTrue(SeedDMS_Core_File::removeFile($filename)); - $this->assertIsObject($result); - $this->assertIsObject($result->getContent()); - - /* Second trial to remove a version. Now it succeeds because it is not - * the last version anymore. - */ - $ret = $document->removeContent($lcontent); - $this->assertTrue($ret); - - /* The latest version is now version 2 */ - $lcontent = $document->getLatestContent(); - $this->assertIsObject($lcontent); - $this->assertEquals(2, $lcontent->getVersion()); - - /* There is only 1 version left */ - $contents = $document->getContent(); - $this->assertIsArray($contents); - $this->assertCount(1, $contents); - } - - /** - * Test method isType() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testIsType() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - /* Add a new document */ - $document = self::createDocument($rootfolder, $user, 'Document 1'); - $this->assertIsObject($document); - $lcontent = $document->getLatestContent(); - $this->assertIsObject($lcontent); - $ret = $lcontent->isType('documentcontent'); - $this->assertTrue($ret); - } - - /** - * Test method getUser(), getDocument() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testVarious() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - /* Add a new document */ - $document = self::createDocument($rootfolder, $user, 'Document 1'); - $this->assertIsObject($document); - $lcontent = $document->getLatestContent(); - $this->assertIsObject($lcontent); - $ret = $lcontent->isType('documentcontent'); - $this->assertTrue($ret); - $doc = $lcontent->getDocument(); - $this->assertEquals($document->getId(), $doc->getId()); - $u = $lcontent->getUser(); - $this->assertEquals($user->getId(), $u->getId()); - $filetype = $lcontent->getFileType(); - $this->assertEquals('.txt', $filetype); - $origfilename = $lcontent->getOriginalFileName(); - $this->assertEquals('file1.txt', $origfilename); - } - - /** - * Test method getComment(), setComment() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetComment() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - /* Add a new document */ - $document = self::createDocument($rootfolder, $user, 'Document 1'); - $this->assertIsObject($document); - $lcontent = $document->getLatestContent(); - $this->assertIsObject($lcontent); - $comment = $lcontent->getComment(); - $this->assertEquals('', $comment); - $ret = $lcontent->setComment('Document content comment'); - $this->assertTrue($ret); - /* Retrieve the document content from the database again */ - $content = self::$dms->getDocumentContent($lcontent->getId()); - $comment = $content->getComment(); - $this->assertEquals('Document content comment', $comment); - } - - /** - * Test method getDate(), setDate() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetDate() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - /* Add a new document */ - $document = self::createDocument($rootfolder, $user, 'Document 1'); - $this->assertIsObject($document); - $lcontent = $document->getLatestContent(); - $this->assertIsObject($lcontent); - $date = $lcontent->getDate(); - $this->assertIsInt($date); - $this->assertGreaterThanOrEqual(time(), $date); - - /* Set date as timestamp */ - $ret = $lcontent->setDate($date-1000); - $this->assertTrue($ret); - /* Retrieve the document content from the database again */ - $content = self::$dms->getDocumentContent($lcontent->getId()); - $newdate = $content->getDate(); - $this->assertEquals($date-1000, $newdate); - - /* Set date in Y-m-d H:i:s format */ - $date = time()-500; - $ret = $lcontent->setDate(date('Y-m-d H:i:s', $date)); - $this->assertTrue($ret); - /* Retrieve the document content from the database again */ - $content = self::$dms->getDocumentContent($lcontent->getId()); - $newdate = $content->getDate(); - $this->assertEquals($date, $newdate); - - /* Not passing a date will set the current date/time */ - $date = time(); - $ret = $lcontent->setDate(); - $this->assertTrue($ret); - /* Retrieve the document content from the database again */ - $content = self::$dms->getDocumentContent($lcontent->getId()); - $newdate = $content->getDate(); - $this->assertEquals($date, $newdate); - } - - /** - * Test method getFileSize(), setFileSize() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetFileSize() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - /* Add a new document */ - $document = self::createDocument($rootfolder, $user, 'Document 1', 200); - $this->assertIsObject($document); - $lcontent = $document->getLatestContent(); - $this->assertIsObject($lcontent); - $filesize = $lcontent->getFileSize(); - $this->assertEquals(200, $filesize); - - /* Intentially corrupt the file size */ - $db = self::$dms->getDb(); - $ret = $db->getResult("UPDATE `tblDocumentContent` SET `fileSize` = 300 WHERE `document` = " . $document->getID() . " AND `version` = " . $lcontent->getVersion()); - $this->assertTrue($ret); - - $corcontent = self::$dms->getDocumentContent($lcontent->getId()); - $filesize = $corcontent->getFileSize(); - $this->assertEquals(300, $filesize); - - /* Repair filesize by calling setFileSize() */ - $ret = $corcontent->setFileSize(); - $this->assertTrue($ret); - $filesize = $corcontent->getFileSize(); - $this->assertEquals(200, $filesize); - } - - /** - * Test method getChecksum(), setChecksum() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetChecksum() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - /* Add a new document */ - $document = self::createDocument($rootfolder, $user, 'Document 1', 200); - $this->assertIsObject($document); - $lcontent = $document->getLatestContent(); - $this->assertIsObject($lcontent); - $orgchecksum = $lcontent->getChecksum(); - $this->assertIsString($orgchecksum); - $this->assertEquals(32, strlen($orgchecksum)); - - /* Intentially corrupt the checksum */ - $db = self::$dms->getDb(); - $ret = $db->getResult("UPDATE `tblDocumentContent` SET `checksum` = 'foobar' WHERE `document` = " . $document->getID() . " AND `version` = " . $lcontent->getVersion()); - $this->assertTrue($ret); - - $corcontent = self::$dms->getDocumentContent($lcontent->getId()); - $checksum = $corcontent->getChecksum(); - $this->assertEquals('foobar', $checksum); - - /* Repair filesize by calling setChecksum() */ - $ret = $corcontent->setChecksum(); - $this->assertTrue($ret); - $checksum = $corcontent->getChecksum(); - $this->assertEquals($orgchecksum, $checksum); - } - - /** - * Test method getStatus(), setStatus(), getStatusLog() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetStatus() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - /* Add a new document */ - $document = self::createDocument($rootfolder, $user, 'Document 1', 200); - $this->assertIsObject($document); - $lcontent = $document->getLatestContent(); - $this->assertIsObject($lcontent); - - $status = $lcontent->getStatus(); - $this->assertIsArray($status); - $this->assertEquals(S_RELEASED, $status['status']); - - $statuslog = $lcontent->getStatusLog(); - $this->assertIsArray($statuslog); - $this->assertCount(1, $statuslog); - - /* Missing update user returns false */ - $ret = $lcontent->setStatus(S_OBSOLETE, '', null); - $this->assertFalse($ret); - - /* A status out of range returns false */ - $ret = $lcontent->setStatus(9, '', $user); - $this->assertFalse($ret); - - /* A wrong date returns false */ - $ret = $lcontent->setStatus(S_OBSOLETE, '', $user, '2021-02-29 10:10:10'); - $this->assertFalse($ret); - - $ret = $lcontent->setStatus(S_OBSOLETE, 'No longer valid', $user, date('Y-m-d H:i:s')); - $status = $lcontent->getStatus(); - $this->assertIsArray($status); - $this->assertEquals(S_OBSOLETE, $status['status']); - - /* Status log has now 2 entries */ - $statuslog = $lcontent->getStatusLog(); - $this->assertIsArray($statuslog); - $this->assertCount(2, $statuslog); - - /* Add the 'onSetStatus' callback */ - $callret = ''; - $callback = function ($param, $content, $updateuser, $oldstatus, $newstatus) use (&$callret) { - $callret = $oldstatus.' to '.$newstatus; - return $param; - }; - /* Because the callback will return false, the status will not be set */ - self::$dms->setCallback('onSetStatus', $callback, false); - /* Trying to go back to status released with a callback returning false */ - $ret = $lcontent->setStatus(S_RELEASED, 'Valid again', $user); - $status = $lcontent->getStatus(); - $this->assertIsArray($status); - /* Status is still S_OBSOLETE because the callback returned false */ - $this->assertEquals(S_OBSOLETE, $status['status']); - $this->assertEquals(S_OBSOLETE.' to '.S_RELEASED, $callret); - - /* Do it again, but this time the callback returns true */ - self::$dms->setCallback('onSetStatus', $callback, true); - /* Trying to go back to status released with a callback returning true */ - $ret = $lcontent->setStatus(S_RELEASED, 'Valid again', $user); - $status = $lcontent->getStatus(); - $this->assertIsArray($status); - /* Status updated to S_RELEASED because the callback returned true */ - $this->assertEquals(S_RELEASED, $status['status']); - $this->assertEquals(S_OBSOLETE.' to '.S_RELEASED, $callret); - - /* Status log has now 3 entries */ - $statuslog = $lcontent->getStatusLog(); - $this->assertIsArray($statuslog); - $this->assertCount(3, $statuslog); - - /* Get just the last entry */ - $statuslog = $lcontent->getStatusLog(1); - $this->assertIsArray($statuslog); - $this->assertCount(1, $statuslog); - $this->assertEquals('Valid again', $statuslog[0]['comment']); - } - - /** - * Test method getMimeType(), setMimeType() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetMimeType() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - /* Add a new document */ - $document = self::createDocument($rootfolder, $user, 'Document 1', 200); - $this->assertIsObject($document); - $lcontent = $document->getLatestContent(); - $this->assertIsObject($lcontent); - - $ret = $lcontent->setMimeType('text/csv'); - $this->assertTrue($ret); - - /* Retrieve the document content from the database again */ - $content = self::$dms->getDocumentContent($lcontent->getId()); - $this->assertIsObject($content); - $this->assertEquals('text/csv', $content->getMimeType()); - } - - /** - * Test method getFileType(), setFileType() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetFileType() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - /* Add a new document */ - $document = self::createDocument($rootfolder, $user, 'Document 1', 200); - $this->assertIsObject($document); - $lcontent = $document->getLatestContent(); - $this->assertIsObject($lcontent); - - $ret = $lcontent->setMimeType('text/css'); - $this->assertTrue($ret); - - $ret = $lcontent->setFileType(); - $this->assertTrue($ret); - - /* Retrieve the document content from the database again */ - $content = self::$dms->getDocumentContent($lcontent->getId()); - $this->assertIsObject($content); - $this->assertEquals('.css', $content->getFileType()); - - /* Also get the file content to ensure the renaming of the file - * on disc has succeeded. - */ - $c = file_get_contents(self::$dms->contentDir.$lcontent->getPath()); - $this->assertEquals(200, strlen($c)); - } - - /** - * Test method replaceContent() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testReplaceContent() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $guest = self::$dms->getUser(2); - /* Add a new document */ - $document = self::createDocument($rootfolder, $user, 'Document 1', 200); - $this->assertIsObject($document); - $lcontent = $document->getLatestContent(); - $this->assertIsObject($lcontent); - - $filename = self::createTempFile(300); - /* Not using the same user yields an error */ - $ret = $document->replaceContent(1, $guest, $filename, 'file1.txt', '.txt', 'text/plain'); - $this->assertFalse($ret); - /* Not using the same orig. file name yields an error */ - $ret = $document->replaceContent(1, $user, $filename, 'file2.txt', '.txt', 'text/plain'); - $this->assertFalse($ret); - /* Not using the same file type yields an error */ - $ret = $document->replaceContent(1, $user, $filename, 'file1.txt', '.csv', 'text/plain'); - $this->assertFalse($ret); - /* Not using the same mime type yields an error */ - $ret = $document->replaceContent(1, $user, $filename, 'file1.txt', '.txt', 'text/csv'); - $this->assertFalse($ret); - - /* Setting version to 0 will replace the latest version */ - $ret = $document->replaceContent(0, $user, $filename, 'file1.txt', '.txt', 'text/plain'); - $this->assertTrue($ret); - - $this->assertTrue(SeedDMS_Core_File::removeFile($filename)); - - /* Retrieve the document content from the database again */ - $newcontent = $document->getLatestContent(); - $this->assertIsObject($newcontent); - $this->assertEquals('text/plain', $newcontent->getMimeType()); - /* File size has grown from 200 to 300 bytes */ - $filesize = $newcontent->getFileSize(); - $this->assertEquals(300, $filesize); - /* Still version 1 */ - $version = $newcontent->getVersion(); - $this->assertEquals(1, $version); - } - - /** - * Test method replaceContent() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAccessMode() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $guest = self::$dms->getUser(2); - /* Add a new document */ - $document = self::createDocument($rootfolder, $user, 'Document 1', 200); - $this->assertIsObject($document); - $lcontent = $document->getLatestContent(); - $this->assertIsObject($lcontent); - - /* Access rights on a document content are always M_READ unless the callback - * onCheckAccessDocumentContent is implemented */ - $mode = $lcontent->getAccessMode($user); - $this->assertEquals(M_READ, $mode); - } -} diff --git a/SeedDMS_Core/tests/DocumentFileTest.php b/SeedDMS_Core/tests/DocumentFileTest.php deleted file mode 100644 index 95d758c56..000000000 --- a/SeedDMS_Core/tests/DocumentFileTest.php +++ /dev/null @@ -1,290 +0,0 @@ - - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version @package_version@ - * @link https://www.seeddms.org - */ - -use PHPUnit\Framework\SeedDmsTest; - -/** - * Group test class - * - * @category SeedDMS - * @package Tests - * @author Uwe Steinmann - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version Release: @package_version@ - * @link https://www.seeddms.org - */ -class DocumentFileTest extends SeedDmsTest -{ - - /** - * Create a real sqlite database in memory - * - * @return void - */ - protected function setUp(): void - { - self::$dbh = self::createInMemoryDatabase(); - self::$contentdir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'phpunit-'.time(); - mkdir(self::$contentdir); - // echo "Creating temp content dir: ".self::$contentdir."\n"; - self::$dms = new SeedDMS_Core_DMS(self::$dbh, self::$contentdir); - self::$dbversion = self::$dms->getDBVersion(); - } - - /** - * Clean up at tear down - * - * @return void - */ - protected function tearDown(): void - { - self::$dbh = null; - // echo "\nRemoving temp. content dir: ".self::$contentdir."\n"; - exec('rm -rf '.self::$contentdir); - } - - /** - * Test method getInstance() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetMockedDocumentFile() - { - $user = self::getMockedUser(); - $document1 = self::getMockedDocument(1, 'Document 1'); - $file = new SeedDMS_Core_DocumentFile(1, $document1, $user->getId(), 'comment', time(), '', '.txt', 'text/plain', 'test.txt', 'name', 1, true); - $this->assertIsObject($file); - $this->assertTrue($file->isType('documentfile')); - - $document = $file->getDocument(); - $this->assertIsObject($document); - $this->assertTrue($document->isType('document')); - $this->assertEquals('Document 1', $document->getName()); - - $ispublic = $file->isPublic(); - $this->assertTrue($ispublic); - - $comment = $file->getComment(); - $this->assertEquals('comment', $comment); - - $filetype = $file->getFileType(); - $this->assertEquals('.txt', $filetype); - - $mimetype = $file->getMimeType(); - $this->assertEquals('text/plain', $mimetype); - - $name = $file->getName(); - $this->assertEquals('name', $name); - - $origfilename = $file->getOriginalFileName(); - $this->assertEquals('test.txt', $origfilename); - - $version = $file->getVersion(); - $this->assertEquals(1, $version); - - $accessmode = $file->getAccessMode($user); - $this->assertEquals(M_READ, $accessmode); - } - - /** - * Test method setComment() mit sql fail - * - * @return void - */ - public function testSetCommentSqlFail() - { - $user = self::getMockedUser(); - $document = $this->getMockedDocument(); - $file = new SeedDMS_Core_DocumentFile(1, $document, $user->getId(), 'comment', time(), '', '.txt', 'text/plain', 'test.txt', 'name', 1, true); - $this->assertIsObject($file); - $this->assertTrue($file->isType('documentfile')); - - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblDocumentFiles` SET `comment`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document->setDMS($dms); - $this->assertFalse($file->setComment('my comment')); - } - - /** - * Test method setName() mit sql fail - * - * @return void - */ - public function testSetNameSqlFail() - { - $user = self::getMockedUser(); - $document = $this->getMockedDocument(); - $file = new SeedDMS_Core_DocumentFile(1, $document, $user->getId(), 'comment', time(), '', '.txt', 'text/plain', 'test.txt', 'name', 1, true); - $this->assertIsObject($file); - $this->assertTrue($file->isType('documentfile')); - - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblDocumentFiles` SET `name`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document->setDMS($dms); - $this->assertFalse($file->setName('my name')); - } - - /** - * Test method setDate() mit sql fail - * - * @return void - */ - public function testSetDateSqlFail() - { - $user = self::getMockedUser(); - $document = $this->getMockedDocument(); - $file = new SeedDMS_Core_DocumentFile(1, $document, $user->getId(), 'comment', time(), '', '.txt', 'text/plain', 'test.txt', 'name', 1, true); - $this->assertIsObject($file); - $this->assertTrue($file->isType('documentfile')); - - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblDocumentFiles` SET `date`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document->setDMS($dms); - $this->assertFalse($file->setDate()); - } - - /** - * Test method setVersion() mit sql fail - * - * @return void - */ - public function testSetVersionSqlFail() - { - $user = self::getMockedUser(); - $document = $this->getMockedDocument(); - $file = new SeedDMS_Core_DocumentFile(1, $document, $user->getId(), 'comment', time(), '', '.txt', 'text/plain', 'test.txt', 'name', 1, true); - $this->assertIsObject($file); - $this->assertTrue($file->isType('documentfile')); - - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblDocumentFiles` SET `version`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document->setDMS($dms); - $this->assertFalse($file->setVersion(1)); - } - - /** - * Test method setPublic() mit sql fail - * - * @return void - */ - public function testSetPublicnSqlFail() - { - $user = self::getMockedUser(); - $document = $this->getMockedDocument(); - $file = new SeedDMS_Core_DocumentFile(1, $document, $user->getId(), 'comment', time(), '', '.txt', 'text/plain', 'test.txt', 'name', 1, true); - $this->assertIsObject($file); - $this->assertTrue($file->isType('documentfile')); - - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblDocumentFiles` SET `public`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document->setDMS($dms); - $this->assertFalse($file->setPublic(true)); - } - - /** - * Test method addDocumentFile(), getDocumentFile() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddDocumentFile() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $document = self::createDocument($rootfolder, $user, 'Document 1'); - $this->assertIsObject($document); - $tmpfile = self::createTempFile(); - $file = $document->addDocumentFile('attachment.txt', 'comment', $user, $tmpfile, 'attachment.txt', '.txt', 'text/plain', 0, true); - $this->assertTrue(SeedDMS_Core_File::removeFile($tmpfile)); - $this->assertIsObject($file); - $this->assertTrue($file->isType('documentfile')); - - $files = $document->getDocumentFiles(); - $this->assertIsArray($files); - $this->assertCount(1, $files); - - $file = $files[0]; - - $document = $file->getDocument(); - $this->assertIsObject($document); - $this->assertTrue($document->isType('document')); - $this->assertEquals('Document 1', $document->getName()); - - $ispublic = $file->isPublic(); - $this->assertTrue($ispublic); - - $luser = $file->getUser(); - $this->assertIsObject($luser); - $this->assertTrue($luser->isType('user')); - - $ret = $file->setComment('new comment'); - $this->assertTrue($ret); - $comment = $file->getComment(); - $this->assertEquals('new comment', $comment); - - $ret = $file->setName('new name'); - $this->assertTrue($ret); - $name = $file->getName(); - $this->assertEquals('new name', $name); - - $now = time(); - $ret = $file->setDate($now); - $this->assertTrue($ret); - $date = $file->getDate(); - $this->assertEquals($now, $date); - - $ret = $file->setDate('fail'); - $this->assertFalse($ret); - - $ret = $file->setVersion(2); - $this->assertTrue($ret); - $version = $file->getVersion(); - $this->assertEquals(2, $version); - - $ret = $file->setVersion('fail'); - $this->assertFalse($ret); - - $ret = $file->setPublic(true); - $this->assertTrue($ret); - $ispublic = $file->isPublic(); - $this->assertEquals(1, $ispublic); - - - } -} diff --git a/SeedDMS_Core/tests/DocumentLinkTest.php b/SeedDMS_Core/tests/DocumentLinkTest.php deleted file mode 100644 index d646607e9..000000000 --- a/SeedDMS_Core/tests/DocumentLinkTest.php +++ /dev/null @@ -1,125 +0,0 @@ - - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version @package_version@ - * @link https://www.seeddms.org - */ - -use PHPUnit\Framework\SeedDmsTest; - -/** - * Group test class - * - * @category SeedDMS - * @package Tests - * @author Uwe Steinmann - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version Release: @package_version@ - * @link https://www.seeddms.org - */ -class DocumentLinkTest extends SeedDmsTest -{ - - /** - * Create a real sqlite database in memory - * - * @return void - */ - protected function setUp(): void - { - self::$dbh = self::createInMemoryDatabase(); - self::$contentdir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'phpunit-'.time(); - mkdir(self::$contentdir); - // echo "Creating temp content dir: ".self::$contentdir."\n"; - self::$dms = new SeedDMS_Core_DMS(self::$dbh, self::$contentdir); - self::$dbversion = self::$dms->getDBVersion(); - } - - /** - * Clean up at tear down - * - * @return void - */ - protected function tearDown(): void - { - self::$dbh = null; - // echo "\nRemoving temp. content dir: ".self::$contentdir."\n"; - exec('rm -rf '.self::$contentdir); - } - - /** - * Test method getInstance() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetMockedDocumentLink() - { - $user = self::getMockedUser(); - $document1 = self::getMockedDocument(1, 'Document 1'); - $document2 = self::getMockedDocument(2, 'Document 2'); - $link = new SeedDMS_Core_DocumentLink(1, $document1, $document2, $user, true); - $this->assertIsObject($link); - $this->assertTrue($link->isType('documentlink')); - - $document = $link->getDocument(); - $this->assertIsObject($document); - $this->assertTrue($document->isType('document')); - $this->assertEquals('Document 1', $document->getName()); - - $document = $link->getTarget(); - $this->assertIsObject($document); - $this->assertTrue($document->isType('document')); - $this->assertEquals('Document 2', $document->getName()); - - $ispublic = $link->isPublic(); - $this->assertTrue($ispublic); - } - - /** - * Test method addDocumentLink(), getDocumentLink() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddDocumentLink() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $document1 = self::createDocument($rootfolder, $user, 'Document 1'); - $this->assertIsObject($document1); - $document2 = self::createDocument($rootfolder, $user, 'Document 2'); - $this->assertIsObject($document2); - $link = $document1->addDocumentLink($document2->getId(), $user->getId(), true); - $this->assertIsObject($link); - $this->assertTrue($link->isType('documentlink')); - - $document = $link->getDocument(); - $this->assertIsObject($document); - $this->assertTrue($document->isType('document')); - $this->assertEquals('Document 1', $document->getName()); - - $document = $link->getTarget(); - $this->assertIsObject($document); - $this->assertTrue($document->isType('document')); - $this->assertEquals('Document 2', $document->getName()); - - $ispublic = $link->isPublic(); - $this->assertTrue($ispublic); - - $luser = $link->getUser(); - $this->assertIsObject($luser); - $this->assertTrue($luser->isType('user')); - } -} diff --git a/SeedDMS_Core/tests/DocumentTest.php b/SeedDMS_Core/tests/DocumentTest.php deleted file mode 100644 index 5331f367d..000000000 --- a/SeedDMS_Core/tests/DocumentTest.php +++ /dev/null @@ -1,1323 +0,0 @@ - - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version @package_version@ - * @link https://www.seeddms.org - */ - -use PHPUnit\Framework\SeedDmsTest; - -/** - * Group test class - * - * @category SeedDMS - * @package Tests - * @author Uwe Steinmann - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version Release: @package_version@ - * @link https://www.seeddms.org - */ -class DocumentTest extends SeedDmsTest -{ - - /** - * Create a real sqlite database in memory - * - * @return void - */ - protected function setUp(): void - { - self::$dbh = self::createInMemoryDatabase(); - self::$contentdir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'phpunit-'.time(); - mkdir(self::$contentdir); - // echo "Creating temp content dir: ".self::$contentdir."\n"; - self::$dms = new SeedDMS_Core_DMS(self::$dbh, self::$contentdir); - self::$dbversion = self::$dms->getDBVersion(); - } - - /** - * Clean up at tear down - * - * @return void - */ - protected function tearDown(): void - { - self::$dbh = null; - // echo "\nRemoving temp. content dir: ".self::$contentdir."\n"; - exec('rm -rf '.self::$contentdir); - } - - /** - * Test method getInstance() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetInstance() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - /* Add a new document */ - $document = self::createDocument($rootfolder, $user, 'Document 1'); - /* Get the document with id 1, which must be 'Document 1' */ - $document = SeedDMS_Core_Document::getInstance(1, self::$dms); - $this->assertIsObject($document); - $this->assertTrue($document->isType('document')); - $this->assertEquals('Document 1', $document->getName()); - /* Get a none existing document */ - $document = SeedDMS_Core_Document::getInstance(2, self::$dms); - $this->assertNull($document); - } - - /** - * Test method getInstance() within a root folder - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetInstanceWithinRoot() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - /* The simple folder structure will create to subfolders, each - * with 15 documents. - */ - self::createSimpleFolderStructureWithDocuments(); - $subfolder = self::$dms->getFolderByName('Subfolder 1'); - /* Get a document in Subfolder 1 */ - $document1 = self::$dms->getDocumentByName('Document 1-1'); - /* Get a document in Subfolder 2 */ - $document2 = self::$dms->getDocumentByName('Document 2-1'); - - /* Getting a document in subfolder 1 without any restrictions must succeed */ - $document = SeedDMS_Core_Document::getInstance($document1->getId(), self::$dms); - $this->assertIsObject($document); - $this->assertTrue($document->isType('document')); - - /* Make Subfolder 1 the root folder */ - self::$dms->checkWithinRootDir = true; - self::$dms->setRootFolderID($subfolder->getId()); - - /* Getting a document by id in subfolder 1 still must succeed */ - $document = SeedDMS_Core_Document::getInstance($document1->getId(), self::$dms); - $this->assertIsObject($document); - $this->assertTrue($document->isType('document')); - - /* Getting a document by id in subfolder 2 must fail */ - $document = SeedDMS_Core_Document::getInstance($document2->getId(), self::$dms); - $this->assertNull($document); - - /* Get a document in Subfolder 1 */ - $document = self::$dms->getDocumentByName('Document 1-1'); - $this->assertIsObject($document); - $this->assertTrue($document->isType('document')); - - /* Get a document in Subfolder 2 */ - $document = self::$dms->getDocumentByName('Document 2-1'); - $this->assertNull($document); - } - - /** - * Test method getInstance() - * - * @return void - */ - public function testGetInstanceSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT `tblDocuments`.*, `tblDocumentLocks`.`userID` as `lock` FROM `tblDocuments`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $this->assertFalse(SeedDMS_Core_Document::getInstance(1, $dms)); - } - - /** - * Test method getDir() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDir() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - /* Add a new document */ - $document = self::createDocument($rootfolder, $user, 'Document 1'); - $this->assertIsObject($document); - $this->assertEquals('1/', $document->getDir()); - } - - /** - * Test method getComment() and setComment() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetComment() - { - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $user = self::$dms->getUser(1); - $document = self::createDocument($folder, $user, 'Document 1'); - $this->assertIsObject($document); - $comment = $document->getComment(); - $this->assertEquals('', $comment); - $ret = $document->setComment('foo'); - $this->assertTrue($ret); - $comment = $document->getComment(); - $this->assertEquals('foo', $comment); - } - - /** - * Test method setComment() mit sql fail - * - * @return void - */ - public function testSetCommentSqlFail() - { - $document = $this->getMockedDocument(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblDocuments` SET `comment`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document->setDMS($dms); - $this->assertFalse($document->setComment('my comment')); - } - - /** - * Test method getKeywords() and setKeywords() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetKeywords() - { - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $user = self::$dms->getUser(1); - $document = self::createDocument($folder, $user, 'Document 1'); - $this->assertIsObject($document); - $keywords = $document->getKeywords(); - $this->assertEquals('', $keywords); - $ret = $document->setKeywords('foo bar'); - $this->assertTrue($ret); - $keywords = $document->getKeywords(); - $this->assertEquals('foo bar', $keywords); - } - - /** - * Test method setKeywords() mit sql fail - * - * @return void - */ - public function testSetKeywordsSqlFail() - { - $document = $this->getMockedDocument(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblDocuments` SET `keywords`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document->setDMS($dms); - $this->assertFalse($document->setKeywords('keywords')); - } - - /** - * Test method getName() and setName() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetName() - { - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $user = self::$dms->getUser(1); - $document = self::createDocument($folder, $user, 'Document 1'); - $this->assertIsObject($document); - $name = $document->getName(); - $this->assertEquals('Document 1', $name); - $ret = $document->setName('foo'); - $this->assertTrue($ret); - $name = $document->getName(); - $this->assertEquals('foo', $name); - } - - /** - * Test method setName() mit sql fail - * - * @return void - */ - public function testSetNameSqlFail() - { - $document = $this->getMockedDocument(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblDocuments` SET `name`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document->setDMS($dms); - $this->assertFalse($document->setName('my name')); - } - - /** - * Test method getDate() and setDate() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetDate() - { - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $user = self::$dms->getUser(1); - $document = self::createDocument($folder, $user, 'Document 1'); - $now = time(); - /* Passing false as a time stamp will take current time stamp */ - $ret = $document->setDate(false); - $this->assertTrue($ret); - $date = $document->getDate(); - $this->assertEquals($now, $date); - /* Setting a time stamp */ - $now -= 1000; - $ret = $document->setDate($now); - $this->assertTrue($ret); - $date = $document->getDate(); - $this->assertEquals($now, $date); - /* Setting a none numeric value will fail */ - $ret = $document->setDate('foo'); - $this->assertFalse($ret); - } - - /** - * Test method setDate() with sql fail - * - * @return void - */ - public function testSetDateSqlFail() - { - $document = $this->getMockedDocument(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblDocuments` SET `date` = ")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document->setDMS($dms); - $this->assertFalse($document->setDate(null)); - } - - /** - * Test method getDefaultAccess() and setDefaultAccess() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetDefaultAccess() - { - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $user = self::$dms->getUser(1); - $document = self::createDocument($folder, $user, 'Document 1'); - $this->assertIsObject($document); - $this->assertTrue($document->isType('document')); - $defaultaccess = $document->getDefaultAccess(); - $this->assertEquals(M_READ, $defaultaccess); - - /* Setting a default access out of range yields an error */ - $ret = $document->setDefaultAccess(0, true); - $this->assertFalse($ret); - - /* Setting a default access out of range yields an error */ - $ret = $document->setDefaultAccess(M_ALL+1, true); - $this->assertFalse($ret); - - /* Setting the default access will have no effect as long as access - * rights are inherited. */ - $ret = $document->setDefaultAccess(M_READWRITE, true); - $this->assertTrue($ret); - $defaultaccess = $document->getDefaultAccess(); - $this->assertEquals(M_READ, $defaultaccess); - - /* Once inheritance of access rights is turned off, the previously - * set default access right will take effect. */ - $ret = $document->setInheritAccess(false, true); - $this->assertTrue($ret); - $defaultaccess = $document->getDefaultAccess(); - $this->assertEquals(M_READWRITE, $defaultaccess); - - /* Also check if inherited access was turned off */ - $ret = $document->getInheritAccess(); - $this->assertFalse($ret); - } - - /** - * Test method setDefaultAccess() mit sql fail - * - * @return void - */ - public function testSetDefaultAccessSqlFail() - { - $document = $this->getMockedDocument(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblDocuments` SET `defaultAccess`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document->setDMS($dms); - $this->assertFalse($document->setDefaultAccess(M_READ)); - } - - /** - * Test method setInheritAccess() mit sql fail - * - * @return void - */ - public function testSetInheritAccessSqlFail() - { - $document = $this->getMockedDocument(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblDocuments` SET `inheritAccess`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document->setDMS($dms); - $this->assertFalse($document->setInheritAccess(0)); - } - - /** - * Test method addAccess(), removeAccess(), changeAccess(), getAccessList() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetAccess() - { - self::createGroupsAndUsers(); - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $adminuser = self::$dms->getUser(1); - $guestuser = self::$dms->getUser(2); - $user = self::$dms->getUserByLogin('user-1-1'); - $this->assertIsObject($user); - $this->assertTrue($user->isType('user')); - $group = self::$dms->getGroupByName('Group 1'); - $this->assertIsObject($group); - $this->assertTrue($group->isType('group')); - $document = self::createDocument($folder, $adminuser, 'Document 1'); - $this->assertIsObject($document); - $this->assertTrue($document->isType('document')); - $defaultaccess = $document->getDefaultAccess(); - $this->assertEquals(M_READ, $defaultaccess); - - /* Turn off inheritance, otherwise the access rights have no effect */ - $ret = $document->setInheritAccess(false, true); - $this->assertTrue($ret); - - /* Retrieving an access mode without a valid user will always return M_NONE */ - $mode = $document->getAccessMode(null); - $this->assertEquals(M_NONE, $mode); - - /* The admin user has always unlimited access */ - $mode = $document->getAccessMode($adminuser); - $this->assertEquals(M_ALL, $mode); - - /* Without setting any specific access, the document has a default mode M_READ */ - $mode = $document->getAccessMode($user); - $this->assertEquals(M_READ, $mode); - - /* Access mode for group is also the default access */ - $mode = $document->getGroupAccessMode($group); - $this->assertEquals(M_READ, $mode); - - /* Set unlimited access rights for everybody */ - $ret = $document->setDefaultAccess(M_ALL); - $this->assertTrue($ret); - $mode = $document->getAccessMode($user); - $this->assertEquals(M_ALL, $mode); - $mode = $document->getGroupAccessMode($group); - $this->assertEquals(M_ALL, $mode); - - /* Guest still have just read access */ - $mode = $document->getAccessMode($guestuser); - $this->assertEquals(M_READ, $mode); - - /* Add wrong access type returns false */ - $ret = $document->addAccess(M_ALL+1, $user->getId(), true); - $this->assertFalse($ret); - - /* Add read/write access on the document for user */ - $ret = $document->addAccess(M_READWRITE, $user->getId(), true); - $this->assertTrue($ret); - /* Adding another access right (not matter which one) for the - * same user yields an error - */ - $ret = $document->addAccess(M_READ, $user->getId(), true); - $this->assertFalse($ret); - - /* Passing an invalid second parameter will return false */ - $accesslist = $document->getAccessList(M_ANY, 5); - $this->assertFalse($accesslist); - - /* Searching for mode == M_READ will return neither a group nor - * the user, because the user has read&write access - */ - $accesslist = $document->getAccessList(M_READ); - $this->assertIsArray($accesslist); - $this->assertCount(0, $accesslist['groups']); - $this->assertCount(0, $accesslist['users']); - - $accesslist = $document->getAccessList(M_READWRITE); - $this->assertIsArray($accesslist); - $this->assertCount(0, $accesslist['groups']); - $this->assertCount(1, $accesslist['users']); - - $accesslist = $document->getAccessList(); - $this->assertIsArray($accesslist); - $this->assertCount(0, $accesslist['groups']); - $this->assertCount(1, $accesslist['users']); - - /* Access mode is just read/write for the user thought the default is unlimited */ - $mode = $document->getAccessMode($user); - $this->assertEquals(M_READWRITE, $mode); - /* Access mode for the group is still unlimited */ - $mode = $document->getGroupAccessMode($group); - $this->assertEquals(M_ALL, $mode); - - /* Setting default access to M_READ - * is just a precaution to ensure the unlimeted access rights is not - * derived from the default access which was set to M_ALL above. - */ - $ret = $document->setDefaultAccess(M_READ); - $this->assertTrue($ret); - $mode = $document->getGroupAccessMode($group); - $this->assertEquals(M_READ, $mode); - - /* Add unlimeted access on the document for group */ - $ret = $document->addAccess(M_ALL, $group->getId(), false); - $this->assertTrue($ret); - /* Adding another access right (not matter which one) for the - * same group yields an error - */ - $ret = $document->addAccess(M_READ, $group->getId(), false); - $this->assertFalse($ret); - - $accesslist = $document->getAccessList(); - $this->assertIsArray($accesslist); - $this->assertCount(1, $accesslist['groups']); - $this->assertCount(1, $accesslist['users']); - - /* The group has now unlimited access rights */ - $mode = $document->getGroupAccessMode($group); - $this->assertEquals(M_ALL, $mode); - - /* The user still has just read/write access, though the group he belongs - * to has unlimeted rights. The specific user rights has higher priority. - */ - $mode = $document->getAccessMode($user); - $this->assertEquals(M_READWRITE, $mode); - - /* Remove all specific access rights for the user */ - $ret = $document->removeAccess($user->getId(), true); - $this->assertTrue($ret); - - /* Now the group rights apply for the user, because there are no - * specific user rights anymore. - */ - $mode = $document->getAccessMode($user); - $this->assertEquals(M_ALL, $mode); - - /* change unlimeted access on the document for group to none */ - $ret = $document->changeAccess(M_NONE, $group->getId(), false); - $this->assertTrue($ret); - $mode = $document->getAccessMode($user); - $this->assertEquals(M_NONE, $mode); - - /* clear all access rights */ - $ret = $document->clearAccessList(); - $this->assertTrue($ret); - $accesslist = $document->getAccessList(); - $this->assertIsArray($accesslist); - $this->assertCount(0, $accesslist['groups']); - $this->assertCount(0, $accesslist['users']); - - /* We are back to the default access rights */ - $mode = $document->getAccessMode($user); - $this->assertEquals(M_READ, $mode); - - } - - /** - * Test method addNotify(), removeNotify(), getNotifyList(), cleanNotifyList() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetNotify() - { - self::createGroupsAndUsers(); - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $adminuser = self::$dms->getUser(1); - $guestuser = self::$dms->getUser(2); - $user = self::$dms->getUserByLogin('user-1-1'); - $this->assertIsObject($user); - $this->assertTrue($user->isType('user')); - $group = self::$dms->getGroupByName('Group 1'); - $this->assertIsObject($group); - $this->assertTrue($group->isType('group')); - $document = self::createDocument($folder, $adminuser, 'Document 1'); - $this->assertIsObject($document); - $this->assertTrue($document->isType('document')); - - $notifylist = $document->getNotifyList(); - $this->assertIsArray($notifylist); - $this->assertCount(0, $notifylist['groups']); - $this->assertCount(0, $notifylist['users']); - - /* Add notify on the document for user */ - $ret = $document->addNotify($user->getId(), true); - $this->assertEquals(0, $ret); - - /* Add notify on the document for group */ - $ret = $document->addNotify($group->getId(), false); - $this->assertEquals(0, $ret); - - /* Add notify on the document for a user that does not exists */ - $ret = $document->addNotify(15, true); - $this->assertEquals(-1, $ret); - - $notifylist = $document->getNotifyList(); - $this->assertIsArray($notifylist); - $this->assertCount(1, $notifylist['groups']); - $this->assertCount(1, $notifylist['users']); - - /* Setting the default access to M_NONE and turning off inheritance - * will clean the notification list, because the notifiers have no - * longer read access on the document and therefore will be removed - * from the notification list. - */ - $ret = $document->setInheritAccess(false); - $this->assertTrue($ret); - $ret = $document->setDefaultAccess(M_NONE); - $this->assertTrue($ret); - - $notifylist = $document->getNotifyList(); - $this->assertIsArray($notifylist); - $this->assertCount(0, $notifylist['groups']); - $this->assertCount(0, $notifylist['users']); - } - - /** - * Test method isDescendant() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testIsDescendant() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $subfolder1 = $rootfolder->addSubFolder('Subfolder 1', '', $user, 2.0); - $subfolder2 = $rootfolder->addSubFolder('Subfolder 2', '', $user, 1.0); - $document = self::createDocument($subfolder1, $user, 'Document 1'); - /* document is a descendant of root folder and subfolder 1 */ - $this->assertTrue($document->isDescendant($rootfolder)); - $this->assertTrue($document->isDescendant($subfolder1)); - /* subfolder is not a descendant of subfolder 2 */ - $this->assertFalse($document->isDescendant($subfolder2)); - } - - /** - * Test method getParent() - * - * Create a new document below root folder and check if parent - * of the document is the root folder. - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetParent() - { - $user = self::$dms->getUser(1); - $rootfolder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $document = self::createDocument($rootfolder, $user, 'Document 1'); - $parent = $document->getParent(); - $this->assertIsObject($parent); - $this->assertInstanceOf(SeedDMS_Core_Folder::class, $parent); - $this->assertEquals(1, $parent->getId()); - } - - /** - * Test method setParent() - * - * Create a new document below root folder, move it to a subfolder - * and check if parent of the document is the sub folder. - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testSetParent() - { - $user = self::$dms->getUser(1); - $rootfolder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $subfolder = $rootfolder->addSubFolder('Subfolder 1', '', $user, 0); - $document = self::createDocument($rootfolder, $user, 'Document 1'); - /* Setting a null folder is not allowed */ - $ret = $document->setParent(null); - $this->assertFalse($ret); - - /* Passed object must be a folder */ - $ret = $document->setParent($user); - $this->assertFalse($ret); - - $ret = $document->setParent($subfolder); - $this->assertTrue($ret); - $parent = $document->getParent(); - $this->assertIsObject($parent); - $this->assertInstanceOf(SeedDMS_Core_Folder::class, $parent); - $this->assertEquals(2, $parent->getId()); - } - - /** - * Test method setParent() mit sql fail - * - * @return void - */ - public function testSetParentSqlFail() - { - $document = $this->getMockedDocument(); - $rootfolder = $this->getMockedRootFolder(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblDocuments` SET `folder`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document->setDMS($dms); - $this->assertFalse($document->setParent($rootfolder)); - } - - /** - * Test method setOwner() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testSetOwner() - { - $adminuser = self::$dms->getUser(1); - $rootfolder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $user = self::$dms->addUser('user1', 'user1', 'User One', 'user1@seeddms.org', 'en_GB', 'bootstrap', ''); - $this->assertIsObject($user); - $document = self::createDocument($rootfolder, $adminuser, 'Document 1'); - /* Setting a null user is not allowed */ - $ret = $document->setOwner(null); - $this->assertFalse($ret); - - /* Passed object must be a folder */ - $ret = $document->setOwner($rootfolder); - $this->assertFalse($ret); - - $res = $document->setOwner($user); - $this->assertTrue($res); - $owner = $document->getOwner(); - $this->assertIsObject($owner); - $this->assertInstanceOf(SeedDMS_Core_User::class, $owner); - $this->assertEquals($user->getId(), $owner->getId()); - } - - /** - * Test method setOwner() mit sql fail - * - * @return void - */ - public function testSetOwnerSqlFail() - { - $document = $this->getMockedDocument(); - $user = $this->getMockedUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblDocuments` SET `owner`")) - ->willReturn(false); - // SeedDMS 6 will fetch the old owner in setOwner() before setting the - // new owner - if(self::$dbversion['major'] == 6) { - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblUsers` WHERE `id` = ")) - ->willReturn([]); - } - $dms = new SeedDMS_Core_DMS($db, ''); - $document->setDMS($dms); - $this->assertFalse($document->setOwner($user)); - } - - /** - * Test method expires(), setExpires(), getExpires() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetExpires() - { - $adminuser = self::$dms->getUser(1); - $rootfolder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $document = self::createDocument($rootfolder, $adminuser, 'Document 1'); - $expires = $document->expires(); - $this->assertFalse($expires); - $expires = $document->getExpires(); - $this->assertFalse($expires); - $now = time(); - $res = $document->setExpires($now); - $this->assertTrue($res); - /* Setting it again will return true */ - $res = $document->setExpires($now); - $this->assertTrue($res); - $expires = $document->expires(); - $this->assertTrue($res); - $expirets = $document->getExpires(); - $this->assertEquals($now, $expirets); - } - - /** - * Test method setExpires() mit sql fail - * - * @return void - */ - public function testSetExpiresSqlFail() - { - $document = $this->getMockedDocument(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblDocuments` SET `expires`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document->setDMS($dms); - $this->assertFalse($document->setExpires(time())); - } - - /** - * Test method setLocked(), isLocked() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testSetAndIsLocked() - { - $adminuser = self::$dms->getUser(1); - $rootfolder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $user = self::$dms->addUser('user1', 'user1', 'User One', 'user1@seeddms.org', 'en_GB', 'bootstrap', ''); - $this->assertIsObject($user); - $document = self::createDocument($rootfolder, $adminuser, 'Document 1'); - $res = $document->isLocked(); - $this->assertFalse($res); - $res = $document->setLocked($user); - $this->assertTrue($res); - $res = $document->isLocked(); - $this->assertTrue($res); - $lockuser = $document->getLockingUser(); - $this->assertIsObject($lockuser); - $this->assertInstanceOf(SeedDMS_Core_User::class, $lockuser); - $this->assertEquals($user->getId(), $lockuser->getId()); - /* parameter passed to setLocked must be false or a user */ - $res = $document->setLocked(null); - /* document is still locked and locking user is unchanged */ - $res = $document->isLocked(); - $this->assertTrue($res); - $lockuser = $document->getLockingUser(); - $this->assertIsObject($lockuser); - $this->assertInstanceOf(SeedDMS_Core_User::class, $lockuser); - $this->assertEquals($user->getId(), $lockuser->getId()); - /* Unlock the document */ - $res = $document->setLocked(false); - $this->assertTrue($res); - $res = $document->isLocked(); - $this->assertFalse($res); - $lockuser = $document->getLockingUser(); - $this->assertFalse($lockuser); - } - - /** - * Test method setLocked() with sql fail - * - * @return void - */ - public function testSetLockedSqlFail() - { - $document = $this->getMockedDocument(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("DELETE FROM `tblDocumentLocks`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document->setDMS($dms); - $this->assertFalse($document->setLocked(false)); - } - - /** - * Test method getSequence() and setSequence() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetSequence() - { - $adminuser = self::$dms->getUser(1); - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $document = self::createDocument($folder, $adminuser, 'Document 1'); - /* The document still has sequence = 1.0 */ - $sequence = $document->getSequence(); - $this->assertEquals(1.0, $sequence); - $ret = $document->setSequence(1.5); - $this->assertTrue($ret); - $sequence = $document->getSequence(); - $this->assertEquals(1.5, $sequence); - } - - /** - * Test method setSequence() mit sql fail - * - * @return void - */ - public function testSetSequenceSqlFail() - { - $document = $this->getMockedDocument(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblDocuments` SET `sequence`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $document->setDMS($dms); - $this->assertFalse($document->setSequence(1.1)); - } - - /** - * Test method getContentByVersion(), isLatestContent() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetContentByVersion() - { - $adminuser = self::$dms->getUser(1); - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $document = self::createDocument($folder, $adminuser, 'Document 1'); - /* Get version 1 */ - $content = $document->getContentByVersion(1); - $this->assertIsObject($content); - $this->assertInstanceOf(SeedDMS_Core_DocumentContent::class, $content); - /* There is no version 2 */ - $content = $document->getContentByVersion(2); - $this->assertNull($content); - /* version must be numeric */ - $content = $document->getContentByVersion('foo'); - $this->assertFalse($content); - /* Check if 1 is the latest version number */ - $ret = $document->isLatestContent(1); - $this->assertTrue($ret); - $ret = $document->isLatestContent(2); - $this->assertFalse($ret); - } - - /** - * Test method getDocumentContent() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDocumentContent() - { - $adminuser = self::$dms->getUser(1); - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $document = self::createDocument($folder, $adminuser, 'Document 1'); - /* Get version 1 */ - $content = $document->getContentByVersion(1); - $this->assertIsObject($content); - $this->assertInstanceOf(SeedDMS_Core_DocumentContent::class, $content); - $again = self::$dms->getDocumentContent($content->getId()); - $this->assertIsObject($again); - $this->assertInstanceOf(SeedDMS_Core_DocumentContent::class, $again); - $this->assertEquals($content->getId(), $again->getId()); - $none = self::$dms->getDocumentContent(2); - $this->assertNull($none); - } - - /** - * Test method getDocumentContent() with sql failure - * - * @return void - */ - public function testGetDocumentContentSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblDocumentContent` WHERE `id`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $this->assertFalse($dms->getDocumentContent(1)); - } - - /** - * Test method addDocumentLink(), getDocumentLinks(), getReverseDocumentLinks() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddAndGetDocumentLinks() - { - $adminuser = self::$dms->getUser(1); - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $user = self::$dms->addUser('user1', 'user1', 'User One', 'user1@seeddms.org', 'en_GB', 'bootstrap', ''); - $this->assertIsObject($user); - $document1 = self::createDocument($folder, $adminuser, 'Document 1'); - $document2 = self::createDocument($folder, $adminuser, 'Document 2'); - - /* document 1 has no links */ - $links = $document1->getDocumentLinks(); - $this->assertIsArray($links); - $this->assertCount(0, $links); - $links = $document1->getReverseDocumentLinks(); - $this->assertIsArray($links); - $this->assertCount(0, $links); - - /* Adding a link to none existing target or by a none existing user fails */ - $ret = $document1->addDocumentLink(3, $user->getId(), false); - $this->assertFalse($ret); - $ret = $document1->addDocumentLink($document2->getId(), 4, false); - $this->assertFalse($ret); - - /* Adding a link with a bogus target or user must fail */ - $ret = $document1->addDocumentLink('foo', 1, false); - $this->assertFalse($ret); - $ret = $document1->addDocumentLink(3, 'foo', false); - $this->assertFalse($ret); - - /* Adding a link to myself must fail */ - $ret = $document1->addDocumentLink($document1->getId(), $user->getId(), false); - $this->assertFalse($ret); - - /* Add a non public link to document 2 by user */ - $link = $document1->addDocumentLink($document2->getId(), $user->getId(), false); - $this->assertIsObject($link); - $this->assertInstanceOf(SeedDMS_Core_DocumentLink::class, $link); - $links = $document1->getDocumentLinks(); - $this->assertIsArray($links); - $this->assertCount(1, $links); - $links = $document2->getReverseDocumentLinks(); - $this->assertIsArray($links); - $this->assertCount(1, $links); - /* There is one reverse link of a user */ - $links = $document2->getReverseDocumentLinks(false, $user); - $this->assertIsArray($links); - $this->assertCount(1, $links); - /* There are no public reverse links */ - $links = $document2->getReverseDocumentLinks(true); - $this->assertIsArray($links); - $this->assertCount(0, $links); - - /* There are no public links of document 1 */ - $document1->clearCache(); - $links = $document1->getDocumentLinks(true); - $this->assertIsArray($links); - $this->assertCount(0, $links); - - /* There are no links by adminuser of document 1 */ - $document1->clearCache(); - $links = $document1->getDocumentLinks(false, $adminuser); - $this->assertIsArray($links); - $this->assertCount(0, $links); - - /* There are links by user of document 1 */ - $document1->clearCache(); - $links = $document1->getDocumentLinks(false, $user); - $this->assertIsArray($links); - $this->assertCount(1, $links); - - $link = $document1->getDocumentLink($links[0]->getId()); - $this->assertIsObject($link); - $this->assertTrue($link->isType('documentlink')); - } - - /** - * Test method addDocumentLink(), removeDocumentLinks() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddAndRemoveDocumentLink() - { - $adminuser = self::$dms->getUser(1); - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $user = self::$dms->addUser('user1', 'user1', 'User One', 'user1@seeddms.org', 'en_GB', 'bootstrap', ''); - $this->assertIsObject($user); - $document1 = self::createDocument($folder, $adminuser, 'Document 1'); - $document2 = self::createDocument($folder, $adminuser, 'Document 2'); - - /* Add a non public link to document 2 by user */ - $link = $document1->addDocumentLink($document2->getId(), $user->getId(), false); - $this->assertIsObject($link); - $this->assertInstanceOf(SeedDMS_Core_DocumentLink::class, $link); - $links = $document1->getDocumentLinks(); - $this->assertIsArray($links); - $this->assertCount(1, $links); - - /* Remove the link again */ - $link = $links[0]; - $ret = $document1->removeDocumentLink($link->getId()); - $this->assertTrue($ret); - $links = $document1->getDocumentLinks(); - $this->assertIsArray($links); - $this->assertCount(0, $links); - } - - /** - * Test method addDocumentFile(), getDocumentFiles() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddAndGetDocumentFiles() - { - $adminuser = self::$dms->getUser(1); - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $user = self::$dms->addUser('user1', 'user1', 'User One', 'user1@seeddms.org', 'en_GB', 'bootstrap', ''); - $this->assertIsObject($user); - $document = self::createDocument($folder, $adminuser, 'Document 1'); - - /* document has no files */ - $files = $document->getDocumentFiles(); - $this->assertIsArray($files); - $this->assertCount(0, $files); - - $filename = self::createTempFile(100); - $file1 = $document->addDocumentFile('Attachment 1', '', $user, $filename, 'attachment1.txt', '.txt', 'plain/text'); - unlink($filename); - $this->assertIsObject($file1); - $this->assertInstanceOf(SeedDMS_Core_DocumentFile::class, $file1); - - $filename = self::createTempFile(100); - $file2 = $document->addDocumentFile('Attachment 2', '', $user, $filename, 'attachment2.txt', '.txt', 'plain/text', 1); - unlink($filename); - $this->assertIsObject($file2); - $this->assertInstanceOf(SeedDMS_Core_DocumentFile::class, $file2); - - /* Get all attachments */ - $files = $document->getDocumentFiles(); - $this->assertIsArray($files); - $this->assertCount(2, $files); - - /* Get attachments for version 1 only */ - $files = $document->getDocumentFiles(1, false); - $this->assertIsArray($files); - $this->assertCount(1, $files); - - /* Get attachments for version 1 and version independed */ - $files = $document->getDocumentFiles(1, true); - $this->assertIsArray($files); - $this->assertCount(2, $files); - } - - /** - * Test method addDocumentFile(), removeDocumentFile() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddAndRemoveDocumentFiles() - { - $adminuser = self::$dms->getUser(1); - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $user = self::$dms->addUser('user1', 'user1', 'User One', 'user1@seeddms.org', 'en_GB', 'bootstrap', ''); - $this->assertIsObject($user); - $document = self::createDocument($folder, $adminuser, 'Document 1'); - - /* document has no files */ - $files = $document->getDocumentFiles(); - $this->assertIsArray($files); - $this->assertCount(0, $files); - - $filename = self::createTempFile(100); - $file1 = $document->addDocumentFile('Attachment 1', '', $user, $filename, 'attachment1.txt', '.txt', 'plain/text'); - $this->assertTrue(SeedDMS_Core_File::removeFile($filename)); - $this->assertIsObject($file1); - $this->assertInstanceOf(SeedDMS_Core_DocumentFile::class, $file1); - - /* document has now 1 file */ - $files = $document->getDocumentFiles(); - $this->assertIsArray($files); - $this->assertCount(1, $files); - - /* Removing a file with a none exiting or bogus id must fail */ - $ret = $document->removeDocumentFile(2); - $this->assertFalse($ret); - $ret = $document->removeDocumentFile('foo'); - $this->assertFalse($ret); - - $ret = $document->removeDocumentFile($files[0]->getId()); - $this->assertTrue($ret); - - $files = $document->getDocumentFiles(); - $this->assertIsArray($files); - $this->assertCount(0, $files); - } - - /** - * Test method addDocument(), removeDocument() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddAndRemoveDocument() - { - $adminuser = self::$dms->getUser(1); - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $user = self::$dms->addUser('user1', 'user1', 'User One', 'user1@seeddms.org', 'en_GB', 'bootstrap', ''); - $this->assertIsObject($user); - $document = self::createDocument($folder, $adminuser, 'Document 1'); - $docid = $document->getId(); - - $filename = self::createTempFile(100); - $file1 = $document->addDocumentFile('Attachment 1', '', $user, $filename, 'attachment1.txt', '.txt', 'plain/text'); - $this->assertTrue(SeedDMS_Core_File::removeFile($filename)); - $this->assertIsObject($file1); - $this->assertInstanceOf(SeedDMS_Core_DocumentFile::class, $file1); - - $ret = $document->remove(); - $this->assertTrue($ret); - $document = self::$dms->getDocument($docid); - $this->assertNull($document); - } - - /** - * Test method getUsedDiskSpace() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetUsedDiskSpace() - { - $adminuser = self::$dms->getUser(1); - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - /* Create a document with 1234 Bytes */ - $document = self::createDocument($folder, $adminuser, 'Document 1', 1234); - $size = $document->getUsedDiskSpace(); - $this->assertEquals(1234, $size); - } - - /** - * Test method getTimeline() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetTimeline() - { - $adminuser = self::$dms->getUser(1); - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - /* Create a document */ - $document = self::createDocument($folder, $adminuser, 'Document 1'); - /* Attach a file */ - $filename = self::createTempFile(100); - $file1 = $document->addDocumentFile('Attachment 1', '', $adminuser, $filename, 'attachment1.txt', '.txt', 'plain/text'); - $this->assertTrue(SeedDMS_Core_File::removeFile($filename)); - $this->assertIsObject($file1); - $this->assertInstanceOf(SeedDMS_Core_DocumentFile::class, $file1); - - /* Get the timeline. It must contain two entries - * - the initial release of the document - * - adding the attachment - */ - $timeline = $document->getTimeLine(); - $this->assertIsArray($timeline); - $this->assertCount(2, $timeline); - } - - /** - * Test method transferToUser() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testTransferToUser() - { - $adminuser = self::$dms->getUser(1); - $user = self::$dms->addUser('user1', 'user1', 'User One', 'user1@seeddms.org', 'en_GB', 'bootstrap', ''); - $this->assertIsObject($user); - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - /* Create two documents */ - $document1 = self::createDocument($folder, $adminuser, 'Document 1'); - $document2 = self::createDocument($folder, $adminuser, 'Document 2'); - - /* Attach a file */ - $filename = self::createTempFile(100); - $file1 = $document1->addDocumentFile('Attachment 1', '', $adminuser, $filename, 'attachment1.txt', '.txt', 'plain/text'); - $this->assertTrue(SeedDMS_Core_File::removeFile($filename)); - $this->assertIsObject($file1); - $this->assertInstanceOf(SeedDMS_Core_DocumentFile::class, $file1); - - /* Add a non public link to document 2 */ - $link = $document1->addDocumentLink($document2->getId(), $adminuser->getId(), false); - $this->assertIsObject($link); - $this->assertInstanceOf(SeedDMS_Core_DocumentLink::class, $link); - - /* Transfer document to $user */ - $this->assertEquals('admin', $document1->getOwner()->getLogin()); - $links = $document1->getDocumentLinks(false, $adminuser); - $this->assertIsArray($links); - $this->assertCount(1, $links); - - $ret = $document1->transferToUser($user); - $this->assertTrue($ret); - $this->assertEquals('user1', $document1->getOwner()->getLogin()); - $links = $document1->getDocumentLinks(false, $user); - $this->assertIsArray($links); - $this->assertCount(1, $links); - $files = $document1->getDocumentFiles(); - $this->assertIsArray($files); - $this->assertCount(1, $files); - $this->assertEquals($files[0]->getUserID(), $user->getId()); - } -} diff --git a/SeedDMS_Core/tests/FileUtilsTest.php b/SeedDMS_Core/tests/FileUtilsTest.php deleted file mode 100644 index 7e1b87cfb..000000000 --- a/SeedDMS_Core/tests/FileUtilsTest.php +++ /dev/null @@ -1,219 +0,0 @@ - - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version @package_version@ - * @link https://www.seeddms.org - */ - -use PHPUnit\Framework\SeedDmsTest; - -/** - * Group test class - * - * @category SeedDMS - * @package Tests - * @author Uwe Steinmann - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version Release: @package_version@ - * @link https://www.seeddms.org - */ -class FileUtilsTest extends SeedDmsTest -{ - /** - * Create temporary directory - * - * @return void - */ - protected function setUp(): void - { - self::$contentdir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'phpunit-'.time(); - mkdir(self::$contentdir); - } - - /** - * Clean up at tear down - * - * @return void - */ - protected function tearDown(): void - { - exec('rm -rf '.self::$contentdir); - } - - /** - * Test method format_filesize() - * - * @return void - */ - public function testFormatFileSize() - { - $this->assertEquals('1 Byte', SeedDMS_Core_File::format_filesize(1)); - $this->assertEquals('0 Bytes', SeedDMS_Core_File::format_filesize(0)); - $this->assertEquals('1000 Bytes', SeedDMS_Core_File::format_filesize(1000)); - $this->assertEquals('1 KiB', SeedDMS_Core_File::format_filesize(1024)); - $this->assertEquals('1 KiB', SeedDMS_Core_File::format_filesize(1025)); - $this->assertEquals('2 KiB', SeedDMS_Core_File::format_filesize(2047)); - $this->assertEquals('1 MiB', SeedDMS_Core_File::format_filesize(1024*1024)); - $this->assertEquals('1 GiB', SeedDMS_Core_File::format_filesize(1024*1024*1024)); - } - - /** - * Test method format_filesize() - * - * @return void - */ - public function testParseFileSize() - { - $this->assertEquals(200, SeedDMS_Core_File::parse_filesize('200B')); - $this->assertEquals(200, SeedDMS_Core_File::parse_filesize('200 B')); - $this->assertEquals(200, SeedDMS_Core_File::parse_filesize('200')); - $this->assertEquals(1024, SeedDMS_Core_File::parse_filesize('1K')); - $this->assertEquals(2*1024*1024, SeedDMS_Core_File::parse_filesize('2M')); - $this->assertEquals(3*1024*1024*1024, SeedDMS_Core_File::parse_filesize('3 G')); - $this->assertEquals(4*1024*1024*1024*1024, SeedDMS_Core_File::parse_filesize('4 T')); - $this->assertFalse(SeedDMS_Core_File::parse_filesize('4 t')); - $this->assertFalse(SeedDMS_Core_File::parse_filesize('-4T')); - } - - /** - * Test method fileSize() - * - * @return void - */ - public function testFileSize() - { - $filename = self::createTempFile(200, self::$contentdir); - $this->assertEquals(200, SeedDMS_Core_File::fileSize($filename)); - /* Getting the size of a none existing file returns false */ - $this->assertFalse(SeedDMS_Core_File::fileSize('foobar')); - $this->assertTrue(SeedDMS_Core_File::removeFile($filename)); - } - - /** - * Test method file_exists() - * - * @return void - */ - public function testFileExists() - { - $filename = self::createTempFile(200, self::$contentdir); - $this->assertTrue(SeedDMS_Core_File::file_exists($filename)); - $this->assertFalse(SeedDMS_Core_File::file_exists($filename.'bla')); - $this->assertTrue(SeedDMS_Core_File::removeFile($filename)); - } - - /** - * Test method fileExtension() - * - * @return void - */ - public function testFileExtension() - { - $this->assertEquals('png', SeedDMS_Core_File::fileExtension('image/png')); - $this->assertEquals('', SeedDMS_Core_File::fileExtension('image/kpng')); - $this->assertEquals('txt', SeedDMS_Core_File::fileExtension('text/plain')); - $this->assertEquals('md', SeedDMS_Core_File::fileExtension('text/markdown')); - } - - /** - * Test method moveFile() - * - * @return void - */ - public function testMoveFile() - { - $filename = self::createTempFile(200, self::$contentdir); - $this->assertEquals(200, SeedDMS_Core_File::fileSize($filename)); - $ret = SeedDMS_Core_File::moveFile($filename, self::$contentdir.DIRECTORY_SEPARATOR."foobar"); - $this->assertTrue($ret); - /* Getting the file size of the old doc must fail now */ - $this->assertFalse(SeedDMS_Core_File::fileSize($filename)); - /* Getting the file size of the new doc succeds */ - $this->assertEquals(200, SeedDMS_Core_File::fileSize(self::$contentdir.DIRECTORY_SEPARATOR."foobar")); - $this->assertTrue(SeedDMS_Core_File::removeFile(self::$contentdir.DIRECTORY_SEPARATOR."foobar")); - } - - /** - * Test method makeDir(), renameDir(), removeDir() - * - * @return void - */ - public function testMakeRenameAndRemoveDir() - { - /* Create a directory and put a file into it */ - $ret = SeedDMS_Core_File::makeDir(self::$contentdir.DIRECTORY_SEPARATOR."foobar"); - system('touch '.self::$contentdir.DIRECTORY_SEPARATOR."foobar".DIRECTORY_SEPARATOR."tt"); - /* Rename the directory */ - $ret = SeedDMS_Core_File::renameDir(self::$contentdir.DIRECTORY_SEPARATOR."foobar", self::$contentdir.DIRECTORY_SEPARATOR."bazfoo"); - $this->assertTrue($ret); - /* The new must exist and the old one is gone */ - $this->assertTrue(is_dir(self::$contentdir.DIRECTORY_SEPARATOR."bazfoo")); - $this->assertFalse(is_dir(self::$contentdir.DIRECTORY_SEPARATOR."foobar")); - $this->assertTrue(SeedDMS_Core_File::removeDir(self::$contentdir.DIRECTORY_SEPARATOR."bazfoo")); - $this->assertFalse(SeedDMS_Core_File::removeDir(self::$contentdir.DIRECTORY_SEPARATOR."bazfoo")); - $this->assertFalse(SeedDMS_Core_File::removeDir(self::$contentdir.DIRECTORY_SEPARATOR."foobar")); - - /* Create a directory, a sub directory and a file */ - $ret = SeedDMS_Core_File::makeDir(self::$contentdir.DIRECTORY_SEPARATOR."foobar"); - $this->assertTrue($ret); - $ret = SeedDMS_Core_File::makeDir(self::$contentdir.DIRECTORY_SEPARATOR."foobar".DIRECTORY_SEPARATOR."bazfoo"); - $this->assertTrue($ret); - system('touch '.self::$contentdir.DIRECTORY_SEPARATOR."foobar".DIRECTORY_SEPARATOR."bazfoo".DIRECTORY_SEPARATOR."tt"); - $this->assertTrue(SeedDMS_Core_File::file_exists(self::$contentdir.DIRECTORY_SEPARATOR."foobar".DIRECTORY_SEPARATOR."bazfoo".DIRECTORY_SEPARATOR."tt")); - - $ret = SeedDMS_Core_File::removeDir(self::$contentdir.DIRECTORY_SEPARATOR."foobar"); - $this->assertTrue($ret); - $this->assertFalse(SeedDMS_Core_File::file_exists(self::$contentdir.DIRECTORY_SEPARATOR."foobar")); - $this->assertFalse(SeedDMS_Core_File::file_exists(self::$contentdir.DIRECTORY_SEPARATOR."foobar".DIRECTORY_SEPARATOR."bazfoo")); - $this->assertFalse(SeedDMS_Core_File::file_exists(self::$contentdir.DIRECTORY_SEPARATOR."foobar".DIRECTORY_SEPARATOR."bazfoo".DIRECTORY_SEPARATOR."tt")); - } - - /** - * Test method makeDir(), copyDir(), removeDir() - * - * @return void - */ - public function testMakeCopyAndRemoveDir() - { - /* Create a directory and put a file into it */ - $ret = SeedDMS_Core_File::makeDir(self::$contentdir.DIRECTORY_SEPARATOR."foobar"); - system('touch '.self::$contentdir.DIRECTORY_SEPARATOR."foobar".DIRECTORY_SEPARATOR."tt"); - /* Rename the directory */ - $ret = SeedDMS_Core_File::copyDir(self::$contentdir.DIRECTORY_SEPARATOR."foobar", self::$contentdir.DIRECTORY_SEPARATOR."bazfoo"); - $this->assertTrue($ret); - /* The new and the old dir must exist */ - $this->assertTrue(is_dir(self::$contentdir.DIRECTORY_SEPARATOR."bazfoo")); - $this->assertTrue(is_dir(self::$contentdir.DIRECTORY_SEPARATOR."foobar")); - $this->assertTrue(SeedDMS_Core_File::removeDir(self::$contentdir.DIRECTORY_SEPARATOR."bazfoo")); - $this->assertTrue(SeedDMS_Core_File::removeDir(self::$contentdir.DIRECTORY_SEPARATOR."foobar")); - } - - /** - * Test method moveDir() - * - * @return void - */ - public function testMakeAndMoveDir() - { - /* Create a directory and put a file into it */ - $ret = SeedDMS_Core_File::makeDir(self::$contentdir.DIRECTORY_SEPARATOR."foobar"); - system('touch '.self::$contentdir.DIRECTORY_SEPARATOR."foobar".DIRECTORY_SEPARATOR."tt"); - /* Rename the directory */ - $ret = SeedDMS_Core_File::moveDir(self::$contentdir.DIRECTORY_SEPARATOR."foobar", self::$contentdir.DIRECTORY_SEPARATOR."bazfoo"); - $this->assertTrue($ret); - /* The new must exist and the old dir must be disappeared */ - $this->assertTrue(is_dir(self::$contentdir.DIRECTORY_SEPARATOR."bazfoo")); - $this->assertFalse(is_dir(self::$contentdir.DIRECTORY_SEPARATOR."foobar")); - $this->assertTrue(SeedDMS_Core_File::removeDir(self::$contentdir.DIRECTORY_SEPARATOR."bazfoo")); - $this->assertFalse(is_dir(self::$contentdir.DIRECTORY_SEPARATOR."bazfoo")); - } -} diff --git a/SeedDMS_Core/tests/FolderTest.php b/SeedDMS_Core/tests/FolderTest.php deleted file mode 100644 index ee05f0b8c..000000000 --- a/SeedDMS_Core/tests/FolderTest.php +++ /dev/null @@ -1,1221 +0,0 @@ - - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version @package_version@ - * @link https://www.seeddms.org - */ - -use PHPUnit\Framework\SeedDmsTest; - -/** - * Group test class - * - * @category SeedDMS - * @package Tests - * @author Uwe Steinmann - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version Release: @package_version@ - * @link https://www.seeddms.org - */ -class FolderTest extends SeedDmsTest -{ - - /** - * Create a real sqlite database in memory - * - * @return void - */ - protected function setUp(): void - { - self::$dbh = self::createInMemoryDatabase(); - self::$contentdir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'phpunit-'.time(); - mkdir(self::$contentdir); - // echo "Creating temp content dir: ".self::$contentdir."\n"; - self::$dms = new SeedDMS_Core_DMS(self::$dbh, self::$contentdir); - } - - /** - * Clean up at tear down - * - * @return void - */ - protected function tearDown(): void - { - self::$dbh = null; - // echo "\nRemoving temp. content dir: ".self::$contentdir."\n"; - exec('rm -rf '.self::$contentdir); - } - - /** - * Test method getInstance() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetInstanceRootFolder() - { - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $this->assertIsObject($folder); - $this->assertEquals('DMS', $folder->getName()); - /* get instance of none existing folder */ - $folder = SeedDMS_Core_Folder::getInstance(2, self::$dms); - $this->assertNull($folder); - } - - /** - * Test method isType() - * - * @return void - */ - public function testIsType() - { - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $this->assertTrue($folder->isType('folder')); - } - - /** - * Test method getInstance() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetInstance() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $subfolder = $rootfolder->addSubFolder('Subfolder 1', '', $user, 2.0); - $subsubfolder = $subfolder->addSubFolder('Subsubfolder 1', '', $user, 1.0); - /* Get the folder with id 2, which must be 'Subfolder 1' */ - $folder = SeedDMS_Core_Folder::getInstance(2, self::$dms); - $this->assertIsObject($folder); - $this->assertEquals('Subfolder 1', $folder->getName()); - /* Get a none existing folder */ - $folder = SeedDMS_Core_Folder::getInstance(4, self::$dms); - $this->assertNull($folder); - } - - /** - * Test method getInstance() - * - * @return void - */ - public function testGetInstanceSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblFolders`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $this->assertFalse(SeedDMS_Core_Folder::getInstance(1, $dms)); - } - - /** - * Test method getInstanceByName() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetInstanceByName() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $subfolder = $rootfolder->addSubFolder('Subfolder 1', '', $user, 2.0); - $subsubfolder = $subfolder->addSubFolder('Subsubfolder 1', '', $user, 1.0); - /* Search for it anywhere in the folder hierarchy */ - $folder = SeedDMS_Core_Folder::getInstanceByName('Subsubfolder 1', null, self::$dms); - $this->assertIsObject($folder); - $this->assertEquals('Subsubfolder 1', $folder->getName()); - /* Search for it within 'Subfolder 1' will find it */ - $folder = SeedDMS_Core_Folder::getInstanceByName('Subsubfolder 1', $subfolder, self::$dms); - $this->assertIsObject($folder); - $this->assertEquals('Subsubfolder 1', $folder->getName()); - /* Search for it within root folder will not find it */ - $folder = SeedDMS_Core_Folder::getInstanceByName('Subsubfolder 1', $rootfolder, self::$dms); - $this->assertNull($folder); - } - - /** - * Test method getInstanceByName() - * - * @return void - */ - public function testGetInstanceByNameSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblFolders`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $this->assertFalse(SeedDMS_Core_Folder::getInstanceByName('foo', null, $dms)); - } - - /** - * Test method getName() and setName() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetName() - { - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $name = $folder->getName(); - $this->assertEquals('DMS', $name); - $ret = $folder->setName('foo'); - $this->assertTrue($ret); - $name = $folder->getName(); - $this->assertEquals('foo', $name); - } - - /** - * Test method setName() - * - * @return void - */ - public function testSetNameSqlFail() - { - $rootfolder = $this->getMockedRootFolder(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblFolders` SET `name`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $rootfolder->setDMS($dms); - $this->assertFalse($rootfolder->setName('foo')); - } - - /** - * Test method getComment() and setComment() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetComment() - { - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $comment = $folder->getComment(); - $this->assertEquals('DMS root', $comment); - $ret = $folder->setComment('foo'); - $this->assertTrue($ret); - $comment = $folder->getComment(); - $this->assertEquals('foo', $comment); - } - - /** - * Test method setComment() - * - * @return void - */ - public function testSetCommentSqlFail() - { - $rootfolder = $this->getMockedRootFolder(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblFolders` SET `comment`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $rootfolder->setDMS($dms); - $this->assertFalse($rootfolder->setComment('foo')); - } - - /** - * Test method getSequence() and setSequence() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetSequence() - { - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - /* The root folder's sequence in the initial database is 0.0 */ - $sequence = $folder->getSequence(); - $this->assertEquals(0.0, $sequence); - $ret = $folder->setSequence(1.5); - $this->assertTrue($ret); - $sequence = $folder->getSequence(); - $this->assertEquals(1.5, $sequence); - } - - /** - * Test method setSequence() - * - * @return void - */ - public function testSetSequenceSqlFail() - { - $rootfolder = $this->getMockedRootFolder(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblFolders` SET `sequence`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $rootfolder->setDMS($dms); - $this->assertFalse($rootfolder->setSequence(0.0)); - } - - /** - * Test method getDate() and setDate() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetDate() - { - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $now = time(); - /* Passing false as a time stamp will take current time stamp */ - $ret = $folder->setDate(false); - $this->assertTrue($ret); - $date = $folder->getDate(); - $this->assertEquals($now, $date); - /* Setting a time stamp */ - $now -= 1000; - $ret = $folder->setDate($now); - $this->assertTrue($ret); - $date = $folder->getDate(); - $this->assertEquals($now, $date); - /* Setting a none numeric value will fail */ - $ret = $folder->setDate('foo'); - $this->assertFalse($ret); - } - - /** - * Test method setDate() - * - * @return void - */ - public function testSetDateSqlFail() - { - $rootfolder = $this->getMockedRootFolder(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblFolders` SET `date`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $rootfolder->setDMS($dms); - $this->assertFalse($rootfolder->setDate(time())); - } - - /** - * Test method getParent() - * - * Get parent of root folder which is always null. - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetParentRootFolder() - { - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $parent = $folder->getParent(); - $this->assertNull($parent); - } - - /** - * Test method getParent() - * - * Create a new subfolder below root folder and check if parent - * of the folder is the root folder. - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetParent() - { - $adminuser = self::$dms->getUser(1); - $rootfolder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $subfolder = $rootfolder->addSubFolder('Subfolder 1', '', $adminuser, 0); - $parent = $subfolder->getParent(); - $this->assertIsObject($parent); - $this->assertInstanceOf(SeedDMS_Core_Folder::class, $parent); - $this->assertEquals(1, $parent->getId()); - } - - /** - * Test method setParent() on root folder - * - * Moving the root folder will always fail - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testSetParentRootFolder() - { - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $ret = $folder->setParent(1); - $this->assertFalse($ret); - } - - /** - * Test method getOwner() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetOwner() - { - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $owner = $folder->getOwner(); - $this->assertIsObject($owner); - $this->assertInstanceOf(SeedDMS_Core_User::class, $owner); - $this->assertEquals(1, $owner->getId()); - } - - /** - * Test method setOwner() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testSetOwner() - { - $adminuser = self::$dms->getUser(1); - $rootfolder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $user = self::$dms->addUser('user1', 'user1', 'User One', 'user1@seeddms.org', 'en_GB', 'bootstrap', ''); - $subfolder = $rootfolder->addSubFolder('Subfolder 1', '', $adminuser, 0); - $res = $subfolder->setOwner($user); - $this->assertTrue($res); - $owner = $subfolder->getOwner(); - $this->assertIsObject($owner); - $this->assertInstanceOf(SeedDMS_Core_User::class, $owner); - $this->assertEquals($user->getId(), $owner->getId()); - } - - /** - * Test method setOwner() - * - * @return void - */ - public function testSetOwnerSqlFail() - { - $rootfolder = $this->getMockedRootFolder(); - $user = new SeedDMS_Core_User(1, 'admin', 'pass', 'Joe Foo', 'baz@foo.de', 'en_GB', 'bootstrap', 'My comment', SeedDMS_Core_User::role_admin); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblFolders` SET `owner`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $rootfolder->setDMS($dms); - $this->assertFalse($rootfolder->setOwner($user)); - } - - /** - * Test method getDefaultAccess() - * - * The default access is always M_READ unless it was set differently - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDefaultAccess() - { - $adminuser = self::$dms->getUser(1); - $rootfolder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $accessmode = $rootfolder->getDefaultAccess(); - $this->assertEquals(M_READ, $accessmode); - $subfolder = $rootfolder->addSubFolder('Subfolder 1', '', $adminuser, 0); - $accessmode = $subfolder->getDefaultAccess(); - $this->assertEquals(M_READ, $accessmode); - } - - /** - * Test method setDefaultAccess() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testSetDefaultAccess() - { - $adminuser = self::$dms->getUser(1); - $rootfolder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $subfolder = $rootfolder->addSubFolder('Subfolder 1', '', $adminuser, 0); - /* Setting the default access to something != M_READ will not have - * any effect as long as inheritage of access rights is turned on. - */ - $subfolder->setDefaultAccess(M_READWRITE, true); - $accessmode = $subfolder->getDefaultAccess(); - $this->assertEquals(M_READ, $accessmode); - /* Turning inheritage off will use the default access */ - $subfolder->setInheritAccess(false, true); - $accessmode = $subfolder->getDefaultAccess(); - $this->assertEquals(M_READWRITE, $accessmode); - } - - /** - * Test method setDefaultAccess() - * - * @return void - */ - public function testSetDefaultAccessSqlFail() - { - $rootfolder = $this->getMockedRootFolder(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblFolders` SET `defaultAccess`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $rootfolder->setDMS($dms); - $this->assertFalse($rootfolder->setDefaultAccess(M_NONE)); - } - - /** - * Test method setInheritAccess() - * - * @return void - */ - public function testSetInheritAccessSqlFail() - { - $rootfolder = $this->getMockedRootFolder(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblFolders` SET `inheritAccess`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $rootfolder->setDMS($dms); - $this->assertFalse($rootfolder->setInheritAccess(true)); - } - - /** - * Test method hasSubFolders() on root folder and after adding - * new subfolders. - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testHasSubFolders() - { - $user = self::$dms->getUser(1); - $rootfolder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $ret = $rootfolder->hasSubFolders(); - $this->assertIsInt($ret); - $this->assertEquals(0, $ret); - $subfolder1 = $rootfolder->addSubFolder('Subfolder 1', '', $user, 2.0); - $subfolder2 = $rootfolder->addSubFolder('Subfolder 2', '', $user, 1.0); - $ret = $rootfolder->hasSubFolders(); - $this->assertIsInt($ret); - $this->assertEquals(2, $ret); - /* hasSubFolderByName() just returns true or false */ - $ret = $rootfolder->hasSubFolderByName('Subfolder 1'); - $this->assertTrue($ret); - $ret = $rootfolder->hasSubFolderByName('Subfolder 3'); - $this->assertFalse($ret); - } - - /** - * Test method hasSubFolders with sql fail() - * - * @return void - */ - public function testHasSubFoldersSqlFail() - { - $rootfolder = $this->getMockedRootFolder(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT count(*) as c FROM `tblFolders`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $rootfolder->setDMS($dms); - $this->assertFalse($rootfolder->hasSubFolders()); - } - - /** - * Test method hasSubFolderByName with sql fail() - * - * @return void - */ - public function testHasSubFolderByNameSqlFail() - { - $rootfolder = $this->getMockedRootFolder(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT count(*) as c FROM `tblFolders`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $rootfolder->setDMS($dms); - $this->assertFalse($rootfolder->hasSubFolderByName('foo')); - } - - /** - * Test method getSubFolders() on root folder - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetSubFoldersRootOnly() - { - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $folders = $folder->getSubFolders(); - $this->assertIsArray($folders); - $this->assertCount(0, $folders); - } - - /** - * Test method getSubFolders() on root folder - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetSubFolders() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $subfolder1 = $rootfolder->addSubFolder('Subfolder 1', '', $user, 2.0); - $subfolder2 = $rootfolder->addSubFolder('Subfolder 2', '', $user, 1.0); - $folders = $rootfolder->getSubFolders(); - $this->assertIsArray($folders); - $this->assertCount(2, $folders); - - /* Get sub folders order by name descending */ - $rootfolder->clearCache(); // Force retrieving sub folders from database - $folders = $rootfolder->getSubFolders('n', 'desc', 1, 0); - $this->assertIsArray($folders); - $this->assertCount(1, $folders); - $this->assertEquals('Subfolder 2', $folders[0]->getName()); - - /* Get sub folders order by name descending with an offset of 1 */ - $rootfolder->clearCache(); // Force retrieving sub folders from database - $folders = $rootfolder->getSubFolders('n', 'desc', 1, 1); - $this->assertIsArray($folders); - $this->assertCount(1, $folders); - $this->assertEquals('Subfolder 1', $folders[0]->getName()); - - /* Get sub folders order by sequence ascending */ - $rootfolder->clearCache(); // Force retrieving sub folders from database - $folders = $rootfolder->getSubFolders('s', 'asc', 1, 0); - $this->assertIsArray($folders); - $this->assertCount(1, $folders); - $this->assertEquals('Subfolder 2', $folders[0]->getName()); - - /* Get sub folders order by sequence ascending with a bogus offset */ - $rootfolder->clearCache(); // Force retrieving sub folders from database - $folders = $rootfolder->getSubFolders('s', 'asc', 0, 4); - $this->assertIsArray($folders); - $this->assertCount(2, $folders); - $this->assertEquals('Subfolder 2', $folders[0]->getName()); - } - - /** - * Test method getSubFolders() - * - * @return void - */ - public function testGetSubFoldersSqlFail() - { - $rootfolder = $this->getMockedRootFolder(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblFolders`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $rootfolder->setDMS($dms); - $this->assertFalse($rootfolder->getSubFolders()); - } - - /** - * Test method isDescendant() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testIsDescendant() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $subfolder = $rootfolder->addSubFolder('Subfolder 1', '', $user, 2.0); - $subsubfolder = $subfolder->addSubFolder('Subsubfolder 1', '', $user, 1.0); - /* subsubfolder is a descendant of root folder */ - $this->assertTrue($subsubfolder->isDescendant($rootfolder)); - /* subfolder is not a descendant of subsubfolder */ - $this->assertFalse($subfolder->isDescendant($subsubfolder)); - } - - /** - * Test method isSubFolder() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testIsSubFolder() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $subfolder = $rootfolder->addSubFolder('Subfolder 1', '', $user, 2.0); - $subsubfolder = $subfolder->addSubFolder('Subsubfolder 1', '', $user, 1.0); - $this->assertTrue($rootfolder->isSubFolder($subsubfolder)); - $this->assertFalse($subsubfolder->isSubFolder($subfolder)); - } - - /** - * Test method setParent() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testSetParent() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $subfolder = $rootfolder->addSubFolder('Subfolder 1', '', $user, 2.0); - $subsubfolder = $subfolder->addSubFolder('Subsubfolder 1', '', $user, 1.0); - /* Add a new document for folderList checking afterwards */ - $document = self::createDocument($subsubfolder, $user, 'Document 1'); - $folderlist = $subsubfolder->getFolderList(); - $this->assertEquals(':1:2:', $folderlist); - $folderlist = $document->getFolderList(); - $this->assertEquals(':1:2:3:', $folderlist); - /* Making $subsubfolder parent of $subfolder will fail, because - * $subfolder is a parent of $subsubfolder - */ - $this->assertFalse($subfolder->setParent($subsubfolder)); - /* Moving $subsubfolder into rool folder is possible */ - $this->assertTrue($subsubfolder->setParent($rootfolder)); - /* Root folder has now two children */ - $children = $rootfolder->getSubFolders(); - $this->assertIsArray($children); - $this->assertCount(2, $children); - /* Move the folder will have changed the folder list. Check it */ - $errors = self::$dms->checkFolders(); - $this->assertIsArray($errors); - $this->assertCount(0, $errors); - $errors = self::$dms->checkDocuments(); - $this->assertIsArray($errors); - $this->assertCount(0, $errors); - } - - /** - * Test method getPath() on root folder - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetPathRootOnly() - { - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $path = $folder->getPath(); - $this->assertIsArray($path); - $this->assertCount(1, $path); - /* The only folder in the path is the root folder itself */ - $this->assertEquals(1, $path[0]->getId()); - } - - /** - * Test method getPath() on root folder - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetPath() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $subfolder = $rootfolder->addSubFolder('Subfolder 1', '', $user, 2.0); - $subsubfolder = $subfolder->addSubFolder('Subsubfolder 1', '', $user, 1.0); - $path = $subsubfolder->getPath(); - $this->assertIsArray($path); - $this->assertCount(3, $path); - } - - /** - * Test method getFolderPathPlain() on root folder - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetFolderPathPlain() - { - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $path = $folder->getFolderPathPlain(); - $this->assertIsString($path); - $this->assertEquals('/ DMS', $path); - } - - /** - * Test method hasDocuments() on root folder - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testHasDocuments() - { - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $user = self::$dms->getUser(1); - $documents = $folder->hasDocuments(); - $this->assertIsInt($documents); - $this->assertEquals(0, $documents); - /* Add a new document for calling hasDocuments() afterwards */ - $document = self::createDocument($folder, $user, 'Document 1'); - $documents = $folder->hasDocuments(); - $this->assertIsInt($documents); - $this->assertEquals(1, $documents); - } - - /** - * Test method hasDocuments() - * - * @return void - */ - public function testHasDokumentsSqlFail() - { - $rootfolder = $this->getMockedRootFolder(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT count(*) as c FROM `tblDocuments`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $rootfolder->setDMS($dms); - $this->assertFalse($rootfolder->hasDocuments()); - } - - /** - * Test method hasDocumentByName() on root folder - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testHasDocumentByName() - { - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $user = self::$dms->getUser(1); - $res = $folder->hasDocumentByName('foo'); - $this->assertFalse($res); - /* Add a new document for calling hasDocumentByName() afterwards */ - $document = self::createDocument($folder, $user, 'Document 1'); - $res = $folder->hasDocumentByName('Document 1'); - $this->assertTrue($res); - } - - /** - * Test method hasDocumentByName() - * - * @return void - */ - public function testHasDokumentByNameSqlFail() - { - $rootfolder = $this->getMockedRootFolder(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT count(*) as c FROM `tblDocuments`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $rootfolder->setDMS($dms); - $this->assertFalse($rootfolder->hasDocumentByName('foo')); - } - - /** - * Test method getDocuments() on root folder - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDocuments() - { - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $user = self::$dms->getUser(1); - $documents = $folder->getDocuments(); - $this->assertIsArray($documents); - $this->assertCount(0, $documents); - /* Add a new document for calling getDocuments() afterwards */ - $folder->clearCache(); - $document = self::createDocument($folder, $user, 'Document 1'); - $document = self::createDocument($folder, $user, 'Document 2'); - $documents = $folder->getDocuments(); - $this->assertIsArray($documents); - $this->assertCount(2, $documents); - $folder->clearCache(); - /* sort by name asc, limit 1, offset 0 */ - $documents = $folder->getDocuments('n', 'asc', 1); - $this->assertIsArray($documents); - $this->assertCount(1, $documents); - $this->assertEquals('Document 1', $documents[0]->getName()); - $folder->clearCache(); - /* sort by name desc, limit 1, offset 0 */ - $documents = $folder->getDocuments('n', 'desc', 1); - $this->assertIsArray($documents); - $this->assertCount(1, $documents); - $this->assertEquals('Document 2', $documents[0]->getName()); - $folder->clearCache(); - /* sort by name asc, limit 1, offset 1 */ - $documents = $folder->getDocuments('n', 'asc', 1, 1); - $this->assertIsArray($documents); - $this->assertCount(1, $documents); - $this->assertEquals('Document 2', $documents[0]->getName()); - } - - /** - * Test method getDocuments() - * - * @return void - */ - public function testGetDokumentsSqlFail() - { - $rootfolder = $this->getMockedRootFolder(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT `tblDocuments`.*, `tblDocumentLocks`.`userID` as `lock` FROM `tblDocuments`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $rootfolder->setDMS($dms); - $this->assertFalse($rootfolder->getDocuments()); - } - - /** - * Test method countChildren() on root folder - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testCountChildren() - { - $folder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $user = self::$dms->getUser(1); - $count = $folder->countChildren($user, 0); - $this->assertIsArray($count); - $this->assertCount(4, $count); - $this->assertEquals(0, $count['folder_count']); - $this->assertEquals(0, $count['document_count']); - /* Add some folders and documents */ - $this->createSimpleFolderStructure(); - $document = self::createDocument($folder, $user, 'Document 1'); - $count = $folder->countChildren($user, 6); - $this->assertIsArray($count); - $this->assertCount(4, $count); - $this->assertEquals(5, $count['folder_count']); - $this->assertEquals(1, $count['document_count']); - } - - /** - * Test method emptyFolder() on root folder - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testEmptyFolder() - { - $rootfolder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $user = self::$dms->getUser(1); - /* Add some folders and documents */ - $this->createSimpleFolderStructure(); - $document = self::createDocument($rootfolder, $user, 'Document 1'); - $res = $rootfolder->emptyFolder(); - $this->assertTrue($res); - } - - /** - * Test method emptyFolder() on root folder - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testEmptyFolderWithCallback() - { - $rootfolder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $user = self::$dms->getUser(1); - /* Add some folders and documents */ - $this->createSimpleFolderStructure(); - $document = self::createDocument($rootfolder, $user, 'Document 1'); - - /* Add the 'onPostAddUser' callback */ - $msgs = []; - $callback = function ($param, $object) use (&$msgs) { - $msgs[] = $param." ".$object->getName(). " (".$object->getId().")"; - }; - self::$dms->addCallback('onPreRemoveFolder', $callback, 'onPreRemoveFolder'); - self::$dms->addCallback('onPostRemoveFolder', $callback, 'onPostRemoveFolder'); - self::$dms->addCallback('onPreRemoveDocument', $callback, 'onPreRemoveDocument'); - self::$dms->addCallback('onPostRemoveDocument', $callback, 'onPostRemoveDocument'); - self::$dms->addCallback('onPreEmptyFolder', $callback, 'onPreEmptyFolder'); - self::$dms->addCallback('onPostEmptyFolder', $callback, 'onPostEmptyFolder'); - - $res = $rootfolder->emptyFolder(); - $this->assertTrue($res); - $this->assertIsArray($msgs); - $this->assertCount(14, $msgs); // 5 folders x 2 callbacks + 1 document x 2 callbacks + 2 emptyFolder callbacks - } - - /** - * Test method getAccessList() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAccessList() - { - /* Add some folders and documents */ - $this->createSimpleFolderStructure(); - $this->createGroupsAndUsers(); - - $rootfolder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $user = self::$dms->getUser(1); - $this->assertIsObject($user); - $group = self::$dms->getGroup(1); - $this->assertIsObject($group); - $subfolder = self::$dms->getFolderByName('Subfolder 1'); - $this->assertIsObject($subfolder); - $subsubfolder = self::$dms->getFolderByName('Subsubfolder 1'); - $this->assertIsObject($subsubfolder); - - /* Adding an access rule will have no effect until the inheritance - * is turned off. - */ - $subfolder->addAccess(M_NONE, $user->getId(), true); - $subfolder->addAccess(M_READWRITE, $group->getId(), false); - $accesslist = $subfolder->getAccessList(); - $this->assertIsArray($accesslist); - $this->assertCount(0, $accesslist['users']); - $this->assertCount(0, $accesslist['groups']); - /* Turn inheritance off */ - $res = $subfolder->setInheritAccess(false); - $this->assertTrue($res); - /* Now the access rules on $subfolder take effect */ - $accesslist = $subfolder->getAccessList(); - $this->assertIsArray($accesslist); - $this->assertCount(1, $accesslist['users']); - $this->assertCount(1, $accesslist['groups']); - /* get list of users/groups which no access */ - $accesslist = $subfolder->getAccessList(M_NONE, O_EQ); - $this->assertIsArray($accesslist); - $this->assertCount(1, $accesslist['users']); - $this->assertCount(0, $accesslist['groups']); - /* get list of users/groups which read+write access */ - $accesslist = $subfolder->getAccessList(M_READWRITE, O_EQ); - $this->assertIsArray($accesslist); - $this->assertCount(0, $accesslist['users']); - $this->assertCount(1, $accesslist['groups']); - /* get list of users/groups which have at least read access */ - $accesslist = $subfolder->getAccessList(M_READ, O_GTEQ); - $this->assertIsArray($accesslist); - $this->assertCount(0, $accesslist['users']); - $this->assertCount(1, $accesslist['groups']); - /* get list of users/groups which have at least unlimited access */ - $accesslist = $subfolder->getAccessList(M_ALL, O_GTEQ); - $this->assertIsArray($accesslist); - $this->assertCount(0, $accesslist['users']); - $this->assertCount(0, $accesslist['groups']); - /* Subsubfolder 1 inherits from Subfolder 1 */ - $accesslist = $subsubfolder->getAccessList(); - $this->assertIsArray($accesslist); - $this->assertCount(1, $accesslist['users']); - $this->assertCount(1, $accesslist['groups']); - /* clear the access list */ - $res = $subfolder->clearAccessList(); - $this->assertTrue($res); - $accesslist = $subfolder->getAccessList(); - $this->assertIsArray($accesslist); - $this->assertCount(0, $accesslist['users']); - $this->assertCount(0, $accesslist['groups']); - /* calling getAccessList() on the $subsubfolder will still return - * the user and group, because the getParent() call in getAccessList() - * will not return the same instance like $subfolder. Hence calling - * $subfolder->clearAccessList() won't clear the accesslist of $subsubfolder's - * parent. You would have to explicitly - * clear acceslist of $subsubfolder's parent. - $res = $subsubfolder->getParent()->clearAccessList(); - $this->assertTrue($res); - $accesslist = $subsubfolder->getAccessList(); - $this->assertIsArray($accesslist); - $this->assertCount(0, $accesslist['users']); - $this->assertCount(0, $accesslist['groups']); - */ - } - - /** - * Test method addAccess() - * - * @return void - */ - public function testAddAccessWrongMode() - { - $rootfolder = $this->getMockedRootFolder(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $dms = new SeedDMS_Core_DMS($db, ''); - $rootfolder->setDMS($dms); - $this->assertFalse($rootfolder->addAccess(M_ANY, 1, true)); - } - - /** - * Test method addAccess() - * - * @return void - */ - public function testAddAccessSqlFail() - { - $rootfolder = $this->getMockedRootFolder(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("INSERT INTO `tblACLs`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $rootfolder->setDMS($dms); - $this->assertFalse($rootfolder->addAccess(M_NONE, 1, true)); - } - - /** - * Test method getAccessMode() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAccessMode() - { - /* Add some folders and documents */ - $this->createSimpleFolderStructureWithDocuments(); - $this->createGroupsAndUsers(); - - $rootfolder = SeedDMS_Core_Folder::getInstance(1, self::$dms); - $admin = self::$dms->getUser(1); - $this->assertIsObject($admin); - $this->assertTrue($admin->isAdmin()); - $guest = self::$dms->getUser(2); - $this->assertTrue($guest->isGuest()); - $user = self::$dms->getUser(3); - $this->assertIsObject($user); - if(self::$dms->version[0] == '5') - $this->assertTrue($user->getRole() == SeedDMS_Core_User::role_user); - else - $this->assertTrue($user->getRole()->getRole() == SeedDMS_Core_Role::role_user); - $joe = self::$dms->getUser(4); - $this->assertIsObject($joe); - if(self::$dms->version[0] == '5') - $this->assertTrue($joe->getRole() == SeedDMS_Core_User::role_user); - else - $this->assertTrue($joe->getRole()->getRole() == SeedDMS_Core_Role::role_user); - $sally = self::$dms->getUser(6); - $this->assertIsObject($sally); - if(self::$dms->version[0] == '5') - $this->assertTrue($sally->getRole() == SeedDMS_Core_User::role_user); - else - $this->assertTrue($sally->getRole()->getRole() == SeedDMS_Core_Role::role_user); - $group = self::$dms->getGroup(1); - $this->assertIsObject($group); - /* add guest and joe to group */ - if(!$group->isMember($guest)) { - $res = $guest->joinGroup($group); - $this->assertTrue($res); - } - if(!$group->isMember($joe)) { - $res = $joe->joinGroup($group); - $this->assertTrue($res); - } - - $subfolder1 = self::$dms->getFolderByName('Subfolder 1'); - $this->assertIsObject($subfolder1); - $subsubfolder = self::$dms->getFolderByName('Subsubfolder 1'); - $this->assertIsObject($subsubfolder); - $subfolder2 = self::$dms->getFolderByName('Subfolder 2'); - $this->assertIsObject($subfolder2); - $subfolder3 = self::$dms->getFolderByName('Subfolder 3'); - $this->assertIsObject($subfolder3); - $res = $subfolder3->setOwner($sally); - $this->assertTrue($res); - - /* Setup Subfolder 1: - * no inheritance, user has read-write access, group has unlimited access, - * default is no access - */ - $res = $subfolder1->setInheritAccess(false); - $this->assertTrue($res); - $res = $subfolder1->setDefaultAccess(M_NONE); - $this->assertTrue($res); - $res = $subfolder1->addAccess(M_READWRITE, $user->getId(), true); - $this->assertTrue($res); - $res = $subfolder1->addAccess(M_ALL, $group->getId(), false); - $this->assertTrue($res); - - /* Admin has always access mode M_ALL */ - $mode = $subfolder1->getAccessMode($admin); - $this->assertEquals(M_ALL, $mode); - /* Guest has max read access, though it's group has any access */ - $mode = $subfolder1->getAccessMode($guest); - $this->assertEquals(M_READ, $mode); - /* Joe has any access, because it's group has any access */ - $mode = $subfolder1->getAccessMode($joe); - $this->assertEquals(M_ALL, $mode); - /* Sally has no access, because it has no explicit access right and the - * default access is M_NONE. - */ - $mode = $subfolder1->getAccessMode($sally); - $this->assertEquals(M_NONE, $mode); - - /* Subfolder 3 inherits from the root folder, but sally is the owner */ - $mode = $subfolder3->getAccessMode($sally); - $this->assertEquals(M_ALL, $mode); - /* joe has just read access which is the default inherited from root */ - $mode = $subfolder3->getAccessMode($joe); - $this->assertEquals(M_READ, $mode); - - } - - /** - * Test method getFolderList() - * - * @return void - */ - public function testGetFolderListSqlFail() - { - $rootfolder = $this->getMockedRootFolder(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT `folderList` FROM `tblFolders`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $rootfolder->setDMS($dms); - $this->assertFalse($rootfolder->getFolderList()); - } - -} diff --git a/SeedDMS_Core/tests/GroupTest.php b/SeedDMS_Core/tests/GroupTest.php deleted file mode 100644 index df14a13f5..000000000 --- a/SeedDMS_Core/tests/GroupTest.php +++ /dev/null @@ -1,410 +0,0 @@ - - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version @package_version@ - * @link https://www.seeddms.org - */ - -use PHPUnit\Framework\SeedDmsTest; - -/** - * Group test class - * - * @category SeedDMS - * @package Tests - * @author Uwe Steinmann - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version Release: @package_version@ - * @link https://www.seeddms.org - */ -class GroupTest extends SeedDmsTest -{ - - /** - * Create a real sqlite database in memory - * - * @return void - */ - protected function setUp(): void - { - self::$dbh = self::createInMemoryDatabase(); - self::$contentdir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'phpunit-'.time(); - mkdir(self::$contentdir); - // echo "Creating temp content dir: ".self::$contentdir."\n"; - self::$dms = new SeedDMS_Core_DMS(self::$dbh, self::$contentdir); - self::$dbversion = self::$dms->getDBVersion(); - } - - /** - * Clean up at tear down - * - * @return void - */ - protected function tearDown(): void - { - self::$dbh = null; - // echo "\nRemoving temp. content dir: ".self::$contentdir."\n"; - exec('rm -rf '.self::$contentdir); - } - - /** - * Create a mock group object - * - * @return SeedDMS_Core_Group - */ - protected function getMockGroup() - { - $user = $this->getMockBuilder(SeedDMS_Core_Group::class) - ->onlyMethods([]) - ->disableOriginalConstructor()->getMock(); - return $user; - } - - /** - * Create a mock group object - * - * @return SeedDMS_Core_Group - */ - protected function getGroup() - { - $group = new SeedDMS_Core_Group(1, 'foogroup', 'My comment'); - return $group; - } - - /** - * Create a mock regular user object - * - * @return SeedDMS_Core_User - */ - protected function getUser() - { - $user = new SeedDMS_Core_User(2, 'user', 'pass', 'Joe Baz', 'joe@foo.de', 'en_GB', 'bootstrap', 'My comment', SeedDMS_Core_User::role_user); - return $user; - } - - /** - * Test method isType() - * - * @return void - */ - public function testIsType() - { - $group = $this->getGroup(); - $this->assertTrue($group->isType('group')); - } - - /** - * Test method getName() - * - * @return void - */ - public function testGetName() - { - $group = $this->getGroup(); - $this->assertEquals('foogroup', $group->getName()); - } - - /** - * Test method getName() and setName() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetName() - { - $group = self::$dms->addGroup('Group', ''); - $ret = $group->setName('foo'); - $this->assertTrue($ret); - $name = $group->getName(); - $this->assertEquals('foo', $name); - /* Setting an empty name must fail */ - $ret = $group->setName(' '); - $this->assertFalse($ret); - } - - /** - * Test method setName() - * - * @return void - */ - public function testSetNameSqlFail() - { - $group = $this->getGroup(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblGroups` SET `name`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $group->setDMS($dms); - $this->assertFalse($group->setName('my name')); - } - - /** - * Test method getComment() - * - * @return void - */ - public function testGetComment() - { - $group = $this->getGroup(); - $this->assertEquals('My comment', $group->getComment()); - } - - /** - * Test method getComment() and setComment() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetComment() - { - $group = self::$dms->addGroup('Group', ''); - $ret = $group->setComment('foo'); - $this->assertTrue($ret); - $comment = $group->getComment(); - $this->assertEquals('foo', $comment); - } - - /** - * Test method setComment() - * - * @return void - */ - public function testSetCommentSqlFail() - { - $group = $this->getGroup(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblGroups` SET `comment`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $group->setDMS($dms); - $this->assertFalse($group->setComment('my comment')); - } - - /** - * Test method getUsers() - * - * @return void - */ - public function testGetUsersSqlFail() - { - $group = $this->getGroup(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT `tblUsers`.* FROM `tblUsers`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $group->setDMS($dms); - $this->assertFalse($group->getUsers()); - } - - /** - * Test method addUser(), isMember(), and removeUser() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAddAndRemoveUser() - { - $group = self::$dms->addGroup('Group', ''); - if(self::$dms->version[0] == '5') - $role = SeedDMS_Core_User::role_user; - else { - $role = SeedDMS_Core_Role::getInstance(3, self::$dms); - $this->assertIsObject($role); - $this->assertEquals($role->getRole(), SeedDMS_Core_Role::role_user); - } - $user1 = self::$dms->addUser('joe', 'pass', 'Joe Foo', 'joe@foo.de', 'en_GB', 'bootstrap', 'My comment', $role); - $user2 = self::$dms->addUser('sally', 'pass', 'Sally Foo', 'sally@foo.de', 'en_GB', 'bootstrap', 'My comment', $role); - - /* Add user1 and user2. user2 is also a manager */ - $ret = $group->addUser($user1); - $this->assertTrue($ret); - $ret = $group->addUser($user2, true); - $this->assertTrue($ret); - - $users = $group->getUsers(); - $this->assertIsArray($users); - $this->assertCount(2, $users); - - $ret = $group->removeUser($user1); - $this->assertTrue($ret); - $users = $group->getUsers(); - $this->assertIsArray($users); - $this->assertCount(1, $users); - } - - /** - * Test method isMember(), toggleManager() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testIsMember() - { - $group = self::$dms->addGroup('Group', ''); - $user1 = self::$dms->addUser('joe', 'pass', 'Joe Foo', 'joe@foo.de', 'en_GB', 'bootstrap', 'My comment'); - $user2 = self::$dms->addUser('sally', 'pass', 'Sally Foo', 'sally@foo.de', 'en_GB', 'bootstrap', 'My comment'); - - /* Add user1 and user2. user2 is also a manager */ - $ret = $group->addUser($user1); - $this->assertTrue($ret); - $ret = $group->addUser($user2, true); - $this->assertTrue($ret); - - /* user1 is a member but not a manager */ - $ret = $group->isMember($user1); - $this->assertTrue($ret); - $ret = $group->isMember($user1, true); - $this->assertFalse($ret); - - /* user2 is a member and a manager */ - $ret = $group->isMember($user2, true); - $this->assertTrue($ret); - } - - /** - * Test method toggleManager() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testToggleManager() - { - $group = self::$dms->addGroup('Group', ''); - $user1 = self::$dms->addUser('joe', 'pass', 'Joe Foo', 'joe@foo.de', 'en_GB', 'bootstrap', 'My comment'); - - /* Add user1 */ - $ret = $group->addUser($user1); - $this->assertTrue($ret); - - /* user1 is a member but not a manager */ - $ret = $group->isMember($user1); - $this->assertTrue($ret); - $ret = $group->isMember($user1, true); - $this->assertFalse($ret); - - /* Toggle manager mode of user 1 and check again */ - $ret = $group->toggleManager($user1); - $ret = $group->isMember($user1, true); - $this->assertTrue($ret); - } - - /** - * Test method getUsers() - * - * @return void - */ - public function testGetUsers() - { - $group = $this->getGroup(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - if(self::$dbversion['major'] == 6) { - $db->expects($this->exactly(2)) - ->method('getResultArray') - ->withConsecutive([$this->stringContains("`tblGroupMembers`.`groupID` = '".$group->getId()."'")], [$this->stringContains("SELECT * FROM `tblRoles` WHERE `id` =")]) - ->willReturnOnConsecutiveCalls(array(array('id'=>2, 'login'=>'user', 'pwd'=>'pass', 'fullName'=>'Joe Baz', 'email'=>'joe@foo.de', 'language'=>'en_GB', 'theme'=>'bootstrap', 'comment'=>'', 'role'=>SeedDMS_Core_User::role_user, 'hidden'=>0, 'role'=>1)), array('id'=>1, 'name'=>'role', 'role'=>1, 'noaccess'=>'')); - } else { - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("`tblGroupMembers`.`groupID` = '".$group->getId()."'")) - ->willReturn(array(array('id'=>2, 'login'=>'user', 'pwd'=>'pass', 'fullName'=>'Joe Baz', 'email'=>'joe@foo.de', 'language'=>'en_GB', 'theme'=>'bootstrap', 'comment'=>'', 'role'=>SeedDMS_Core_User::role_user, 'hidden'=>0, 'role'=>1))); - } - $dms = new SeedDMS_Core_DMS($db, ''); - - $group->setDMS($dms); - $users = $group->getUsers(); - $this->assertIsArray($users); - $this->assertCount(1, $users); - } - - /** - * Test method getManagers() - * - * @return void - */ - public function testGetManagers() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - if(self::$dbversion['major'] == 6) { - $db->expects($this->exactly(2)) - ->method('getResultArray') - ->withConsecutive([$this->stringContains("`manager` = 1")], [$this->stringContains("SELECT * FROM `tblRoles` WHERE `id` =")]) - ->willReturnOnConsecutiveCalls(array(array('id'=>2, 'login'=>'user', 'pwd'=>'pass', 'fullName'=>'Joe Baz', 'email'=>'joe@foo.de', 'language'=>'en_GB', 'theme'=>'bootstrap', 'comment'=>'', 'role'=>SeedDMS_Core_User::role_user, 'hidden'=>0, 'role'=>1)), array('id'=>1, 'name'=>'role', 'role'=>1, 'noaccess'=>'')); - } else { - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains('`manager` = 1')) - ->willReturn(array(array('id'=>2, 'login'=>'user', 'pwd'=>'pass', 'fullName'=>'Joe Baz', 'email'=>'joe@foo.de', 'language'=>'en_GB', 'theme'=>'bootstrap', 'comment'=>'', 'role'=>SeedDMS_Core_User::role_user, 'hidden'=>0))); - } - $dms = new SeedDMS_Core_DMS($db, ''); - - $group = $this->getGroup(); - $group->setDMS($dms); - $managers = $group->getManagers(); - $this->assertIsArray($managers); - $this->assertCount(1, $managers); - } - - /** - * Test method getNotifications() - * - * @return void - */ - public function testGetNotifications() - { - $group = $this->getGroup(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("WHERE `tblNotify`.`groupID` = ".$group->getId())) - ->willReturn(array(array('target'=>2, 'targetType'=>'0', 'userID'=>0, 'groupID'=>$group->getId()))); - $dms = new SeedDMS_Core_DMS($db, ''); - $group->setDMS($dms); - $notifications = $group->getNotifications(); - $this->assertIsArray($notifications); - $this->assertCount(1, $notifications); - $this->assertInstanceOf(SeedDMS_Core_Notification::class, $notifications[0]); - } - - /** - * Test method getNotifications() with target type - * - * @return void - */ - public function testGetNotificationsWithTargetType() - { - $group = $this->getGroup(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("WHERE `tblNotify`.`groupID` = ".$group->getId()." AND `tblNotify`.`targetType` = 1")) - ->willReturn(array(array('target'=>2, 'targetType'=>'1', 'userID'=>0, 'groupID'=>$group->getId()))); - $dms = new SeedDMS_Core_DMS($db, ''); - $group->setDMS($dms); - $notifications = $group->getNotifications(1); - $this->assertIsArray($notifications); - $this->assertCount(1, $notifications); - $this->assertInstanceOf(SeedDMS_Core_Notification::class, $notifications[0]); - } - - -} diff --git a/SeedDMS_Core/tests/KeywordCategoryTest.php b/SeedDMS_Core/tests/KeywordCategoryTest.php deleted file mode 100644 index e22d138ed..000000000 --- a/SeedDMS_Core/tests/KeywordCategoryTest.php +++ /dev/null @@ -1,147 +0,0 @@ - - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version @package_version@ - * @link https://www.seeddms.org - */ - -use PHPUnit\Framework\SeedDmsTest; - -/** - * User test class - * - * @category SeedDMS - * @package Tests - * @author Uwe Steinmann - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version Release: @package_version@ - * @link https://www.seeddms.org - */ -class KeywordCategoryTest extends SeedDmsTest -{ - - /** - * Create a real sqlite database in memory - * - * @return void - */ - protected function setUp(): void - { - self::$dbh = self::createInMemoryDatabase(); - self::$contentdir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'phpunit-'.time(); - mkdir(self::$contentdir); - // echo "Creating temp content dir: ".self::$contentdir."\n"; - self::$dms = new SeedDMS_Core_DMS(self::$dbh, self::$contentdir); - } - - /** - * Clean up at tear down - * - * @return void - */ - protected function tearDown(): void - { - self::$dbh = null; - // echo "\nRemoving temp. content dir: ".self::$contentdir."\n"; - exec('rm -rf '.self::$contentdir); - } - - /** - * Test method getName() and setName() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetName() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $cat = self::$dms->addKeywordCategory($user->getId(), 'Category 1'); - $name = $cat->getName(); - $ret = $cat->setName('foo'); - $this->assertTrue($ret); - $name = $cat->getName(); - $this->assertEquals('foo', $name); - $ret = $cat->setName(' '); - $this->assertFalse($ret); - } - - /** - * Test method getOwner() and setOwner() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetOwner() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $guest = SeedDMS_Core_User::getInstance(2, self::$dms); - $cat = self::$dms->addKeywordCategory($user->getId(), 'Category 1'); - $this->assertIsObject($cat); - $ret = $cat->setOwner($guest); - $this->assertTrue($ret); - $owner = $cat->getOwner(); - $this->assertEquals(2, $owner->getId()); - $ret = $cat->setOwner(null); - $this->assertFalse($ret); - } - - /** - * Test method addKeywordList() and editKeywordList(), getKeywordLists(), removeKeywordList() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetSetEditAndRemoveKeywordList() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $cat = self::$dms->addKeywordCategory($user->getId(), 'Category 1'); - $this->assertIsObject($cat); - $ret = $cat->addKeywordList('foo'); - $this->assertTrue($ret); - $ret = $cat->addKeywordList('bar'); - $this->assertTrue($ret); - $list = $cat->getKeywordLists(); - $this->assertIsArray($list); - $this->assertCount(2, $list); - $ret = $cat->editKeywordList(1, 'baz'); - $this->assertTrue($ret); - - $ret = $cat->removeKeywordList(1); - $this->assertTrue($ret); - $list = $cat->getKeywordLists(); - $this->assertIsArray($list); - $this->assertCount(1, $list); - } - - /** - * Test method addKeywordCategory() and remove() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAndAndRemoveKeywordCategory() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $cat = self::$dms->addKeywordCategory($user->getId(), 'Category 1'); - $this->assertIsObject($cat); - $ret = $cat->addKeywordList('foo'); - $this->assertTrue($ret); - $ret = $cat->addKeywordList('bar'); - $this->assertTrue($ret); - $ret = $cat->remove(); - $this->assertTrue($ret); - } -} diff --git a/SeedDMS_Core/tests/ReviewApprovalTest.php b/SeedDMS_Core/tests/ReviewApprovalTest.php deleted file mode 100644 index aea040e39..000000000 --- a/SeedDMS_Core/tests/ReviewApprovalTest.php +++ /dev/null @@ -1,477 +0,0 @@ - - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version @package_version@ - * @link https://www.seeddms.org - */ - -use PHPUnit\Framework\SeedDmsTest; - -/** - * Group test class - * - * @category SeedDMS - * @package Tests - * @author Uwe Steinmann - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version Release: @package_version@ - * @link https://www.seeddms.org - */ -class ReviewApprovalTest extends SeedDmsTest -{ - - /** - * Create a real sqlite database in memory - * - * @return void - */ - protected function setUp(): void - { - self::$dbh = self::createInMemoryDatabase(); - self::$contentdir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'phpunit-'.time(); - mkdir(self::$contentdir); - // echo "Creating temp content dir: ".self::$contentdir."\n"; - self::$dms = new SeedDMS_Core_DMS(self::$dbh, self::$contentdir); - } - - /** - * Clean up at tear down - * - * @return void - */ - protected function tearDown(): void - { - self::$dbh = null; - // echo "\nRemoving temp. content dir: ".self::$contentdir."\n"; - exec('rm -rf '.self::$contentdir); - } - - /** - * Test method addIndReviewer(), addGrpReviewer(), verifyStatus(), - * getReviewStatus(), removeReview(), delIndReviewer() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testReviewDocumentByUserAndGroup() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $this->assertIsObject($user); - - /* Add a new user who will be the reviewer */ - $reviewer = self::$dms->addUser('reviewer', 'reviewer', 'Reviewer One', 'user1@seeddms.org', 'en_GB', 'bootstrap', ''); - $this->assertIsObject($reviewer); - - /* Add a new group which will be the reviewer */ - $reviewergrp = self::$dms->addGroup('reviewer', ''); - $this->assertIsObject($reviewergrp); - - /* Add a new document */ - $document = self::createDocument($rootfolder, $user, 'Document 1'); - $content = $document->getLatestContent(); - $this->assertIsObject($content); - $status = $content->getStatus(); - $this->assertIsArray($status); - $this->assertEquals(S_RELEASED, $status['status']); - - /* A missing reviewer or user causes an error */ - $ret = $content->addIndReviewer($reviewer, null); - $this->assertEquals(-1, $ret); - - /* A missing reviewer or user causes an error */ - $ret = $content->addIndReviewer(null, $user); - $this->assertEquals(-1, $ret); - - /* Adding a group instead of a user causes an error */ - $ret = $content->addIndReviewer($reviewergrp, $user); - $this->assertEquals(-1, $ret); - - /* Finally add the reviewer */ - $ret = $content->addIndReviewer($reviewer, $user); - $this->assertGreaterThan(0, $ret); - - /* Adding the user again will yield in an error */ - $ret = $content->addIndReviewer($reviewer, $user); - $this->assertEquals(-3, $ret); - - /* Needs to call verifyStatus() in order to recalc the status */ - $newstatus = $content->verifyStatus(false, $user); - $this->assertIsInt($newstatus); - $this->assertEquals(S_DRAFT_REV, $newstatus); - - /* Get all reviews */ - $reviewstatus = $content->getReviewStatus(); - $this->assertIsArray($reviewstatus); - $this->assertCount(1, $reviewstatus); - - /* Get list of individual und group reviewers */ - $reviewers = $content->getReviewers(); - $this->assertIsArray($reviewers); - $this->assertCount(2, $reviewers); - $this->assertCount(1, $reviewers['i']); - $this->assertCount(0, $reviewers['g']); -/* - $db = self::$dms->getDB(); - $db->createTemporaryTable("ttreviewid", true); - $queryStr = "SELECT * FROM ttreviewid"; - $recs = $db->getResultArray($queryStr); - echo $db->getErrorMsg(); - var_dump($recs); -*/ - - /* A missing reviewer or user causes an error */ - $ret = $content->addGrpReviewer($reviewergrp, null); - $this->assertEquals(-1, $ret); - - /* A missing reviewer or user causes an error */ - $ret = $content->addGrpReviewer(null, $user); - $this->assertEquals(-1, $ret); - - /* Adding a user instead of a group causes an error */ - $ret = $content->addGrpReviewer($reviewer, $user); - $this->assertEquals(-1, $ret); - - /* Finally add the reviewer */ - $ret = $content->addGrpReviewer($reviewergrp, $user); - $this->assertGreaterThan(0, $ret); - $groupstatus = $reviewergrp->getReviewStatus(); - - /* Adding the group again will yield in an error */ - $ret = $content->addGrpReviewer($reviewergrp, $user); - $this->assertEquals(-3, $ret); - - /* Get all reviews */ - $reviewstatus = $content->getReviewStatus(); - $this->assertIsArray($reviewstatus); - $this->assertCount(2, $reviewstatus); - - /* Get list of individual und group reviewers */ - $reviewers = $content->getReviewers(); - $this->assertIsArray($reviewers); - $this->assertCount(2, $reviewers); - $this->assertCount(1, $reviewers['i']); - $this->assertCount(1, $reviewers['g']); - - $userstatus = $reviewer->getReviewStatus(); - $groupstatus = $reviewergrp->getReviewStatus(); - - /* There should be two log entries, one for each reviewer */ - $reviewlog = $content->getReviewLog(5); - $this->assertIsArray($reviewlog); - $this->assertCount(2, $reviewlog); - - /* Adding a review without a user of reviewer causes an error */ - $ret = $content->setReviewByInd($reviewer, null, S_LOG_ACCEPTED, 'Comment of individual reviewer'); - $this->assertEquals(-1, $ret); - $ret = $content->setReviewByInd(null, $user, S_LOG_ACCEPTED, 'Comment of individual reviewer'); - $this->assertEquals(-1, $ret); - - /* Adding a review as an individual but passing a group causes an error */ - $ret = $content->setReviewByInd($reviewergrp, $user, S_LOG_ACCEPTED, 'Comment of individual reviewer'); - $this->assertEquals(-1, $ret); - - /* Individual reviewer reviews document */ - $ret = $content->setReviewByInd($reviewer, $user, S_LOG_ACCEPTED, 'Comment of individual reviewer'); - $this->assertIsInt(0, $ret); - $this->assertGreaterThan(0, $ret); - - /* Get the last 5 review log entries (actually there are just 3 now) */ - $reviewlog = $content->getReviewLog(5); - $this->assertIsArray($reviewlog); - $this->assertCount(3, $reviewlog); - $this->assertEquals('Comment of individual reviewer', $reviewlog[0]['comment']); - $this->assertEquals(1, $reviewlog[0]['status']); - - /* Needs to call verifyStatus() in order to recalc the status. - * It must not be changed because the group reviewer has not done the - * review. - */ - $newstatus = $content->verifyStatus(false, $user); - $this->assertIsInt($newstatus); - $this->assertEquals(S_DRAFT_REV, $newstatus); - - /* Adding a review without a user of reviewer causes an error */ - $ret = $content->setReviewByGrp($reviewergrp, null, S_LOG_ACCEPTED, 'Comment of group reviewer'); - $this->assertEquals(-1, $ret); - $ret = $content->setReviewByGrp(null, $user, S_LOG_ACCEPTED, 'Comment of group reviewer'); - $this->assertEquals(-1, $ret); - - /* Adding a review as an group but passing a user causes an error */ - $ret = $content->setReviewByGrp($reviewer, $user, S_LOG_ACCEPTED, 'Comment of group reviewer'); - $this->assertEquals(-1, $ret); - - /* Group reviewer reviews document */ - $ret = $content->setReviewByGrp($reviewergrp, $user, S_LOG_ACCEPTED, 'Comment of group reviewer'); - $this->assertIsInt(0, $ret); - $this->assertGreaterThan(0, $ret); - - /* Get the last 5 review log entries (actually there are just 4 now) */ - $reviewlog = $content->getReviewLog(5); - $this->assertIsArray($reviewlog); - $this->assertCount(4, $reviewlog); - $this->assertEquals('Comment of group reviewer', $reviewlog[0]['comment']); - $this->assertEquals(1, $reviewlog[0]['status']); - - /* Now the document has received all reviews */ - $newstatus = $content->verifyStatus(false, $user); - $this->assertIsInt($newstatus); - $this->assertEquals(S_RELEASED, $newstatus); - - /* Remove the last review of the user */ - $userstatus = $reviewer->getReviewStatus($document->getId(), $content->getVersion()); - $this->assertIsArray($userstatus); - $this->assertCount(2, $userstatus); - $this->assertCount(1, $userstatus['indstatus']); - $ret = $content->removeReview($userstatus['indstatus'][$document->getId()]['reviewID'], $user, 'Undo review'); - $this->assertTrue($ret); - - /* Get the last 8 review log entries (actually there are just 5 now) */ - $reviewlog = $content->getReviewLog(8); - $this->assertIsArray($reviewlog); - $this->assertCount(5, $reviewlog); - $this->assertEquals('Undo review', $reviewlog[0]['comment']); - $this->assertEquals(0, $reviewlog[0]['status']); - - /* Now the document must be back in draft mode */ - $newstatus = $content->verifyStatus(false, $user); - $this->assertIsInt($newstatus); - $this->assertEquals(S_DRAFT_REV, $newstatus); - - /* Removing the user as a reviewer completly will release the - * document again, because the group reviewer became the only - * reviewer and has done the review already. - */ - $ret = $content->delIndReviewer($reviewer, $user, 'Reviewer removed'); - $this->assertIsInt($ret); - $this->assertEquals(0, $ret); - - /* Get the last 8 review log entries (actually there are just 6 now) */ - $reviewlog = $content->getReviewLog(8); - $this->assertIsArray($reviewlog); - $this->assertCount(6, $reviewlog); - $this->assertEquals('Reviewer removed', $reviewlog[0]['comment']); - $this->assertEquals(-2, $reviewlog[0]['status']); - - /* Now the document will be released again */ - $newstatus = $content->verifyStatus(false, $user); - $this->assertIsInt($newstatus); - $this->assertEquals(S_RELEASED, $newstatus); - } - - /** - * Test method addIndApprover(), addGrpApprover(), verifyStatus(), - * getApprovalStatus(), removeApproval(), delIndApprover() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testApproveDocumentByUserAndGroup() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $this->assertIsObject($user); - - /* Add a new user who will be the approver */ - $approver = self::$dms->addUser('approver', 'approver', 'Approver One', 'user1@seeddms.org', 'en_GB', 'bootstrap', ''); - $this->assertIsObject($approver); - - /* Add a new group which will be the approver */ - $approvergrp = self::$dms->addGroup('approver', ''); - $this->assertIsObject($approvergrp); - - /* Add a new document */ - $document = self::createDocument($rootfolder, $user, 'Document 1'); - $content = $document->getLatestContent(); - $this->assertIsObject($content); - $status = $content->getStatus(); - $this->assertIsArray($status); - $this->assertEquals(S_RELEASED, $status['status']); - - /* A missing approver or user causes an error */ - $ret = $content->addIndApprover($approver, null); - $this->assertEquals(-1, $ret); - - /* A missing approver or user causes an error */ - $ret = $content->addIndApprover(null, $user); - $this->assertEquals(-1, $ret); - - /* Adding a group instead of a user causes an error */ - $ret = $content->addIndApprover($approvergrp, $user); - $this->assertEquals(-1, $ret); - - /* Finally add the reviewer */ - $ret = $content->addIndApprover($approver, $user); - $this->assertGreaterThan(0, $ret); - - /* Adding the user again will yield in an error */ - $ret = $content->addIndApprover($approver, $user); - $this->assertEquals(-3, $ret); - - /* Needs to call verifyStatus() in order to recalc the status */ - $newstatus = $content->verifyStatus(false, $user); - $this->assertIsInt($newstatus); - $this->assertEquals(S_DRAFT_APP, $newstatus); - - /* Get all approvals */ - $approvalstatus = $content->getApprovalStatus(); - $this->assertIsArray($approvalstatus); - $this->assertCount(1, $approvalstatus); - - /* Get list of individual und group approvers */ - $approvers = $content->getApprovers(); - $this->assertIsArray($approvers); - $this->assertCount(2, $approvers); - $this->assertCount(1, $approvers['i']); - $this->assertCount(0, $approvers['g']); - - /* A missing approver or user causes an error */ - $ret = $content->addGrpApprover($approvergrp, null); - $this->assertEquals(-1, $ret); - - /* A missing approver or user causes an error */ - $ret = $content->addGrpApprover(null, $user); - $this->assertEquals(-1, $ret); - - /* Adding a user instead of a group causes an error */ - $ret = $content->addGrpApprover($approver, $user); - $this->assertEquals(-1, $ret); - - /* Finally add the reviewer */ - $ret = $content->addGrpApprover($approvergrp, $user); - $this->assertGreaterThan(0, $ret); - $groupstatus = $approvergrp->getApprovalStatus(); - - /* Adding the group again will yield in an error */ - $ret = $content->addGrpApprover($approvergrp, $user); - $this->assertEquals(-3, $ret); - - /* Get all approvals */ - $approvalstatus = $content->getApprovalStatus(); - $this->assertIsArray($approvalstatus); - $this->assertCount(2, $approvalstatus); - - /* Get list of individual und group approvers */ - $approvers = $content->getApprovers(); - $this->assertIsArray($approvers); - $this->assertCount(2, $approvers); - $this->assertCount(1, $approvers['i']); - $this->assertCount(1, $approvers['g']); - - $userstatus = $approver->getApprovalStatus(); - $groupstatus = $approvergrp->getApprovalStatus(); - - /* There should be two log entries, one for each approver */ - $approvallog = $content->getApproveLog(5); - $this->assertIsArray($approvallog); - $this->assertCount(2, $approvallog); - - /* Adding a approval without a user of approver causes an error */ - $ret = $content->setApprovalByInd($approver, null, S_LOG_ACCEPTED, 'Comment of individual approver'); - $this->assertEquals(-1, $ret); - $ret = $content->setApprovalByInd(null, $user, S_LOG_ACCEPTED, 'Comment of individual approver'); - $this->assertEquals(-1, $ret); - - /* Adding a approval as an individual but passing a group causes an error */ - $ret = $content->setApprovalByInd($approvergrp, $user, S_LOG_ACCEPTED, 'Comment of individual approver'); - $this->assertEquals(-1, $ret); - - /* Individual approver approvals document */ - $ret = $content->setApprovalByInd($approver, $user, S_LOG_ACCEPTED, 'Comment of individual approver'); - $this->assertIsInt(0, $ret); - $this->assertGreaterThan(0, $ret); - - /* Get the last 5 approval log entries (actually there are just 3 now) */ - $approvallog = $content->getApproveLog(5); - $this->assertIsArray($approvallog); - $this->assertCount(3, $approvallog); - $this->assertEquals('Comment of individual approver', $approvallog[0]['comment']); - $this->assertEquals(1, $approvallog[0]['status']); - - /* Needs to call verifyStatus() in order to recalc the status. - * It must not be changed because the group approver has not done the - * approval. - */ - $newstatus = $content->verifyStatus(false, $user); - $this->assertIsInt($newstatus); - $this->assertEquals(S_DRAFT_APP, $newstatus); - - /* Adding a approval without a user of approver causes an error */ - $ret = $content->setApprovalByGrp($approvergrp, null, S_LOG_ACCEPTED, 'Comment of group approver'); - $this->assertEquals(-1, $ret); - $ret = $content->setApprovalByGrp(null, $user, S_LOG_ACCEPTED, 'Comment of group approver'); - $this->assertEquals(-1, $ret); - - /* Adding a approval as an group but passing a user causes an error */ - $ret = $content->setApprovalByGrp($approver, $user, S_LOG_ACCEPTED, 'Comment of group approver'); - $this->assertEquals(-1, $ret); - - /* Group approver approvals document */ - $ret = $content->setApprovalByGrp($approvergrp, $user, S_LOG_ACCEPTED, 'Comment of group approver'); - $this->assertIsInt(0, $ret); - $this->assertGreaterThan(0, $ret); - - /* Get the last 5 approval log entries (actually there are just 4 now) */ - $approvallog = $content->getApproveLog(5); - $this->assertIsArray($approvallog); - $this->assertCount(4, $approvallog); - $this->assertEquals('Comment of group approver', $approvallog[0]['comment']); - $this->assertEquals(1, $approvallog[0]['status']); - - /* Now the document has received all approvals */ - $newstatus = $content->verifyStatus(false, $user); - $this->assertIsInt($newstatus); - $this->assertEquals(S_RELEASED, $newstatus); - - /* Remove the last approval of the user */ - $userstatus = $approver->getApprovalStatus($document->getId(), $content->getVersion()); - $this->assertIsArray($userstatus); - $this->assertCount(2, $userstatus); - $this->assertCount(1, $userstatus['indstatus']); - $ret = $content->removeApproval($userstatus['indstatus'][$document->getId()]['approveID'], $user, 'Undo approval'); - $this->assertTrue($ret); - - /* Get the last 8 approval log entries (actually there are just 5 now) */ - $approvallog = $content->getApproveLog(8); - $this->assertIsArray($approvallog); - $this->assertCount(5, $approvallog); - $this->assertEquals('Undo approval', $approvallog[0]['comment']); - $this->assertEquals(0, $approvallog[0]['status']); - - /* Now the document must be back in draft mode */ - $newstatus = $content->verifyStatus(false, $user); - $this->assertIsInt($newstatus); - $this->assertEquals(S_DRAFT_APP, $newstatus); - - /* Removing the user as a approver completly will release the - * document again, because the group approver became the only - * approver and has done the approval already. - */ - $ret = $content->delIndApprover($approver, $user, 'Approver removed'); - $this->assertIsInt($ret); - $this->assertEquals(0, $ret); - - /* Get the last 8 approval log entries (actually there are just 6 now) */ - $approvallog = $content->getApproveLog(8); - $this->assertIsArray($approvallog); - $this->assertCount(6, $approvallog); - $this->assertEquals('Approver removed', $approvallog[0]['comment']); - $this->assertEquals(-2, $approvallog[0]['status']); - - /* Now the document will be released again */ - $newstatus = $content->verifyStatus(false, $user); - $this->assertIsInt($newstatus); - $this->assertEquals(S_RELEASED, $newstatus); - } -} diff --git a/SeedDMS_Core/tests/SeedDmsBase.php b/SeedDMS_Core/tests/SeedDmsBase.php deleted file mode 100644 index dc8f7e920..000000000 --- a/SeedDMS_Core/tests/SeedDmsBase.php +++ /dev/null @@ -1,365 +0,0 @@ - - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version @package_version@ - * @link https://www.seeddms.org - */ - -namespace PHPUnit\Framework; - -use PHPUnit\Framework\TestCase; - -/** - * Database test class - * - * @category SeedDMS - * @package Tests - * @author Uwe Steinmann - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version Release: @package_version@ - * @link https://www.seeddms.org - */ -class SeedDmsTest extends TestCase -{ - - public static $dbh; - - public static $dms; - - public static $contentdir; - - public static $dbversion; - - /** - * Create a sqlite database in memory - * - * @return void - */ - public static function createInMemoryDatabase(): object - { - $dbh = new \SeedDMS_Core_DatabaseAccess('sqlite', '', '', '', ':memory:'); - $dbh->connect(); - $queries = file_get_contents(getenv("SEEDDMS_CORE_SQL")); - // generate SQL query - $queries = explode(";", $queries); - - // execute queries - $errorMsg = ''; - foreach ($queries as $query) { - //echo $query; - $query = trim($query); - if (!empty($query)) { - $dbh->getResult($query); - - if ($dbh->getErrorNo() != 0) { - //echo $dbh->getErrorMsg()."\n"; - $errorMsg .= $dbh->getErrorMsg()."\n"; - } - } - } - return $dbh; - } - - /** - * Create a mocked root folder object - * - * @return \SeedDMS_Core_Folder - */ - protected function getMockedRootFolder($id=1, $name='DMS') - { - $folder = new \SeedDMS_Core_Folder($id, $name, 0, 'DMS root', time(), 1, 0, 0, 0.0); - return $folder; - } - - /** - * Create a mocked document object - * - * @return \SeedDMS_Core_Document - */ - protected function getMockedDocument($id=1, $name='Document') - { - $document = new \SeedDMS_Core_Document($id, $name, '', time(), null, 1, 1, 1, M_READ, 0, '', 1.0); - return $document; - } - - /** - * Create a mocked user object - * - * @return \SeedDMS_Core_User - */ - protected function getMockedUser() - { - $user = new \SeedDMS_Core_User(1, 'login', '', 'New User', 'email@seeddms.org', 'de_DE', 'bootstrap', '', null); - return $user; - } - - /** - * Create a temporary file with random content and the given length. - * - * @param integer $length length of file - * - * @return string name of temporary file - */ - protected static function createTempFile($length=200, $dir='') - { - if($tmpfname = @tempnam($dir ? $dir : sys_get_temp_dir(), 'foo')) { - file_put_contents($tmpfname, substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', (int) ceil($length/strlen($x)) )),1,$length)); - return $tmpfname; - } else - return false; - } - - /** - * Create a temporary directory with random name in systems temp dir. - * - * @param integer $mode access mode of new directory - * - * @return string name of temporary directory - */ - protected static function createTempDir(string $dir = null, int $mode = 0700): string { - /* Use the system temp dir by default. */ - if (is_null($dir)) { - $dir = sys_get_temp_dir(); - } - - do { $tmp = $dir . '/' . mt_rand(); } - while (!@mkdir($tmp, $mode)); - return $tmp; - } - - /** - * Create a simple document. - * - * @param \SeedDMS_Core_Folder $parent parent folder - * @param \SeedDMS_Core_User $owner owner of document - * @param string $name name of document - * @param integer $length length of file - * - * @return string name of temporary file - */ - protected static function createDocument($parent, $owner, $name, $length=200) - { - $filename = self::createTempFile($length); - list($document, $res) = $parent->addDocument( - $name, // name - '', // comment - null, // no expiration - $owner, // owner - '', // keywords - [], // categories - $filename, // name of file - 'file1.txt', // original file name - '.txt', // file type - 'text/plain', // mime type - 1.0 // sequence - ); - unlink($filename); - return $document; - } - - /** - * Create a simple folder structure without documents - * - * DMS root -+- Subfolder 1 -+- Subsubfolder 1 -+- Subsubsubfolder 1 - * | - * +- Subfolder 2 - * | - * +- Subfolder 3 - * - * The sequence field of Subfolder x is: - * Subfolder 1: 2.0 - * Subfolder 2: 1.0 - * Subfolder 1: 0.5 - * - * @return void - */ - protected static function createSimpleFolderStructure() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - /* Set up a folder structure */ - $subfolder = $rootfolder->addSubFolder('Subfolder 1', '', $user, 2.0); - $subsubfolder = $subfolder->addSubFolder('Subsubfolder 1', '', $user, 1.0); - $subsubsubfolder = $subsubfolder->addSubFolder('Subsubsubfolder 1', '', $user, 1.0); - $rootfolder->addSubFolder('Subfolder 2', '', $user, 1.0); - $rootfolder->addSubFolder('Subfolder 3', '', $user, 0.5); - } - - /** - * Create a simple folder structure with documents - * - * Creates the same folder structure like createSimpleFolderStructure() - * but adds 30 documents to 'Subfolder 1'. They are named 'Document 1' - * to 'Document 30'. - * - * @return void - */ - protected static function createSimpleFolderStructureWithDocuments() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - self::createSimpleFolderStructure(); - /* Add documents to 'Subfolder 1' */ - $subfolder = self::$dms->getFolderByName('Subfolder 1'); - for ($i=1; $i<=15; $i++) { - $filename = self::createTempFile(200); - list($document, $res) = $subfolder->addDocument( - 'Document 1-'.$i, // name - '', // comment - null, - $user, // owner - '', // keywords - [], // categories - $filename, // name of file - 'file-1-'.$i.'.txt', // original file name - '.txt', // file type - 'text/plain', // mime type - 1.0+$i // sequence - ); - unlink($filename); - } - /* Add documents to 'Subfolder 2' */ - $subfolder = self::$dms->getFolderByName('Subfolder 2'); - for ($i=1; $i<=15; $i++) { - $filename = self::createTempFile(200); - list($document, $res) = $subfolder->addDocument( - 'Document 2-'.$i, // name - '', // comment - null, - $user, // owner - '', // keywords - [], // categories - $filename, // name of file - 'file-2-'.$i.'.txt', // original file name - '.txt', // file type - 'text/plain', // mime type - 1.0+$i // sequence - ); - unlink($filename); - } - } - - /** - * Create two groups with 3 users each - * The groups are named 'Group 1' and 'Group 2'. The users in Group 1 - * are named 'User-1-1', 'User-1-2', 'User-1-3'. The users in Group 2 - * are named 'User-2-1', 'User-2-2', 'User-2-3'. - * The login name is the lower case of the name. - * - * @return void - */ - protected static function createGroupsAndUsers() - { - for($i=1; $i<=2; $i++) { - $group = self::$dms->addGroup('Group '.$i, ''); - for($j=1; $j<=3; $j++) { - $user = self::$dms->addUser('user-'.$i.'-'.$j, '', 'User '.$j.' in group '.$i, 'user@seeddms.org', 'en_GB', 'bootstrap', ''); - $user->joinGroup($group); - } - } - } - - /** - * Creates a workflow with two transitions identical to the traditional - * workflow - * - * NR --- review --> NA -+- approve --> RL - * +- reject --> RJ | - * +- reject ---> RJ - * - * States: - * NR = needs review - * NA = needs approval - * RL = released - * RJ = rejected - * - * Actions: - * review - * approve - * reject - * - * Transitions: - * NR -- review -> NA maybe done by reviewer - * NR -- reject -> RJ maybe done by reviewer - * NA -- approve -> RL maybe done by approver - * NA -- reject -> RJ maybe done by approver - */ - protected function createWorkflow(\SeedDMS_Core_User $reviewer, \SeedDMS_Core_User $approver): \SeedDMS_Core_Workflow - { - /* Create workflow states */ - $ws_nr = self::$dms->addWorkflowState('needs review', S_IN_WORKFLOW); - $ws_na = self::$dms->addWorkflowState('needs approval', S_IN_WORKFLOW); - $ws_rl = self::$dms->addWorkflowState('released', S_RELEASED); - $ws_rj = self::$dms->addWorkflowState('rejected', S_REJECTED); - - /* Create workflow actions */ - $wa_rv = self::$dms->addWorkflowAction('review', S_IN_WORKFLOW); - $wa_rj = self::$dms->addWorkflowAction('reject', S_REJECTED); - $wa_ap = self::$dms->addWorkflowAction('approve', S_RELEASED); - - /* Create a workflow which starts in state 'needs review' */ - $workflow = self::$dms->addWorkflow('traditional workflow', $ws_nr); - /* Add transition NR -- review -> NA */ - $wt_nr_na = $workflow->addTransition($ws_nr, $wa_rv, $ws_na, [$reviewer], []); - /* Add transition NR -- review -> RJ */ - $wt_nr_rj = $workflow->addTransition($ws_nr, $wa_rj, $ws_rj, [$reviewer], []); - /* Add transition NA -- approve -> RL */ - $wt_na_rl = $workflow->addTransition($ws_na, $wa_ap, $ws_rl, [$approver], []); - /* Add transition NA -- reject -> RJ */ - $wt_na_rj = $workflow->addTransition($ws_na, $wa_rj, $ws_rj, [$approver], []); - - return $workflow; - } - - /** - * Creates a workflow with one transitions for approving a document - * - * NA -+- approve --> RL - * | - * +- reject ---> RJ - * - * States: - * NA = needs approval - * RL = released - * RJ = rejected - * - * Actions: - * approve - * reject - * - * Transitions: - * NA -- approve -> RL maybe done by approver - * NA -- reject -> RJ maybe done by approver - */ - protected function createSimpleWorkflow(\SeedDMS_Core_User $approver): \SeedDMS_Core_Workflow - { - /* Create workflow states */ - $ws_na = self::$dms->addWorkflowState('simple needs approval', S_IN_WORKFLOW); - $ws_rl = self::$dms->addWorkflowState('simple released', S_RELEASED); - $ws_rj = self::$dms->addWorkflowState('simple rejected', S_REJECTED); - - /* Create workflow actions */ - $wa_rj = self::$dms->addWorkflowAction('simple reject', S_REJECTED); - $wa_ap = self::$dms->addWorkflowAction('simple approve', S_RELEASED); - - /* Create a workflow which starts in state 'needs approval' */ - $workflow = self::$dms->addWorkflow('simple workflow', $ws_na); - /* Add transition NA -- approve -> RL */ - $wt_na_rl = $workflow->addTransition($ws_na, $wa_ap, $ws_rl, [$approver], []); - /* Add transition NA -- reject -> RJ */ - $wt_na_rj = $workflow->addTransition($ws_na, $wa_rj, $ws_rj, [$approver], []); - - return $workflow; - } - -} - diff --git a/SeedDMS_Core/tests/UserTest.php b/SeedDMS_Core/tests/UserTest.php deleted file mode 100644 index 6d2e6f208..000000000 --- a/SeedDMS_Core/tests/UserTest.php +++ /dev/null @@ -1,1679 +0,0 @@ - - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version @package_version@ - * @link https://www.seeddms.org - */ - -use PHPUnit\Framework\SeedDmsTest; - -/** - * User test class - * - * @category SeedDMS - * @package Tests - * @author Uwe Steinmann - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version Release: @package_version@ - * @link https://www.seeddms.org - */ -class UserTest extends SeedDmsTest -{ - - /** - * Create a real sqlite database in memory - * - * @return void - */ - protected function setUp(): void - { - self::$dbh = self::createInMemoryDatabase(); - self::$contentdir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'phpunit-'.time(); - mkdir(self::$contentdir); - // echo "Creating temp content dir: ".self::$contentdir."\n"; - self::$dms = new SeedDMS_Core_DMS(self::$dbh, self::$contentdir); - self::$dbversion = self::$dms->getDBVersion(); - } - - /** - * Clean up at tear down - * - * @return void - */ - protected function tearDown(): void - { - self::$dbh = null; - // echo "\nRemoving temp. content dir: ".self::$contentdir."\n"; - exec('rm -rf '.self::$contentdir); - } - - /** - * Create a mock admin user object - * - * @return SeedDMS_Core_User - */ - protected function getAdminUser() - { - $user = new SeedDMS_Core_User(1, 'admin', 'pass', 'Joe Foo', 'baz@foo.de', 'en_GB', 'bootstrap', 'My comment', SeedDMS_Core_User::role_admin); - return $user; - } - - /** - * Create a mock admin role object (only used for SeedDMS 6) - * - * @return SeedDMS_Core_User - */ - protected function getAdminRole() - { - $role = new SeedDMS_Core_Role(1, 'admin', SeedDMS_Core_Role::role_admin); - return $role; - } - - /** - * Create a mock regular user object - * - * @return SeedDMS_Core_User - */ - protected function getUser() - { - $user = new SeedDMS_Core_User(2, 'user', 'pass', 'Joe Baz', 'joe@foo.de', 'en_GB', 'bootstrap', 'My comment', SeedDMS_Core_User::role_user); - return $user; - } - - /** - * Test method setDMS() and getDMS() - * - * @return void - */ - public function testSetAndGetDMS() - { - $user = $this->getAdminUser(); - $user->setDMS(self::$dms); - $this->assertInstanceOf(SeedDMS_Core_DMS::class, $user->getDMS()); - } - - /** - * Test method isType() - * - * @return void - */ - public function testIsType() - { - $user = $this->getAdminUser(); - $this->assertTrue($user->isType('user')); - } - - /** - * Test method getPwd() - * - * @return void - */ - public function testGetPwd() - { - $user = $this->getAdminUser(); - $this->assertEquals('pass', $user->getPwd()); - } - - /** - * Test method getEmail() - * - * @return void - */ - public function testGetEmail() - { - $user = $this->getAdminUser(); - $this->assertEquals('baz@foo.de', $user->getEmail()); - } - - /** - * Test method getLanguage() - * - * @return void - */ - public function testGetLanguage() - { - $user = $this->getAdminUser(); - $this->assertEquals('en_GB', $user->getLanguage()); - } - - /** - * Test method getTheme() - * - * @return void - */ - public function testGetTheme() - { - $user = $this->getAdminUser(); - $this->assertEquals('bootstrap', $user->getTheme()); - } - - /** - * Test method getComment() - * - * @return void - */ - public function testGetComment() - { - $user = $this->getAdminUser(); - $this->assertEquals('My comment', $user->getComment()); - } - - /** - * Test method getRole() - * - * @return void - */ - public function testGetRole() - { - $user = $this->getAdminUser(); - $this->assertEquals(1, $user->getRole()); - } - - /** - * Test method isAdmin() - * - * @return void - */ - public function testIsAdmin() - { - $user = $this->getAdminUser(); - $this->assertTrue($user->isAdmin()); - $this->assertFalse($user->isGuest()); - } - - /** - * Test method isGuest() - * - * @return void - */ - public function testIsGuest() - { - $user = $this->getAdminUser(); - $this->assertFalse($user->isGuest()); - } - - /** - * Test method isHidden() - * - * @return void - */ - public function testIsHidden() - { - $user = $this->getAdminUser(); - $this->assertFalse($user->isHidden()); - } - - /** - * Test method getQuota() - * - * @return void - */ - public function testGetQuota() - { - $user = $this->getAdminUser(); - $this->assertEquals(0, $user->getQuota()); - } - - /** - * Test method getSecret() - * - * @return void - */ - public function testGetSecret() - { - if(self::$dbversion['major'] < 6) { - $this->markTestSkipped( - 'This test is not applicable for SeedDMS 5.' - ); - } else { - $user = $this->getAdminUser(); - $this->assertEquals('', $user->getSecret()); - } - } - - /** - * Test method getInstance() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetInstance() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $this->assertIsObject($user); - $this->assertEquals('admin', $user->getLogin()); - $user = SeedDMS_Core_User::getInstance('admin', self::$dms, 'name'); - $this->assertIsObject($user); - $this->assertEquals('admin', $user->getLogin()); - $user = SeedDMS_Core_User::getInstance('admin', self::$dms, 'name', 'info@seeddms.org'); - $this->assertIsObject($user); - $this->assertEquals('admin', $user->getLogin()); - /* get instance of none existing user */ - $user = SeedDMS_Core_User::getInstance('foo', self::$dms, 'name'); - $this->assertNull($user); - } - - /** - * Test method getAllInstances() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAllInstancesSqlFail() - { - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->exactly(2)) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblUsers` ORDER BY")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - /* Order by login */ - $users = SeedDMS_Core_User::getAllInstances('', $dms); - $this->assertFalse($users); - /* Order by fullname */ - $users = SeedDMS_Core_User::getAllInstances('fullname', $dms); - $this->assertFalse($users); - } - - /** - * Test method getLogin() - * - * @return void - */ - public function testGetLogin() - { - $user = $this->getAdminUser(); - $this->assertEquals('admin', $user->getLogin()); - } - - /** - * Test method setLogin() - * - * @return void - */ - public function testSetLoginSqlFail() - { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblUsers` SET `login`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertFalse($user->setLogin('foo')); - } - - /** - * Test method getLogin() and setLogin() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetLogin() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $login = $user->getLogin(); - $ret = $user->setLogin('foo'); - $this->assertTrue($ret); - $login = $user->getLogin(); - $this->assertEquals('foo', $login); - $ret = $user->setLogin(' '); - $this->assertFalse($ret); - } - - /** - * Test method getFullName() - * - * @return void - */ - public function testGetFullName() - { - $user = $this->getAdminUser(); - $this->assertEquals('Joe Foo', $user->getFullName()); - } - - /** - * Test method setFullName() - * - * @return void - */ - public function testSetFullNameSqlFail() - { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblUsers` SET `fullName`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertFalse($user->setFullName('foo')); - } - - /** - * Test method getFullName() and setFullName() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetFullName() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $fullname = $user->getFullName(); - $ret = $user->setFullName('foo'); - $this->assertTrue($ret); - $fullname = $user->getFullName(); - $this->assertEquals('foo', $fullname); - } - - /** - * Test method getPwd() and setPwd() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetPwd() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $pwd = $user->getPwd(); - $ret = $user->setPwd('foo'); - $this->assertTrue($ret); - $pwd = $user->getPwd(); - $this->assertEquals('foo', $pwd); - } - - /** - * Test method setPwd() - * - * @return void - */ - public function testSetPwdSqlFail() - { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblUsers` SET `pwd`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertFalse($user->setPwd('foo')); - } - - /** - * Test method getPwdExpiration() and setPwdExpiration() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetPwdExpiration() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $pwdexp = $user->getPwdExpiration(); - /* Set password expiration to 'never' */ - $ret = $user->setPwdExpiration('never'); - $this->assertTrue($ret); - $pwdexp = $user->getPwdExpiration(); - $this->assertNull($pwdexp); - - /* Set password expiration to 'now' */ - $now = date('Y-m-d H:i:s'); - $ret = $user->setPwdExpiration('now'); - $this->assertTrue($ret); - $pwdexp = $user->getPwdExpiration(); - $this->assertEquals($now, $pwdexp); - } - - /** - * Test method setPwdExpiration() - * - * @return void - */ - public function testSetPwdExpirationSqlFail() - { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblUsers` SET `pwdExpiration`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertFalse($user->setPwdExpiration('foo')); - } - - /** - * Test method getEmail() and setEmail() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetEmail() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $email = $user->getEmail(); - $ret = $user->setEmail('new@seeddms.org'); - $this->assertTrue($ret); - $email = $user->getEmail(); - $this->assertEquals('new@seeddms.org', $email); - } - - /** - * Test method setEmail() - * - * @return void - */ - public function testSetEmailSqlFail() - { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblUsers` SET `email`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertFalse($user->setEmail('foo')); - } - - /** - * Test method getLanguage() and setLanguage() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetLanguage() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $language = $user->getLanguage(); - $ret = $user->setLanguage('de_DE'); - $this->assertTrue($ret); - $language = $user->getLanguage(); - $this->assertEquals('de_DE', $language); - } - - /** - * Test method setLanguage() - * - * @return void - */ - public function testSetLanguageSqlFail() - { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblUsers` SET `language`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertFalse($user->setLanguage('de_DE')); - } - - /** - * Test method getTheme() and setTheme() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetTheme() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $theme = $user->getTheme(); - $ret = $user->setTheme('bootstrap4'); - $this->assertTrue($ret); - $theme = $user->getTheme(); - $this->assertEquals('bootstrap4', $theme); - } - - /** - * Test method setTheme() - * - * @return void - */ - public function testSetThemeSqlFail() - { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblUsers` SET `theme`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertFalse($user->setTheme('bootstrap')); - } - - /** - * Test method getComment() and setComment() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetComment() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $comment = $user->getComment(); - $ret = $user->setComment('my comment'); - $this->assertTrue($ret); - $comment = $user->getComment(); - $this->assertEquals('my comment', $comment); - } - - /** - * Test method setComment() - * - * @return void - */ - public function testSetCommentSqlFail() - { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblUsers` SET `comment`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertFalse($user->setComment('my comment')); - } - - /** - * Test method getRole() and setRole() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetRole() - { - if(self::$dbversion['major'] < 6) { - // SeedDMS 5 use integers for roles: 0=user, 1=admin, 2=guest - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - // User with id=1 is the admin user in the initial database - $role = $user->getRole(); - $this->assertEquals(SeedDMS_Core_User::role_admin, $role); - $ret = $user->setRole(SeedDMS_Core_User::role_guest); - $this->assertTrue($ret); - $role = $user->getRole(); - $this->assertEquals(SeedDMS_Core_User::role_guest, $role); - $ret = $user->setRole(''); - $this->assertFalse($ret); - } else { - // Starting with SeedDMS 6 a role is an object - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - // User with id=1 is the admin user in the initial database - $role = $user->getRole(); - $this->assertTrue($role->isAdmin()); - // SeedDMS_Core_User has an isAdmin() method too, which internally - // uses SeedDMS_Core_Role::isAdmin() - $this->assertTrue($user->isAdmin()); - // Get the guest role, which is supposed to have id=2 in the - // initial database - $guestrole = SeedDMS_Core_Role::getInstance(2, self::$dms); - $this->assertTrue($guestrole->isGuest()); - // Assign guest role and check if the user is a guest - $ret = $user->setRole($guestrole); - $this->assertTrue($ret); - $this->assertTrue($user->isGuest()); - } - } - - /** - * Test method setRole() - * - * @return void - */ - public function testSetRoleSqlFail() - { - if(self::$dbversion['major'] > 5) { - $role = $this->getAdminRole(); - } - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblUsers` SET `role`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - if(self::$dbversion['major'] > 5) { - $this->assertFalse($user->setRole($role)); - } else { - $this->assertFalse($user->setRole(SeedDMS_Core_User::role_admin)); - } - } - - /** - * Test method setGuest() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testSetGuest() - { - if(self::$dbversion['major'] == '5') { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $role = $user->getRole(); - $ret = $user->setGuest(); - $this->assertTrue($ret); - $role = $user->getRole(); - $this->assertEquals(SeedDMS_Core_User::role_guest, $role); - } else { - $this->markTestSkipped( - 'This test is not applicable for SeedDMS 6.' - ); - } - } - - /** - * Test method setGuest() - * - * @return void - */ - public function testSetGuestSqlFail() - { - $dms = new SeedDMS_Core_DMS(null, ''); - if(self::$dbversion['major'] == '5') { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblUsers` SET `role`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertFalse($user->setGuest()); - } else { - $this->markTestSkipped( - 'This test is not applicable for SeedDMS 6.' - ); - } - } - - /** - * Test method setAdmin() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testSetAdmin() - { - if(self::$dbversion['major'] == '5') { - $user = SeedDMS_Core_User::getInstance(2, self::$dms); - $role = $user->getRole(); - $ret = $user->setAdmin(); - $this->assertTrue($ret); - $role = $user->getRole(); - $this->assertEquals(SeedDMS_Core_User::role_admin, $role); - } else { - $this->markTestSkipped( - 'This test is not applicable for SeedDMS 6.' - ); - } - } - - /** - * Test method setAdmin() - * - * @return void - */ - public function testSetAdminSqlFail() - { - $dms = new SeedDMS_Core_DMS(null, ''); - if(self::$dbversion['major'] == '5') { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblUsers` SET `role`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertFalse($user->setAdmin()); - } else { - $this->markTestSkipped( - 'This test is not applicable for SeedDMS 6.' - ); - } - } - - /** - * Test method getQuota() and setQuota() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetQuota() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $quota = $user->getQuota(); - $ret = $user->setQuota(100000); - $this->assertTrue($ret); - $quota = $user->getQuota(); - $this->assertEquals(100000, $quota); - /* Setting a non numeric or negative value will fail */ - $ret = $user->setQuota('foo'); - $this->assertFalse($ret); - $ret = $user->setQuota(-100); - $this->assertFalse($ret); - } - - /** - * Test method setQuota() - * - * @return void - */ - public function testSetQuotaSqlFail() - { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblUsers` SET `quota`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertFalse($user->setQuota(10000)); - } - - /** - * Test method getSecret() and setSecret() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetSecret() - { - if(self::$dbversion['major'] < 6) { - $this->markTestSkipped( - 'This test is not applicable for SeedDMS 5.' - ); - } else { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $secret = $user->getSecret(); - $ret = $user->setSecret('secret'); - $this->assertTrue($ret); - $secret = $user->getSecret(); - $this->assertEquals('secret', $secret); - } - } - - /** - * Test method setSecret() - * - * @return void - */ - public function testSetSecretSqlFail() - { - if(self::$dbversion['major'] < 6) { - $this->markTestSkipped( - 'This test is not applicable for SeedDMS 5.' - ); - } else { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblUsers` SET `secret`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertFalse($user->setSecret('secret')); - } - } - - /** - * Test method isHidden() and setHidden() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testIsAndSetHidden() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $ishidden = $user->isHidden(); - /* set hidden to true */ - $ret = $user->setHidden(true); - $this->assertTrue($ret); - $ishidden = $user->isHidden(); - $this->assertTrue($ishidden); - /* set hidden to false */ - $ret = $user->setHidden(false); - $this->assertTrue($ret); - $ishidden = $user->isHidden(); - $this->assertFalse($ishidden); - } - - /** - * Test method setHidden() - * - * @return void - */ - public function testSetHiddentSqlFail() - { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblUsers` SET `hidden`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertFalse($user->setHidden(true)); - } - - /** - * Test method isDisabled() and setDisabled() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testIsAndSetDisabled() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $isdisabled = $user->isDisabled(); - /* set disabled to true */ - $ret = $user->setDisabled(true); - $this->assertTrue($ret); - $isdisabled = $user->isDisabled(); - $this->assertTrue($isdisabled); - /* set disabled to false */ - $ret = $user->setDisabled(false); - $this->assertTrue($ret); - $isdisabled = $user->isDisabled(); - $this->assertFalse($isdisabled); - } - - /** - * Test method setDisabled() - * - * @return void - */ - public function testSetDisabledtSqlFail() - { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblUsers` SET `disabled`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertFalse($user->setDisabled(true)); - } - - /** - * Test method addLoginFailure() - * - * @return void - */ - public function testAddLoginFailure() - { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->exactly(2)) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblUsers` SET `loginfailures`")) - ->willReturn(true); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertEquals(1, $user->addLoginFailure()); - $this->assertEquals(2, $user->addLoginFailure()); - } - - /** - * Test method addLoginFailure() - * - * @return void - */ - public function testAddLoginFailureSqlFail() - { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblUsers` SET `loginfailures`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertFalse($user->addLoginFailure()); - } - - /** - * Test method clearLoginFailure() - * - * @return void - */ - public function testClearLoginFailure() - { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->exactly(2)) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblUsers` SET `loginfailures`")) - ->willReturn(true); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertEquals(1, $user->addLoginFailure()); - $this->assertEquals(true, $user->clearLoginFailures()); - } - - /** - * Test method clearLoginFailure() - * - * @return void - */ - public function testClearLoginFailureSqlFail() - { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblUsers` SET `loginfailures`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertFalse($user->clearLoginFailures()); - } - - /** - * Test method setHomeFolder() and getHomeFolder() - * - * @return void - */ - public function testSetAndGetHomeFolder() - { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblUsers` SET `homefolder`")) - ->willReturn(true); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertTrue($user->setHomeFolder(1)); - $this->assertEquals(1, $user->getHomeFolder()); - } - - /** - * Test method setHomeFolder() - * - * @return void - */ - public function testSetHomeFolderSqlFail() - { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResult') - ->with($this->stringContains("UPDATE `tblUsers` SET `homefolder`")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertFalse($user->setHomeFolder(1)); - } - - /** - * Test method getUsedDiskSpace() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetUsedDiskSpace() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $size = $user->getUsedDiskSpace(); - $this->assertEquals(0, $size); - } - - /** - * Test method getUsedDiskSpace() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetUsedDiskSpaceSqlFail() - { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT SUM(`fileSize`) sum")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertFalse($user->getUsedDiskSpace()); - } - - /** - * Test method removeFromProcesses() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testRemoveFromProcesses() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $ret = $user->removeFromProcesses($user); - $this->assertTrue($ret); - } - - /** - * Test method transferDocumentsFolders() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testTransferDocumentsFolders() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - self::createSimpleFolderStructureWithDocuments(); - $newuser = self::$dms->addUser('newuser', '', 'New User', 'newuser@seeddms.org', 'en_GB', 'bootstrap', ''); - /* Transfering documents and folders to the same user returns true */ - $ret = $user->transferDocumentsFolders($user); - $this->assertTrue($ret); - /* A subfolder still belongs to $user */ - $subfolder = self::$dms->getFolder(2); - $this->assertEquals($user->getId(), $subfolder->getOwner()->getId()); - /* A document still belongs to $user */ - $document = self::$dms->getDocument(1); - $this->assertEquals($user->getId(), $document->getOwner()->getId()); - /* Transfer the documents and folders to $newuser */ - $ret = $user->transferDocumentsFolders($newuser); - $this->assertTrue($ret); - /* Get the folder again, because the owner has changed */ - $subfolder = self::$dms->getFolder(2); - $this->assertEquals($newuser->getId(), $subfolder->getOwner()->getId()); - /* Get the document again, because the owner has changed */ - $document = self::$dms->getDocument(1); - $this->assertEquals($newuser->getId(), $document->getOwner()->getId()); - } - - /** - * Test method remove() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testRemove() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - self::createSimpleFolderStructureWithDocuments(); - $newuser = self::$dms->addUser('newuser', '', 'New User', 'newuser@seeddms.org', 'en_GB', 'bootstrap', ''); - /* removing a user without passed a new user for docs and folders will fail */ - $ret = $user->remove($newuser, null); - $this->assertFalse($ret); - - $ret = $user->remove($newuser, $newuser); - $this->assertTrue($ret); - - /* all documents and folders now belong to $newuser */ - $document = self::$dms->getDocument(1); - $this->assertEquals($newuser->getId(), $document->getOwner()->getId()); - $subfolder = self::$dms->getFolder(1); - $this->assertEquals($newuser->getId(), $subfolder->getOwner()->getId()); - } - - /** - * Test method getDocuments() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDocuments() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $documents = $user->getDocuments(); - $this->assertIsArray($documents); - $this->assertCount(0, $documents); - } - - /** - * Test method getDocumentsLocked() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDocumentsLocked() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $documents = $user->getDocumentsLocked(); - $this->assertIsArray($documents); - $this->assertCount(0, $documents); - } - - /** - * Test method getDocumentLinks() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDocumentLinks() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $links = $user->getDocumentLinks(); - $this->assertIsArray($links); - $this->assertCount(0, $links); - } - - /** - * Test method getDocumentFiles() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDocumentFiles() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $files = $user->getDocumentFiles(); - $this->assertIsArray($files); - $this->assertCount(0, $files); - } - - /** - * Test method getDocumentContents() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetDocumentContents() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $contents = $user->getDocumentContents(); - $this->assertIsArray($contents); - $this->assertCount(0, $contents); - } - - /** - * Test method getFolders() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetFolders() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $folders = $user->getFolders(); - $this->assertIsArray($folders); - $this->assertCount(1, $folders); - } - - /** - * Test method getReviewStatus() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetReviewStatus() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $status = $user->getReviewStatus(); - $this->assertIsArray($status); - $this->assertCount(2, $status); - $this->assertCount(0, $status['indstatus']); - $this->assertCount(0, $status['grpstatus']); - } - - /** - * Test method getApprovalStatus() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetApprovalStatus() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $status = $user->getApprovalStatus(); - $this->assertIsArray($status); - $this->assertCount(2, $status); - $this->assertCount(0, $status['indstatus']); - $this->assertCount(0, $status['grpstatus']); - } - - /** - * Test method getWorkflowStatus() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetWorkflowStatus() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $status = $user->getWorkflowStatus(); - $this->assertIsArray($status); - $this->assertCount(2, $status); - $this->assertCount(0, $status['u']); - $this->assertCount(0, $status['g']); - } - - /** - * Test method getWorkflowsInvolved() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetWorkflowsInvolved() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $workflows = $user->getWorkflowsInvolved(); - $this->assertIsArray($workflows); - $this->assertCount(0, $workflows); - } - - /** - * Test method getMandatoryReviewers() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetMandatoryReviewers() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $reviewers = $user->getMandatoryReviewers(); - $this->assertIsArray($reviewers); - $this->assertCount(0, $reviewers); - } - - /** - * Test method setMandatoryReviewer() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testSetMandatoryReviewer() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $newuser = self::$dms->addUser('newuser', '', 'New User', 'newuser@seeddms.org', 'en_GB', 'bootstrap', ''); - $ret = $user->setMandatoryReviewer($newuser->getId(), false); - $this->assertTrue($ret); - $reviewers = $user->getMandatoryReviewers(); - $this->assertIsArray($reviewers); - $this->assertCount(1, $reviewers); - /* $newuser is now a mandatory user of $user */ - $mandatoryreviewers = $newuser->isMandatoryReviewerOf(); - $this->assertIsArray($mandatoryreviewers); - $this->assertCount(1, $mandatoryreviewers); - $this->assertEquals($user->getId(), $mandatoryreviewers[0]->getId()); - - $group = self::$dms->addGroup('Group', ''); - $ret = $user->setMandatoryReviewer($group->getId(), true); - $this->assertTrue($ret); - $reviewers = $user->getMandatoryReviewers(); - $this->assertIsArray($reviewers); - $this->assertCount(2, $reviewers); - /* FIXME: there is not isMandatoryReviewerOf() for groups */ - } - - /** - * Test method getMandatoryApprovers() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetMandatoryApprovers() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $approvers = $user->getMandatoryApprovers(); - $this->assertIsArray($approvers); - $this->assertCount(0, $approvers); - } - - /** - * Test method setMandatoryApprover() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testSetMandatoryApprover() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $newuser = self::$dms->addUser('newuser', '', 'New User', 'newuser@seeddms.org', 'en_GB', 'bootstrap', ''); - $ret = $user->setMandatoryApprover($newuser->getId(), false); - $this->assertTrue($ret); - $approvers = $user->getMandatoryApprovers(); - $this->assertIsArray($approvers); - $this->assertCount(1, $approvers); - /* $newuser is now a mandatory user of $user */ - $mandatoryapprovers = $newuser->isMandatoryApproverOf(); - $this->assertIsArray($mandatoryapprovers); - $this->assertCount(1, $mandatoryapprovers); - $this->assertEquals($user->getId(), $mandatoryapprovers[0]->getId()); - - $group = self::$dms->addGroup('Group', ''); - $ret = $user->setMandatoryApprover($group->getId(), true); - $this->assertTrue($ret); - $approvers = $user->getMandatoryApprovers(); - $this->assertIsArray($approvers); - $this->assertCount(2, $approvers); - /* FIXME: there is not isMandatoryApproverOf() for groups */ - } - - /** - * Test method setMandatoryWorkflow() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testSetMandatoryWorkflow() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $approver = self::$dms->addUser('approver', '', 'Approver', 'newuser@seeddms.org', 'en_GB', 'bootstrap', ''); - $reviewer = self::$dms->addUser('reviewer', '', 'Reviewer', 'newuser@seeddms.org', 'en_GB', 'bootstrap', ''); - $simpleworkflow = self::createSimpleWorkflow($approver); - $traditionalworkflow = self::createWorkflow($reviewer, $approver); - $newuser = self::$dms->addUser('newuser', '', 'New User', 'newuser@seeddms.org', 'en_GB', 'bootstrap', ''); - /* Set a single mandatory workflow */ - $ret = $newuser->setMandatoryWorkflow($simpleworkflow); - $this->assertTrue($ret); - $workflows = $newuser->getMandatoryWorkflows(); - $this->assertIsArray($workflows); - $this->assertCount(1, $workflows); - - /* Set a single mandatory workflow will add it to the list of workflows */ - $ret = $newuser->setMandatoryWorkflow($traditionalworkflow); - $this->assertTrue($ret); - $workflows = $newuser->getMandatoryWorkflows(); - $this->assertIsArray($workflows); - $this->assertCount(2, $workflows); - - /* Set a single mandatory workflow with setMandatoryWorkflows() will delete - * all existing workflows and set a new list of workflows - */ - $ret = $newuser->setMandatoryWorkflows([$simpleworkflow]); - $this->assertTrue($ret); - $workflows = $newuser->getMandatoryWorkflows(); - $this->assertIsArray($workflows); - $this->assertCount(1, $workflows); - - /* Set several mandatory workflows will delete all existing workflows - * and set new workflows. - */ - $ret = $newuser->setMandatoryWorkflows([$simpleworkflow, $traditionalworkflow]); - $this->assertTrue($ret); - $workflows = $newuser->getMandatoryWorkflows(); - $this->assertIsArray($workflows); - $this->assertCount(2, $workflows); - - /* Setting an empty list will delete all mandatory workflows */ - $ret = $newuser->setMandatoryWorkflows([]); - $this->assertTrue($ret); - $workflows = $newuser->getMandatoryWorkflows(); - $this->assertNull($workflows); - } - - /** - * Test method getMandatoryWorkflow() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetMandatoryWorkflow() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $workflow = $user->getMandatoryWorkflow(); - $this->assertNull($workflow); - } - - /** - * Test method getMandatoryWorkflows() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetMandatoryWorkflows() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $workflow = $user->getMandatoryWorkflows(); - $this->assertNull($workflow); - } - - /** - * Test method getGroups() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetGroups() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $groups = $user->getGroups(); - $this->assertIsArray($groups); - $this->assertCount(0, $groups); - $group = self::$dms->addGroup('Group', ''); - $ret = $user->joinGroup($group); - $this->assertTrue($ret); - /* Adding the user a twice to a group will fail */ - $ret = $user->joinGroup($group); - $this->assertFalse($ret); - /* user now belongs to two groups */ - $groups = $user->getGroups(); - $this->assertIsArray($groups); - $this->assertCount(1, $groups); - /* Leave the group */ - $ret = $user->leaveGroup($group); - $this->assertTrue($ret); - /* Leave the group again will fail */ - $ret = $user->leaveGroup($group); - $this->assertFalse($ret); - /* the user is no longer in any group */ - $groups = $user->getGroups(); - $this->assertIsArray($groups); - $this->assertCount(0, $groups); - } - - /** - * Test method hasImage() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testHasImage() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $image = $user->hasImage(); - $this->assertFalse($image); - } - - /** - * Test method hasImage() - * - * @return void - */ - public function testHasImageSqlFail() - { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT COUNT(*) AS num FROM `tblUserImages` WHERE")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertFalse($user->hasImage()); - } - - /** - * Test method getImage() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetImage() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $image = $user->getImage(); - $this->assertNull($image); - } - - /** - * Test method getImage() - * - * @return void - */ - public function testGetImageSqlFail() - { - $user = $this->getAdminUser(); - $db = $this->createMock(SeedDMS_Core_DatabaseAccess::class); - $db->expects($this->once()) - ->method('getResultArray') - ->with($this->stringContains("SELECT * FROM `tblUserImages` WHERE")) - ->willReturn(false); - $dms = new SeedDMS_Core_DMS($db, ''); - $user->setDMS($dms); - $this->assertFalse($user->getImage()); - } - - /** - * Test method setImage() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testSetImage() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $file = self::createTempFile(200); - $ret = $user->setImage($file, 'text/plain'); - $this->assertTrue(SeedDMS_Core_File::removeFile($file)); - $this->assertTrue($ret); - $ret = $user->hasImage(); - $this->assertTrue($ret); - $image = $user->getImage(); - $this->assertIsArray($image); - $this->assertEquals('text/plain', $image['mimeType']); - } - - /** - * Test method delMandatoryReviewers() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testDelMandatoryReviewers() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $ret = $user->delMandatoryReviewers(); - $this->assertTrue($ret); - } - - /** - * Test method delMandatoryApprovers() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testDelMandatoryApprovers() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $ret = $user->delMandatoryApprovers(); - $this->assertTrue($ret); - } - - /** - * Test method delMandatoryWorkflow() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testDelMandatoryWorkflow() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $ret = $user->delMandatoryWorkflow(); - $this->assertTrue($ret); - } - - /** - * Test method getNotifications() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetNotifications() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $notifications = $user->getNotifications(); - $this->assertIsArray($notifications); - $this->assertCount(0, $notifications); - $notifications = $user->getNotifications(0); - $this->assertIsArray($notifications); - $this->assertCount(0, $notifications); - $notifications = $user->getNotifications(1); - $this->assertIsArray($notifications); - $this->assertCount(0, $notifications); - } - - /** - * Test method getKeywordCategories() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetKeywordCategories() - { - $user = SeedDMS_Core_User::getInstance(1, self::$dms); - $cats = $user->getKeywordCategories(); - $this->assertIsArray($cats); - $this->assertCount(0, $cats); - } -} - diff --git a/SeedDMS_Core/tests/WorkflowTest.php b/SeedDMS_Core/tests/WorkflowTest.php deleted file mode 100644 index 3abe1c26d..000000000 --- a/SeedDMS_Core/tests/WorkflowTest.php +++ /dev/null @@ -1,638 +0,0 @@ - - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version @package_version@ - * @link https://www.seeddms.org - */ - -use PHPUnit\Framework\SeedDmsTest; - -/** - * Group test class - * - * @category SeedDMS - * @package Tests - * @author Uwe Steinmann - * @copyright 2021 Uwe Steinmann - * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License - * @version Release: @package_version@ - * @link https://www.seeddms.org - */ -class WorkflowTest extends SeedDmsTest -{ - - /** - * Create a real sqlite database in memory - * - * @return void - */ - protected function setUp(): void - { - self::$dbh = self::createInMemoryDatabase(); - self::$contentdir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'phpunit-'.time(); - mkdir(self::$contentdir); - // echo "Creating temp content dir: ".self::$contentdir."\n"; - self::$dms = new \SeedDMS_Core_DMS(self::$dbh, self::$contentdir); - self::$dbversion = self::$dms->getDBVersion(); - } - - /** - * Clean up at tear down - * - * @return void - */ - protected function tearDown(): void - { - self::$dbh = null; - // echo "\nRemoving temp. content dir: ".self::$contentdir."\n"; - exec('rm -rf '.self::$contentdir); - } - - /** - * Test method getInitState() and setInitState() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetInitState() - { - $ws_nr = self::$dms->addWorkflowState('needs review', S_IN_WORKFLOW); - $ws_na = self::$dms->addWorkflowState('needs approval', S_IN_WORKFLOW); - $workflow = self::$dms->addWorkflow('traditional workflow', $ws_nr); - $initstate = $workflow->getInitState(); - $this->assertEquals($ws_nr->getName(), $initstate->getName()); - $ret = $workflow->setInitState($ws_na); - $this->assertTrue($ret); - $initstate = $workflow->getInitState(); - $this->assertEquals($ws_na->getName(), $initstate->getName()); - } - - /** - * Test method getName() and setName() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetStateName() - { - $state = self::$dms->addWorkflowState('needs review', S_IN_WORKFLOW); - $name = $state->getName(); - $this->assertEquals('needs review', $name); - $ret = $state->setName('foobar'); - $this->assertTrue($ret); - $name = $state->getName(); - $this->assertEquals('foobar', $name); - } - - /** - * Test method getName() and setName() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetActionName() - { - $action = self::$dms->addWorkflowAction('action'); - $name = $action->getName(); - $this->assertEquals('action', $name); - $ret = $action->setName('foobar'); - $this->assertTrue($ret); - $name = $action->getName(); - $this->assertEquals('foobar', $name); - } - - /** - * Test method getName() and setName() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetWorkflowName() - { - $ws_nr = self::$dms->addWorkflowState('needs review', S_IN_WORKFLOW); - $workflow = self::$dms->addWorkflow('traditional workflow', $ws_nr); - $name = $workflow->getName(); - $this->assertEquals('traditional workflow', $name); - $ret = $workflow->setName('foo'); - $this->assertTrue($ret); - $name = $workflow->getName(); - $this->assertEquals('foo', $name); - } - - /** - * Test method getDocumentStatus() and setDocumentStatus() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testGetAndSetDocumentStatus() - { - $state = self::$dms->addWorkflowState('some name', S_RELEASED); - $docstatus = $state->getDocumentStatus(); - $this->assertEquals(S_RELEASED, $docstatus); - $ret = $state->setDocumentStatus(S_REJECTED); - $this->assertTrue($ret); - $docstatus = $state->getDocumentStatus(); - $this->assertEquals(S_REJECTED, $docstatus); - } - - /** - * Test method workflow->remove() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testCreateAndRemoveWorkflow() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $this->assertIsObject($user); - - /* Add a new user who will be the reviewer */ - $reviewer = self::$dms->addUser('reviewer', 'reviewer', 'Reviewer One', 'user1@seeddms.org', 'en_GB', 'bootstrap', ''); - $this->assertIsObject($reviewer); - - /* Add a new user who will be the approver */ - $approver = self::$dms->addUser('approver', 'approver', 'Approver One', 'user1@seeddms.org', 'en_GB', 'bootstrap', ''); - $this->assertIsObject($approver); - - $workflow = self::createWorkflow($reviewer, $approver); - $this->assertIsObject($workflow); - - $ret = $workflow->remove(); - $this->assertTrue($ret); - - $states = self::$dms->getAllWorkflowStates(); - $this->assertIsArray($states); - $this->assertCount(4, $states); - foreach($states as $state) - $this->assertFalse($state->isUsed()); - - $actions = self::$dms->getAllWorkflowActions(); - $this->assertIsArray($actions); - $this->assertCount(3, $actions); - foreach($actions as $action) - $this->assertFalse($action->isUsed()); - - } - - /** - * Test method remove() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testCreateAndRemoveAction() - { - $action = self::$dms->addWorkflowAction('action'); - $this->assertIsObject($action); - $actions = self::$dms->getAllWorkflowActions(); - $this->assertIsArray($actions); - $this->assertCount(1, $actions); - $ret = $action->remove(); - $this->assertTrue($ret); - $actions = self::$dms->getAllWorkflowActions(); - $this->assertIsArray($actions); - $this->assertCount(0, $actions); - } - - /** - * Test method remove() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testCreateAndRemoveState() - { - $state = self::$dms->addWorkflowState('needs review', S_IN_WORKFLOW); - $this->assertIsObject($state); - $states = self::$dms->getAllWorkflowStates(); - $this->assertIsArray($states); - $this->assertCount(1, $states); - $ret = $state->remove(); - $this->assertTrue($ret); - $states = self::$dms->getAllWorkflowStates(); - $this->assertIsArray($states); - $this->assertCount(0, $states); - } - - /** - * Test method setWorkflow(), getWorkflow(), getWorkflowState() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testAssignWorkflow() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $this->assertIsObject($user); - - /* Add a new user who will be the reviewer */ - $reviewer = self::$dms->addUser('reviewer', 'reviewer', 'Reviewer One', 'user1@seeddms.org', 'en_GB', 'bootstrap', ''); - $this->assertIsObject($reviewer); - - /* Add a new user who will be the approver */ - $approver = self::$dms->addUser('approver', 'approver', 'Approver One', 'user1@seeddms.org', 'en_GB', 'bootstrap', ''); - $this->assertIsObject($approver); - - $workflow = self::createWorkflow($reviewer, $approver); - $this->assertIsObject($workflow); - - /* Check for cycles */ - $cycles = $workflow->checkForCycles(); - $this->assertFalse($cycles); - - /* Add a new document */ - $document = self::createDocument($rootfolder, $user, 'Document 1'); - $content = $document->getLatestContent(); - $this->assertIsObject($content); - $status = $content->getStatus(); - $this->assertIsArray($status); - $this->assertEquals(S_RELEASED, $status['status']); - - /* Assign the workflow */ - $ret = $content->setWorkflow($workflow, $user); - $this->assertTrue($ret); - - /* Assign a workflow again causes an error */ - $ret = $content->setWorkflow($workflow, $user); - $this->assertFalse($ret); - - /* Get a fresh copy of the content from the database and get the workflow */ - $again = self::$dms->getDocumentContent($content->getId()); - $this->assertIsObject($again); - $w = $again->getWorkflow(); - $this->assertEquals($workflow->getId(), $w->getId()); - - /* Status of content should be S_IN_WORKFLOW now */ - $status = $content->getStatus(); - $this->assertIsArray($status); - $this->assertEquals(S_IN_WORKFLOW, $status['status']); - - /* Get current workflow state */ - $state = $content->getWorkflowState(); - $this->assertEquals('needs review', $state->getName()); - - $workflowlog = $content->getWorkflowLog(); - $this->assertIsArray($workflowlog); - $this->assertCount(0, $workflowlog); - - /* The workflow has altogether 4 states */ - $states = $workflow->getStates(); - $this->assertIsArray($states); - $this->assertCount(4, $states); - - /* Check the initial state */ - $initstate = $workflow->getInitState(); - $this->assertEquals('needs review', $initstate->getName()); - - /* init state is definitely used */ - $ret = $initstate->isUsed(); - $this->assertTrue($ret); - - /* init state has two transistions linked to it */ - $transitions = $initstate->getTransitions(); - $this->assertIsArray($transitions); - $this->assertCount(2, $transitions); - - /* Check if workflow is used by any document */ - $isused = $workflow->isUsed(); - $this->assertTrue($isused); - - } - - /** - * Test method setWorkflow(), getWorkflow(), getWorkflowState() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testStepThroughWorkflow() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $this->assertIsObject($user); - - /* Add a new user who will be the reviewer */ - $reviewer = self::$dms->addUser('reviewer', 'reviewer', 'Reviewer One', 'user1@seeddms.org', 'en_GB', 'bootstrap', ''); - $this->assertIsObject($reviewer); - - /* Add a new user who will be the approver */ - $approver = self::$dms->addUser('approver', 'approver', 'Approver One', 'user1@seeddms.org', 'en_GB', 'bootstrap', ''); - $this->assertIsObject($approver); - - $workflow = self::createWorkflow($reviewer, $approver); - - /* Add a new document */ - $document = self::createDocument($rootfolder, $user, 'Document 1'); - $content = $document->getLatestContent(); - $this->assertIsObject($content); - $status = $content->getStatus(); - $this->assertIsArray($status); - $this->assertEquals(S_RELEASED, $status['status']); - - /* Assign the workflow */ - $ret = $content->setWorkflow($workflow, $user); - $this->assertTrue($ret); - - $status = $content->getStatus(); - $this->assertIsArray($status); - $this->assertEquals(S_IN_WORKFLOW, $status['status']); - - /* Remove the workflow */ - $ret = $content->removeWorkflow($user); - $this->assertTrue($ret); - - $status = $content->getStatus(); - $this->assertIsArray($status); - $this->assertEquals(S_RELEASED, $status['status']); - - /* Remove the workflow again is just fine */ - $ret = $content->removeWorkflow($user); - $this->assertTrue($ret); - - /* Assign the workflow again */ - $ret = $content->setWorkflow($workflow, $user); - $this->assertTrue($ret); - - $status = $content->getStatus(); - $this->assertIsArray($status); - $this->assertEquals(S_IN_WORKFLOW, $status['status']); - - - /* Check if workflow needs action by the reviewer/approver */ - $ret = $content->needsWorkflowAction($reviewer); - $this->assertTrue($ret); - $ret = $content->needsWorkflowAction($approver); - $this->assertFalse($ret); - - /* Get current workflow state*/ - $state = $content->getWorkflowState(); - $this->assertEquals('needs review', $state->getName()); - - /* There should be two possible transitions now - * NR -- review -> NA - * NR -- reject -> RJ - */ - $nexttransitions = $workflow->getNextTransitions($state); - $this->assertIsArray($nexttransitions); - $this->assertCount(2, $nexttransitions); - - /* But of course, there were no previous transitions */ - $prevtransitions = $workflow->getPreviousTransitions($state); - $this->assertIsArray($prevtransitions); - $this->assertCount(0, $prevtransitions); - - /* Check if reviewer is allowed to trigger the transition. - * As we are still in the intitial state, the possible transitions - * may both be triggered by the reviewer but not by the approver. - */ - foreach($nexttransitions as $nexttransition) { - if($nexttransition->getNextState()->getDocumentStatus() == S_REJECTED) - $rejecttransition = $nexttransition; - elseif($nexttransition->getNextState()->getDocumentStatus() == S_IN_WORKFLOW) - $reviewtransition = $nexttransition; - $ret = $content->triggerWorkflowTransitionIsAllowed($reviewer, $nexttransition); - $this->assertTrue($ret); - $ret = $content->triggerWorkflowTransitionIsAllowed($approver, $nexttransition); - $this->assertFalse($ret); - } - - /* Trigger the successful review transition. - * As there is only one reviewer the transition will fire and the workflow - * moves forward into the next state. triggerWorkflowTransition() returns the - * next state. - */ - $nextstate = $content->triggerWorkflowTransition($reviewer, $reviewtransition, 'Review succeeded'); - $this->assertIsObject($nextstate); - $this->assertEquals('needs approval', $nextstate->getName()); - - $state = $content->getWorkflowState(); - $this->assertEquals($nextstate->getId(), $state->getId()); - $this->assertEquals('needs approval', $state->getName()); - - /* The workflow log has one entry now */ - $workflowlog = $content->getLastWorkflowLog(); - $this->assertIsObject($workflowlog); - $this->assertEquals('Review succeeded', $workflowlog->getComment()); - - /* There should be two possible transitions now - * NA -- approve -> RL - * NA -- reject -> RJ - */ - $nexttransitions = $workflow->getNextTransitions($state); - $this->assertIsArray($nexttransitions); - $this->assertCount(2, $nexttransitions); - - /* But of course, there is one previous transitions, the one that led to - * the current state of the workflow. - */ - $prevtransitions = $workflow->getPreviousTransitions($state); - $this->assertIsArray($prevtransitions); - $this->assertCount(1, $prevtransitions); - $this->assertEquals($reviewtransition->getId(), $prevtransitions[0]->getId()); - - /* Check if approver is allowed to trigger the transition. - * As we are now in 'needs approval' state, the possible transitions - * may both be triggered by the approver but not by the reviewer. - */ - foreach($nexttransitions as $nexttransition) { - if($nexttransition->getNextState()->getDocumentStatus() == S_REJECTED) - $rejecttransition = $nexttransition; - elseif($nexttransition->getNextState()->getDocumentStatus() == S_RELEASED) - $releasetransition = $nexttransition; - $ret = $content->triggerWorkflowTransitionIsAllowed($approver, $nexttransition); - $this->assertTrue($ret); - $ret = $content->triggerWorkflowTransitionIsAllowed($reviewer, $nexttransition); - $this->assertFalse($ret); - } - - /* Trigger the successful approve transition. - * As there is only one approver the transition will fire and the workflow - * moves forward into the next state. triggerWorkflowTransition() returns the - * next state. - */ - $nextstate = $content->triggerWorkflowTransition($approver, $releasetransition, 'Approval succeeded'); - $this->assertIsObject($nextstate); - $this->assertEquals('released', $nextstate->getName()); - - /* The workflow log has two entries now */ - $workflowlog = $content->getLastWorkflowLog(); - $this->assertIsObject($workflowlog); - $this->assertEquals('Approval succeeded', $workflowlog->getComment()); - - /* Because the workflow has reached a final state, the workflow will no - * longer be attached to the document. - */ - $workflow = $content->getWorkflow(); - $this->assertFalse($workflow); - - /* There is also no way to get the state anymore */ - $state = $content->getWorkflowState(); - $this->assertFalse($state); - - $status = $content->getStatus(); - $this->assertIsArray($status); - $this->assertEquals(S_RELEASED, $status['status']); - - /* Even after the workflow has been finished the log can still be retrieved */ - $workflowlog = $content->getLastWorkflowLog(); - $this->assertIsObject($workflowlog); - $this->assertEquals('Approval succeeded', $workflowlog->getComment()); - } - - /** - * Test method rewindWorkflow() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testRewindWorkflow() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $this->assertIsObject($user); - - /* Add a new user who will be the reviewer */ - $reviewer = self::$dms->addUser('reviewer', 'reviewer', 'Reviewer One', 'user1@seeddms.org', 'en_GB', 'bootstrap', ''); - $this->assertIsObject($reviewer); - - /* Add a new user who will be the approver */ - $approver = self::$dms->addUser('approver', 'approver', 'Approver One', 'user1@seeddms.org', 'en_GB', 'bootstrap', ''); - $this->assertIsObject($approver); - - $workflow = self::createWorkflow($reviewer, $approver); - - /* Add a new document */ - $document = self::createDocument($rootfolder, $user, 'Document 1'); - $content = $document->getLatestContent(); - $this->assertIsObject($content); - $status = $content->getStatus(); - $this->assertIsArray($status); - $this->assertEquals(S_RELEASED, $status['status']); - - /* Assign the workflow */ - $ret = $content->setWorkflow($workflow, $user); - $this->assertTrue($ret); - - $status = $content->getStatus(); - $this->assertIsArray($status); - $this->assertEquals(S_IN_WORKFLOW, $status['status']); - - /* Check if workflow needs action by the reviewer */ - $ret = $content->needsWorkflowAction($reviewer); - $this->assertTrue($ret); - - /* Get current workflow state*/ - $state = $content->getWorkflowState(); - $this->assertEquals('needs review', $state->getName()); - - /* There should be two possible transitions now - * NR -- review -> NA - * NR -- reject -> RJ - */ - $nexttransitions = $workflow->getNextTransitions($state); - $this->assertIsArray($nexttransitions); - $this->assertCount(2, $nexttransitions); - - /* Check if reviewer is allowed to trigger the transition. - * As we are still in the intitial state, the possible transitions - * may both be triggered by the reviewer but not by the approver. - */ - foreach($nexttransitions as $nexttransition) { - if($nexttransition->getNextState()->getDocumentStatus() == S_IN_WORKFLOW) - $reviewtransition = $nexttransition; - } - - /* Trigger the successful review transition. - * As there is only one reviewer the transition will fire and the workflow - * moves forward into the next state. triggerWorkflowTransition() returns the - * next state. - */ - $nextstate = $content->triggerWorkflowTransition($reviewer, $reviewtransition, 'Review succeeded'); - $this->assertIsObject($nextstate); - $this->assertEquals('needs approval', $nextstate->getName()); - - /* Get current workflow state*/ - $state = $content->getWorkflowState(); - $this->assertEquals('needs approval', $state->getName()); - - /* The workflow log has one entry now */ - $workflowlogs = $content->getWorkflowLog(); - $this->assertIsArray($workflowlogs); - $this->assertCount(1, $workflowlogs); - if(self::$dbversion['major'] > 5) - $this->assertEquals('Review succeeded', $workflowlogs[1][0]->getComment()); - else - $this->assertEquals('Review succeeded', $workflowlogs[0]->getComment()); - - $ret = $content->rewindWorkflow(); - $this->assertTrue($ret); - - /* After rewinding the workflow the initial state is set ... */ - $state = $content->getWorkflowState(); - $this->assertEquals('needs review', $state->getName()); - - /* and the workflow log has been cleared */ - $workflowlogs = $content->getWorkflowLog(); - $this->assertIsArray($workflowlogs); - $this->assertCount(0, $workflowlogs); - } - - /** - * Test method getTransitionsByStates() - * - * This method uses a real in memory sqlite3 database. - * - * @return void - */ - public function testTransitionsByStateWorkflow() - { - $rootfolder = self::$dms->getRootFolder(); - $user = self::$dms->getUser(1); - $this->assertIsObject($user); - - /* Add a new user who will be the reviewer */ - $reviewer = self::$dms->addUser('reviewer', 'reviewer', 'Reviewer One', 'user1@seeddms.org', 'en_GB', 'bootstrap', ''); - $this->assertIsObject($reviewer); - - /* Add a new user who will be the approver */ - $approver = self::$dms->addUser('approver', 'approver', 'Approver One', 'user1@seeddms.org', 'en_GB', 'bootstrap', ''); - $this->assertIsObject($approver); - - $workflow = self::createWorkflow($reviewer, $approver); - - /* Check the initial state */ - $initstate = $workflow->getInitState(); - $this->assertEquals('needs review', $initstate->getName()); - - /* init state has two transistions linked to it */ - $transitions = $initstate->getTransitions(); - $this->assertIsArray($transitions); - $this->assertCount(2, $transitions); - - $t = $workflow->getTransitionsByStates($initstate, $transitions[1]->getNextState()); - $this->assertEquals($transitions[1]->getId(), $t[0]->getId()); - } - -} diff --git a/SeedDMS_Lucene/CHANGELOG.md b/SeedDMS_Lucene/CHANGELOG.md deleted file mode 100644 index ce4685461..000000000 --- a/SeedDMS_Lucene/CHANGELOG.md +++ /dev/null @@ -1,94 +0,0 @@ -1.1.18 (2023-01-09) ---------------------- -- IndexedDocument() accepts a callable for conversion to text -- SeedDMS_Lucene_Search::open and create return itself but Zend_Search_Lucene - -1.1.17 (2021-05-10) ---------------------- -- close pipes in execWithTimeout(), also return exit code of command - - -1.1.16 (2020-12-12) ---------------------- -- add indexing of folders - -1.1.15 (2020-09-10) ---------------------- -- add searching for document status -- better error handling if opening index fails -- parameters for SeedDMS_Lucene_Search::search() has changed -- SeedDMS_Lucene_Search::search() returns array of hits, count and facets -- pass config array instead of index directory to SeedDMS_Lucene_Indexer::create() - and SeedDMS_Lucene_Indexer::open() - -1.1.14 (2020-09-02) ---------------------- -- Index users with at least read access on the document - -1.1.13 (2018-04-11) ---------------------- -- IndexedDocument() remembers cmd and mimetype - -1.1.12 (2018-01-30) ---------------------- -- execWithTimeout() reads data from stderr and saves it into error msg - -1.1.11 (2017-12-04) ---------------------- -- allow conversion commands for mimetypes with wildcards - -1.1.10 (2017-03-01) ---------------------- -- catch exception in execWithTimeout() - -1.1.9 (2016-04-28) ---------------------- -- pass variables to stream_select() to fullfill strict standards. -- make all functions in Indexer.php static - -1.1.8 (2016-03-29) ---------------------- -- set last parameter of stream_select() to 200000 micro sec. in case the timeout in sec. is set to 0 - -1.1.7 (2016-02-01) ---------------------- -- add command for indexing postѕcript files - -1.1.6 (2015-08-05) ---------------------- -- run external commands with a timeout - -1.1.5 (2014-07-30) ---------------------- -- field for original filename is treated as utf-8 -- declare SeeDMS_Lucene_Indexer::open() static - -1.1.4 (2013-08-13) ---------------------- -- class SeedDMS_Lucene_Search::search returns false if query is invalid instead of an empty result record - -1.1.3 (2013-06-27) ---------------------- -- explicitly set encoding to utf-8 when adding fields -- do not check if deleting document from index fails, update it in any case - -1.1.2 (2013-06-17) ---------------------- -- parse query term and catch errors before using it - -1.1.1 (2012-12-03) ---------------------- -- catch exception if index is opened but not available - -1.1.0 (2012-11-06) ---------------------- -- use a configurable list of mime type converters, fixed indexing and searching - of special chars like german umlaute. - -1.0.1 (2011-11-06) ---------------------- -- New Release - -0.0.1 (2009-04-27) ---------------------- - diff --git a/SeedDMS_Lucene/Lucene.php b/SeedDMS_Lucene/Lucene.php deleted file mode 100644 index 96dee03e3..000000000 --- a/SeedDMS_Lucene/Lucene.php +++ /dev/null @@ -1,44 +0,0 @@ - diff --git a/SeedDMS_Lucene/Lucene/IndexedDocument.php b/SeedDMS_Lucene/Lucene/IndexedDocument.php deleted file mode 100644 index c8e76b26c..000000000 --- a/SeedDMS_Lucene/Lucene/IndexedDocument.php +++ /dev/null @@ -1,266 +0,0 @@ - - * @copyright Copyright (C) 2010, Uwe Steinmann - * @version Release: @package_version@ - */ - - -/** - * Class for managing an indexed document. - * - * @category DMS - * @package SeedDMS_Lucene - * @version @version@ - * @author Uwe Steinmann - * @copyright Copyright (C) 2011, Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_Lucene_IndexedDocument extends Zend_Search_Lucene_Document { - - /** - * @var string - */ - protected $errormsg; - - /** - * @var string - */ - protected $mimetype; - - /** - * @var string - */ - protected $cmd; - - /** - * Run a shell command - * - * @param $cmd - * @param int $timeout - * @return array - * @throws Exception - */ - static function execWithTimeout($cmd, $timeout=2) { /* {{{ */ - $descriptorspec = array( - 0 => array("pipe", "r"), - 1 => array("pipe", "w"), - 2 => array("pipe", "w") - ); - $pipes = array(); - - $timeout += time(); - // Putting an 'exec' before the command will not fork the command - // and therefore not create any child process. proc_terminate will - // then reliably terminate the cmd and not just shell. See notes of - // https://www.php.net/manual/de/function.proc-terminate.php - $process = proc_open('exec '.$cmd, $descriptorspec, $pipes); - if (!is_resource($process)) { - throw new Exception("proc_open failed on: " . $cmd); - } - stream_set_blocking($pipes[1], 0); - stream_set_blocking($pipes[2], 0); - - $output = $error = ''; - $timeleft = $timeout - time(); - $read = array($pipes[1], $pipes[2]); - $write = NULL; - $exeptions = NULL; - do { - $num_changed_streams = stream_select($read, $write, $exeptions, $timeleft, 200000); - - if ($num_changed_streams === false) { - proc_terminate($process); - throw new Exception("stream select failed on: " . $cmd); - } elseif ($num_changed_streams > 0) { - $output .= fread($pipes[1], 8192); - $error .= fread($pipes[2], 8192); - } - $timeleft = $timeout - time(); - } while (!feof($pipes[1]) && $timeleft > 0); - - fclose($pipes[0]); - fclose($pipes[1]); - fclose($pipes[2]); - if ($timeleft <= 0) { - proc_terminate($process); - throw new Exception("command timeout on: " . $cmd); - } else { - $return_value = proc_close($process); - return array('stdout'=>$output, 'stderr'=>$error, 'return'=>$return_value); - } - } /* }}} */ - - /** - * Constructor. Creates our indexable document and adds all - * necessary fields to it using the passed in document - * @param SeedDMS_Core_DMS $dms - * @param SeedDMS_Core_Document|Folder $document - * @param null $convcmd - * @param bool $nocontent - * @param int $timeout - */ - public function __construct($dms, $document, $convcmd=null, $nocontent=false, $timeout=5) { /* {{{ */ - $this->errormsg = ''; - $this->cmd = ''; - $this->mimetype = ''; - - $this->addField(Zend_Search_Lucene_Field::Text('title', $document->getName(), 'utf-8')); - if($acllist = $document->getReadAccessList(1, 1, 1)) { - $allu = []; - foreach($acllist['users'] as $u) - $allu[] = $u->getLogin(); - $this->addField(Zend_Search_Lucene_Field::Text('users', implode(' ', $allu), 'utf-8')); - /* - $allg = []; - foreach($acllist['groups'] as $g) - $allg[] = $g->getName(); - $this->addField(Zend_Search_Lucene_Field::Text('groups', implode(' ', $allg), 'utf-8')); - */ - } - if($attributes = $document->getAttributes()) { - foreach($attributes as $attribute) { - $attrdef = $attribute->getAttributeDefinition(); - if($attrdef->getValueSet() != '') - $this->addField(Zend_Search_Lucene_Field::Keyword('attr_'.str_replace(' ', '_', $attrdef->getName()), $attribute->getValue(), 'utf-8')); - else - $this->addField(Zend_Search_Lucene_Field::Text('attr_'.str_replace(' ', '_', $attrdef->getName()), $attribute->getValue(), 'utf-8')); - } - } - $owner = $document->getOwner(); - $this->addField(Zend_Search_Lucene_Field::Text('owner', $owner->getLogin(), 'utf-8')); - if($comment = $document->getComment()) { - $this->addField(Zend_Search_Lucene_Field::Text('comment', $comment, 'utf-8')); - } - $tmp = explode(':', substr($document->getFolderList(), 1, -1)); - foreach($tmp as $t) - $this->addField(Zend_Search_Lucene_Field::Keyword('path', $t)); -// $this->addField(Zend_Search_Lucene_Field::Keyword('path', str_replace(':', 'x', $document->getFolderList()))); - - if($document->isType('document')) { - $this->addField(Zend_Search_Lucene_Field::Keyword('document_id', 'D'.$document->getID())); - $this->addField(Zend_Search_Lucene_Field::Keyword('record_type', 'document')); - $version = $document->getLatestContent(); - if($version) { - $this->addField(Zend_Search_Lucene_Field::Keyword('mimetype', $version->getMimeType())); - $this->addField(Zend_Search_Lucene_Field::Keyword('origfilename', $version->getOriginalFileName(), 'utf-8')); - $this->addField(Zend_Search_Lucene_Field::UnIndexed('created', $version->getDate())); - if(!$nocontent) - $this->addField(Zend_Search_Lucene_Field::UnIndexed('indexed', time())); - if($attributes = $version->getAttributes()) { - foreach($attributes as $attribute) { - $attrdef = $attribute->getAttributeDefinition(); - if($attrdef->getValueSet() != '') - $this->addField(Zend_Search_Lucene_Field::Keyword('attr_'.str_replace(' ', '_', $attrdef->getName()), $attribute->getValue(), 'utf-8')); - else - $this->addField(Zend_Search_Lucene_Field::Text('attr_'.str_replace(' ', '_', $attrdef->getName()), $attribute->getValue(), 'utf-8')); - } - } - } - if($categories = $document->getCategories()) { - $names = array(); - foreach($categories as $cat) { - $names[] = $cat->getName(); - } - $this->addField(Zend_Search_Lucene_Field::Text('category', implode(' ', $names), 'utf-8')); - } - - if($keywords = $document->getKeywords()) { - $this->addField(Zend_Search_Lucene_Field::Text('keywords', $keywords, 'utf-8')); - } - if($version) { - $status = $version->getStatus(); - $this->addField(Zend_Search_Lucene_Field::Keyword('status', $status['status'], 'utf-8')); - } - if($version && !$nocontent) { - $path = $dms->contentDir . $version->getPath(); - if(file_exists($path)) { - $mimetype = $version->getMimeType(); - $this->mimetype = $mimetype; - if(is_callable($convcmd)) { - $result = $convcmd($document); - if($result['content']) { - self::setContent($result['content']); - } elseif($result['content'] === false) { - $this->errormsg = $result['errormsg']; - } - $this->cmd = $result['cmd']; - } elseif(is_object($convcmd) && (get_class($convcmd) == 'SeedDMS_ConversionMgr')) { - if($service = $convcmd->getService($mimetype, 'text/plain')) { - $content = $convcmd->convert($path, $mimetype, 'text/plain'); - if($content) { - self::setContent($content); - } elseif($content === false) { - $this->errormsg = 'Conversion failed'; - } - $this->cmd = get_class($service); - } else { - $this->cmd = 'No service to convert '.$mimetype.' to text/plain'; - } - } else { - $content = ''; - $cmd = ''; - $mimeparts = explode('/', $mimetype, 2); - if(isset($convcmd[$mimetype])) { - $cmd = sprintf($convcmd[$mimetype], $path); - } elseif(isset($convcmd[$mimeparts[0].'/*'])) { - $cmd = sprintf($convcmd[$mimetype], $path); - } elseif(isset($convcmd['*'])) { - $cmd = sprintf($convcmd[$mimetype], $path); - } - if($cmd) { - $this->cmd = $cmd; - try { - $content = self::execWithTimeout($cmd, $timeout); - if($content['stdout']) { - self::setContent($content['stdout']); - // $this->addField(Zend_Search_Lucene_Field::UnStored('content', $content['stdout'], 'utf-8')); - } - if($content['stderr']) { - $this->errormsg = $content['stderr']; - } - } catch (Exception $e) { - } - } - } - } - } - } elseif($document->isType('folder')) { - $this->addField(Zend_Search_Lucene_Field::Keyword('document_id', 'F'.$document->getID())); - $this->addField(Zend_Search_Lucene_Field::Keyword('record_type', 'folder')); - $this->addField(Zend_Search_Lucene_Field::UnIndexed('created', $document->getDate())); - $this->addField(Zend_Search_Lucene_Field::UnIndexed('indexed', time())); - } - } /* }}} */ - - public function getErrorMsg() { /* {{{ */ - return $this->errormsg; - } /* }}} */ - - public function getMimeType() { /* {{{ */ - return $this->mimetype; - } /* }}} */ - - public function setContent($data) { /* {{{ */ - $this->addField(Zend_Search_Lucene_Field::UnStored('content', $data, 'utf-8')); - } /* }}} */ - - public function getCmd() { /* {{{ */ - return $this->cmd; - } /* }}} */ - - /* Use only for setting the command if e.g. an extension takes over the - * conversion to txt (like the office extension which uses the collabora - * conversion service). - */ - public function setCmd($cmd) { /* {{{ */ - $this->cmd = $cmd; - } /* }}} */ -} -?> diff --git a/SeedDMS_Lucene/Lucene/Indexer.php b/SeedDMS_Lucene/Lucene/Indexer.php deleted file mode 100644 index f0dee91ce..000000000 --- a/SeedDMS_Lucene/Lucene/Indexer.php +++ /dev/null @@ -1,208 +0,0 @@ - - * @copyright Copyright (C) 2010, Uwe Steinmann - * @version Release: @package_version@ - */ - - -/** - * Class for managing a lucene index. - * - * @category DMS - * @package SeedDMS_Lucene - * @version @version@ - * @author Uwe Steinmann - * @copyright Copyright (C) 2011, Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_Lucene_Indexer { - /** - * @var string $indexname name of lucene index - * @access protected - */ - protected $indexname; - - /** - * @var string $index lucene index - * @access protected - */ - protected $index; - - public function __construct($index) { - $this->index = $index; - } - - static function open($conf) { /* {{{ */ - try { - $index = Zend_Search_Lucene::open($conf['indexdir']); - if($index) - return new self($index); - else - return null; - } catch (Exception $e) { - return null; - } - } /* }}} */ - - static function create($conf) { /* {{{ */ - try { - $index = Zend_Search_Lucene::create($conf['indexdir']); - if($index) - return new self($index); - else - return null; - } catch (Exception $e) { - return null; - } - } /* }}} */ - - /** - * Do some initialization - * - */ - public function init($stopWordsFile='') { /* {{{ */ - $analyzer = new Zend_Search_Lucene_Analysis_Analyzer_Common_Utf8_CaseInsensitive(); - if($stopWordsFile && file_exists($stopWordsFile)) { - $stopWordsFilter = new Zend_Search_Lucene_Analysis_TokenFilter_StopWords(); - $stopWordsFilter->loadFromFile($stopWordsFile); - $analyzer->addFilter($stopWordsFilter); - } - - Zend_Search_Lucene_Analysis_Analyzer::setDefault($analyzer); - } /* }}} */ - - /** - * Add document to index - * - * @param object $doc indexed document of class - * SeedDMS_Lucene_IndexedDocument - * @return boolean false in case of an error, otherwise true - */ - function addDocument($doc) { /* {{{ */ - if(!$this->index) - return false; - - return $this->index->addDocument($doc); - } /* }}} */ - - /** - * Remove document from index - * - * @param object $id internal id of document - * @return boolean false in case of an error, otherwise true - */ - public function delete($id) { /* {{{ */ - if(!$this->index) - return false; - - return $this->index->delete($id); - } /* }}} */ - - /** - * Check if document was deleted - * - * @param object $id internal id of document - * @return boolean true if document was deleted - */ - public function isDeleted($id) { /* {{{ */ - if(!$this->index) - return false; - - return $this->index->isDeleted($id); - } /* }}} */ - - /** - * Search in index - * - * @param string $query - * @return array result - */ - public function find($query) { /* {{{ */ - if(!$this->index) - return false; - - return $this->index->find($query); - } /* }}} */ - - /** - * Get a single document from index - * - * @param string $id id of document - * @return boolean false in case of an error, otherwise true - */ - public function findById($id) { /* {{{ */ - if(!$this->index) - return false; - - return $this->index->findById($id); - } /* }}} */ - - /** - * Get a single document from index - * - * @param integer $id id of index record - * @return boolean false in case of an error, otherwise true - */ - public function getDocument($id, $content=true) { /* {{{ */ - if(!$this->index) - return false; - - return $this->index->getDocument($id); - } /* }}} */ - - /** - * Return list of terms in index - * - * @return array list of Zend_Lucene_Term - */ - public function terms($prefix='', $col='') { /* {{{ */ - if(!$this->index) - return false; - - return $this->index->terms(); - } /* }}} */ - - /** - * Return number of documents in index - * - * @return interger number of documents - */ - public function count() { /* {{{ */ - if(!$this->index) - return false; - - return $this->index->count(); - } /* }}} */ - - /** - * Commit changes - * - * This function does nothing! - */ - function commit() { /* {{{ */ - if(!$this->index) - return false; - - return $this->index->commit(); - } /* }}} */ - - /** - * Optimize index - * - * This function does nothing! - */ - function optimize() { /* {{{ */ - if(!$this->index) - return false; - - return $this->index->optimize(); - } /* }}} */ -} -?> diff --git a/SeedDMS_Lucene/Lucene/Search.php b/SeedDMS_Lucene/Lucene/Search.php deleted file mode 100644 index 38827a02b..000000000 --- a/SeedDMS_Lucene/Lucene/Search.php +++ /dev/null @@ -1,160 +0,0 @@ - - * @copyright Copyright (C) 2010, Uwe Steinmann - * @version Release: @package_version@ - */ - - -/** - * Class for searching in a lucene index. - * - * @category DMS - * @package SeedDMS_Lucene - * @version @version@ - * @author Uwe Steinmann - * @copyright Copyright (C) 2011, Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_Lucene_Search { - /** - * @var object $index lucene index - * @access protected - */ - protected $index; - - /** - * Create a new instance of the search - * - * @param object $index lucene index - * @return object instance of SeedDMS_Lucene_Search - */ - function __construct($index) { /* {{{ */ - $this->index = $index; - $this->version = '@package_version@'; - if($this->version[0] == '@') - $this->version = '3.0.0'; - } /* }}} */ - - /** - * Get document from index - * - * @param object $index lucene index - * @return object instance of SeedDMS_Lucene_Document of false - */ - function getDocument($id) { /* {{{ */ - $hits = $this->index->find('document_id:D'.$id); - return $hits ? $hits[0] : false; - } /* }}} */ - - /** - * Get folder from index - * - * @param object $index lucene index - * @return object instance of SeedDMS_Lucene_Document of false - */ - function getFolder($id) { /* {{{ */ - $hits = $this->index->find('document_id:F'.$id); - return $hits ? $hits[0] : false; - } /* }}} */ - - /** - * Search in index - * - * @param object $index lucene index - * @return object instance of SeedDMS_Lucene_Search - */ - function search($term, $fields=array(), $limit=array()) { /* {{{ */ - $querystr = ''; - $term = trim($term); - if($term) { - $querystr = substr($term, -1) != '*' ? $term.'*' : $term; - } - if(!empty($fields['owner'])) { - if(is_string($fields['owner'])) { - if($querystr) - $querystr .= ' && '; - $querystr .= 'owner:'.$fields['owner']; - } elseif(is_array($fields['owner'])) { - if($querystr) - $querystr .= ' && '; - $querystr .= '(owner:"'; - $querystr .= implode('" || owner:"', $fields['owner']); - $querystr .= '")'; - } - } - if(!empty($fields['record_type'])) { - if($querystr) - $querystr .= ' && '; - $querystr .= '(record_type:'; - $querystr .= implode(' || record_type:', $fields['record_type']); - $querystr .= ')'; - } - if(!empty($fields['category'])) { - if($querystr) - $querystr .= ' && '; - $querystr .= '(category:"'; - $querystr .= implode('" && category:"', $fields['category']); - $querystr .= '")'; - } - if(!empty($fields['status'])) { - if($querystr) - $querystr .= ' && '; - $querystr .= '(status:"'; - $querystr .= implode('" || status:"', $fields['status']); - $querystr .= '")'; - } - if(!empty($fields['user'])) { - if($querystr) - $querystr .= ' && '; - $querystr .= '(users:"'; - $querystr .= implode('" || users:"', $fields['user']); - $querystr .= '")'; - } - if(!empty($fields['rootFolder']) && $fields['rootFolder']->getFolderList()) { - if($querystr) - $querystr .= ' && '; - $querystr .= '(path:"'; - $tmp[] = $fields['rootFolder']->getID(); - $querystr .= implode('" && path:"', $tmp); - //$querystr .= $fields['rootFolder']->getFolderList().$fields['rootFolder']->getID().':'; - $querystr .= '")'; - } - if(!empty($fields['startFolder']) && $fields['startFolder']->getFolderList()) { - if($querystr) - $querystr .= ' && '; - $querystr .= '(path:"'; -// $querystr .= str_replace(':', 'x', $fields['startFolder']->getFolderList().$fields['startFolder']->getID().':'); - $tmp = array();//explode(':', substr($fields['startFolder']->getFolderList(), 1, -1)); - $tmp[] = $fields['startFolder']->getID(); - $querystr .= implode('" && path:"', $tmp); -// $querystr .= str_replace(':', ' ', $fields['startFolder']->getFolderList().$fields['startFolder']->getID()); - $querystr .= '")'; - } - try { - $query = Zend_Search_Lucene_Search_QueryParser::parse($querystr); - try { - $hits = $this->index->find($query); - $recs = array(); - $c = 0; - foreach($hits as $hit) { - if($c >= $limit['offset'] && ($c-$limit['offset'] < $limit['limit'])) - $recs[] = array('id'=>$hit->id, 'document_id'=>$hit->document_id); - $c++; - } - return array('count'=>count($hits), 'hits'=>$recs, 'facets'=>array()); - } catch (Zend_Search_Lucene_Exception $e) { - return false; - } - } catch (Zend_Search_Lucene_Search_QueryParserException $e) { - return false; - } - } /* }}} */ -} -?> diff --git a/SeedDMS_Lucene/composer.json b/SeedDMS_Lucene/composer.json deleted file mode 100644 index 68a37caaf..000000000 --- a/SeedDMS_Lucene/composer.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "seeddms/lucene", - "description": "Lucene based fulltext search for SeedDMS ", - "type": "library", - "license": "GPL-2.0-or-later", - "minimum-stability": "dev", - "autoload": { - "psr-4": { - "Seeddms\\Lucene\\": "Lucene/" - }, - "classmap": ["Lucene/"] - }, - "authors": [ - { - "name": "Uwe Steinmann", - "email": "info@seeddms.org" - } - ], - "require-dev": { - "phpunit/phpunit": "^9" - } - -} diff --git a/SeedDMS_Lucene/package.xml b/SeedDMS_Lucene/package.xml deleted file mode 100644 index eeb33269a..000000000 --- a/SeedDMS_Lucene/package.xml +++ /dev/null @@ -1,389 +0,0 @@ - - - SeedDMS_Lucene - pear.php.net - Fulltext search for SeedDMS - SeedDMS is a web based document management system (DMS). This is - the fulltext search engine for it, based on Lucene. - - Uwe Steinmann - steinm - uwe@steinmann.cx - yes - - 2023-01-09 - - - 1.1.18 - 1.1.18 - - - stable - stable - - GPL License - -- IndexedDocument() accepts a callable for conversion to text -- SeedDMS_Lucene_Search::open and create return itself but Zend_Search_Lucene - - - - - - - - - - - - - - - - - - - - - - - - - 4.3.0 - - - 1.5.4 - - - - - - - 2009-04-27 - - 0.0.1 - 0.0.1 - - - alpha - alpha - - BSD License - - - - - 2011-11-06 - - - 1.0.1 - 1.0.0 - - - beta - beta - - GPL License - -- New Release - - - - 2012-11-06 - - - 1.1.0 - 1.1.0 - - - beta - beta - - GPL License - -- use a configurable list of mime type converters, fixed indexing and searching - of special chars like german umlaute. - - - - 2012-12-03 - - - 1.1.1 - 1.1.1 - - - stable - stable - - GPL License - -- catch exception if index is opened but not available - - - - 2013-06-17 - - - 1.1.2 - 1.1.1 - - - stable - stable - - GPL License - -- parse query term and catch errors before using it - - - - 2013-06-27 - - - 1.1.3 - 1.1.1 - - - stable - stable - - GPL License - -- explicitly set encoding to utf-8 when adding fields -- do not check if deleting document from index fails, update it in any case - - - - 2013-08-13 - - - 1.1.4 - 1.1.4 - - - stable - stable - - GPL License - -- class SeedDMS_Lucene_Search::search returns false if query is invalid instead of an empty result record - - - - 2014-07-30 - - - 1.1.5 - 1.1.5 - - - stable - stable - - GPL License - -- field for original filename is treated as utf-8 -- declare SeeDMS_Lucene_Indexer::open() static - - - - 2015-08-05 - - - 1.1.6 - 1.1.6 - - - stable - stable - - GPL License - -- run external commands with a timeout - - - - 2016-02-01 - - - 1.1.7 - 1.1.7 - - - stable - stable - - GPL License - -- add command for indexing postѕcript files - - - - 2016-03-29 - - - 1.1.8 - 1.1.7 - - - stable - stable - - GPL License - -- set last parameter of stream_select() to 200000 micro sec. in case the timeout in sec. is set to 0 - - - - 2016-04-28 - - - 1.1.9 - 1.1.7 - - - stable - stable - - GPL License - -- pass variables to stream_select() to fullfill strict standards. -- make all functions in Indexer.php static - - - - 2017-03-01 - - - 1.1.10 - 1.1.10 - - - stable - stable - - GPL License - -- catch exception in execWithTimeout() - - - - 2017-12-04 - - - 1.1.11 - 1.1.11 - - - stable - stable - - GPL License - -- allow conversion commands for mimetypes with wildcards - - - - 2018-01-30 - - - 1.1.12 - 1.1.12 - - - stable - stable - - GPL License - -- execWithTimeout() reads data from stderr and saves it into error msg - - - - 2018-04-11 - - - 1.1.13 - 1.1.13 - - - stable - stable - - GPL License - -- IndexedDocument() remembers cmd and mimetype - - - - 2020-09-02 - - - 1.1.14 - 1.1.14 - - - stable - stable - - GPL License - -- Index users with at least read access on the document - - - - 2020-09-10 - - - 1.1.15 - 1.1.15 - - - stable - stable - - GPL License - -- add searching for document status -- better error handling if opening index fails -- parameters for SeedDMS_Lucene_Search::search() has changed -- SeedDMS_Lucene_Search::search() returns array of hits, count and facets -- pass config array instead of index directory to SeedDMS_Lucene_Indexer::create() - and SeedDMS_Lucene_Indexer::open() - - - - 2020-12-12 - - - 1.1.16 - 1.1.16 - - - stable - stable - - GPL License - -- add indexing of folders - - - - 2021-05-10 - - - 1.1.17 - 1.1.17 - - - stable - stable - - GPL License - -- close pipes in execWithTimeout(), also return exit code of command - - - - diff --git a/SeedDMS_Preview/CHANGELOG.md b/SeedDMS_Preview/CHANGELOG.md deleted file mode 100644 index 76b1546c5..000000000 --- a/SeedDMS_Preview/CHANGELOG.md +++ /dev/null @@ -1,128 +0,0 @@ -1.5.0 (2023-01-09) ---------------------- -- add previewer which creates txt - -1.4.0 (2021-10-16) ---------------------- -- use new conversion service if available -- createRawPreview() checks early if a converter exists - - -1.3.3 (2020-12-23) ---------------------- -- close pipes in execWithTimeout(), also return exit code of command -- createPreview() has optional parameter by referenz to return true if a - preview image was actually created - -1.3.2 (2020-12-23) ---------------------- -- set header Content-Length -- update package description - -1.3.1 (2020-03-21) ---------------------- -- add parameter $target to SeedDMS_Preview_pdfPreviewer::hasRawPreview() and SeedDMS_Preview_pdfPreviewer::getRawPreview() - -1.3.0 (2020-02-17) ---------------------- -- add new methode getPreviewFile() - -1.2.10 (2019-02-11) ---------------------- -- new parameter for enabling/disabling xsendfile -- fix creation of pdf preview if document content class is not SeedDMS_Core_DocumentContent - -1.2.9 (2018-07-13) ---------------------- -- make sure list of converters is always an array -- usage of mod_sendfile can be configured - -1.2.8 (2018-03-08) ---------------------- -- preview is also created if SeedDMS_Core_DocumentContent has a child class - -1.2.7 (2018-01-18) ---------------------- -- add SeedDMS_Preview_Base::sendFile() as a replacement for readfile() which uses -- mod_xsendfile if available -- execWithTimeout() reads data from stderr and returns it together with stdout in array - -1.2.6 (2017-12-04) ---------------------- -- SeedDMS_Preview_Base::setConverters() overrides existing converters. -- New method SeedDMS_Preview_Base::addConverters() merges new converters with old ones. - -1.2.5 (2017-10-11) ---------------------- -- SeedDMS_Preview_Base::hasConverter() returns only try if command is set - -1.2.4 (2017-10-11) ---------------------- -- fix typo in converter for tar.gz files - -1.2.3 (2017-09-18) ---------------------- -- createPreview() returns false if running the converter command fails - -1.2.2 (2017-03-02) ---------------------- -- commands can be set for mimetypes 'xxxx/*' and '*' -- pass mimetype as parameter '%m' to converter - -1.2.1 (2016-11-15) ---------------------- -- setConverters() overrides exiting converters - -1.2.0 (2016-11-07) ---------------------- -- add new previewer which converts document to pdf instead of png - -1.1.9 (2016-04-26) ---------------------- -- add more documentation -- finish deletePreview() -- add new method deleteDocumentPreviews() -- fix calculation of timeout (Bug #269) -- check if cache dir exists before deleting it in deleteDocumentPreviews() - -1.1.8 (2016-04-05) ---------------------- -- pass variables to stream_select (required by php7) - -1.1.7 (2016-03-29) ---------------------- -- set last parameter of stream_select() to 200000 micro sec. in case the timeout in sec. is set to 0 - -1.1.6 (2016-03-08) ---------------------- -- check if object passed to createPreview(), hasPreview() is not null - -1.1.5 (2016-02-11) ---------------------- -- add method getFilesize() -- timeout for external commands can be passed to contructor of SeedDMS_Preview_Previewer - -1.1.4 (2015-08-08) ---------------------- -- command for creating the preview will be called with a given timeout - -1.1.3 (2015-02-13) ---------------------- -- preview images will also be recreated if the object this image belongs is of newer date than the image itself. This happens if versions are being deleted and than a new version is uploaded. Because the new version will get the version number of the old version, it will also take over the old preview image.Comparing the creation date of the image with the object detects this case. - -1.1.2 (2014-04-10) ---------------------- -- create fixed width image with proportional height - -1.1.1 (2014-03-18) ---------------------- -- add converters for .tar.gz, .ps, .txt - -1.1.0 (2013-04-29) ---------------------- -- preview image can also be created from a document file (SeedDMS_Core_DocumentFile) - -1.0.0 (2012-11-20) ---------------------- -- initial version - diff --git a/SeedDMS_Preview/Preview.php b/SeedDMS_Preview/Preview.php deleted file mode 100644 index ce5853001..000000000 --- a/SeedDMS_Preview/Preview.php +++ /dev/null @@ -1,39 +0,0 @@ - diff --git a/SeedDMS_Preview/Preview/Base.php b/SeedDMS_Preview/Preview/Base.php deleted file mode 100644 index 9fb401ada..000000000 --- a/SeedDMS_Preview/Preview/Base.php +++ /dev/null @@ -1,247 +0,0 @@ - - * @copyright Copyright (C) 2010, Uwe Steinmann - * @version Release: @package_version@ - */ - - -/** - * Class for managing creation of preview images for documents. - * - * @category DMS - * @package SeedDMS_Preview - * @version @version@ - * @author Uwe Steinmann - * @copyright Copyright (C) 2011, Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_Preview_Base { - /** - * @var string $cacheDir location in the file system where all the - * cached data like thumbnails are located. This should be an - * absolute path. - * @access public - */ - public $previewDir; - - /** - * @var array $converters list of mimetypes and commands for converting - * file into preview image - * @access protected - */ - protected $converters; - - /** - * @var object $conversionmgr - * @access protected - */ - protected $conversionmgr; - - /** - * @var integer $timeout maximum time for execution of external commands - * @access protected - */ - protected $timeout; - - /** - * @var boolean $xsendfile set to true if mod_xѕendfile is to be used - * @access protected - */ - protected $xsendfile; - - /** - * @var string $lastpreviewfile will be set to the file name of the last preview - * @access protected - */ - protected $lastpreviewfile; - - function __construct($previewDir, $timeout=5, $xsendfile=true) { /* {{{ */ - if(!is_dir($previewDir)) { - if (!SeedDMS_Core_File::makeDir($previewDir)) { - $this->previewDir = ''; - } else { - $this->previewDir = $previewDir; - } - } else { - $this->previewDir = $previewDir; - } - $this->timeout = intval($timeout); - $this->converters = array(); - $this->xsendfile = $xsendfile; - $this->conversionmgr = null; - } /* }}} */ - - /** - * Run a shell command - * - * @param $cmd - * @param int $timeout - * @return array - * @throws Exception - */ - static function execWithTimeout($cmd, $timeout=5) { /* {{{ */ - $descriptorspec = array( - 0 => array("pipe", "r"), - 1 => array("pipe", "w"), - 2 => array("pipe", "w") - ); - $pipes = array(); - - $timeout += time(); - // Putting an 'exec' before the command will not fork the command - // and therefore not create any child process. proc_terminate will - // then reliably terminate the cmd and not just shell. See notes of - // https://www.php.net/manual/de/function.proc-terminate.php - $process = proc_open('exec '.$cmd, $descriptorspec, $pipes); - if (!is_resource($process)) { - throw new Exception("proc_open failed on: " . $cmd); - } - stream_set_blocking($pipes[1], 0); - stream_set_blocking($pipes[2], 0); - - $output = $error = ''; - $timeleft = $timeout - time(); - $read = array($pipes[1], $pipes[2]); - $write = NULL; - $exeptions = NULL; - do { - $num_changed_streams = stream_select($read, $write, $exeptions, $timeleft, 200000); - - if ($num_changed_streams === false) { - proc_terminate($process); - throw new Exception("stream select failed on: " . $cmd); - } elseif ($num_changed_streams > 0) { - $output .= fread($pipes[1], 8192); - $error .= fread($pipes[2], 8192); - } - $timeleft = $timeout - time(); - } while (!feof($pipes[1]) && $timeleft > 0); - - fclose($pipes[0]); - fclose($pipes[1]); - fclose($pipes[2]); - if ($timeleft <= 0) { - proc_terminate($process); - throw new Exception("command timeout on: " . $cmd); - } else { - $return_value = proc_close($process); - return array('stdout'=>$output, 'stderr'=>$error, 'return'=>$return_value); - } - } /* }}} */ - - /** - * Get preview dir - * - * @return string name of preview directory on disc - */ - public function getPreviewDir() { /* {{{ */ - return $this->previewDir; - } /* }}} */ - - /** - * Set a list of converters - * - * Merges the list of passed converters with the already existing ones. - * Existing converters will be overwritten. - * - * @param array list of converters. The key of the array contains the mimetype - * and the value is the command to be called for creating the preview - */ - function setConverters($arr) { /* {{{ */ - if(is_array($arr)) - $this->converters = $arr; - else - $this->converters = array(); - } /* }}} */ - - /** - * Set conversion service manager - * - * A conversion manager is a service for converting files from one format - * to another format. - * - * @param object $conversionmgr - */ - function setConversionMgr($conversionmgr) { /* {{{ */ - $this->conversionmgr = $conversionmgr; - } /* }}} */ - - /** - * Enable/Disable xsendfile extension - * - * Merges the list of passed converters with the already existing ones. - * Existing converters will be overwritten. - * - * @param boolean $xsendfile turn on/off use of xsendfile module in apache - */ - function setXsendfile($xsendfile) { /* {{{ */ - $this->xsendfile = $xsendfile; - } /* }}} */ - - /** - * Add a list of converters - * - * Merges the list of passed converters with the already existing ones. - * Existing converters will be overwritten. - * - * @param array list of converters. The key of the array contains the mimetype - * and the value is the command to be called for creating the preview - */ - function addConverters($arr) { /* {{{ */ - $this->converters = array_merge($this->converters, $arr); - } /* }}} */ - - /** - * Check if converter for a given mimetype is set - * - * @param string $from from mimetype - * @param string $to to mimetype - * - * @return boolean true if converter exists, otherwise false - */ - function hasConverter($from, $to='') { /* {{{ */ - if($this->conversionmgr) - return $this->conversionmgr->hasService($from, $to); - else - return array_key_exists($from, $this->converters) && $this->converters[$from]; - } /* }}} */ - - /** - * Send a file from disk to the browser - * - * This function uses either readfile() or the xѕendfile apache module if - * it is installed. - * - * @param string $filename - */ - protected function sendFile($filename) { /* {{{ */ - if($this->xsendfile && function_exists('apache_get_modules') && in_array('mod_xsendfile',apache_get_modules())) { - header("X-Sendfile: ".$filename); - } else { - $size = filesize($filename); - header("Content-Length: " . $size); - /* Make sure output buffering is off */ - if (ob_get_level()) { - ob_end_clean(); - } - readfile($filename); - } - } /* }}} */ - - /** - * Return path of last created preview file - * - * @return string - */ - public function getPreviewFile() { /* {{{ */ - return $this->lastpreviewfile; - } /* }}} */ -} - diff --git a/SeedDMS_Preview/Preview/PdfPreviewer.php b/SeedDMS_Preview/Preview/PdfPreviewer.php deleted file mode 100644 index 2a219b476..000000000 --- a/SeedDMS_Preview/Preview/PdfPreviewer.php +++ /dev/null @@ -1,309 +0,0 @@ - - * @copyright Copyright (C) 2010, Uwe Steinmann - * @version Release: @package_version@ - */ - - -/** - * Class for managing creation of pdf preview for documents. - * - * @category DMS - * @package SeedDMS_Preview - * @version @version@ - * @author Uwe Steinmann - * @copyright Copyright (C) 2011, Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_Preview_PdfPreviewer extends SeedDMS_Preview_Base { - - function __construct($previewDir, $timeout=5, $xsendfile=true) { /* {{{ */ - parent::__construct($previewDir.DIRECTORY_SEPARATOR.'pdf', $timeout, $xsendfile); - $this->converters = array( - ); - } /* }}} */ - - /** - * Return the physical filename of the preview image on disc - * including the path - * - * @param object $object document content or document file - * @return string file name of preview image - */ - public function getFileName($object) { /* {{{ */ - if(!$object) - return false; - - $document = $object->getDocument(); - $dms = $document->_dms; - $dir = $this->previewDir.DIRECTORY_SEPARATOR.$document->getDir(); - switch(get_class($object)) { - case $dms->getClassname('documentcontent'): - $target = $dir.'p'.$object->getVersion(); - break; - case $dms->getClassname('documentfile'): - $target = $dir.'f'.$object->getID(); - break; - default: - return false; - } - return $target; - } /* }}} */ - - /** - * Check if converter for a given mimetype is set - * - * @param string $mimetype from mimetype - * - * @return boolean true if converter exists, otherwise false - */ - function hasConverter($from, $to='') { /* {{{ */ - return parent::hasConverter($from, 'application/pdf'); - } /* }}} */ - - /** - * Create a pdf preview for a given file - * - * This method creates a preview in pdf format for a regular file - * in the file system and stores the result in the directory $dir relative - * to the configured preview directory. The filename of the resulting preview - * image is either $target.pdf (if set) or md5($infile).pdf. - * The $mimetype is used to select the propper conversion programm. - * An already existing pdf preview is replaced. - * - * @param string $infile name of input file including full path - * @param string $dir directory relative to $this->previewDir - * @param string $mimetype MimeType of input file - * @param string $target optional name of preview image (without extension) - * @return boolean true on success, false on failure - */ - public function createRawPreview($infile, $dir, $mimetype, $target='') { /* {{{ */ - if(!self::hasConverter($mimetype)) - return false; - - if(!$this->previewDir) - return false; - if(!is_dir($this->previewDir.DIRECTORY_SEPARATOR.$dir)) { - if (!SeedDMS_Core_File::makeDir($this->previewDir.DIRECTORY_SEPARATOR.$dir)) { - return false; - } - } - if(!file_exists($infile)) - return false; - if(!$target) - $target = $this->previewDir.$dir.md5($infile); - $this->lastpreviewfile = $target.'.pdf'; - if($target != '' && (!file_exists($target.'.pdf') || filectime($target.'.pdf') < filectime($infile))) { - if($this->conversionmgr) { - if(!$this->conversionmgr->convert($infile, $mimetype, 'application/pdf', $target.'.pdf')) { - $this->lastpreviewfile = ''; - return false; - } - $new = true; - } else { - $cmd = ''; - $mimeparts = explode('/', $mimetype, 2); - if(isset($this->converters[$mimetype])) { - $cmd = str_replace(array('%f', '%o', '%m'), array($infile, $target.'.pdf', $mimetype), $this->converters[$mimetype]); - } elseif(isset($this->converters[$mimeparts[0].'/*'])) { - $cmd = str_replace(array('%f', '%o', '%m'), array($infile, $target.'.pdf', $mimetype), $this->converters[$mimeparts[0].'/*']); - } elseif(isset($this->converters['*'])) { - $cmd = str_replace(array('%f', '%o', '%m'), array($infile, $target.'.pdf', $mimetype), $this->converters['*']); - } - - if($cmd) { - try { - self::execWithTimeout($cmd, $this->timeout); - $new = true; - } catch(Exception $e) { - $this->lastpreviewfile = ''; - return false; - } - } - } - return true; - } - $new = false; - return true; - - } /* }}} */ - - /** - * Create preview image - * - * This function creates a preview image for the given document - * content or document file. It internally uses - * {@link SeedDMS_Preview::createRawPreview()}. The filename of the - * preview image is created by {@link SeedDMS_Preview_Previewer::getFileName()} - * - * @param object $object instance of SeedDMS_Core_DocumentContent - * or SeedDMS_Core_DocumentFile - * @return boolean true on success, false on failure - */ - public function createPreview($object) { /* {{{ */ - if(!$object) - return false; - - $document = $object->getDocument(); - $file = $document->_dms->contentDir.$object->getPath(); - $target = $this->getFileName($object); - return $this->createRawPreview($file, $document->getDir(), $object->getMimeType(), $target); - } /* }}} */ - - /** - * Check if a preview image already exists. - * - * This function is a companion to {@link SeedDMS_Preview_Previewer::createRawPreview()}. - * - * @param string $infile name of input file including full path - * @param string $dir directory relative to $this->previewDir - * @return boolean true if preview exists, otherwise false - */ - public function hasRawPreview($infile, $dir, $target='') { /* {{{ */ - if(!$this->previewDir) - return false; - if(!$target) - $target = $this->previewDir.$dir.md5($infile); - if($target !== false && file_exists($target.'.pdf') && filectime($target.'.pdf') >= filectime($infile)) { - return true; - } - return false; - } /* }}} */ - - /** - * Check if a preview image already exists. - * - * This function is a companion to {@link SeedDMS_Preview_Previewer::createPreview()}. - * - * @param object $object instance of SeedDMS_Core_DocumentContent - * or SeedDMS_Core_DocumentFile - * @return boolean true if preview exists, otherwise false - */ - public function hasPreview($object) { /* {{{ */ - if(!$object) - return false; - - if(!$this->previewDir) - return false; - $target = $this->getFileName($object); - if($target !== false && file_exists($target.'.pdf') && filectime($target.'.pdf') >= $object->getDate()) { - return true; - } - return false; - } /* }}} */ - - /** - * Return a preview image. - * - * This function returns the content of a preview image if it exists.. - * - * @param string $infile name of input file including full path - * @param string $dir directory relative to $this->previewDir - * @return boolean/string image content if preview exists, otherwise false - */ - public function getRawPreview($infile, $dir, $target='') { /* {{{ */ - if(!$this->previewDir) - return false; - - if(!$target) - $target = $this->previewDir.$dir.md5($infile); - if($target && file_exists($target.'.pdf')) { - $this->sendFile($target.'.pdf'); - } - } /* }}} */ - - /** - * Return a preview image. - * - * This function returns the content of a preview image if it exists.. - * - * @param object $object instance of SeedDMS_Core_DocumentContent - * or SeedDMS_Core_DocumentFile - * @return boolean/string image content if preview exists, otherwise false - */ - public function getPreview($object) { /* {{{ */ - if(!$this->previewDir) - return false; - - $target = $this->getFileName($object); - if($target && file_exists($target.'.pdf')) { - $this->sendFile($target.'.pdf'); - } - } /* }}} */ - - /** - * Return file size preview image. - * - * @param object $object instance of SeedDMS_Core_DocumentContent - * or SeedDMS_Core_DocumentFile - * @return boolean/integer size of preview image or false if image - * does not exist - */ - public function getFilesize($object) { /* {{{ */ - $target = $this->getFileName($object); - if($target && file_exists($target.'.pdf')) { - return(filesize($target.'.pdf')); - } else { - return false; - } - - } /* }}} */ - - /** - * Delete preview image. - * - * @param object $object instance of SeedDMS_Core_DocumentContent - * or SeedDMS_Core_DocumentFile - * @return boolean true if deletion succeded or false if file does not exist - */ - public function deletePreview($object) { /* {{{ */ - if(!$this->previewDir) - return false; - - $target = $this->getFileName($object); - if($target && file_exists($target.'.pdf')) { - return(unlink($target.'.pdf')); - } else { - return false; - } - } /* }}} */ - - static function recurseRmdir($dir) { - $files = array_diff(scandir($dir), array('.','..')); - foreach ($files as $file) { - (is_dir("$dir/$file")) ? SeedDMS_Preview_Previewer::recurseRmdir("$dir/$file") : unlink("$dir/$file"); - } - return rmdir($dir); - } - - /** - * Delete all preview images belonging to a document - * - * This function removes the preview images of all versions and - * files of a document including the directory. It actually just - * removes the directory for the document in the cache. - * - * @param object $document instance of SeedDMS_Core_Document - * @return boolean true if deletion succeded or false if file does not exist - */ - public function deleteDocumentPreviews($document) { /* {{{ */ - if(!$this->previewDir) - return false; - - $dir = $this->previewDir.DIRECTORY_SEPARATOR.$document->getDir(); - if(file_exists($dir) && is_dir($dir)) { - return SeedDMS_Preview_Previewer::recurseRmdir($dir); - } else { - return false; - } - - } /* }}} */ -} -?> diff --git a/SeedDMS_Preview/Preview/Previewer.php b/SeedDMS_Preview/Preview/Previewer.php deleted file mode 100644 index f53780e7a..000000000 --- a/SeedDMS_Preview/Preview/Previewer.php +++ /dev/null @@ -1,371 +0,0 @@ - - * @copyright Copyright (C) 2010, Uwe Steinmann - * @version Release: @package_version@ - */ - - -/** - * Class for managing creation of preview images for documents. - * - * @category DMS - * @package SeedDMS_Preview - * @version @version@ - * @author Uwe Steinmann - * @copyright Copyright (C) 2011, Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_Preview_Previewer extends SeedDMS_Preview_Base { - /** - * @var integer $width maximum width/height of resized image - * @access protected - */ - protected $width; - - /** - * Create instance of image previewer - * - * @param string $previewDir path of base directory where all images are - * stored. This directory will have a subdirectory derived from the object id. - * @param integer $width default width of an image - * @param integer $timeout timeout for shell commands to create a preview image - * @param boolean $xsendfile if set to true the apache module xsendfile will - * be used. - */ - function __construct($previewDir, $width=40, $timeout=5, $xsendfile=true) { /* {{{ */ - parent::__construct($previewDir.DIRECTORY_SEPARATOR.'png', $timeout, $xsendfile); - $this->converters = array( - ); - $this->width = intval($width); - } /* }}} */ - - /** - * Return the physical filename of the preview image on disc - * including the path - * - * @param object $object document content or document file - * @param integer $width width of preview image - * @return string file name of preview image - */ - public function getFileName($object, $width=0) { /* {{{ */ - if(!$object) - return false; - - if($width == 0) - $width = $this->width; - else - $width = intval($width); - - $document = $object->getDocument(); - $dms = $document->_dms; - $dir = $this->previewDir.DIRECTORY_SEPARATOR.$document->getDir(); - switch(get_class($object)) { - case $dms->getClassname('documentcontent'): - $target = $dir.'p'.$object->getVersion().'-'.$width; - break; - case $dms->getClassname('documentfile'): - $target = $dir.'f'.$object->getID().'-'.$width; - break; - default: - return false; - } - return $target; - } /* }}} */ - - /** - * Check if converter for a given mimetype is set - * - * @param string $mimetype from mimetype - * - * @return boolean true if converter exists, otherwise false - */ - function hasConverter($from, $to='') { /* {{{ */ - return parent::hasConverter($from, 'image/png'); - } /* }}} */ - - /** - * Create a preview image for a given file - * - * This method creates a preview image in png format for a regular file - * in the file system and stores the result in the directory $dir relative - * to the configured preview directory. The filename of the resulting preview - * image is either $target.png (if set) or md5($infile)-$width.png. - * The $mimetype is used to select the propper conversion programm. - * An already existing preview image is replaced. - * - * @param string $infile name of input file including full path - * @param string $dir directory relative to $this->previewDir - * @param string $mimetype MimeType of input file - * @param integer $width width of generated preview image - * @param string $target optional name of preview image (without extension) - * @param boolean $new will be set to true if the preview images was created - * @return boolean true on success, false on failure - */ - public function createRawPreview($infile, $dir, $mimetype, $width=0, $target='', &$new=false) { /* {{{ */ - if(!self::hasConverter($mimetype)) - return false; - - if($width == 0) - $width = $this->width; - else - $width = intval($width); - if(!$this->previewDir) - return false; - if(!is_dir($this->previewDir.DIRECTORY_SEPARATOR.$dir)) { - if (!SeedDMS_Core_File::makeDir($this->previewDir.DIRECTORY_SEPARATOR.$dir)) { - return false; - } - } - if(!file_exists($infile)) - return false; - if(!$target) - $target = $this->previewDir.$dir.md5($infile).'-'.$width; - $this->lastpreviewfile = $target.'.png'; - if($target != '' && (!file_exists($target.'.png') || filectime($target.'.png') < filectime($infile))) { - if($this->conversionmgr) { - if(!$this->conversionmgr->convert($infile, $mimetype, 'image/png', $target.'.png', array('width'=>$width))) { - $this->lastpreviewfile = ''; - return false; - } - $new = true; - } else { - $cmd = ''; - $mimeparts = explode('/', $mimetype, 2); - if(isset($this->converters[$mimetype])) { - $cmd = str_replace(array('%w', '%f', '%o', '%m'), array($width, $infile, $target.'.png', $mimetype), $this->converters[$mimetype]); - } elseif(isset($this->converters[$mimeparts[0].'/*'])) { - $cmd = str_replace(array('%w', '%f', '%o', '%m'), array($width, $infile, $target.'.png', $mimetype), $this->converters[$mimeparts[0].'/*']); - } elseif(isset($this->converters['*'])) { - $cmd = str_replace(array('%w', '%f', '%o', '%m'), array($width, $infile, $target.'.png', $mimetype), $this->converters['*']); - } - - if($cmd) { - try { - self::execWithTimeout($cmd, $this->timeout); - $new = true; - } catch(Exception $e) { - $this->lastpreviewfile = ''; - return false; - } - } - } - return true; - } - $new = false; - return true; - - } /* }}} */ - - /** - * Create preview image - * - * This function creates a preview image for the given document - * content or document file. It internally uses - * {@link SeedDMS_Preview::createRawPreview()}. The filename of the - * preview image is created by {@link SeedDMS_Preview_Previewer::getFileName()} - * - * @param object $object instance of SeedDMS_Core_DocumentContent - * or SeedDMS_Core_DocumentFile - * @param integer $width desired width of preview image - * @param boolean $new will be set to true if the preview images was created - * @return boolean true on success, false on failure - */ - public function createPreview($object, $width=0, &$new=false) { /* {{{ */ - if(!$object) - return false; - - if($width == 0) - $width = $this->width; - else - $width = intval($width); - $document = $object->getDocument(); - $file = $document->_dms->contentDir.$object->getPath(); - $target = $this->getFileName($object, $width); - return $this->createRawPreview($file, $document->getDir(), $object->getMimeType(), $width, $target, $new); - } /* }}} */ - - /** - * Check if a preview image already exists. - * - * This function is a companion to {@link SeedDMS_Preview_Previewer::createRawPreview()}. - * - * @param string $infile name of input file including full path - * @param string $dir directory relative to $this->previewDir - * @param integer $width desired width of preview image - * @return boolean true if preview exists, otherwise false - */ - public function hasRawPreview($infile, $dir, $width=0) { /* {{{ */ - if($width == 0) - $width = $this->width; - else - $width = intval($width); - if(!$this->previewDir) - return false; - $target = $this->previewDir.$dir.md5($infile).'-'.$width; - if($target !== false && file_exists($target.'.png') && filectime($target.'.png') >= filectime($infile)) { - return true; - } - return false; - } /* }}} */ - - /** - * Check if a preview image already exists. - * - * This function is a companion to {@link SeedDMS_Preview_Previewer::createPreview()}. - * - * @param object $object instance of SeedDMS_Core_DocumentContent - * or SeedDMS_Core_DocumentFile - * @param integer $width desired width of preview image - * @return boolean true if preview exists, otherwise false - */ - public function hasPreview($object, $width=0) { /* {{{ */ - if(!$object) - return false; - - if($width == 0) - $width = $this->width; - else - $width = intval($width); - if(!$this->previewDir) - return false; - $target = $this->getFileName($object, $width); - if($target !== false && file_exists($target.'.png') && filectime($target.'.png') >= $object->getDate()) { - return true; - } - return false; - } /* }}} */ - - /** - * Return a preview image. - * - * This function returns the content of a preview image if it exists.. - * - * @param string $infile name of input file including full path - * @param string $dir directory relative to $this->previewDir - * @param integer $width desired width of preview image - * @return boolean/string image content if preview exists, otherwise false - */ - public function getRawPreview($infile, $dir, $width=0) { /* {{{ */ - if($width == 0) - $width = $this->width; - else - $width = intval($width); - if(!$this->previewDir) - return false; - - $target = $this->previewDir.$dir.md5($infile).'-'.$width; - if($target && file_exists($target.'.png')) { - $this->sendFile($target.'.png'); - } - } /* }}} */ - - /** - * Return a preview image. - * - * This function returns the content of a preview image if it exists.. - * - * @param object $object instance of SeedDMS_Core_DocumentContent - * or SeedDMS_Core_DocumentFile - * @param integer $width desired width of preview image - * @return boolean/string image content if preview exists, otherwise false - */ - public function getPreview($object, $width=0) { /* {{{ */ - if($width == 0) - $width = $this->width; - else - $width = intval($width); - if(!$this->previewDir) - return false; - - $target = $this->getFileName($object, $width); - if($target && file_exists($target.'.png')) { - $this->sendFile($target.'.png'); - } - } /* }}} */ - - /** - * Return file size preview image. - * - * @param object $object instance of SeedDMS_Core_DocumentContent - * or SeedDMS_Core_DocumentFile - * @param integer $width desired width of preview image - * @return boolean/integer size of preview image or false if image - * does not exist - */ - public function getFilesize($object, $width=0) { /* {{{ */ - if($width == 0) - $width = $this->width; - else - $width = intval($width); - $target = $this->getFileName($object, $width); - if($target && file_exists($target.'.png')) { - return(filesize($target.'.png')); - } else { - return false; - } - - } /* }}} */ - - /** - * Delete preview image. - * - * @param object $object instance of SeedDMS_Core_DocumentContent - * or SeedDMS_Core_DocumentFile - * @param integer $width desired width of preview image - * @return boolean true if deletion succeded or false if file does not exist - */ - public function deletePreview($object, $width=0) { /* {{{ */ - if($width == 0) - $width = $this->width; - else - $width = intval($width); - if(!$this->previewDir) - return false; - - $target = $this->getFileName($object, $width); - if($target && file_exists($target.'.png')) { - return(unlink($target.'.png')); - } else { - return false; - } - } /* }}} */ - - static function recurseRmdir($dir) { - $files = array_diff(scandir($dir), array('.','..')); - foreach ($files as $file) { - (is_dir("$dir/$file")) ? SeedDMS_Preview_Previewer::recurseRmdir("$dir/$file") : unlink("$dir/$file"); - } - return rmdir($dir); - } - - /** - * Delete all preview images belonging to a document - * - * This function removes the preview images of all versions and - * files of a document including the directory. It actually just - * removes the directory for the document in the cache. - * - * @param object $document instance of SeedDMS_Core_Document - * @return boolean true if deletion succeded or false if file does not exist - */ - public function deleteDocumentPreviews($document) { /* {{{ */ - if(!$this->previewDir) - return false; - - $dir = $this->previewDir.DIRECTORY_SEPARATOR.$document->getDir(); - if(file_exists($dir) && is_dir($dir)) { - return SeedDMS_Preview_Previewer::recurseRmdir($dir); - } else { - return false; - } - - } /* }}} */ -} -?> diff --git a/SeedDMS_Preview/Preview/TxtPreviewer.php b/SeedDMS_Preview/Preview/TxtPreviewer.php deleted file mode 100644 index 7826ff793..000000000 --- a/SeedDMS_Preview/Preview/TxtPreviewer.php +++ /dev/null @@ -1,306 +0,0 @@ - - * @copyright Copyright (C) 2010, Uwe Steinmann - * @version Release: @package_version@ - */ - - -/** - * Class for managing creation of text preview for documents. - * - * @category DMS - * @package SeedDMS_Preview - * @version @version@ - * @author Uwe Steinmann - * @copyright Copyright (C) 2011, Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_Preview_TxtPreviewer extends SeedDMS_Preview_Base { - - function __construct($previewDir, $timeout=5, $xsendfile=true) { /* {{{ */ - parent::__construct($previewDir.DIRECTORY_SEPARATOR.'txt', $timeout, $xsendfile); - $this->converters = array( - ); - } /* }}} */ - - /** - * Return the physical filename of the preview image on disc - * including the path - * - * @param object $object document content or document file - * @return string file name of preview image - */ - public function getFileName($object) { /* {{{ */ - if(!$object) - return false; - - $document = $object->getDocument(); - $dms = $document->_dms; - $dir = $this->previewDir.DIRECTORY_SEPARATOR.$document->getDir(); - switch(get_class($object)) { - case $dms->getClassname('documentcontent'): - $target = $dir.'t'.$object->getVersion(); - break; - default: - return false; - } - return $target; - } /* }}} */ - - /** - * Check if converter for a given mimetype is set - * - * @param string $mimetype from mimetype - * - * @return boolean true if converter exists, otherwise false - */ - function hasConverter($from, $to='') { /* {{{ */ - return parent::hasConverter($from, 'text/plain'); - } /* }}} */ - - /** - * Create a text preview for a given file - * - * This method creates a preview in text format for a regular file - * in the file system and stores the result in the directory $dir relative - * to the configured preview directory. The filename of the resulting preview - * image is either $target.text (if set) or md5($infile).text. - * The $mimetype is used to select the propper conversion programm. - * An already existing text preview is replaced. - * - * @param string $infile name of input file including full path - * @param string $dir directory relative to $this->previewDir - * @param string $mimetype MimeType of input file - * @param string $target optional name of preview image (without extension) - * @return boolean true on success, false on failure - */ - public function createRawPreview($infile, $dir, $mimetype, $target='') { /* {{{ */ - if(!self::hasConverter($mimetype)) - return true; - - if(!$this->previewDir) - return false; - if(!is_dir($this->previewDir.DIRECTORY_SEPARATOR.$dir)) { - if (!SeedDMS_Core_File::makeDir($this->previewDir.DIRECTORY_SEPARATOR.$dir)) { - return false; - } - } - if(!file_exists($infile)) - return false; - if(!$target) - $target = $this->previewDir.$dir.md5($infile); - $this->lastpreviewfile = $target.'.txt'; - if($target != '' && (!file_exists($target.'.txt') || filectime($target.'.txt') < filectime($infile))) { - if($this->conversionmgr) { - if(!$this->conversionmgr->convert($infile, $mimetype, 'text/plain', $target.'.txt')) { - $this->lastpreviewfile = ''; - return false; - } - $new = true; - } else { - $cmd = ''; - $mimeparts = explode('/', $mimetype, 2); - if(isset($this->converters[$mimetype])) { - $cmd = str_replace(array('%f', '%o', '%m'), array($infile, $target.'.txt', $mimetype), $this->converters[$mimetype]); - } elseif(isset($this->converters[$mimeparts[0].'/*'])) { - $cmd = str_replace(array('%f', '%o', '%m'), array($infile, $target.'.txt', $mimetype), $this->converters[$mimeparts[0].'/*']); - } elseif(isset($this->converters['*'])) { - $cmd = str_replace(array('%f', '%o', '%m'), array($infile, $target.'.txt', $mimetype), $this->converters['*']); - } - - if($cmd) { - try { - self::execWithTimeout($cmd, $this->timeout); - $new = true; - } catch(Exception $e) { - $this->lastpreviewfile = ''; - return false; - } - } - } - return true; - } - $new = false; - return true; - - } /* }}} */ - - /** - * Create preview image - * - * This function creates a preview image for the given document - * content or document file. It internally uses - * {@link SeedDMS_Preview::createRawPreview()}. The filename of the - * preview image is created by {@link SeedDMS_Preview_Previewer::getFileName()} - * - * @param object $object instance of SeedDMS_Core_DocumentContent - * or SeedDMS_Core_DocumentFile - * @return boolean true on success, false on failure - */ - public function createPreview($object) { /* {{{ */ - if(!$object) - return false; - - $document = $object->getDocument(); - $file = $document->_dms->contentDir.$object->getPath(); - $target = $this->getFileName($object); - return $this->createRawPreview($file, $document->getDir(), $object->getMimeType(), $target); - } /* }}} */ - - /** - * Check if a preview image already exists. - * - * This function is a companion to {@link SeedDMS_Preview_Previewer::createRawPreview()}. - * - * @param string $infile name of input file including full path - * @param string $dir directory relative to $this->previewDir - * @return boolean true if preview exists, otherwise false - */ - public function hasRawPreview($infile, $dir, $target='') { /* {{{ */ - if(!$this->previewDir) - return false; - if(!$target) - $target = $this->previewDir.$dir.md5($infile); - if($target !== false && file_exists($target.'.txt') && filectime($target.'.txt') >= filectime($infile)) { - return true; - } - return false; - } /* }}} */ - - /** - * Check if a preview txt already exists. - * - * This function is a companion to {@link SeedDMS_Preview_Previewer::createPreview()}. - * - * @param object $object instance of SeedDMS_Core_DocumentContent - * or SeedDMS_Core_DocumentFile - * @return boolean true if preview exists, otherwise false - */ - public function hasPreview($object) { /* {{{ */ - if(!$object) - return false; - - if(!$this->previewDir) - return false; - $target = $this->getFileName($object); - if($target !== false && file_exists($target.'.txt') && filectime($target.'.txt') >= $object->getDate()) { - return true; - } - return false; - } /* }}} */ - - /** - * Return a preview image. - * - * This function returns the content of a preview image if it exists.. - * - * @param string $infile name of input file including full path - * @param string $dir directory relative to $this->previewDir - * @return boolean/string image content if preview exists, otherwise false - */ - public function getRawPreview($infile, $dir, $target='') { /* {{{ */ - if(!$this->previewDir) - return false; - - if(!$target) - $target = $this->previewDir.$dir.md5($infile); - if($target && file_exists($target.'.txt')) { - $this->sendFile($target.'.txt'); - } - } /* }}} */ - - /** - * Return a preview image. - * - * This function returns the content of a preview image if it exists.. - * - * @param object $object instance of SeedDMS_Core_DocumentContent - * or SeedDMS_Core_DocumentFile - * @return boolean/string image content if preview exists, otherwise false - */ - public function getPreview($object) { /* {{{ */ - if(!$this->previewDir) - return false; - - $target = $this->getFileName($object); - if($target && file_exists($target.'.txt')) { - $this->sendFile($target.'.txt'); - } - } /* }}} */ - - /** - * Return file size preview image. - * - * @param object $object instance of SeedDMS_Core_DocumentContent - * or SeedDMS_Core_DocumentFile - * @return boolean/integer size of preview image or false if image - * does not exist - */ - public function getFilesize($object) { /* {{{ */ - $target = $this->getFileName($object); - if($target && file_exists($target.'.txt')) { - return(filesize($target.'.txt')); - } else { - return false; - } - - } /* }}} */ - - /** - * Delete preview image. - * - * @param object $object instance of SeedDMS_Core_DocumentContent - * or SeedDMS_Core_DocumentFile - * @return boolean true if deletion succeded or false if file does not exist - */ - public function deletePreview($object) { /* {{{ */ - if(!$this->previewDir) - return false; - - $target = $this->getFileName($object); - if($target && file_exists($target.'.txt')) { - return(unlink($target.'.txt')); - } else { - return false; - } - } /* }}} */ - - static function recurseRmdir($dir) { - $files = array_diff(scandir($dir), array('.','..')); - foreach ($files as $file) { - (is_dir("$dir/$file")) ? SeedDMS_Preview_Previewer::recurseRmdir("$dir/$file") : unlink("$dir/$file"); - } - return rmdir($dir); - } - - /** - * Delete all preview text belonging to a document - * - * This function removes the preview text of all versions and - * files of a document including the directory. It actually just - * removes the directory for the document in the cache. - * - * @param object $document instance of SeedDMS_Core_Document - * @return boolean true if deletion succeded or false if file does not exist - */ - public function deleteDocumentPreviews($document) { /* {{{ */ - if(!$this->previewDir) - return false; - - $dir = $this->previewDir.DIRECTORY_SEPARATOR.$document->getDir(); - if(file_exists($dir) && is_dir($dir)) { - return SeedDMS_Preview_Previewer::recurseRmdir($dir); - } else { - return false; - } - - } /* }}} */ -} -?> diff --git a/SeedDMS_Preview/composer.json b/SeedDMS_Preview/composer.json deleted file mode 100644 index 9a4b5a11a..000000000 --- a/SeedDMS_Preview/composer.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "seeddms/preview", - "description": "Create Preview images, pdf and txt for for SeedDMS ", - "type": "library", - "license": "GPL-2.0-or-later", - "minimum-stability": "dev", - "autoload": { - "psr-4": { - "Seeddms\\Preview\\": "Preview/" - }, - "classmap": ["Preview/"] - }, - "authors": [ - { - "name": "Uwe Steinmann", - "email": "info@seeddms.org" - } - ], - "require-dev": { - "phpunit/phpunit": "^9" - } - -} diff --git a/SeedDMS_Preview/package.xml b/SeedDMS_Preview/package.xml deleted file mode 100644 index d6dd7bc59..000000000 --- a/SeedDMS_Preview/package.xml +++ /dev/null @@ -1,511 +0,0 @@ - - - SeedDMS_Preview - pear.php.net - Create thumbnails from document content for SeedDMS - SeedDMS is a web based document management system (DMS). These - are the classes to create preview images and pdf file from the document content. - - Uwe Steinmann - steinm - uwe@steinmann.cx - yes - - 2023-01-09 - - - 1.5.0 - 1.5.0 - - - stable - stable - - GPL License - -- add previewer which creates txt - - - - - - - - - - - - - - - - - - - - - - - - - - - - 7.4.0 - - - 1.5.4 - - - - - - - 2012-11-20 - - - 1.0.0 - 1.0.0 - - - stable - stable - - GPL License - -- initial version - - - - 2013-04-29 - - - 1.1.0 - 1.1.0 - - - stable - stable - - GPL License - -- preview image can also be created from a document file (SeedDMS_Core_DocumentFile) - - - - 2014-03-18 - - - 1.1.1 - 1.1.0 - - - stable - stable - - GPL License - -- add converters for .tar.gz, .ps, .txt - - - - 2014-04-10 - - - 1.1.2 - 1.1.0 - - - stable - stable - - GPL License - -- create fixed width image with proportional height - - - - 2015-02-13 - - - 1.1.3 - 1.1.0 - - - stable - stable - - GPL License - -- preview images will also be recreated if the object this image belongs is of newer date than the image itself. This happens if versions are being deleted and than a new version is uploaded. Because the new version will get the version number of the old version, it will also take over the old preview image.Comparing the creation date of the image with the object detects this case. - - - - 2015-08-08 - - - 1.1.4 - 1.1.0 - - - stable - stable - - GPL License - -- command for creating the preview will be called with a given timeout - - - - 2016-02-11 - - - 1.1.5 - 1.1.5 - - - stable - stable - - GPL License - -- add method getFilesize() -- timeout for external commands can be passed to contructor of SeedDMS_Preview_Previewer - - - - 2016-03-08 - - - 1.1.6 - 1.1.6 - - - stable - stable - - GPL License - -- check if object passed to createPreview(), hasPreview() is not null - - - - 2016-03-29 - - - 1.1.7 - 1.1.7 - - - stable - stable - - GPL License - -- set last parameter of stream_select() to 200000 micro sec. in case the timeout in sec. is set to 0 - - - - 2016-04-05 - - - 1.1.8 - 1.1.8 - - - stable - stable - - GPL License - -- pass variables to stream_select (required by php7) - - - - 2016-04-26 - - - 1.1.9 - 1.1.9 - - - stable - stable - - GPL License - -- add more documentation -- finish deletePreview() -- add new method deleteDocumentPreviews() -- fix calculation of timeout (Bug #269) -- check if cache dir exists before deleting it in deleteDocumentPreviews() - - - - 2016-11-07 - - - 1.2.0 - 1.2.0 - - - stable - stable - - GPL License - -- add new previewer which converts document to pdf instead of png - - - - 2016-11-15 - - - 1.2.1 - 1.2.0 - - - stable - stable - - GPL License - -- setConverters() overrides exiting converters - - - - 2017-03-02 - - - 1.2.2 - 1.2.0 - - - stable - stable - - GPL License - -- commands can be set for mimetypes 'xxxx/*' and '*' -- pass mimetype as parameter '%m' to converter - - - - 2017-09-18 - - - 1.2.3 - 1.2.0 - - - stable - stable - - GPL License - -- createPreview() returns false if running the converter command fails - - - - 2017-10-11 - - - 1.2.4 - 1.2.0 - - - stable - stable - - GPL License - -- fix typo in converter for tar.gz files - - - - 2017-10-11 - - - 1.2.5 - 1.2.0 - - - stable - stable - - GPL License - -- SeedDMS_Preview_Base::hasConverter() returns only try if command is set - - - - 2017-12-04 - - - 1.2.6 - 1.2.0 - - - stable - stable - - GPL License - -- SeedDMS_Preview_Base::setConverters() overrides existing converters. -- New method SeedDMS_Preview_Base::addConverters() merges new converters with old ones. - - - - 2018-01-18 - - - 1.2.7 - 1.2.0 - - - stable - stable - - GPL License - -- add SeedDMS_Preview_Base::sendFile() as a replacement for readfile() which uses -- mod_xsendfile if available -- execWithTimeout() reads data from stderr and returns it together with stdout in array - - - - 2018-03-08 - - - 1.2.8 - 1.2.0 - - - stable - stable - - GPL License - -- preview is also created if SeedDMS_Core_DocumentContent has a child class - - - - 2018-07-13 - - - 1.2.9 - 1.2.9 - - - stable - stable - - GPL License - -- make sure list of converters is always an array -- usage of mod_sendfile can be configured - - - - 2019-02-11 - - - 1.2.10 - 1.2.10 - - - stable - stable - - GPL License - -- new parameter for enabling/disabling xsendfile -- fix creation of pdf preview if document content class is not SeedDMS_Core_DocumentContent - - - - 2020-02-17 - - - 1.3.0 - 1.3.0 - - - stable - stable - - GPL License - -- add new methode getPreviewFile() - - - - 2020-03-21 - - - 1.3.1 - 1.3.1 - - - stable - stable - - GPL License - -- add parameter $target to SeedDMS_Preview_pdfPreviewer::hasRawPreview() and SeedDMS_Preview_pdfPreviewer::getRawPreview() - - - - 2020-12-23 - - - 1.3.2 - 1.3.1 - - - stable - stable - - GPL License - -- set header Content-Length -- update package description - - - - 2020-12-23 - - - 1.3.3 - 1.3.3 - - - stable - stable - - GPL License - -- close pipes in execWithTimeout(), also return exit code of command -- createPreview() has optional parameter by referenz to return true if a - preview image was actually created - - - - 2021-10-16 - - - 1.4.0 - 1.4.0 - - - stable - stable - - GPL License - -- use new conversion service if available -- createRawPreview() checks early if a converter exists - - - - diff --git a/SeedDMS_Preview/tests/Preview.php b/SeedDMS_Preview/tests/Preview.php deleted file mode 100644 index e69de29bb..000000000 diff --git a/SeedDMS_SQLiteFTS/CHANGELOG.md b/SeedDMS_SQLiteFTS/CHANGELOG.md deleted file mode 100644 index d75aace4c..000000000 --- a/SeedDMS_SQLiteFTS/CHANGELOG.md +++ /dev/null @@ -1,89 +0,0 @@ -1.0.18 (2023-01-09) ---------------------- -- add optional parameter $order to SeedDMS_SQLiteFTS_Indexer::find() -- add optional parameters $query and $col to SeedDMS_SQLiteFTS_Indexer::terms() -- IndexedDocument() accepts a callable for conversion to text -- remove stop words from content - -1.0.17 (2022-03-04) ---------------------- -- throw exeption in find() instead of returning false -- fix query if rootFolder or startFolder is set - - -1.0.16 (2021-05-10) ---------------------- -- close pipes in execWithTimeout(), also return exit code of command -- add support for fts5 (make it the default) -- add class SeedDMS_SQLiteFTS_Field - -1.0.15 (2020-12-12) ---------------------- -- add indexing folders - -1.0.14 (2020-09-11) ---------------------- -- add searching for document status -- search even if query is empty (will find all documents) -- parameters for SeedDMS_SQLiteFTS_Search::search() has changed -- SeedDMS_Lucene_Search::search() returns array of hits, count and facets -- pass config array instead of index directory to SeedDMS_Lucene_Indexer::create() - and SeedDMS_Lucene_Indexer::open() - -1.0.13 (2020-09-02) ---------------------- -- add user to list of terms - -1.0.12 (2020-09-02) ---------------------- -- Index users with at least read access on a document - -1.0.11 (2019-11-28) ---------------------- -- Set 'created' in index to creation date of indexed content (was set to current -timestamp) - -1.0.10 (2018-04-11) ---------------------- -- IndexedDocument() remembers cmd and mimetype - -1.0.9 (2018-01-30) ---------------------- -- execWithTimeout() reads data from stderr and saves it into error msg - -1.0.8 (2017-12-04) ---------------------- -- allow conversion commands for mimetypes with wildcards - -1.0.7 (2017-03-01) ---------------------- -- catch exception in execWithTimeout() - -1.0.6 (2016-03-29) ---------------------- -- fix calculation of timeout (see bug #269) - -1.0.5 (2016-03-29) ---------------------- -- set last parameter of stream_select() to 200000 micro sec. in case the timeout in sec. is set to 0 - -1.0.4 (2016-03-15) ---------------------- -- make it work with sqlite3 < 3.8.0 - -1.0.3 (2016-02-01) ---------------------- -- add command for indexing postѕcript files - -1.0.2 (2016-01-10) ---------------------- -- check if index exists before removing it when creating a new one - -1.0.1 (2015-11-16) ---------------------- -- add __get() to SQLiteFTS_Document because class.IndexInfo.php access class variable title which doesn't exists - -1.0.0 (2015-08-10) ---------------------- -- initial release - diff --git a/SeedDMS_SQLiteFTS/SQLiteFTS.php b/SeedDMS_SQLiteFTS/SQLiteFTS.php deleted file mode 100644 index 338a79e1c..000000000 --- a/SeedDMS_SQLiteFTS/SQLiteFTS.php +++ /dev/null @@ -1,49 +0,0 @@ - diff --git a/SeedDMS_SQLiteFTS/SQLiteFTS/Document.php b/SeedDMS_SQLiteFTS/SQLiteFTS/Document.php deleted file mode 100644 index 7b299a9a0..000000000 --- a/SeedDMS_SQLiteFTS/SQLiteFTS/Document.php +++ /dev/null @@ -1,117 +0,0 @@ - - * @copyright Copyright (C) 2010, Uwe Steinmann - * @version Release: @package_version@ - */ - - -/** - * Class for managing a document. - * - * @category DMS - * @package SeedDMS_SQLiteFTS - * @version @version@ - * @author Uwe Steinmann - * @copyright Copyright (C) 2011, Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_SQLiteFTS_Document { - - /** - * @var integer $id id of document - * @access protected - */ - public $id; - - /** - * @var array $fields fields - * @access protected - */ - protected $fields; - - public function ___get($key) { /* {{{ */ - if(isset($this->fields[$key])) - return $this->fields[$key]; - else - return false; - } /* }}} */ - - public function _addField($key, $value) { /* {{{ */ - //if($key == 'document_id') { - if($key == 'docid') { - $this->id = $this->fields[$key] = (int) $value; - } else { - if(isset($this->fields[$key])) - $this->fields[$key] .= ' '.$value; - else - $this->fields[$key] = $value; - } - } /* }}} */ - - public function addField(SeedDMS_SQLiteFTS_Field $field) { /* {{{ */ - $this->fields[$field->name] = $field; - if($field->name == 'docid') { - $this->id = $field->value; - } - return $this; - } /* }}} */ - - /** - * Return an array with the names of the fields in this document. - * - * @return array - */ - public function getFieldNames() { - return array_keys($this->fields); - } - - public function _getFieldValue($key) { /* {{{ */ - if(isset($this->fields[$key])) - return $this->fields[$key]; - else - return false; - } /* }}} */ - - /** - * Proxy method for getFieldValue(), provides more convenient access to - * the string value of a field. - * - * @param string $name - * @return string - */ - public function __get($name) { - return $this->getFieldValue($name); - } - - /** - * Returns Zend_Search_Lucene_Field object for a named field in this document. - * - * @param string $fieldName - * @return Zend_Search_Lucene_Field - */ - public function getField($fieldName) { - if (!array_key_exists($fieldName, $this->fields)) { - require_once 'SeedDMS/SQLiteFTS/Exception.php'; - throw new SeedDMS_SQLiteFTS_Exception("Field name \"$fieldName\" not found in document."); - } - return $this->fields[$fieldName]; - } - - /** - * Returns the string value of a named field in this document. - * - * @see __get() - * @return string - */ - public function getFieldValue($fieldName) { - return $this->getField($fieldName)->value; - } -} -?> diff --git a/SeedDMS_SQLiteFTS/SQLiteFTS/Exception.php b/SeedDMS_SQLiteFTS/SQLiteFTS/Exception.php deleted file mode 100644 index 281947dce..000000000 --- a/SeedDMS_SQLiteFTS/SQLiteFTS/Exception.php +++ /dev/null @@ -1,41 +0,0 @@ - - * @copyright Copyright (C) 2010, Uwe Steinmann - * @version Release: @package_version@ - */ - - -/** - * Class for managing a field. - * - * @category DMS - * @package SeedDMS_SQLiteFTS - * @version @version@ - * @author Uwe Steinmann - * @copyright Copyright (C) 2011, Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_SQLiteFTS_Field { - - /** - * Field name - * - * @var string - */ - public $name; - - /** - * Field value - * - * @var boolean - */ - public $value; - - /** - * Object constructor - * - * @param string $name - * @param string $value - */ - public function __construct($name, $value) { - $this->name = $name; - $this->value = $value; - } - - /** - * Constructs a String-valued Field that is not tokenized, but is indexed - * and stored. Useful for non-text fields, e.g. date or url. - * - * @param string $name - * @param string $value - * @return SeedDMS_SQLiteFTS_Field - */ - public static function keyword($name, $value) { - return new self($name, $value); - } - - /** - * Constructs a String-valued Field that is tokenized and indexed, - * and is stored in the index, for return with hits. Useful for short text - * fields, like "title" or "subject". Term vector will not be stored for this field. - * - * @param string $name - * @param string $value - * @return SeedDMS_SQLiteFTS_Field - */ - public static function text($name, $value) { - return new self($name, $value); - } - - /** - * Constructs a String-valued Field that is tokenized and indexed, - * but that is not stored in the index. - * - * @param string $name - * @param string $value - * @return SeedDMS_SQLiteFTS_Field - */ - public static function unStored($name, $value) { - return new self($name, $value); - } -} diff --git a/SeedDMS_SQLiteFTS/SQLiteFTS/IndexedDocument.php b/SeedDMS_SQLiteFTS/SQLiteFTS/IndexedDocument.php deleted file mode 100644 index 1bb3a32f0..000000000 --- a/SeedDMS_SQLiteFTS/SQLiteFTS/IndexedDocument.php +++ /dev/null @@ -1,266 +0,0 @@ - - * @copyright Copyright (C) 2010, Uwe Steinmann - * @version Release: @package_version@ - */ - -/** - * @uses SeedDMS_SQLiteFTS_Document - */ -require_once('Document.php'); -require_once('Field.php'); - - -/** - * Class for managing an indexed document. - * - * @category DMS - * @package SeedDMS_SQLiteFTS - * @version @version@ - * @author Uwe Steinmann - * @copyright Copyright (C) 2011, Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_SQLiteFTS_IndexedDocument extends SeedDMS_SQLiteFTS_Document { - - /** - * @var string - */ - protected $errormsg; - - /** - * @var string - */ - protected $mimetype; - - /** - * @var string - */ - protected $cmd; - - /** - * Run a shell command - * - * @param $cmd - * @param int $timeout - * @return array - * @throws Exception - */ - static function execWithTimeout($cmd, $timeout=2) { /* {{{ */ - $descriptorspec = array( - 0 => array("pipe", "r"), - 1 => array("pipe", "w"), - 2 => array("pipe", "w") - ); - $pipes = array(); - - $timeout += time(); - // Putting an 'exec' before the command will not fork the command - // and therefore not create any child process. proc_terminate will - // then reliably terminate the cmd and not just shell. See notes of - // https://www.php.net/manual/de/function.proc-terminate.php - $process = proc_open('exec '.$cmd, $descriptorspec, $pipes); - if (!is_resource($process)) { - throw new Exception("proc_open failed on: " . $cmd); - } - stream_set_blocking($pipes[1], 0); - stream_set_blocking($pipes[2], 0); - - $output = $error = ''; - $timeleft = $timeout - time(); - $read = array($pipes[1], $pipes[2]); - $write = NULL; - $exeptions = NULL; - do { - $num_changed_streams = stream_select($read, $write, $exeptions, $timeleft, 200000); - - if ($num_changed_streams === false) { - proc_terminate($process); - throw new Exception("stream select failed on: " . $cmd); - } elseif ($num_changed_streams > 0) { - $output .= fread($pipes[1], 8192); - $error .= fread($pipes[2], 8192); - } - $timeleft = $timeout - time(); - } while (!feof($pipes[1]) && $timeleft > 0); - - fclose($pipes[0]); - fclose($pipes[1]); - fclose($pipes[2]); - if ($timeleft <= 0) { - proc_terminate($process); - throw new Exception("command timeout on: " . $cmd); - } else { - $return_value = proc_close($process); - return array('stdout'=>$output, 'stderr'=>$error, 'return'=>$return_value); - } - } /* }}} */ - - /** - * Constructor. Creates our indexable document and adds all - * necessary fields to it using the passed in document - * - * $convcmd can either be an array of conversion commands or - * an object of class SeedDMS_ConversionMgr - */ - public function __construct($dms, $document, $convcmd=null, $nocontent=false, $timeout=5) { /* {{{ */ - $this->errormsg = ''; - $this->cmd = ''; - $this->mimetype = ''; - - $this->addField(SeedDMS_SQLiteFTS_Field::Text('title', $document->getName())); - if($acllist = $document->getReadAccessList(1, 1, 1)) { - $allu = []; - foreach($acllist['users'] as $u) - $allu[] = $u->getLogin(); - $this->addField(SeedDMS_SQLiteFTS_Field::Text('users', implode(' ', $allu))); - /* - $allg = []; - foreach($acllist['groups'] as $g) - $allg[] = $g->getName(); - $this->addField(SeedDMS_SQLiteFTS_Field::Text('groups', implode(' ', $allg))); - */ - } - if($attributes = $document->getAttributes()) { - foreach($attributes as $attribute) { - $attrdef = $attribute->getAttributeDefinition(); - if($attrdef->getValueSet() != '') - $this->addField(SeedDMS_SQLiteFTS_Field::Keyword('attr_'.str_replace(' ', '_', $attrdef->getName()), $attribute->getValue())); - else - $this->addField(SeedDMS_SQLiteFTS_Field::Text('attr_'.str_replace(' ', '_', $attrdef->getName()), $attribute->getValue())); - } - } - $owner = $document->getOwner(); - $this->addField(SeedDMS_SQLiteFTS_Field::Text('owner', $owner->getLogin())); - $this->addField(SeedDMS_SQLiteFTS_Field::Keyword('path', str_replace(':', 'x', $document->getFolderList()))); - if($comment = $document->getComment()) { - $this->addField(SeedDMS_SQLiteFTS_Field::Text('comment', $comment)); - } - - if($document->isType('document')) { - $this->addField(SeedDMS_SQLiteFTS_Field::Keyword('document_id', 'D'.$document->getID())); - $this->addField(SeedDMS_SQLiteFTS_Field::Keyword('record_type', 'document')); - $version = $document->getLatestContent(); - if($version) { - $this->addField(SeedDMS_SQLiteFTS_Field::Keyword('mimetype', $version->getMimeType())); - $this->addField(SeedDMS_SQLiteFTS_Field::Keyword('origfilename', $version->getOriginalFileName())); - $this->addField(SeedDMS_SQLiteFTS_Field::Keyword('created', $version->getDate(), 'unindexed')); - if(!$nocontent) - $this->addField(SeedDMS_SQLiteFTS_Field::Keyword('indexed', time(), 'unindexed')); - if($attributes = $version->getAttributes()) { - foreach($attributes as $attribute) { - $attrdef = $attribute->getAttributeDefinition(); - if($attrdef->getValueSet() != '') - $this->addField(SeedDMS_SQLiteFTS_Field::Keyword('attr_'.str_replace(' ', '_', $attrdef->getName()), $attribute->getValue())); - else - $this->addField(SeedDMS_SQLiteFTS_Field::Text('attr_'.str_replace(' ', '_', $attrdef->getName()), $attribute->getValue())); - } - } - } - if($categories = $document->getCategories()) { - $names = array(); - foreach($categories as $cat) { - $names[] = $cat->getName(); - } - $this->addField(SeedDMS_SQLiteFTS_Field::Text('category', implode('#', $names))); - } - if($keywords = $document->getKeywords()) { - $this->addField(SeedDMS_SQLiteFTS_Field::Text('keywords', $keywords)); - } - if($version) { - $status = $version->getStatus(); - $this->addField(SeedDMS_SQLiteFTS_Field::Keyword('status', $status['status']+10)); - } - if($version && !$nocontent) { - $path = $dms->contentDir . $version->getPath(); - if(file_exists($path)) { - $mimetype = $version->getMimeType(); - $this->mimetype = $mimetype; - if(is_callable($convcmd)) { - $result = $convcmd($document); - if($result['content']) { - self::setContent($result['content']); - } elseif($result['content'] === false) { - $this->errormsg = $result['errormsg']; - } - $this->cmd = $result['cmd']; - } elseif(is_object($convcmd) && (get_class($convcmd) == 'SeedDMS_ConversionMgr')) { - if($service = $convcmd->getService($mimetype, 'text/plain')) { - $content = $convcmd->convert($path, $mimetype, 'text/plain'); - if($content) { - self::setContent($content); - } elseif($content === false) { - $this->errormsg = 'Conversion failed'; - } - $this->cmd = get_class($service); - } else { - $this->cmd = 'No service to convert '.$mimetype.' to text/plain'; - } - } else { - $content = ''; - $cmd = ''; - $mimeparts = explode('/', $mimetype, 2); - if(isset($convcmd[$mimetype])) { - $cmd = sprintf($convcmd[$mimetype], $path); - } elseif(isset($convcmd[$mimeparts[0].'/*'])) { - $cmd = sprintf($convcmd[$mimetype], $path); - } elseif(isset($convcmd['*'])) { - $cmd = sprintf($convcmd[$mimetype], $path); - } - if($cmd) { - $this->cmd = $cmd; - try { - $content = self::execWithTimeout($cmd, $timeout); - if($content['stdout']) { - self::setContent($content['stdout']); - // $this->addField(SeedDMS_SQLiteFTS_Field::UnStored('content', $content['stdout'])); - } - if($content['stderr']) { - $this->errormsg = $content['stderr']; - } - } catch (Exception $e) { - } - } - } - } - } - } elseif($document->isType('folder')) { - $this->addField(SeedDMS_SQLiteFTS_Field::Keyword('document_id', 'F'.$document->getID())); - $this->addField(SeedDMS_SQLiteFTS_Field::Keyword('record_type', 'folder')); - $this->addField(SeedDMS_SQLiteFTS_Field::Keyword('created', $document->getDate(), 'unindexed')); - $this->addField(SeedDMS_SQLiteFTS_Field::Keyword('indexed', time(), 'unindexed')); - } - } /* }}} */ - - public function getErrorMsg() { /* {{{ */ - return $this->errormsg; - } /* }}} */ - - public function getMimeType() { /* {{{ */ - return $this->mimetype; - } /* }}} */ - - public function setContent($data) { /* {{{ */ - $this->addField(SeedDMS_SQLiteFTS_Field::Text('content', $data)); - } /* }}} */ - - public function getCmd() { /* {{{ */ - return $this->cmd; - } /* }}} */ - - /* Use only for setting the command if e.g. an extension takes over the - * conversion to txt (like the office extension which uses the collabora - * conversion service). - */ - public function setCmd($cmd) { /* {{{ */ - $this->cmd = $cmd; - } /* }}} */ -} -?> diff --git a/SeedDMS_SQLiteFTS/SQLiteFTS/Indexer.php b/SeedDMS_SQLiteFTS/SQLiteFTS/Indexer.php deleted file mode 100644 index 559b93bc4..000000000 --- a/SeedDMS_SQLiteFTS/SQLiteFTS/Indexer.php +++ /dev/null @@ -1,463 +0,0 @@ - - * @copyright Copyright (C) 2010, Uwe Steinmann - * @version Release: @package_version@ - */ - - -/** - * Class for managing a SQLiteFTS index. - * - * @category DMS - * @package SeedDMS_Lucene - * @version @version@ - * @author Uwe Steinmann - * @copyright Copyright (C) 2011, Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_SQLiteFTS_Indexer { - - /** - * @var string $_ftstype - * @access protected - */ - protected $_ftstype; - - /** - * @var object $_conn sqlite index - * @access protected - */ - protected $_conn; - - /** - * @var array $_stop_words array of stop words - * @access protected - */ - protected $_stop_words; - - const ftstype = 'fts5'; - - /** - * Remove stopwords from string - */ - protected function strip_stopwords($str = "") { /* {{{ */ - // 1.) break string into words - // [^-\w\'] matches characters, that are not [0-9a-zA-Z_-'] - // if input is unicode/utf-8, the u flag is needed: /pattern/u - $words = preg_split('/[^-\w\']+/u', $str, -1, PREG_SPLIT_NO_EMPTY); - - // 2.) if we have at least 2 words, remove stopwords - if(!empty($words)) { - $stopwords = $this->_stop_words; - $words = array_filter($words, function ($w) use (&$stopwords) { - return ((mb_strlen($w, 'utf-8') > 2) && !isset($stopwords[mb_strtolower($w, "utf-8")])); - }); - } - - // check if not too much was removed such as "the the" would return empty - if(!empty($words)) - return implode(" ", $words); - return $str; - } /* }}} */ - - /** - * Constructor - * - */ - function __construct($indexerDir) { /* {{{ */ - $this->_conn = new PDO('sqlite:'.$indexerDir.'/index.db'); - $this->_ftstype = self::ftstype; - if($this->_ftstype == 'fts5') - $this->_rawid = 'rowid'; - else - $this->_rawid = 'docid'; - $this->_stop_words = []; - } /* }}} */ - - /** - * Open an existing index - * - * @param string $indexerDir directory on disk containing the index - */ - static function open($conf) { /* {{{ */ - if(file_exists($conf['indexdir'].'/index.db')) { - return new SeedDMS_SQLiteFTS_Indexer($conf['indexdir']); - } else - return static::create($conf); - } /* }}} */ - - /** - * Create a new index - * - * @param array $conf $conf['indexdir'] is the directory on disk containing the index - */ - static function create($conf) { /* {{{ */ - if(file_exists($conf['indexdir'].'/index.db')) - unlink($conf['indexdir'].'/index.db'); - $index = new SeedDMS_SQLiteFTS_Indexer($conf['indexdir']); - /* Make sure the sequence of fields is identical to the field list - * in SeedDMS_SQLiteFTS_Term - */ - $version = SQLite3::version(); - if(self::ftstype == 'fts4') { - if($version['versionNumber'] >= 3008000) - $sql = 'CREATE VIRTUAL TABLE docs USING fts4(documentid, record_type, title, comment, keywords, category, mimetype, origfilename, owner, content, created, indexed, users, status, path, notindexed=created, notindexed=indexed, matchinfo=fts3)'; - else - $sql = 'CREATE VIRTUAL TABLE docs USING fts4(documentid, record_type, title, comment, keywords, category, mimetype, origfilename, owner, content, created, indexed, users, status, path, matchinfo=fts3)'; - $res = $index->_conn->exec($sql); - if($res === false) { - return null; - } - $sql = 'CREATE VIRTUAL TABLE docs_terms USING fts4aux(docs);'; - $res = $index->_conn->exec($sql); - if($res === false) { - return null; - } - } elseif(self::ftstype == 'fts5') { - $sql = 'CREATE VIRTUAL TABLE docs USING fts5(documentid, record_type, title, comment, keywords, category, mimetype, origfilename, owner, content, created unindexed, indexed unindexed, users, status, path)'; - $res = $index->_conn->exec($sql); - if($res === false) { - return null; - } - $sql = 'CREATE VIRTUAL TABLE docs_terms USING fts5vocab(docs, \'col\');'; - $res = $index->_conn->exec($sql); - if($res === false) { - return null; - } - } else - return null; - return($index); - } /* }}} */ - - /** - * Do some initialization - * - */ - public function init($stopWordsFile='') { /* {{{ */ - if($stopWordsFile) - $this->_stop_words = array_flip(preg_split("/[\s,]+/", file_get_contents($stopWordsFile))); - } /* }}} */ - - /** - * Add document to index - * - * @param object $doc indexed document of class - * SeedDMS_SQLiteFTS_IndexedDocument - * @return boolean false in case of an error, otherwise true - */ - function addDocument($doc) { /* {{{ */ - if(!$this->_conn) - return false; - - foreach(array('comment', 'keywords', 'category', 'content', 'mimetype', 'origfilename', 'status', 'created', 'indexed') as $kk) { - try { - ${$kk} = $doc->getFieldValue($kk); - } catch (Exception $e) { - ${$kk} = ''; - } - } - $sql = "DELETE FROM docs WHERE documentid=".$this->_conn->quote($doc->getFieldValue('document_id')); - $res = $this->_conn->exec($sql); - if($res === false) { - return false; - } - if($this->_stop_words) - $content = $this->strip_stopwords($content); - - $sql = "INSERT INTO docs (documentid, record_type, title, comment, keywords, category, owner, content, mimetype, origfilename, created, indexed, users, status, path) VALUES (".$this->_conn->quote($doc->getFieldValue('document_id')).", ".$this->_conn->quote($doc->getFieldValue('record_type')).", ".$this->_conn->quote($doc->getFieldValue('title')).", ".$this->_conn->quote($comment).", ".$this->_conn->quote($keywords).", ".$this->_conn->quote($category).", ".$this->_conn->quote($doc->getFieldValue('owner')).", ".$this->_conn->quote($content).", ".$this->_conn->quote($mimetype).", ".$this->_conn->quote($origfilename).", ".(int)$created.", ".(int)$indexed.", ".$this->_conn->quote($doc->getFieldValue('users')).", ".$this->_conn->quote($status).", ".$this->_conn->quote($doc->getFieldValue('path'))/*time()*/.")"; - $res = $this->_conn->exec($sql); - if($res === false) { - return false; - var_dump($this->_conn->errorInfo()); - } - return $res; - } /* }}} */ - - /** - * Remove document from index - * - * @param object $id internal id of document - * @return boolean false in case of an error, otherwise true - */ - public function delete($id) { /* {{{ */ - if(!$this->_conn) - return false; - - $sql = "DELETE FROM docs WHERE ".$this->_rawid."=".(int) $id; - $res = $this->_conn->exec($sql); - return $res; - } /* }}} */ - - /** - * Check if document was deleted - * - * Just for compatibility with lucene. - * - * @return boolean always false - */ - public function isDeleted($id) { /* {{{ */ - return false; - } /* }}} */ - - /** - * Find documents in index - * - * @param string $query - * @param array $limit array with elements 'limit' and 'offset' - * @return boolean false in case of an error, otherwise array with elements - * 'count', 'hits', 'facets'. 'hits' is an array of SeedDMS_SQLiteFTS_QueryHit - */ - public function find($query, $filter='', $limit=array(), $order=array()) { /* {{{ */ - if(!$this->_conn) - return false; - - /* First count some records for facets */ - foreach(array('owner', 'mimetype', 'category', 'status') as $facetname) { - $sql = "SELECT `".$facetname."`, count(*) AS `c` FROM `docs`"; - if($query) { - $sql .= " WHERE docs MATCH ".$this->_conn->quote($query); - } - if($filter) { - if($query) - $sql .= " AND ".$filter; - else - $sql .= " WHERE ".$filter; - } - $res = $this->_conn->query($sql." GROUP BY `".$facetname."`"); - if(!$res) - throw new SeedDMS_SQLiteFTS_Exception("Counting records in facet \"$facetname\" failed."); -// return false; - $facets[$facetname] = array(); - foreach($res as $row) { - if($row[$facetname] && $row['c']) { - if($facetname == 'category') { - $tmp = explode('#', $row[$facetname]); - if(count($tmp) > 1) { - foreach($tmp as $t) { - if(!isset($facets[$facetname][$t])) - $facets[$facetname][$t] = $row['c']; - else - $facets[$facetname][$t] += $row['c']; - } - } else { - if(!isset($facets[$facetname][$row[$facetname]])) - $facets[$facetname][$row[$facetname]] = $row['c']; - else - $facets[$facetname][$row[$facetname]] += $row['c']; - } - } elseif($facetname == 'status') { - $facets[$facetname][($row[$facetname]-10).''] = $row['c']; - } else - $facets[$facetname][$row[$facetname]] = $row['c']; - } - } - } - - $sql = "SELECT `record_type`, count(*) AS `c` FROM `docs`"; - if($query) - $sql .= " WHERE docs MATCH ".$this->_conn->quote($query); - if($filter) { - if($query) - $sql .= " AND ".$filter; - else - $sql .= " WHERE ".$filter; - } - $res = $this->_conn->query($sql." GROUP BY `record_type`"); - if(!$res) - throw new SeedDMS_SQLiteFTS_Exception("Counting records in facet \"record_type\" failed."); -// return false; - $facets['record_type'] = array('document'=>0, 'folder'=>0); - foreach($res as $row) { - $facets['record_type'][$row['record_type']] = $row['c']; - } - $total = $facets['record_type']['document'] + $facets['record_type']['folder']; - - $sql = "SELECT ".$this->_rawid.", documentid FROM docs"; - if($query) - $sql .= " WHERE docs MATCH ".$this->_conn->quote($query); - if($filter) { - if($query) - $sql .= " AND ".$filter; - else - $sql .= " WHERE ".$filter; - } - if($this->_ftstype == 'fts5') { - //$sql .= " ORDER BY rank"; - // boost documentid, record_type, title, comment, keywords, category, mimetype, origfilename, owner, content, created unindexed, users, status, path - if(!empty($order['by'])) { - switch($order['by']) { - case "title": - $sql .= " ORDER BY title"; - break; - case "created": - $sql .= " ORDER BY created"; - break; - default: - $sql .= " ORDER BY bm25(docs, 10.0, 0.0, 10.0, 5.0, 5.0, 10.0)"; - } - if(!empty($order['dir'])) { - if($order['dir'] == 'desc') - $sql .= " DESC"; - } - } - } - if(!empty($limit['limit'])) - $sql .= " LIMIT ".(int) $limit['limit']; - if(!empty($limit['offset'])) - $sql .= " OFFSET ".(int) $limit['offset']; - $res = $this->_conn->query($sql); - if(!$res) - throw new SeedDMS_SQLiteFTS_Exception("Searching for documents failed."); - $hits = array(); - if($res) { - foreach($res as $rec) { - $hit = new SeedDMS_SQLiteFTS_QueryHit($this); - $hit->id = $rec[$this->_rawid]; - $hit->documentid = $rec['documentid']; - $hits[] = $hit; - } - } - return array('count'=>$total, 'hits'=>$hits, 'facets'=>$facets); - } /* }}} */ - - /** - * Get a single document from index - * - * @param string $id id of document - * @return boolean false in case of an error, otherwise true - */ - public function findById($id) { /* {{{ */ - if(!$this->_conn) - return false; - - $sql = "SELECT ".$this->_rawid.", documentid FROM docs WHERE documentid=".$this->_conn->quote($id); - $res = $this->_conn->query($sql); - $hits = array(); - if($res) { - while($rec = $res->fetch(PDO::FETCH_ASSOC)) { - $hit = new SeedDMS_SQLiteFTS_QueryHit($this); - $hit->id = $rec[$this->_rawid]; - $hit->documentid = $rec['documentid']; - $hits[] = $hit; - } - } - return $hits; - } /* }}} */ - - /** - * Get a single document from index - * - * @param integer $id id of index record - * @return boolean false in case of an error, otherwise true - */ - public function getDocument($id, $content=true) { /* {{{ */ - if(!$this->_conn) - return false; - - $sql = "SELECT ".$this->_rawid.", documentid, title, comment, owner, keywords, category, mimetype, origfilename, created, indexed, users, status, path".($content ? ", content" : "")." FROM docs WHERE ".$this->_rawid."='".$id."'"; - $res = $this->_conn->query($sql); - $doc = false; - if($res) { - if(!($rec = $res->fetch(PDO::FETCH_ASSOC))) - return false; - $doc = new SeedDMS_SQLiteFTS_Document(); - $doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('docid', $rec[$this->_rawid])); - $doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('document_id', $rec['documentid'])); - $doc->addField(SeedDMS_SQLiteFTS_Field::Text('title', $rec['title'])); - $doc->addField(SeedDMS_SQLiteFTS_Field::Text('comment', $rec['comment'])); - $doc->addField(SeedDMS_SQLiteFTS_Field::Text('keywords', $rec['keywords'])); - $doc->addField(SeedDMS_SQLiteFTS_Field::Text('category', $rec['category'])); - $doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('mimetype', $rec['mimetype'])); - $doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('origfilename', $rec['origfilename'])); - $doc->addField(SeedDMS_SQLiteFTS_Field::Text('owner', $rec['owner'])); - $doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('created', $rec['created'])); - $doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('indexed', $rec['indexed'])); - $doc->addField(SeedDMS_SQLiteFTS_Field::Text('users', $rec['users'])); - $doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('status', $rec['status'])); - $doc->addField(SeedDMS_SQLiteFTS_Field::Keyword('path', explode('x', substr($rec['path'], 1, -1)))); - if($content) - $doc->addField(SeedDMS_SQLiteFTS_Field::UnStored('content', $rec['content'])); - } - return $doc; - } /* }}} */ - - /** - * Return list of terms in index - * - * @return array list of SeedDMS_SQLiteFTS_Term - */ - public function terms($prefix='', $col='') { /* {{{ */ - if(!$this->_conn) - return false; - - if($this->_ftstype == 'fts5') { - $sql = "SELECT term, col, doc as occurrences FROM docs_terms"; - if($prefix || $col) { - $sql .= " WHERE"; - if($prefix) { - $sql .= " term like '".$prefix."%'"; - if($col) - $sql .= " AND"; - } - if($col) - $sql .= " col = '".$col."'"; - } - $sql .= " ORDER BY col, occurrences desc"; - } else { - $sql = "SELECT term, col, occurrences FROM docs_terms WHERE col!='*'"; - if($prefix) - $sql .= " AND term like '".$prefix."%'"; - if($col) - $sql .= " AND col = '".$col."'"; - $sql .= " ORDER BY col, occurrences desc"; - } - $res = $this->_conn->query($sql); - $terms = array(); - if($res) { - while($rec = $res->fetch(PDO::FETCH_ASSOC)) { - $term = new SeedDMS_SQLiteFTS_Term($rec['term'], $rec['col'], $rec['occurrences']); - $terms[] = $term; - } - } - return $terms; - } /* }}} */ - - /** - * Return number of documents in index - * - * @return interger number of documents - */ - public function count() { /* {{{ */ - $sql = "SELECT count(*) c FROM docs"; - $res = $this->_conn->query($sql); - if($res) { - $rec = $res->fetch(PDO::FETCH_ASSOC); - return $rec['c']; - } - return 0; - } /* }}} */ - - /** - * Commit changes - * - * This function does nothing! - */ - function commit() { /* {{{ */ - } /* }}} */ - - /** - * Optimize index - * - * This function does nothing! - */ - function optimize() { /* {{{ */ - } /* }}} */ -} -?> diff --git a/SeedDMS_SQLiteFTS/SQLiteFTS/QueryHit.php b/SeedDMS_SQLiteFTS/SQLiteFTS/QueryHit.php deleted file mode 100644 index 843be973d..000000000 --- a/SeedDMS_SQLiteFTS/SQLiteFTS/QueryHit.php +++ /dev/null @@ -1,72 +0,0 @@ - - * @copyright Copyright (C) 2010, Uwe Steinmann - * @version Release: @package_version@ - */ - - -/** - * Class for managing a query hit. - * - * @category DMS - * @package SeedDMS_SQLiteFTS - * @version @version@ - * @author Uwe Steinmann - * @copyright Copyright (C) 2011, Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_SQLiteFTS_QueryHit { - - /** - * @var SeedDMS_SQliteFTS_Indexer $index - * @access protected - */ - protected $_index; - - /** - * @var SeedDMS_SQliteFTS_Document $document - * @access protected - */ - protected $_document; - - /** - * @var integer $id id of index document - * @access public - */ - public $id; - - /** - * @var integer $id id of real document - * @access public - */ - public $documentid; - - /** - * - */ - public function __construct(SeedDMS_SQLiteFTS_Indexer $index) { /* {{{ */ - $this->_index = $index; - $this->_document = null; - } /* }}} */ - - /** - * Return the document associated with this hit - * - * @return SeedDMS_SQLiteFTS_Document - */ - public function getDocument() { /* {{{ */ - if (!$this->_document instanceof SeedDMS_SQLiteFTS_Document) { - $this->_document = $this->_index->getDocument($this->id); - } - - return $this->_document; - } /* }}} */ -} -?> diff --git a/SeedDMS_SQLiteFTS/SQLiteFTS/Search.php b/SeedDMS_SQLiteFTS/SQLiteFTS/Search.php deleted file mode 100644 index 22c43a1e5..000000000 --- a/SeedDMS_SQLiteFTS/SQLiteFTS/Search.php +++ /dev/null @@ -1,166 +0,0 @@ - - * @copyright Copyright (C) 2010, Uwe Steinmann - * @version Release: @package_version@ - */ - - -/** - * Class for searching in a SQlite FTS index. - * - * @category DMS - * @package SeedDMS_Lucene - * @version @version@ - * @author Uwe Steinmann - * @copyright Copyright (C) 2011, Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_SQliteFTS_Search { - /** - * @var object $index SQlite FTS index - * @access protected - */ - protected $index; - - /** - * Create a new instance of the search - * - * @param object $index SQlite FTS index - * @return object instance of SeedDMS_SQliteFTS_Search - */ - function __construct($index) { /* {{{ */ - $this->index = $index; - $this->version = '@package_version@'; - if($this->version[0] == '@') - $this->version = '3.0.0'; - } /* }}} */ - - /** - * Get document from index - * - * @param int $id id of seeddms document - * @return object instance of SeedDMS_SQliteFTS_QueryHit or false - */ - function getDocument($id) { /* {{{ */ - $hits = $this->index->findById('D'.$id); - return $hits ? $hits[0] : false; - } /* }}} */ - - /** - * Get folder from index - * - * @param int $id id of seeddms folder - * @return object instance of SeedDMS_SQliteFTS_QueryHit or false - */ - function getFolder($id) { /* {{{ */ - $hits = $this->index->findById('F'.$id); - return $hits ? $hits[0] : false; - } /* }}} */ - - /** - * Search in index - * - * @param object $index SQlite FTS index - * @return object instance of SeedDMS_Lucene_Search - */ - function search($term, $fields=array(), $limit=array(), $order=array()) { /* {{{ */ - $querystr = ''; - $term = trim($term); - if($term) { - $querystr = substr($term, -1) != '*' ? $term.'*' : $term; - } - if(!empty($fields['owner'])) { - if(is_string($fields['owner'])) { - if($querystr) - $querystr .= ' AND '; - $querystr .= 'owner:'.$fields['owner']; - } elseif(is_array($fields['owner'])) { - if($querystr) - $querystr .= ' AND '; - $querystr .= '(owner:'; - $querystr .= implode(' OR owner:', $fields['owner']); - $querystr .= ')'; - } - } - if(!empty($fields['record_type'])) { - if($querystr) - $querystr .= ' AND '; - $querystr .= '(record_type:'; - $querystr .= implode(' OR record_type:', $fields['record_type']); - $querystr .= ')'; - } - if(!empty($fields['category'])) { - if($querystr) - $querystr .= ' AND '; - $querystr .= '(category:"'; - $querystr .= implode('" AND category:"', $fields['category']); - $querystr .= '")'; - } - if(!empty($fields['mimetype'])) { - if($querystr) - $querystr .= ' AND '; - $querystr .= '(mimetype:"'; - $querystr .= implode('" OR mimetype:"', $fields['mimetype']); - $querystr .= '")'; - } - if(!empty($fields['status'])) { - if($querystr) - $querystr .= ' AND '; - $status = array_map(function($v){return (int)$v+10;}, $fields['status']); - $querystr .= '(status:'; - $querystr .= implode(' OR status:', $status); - $querystr .= ')'; - } - if(!empty($fields['user'])) { - if($querystr) - $querystr .= ' AND '; - $querystr .= '(users:'; - $querystr .= implode(' OR users:', $fields['user']); - $querystr .= ')'; - } - if(!empty($fields['rootFolder']) && $fields['rootFolder']->getFolderList()) { - if($querystr) - $querystr .= ' AND '; - $querystr .= '(path:'; - $querystr .= str_replace(':', 'x', $fields['rootFolder']->getFolderList().$fields['rootFolder']->getID().':'); - $querystr .= '*)'; - } - if(!empty($fields['startFolder']) && $fields['startFolder']->getFolderList()) { - if($querystr) - $querystr .= ' AND '; - $querystr .= '(path:'; - $querystr .= str_replace(':', 'x', $fields['startFolder']->getFolderList().$fields['startFolder']->getID().':'); - $querystr .= '*)'; - } - - $filterstr = ''; - if(!empty($fields['created_start'])) { - if($filterstr) - $filterstr .= ' AND '; - $filterstr .= '(created>='.$fields['created_start'].')'; - } - if(!empty($fields['created_end'])) { - if($filterstr) - $filterstr .= ' AND '; - $filterstr .= '(created<'.$fields['created_end'].')'; - } - try { - $result = $this->index->find($querystr, $filterstr, $limit, $order); - $recs = array(); - foreach($result["hits"] as $hit) { - $recs[] = array('id'=>$hit->id, 'document_id'=>$hit->documentid); - } - return array('count'=>$result['count'], 'hits'=>$recs, 'facets'=>$result['facets']); - } catch (Exception $e) { - return false; - } - } /* }}} */ -} -?> diff --git a/SeedDMS_SQLiteFTS/SQLiteFTS/Term.php b/SeedDMS_SQLiteFTS/SQLiteFTS/Term.php deleted file mode 100644 index e31ff56bc..000000000 --- a/SeedDMS_SQLiteFTS/SQLiteFTS/Term.php +++ /dev/null @@ -1,75 +0,0 @@ - - * @copyright Copyright (C) 2010, Uwe Steinmann - * @version Release: @package_version@ - */ - - -/** - * Class for managing a term. - * - * @category DMS - * @package SeedDMS_SQLiteFTS - * @version @version@ - * @author Uwe Steinmann - * @copyright Copyright (C) 2011, Uwe Steinmann - * @version Release: @package_version@ - */ -class SeedDMS_SQLiteFTS_Term { - - /** - * @var string $text - * @access public - */ - public $text; - - /** - * @var string $field - * @access public - */ - public $field; - - /** - * @var integer $occurrence - * @access public - */ - public $_occurrence; - - /** - * - */ - public function __construct($term, $col, $occurrence) { /* {{{ */ - $this->text = $term; - $fields = array( - 0 => 'documentid', - 1 => 'title', - 2 => 'comment', - 3 => 'keywords', - 4 => 'category', - 5 => 'mimetype', - 6 => 'origfilename', - 7 => 'owner', - 8 => 'content', - 9 => 'created', - 10 => 'user', - 11 => 'status', - 12 => 'path', - 13 => 'indexed', - ); - /* fts5 pass the column name in $col, fts4 uses an integer */ - if(is_int($col)) - $this->field = $fields[$col]; - else - $this->field = $col; //$fields[$col]; - $this->_occurrence = $occurrence; - } /* }}} */ - -} -?> diff --git a/SeedDMS_SQLiteFTS/composer.json b/SeedDMS_SQLiteFTS/composer.json deleted file mode 100644 index 90a19cd7d..000000000 --- a/SeedDMS_SQLiteFTS/composer.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "seeddms/lucene", - "description": "SQLiteFTS based fulltext search for SeedDMS ", - "type": "library", - "license": "GPL-2.0-or-later", - "minimum-stability": "dev", - "autoload": { - "psr-4": { - "Seeddms\\SQLiteFTS\\": "SQLiteFTS/" - }, - "classmap": ["SQLiteFTS/"] - }, - "authors": [ - { - "name": "Uwe Steinmann", - "email": "info@seeddms.org" - } - ], - "require-dev": { - "phpunit/phpunit": "^9" - } - -} diff --git a/SeedDMS_SQLiteFTS/package.xml b/SeedDMS_SQLiteFTS/package.xml deleted file mode 100644 index 2b7dfe0b5..000000000 --- a/SeedDMS_SQLiteFTS/package.xml +++ /dev/null @@ -1,376 +0,0 @@ - - - SeedDMS_SQLiteFTS - pear.php.net - Fulltext search based on sqlite for SeedDMS - SeedDMS is a web based document management system (DMS). This is - the fulltext search engine for it, based on SQLite FTS. - - Uwe Steinmann - steinm - uwe@steinmann.cx - yes - - 2023-01-09 - - - 1.0.18 - 1.0.18 - - - stable - stable - - GPL License - -- add optional parameter $order to SeedDMS_SQLiteFTS_Indexer::find() -- add optional parameters $query and $col to SeedDMS_SQLiteFTS_Indexer::terms() -- IndexedDocument() accepts a callable for conversion to text -- remove stop words from content - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 4.3.0 - - - 1.5.4 - - - - - - - 2015-08-10 - - - 1.0.0 - 1.0.0 - - - stable - stable - - GPL License - -- initial release - - - - 2015-11-16 - - - 1.0.1 - 1.0.1 - - - stable - stable - - GPL License - -- add __get() to SQLiteFTS_Document because class.IndexInfo.php access class variable title which doesn't exists - - - - 2016-01-10 - - - 1.0.2 - 1.0.1 - - - stable - stable - - GPL License - -- check if index exists before removing it when creating a new one - - - - 2016-02-01 - - - 1.0.3 - 1.0.1 - - - stable - stable - - GPL License - -- add command for indexing postѕcript files - - - - 2016-03-15 - - - 1.0.4 - 1.0.1 - - - stable - stable - - GPL License - -- make it work with sqlite3 < 3.8.0 - - - - 2016-03-29 - - - 1.0.5 - 1.0.1 - - - stable - stable - - GPL License - -- set last parameter of stream_select() to 200000 micro sec. in case the timeout in sec. is set to 0 - - - - 2016-03-29 - - - 1.0.6 - 1.0.1 - - - stable - stable - - GPL License - -- fix calculation of timeout (see bug #269) - - - - 2017-03-01 - - - 1.0.7 - 1.0.7 - - - stable - stable - - GPL License - -- catch exception in execWithTimeout() - - - - 2017-12-04 - - - 1.0.8 - 1.0.8 - - - stable - stable - - GPL License - -- allow conversion commands for mimetypes with wildcards - - - - 2018-01-30 - - - 1.0.9 - 1.0.9 - - - stable - stable - - GPL License - -- execWithTimeout() reads data from stderr and saves it into error msg - - - - 2018-04-11 - - - 1.0.10 - 1.0.10 - - - stable - stable - - GPL License - -- IndexedDocument() remembers cmd and mimetype - - - - 2019-11-28 - - - 1.0.11 - 1.0.11 - - - stable - stable - - GPL License - -- Set 'created' in index to creation date of indexed content (was set to current -timestamp) - - - - 2020-09-02 - - - 1.0.12 - 1.0.12 - - - stable - stable - - GPL License - -- Index users with at least read access on a document - - - - 2020-09-02 - - - 1.0.13 - 1.0.13 - - - stable - stable - - GPL License - -- add user to list of terms - - - - 2020-09-11 - - - 1.0.14 - 1.0.14 - - - stable - stable - - GPL License - -- add searching for document status -- search even if query is empty (will find all documents) -- parameters for SeedDMS_SQLiteFTS_Search::search() has changed -- SeedDMS_Lucene_Search::search() returns array of hits, count and facets -- pass config array instead of index directory to SeedDMS_Lucene_Indexer::create() - and SeedDMS_Lucene_Indexer::open() - - - - 2020-12-12 - - - 1.0.15 - 1.0.15 - - - stable - stable - - GPL License - -- add indexing folders - - - - 2021-05-10 - - - 1.0.16 - 1.0.16 - - - stable - stable - - GPL License - -- close pipes in execWithTimeout(), also return exit code of command -- add support for fts5 (make it the default) -- add class SeedDMS_SQLiteFTS_Field - - - - 2022-03-04 - - - 1.0.17 - 1.0.17 - - - stable - stable - - GPL License - -- throw exeption in find() instead of returning false -- fix query if rootFolder or startFolder is set - - - - diff --git a/SeedDMS_SQLiteFTS/tests/Index.php b/SeedDMS_SQLiteFTS/tests/Index.php deleted file mode 100644 index e69de29bb..000000000