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 advanced_testcase;
use cached_cm_info;
use core\moodle_database_for_testing;
use dml_exception;
use Exception;
use stdClass;
use testUtils\FakeConfig;
use testUtils\TestStringGenerator;
/**
* Class UtilityFunctionsTest
*
* @author Marian Ziegler <ziegler@edu-sharing.net>
* @package mod_edusharing
* @covers \mod_edusharing\UtilityFunctions
*/
class utility_functions_test extends advanced_testcase {
/**
* Function test_if_get_object_id_from_url_returns_proper_path_if_url_is_ok
*
* @return void
*/
public function test_if_get_object_id_from_url_returns_proper_path_if_url_is_ok(): void {
$utils = new UtilityFunctions();
$this->assertEquals('hallo', $utils->get_object_id_from_url('http://test.com/hallo/'));
}
/**
* Function test_if_get_object_id_from_url_triggers_warning_if_url_is_malformed
*
* @return void
*/
public function test_if_get_object_id_from_url_triggers_warning_if_url_is_malformed(): void {
$utils = new UtilityFunctions();
$this->expectWarning();
$utils->get_object_id_from_url('http://test.com:-80/hallo/');
}
/**
* Function test_if_get_repository_id_from_url_returns_host_if_url_is_ok
*
* @return void
* @throws Exception
*/
public function test_if_get_repository_id_from_url_returns_host_if_url_is_ok(): void {
$utils = new UtilityFunctions();
$this->assertEquals('test.com', $utils->get_repository_id_from_url('http://test.com/hallo/'));
}
/**
* Function test_if_get_repository_throws_exception_if_url_is_malformed
*
* @return void
* @throws Exception
*/
public function test_if_get_repository_throws_exception_if_url_is_malformed(): void {
$utils = new UtilityFunctions();
$this->expectException(Exception::class);
$utils->get_repository_id_from_url('http://test.com:-80/hallo/');
}
/**
* Function test_if_get_auth_key_returns_user_id_if_sso_is_active
*
* @return void
*
* @throws dml_exception
*/
public function test_if_get_auth_key_returns_user_id_if_sso_is_active_and_obfuscation_is_active(): void {
$this->resetAfterTest();
global $SESSION, $CFG;
require_once($CFG->dirroot . '/mod/edusharing/tests/testUtils/FakeConfig.php');
$fakeconfig = new FakeConfig();
$fakeconfig->set_entries([
'EDU_AUTH_PARAM_NAME_USERID' => 'test',
'obfuscate_auth_param' => '1',
]);
$utils = new UtilityFunctions($fakeconfig);
$SESSION->edusharing_sso = ['test' => 'expectedId'];
$this->assertEquals('expectedId', $utils->get_auth_key());
}
/**
* Function test_get_auth_key_returns_guest_id_if_guest_option_is_active
*
* @return void
*
* @throws dml_exception
*/
public function test_get_auth_key_returns_guest_id_if_guest_option_is_active(): void {
$this->resetAfterTest();
global $SESSION, $CFG;
require_once($CFG->dirroot . '/mod/edusharing/tests/testUtils/FakeConfig.php');
unset($SESSION->edusharing_sso);
$fakeconfig = new FakeConfig();
$fakeconfig->set_entries([
'edu_guest_option' => '1',
'edu_guest_guest_id' => 'expectedId',
]);
$utils = new UtilityFunctions($fakeconfig);
$this->assertEquals('expectedId', $utils->get_auth_key());
}
/**
* Function test_get_auth_key_returns_configured_auth_key_if_set
*
* @return void
*
* @throws dml_exception
*/
public function test_get_auth_key_returns_configured_auth_key_if_set(): void {
$this->resetAfterTest();
global $SESSION, $USER, $CFG;
require_once($CFG->dirroot . '/mod/edusharing/tests/testUtils/FakeConfig.php');
unset($SESSION->edusharing_sso);
$fakeconfig = new FakeConfig();
$fakeconfig->set_entries([
'EDU_AUTH_KEY' => 'email',
]);
$utils = new UtilityFunctions($fakeconfig);
$USER->email = 'expected@expected.org';
$this->assertEquals('expected@expected.org', $utils->get_auth_key());
}
/**
* Function test_get_auth_key_returns_auth_key_in_profile_if_all_previous_are_not_met
*
* @return void
*
* @throws dml_exception
*/
public function test_get_auth_key_returns_auth_key_in_profile_if_all_previous_are_not_met(): void {
$this->resetAfterTest();
global $SESSION, $USER, $CFG;
unset($SESSION->edusharing_sso);
require_once($CFG->dirroot . '/mod/edusharing/tests/testUtils/FakeConfig.php');
$fakeconfig = new FakeConfig();
$fakeconfig->set_entries([
'EDU_AUTH_KEY' => 'nonsense',
]);
$utils = new UtilityFunctions($fakeconfig);
$USER->profile['nonsense'] = 'expectedId';
$this->assertEquals('expectedId', $utils->get_auth_key());
}
/**
* Function test_get_auth_key_returns_user_name_as_last_resort
*
* @return void
*
* @throws dml_exception
*/
public function test_get_auth_key_returns_user_name_as_last_resort(): void {
$this->resetAfterTest();
global $SESSION, $USER, $CFG;
require_once($CFG->dirroot . '/mod/edusharing/tests/testUtils/FakeConfig.php');
unset($SESSION->edusharing_sso);
$fakeconfig = new FakeConfig();
$fakeconfig->set_entries([
'EDU_AUTH_KEY' => 'nonsense',
]);
$utils = new UtilityFunctions($fakeconfig);
$USER->username = 'expectedName';
$this->assertEquals('expectedName', $utils->get_auth_key());
}
/**
* Function test_if_set_moodle_ids_in_edusharing_entries_does_not_set_anything_if_no_matches
*
* @return void
*
*/
public function test_if_set_moodle_ids_in_edusharing_entries_does_not_set_anything_if_no_matches(): void {
$this->resetAfterTest();
require_once('lib/dml/tests/dml_test.php');
$dbmock = $this->getMockBuilder(moodle_database_for_testing::class)
->onlyMethods(['get_record', 'update_record'])
->getMock();
$dbmock->expects($this->never())->method('get_record');
$dbmock->expects($this->never())->method('update_record');
}
/**
* Function test_if_set_moodle_ids_in_edusharing_entries_sets_found_resource_ids_to_db
*
* @return void
*
*/
public function test_if_set_moodle_ids_in_edusharing_entries_sets_found_resource_ids_to_db(): void {
$this->resetAfterTest();
require_once('lib/dml/tests/dml_test.php');
$dbmock = $this->getMockBuilder(moodle_database_for_testing::class)
->onlyMethods(['get_record', 'update_record'])
->getMock();
$edusharing1 = new stdClass();
$edusharing1->id = 1;
$edusharing2 = new stdClass();
$edusharing2->id = 2;
$dbmock->expects($this->exactly(2))
->method('get_record')
->withConsecutive(
['edusharing', ['id' => 'resourceID1'], '*', MUST_EXIST],
['edusharing', ['id' => 'resourceID2'], '*', MUST_EXIST]
)->willReturnOnConsecutiveCalls($edusharing1, $edusharing2);
$sectionid = 4;
$moduleid = 5;
$edusharing3 = clone $edusharing1;
$edusharing3->section_id = $sectionid;
$edusharing3->module_id = $moduleid;
$edusharing4 = clone $edusharing2;
$edusharing4->section_id = $sectionid;
$edusharing4->module_id = $moduleid;
$dbmock->expects($this->exactly(2))
->method('update_record')
->withConsecutive(
['edusharing', $edusharing3],
['edusharing', $edusharing4]
);
// phpcs:ignore -- GLOBALS is supposed to be all caps.
$GLOBALS['DB'] = $dbmock;
$text = '<img resourceId=resourceID1& class="as_edusharing_atto_asda">';
$text .= '<a resourceId="resourceID2&" class="dsfg_edusharing_atto_afdd">text</a>';
$utils = new UtilityFunctions();
$utils->set_moodle_ids_in_edusharing_entries($text, $sectionid, $moduleid);
}
/**
* Function test_if_set_module_in_db_only_sets_section_id_if_no_module_id_provided
*
* @return void
*
*/
public function test_if_set_module_in_db_only_sets_section_id_if_no_module_id_provided(): void {
$this->resetAfterTest();
require_once('lib/dml/tests/dml_test.php');
$dbmock = $this->getMockBuilder(moodle_database_for_testing::class)
->onlyMethods(['get_record', 'update_record'])
->getMock();
$edusharing1 = new stdClass();
$edusharing1->id = 1;
$edusharing2 = new stdClass();
$edusharing2->id = 2;
$dbmock->expects($this->exactly(2))
->method('get_record')
->withConsecutive(
['edusharing', ['id' => 'resourceID1'], '*', MUST_EXIST],
['edusharing', ['id' => 'resourceID2'], '*', MUST_EXIST]
)->willReturnOnConsecutiveCalls($edusharing1, $edusharing2);
$sectionid = 4;
$edusharing3 = clone $edusharing1;
$edusharing3->section_id = $sectionid;
$edusharing4 = clone $edusharing2;
$edusharing4->section_id = $sectionid;
$dbmock->expects($this->exactly(2))
->method('update_record')
->withConsecutive(
['edusharing', $edusharing3],
['edusharing', $edusharing4]
);
// phpcs:ignore -- GLOBALS is supposed to be all caps.
$GLOBALS['DB'] = $dbmock;
$text = '<img resourceId=resourceID1& class="as_edusharing_atto_asda">';
$text .= '<a resourceId="resourceID2&" class="dsfg_edusharing_atto_afdd">text</a>';
$utils = new UtilityFunctions();
$utils->set_moodle_ids_in_edusharing_entries($text, $sectionid);
}
/**
* Function test_if_set_module_in_db_does_not_set_anything_to_db_if_no_matches_found
*
* @return void
*/
public function test_if_set_module_in_db_does_not_set_anything_to_db_if_no_matches_found(): void {
$this->resetAfterTest();
require_once('lib/dml/tests/dml_test.php');
$utils = new UtilityFunctions();
$dbmock = $this->getMockBuilder(moodle_database_for_testing::class)
->onlyMethods(['set_field'])
->getMock();
$dbmock->expects($this->never())->method('set_field');
// phpcs:ignore -- GLOBALS is supposed to be all caps.
$GLOBALS['DB'] = $dbmock;
$utils->set_moodle_ids_in_edusharing_entries('NothingHere', 1, 2);
}
/**
* Function test_if_get_course_module_info_returns_proper_info_if_data_found_in_db
*
* @return void
*/
public function test_if_get_course_module_info_returns_proper_info_if_data_found_in_db(): void {
$this->resetAfterTest();
require_once('lib/dml/tests/dml_test.php');
$this->resetAfterTest();
$utils = new UtilityFunctions();
$module = new stdClass();
$module->instance = 'instanceId';
$module->showdescription = false;
$module->id = 2;
$returnone = new stdClass();
$returnone->intro = "myIntro";
$returnone->introFormat = '2';
$returntwo = new stdClass();
$returntwo->popup_window = '1';
$dbmock = $this->getMockBuilder(moodle_database_for_testing::class)
->onlyMethods(['get_record'])
->getMock();
$dbmock->expects($this->exactly(2))
->method('get_record')
->withConsecutive(
[],
['edusharing', ['id' => 'instanceId'], '*', MUST_EXIST])
->willReturnOnConsecutiveCalls($returnone, $returntwo);
// phpcs:ignore -- GLOBALS is supposed to be all caps.
$GLOBALS['DB'] = $dbmock;
$result = $utils->get_course_module_info($module);
$this->assertTrue($result instanceof cached_cm_info);
$this->assertEquals('this.target=\'_blank\';', $result->onclick);
}
/**
* Function test_if_get_course_module_info_returns_false_if_no_record_found
*
* @return void
*/
public function test_if_get_course_module_info_returns_false_if_no_record_found(): void {
$this->resetAfterTest();
require_once('lib/dml/tests/dml_test.php');
$utils = new UtilityFunctions();
$this->resetAfterTest();
$module = new stdClass();
$module->instance = 'instanceId';
$module->id = 2;
$dbmock = $this->getMockBuilder(moodle_database_for_testing::class)
->onlyMethods(['get_record'])
->getMock();
$dbmock->expects($this->once())
->method('get_record')
->with('edusharing', ['id' => 'instanceId'], 'id, name, intro, introformat', MUST_EXIST)
->willThrowException(new Exception());
// phpcs:ignore -- GLOBALS is supposed to be all caps.
$GLOBALS['DB'] = $dbmock;
$this->assertEquals(false, $utils->get_course_module_info($module));
}
/**
* Function test_get_inline_object_matches_returns_only_atto_matches_from_input
*
* @return void
*/
public function test_get_inline_object_matches_returns_only_atto_matches_from_input(): void {
global $CFG;
require_once($CFG->dirroot . '/mod/edusharing/tests/testUtils/TestStringGenerator.php');
$text = TestStringGenerator::getattoteststring();
$utils = new UtilityFunctions();
$result = $utils->get_inline_object_matches($text);
$this->assertTrue(count($result) === 4);
$this->assertTrue(count(array_filter($result, fn($value) => str_contains($value, '</a>'))) === 2);
$this->assertTrue(count(array_filter($result, fn($value) => str_contains($value, '<img'))) === 2);
}
}