From: colemanw Date: Wed, 28 Sep 2016 13:50:53 +0000 (-0400) Subject: Merge pull request #9124 from mlutfy/master-crm17991 X-Git-Url: https://vcs.fsf.org/?a=commitdiff_plain;h=53fff622a37bb4bccccdc839e0843dab36579125;hp=4a3ed8390725cd28e29f6ae227704f2c48e96745;p=civicrm-core.git Merge pull request #9124 from mlutfy/master-crm17991 CRM-17991: Fix Safari JS bug in COntribution popups (affects softcredits, pledges). --- diff --git a/CRM/Contact/BAO/SavedSearch.php b/CRM/Contact/BAO/SavedSearch.php index 90f4ddc530..bfc6e10f94 100644 --- a/CRM/Contact/BAO/SavedSearch.php +++ b/CRM/Contact/BAO/SavedSearch.php @@ -113,9 +113,14 @@ class CRM_Contact_BAO_SavedSearch extends CRM_Contact_DAO_SavedSearch { $value = CRM_Utils_Array::value(key($value), $value); } if (strpos($id, '_date_low') !== FALSE || strpos($id, '_date_high') !== FALSE) { - $result[$id] = date($dateFormat, strtotime($value)); $entityName = strstr($id, '_date', TRUE); - $result["{$entityName}_date_relative"] = 0; + if (!empty($result['relative_dates']) && array_key_exists($entityName, $result['relative_dates'])) { + $result["{$entityName}_date_relative"] = $result['relative_dates'][$entityName]; + } + else { + $result[$id] = date($dateFormat, strtotime($value)); + $result["{$entityName}_date_relative"] = 0; + } } else { $result[$id] = $value; @@ -389,4 +394,24 @@ LEFT JOIN civicrm_email ON (contact_a.id = civicrm_email.contact_id AND civicrm_ } } + /** + * Store relative dates in separate array format + * + * @param array $queryParams + * @param array $formValues + */ + public static function saveRelativeDates(&$queryParams, $formValues) { + $relativeDates = array('relative_dates' => array()); + foreach ($formValues as $id => $value) { + if (preg_match('/_date_relative$/', $id) && !empty($value)) { + $entityName = strstr($id, '_date', TRUE); + $relativeDates['relative_dates'][$entityName] = $value; + } + } + // merge with original queryParams if relative date value(s) found + if (count($relativeDates['relative_dates'])) { + $queryParams = array_merge($queryParams, $relativeDates); + } + } + } diff --git a/CRM/Contact/Form/Task/SaveSearch.php b/CRM/Contact/Form/Task/SaveSearch.php index e4ef5cb020..2e1f7a9e77 100644 --- a/CRM/Contact/Form/Task/SaveSearch.php +++ b/CRM/Contact/Form/Task/SaveSearch.php @@ -189,6 +189,7 @@ class CRM_Contact_Form_Task_SaveSearch extends CRM_Contact_Form_Task { // Ideally per CRM-17075 we will use entity reference fields heavily in the form layer & convert to the // sql operator syntax at the query layer. if (!$isSearchBuilder) { + CRM_Contact_BAO_SavedSearch::saveRelativeDates($queryParams, $formValues); $savedSearch->form_values = serialize($queryParams); } else { diff --git a/CRM/Contact/Import/Form/Preview.php b/CRM/Contact/Import/Form/Preview.php index 57f8e08aaa..c516795b74 100644 --- a/CRM/Contact/Import/Form/Preview.php +++ b/CRM/Contact/Import/Form/Preview.php @@ -304,12 +304,8 @@ class CRM_Contact_Import_Form_Preview extends CRM_Import_Form_Preview { // run the import $importJob->runImport($this); - // update cache after we done with runImport - if (!CRM_Core_Permission::check('view all contacts')) { - CRM_ACL_BAO_Cache::updateEntry($userID); - } - - // clear all caches + // Clear all caches, forcing any searches to recheck the ACLs or group membership as the import + // may have changed it. CRM_Contact_BAO_Contact_Utils::clearContactCaches(); // add all the necessary variables to the form diff --git a/CRM/Contribute/BAO/ContributionSoft.php b/CRM/Contribute/BAO/ContributionSoft.php index 756c22a37c..5d835e9570 100644 --- a/CRM/Contribute/BAO/ContributionSoft.php +++ b/CRM/Contribute/BAO/ContributionSoft.php @@ -230,10 +230,16 @@ class CRM_Contribute_BAO_ContributionSoft extends CRM_Contribute_DAO_Contributio public static function del($params) { //delete from contribution soft table $contributionSoft = new CRM_Contribute_DAO_ContributionSoft(); + $contributionSoft->id = $params['id']; + if (!$contributionSoft->find()) { + return FALSE; + } + unset($params['id']); foreach ($params as $column => $value) { $contributionSoft->$column = $value; } $contributionSoft->delete(); + return TRUE; } /** diff --git a/CRM/Core/BAO/Dashboard.php b/CRM/Core/BAO/Dashboard.php index ccc82d105c..d64620e3f6 100644 --- a/CRM/Core/BAO/Dashboard.php +++ b/CRM/Core/BAO/Dashboard.php @@ -493,6 +493,9 @@ class CRM_Core_BAO_Dashboard extends CRM_Core_DAO_Dashboard { public static function deleteDashlet($dashletID) { $dashlet = new CRM_Core_DAO_Dashboard(); $dashlet->id = $dashletID; + if (!$dashlet->find(TRUE)) { + return FALSE; + } $dashlet->delete(); return TRUE; } diff --git a/CRM/Core/BAO/OptionValue.php b/CRM/Core/BAO/OptionValue.php index a529d1b18d..0fc76b3121 100644 --- a/CRM/Core/BAO/OptionValue.php +++ b/CRM/Core/BAO/OptionValue.php @@ -240,9 +240,13 @@ class CRM_Core_BAO_OptionValue extends CRM_Core_DAO_OptionValue { public static function del($optionValueId) { $optionValue = new CRM_Core_DAO_OptionValue(); $optionValue->id = $optionValueId; + if (!$optionValue->find()) { + return FALSE; + } if (self::updateRecords($optionValueId, CRM_Core_Action::DELETE)) { CRM_Core_PseudoConstant::flush(); - return $optionValue->delete(); + $optionValue->delete(); + return TRUE; } return FALSE; } diff --git a/CRM/Core/I18n/Schema.php b/CRM/Core/I18n/Schema.php index c51bcb07fe..616cb4940b 100644 --- a/CRM/Core/I18n/Schema.php +++ b/CRM/Core/I18n/Schema.php @@ -78,14 +78,18 @@ class CRM_Core_I18n_Schema { // drop old indices if (isset($indices[$table])) { foreach ($indices[$table] as $index) { - $queries[] = "DROP INDEX {$index['name']} ON {$table}"; + if (CRM_Core_BAO_SchemaHandler::checkIfIndexExists($table, $index['name'])) { + $queries[] = "DROP INDEX {$index['name']} ON {$table}"; + } } } // deal with columns foreach ($hash as $column => $type) { $queries[] = "ALTER TABLE {$table} ADD {$column}_{$locale} {$type}"; - $queries[] = "UPDATE {$table} SET {$column}_{$locale} = {$column}"; - $queries[] = "ALTER TABLE {$table} DROP {$column}"; + if (CRM_Core_BAO_SchemaHandler::checkIfFieldExists($table, $column)) { + $queries[] = "UPDATE {$table} SET {$column}_{$locale} = {$column}"; + $queries[] = "ALTER TABLE {$table} DROP {$column}"; + } } // add view diff --git a/CRM/Core/ManagedEntities.php b/CRM/Core/ManagedEntities.php index 4de184a28c..5021859b01 100644 --- a/CRM/Core/ManagedEntities.php +++ b/CRM/Core/ManagedEntities.php @@ -334,14 +334,17 @@ class CRM_Core_ManagedEntities { 'version' => 3, 'id' => $dao->entity_id, ); - $result = civicrm_api($dao->entity_type, 'delete', $params); - if ($result['is_error']) { - $this->onApiError($dao->entity_type, 'delete', $params, $result); - } + $check = civicrm_api3($dao->entity_type, 'get', $params); + if ((bool) $check['count']) { + $result = civicrm_api($dao->entity_type, 'delete', $params); + if ($result['is_error']) { + $this->onApiError($dao->entity_type, 'delete', $params, $result); + } - CRM_Core_DAO::executeQuery('DELETE FROM civicrm_managed WHERE id = %1', array( - 1 => array($dao->id, 'Integer'), - )); + CRM_Core_DAO::executeQuery('DELETE FROM civicrm_managed WHERE id = %1', array( + 1 => array($dao->id, 'Integer'), + )); + } } } diff --git a/CRM/Event/BAO/Participant.php b/CRM/Event/BAO/Participant.php index 49921a411e..b2a608f466 100644 --- a/CRM/Event/BAO/Participant.php +++ b/CRM/Event/BAO/Participant.php @@ -870,6 +870,11 @@ WHERE civicrm_participant.id = {$participantId} * @return \CRM_Event_DAO_Participant */ public static function deleteParticipant($id) { + $participant = new CRM_Event_DAO_Participant(); + $participant->id = $id; + if (!$participant->find()) { + return FALSE; + } CRM_Utils_Hook::pre('delete', 'Participant', $id, CRM_Core_DAO::$_nullArray); $transaction = new CRM_Core_Transaction(); @@ -902,8 +907,6 @@ WHERE civicrm_participant.id = {$participantId} CRM_Core_BAO_Note::del($noteId, FALSE); } - $participant = new CRM_Event_DAO_Participant(); - $participant->id = $id; $participant->delete(); $transaction->commit(); diff --git a/CRM/Event/BAO/ParticipantStatusType.php b/CRM/Event/BAO/ParticipantStatusType.php index 802c7363d3..05308d69b8 100644 --- a/CRM/Event/BAO/ParticipantStatusType.php +++ b/CRM/Event/BAO/ParticipantStatusType.php @@ -80,7 +80,9 @@ class CRM_Event_BAO_ParticipantStatusType extends CRM_Event_DAO_ParticipantStatu $dao = new CRM_Event_DAO_ParticipantStatusType(); $dao->id = $id; - $dao->find(TRUE); + if (!$dao->find()) { + return FALSE; + } $dao->delete(); return TRUE; } diff --git a/CRM/Logging/Schema.php b/CRM/Logging/Schema.php index 402a77df52..2da0f090f9 100644 --- a/CRM/Logging/Schema.php +++ b/CRM/Logging/Schema.php @@ -396,7 +396,7 @@ AND (TABLE_NAME LIKE 'log_civicrm_%' $nonStandardTableNameString ) if (!empty($cols[$alterType])) { foreach ($cols[$alterType] as $col) { $line = $this->_getColumnQuery($col, $create); - CRM_Core_DAO::executeQuery("ALTER TABLE `{$this->db}`.log_$table {$alterType} {$line}"); + CRM_Core_DAO::executeQuery("ALTER TABLE `{$this->db}`.log_$table {$alterType} {$line}", array(), TRUE, NULL, FALSE, FALSE); } } } @@ -407,7 +407,7 @@ AND (TABLE_NAME LIKE 'log_civicrm_%' $nonStandardTableNameString ) foreach ($cols['OBSOLETE'] as $col) { $line = $this->_getColumnQuery($col, $create); // This is just going to make a not null column to nullable - CRM_Core_DAO::executeQuery("ALTER TABLE `{$this->db}`.log_$table MODIFY {$line}"); + CRM_Core_DAO::executeQuery("ALTER TABLE `{$this->db}`.log_$table MODIFY {$line}", array(), TRUE, NULL, FALSE, FALSE); } } @@ -426,7 +426,7 @@ AND (TABLE_NAME LIKE 'log_civicrm_%' $nonStandardTableNameString ) * @return array */ private function _getCreateQuery($table) { - $dao = CRM_Core_DAO::executeQuery("SHOW CREATE TABLE {$table}"); + $dao = CRM_Core_DAO::executeQuery("SHOW CREATE TABLE {$table}", array(), TRUE, NULL, FALSE, FALSE); $dao->fetch(); $create = explode("\n", $dao->Create_Table); return $create; diff --git a/CRM/Member/BAO/MembershipStatus.php b/CRM/Member/BAO/MembershipStatus.php index 3e9033b14a..5cdd7b9810 100644 --- a/CRM/Member/BAO/MembershipStatus.php +++ b/CRM/Member/BAO/MembershipStatus.php @@ -207,6 +207,9 @@ class CRM_Member_BAO_MembershipStatus extends CRM_Member_DAO_MembershipStatus { //delete from membership Type table $membershipStatus = new CRM_Member_DAO_MembershipStatus(); $membershipStatus->id = $membershipStatusId; + if (!$membershipStatus->find()) { + throw new CRM_Core_Exception(ts('Cannot delete membership status ' . $membershipStatusId)); + } $membershipStatus->delete(); CRM_Member_PseudoConstant::flush('membershipStatus'); $membershipStatus->free(); diff --git a/CRM/Utils/File.php b/CRM/Utils/File.php index 485280bd74..284b71a5ea 100644 --- a/CRM/Utils/File.php +++ b/CRM/Utils/File.php @@ -604,6 +604,8 @@ HTACCESS; // make everything absolute from the baseFilePath $basePath = ($basePath === NULL) ? self::baseFilePath() : $basePath; + // ensure that $basePath has a trailing slash + $basePath = self::addTrailingSlash($basePath); return $basePath . $directory; } diff --git a/ang/crmMailing/BlockMailing.html b/ang/crmMailing/BlockMailing.html index 4323877190..e4556ef6b1 100644 --- a/ang/crmMailing/BlockMailing.html +++ b/ang/crmMailing/BlockMailing.html @@ -61,7 +61,7 @@ It could perhaps be thinned by 30-60% by making more directives. ng-model="mailing.recipients.groups.base[0]" ng-required="true" > - + diff --git a/api/v3/ActivityType.php b/api/v3/ActivityType.php index f54c8bf9be..ad15847d1d 100644 --- a/api/v3/ActivityType.php +++ b/api/v3/ActivityType.php @@ -117,5 +117,9 @@ function _civicrm_api3_activity_type_create_spec(&$params) { * @deprecated use OptionValue api */ function civicrm_api3_activity_type_delete($params) { - return civicrm_api3_create_success(CRM_Core_BAO_OptionValue::del($params['id']), $params); + $result = CRM_Core_BAO_OptionValue::del($params['id']); + if ($result) { + return civicrm_api3_create_success(TRUE, $params); + } + throw new API_Exception("Failure to delete activity type id {$params['id']}"); } diff --git a/api/v3/ContributionSoft.php b/api/v3/ContributionSoft.php index 3bfe307f2f..30b7a46e68 100644 --- a/api/v3/ContributionSoft.php +++ b/api/v3/ContributionSoft.php @@ -65,8 +65,11 @@ function _civicrm_api3_contribution_soft_create_spec(&$params) { */ function civicrm_api3_contribution_soft_delete($params) { // Non standard BAO - we have to write custom code to cope. - CRM_Contribute_BAO_ContributionSoft::del(array('id' => $params['id'])); - + $result = CRM_Contribute_BAO_ContributionSoft::del(array('id' => $params['id'])); + if (!$result) { + throw new API_Exception('Cannot delete contributionSoft ' . $params['id']); + } + civicrm_api3_create_success(TRUE); } /** diff --git a/api/v3/Dashboard.php b/api/v3/Dashboard.php index 904fc837cf..77f6d30bd6 100644 --- a/api/v3/Dashboard.php +++ b/api/v3/Dashboard.php @@ -93,6 +93,6 @@ function civicrm_api3_dashboard_delete($params) { return civicrm_api3_create_success(1, $params, 'Dashboard', 'delete'); } else { - return civicrm_api3_create_error('Could not delete dashlet'); + throw new API_Exception('Could not delete dashlet'); } } diff --git a/api/v3/Group.php b/api/v3/Group.php index c0e1188ea7..f53172961e 100644 --- a/api/v3/Group.php +++ b/api/v3/Group.php @@ -97,7 +97,10 @@ function civicrm_api3_group_get($params) { * API result array */ function civicrm_api3_group_delete($params) { - + $group = civicrm_api3_group_get(array('id' => $params['id'])); + if ($group['count'] == 0) { + throw new API_Exception('Could not delete group ' . $params['id']); + } CRM_Contact_BAO_Group::discard($params['id']); return civicrm_api3_create_success(TRUE); } diff --git a/api/v3/GroupContact.php b/api/v3/GroupContact.php index 1546b692a9..e296e18297 100644 --- a/api/v3/GroupContact.php +++ b/api/v3/GroupContact.php @@ -146,6 +146,10 @@ function civicrm_api3_group_contact_create($params) { * @deprecated */ function civicrm_api3_group_contact_delete($params) { + $groupContact = civicrm_api3('GroupContact', 'get', $params); + if ($groupContact['count'] == 0) { + throw new API_Exception('Cannot Delete GroupContact'); + } $params['status'] = CRM_Utils_Array::value('status', $params, empty($params['skip_undelete']) ? 'Removed' : 'Deleted'); // "Deleted" isn't a real option so skip the api wrapper to avoid pseudoconstant validation return civicrm_api3_group_contact_create($params); diff --git a/api/v3/Job.php b/api/v3/Job.php index e859cf55f5..9b9696ecfd 100644 --- a/api/v3/Job.php +++ b/api/v3/Job.php @@ -634,7 +634,7 @@ function civicrm_api3_job_disable_expired_relationships($params) { function civicrm_api3_job_group_rebuild($params) { $lock = Civi::lockManager()->acquire('worker.core.GroupRebuild'); if (!$lock->isAcquired()) { - throw new API_Exception('Could not acquire lock, another EmailProcessor process is running'); + throw new API_Exception('Could not acquire lock, another GroupRebuild process is running'); } $limit = CRM_Utils_Array::value('limit', $params, 0); diff --git a/api/v3/MembershipStatus.php b/api/v3/MembershipStatus.php index 499c823fe3..696de0ad4a 100644 --- a/api/v3/MembershipStatus.php +++ b/api/v3/MembershipStatus.php @@ -126,7 +126,10 @@ function civicrm_api3_membership_status_update($params) { function civicrm_api3_membership_status_delete($params) { $memberStatusDelete = CRM_Member_BAO_MembershipStatus::del($params['id'], TRUE); - return $memberStatusDelete ? civicrm_api3_create_error($memberStatusDelete['error_message']) : civicrm_api3_create_success(); + if ($memberStatusDelete) { + throw new API_Exception($memberStatusDelete['error_message']); + } + return civicrm_api3_create_success(); } /** diff --git a/api/v3/OptionValue.php b/api/v3/OptionValue.php index e34f3ec28b..2e5cd6d4a1 100644 --- a/api/v3/OptionValue.php +++ b/api/v3/OptionValue.php @@ -106,11 +106,12 @@ function _civicrm_api3_option_value_create_spec(&$params) { function civicrm_api3_option_value_delete($params) { // We will get the option group id before deleting so we can flush pseudoconstants. $optionGroupID = civicrm_api('option_value', 'getvalue', array('version' => 3, 'id' => $params['id'], 'return' => 'option_group_id')); - if (CRM_Core_BAO_OptionValue::del((int) $params['id'])) { + $result = CRM_Core_BAO_OptionValue::del($params['id']); + if ($result) { civicrm_api('option_value', 'getfields', array('version' => 3, 'cache_clear' => 1, 'option_group_id' => $optionGroupID)); return civicrm_api3_create_success(); } else { - civicrm_api3_create_error('Could not delete OptionValue ' . $params['id']); + throw new API_Exception('Could not delete OptionValue ' . $params['id']); } } diff --git a/api/v3/ParticipantStatusType.php b/api/v3/ParticipantStatusType.php index fc3549f995..c433fc5b9a 100644 --- a/api/v3/ParticipantStatusType.php +++ b/api/v3/ParticipantStatusType.php @@ -77,5 +77,5 @@ function civicrm_api3_participant_status_type_delete($params) { return civicrm_api3_create_success(TRUE); } - return civicrm_api3_create_error(TRUE); + throw new API_Exception('Could not delete participant status type id ' . $params['id']); } diff --git a/api/v3/SystemLog.php b/api/v3/SystemLog.php index 9b624639e4..b1248f6c2b 100644 --- a/api/v3/SystemLog.php +++ b/api/v3/SystemLog.php @@ -39,7 +39,7 @@ * @return array */ function civicrm_api3_system_log_delete($params) { - return _civicrm_api3_basic_get(_civicrm_api3_get_BAO(__FUNCTION__), $params, TRUE, 'SystemLog'); + return _civicrm_api3_basic_delete(_civicrm_api3_get_BAO(__FUNCTION__), $params); } /** diff --git a/api/v3/utils.php b/api/v3/utils.php index 078d9717e2..96f616b32e 100644 --- a/api/v3/utils.php +++ b/api/v3/utils.php @@ -1457,9 +1457,14 @@ function _civicrm_api3_basic_delete($bao_name, &$params) { _civicrm_api3_check_edit_permissions($bao_name, array('id' => $params['id'])); $args = array(&$params['id']); if (method_exists($bao_name, 'del')) { - $bao = call_user_func_array(array($bao_name, 'del'), $args); - if ($bao !== FALSE) { - return civicrm_api3_create_success(TRUE); + $dao = new $bao_name(); + $dao->id = $params['id']; + if ($dao->find()) { + $bao = call_user_func_array(array($bao_name, 'del'), $args); + if ($bao !== FALSE) { + return civicrm_api3_create_success(); + } + throw new API_Exception('Could not delete entity id ' . $params['id']); } throw new API_Exception('Could not delete entity id ' . $params['id']); } diff --git a/css/dashboard.css b/css/dashboard.css index 711f7fae0b..d73bddfbdf 100644 --- a/css/dashboard.css +++ b/css/dashboard.css @@ -9,10 +9,8 @@ float: left; margin: 0; /* padding-bottom and min-height make sure that there is always a sizable drop zone. */ - min-height: 400px; - height: 400px; - height: auto !important; - padding: 0 0 250px; + min-height: 200px; + padding: 0 0 40px; list-style-type: none; } diff --git a/templates/CRM/Contribute/Form/Contribution.tpl b/templates/CRM/Contribute/Form/Contribution.tpl index 78462bdaeb..1dacf49824 100644 --- a/templates/CRM/Contribute/Form/Contribution.tpl +++ b/templates/CRM/Contribute/Form/Contribution.tpl @@ -40,9 +40,12 @@ {/if} {if $contributionMode}
- {if $contactId} - {ts 1=$displayName 2=$contributionMode|upper}Use this form to {if $payNow} edit {else} submit a new {/if} contribution on behalf of %1. A - %2 transaction will be submitted using the selected payment processor.{/ts} + {if $contactId && $payNow} + {ts 1=$displayName 2=$contributionMode|upper}Use this form to edit a contribution on behalf of %1. A + %2 transaction will be submitted using the selected payment processor.{/ts} + {elseif $contactId} + {ts 1=$displayName 2=$contributionMode|upper}Use this form to submit a new contribution on behalf of %1. A + %2 transaction will be submitted using the selected payment processor.{/ts} {else} {ts 1=$displayName 2=$contributionMode|upper}Use this form to submit a new contribution. A %2 transaction will be submitted using the selected payment processor.{/ts} {/if} diff --git a/tests/mock/extension_browser_results/single b/tests/mock/extension_browser_results/single new file mode 100644 index 0000000000..ef9b00a2d9 --- /dev/null +++ b/tests/mock/extension_browser_results/single @@ -0,0 +1 @@ +{"org.civicrm.module.cividiscount":"\n\n cividiscount<\/file>\n CiviDiscount<\/name>\n Enables discount codes and automatic discounts for events and memberships.<\/description>\n \n \n http:\/\/civicrm.org\/extension\/cividiscount-extension\n <\/url>\n \n https:\/\/github.com\/dlobo\/org.civicrm.module.cividiscount\/\n <\/url>\n http:\/\/civicrm.stackexchange.com<\/url>\n http:\/\/civicrm.org\/licensing<\/url>\n <\/urls>\n AGPL-3.0<\/license>\n \n CiviCRM LLC<\/author>\n info@civicrm.org<\/email>\n <\/maintainer>\n 2016-03-04<\/releaseDate>\n 3.2<\/version>\n \n 4.5<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n \n For support, please contact the team on the forums. (http:\/\/forum.civicrm.org)\n <\/comments>\n \n CRM\/CiviDiscount<\/namespace>\n <\/civix>\nhttps:\/\/github.com\/dlobo\/org.civicrm.module.cividiscount\/archive\/3.2.zip<\/downloadUrl>stable<\/develStage><\/extension>\n","nz.co.fuzion.extendedreport":"\n\n https:\/\/github.com\/eileenmcnaughton\/nz.co.fuzion.extendedreport\/archive\/2.4.zip<\/downloadUrl>\n extendedreport<\/file>\n ExtendedReport<\/name>\n Extended reports<\/description>\n AGPL<\/license>\n \n http:\/\/civicrm.org<\/url>\n http:\/\/forum.civicrm.org<\/url>\n http:\/\/civicrm.org\/licensing<\/url>\n <\/urls>\n \n Eileen McNaughton<\/author>\n eileen@fuzion.co.nz<\/email>\n <\/maintainer>\n 2016-07-25<\/releaseDate>\n 2.4<\/version>\n stable<\/develStage>\n \n 4.4<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n Extended reports create other report options such as crosstab urls, multiple contact custom fields, price\n set reports\n <\/comments>\n \n CRM\/Extendedreport<\/namespace>\n <\/civix>\n<\/extension>\n","ca.bidon.reporterror":"\n\n reporterror<\/file>\n CiviCRM Report Error<\/name>\n Advanced error handler for CiviCRM that sends an e-mail with detailed information when fatal errors are encountered.<\/description>\n AGPL 3<\/license>\n \n Mathieu Lutfy<\/author>\n mathieu@bidon.ca<\/email>\n <\/maintainer>\n \n https:\/\/github.com\/mlutfy\/ca.bidon.reporterror<\/url>\n https:\/\/github.com\/mlutfy\/ca.bidon.reporterror\/blob\/master\/README.md<\/url>\n http:\/\/forum.civicrm.org\/index.php\/board,57.0.html<\/url>\n http:\/\/civicrm.org\/licensing<\/url>\n <\/urls>\n 2016-03-06<\/releaseDate>\n 2.9<\/version>\n stable<\/develStage>\n \n 4.2<\/ver>\n 4.3<\/ver>\n 4.4<\/ver>\n 4.5<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n \n \n CRM\/ReportError<\/namespace>\n <\/civix>\nhttps:\/\/github.com\/mlutfy\/ca.bidon.reporterror\/archive\/2.9.zip<\/downloadUrl><\/extension>\n","org.civicrm.multisite":"\n\n multisite<\/file>\n CiviCRM Multisite<\/name>\n Multisite permissioning for CiviCRM<\/description>\n \n http:\/\/wiki.civicrm.org\/confluence\/pages\/viewpage.action?pageId=86213708<\/url>\n http:\/\/forum.civicrm.org\/index.php\/board,51.0.html<\/url>\n http:\/\/civicrm.org\/licensing<\/url>\n <\/urls>\n AGPL<\/license>\n \n CiviCRM LLC<\/author>\n info@civicrm.org<\/email>\n <\/maintainer>\n 2016-07-25<\/releaseDate>\n 2.5<\/version>\n stable<\/develStage>\n \n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n This is a port of the CiviCRM multisite module to an extension. You will need to review the changes in this version<\/comments>\n \n CRM\/Multisite<\/namespace>\n <\/civix>\nhttps:\/\/github.com\/eileenmcnaughton\/org.civicrm.multisite\/archive\/2.5.zip<\/downloadUrl><\/extension>\n","org.civicrm.sms.twilio":"\n\n https:\/\/github.com\/civicrm\/org.civicrm.sms.twilio\/archive\/1.1.1.zip<\/downloadUrl>\n twilio<\/file>\n twilio<\/name>\n Twilio integration allows delivering short message service (SMS) messages through its Twilio Gateway to mobile phone users.<\/description>\n \n http:\/\/civicrm.org<\/url>\n http:\/\/wiki.civicrm.org\/confluence\/display\/CRMDOC\/Setting+up+a+SMS+Provider+for+CiviSMS<\/url>\n http:\/\/forum.civicrm.org<\/url>\n http:\/\/civicrm.org\/licensing<\/url>\n <\/urls>\n AGPL<\/license>\n \n Community Contributed<\/author>\n info@civicrm.org<\/email>\n <\/maintainer>\n 2016-06-24<\/releaseDate>\n 1.1.1<\/version>\n stable<\/develStage>\n \n 4.4<\/ver>\n 4.5<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n For support, please contact project team on the forums.<\/comments>\n<\/extension>\n","com.webaccessglobal.module.civimobile":"\n\n https:\/\/github.com\/webaccess\/com.webaccessglobal.module.civimobile\/archive\/2.0.zip<\/downloadUrl>\n civimobile<\/file>\n CiviMobile<\/name>\n Mobile interface for CiviCRM<\/description>\n \n http:\/\/civicrm.org\/extensions\/civimobile<\/url>\n https:\/\/github.com\/webaccess\/com.webaccessglobal.module.civimobile<\/url>\n https:\/\/github.com\/webaccess\/com.webaccessglobal.module.civimobile\/issues<\/url>\n http:\/\/civicrm.org\/licensing<\/url>\n <\/urls>\n AGPL-3.0<\/license>\n \n Web Access<\/author>\n info@webaccessglobal.com<\/email>\n <\/maintainer>\n 2016-04-12<\/releaseDate>\n 2.0<\/version>\n stable<\/develStage>\n \n 4.7<\/ver>\n <\/compatibility>\n For support, please contact the team on github. (https:\/\/github.com\/webaccess\/com.webaccessglobal.module.civimobile\/issues)<\/comments>\n<\/extension>\n","net.ourpowerbase.sumfields":"\n\n sumfields<\/file>\n Summary Fields<\/name>\n The Summary Fields extension creates read-only custom data fields that extend Contact and are automatically populated with up-to-date totals such as total lifetime contributions, last contribution amount, last attended event, etc.<\/description>\n GPL version 3<\/license>\n \n Jamie McClelland\/Progressive Technology Project<\/author>\n jamie@progressivetech.org<\/email>\n <\/maintainer>\n 2016-07-27<\/releaseDate>\n 2.0.6<\/version>\n stable<\/develStage>\n \n 4.4<\/ver>\n 4.5<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n This extension adds custom data fields and triggers to your database. Disabling this extension will cause the custom data fields to be deleted and triggers removed.<\/comments>\n \n CRM\/Sumfields<\/namespace>\n <\/civix>\n \n https:\/\/github.com\/progressivetech\/net.ourpowerbase.sumfields<\/url>\n https:\/\/github.com\/progressivetech\/net.ourpowerbase.sumfields<\/url>\n <\/urls>\nhttps:\/\/github.com\/progressivetech\/net.ourpowerbase.sumfields\/archive\/v2.0.6.zip<\/downloadUrl><\/extension>\n","uk.co.compucorp.civicrm.booking":"\n\n booking<\/file>\n CiviBooking<\/name>\n A CMS independent extension to allow organisations to manage a group of resources (i.e. rooms) offering these to constituents for a fee.<\/description>\n the GNU Affero General Public License 3 (GNU AGPL 3) and the CiviCRM Licensing Exception.<\/license>\n \n Erawat Chamanont, Jamie Novick, Guanhuan Chen<\/author>\n jamie@compucorpc.o.uk, guanhuan@compucorp.co.uk<\/email>\n <\/maintainer>\n \n http:\/\/civicrm.org\/extensions\/civibooking<\/url>\n https:\/\/github.com\/compucorp\/civibooking<\/url>\n support@compucorp.co.uk<\/url>\n http:\/\/civicrm.org\/licensing<\/url>\n <\/urls>\n \n 2016-07-25<\/releaseDate>\n 1.5<\/version>\n stable<\/develStage>\n \n 4.5<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n \n \n CRM\/Booking<\/namespace>\n <\/civix>\nhttps:\/\/github.com\/compucorp\/civibooking\/archive\/v1.5.zip<\/downloadUrl><\/extension>\n","org.civicrm.volunteer":"\n\n volunteer<\/file>\n CiviVolunteer<\/name>\n The CiviVolunteer extension provides tools for signing up, managing, and tracking volunteers.<\/description>\n AGPL-3.0<\/license>\n \n Ginkgo Street Labs; CiviCRM, LLC; and the CiviCRM community<\/author>\n inquire@ginkgostreet.com<\/email>\n <\/maintainer>\n 2016-08-10<\/releaseDate>\n 4.6-2.1.2<\/version>\n stable<\/develStage>\n \n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n \n Developed by Ginkgo Street Labs and CiviCRM, LLC with contributions from the community. Special thanks to Friends of Georgia State Parks & Historic Sites for funding the initial release, and to The Manhattan Neighborhood Network for funding the 1.4 release.\n <\/comments>\n \n CRM\/Volunteer<\/namespace>\n <\/civix>\n \n http:\/\/civicrm.github.io\/org.civicrm.volunteer\/docs<\/url>\n <\/urls>\nhttps:\/\/github.com\/civicrm\/org.civicrm.volunteer\/archive\/v4.6-2.1.2.zip<\/downloadUrl><\/extension>\n","nz.co.fuzion.csvimport":"\n\n csvimport<\/file>\n CSV GUI Import to api<\/name>\n Simply makes gui import available to api<\/description>\n AGPL<\/license>\n \n https:\/\/github.com\/eileenmcnaughton\/nz.co.fuzion.csvimport\/blob\/master\/README<\/url>\n https:\/\/github.com\/eileenmcnaughton\/nz.co.fuzion.csvimport\/blob\/master\/README<\/url>\n http:\/\/forum.civicrm.org<\/url>\n http:\/\/civicrm.org\/licensing<\/url>\n <\/urls>\n \n Eileen<\/author>\n eileen@fuzion.co.nz<\/email>\n <\/maintainer>\n 2016-06-11<\/releaseDate>\n 1.2<\/version>\n stable<\/develStage>\n \n 4.4<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n This is module which adds a UI to api create actions. There are no plans to provide free support for it<\/comments>\n \n CRM\/Csvimport<\/namespace>\n <\/civix>\nhttps:\/\/github.com\/eileenmcnaughton\/nz.co.fuzion.csvimport\/archive\/1.2.zip<\/downloadUrl><\/extension>\n","com.chrischinchilla.ewayrecurring":"\n\n ewayrecurring<\/file>\n eWay Recurring<\/name>\n Recurring payments payment processor for eWay<\/description>\n \n http:\/\/civicrm.org<\/url>\n http:\/\/civicrm.org<\/url>\n http:\/\/civicrm.org<\/url>\n http:\/\/civicrm.org<\/url>\n <\/urls>\n AGPL<\/license>\n \n Melbourne CiviCRM<\/author>\n noreply@civicrm.org<\/email>\n <\/maintainer>\n 2016-09-04<\/releaseDate>\n 1.2<\/version>\n stable<\/develStage>\n \n 4.4<\/ver>\n 4.5<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n \n \n CRM\/Ewayrecurring<\/namespace>\n <\/civix>\nhttps:\/\/github.com\/ChrisChinchilla\/CiviCRM-eWay-recurring-payment-processor\/archive\/1.2.zip<\/downloadUrl><\/extension>\n","nz.co.fuzion.entitysetting":"\n\n entitysetting<\/file>\n Entity Settings Helper Extension<\/name>\n This module provides a mechanism for managing settings associated with CiviCRM entities without a table per setting<\/description>\n AGPL<\/license>\n \n Eileen<\/author>\n eileen@fuzion.co.nz<\/email>\n <\/maintainer>\n 2016-06-17<\/releaseDate>\n \n http:\/\/civicrm.org<\/url>\n http:\/\/forum.civicrm.org<\/url>\n http:\/\/civicrm.org\/licensing<\/url>\n https:\/\/github.com\/eileenmcnaughton\/nz.co.fuzion.entitysetting\/blob\/master\/README.md<\/url>\n <\/urls>\n 1.2<\/version>\n stable<\/develStage>\n \n 4.2<\/ver>\n 4.4<\/ver>\n 4.5<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n This extension is provided to be a 'soft' dependency for other extension. It does not provide functionality itself<\/comments>\n \n CRM\/Entitysetting<\/namespace>\n <\/civix>\nhttps:\/\/github.com\/eileenmcnaughton\/nz.co.fuzion.entitysetting\/archive\/1.2.zip<\/downloadUrl><\/extension>\n","biz.jmaconsulting.grantapplications":"\n\n https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.grantapplications\/archive\/v1.5.zip<\/downloadUrl>\n grantapplications<\/file>\n Grant Applications<\/name>\n This extension enhances profile creation for Grants. Applicants can submit online grant applications after filling in fields that are configured through CiviProfile. Core and custom grant fields can be added to CiviProfiles to collect information about various applicants that will be applying online for grants. Online grant application pages can be created and managed from the grant dashboard.<\/description>\n \n https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.grantapplications\/issues?state=open<\/url>\n \n https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.grantapplications\/wiki\/About-grant-applications\n <\/url>\n https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.grantapplications\/blob\/4.7\/README.md<\/url>\n <\/urls>\n AGPL-3.0<\/license>\n \n JMA Consulting<\/author>\n joe.murray@jmaconsulting.biz<\/email>\n <\/maintainer>\n 2016-03-30<\/releaseDate>\n 1.5<\/version>\n stable<\/develStage>\n \n 4.7<\/ver>\n <\/compatibility>\n \n \n CRM\/Grantapplications<\/namespace>\n <\/civix>\n<\/extension>\n","biz.jmaconsulting.ode":"\n\n https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.ode\/archive\/v1.4.zip<\/downloadUrl>\n ode<\/file>\n Outbound Domain Enforcement<\/name>\n This CiviCRM extension is designed to preserve the email reputation of your server and its IP by ensuring that all outbound emailis sent from an address with the same domain as the System-generated Mail Settings From Email Address configured at Administer > Communications > Organization Address and Contact Info.<\/description>\n \n https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.ode\/issues?state=open<\/url>\n https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.ode\/blob\/master\/README.md<\/url>\n https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.ode\/blob\/master\/README.md<\/url>\n http:\/\/www.gnu.org\/licenses\/agpl-3.0.html<\/url>\n <\/urls>\n AGPL 3.0<\/license>\n \n JMA Consulting<\/author>\n joe.murray@jmaconsulting.biz<\/email>\n <\/maintainer>\n 2016-04-04<\/releaseDate>\n 1.4<\/version>\n stable<\/develStage>\n \n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n Thanks to Brescia University College for sponsoring the development of this module.<\/comments>\n \n CRM\/Ode<\/namespace>\n <\/civix>\n<\/extension>\n","biz.jmaconsulting.olarkchat":"\n\n https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.olarkchat\/archive\/1.3.zip<\/downloadUrl>\n olarkchat<\/file>\n Olark Chat Integration<\/name>\n Olark is a chat service that enables web site visitors to chat with staff of an organization. It has a good set of features for services in this space (http:\/\/www.olark.com\/features). This extension integrates the service with CiviCRM by posting chat transcripts as CiviCRM activities attached to the visitor's existing or newly created contact record and assigned to the relevant staff person's record.<\/description>\n \n https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.olarkchat\/issues?state=open<\/url>\n https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.olarkchat\/blob\/1.0\/README.md<\/url>\n <\/urls>\n AGPL-3.0<\/license>\n \n JMA Consulting<\/author>\n joe.murray@jmaconsulting.biz<\/email>\n <\/maintainer>\n 2016-02-26<\/releaseDate>\n 1.3<\/version>\n stable<\/develStage>\n \n 4.5<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n \n \n CRM\/Olarkchat<\/namespace>\n <\/civix>\n<\/extension>\n","com.pogstone.fancytokens":"\n\n fancytokens<\/file>\n Save time preparing newsletters: Fancy tokens for upcoming events, contribution pages, and forms<\/name>\n Additional tokens for contribution pages, upcoming event lists, individual event registration pages, and stand-alone CiviCRM profiles. If Drupal WebForm is in use, then any webforms that use CiviCRM integration will also be available as a token. All hyperlinks include the recipient checksum as appropriate. To see the additional tokens, start composing an email and click 'insert tokens'.<\/description>\n \n https:\/\/civicrm.org\/extensions\/fancy-tokens<\/url>\n https:\/\/civicrm.org\/extensions\/fancy-tokens<\/url>\n https:\/\/github.com\/sgladstone\/com.pogstone.fancytokens\/issues<\/url>\n http:\/\/www.gnu.org\/licenses\/agpl-3.0.html<\/url>\n <\/urls>\n AGPL-3.0<\/license>\n \n Sarah Gladstone<\/author>\n info@fountaintribe.com<\/email>\n <\/maintainer>\n 2016-09-05<\/releaseDate>\n 4.0<\/version>\n stable<\/develStage>\n \n 4.4<\/ver>\n 4.5<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n \n \n CRM\/Fancytokens<\/namespace>\n <\/civix>\nhttps:\/\/github.com\/sgladstone\/com.pogstone.fancytokens\/archive\/4.0.zip<\/downloadUrl><\/extension>\n","com.aghstrategies.uscounties":"\n\n uscounties<\/file>\n US County Loader<\/name>\n Loads counties of the United States<\/description>\n AGPL-3.0<\/license>\n \n Andrew Hunt<\/author>\n andrew@aghstrategies.com<\/email>\n <\/maintainer>\n 2015-06-08<\/releaseDate>\n 1.1<\/version>\n stable<\/develStage>\n \n\t http:\/\/aghstrategies.com\/counties<\/url>\n <\/urls>\n \n 4.4<\/ver>\n 4.5<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n Use this extension to load counties for the United States. After installation, this extension does nothing (and can even be disabled).<\/comments>\nhttps:\/\/github.com\/agh1\/com.aghstrategies.uscounties\/archive\/1.1.zip<\/downloadUrl><\/extension>\n","net.ourpowerbase.report.advancedfundraising":"\n\n advancedfundraising<\/file>\n Advanced Fundraising Reports<\/name>\n Reports to help fundraisers view their progress sponsored by PTP<\/description>\n \n http:\/\/wiki.civicrm.org\/confluence\/display\/CRM\/CiviEngage+Enhancements+for+fund-raising<\/url>\n <\/urls>\n agpl<\/license>\n \n Eileen McNaughton<\/author>\n eileen@fuzion.co.nz<\/email>\n <\/maintainer>\n 2016-08-01<\/releaseDate>\n 1.0.5<\/version>\n stable<\/develStage>\n \n 4.4<\/ver>\n 4.5<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n \n \n CRM\/AdvancedFundraising<\/namespace>\n <\/civix>\nhttps:\/\/github.com\/jmcclelland\/net.ourpowerbase.report.advancedfundraising\/archive\/v1.0.5.zip<\/downloadUrl><\/extension>\n","nz.co.fuzion.omnipaymultiprocessor":"\n\n omnipaymultiprocessor<\/file>\n Omnipay multiprocessor support<\/name>\n Support for Multiple processors using OmniPay library<\/description>\n AGPL<\/license>\n \n eileen<\/author>\n eileen@fuzion.co.nz<\/email>\n <\/maintainer>\n \n https:\/\/github.com\/eileenmcnaughton\/nz.co.fuzion.omnipaymultiprocessor<\/url>\n https:\/\/civicrm.org\/blogs\/eileen\/rethinking-payment-processing<\/url>\n http:\/\/forum.civicrm.org<\/url>\n http:\/\/civicrm.org\/licensing<\/url>\n <\/urls>\n 2016-06-17<\/releaseDate>\n 1.9<\/version>\n stable<\/develStage>\n \n 4.4<\/ver>\n 4.5<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n This module integrates the omnipay library with CiviCRM<\/comments>\n \n CRM\/Omnipaymultiprocessor<\/namespace>\n <\/civix>\nhttps:\/\/github.com\/eileenmcnaughton\/nz.co.fuzion.omnipaymultiprocessor\/archive\/1.9.zip<\/downloadUrl><\/extension>\n","ca.bidon.civiexportexcel":"\n\n civiexportexcel<\/file>\n CiviCRM Export to Excel<\/name>\n Adds the possibility to export directly to Excel from CiviCRM.<\/description>\n AGPL3<\/license>\n \n Mathieu Lutfy<\/author>\n mathieu@symbiotic.coop<\/email>\n <\/maintainer>\n 2016-08-17<\/releaseDate>\n 1.8<\/version>\n stable<\/develStage>\n \n 4.4<\/ver>\n 4.5<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n Commercial support available from https:\/\/www.SymbioTIC.coop<\/comments>\n \n https:\/\/github.com\/mlutfy\/ca.bidon.civiexportexcel<\/url>\n https:\/\/github.com\/mlutfy\/ca.bidon.civiexportexcel\/blob\/master\/README.md<\/url>\n http:\/\/forum.civicrm.org\/index.php\/board,57.0.html<\/url>\n http:\/\/civicrm.org\/licensing<\/url>\n <\/urls>\n \n CRM\/CiviExportExcel<\/namespace>\n <\/civix>\nhttps:\/\/github.com\/mlutfy\/ca.bidon.civiexportexcel\/archive\/1.8.zip<\/downloadUrl><\/extension>\n","eu.tttp.civisualize":"\n\n civisualize<\/file>\n Civisualize. The missing data visualization extension<\/name>\n Framework to generate easily (as in, if you know SQL and d3 at least) better visualisation about what's happening in your CiviCRM<\/description>\n aGPL<\/license>\n \n Xavier<\/author>\n xavier@tttp.eu<\/email>\n <\/maintainer>\n 2016-02-23<\/releaseDate>\n 1.42<\/version>\n stable<\/develStage>\n \n 4.3<\/ver>\n 4.4<\/ver>\n 4.5<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n \n CRM\/Civisualize<\/namespace>\n <\/civix>\n\n http:\/\/github.com\/TechToThePeople\/civisualize<\/url>\n http:\/\/github.com\/TechToThePeople\/civisualize<\/url>\n http:\/\/forum.civicrm.org<\/url>\n http:\/\/civicrm.org\/licensing<\/url>\n<\/urls>\n\n\nhttps:\/\/github.com\/TechToThePeople\/civisualize\/archive\/v1.42.zip<\/downloadUrl><\/extension>\n","biz.jmaconsulting.bugp":"\n\n https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.bugp\/archive\/1.3.zip<\/downloadUrl>\n bugp<\/file>\n Batch Update of Grants via Profile<\/name>\n Batch Update of Grants via Profile\n This extension provides batch update functionality for grants similar that for contacts in CiviCRM core. Up to 50 grants can be edited simultanously in a table-like grid on a webpage.\n <\/description>\n \n https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.bugp\/issues?state=open<\/url>\n https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.bugp\/blob\/1.3\/README.md<\/url>\n <\/urls>\n AGPL-3.0<\/license>\n \n JMA Consulting<\/author>\n joe.murray@jmaconsulting.biz<\/email>\n <\/maintainer>\n 2016-02-27<\/releaseDate>\n 1.3<\/version>\n stable<\/develStage>\n \n 4.7<\/ver>\n <\/compatibility>\n \n \n CRM\/biz.jmaconsulting.bugp<\/namespace>\n <\/civix>\n<\/extension>\n","com.pogstone.contenttokens":"\n\n contenttokens<\/file>\n Content Tokens<\/name>\n This extension provides mail merge tokens that list various content. If running under Drupal, then there are tokens for each content type, taxonomy term, and feed items. If running under WordPress then there are tokens for each post type and post term. If running under Joomla then there are tokens for each type and category. This is meant to help save time when preparing an email newsletter. If used in combination with a CMS aggregator (Such as the core Drupal aggregator module), then tokens are available for virtually any content source, local or remote. <\/description>\n AGPL-3.0<\/license>\n \n Sarah Gladstone<\/author>\n info@fountaintribe.com<\/email>\n <\/maintainer>\n 2016-07-26<\/releaseDate>\n 3.1<\/version>\n stable<\/develStage>\n \nhttp:\/\/fountaintribe.com<\/url>\nhttps:\/\/github.com\/sgladstone\/com.pogstone.contenttokens<\/url>\n<\/urls>\n \n 4.4<\/ver>\n 4.5<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n This extension checks which CMS its running under before attempting to do CMS-specific things. It has been tested primarily with Drupal 6, Drupal 7, and Joomla 3. It should work under WordPress, but testing has been limited. Its safe to install under any CMS or stand-alone. However no useful functionality is provided for CiviCRM stand-alone. (Please help improve this on GitHub at https:\/\/github.com\/sgladstone\/com.pogstone.contenttokens). The formatting of the results is fairly simple: each item is wrapped in a DIV tag and relative URLs are converted to absolute URLs. The original formatting from the content item is not altered. <\/comments>\n \n CRM\/Contenttokens<\/namespace>\n <\/civix>\nhttps:\/\/github.com\/sgladstone\/com.pogstone.contenttokens\/archive\/3.1.zip<\/downloadUrl><\/extension>\n","com.webaccessglobal.simpledonate":"\n\n https:\/\/github.com\/webaccess\/com.webaccessglobal.simpledonate\/archive\/1.2.zip<\/downloadUrl>\n simpledonate<\/file>\n Simple Donate<\/name>\n Simplified donation form<\/description>\n \n \n https:\/\/civicrm.org\/extensions\/simple-donate\n <\/url>\n https:\/\/github.com\/webaccess\/com.webaccessglobal.simpledonate\/blob\/master\/README.md<\/url>\n https:\/\/github.com\/webaccess\/com.webaccessglobal.simpledonate\/issues<\/url>\n http:\/\/civicrm.org\/licensing<\/url>\n <\/urls>\n AGPL-3.0<\/license>\n \n Web Access<\/author>\n info@webaccessglobal.com<\/email>\n <\/maintainer>\n 2016-04-12<\/releaseDate>\n 1.2<\/version>\n stable<\/develStage>\n \n 4.7<\/ver>\n <\/compatibility>\n For support, please contact the team on github. (https:\/\/github.com\/webaccess\/com.webaccessglobal.simpledonate\/issues)<\/comments>\n \n CRM\/SimpleDonate<\/namespace>\n <\/civix>\n<\/extension>\n","uk.co.vedaconsulting.module.civicrmpostcodelookup":"\n\n civicrmpostcodelookup<\/file>\n CiviCRM Postcode Lookup<\/name>\n Extension to enable postcode lookup feature in CiviCRM using AFD, Civipostcode, Experian or PostcodeAnywhere.<\/description>\n AGPL-3.0<\/license>\n \n Parvez Saleh<\/author>\n parvez@vedaconsulting.co.uk<\/email>\n <\/maintainer>\n \n https:\/\/civicrm.org\/extensions\/postcode-lookup-civicrm<\/url>\n https:\/\/github.com\/veda-consulting\/uk.co.vedaconsulting.module.civicrmpostcodelookup\/blob\/master\/README.md<\/url>\n https:\/\/github.com\/veda-consulting\/uk.co.vedaconsulting.module.civicrmpostcodelookup<\/url>\n http:\/\/www.gnu.org\/licenses\/agpl-3.0.html<\/url>\n <\/urls>\n 2016-08-04<\/releaseDate>\n 1.3<\/version>\n stable<\/develStage>\n \n 4.4<\/ver>\n 4.5<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n Developed by Veda NFP Consulting LTD.<\/comments>\n \n CRM\/Civicrmpostcodelookup<\/namespace>\n <\/civix>\nhttps:\/\/github.com\/veda-consulting\/uk.co.vedaconsulting.module.civicrmpostcodelookup\/archive\/v1.3.zip<\/downloadUrl><\/extension>\n","org.civicoop.documents":"\n\n documents<\/file>\n Documenten<\/name>\n Documenten opslag in CiviCRM voor PUM<\/description>\n AGPL-3.0<\/license>\n \n CiviCooP<\/author>\n helpdesk@civicoop.org<\/email>\n <\/maintainer>\n \n https:\/\/guthub.com\/CiviCooP\/org.civicoop.documents<\/url>\n https:\/\/guthub.com\/CiviCooP\/org.civicoop.documents\/README.md<\/url>\n http:\/\/civicoop.org<\/url>\n http:\/\/www.gnu.org\/licenses\/agpl-3.0.html<\/url>\n <\/urls>\n 2016-05-03<\/releaseDate>\n 1.5<\/version>\n stable<\/develStage>\n \n 4.4<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n Extension is live at several clients<\/comments>\n \n CRM\/Documents<\/namespace>\n <\/civix>\nhttps:\/\/github.com\/CiviCooP\/org.civicoop.documents\/archive\/1.5.zip<\/downloadUrl><\/extension>\n","com.aghstrategies.idbsurvey":"\n\n idbsurvey<\/file>\n Individual Donor Benchmark Survey 2016<\/name>\n Calculates donor data to compare to other nonprofits in the Individual Donor Benchmark Survey.<\/description>\n \n https:\/\/civicrm.org\/extensions\/individual-donor-benchmark-survey-report<\/url>\n https:\/\/civicrm.org\/extensions\/individual-donor-benchmark-survey-report<\/url>\n http:\/\/www.gnu.org\/licenses\/agpl-3.0.html<\/url>\n <\/urls>\n AGPL-3.0<\/license>\n \n AGH Strategies<\/author>\n info@aghstrategies.com<\/email>\n <\/maintainer>\n 2016-03-08<\/releaseDate>\n 2.0<\/version>\n stable<\/develStage>\n \n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n \n CRM\/Idbsurvey<\/namespace>\n <\/civix>\nhttps:\/\/github.com\/aghstrategies\/com.aghstrategies.idbsurvey\/archive\/v2.0.zip<\/downloadUrl><\/extension>\n","biz.jmaconsulting.printgrantpdfs":"\n\n printgrantpdfs<\/file>\n Print Grants as PDF<\/name>\n Enhances the print grants to include custom fields and attachments while generating PDFs<\/description>\n https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.printgrantpdfs\/archive\/v1.2.zip<\/downloadUrl>\n AGPL-3.0<\/license>\n \n JMA Consulting<\/author>\n joe.murray@jmaconsulting.biz<\/email>\n <\/maintainer>\n \n https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.printgrantpdfs\/issues?state=open<\/url>\n https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.printgrantpdfs\/blob\/1.2\/README.md<\/url>\n https:\/\/github.com\/JMAConsulting\/biz.jmaconsulting.printgrantpdfs\/blob\/1.2\/README.md<\/url>\n http:\/\/www.gnu.org\/licenses\/agpl-3.0.html<\/url>\n <\/urls>\n 2016-02-27<\/releaseDate>\n 1.2<\/version>\n stable<\/develStage>\n \n 4.5<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n This extension supports printing Grants to PDFs for download. Custom fields and attached files are included in the PDF. Printing Word documents attachments depends on the unoconv library from LibreOffice, which requires about half of LibreOffice to be installed.<\/comments>\n \n CRM\/Printgrantpdfs<\/namespace>\n <\/civix>\n<\/extension>\n","com.aghstrategies.tinymce":"\n\n tinymce<\/file>\n TinyMCE<\/name>\n Adds TinyMCE as a WYSIWYG editor for CiviCRM<\/description>\n AGPL-3.0<\/license>\n \n Tyrell Cook<\/author>\n tyrell@aghstrategies.com<\/email>\n <\/maintainer>\n http:\/\/www.tinymce.com<\/url>\n https:\/\/civicrm.org\/extensions\/tinymce<\/url>\n 2016-01-31<\/releaseDate>\n 1.3<\/version>\n stable<\/develStage>\n \n 4.7<\/ver>\n <\/compatibility>\n TinyMCE version 4.3.3<\/comments>\n \n CRM\/Tinymce<\/namespace>\n <\/civix>\nhttps:\/\/github.com\/relldoesphp\/com.aghstrategies.tinymce\/archive\/1.3.zip<\/downloadUrl><\/extension>\n","org.woolman.genderselfidentify":"\n\n genderselfidentify<\/file>\n Gender Self-Identify<\/name>\n A more inclusive way to input gender in CiviCRM.<\/description>\n AGPL-3.0<\/license>\n \n Coleman Watts<\/author>\n coleman@civicrm.org<\/email>\n <\/maintainer>\n \n https:\/\/civicrm.org\/extensions\/gender-self-identify<\/url>\n http:\/\/www.gnu.org\/licenses\/agpl-3.0.html<\/url>\n <\/urls>\n 2015-10-17<\/releaseDate>\n 1.2<\/version>\n \n 4.4<\/ver>\n 4.5<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n There are no configuration options for this extension. Simply install it and users will be able to enter gender in an unrestricted way.<\/comments>\n \n CRM\/Genderselfidentify<\/namespace>\n <\/civix>\nhttps:\/\/github.com\/woolman\/genderselfidentify\/archive\/1.2.zip<\/downloadUrl>stable<\/develStage><\/extension>\n","org.civicrm.angularprofiles":"\n\n angularprofiles<\/file>\n Angular Profiles<\/name>\n A Utility extension that provides Profile support to AngularJS pages<\/description>\n AGPL-3.0<\/license>\n \n Tobias Lounsbury<\/author>\n toby@ginkgostreet.com<\/email>\n <\/maintainer>\n 2016-06-20<\/releaseDate>\n 4.6-1.0.2<\/version>\n stable<\/develStage>\n \n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n \n This extension is a utility for allowing AngularJS pages to load CiviCRM's Backbone.js-based profile editor\/selector\n widget. It comes prebuilt with a service for loading Backbone.js and necessary files as well as an AngularJS directive\n to turn a standard input into the profile widget.\n <\/comments>\n \n CRM\/AngularProfiles<\/namespace>\n <\/civix>\n \n https:\/\/github.com\/ginkgostreet\/org.civicrm.angularprofiles<\/url>\n <\/urls>\nhttps:\/\/github.com\/ginkgostreet\/org.civicrm.angularprofiles\/archive\/v4.6-1.0.2.zip<\/downloadUrl><\/extension>\n","coop.palantetech.nodrilldown":"\n\n nodrilldown<\/file>\n No Drill Down<\/name>\n When viewing reports, clicking on a contact's name brings you to the contact's record, not their Contact Detail Report or Contribution Detail Report.<\/description>\n AGPL-3.0<\/license>\n \n Jon Goldberg<\/author>\n jon@palantetech.coop<\/email>\n <\/maintainer>\n \n https:\/\/github.com\/PalanteJon\/coop.palantetech.nodrilldown<\/url>\n https:\/\/github.com\/PalanteJon\/coop.palantetech.nodrilldown\/README.md<\/url>\n https:\/\/github.com\/PalanteJon\/coop.palantetech.nodrilldown<\/url>\n http:\/\/www.gnu.org\/licenses\/agpl-3.0.html<\/url>\n <\/urls>\n 2016-02-10<\/releaseDate>\n 1.0<\/version>\n stable<\/develStage>\n \n 4.4<\/ver>\n 4.5<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n There is no unpaid support for this module - but if you submit a bugfix, I'll try to merge it.<\/comments>\n \n CRM\/Nodrilldown<\/namespace>\n <\/civix>\nhttps:\/\/github.com\/PalanteJon\/coop.palantetech.nodrilldown\/archive\/1.0.zip<\/downloadUrl><\/extension>\n","eu.tttp.bootstrapvisualize":"\n\n bootstrapvisualize<\/file>\n Bootstrap layout for civisualize<\/name>\n If you theme is already based on boostrap, civisualize works fine out of the box. If you don't, enable this extension that will add the missing stylesheets so the default datavisualisations work fine<\/description>\n MIT<\/license>\n \n xavier<\/author>\n xavier@tttp.eu<\/email>\n <\/maintainer>\n \n https:\/\/github.com\/TechToThePeople\/bootstrapvisualize<\/url>\n https:\/\/github.com\/TechToThePeople\/bootstrapvisualize<\/url>\n https:\/\/github.com\/TechToThePeople\/bootstrapvisualize<\/url>\n https:\/\/opensource.org\/licenses\/MIT<\/url>\n <\/urls>\n 2016-02-23<\/releaseDate>\n 1.0<\/version>\n \n 4.2<\/ver>\n 4.3<\/ver>\n 4.4<\/ver>\n 4.5<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n I'm not sure about the license, take the one from bootstrap<\/comments>\n \n CRM\/Bootstrapvisualize<\/namespace>\n <\/civix>\nhttps:\/\/github.com\/TechToThePeople\/bootstrapvisualize\/archive\/v1.0.zip<\/downloadUrl>stable<\/develStage><\/extension>\n","com.cividesk.email.sparkpost":"\n\n sparkpost<\/file>\n SparkPost integration<\/name>\n This extension allows CiviCRM to send emails and process bounces through the SparkPost service.<\/description>\n \n https:\/\/github.com\/cividesk\/com.cividesk.email.sparkpost<\/url>\n https:\/\/github.com\/cividesk\/com.cividesk.email.sparkpost<\/url>\n https:\/\/github.com\/cividesk\/com.cividesk.email.sparkpost\/issues?state=open<\/url>\n <\/urls>\n AGPL-3.0<\/license>\n \n Cividesk<\/author>\n info@cividesk.com<\/email>\n <\/maintainer>\n 2016-05-18<\/releaseDate>\n 1.1<\/version>\n stable<\/develStage>\n \n 4.4<\/ver>\n 4.6<\/ver>\n 4.7<\/ver>\n <\/compatibility>\n As always, read the documentation first! Once the extension is enabled, go to Administer >> System Settings >> Outboud Email (SparkPost) to configure and send a test email.<\/comments>\n \n CRM\/Sparkpost<\/namespace>\n <\/civix>\nhttps:\/\/github.com\/cividesk\/com.cividesk.email.sparkpost\/archive\/v1.1.zip<\/downloadUrl><\/extension>\n"} \ No newline at end of file diff --git a/tests/phpunit/CRM/Batch/Form/EntryTest.php b/tests/phpunit/CRM/Batch/Form/EntryTest.php index ad5e4c696e..ef40bb28e6 100644 --- a/tests/phpunit/CRM/Batch/Form/EntryTest.php +++ b/tests/phpunit/CRM/Batch/Form/EntryTest.php @@ -146,7 +146,9 @@ class CRM_Batch_Form_EntryTest extends CiviUnitTestCase { if ($this->callAPISuccessGetCount('membership', array('id' => $this->_membershipTypeID))) { $this->membershipTypeDelete(array('id' => $this->_membershipTypeID)); } - $this->membershipStatusDelete($this->_membershipStatusID); + if ($this->callAPISuccessGetCount('MembershipStatus', array('id' => $this->_membershipStatusID))) { + $this->membershipStatusDelete($this->_membershipStatusID); + } $this->contactDelete($this->_contactID); $this->contactDelete($this->_contactID2); $this->contactDelete($this->_orgContactID); diff --git a/tests/phpunit/CRM/Dedupe/MergerTest.php b/tests/phpunit/CRM/Dedupe/MergerTest.php index 9b120d08a9..97dd6d5a65 100644 --- a/tests/phpunit/CRM/Dedupe/MergerTest.php +++ b/tests/phpunit/CRM/Dedupe/MergerTest.php @@ -319,7 +319,7 @@ class CRM_Dedupe_MergerTest extends CiviUnitTestCase { FALSE ); - $this->assertEquals(array( + $expectedPairs = array( 0 => array( 'srcID' => $this->contacts[5]['id'], 'srcName' => 'Walt Disney Ltd', @@ -352,7 +352,26 @@ class CRM_Dedupe_MergerTest extends CiviUnitTestCase { 'weight' => 10, 'canMerge' => TRUE, ), - ), $pairs); + ); + usort($pairs, array(__CLASS__, 'compareDupes')); + usort($expectedPairs, array(__CLASS__, 'compareDupes')); + $this->assertEquals($expectedPairs, $pairs); + } + + /** + * Function to sort $duplicate records in a stable way. + * + * @param array $a + * @param array $b + * @return int + */ + public static function compareDupes($a, $b) { + foreach (array('srcName', 'dstName', 'srcID', 'dstID') as $field) { + if ($a[$field] != $b[$field]) { + return ($a[$field] < $b[$field]) ? 1 : -1; + } + } + return 0; } /** diff --git a/tests/phpunit/CRM/Logging/LoggingTest.php b/tests/phpunit/CRM/Logging/LoggingTest.php new file mode 100644 index 0000000000..f0422ca869 --- /dev/null +++ b/tests/phpunit/CRM/Logging/LoggingTest.php @@ -0,0 +1,55 @@ +dropAllLogTables(); + parent::tearDown(); + } + + /** + * Test creating logging schema when database is in multilingual mode. + */ + public function testMultilingualLogging() { + CRM_Core_I18n_Schema::makeMultilingual('en_US'); + $logging = new CRM_Logging_Schema(); + $logging->enableLogging(); + $value = CRM_Core_DAO::singleValueQuery("SELECT id FROM log_civicrm_contact LIMIT 1", array(), FALSE, FALSE); + $this->assertNotNull($value, 'Logging not enabled successfully'); + $logging->disableLogging(); + } + + + /** + * Test creating logging schema when database is in multilingual mode. + * Also test altering a multilingual table. + */ + public function testMultilingualAlterSchemaLogging() { + CRM_Core_I18n_Schema::makeMultilingual('en_US'); + $logging = new CRM_Logging_Schema(); + $logging->enableLogging(); + $value = CRM_Core_DAO::singleValueQuery("SELECT id FROM log_civicrm_contact LIMIT 1", array(), FALSE, FALSE); + $this->assertNotNull($value, 'Logging not enabled successfully'); + $logging->disableLogging(); + CRM_Core_DAO::executeQuery("ALTER TABLE `civicrm_option_value` ADD COLUMN `logging_test` INT DEFAULT NULL", array(), FALSE, NULL, FALSE, TRUE); + CRM_Core_I18n_Schema::rebuildMultilingualSchema(array('en_US')); + $logging->enableLogging(); + $query = CRM_Core_DAO::executeQuery("SHOW CREATE TABLE `log_civicrm_option_value`", array(), TRUE, NULL, FALSE, FALSE); + $query->fetch(); + $create = explode("\n", $query->Create_Table); + CRM_Core_DAO::executeQuery("ALTER TABLE `civicrm_option_value` DROP COLUMN `logging_test`", array(), FALSE, NULL, FALSE, TRUE); + $this->assertTrue(in_array(" `logging_test` int(11) DEFAULT NULL", $create)); + $logging->disableLogging(); + } + +} diff --git a/tests/phpunit/CiviTest/CiviUnitTestCase.php b/tests/phpunit/CiviTest/CiviUnitTestCase.php index 1d952657b9..0aab1a3d55 100644 --- a/tests/phpunit/CiviTest/CiviUnitTestCase.php +++ b/tests/phpunit/CiviTest/CiviUnitTestCase.php @@ -1266,7 +1266,10 @@ class CiviUnitTestCase extends PHPUnit_Extensions_Database_TestCase { */ public function relationshipTypeDelete($relationshipTypeID) { $params['id'] = $relationshipTypeID; - $this->callAPISuccess('relationship_type', 'delete', $params); + $check = $this->callAPISuccess('relationship_type', 'get', $params); + if (!empty($check['count'])) { + $this->callAPISuccess('relationship_type', 'delete', $params); + } } /** @@ -1621,7 +1624,10 @@ class CiviUnitTestCase extends PHPUnit_Extensions_Database_TestCase { $params = array( 'id' => $participantID, ); - return $this->callAPISuccess('Participant', 'delete', $params); + $check = $this->callAPISuccess('Participant', 'get', $params); + if ($check['count'] > 0) { + return $this->callAPISuccess('Participant', 'delete', $params); + } } /** diff --git a/tests/phpunit/api/v3/ActivityTest.php b/tests/phpunit/api/v3/ActivityTest.php index 27611c362d..21e7f236cf 100644 --- a/tests/phpunit/api/v3/ActivityTest.php +++ b/tests/phpunit/api/v3/ActivityTest.php @@ -106,7 +106,10 @@ class api_v3_ActivityTest extends CiviUnitTestCase { 'civicrm_uf_match', ); $this->quickCleanup($tablesToTruncate, TRUE); - $this->callAPISuccess('option_value', 'delete', array('id' => $this->test_activity_type_id)); + $type = $this->callAPISuccess('optionValue', 'get', array('id' => $this->test_activity_type_id)); + if (!empty($type['count'])) { + $this->callAPISuccess('option_value', 'delete', array('id' => $this->test_activity_type_id)); + } } /** diff --git a/tests/phpunit/api/v3/CustomSearchTest.php b/tests/phpunit/api/v3/CustomSearchTest.php index e6c38ea2be..ebf7cc3113 100644 --- a/tests/phpunit/api/v3/CustomSearchTest.php +++ b/tests/phpunit/api/v3/CustomSearchTest.php @@ -57,10 +57,12 @@ class api_v3_CustomSearchTest extends CiviUnitTestCase { AND option_group_id IN (SELECT id from civicrm_option_group WHERE name = "custom_search") '); $this->assertDBQuery(1, 'SELECT is_active FROM civicrm_option_value WHERE name = "CRM_Contact_Form_Search_Custom_Examplez"'); - - $result = $this->callAPISuccess('CustomSearch', 'delete', array( - 'id' => $entityId, - )); + $check = $this->callAPISuccess('CustomSearch', 'get', array('id' => $entityId)); + if (!empty($check['count'])) { + $result = $this->callAPISuccess('CustomSearch', 'delete', array( + 'id' => $entityId, + )); + } $this->assertEquals(1, $result['count']); $this->assertDBQuery(0, 'SELECT count(*) FROM civicrm_option_value WHERE name = "CRM_Contact_Form_Search_Custom_Examplez" diff --git a/tests/phpunit/api/v3/CustomValueTest.php b/tests/phpunit/api/v3/CustomValueTest.php index 6e63b6e798..7bfd07f052 100644 --- a/tests/phpunit/api/v3/CustomValueTest.php +++ b/tests/phpunit/api/v3/CustomValueTest.php @@ -94,7 +94,10 @@ class api_v3_CustomValueTest extends CiviUnitTestCase { if (!empty($this->optionGroup)) { foreach ($this->optionGroup as $type => $value) { if (!empty($value['id'])) { - $this->callAPISuccess('OptionGroup', 'delete', array('id' => $value['id'])); + $count = $this->callAPISuccess('OptionGroup', 'get', array('id' => $value['id'])); + if ((bool) $count['count']) { + $this->callAPISuccess('OptionGroup', 'delete', array('id' => $value['id'])); + } } } } diff --git a/tests/phpunit/api/v3/ExtensionTest.php b/tests/phpunit/api/v3/ExtensionTest.php new file mode 100644 index 0000000000..1c044d2f05 --- /dev/null +++ b/tests/phpunit/api/v3/ExtensionTest.php @@ -0,0 +1,60 @@ +set('ext_repo_url', $url); + } + + public function tearDown() { + Civi::settings()->revert('ext_repo_url'); + } + + /** + * Test getremote. + */ + public function testGetremote() { + $result = $this->callAPISuccess('extension', 'getremote', array()); + $this->assertEquals('org.civicrm.module.cividiscount', $result['values'][0]['key']); + $this->assertEquals('module', $result['values'][0]['type']); + $this->assertEquals('CiviDiscount', $result['values'][0]['name']); + } + +} diff --git a/tests/phpunit/api/v3/SyntaxConformanceTest.php b/tests/phpunit/api/v3/SyntaxConformanceTest.php index 78cfdfe20f..3fdf2d1989 100644 --- a/tests/phpunit/api/v3/SyntaxConformanceTest.php +++ b/tests/phpunit/api/v3/SyntaxConformanceTest.php @@ -1081,6 +1081,9 @@ class api_v3_SyntaxConformanceTest extends CiviUnitTestCase { if ($Entity === 'Setting') { $this->markTestSkipped('It seems OK for setting to skip here as it silently sips invalid params'); } + if ($Entity == 'Product') { + $this->markTestSkipped('At the moment product API does not complain if no params are passed need fixing'); + } // should create php complaining that a param is missing civicrm_api3($Entity, 'Create'); } @@ -1363,11 +1366,8 @@ class api_v3_SyntaxConformanceTest extends CiviUnitTestCase { * @throws \PHPUnit_Framework_IncompleteTestError */ public function testInvalidID_delete($Entity) { - // turn test off for now - $this->markTestIncomplete("Entity [ $Entity ] cannot be mocked - no known DAO"); - return; if (in_array($Entity, $this->toBeImplemented['delete'])) { - // $this->markTestIncomplete("civicrm_api3_{$Entity}_delete to be implemented"); + $this->markTestIncomplete("civicrm_api3_{$Entity}_delete to be implemented"); return; } $result = $this->callAPIFailure($Entity, 'Delete', array('id' => 999));