From bc75ef8bbcb850fb04ab85d421377f8683ba61a7 Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Wed, 16 Oct 2024 11:58:29 +0800 Subject: [PATCH] MDL-83468 phpunit: Fix various tests after phpunit 10 --- .gitignore | 1 + admin/tool/behat/tests/manager_util_test.php | 2 +- .../dataprivacy/tests/data_request_test.php | 26 +-- .../tests/filtered_userlist_test.php | 10 +- .../httpsreplace/tests/httpsreplace_test.php | 6 +- admin/tool/moodlenet/tests/local/url_test.php | 14 +- calendar/tests/event_factory_test.php | 12 +- composer.json | 4 + .../tests/courseformat/stateactions_test.php | 12 +- .../entity/migration_claim_test.php | 8 +- ...plication_registration_repository_test.php | 28 +-- .../service/tool_launch_service_test.php | 28 +-- .../ltiadvantage/task/sync_members_test.php | 72 +++---- enrol/manual/tests/lib_test.php | 12 +- lib/classes/date.php | 4 +- lib/dml/tests/dml_pgsql_read_replica_test.php | 5 + lib/dml/tests/dml_table_test.php | 4 +- lib/dml/tests/dml_test.php | 33 +-- .../test_dml_sql_debugging_fixture.php | 14 +- .../pgsql_native_moodle_database_test.php | 2 + lib/filestorage/tests/zip_packer_test.php | 24 +-- lib/phpunit/classes/advanced_testcase.php | 45 ++-- lib/phpunit/classes/base_testcase.php | 37 +++- lib/phpunit/classes/basic_testcase.php | 45 +--- .../classes/database_driver_testcase.php | 52 ++--- .../classes/exception/test_exception.php | 27 +++ lib/phpunit/classes/util.php | 2 +- lib/phpunit/phpunit.xsd | 102 +++------- lib/phpunit/tests/advanced_test.php | 44 ++-- lib/phpunit/tests/basic_test.php | 48 +---- lib/testing/classes/privacy/provider.php | 65 ++++++ lib/tests/completionlib_test.php | 192 +++++++++--------- lib/tests/date_test.php | 49 ++++- lib/tests/grouplib_test.php | 4 +- lib/tests/moodlelib_partial_test.php | 32 +-- lib/tests/moodlelib_test.php | 32 +-- .../tests/local/extension_test.php | 4 +- mod/bigbluebuttonbn/tests/meeting_test.php | 4 +- mod/data/tests/manager_test.php | 14 +- mod/data/tests/preset_importer_test.php | 17 +- .../tests/output/result/result_test.php | 24 +-- mod/label/tests/lib_test.php | 30 +-- mod/lesson/tests/numeric_helper_test.php | 12 +- .../external/validate_quiz_access_test.php | 10 +- .../tests/local/override_manager_test.php | 34 ++-- mod/wiki/tests/backup/restore_format_test.php | 8 +- mod/wiki/tests/wikiparser_test.php | 8 +- phpunit.xml.dist | 34 ++-- .../bank/statistics/tests/helper_test.php | 60 ++++-- .../tests/local/helpers/report_test.php | 12 +- repository/nextcloud/tests/lib_test.php | 8 +- 51 files changed, 717 insertions(+), 659 deletions(-) create mode 100644 lib/phpunit/classes/exception/test_exception.php create mode 100644 lib/testing/classes/privacy/provider.php diff --git a/.gitignore b/.gitignore index be141300074..452150d63ac 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,4 @@ moodle-plugin-ci.phar phpcs.xml jsconfig.json UPGRADING-CURRENT.md +.phpunit.cache diff --git a/admin/tool/behat/tests/manager_util_test.php b/admin/tool/behat/tests/manager_util_test.php index 0025a55efd0..b2ec37f7edf 100644 --- a/admin/tool/behat/tests/manager_util_test.php +++ b/admin/tool/behat/tests/manager_util_test.php @@ -468,7 +468,7 @@ final class manager_util_test extends \advanced_testcase { $CFG->dirroot = $oldroot; } - public function clean_features_path_list() { + public static function clean_features_path_list() { return array( ['/home/test/this/that/test/behat/mod_assign.feature', 'mod_assign_behat_test_that_this_test', '/home/test/this/that/test/behat/mod_assign.feature'], ['/home/this/that/test/behat/mod_assign.feature', 'mod_assign_behat_test_that_this_home', '/home/this/that/test/behat/mod_assign.feature'], diff --git a/admin/tool/dataprivacy/tests/data_request_test.php b/admin/tool/dataprivacy/tests/data_request_test.php index e8657ab9541..a71f3c3eb6a 100644 --- a/admin/tool/dataprivacy/tests/data_request_test.php +++ b/admin/tool/dataprivacy/tests/data_request_test.php @@ -89,13 +89,13 @@ final class data_request_test extends data_privacy_testcase { * Test the pseudo states of a data request with an export request. * * @dataProvider status_state_provider - * @param int $status + * @param int $state * @param bool $resettable * @param bool $active */ - public function test_pseudo_states_export(int $status, bool $resettable, bool $active): void { + public function test_pseudo_states_export(int $state, bool $resettable, bool $active): void { $uut = new \tool_dataprivacy\data_request(); - $uut->set('status', $status); + $uut->set('status', $state); $uut->set('type', api::DATAREQUEST_TYPE_EXPORT); $this->assertEquals($resettable, $uut->is_resettable()); @@ -106,13 +106,13 @@ final class data_request_test extends data_privacy_testcase { * Test the pseudo states of a data request with a delete request. * * @dataProvider status_state_provider - * @param int $status + * @param int $state * @param bool $resettable * @param bool $active */ - public function test_pseudo_states_delete(int $status, bool $resettable, bool $active): void { + public function test_pseudo_states_delete(int $state, bool $resettable, bool $active): void { $uut = new \tool_dataprivacy\data_request(); - $uut->set('status', $status); + $uut->set('status', $state); $uut->set('type', api::DATAREQUEST_TYPE_DELETE); $this->assertEquals($resettable, $uut->is_resettable()); @@ -123,11 +123,11 @@ final class data_request_test extends data_privacy_testcase { * Test the pseudo states of a data request. * * @dataProvider status_state_provider - * @param int $status + * @param int $state */ - public function test_can_reset_others($status): void { + public function test_can_reset_others(int $state, bool $resettable, bool $active): void { $uut = new \tool_dataprivacy\data_request(); - $uut->set('status', $status); + $uut->set('status', $state); $uut->set('type', api::DATAREQUEST_TYPE_OTHERS); $this->assertFalse($uut->is_resettable()); @@ -142,7 +142,7 @@ final class data_request_test extends data_privacy_testcase { $states = []; foreach (self::status_state_provider() as $thisstatus) { if (!$thisstatus['resettable']) { - $states[] = $thisstatus; + $states[] = ['state' => $thisstatus['state']]; } } @@ -153,11 +153,11 @@ final class data_request_test extends data_privacy_testcase { * Ensure that requests which are not resettable cause an exception to be thrown. * * @dataProvider non_resettable_provider - * @param int $status + * @param int $state */ - public function test_non_resubmit_request($status): void { + public function test_non_resubmit_request($state): void { $uut = new \tool_dataprivacy\data_request(); - $uut->set('status', $status); + $uut->set('status', $state); $this->expectException(\moodle_exception::class); $this->expectExceptionMessage(get_string('cannotreset', 'tool_dataprivacy')); diff --git a/admin/tool/dataprivacy/tests/filtered_userlist_test.php b/admin/tool/dataprivacy/tests/filtered_userlist_test.php index eb73fae9d24..0269ea3dd91 100644 --- a/admin/tool/dataprivacy/tests/filtered_userlist_test.php +++ b/admin/tool/dataprivacy/tests/filtered_userlist_test.php @@ -61,28 +61,28 @@ final class filtered_userlist_test extends \advanced_testcase { return [ // Entire list should be preserved. 'No overrides' => [ - 'users' => [1, 2, 3, 4, 5], + 'initial' => [1, 2, 3, 4, 5], 'expired' => [], 'unexpired' => [], - [1, 2, 3, 4, 5], + 'expected' => [1, 2, 3, 4, 5], ], // The list should be filtered to only keep the expired users. 'Expired only' => [ - 'users' => [1, 2, 3, 4, 5], + 'initial' => [1, 2, 3, 4, 5], 'expired' => [2, 3, 4], 'unexpired' => [], 'expected' => [2, 3, 4], ], // The list should be filtered to remove any unexpired users. 'Unexpired only' => [ - 'users' => [1, 2, 3, 4, 5], + 'initial' => [1, 2, 3, 4, 5], 'expired' => [], 'unexpired' => [1, 5], 'expected' => [2, 3, 4], ], // The list should be filtered to only keep expired users who are not on the unexpired list. 'Combination of expired and unexpired' => [ - 'users' => [1, 2, 3, 4, 5], + 'initial' => [1, 2, 3, 4, 5], 'expired' => [1, 2, 3], 'unexpired' => [1, 5], 'expected' => [2, 3], diff --git a/admin/tool/httpsreplace/tests/httpsreplace_test.php b/admin/tool/httpsreplace/tests/httpsreplace_test.php index 5621fdb6da6..9315bf9dfa7 100644 --- a/admin/tool/httpsreplace/tests/httpsreplace_test.php +++ b/admin/tool/httpsreplace/tests/httpsreplace_test.php @@ -134,15 +134,15 @@ final class httpsreplace_test extends \advanced_testcase { /** * Test upgrade_http_links * @param string $content Example content that we'll attempt to replace. - * @param string $ouputregex Regex for what output we expect. + * @param string $outputregex Regex for what output we expect. * @param string $expectedcontent What content we are expecting afterwards. * @dataProvider upgrade_http_links_provider */ - public function test_upgrade_http_links($content, $ouputregex, $expectedcontent): void { + public function test_upgrade_http_links($content, $outputregex, $expectedcontent): void { global $DB; $this->resetAfterTest(); - $this->expectOutputRegex($ouputregex); + $this->expectOutputRegex($outputregex); $finder = new tool_httpreplace_url_finder_mock(); diff --git a/admin/tool/moodlenet/tests/local/url_test.php b/admin/tool/moodlenet/tests/local/url_test.php index f9d74cd1f35..9422b24e6c7 100644 --- a/admin/tool/moodlenet/tests/local/url_test.php +++ b/admin/tool/moodlenet/tests/local/url_test.php @@ -32,7 +32,7 @@ final class url_test extends \advanced_testcase { * Test the parsing to host + path components. * * @dataProvider url_provider - * @param string $urlstring The full URL string + * @param string $url The full URL string * @param string $host the expected host component of the URL. * @param string $path the expected path component of the URL. * @param bool $exception whether or not an exception is expected during construction. @@ -58,37 +58,37 @@ final class url_test extends \advanced_testcase { public static function url_provider(): array { return [ 'No path' => [ - 'url' => 'https://example.moodle.net', + 'urlstring' => 'https://example.moodle.net', 'host' => 'example.moodle.net', 'path' => null, 'exception' => false, ], 'Slash path' => [ - 'url' => 'https://example.moodle.net/', + 'urlstring' => 'https://example.moodle.net/', 'host' => 'example.moodle.net', 'path' => '/', 'exception' => false, ], 'Path includes file and extension' => [ - 'url' => 'https://example.moodle.net/uploads/123456789/pic.png', + 'urlstring' => 'https://example.moodle.net/uploads/123456789/pic.png', 'host' => 'example.moodle.net', 'path' => '/uploads/123456789/pic.png', 'exception' => false, ], 'Path includes file, extension and params' => [ - 'url' => 'https://example.moodle.net/uploads/123456789/pic.png?option=1&option2=test', + 'urlstring' => 'https://example.moodle.net/uploads/123456789/pic.png?option=1&option2=test', 'host' => 'example.moodle.net', 'path' => '/uploads/123456789/pic.png', 'exception' => false, ], 'Malformed - invalid' => [ - 'url' => 'invalid', + 'urlstring' => 'invalid', 'host' => null, 'path' => null, 'exception' => true, ], 'Direct, non-encoded utf8 - invalid' => [ - 'url' => 'http://москва.рф/services/', + 'urlstring' => 'http://москва.рф/services/', 'host' => 'москва.рф', 'path' => '/services/', 'exception' => true, diff --git a/calendar/tests/event_factory_test.php b/calendar/tests/event_factory_test.php index 6a10d28f7c6..d89539c46df 100644 --- a/calendar/tests/event_factory_test.php +++ b/calendar/tests/event_factory_test.php @@ -379,8 +379,8 @@ final class event_factory_test extends \advanced_testcase { 'bailoutcheck' => function() { return false; }, - event_interface::class, - 'Hello' + 'expectedclass' => event_interface::class, + 'expectedattributevalue' => 'Hello' ], 'Sample event record with event hidden' => [ 'dbrow' => (object)[ @@ -413,8 +413,8 @@ final class event_factory_test extends \advanced_testcase { 'bailoutcheck' => function() { return false; }, - null, - null + 'expectedclass' => null, + 'expectedattributevalue' => null ], 'Sample event record with early bail' => [ 'dbrow' => (object)[ @@ -447,8 +447,8 @@ final class event_factory_test extends \advanced_testcase { 'bailoutcheck' => function() { return true; }, - null, - null + 'expectedclass' => null, + 'expectedattributevalue' => null ] ]; } diff --git a/composer.json b/composer.json index 9b0d16db0b8..d016d21b016 100644 --- a/composer.json +++ b/composer.json @@ -20,6 +20,10 @@ "autoload-dev": { "psr-0": { "Moodle\\BehatExtension": "lib/behat/extension/" + }, + "psr-4": { + "core_testing\\": "lib/testing/classes/", + "core_phpunit\\": "lib/phpunit/classes/" } }, "minimum-stability": "dev", diff --git a/course/format/topics/tests/courseformat/stateactions_test.php b/course/format/topics/tests/courseformat/stateactions_test.php index f48cc510fc0..ebe1938eeba 100644 --- a/course/format/topics/tests/courseformat/stateactions_test.php +++ b/course/format/topics/tests/courseformat/stateactions_test.php @@ -194,27 +194,27 @@ final class stateactions_test extends \advanced_testcase { public static function basic_role_provider(): array { return [ 'admin' => [ - 'role' => 'admin', + 'rolename' => 'admin', 'expectedexception' => false, ], 'editingteacher' => [ - 'role' => 'editingteacher', + 'rolename' => 'editingteacher', 'expectedexception' => false, ], 'teacher' => [ - 'role' => 'teacher', + 'rolename' => 'teacher', 'expectedexception' => true, ], 'student' => [ - 'role' => 'student', + 'rolename' => 'student', 'expectedexception' => true, ], 'guest' => [ - 'role' => 'guest', + 'rolename' => 'guest', 'expectedexception' => true, ], 'unenroled' => [ - 'role' => 'unenroled', + 'rolename' => 'unenroled', 'expectedexception' => true, ], ]; diff --git a/enrol/lti/tests/local/ltiadvantage/entity/migration_claim_test.php b/enrol/lti/tests/local/ltiadvantage/entity/migration_claim_test.php index fdd52780aa0..fb688ba3208 100644 --- a/enrol/lti/tests/local/ltiadvantage/entity/migration_claim_test.php +++ b/enrol/lti/tests/local/ltiadvantage/entity/migration_claim_test.php @@ -49,7 +49,7 @@ final class migration_claim_test extends \advanced_testcase { * Test instantiation and getters of the migration_claim. * * @dataProvider migration_claim_provider - * @param array $migrationclaimdata the lti1p1 migration claim. + * @param array $lti1p1migrationclaim the lti1p1 migration claim. * @param string $deploymentid string id of the tool deployment. * @param string $platform string url of the issuer. * @param string $clientid string id of the client. @@ -60,7 +60,7 @@ final class migration_claim_test extends \advanced_testcase { * @covers ::__construct */ public function test_migration_claim( - array $migrationclaimdata, + array $lti1p1migrationclaim, string $deploymentid, string $platform, string $clientid, @@ -79,7 +79,7 @@ final class migration_claim_test extends \advanced_testcase { $this->expectException($expected['exception']); $this->expectExceptionMessage($expected['exceptionmessage']); new migration_claim( - $migrationclaimdata, + $lti1p1migrationclaim, $deploymentid, $platform, $clientid, @@ -89,7 +89,7 @@ final class migration_claim_test extends \advanced_testcase { ); } else { $migrationclaim = new migration_claim( - $migrationclaimdata, + $lti1p1migrationclaim, $deploymentid, $platform, $clientid, diff --git a/enrol/lti/tests/local/ltiadvantage/repository/application_registration_repository_test.php b/enrol/lti/tests/local/ltiadvantage/repository/application_registration_repository_test.php index 140cef90c56..a87e9c7e54f 100644 --- a/enrol/lti/tests/local/ltiadvantage/repository/application_registration_repository_test.php +++ b/enrol/lti/tests/local/ltiadvantage/repository/application_registration_repository_test.php @@ -98,28 +98,28 @@ final class application_registration_repository_test extends \advanced_testcase * * @dataProvider save_data_provider * @covers ::save - * @param array $regdata the registration data + * @param array $registrationdata the registration data */ - public function test_save_new(array $regdata): void { + public function test_save_new(array $registrationdata): void { $this->resetAfterTest(); - $reg = application_registration::create_draft($regdata['name'], $regdata['uniqueid']); - if (isset($regdata['platformid'])) { - $reg->set_platformid($regdata['platformid']); + $reg = application_registration::create_draft($registrationdata['name'], $registrationdata['uniqueid']); + if (isset($registrationdata['platformid'])) { + $reg->set_platformid($registrationdata['platformid']); } - if (isset($regdata['clientid'])) { - $reg->set_clientid($regdata['clientid']); + if (isset($registrationdata['clientid'])) { + $reg->set_clientid($registrationdata['clientid']); } - if (isset($regdata['authenticationrequesturl'])) { - $reg->set_authenticationrequesturl($regdata['authenticationrequesturl']); + if (isset($registrationdata['authenticationrequesturl'])) { + $reg->set_authenticationrequesturl($registrationdata['authenticationrequesturl']); } - if (isset($regdata['jwksurl'])) { - $reg->set_jwksurl($regdata['jwksurl']); + if (isset($registrationdata['jwksurl'])) { + $reg->set_jwksurl($registrationdata['jwksurl']); } - if (isset($regdata['accesstokenurl'])) { - $reg->set_accesstokenurl($regdata['accesstokenurl']); + if (isset($registrationdata['accesstokenurl'])) { + $reg->set_accesstokenurl($registrationdata['accesstokenurl']); } - if (!empty($regdata['setcomplete'])) { + if (!empty($registrationdata['setcomplete'])) { $reg->complete_registration(); } $repository = new application_registration_repository(); diff --git a/enrol/lti/tests/local/ltiadvantage/service/tool_launch_service_test.php b/enrol/lti/tests/local/ltiadvantage/service/tool_launch_service_test.php index 4aee6ee44ed..73ace1b6bcb 100644 --- a/enrol/lti/tests/local/ltiadvantage/service/tool_launch_service_test.php +++ b/enrol/lti/tests/local/ltiadvantage/service/tool_launch_service_test.php @@ -126,8 +126,8 @@ final class tool_launch_service_test extends \lti_advantage_testcase { public static function user_launch_provider(): array { return [ 'New tool: no legacy data, no migration claim sent' => [ - 'legacy_data' => null, - 'launch_data' => [ + 'legacydata' => null, + 'launchdata' => [ 'user' => self::get_mock_launch_users_with_ids(['1p3_1'])[0], 'launch_migration_claim' => null, ], @@ -136,14 +136,14 @@ final class tool_launch_service_test extends \lti_advantage_testcase { ] ], 'Migrated tool: Legacy data exists, no change in user_id so omitted from claim' => [ - 'legacy_data' => [ + 'legacydata' => [ 'consumer_key' => 'CONSUMER_1', 'tools' => [ ['secret' => 'toolsecret1'], ['secret' => 'toolsecret2'], ] ], - 'launch_data' => [ + 'launchdata' => [ 'user' => self::get_mock_launch_users_with_ids(['1'])[0], 'launch_migration_claim' => [ 'consumer_key' => 'CONSUMER_1', @@ -159,14 +159,14 @@ final class tool_launch_service_test extends \lti_advantage_testcase { ], 'Migrated tool: Legacy data exists, platform signs with different valid secret' => [ - 'legacy_data' => [ + 'legacydata' => [ 'consumer_key' => 'CONSUMER_1', 'tools' => [ ['secret' => 'toolsecret1'], ['secret' => 'toolsecret2'], ] ], - 'launch_data' => [ + 'launchdata' => [ 'user' => self::get_mock_launch_users_with_ids(['1p3_1'])[0], 'launch_migration_claim' => [ 'consumer_key' => 'CONSUMER_1', @@ -181,14 +181,14 @@ final class tool_launch_service_test extends \lti_advantage_testcase { ] ], 'Migrated tool: Legacy data exists, no migration claim sent' => [ - 'legacy_data' => [ + 'legacydata' => [ 'consumer_key' => 'CONSUMER_1', 'tools' => [ ['secret' => 'toolsecret1'], ['secret' => 'toolsecret2'], ] ], - 'launch_data' => [ + 'launchdata' => [ 'user' => self::get_mock_launch_users_with_ids(['1p3_1'])[0], 'launch_migration_claim' => null, ], @@ -197,14 +197,14 @@ final class tool_launch_service_test extends \lti_advantage_testcase { ] ], 'Migrated tool: Legacy data exists, migration claim signature generated using invalid secret' => [ - 'legacy_data' => [ + 'legacydata' => [ 'consumer_key' => 'CONSUMER_1', 'tools' => [ ['secret' => 'toolsecret1'], ['secret' => 'toolsecret2'], ] ], - 'launch_data' => [ + 'launchdata' => [ 'user' => self::get_mock_launch_users_with_ids(['1p3_1'])[0], 'launch_migration_claim' => [ 'consumer_key' => 'CONSUMER_1', @@ -221,14 +221,14 @@ final class tool_launch_service_test extends \lti_advantage_testcase { ] ], 'Migrated tool: Legacy data exists, migration claim signature omitted' => [ - 'legacy_data' => [ + 'legacydata' => [ 'consumer_key' => 'CONSUMER_1', 'tools' => [ ['secret' => 'toolsecret1'], ['secret' => 'toolsecret2'], ] ], - 'launch_data' => [ + 'launchdata' => [ 'user' => self::get_mock_launch_users_with_ids(['1p3_1'])[0], 'launch_migration_claim' => [ 'consumer_key' => 'CONSUMER_1', @@ -244,14 +244,14 @@ final class tool_launch_service_test extends \lti_advantage_testcase { ] ], 'Migrated tool: Legacy data exists, migration claim missing oauth_consumer_key' => [ - 'legacy_data' => [ + 'legacydata' => [ 'consumer_key' => 'CONSUMER_1', 'tools' => [ ['secret' => 'toolsecret1'], ['secret' => 'toolsecret2'], ] ], - 'launch_data' => [ + 'launchdata' => [ 'user' => self::get_mock_launch_users_with_ids(['1p3_1'])[0], 'launch_migration_claim' => [ 'user_id' => 'user-id-123', diff --git a/enrol/lti/tests/local/ltiadvantage/task/sync_members_test.php b/enrol/lti/tests/local/ltiadvantage/task/sync_members_test.php index c827ac661de..526b393f2de 100644 --- a/enrol/lti/tests/local/ltiadvantage/task/sync_members_test.php +++ b/enrol/lti/tests/local/ltiadvantage/task/sync_members_test.php @@ -800,7 +800,7 @@ final class sync_members_test extends \lti_advantage_testcase { require_once($CFG->dirroot . '/auth/lti/auth.php'); return [ 'Migrated tool, user ids changed, new and existing users present in sync' => [ - 'legacy_data' => [ + 'legacydata' => [ 'users' => [ ['user_id' => '1'], ['user_id' => '2'], @@ -811,8 +811,8 @@ final class sync_members_test extends \lti_advantage_testcase { ['secret' => 'toolsecret2'], ] ], - 'resource_config' => null, - 'launch_data' => [ + 'resourceconfig' => null, + 'launchdata' => [ 'user' => self::get_mock_launch_users_with_ids(['1p3_1'])[0], 'launch_migration_claim' => [ 'consumer_key' => 'CONSUMER_1', @@ -823,7 +823,7 @@ final class sync_members_test extends \lti_advantage_testcase { 'resource_link_id' => '4b6fa' ], ], - 'sync_members_data' => [ + 'syncmembers' => [ self::get_mock_members_with_ids(['1p3_1'], ['1'])[0], self::get_mock_members_with_ids(['1p3_2'], ['2'])[0], self::get_mock_members_with_ids(['1p3_3'], ['3'])[0], @@ -851,7 +851,7 @@ final class sync_members_test extends \lti_advantage_testcase { ] ], 'Migrated tool, no change in user ids, new and existing users present in sync' => [ - 'legacy_data' => [ + 'legacydata' => [ 'users' => [ ['user_id' => '1'], ['user_id' => '2'], @@ -862,8 +862,8 @@ final class sync_members_test extends \lti_advantage_testcase { ['secret' => 'toolsecret2'], ] ], - 'resource_config' => null, - 'launch_data' => [ + 'resourceconfig' => null, + 'launchdata' => [ 'user' => self::get_mock_launch_users_with_ids(['1'])[0], 'launch_migration_claim' => [ 'consumer_key' => 'CONSUMER_1', @@ -873,7 +873,7 @@ final class sync_members_test extends \lti_advantage_testcase { 'resource_link_id' => '4b6fa' ], ], - 'sync_members_data' => [ + 'syncmembers' => [ self::get_mock_members_with_ids(['1'], null)[0], self::get_mock_members_with_ids(['2'], null)[0], self::get_mock_members_with_ids(['3'], null)[0], @@ -901,7 +901,7 @@ final class sync_members_test extends \lti_advantage_testcase { ] ], 'New tool, no launch migration claim, change in user ids, new and existing users present in sync' => [ - 'legacy_data' => [ + 'legacydata' => [ 'users' => [ ['user_id' => '1'], ['user_id' => '2'], @@ -912,12 +912,12 @@ final class sync_members_test extends \lti_advantage_testcase { ['secret' => 'toolsecret2'], ] ], - 'resource_config' => null, - 'launch_data' => [ + 'resourceconfig' => null, + 'launchdata' => [ 'user' => self::get_mock_launch_users_with_ids(['1p3_1'])[0], 'launch_migration_claim' => null, ], - 'sync_members_data' => [ + 'syncmembers' => [ self::get_mock_members_with_ids(['1p3_1'], null)[0], self::get_mock_members_with_ids(['1p3_2'], null)[0], self::get_mock_members_with_ids(['1p3_3'], null)[0], @@ -945,7 +945,7 @@ final class sync_members_test extends \lti_advantage_testcase { ] ], 'New tool, no launch migration claim, no change in user ids, new and existing users present in sync' => [ - 'legacy_data' => [ + 'legacydata' => [ 'users' => [ ['user_id' => '1'], ['user_id' => '2'], @@ -956,12 +956,12 @@ final class sync_members_test extends \lti_advantage_testcase { ['secret' => 'toolsecret2'], ] ], - 'resource_config' => null, - 'launch_data' => [ + 'resourceconfig' => null, + 'launchdata' => [ 'user' => self::get_mock_launch_users_with_ids(['1'])[0], 'launch_migration_claim' => null, ], - 'sync_members_data' => [ + 'syncmembers' => [ self::get_mock_members_with_ids(['1'], null)[0], self::get_mock_members_with_ids(['2'], null)[0], self::get_mock_members_with_ids(['3'], null)[0], @@ -989,7 +989,7 @@ final class sync_members_test extends \lti_advantage_testcase { ] ], 'New tool, migration only via member sync, no launch claim, new and existing users present in sync' => [ - 'legacy_data' => [ + 'legacydata' => [ 'users' => [ ['user_id' => '1'], ['user_id' => '2'], @@ -1000,12 +1000,12 @@ final class sync_members_test extends \lti_advantage_testcase { ['secret' => 'toolsecret2'], ] ], - 'resource_config' => null, - 'launch_data' => [ + 'resourceconfig' => null, + 'launchdata' => [ 'user' => self::get_mock_launch_users_with_ids(['1p3_1'])[0], 'launch_migration_claim' => null, ], - 'sync_members_data' => [ + 'syncmembers' => [ self::get_mock_members_with_ids(['1p3_1'], ['1'])[0], self::get_mock_members_with_ids(['1p3_2'], ['2'])[0], self::get_mock_members_with_ids(['1p3_3'], ['3'])[0], @@ -1033,16 +1033,16 @@ final class sync_members_test extends \lti_advantage_testcase { ] ], 'Default provisioning modes, mixed bag of users and roles' => [ - 'legacy_data' => null, - 'resource_config' => [ + 'legacydata' => null, + 'resourceconfig' => [ 'provisioningmodelearner' => \auth_plugin_lti::PROVISIONING_MODE_AUTO_ONLY, 'provisioningmodeinstructor' => \auth_plugin_lti::PROVISIONING_MODE_PROMPT_NEW_EXISTING ], - 'launch_data' => [ + 'launchdata' => [ 'user' => self::get_mock_launch_users_with_ids(['1p3_1'])[0], 'launch_migration_claim' => null, ], - 'sync_members_data' => [ + 'syncmembers' => [ // This user is just an instructor but is also the user who is already linked, via the launch above. self::get_mock_members_with_ids(['1p3_1'], null, true, true, true, false, [ 'http://purl.imsglobal.org/vocab/lis/v2/membership#Instructor', @@ -1083,16 +1083,16 @@ final class sync_members_test extends \lti_advantage_testcase { ] ], 'All automatic provisioning, mixed bag of users and roles' => [ - 'legacy_data' => null, - 'resource_config' => [ + 'legacydata' => null, + 'resourceconfig' => [ 'provisioningmodelearner' => \auth_plugin_lti::PROVISIONING_MODE_AUTO_ONLY, 'provisioningmodeinstructor' => \auth_plugin_lti::PROVISIONING_MODE_AUTO_ONLY ], - 'launch_data' => [ + 'launchdata' => [ 'user' => self::get_mock_launch_users_with_ids(['1p3_1'])[0], 'launch_migration_claim' => null, ], - 'sync_members_data' => [ + 'syncmembers' => [ // This user is just an instructor but is also the user who is already linked, via the launch above. self::get_mock_members_with_ids(['1p3_1'], null, true, true, true, false, [ 'http://purl.imsglobal.org/vocab/lis/v2/membership#Instructor', @@ -1133,16 +1133,16 @@ final class sync_members_test extends \lti_advantage_testcase { ] ], 'All prompt provisioning, mixed bag of users and roles' => [ - 'legacy_data' => null, - 'resource_config' => [ + 'legacydata' => null, + 'resourceconfig' => [ 'provisioningmodelearner' => \auth_plugin_lti::PROVISIONING_MODE_PROMPT_NEW_EXISTING, 'provisioningmodeinstructor' => \auth_plugin_lti::PROVISIONING_MODE_PROMPT_NEW_EXISTING ], - 'launch_data' => [ + 'launchdata' => [ 'user' => self::get_mock_launch_users_with_ids(['1p3_1'])[0], 'launch_migration_claim' => null, ], - 'sync_members_data' => [ + 'syncmembers' => [ // This user is just an instructor but is also the user who is already linked, via the launch above. self::get_mock_members_with_ids(['1p3_1'], null, true, true, true, false, [ 'http://purl.imsglobal.org/vocab/lis/v2/membership#Instructor', @@ -1183,7 +1183,7 @@ final class sync_members_test extends \lti_advantage_testcase { ] ], 'All automatic provisioning, with legacy data and migration claim, mixed bag of users and roles' => [ - 'legacy_data' => [ + 'legacydata' => [ 'users' => [ ['user_id' => '2'], ['user_id' => '3'], @@ -1196,11 +1196,11 @@ final class sync_members_test extends \lti_advantage_testcase { ['secret' => 'toolsecret2'], ] ], - 'resource_config' => [ + 'resourceconfig' => [ 'provisioningmodelearner' => \auth_plugin_lti::PROVISIONING_MODE_AUTO_ONLY, 'provisioningmodeinstructor' => \auth_plugin_lti::PROVISIONING_MODE_AUTO_ONLY ], - 'launch_data' => [ + 'launchdata' => [ 'user' => self::get_mock_launch_users_with_ids(['1p3_1'])[0], 'launch_migration_claim' => [ 'consumer_key' => 'CONSUMER_1', @@ -1210,7 +1210,7 @@ final class sync_members_test extends \lti_advantage_testcase { 'resource_link_id' => '4b6fa' ], ], - 'sync_members_data' => [ + 'syncmembers' => [ // This user is just an instructor but is also the user who is already linked, via the launch above. self::get_mock_members_with_ids(['1p3_1'], null, true, true, true, false, [ 'http://purl.imsglobal.org/vocab/lis/v2/membership#Instructor', diff --git a/enrol/manual/tests/lib_test.php b/enrol/manual/tests/lib_test.php index 751fdc83898..d9694dbe2bd 100644 --- a/enrol/manual/tests/lib_test.php +++ b/enrol/manual/tests/lib_test.php @@ -603,7 +603,7 @@ final class lib_test extends \advanced_testcase { 'notifyall' => 0, 'expirythreshold' => 12 * HOURSECS, ], - 'global settings' => (object) [ + 'globalsettings' => (object) [ 'status' => ENROL_INSTANCE_ENABLED, 'roleid' => $studentrole->id, 'enrolperiod' => 0, @@ -620,7 +620,7 @@ final class lib_test extends \advanced_testcase { 'notifyall' => 0, 'expirythreshold' => DAYSECS, ], - 'global settings' => (object) [ + 'globalsettings' => (object) [ 'status' => ENROL_INSTANCE_ENABLED, 'roleid' => $studentrole->id, 'enrolperiod' => 72 * HOURSECS, @@ -637,7 +637,7 @@ final class lib_test extends \advanced_testcase { 'notifyall' => 1, 'expirythreshold' => 0 ], - 'global settings' => (object) [ + 'globalsettings' => (object) [ 'status' => ENROL_INSTANCE_DISABLED, 'roleid' => $teacherrole->id, 'enrolperiod' => 0, @@ -717,7 +717,7 @@ final class lib_test extends \advanced_testcase { 'notifyall' => 0, 'expirythreshold' => 2 * DAYSECS, ], - 'update data' => (object) [ + 'updatedata' => (object) [ 'status' => ENROL_INSTANCE_DISABLED, 'roleid' => $studentrole->id, 'enrolperiod' => 30 * DAYSECS, @@ -734,7 +734,7 @@ final class lib_test extends \advanced_testcase { 'notifyall' => 0, 'expirythreshold' => 0, ], - 'update data' => (object) [ + 'updatedata' => (object) [ 'status' => ENROL_INSTANCE_ENABLED, 'roleid' => $teacherrole->id, 'enrolperiod' => 0, @@ -751,7 +751,7 @@ final class lib_test extends \advanced_testcase { 'notifyall' => 1, 'expirythreshold' => 2 * DAYSECS, ], - 'update data' => (object) [ + 'updatedata' => (object) [ 'status' => ENROL_INSTANCE_ENABLED, 'roleid' => $studentrole->id, 'enrolperiod' => 30 * DAYSECS, diff --git a/lib/classes/date.php b/lib/classes/date.php index 453faa133ae..4c029aa5ffa 100644 --- a/lib/classes/date.php +++ b/lib/classes/date.php @@ -153,7 +153,7 @@ class core_date { // Is server timezone usable? if (isset($CFG->timezone) and !is_numeric($CFG->timezone)) { - $result = @timezone_open($CFG->timezone); // Hide notices if invalid. + $result = timezone_open($CFG->timezone); // Hide notices if invalid. if ($result !== false) { return $result->getName(); } @@ -319,7 +319,7 @@ class core_date { if (!defined('PHPUNIT_TEST')) { throw new coding_exception('core_date::phpunit_override_default_php_timezone() must be used only from unit tests'); } - $result = timezone_open($tz ?? ''); // This triggers error if $tz invalid. + $result = @timezone_open($tz ?? ''); // This triggers error if $tz invalid. if ($result !== false) { self::$defaultphptimezone = $tz; } else { diff --git a/lib/dml/tests/dml_pgsql_read_replica_test.php b/lib/dml/tests/dml_pgsql_read_replica_test.php index d57b0535c99..a265ebe7da1 100644 --- a/lib/dml/tests/dml_pgsql_read_replica_test.php +++ b/lib/dml/tests/dml_pgsql_read_replica_test.php @@ -280,6 +280,9 @@ final class dml_pgsql_read_replica_test extends \advanced_testcase { ]; $this->resetDebugging(); + set_error_handler(function ($errno, $errstr) { + $this->assertStringContainsString('could not connect to server', $errstr); + }, E_ALL); $db2 = moodle_database::get_driver_instance($cfg->dbtype, $cfg->dblibrary); $db2->connect($cfg->dbhost, $cfg->dbuser, $cfg->dbpass, $cfg->dbname, $cfg->prefix, $cfg->dboptions); $this->assertNotEmpty($db2->get_records('user')); @@ -301,5 +304,7 @@ final class dml_pgsql_read_replica_test extends \advanced_testcase { ); // Attempt to connect to the existing DB host will succeed. $this->assertEquals("Readwrite db connection succeeded for host {$cfg->dbhost}", $debugging[1]); + $this->assertTrue(count($db2->get_records('user')) > 0); + restore_error_handler(); } } diff --git a/lib/dml/tests/dml_table_test.php b/lib/dml/tests/dml_table_test.php index 6a3e4c647e6..f1ccbea5d39 100644 --- a/lib/dml/tests/dml_table_test.php +++ b/lib/dml/tests/dml_table_test.php @@ -45,7 +45,7 @@ final class dml_table_test extends \database_driver_testcase { 'primarykey' => 'id', 'fieldprefix' => 'ban', 'tablealias' => 'banana', - 'banana.id AS banid', + 'expected' => 'banana.id AS banid', ], 'multiple fields' => [ 'tablename' => 'test_table_multiple', @@ -57,7 +57,7 @@ final class dml_table_test extends \database_driver_testcase { 'primarykey' => 'id', 'fieldprefix' => 'ban', 'tablealias' => 'banana', - 'banana.id AS banid, banana.course AS bancourse, banana.name AS banname', + 'expected' => 'banana.id AS banid, banana.course AS bancourse, banana.name AS banname', ], ]; } diff --git a/lib/dml/tests/dml_test.php b/lib/dml/tests/dml_test.php index 525ea2c7369..e7c720afc4e 100644 --- a/lib/dml/tests/dml_test.php +++ b/lib/dml/tests/dml_test.php @@ -487,7 +487,8 @@ final class dml_test extends \database_driver_testcase { $DB = $this->tdb; require_once($CFG->dirroot . '/lib/dml/tests/fixtures/test_dml_sql_debugging_fixture.php'); - $fixture = new \test_dml_sql_debugging_fixture($this); + $databasemock = $this->getMockBuilder(\moodle_database::class)->getMock(); + $fixture = new \test_dml_sql_debugging_fixture($databasemock); $sql = "SELECT * FROM {users}"; @@ -499,31 +500,31 @@ final class dml_test extends \database_driver_testcase { $CFG->debugsqltrace = 1; $out = $fixture->four($sql); $expected = <<invoke() +SELECT \* FROM {users} +-- line \d+ of /lib/dml/tests/fixtures/test_dml_sql_debugging_fixture.php: call to ReflectionMethod->invoke\(\) EOD; - $this->assertEquals($this->unix_to_os_dirsep($expected), $out); + $this->assertMatchesRegularExpression('@' . $this->unix_to_os_dirsep($expected) . '@', $out); $CFG->debugsqltrace = 2; $out = $fixture->four($sql); $expected = <<invoke() --- line 73 of /lib/dml/tests/fixtures/test_dml_sql_debugging_fixture.php: call to test_dml_sql_debugging_fixture->one() +SELECT \* FROM {users} +-- line \d+ of /lib/dml/tests/fixtures/test_dml_sql_debugging_fixture.php: call to ReflectionMethod->invoke\(\) +-- line \d+ of /lib/dml/tests/fixtures/test_dml_sql_debugging_fixture.php: call to test_dml_sql_debugging_fixture->one\(\) EOD; - $this->assertEquals($this->unix_to_os_dirsep($expected), $out); + $this->assertMatchesRegularExpression('@' . $this->unix_to_os_dirsep($expected) . '@', $out); $CFG->debugsqltrace = 5; $out = $fixture->four($sql); $expected = <<invoke() --- line 73 of /lib/dml/tests/fixtures/test_dml_sql_debugging_fixture.php: call to test_dml_sql_debugging_fixture->one() --- line 82 of /lib/dml/tests/fixtures/test_dml_sql_debugging_fixture.php: call to test_dml_sql_debugging_fixture->two() --- line 91 of /lib/dml/tests/fixtures/test_dml_sql_debugging_fixture.php: call to test_dml_sql_debugging_fixture->three() --- line 517 of /lib/dml/tests/dml_test.php: call to test_dml_sql_debugging_fixture->four() +SELECT \* FROM {users} +-- line \d+ of /lib/dml/tests/fixtures/test_dml_sql_debugging_fixture.php: call to ReflectionMethod->invoke\(\) +-- line \d+ of /lib/dml/tests/fixtures/test_dml_sql_debugging_fixture.php: call to test_dml_sql_debugging_fixture->one\(\) +-- line \d+ of /lib/dml/tests/fixtures/test_dml_sql_debugging_fixture.php: call to test_dml_sql_debugging_fixture->two\(\) +-- line \d+ of /lib/dml/tests/fixtures/test_dml_sql_debugging_fixture.php: call to test_dml_sql_debugging_fixture->three\(\) +-- line \d+ of /lib/dml/tests/dml_test.php: call to test_dml_sql_debugging_fixture->four\(\) EOD; - $this->assertEquals($this->unix_to_os_dirsep($expected), $out); + $this->assertMatchesRegularExpression('@' . $this->unix_to_os_dirsep($expected) . '@', $out); $CFG->debugsqltrace = 0; } @@ -4666,7 +4667,7 @@ EOD; 'name' => 'Bob', 'falias' => 'Dan, Grace', ], - ], $DB->get_records_sql($sql)); + ], array_values($DB->get_records_sql($sql))); } /** diff --git a/lib/dml/tests/fixtures/test_dml_sql_debugging_fixture.php b/lib/dml/tests/fixtures/test_dml_sql_debugging_fixture.php index c29268c0e09..955677b132a 100644 --- a/lib/dml/tests/fixtures/test_dml_sql_debugging_fixture.php +++ b/lib/dml/tests/fixtures/test_dml_sql_debugging_fixture.php @@ -34,16 +34,14 @@ defined('MOODLE_INTERNAL') || die(); * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class test_dml_sql_debugging_fixture { - /** @var db handle */ - private $db; - /** - * constructor - * @param testcase $testcase test object + * Constructor + * @param \moodle_database $db The database handle to use for this fixture */ - public function __construct($testcase) { - $this->db = $testcase->getMockBuilder(\moodle_database::class) - ->getMockForAbstractClass(); + public function __construct( + /** @var \moodle_database The database handle to use for this fixture */ + private \moodle_database $db, + ) { } /** diff --git a/lib/dml/tests/pgsql_native_moodle_database_test.php b/lib/dml/tests/pgsql_native_moodle_database_test.php index f570f80aee2..c440e2d1263 100644 --- a/lib/dml/tests/pgsql_native_moodle_database_test.php +++ b/lib/dml/tests/pgsql_native_moodle_database_test.php @@ -29,6 +29,7 @@ use stdClass, ReflectionClass; use moodle_database, pgsql_native_moodle_database; use xmldb_table; use moodle_exception; +use PHPUnit\Framework\Attributes\WithoutErrorHandler; /** * Test specific features of the Postgres dml. @@ -396,6 +397,7 @@ final class pgsql_native_moodle_database_test extends \advanced_testcase { /** * Test SSL connection. */ + #[WithoutErrorHandler] public function test_ssl_connection(): void { $pgconnerr = 'pg_connect(): Unable to connect to PostgreSQL server:'; diff --git a/lib/filestorage/tests/zip_packer_test.php b/lib/filestorage/tests/zip_packer_test.php index cbc0ee59c32..9bece8adc6a 100644 --- a/lib/filestorage/tests/zip_packer_test.php +++ b/lib/filestorage/tests/zip_packer_test.php @@ -536,24 +536,14 @@ final class zip_packer_test extends \advanced_testcase implements file_progress unlink($textfile); // Behavior is different between old PHP versions and new ones. Let's detect it. $result = false; - try { - // Old PHP versions were not printing any warning. - $result = $zip_archive->close(); - } catch (\Exception $e) { - // New PHP versions print PHP Warning. - $this->assertInstanceOf('PHPUnit\Framework\Error\Warning', $e); - $this->assertStringContainsString('ZipArchive::close', $e->getMessage()); - } - // This is crazy, but it shows how some PHP versions do return true. - try { - // And some PHP versions do return correctly false (5.4.25, 5.6.14...) - $this->assertFalse($result); - } catch (\Exception $e) { - // But others do insist into returning true (5.6.13...). Only can accept them. - $this->assertInstanceOf('PHPUnit\Framework\ExpectationFailedException', $e); - $this->assertTrue($result); - } + + set_error_handler(function ($errno, $errstr) use (&$result) { + $result = $errstr; + $this->assertStringContainsString('ZipArchive::close', $errstr); + }, E_WARNING); + $this->assertFalse($zip_archive->close()); $this->assertFileDoesNotExist($archive); + restore_error_handler(); } /** diff --git a/lib/phpunit/classes/advanced_testcase.php b/lib/phpunit/classes/advanced_testcase.php index f7a1a357885..19667934d6c 100644 --- a/lib/phpunit/classes/advanced_testcase.php +++ b/lib/phpunit/classes/advanced_testcase.php @@ -20,6 +20,8 @@ use core\http_client; use GuzzleHttp\Handler\MockHandler; use GuzzleHttp\HandlerStack; use GuzzleHttp\Middleware; +use PHPUnit\Framework\Attributes\After; +use PHPUnit\Framework\Attributes\Before; /** * Advanced PHPUnit test case customised for Moodle. @@ -46,21 +48,16 @@ abstract class advanced_testcase extends base_testcase { * Note: use setUp() or setUpBeforeClass() in your test cases. * * @param string $name - * @param array $data - * @param string $dataName */ - final public function __construct($name = null, array $data = [], $dataname = '') { - parent::__construct($name, $data, $dataname); + final public function __construct(string $name = null) { + parent::__construct($name); $this->setBackupGlobals(false); - $this->setBackupStaticAttributes(false); $this->setPreserveGlobalState(false); } - /** - * Runs the bare test sequence. - */ - final public function runBare(): void { + #[Before] + final public function setup_test_environment(): void { global $CFG, $DB; if (phpunit_util::$lastdbwrites != $DB->perf_get_writes()) { @@ -71,28 +68,18 @@ abstract class advanced_testcase extends base_testcase { $this->testdbtransaction = $DB->start_delegated_transaction(); } - try { - $this->setCurrentTimeStart(); - parent::runBare(); - } catch (Exception $ex) { - $e = $ex; - } catch (Throwable $ex) { - // Engine errors in PHP7 throw exceptions of type Throwable (this "catch" will be ignored in PHP5). - $e = $ex; - } finally { - // Reset global state after test and test failure. - $CFG = phpunit_util::get_global_backup('CFG'); - $DB = phpunit_util::get_global_backup('DB'); + $this->setCurrentTimeStart(); + } - // We need to reset the autoloader. - \core_component::reset(); - } + #[After] + final public function teardown_test_environment(): void { + global $CFG, $DB; + // Reset global state after test and test failure. + $CFG = phpunit_util::get_global_backup('CFG'); + $DB = phpunit_util::get_global_backup('DB'); - if (isset($e)) { - // Cleanup after failed expectation. - self::resetAllData(); - throw $e; - } + // We need to reset the autoloader. + \core_component::reset(); // Deal with any debugging messages. $debugerror = phpunit_util::display_debugging_messages(true); diff --git a/lib/phpunit/classes/base_testcase.php b/lib/phpunit/classes/base_testcase.php index 4145f4ad62e..53b78beea26 100644 --- a/lib/phpunit/classes/base_testcase.php +++ b/lib/phpunit/classes/base_testcase.php @@ -1,5 +1,4 @@ numberOfInvocations(); + } + return $counter->getInvocationCount(); } // phpcs:enable + + /** + * Get an invokable object for testing. + * + * This is a helper method to create an invokable object for testing which can be used to + * track invocations, including arguments provided. + * + * This can be useful for modifications to the error handler. + * + * @return object + */ + protected static function get_invokable() { + return new class { + private array $invocations = []; + public function __invoke(...$args) { + $this->invocations[] = $args; + } + + public function get_invocations(): array { + return $this->invocations; + } + + public function get_invocation_count(): int { + return count($this->invocations); + } + + public function reset(): void { + $this->invocations = []; + } + }; + } } diff --git a/lib/phpunit/classes/basic_testcase.php b/lib/phpunit/classes/basic_testcase.php index 497f260bd90..695a2d5e7a4 100644 --- a/lib/phpunit/classes/basic_testcase.php +++ b/lib/phpunit/classes/basic_testcase.php @@ -1,4 +1,5 @@ . -/** - * Basic test case. - * - * @package core - * @category phpunit - * @copyright 2012 Petr Skoda {@link http://skodak.org} - * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - - /** * The simplest PHPUnit test case customised for Moodle * @@ -35,50 +26,26 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ abstract class basic_testcase extends base_testcase { - /** * Constructs a test case with the given name. * - * Note: use setUp() or setUpBeforeClass() in your test cases. * * @param string $name - * @param array $data - * @param string $dataName */ - final public function __construct($name = null, array $data = array(), $dataName = '') { - parent::__construct($name, $data, $dataName); + final public function __construct($name = null) { + parent::__construct($name); $this->setBackupGlobals(false); - $this->setBackupStaticAttributes(false); $this->setRunTestInSeparateProcess(false); } - /** - * Runs the bare test sequence and log any changes in global state or database. - * @return void - */ - final public function runBare(): void { + #[After] + final public function test_teardown(): void { global $DB; - try { - parent::runBare(); - - } catch (Exception $ex) { - $e = $ex; - } catch (Throwable $ex) { - // Engine errors in PHP7 throw exceptions of type Throwable (this "catch" will be ignored in PHP5). - $e = $ex; - } - - if (isset($e)) { - // cleanup after failed expectation - phpunit_util::reset_all_data(); - throw $e; - } - if ($DB->is_transaction_started()) { phpunit_util::reset_all_data(); - throw new coding_exception('basic_testcase '.$this->getName().' is not supposed to use database transactions!'); + throw new coding_exception('basic_testcase ' . $this->getName() . ' is not supposed to use database transactions!'); } phpunit_util::reset_all_data(true); diff --git a/lib/phpunit/classes/database_driver_testcase.php b/lib/phpunit/classes/database_driver_testcase.php index 9c2ec342e96..0a6e237261a 100644 --- a/lib/phpunit/classes/database_driver_testcase.php +++ b/lib/phpunit/classes/database_driver_testcase.php @@ -1,4 +1,6 @@ setBackupGlobals(false); - $this->setBackupStaticAttributes(false); $this->setRunTestInSeparateProcess(false); } @@ -101,9 +100,9 @@ abstract class database_driver_testcase extends base_testcase { self::$extradb = $d; } - protected function setUp(): void { + #[Before] + protected function setup_extradb(): void { global $DB; - parent::setUp(); if (self::$extradb) { $this->tdb = self::$extradb; @@ -112,7 +111,8 @@ abstract class database_driver_testcase extends base_testcase { } } - protected function tearDown(): void { + #[After] + protected function teardown_extradb(): void { // delete all test tables $dbman = $this->tdb->get_manager(); $tables = $this->tdb->get_tables(false); @@ -122,7 +122,6 @@ abstract class database_driver_testcase extends base_testcase { $dbman->drop_table($table); } } - parent::tearDown(); } public static function tearDownAfterClass(): void { @@ -134,34 +133,13 @@ abstract class database_driver_testcase extends base_testcase { parent::tearDownAfterClass(); } - /** - * Runs the bare test sequence. - * @return void - */ - public function runBare(): void { - try { - parent::runBare(); - - // Deal with any debugging messages. - $debugerror = phpunit_util::display_debugging_messages(true); - $this->resetDebugging(); - if (!empty($debugerror)) { - trigger_error('Unexpected debugging() call detected.' . "\n" . $debugerror, E_USER_NOTICE); - } - - } catch (Exception $ex) { - $e = $ex; - } catch (Throwable $ex) { - // Engine errors in PHP7 throw exceptions of type Throwable (this "catch" will be ignored in PHP5). - $e = $ex; - } - - if (isset($e)) { - if ($this->tdb->is_transaction_started()) { - $this->tdb->force_transaction_rollback(); - } - $this->tearDown(); - throw $e; + #[After] + public function check_debugging(): void { + // Deal with any debugging messages. + $debugerror = phpunit_util::display_debugging_messages(true); + $this->resetDebugging(); + if (!empty($debugerror)) { + trigger_error('Unexpected debugging() call detected.' . "\n" . $debugerror, E_USER_NOTICE); } } diff --git a/lib/phpunit/classes/exception/test_exception.php b/lib/phpunit/classes/exception/test_exception.php new file mode 100644 index 00000000000..c9257bd33b7 --- /dev/null +++ b/lib/phpunit/classes/exception/test_exception.php @@ -0,0 +1,27 @@ +. + +namespace core_phpunit\exception; + +/** + * An exception thrown when an error is encountered in the setup, teardown, or other non-test parts of a unit test. + * + * @package core_testing + * @copyright Andrew Lyons + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class test_exception extends \core\exception\coding_exception { +} diff --git a/lib/phpunit/classes/util.php b/lib/phpunit/classes/util.php index 1ad2fde17a6..765aae2dff3 100644 --- a/lib/phpunit/classes/util.php +++ b/lib/phpunit/classes/util.php @@ -314,7 +314,7 @@ class phpunit_util extends testing_util { if ($warnings) { $warnings = implode("\n", $warnings); - trigger_error($warnings, E_USER_WARNING); + throw new \core_phpunit\exception\test_exception($warnings); } } diff --git a/lib/phpunit/phpunit.xsd b/lib/phpunit/phpunit.xsd index 3785d21fef7..480d54decab 100644 --- a/lib/phpunit/phpunit.xsd +++ b/lib/phpunit/phpunit.xsd @@ -2,7 +2,7 @@ - This Schema file defines the rules by which the XML configuration file of PHPUnit 9.5 may be structured. + This Schema file defines the rules by which the XML configuration file of PHPUnit 10.0 may be structured. @@ -32,7 +32,6 @@ - @@ -57,62 +56,19 @@ - + - + - - - - - - - - - - + - - - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -135,7 +91,7 @@ - + @@ -207,19 +163,14 @@ - + + - - - - - - - + @@ -235,37 +186,36 @@ - - + - - - - + - + + + + + + - - @@ -279,8 +229,10 @@ - - + + + + @@ -301,8 +253,6 @@ - - @@ -319,6 +269,12 @@ + + + + + + diff --git a/lib/phpunit/tests/advanced_test.php b/lib/phpunit/tests/advanced_test.php index 1c38394b28e..c3313a3eb83 100644 --- a/lib/phpunit/tests/advanced_test.php +++ b/lib/phpunit/tests/advanced_test.php @@ -16,6 +16,8 @@ namespace core; +use core_phpunit\exception\test_exception; + /** * Test advanced_testcase extra features. * @@ -216,28 +218,29 @@ final class advanced_test extends \advanced_testcase { // Database change. $this->assertEquals(1, $DB->get_field('user', 'confirmed', array('id'=>2))); $DB->set_field('user', 'confirmed', 0, array('id'=>2)); + try { self::resetAllData(true); - } catch (\Exception $e) { - $this->assertInstanceOf('PHPUnit\Framework\Error\Warning', $e); + } catch (test_exception $e) { + $this->assertStringContainsString('unexpected database modification', $e->getMessage()); } - $this->assertEquals(1, $DB->get_field('user', 'confirmed', array('id'=>2))); + $this->assertEquals(1, $DB->get_field('user', 'confirmed', array('id'=>2))); // Config change. $CFG->xx = 'yy'; unset($CFG->admin); $CFG->rolesactive = 0; + try { self::resetAllData(true); - } catch (\Exception $e) { - $this->assertInstanceOf('PHPUnit\Framework\Error\Warning', $e); + } catch (test_exception $e) { $this->assertStringContainsString('xx', $e->getMessage()); $this->assertStringContainsString('admin', $e->getMessage()); $this->assertStringContainsString('rolesactive', $e->getMessage()); + $this->assertFalse(isset($CFG->xx)); + $this->assertTrue(isset($CFG->admin)); + $this->assertEquals(1, $CFG->rolesactive); } - $this->assertFalse(isset($CFG->xx)); - $this->assertTrue(isset($CFG->admin)); - $this->assertEquals(1, $CFG->rolesactive); // _GET change. $_GET['__somethingthatwillnotnormallybepresent__'] = 'yy'; @@ -269,23 +272,28 @@ final class advanced_test extends \advanced_testcase { $SITE->id = 10; $COURSE = new \stdClass(); $COURSE->id = 7; + try { self::resetAllData(true); - } catch (\Exception $e) { - $this->assertInstanceOf('PHPUnit\Framework\Error\Warning', $e); - $this->assertEquals(1, $SITE->id); - $this->assertSame($SITE, $COURSE); - $this->assertSame($SITE, $COURSE); + } catch (test_exception $e) { + $this->assertStringContainsString('unexpected change of $COURSE', $e->getMessage()); } + $this->assertEquals(1, $SITE->id); + $this->assertSame($SITE, $COURSE); + $this->assertSame($SITE, $COURSE); + // USER change. $this->setUser(2); + try { self::resetAllData(true); - } catch (\Exception $e) { - $this->assertInstanceOf('PHPUnit\Framework\Error\Warning', $e); - $this->assertEquals(0, $USER->id); + } catch (test_exception $e) { + $this->assertStringContainsString('unexpected change of $USER', $e->getMessage()); } + + $this->assertEquals(0, $USER->id); + } public function test_getDataGenerator(): void { @@ -642,8 +650,8 @@ final class advanced_test extends \advanced_testcase { try { self::resetAllData(true); - } catch (\Exception $e) { - $this->assertInstanceOf('PHPUnit\Framework\Error\Warning', $e); + } catch (test_exception $e) { + $this->assertStringContainsString('unexpected change of locale', $e->getMessage()); } if ($CFG->ostype === 'WINDOWS') { diff --git a/lib/phpunit/tests/basic_test.php b/lib/phpunit/tests/basic_test.php index 0fdb19db168..17fa667bfd0 100644 --- a/lib/phpunit/tests/basic_test.php +++ b/lib/phpunit/tests/basic_test.php @@ -16,6 +16,7 @@ namespace core; +use PHPUnit\Framework\Attributes\WithoutErrorHandler; use phpunit_util; /** @@ -235,16 +236,7 @@ STRING; global $DB; $DB->set_field('user', 'confirmed', 1, ['id' => -1]); - // Let's convert the user warnings into an assert-able exception. - set_error_handler( - static function ($errno, $errstr) { - restore_error_handler(); - throw new \Exception($errstr, $errno); - }, - E_USER_WARNING // Or any other specific E_ that we want to assert. - ); - - $this->expectException(\Exception::class); + $this->expectException(\core_phpunit\exception\test_exception::class); $this->expectExceptionMessage('Warning: unexpected database modification'); phpunit_util::reset_all_data(true); } @@ -261,15 +253,6 @@ STRING; unset($CFG->admin); $CFG->rolesactive = 0; - // Let's convert the user warnings into an assert-able exception. - set_error_handler( - static function ($errno, $errstr) { - restore_error_handler(); - throw new \Exception($errstr, $errno); - }, - E_USER_WARNING // Or any other specific E_ that we want to assert. - ); - $this->expectException(\Exception::class); $this->expectExceptionMessageMatches('/rolesactive.*xx value.*removal.*admin/ms'); // 3 messages matched. phpunit_util::reset_all_data(true); @@ -285,15 +268,6 @@ STRING; global $USER; $USER->id = 10; - // Let's convert the user warnings into an assert-able exception. - set_error_handler( - static function ($errno, $errstr) { - restore_error_handler(); - throw new \Exception($errstr, $errno); - }, - E_USER_WARNING // Or any other specific E_ that we want to assert. - ); - $this->expectException(\Exception::class); $this->expectExceptionMessage('Warning: unexpected change of $USER'); phpunit_util::reset_all_data(true); @@ -309,15 +283,6 @@ STRING; global $COURSE; $COURSE->id = 10; - // Let's convert the user warnings into an assert-able exception. - set_error_handler( - static function ($errno, $errstr) { - restore_error_handler(); - throw new \Exception($errstr, $errno); - }, - E_USER_WARNING // Or any other specific E_ that we want to assert. - ); - $this->expectException(\Exception::class); $this->expectExceptionMessage('Warning: unexpected change of $COURSE'); phpunit_util::reset_all_data(true); @@ -338,15 +303,6 @@ STRING; $USER->id = 10; $COURSE->id = 10; - // Let's convert the user warnings into an assert-able exception. - set_error_handler( - static function ($errno, $errstr) { - restore_error_handler(); - throw new \Exception($errstr, $errno); - }, - E_USER_WARNING // Or any other specific E_ that we want to assert. - ); - $this->expectException(\Exception::class); $this->expectExceptionMessageMatches('/resetting.*rolesactive.*new.*removal.*USER.*COURSE/ms'); // 6 messages matched. phpunit_util::reset_all_data(true); diff --git a/lib/testing/classes/privacy/provider.php b/lib/testing/classes/privacy/provider.php new file mode 100644 index 00000000000..6679ed1d34d --- /dev/null +++ b/lib/testing/classes/privacy/provider.php @@ -0,0 +1,65 @@ +. + +/** + * Privacy Subsystem implementation for core_cache. + * + * @package core_cache + * @copyright 2018 Andrew Nicols + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace core_cache\privacy; + +use core_privacy\local\metadata\collection; + +/** + * Privacy Subsystem implementation for core_cache. + * + * @copyright 2018 Andrew Nicols + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class provider implements + // Caches store data. + \core_privacy\local\metadata\provider, + + // The cache subsystem stores data on behalf of other components. + \core_privacy\local\request\subsystem\plugin_provider, + \core_privacy\local\request\shared_userlist_provider +{ + /** + * Returns meta data about this system. + * + * Note, although this plugin does store user data, it is not able to + * identify it, and that user data is typically very short lived. + * + * Therefore it is not realistically possible to export any of this + * data as it is only identifiable by the plugin storing it, and that + * plugin should already be exporting the data as part of it's own + * implementation. + * + * @param collection $collection The initialised collection to add items to. + * @return collection A listing of user data stored through this system. + */ + public static function get_metadata(collection $collection): collection { + // Data is stored in cache stores. + $collection->add_plugintype_link('cachestore', [], 'privacy:metadata:cachestore'); + + // Cache locks do not store any personal user data. + + return $collection; + } +} diff --git a/lib/tests/completionlib_test.php b/lib/tests/completionlib_test.php index 47bd8331616..e2df63d8140 100644 --- a/lib/tests/completionlib_test.php +++ b/lib/tests/completionlib_test.php @@ -76,7 +76,7 @@ final class completionlib_test extends advanced_testcase { * @param boolean $canonicalize * @param boolean $ignoreCase */ - public static function assertEquals($expected, $actual, string $message = '', float $delta = 0, int $maxDepth = 10, + public static function assertCompletionEquals($expected, $actual, string $message = '', float $delta = 0, int $maxDepth = 10, bool $canonicalize = false, bool $ignoreCase = false): void { // Nasty cheating hack: prevent random failures on timemodified field. if (is_array($actual) && (is_object($expected) || is_array($expected))) { @@ -104,33 +104,33 @@ final class completionlib_test extends advanced_testcase { // Config alone. $CFG->enablecompletion = COMPLETION_DISABLED; - $this->assertEquals(COMPLETION_DISABLED, completion_info::is_enabled_for_site()); + $this->assertCompletionEquals(COMPLETION_DISABLED, completion_info::is_enabled_for_site()); $CFG->enablecompletion = COMPLETION_ENABLED; - $this->assertEquals(COMPLETION_ENABLED, completion_info::is_enabled_for_site()); + $this->assertCompletionEquals(COMPLETION_ENABLED, completion_info::is_enabled_for_site()); // Course. $course = (object)array('id' => 13); $c = new completion_info($course); $course->enablecompletion = COMPLETION_DISABLED; - $this->assertEquals(COMPLETION_DISABLED, $c->is_enabled()); + $this->assertCompletionEquals(COMPLETION_DISABLED, $c->is_enabled()); $course->enablecompletion = COMPLETION_ENABLED; - $this->assertEquals(COMPLETION_ENABLED, $c->is_enabled()); + $this->assertCompletionEquals(COMPLETION_ENABLED, $c->is_enabled()); $CFG->enablecompletion = COMPLETION_DISABLED; - $this->assertEquals(COMPLETION_DISABLED, $c->is_enabled()); + $this->assertCompletionEquals(COMPLETION_DISABLED, $c->is_enabled()); // Course and CM. $cm = new stdClass(); $cm->completion = COMPLETION_TRACKING_MANUAL; - $this->assertEquals(COMPLETION_DISABLED, $c->is_enabled($cm)); + $this->assertCompletionEquals(COMPLETION_DISABLED, $c->is_enabled($cm)); $CFG->enablecompletion = COMPLETION_ENABLED; $course->enablecompletion = COMPLETION_DISABLED; - $this->assertEquals(COMPLETION_DISABLED, $c->is_enabled($cm)); + $this->assertCompletionEquals(COMPLETION_DISABLED, $c->is_enabled($cm)); $course->enablecompletion = COMPLETION_ENABLED; - $this->assertEquals(COMPLETION_TRACKING_MANUAL, $c->is_enabled($cm)); + $this->assertCompletionEquals(COMPLETION_TRACKING_MANUAL, $c->is_enabled($cm)); $cm->completion = COMPLETION_TRACKING_NONE; - $this->assertEquals(COMPLETION_TRACKING_NONE, $c->is_enabled($cm)); + $this->assertCompletionEquals(COMPLETION_TRACKING_NONE, $c->is_enabled($cm)); $cm->completion = COMPLETION_TRACKING_AUTOMATIC; - $this->assertEquals(COMPLETION_TRACKING_AUTOMATIC, $c->is_enabled($cm)); + $this->assertCompletionEquals(COMPLETION_TRACKING_AUTOMATIC, $c->is_enabled($cm)); } /** @@ -281,11 +281,11 @@ final class completionlib_test extends advanced_testcase { ): void { switch (self::getInvocationCount($setinvocations)) { case 1: - $this->assertEquals($cm, $comparecm); + $this->assertCompletionEquals($cm, $comparecm); $comparewith1->evaluate($comparewith); break; case 2: - $this->assertEquals($cm, $comparecm); + $this->assertCompletionEquals($cm, $comparecm); $comparewith2->evaluate($comparewith); break; default: @@ -407,7 +407,7 @@ final class completionlib_test extends advanced_testcase { $current = (object)['viewed' => COMPLETION_NOT_VIEWED]; $completioninfo = new completion_info($this->course); - $this->assertEquals($expectedstate, $completioninfo->internal_get_state($cm, $userid, $current)); + $this->assertCompletionEquals($expectedstate, $completioninfo->internal_get_state($cm, $userid, $current)); } /** @@ -503,7 +503,7 @@ final class completionlib_test extends advanced_testcase { // The target user already received a grade, so internal_get_state should be already complete. $completioninfo = new completion_info($this->course); - $this->assertEquals($expectedstate, $completioninfo->internal_get_state($cm, $userid, null)); + $this->assertCompletionEquals($expectedstate, $completioninfo->internal_get_state($cm, $userid, null)); } /** @@ -544,10 +544,10 @@ final class completionlib_test extends advanced_testcase { // The target user already received a grade, so internal_get_state should be already complete. $completioninfo = new completion_info($this->course); - $this->assertEquals(COMPLETION_COMPLETE, $completioninfo->internal_get_state($cm, $userid, null)); + $this->assertCompletionEquals(COMPLETION_COMPLETE, $completioninfo->internal_get_state($cm, $userid, null)); // As the teacher which does not have a grade in this cm, internal_get_state should return incomplete. - $this->assertEquals(COMPLETION_INCOMPLETE, $completioninfo->internal_get_state($cm, $teacher->id, null)); + $this->assertCompletionEquals(COMPLETION_INCOMPLETE, $completioninfo->internal_get_state($cm, $teacher->id, null)); } /** @@ -570,14 +570,14 @@ final class completionlib_test extends advanced_testcase { // Fetch completion for the user who hasn't made a choice yet. $completion = $completioninfo->internal_get_state($cminfo, $this->user->id, COMPLETION_INCOMPLETE); - $this->assertEquals(COMPLETION_INCOMPLETE, $completion); + $this->assertCompletionEquals(COMPLETION_INCOMPLETE, $completion); // Have the user make a choice. $choicewithoptions = choice_get_choice($choice->id); $optionids = array_keys($choicewithoptions->option); choice_user_submit_response($optionids[0], $choice, $this->user->id, $this->course, $cminfo); $completion = $completioninfo->internal_get_state($cminfo, $this->user->id, COMPLETION_INCOMPLETE); - $this->assertEquals(COMPLETION_COMPLETE, $completion); + $this->assertCompletionEquals(COMPLETION_COMPLETE, $completion); } /** @@ -654,7 +654,7 @@ final class completionlib_test extends advanced_testcase { ->will($this->returnValue(666)); $c = new completion_info($course); - $this->assertEquals(666, $c->count_user_data($cm)); + $this->assertCompletionEquals(666, $c->count_user_data($cm)); } /** @@ -712,17 +712,17 @@ final class completionlib_test extends advanced_testcase { $c->expects($updateinvocations) ->method('update_state') ->willReturnCallback(function ($comparecm, $state, $userid) use ($updateinvocations, $cm): void { - $this->assertEquals($cm, $comparecm); - $this->assertEquals(COMPLETION_UNKNOWN, $state); + $this->assertCompletionEquals($cm, $comparecm); + $this->assertCompletionEquals(COMPLETION_UNKNOWN, $state); switch (self::getInvocationCount($updateinvocations)) { case 1: - $this->assertEquals(100, $userid); + $this->assertCompletionEquals(100, $userid); break; case 2: - $this->assertEquals(101, $userid); + $this->assertCompletionEquals(101, $userid); break; case 3: - $this->assertEquals(201, $userid); + $this->assertCompletionEquals(201, $userid); break; default: $this->fail('Unexpected invocation count'); @@ -820,15 +820,15 @@ final class completionlib_test extends advanced_testcase { $result = $completioninfo->get_data($cm, $wholecourse, $user->id); // Course module ID of the returned completion data must match this activity's course module ID. - $this->assertEquals($cm->id, $result->coursemoduleid); + $this->assertCompletionEquals($cm->id, $result->coursemoduleid); // User ID of the returned completion data must match the user's ID. - $this->assertEquals($user->id, $result->userid); + $this->assertCompletionEquals($user->id, $result->userid); // The completion state of the returned completion data must match the expected completion state. - $this->assertEquals($completion, $result->completionstate); + $this->assertCompletionEquals($completion, $result->completionstate); // If the user has no completion record, then the default record should be returned. if (!$hasrecord) { - $this->assertEquals(0, $result->id); + $this->assertCompletionEquals(0, $result->id); } // Check that we are including relevant completion data for the module. @@ -889,8 +889,8 @@ final class completionlib_test extends advanced_testcase { $this->assertTrue(property_exists($result, 'timemodified')); $this->assertFalse(property_exists($result, 'other_cm_completion_data_fetched')); - $this->assertEquals($testcm->id, $result->coursemoduleid); - $this->assertEquals($this->user->id, $result->userid); + $this->assertCompletionEquals($testcm->id, $result->coursemoduleid); + $this->assertCompletionEquals($this->user->id, $result->userid); $results[$testcm->id] = $result; } @@ -902,7 +902,7 @@ final class completionlib_test extends advanced_testcase { (cache::make('core', 'completion'))->purge(); foreach ($modinfo->cms as $testcm) { $result = $completioninfo->get_data($testcm, false); - $this->assertEquals($result, $results[$testcm->id]); + $this->assertCompletionEquals($result, $results[$testcm->id]); } } @@ -939,13 +939,13 @@ final class completionlib_test extends advanced_testcase { $completiondatabeforeview = $completioninfo->get_completion_data($cm->id, $this->user->id, $defaultdata); $this->assertTrue(array_key_exists('viewed', $completiondatabeforeview)); $this->assertTrue(array_key_exists('coursemoduleid', $completiondatabeforeview)); - $this->assertEquals(0, $completiondatabeforeview['viewed']); - $this->assertEquals($cm->id, $completiondatabeforeview['coursemoduleid']); + $this->assertCompletionEquals(0, $completiondatabeforeview['viewed']); + $this->assertCompletionEquals($cm->id, $completiondatabeforeview['coursemoduleid']); // Mark as completed before viewing it. $completioninfo->update_state($cm, COMPLETION_COMPLETE, $this->user->id, true); $completiondatabeforeview = $completioninfo->get_completion_data($cm->id, $this->user->id, $defaultdata); - $this->assertEquals(0, $completiondatabeforeview['viewed']); + $this->assertCompletionEquals(0, $completiondatabeforeview['viewed']); // Set viewed. $completioninfo->set_module_viewed($cm, $this->user->id); @@ -953,16 +953,16 @@ final class completionlib_test extends advanced_testcase { $completiondata = $completioninfo->get_completion_data($cm->id, $this->user->id, $defaultdata); $this->assertTrue(array_key_exists('viewed', $completiondata)); $this->assertTrue(array_key_exists('coursemoduleid', $completiondata)); - $this->assertEquals(1, $completiondata['viewed']); - $this->assertEquals($cm->id, $completiondatabeforeview['coursemoduleid']); + $this->assertCompletionEquals(1, $completiondata['viewed']); + $this->assertCompletionEquals($cm->id, $completiondatabeforeview['coursemoduleid']); $completioninfo->reset_all_state($cm); $completiondataafterreset = $completioninfo->get_completion_data($cm->id, $this->user->id, $defaultdata); $this->assertTrue(array_key_exists('viewed', $completiondataafterreset)); $this->assertTrue(array_key_exists('coursemoduleid', $completiondataafterreset)); - $this->assertEquals(1, $completiondataafterreset['viewed']); - $this->assertEquals($cm->id, $completiondatabeforeview['coursemoduleid']); + $this->assertCompletionEquals(1, $completiondataafterreset['viewed']); + $this->assertCompletionEquals($cm->id, $completiondatabeforeview['coursemoduleid']); } /** @@ -1014,7 +1014,7 @@ final class completionlib_test extends advanced_testcase { $this->assertArrayHasKey('customcompletion', $choicecompletiondata); $this->assertArrayHasKey('completionsubmit', $choicecompletiondata['customcompletion']); - $this->assertEquals(COMPLETION_INCOMPLETE, $choicecompletiondata['customcompletion']['completionsubmit']); + $this->assertCompletionEquals(COMPLETION_INCOMPLETE, $choicecompletiondata['customcompletion']['completionsubmit']); // Mock a choice answer so user has completed the requirement. $choicemockinfo = [ @@ -1025,7 +1025,7 @@ final class completionlib_test extends advanced_testcase { // Confirm fetching again reflects the completion. $choicecompletiondata = $method->invoke($completioninfo, $cmchoice, $user->id); - $this->assertEquals(COMPLETION_COMPLETE, $choicecompletiondata['customcompletion']['completionsubmit']); + $this->assertCompletionEquals(COMPLETION_COMPLETE, $choicecompletiondata['customcompletion']['completionsubmit']); // Check that fetching data for a module with no custom completion still provides its grade completion status. $workshopcompletiondata = $method->invoke($completioninfo, $cmworkshop, $user->id); @@ -1033,8 +1033,8 @@ final class completionlib_test extends advanced_testcase { $this->assertArrayHasKey('completiongrade', $workshopcompletiondata); $this->assertArrayHasKey('passgrade', $workshopcompletiondata); $this->assertArrayNotHasKey('customcompletion', $workshopcompletiondata); - $this->assertEquals(COMPLETION_INCOMPLETE, $workshopcompletiondata['completiongrade']); - $this->assertEquals(COMPLETION_INCOMPLETE, $workshopcompletiondata['passgrade']); + $this->assertCompletionEquals(COMPLETION_INCOMPLETE, $workshopcompletiondata['completiongrade']); + $this->assertCompletionEquals(COMPLETION_INCOMPLETE, $workshopcompletiondata['passgrade']); // Check that fetching data for a module with no completion conditions does not provide any data. $choice2completiondata = $method->invoke($completioninfo, $cmchoice2, $user->id); @@ -1066,11 +1066,11 @@ final class completionlib_test extends advanced_testcase { $c->internal_set_data($cm, $data); $d1 = $DB->get_field('course_modules_completion', 'id', array('coursemoduleid' => $cm->id)); - $this->assertEquals($d1, $data->id); + $this->assertCompletionEquals($d1, $data->id); $cache = cache::make('core', 'completion'); // Cache was not set for another user. $cachevalue = $cache->get("{$data->userid}_{$cm->course}"); - $this->assertEquals([ + $this->assertCompletionEquals([ 'cacherev' => $this->course->cacherev, $cm->id => array_merge( (array) $data, @@ -1095,13 +1095,13 @@ final class completionlib_test extends advanced_testcase { $c->internal_set_data($cm2, $d2); // Cache for current user returns the data. $cachevalue = $cache->get($data->userid . '_' . $cm->course); - $this->assertEquals(array_merge( + $this->assertCompletionEquals(array_merge( (array) $data, ['other_cm_completion_data_fetched' => true] ), $cachevalue[$cm->id]); // Cache for another user is not filled. - $this->assertEquals(false, $cache->get($d2->userid . '_' . $cm2->course)); + $this->assertCompletionEquals(false, $cache->get($d2->userid . '_' . $cm2->course)); // 3) Test where it THINKS the data is new (from cache) but actually in the database it has been set since. $forum3 = $this->getDataGenerator()->create_module('forum', array('course' => $this->course->id), $completionauto); @@ -1141,14 +1141,14 @@ final class completionlib_test extends advanced_testcase { $data->coursemoduleid = $cm->id; $c->internal_set_data($cm, $data); $actual = $DB->get_records('course_completions'); - $this->assertEquals(1, count($actual)); - $this->assertEquals($this->user->id, reset($actual)->userid); + $this->assertCompletionEquals(1, count($actual)); + $this->assertCompletionEquals($this->user->id, reset($actual)->userid); $data->userid = $newuser2->id; $c->internal_set_data($cm, $data, true); $actual = $DB->get_records('course_completions'); - $this->assertEquals(1, count($actual)); - $this->assertEquals($this->user->id, reset($actual)->userid); + $this->assertCompletionEquals(1, count($actual)); + $this->assertCompletionEquals($this->user->id, reset($actual)->userid); } /** @@ -1180,7 +1180,7 @@ final class completionlib_test extends advanced_testcase { ->method('get_recordset_sql') ->will($this->returnValue(new core_completionlib_fake_recordset(array($progress1, $progress2)))); - $this->assertEquals(array( + $this->assertCompletionEquals(array( 100 => (object)array('id' => 100, 'firstname' => 'Woot', 'lastname' => 'Plugh', 'progress' => array(13 => $progress1)), 201 => (object)array('id' => 201, 'firstname' => 'Vroom', 'lastname' => 'Xyzzy', @@ -1220,10 +1220,10 @@ final class completionlib_test extends advanced_testcase { ->willReturnCallback(function ($paramids) use ($inorequalsinvocations, $ids) { switch (self::getInvocationCount($inorequalsinvocations)) { case 1: - $this->assertEquals(array_slice($ids, 0, 1000), $paramids); + $this->assertCompletionEquals(array_slice($ids, 0, 1000), $paramids); return [' IN whatever', []]; case 2: - $this->assertEquals(array_slice($ids, 1000), $paramids); + $this->assertCompletionEquals(array_slice($ids, 1000), $paramids); return [' IN whatever2', []]; default: $this->fail('Unexpected invocation count'); @@ -1343,32 +1343,32 @@ final class completionlib_test extends advanced_testcase { $grade->finalgrade = null; // Grade has pass mark and is not hidden, user passes. - $this->assertEquals( + $this->assertCompletionEquals( COMPLETION_COMPLETE_PASS, completion_info::internal_get_grade_state($item, $grade)); // Same but user fails. $grade->rawgrade = 3.9; - $this->assertEquals( + $this->assertCompletionEquals( COMPLETION_COMPLETE_FAIL, completion_info::internal_get_grade_state($item, $grade)); // User fails on raw grade but passes on final. $grade->finalgrade = 4.0; - $this->assertEquals( + $this->assertCompletionEquals( COMPLETION_COMPLETE_PASS, completion_info::internal_get_grade_state($item, $grade)); // Item is hidden. $item->hidden = 1; - $this->assertEquals( + $this->assertCompletionEquals( COMPLETION_COMPLETE, completion_info::internal_get_grade_state($item, $grade)); // Item isn't hidden but has no pass mark. $item->hidden = 0; $item->gradepass = 0; - $this->assertEquals( + $this->assertCompletionEquals( COMPLETION_COMPLETE, completion_info::internal_get_grade_state($item, $grade)); @@ -1376,7 +1376,7 @@ final class completionlib_test extends advanced_testcase { $item->hidden = 1; $item->gradepass = 4; $grade->finalgrade = 5.0; - $this->assertEquals( + $this->assertCompletionEquals( COMPLETION_COMPLETE_PASS, completion_info::internal_get_grade_state($item, $grade, true)); @@ -1384,7 +1384,7 @@ final class completionlib_test extends advanced_testcase { $item->hidden = 1; $item->gradepass = 4; $grade->finalgrade = 3.0; - $this->assertEquals( + $this->assertCompletionEquals( COMPLETION_COMPLETE_FAIL_HIDDEN, completion_info::internal_get_grade_state($item, $grade, true)); @@ -1392,7 +1392,7 @@ final class completionlib_test extends advanced_testcase { $item->hidden = 0; $item->gradepass = 4; $grade->finalgrade = 3.0; - $this->assertEquals( + $this->assertCompletionEquals( COMPLETION_COMPLETE_FAIL, completion_info::internal_get_grade_state($item, $grade, true)); } @@ -1522,9 +1522,9 @@ final class completionlib_test extends advanced_testcase { $c = new completion_info($this->course); $activities = $c->get_activities(); - $this->assertEquals(1, count($activities)); + $this->assertCompletionEquals(1, count($activities)); $this->assertTrue(isset($activities[$forum->cmid])); - $this->assertEquals($activities[$forum->cmid]->name, $forum->name); + $this->assertCompletionEquals($activities[$forum->cmid]->name, $forum->name); $current = $c->get_data($activities[$forum->cmid], false, $this->user->id); $current->completionstate = COMPLETION_COMPLETE; @@ -1534,12 +1534,12 @@ final class completionlib_test extends advanced_testcase { $events = $sink->get_events(); $event = reset($events); $this->assertInstanceOf('\core\event\course_module_completion_updated', $event); - $this->assertEquals($forum->cmid, + $this->assertCompletionEquals($forum->cmid, $event->get_record_snapshot('course_modules_completion', $event->objectid)->coursemoduleid); - $this->assertEquals($current, $event->get_record_snapshot('course_modules_completion', $event->objectid)); - $this->assertEquals(context_module::instance($forum->cmid), $event->get_context()); - $this->assertEquals($USER->id, $event->userid); - $this->assertEquals($this->user->id, $event->relateduserid); + $this->assertCompletionEquals($current, $event->get_record_snapshot('course_modules_completion', $event->objectid)); + $this->assertCompletionEquals(context_module::instance($forum->cmid), $event->get_context()); + $this->assertCompletionEquals($USER->id, $event->userid); + $this->assertCompletionEquals($this->user->id, $event->relateduserid); $this->assertInstanceOf('moodle_url', $event->get_url()); } @@ -1564,11 +1564,11 @@ final class completionlib_test extends advanced_testcase { $event = reset($events); $this->assertInstanceOf('\core\event\course_completed', $event); - $this->assertEquals($this->course->id, $event->get_record_snapshot('course_completions', $event->objectid)->course); - $this->assertEquals($this->course->id, $event->courseid); - $this->assertEquals($USER->id, $event->userid); - $this->assertEquals($this->user->id, $event->relateduserid); - $this->assertEquals(context_course::instance($this->course->id), $event->get_context()); + $this->assertCompletionEquals($this->course->id, $event->get_record_snapshot('course_completions', $event->objectid)->course); + $this->assertCompletionEquals($this->course->id, $event->courseid); + $this->assertCompletionEquals($USER->id, $event->userid); + $this->assertCompletionEquals($this->user->id, $event->relateduserid); + $this->assertCompletionEquals(context_course::instance($this->course->id), $event->get_context()); $this->assertInstanceOf('moodle_url', $event->get_url()); } @@ -1593,10 +1593,10 @@ final class completionlib_test extends advanced_testcase { $this->assertCount(1, $messages); $message = array_pop($messages); - $this->assertEquals(core_user::get_noreply_user()->id, $message->useridfrom); - $this->assertEquals($this->user->id, $message->useridto); - $this->assertEquals('coursecompleted', $message->eventtype); - $this->assertEquals(get_string('coursecompleted', 'completion'), $message->subject); + $this->assertCompletionEquals(core_user::get_noreply_user()->id, $message->useridfrom); + $this->assertCompletionEquals($this->user->id, $message->useridto); + $this->assertCompletionEquals('coursecompleted', $message->eventtype); + $this->assertCompletionEquals(get_string('coursecompleted', 'completion'), $message->subject); $this->assertStringContainsString($this->course->fullname, $message->fullmessage); } @@ -1623,8 +1623,8 @@ final class completionlib_test extends advanced_testcase { $sink->close(); $this->assertInstanceOf('\core\event\course_completion_updated', $event); - $this->assertEquals($this->course->id, $event->courseid); - $this->assertEquals($coursecontext, $event->get_context()); + $this->assertCompletionEquals($this->course->id, $event->courseid); + $this->assertCompletionEquals($coursecontext, $event->get_context()); $this->assertInstanceOf('moodle_url', $event->get_url()); } @@ -1694,7 +1694,7 @@ final class completionlib_test extends advanced_testcase { $this->expectException($expectedexception); } $gradecompletion = $completioninfo->get_grade_completion($cm, $this->user->id); - $this->assertEquals($expectedresult, $gradecompletion); + $this->assertCompletionEquals($expectedresult, $gradecompletion); } /** @@ -1725,7 +1725,7 @@ final class completionlib_test extends advanced_testcase { // Without the grade_item, the activity is considered incomplete. $completioninfo = new completion_info($this->course); - $this->assertEquals(COMPLETION_INCOMPLETE, $completioninfo->get_grade_completion($cm, $this->user->id)); + $this->assertCompletionEquals(COMPLETION_INCOMPLETE, $completioninfo->get_grade_completion($cm, $this->user->id)); // Once the activity is graded, the grade_item is automatically created. $assigninstance = new assign($cm->context, $cm, $this->course); @@ -1734,7 +1734,7 @@ final class completionlib_test extends advanced_testcase { $assigninstance->update_grade($grade); // The implicitly created grade_item does not have grade to pass defined so it is not distinguished. - $this->assertEquals(COMPLETION_COMPLETE, $completioninfo->get_grade_completion($cm, $this->user->id)); + $this->assertCompletionEquals(COMPLETION_COMPLETE, $completioninfo->get_grade_completion($cm, $this->user->id)); } /** @@ -1868,8 +1868,8 @@ final class completionlib_test extends advanced_testcase { $method = new ReflectionMethod($ccompletion, '_save'); $completionid = $method->invoke($ccompletion); $completions = $DB->get_records('course_completions'); - $this->assertEquals(count($completions), 1); - $this->assertEquals(reset($completions)->id, $completionid); + $this->assertCompletionEquals(count($completions), 1); + $this->assertCompletionEquals(reset($completions)->id, $completionid); $ccompletion->id = 0; $method = new ReflectionMethod($ccompletion, '_save'); @@ -1910,15 +1910,15 @@ final class completionlib_test extends advanced_testcase { $completionid = $ccompletion->mark_enrolled(); $completions = $DB->get_records('course_completions'); - $this->assertEquals(count($completions), 1); - $this->assertEquals(reset($completions)->id, $completionid); + $this->assertCompletionEquals(count($completions), 1); + $this->assertCompletionEquals(reset($completions)->id, $completionid); $ccompletion->id = 0; $completionid = $ccompletion->mark_enrolled(); $this->assertDebuggingCalled('Can not update data object, no id!'); $this->assertNull($completionid); $completions = $DB->get_records('course_completions'); - $this->assertEquals(1, count($completions)); + $this->assertCompletionEquals(1, count($completions)); } /** @@ -1953,15 +1953,15 @@ final class completionlib_test extends advanced_testcase { $completionid = $ccompletion->mark_inprogress(); $completions = $DB->get_records('course_completions'); - $this->assertEquals(1, count($completions)); - $this->assertEquals(reset($completions)->id, $completionid); + $this->assertCompletionEquals(1, count($completions)); + $this->assertCompletionEquals(reset($completions)->id, $completionid); $ccompletion->id = 0; $completionid = $ccompletion->mark_inprogress(); $this->assertDebuggingCalled('Can not update data object, no id!'); $this->assertNull($completionid); $completions = $DB->get_records('course_completions'); - $this->assertEquals(1, count($completions)); + $this->assertCompletionEquals(1, count($completions)); } /** @@ -1996,14 +1996,14 @@ final class completionlib_test extends advanced_testcase { $completionid = $ccompletion->mark_complete(); $completions = $DB->get_records('course_completions'); - $this->assertEquals(1, count($completions)); - $this->assertEquals(reset($completions)->id, $completionid); + $this->assertCompletionEquals(1, count($completions)); + $this->assertCompletionEquals(reset($completions)->id, $completionid); $ccompletion->id = 0; $completionid = $ccompletion->mark_complete(); $this->assertNull($completionid); $completions = $DB->get_records('course_completions'); - $this->assertEquals(1, count($completions)); + $this->assertCompletionEquals(1, count($completions)); } /** @@ -2040,8 +2040,8 @@ final class completionlib_test extends advanced_testcase { $completionid = $completion->mark_complete($record['timecompleted']); $completions = $DB->get_records('course_completions'); - $this->assertEquals(1, count($completions)); - $this->assertEquals(reset($completions)->id, $completionid); + $this->assertCompletionEquals(1, count($completions)); + $this->assertCompletionEquals(reset($completions)->id, $completionid); } /** diff --git a/lib/tests/date_test.php b/lib/tests/date_test.php index ffd060e95e7..cf03bfc2750 100644 --- a/lib/tests/date_test.php +++ b/lib/tests/date_test.php @@ -308,7 +308,15 @@ final class date_test extends advanced_testcase { $this->assertSame('Pacific/Auckland', core_date::get_server_timezone()); // Admin should fix the settings. + set_error_handler(function ($errno, $errstr): void { + $this->assertStringContainsString('Unknown or bad timezone', $errstr); + restore_error_handler(); + }, E_ALL); $this->setTimezone('xxx/zzzz', 'Europe/Prague'); + set_error_handler(function ($errno, $errstr): void { + $this->assertStringContainsString('Unknown or bad timezone', $errstr); + restore_error_handler(); + }, E_ALL); $this->assertSame('Europe/Prague', core_date::get_server_timezone()); } @@ -490,17 +498,36 @@ final class date_test extends advanced_testcase { $this->assertSame('Europe/Prague', core_date::get_user_timezone(null)); $this->assertSame('Europe/Prague', core_date::get_user_timezone()); + $invokable = self::get_invokable(); + set_error_handler($invokable, E_ALL); $this->setTimezone('xxx/yyy', 'Europe/London'); + $this->assertCount(1, $invokable->get_invocations()); $USER->timezone = 'abc/def'; $CFG->forcetimezone = 'Europe/Berlin'; $this->assertSame('Europe/Berlin', core_date::get_user_timezone(null)); $this->assertSame('Europe/Berlin', core_date::get_user_timezone()); + $this->assertCount(1, $invokable->get_invocations()); + restore_error_handler(); + $invokable = self::get_invokable(); + set_error_handler($invokable, E_ALL); $this->setTimezone('xxx/yyy', 'Europe/London'); + $this->assertCount(1, $invokable->get_invocations()); + restore_error_handler(); + $USER->timezone = 'abc/def'; $CFG->forcetimezone = 99; + $invokable = self::get_invokable(); + set_error_handler($invokable, E_ALL); $this->assertSame('Europe/London', core_date::get_user_timezone(null)); + $this->assertCount(1, $invokable->get_invocations()); + restore_error_handler(); + + $invokable = self::get_invokable(); + set_error_handler($invokable, E_ALL); $this->assertSame('Europe/London', core_date::get_user_timezone()); + $this->assertCount(1, $invokable->get_invocations()); + restore_error_handler(); // User object parameter. $admin = get_admin(); @@ -572,14 +599,30 @@ final class date_test extends advanced_testcase { $this->assertSame('Europe/London', core_date::get_user_timezone('Europe/London')); $this->assertSame('Europe/Prague', core_date::get_user_timezone('xxx/zzz')); $USER->timezone = 'xxz/zzz'; - $this->assertSame('Europe/Prague', core_date::get_user_timezone('99')); + $invokable = self::get_invokable(); + set_error_handler($invokable, E_ALL); + $this->assertSame('Europe/Prague', core_date::get_user_timezone('99')); + $this->assertCount(0, $invokable->get_invocations()); + restore_error_handler(); + + $invokable = self::get_invokable(); + set_error_handler($invokable, E_ALL); $this->setTimezone('xxx', 'Europe/Prague'); + $this->assertCount(1, $invokable->get_invocations()); + restore_error_handler(); + $CFG->forcetimezone = '99'; $USER->timezone = 'xxx'; + $invokable = self::get_invokable(); + set_error_handler($invokable, E_ALL); $this->assertSame('Europe/Prague', core_date::get_user_timezone('99')); + $this->assertCount(1, $invokable->get_invocations()); $this->assertSame('Europe/Prague', core_date::get_user_timezone(99)); + $this->assertCount(2, $invokable->get_invocations()); $this->assertSame('Etc/GMT-1', core_date::get_user_timezone(1)); + $this->assertCount(2, $invokable->get_invocations()); + restore_error_handler(); $this->setTimezone('Europe/Prague'); $CFG->forcetimezone = 'Pacific/Auckland'; @@ -593,7 +636,11 @@ final class date_test extends advanced_testcase { $USER->timezone = 'Europe/London'; $CFG->forcetimezone = 99; $tz = new DateTimeZone('Pacific/Auckland'); + $invokable = self::get_invokable(); + set_error_handler($invokable, E_ALL); $this->assertSame('Pacific/Auckland', core_date::get_user_timezone($tz)); + $this->assertCount(0, $invokable->get_invocations()); + restore_error_handler(); } /** diff --git a/lib/tests/grouplib_test.php b/lib/tests/grouplib_test.php index 261df0bf51a..e34d6ce74e3 100644 --- a/lib/tests/grouplib_test.php +++ b/lib/tests/grouplib_test.php @@ -501,7 +501,7 @@ final class grouplib_test extends \advanced_testcase { 'userid' => $user2->id, 'groupnames' => $group1->name, ], - ], $records); + ], array_values($records)); } public function test_groups_get_group_by_name(): void { @@ -1158,7 +1158,7 @@ final class grouplib_test extends \advanced_testcase { $this->assertEquals([$c1group1->id], array_keys($groups)); $this->assertEqualsCanonicalizing( [$c1user1->id, $c12user1->id], - $groups[$c1group1->id]->members + array_values($groups[$c1group1->id]->members), ); } diff --git a/lib/tests/moodlelib_partial_test.php b/lib/tests/moodlelib_partial_test.php index 9f5832e8dc3..8e774f694cf 100644 --- a/lib/tests/moodlelib_partial_test.php +++ b/lib/tests/moodlelib_partial_test.php @@ -44,6 +44,26 @@ final class moodlelib_partial_test extends \advanced_testcase { $this->assertEquals($expected, partial($callable, ...$initialargs)(...$calledargs)); } + public function test_partial_args_intance_methods(): void { + // Using named args on initial args only - instance method. + $this->assertEquals( + 'foo/bar/baz/bum', + partial( + [$this, 'example_instance_method'], + ...['foo' => 'foo'] + )(...['bar', 'baz', 'bum']), + ); + + // Using named args on called args only - instance method. + $this->assertEquals( + 'foo/bar/baz/bum', + partial( + [$this, 'example_instance_method'], + ...['foo' => 'foo'] + )(...['bar' => 'bar', 'baz' => 'baz', 'bum' => 'bum']), + ); + } + /** * An example static method as part of the testcase. * @@ -109,18 +129,6 @@ final class moodlelib_partial_test extends \advanced_testcase { ['needle' => 'foo'], true, ], - 'Using named args on initial args only - instance method' => [ - [new self(), 'example_instance_method'], - ['foo' => 'foo'], - ['bar', 'baz', 'bum'], - 'foo/bar/baz/bum', - ], - 'Using named args on called args only - instance method' => [ - [new self(), 'example_instance_method'], - ['foo'], - ['bar' => 'bar', 'baz' => 'baz', 'bum' => 'bum'], - 'foo/bar/baz/bum', - ], 'Using named args on initial args only - static method' => [ [self::class, 'example_static_method'], ['foo' => 'foo'], diff --git a/lib/tests/moodlelib_test.php b/lib/tests/moodlelib_test.php index fe1dc7e5d8e..95c841b30be 100644 --- a/lib/tests/moodlelib_test.php +++ b/lib/tests/moodlelib_test.php @@ -3283,7 +3283,7 @@ EOF; 'nodiverts' => array( 'divertallemailsto' => null, 'divertallemailsexcept' => null, - array( + 'addresses' => array( 'foo@example.com', 'test@real.com', 'fred.jones@example.com', @@ -3291,12 +3291,12 @@ EOF; 'fred@example.com', 'fred+verp@example.com', ), - false, + 'expected' => false, ), 'alldiverts' => array( 'divertallemailsto' => 'somewhere@elsewhere.com', 'divertallemailsexcept' => null, - array( + 'addresses' => array( 'foo@example.com', 'test@real.com', 'fred.jones@example.com', @@ -3304,65 +3304,65 @@ EOF; 'fred@example.com', 'fred+verp@example.com', ), - true, + 'expected' => true, ), 'alsodiverts' => array( 'divertallemailsto' => 'somewhere@elsewhere.com', 'divertallemailsexcept' => '@dev.com, fred(\+.*)?@example.com', - array( + 'addresses' => array( 'foo@example.com', 'test@real.com', 'fred.jones@example.com', 'Fred.Jones@Example.com', ), - true, + 'expected' => true, ), 'divertsexceptions' => array( 'divertallemailsto' => 'somewhere@elsewhere.com', 'divertallemailsexcept' => '@dev.com, fred(\+.*)?@example.com', - array( + 'addresses' => array( 'dev1@dev.com', 'fred@example.com', 'Fred@Example.com', 'fred+verp@example.com', ), - false, + 'expected' => false, ), 'divertsexceptionsnewline' => array( 'divertallemailsto' => 'somewhere@elsewhere.com', 'divertallemailsexcept' => "@dev.com\nfred(\+.*)?@example.com", - array( + 'addresses' => array( 'dev1@dev.com', 'fred@example.com', 'fred+verp@example.com', ), - false, + 'expected' => false, ), 'alsodivertsnewline' => array( 'divertallemailsto' => 'somewhere@elsewhere.com', 'divertallemailsexcept' => "@dev.com\nfred(\+.*)?@example.com", - array( + 'addresses' => array( 'foo@example.com', 'test@real.com', 'fred.jones@example.com', ), - true, + 'expected' => true, ), 'alsodivertsblankline' => array( 'divertallemailsto' => 'somewhere@elsewhere.com', 'divertallemailsexcept' => "@dev.com\n", - [ + 'addresses' => [ 'lionel@example.com', ], - true, + 'expected' => true, ), 'divertsexceptionblankline' => array( 'divertallemailsto' => 'somewhere@elsewhere.com', 'divertallemailsexcept' => "@example.com\n", - [ + 'addresses' => [ 'lionel@example.com', ], - false, + 'expected' => false, ), ); } diff --git a/mod/bigbluebuttonbn/tests/local/extension_test.php b/mod/bigbluebuttonbn/tests/local/extension_test.php index 01db8ec3f4e..1ea72da4fc6 100644 --- a/mod/bigbluebuttonbn/tests/local/extension_test.php +++ b/mod/bigbluebuttonbn/tests/local/extension_test.php @@ -428,12 +428,12 @@ final class extension_test extends \advanced_testcase { 'mod_instance_helper with plugin disabled' => [ 'bbbenabled' => false, 'apiclass' => mod_instance_helper::class, - 'result' => [], + 'extensionclasses' => [], ], 'mod_instance_helper with plugin enabled' => [ 'bbbenabled' => true, 'apiclass' => mod_instance_helper::class, - 'result' => [ + 'extensionclasses' => [ 'bbbext_simple\\bigbluebuttonbn\\mod_instance_helper', ], ], diff --git a/mod/bigbluebuttonbn/tests/meeting_test.php b/mod/bigbluebuttonbn/tests/meeting_test.php index 0560e2d661c..7b66fbd6831 100644 --- a/mod/bigbluebuttonbn/tests/meeting_test.php +++ b/mod/bigbluebuttonbn/tests/meeting_test.php @@ -120,7 +120,7 @@ final class meeting_test extends \advanced_testcase { * @covers ::create_meeting_data * @covers ::create_meeting_metadata */ - public function test_create_meeting(int $type, ?string $groupname): void { + public function test_create_meeting(int $type, ?string $groupname, $groupmode, $canjoin): void { $this->resetAfterTest(); [$meeting, $useringroup, $usernotingroup, $groupid, $activity] = $this->prepare_meeting($type, $groupname, SEPARATEGROUPS, false); @@ -142,7 +142,7 @@ final class meeting_test extends \advanced_testcase { * @covers ::get_meeting_info * @covers ::do_get_meeting_info */ - public function test_get_meeting_info(int $type, ?string $groupname): void { + public function test_get_meeting_info(int $type, ?string $groupname, $groupmode, $canjoin): void { $this->resetAfterTest(); [$meeting, $useringroup, $usernotingroup, $groupid, $activity] = $this->prepare_meeting($type, $groupname); $meetinginfo = $meeting->get_meeting_info(); diff --git a/mod/data/tests/manager_test.php b/mod/data/tests/manager_test.php index 4404f50b54f..0e2461c424e 100644 --- a/mod/data/tests/manager_test.php +++ b/mod/data/tests/manager_test.php @@ -741,31 +741,31 @@ final class manager_test extends \advanced_testcase { return [ // User presets. 'listtemplate' => [ - 'templatename' => 'listtemplate', + 'templatetoreset' => 'listtemplate', 'expected' => ['listtemplate', 'listtemplateheader', 'listtemplatefooter'], ], 'singletemplate' => [ - 'templatename' => 'singletemplate', + 'templatetoreset' => 'singletemplate', 'expected' => ['singletemplate'], ], 'asearchtemplate' => [ - 'templatename' => 'asearchtemplate', + 'templatetoreset' => 'asearchtemplate', 'expected' => ['asearchtemplate'], ], 'addtemplate' => [ - 'templatename' => 'addtemplate', + 'templatetoreset' => 'addtemplate', 'expected' => ['addtemplate'], ], 'rsstemplate' => [ - 'templatename' => 'rsstemplate', + 'templatetoreset' => 'rsstemplate', 'expected' => ['rsstemplate', 'rsstitletemplate'], ], 'csstemplate' => [ - 'templatename' => 'csstemplate', + 'templatetoreset' => 'csstemplate', 'expected' => ['csstemplate'], ], 'jstemplate' => [ - 'templatename' => 'jstemplate', + 'templatetoreset' => 'jstemplate', 'expected' => ['jstemplate'], ], ]; diff --git a/mod/data/tests/preset_importer_test.php b/mod/data/tests/preset_importer_test.php index 6c91685d39a..33d4fbd26ac 100644 --- a/mod/data/tests/preset_importer_test.php +++ b/mod/data/tests/preset_importer_test.php @@ -109,14 +109,14 @@ final class preset_importer_test extends \advanced_testcase { public static function needs_mapping_provider(): array { $basedprovider = static::preset_importer_provider(); - $basedprovider['Empty database / Empty importer']['needsmapping'] = false; - $basedprovider['Empty database / Importer with fields']['needsmapping'] = false; - $basedprovider['Database with fields / Empty importer']['needsmapping'] = true; - $basedprovider['Same fields']['needsmapping'] = false; - $basedprovider['Fields to create']['needsmapping'] = true; - $basedprovider['Fields to remove']['needsmapping'] = true; - $basedprovider['Fields to update']['needsmapping'] = true; - $basedprovider['Fields to create, remove and update']['needsmapping'] = true; + $basedprovider['Empty database / Empty importer']['expectedresult'] = false; + $basedprovider['Empty database / Importer with fields']['expectedresult'] = false; + $basedprovider['Database with fields / Empty importer']['expectedresult'] = true; + $basedprovider['Same fields']['expectedresult'] = false; + $basedprovider['Fields to create']['expectedresult'] = true; + $basedprovider['Fields to remove']['expectedresult'] = true; + $basedprovider['Fields to update']['expectedresult'] = true; + $basedprovider['Fields to create, remove and update']['expectedresult'] = true; return $basedprovider; } @@ -304,6 +304,7 @@ final class preset_importer_test extends \advanced_testcase { ): void { global $USER; + // xdebug_break(); $this->resetAfterTest(); $this->setAdminUser(); $plugingenerator = $this->getDataGenerator()->get_plugin_generator('mod_data'); diff --git a/mod/h5pactivity/tests/output/result/result_test.php b/mod/h5pactivity/tests/output/result/result_test.php index 1de69263189..303a66c2747 100644 --- a/mod/h5pactivity/tests/output/result/result_test.php +++ b/mod/h5pactivity/tests/output/result/result_test.php @@ -36,7 +36,7 @@ final class result_test extends \advanced_testcase { public static function result_data_provider(): array { return [ 'fill-in with case sensitive' => [ - 'result' => [ + 'providedresultdata' => [ 'interactiontype' => 'fill-in', 'description' => '

Fill in the missing words

Meow .... this is a __________

@@ -47,13 +47,13 @@ final class result_test extends \advanced_testcase { . '"https:\\/\\/h5p.org\\/x-api\\/case-sensitivity":true,' . '"https:\\/\\/h5p.org\\/x-api\\/alternatives":[["cat"],["dog"]]},"contextExtensions":{}}', ], - 'useranswers' => [ + 'expecteduseranswers' => [ 'Gap #1 - cat' => (object) ['answer' => 'Cat', 'incorrect' => true], 'Gap #2 - dog' => (object) ['answer' => 'dog', 'correct' => true], ], ], 'fill-in with case insensitive' => [ - 'result' => [ + 'providedresultdata' => [ 'interactiontype' => 'fill-in', 'description' => '

Fill in the missing words

Meow .... this is a __________

@@ -64,13 +64,13 @@ final class result_test extends \advanced_testcase { . '"https:\\/\\/h5p.org\\/x-api\\/case-sensitivity":false,' . '"https:\\/\\/h5p.org\\/x-api\\/alternatives":[["cat"],["dog"]]},"contextExtensions":{}}', ], - 'useranswers' => [ + 'expecteduseranswers' => [ 'Gap #1 - cat' => (object) ['answer' => 'Cat', 'correct' => true], 'Gap #2 - dog' => (object) ['answer' => 'dog', 'correct' => true], ], ], 'drag and drop' => [ - 'result' => [ + 'providedresultdata' => [ 'interactiontype' => 'matching', 'description' => 'Drag and Drop Test', 'correctpattern' => '["0[.]0[,]0[.]2[,]1[.]1[,]1[.]0"]', @@ -85,7 +85,7 @@ final class result_test extends \advanced_testcase { . '"http:\/\/h5p.org\/x-api\/h5p-subContentId":"59590246-f16e-4855-8dd6-c80e892ef96b"},' . '"contextExtensions":{}}', ], - 'useranswers' => [ + 'expecteduseranswers' => [ 'Answer 1 (DZ1 and DZ2) - Dropzone 1, Dropzone 2' => (object) ['answer' => 'Dropzone 1', 'correct' => true], 'Anwser 2 (DZ2) - Dropzone 2' => (object) ['answer' => 'Dropzone 2', 'correct' => true], 'Anwser 3 (DZ1) - Dropzone 1' => (object) ['answer' => 'Dropzone 1', 'correct' => true], @@ -93,7 +93,7 @@ final class result_test extends \advanced_testcase { ], ], 'drag and drop with no answer' => [ - 'result' => [ + 'providedresultdata' => [ 'interactiontype' => 'matching', 'description' => 'Drag and Drop Test', 'correctpattern' => '["0[.]0[,]0[.]2[,]1[.]1[,]1[.]0"]', @@ -108,7 +108,7 @@ final class result_test extends \advanced_testcase { . '"http:\/\/h5p.org\/x-api\/h5p-subContentId":"59590246-f16e-4855-8dd6-c80e892ef96b"},' . '"contextExtensions":{}}', ], - 'useranswers' => [ + 'expecteduseranswers' => [ 'Answer 1 (DZ1 and DZ2) - Dropzone 1, Dropzone 2' => (object) ['answer' => 'Dropzone 2', 'correct' => true], 'Anwser 2 (DZ2) - Dropzone 2' => (object) ['answer' => 'Dropzone 2', 'correct' => true], 'Anwser 3 (DZ1) - Dropzone 1' => (object) ['answer' => 'None', 'incorrect' => true], @@ -116,7 +116,7 @@ final class result_test extends \advanced_testcase { ], ], 'sort the paragraph text' => [ - 'result' => [ + 'providedresultdata' => [ 'interactiontype' => 'sequencing', 'description' => 'SortParagraphs', 'correctpattern' => '["0[,]1[,]2[,]3[,]4"]', @@ -131,7 +131,7 @@ final class result_test extends \advanced_testcase { '"extensions":{"http:\\/\\/h5p.org\\/x-api\\/h5p-local-content-id":39,' . '"https:\\/\\/h5p.org\\/x-api\\/duplicates-interchangeable":1},"contextExtensions":{}}', ], - 'useranswers' => [ + 'expecteduseranswers' => [ '#1 - First I wake up at 7.30 am' => (object) ['answer' => 'Correct answer', 'pass' => true], '#2 - Next I get dressed' => (object) ['answer' => 'Correct answer', 'pass' => true], '#3 - Afterward I have breakfast' => (object) ['answer' => 'Incorrect answer', 'fail' => true], @@ -140,7 +140,7 @@ final class result_test extends \advanced_testcase { ], ], 'sequencing images' => [ - 'result' => [ + 'providedresultdata' => [ 'interactiontype' => 'sequencing', 'description' => 'Order the planets from smallest to largest', 'correctpattern' => '["item_3[,]item_0[,]item_7[,]item_1[,]item_5[,]item_2[,]item_4[,]item_6"]', @@ -152,7 +152,7 @@ final class result_test extends \advanced_testcase { . '{"id":"item_6","description":{"en-US":"Jupiter"}}],"extensions":' . '{"http:\/\/h5p.org\/x-api\/h5p-local-content-id":43},"contextExtensions":{}}', ], - 'useranswers' => [ + 'expecteduseranswers' => [ '#1 - Mercury' => (object) ['answer' => 'Correct answer', 'pass' => true], '#2 - Mars' => (object) ['answer' => 'Correct answer', 'pass' => true], '#3 - Earth' => (object) ['answer' => 'Incorrect answer', 'fail' => true], diff --git a/mod/label/tests/lib_test.php b/mod/label/tests/lib_test.php index a8dc1d67d0a..b73d16743ef 100644 --- a/mod/label/tests/lib_test.php +++ b/mod/label/tests/lib_test.php @@ -241,19 +241,19 @@ final class lib_test extends \advanced_testcase { 'name' => 'Test label 1', 'content' => '

Simple textual content

', 'format' => FORMAT_HTML, - 'expected' => 'Test label 1' + 'expectedname' => 'Test label 1' ], 'simple' => [ 'name' => '', 'content' => '

Simple textual content

', 'format' => FORMAT_HTML, - 'expected' => 'Simple textual content' + 'expectedname' => 'Simple textual content' ], 'empty' => [ 'name' => '', 'content' => '', 'format' => FORMAT_HTML, - 'expected' => 'Test label 1' + 'expectedname' => 'Test label 1' ], 'withaudiocontent' => [ 'name' => '', @@ -263,7 +263,7 @@ final class lib_test extends \advanced_testcase { @@PLUGINFILE@@/moodle-hit-song.mp3  

', 'format' => FORMAT_HTML, - 'expected' => 'Test with audio' + 'expectedname' => 'Test with audio' ], 'withvideo' => [ 'name' => '', @@ -273,7 +273,7 @@ final class lib_test extends \advanced_testcase { https://www.youtube.com/watch?v=xxxyy  

', 'format' => FORMAT_HTML, - 'expected' => 'Test video https://www.youtube.com/watch?v=xxxyy' + 'expectedname' => 'Test video https://www.youtube.com/watch?v=xxxyy' ], 'with video trimming' => [ 'name' => '', @@ -283,61 +283,61 @@ final class lib_test extends \advanced_testcase { https://www.youtube.com/watch?v=xxxyy  

', 'format' => FORMAT_HTML, - 'expected' => 'Test with video to be trimmed https://www.youtube....' + 'expectedname' => 'Test with video to be trimmed https://www.youtube....' ], 'with plain text' => [ 'name' => '', 'content' => 'Content with @@PLUGINFILE@@/moodle-hit-song.mp3 nothing', 'format' => FORMAT_HTML, - 'expected' => 'Content with nothing' + 'expectedname' => 'Content with nothing' ], 'with several spaces' => [ 'name' => '', 'content' => "Content with @@PLUGINFILE@@/moodle-hit-song.mp3 \r   several spaces", 'format' => FORMAT_HTML, - 'expected' => 'Content with several spaces' + 'expectedname' => 'Content with several spaces' ], 'empty spaces' => [ 'name' => '', 'content' => '   ', 'format' => FORMAT_HTML, - 'expected' => 'Text and media area' + 'expectedname' => 'Text and media area' ], 'only html' => [ 'name' => '', 'content' => '', 'format' => FORMAT_HTML, - 'expected' => 'Text and media area' + 'expectedname' => 'Text and media area' ], 'markdown' => [ 'name' => '', 'content' => "##Simple Title\n simple markdown format", 'format' => FORMAT_MARKDOWN, - 'expected' => 'Simple Title simple markdown format' + 'expectedname' => 'Simple Title simple markdown format' ], 'markdown with pluginfile' => [ 'name' => '', 'content' => "##Simple Title\n simple markdown format @@PLUGINFILE@@/moodle-hit-song.mp3", 'format' => FORMAT_MARKDOWN, - 'expected' => 'Simple Title simple markdown format' + 'expectedname' => 'Simple Title simple markdown format' ], 'plain text' => [ 'name' => '', 'content' => "Simple plain text @@PLUGINFILE@@/moodle-hit-song.mp3", 'format' => FORMAT_PLAIN, - 'expected' => 'Simple plain text' + 'expectedname' => 'Simple plain text' ], 'moodle format text' => [ 'name' => '', 'content' => "Simple plain text @@PLUGINFILE@@/moodle-hit-song.mp3", 'format' => FORMAT_MOODLE, - 'expected' => 'Simple plain text' + 'expectedname' => 'Simple plain text' ], 'html format text' => [ 'name' => '', 'content' => "

Simple plain title

with plain text

@@PLUGINFILE@@/moodle-hit-song.mp3", 'format' => FORMAT_HTML, - 'expected' => 'Simple plain title with plain text' + 'expectedname' => 'Simple plain title with plain text' ], ]; } diff --git a/mod/lesson/tests/numeric_helper_test.php b/mod/lesson/tests/numeric_helper_test.php index b02b3330b4b..81238924300 100644 --- a/mod/lesson/tests/numeric_helper_test.php +++ b/mod/lesson/tests/numeric_helper_test.php @@ -66,7 +66,7 @@ final class numeric_helper_test extends \advanced_testcase { return [ "Using a decimal as a separator" => [ "decsep" => ".", - "test" => [ + "tests" => [ ["2.1", 2.1], ["1:4.2", "1:4.2"], ["2,1", 2], @@ -76,7 +76,7 @@ final class numeric_helper_test extends \advanced_testcase { ], "Using a comma as a separator" => [ "decsep" => ",", - "test" => [ + "tests" => [ ["2,1", 2.1], ["1:4,2", "1:4.2"], ["2.1", 2.1], @@ -85,7 +85,7 @@ final class numeric_helper_test extends \advanced_testcase { ], "Using a X as a separator" => [ "decsep" => "X", - "test" => [ + "tests" => [ ["2X1", 2.1], ["1:4X2", "1:4.2"], ["2.1", 2.1], @@ -104,7 +104,7 @@ final class numeric_helper_test extends \advanced_testcase { return [ "Using a decimal as a separator" => [ "decsep" => ".", - "test" => [ + "tests" => [ ["2.1", 2.1], ["1:4.2", "1:4.2"], ["2,1", "2,1"], @@ -113,7 +113,7 @@ final class numeric_helper_test extends \advanced_testcase { ], "Using a comma as a separator" => [ "decsep" => ",", - "test" => [ + "tests" => [ ["2,1", "2,1"], ["1:4,2", "1:4,2"], ["2.1", "2,1"], @@ -123,7 +123,7 @@ final class numeric_helper_test extends \advanced_testcase { ], "Using a X as a separator" => [ "decsep" => "X", - "test" => [ + "tests" => [ ["2X1", "2X1"], ["1:4X2", "1:4X2"], ["2.1", "2X1"], diff --git a/mod/quiz/accessrule/seb/tests/external/validate_quiz_access_test.php b/mod/quiz/accessrule/seb/tests/external/validate_quiz_access_test.php index bd895c75926..6fd9744ba89 100644 --- a/mod/quiz/accessrule/seb/tests/external/validate_quiz_access_test.php +++ b/mod/quiz/accessrule/seb/tests/external/validate_quiz_access_test.php @@ -60,31 +60,31 @@ final class validate_quiz_access_test extends \advanced_testcase { 'cmid' => null, 'url' => null, 'configkey' => null, - '/Invalid parameter value detected \(Missing required key in single structure: cmid\)/' + 'messageregex' => '/Invalid parameter value detected \(Missing required key in single structure: cmid\)/' ], 'no course module id' => [ 'cmid' => null, 'url' => 'https://www.example.com/moodle', 'configkey' => hash('sha256', 'configkey'), - '/Invalid parameter value detected \(Missing required key in single structure: cmid\)/' + 'messageregex' => '/Invalid parameter value detected \(Missing required key in single structure: cmid\)/' ], 'no url' => [ 'cmid' => 123, 'url' => null, 'configkey' => hash('sha256', 'configkey'), - '/Invalid parameter value detected \(Missing required key in single structure: url\)/' + 'messageregex' => '/Invalid parameter value detected \(Missing required key in single structure: url\)/' ], 'cmid is not an int' => [ 'cmid' => 'test', 'url' => 'https://www.example.com/moodle', 'configkey' => null, - '/Invalid external api parameter: the value is "test", the server was expecting "int" type/' + 'messageregex' => '/Invalid external api parameter: the value is "test", the server was expecting "int" type/' ], 'url is not a url' => [ 'cmid' => 123, 'url' => 123, 'configkey' => hash('sha256', 'configkey'), - '/Invalid external api parameter: the value is "123", the server was expecting "url" type/' + 'messageregex' => '/Invalid external api parameter: the value is "123", the server was expecting "url" type/' ], ]; } diff --git a/mod/quiz/tests/local/override_manager_test.php b/mod/quiz/tests/local/override_manager_test.php index 83b8fcfe187..5376d2ba045 100644 --- a/mod/quiz/tests/local/override_manager_test.php +++ b/mod/quiz/tests/local/override_manager_test.php @@ -225,7 +225,7 @@ final class override_manager_test extends \advanced_testcase { 'password' => 'test', ], 'expectedrecordscreated' => 1, - 'expectedevent' => user_override_created::class, + 'expectedeventclass' => user_override_created::class, ], 'create user override - no calendar events should be created' => [ 'existingdata' => [], @@ -239,7 +239,7 @@ final class override_manager_test extends \advanced_testcase { 'password' => 'test', ], 'expectedrecordscreated' => 1, - 'expectedevent' => user_override_created::class, + 'expectedeventclass' => user_override_created::class, ], 'create user override - only timeopen' => [ 'existingdata' => [], @@ -253,7 +253,7 @@ final class override_manager_test extends \advanced_testcase { 'password' => 'test', ], 'expectedrecordscreated' => 1, - 'expectedevent' => user_override_created::class, + 'expectedeventclass' => user_override_created::class, ], 'create group override - no existing data' => [ 'existingdata' => [], @@ -267,7 +267,7 @@ final class override_manager_test extends \advanced_testcase { 'password' => 'test', ], 'expectedrecordscreated' => 1, - 'expectedevent' => group_override_created::class, + 'expectedeventclass' => group_override_created::class, ], 'create group override - no calendar events should be created' => [ 'existingdata' => [], @@ -281,7 +281,7 @@ final class override_manager_test extends \advanced_testcase { 'password' => 'test', ], 'expectedrecordscreated' => 1, - 'expectedevent' => group_override_created::class, + 'expectedeventclass' => group_override_created::class, ], 'create group override - only timeopen' => [ 'existingdata' => [], @@ -295,7 +295,7 @@ final class override_manager_test extends \advanced_testcase { 'password' => null, ], 'expectedrecordscreated' => 1, - 'expectedevent' => group_override_created::class, + 'expectedeventclass' => group_override_created::class, ], 'update user override - updating existing data' => [ 'existingdata' => [ @@ -318,7 +318,7 @@ final class override_manager_test extends \advanced_testcase { 'password' => 'test', ], 'expectedrecordscreated' => 0, - 'expectedevent' => user_override_updated::class, + 'expectedeventclass' => user_override_updated::class, ], 'update group override - updating existing data' => [ 'existingdata' => [ @@ -341,7 +341,7 @@ final class override_manager_test extends \advanced_testcase { 'password' => 'test', ], 'expectedrecordscreated' => 0, - 'expectedevent' => group_override_updated::class, + 'expectedeventclass' => group_override_updated::class, ], 'attempts is set to unlimited (i.e. 0)' => [ 'existingdata' => [], @@ -356,7 +356,7 @@ final class override_manager_test extends \advanced_testcase { 'password' => null, ], 'expectedrecordscreated' => 1, - 'expectedevent' => user_override_created::class, + 'expectedeventclass' => user_override_created::class, ], 'some settings submitted are the same as what is in the quiz (valid)' => [ 'existingdata' => [], @@ -372,7 +372,7 @@ final class override_manager_test extends \advanced_testcase { 'password' => null, ], 'expectedrecordscreated' => 1, - 'expectedevent' => user_override_created::class, + 'expectedeventclass' => user_override_created::class, ], ]; } @@ -900,31 +900,31 @@ final class override_manager_test extends \advanced_testcase { public static function delete_override_provider(): array { return [ 'delete by id (no events logged)' => [ - 'function' => fn($manager, $override) => $manager->delete_overrides_by_id([$override->id], false, false), + 'deletefunction' => fn($manager, $override) => $manager->delete_overrides_by_id([$override->id], false, false), 'checkeventslogged' => false, ], 'delete single (no events logged)' => [ - 'function' => fn($manager, $override) => $manager->delete_overrides([$override], false, false), + 'deletefunction' => fn($manager, $override) => $manager->delete_overrides([$override], false, false), 'checkeventslogged' => false, ], 'delete all (no events logged)' => [ - 'function' => fn($manager, $override) => $manager->delete_all_overrides(false, false), + 'deletefunction' => fn($manager, $override) => $manager->delete_all_overrides(false, false), 'checkeventslogged' => false, ], 'delete by id (events logged)' => [ - 'function' => fn($manager, $override) => $manager->delete_overrides_by_id([$override->id], true, false), + 'deletefunction' => fn($manager, $override) => $manager->delete_overrides_by_id([$override->id], true, false), 'checkeventslogged' => true, ], 'delete single (events logged)' => [ - 'function' => fn($manager, $override) => $manager->delete_overrides([$override], true, false), + 'deletefunction' => fn($manager, $override) => $manager->delete_overrides([$override], true, false), 'checkeventslogged' => true, ], 'delete all (events logged)' => [ - 'function' => fn($manager, $override) => $manager->delete_all_overrides(true, false), + 'deletefunction' => fn($manager, $override) => $manager->delete_all_overrides(true, false), 'checkeventslogged' => true, ], 'delete all in database (events logged)' => [ - 'function' => fn($manager, $override) => $manager->delete_all_overrides(true, false), + 'deletefunction' => fn($manager, $override) => $manager->delete_all_overrides(true, false), 'checkeventslogged' => true, ], ]; diff --git a/mod/wiki/tests/backup/restore_format_test.php b/mod/wiki/tests/backup/restore_format_test.php index c27cc5eae58..eb057b31212 100644 --- a/mod/wiki/tests/backup/restore_format_test.php +++ b/mod/wiki/tests/backup/restore_format_test.php @@ -34,19 +34,19 @@ final class restore_format_test extends \advanced_testcase { public static function restore_format_test_provider(): array { return [ 'creole' => [ - 'data' => 'creole', + 'format' => 'creole', 'expected' => 'creole', ], 'html' => [ - 'data' => 'html', + 'format' => 'html', 'expected' => 'html', ], 'wikimarkup' => [ - 'data' => 'nwiki', + 'format' => 'nwiki', 'expected' => 'nwiki', ], 'wrong format' => [ - 'data' => '../wrongformat123', + 'format' => '../wrongformat123', 'expected' => 'wrongformat', ], ]; diff --git a/mod/wiki/tests/wikiparser_test.php b/mod/wiki/tests/wikiparser_test.php index ead65ac1155..757476df394 100644 --- a/mod/wiki/tests/wikiparser_test.php +++ b/mod/wiki/tests/wikiparser_test.php @@ -363,19 +363,19 @@ final class wikiparser_test extends \advanced_testcase { public static function format_parser_provider(): array { return [ 'creole' => [ - 'data' => 'creole', + 'format' => 'creole', 'expected' => 'creole', ], 'html' => [ - 'data' => 'html', + 'format' => 'html', 'expected' => 'html', ], 'wikimarkup' => [ - 'data' => 'nwiki', + 'format' => 'nwiki', 'expected' => 'nwiki', ], 'wrong format' => [ - 'data' => '../wrongformat123', + 'format' => '../wrongformat123', 'expected' => 'exception', ], ]; diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 15fdf7e73ff..8a5088d72ee 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,22 +1,20 @@ + xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/10.5/phpunit.xsd" + bootstrap="lib/phpunit/bootstrap.php" + processIsolation="false" + backupGlobals="false" + cacheResult="false" + stopOnError="false" + stopOnFailure="false" + stopOnIncomplete="false" + stopOnSkipped="false" + beStrictAboutTestsThatDoNotTestAnything="false" + beStrictAboutOutputDuringTests="true" + cacheDirectory=".phpunit.cache" + backupStaticProperties="false" +> @@ -305,8 +303,8 @@ - + - + diff --git a/question/bank/statistics/tests/helper_test.php b/question/bank/statistics/tests/helper_test.php index 2dec158f3fc..61abe70fcbd 100644 --- a/question/bank/statistics/tests/helper_test.php +++ b/question/bank/statistics/tests/helper_test.php @@ -272,32 +272,42 @@ final class helper_test extends \advanced_testcase { */ public static function load_question_facility_provider(): \Generator { yield 'Facility case 1' => [ - 'Quiz 1 attempts' => [ + // Quiz 1 attempts. + 'quiz1attempts' => [ self::generate_attempt_answers([1, 0, 0, 0]), ], - 'Expected quiz 1 facilities' => ['100.00%', '0.00%', '0.00%', '0.00%'], - 'Quiz 2 attempts' => [ + // Expected quiz 1 facilities. + 'expectedquiz1facilities' => ['100.00%', '0.00%', '0.00%', '0.00%'], + // Quiz 2 attempts. + 'quiz2attempts' => [ self::generate_attempt_answers([1, 0, 0, 0]), self::generate_attempt_answers([1, 1, 0, 0]), ], - 'Expected quiz 2 facilities' => ['100.00%', '50.00%', '0.00%', '0.00%'], - 'Expected average facilities' => ['100.00%', '25.00%', '0.00%', '0.00%'], + // Expected quiz 2 facilities. + 'expectedquiz2facilities' => ['100.00%', '50.00%', '0.00%', '0.00%'], + // Expected average facilities. + 'expectedaveragefacilities' => ['100.00%', '25.00%', '0.00%', '0.00%'], ]; yield 'Facility case 2' => [ - 'Quiz 1 attempts' => [ + // Quiz 1 attempts. + 'quiz1attempts' => [ self::generate_attempt_answers([1, 0, 0, 0]), self::generate_attempt_answers([1, 1, 0, 0]), self::generate_attempt_answers([1, 1, 1, 0]), ], - 'Expected quiz 1 facilities' => ['100.00%', '66.67%', '33.33%', '0.00%'], - 'Quiz 2 attempts' => [ + // Expected quiz 1 facilities. + 'expectedquiz1facilities' => ['100.00%', '66.67%', '33.33%', '0.00%'], + // Quiz 2 attempts. + 'quiz2attempts' => [ self::generate_attempt_answers([1, 0, 0, 0]), self::generate_attempt_answers([1, 1, 0, 0]), self::generate_attempt_answers([1, 1, 1, 0]), self::generate_attempt_answers([1, 1, 1, 1]), ], - 'Expected quiz 2 facilities' => ['100.00%', '75.00%', '50.00%', '25.00%'], - 'Expected average facilities' => ['100.00%', '70.83%', '41.67%', '12.50%'], + // Expected quiz 2 facilities. + 'expectedquiz2facilities' => ['100.00%', '75.00%', '50.00%', '25.00%'], + // Expected average facilities. + 'expectedaveragefacilities' => ['100.00%', '70.83%', '41.67%', '12.50%'], ]; } @@ -380,21 +390,26 @@ final class helper_test extends \advanced_testcase { */ public static function load_question_discriminative_efficiency_provider(): \Generator { yield 'Discriminative efficiency' => [ - 'Quiz 1 attempts' => [ + // Quiz 1 attempts. + 'quiz1attempts' => [ self::generate_attempt_answers([1, 0, 0, 0]), self::generate_attempt_answers([1, 1, 0, 0]), self::generate_attempt_answers([1, 0, 1, 0]), self::generate_attempt_answers([1, 1, 1, 1]), ], - 'Expected quiz 1 discriminative efficiency' => ['N/A', '33.33%', '33.33%', '100.00%'], - 'Quiz 2 attempts' => [ + // Expected quiz 1 facilities. + 'expectedquiz1discriminativeefficiency' => ['N/A', '33.33%', '33.33%', '100.00%'], + // Quiz 2 attempts. + 'quiz2attempts' => [ self::generate_attempt_answers([1, 1, 1, 1]), self::generate_attempt_answers([0, 0, 0, 0]), self::generate_attempt_answers([1, 0, 0, 1]), self::generate_attempt_answers([0, 1, 1, 0]), ], - 'Expected quiz 2 discriminative efficiency' => ['50.00%', '50.00%', '50.00%', '50.00%'], - 'Expected average discriminative efficiency' => ['50.00%', '41.67%', '41.67%', '75.00%'], + // Expected quiz 2 facilities. + 'expectedquiz2discriminativeefficiency' => ['50.00%', '50.00%', '50.00%', '50.00%'], + // Expected average facilities. + 'expectedaveragediscriminativeefficiency' => ['50.00%', '41.67%', '41.67%', '75.00%'], ]; } @@ -501,21 +516,26 @@ final class helper_test extends \advanced_testcase { */ public static function load_question_discrimination_index_provider(): \Generator { yield 'Discrimination Index' => [ - 'Quiz 1 attempts' => [ + // Quiz 1 attempts. + 'quiz1attempts' => [ self::generate_attempt_answers([1, 0, 0, 0]), self::generate_attempt_answers([1, 1, 0, 0]), self::generate_attempt_answers([1, 0, 1, 0]), self::generate_attempt_answers([1, 1, 1, 1]), ], - 'Expected quiz 1 Discrimination Index' => ['N/A', '30.15%', '30.15%', '81.65%'], - 'Quiz 2 attempts' => [ + // Expected quiz 1 facilities. + 'expectedquiz1discriminationindex' => ['N/A', '30.15%', '30.15%', '81.65%'], + // Quiz 2 attempts. + 'quiz2attempts' => [ self::generate_attempt_answers([1, 1, 1, 1]), self::generate_attempt_answers([0, 0, 0, 0]), self::generate_attempt_answers([1, 0, 0, 1]), self::generate_attempt_answers([0, 1, 1, 0]), ], - 'Expected quiz 2 discrimination Index' => ['44.72%', '44.72%', '44.72%', '44.72%'], - 'Expected average discrimination Index' => ['44.72%', '37.44%', '37.44%', '63.19%'], + // Expected quiz 2 facilities. + 'expectedquiz2discriminationindex' => ['44.72%', '44.72%', '44.72%', '44.72%'], + // Expected average facilities. + 'expectedaveragediscriminationindex' => ['44.72%', '37.44%', '37.44%', '63.19%'], ]; } diff --git a/reportbuilder/tests/local/helpers/report_test.php b/reportbuilder/tests/local/helpers/report_test.php index 8c911268d77..ae5fe44cea2 100644 --- a/reportbuilder/tests/local/helpers/report_test.php +++ b/reportbuilder/tests/local/helpers/report_test.php @@ -51,8 +51,10 @@ final class report_test extends advanced_testcase { $this->assertEquals('My report with tags', $report->get('name')); $this->assertEquals(datasource::TYPE_CUSTOM_REPORT, $report->get('type')); - $this->assertEqualsCanonicalizing(['cat', 'dog'], - core_tag_tag::get_item_tags_array('core_reportbuilder', 'reportbuilder_report', $report->get('id'))); + $this->assertEqualsCanonicalizing( + ['cat', 'dog'], + array_values(core_tag_tag::get_item_tags_array('core_reportbuilder', 'reportbuilder_report', $report->get('id'))), + ); $report = report::create_report((object) [ 'name' => 'My report without tags', @@ -96,8 +98,10 @@ final class report_test extends advanced_testcase { $this->assertEquals('My renamed report adding tags', $reportupdated->get('name')); $this->assertTrue($reportupdated->get('uniquerows')); - $this->assertEqualsCanonicalizing(['cat', 'dog'], - core_tag_tag::get_item_tags_array('core_reportbuilder', 'reportbuilder_report', $reportupdated->get('id'))); + $this->assertEqualsCanonicalizing( + ['cat', 'dog'], + array_values(core_tag_tag::get_item_tags_array('core_reportbuilder', 'reportbuilder_report', $reportupdated->get('id'))), + ); } /** diff --git a/repository/nextcloud/tests/lib_test.php b/repository/nextcloud/tests/lib_test.php index 847cef82cfb..f8c21441dd7 100644 --- a/repository/nextcloud/tests/lib_test.php +++ b/repository/nextcloud/tests/lib_test.php @@ -948,17 +948,17 @@ XML; * * @dataProvider sync_reference_provider * @param array $storedfileargs - * @param array $storedfilemethodsmock + * @param array $mockfunctions * @param bool $expectedresult * @return void */ - public function test_sync_reference(array $storedfileargs, $storedfilemethodsmock, bool $expectedresult): void { + public function test_sync_reference(array $storedfileargs, $mockfunctions, bool $expectedresult): void { $this->resetAfterTest(true); - if (isset($storedfilemethodsmock[0])) { + if (isset($mockfunctions[0])) { $storedfile = $this->createMock(\stored_file::class); - if ($storedfilemethodsmock[0] === 'get_referencelastsync') { + if ($mockfunctions[0] === 'get_referencelastsync') { if (!$expectedresult) { $storedfile->method('get_referencelastsync')->willReturn(DAYSECS + time()); }