3 namespace api\v
4\Service
;
5 use Civi\Api4\Service\Spec\FieldSpec
;
6 use Civi\Api4\Service\Spec\SpecGatherer
;
8 class TestCreationParameterProvider
{
11 * @var \Civi\Api4\Service\Spec\SpecGatherer
16 * @param \Civi\Api4\Service\Spec\SpecGatherer $gatherer
18 public function __construct(SpecGatherer
$gatherer) {
19 $this->gatherer
= $gatherer;
27 public function getRequired($entity) {
28 $createSpec = $this->gatherer
->getSpec($entity, 'create', FALSE);
29 $requiredFields = array_merge($createSpec->getRequiredFields(), $createSpec->getConditionalRequiredFields());
31 if ($entity === 'Contact') {
32 $requiredFields[] = $createSpec->getFieldByName('first_name');
33 $requiredFields[] = $createSpec->getFieldByName('last_name');
37 foreach ($requiredFields as $requiredField) {
38 $value = $this->getRequiredValue($requiredField);
39 $requiredParams[$requiredField->getName()] = $value;
42 unset($requiredParams['id']);
44 return $requiredParams;
48 * Attempt to get a value using field option, defaults, FKEntity, or a random
49 * value based on the data type.
51 * @param \Civi\Api4\Service\Spec\FieldSpec $field
56 private function getRequiredValue(FieldSpec
$field) {
58 if ($field->getOptions()) {
59 return $this->getOption($field);
61 elseif ($field->getDefaultValue()) {
62 return $field->getDefaultValue();
64 elseif ($field->getFkEntity()) {
65 return $this->getFkID($field, $field->getFkEntity());
67 elseif (in_array($field->getName(), ['entity_id', 'contact_id'])) {
68 return $this->getFkID($field, 'Contact');
71 $randomValue = $this->getRandomValue($field->getDataType());
77 throw new \
Exception('Could not provide default value');
81 * @param \Civi\Api4\Service\Spec\FieldSpec $field
85 private function getOption(FieldSpec
$field) {
86 $options = $field->getOptions();
87 return array_rand($options);
91 * @param \Civi\Api4\Service\Spec\FieldSpec $field
92 * @param string $fkEntity
97 private function getFkID(FieldSpec
$field, $fkEntity) {
98 $params = ['checkPermissions' => FALSE];
99 // Be predictable about what type of contact we select
100 if ($fkEntity === 'Contact') {
101 $params['where'] = [['contact_type', '=', 'Individual']];
103 $entityList = civicrm_api4($fkEntity, 'get', $params);
104 if ($entityList->count() < 1) {
105 $msg = sprintf('At least one %s is required in test', $fkEntity);
106 throw new \
Exception($msg);
109 return $entityList->last()['id'];
115 * @return int|null|string
117 private function getRandomValue($dataType) {
123 return rand(1, 2000);
126 return \CRM_Utils_String
::createRandom(10, implode('', range('a', 'z')));
129 return \CRM_Utils_String
::createRandom(100, implode('', range('a', 'z')));
132 return sprintf('%d.%2d', rand(0, 2000), rand(10, 99));