Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
<?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 communication_matrix\local;use GuzzleHttp\Handler\MockHandler;use GuzzleHttp\Psr7\Request;use GuzzleHttp\Psr7\Response;use ReflectionMethod;defined('MOODLE_INTERNAL') || die();require_once(dirname(__DIR__) . '/matrix_client_test_trait.php');/*** Tests for the Matrix command class.** @package communication_matrix* @category test* @copyright 2023 Andrew Lyons <andrew@nicols.co.uk>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later* @covers \communication_matrix\local\command* @coversDefaultClass \communication_matrix\local\command*/class command_test extends \advanced_testcase {use \communication_matrix\matrix_client_test_trait;/*** Test instantiation of a command when no method is provided.*/public function test_standard_instantiation(): void {$instance = $this->get_mocked_instance_for_version('v1.7');$command = new command($instance,method: 'PUT',endpoint: 'example/endpoint',);// Check the standard functionality.$this->assertEquals('/example/endpoint', $command->getUri()->getPath());$this->assertEquals('PUT', $command->getMethod());$this->assertArrayHasKey('Authorization', $command->getHeaders());}/*** Test instantiation of a command when no method is provided.*/public function test_instantiation_without_auth(): void {$instance = $this->get_mocked_instance_for_version('v1.7');$command = new command($instance,method: 'PUT',endpoint: 'example/endpoint',requireauthorization: false,);// Check the standard functionality.$this->assertEquals('/example/endpoint', $command->getUri()->getPath());$this->assertEquals('PUT', $command->getMethod());$this->assertArrayNotHasKey('Authorization', $command->getHeaders());}/*** Test processing of command URL properties.** @dataProvider url_parsing_provider* @param string $url* @param array $params* @param string $expected*/public function test_url_parsing(string $url,array $params,string $expected,): void {$instance = $this->get_mocked_instance_for_version('v1.7');$command = new command($instance,method: 'PUT',endpoint: $url,params: $params,);$this->assertEquals($expected, $command->getUri()->getPath());}/*** Data provider for url parsing tests.** @return array*/public static function url_parsing_provider(): array {return [['example/:id/endpoint',[':id' => '39492'],'/example/39492/endpoint',],['example/:id/endpoint/:id',[':id' => '39492'],'/example/39492/endpoint/39492',],['example/:id/endpoint/:id/:name',[':id' => '39492',':name' => 'matrix',],'/example/39492/endpoint/39492/matrix',],];}/*** Test processing of command URL properties with an array which contains untranslated parameters.*/public function test_url_parsing_extra_properties(): void {$instance = $this->get_mocked_instance_for_version('v1.7');$this->expectException(\OutOfRangeException::class);$this->expectExceptionMessage("URL contains untranslated parameters 'example/:id/endpoint'");new command($instance,method: 'PUT',endpoint: 'example/:id/endpoint',);}/*** Test processing of command URL properties with an array which contains untranslated parameters.*/public function test_url_parsing_unused_properites(): void {$instance = $this->get_mocked_instance_for_version('v1.7');$this->expectException(\OutOfRangeException::class);$this->expectExceptionMessage("Parameter not found in URL ':id'");new command($instance,method: 'PUT',endpoint: 'example/:ids/endpoint',params: [':id' => 12345,],);}/*** Test the parameter fetching, processing, and parsing.** @dataProvider parameter_and_option_provider* @param string $endpoint* @param array $params* @param array $remainingparams* @param array $allparams* @param array $options*/public function test_parameters(string $endpoint,array $params,array $remainingparams,array $allparams,array $options,): void {$instance = $this->get_mocked_instance_for_version('v1.7');$command = new command($instance,method: 'PUT',endpoint: $endpoint,params: $params,);$this->assertSame($remainingparams, $command->get_remaining_params());$this->assertSame($allparams, $command->get_all_params());$this->assertSame($options, $command->get_options());}/*** Data provider for parameter tests.** @return array*/public static function parameter_and_option_provider(): array {$command = ['method' => 'PUT','endpoint' => 'example/:id/endpoint',];return ['no parameters' => ['endpoint' => 'example/endpoint','params' => [],'remainingparams' => [],'allparams' => [],'options' => ['json' => [],],],'named params' => ['endpoint' => 'example/:id/endpoint','params' => [':id' => 12345,],'remainingparams' => [],'allparams' => [':id' => 12345,],'options' => ['json' => [],],],'mixture of params' => ['endpoint' => 'example/:id/endpoint','params' => [':id' => 12345,'name' => 'matrix',],'remainingparams' => ['name' => 'matrix',],'allparams' => [':id' => 12345,'name' => 'matrix',],'options' => ['json' => ['name' => 'matrix',],],],];}/*** Test the query parameter handling.** @dataProvider query_provider* @param array $query* @param string $expected*/public function test_query_parameters(array $query,string $expected,): void {// The query parameter is only added at the time we call send.// That's because it can only be provided to Guzzle as an Option, not as part of the URL.// Options can only be applied at time of transfer.// Unfortuantely that leads to slightly less ideal testing that we'd like here.$mock = new MockHandler();$instance = $this->get_mocked_instance_for_version('v1.7',mock: $mock,);$mock->append(function (Request $request) use ($expected): Response {$this->assertSame($expected,$request->getUri()->getQuery(),);return new Response();});$command = new command($instance,method: 'PUT',endpoint: 'example/endpoint',query: $query,);$execute = new ReflectionMethod($instance, 'execute');$execute->invoke($instance, $command);}/*** Data provider for query parameter tests.* @return array*/public static function query_provider(): array {return ['no query' => ['query' => [],'expected' => '',],'single query' => ['query' => ['name' => 'matrix',],'expected' => 'name=matrix',],'multiple queries' => ['query' => ['name' => 'matrix','type' => 'room',],'expected' => 'name=matrix&type=room',],];}/*** Test the sendasjson constructor parameter.** @dataProvider sendasjson_provider* @param bool $sendasjson* @param string $endpoint* @param array $params* @param array $remainingparams* @param array $allparams* @param array $expectedoptions*/public function test_send_as_json(bool $sendasjson,string $endpoint,array $params,array $remainingparams,array $allparams,array $expectedoptions,): void {$instance = $this->get_mocked_instance_for_version('v1.7');$command = new command($instance,method: 'PUT',endpoint: $endpoint,params: $params,sendasjson: $sendasjson,);$this->assertSame($remainingparams, $command->get_remaining_params());$this->assertSame($allparams, $command->get_all_params());$this->assertSame($expectedoptions, $command->get_options());}/*** Test the sendasjosn option to the command constructor.** @return array*/public static function sendasjson_provider(): array {return ['As JSON' => ['sendasjon' => true,'endpoint' => 'example/:id/endpoint','params' => [':id' => 12345,'name' => 'matrix',],'remainingparams' => ['name' => 'matrix',],'allparams' => [':id' => 12345,'name' => 'matrix',],'expectedoptions' => ['json' => ['name' => 'matrix',],],],'Not as JSON' => ['sendasjson' => false,'endpoint' => 'example/:id/endpoint','params' => [':id' => 12345,'name' => 'matrix',],'remainingparams' => ['name' => 'matrix',],'allparams' => [':id' => 12345,'name' => 'matrix',],'expectedoptions' => [],],];}/*** Test the sendasjosn option to the command constructor.*/public function test_ignorehttperrors(): void {$instance = $this->get_mocked_instance_for_version('v1.7');$command = new command($instance,method: 'PUT',endpoint: 'example/endpoint',ignorehttperrors: true,);$options = $command->get_options();$this->assertArrayHasKey('http_errors', $options);$this->assertFalse($options['http_errors']);}}