From: Seamus Lee Date: Wed, 9 Sep 2020 03:08:52 +0000 (+1000) Subject: [REF] Refactor price field form to allow for unit testing of the form X-Git-Url: https://vcs.fsf.org/?a=commitdiff_plain;h=f961a8cde5f2c4d696315b8ebe2126b86969f5f6;p=civicrm-core.git [REF] Refactor price field form to allow for unit testing of the form Set the assert equals to be an actual float number --- diff --git a/CRM/Price/Form/Field.php b/CRM/Price/Form/Field.php index 023066db68..de3b607e3b 100644 --- a/CRM/Price/Form/Field.php +++ b/CRM/Price/Form/Field.php @@ -77,6 +77,13 @@ class CRM_Price_Form_Field extends CRM_Core_Form { */ protected $_useForMember; + /** + * Set the price Set Id (only used in tests) + */ + public function setPriceSetId($priceSetId) { + $this->_sid = $priceSetId; + } + /** * Set variables up before form is built. */ @@ -641,6 +648,25 @@ class CRM_Price_Form_Field extends CRM_Core_Form { public function postProcess() { // store the submitted values in an array $params = $this->controller->exportValues('Field'); + $params['id'] = $this->getEntityId(); + $priceField = $this->submit($params); + if (!is_a($priceField, 'CRM_Core_Error')) { + // Required by extensions implementing the postProcess hook (to get the ID of new entities) + $this->setEntityId($priceField->id); + CRM_Core_Session::setStatus(ts('Price Field \'%1\' has been saved.', [1 => $priceField->label]), ts('Saved'), 'success'); + } + $buttonName = $this->controller->getButtonName(); + $session = CRM_Core_Session::singleton(); + if ($buttonName == $this->getButtonName('next', 'new')) { + CRM_Core_Session::setStatus(ts(' You can add another price set field.'), '', 'info'); + $session->replaceUserContext(CRM_Utils_System::url('civicrm/admin/price/field', 'reset=1&action=add&sid=' . $this->_sid)); + } + else { + $session->replaceUserContext(CRM_Utils_System::url('civicrm/admin/price/field', 'reset=1&action=browse&sid=' . $this->_sid)); + } + } + + public function submit($params) { $params['price'] = CRM_Utils_Rule::cleanMoney($params['price']); foreach ($params['option_amount'] as $key => $amount) { $params['option_amount'][$key] = CRM_Utils_Rule::cleanMoney($amount); @@ -686,26 +712,10 @@ class CRM_Price_Form_Field extends CRM_Core_Form { $params['option_visibility_id'] = [1 => CRM_Utils_Array::value('visibility_id', $params)]; } - $params['id'] = $this->getEntityId(); - $params['membership_num_terms'] = (!empty($params['membership_type_id'])) ? CRM_Utils_Array::value('membership_num_terms', $params, 1) : NULL; $priceField = CRM_Price_BAO_PriceField::create($params); - - if (!is_a($priceField, 'CRM_Core_Error')) { - // Required by extensions implementing the postProcess hook (to get the ID of new entities) - $this->setEntityId($priceField->id); - CRM_Core_Session::setStatus(ts('Price Field \'%1\' has been saved.', [1 => $priceField->label]), ts('Saved'), 'success'); - } - $buttonName = $this->controller->getButtonName(); - $session = CRM_Core_Session::singleton(); - if ($buttonName == $this->getButtonName('next', 'new')) { - CRM_Core_Session::setStatus(ts(' You can add another price set field.'), '', 'info'); - $session->replaceUserContext(CRM_Utils_System::url('civicrm/admin/price/field', 'reset=1&action=add&sid=' . $this->_sid)); - } - else { - $session->replaceUserContext(CRM_Utils_System::url('civicrm/admin/price/field', 'reset=1&action=browse&sid=' . $this->_sid)); - } + return $priceField; } } diff --git a/tests/phpunit/CRM/Price/Form/FieldTest.php b/tests/phpunit/CRM/Price/Form/FieldTest.php index f7ba89f11d..e4c71d8819 100644 --- a/tests/phpunit/CRM/Price/Form/FieldTest.php +++ b/tests/phpunit/CRM/Price/Form/FieldTest.php @@ -57,6 +57,35 @@ class CRM_Price_Form_FieldTest extends CiviUnitTestCase { $this->assertTrue(array_key_exists('visibility_id', $validationResult)); } + /** + * Test submitting a large float value is stored correctly in the db. + * + * @param string $thousandSeparator + * punctuation used to refer to thousands. + * + * @dataProvider getThousandSeparators + */ + public function testLargeFloatOptionValue($thousandSeparator) { + $this->setCurrencySeparators($thousandSeparator); + $thousands = Civi::settings()->get('monetaryThousandSeparator'); + $decimal = Civi::settings()->get('monetaryDecimalPoint'); + $paramsSet['title'] = 'Price Set' . substr(sha1(rand()), 0, 7); + $paramsSet['name'] = CRM_Utils_String::titleToVar($paramsSet['title']); + $paramsSet['is_active'] = TRUE; + $paramsSet['financial_type_id'] = 'Event Fee'; + $paramsSet['extends'] = 1; + $priceSet = $this->callAPISuccess('price_set', 'create', $paramsSet); + $form = new CRM_Price_Form_Field(); + $form->_action = CRM_Core_Action::ADD; + $form->setPriceSetId($priceSet['id']); + $this->publicFieldParams['option_label'][1] = 'Large Float'; + $this->publicFieldParams['option_amount'][1] = '123' . $thousands . '456' . $thousands . '789' . $decimal . '987654321'; + $this->publicFieldParams['option_visibility_id'][1] = $this->visibilityOptionsKeys['public']; + $priceField = $form->submit($this->publicFieldParams); + $priceOptions = $this->callAPISuccess('PriceFieldValue', 'get', ['price_field_id' => $priceField->id]); + $this->assertEquals(123456789.987654321, $priceOptions['values'][$priceOptions['id']]['amount']); + } + private function initializeFieldParameters($params) { $defaultParams = [ 'label' => 'Price Field', @@ -68,6 +97,7 @@ class CRM_Price_Form_FieldTest extends CiviUnitTestCase { 'is_enter_qty' => 1, 'financial_type_id' => $this->getFinancialTypeId('Event Fee'), 'visibility_id' => $this->visibilityOptionsKeys['public'], + 'price' => 10, ]; for ($index = 1; $index <= CRM_Price_Form_Field::NUM_OPTION; $index++) {