From ed3f5877550c524765812d86c2feff0c4363484e Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Thu, 27 Jan 2022 16:09:08 -0500 Subject: [PATCH] APIv4 - Deprecate and stop using PreSaveSubscriber The PreSaveSubscriber allowed APIs to tweak inputs before saving a record, but it was unreliable because: - It would run for Create and Update but not Save actions - It would run before pseudoconstant suffixes had been resolved - It would run before any formatting or internal processing had taken place Meanwhile, a new pattern of overriding the create/save/update actions and sharing a trait has become more common and while a bit more cumbersome to implement, it does not share those limitations. This removes all uses of PreSaveSubscriber, refactors those bits into Save traits, and adds a deprecation warning in case any extension in the Universe happens to have implemented it. --- Civi/Api4/Action/Address/AddressSaveTrait.php | 3 +- Civi/Api4/Action/Contact/ContactSaveTrait.php | 46 +++++++++++++++ Civi/Api4/Action/Contact/Create.php | 21 +++++++ Civi/Api4/Action/Contact/Save.php | 17 +----- Civi/Api4/Action/Contact/Update.php | 15 +---- .../Contribution/ContributionSaveTrait.php} | 25 ++++---- Civi/Api4/Action/Contribution/Create.php | 21 +++++++ Civi/Api4/Action/Contribution/Save.php | 21 +++++++ Civi/Api4/Action/Contribution/Update.php | 21 +++++++ Civi/Api4/Action/CustomField/Create.php | 21 +++++++ .../CustomField/CustomFieldSaveTrait.php} | 40 ++++++++----- Civi/Api4/Action/CustomField/Save.php | 21 +++++++ Civi/Api4/Action/CustomField/Update.php | 21 +++++++ Civi/Api4/Contact.php | 9 +++ Civi/Api4/Contribution.php | 27 +++++++++ Civi/Api4/CustomField.php | 27 +++++++++ .../Subscriber/ContactPreSaveSubscriber.php | 38 ------------ .../CustomGroupPreCreationSubscriber.php | 35 ----------- .../Subscriber/Generic/PreSaveSubscriber.php | 4 ++ .../OptionValuePreCreationSubscriber.php | 59 ------------------- .../Provider/ContactCreationSpecProvider.php | 6 -- .../SearchRunWithCustomFieldTest.php | 2 +- tests/phpunit/api/v3/ACLPermissionTest.php | 2 +- .../api/v4/Action/BasicCustomFieldTest.php | 23 ++++++-- tests/phpunit/api/v4/Action/ChainTest.php | 2 +- .../api/v4/Action/CreateCustomValueTest.php | 2 +- .../v4/Action/CreateWithOptionGroupTest.php | 8 +-- .../api/v4/Action/CustomContactRefTest.php | 4 +- .../api/v4/Action/CustomGroupACLTest.php | 4 +- .../phpunit/api/v4/Action/CustomValueTest.php | 2 +- .../v4/Action/ExtendFromIndividualTest.php | 2 +- .../api/v4/Action/PseudoconstantTest.php | 2 +- tests/phpunit/api/v4/Action/ReplaceTest.php | 2 +- .../api/v4/Action/UpdateCustomValueTest.php | 2 +- .../api/v4/DataSets/ConformanceTest.json | 1 + .../phpunit/api/v4/Entity/ContactTypeTest.php | 14 +++++ .../phpunit/api/v4/Spec/SpecGathererTest.php | 16 ++--- 37 files changed, 360 insertions(+), 226 deletions(-) create mode 100644 Civi/Api4/Action/Contact/ContactSaveTrait.php create mode 100644 Civi/Api4/Action/Contact/Create.php rename Civi/Api4/{Event/Subscriber/ContributionPreSaveSubscriber.php => Action/Contribution/ContributionSaveTrait.php} (56%) create mode 100644 Civi/Api4/Action/Contribution/Create.php create mode 100644 Civi/Api4/Action/Contribution/Save.php create mode 100644 Civi/Api4/Action/Contribution/Update.php create mode 100644 Civi/Api4/Action/CustomField/Create.php rename Civi/Api4/{Event/Subscriber/CustomFieldPreSaveSubscriber.php => Action/CustomField/CustomFieldSaveTrait.php} (69%) create mode 100644 Civi/Api4/Action/CustomField/Save.php create mode 100644 Civi/Api4/Action/CustomField/Update.php delete mode 100644 Civi/Api4/Event/Subscriber/ContactPreSaveSubscriber.php delete mode 100644 Civi/Api4/Event/Subscriber/CustomGroupPreCreationSubscriber.php delete mode 100644 Civi/Api4/Event/Subscriber/OptionValuePreCreationSubscriber.php diff --git a/Civi/Api4/Action/Address/AddressSaveTrait.php b/Civi/Api4/Action/Address/AddressSaveTrait.php index de055b08f5..d14fca6a1d 100644 --- a/Civi/Api4/Action/Address/AddressSaveTrait.php +++ b/Civi/Api4/Action/Address/AddressSaveTrait.php @@ -13,7 +13,8 @@ namespace Civi\Api4\Action\Address; /** - * @inheritDoc + * Code shared by Address create/update/save actions + * * @method bool getStreetParsing() * @method $this setStreetParsing(bool $streetParsing) * @method bool getSkipGeocode() diff --git a/Civi/Api4/Action/Contact/ContactSaveTrait.php b/Civi/Api4/Action/Contact/ContactSaveTrait.php new file mode 100644 index 0000000000..67a9cca550 --- /dev/null +++ b/Civi/Api4/Action/Contact/ContactSaveTrait.php @@ -0,0 +1,46 @@ +getEntityName() === 'Contribution'; + /** + * @inheritDoc + */ + protected function write(array $items) { + foreach ($items as &$item) { + // Required by Contribution BAO + $item['skipCleanMoney'] = TRUE; + } + return parent::write($items); } } diff --git a/Civi/Api4/Action/Contribution/Create.php b/Civi/Api4/Action/Contribution/Create.php new file mode 100644 index 0000000000..80a8b7e0c0 --- /dev/null +++ b/Civi/Api4/Action/Contribution/Create.php @@ -0,0 +1,21 @@ + $value) { // Translate simple key/value pairs into full-blown option values @@ -34,22 +48,16 @@ class CustomFieldPreSaveSubscriber extends Generic\PreSaveSubscriber { 'id' => $key, ]; } - $weight++; $field['option_label'][] = $value['label'] ?? $value['name']; $field['option_name'][] = $value['name'] ?? NULL; $field['option_value'][] = $value['id']; $field['option_status'][] = $value['is_active'] ?? 1; - $field['option_weight'][] = $value['weight'] ?? $weight; + $field['option_weight'][] = $value['weight'] ?? ++$weight; $field['option_color'][] = $value['color'] ?? NULL; $field['option_description'][] = $value['description'] ?? NULL; $field['option_icon'][] = $value['icon'] ?? NULL; } } - $field['option_type'] = !empty($field['option_values']); - } - - public function applies(AbstractAction $request) { - return $request->getEntityName() === 'CustomField'; } } diff --git a/Civi/Api4/Action/CustomField/Save.php b/Civi/Api4/Action/CustomField/Save.php new file mode 100644 index 0000000000..d6d3a35c80 --- /dev/null +++ b/Civi/Api4/Action/CustomField/Save.php @@ -0,0 +1,21 @@ +setCheckPermissions($checkPermissions); + } + /** * @param bool $checkPermissions * @return Action\Contact\Update diff --git a/Civi/Api4/Contribution.php b/Civi/Api4/Contribution.php index 2be2264b61..67d61be1f7 100644 --- a/Civi/Api4/Contribution.php +++ b/Civi/Api4/Contribution.php @@ -19,4 +19,31 @@ namespace Civi\Api4; */ class Contribution extends Generic\DAOEntity { + /** + * @param bool $checkPermissions + * @return Action\Contribution\Create + */ + public static function create($checkPermissions = TRUE) { + return (new Action\Contribution\Create(__CLASS__, __FUNCTION__)) + ->setCheckPermissions($checkPermissions); + } + + /** + * @param bool $checkPermissions + * @return Action\Contribution\Save + */ + public static function save($checkPermissions = TRUE) { + return (new Action\Contribution\Save(__CLASS__, __FUNCTION__)) + ->setCheckPermissions($checkPermissions); + } + + /** + * @param bool $checkPermissions + * @return Action\Contribution\Update + */ + public static function update($checkPermissions = TRUE) { + return (new Action\Contribution\Update(__CLASS__, __FUNCTION__)) + ->setCheckPermissions($checkPermissions); + } + } diff --git a/Civi/Api4/CustomField.php b/Civi/Api4/CustomField.php index 37be6eb2b4..5751e6492e 100644 --- a/Civi/Api4/CustomField.php +++ b/Civi/Api4/CustomField.php @@ -23,4 +23,31 @@ class CustomField extends Generic\DAOEntity { use Generic\Traits\ManagedEntity; use Generic\Traits\SortableEntity; + /** + * @param bool $checkPermissions + * @return Action\CustomField\Create + */ + public static function create($checkPermissions = TRUE) { + return (new Action\CustomField\Create(__CLASS__, __FUNCTION__)) + ->setCheckPermissions($checkPermissions); + } + + /** + * @param bool $checkPermissions + * @return Action\CustomField\Save + */ + public static function save($checkPermissions = TRUE) { + return (new Action\CustomField\Save(__CLASS__, __FUNCTION__)) + ->setCheckPermissions($checkPermissions); + } + + /** + * @param bool $checkPermissions + * @return Action\CustomField\Update + */ + public static function update($checkPermissions = TRUE) { + return (new Action\CustomField\Update(__CLASS__, __FUNCTION__)) + ->setCheckPermissions($checkPermissions); + } + } diff --git a/Civi/Api4/Event/Subscriber/ContactPreSaveSubscriber.php b/Civi/Api4/Event/Subscriber/ContactPreSaveSubscriber.php deleted file mode 100644 index 3af614ffed..0000000000 --- a/Civi/Api4/Event/Subscriber/ContactPreSaveSubscriber.php +++ /dev/null @@ -1,38 +0,0 @@ -getEntityName() === 'Contact'; - } - -} diff --git a/Civi/Api4/Event/Subscriber/CustomGroupPreCreationSubscriber.php b/Civi/Api4/Event/Subscriber/CustomGroupPreCreationSubscriber.php deleted file mode 100644 index 132c789f2f..0000000000 --- a/Civi/Api4/Event/Subscriber/CustomGroupPreCreationSubscriber.php +++ /dev/null @@ -1,35 +0,0 @@ -getValue('title'); - $name = $request->getValue('name'); - - if (NULL === $title && $name) { - $request->addValue('title', $name); - } - } - - protected function applies(DAOCreateAction $request) { - return $request->getEntityName() === 'CustomGroup'; - } - -} diff --git a/Civi/Api4/Event/Subscriber/Generic/PreSaveSubscriber.php b/Civi/Api4/Event/Subscriber/Generic/PreSaveSubscriber.php index 8741f842d8..68fc4f672f 100644 --- a/Civi/Api4/Event/Subscriber/Generic/PreSaveSubscriber.php +++ b/Civi/Api4/Event/Subscriber/Generic/PreSaveSubscriber.php @@ -17,6 +17,9 @@ use Civi\Api4\Generic\AbstractAction; use Civi\Api4\Generic\AbstractCreateAction; use Civi\Api4\Generic\AbstractUpdateAction; +/** + * @deprecated + */ abstract class PreSaveSubscriber extends AbstractPrepareSubscriber { /** @@ -32,6 +35,7 @@ abstract class PreSaveSubscriber extends AbstractPrepareSubscriber { $apiRequest = $event->getApiRequest(); if ($apiRequest instanceof AbstractAction && $this->applies($apiRequest)) { + \CRM_Core_Error::deprecatedWarning("Use of APIv4 'PreSaveSubscriber' is deprecated. '" . get_class($this) . "' should be removed ({$apiRequest->getEntityName()}::{$apiRequest->getActionName()})."); if ( ($apiRequest instanceof AbstractCreateAction && $this->supportedOperation !== 'update') || ($apiRequest instanceof AbstractUpdateAction && $this->supportedOperation !== 'create') diff --git a/Civi/Api4/Event/Subscriber/OptionValuePreCreationSubscriber.php b/Civi/Api4/Event/Subscriber/OptionValuePreCreationSubscriber.php deleted file mode 100644 index 3b37c70f15..0000000000 --- a/Civi/Api4/Event/Subscriber/OptionValuePreCreationSubscriber.php +++ /dev/null @@ -1,59 +0,0 @@ -setOptionGroupId($request); - } - - /** - * @param \Civi\Api4\Generic\DAOCreateAction $request - * - * @return bool - */ - protected function applies(DAOCreateAction $request) { - return $request->getEntityName() === 'OptionValue'; - } - - /** - * @param \Civi\Api4\Generic\DAOCreateAction $request - * @throws \API_Exception - * @throws \Exception - */ - private function setOptionGroupId(DAOCreateAction $request) { - $optionGroupName = $request->getValue('option_group'); - if (!$optionGroupName || $request->getValue('option_group_id')) { - return; - } - \CRM_Core_Error::deprecatedFunctionWarning('Use option_group_id:name instead of option_group in APIv4'); - $optionGroup = OptionGroup::get(FALSE) - ->addSelect('id') - ->addWhere('name', '=', $optionGroupName) - ->execute(); - - if ($optionGroup->count() !== 1) { - throw new \Exception('Option group name must match only a single group'); - } - - $request->addValue('option_group_id', $optionGroup->first()['id']); - } - -} diff --git a/Civi/Api4/Service/Spec/Provider/ContactCreationSpecProvider.php b/Civi/Api4/Service/Spec/Provider/ContactCreationSpecProvider.php index ac13bcba81..c3d799dd05 100644 --- a/Civi/Api4/Service/Spec/Provider/ContactCreationSpecProvider.php +++ b/Civi/Api4/Service/Spec/Provider/ContactCreationSpecProvider.php @@ -20,14 +20,8 @@ class ContactCreationSpecProvider implements Generic\SpecProviderInterface { * @param \Civi\Api4\Service\Spec\RequestSpec $spec */ public function modifySpec(RequestSpec $spec) { - $contactTypeField = $spec->getFieldByName('contact_type'); - if ($contactTypeField) { - $contactTypeField->setDefaultValue('Individual'); - } - $spec->getFieldByName('is_opt_out')->setRequired(FALSE); $spec->getFieldByName('is_deleted')->setRequired(FALSE); - } /** diff --git a/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunWithCustomFieldTest.php b/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunWithCustomFieldTest.php index b62494aa35..9900a67926 100644 --- a/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunWithCustomFieldTest.php +++ b/ext/search_kit/tests/phpunit/api/v4/SearchDisplay/SearchRunWithCustomFieldTest.php @@ -33,7 +33,7 @@ class SearchRunWithCustomFieldTest extends \PHPUnit\Framework\TestCase implement */ public function testRunWithImageField() { CustomGroup::create(FALSE) - ->addValue('name', 'TestSearchFields') + ->addValue('title', 'TestSearchFields') ->addValue('extends', 'Individual') ->execute() ->first(); diff --git a/tests/phpunit/api/v3/ACLPermissionTest.php b/tests/phpunit/api/v3/ACLPermissionTest.php index d218d37929..0e800e4842 100644 --- a/tests/phpunit/api/v3/ACLPermissionTest.php +++ b/tests/phpunit/api/v3/ACLPermissionTest.php @@ -1107,7 +1107,7 @@ class api_v3_ACLPermissionTest extends CiviUnitTestCase { $textField = 'text_field'; CustomGroup::create(FALSE) - ->addValue('name', $group) + ->addValue('title', $group) ->addValue('extends', 'Contact') ->addValue('is_multiple', TRUE) ->addChain('field', CustomField::create() diff --git a/tests/phpunit/api/v4/Action/BasicCustomFieldTest.php b/tests/phpunit/api/v4/Action/BasicCustomFieldTest.php index 4cc32bbcf0..d0a18ff04d 100644 --- a/tests/phpunit/api/v4/Action/BasicCustomFieldTest.php +++ b/tests/phpunit/api/v4/Action/BasicCustomFieldTest.php @@ -36,7 +36,7 @@ class BasicCustomFieldTest extends BaseCustomValueTest { */ public function testWithSingleField(): void { $customGroup = CustomGroup::create(FALSE) - ->addValue('name', 'MyIndividualFields') + ->addValue('title', 'MyIndividualFields') ->addValue('extends', 'Individual') ->execute() ->first(); @@ -103,7 +103,7 @@ class BasicCustomFieldTest extends BaseCustomValueTest { // First custom set CustomGroup::create(FALSE) - ->addValue('name', 'MyContactFields') + ->addValue('title', 'MyContactFields') ->addValue('extends', 'Contact') ->addChain('field1', CustomField::create() ->addValue('label', 'FavColor') @@ -119,7 +119,7 @@ class BasicCustomFieldTest extends BaseCustomValueTest { // Second custom set CustomGroup::create(FALSE) - ->addValue('name', 'MyContactFields2') + ->addValue('title', 'MyContactFields2') ->addValue('extends', 'Contact') ->addChain('field1', CustomField::create() ->addValue('label', 'FavColor') @@ -247,7 +247,7 @@ class BasicCustomFieldTest extends BaseCustomValueTest { $cgName = uniqid('RelFields'); $customGroup = CustomGroup::create(FALSE) - ->addValue('name', $cgName) + ->addValue('title', $cgName) ->addValue('extends', 'Relationship') ->execute() ->first(); @@ -320,7 +320,7 @@ class BasicCustomFieldTest extends BaseCustomValueTest { $cgName = uniqid('My'); CustomGroup::create(FALSE) - ->addValue('name', $cgName) + ->addValue('title', $cgName) ->addValue('extends', 'Contact') ->addChain('field1', CustomField::create() ->addValue('label', 'FavColor') @@ -371,7 +371,7 @@ class BasicCustomFieldTest extends BaseCustomValueTest { $optionGroupCount = OptionGroup::get(FALSE)->selectRowCount()->execute()->count(); $customGroup = CustomGroup::create(FALSE) - ->addValue('name', 'MyIndividualFields') + ->addValue('title', 'MyIndividualFields') ->addValue('extends', 'Individual') ->execute() ->first(); @@ -408,6 +408,7 @@ class BasicCustomFieldTest extends BaseCustomValueTest { // Create 2 custom groups. Control group is to ensure updating one doesn't affect the other foreach (['controlGroup', 'experimentalGroup'] as $groupName) { $customGroups[$groupName] = CustomGroup::create(FALSE) + ->addValue('title', $groupName) ->addValue('name', $groupName) ->addValue('extends', 'Individual') ->execute()->first(); @@ -455,6 +456,16 @@ class BasicCustomFieldTest extends BaseCustomValueTest { // Experimental group should be updated, control group should not $this->assertEquals(['One' => 1, 'Three' => 2, 'Two' => 3, 'Four' => 4], $getValues('experimentalGroup')); $this->assertEquals(['One' => 1, 'Two' => 2, 'Three' => 3, 'Four' => 4], $getValues('controlGroup')); + + // Move first option to last position + CustomField::update(FALSE) + ->addWhere('custom_group_id.name', '=', 'experimentalGroup') + ->addWhere('name', '=', 'One') + ->addValue('weight', 4) + ->execute(); + // Experimental group should be updated, control group should not + $this->assertEquals(['Three' => 1, 'Two' => 2, 'Four' => 3, 'One' => 4], $getValues('experimentalGroup')); + $this->assertEquals(['One' => 1, 'Two' => 2, 'Three' => 3, 'Four' => 4], $getValues('controlGroup')); } } diff --git a/tests/phpunit/api/v4/Action/ChainTest.php b/tests/phpunit/api/v4/Action/ChainTest.php index 16274b2ca1..47a1cbe86d 100644 --- a/tests/phpunit/api/v4/Action/ChainTest.php +++ b/tests/phpunit/api/v4/Action/ChainTest.php @@ -83,7 +83,7 @@ class ChainTest extends UnitTestCase { public function testWithContactRef() { CustomGroup::create() ->setCheckPermissions(FALSE) - ->addValue('name', 'TestActCus') + ->addValue('title', 'TestActCus') ->addValue('extends', 'Activity') ->addChain('field1', CustomField::create() ->addValue('label', 'FavPerson') diff --git a/tests/phpunit/api/v4/Action/CreateCustomValueTest.php b/tests/phpunit/api/v4/Action/CreateCustomValueTest.php index 10278cc84a..7fed9b787c 100644 --- a/tests/phpunit/api/v4/Action/CreateCustomValueTest.php +++ b/tests/phpunit/api/v4/Action/CreateCustomValueTest.php @@ -33,7 +33,7 @@ class CreateCustomValueTest extends BaseCustomValueTest { $optionValues = ['r' => 'Red', 'g' => 'Green', 'b' => 'Blue']; $customGroup = CustomGroup::create(FALSE) - ->addValue('name', 'MyContactFields') + ->addValue('title', 'MyContactFields') ->addValue('extends', 'Contact') ->execute() ->first(); diff --git a/tests/phpunit/api/v4/Action/CreateWithOptionGroupTest.php b/tests/phpunit/api/v4/Action/CreateWithOptionGroupTest.php index dc778fe31d..2f6d8f78e0 100644 --- a/tests/phpunit/api/v4/Action/CreateWithOptionGroupTest.php +++ b/tests/phpunit/api/v4/Action/CreateWithOptionGroupTest.php @@ -34,7 +34,7 @@ class CreateWithOptionGroupTest extends BaseCustomValueTest { $foodField = uniqid('fooda'); $customGroupId = CustomGroup::create(FALSE) - ->addValue('name', $group) + ->addValue('title', $group) ->addValue('extends', 'Contact') ->execute() ->first()['id']; @@ -58,7 +58,7 @@ class CreateWithOptionGroupTest extends BaseCustomValueTest { ->execute(); $customGroupId = CustomGroup::create(FALSE) - ->addValue('name', 'FinancialStuff') + ->addValue('title', 'FinancialStuff') ->addValue('extends', 'Contact') ->execute() ->first()['id']; @@ -100,7 +100,7 @@ class CreateWithOptionGroupTest extends BaseCustomValueTest { $foodField = uniqid('foodb'); $customGroupId = CustomGroup::create(FALSE) - ->addValue('name', $group) + ->addValue('title', $group) ->addValue('extends', 'Contact') ->execute() ->first()['id']; @@ -124,7 +124,7 @@ class CreateWithOptionGroupTest extends BaseCustomValueTest { ->execute(); $customGroupId = CustomGroup::create(FALSE) - ->addValue('name', 'FinancialStuff') + ->addValue('title', 'FinancialStuff') ->addValue('extends', 'Contact') ->execute() ->first()['id']; diff --git a/tests/phpunit/api/v4/Action/CustomContactRefTest.php b/tests/phpunit/api/v4/Action/CustomContactRefTest.php index 22db0897d8..5ca38ff0c6 100644 --- a/tests/phpunit/api/v4/Action/CustomContactRefTest.php +++ b/tests/phpunit/api/v4/Action/CustomContactRefTest.php @@ -32,7 +32,7 @@ class CustomContactRefTest extends BaseCustomValueTest { $firstName = uniqid('fav'); $customGroup = CustomGroup::create(FALSE) - ->addValue('name', 'MyContactRef') + ->addValue('title', 'MyContactRef') ->addValue('extends', 'Individual') ->execute() ->first(); @@ -127,7 +127,7 @@ class CustomContactRefTest extends BaseCustomValueTest { $currentUser = $this->createLoggedInUser(); $customGroup = CustomGroup::create(FALSE) - ->addValue('name', 'MyContactRef') + ->addValue('title', 'MyContactRef') ->addValue('extends', 'Individual') ->execute() ->first(); diff --git a/tests/phpunit/api/v4/Action/CustomGroupACLTest.php b/tests/phpunit/api/v4/Action/CustomGroupACLTest.php index ec75d2affa..6dec3a742b 100644 --- a/tests/phpunit/api/v4/Action/CustomGroupACLTest.php +++ b/tests/phpunit/api/v4/Action/CustomGroupACLTest.php @@ -44,7 +44,7 @@ class CustomGroupACLTest extends BaseCustomValueTest { foreach ($groups as $name => $access) { $singleGroup = CustomGroup::create(FALSE) - ->addValue('name', 'My' . ucfirst($name) . 'Single') + ->addValue('title', 'My' . ucfirst($name) . 'Single') ->addValue('extends', 'Individual') ->addChain('field', CustomField::create() ->addValue('label', 'MyField') @@ -53,7 +53,7 @@ class CustomGroupACLTest extends BaseCustomValueTest { ->execute()->single(); $v3['single'][$name] = 'custom_' . $singleGroup['field']['id']; $multiGroup = CustomGroup::create(FALSE) - ->addValue('name', 'My' . ucfirst($name) . 'Multi') + ->addValue('title', 'My' . ucfirst($name) . 'Multi') ->addValue('extends', 'Individual') ->addValue('is_multiple', TRUE) ->addChain('field', CustomField::create() diff --git a/tests/phpunit/api/v4/Action/CustomValueTest.php b/tests/phpunit/api/v4/Action/CustomValueTest.php index de6df7c9bc..68e510d06d 100644 --- a/tests/phpunit/api/v4/Action/CustomValueTest.php +++ b/tests/phpunit/api/v4/Action/CustomValueTest.php @@ -43,7 +43,7 @@ class CustomValueTest extends BaseCustomValueTest { $textFieldName = uniqid('txt'); $customGroup = CustomGroup::create(FALSE) - ->addValue('name', $group) + ->addValue('title', $group) ->addValue('extends', 'Contact') ->addValue('is_multiple', TRUE) ->execute() diff --git a/tests/phpunit/api/v4/Action/ExtendFromIndividualTest.php b/tests/phpunit/api/v4/Action/ExtendFromIndividualTest.php index df1c0c16ae..9b573b13b5 100644 --- a/tests/phpunit/api/v4/Action/ExtendFromIndividualTest.php +++ b/tests/phpunit/api/v4/Action/ExtendFromIndividualTest.php @@ -31,7 +31,7 @@ class ExtendFromIndividualTest extends BaseCustomValueTest { public function testGetWithNonStandardExtends() { $customGroup = CustomGroup::create(FALSE) - ->addValue('name', 'MyContactFields') + ->addValue('title', 'MyContactFields') // not Contact ->addValue('extends', 'Individual') ->execute() diff --git a/tests/phpunit/api/v4/Action/PseudoconstantTest.php b/tests/phpunit/api/v4/Action/PseudoconstantTest.php index d8f7621731..a6c7960534 100644 --- a/tests/phpunit/api/v4/Action/PseudoconstantTest.php +++ b/tests/phpunit/api/v4/Action/PseudoconstantTest.php @@ -156,7 +156,7 @@ class PseudoconstantTest extends BaseCustomValueTest { ]; CustomGroup::create(FALSE) - ->addValue('name', 'myPseudoconstantTest') + ->addValue('title', 'myPseudoconstantTest') ->addValue('extends', 'Individual') ->addChain('field1', CustomField::create() ->addValue('custom_group_id', '$id') diff --git a/tests/phpunit/api/v4/Action/ReplaceTest.php b/tests/phpunit/api/v4/Action/ReplaceTest.php index 1846cc5a74..87821656ea 100644 --- a/tests/phpunit/api/v4/Action/ReplaceTest.php +++ b/tests/phpunit/api/v4/Action/ReplaceTest.php @@ -105,7 +105,7 @@ class ReplaceTest extends UnitTestCase { public function testCustomValueReplace() { $customGroup = CustomGroup::create(FALSE) - ->addValue('name', 'replaceTest') + ->addValue('title', 'replaceTest') ->addValue('extends', 'Contact') ->addValue('is_multiple', TRUE) ->execute() diff --git a/tests/phpunit/api/v4/Action/UpdateCustomValueTest.php b/tests/phpunit/api/v4/Action/UpdateCustomValueTest.php index 2177dd4252..81fd5a7a7c 100644 --- a/tests/phpunit/api/v4/Action/UpdateCustomValueTest.php +++ b/tests/phpunit/api/v4/Action/UpdateCustomValueTest.php @@ -32,7 +32,7 @@ class UpdateCustomValueTest extends BaseCustomValueTest { public function testGetWithCustomData() { $customGroup = CustomGroup::create(FALSE) - ->addValue('name', 'MyContactFields') + ->addValue('title', 'MyContactFields') ->addValue('extends', 'Contact') ->execute() ->first(); diff --git a/tests/phpunit/api/v4/DataSets/ConformanceTest.json b/tests/phpunit/api/v4/DataSets/ConformanceTest.json index 82ce19278c..e1a32c3bc2 100644 --- a/tests/phpunit/api/v4/DataSets/ConformanceTest.json +++ b/tests/phpunit/api/v4/DataSets/ConformanceTest.json @@ -24,6 +24,7 @@ "CustomGroup": [ { "name": "MyFavoriteThings", + "title": "MyFavoriteThings", "extends": "Contact" } ], diff --git a/tests/phpunit/api/v4/Entity/ContactTypeTest.php b/tests/phpunit/api/v4/Entity/ContactTypeTest.php index cdb4f492ae..0abe38daba 100644 --- a/tests/phpunit/api/v4/Entity/ContactTypeTest.php +++ b/tests/phpunit/api/v4/Entity/ContactTypeTest.php @@ -143,4 +143,18 @@ class ContactTypeTest extends UnitTestCase implements TransactionalInterface { } + public function testSaveContactWithImpliedType(): void { + // Ensure pseudoconstant suffix works + $result = Contact::create(FALSE) + ->addValue('contact_type:name', 'Household') + ->execute()->first(); + $this->assertEquals('Household', $result['contact_type']); + + // Contact type should be inferred by the type of name given + $result = Contact::save(FALSE) + ->addRecord(['organization_name' => 'Foo']) + ->execute()->first(); + $this->assertEquals('Organization', $result['contact_type']); + } + } diff --git a/tests/phpunit/api/v4/Spec/SpecGathererTest.php b/tests/phpunit/api/v4/Spec/SpecGathererTest.php index 9233ecc02c..5fa6a7e71c 100644 --- a/tests/phpunit/api/v4/Spec/SpecGathererTest.php +++ b/tests/phpunit/api/v4/Spec/SpecGathererTest.php @@ -79,19 +79,21 @@ class SpecGathererTest extends UnitTestCase { public function testPseudoConstantOptionsWillBeAdded() { $customGroupId = CustomGroup::create(FALSE) - ->addValue('name', 'FavoriteThings') + ->addValue('title', 'FavoriteThings') ->addValue('extends', 'Contact') ->execute() ->first()['id']; $options = ['r' => 'Red', 'g' => 'Green', 'p' => 'Pink']; - CustomField::create(FALSE) - ->addValue('label', 'FavColor') - ->addValue('custom_group_id', $customGroupId) - ->addValue('option_values', $options) - ->addValue('html_type', 'Select') - ->addValue('data_type', 'String') + CustomField::save(FALSE) + ->addRecord([ + 'label' => 'FavColor', + 'custom_group_id' => $customGroupId, + 'option_values' => $options, + 'html_type' => 'Select', + 'data_type' => 'String', + ]) ->execute(); $gatherer = new SpecGatherer(); -- 2.25.1