From be50cdbf7f573fb2b98dd0a565702774a872f07c Mon Sep 17 00:00:00 2001 From: Dan Feder Date: Thu, 17 May 2018 18:40:32 -0400 Subject: [PATCH] Apply custom validation rules to REST API node creation (#2521) --- .../dkan_dataset_rest_api.api.php | 31 +++++++++++++++++ .../dkan_dataset_rest_api.module | 34 +++++++++++++------ .../dkan_dataset/tests/dkan_dataset_test.info | 6 ++++ .../tests/dkan_dataset_test.module | 16 +++++++++ test/phpunit/dkan_dataset/ApiTest.php | 32 +++++++++++++++++ 5 files changed, 108 insertions(+), 11 deletions(-) create mode 100644 modules/dkan/dkan_dataset/modules/dkan_dataset_rest_api/dkan_dataset_rest_api.api.php create mode 100644 modules/dkan/dkan_dataset/tests/dkan_dataset_test.info create mode 100644 modules/dkan/dkan_dataset/tests/dkan_dataset_test.module diff --git a/modules/dkan/dkan_dataset/modules/dkan_dataset_rest_api/dkan_dataset_rest_api.api.php b/modules/dkan/dkan_dataset/modules/dkan_dataset_rest_api/dkan_dataset_rest_api.api.php new file mode 100644 index 0000000000..9d2b29096d --- /dev/null +++ b/modules/dkan/dkan_dataset/modules/dkan_dataset_rest_api/dkan_dataset_rest_api.api.php @@ -0,0 +1,31 @@ +getMessage()); @@ -118,7 +118,7 @@ function _dkan_dataset_rest_api_resource_update($nid, $request) { try { field_attach_validate('node', $node); - _dkan_dataset_rest_api_field_validation($node); + _dkan_dataset_rest_api_validate_fields($node); } catch (\Exception $e) { return services_error($e->getMessage()); @@ -152,21 +152,33 @@ function _dkan_dataset_rest_api_resource_update($nid, $request) { * Currently we are only checking for required fields, and that the * values in an options/select list field are valid. */ -function _dkan_dataset_rest_api_field_validation($node) { +function _dkan_dataset_rest_api_validate_fields($node) { $instances = field_info_instances('node', $node->type); foreach ($instances as $field_name => $info) { - if ($info['required'] == 1 && empty($node->{$field_name})) { - throw new Exception("Field {$field_name} is required"); + $handlers = array('dkan_dataset_rest_api_validate_field'); + drupal_alter('dkan_dataset_rest_api_field_validate', $handlers); + foreach($handlers as $function) { + $function($node, $field_name, $info); } - if (!empty($node->{$field_name})) { - $options = _dkan_dataset_rest_api_field_validation_get_options($node, $field_name, $info); + } +} - // Check that the values match the options. - if (!empty($options) && is_array($options)) { - _dkan_dataset_rest_api_field_validation_check_field_values_against_options($field_name, $node->{$field_name}, $options); - } +/** + * Default validation handler for Dataset REST API + */ + +function dkan_dataset_rest_api_validate_field(&$node, $field_name, $info) { + if ($info['required'] == 1 && empty($node->{$field_name})) { + throw new Exception("Field {$field_name} is required"); + } + if (!empty($node->{$field_name})) { + $options = _dkan_dataset_rest_api_field_validation_get_options($node, $field_name, $info); + + // Check that the values match the options. + if (!empty($options) && is_array($options)) { + _dkan_dataset_rest_api_field_validation_check_field_values_against_options($field_name, $node->{$field_name}, $options); } } } diff --git a/modules/dkan/dkan_dataset/tests/dkan_dataset_test.info b/modules/dkan/dkan_dataset/tests/dkan_dataset_test.info new file mode 100644 index 0000000000..f990abf478 --- /dev/null +++ b/modules/dkan/dkan_dataset/tests/dkan_dataset_test.info @@ -0,0 +1,6 @@ +name = DKAN Dataset test module +description = Functionality to assist DKAN Dataset testing. +core = 7.x +dependencies[] = dkan_dataset +dependencies[] = dkan_dataset_rest_api +hidden = TRUE diff --git a/modules/dkan/dkan_dataset/tests/dkan_dataset_test.module b/modules/dkan/dkan_dataset/tests/dkan_dataset_test.module new file mode 100644 index 0000000000..9fa139d67e --- /dev/null +++ b/modules/dkan/dkan_dataset/tests/dkan_dataset_test.module @@ -0,0 +1,16 @@ +body['und'][0]['value'] == "PHPUNIT Test Dataset Custom Validation") { + throw new Exception("Test validation rejection"); + } + } diff --git a/test/phpunit/dkan_dataset/ApiTest.php b/test/phpunit/dkan_dataset/ApiTest.php index ae374083d0..d1deb0b347 100644 --- a/test/phpunit/dkan_dataset/ApiTest.php +++ b/test/phpunit/dkan_dataset/ApiTest.php @@ -24,6 +24,14 @@ public function __construct($name = NULL, array $data = [], $dataName = '') { $this->client->login('admin', 'admin'); } + /** + * {@inheritdoc} + */ + public static function setUpBeforeClass() { + // We need this module for the testResourceRedirect test. + module_enable(array('dkan_dataset_test')); + } + /** * Test required fields. */ @@ -55,4 +63,28 @@ public function testOptions() { } } + /** + * Test options. + */ + public function testCustomValidation() { + try { + $this->client->nodeCreate((object) [ + 'title' => 'PHPUNIT Custom Validation', + 'body' => ['und' => [0 => ['value => "PHPUNIT Test Dataset Custom Validation"']]], + 'type' => 'dataset', + ]); + } + catch (\Exception $e) { + $message = $e->getMessage(); + $this->assertContains("Test validation rejection", $message); + } + } + + /** + * {@inheritdoc} + */ + public static function tearDownAfterClass() { + // Clean enabled modules. + module_disable(array('dkan_dataset_test')); + } }