4 * Afform.Get API Test Case
5 * This is a generic test class implemented with PHPUnit.
8 class api_v4_AfformTest
extends api_v4_AfformTestCase
{
9 use \Civi\Test\Api3TestTrait
;
10 use \Civi\Test\ContactTestTrait
;
13 * DOMDocument outputs some tags a little different than they were input.
14 * It's not really a problem but can trip up tests.
16 * @param array|string $markup
17 * @return array|string
19 private function fudgeMarkup($markup) {
20 if (is_array($markup)) {
21 foreach ($markup as $idx => $item) {
22 $markup[$idx] = $this->fudgeMarkup($item);
27 return str_replace([' />', '/>'], ['/>', ' />'], $markup);
31 public function getBasicDirectives() {
33 ['mockPage', ['title' => '', 'description' => '', 'server_route' => 'civicrm/mock-page', 'permission' => 'access Foobar', 'is_dashlet' => TRUE]],
34 ['mockBareFile', ['title' => '', 'description' => '', 'permission' => 'access CiviCRM', 'is_dashlet' => FALSE]],
35 ['mockFoo', ['title' => '', 'description' => '', 'permission' => 'access CiviCRM']],
36 ['mock-weird-name', ['title' => 'Weird Name', 'description' => '', 'permission' => 'access CiviCRM']],
41 * This takes the bundled `example-page` and performs some API calls on it.
43 * @param string $formName
44 * The symbolic name of the form.
45 * @param array $originalMetadata
46 * @dataProvider getBasicDirectives
48 public function testGetUpdateRevert($formName, $originalMetadata) {
49 $get = function($arr, $key) {
50 return isset($arr[$key]) ?
$arr[$key] : NULL;
53 Civi\Api4\Afform
::revert()->addWhere('name', '=', $formName)->execute();
55 $message = 'The initial Afform.get should return default data';
56 $result = Civi\Api4\Afform
::get()->addWhere('name', '=', $formName)->execute();
57 $this->assertEquals($formName, $result[0]['name'], $message);
58 $this->assertEquals($get($originalMetadata, 'title'), $get($result[0], 'title'), $message);
59 $this->assertEquals($get($originalMetadata, 'description'), $get($result[0], 'description'), $message);
60 $this->assertEquals($get($originalMetadata, 'server_route'), $get($result[0], 'server_route'), $message);
61 $this->assertEquals($get($originalMetadata, 'is_dashlet'), $get($result[0], 'is_dashlet'), $message);
62 $this->assertEquals($get($originalMetadata, 'permission'), $get($result[0], 'permission'), $message);
63 $this->assertTrue(is_array($result[0]['layout']), $message);
64 $this->assertEquals(TRUE, $get($result[0], 'has_base'), $message);
65 $this->assertEquals(FALSE, $get($result[0], 'has_local'), $message);
67 $message = 'After updating with Afform.create, the revised data should be returned';
68 $result = Civi\Api4\Afform
::update()
69 ->addWhere('name', '=', $formName)
70 ->addValue('description', 'The temporary description')
71 ->addValue('permission', 'access foo')
72 ->addValue('is_dashlet', TRUE)
74 $this->assertEquals($formName, $result[0]['name'], $message);
75 $this->assertEquals('The temporary description', $result[0]['description'], $message);
77 $message = 'After updating, the Afform.get API should return blended data';
78 $result = Civi\Api4\Afform
::get()->addWhere('name', '=', $formName)->execute();
79 $this->assertEquals($formName, $result[0]['name'], $message);
80 $this->assertEquals($get($originalMetadata, 'title'), $get($result[0], 'title'), $message);
81 $this->assertEquals('The temporary description', $get($result[0], 'description'), $message);
82 $this->assertEquals(TRUE, $get($result[0], 'is_dashlet'), $message);
83 $this->assertEquals($get($originalMetadata, 'server_route'), $get($result[0], 'server_route'), $message);
84 $this->assertEquals('access foo', $get($result[0], 'permission'), $message);
85 $this->assertTrue(is_array($result[0]['layout']), $message);
86 $this->assertEquals(TRUE, $get($result[0], 'has_base'), $message);
87 $this->assertEquals(TRUE, $get($result[0], 'has_local'), $message);
89 Civi\Api4\Afform
::revert()->addWhere('name', '=', $formName)->execute();
90 $message = 'After reverting, the final Afform.get should return default data';
91 $result = Civi\Api4\Afform
::get()->addWhere('name', '=', $formName)->execute();
92 $this->assertEquals($formName, $result[0]['name'], $message);
93 $this->assertEquals($get($originalMetadata, 'title'), $get($result[0], 'title'), $message);
94 $this->assertEquals($get($originalMetadata, 'description'), $get($result[0], 'description'), $message);
95 $this->assertEquals($get($originalMetadata, 'server_route'), $get($result[0], 'server_route'), $message);
96 $this->assertEquals($get($originalMetadata, 'permission'), $get($result[0], 'permission'), $message);
97 $this->assertTrue(is_array($result[0]['layout']), $message);
98 $this->assertEquals(TRUE, $get($result[0], 'has_base'), $message);
99 $this->assertEquals(FALSE, $get($result[0], 'has_local'), $message);
102 public function getFormatExamples() {
104 $formats = ['html', 'shallow', 'deep'];
105 foreach (glob(__DIR__
. '/formatExamples/*.php') as $exampleFile) {
106 $example = require $exampleFile;
107 if (isset($example['deep'])) {
108 foreach ($formats as $updateFormat) {
109 foreach ($formats as $readFormat) {
110 $ex[] = ['mockBareFile', $updateFormat, $example[$updateFormat], $readFormat, $example[$readFormat], $exampleFile];
119 * In this test, we update the layout and in one format and then read it back
122 * @param string $formName
123 * The symbolic name of the form.
124 * @param string $updateFormat
125 * The format with which to write the data.
127 * @param mixed $updateLayout
128 * The new value to set
129 * @param string $readFormat
130 * The format with which to read the data.
132 * @param mixed $readLayout
133 * The value that we expect to read.
134 * @param string $exampleName
135 * (For debug messages) A symbolic name of the example data-set being tested.
136 * @dataProvider getFormatExamples
138 public function testUpdateAndGetFormat($formName, $updateFormat, $updateLayout, $readFormat, $readLayout, $exampleName) {
139 Civi\Api4\Afform
::revert()->addWhere('name', '=', $formName)->execute();
141 Civi\Api4\Afform
::update()
142 ->addWhere('name', '=', $formName)
143 ->setLayoutFormat($updateFormat)
144 ->setValues(['layout' => $updateLayout])
147 $result = Civi\Api4\Afform
::get()
148 ->addWhere('name', '=', $formName)
149 ->setLayoutFormat($readFormat)
152 $this->assertEquals($readLayout, $this->fudgeMarkup($result[0]['layout']), "Based on \"$exampleName\", writing content as \"$updateFormat\" and reading back as \"$readFormat\".");
154 Civi\Api4\Afform
::revert()->addWhere('name', '=', $formName)->execute();
157 public function getWhitespaceExamples() {
159 foreach (glob(__DIR__
. '/formatExamples/*.php') as $exampleFile) {
160 $example = require $exampleFile;
161 if (isset($example['pretty'])) {
162 $ex[] = ['mockBareFile', $example, $exampleFile];
169 * This tests that a non-pretty html string will have its whitespace stripped & reformatted
170 * when using the "formatWhitespace" option.
172 * @dataProvider getWhitespaceExamples
174 public function testWhitespaceFormat($directiveName, $example, $exampleName) {
175 Civi\Api4\Afform
::save()
176 ->addRecord(['name' => $directiveName, 'layout' => $example['html']])
177 ->setLayoutFormat('html')
180 $result = Civi\Api4\Afform
::get()
181 ->addWhere('name', '=', $directiveName)
182 ->setLayoutFormat('shallow')
183 ->setFormatWhitespace(TRUE)
187 $this->assertEquals($example['stripped'] ??
$example['shallow'], $this->fudgeMarkup($result['layout']));
189 Civi\Api4\Afform
::save()
190 ->addRecord(['name' => $directiveName, 'layout' => $result['layout']])
191 ->setLayoutFormat('shallow')
192 ->setFormatWhitespace(TRUE)
195 $result = Civi\Api4\Afform
::get()
196 ->addWhere('name', '=', $directiveName)
197 ->setLayoutFormat('html')
201 $this->assertEquals($example['pretty'], $this->fudgeMarkup($result['layout']));
204 public function testAutoRequires() {
205 $formName = 'mockPage';
206 $this->createLoggedInUser();
208 // The default mockPage has 1 explicit requirement + 2 automatic requirements.
209 Civi\Api4\Afform
::revert()->addWhere('name', '=', $formName)->execute();
210 $angModule = Civi
::service('angular')->getModule($formName);
211 $this->assertEquals(['afCore', 'mockBespoke', 'mockBareFile', 'mockFoo'], $angModule['requires']);
212 $storedRequires = Civi\Api4\Afform
::get()->addWhere('name', '=', $formName)->addSelect('requires')->execute();
213 $this->assertEquals(['mockBespoke'], $storedRequires[0]['requires']);
215 // Knock down to 1 explicit + 1 automatic.
216 Civi\Api4\Afform
::update()
217 ->addWhere('name', '=', $formName)
218 ->setLayoutFormat('html')
219 ->setValues(['layout' => '<div>The bare file says "<span mock-bare-file/>"</div>'])
221 $angModule = Civi
::service('angular')->getModule($formName);
222 $this->assertEquals(['afCore', 'mockBespoke', 'mockBareFile'], $angModule['requires']);
223 $storedRequires = Civi\Api4\Afform
::get()->addWhere('name', '=', $formName)->addSelect('requires')->execute();
224 $this->assertEquals(['mockBespoke'], $storedRequires[0]['requires']);
226 // Remove the last explict and implicit requirements.
227 Civi\Api4\Afform
::update()
228 ->addWhere('name', '=', $formName)
229 ->setLayoutFormat('html')
231 'layout' => '<div>The file has nothing! <strong>NOTHING!</strong> <em>JUST RANTING!</em></div>',
235 $angModule = Civi
::service('angular')->getModule($formName);
236 $this->assertEquals(['afCore'], $angModule['requires']);
237 $storedRequires = Civi\Api4\Afform
::get()->addWhere('name', '=', $formName)->addSelect('requires')->execute();
238 $this->assertEquals([], $storedRequires[0]['requires']);
240 Civi\Api4\Afform
::revert()->addWhere('name', '=', $formName)->execute();
241 $angModule = Civi
::service('angular')->getModule($formName);
242 $this->assertEquals(['afCore', 'mockBespoke', 'mockBareFile', 'mockFoo'], $angModule['requires']);