From 6b18cffc970a69a292c2d9836ff5b460a5d1005a Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Fri, 10 May 2019 23:45:18 +0400 Subject: Added external function get the list services Signed-off-by: Valentin Popov --- externallib.php | 91 ++++++++++++++++++++++++++++++++++++---- tests/api_test.php | 5 ++- tests/external_test.php | 107 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 193 insertions(+), 10 deletions(-) diff --git a/externallib.php b/externallib.php index 1f1dfeb..4db6a74 100644 --- a/externallib.php +++ b/externallib.php @@ -22,6 +22,7 @@ require_once($CFG->dirroot . '/local/webhooks/classes/local/api.php'); require_once($CFG->libdir . '/externallib.php'); use local_webhooks\local\api; +use local_webhooks\local\record; /** * WebHooks external functions. @@ -31,7 +32,7 @@ use local_webhooks\local\api; */ final class local_webhooks_external extends external_api { /** - * Testing get to a service. + * Get data by service. * * @param int $serviceid Service's ID. * @@ -41,7 +42,7 @@ final class local_webhooks_external extends external_api { * @throws \invalid_parameter_exception * @throws \restricted_context_exception */ - public static function get_service(int $serviceid) { + public static function get_service(int $serviceid): record { $parameters = self::validate_parameters(self::get_service_parameters(), ['serviceid' => $serviceid]); $context = context_system::instance(); @@ -55,10 +56,10 @@ final class local_webhooks_external extends external_api { * * @return \external_function_parameters */ - public static function get_service_parameters() { + public static function get_service_parameters(): external_function_parameters { return new external_function_parameters([ 'serviceid' => new external_value(PARAM_INT, 'The service\'s ID.'), - ]); + ], ''); } /** @@ -66,17 +67,91 @@ final class local_webhooks_external extends external_api { * * @return \external_single_structure */ - public static function get_service_returns() { + public static function get_service_returns(): external_single_structure { return new external_single_structure([ + 'events' => new external_multiple_structure( + new external_value(PARAM_RAW, 'The event\'s name.'), 'The service\'s list events.' + ), 'header' => new external_value(PARAM_RAW, 'The request\'s header or type'), 'id' => new external_value(PARAM_INT, 'The service\'s ID.'), 'name' => new external_value(PARAM_RAW, 'The service\'s name.'), 'point' => new external_value(PARAM_URL, 'The service\'s endpoint.'), 'status' => new external_value(PARAM_BOOL, 'The service\'s status.'), 'token' => new external_value(PARAM_RAW, 'The service\'s secret key.'), - 'events' => new external_multiple_structure( - new external_value(PARAM_RAW, 'The event\'s name.'), 'The service\'s list events.' - ), + ], ''); + } + + /** + * Get the service's list. + * + * @param array|null $conditions + * @param string|null $sort + * @param int|null $from + * @param int|null $limit + * + * @return array + * + * @throws \dml_exception + * @throws \invalid_parameter_exception + * @throws \restricted_context_exception + */ + public static function get_services(array $conditions = null, string $sort = null, int $from = null, int $limit = null): array { + $parameters = self::validate_parameters(self::get_services_parameters(), [ + 'conditions' => $conditions ?? [], + 'from' => $from, + 'limit' => $limit, + 'sort' => $sort, ]); + + $context = context_system::instance(); + self::validate_context($context); + + return api::get_services( + array_filter($parameters['conditions']), + $parameters['sort'], + $parameters['from'], + $parameters['limit'] + ); + } + + /** + * Returns description of method parameters. + * + * @return \external_function_parameters + */ + public static function get_services_parameters(): external_function_parameters { + return new external_function_parameters([ + 'conditions' => new external_single_structure([ + 'header' => new external_value(PARAM_RAW, 'The request\'s header or type', false), + 'name' => new external_value(PARAM_RAW, 'The service\'s name.', false), + 'point' => new external_value(PARAM_URL, 'The service\'s endpoint.', false), + 'status' => new external_value(PARAM_BOOL, 'The service\'s status.', false), + 'token' => new external_value(PARAM_RAW, 'The service\'s secret key.', false), + ], '', false), + 'sort' => new external_value(PARAM_RAW, '', false), + 'from' => new external_value(PARAM_INT, '', false), + 'limit' => new external_value(PARAM_INT, '', false), + ], ''); + } + + /** + * Returns description of method parameters. + * + * @return \external_multiple_structure + */ + public static function get_services_returns(): external_multiple_structure { + return new external_multiple_structure( + new external_single_structure([ + 'events' => new external_multiple_structure( + new external_value(PARAM_RAW, 'The event\'s name.'), 'The service\'s list events.' + ), + 'header' => new external_value(PARAM_RAW, 'The request\'s header or type'), + 'id' => new external_value(PARAM_INT, 'The service\'s ID.'), + 'name' => new external_value(PARAM_RAW, 'The service\'s name.'), + 'point' => new external_value(PARAM_URL, 'The service\'s endpoint.'), + 'status' => new external_value(PARAM_BOOL, 'The service\'s status.'), + 'token' => new external_value(PARAM_RAW, 'The service\'s secret key.'), + ], '') + ); } } \ No newline at end of file diff --git a/tests/api_test.php b/tests/api_test.php index 5f7b8e2..c2a2f80 100644 --- a/tests/api_test.php +++ b/tests/api_test.php @@ -276,9 +276,11 @@ final class local_webhooks_api_testcase extends advanced_testcase { public function test_get_services_with_conditions() { $this->resetAfterTest(); + $records = []; $total = random_int(5, 20); + $limit = intdiv($total, 2); - $records = []; + // Creating some records. for ($i = 0; $i < $total; $i++) { $record = self::get_random_record(); $record->id = api::add_service($record); @@ -292,7 +294,6 @@ final class local_webhooks_api_testcase extends advanced_testcase { ])); // Testing limit fields. - $limit = intdiv($total, 2); self::assertCount($limit, api::get_services([], null, 1, $limit)); // Testing sort fields. diff --git a/tests/external_test.php b/tests/external_test.php index 5f646a9..ea2b362 100644 --- a/tests/external_test.php +++ b/tests/external_test.php @@ -102,4 +102,111 @@ final class local_webhooks_external_testcase extends externallib_advanced_testca self::assertContains($event, $record->events); } } + + /** + * Testing external get the record's list. + * + * @throws \ReflectionException + * @throws \coding_exception + * @throws \dml_exception + * @throws \invalid_parameter_exception + * @throws \invalid_response_exception + * @throws \restricted_context_exception + */ + public function test_get_services() { + self::setAdminUser(); + + $this->resetAfterTest(); + + $records = []; + $total = random_int(5, 10); + + // Creating some records. + for ($i = 0; $i < $total; $i++) { + $record = self::get_random_record(); + $record->id = api::add_service($record); + $records[$record->id] = $record; + } + + self::assertEquals(count($records), api::get_total_count()); + + $return = local_webhooks_external::get_services(); + $return = external_api::clean_returnvalue(local_webhooks_external::get_services_returns(), $return); + + // Testing received item's list. + self::assertInternalType('array', $return); + self::assertCount(count($records), $return); + + foreach ($return as $item) { + self::assertInternalType('array', $item); + + $record = $records[$item['id']]; + + self::assertEquals($record->header, $item['header']); + self::assertEquals($record->id, $item['id']); + self::assertEquals($record->name, $item['name']); + self::assertEquals($record->point, $item['point']); + self::assertEquals($record->status, (int) $item['status']); + self::assertEquals($record->token, $item['token']); + + self::assertInternalType('array', $item['events']); + self::assertNotCount(0, $item['events']); + foreach ($item['events'] as $event) { + self::assertContains($event, $record->events); + } + } + } + + /** + * Testing external get to the list services with conditions. + * + * @throws \ReflectionException + * @throws \coding_exception + * @throws \dml_exception + * @throws \invalid_parameter_exception + * @throws \invalid_response_exception + * @throws \restricted_context_exception + */ + public function test_get_services_with_conditions() { + self::setAdminUser(); + + $this->resetAfterTest(); + + $records = []; + $total = random_int(5, 10); + $limit = intdiv($total, 2); + + // Creating some records. + for ($i = 0; $i < $total; $i++) { + $record = self::get_random_record(); + $record->id = api::add_service($record); + $records[$record->id] = $record; + } + + self::assertEquals(count($records), api::get_total_count()); + + // Testing condition fields. + $record = $records[array_rand($records, 1)]; + $return = local_webhooks_external::get_services(['point' => $record->point]); + $return = external_api::clean_returnvalue(local_webhooks_external::get_services_returns(), $return); + + self::assertCount(1, $return); + self::assertEquals($return[0]['id'], $record->id); + + // Testing limit fields. + $return = local_webhooks_external::get_services(null, null, 1, $limit); + $return = external_api::clean_returnvalue(local_webhooks_external::get_services_returns(), $return); + self::assertCount($limit, $return); + + // Testing sort fields. + $return = local_webhooks_external::get_services(null, 'id asc'); + $return = external_api::clean_returnvalue(local_webhooks_external::get_services_returns(), $return); + $service1 = array_shift($return); + + $return = local_webhooks_external::get_services(null, 'id desc'); + $return = external_api::clean_returnvalue(local_webhooks_external::get_services_returns(), $return); + $service2 = array_shift($return); + + self::assertNotEquals($service1['id'], $service2['id']); + } } \ No newline at end of file -- cgit v1.2.3