Merge pull request #15346 from jitendrapurohit/dev-1272
[civicrm-core.git] / tests / phpunit / api / v4 / Entity / ConformanceTest.php
CommitLineData
19b53e5b
C
1<?php
2
3namespace api\v4\Entity;
4
5use Civi\Api4\Entity;
6use api\v4\Traits\TableDropperTrait;
7use api\v4\UnitTestCase;
8
9/**
10 * @group headless
11 */
12class ConformanceTest extends UnitTestCase {
13
14 use TableDropperTrait;
15 use \api\v4\Traits\OptionCleanupTrait {
16 setUp as setUpOptionCleanup;
17 }
18
19 /**
20 * @var \api\v4\Service\TestCreationParameterProvider
21 */
22 protected $creationParamProvider;
23
24 /**
25 * Set up baseline for testing
26 */
27 public function setUp() {
28 $tablesToTruncate = [
29 'civicrm_custom_group',
30 'civicrm_custom_field',
31 'civicrm_group',
32 'civicrm_event',
33 'civicrm_participant',
34 ];
35 $this->dropByPrefix('civicrm_value_myfavorite');
36 $this->cleanup(['tablesToTruncate' => $tablesToTruncate]);
37 $this->setUpOptionCleanup();
38 $this->loadDataSet('ConformanceTest');
39 $this->creationParamProvider = \Civi::container()->get('test.param_provider');
40 parent::setUp();
41 // calculateTaxAmount() for contribution triggers a deprecation notice
1d10c3cf 42 \PHPUnit\Framework\Error\Deprecated::$enabled = FALSE;
19b53e5b
C
43 }
44
45 public function getEntities() {
46 return Entity::get()->setCheckPermissions(FALSE)->execute()->column('name');
47 }
48
49 /**
50 * Fixme: This should use getEntities as a dataProvider but that fails for some reason
51 */
52 public function testConformance() {
53 $entities = $this->getEntities();
54 $this->assertNotEmpty($entities);
55
56 foreach ($entities as $data) {
57 $entity = $data;
58 $entityClass = 'Civi\Api4\\' . $entity;
59
60 $actions = $this->checkActions($entityClass);
61
62 // Go no further if it's not a CRUD entity
63 if (array_diff(['get', 'create', 'update', 'delete'], array_keys($actions))) {
64 continue;
65 }
66
67 $this->checkFields($entityClass, $entity);
68 $id = $this->checkCreation($entity, $entityClass);
69 $this->checkGet($entityClass, $id, $entity);
70 $this->checkGetCount($entityClass, $id, $entity);
71 $this->checkUpdateFailsFromCreate($entityClass, $id);
72 $this->checkWrongParamType($entityClass);
73 $this->checkDeleteWithNoId($entityClass);
74 $this->checkDeletion($entityClass, $id);
75 $this->checkPostDelete($entityClass, $id, $entity);
76 }
77 }
78
79 /**
80 * @param string $entityClass
81 * @param $entity
82 */
83 protected function checkFields($entityClass, $entity) {
84 $fields = $entityClass::getFields()
85 ->setCheckPermissions(FALSE)
86 ->setIncludeCustom(FALSE)
87 ->execute()
88 ->indexBy('name');
89
90 $errMsg = sprintf('%s is missing required ID field', $entity);
91 $subset = ['data_type' => 'Integer'];
92
93 $this->assertArraySubset($subset, $fields['id'], $errMsg);
94 }
95
96 /**
97 * @param string $entityClass
98 */
99 protected function checkActions($entityClass) {
100 $actions = $entityClass::getActions()
101 ->setCheckPermissions(FALSE)
102 ->execute()
103 ->indexBy('name');
104
105 $this->assertNotEmpty($actions);
106 return (array) $actions;
107 }
108
109 /**
110 * @param string $entity
111 * @param \Civi\Api4\Generic\AbstractEntity|string $entityClass
112 *
113 * @return mixed
114 */
115 protected function checkCreation($entity, $entityClass) {
116 $requiredParams = $this->creationParamProvider->getRequired($entity);
117 $createResult = $entityClass::create()
118 ->setValues($requiredParams)
119 ->setCheckPermissions(FALSE)
120 ->execute()
121 ->first();
122
123 $this->assertArrayHasKey('id', $createResult, "create missing ID");
124 $id = $createResult['id'];
125
126 $this->assertGreaterThanOrEqual(1, $id, "$entity ID not positive");
127
128 return $id;
129 }
130
131 /**
132 * @param \Civi\Api4\Generic\AbstractEntity|string $entityClass
133 * @param int $id
134 */
135 protected function checkUpdateFailsFromCreate($entityClass, $id) {
136 $exceptionThrown = '';
137 try {
138 $entityClass::create()
139 ->setCheckPermissions(FALSE)
140 ->addValue('id', $id)
141 ->execute();
142 }
143 catch (\API_Exception $e) {
144 $exceptionThrown = $e->getMessage();
145 }
146 $this->assertContains('id', $exceptionThrown);
147 }
148
149 /**
150 * @param \Civi\Api4\Generic\AbstractEntity|string $entityClass
151 * @param int $id
152 * @param string $entity
153 */
154 protected function checkGet($entityClass, $id, $entity) {
155 $getResult = $entityClass::get()
156 ->setCheckPermissions(FALSE)
157 ->addWhere('id', '=', $id)
158 ->execute();
159
160 $errMsg = sprintf('Failed to fetch a %s after creation', $entity);
161 $this->assertEquals($id, $getResult->first()['id'], $errMsg);
162 $this->assertEquals(1, $getResult->count(), $errMsg);
163 }
164
165 /**
166 * @param \Civi\Api4\Generic\AbstractEntity|string $entityClass
167 * @param int $id
168 * @param string $entity
169 */
170 protected function checkGetCount($entityClass, $id, $entity) {
171 $getResult = $entityClass::get()
172 ->setCheckPermissions(FALSE)
173 ->addWhere('id', '=', $id)
174 ->selectRowCount()
175 ->execute();
176 $errMsg = sprintf('%s getCount failed', $entity);
177 $this->assertEquals(1, $getResult->count(), $errMsg);
178
179 $getResult = $entityClass::get()
180 ->setCheckPermissions(FALSE)
181 ->selectRowCount()
182 ->execute();
183 $errMsg = sprintf('%s getCount failed', $entity);
184 $this->assertGreaterThanOrEqual(1, $getResult->count(), $errMsg);
185 }
186
187 /**
188 * @param \Civi\Api4\Generic\AbstractEntity|string $entityClass
189 */
190 protected function checkDeleteWithNoId($entityClass) {
191 $exceptionThrown = '';
192 try {
193 $entityClass::delete()
194 ->execute();
195 }
196 catch (\API_Exception $e) {
197 $exceptionThrown = $e->getMessage();
198 }
199 $this->assertContains('required', $exceptionThrown);
200 }
201
202 /**
203 * @param \Civi\Api4\Generic\AbstractEntity|string $entityClass
204 */
205 protected function checkWrongParamType($entityClass) {
206 $exceptionThrown = '';
207 try {
208 $entityClass::get()
209 ->setCheckPermissions('nada')
210 ->execute();
211 }
212 catch (\API_Exception $e) {
213 $exceptionThrown = $e->getMessage();
214 }
215 $this->assertContains('checkPermissions', $exceptionThrown);
216 $this->assertContains('type', $exceptionThrown);
217 }
218
219 /**
220 * @param \Civi\Api4\Generic\AbstractEntity|string $entityClass
221 * @param int $id
222 */
223 protected function checkDeletion($entityClass, $id) {
224 $deleteResult = $entityClass::delete()
225 ->setCheckPermissions(FALSE)
226 ->addWhere('id', '=', $id)
227 ->execute();
228
229 // should get back an array of deleted id
230 $this->assertEquals([['id' => $id]], (array) $deleteResult);
231 }
232
233 /**
234 * @param \Civi\Api4\Generic\AbstractEntity|string $entityClass
235 * @param int $id
236 * @param string $entity
237 */
238 protected function checkPostDelete($entityClass, $id, $entity) {
239 $getDeletedResult = $entityClass::get()
240 ->setCheckPermissions(FALSE)
241 ->addWhere('id', '=', $id)
242 ->execute();
243
244 $errMsg = sprintf('Entity "%s" was not deleted', $entity);
245 $this->assertEquals(0, count($getDeletedResult), $errMsg);
246 }
247
248}