Skip to content

Commit

Permalink
APIv4 - Ensure getFields always returns table_name and column_name
Browse files Browse the repository at this point in the history
  • Loading branch information
colemanw committed May 31, 2021
1 parent 2bf220f commit e60149f
Show file tree
Hide file tree
Showing 6 changed files with 101 additions and 58 deletions.
23 changes: 0 additions & 23 deletions Civi/Api4/Service/Spec/CustomFieldSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,6 @@ class CustomFieldSpec extends FieldSpec {
*/
public $customGroup;

/**
* @var string
*/
public $tableName;

/**
* @inheritDoc
*/
Expand Down Expand Up @@ -91,22 +86,4 @@ public function setCustomGroupName($customGroupName) {
return $this;
}

/**
* @return string
*/
public function getCustomTableName() {
return $this->tableName;
}

/**
* @param string $customFieldColumnName
*
* @return $this
*/
public function setCustomTableName($customFieldColumnName) {
$this->tableName = $customFieldColumnName;

return $this;
}

}
34 changes: 34 additions & 0 deletions Civi/Api4/Service/Spec/FieldSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,11 @@ class FieldSpec {
*/
public $options;

/**
* @var string
*/
public $tableName;

/**
* @var callable
*/
Expand Down Expand Up @@ -219,6 +224,17 @@ public function setTitle($title) {
return $this;
}

/**
* @param string $entity
*
* @return $this
*/
public function setEntity($entity) {
$this->entity = $entity;

return $this;
}

/**
* @return string
*/
Expand Down Expand Up @@ -446,6 +462,24 @@ public function setHelpPost($helpPost) {
$this->helpPost = is_string($helpPost) && strlen($helpPost) ? $helpPost : NULL;
}

/**
* @param string $customFieldColumnName
*
* @return CustomFieldSpec
*/
public function setTableName($customFieldColumnName) {
$this->tableName = $customFieldColumnName;

return $this;
}

/**
* @return string
*/
public function getTableName() {
return $this->tableName;
}

/**
* Add valid types that are not not part of \CRM_Utils_Type::dataTypes
*
Expand Down
14 changes: 14 additions & 0 deletions Civi/Api4/Service/Spec/RequestSpec.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@

namespace Civi\Api4\Service\Spec;

use Civi\Api4\Utils\CoreUtil;

class RequestSpec {

/**
Expand All @@ -31,6 +33,11 @@ class RequestSpec {
*/
protected $action;

/**
* @var string
*/
protected $entityTableName;

/**
* @var FieldSpec[]
*/
Expand All @@ -43,9 +50,16 @@ class RequestSpec {
public function __construct($entity, $action) {
$this->entity = $entity;
$this->action = $action;
$this->entityTableName = CoreUtil::getTableName($entity);
}

public function addFieldSpec(FieldSpec $field) {
if (!$field->getEntity()) {
$field->setEntity($this->entity);
}
if (!$field->getTableName()) {
$field->setTableName($this->entityTableName);
}
$this->fields[] = $field;
}

Expand Down
2 changes: 1 addition & 1 deletion Civi/Api4/Service/Spec/SpecFormatter.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public static function arrayToField(array $data, $entity) {
$field->setName($data['custom_group.name'] . '.' . $data['name']);
}
else {
$field->setCustomTableName($data['custom_group.table_name']);
$field->setTableName($data['custom_group.table_name']);
}
$field->setColumnName($data['column_name']);
$field->setCustomFieldId($data['id'] ?? NULL);
Expand Down
78 changes: 44 additions & 34 deletions tests/phpunit/api/v4/Action/CustomValueTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@ public function testCRUD() {
$optionValues = ['r' => 'Red', 'g' => 'Green', 'b' => 'Blue'];

$group = uniqid('groupc');
$colorField = uniqid('colorc');
$multiField = uniqid('chkbx');
$textField = uniqid('txt');
$colorFieldName = uniqid('colorc');
$multiFieldName = uniqid('chkbx');
$textFieldName = uniqid('txt');

$customGroup = CustomGroup::create(FALSE)
->addValue('name', $group)
Expand All @@ -49,28 +49,28 @@ public function testCRUD() {
->execute()
->first();

CustomField::create(FALSE)
->addValue('label', $colorField)
$colorField = CustomField::create(FALSE)
->addValue('label', $colorFieldName)
->addValue('option_values', $optionValues)
->addValue('custom_group_id', $customGroup['id'])
->addValue('html_type', 'Select')
->addValue('data_type', 'String')
->execute();
->execute()->first();

CustomField::create(FALSE)
->addValue('label', $multiField)
$multiField = CustomField::create(FALSE)
->addValue('label', $multiFieldName)
->addValue('option_values', $optionValues)
->addValue('custom_group_id', $customGroup['id'])
->addValue('html_type', 'CheckBox')
->addValue('data_type', 'String')
->execute();
->execute()->first();

CustomField::create(FALSE)
->addValue('label', $textField)
$textField = CustomField::create(FALSE)
->addValue('label', $textFieldName)
->addValue('custom_group_id', $customGroup['id'])
->addValue('html_type', 'Text')
->addValue('data_type', 'String')
->execute();
->execute()->first();

$this->contactID = Contact::create(FALSE)
->addValue('first_name', 'Johann')
Expand All @@ -84,29 +84,35 @@ public function testCRUD() {
$expectedResult = [
[
'custom_group' => $group,
'name' => $colorField,
'title' => $colorField,
'name' => $colorFieldName,
'title' => $colorFieldName,
'entity' => "Custom_$group",
'table_name' => $customGroup['table_name'],
'column_name' => $colorField['column_name'],
'data_type' => 'String',
'fk_entity' => NULL,
'serialize' => 0,
'options' => $optionValues,
],
[
'custom_group' => $group,
'name' => $multiField,
'title' => $multiField,
'name' => $multiFieldName,
'title' => $multiFieldName,
'entity' => "Custom_$group",
'table_name' => $customGroup['table_name'],
'column_name' => $multiField['column_name'],
'data_type' => 'String',
'fk_entity' => NULL,
'serialize' => 1,
'options' => $optionValues,
],
[
'custom_group' => $group,
'name' => $textField,
'title' => $textField,
'name' => $textFieldName,
'title' => $textFieldName,
'entity' => "Custom_$group",
'table_name' => $customGroup['table_name'],
'column_name' => $textField['column_name'],
'data_type' => 'String',
'fk_entity' => NULL,
'serialize' => 0,
Expand All @@ -115,12 +121,16 @@ public function testCRUD() {
'name' => 'id',
'title' => ts('Custom Value ID'),
'entity' => "Custom_$group",
'table_name' => $customGroup['table_name'],
'column_name' => 'id',
'data_type' => 'Integer',
'fk_entity' => NULL,
],
[
'name' => 'entity_id',
'title' => ts('Entity ID'),
'table_name' => $customGroup['table_name'],
'column_name' => 'entity_id',
'entity' => "Custom_$group",
'data_type' => 'Integer',
'fk_entity' => 'Contact',
Expand All @@ -137,33 +147,33 @@ public function testCRUD() {
// Create two records for a single contact and using CustomValue::get ensure that two records are created
$created = [
CustomValue::create($group)
->addValue($colorField, 'g')
->addValue($colorFieldName, 'g')
->addValue("entity_id", $this->contactID)
->execute()->first(),
CustomValue::create($group)
->addValue($colorField . ':label', 'Red')
->addValue($colorFieldName . ':label', 'Red')
->addValue("entity_id", $this->contactID)
->execute()->first(),
];
// fetch custom values using API4 CustomValue::get
$result = CustomValue::get($group)
->addSelect('id', 'entity_id', $colorField, $colorField . ':label')
->addOrderBy($colorField, 'ASC')
->addSelect('id', 'entity_id', $colorFieldName, $colorFieldName . ':label')
->addOrderBy($colorFieldName, 'ASC')
->execute();

// check if two custom values are created
$this->assertEquals(2, count($result));
$expectedResult = [
[
'id' => 1,
$colorField => 'g',
$colorField . ':label' => 'Green',
$colorFieldName => 'g',
$colorFieldName . ':label' => 'Green',
'entity_id' => $this->contactID,
],
[
'id' => 2,
$colorField => 'r',
$colorField . ':label' => 'Red',
$colorFieldName => 'r',
$colorFieldName . ':label' => 'Red',
'entity_id' => $this->contactID,
],
];
Expand All @@ -181,14 +191,14 @@ public function testCRUD() {
// Update a records whose id is 1 and change the custom field (name = Color) value to 'Blue' from 'Green'
CustomValue::update($group)
->addWhere("id", "=", 1)
->addValue($colorField . ':label', 'Blue')
->addValue($colorFieldName . ':label', 'Blue')
->execute();

// ensure that the value is changed for id = 1
$color = CustomValue::get($group)
->addWhere("id", "=", 1)
->execute()
->first()[$colorField];
->first()[$colorFieldName];
$this->assertEquals('b', $color);

// CASE 3: Test CustomValue::replace
Expand All @@ -202,23 +212,23 @@ public function testCRUD() {
// Replace all the records which was created earlier with entity_id = first contact
// with custom record [$colorField => 'g', 'entity_id' => $secondContactID]
CustomValue::replace($group)
->setRecords([[$colorField => 'g', $multiField . ':label' => ['Red', 'Green'], 'entity_id' => $secondContactID]])
->setRecords([[$colorFieldName => 'g', $multiFieldName . ':label' => ['Red', 'Green'], 'entity_id' => $secondContactID]])
->addWhere('entity_id', '=', $this->contactID)
->execute();

// Check the two records created earlier is replaced by new contact
$result = CustomValue::get($group)
->addSelect('id', 'entity_id', $colorField, $colorField . ':label', $multiField, $multiField . ':label')
->addSelect('id', 'entity_id', $colorFieldName, $colorFieldName . ':label', $multiFieldName, $multiFieldName . ':label')
->execute();
$this->assertEquals(1, count($result));

$expectedResult = [
[
'id' => 3,
$colorField => 'g',
$colorField . ':label' => 'Green',
$multiField => ['r', 'g'],
$multiField . ':label' => ['Red', 'Green'],
$colorFieldName => 'g',
$colorFieldName . ':label' => 'Green',
$multiFieldName => ['r', 'g'],
$multiFieldName . ':label' => ['Red', 'Green'],
'entity_id' => $secondContactID,
],
];
Expand Down
8 changes: 8 additions & 0 deletions tests/phpunit/api/v4/Action/GetFieldsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,14 @@ public function testOptionsAreReturned() {
$this->assertFalse($fields['first_name']['options']);
}

public function testTableAndColumnReturned() {
$fields = Contact::getFields(FALSE)
->execute()
->indexBy('name');
$this->assertEquals('civicrm_contact', $fields['display_name']['table_name']);
$this->assertEquals('display_name', $fields['display_name']['column_name']);
}

public function testComponentFields() {
\CRM_Core_BAO_ConfigSetting::disableComponent('CiviCampaign');
$fields = \Civi\Api4\Event::getFields()
Expand Down

0 comments on commit e60149f

Please sign in to comment.