diff options
-rw-r--r-- | classes/task/notify.php | 90 | ||||
-rw-r--r-- | classes/task/process_events_task.php | 68 | ||||
-rw-r--r-- | tests/task_test.php | 111 |
3 files changed, 201 insertions, 68 deletions
diff --git a/classes/task/notify.php b/classes/task/notify.php new file mode 100644 index 0000000..faa68a9 --- /dev/null +++ b/classes/task/notify.php @@ -0,0 +1,90 @@ +<?php +// This file is part of Moodle - http://moodle.org/ +// +// Moodle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Moodle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Moodle. If not, see <http://www.gnu.org/licenses/>. + +namespace local_webhooks\task; + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + +require_once($CFG->dirroot . '/local/webhooks/classes/local/api.php'); + +use core\task\adhoc_task; +use curl; +use local_webhooks\local\api; +use local_webhooks\local\record; +use function defined; +use function is_object; +use function is_string; + +/** + * Class for processing events. + * + * @package local_webhooks\task + */ +final class notify extends adhoc_task { + /** + * Debug information. + * + * @var array + */ + public $debug; + + /** + * Process an event. + * + * @throws \dml_exception + */ + public function execute() { + $event = $this->get_custom_data(); + + if (!is_object($event) || !isset($event->eventname) || !is_string($event->eventname)) { + return; + } + + foreach (api::get_services_by_event($event->eventname) as $service) { + if (!is_object($service)) { + continue; + } + + if (!$service->status) { + continue; + } + + $this->post($service, array_merge((array) $event, [ + 'token' => $service->token, + ])); + } + } + + /** + * Send a request for the service. + * + * @param \local_webhooks\local\record $service + * @param array $data + */ + public function post(record $service, array $data) { + $curl = new curl(); + $curl->setHeader(['Content-Type: ' . $service->header]); + $curl->post($service->point, $data); + + if (defined('PHPUNIT_TEST') && PHPUNIT_TEST) { + $this->debug = array_merge($this->debug ?? [], [ + compact('data', 'service'), + ]); + } + } +}
\ No newline at end of file diff --git a/classes/task/process_events_task.php b/classes/task/process_events_task.php deleted file mode 100644 index 46f5ea5..0000000 --- a/classes/task/process_events_task.php +++ /dev/null @@ -1,68 +0,0 @@ -<?php -// This file is part of Moodle - http://moodle.org/ -// -// Moodle is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Moodle is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Moodle. If not, see <http://www.gnu.org/licenses/>. - -/** - * Defining task handlers. - * - * @copyright 2018 'Valentin Popov' <info@valentineus.link> - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - * @package local_webhooks - */ - -namespace local_webhooks\task; - -defined('MOODLE_INTERNAL') || die(); - -global $CFG; - -require_once($CFG->dirroot . '/local/webhooks/lib.php'); - -/** - * Class process_events_task - * - * @copyright 2018 'Valentin Popov' <info@valentineus.link> - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - * @package local_webhooks\task - */ -class process_events_task extends \core\task\adhoc_task { - /** - * Task handler. - * - * @throws \dml_exception - * @throws \moodle_exception - */ - public function execute() { - $services = \local_webhooks_api::get_services_by_event($this->get_custom_data()->eventname); - - foreach ($services as $service) { - if ((bool) $service->status !== true) { - return; - } - - $curl = new \curl(); - - $event = (array) $this->get_custom_data(); - $event['token'] = $service->token; - - $curl->setHeader(array('Content-Type: ' . $service->header)); - $curl->post($service->point, json_encode($event)); - - // TODO: Mark the log. - - $curl->getResponse(); - } - } -}
\ No newline at end of file diff --git a/tests/task_test.php b/tests/task_test.php new file mode 100644 index 0000000..dc9d42f --- /dev/null +++ b/tests/task_test.php @@ -0,0 +1,111 @@ +<?php +// This file is part of Moodle - http://moodle.org/ +// +// Moodle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Moodle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Moodle. If not, see <http://www.gnu.org/licenses/>. + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + +require_once($CFG->dirroot . '/local/webhooks/classes/local/api.php'); + +use core\task\manager; +use local_webhooks\local\api; +use local_webhooks\local\record; +use local_webhooks\task\notify; + +/** + * Class local_webhooks_task_testcase. + * + * @copyright 2019 'Valentin Popov' <info@valentineus.link> + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +final class local_webhooks_task_testcase extends advanced_testcase { + /** + * Testing add a task to the queue. + */ + public function test_add_task() { + $this->resetAfterTest(); + + manager::queue_adhoc_task(new notify()); + + $tasks = manager::get_adhoc_tasks('\local_webhooks\task\notify'); + + self::assertCount(1, $tasks); + self::assertInstanceOf('\local_webhooks\task\notify', array_shift($tasks)); + } + + /** + * Testing disabled processing service. + * + * @throws \coding_exception + * @throws \dml_exception + */ + public function test_execute_disabled() { + curl::mock_response('{}'); + $this->resetAfterTest(); + + $record = new record(); + $record->events = ['\core\event\course_viewed']; + $record->header = 'application/json'; + $record->name = 'Example name'; + $record->point = 'http://example.org/'; + $record->status = false; + $record->token = '967b2286-0874-4938-b088-efdbcf8a79bc'; + + $record->id = api::create_service($record); + + $task = new notify(); + $task->set_custom_data(['eventname' => '\core\event\course_viewed']); + $task->execute(); + + self::assertNull($task->debug); + } + + /** + * Testing enabled processing service. + * + * @throws \coding_exception + * @throws \dml_exception + */ + public function test_execute_enabled() { + curl::mock_response('{}'); + $this->resetAfterTest(); + + $record = new record(); + $record->events = ['\core\event\course_viewed']; + $record->header = 'application/json'; + $record->name = 'Example name'; + $record->point = 'http://example.org/'; + $record->status = true; + $record->token = '967b2286-0874-4938-b088-efdbcf8a79bc'; + + $record->id = api::create_service($record); + + $task = new notify(); + $task->set_custom_data(['eventname' => '\core\event\course_viewed']); + $task->execute(); + + self::assertCount(1, $task->debug); + self::assertInternalType('array', $task->debug); + + $element = array_shift($task->debug); + self::assertInternalType('array', $element['data']); + self::assertInternalType('object', $element['service']); + + self::assertEquals($record->events[0], $element['data']['eventname']); + self::assertEquals($record->id, $element['service']->id); + self::assertEquals($record->token, $element['data']['token']); + } +}
\ No newline at end of file |