From 2290426f86e94351a461115515936dac40f267ca Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Wed, 10 Feb 2021 14:33:30 -0800 Subject: [PATCH] Extract 2 tests from AfformRoutingTest to mockPublicForm. Make example work. These two cases rely on setting up the same fixture. It's easier to try out/debug if the fixture is live/available as a matter of course. Tangentially, if you try to use this form (whether as anonymous or as admin, it doesn't -- e.g. because it doesn't have a "Submit" button. So this updates it. --- ext/afform/mock/ang/mockPublicForm.aff.html | 13 +++ ext/afform/mock/ang/mockPublicForm.aff.json | 6 ++ ext/afform/mock/ang/mockPublicForm.test.php | 66 ++++++++++++++ .../phpunit/api/v4/AfformRoutingTest.php | 88 ------------------- 4 files changed, 85 insertions(+), 88 deletions(-) create mode 100644 ext/afform/mock/ang/mockPublicForm.aff.html create mode 100644 ext/afform/mock/ang/mockPublicForm.aff.json create mode 100644 ext/afform/mock/ang/mockPublicForm.test.php diff --git a/ext/afform/mock/ang/mockPublicForm.aff.html b/ext/afform/mock/ang/mockPublicForm.aff.html new file mode 100644 index 0000000000..3ee436441c --- /dev/null +++ b/ext/afform/mock/ang/mockPublicForm.aff.html @@ -0,0 +1,13 @@ + + +
+ Individual 1 +
+
+ + +
+
+
+ +
diff --git a/ext/afform/mock/ang/mockPublicForm.aff.json b/ext/afform/mock/ang/mockPublicForm.aff.json new file mode 100644 index 0000000000..e97ef09b11 --- /dev/null +++ b/ext/afform/mock/ang/mockPublicForm.aff.json @@ -0,0 +1,6 @@ +{ + "type": "form", + "title": "My public form", + "server_route": "civicrm/mock-public-form", + "permission": "*always allow*" +} diff --git a/ext/afform/mock/ang/mockPublicForm.test.php b/ext/afform/mock/ang/mockPublicForm.test.php new file mode 100644 index 0000000000..6562912103 --- /dev/null +++ b/ext/afform/mock/ang/mockPublicForm.test.php @@ -0,0 +1,66 @@ +createGuzzle()->get('civicrm/mock-public-form'); + $this->assertContentType('text/html; charset=utf-8', $r); + $this->assertStatusCode(200, $r); + $body = (string) $r->getBody(); + $this->assertContains('mockPublicForm', $body); + } + + public function testPublicCreateAllowed() { + $initialMaxId = CRM_Core_DAO::singleValueQuery('SELECT max(id) FROM civicrm_contact'); + + $r = md5(random_bytes(16)); + + $me = [0 => ['fields' => []]]; + $me[0]['fields']['first_name'] = 'Firsty' . $r; + $me[0]['fields']['last_name'] = 'Lasty' . $r; + + $this->submit(['args' => [], 'values' => ['me' => $me]]); + + // Contact was created... + $contact = Civi\Api4\Contact::get(FALSE)->addWhere('first_name', '=', 'Firsty' . $r)->execute()->single(); + $this->assertEquals('Firsty' . $r, $contact['first_name']); + $this->assertEquals('Lasty' . $r, $contact['last_name']); + $this->assertTrue($contact['id'] > $initialMaxId); + } + + public function testPublicEditDisallowed() { + $contact = Civi\Api4\Contact::create(FALSE) + ->setValues([ + 'first_name' => 'FirstBegin', + 'last_name' => 'LastBegin', + 'contact_type' => 'Individual', + ]) + ->execute() + ->first(); + + $r = md5(random_bytes(16)); + + $me = [0 => ['fields' => []]]; + $me[0]['fields']['id'] = $contact['id']; + $me[0]['fields']['first_name'] = 'Firsty' . $r; + $me[0]['fields']['last_name'] = 'Lasty' . $r; + + $this->submitError(['args' => [], 'values' => ['me' => $me]]); + $this->assertContentType('application/json')->assertStatusCode(403); + + // Contact hasn't changed + $get = Civi\Api4\Contact::get(FALSE)->addWhere('id', '=', $contact['id'])->execute()->single(); + $this->assertEquals('FirstBegin', $get['first_name']); + $this->assertEquals('LastBegin', $get['last_name']); + + // No other contacts were created or edited with the requested value. + $this->assertEquals(0, CRM_Core_DAO::singleValueQuery('SELECT count(*) FROM civicrm_contact WHERE first_name=%1', [1 => ["Firsty{$r}", 'String']])); + } + +} diff --git a/ext/afform/mock/tests/phpunit/api/v4/AfformRoutingTest.php b/ext/afform/mock/tests/phpunit/api/v4/AfformRoutingTest.php index 3a346a0135..3fd74d34e1 100644 --- a/ext/afform/mock/tests/phpunit/api/v4/AfformRoutingTest.php +++ b/ext/afform/mock/tests/phpunit/api/v4/AfformRoutingTest.php @@ -96,92 +96,4 @@ class api_v4_AfformRoutingTest extends \PHPUnit\Framework\TestCase implements \C $this->assertRegExp(';afform":\{"open":"' . preg_quote($directive, ';') . '"\};', $contents); } - public function testPublicCreateAllowed() { - $initialMaxId = CRM_Core_DAO::singleValueQuery('SELECT max(id) FROM civicrm_contact'); - $http = new \GuzzleHttp\Client(['http_errors' => FALSE]); - $url = function ($path, $query = NULL) { - return CRM_Utils_System::url($path, $query, TRUE, NULL, FALSE); - }; - - $this->createPublicForm(); - - $r = md5(random_bytes(16)); - - $me = [0 => ['fields' => []]]; - $me[0]['fields']['first_name'] = 'Firsty' . $r; - $me[0]['fields']['last_name'] = 'Lasty' . $r; - - $query = [ - 'params' => json_encode(['name' => $this->formName, 'args' => [], 'values' => ['me' => $me]]), - ]; - - $response = $http->post($url('civicrm/ajax/api4/Afform/submit', $query), ['headers' => ['X-Requested-With' => 'XMLHttpRequest']]); - $this->assertEquals(200, $response->getStatusCode()); - $contact = Civi\Api4\Contact::get(FALSE)->addWhere('first_name', '=', 'Firsty' . $r)->execute()->first(); - $this->assertEquals('Firsty' . $r, $contact['first_name']); - $this->assertEquals('Lasty' . $r, $contact['last_name']); - $this->assertTrue($contact['id'] > $initialMaxId); - } - - public function testPublicEditDisallowed() { - $contact = Civi\Api4\Contact::create(FALSE) - ->setValues([ - 'first_name' => 'FirstBegin', - 'last_name' => 'LastBegin', - 'contact_type' => 'Individual', - ]) - ->execute() - ->first(); - - $http = new \GuzzleHttp\Client(['http_errors' => FALSE]); - $url = function ($path, $query = NULL) { - return CRM_Utils_System::url($path, $query, TRUE, NULL, FALSE); - }; - - $this->createPublicForm(); - - $r = md5(random_bytes(16)); - - $me = [0 => ['fields' => []]]; - $me[0]['fields']['id'] = $contact['id']; - $me[0]['fields']['first_name'] = 'Firsty' . $r; - $me[0]['fields']['last_name'] = 'Lasty' . $r; - - $query = [ - 'params' => json_encode(['name' => $this->formName, 'args' => [], 'values' => ['me' => $me]]), - ]; - - $response = $http->post($url('civicrm/ajax/api4/Afform/submit', $query), ['headers' => ['X-Requested-With' => 'XMLHttpRequest']]); - - // FIXME: The current behavior is {status=500,body='[]'} ... but status=403 probably makes more sense. - $this->assertEquals(500, $response->getStatusCode()); - $get = Civi\Api4\Contact::get(FALSE)->addWhere('id', '=', $contact['id'])->execute()->first(); - // Contact hasn't changed - $this->assertEquals('FirstBegin', $get['first_name']); - $this->assertEquals('LastBegin', $get['last_name']); - // No other contacts were created or edited with the requested value. - $this->assertEquals(0, CRM_Core_DAO::singleValueQuery('SELECT count(*) FROM civicrm_contact WHERE first_name=%1', [1 => ["Firsty{$r}", 'String']])); - } - - private function createPublicForm():void { - $defaults = [ - 'title' => 'My form', - 'name' => $this->formName, - 'layout' => ' - - -
- - -
-
', - 'permission' => CRM_Core_Permission::ALWAYS_ALLOW_PERMISSION, - ]; - Civi\Api4\Afform::create() - ->setCheckPermissions(FALSE) - ->setLayoutFormat('html') - ->setValues($defaults) - ->execute(); - } - } -- 2.25.1