AutorÃa | Ultima modificación | Ver Log |
<?php// This file is part of Moodle - http://moodle.org///// This program 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.//// This program 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/>.declare(strict_types=1);// Namespace does not match PSR. But Moodle likes it this way.namespace mod_edusharing;use core\moodle_database_for_testing;use dml_exception;use EduSharingApiClient\CurlHandler as EdusharingCurlHandler;use EduSharingApiClient\CurlResult;use EduSharingApiClient\EduSharingAuthHelper;use EduSharingApiClient\EduSharingHelperBase;use EduSharingApiClient\EduSharingNodeHelper;use EduSharingApiClient\EduSharingNodeHelperConfig;use EduSharingApiClient\NodeDeletedException;use EduSharingApiClient\UrlHandling;use EduSharingApiClient\Usage;use EduSharingApiClient\UsageDeletedException;use Exception;use JsonException;use stdClass;use testUtils\FakeConfig;/*** Class EdusharingServiceTest** @author Marian Ziegler <ziegler@edu-sharing.net>* @package mod_edusharing* @covers \mod_edusharing\EduSharingService*/class edusharing_service_test extends \advanced_testcase {/*** Function test_if_get_ticket_returns_existing_ticket_if_cached_ticket_is_new** @return void** @throws Exception*/public function test_if_get_ticket_returns_existing_ticket_if_cached_ticket_is_new(): void {$this->resetAfterTest();global $USER, $CFG;require_once($CFG->dirroot . '/mod/edusharing/tests/testUtils/FakeConfig.php');$fakeconfig = new FakeConfig();$fakeconfig->set_entries(['application_cc_gui_url' => 'www.url.de','application_private_key' => 'pkey123','application_appid' => 'appid123',]);$utils = new UtilityFunctions($fakeconfig);$service = new EduSharingService(utils: $utils);$USER->edusharing_userticket = 'testTicket';$USER->edusharing_userticketvalidationts = time();$this->assertEquals('testTicket', $service->get_ticket());}/*** Function test_if_get_ticket_returns_existing_ticket_if_auth_info_is_ok** @return void** @throws dml_exception* @throws Exception*/public function test_if_get_ticket_returns_existing_ticket_if_auth_info_is_ok(): void {$this->resetAfterTest();global $USER;unset($USER->edusharing_userticketvalidationts);$USER->edusharing_userticket = 'testTicket';$basehelper = new EduSharingHelperBase('www.url.de', 'pkey123', 'appid123');$authmock = $this->getMockBuilder(EduSharingAuthHelper::class)->setConstructorArgs([$basehelper])->onlyMethods(['getTicketAuthenticationInfo'])->getMock();$authmock->expects($this->once())->method('getTicketAuthenticationInfo')->will($this->returnValue(['statusCode' => 'OK']));$nodeconfig = new EduSharingNodeHelperConfig(new UrlHandling(true));$nodehandler = new EduSharingNodeHelper($basehelper, $nodeconfig);$service = new EduSharingService($authmock, $nodehandler);$this->assertEquals('testTicket', $service->get_ticket());$this->assertTrue(time() - $USER->edusharing_userticketvalidationts < 10);}/*** Function test_if_getT_ticket_returns_ticket_from_auth_helper_if_no_cached_ticket_exists** @return void* @throws dml_exception*/public function test_if_get_ticket_returns_ticket_from_auth_helper_if_no_cached_ticket_exists(): void {$this->resetAfterTest();global $USER;unset($USER->edusharing_userticket);$USER->firstname = 'Max';$USER->lastname = 'Mustermann';$USER->email = 'max@mustermann.de';$basehelper = new EduSharingHelperBase('www.url.de', 'pkey123', 'appid123');$authmock = $this->getMockBuilder(EduSharingAuthHelper::class)->setConstructorArgs([$basehelper])->onlyMethods(['getTicketForUser', 'getTicketAuthenticationInfo'])->getMock();$authmock->expects($this->once())->method('getTicketForUser')->will($this->returnValue('ticketForUser'));$utilsmock = $this->getMockBuilder(UtilityFunctions::class)->onlyMethods(['get_auth_key'])->getMock();$utilsmock->expects($this->once())->method('get_auth_key')->will($this->returnValue('neverMind'));$nodeconfig = new EduSharingNodeHelperConfig(new UrlHandling(true));$nodehandler = new EduSharingNodeHelper($basehelper, $nodeconfig);$service = new EduSharingService($authmock, $nodehandler, $utilsmock);$this->assertEquals('ticketForUser', $service->get_ticket());$USER->edusharing_userticket = 'testTicket';}/*** Function test_if_get_ticket_returns_ticket_from_auth_helper_if_ticket_is_too_old_and_auth_info_call_fails** @return void* @throws dml_exception*/public function test_if_get_ticket_returns_ticket_from_auth_helper_if_ticket_is_too_old_and_auth_info_call_fails(): void {$this->resetAfterTest();global $USER;$USER->edusharing_userticket = 'testTicket';$USER->edusharing_userticketvalidationts = 1689769393;$USER->firstname = 'Max';$USER->lastname = 'Mustermann';$USER->email = 'max@mustermann.de';$basehelper = new EduSharingHelperBase('www.url.de', 'pkey123', 'appid123');$authmock = $this->getMockBuilder(EduSharingAuthHelper::class)->setConstructorArgs([$basehelper])->onlyMethods(['getTicketForUser', 'getTicketAuthenticationInfo'])->getMock();$authmock->expects($this->once())->method('getTicketForUser')->will($this->returnValue('ticketForUser'));$authmock->expects($this->once())->method('getTicketAuthenticationInfo')->will($this->returnValue(['statusCode' => 'NOT_OK']));$utilsmock = $this->getMockBuilder(UtilityFunctions::class)->onlyMethods(['get_auth_key'])->getMock();$utilsmock->expects($this->once())->method('get_auth_key')->will($this->returnValue('neverMind'));$nodeconfig = new EduSharingNodeHelperConfig(new UrlHandling(true));$nodehandler = new EduSharingNodeHelper($basehelper, $nodeconfig);$service = new EduSharingService($authmock, $nodehandler, $utilsmock);$this->assertEquals('ticketForUser', $service->get_ticket());$USER->edusharing_userticket = 'testTicket';}/*** Function test_if_create_usage_calls_node_helper_method_with_correct_params*/public function test_if_create_usage_calls_node_helper_method_with_correct_params(): void {$usageobject = new stdClass();$usageobject->containerId = 'containerIdTest';$usageobject->resourceId = 'resourceIdTest';$usageobject->nodeId = 'nodeIdTest';$usageobject->nodeVersion = 'nodeVersion';$basehelper = new EduSharingHelperBase('www.url.de', 'pkey123', 'appid123');$nodeconfig = new EduSharingNodeHelperConfig(new UrlHandling(true));$authhelper = new EduSharingAuthHelper($basehelper);$nodehelpermock = $this->getMockBuilder(EduSharingNodeHelper::class)->onlyMethods(['createUsage'])->setConstructorArgs([$basehelper, $nodeconfig])->getMock();$nodehelpermock->expects($this->once())->method('createUsage')->with('ticketTest', 'containerIdTest', 'resourceIdTest', 'nodeIdTest', 'nodeVersion');$servicemock = $this->getMockBuilder(EduSharingService::class)->onlyMethods(['get_ticket'])->setConstructorArgs([$authhelper, $nodehelpermock])->getMock();$servicemock->expects($this->once())->method('get_ticket')->will($this->returnValue('ticketTest'));$servicemock->create_usage($usageobject);}/*** Function test_if_get_usage_id_calls_node_helper_method_with_correct_params_and_returns_result** @return void* @throws dml_exception*/public function test_if_get_usage_id_calls_node_helper_method_with_correct_params_and_returns_result(): void {$usageobject = new stdClass();$usageobject->containerId = 'containerIdTest';$usageobject->resourceId = 'resourceIdTest';$usageobject->nodeId = 'nodeIdTest';$usageobject->ticket = 'ticketTest';$basehelper = new EduSharingHelperBase('www.url.de', 'pkey123', 'appid123');$nodeconfig = new EduSharingNodeHelperConfig(new UrlHandling(true));$authhelper = new EduSharingAuthHelper($basehelper);$nodehelpermock = $this->getMockBuilder(EduSharingNodeHelper::class)->onlyMethods(['getUsageIdByParameters'])->setConstructorArgs([$basehelper, $nodeconfig])->getMock();$nodehelpermock->expects($this->once())->method('getUsageIdByParameters')->with('ticketTest', 'nodeIdTest', 'containerIdTest', 'resourceIdTest')->will($this->returnValue('expectedId'));$service = new EduSharingService($authhelper, $nodehelpermock);$id = $service->get_usage_id($usageobject);$this->assertEquals('expectedId', $id);}/*** Function test_if_get_usage_id_throws_exception_if_node_helper_method_returns_null** @return void* @throws dml_exception*/public function test_if_get_usage_id_throws_exception_if_node_helper_method_returns_null(): void {$usageobject = new stdClass();$usageobject->containerId = 'containerIdTest';$usageobject->resourceId = 'resourceIdTest';$usageobject->nodeId = 'nodeIdTest';$usageobject->ticket = 'ticketTest';$basehelper = new EduSharingHelperBase('www.url.de', 'pkey123', 'appid123');$nodeconfig = new EduSharingNodeHelperConfig(new UrlHandling(true));$authhelper = new EduSharingAuthHelper($basehelper);$nodehelpermock = $this->getMockBuilder(EduSharingNodeHelper::class)->onlyMethods(['getUsageIdByParameters'])->setConstructorArgs([$basehelper, $nodeconfig])->getMock();$nodehelpermock->expects($this->once())->method('getUsageIdByParameters')->with('ticketTest', 'nodeIdTest', 'containerIdTest', 'resourceIdTest')->will($this->returnValue(null));$service = new EduSharingService($authhelper, $nodehelpermock);$this->expectException(Exception::class);$this->expectExceptionMessage('No usage found');$service->get_usage_id($usageobject);}/*** Function test_if_delete_usage_calls_node_helper_method_with_proper_params** @return void* @throws dml_exception*/public function test_if_delete_usage_calls_node_helper_method_with_proper_params(): void {$usageobject = new stdClass();$usageobject->nodeId = 'nodeIdTest';$usageobject->usageId = 'usageIdTest';$basehelper = new EduSharingHelperBase('www.url.de', 'pkey123', 'appid123');$nodeconfig = new EduSharingNodeHelperConfig(new UrlHandling(true));$authhelper = new EduSharingAuthHelper($basehelper);$nodehelpermock = $this->getMockBuilder(EduSharingNodeHelper::class)->onlyMethods(['deleteUsage'])->setConstructorArgs([$basehelper, $nodeconfig])->getMock();$nodehelpermock->expects($this->once())->method('deleteUsage')->with('nodeIdTest', 'usageIdTest');$service = new EduSharingService($authhelper, $nodehelpermock);$service->delete_usage($usageobject);}/*** Function test_if_get_node_calls_node_helper_method_with_proper_params** @return void* @throws JsonException* @throws NodeDeletedException* @throws UsageDeletedException* @throws dml_exception*/public function test_if_get_node_calls_node_helper_method_with_proper_params(): void {$usage = new Usage('nodeIdTest', 'nodeVersionTest','containerIdTest', 'resourceIdTest', 'usageIdTest');$basehelper = new EduSharingHelperBase('www.url.de', 'pkey123', 'appid123');$nodeconfig = new EduSharingNodeHelperConfig(new UrlHandling(true));$authhelper = new EduSharingAuthHelper($basehelper);$nodehelpermock = $this->getMockBuilder(EduSharingNodeHelper::class)->onlyMethods(['getNodeByUsage'])->setConstructorArgs([$basehelper, $nodeconfig])->getMock();$nodehelpermock->expects($this->once())->method('getNodeByUsage')->with($usage);$service = new EduSharingService($authhelper, $nodehelpermock);$service->get_node($usage);}/*** test_if_update_instance_calls_db_methods_and_calls_creation_method_with_proper_params** @return void*/public function test_if_update_instance_calls_db_methods_and_calls_creation_method_with_proper_params(): void {$this->resetAfterTest();require_once('lib/dml/tests/dml_test.php');$currenttime = time();$eduobject = new stdClass();$eduobject->object_url = 'inputUrl';$eduobject->course = 'containerIdTest';$eduobject->object_version = 'nodeVersionTest';$eduobject->id = 'resourceIdTest';$eduobjectupdate = clone($eduobject);$eduobjectupdate->usage_id = '2';$eduobjectupdate->timecreated = $currenttime;$eduobjectupdate->timeupdated = $currenttime;$eduobjectupdate->options = '';$eduobjectupdate->popup_window = '';$eduobjectupdate->tracking = 0;$usagedata = new stdClass();$usagedata->containerId = 'containerIdTest';$usagedata->resourceId = 'resourceIdTest';$usagedata->nodeId = 'outputUrl';$usagedata->nodeVersion = 'nodeVersionTest';$usagedata->ticket = 'ticketTest';$memento = new stdClass();$memento->id = 'someId';$basehelper = new EduSharingHelperBase('www.url.de', 'pkey123', 'appid123');$nodeconfig = new EduSharingNodeHelperConfig(new UrlHandling(true));$authhelper = new EduSharingAuthHelper($basehelper);$nodehelper = new EduSharingNodeHelper($basehelper, $nodeconfig);$utilsmock = $this->getMockBuilder(UtilityFunctions::class)->onlyMethods(['get_object_id_from_url'])->getMock();$utilsmock->expects($this->once())->method('get_object_id_from_url')->with('inputUrl')->will($this->returnValue('outputUrl'));$servicemock = $this->getMockBuilder(EduSharingService::class)->onlyMethods(['create_usage', 'get_ticket'])->setConstructorArgs([$authhelper, $nodehelper, $utilsmock])->getMock();$servicemock->expects($this->once())->method('get_ticket')->will($this->returnValue('ticketTest'));$servicemock->expects($this->once())->method('create_usage')->with($usagedata)->will($this->returnValue(new Usage('whatever', 'whatever', 'whatever', 'whatever', '2')));$dbmock = $this->getMockBuilder(moodle_database_for_testing::class)->onlyMethods(['get_record', 'update_record'])->getMock();$dbmock->expects($this->once())->method('get_record')->with('edusharing', ['id' => 'resourceIdTest'], '*', MUST_EXIST)->will($this->returnValue($memento));$dbmock->expects($this->once())->method('update_record')->with('edusharing', $eduobjectupdate);// phpcs:ignore -- GLOBALS is supposed to be all caps.$GLOBALS['DB'] = $dbmock;$this->assertEquals(true, $servicemock->update_instance($eduobject, $currenttime));}/*** Function test_if_update_instance_resets_data_and_returns_false_on_update_error** @return void*/public function test_if_update_instance_resets_data_and_returns_false_on_update_error(): void {$this->resetAfterTest();require_once('lib/dml/tests/dml_test.php');$currenttime = time();$eduobject = new stdClass();$eduobject->object_url = 'inputUrl';$eduobject->course = 'containerIdTest';$eduobject->object_version = 'nodeVersionTest';$eduobject->id = 'resourceIdTest';$eduobjectupdate = clone($eduobject);$eduobjectupdate->usage_id = '2';$eduobjectupdate->timecreated = $currenttime;$eduobjectupdate->timeupdated = $currenttime;$eduobjectupdate->options = '';$eduobjectupdate->popup_window = '';$eduobjectupdate->tracking = 0;$usagedata = new stdClass();$usagedata->containerId = 'containerIdTest';$usagedata->resourceId = 'resourceIdTest';$usagedata->nodeId = 'outputUrl';$usagedata->nodeVersion = 'nodeVersionTest';$usagedata->ticket = 'ticketTest';$memento = new stdClass();$memento->id = 'someId';$basehelper = new EduSharingHelperBase('www.url.de', 'pkey123', 'appid123');$nodeconfig = new EduSharingNodeHelperConfig(new UrlHandling(true));$authhelper = new EduSharingAuthHelper($basehelper);$nodehelper = new EduSharingNodeHelper($basehelper, $nodeconfig);$utilsmock = $this->getMockBuilder(UtilityFunctions::class)->onlyMethods(['get_object_id_from_url'])->getMock();$utilsmock->expects($this->once())->method('get_object_id_from_url')->with('inputUrl')->will($this->returnValue('outputUrl'));$servicemock = $this->getMockBuilder(EduSharingService::class)->onlyMethods(['create_usage', 'get_ticket'])->setConstructorArgs([$authhelper, $nodehelper, $utilsmock])->getMock();$servicemock->expects($this->once())->method('get_ticket')->will($this->returnValue('ticketTest'));$servicemock->expects($this->once())->method('create_usage')->with($usagedata)->willThrowException(new Exception(''));$dbmock = $this->getMockBuilder(moodle_database_for_testing::class)->onlyMethods(['get_record', 'update_record'])->getMock();$dbmock->expects($this->once())->method('get_record')->with('edusharing', ['id' => 'resourceIdTest'], '*', MUST_EXIST)->will($this->returnValue($memento));$dbmock->expects($this->once())->method('update_record')->with('edusharing', $memento);// phpcs:ignore -- GLOBALS is supposed to be all caps.$GLOBALS['DB'] = $dbmock;$this->assertEquals(false, $servicemock->update_instance($eduobject, $currenttime));}/*** Function test_if_add_instance_calls_db_functions_and_service_method_with_correct_parameters** @return void*/public function test_if_add_instance_calls_db_functions_and_service_method_with_correct_parameters(): void {$this->resetAfterTest();require_once('lib/dml/tests/dml_test.php');$currenttime = time();$eduobject = new stdClass();$eduobject->object_url = 'inputUrl';$eduobject->course = 'containerIdTest';$eduobject->object_version = '1.0';$eduobject->id = 'resourceIdTest';$processededuobject = clone($eduobject);$processededuobject->object_version = '1.0';$processededuobject->timecreated = $currenttime;$processededuobject->timemodified = $currenttime;$processededuobject->timeupdated = $currenttime;$processededuobject->options = '';$processededuobject->popup_window = '';$processededuobject->tracking = 0;$insertededuobject = clone($processededuobject);$insertededuobject->id = 3;$insertededuobject->usage_id = 4;$insertededuobject->object_version = '1.0';$usagedata = new stdClass();$usagedata->containerId = 'containerIdTest';$usagedata->resourceId = 3;$usagedata->nodeId = 'outputUrl';$usagedata->nodeVersion = '1.0';$dbmock = $this->getMockBuilder(moodle_database_for_testing::class)->onlyMethods(['insert_record', 'update_record', 'delete_records'])->getMock();$dbmock->expects($this->once())->method('insert_record')->with('edusharing', $processededuobject)->will($this->returnValue(3));$dbmock->expects($this->once())->method('update_record')->with('edusharing', $insertededuobject);// phpcs:ignore -- GLOBALS is supposed to be all caps.$GLOBALS['DB'] = $dbmock;$utilsmock = $this->getMockBuilder(UtilityFunctions::class)->onlyMethods(['get_object_id_from_url'])->getMock();$utilsmock->expects($this->once())->method('get_object_id_from_url')->with('inputUrl')->will($this->returnValue('outputUrl'));$basehelper = new EduSharingHelperBase('www.url.de', 'pkey123', 'appid123');$nodeconfig = new EduSharingNodeHelperConfig(new UrlHandling(true));$authhelper = new EduSharingAuthHelper($basehelper);$nodehelper = new EduSharingNodeHelper($basehelper, $nodeconfig);$servicemock = $this->getMockBuilder(EduSharingService::class)->onlyMethods(['create_usage', 'get_ticket'])->setConstructorArgs([$authhelper, $nodehelper, $utilsmock])->getMock();$servicemock->expects($this->once())->method('create_usage')->with($usagedata)->will($this->returnValue(new Usage('whatever', 'nodeVersionTest', 'whatever', 'whatever', '4')));$this->assertEquals(3, $servicemock->add_instance($eduobject));}/*** Function test_if_add_instance_returns_false_and_resets_data_on_creation_failure** @return void*/public function test_if_add_instance_returns_false_and_resets_data_on_creation_failure(): void {$this->resetAfterTest();require_once('lib/dml/tests/dml_test.php');$currenttime = time();$eduobject = new stdClass();$eduobject->object_url = 'inputUrl';$eduobject->course = 'containerIdTest';$eduobject->object_version = '1';$eduobject->id = 'resourceIdTest';$processededuobject = clone($eduobject);$processededuobject->object_version = '1';$processededuobject->timecreated = $currenttime;$processededuobject->timemodified = $currenttime;$processededuobject->timeupdated = $currenttime;$processededuobject->options = '';$processededuobject->popup_window = '';$processededuobject->tracking = 0;$insertededuobject = clone($processededuobject);$insertededuobject->id = 3;$insertededuobject->usage_id = 4;$insertededuobject->object_version = 'nodeVersionTest';$usagedata = new stdClass();$usagedata->containerId = 'containerIdTest';$usagedata->resourceId = 3;$usagedata->nodeId = 'outputUrl';$usagedata->nodeVersion = '1';$dbmock = $this->getMockBuilder(moodle_database_for_testing::class)->onlyMethods(['insert_record', 'update_record', 'delete_records'])->getMock();$dbmock->expects($this->once())->method('insert_record')->with('edusharing', $processededuobject)->will($this->returnValue(3));$dbmock->expects($this->never())->method('update_record');$dbmock->expects($this->once())->method('delete_records')->with('edusharing', ['id' => 3]);// phpcs:ignore -- GLOBALS is supposed to be all caps.$GLOBALS['DB'] = $dbmock;$utilsmock = $this->getMockBuilder(UtilityFunctions::class)->onlyMethods(['get_object_id_from_url'])->getMock();$utilsmock->expects($this->once())->method('get_object_id_from_url')->with('inputUrl')->will($this->returnValue('outputUrl'));$basehelper = new EduSharingHelperBase('www.url.de', 'pkey123', 'appid123');$nodeconfig = new EduSharingNodeHelperConfig(new UrlHandling(true));$authhelper = new EduSharingAuthHelper($basehelper);$nodehelper = new EduSharingNodeHelper($basehelper, $nodeconfig);$servicemock = $this->getMockBuilder(EduSharingService::class)->onlyMethods(['create_usage', 'get_ticket'])->setConstructorArgs([$authhelper, $nodehelper, $utilsmock])->getMock();$servicemock->expects($this->once())->method('create_usage')->with($usagedata)->willThrowException(new Exception(''));$this->assertEquals(false, $servicemock->add_instance($eduobject));}/*** Function test_if_delete_usage_throwsexception_if_provided_object_has_no_usage_id** @return void* @throws dml_exception*/public function test_if_delete_usage_throwsexception_if_provided_object_has_no_usage_id(): void {$usageobject = new stdClass();$usageobject->nodeId = 'nodeIdTest';$basehelper = new EduSharingHelperBase('www.url.de', 'pkey123', 'appid123');$nodeconfig = new EduSharingNodeHelperConfig(new UrlHandling(true));$authhelper = new EduSharingAuthHelper($basehelper);$nodehelpermock = $this->getMockBuilder(EduSharingNodeHelper::class)->onlyMethods(['deleteUsage'])->setConstructorArgs([$basehelper, $nodeconfig])->getMock();$nodehelpermock->expects($this->never())->method('deleteUsage');$service = new EduSharingService($authhelper, $nodehelpermock);$this->expectException(Exception::class);$this->expectExceptionMessage('No usage id provided, deletion cannot be performed');$service->delete_usage($usageobject);}/*** Function test_if_delete_instance_calls_database_with_proper_params** @return void* @throws dml_exception*/public function test_if_delete_instance_calls_database_with_proper_params(): void {$this->resetAfterTest();require_once('lib/dml/tests/dml_test.php');$dbrecord = new stdClass();$dbrecord->id = 'edusharingId123';$dbrecord->object_url = 'test.de';$dbrecord->course = 'container123';$dbrecord->resourceId = 'resource123';$id = 1;$dbmock = $this->getMockBuilder(moodle_database_for_testing::class)->onlyMethods(['get_record', 'delete_records'])->getMock();$dbmock->expects($this->once())->method('get_record')->with('edusharing', ['id' => $id], '*', MUST_EXIST)->will($this->returnValue($dbrecord));$dbmock->expects($this->once())->method('delete_records')->with('edusharing', ['id' => 'edusharingId123']);// phpcs:ignore -- GLOBALS is supposed to be all caps.$GLOBALS['DB'] = $dbmock;$basehelper = new EduSharingHelperBase('www.url.de', 'pkey123', 'appid123');$authhelper = new EduSharingAuthHelper($basehelper);$nodeconfig = new EduSharingNodeHelperConfig(new UrlHandling(true));$nodehelper = new EduSharingNodeHelper($basehelper, $nodeconfig);$utilsmock = $this->getMockBuilder(UtilityFunctions::class)->onlyMethods(['get_object_id_from_url'])->getMock();$utilsmock->expects($this->once())->method('get_object_id_from_url')->with('test.de')->will($this->returnValue('myNodeId123'));$servicemock = $this->getMockBuilder(EduSharingService::class)->setConstructorArgs([$authhelper, $nodehelper, $utilsmock])->onlyMethods(['get_ticket', 'get_usage_id', 'delete_usage'])->getMock();$servicemock->expects($this->once())->method('get_ticket')->will($this->returnValue('ticket123'));$servicemock->expects($this->once())->method('get_usage_id')->will($this->returnValue('usage123'));$servicemock->delete_instance((string)$id);}/*** Function test_if_import_metadata_calls_curl_with_the_correct_params** @return void* @throws dml_exception*/public function test_if_import_metadata_calls_curl_with_the_correct_params(): void {$this->resetAfterTest();global $_SERVER;$_SERVER['HTTP_USER_AGENT'] = 'testAgent';$url = 'http://test.de';$expectedoptions = [CURLOPT_SSL_VERIFYPEER => false,CURLOPT_SSL_VERIFYHOST => false,CURLOPT_FOLLOWLOCATION => 1,CURLOPT_HEADER => 0,CURLOPT_RETURNTRANSFER => 1,CURLOPT_USERAGENT => 'testAgent',];$curl = new CurlResult('testContent', 0, []);$basemock = $this->getMockBuilder(EduSharingHelperBase::class)->setConstructorArgs(['www.url.de', 'pkey123', 'appid123'])->onlyMethods(['handleCurlRequest'])->getMock();$basemock->expects($this->once())->method('handleCurlRequest')->with($url, $expectedoptions)->will($this->returnValue($curl));$nodeconfig = new EduSharingNodeHelperConfig(new UrlHandling(true));$authhelper = new EduSharingAuthHelper($basemock);$nodehelper = new EduSharingNodeHelper($basemock, $nodeconfig);$service = new EduSharingService($authhelper, $nodehelper);$this->assertEquals($curl, $service->import_metadata($url));}/*** Function test_if_validate_session_calls_curl_with_the_correct_params** @return void* @throws dml_exception*/public function test_if_validate_session_calls_curl_with_the_correct_params(): void {$url = 'http://test.de';$headers = ['Content-Type: application/json','Accept: application/json','Authorization: Basic ' . base64_encode('testAuth'),];$expectedoptions = [CURLOPT_RETURNTRANSFER => 1,CURLOPT_HTTPHEADER => $headers,];$curl = new CurlResult('testContent', 0, []);$basemock = $this->getMockBuilder(EduSharingHelperBase::class)->setConstructorArgs(['www.url.de', 'pkey123', 'appid123'])->onlyMethods(['handleCurlRequest'])->getMock();$basemock->expects($this->once())->method('handleCurlRequest')->with($url . '/rest/authentication/v1/validateSession', $expectedoptions)->will($this->returnValue($curl));$nodeconfig = new EduSharingNodeHelperConfig(new UrlHandling(true));$authhelper = new EduSharingAuthHelper($basemock);$nodehelper = new EduSharingNodeHelper($basemock, $nodeconfig);$service = new EduSharingService($authhelper, $nodehelper);$this->assertEquals($curl, $service->validate_session($url, 'testAuth'));}/*** Function test_if_register_plugin_calls_curl_with_the_correct_options** @return void* @throws dml_exception*/public function test_if_register_plugin_calls_curl_with_the_correct_options(): void {$url = 'http://test.de';$delimiter = 'delimiterTest';$body = 'bodyTest';$auth = 'authTest';$headers = ['Content-Type: multipart/form-data; boundary=' . $delimiter,'Content-Length: ' . strlen($body),'Accept: application/json','Authorization: Basic ' . base64_encode($auth),];$curloptions = [CURLOPT_RETURNTRANSFER => 1,CURLOPT_HTTPHEADER => $headers,CURLOPT_POSTFIELDS => $body,];$curl = new CurlResult('testContent', 0, []);$basehelper = new EduSharingHelperBase('www.url.de', 'pkey123', 'appid123');$curlmock = $this->getMockBuilder(MoodleCurlHandler::class)->onlyMethods(['handleCurlRequest', 'setMethod'])->getMock();$curlmock->expects($this->once())->method('setMethod')->with(EdusharingCurlHandler::METHOD_PUT);$curlmock->expects($this->once())->method('handleCurlRequest')->with($url . '/rest/admin/v1/applications/xml', $curloptions)->will($this->returnValue($curl));$basehelper->registerCurlHandler($curlmock);$nodeconfig = new EduSharingNodeHelperConfig(new UrlHandling(true));$authhelper = new EduSharingAuthHelper($basehelper);$nodehelper = new EduSharingNodeHelper($basehelper, $nodeconfig);$service = new EduSharingService($authhelper, $nodehelper);$this->assertEquals($curl, $service->register_plugin($url, $delimiter, $body, $auth));}/*** Function test_if_sign_calls_base_helper_method_with_correct_params_and_returns_its_returned_value** @return void* @throws dml_exception*/public function test_if_sign_calls_base_helper_method_with_correct_params_and_returns_its_returned_value(): void {$basemock = $this->getMockBuilder(EduSharingHelperBase::class)->setConstructorArgs(['www.url.de', 'pkey123', 'appid123'])->onlyMethods(['sign'])->getMock();$basemock->expects($this->once())->method('sign')->with('testInput')->will($this->returnValue('testOutput'));$nodeconfig = new EduSharingNodeHelperConfig(new UrlHandling(true));$authhelper = new EduSharingAuthHelper($basemock);$nodehelper = new EduSharingNodeHelper($basemock, $nodeconfig);$service = new EduSharingService($authhelper, $nodehelper);$this->assertEquals('testOutput', $service->sign('testInput'));}/*** Function test_get_render_html_calls_curl_handler_with_correct_params_and_returns_content_on_success** @return void* @throws dml_exception*/public function test_get_render_html_calls_curl_handler_with_correct_params_and_returns_content_on_success(): void {$this->resetAfterTest();global $_SERVER;$_SERVER['HTTP_USER_AGENT'] = 'testAgent';$basehelper = new EduSharingHelperBase('www.url.de','pkey123','appid123');$curloptions = [CURLOPT_SSL_VERIFYPEER => false,CURLOPT_SSL_VERIFYHOST => false,CURLOPT_FOLLOWLOCATION => 1,CURLOPT_HEADER => 0,CURLOPT_RETURNTRANSFER => 1,CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'],];$curlmock = $this->getMockBuilder(MoodleCurlHandler::class)->onlyMethods(['handleCurlRequest'])->getMock();$curlmock->expects($this->once())->method('handleCurlRequest')->with('www.testUrl.de', $curloptions)->will($this->returnValue(new CurlResult('expectedContent', 0, [])));$basehelper->registerCurlHandler($curlmock);$nodeconfig = new EduSharingNodeHelperConfig(new UrlHandling(true));$authhelper = new EduSharingAuthHelper($basehelper);$nodehelper = new EduSharingNodeHelper($basehelper, $nodeconfig);$service = new EduSharingService($authhelper, $nodehelper);$this->assertEquals('expectedContent', $service->get_render_html('www.testUrl.de'));}/*** Function test_get_render_html_returns_error_message_if_curl_result_has_error** @return void* @throws dml_exception*/public function test_get_render_html_returns_error_message_if_curl_result_has_error(): void {$this->resetAfterTest();global $_SERVER;$_SERVER['HTTP_USER_AGENT'] = 'testAgent';$basehelper = new EduSharingHelperBase('www.url.de', 'pkey123', 'appid123');$curloptions = [CURLOPT_SSL_VERIFYPEER => false,CURLOPT_SSL_VERIFYHOST => false,CURLOPT_FOLLOWLOCATION => 1,CURLOPT_HEADER => 0,CURLOPT_RETURNTRANSFER => 1,CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'],];$curlmock = $this->getMockBuilder(MoodleCurlHandler::class)->onlyMethods(['handleCurlRequest'])->getMock();$curlmock->expects($this->once())->method('handleCurlRequest')->with('www.testUrl.de', $curloptions)->will($this->returnValue(new CurlResult('expectedContent', 1, ['message' => 'error'])));$basehelper->registerCurlHandler($curlmock);$nodeconfig = new EduSharingNodeHelperConfig(new UrlHandling(true));$authhelper = new EduSharingAuthHelper($basehelper);$nodehelper = new EduSharingNodeHelper($basehelper, $nodeconfig);$service = new EduSharingService($authhelper, $nodehelper);$this->assertEquals('Unexpected Error', $service->get_render_html('www.testUrl.de'));}}