Compare commits
440 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b8fd606243 | |||
| 5cb257b4c3 | |||
| 64b6bca053 | |||
| d3d988fcc6 | |||
| bf3f06bb82 | |||
| fb714c7cf6 | |||
| 4ce6dc7b4d | |||
| cd6e0bf763 | |||
| 69ce532809 | |||
| 0f4e8413fc | |||
| 919f5bfb36 | |||
| 46ee4f4062 | |||
| edc7eb06b7 | |||
| 8af0c977d0 | |||
| f1c0f2849b | |||
| 00f0ebf5ea | |||
| 8c87a29d2e | |||
| 26fe42c16e | |||
| d7f72ffdc8 | |||
| 60d8572d4e | |||
| b7d79061f1 | |||
| cc7ccb6c42 | |||
| d16e3a8141 | |||
| 05bc504e4e | |||
| 7197b264b1 | |||
| 83e6407074 | |||
| 93e30fbe3c | |||
| 287d51323f | |||
| 8acd5f7390 | |||
| f7c7b7cb73 | |||
| 1271286cf5 | |||
| fda6e143af | |||
| 03c7f3dc87 | |||
| 985be80d1f | |||
| ef6bb4439d | |||
| 787e36fea8 | |||
| 79af8fb2f5 | |||
| f247f5b048 | |||
| 3176d756e0 | |||
| 5de3c84461 | |||
| b08a9e0b66 | |||
| ef6a03ea51 | |||
| ce8237d5fd | |||
| 8db9ab4908 | |||
| eda6b9ba8f | |||
| f85d5e9e5d | |||
| dd4702ee80 | |||
| ad5e6f00df | |||
| a3af9f65bf | |||
| 3584a14e78 | |||
| 77abe66d2c | |||
| ab22e012d8 | |||
| 758281716e | |||
| 9b64f0afcd | |||
| 9c611755d4 | |||
| 96b7a7d066 | |||
| cc68de58d1 | |||
| 79c83bfcef | |||
| 79e0d92848 | |||
| f7189aea98 | |||
| 58fcbe9678 | |||
| 4751e672e3 | |||
| ba64cce68d | |||
| 0d20c1c2d6 | |||
| 539d1b3c89 | |||
| 6d047756d2 | |||
| 6ba7009a11 | |||
| 56ab65f46a | |||
| ca13d3e05c | |||
| df32c00ab5 | |||
| f375246427 | |||
| 544947c9c7 | |||
| 1f6ab2b676 | |||
| 5f098189dd | |||
| 9e530add9e | |||
| a349ae01e9 | |||
| 99b5fb3a3b | |||
| a47525cbc9 | |||
| 762fb71a1f | |||
| 146d84ebde | |||
| c0b0f6f411 | |||
| 6e6260f6d0 | |||
| d0a2de670b | |||
| d82af28545 | |||
| ad408bbfdf | |||
| 0ff0d1d66a | |||
| 0957e83d8d | |||
| 4dd37348b4 | |||
| c5c6758ed7 | |||
| 78cbd77c0d | |||
| 8303206ae0 | |||
| d13ed5575c | |||
| 1d40ffaf55 | |||
| 146048903b | |||
| 57d119a43f | |||
| 3b18f7884f | |||
| 3cc3d83b7e | |||
| bd2cb3c4e8 | |||
| c8aa905ef0 | |||
| d1e8870fb5 | |||
| e34b09be48 | |||
| 94d025a912 | |||
| 1a87e306e9 | |||
| 9bbeeaa557 | |||
| 598845e3ff | |||
| 0c2cd0de2a | |||
| 170a12537b | |||
| 1662bae0ab | |||
| a0727a15d5 | |||
| 834e634c9f | |||
| ac7eedb851 | |||
| 78a4febfb4 | |||
| 99e43efb1e | |||
| 51c5405e6f | |||
| 01222cbb06 | |||
| df048de49d | |||
| 22dffcd0c2 | |||
| e5ec14cc01 | |||
| fa82e4aa00 | |||
| afa1b6f0ad | |||
| 4cb53f71b3 | |||
| 7e180482ca | |||
| a9af3c9cd4 | |||
| a37caf6126 | |||
| 8e0205ec56 | |||
| 3156398c54 | |||
| 21f43574fd | |||
| f83929ab57 | |||
| faa4d5ab56 | |||
| d89301add2 | |||
| 15e127fe7e | |||
| 79b5632ce9 | |||
| 75715efdfa | |||
| d80a7c43dc | |||
| 439e4edc99 | |||
| a39feaefe7 | |||
| 8c8e5eba2c | |||
| 16b9813aae | |||
| 07a07679a1 | |||
| 1207c31c78 | |||
| c8ade37695 | |||
| 23bb2275d9 | |||
| 1f7a90fbe2 | |||
| 82d55b7455 | |||
| 064c473a4e | |||
| bf6e018f9d | |||
| 5c418c72f3 | |||
| 47e66ef9d1 | |||
| 335b09205b | |||
| 9b779e3d53 | |||
| e084b47f92 | |||
| 44b49b5651 | |||
| 2742b32ed8 | |||
| df6d634d57 | |||
| b2b0d0795e | |||
| 39f39999be | |||
| 088519178f | |||
| 7ee20257b0 | |||
| 4fc3052a73 | |||
| fc056f1aa6 | |||
| 2fe2cd8eab | |||
| 4c0a1ffaab | |||
| c9d14b4ce8 | |||
| 6368b3f055 | |||
| 544d1ab453 | |||
| 4ba43b851d | |||
| fbbb7da0f6 | |||
| e78978ec6b | |||
| 394f65e91e | |||
| 2432ac2c08 | |||
| 986cf06e55 | |||
| 3619147c76 | |||
| de03dfa066 | |||
| bd9c3fd5db | |||
| e6b39085a8 | |||
| 3c982ce134 | |||
| eefd6bbf54 | |||
| b5157c8153 | |||
| 53cc3870e1 | |||
| 72b408772c | |||
| b08d4ea2ed | |||
| 0ed76e9316 | |||
| 3cca8ba5d8 | |||
| bfad8c4dd1 | |||
| da60508071 | |||
| ca14e2d950 | |||
| a7db400e61 | |||
| 59d7b57a7a | |||
| 4bdedd7d56 | |||
| dbe2390e97 | |||
| b24bef6b97 | |||
| 2affa30359 | |||
| 83ccb2913b | |||
| a2a37f3cb5 | |||
| b388341f47 | |||
| 7261abf98d | |||
| 10de05f5d6 | |||
| 4091db771e | |||
| 8978466354 | |||
| 590088f118 | |||
| 796a14a5ce | |||
| 9b302f133a | |||
| b8e9cb31e9 | |||
| 972744ee12 | |||
| 98104be4f4 | |||
| e7e690e3b8 | |||
| 6ded74cc2a | |||
| 1099b3f022 | |||
| 93315ab389 | |||
| 875591f589 | |||
| 4d48741ed7 | |||
| 1c33085ede | |||
| 199974b45d | |||
| 464a4cb4d5 | |||
| 637c6fbbca | |||
| e2d9a7fcee | |||
| b115058dc5 | |||
| fd5832fde9 | |||
| 8f375b3923 | |||
| 2970dfb52d | |||
| a174a570a6 | |||
| 917d7e1003 | |||
| 83a8cfb9e4 | |||
| 947b6f202c | |||
| 5ab6d18354 | |||
| e36332c01a | |||
| 5f399aa81a | |||
| 5b02f3bcf7 | |||
| 8a6e4904bf | |||
| 692657ffc4 | |||
| 753373d6e6 | |||
| 43e181f391 | |||
| 0cdb291d9e | |||
| 031004097b | |||
| 869c717e72 | |||
| 0536942919 | |||
| 5e5b39ee2c | |||
| 055fff8005 | |||
| e7094cdb75 | |||
| 3a5f610034 | |||
| 44e3680153 | |||
| 11db1b0193 | |||
| c4f95593a9 | |||
| 5957b238ef | |||
| 51a7a0aa3e | |||
| 9bb6ed7c1c | |||
| 1a01e66976 | |||
| 899e7e2103 | |||
| 92509cdeae | |||
| af84b0ea22 | |||
| 10ad537723 | |||
| a576209dd1 | |||
| 1a76f2752a | |||
| 8e0da918ab | |||
| ff3fd8a222 | |||
| 0127abe30e | |||
| a0aaa3cacf | |||
| d02d01aa71 | |||
| b9e3bcb748 | |||
| 447067d874 | |||
| 282e60115d | |||
| d3f3da7277 | |||
| 7228428479 | |||
| 53a493030c | |||
| 3fc5d0dec3 | |||
| b6ccf35285 | |||
| 4af82f5154 | |||
| 5855059608 | |||
| 9a7bdedc5a | |||
| b276bfce77 | |||
| 8d2f2e7d37 | |||
| 705e6c5614 | |||
| 48f1e6165d | |||
| 917369b8ef | |||
| 81e7828600 | |||
| a5776a4bbe | |||
| 7917f9a509 | |||
| c15ffa0e88 | |||
| 36c1a657b4 | |||
| 9fc20a6fef | |||
| c07e077f04 | |||
| 0e9eddf51e | |||
| c0462feec8 | |||
| 711e2b006f | |||
| 45e81f4818 | |||
| ac822d9655 | |||
| 0907ff86f8 | |||
| a52378726e | |||
| a2dd8127f0 | |||
| e9cf945617 | |||
| 64bc864e2e | |||
| e34a301fd0 | |||
| 339c473b9c | |||
| 62dec781bb | |||
| a76e8e9fbe | |||
| 1a9cb490ba | |||
| ceef8c7e1b | |||
| f8a83d8a67 | |||
| a6773e6664 | |||
| fb9fdc4754 | |||
| 4194bdf0fd | |||
| 710099242f | |||
| aee71c329d | |||
| b72e73d6de | |||
| 9a75af7805 | |||
| a0653230c5 | |||
| 802f6b3fa1 | |||
| 55198f851c | |||
| a4c654d67c | |||
| 6e7c7a7e2e | |||
| eb3a220af8 | |||
| d3b25ce4d9 | |||
| 7e29aee395 | |||
| 556236134a | |||
| b1bad66d46 | |||
| 660b5b0045 | |||
| d28f836536 | |||
| 6b8ae1c193 | |||
| 2a606b6a10 | |||
| 96cbdb8452 | |||
| 1a9775cb82 | |||
| 7806534af2 | |||
| f994a89ce5 | |||
| ae1a4cf5a7 | |||
| e1d2f92bda | |||
| 0faeb73989 | |||
| 54ca52c917 | |||
| f3ea59897e | |||
| d9a3ef29ce | |||
| 224038fc65 | |||
| 3ab09c775d | |||
| 065bcc9a3a | |||
| 962f75ec53 | |||
| 982e4df1f1 | |||
| d1d96d4902 | |||
| 5c2be62c94 | |||
| cc05ca22da | |||
| f5b9056370 | |||
| 03a003289a | |||
| a8011f89c8 | |||
| 8a9fea33e2 | |||
| 9d827a29a4 | |||
| 2c2686d66e | |||
| 0d05e7696f | |||
| 56846834e4 | |||
| 5e1cee2bd4 | |||
| e34536fc05 | |||
| 54ecc0d0d7 | |||
| 419f6d6d5c | |||
| 49171c9f6e | |||
| 53a2efa29f | |||
| 8e19d73c2b | |||
| 432bd19d5a | |||
| 7eee5bff29 | |||
| 60d07529d0 | |||
| 81d104300b | |||
| 7fc6677853 | |||
| f8037d326d | |||
| 411416a37a | |||
| baba2c573e | |||
| 08b121599e | |||
| 2532fc2a15 | |||
| f31b3f4d55 | |||
| b6327f4435 | |||
| 7745c451fd | |||
| 290ee98681 | |||
| 12c5859ad2 | |||
| b364d2b8fe | |||
| 3dd97076d9 | |||
| 4a61fc1e76 | |||
| ced37870e6 | |||
| 008443efdd | |||
| a01201ec4c | |||
| 25f22a3cb7 | |||
| 7c585543e9 | |||
| 039953f01a | |||
| 66165e081d | |||
| 5a8d478e3d | |||
| 81da9e8ab2 | |||
| 39d832251f | |||
| 6f5dd17b43 | |||
| a15d2100b4 | |||
| 7eb557e695 | |||
| 1e2c2c5a2a | |||
| 0b463d4203 | |||
| c74979a798 | |||
| 7bd1ca51c9 | |||
| b463787e70 | |||
| dd1cd6cd8b | |||
| cd112cf93f | |||
| 5ab43fb1b3 | |||
| 08e4bc556c | |||
| 8a5bea2bc3 | |||
| 263a17676b | |||
| 3f6999f42e | |||
| 8b7d96ca68 | |||
| 4f5bdfcc0c | |||
| 77655b1ba3 | |||
| 2fae9b9849 | |||
| e9827edb0a | |||
| bce68bd0c4 | |||
| 8c34c3ed08 | |||
| 7da1d94956 | |||
| 125b689a5c | |||
| 8e2b50aec5 | |||
| 74f0fe1e77 | |||
| 55e1312f88 | |||
| 0c6b884060 | |||
| 7d764cde8b | |||
| 576020ce6a | |||
| 22fb553178 | |||
| 820cac7677 | |||
| 1dcfa8fffe | |||
| ba53bf48a7 | |||
| 7b8c92106a | |||
| b25dce473b | |||
| 911441bf43 | |||
| 8dc128313a | |||
| e14a534ce1 | |||
| 5aacd4ba77 | |||
| ed0dacbb5d | |||
| 62a909f91a | |||
| 1f85802f86 | |||
| 109bac00c8 | |||
| d789be92ae | |||
| ba26cf7c90 | |||
| f0170da7ec | |||
| 2fe08752e6 | |||
| 313aedcf13 | |||
| 42c4d51f7c | |||
| b635c658c8 | |||
| c604750339 | |||
| 87a6da0d59 | |||
| 37b3397bea | |||
| f8ebec2da5 | |||
| 8af6174946 | |||
| 767d46be4c | |||
| c64dc2e545 | |||
| c73673f2f3 | |||
| 4c53ddf46b |
@@ -13,7 +13,7 @@ env:
|
||||
|
||||
jobs:
|
||||
Grunt:
|
||||
runs-on: ubuntu-18.04
|
||||
runs-on: ubuntu-20.04
|
||||
|
||||
steps:
|
||||
- name: Checking out code
|
||||
@@ -54,11 +54,11 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
include:
|
||||
- os: ubuntu-18.04
|
||||
- os: ubuntu-20.04
|
||||
php: 7.3
|
||||
extensions:
|
||||
db: mysqli
|
||||
- os: ubuntu-18.04
|
||||
- os: ubuntu-20.04
|
||||
php: 8.0
|
||||
db: pgsql
|
||||
extensions: xmlrpc-beta
|
||||
@@ -111,4 +111,5 @@ jobs:
|
||||
- name: Running PHPUnit tests
|
||||
env:
|
||||
dbtype: ${{ matrix.db }}
|
||||
run: vendor/bin/phpunit -v
|
||||
phpunit_options: ${{ secrets.phpunit_options }}
|
||||
run: vendor/bin/phpunit $phpunit_options
|
||||
|
||||
@@ -51,3 +51,4 @@ moodle-plugin-ci.phar
|
||||
.eslintignore
|
||||
.stylelintignore
|
||||
/jsdoc
|
||||
.phpcs.xml
|
||||
|
||||
@@ -21,6 +21,43 @@
|
||||
*/
|
||||
|
||||
module.exports = grunt => {
|
||||
|
||||
/**
|
||||
* Generate the PHPCS configuration.
|
||||
*
|
||||
* @param {Object} thirdPartyPaths
|
||||
*/
|
||||
const phpcsIgnore = (thirdPartyPaths) => {
|
||||
const {toXML} = require('jstoxml');
|
||||
|
||||
const config = {
|
||||
_name: 'ruleset',
|
||||
_attrs: {
|
||||
name: "MoodleCore",
|
||||
},
|
||||
_content: [
|
||||
{
|
||||
rule: {
|
||||
_attrs: {
|
||||
ref: './.phpcs.xml.dist',
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
thirdPartyPaths.forEach(library => {
|
||||
config._content.push({
|
||||
'exclude-pattern': library,
|
||||
});
|
||||
});
|
||||
|
||||
grunt.file.write('.phpcs.xml', toXML(config, {
|
||||
header: true,
|
||||
indent: ' ',
|
||||
}) + "\n");
|
||||
};
|
||||
|
||||
/**
|
||||
* Generate ignore files (utilising thirdpartylibs.xml data)
|
||||
*/
|
||||
@@ -52,6 +89,8 @@ module.exports = grunt => {
|
||||
'jsdoc/styles/*.css',
|
||||
].concat(thirdPartyPaths);
|
||||
grunt.file.write('.stylelintignore', stylelintIgnores.join('\n') + '\n');
|
||||
|
||||
phpcsIgnore(thirdPartyPaths);
|
||||
};
|
||||
|
||||
grunt.registerTask('ignorefiles', 'Generate ignore files for linters', handler);
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ruleset name="MoodleCore">
|
||||
<rule ref="moodle"/>
|
||||
</ruleset>
|
||||
@@ -36,7 +36,7 @@ jobs:
|
||||
- php: 7.3
|
||||
env: DB=none TASK=CITEST
|
||||
- php: 7.3
|
||||
env: DB=none TASK=GRUNT NVM_VERSION='lts/carbon'
|
||||
env: DB=none TASK=GRUNT NVM_VERSION='lts/gallium'
|
||||
|
||||
- if: env(MOODLE_DATABASE) = "pgsql" OR env(MOODLE_DATABASE) = "all" OR env(MOODLE_DATABASE) IS NOT present
|
||||
php: 7.3
|
||||
@@ -52,7 +52,7 @@ jobs:
|
||||
env: DB=none TASK=CITEST
|
||||
- if: env(MOODLE_PHP) = "all"
|
||||
php: 8.0
|
||||
env: DB=none TASK=GRUNT NVM_VERSION='lts/carbon'
|
||||
env: DB=none TASK=GRUNT NVM_VERSION='lts/gallium'
|
||||
|
||||
- if: env(MOODLE_PHP) = "all" AND (env(MOODLE_DATABASE) = "pgsql" OR env(MOODLE_DATABASE) = "all" OR env(MOODLE_DATABASE) IS NOT present)
|
||||
php: 8.0
|
||||
|
||||
@@ -69,11 +69,11 @@ if ($options['help'] or (!$options['list'] and !$options['execute'])) {
|
||||
die;
|
||||
}
|
||||
|
||||
if ($options['showdebugging']) {
|
||||
if ($options['showdebugging'] || !empty($CFG->showcrondebugging)) {
|
||||
set_debugging(DEBUG_DEVELOPER, true);
|
||||
}
|
||||
|
||||
if ($options['showsql']) {
|
||||
if ($options['showsql'] || !empty($CFG->showcronsql)) {
|
||||
$DB->set_debug(true);
|
||||
}
|
||||
if ($options['list']) {
|
||||
|
||||
@@ -14,19 +14,19 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace core_role;
|
||||
|
||||
use core_role_preset;
|
||||
|
||||
/**
|
||||
* Role XML presets test case.
|
||||
*
|
||||
* @package core_role
|
||||
* @category phpunit
|
||||
* @category test
|
||||
* @copyright 2013 Petr Skoda {@link http://skodak.org}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
|
||||
class core_role_preset_testcase extends advanced_testcase {
|
||||
class preset_test extends \advanced_testcase {
|
||||
public function test_xml() {
|
||||
global $DB;
|
||||
|
||||
@@ -61,7 +61,7 @@ class core_role_preset_testcase extends advanced_testcase {
|
||||
FROM {role_capabilities}
|
||||
WHERE contextid = :syscontext AND roleid = :roleid
|
||||
ORDER BY capability ASC",
|
||||
array('syscontext'=>context_system::instance()->id, 'roleid'=>$role->id));
|
||||
array('syscontext' => \context_system::instance()->id, 'roleid' => $role->id));
|
||||
|
||||
foreach ($capabilities as $cap) {
|
||||
$this->assertEquals($cap->permission, $info['permissions'][$cap->capability]);
|
||||
|
||||
@@ -26,7 +26,7 @@ require_once($CFG->libdir . '/adminlib.php');
|
||||
|
||||
admin_externalpage_setup('searchareas');
|
||||
|
||||
$areaid = optional_param('areaid', null, PARAM_ALPHAEXT);
|
||||
$areaid = optional_param('areaid', null, PARAM_ALPHANUMEXT);
|
||||
$action = optional_param('action', null, PARAM_ALPHA);
|
||||
$indexingenabled = \core_search\manager::is_indexing_enabled(); // This restricts many of the actions on this page.
|
||||
|
||||
|
||||
@@ -308,6 +308,13 @@ if ($hassiteconfig) {
|
||||
$temp->add(new admin_setting_managedataformats());
|
||||
$ADMIN->add('dataformatsettings', $temp);
|
||||
|
||||
$plugins = core_plugin_manager::instance()->get_plugins_of_type('dataformat');
|
||||
core_collator::asort_objects_by_property($plugins, 'displayname');
|
||||
foreach ($plugins as $plugin) {
|
||||
/** @var \core\plugininfo\dataformat $plugin */
|
||||
$plugin->load_settings($ADMIN, 'dataformatsettings', $hassiteconfig);
|
||||
}
|
||||
|
||||
//== Portfolio settings ==
|
||||
require_once($CFG->libdir. '/portfoliolib.php');
|
||||
$catname = new lang_string('portfolios', 'portfolio');
|
||||
@@ -485,7 +492,10 @@ if ($hassiteconfig && !empty($CFG->enableplagiarism)) {
|
||||
$plugin->load_settings($ADMIN, 'plagiarism', $hassiteconfig);
|
||||
}
|
||||
}
|
||||
$ADMIN->add('reports', new admin_externalpage('comments', new lang_string('comments'), $CFG->wwwroot.'/comment/', 'moodle/site:viewreports'));
|
||||
|
||||
// Comments report, note this page is really just a means to delete comments so check that.
|
||||
$ADMIN->add('reports', new admin_externalpage('comments', new lang_string('comments'), $CFG->wwwroot . '/comment/index.php',
|
||||
'moodle/comment:delete'));
|
||||
|
||||
// Course reports settings
|
||||
if ($hassiteconfig) {
|
||||
|
||||
@@ -236,7 +236,8 @@ if ($hassiteconfig
|
||||
if ($field->param2 > 255 || $field->datatype != 'text') {
|
||||
continue;
|
||||
}
|
||||
$fields['profile_field_' . $field->shortname] = $field->name . ' *';
|
||||
$fields['profile_field_' . $field->shortname] = format_string($field->name, true,
|
||||
['context' => context_system::instance()]) . ' *';
|
||||
}
|
||||
|
||||
return $fields;
|
||||
|
||||
@@ -18,6 +18,10 @@ Feature: An administrator can filter user accounts by role, cohort and other pro
|
||||
And the following "cohorts" exist:
|
||||
| name | idnumber |
|
||||
| Cohort 1 | CH1 |
|
||||
And the following "cohort members" exist:
|
||||
| user | cohort |
|
||||
| user2 | CH1 |
|
||||
| user3 | CH1 |
|
||||
And the following "courses" exist:
|
||||
| fullname | shortname | category |
|
||||
| Course 1 | C1 | 0 |
|
||||
@@ -27,8 +31,6 @@ Feature: An administrator can filter user accounts by role, cohort and other pro
|
||||
| user2 | C1 | student |
|
||||
| user3 | C1 | student |
|
||||
And I log in as "admin"
|
||||
And I add "User Two (two@example.com)" user to "CH1" cohort members
|
||||
And I add "User Three (three@example.com)" user to "CH1" cohort members
|
||||
And I navigate to "Users > Accounts > Browse list of users" in site administration
|
||||
|
||||
Scenario: Filter user accounts by role and cohort
|
||||
|
||||
@@ -20,9 +20,10 @@ Feature: Forms manipulation
|
||||
Given the following "courses" exist:
|
||||
| fullname | shortname | category |
|
||||
| Course 1 | C1 | 0 |
|
||||
And I log in as "admin"
|
||||
And I am on "Course 1" course homepage with editing mode on
|
||||
And I add a "Quiz" to section "1"
|
||||
And the following "activities" exist:
|
||||
| activity | course | section | name |
|
||||
| quiz | C1 | 1 | Quiz 1 |
|
||||
And I am on the "Quiz 1" "quiz activity editing" page logged in as admin
|
||||
When I expand all fieldsets
|
||||
Then I should see "Close the quiz"
|
||||
And I should see "Group mode"
|
||||
|
||||
@@ -477,8 +477,6 @@ class accessibility {
|
||||
public static function get_summary_data(int $id): \stdClass {
|
||||
global $CFG, $DB;
|
||||
|
||||
$components = $DB->get_records(manager::DB_AREAS);
|
||||
|
||||
$summarydata = new \stdClass();
|
||||
$summarydata->siteurl = (substr($CFG->wwwroot, -1) !== '/') ? $CFG->wwwroot . '/' : $CFG->wwwroot;
|
||||
$summarydata->moodlerelease = (preg_match('/^(\d+\.\d.*?)[. ]/', $CFG->release, $matches)) ? $matches[1] : $CFG->release;
|
||||
@@ -488,7 +486,7 @@ class accessibility {
|
||||
$summarydata->numfactivities = $DB->count_records('course_modules');
|
||||
$summarydata->mobileservice = (int)$CFG->enablemobilewebservice === 1 ? true : false;
|
||||
$summarydata->usersmobileregistered = $DB->count_records('user_devices');
|
||||
$summarydata->contenttyperesults = static::get_contenttyperesults($id, $components);
|
||||
$summarydata->contenttyperesults = static::get_contenttyperesults($id);
|
||||
$summarydata->contenttypeerrors = static::get_contenttypeerrors();
|
||||
$summarydata->percheckerrors = static::get_percheckerrors();
|
||||
return $summarydata;
|
||||
@@ -497,22 +495,24 @@ class accessibility {
|
||||
/**
|
||||
* Get content type results.
|
||||
* @param int $id
|
||||
* @param array $components
|
||||
* @return \stdClass
|
||||
*/
|
||||
private static function get_contenttyperesults(int $id, array $components): \stdClass {
|
||||
private static function get_contenttyperesults(int $id): \stdClass {
|
||||
global $DB;
|
||||
$sql = 'SELECT component, COUNT(id) AS count
|
||||
FROM {' . manager::DB_AREAS . '}
|
||||
GROUP BY component';
|
||||
$components = $DB->get_recordset_sql($sql);
|
||||
$contenttyperesults = new \stdClass();
|
||||
$contenttyperesults->id = $id;
|
||||
$datacomponents = array();
|
||||
foreach ($components as $component) {
|
||||
$datacomponents[$component->component][] = $component;
|
||||
}
|
||||
$contenttyperesults->contenttype = new \stdClass();
|
||||
foreach ($datacomponents as $key => $component) {
|
||||
$contenttyperesults->contenttype->$key = count($component);
|
||||
foreach ($components as $component) {
|
||||
$componentname = $component->component;
|
||||
$contenttyperesults->contenttype->$componentname = $component->count;
|
||||
}
|
||||
$components->close();
|
||||
$contenttyperesults->summarydatastorage = static::get_summary_data_storage();
|
||||
$contenttyperesults->datachecked = time(); // Correct??
|
||||
$contenttyperesults->datachecked = time();
|
||||
return $contenttyperesults;
|
||||
}
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ namespace tool_brickfield\local\htmlchecker\common;
|
||||
*/
|
||||
class brickfield_accessibility_color_test extends brickfield_accessibility_test {
|
||||
|
||||
/** @var string[] Mapping of colours to hex codes. */
|
||||
/** @var string[] Define colour codes. */
|
||||
public $colornames = [
|
||||
'aliceblue' => 'f0f8ff',
|
||||
'antiquewhite' => 'faebd7',
|
||||
@@ -183,6 +183,12 @@ class brickfield_accessibility_color_test extends brickfield_accessibility_test
|
||||
}
|
||||
$forergb = $this->get_rgb($foreground);
|
||||
$backrgb = $this->get_rgb($background);
|
||||
|
||||
// If get_rgb returns null for either, return 0.
|
||||
if ($forergb === null || $backrgb === null) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return $this->luminosity($forergb['r'], $backrgb['r'],
|
||||
$forergb['g'], $backrgb['g'],
|
||||
$forergb['b'], $backrgb['b']);
|
||||
@@ -227,15 +233,15 @@ class brickfield_accessibility_color_test extends brickfield_accessibility_test
|
||||
|
||||
|
||||
/**
|
||||
* Returns the decimal equivalents for a HEX color
|
||||
* Returns the decimal equivalents for a HEX color. Returns null if it cannot be determined.
|
||||
* @param string $color The hex color value
|
||||
* @return array An array where 'r' is the Red value, 'g' is Green, and 'b' is Blue
|
||||
* @return array|null An array where 'r' is the Red value, 'g' is Green, and 'b' is Blue
|
||||
*/
|
||||
public function get_rgb(string $color) {
|
||||
public function get_rgb(string $color): ?array {
|
||||
$color = $this->convert_color($color);
|
||||
$c = str_split($color, 2);
|
||||
if (count($c) != 3) {
|
||||
return false;
|
||||
return null;
|
||||
}
|
||||
$results = ['r' => hexdec($c[0]), 'g' => hexdec($c[1]), 'b' => hexdec($c[2])];
|
||||
return $results;
|
||||
@@ -307,6 +313,12 @@ class brickfield_accessibility_color_test extends brickfield_accessibility_test
|
||||
public function get_wai_ert_contrast(string $foreground, string $background): array {
|
||||
$forergb = $this->get_rgb($foreground);
|
||||
$backrgb = $this->get_rgb($background);
|
||||
|
||||
// If get_rgb returns null for either, return 0.
|
||||
if ($forergb === null || $backrgb === null) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$diffs = $this->get_wai_diffs($forergb, $backrgb);
|
||||
|
||||
return $diffs['red'] + $diffs['green'] + $diffs['blue'];
|
||||
@@ -321,12 +333,18 @@ class brickfield_accessibility_color_test extends brickfield_accessibility_test
|
||||
public function get_wai_ert_brightness(string $foreground, string $background): float {
|
||||
$forergb = $this->get_rgb($foreground);
|
||||
$backrgb = $this->get_rgb($background);
|
||||
|
||||
// If get_rgb returns null for either, return 0.
|
||||
if ($forergb === null || $backrgb === null) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
$color = $this->get_wai_diffs($forergb, $backrgb);
|
||||
return (($color['red'] * 299) + ($color['green'] * 587) + ($color['blue'] * 114)) / 1000;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get wai diffs.
|
||||
* Get the wai differences.
|
||||
* @param array $forergb
|
||||
* @param array $backrgb
|
||||
* @return array
|
||||
|
||||
@@ -248,7 +248,7 @@ $string['printable:toolname'] = 'Summary report';
|
||||
$string['printable:toolshortname'] = 'Summary report';
|
||||
$string['printable:downloadpdf'] = 'Download PDF';
|
||||
$string['printable:printreport'] = 'Printable report';
|
||||
$string['error:nocoursespecified'] = 'This summary report requires a valid course id. Please access the accessibility toolkit from within a course, via the actions menu, which will then supply this required course id.';
|
||||
$string['error:nocoursespecified'] = 'The summary report requires a valid course ID. Please access the accessibility toolkit from within a course.';
|
||||
$string['pdf:filename'] = 'Brickfield_Summaryreport_CourseID-{$a}';
|
||||
|
||||
// Advanced page.
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* tool_brickfield check test.
|
||||
* Class test_css_text_has_contrast test
|
||||
*
|
||||
* @package tool_brickfield
|
||||
* @copyright 2020 onward: Brickfield Education Labs, https://www.brickfield.ie
|
||||
@@ -29,14 +29,79 @@ defined('MOODLE_INTERNAL') || die();
|
||||
require_once('all_checks.php');
|
||||
|
||||
/**
|
||||
* Class test_css_text_has_contrast_testcase
|
||||
* Class test_css_text_has_contrast_test
|
||||
*/
|
||||
class css_text_has_contrast_test extends all_checks {
|
||||
/** @var string Check type */
|
||||
/** @var string The check type. */
|
||||
protected $checktype = 'css_text_has_contrast';
|
||||
|
||||
/** @var string Html fail */
|
||||
private $htmlfail = <<<EOD
|
||||
/** @var string HTML that should get flagged. */
|
||||
private $htmlfail1 = <<<EOD
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>OAC Testfile - Check #6 - Positive</title>
|
||||
</head>
|
||||
<body>
|
||||
<p style="color:#333333; background-color:#000000; font-weight: bold;">This is not contrasty enough.</p>
|
||||
</body>
|
||||
</html>
|
||||
EOD;
|
||||
|
||||
/** @var string HTML that should get flagged. */
|
||||
private $htmlfail2 = <<<EOD
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>OAC Testfile - Check #6 - Positive</title>
|
||||
</head>
|
||||
<body>
|
||||
<p style="color:#333333; background-color:#000000; font-size: 18px;">This is not contrasty enough.</p>
|
||||
</body>
|
||||
</html>
|
||||
EOD;
|
||||
|
||||
/** @var string HTML that should get flagged. */
|
||||
private $htmlfail3 = <<<EOD
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>OAC Testfile - Check #6 - Positive</title>
|
||||
</head>
|
||||
<body>
|
||||
<p style="color:#333333; background-color:#000000; font-size: 18%;">This is not contrasty enough.</p>
|
||||
</body>
|
||||
</html>
|
||||
EOD;
|
||||
|
||||
/** @var string HTML that should get flagged. */
|
||||
private $htmlfail4 = <<<EOD
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>OAC Testfile - Check #6 - Positive</title>
|
||||
</head>
|
||||
<body>
|
||||
<p style="color:#333333; background-color:#000000; font-size: 18em;">This is not contrasty enough.</p>
|
||||
</body>
|
||||
</html>
|
||||
EOD;
|
||||
|
||||
/** @var string HTML that should get flagged. */
|
||||
private $htmlfail5 = <<<EOD
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>OAC Testfile - Check #6 - Positive</title>
|
||||
</head>
|
||||
<body>
|
||||
<p style="color:#333333; background-color:#000000; font-size: 18ex;">This is not contrasty enough.</p>
|
||||
</body>
|
||||
</html>
|
||||
EOD;
|
||||
|
||||
/** @var string HTML that should get flagged. */
|
||||
private $htmlfail6 = <<<EOD
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<html lang="en">
|
||||
<head>
|
||||
@@ -48,7 +113,7 @@ class css_text_has_contrast_test extends all_checks {
|
||||
</html>
|
||||
EOD;
|
||||
|
||||
/** @var string Html pass */
|
||||
/** @var string HTML that should not get flagged. */
|
||||
private $htmlpass = <<<EOD
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<html lang="en">
|
||||
@@ -61,14 +126,113 @@ EOD;
|
||||
</html>
|
||||
EOD;
|
||||
|
||||
/** @var string HTML that should get flagged. */
|
||||
private $namecolours = <<<EOD
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>OAC Testfile - Check #6 - Positive</title>
|
||||
</head>
|
||||
<body>
|
||||
<p style="color: red; background-color: blue;">This is not contrasty enough.</p>
|
||||
</body>
|
||||
</html>
|
||||
EOD;
|
||||
|
||||
/** @var string HTML with invalid colour names. */
|
||||
private $invalidcolours = <<<EOD
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>OAC Testfile - Check #6 - Positive</title>
|
||||
</head>
|
||||
<body>
|
||||
<p style="color: grog; background-color: numpi;">This is not contrasty enough.</p>
|
||||
</body>
|
||||
</html>
|
||||
EOD;
|
||||
|
||||
/** @var string HTML with invalid colour numeric values. */
|
||||
private $invalidvalue = <<<EOD
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>OAC Testfile - Check #6 - Positive</title>
|
||||
</head>
|
||||
<body>
|
||||
<p style="color: 10000500; background-color: -10234;">This is not contrasty enough.</p>
|
||||
</body>
|
||||
</html>
|
||||
EOD;
|
||||
|
||||
/** @var string HTML with empty colour values. */
|
||||
private $emptyvalue = <<<EOD
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN""http://www.w3.org/TR/REC-html40/loose.dtd">
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>OAC Testfile - Check #6 - Positive</title>
|
||||
</head>
|
||||
<body>
|
||||
<p style="color:; background-color:;">This is not contrasty enough.</p>
|
||||
</body>
|
||||
</html>
|
||||
EOD;
|
||||
|
||||
/**
|
||||
* Test for the area assign intro
|
||||
*/
|
||||
public function test_check() {
|
||||
$results = $this->get_checker_results($this->htmlfail);
|
||||
$results = $this->get_checker_results($this->htmlfail1);
|
||||
$this->assertTrue($results[0]->element->tagName == 'p');
|
||||
|
||||
$results = $this->get_checker_results($this->htmlfail2);
|
||||
$this->assertTrue($results[0]->element->tagName == 'p');
|
||||
|
||||
$results = $this->get_checker_results($this->htmlfail3);
|
||||
$this->assertTrue($results[0]->element->tagName == 'p');
|
||||
|
||||
$results = $this->get_checker_results($this->htmlfail4);
|
||||
$this->assertTrue($results[0]->element->tagName == 'p');
|
||||
|
||||
$results = $this->get_checker_results($this->htmlfail5);
|
||||
$this->assertTrue($results[0]->element->tagName == 'p');
|
||||
|
||||
$results = $this->get_checker_results($this->htmlfail6);
|
||||
$this->assertTrue($results[0]->element->tagName == 'p');
|
||||
|
||||
$results = $this->get_checker_results($this->htmlpass);
|
||||
$this->assertEmpty($results);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test with valid colour names.
|
||||
*/
|
||||
public function test_check_for_namedcolours() {
|
||||
$results = $this->get_checker_results($this->namecolours);
|
||||
$this->assertTrue($results[0]->element->tagName == 'p');
|
||||
}
|
||||
|
||||
/**
|
||||
* Test with invalid colour names.
|
||||
*/
|
||||
public function test_check_for_invalidcolours() {
|
||||
$results = $this->get_checker_results($this->invalidcolours);
|
||||
$this->assertTrue($results[0]->element->tagName == 'p');
|
||||
}
|
||||
|
||||
/**
|
||||
* Test with invalid colour numeric values.
|
||||
*/
|
||||
public function test_check_for_invalidvalues() {
|
||||
$results = $this->get_checker_results($this->invalidvalue);
|
||||
$this->assertTrue($results[0]->element->tagName == 'p');
|
||||
}
|
||||
|
||||
/**
|
||||
* Test with empty colour values.
|
||||
*/
|
||||
public function test_check_for_emptyvalues() {
|
||||
$results = $this->get_checker_results($this->emptyvalue);
|
||||
$this->assertEmpty($results);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
This files describes API changes in /admin/tool/brickfield/*.
|
||||
|
||||
=== 3.11.7 ===
|
||||
|
||||
* classes/local/htmlchecker/common/brickfield_accessibility_color_test::get_rgb() has been modified to return either an
|
||||
array or null. Previously it returned either an array or false.
|
||||
@@ -36,7 +36,7 @@ class tool_customlang_utils {
|
||||
* Rough number of strings that are being processed during a full checkout.
|
||||
* This is used to estimate the progress of the checkout.
|
||||
*/
|
||||
const ROUGH_NUMBER_OF_STRINGS = 16500;
|
||||
const ROUGH_NUMBER_OF_STRINGS = 32000;
|
||||
|
||||
/** @var array cache of {@link self::list_components()} results */
|
||||
private static $components = null;
|
||||
@@ -91,9 +91,22 @@ class tool_customlang_utils {
|
||||
public static function checkout($lang, progress_bar $progressbar = null) {
|
||||
global $DB;
|
||||
|
||||
// For behat executions we are going to load only a few components in the
|
||||
// language customisation structures. Using the whole "en" langpack is
|
||||
// too much slow (leads to Selenium 30s timeouts, especially on slow
|
||||
// environments) and we don't really need the whole thing for tests. So,
|
||||
// apart from escaping from the timeouts, we are also saving some good minutes
|
||||
// in tests. See MDL-70014 and linked issues for more info.
|
||||
$behatneeded = ['core', 'core_langconfig', 'tool_customlang'];
|
||||
|
||||
// make sure that all components are registered
|
||||
$current = $DB->get_records('tool_customlang_components', null, 'name', 'name,version,id');
|
||||
foreach (self::list_components() as $component) {
|
||||
// Filter out unwanted components when running behat.
|
||||
if (defined('BEHAT_SITE_RUNNING') && !in_array($component, $behatneeded)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (empty($current[$component])) {
|
||||
$record = new stdclass();
|
||||
$record->name = $component;
|
||||
@@ -103,7 +116,7 @@ class tool_customlang_utils {
|
||||
$record->version = $version;
|
||||
}
|
||||
$DB->insert_record('tool_customlang_components', $record);
|
||||
} elseif ($version = get_component_version($component)) {
|
||||
} else if ($version = get_component_version($component)) {
|
||||
if (is_null($current[$component]->version) or ($version > $current[$component]->version)) {
|
||||
$DB->set_field('tool_customlang_components', 'version', $version, array('id' => $current[$component]->id));
|
||||
}
|
||||
|
||||
@@ -786,6 +786,18 @@ class api {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if user has permission to create data download request for themselves
|
||||
*
|
||||
* @param int|null $userid
|
||||
* @return bool
|
||||
*/
|
||||
public static function can_create_data_download_request_for_self(int $userid = null): bool {
|
||||
global $USER;
|
||||
$userid = $userid ?: $USER->id;
|
||||
return has_capability('tool/dataprivacy:downloadownrequest', \context_user::instance($userid), $userid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if user has permisson to create data deletion request for themselves.
|
||||
*
|
||||
@@ -847,7 +859,7 @@ class api {
|
||||
|
||||
$usercontext = \context_user::instance($userid);
|
||||
// If it's your own and you have the right capability, you can download it.
|
||||
if ($userid == $downloaderid && has_capability('tool/dataprivacy:downloadownrequest', $usercontext, $downloaderid)) {
|
||||
if ($userid == $downloaderid && self::can_create_data_download_request_for_self($downloaderid)) {
|
||||
return true;
|
||||
}
|
||||
// If you can download anyone's in that context, you can download it.
|
||||
|
||||
@@ -96,6 +96,11 @@ if ($data = $mform->get_data()) {
|
||||
throw new moodle_exception('nopermissions', 'error', '',
|
||||
get_string('errorcannotrequestdeleteforother', 'tool_dataprivacy'));
|
||||
}
|
||||
} else if ($data->type == \tool_dataprivacy\api::DATAREQUEST_TYPE_EXPORT) {
|
||||
if ($data->userid == $USER->id && !\tool_dataprivacy\api::can_create_data_download_request_for_self()) {
|
||||
throw new moodle_exception('nopermissions', 'error', '',
|
||||
get_string('errorcannotrequestexportforself', 'tool_dataprivacy'));
|
||||
}
|
||||
}
|
||||
|
||||
\tool_dataprivacy\api::create_data_request($data->userid, $data->type, $data->comments);
|
||||
|
||||
@@ -97,10 +97,11 @@ class tool_dataprivacy_data_request_form extends \core\form\persistent {
|
||||
$mform->setType('userid', PARAM_INT);
|
||||
|
||||
// Subject access request type.
|
||||
$options = [
|
||||
api::DATAREQUEST_TYPE_EXPORT => get_string('requesttypeexport', 'tool_dataprivacy'),
|
||||
api::DATAREQUEST_TYPE_DELETE => get_string('requesttypedelete', 'tool_dataprivacy')
|
||||
];
|
||||
$options = [];
|
||||
if ($this->manage || api::can_create_data_download_request_for_self()) {
|
||||
$options[api::DATAREQUEST_TYPE_EXPORT] = get_string('requesttypeexport', 'tool_dataprivacy');
|
||||
}
|
||||
$options[api::DATAREQUEST_TYPE_DELETE] = get_string('requesttypedelete', 'tool_dataprivacy');
|
||||
|
||||
$mform->addElement('select', 'type', get_string('requesttype', 'tool_dataprivacy'), $options);
|
||||
$mform->addHelpButton('type', 'requesttype', 'tool_dataprivacy');
|
||||
@@ -174,7 +175,7 @@ class tool_dataprivacy_data_request_form extends \core\form\persistent {
|
||||
$errors['type'] = get_string('errorrequestalreadyexists', 'tool_dataprivacy');
|
||||
}
|
||||
|
||||
// Check if current user can create data deletion request.
|
||||
// Check if current user can create data requests.
|
||||
if ($data->type == api::DATAREQUEST_TYPE_DELETE) {
|
||||
if ($userid == $USER->id) {
|
||||
if (!api::can_create_data_deletion_request_for_self()) {
|
||||
@@ -184,6 +185,10 @@ class tool_dataprivacy_data_request_form extends \core\form\persistent {
|
||||
&& !api::can_create_data_deletion_request_for_children($userid)) {
|
||||
$errors['type'] = get_string('errorcannotrequestdeleteforother', 'tool_dataprivacy');
|
||||
}
|
||||
} else if ($data->type == api::DATAREQUEST_TYPE_EXPORT) {
|
||||
if ($userid == $USER->id && !api::can_create_data_download_request_for_self()) {
|
||||
$errors['type'] = get_string('errorcannotrequestexportforself', 'tool_dataprivacy');
|
||||
}
|
||||
}
|
||||
|
||||
return $errors;
|
||||
|
||||
@@ -135,6 +135,7 @@ $string['effectiveretentionperioduser'] = '{$a} (since the last time the user ac
|
||||
$string['emailsalutation'] = 'Dear {$a},';
|
||||
$string['errorcannotrequestdeleteforself'] = 'You don\'t have permission to create deletion request for yourself.';
|
||||
$string['errorcannotrequestdeleteforother'] = 'You don\'t have permission to create deletion request for this user.';
|
||||
$string['errorcannotrequestexportforself'] = 'You don\'t have permission to create export request for yourself.';
|
||||
$string['errorcontactdpodisabled'] = 'The option to contact the privacy officer is disabled.';
|
||||
$string['errorinvalidrequestcomments'] = 'The comments field may contain plain text only.';
|
||||
$string['errorinvalidrequestcreationmethod'] = 'Invalid request creation method!';
|
||||
|
||||
@@ -68,8 +68,9 @@ function tool_dataprivacy_myprofile_navigation(tree $tree, $user, $iscurrentuser
|
||||
|
||||
// Check if the user has an ongoing data export request.
|
||||
$hasexportrequest = \tool_dataprivacy\api::has_ongoing_request($user->id, \tool_dataprivacy\api::DATAREQUEST_TYPE_EXPORT);
|
||||
// Show data export link only if the user doesn't have an ongoing data export request.
|
||||
if (!$hasexportrequest) {
|
||||
// Show data export link only if the user doesn't have an ongoing data export request and has permission
|
||||
// to download own data.
|
||||
if (!$hasexportrequest && \tool_dataprivacy\api::can_create_data_download_request_for_self()) {
|
||||
$exportparams = ['type' => \tool_dataprivacy\api::DATAREQUEST_TYPE_EXPORT];
|
||||
$exporturl = new moodle_url('/admin/tool/dataprivacy/createdatarequest.php', $exportparams);
|
||||
$exportnode = new core_user\output\myprofile\node('privacyandpolicies', 'requestdataexport',
|
||||
|
||||
@@ -26,6 +26,7 @@ use tool_dataprivacy\task\process_data_request_task;
|
||||
* API tests.
|
||||
*
|
||||
* @package tool_dataprivacy
|
||||
* @covers \tool_dataprivacy\api
|
||||
* @copyright 2018 Jun Pataleta
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
@@ -2174,6 +2175,27 @@ class api_test extends \advanced_testcase {
|
||||
return $request;
|
||||
}
|
||||
|
||||
/**
|
||||
* Test whether user can create data download request for themselves
|
||||
*/
|
||||
public function test_can_create_data_download_request_for_self(): void {
|
||||
global $DB;
|
||||
|
||||
$this->resetAfterTest();
|
||||
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
$this->setUser($user);
|
||||
|
||||
// The default user role allows for the creation of download data requests.
|
||||
$this->assertTrue(api::can_create_data_download_request_for_self());
|
||||
|
||||
// Prohibit that capability.
|
||||
$userrole = $DB->get_field('role', 'id', ['shortname' => 'user'], MUST_EXIST);
|
||||
assign_capability('tool/dataprivacy:downloadownrequest', CAP_PROHIBIT, $userrole, \context_user::instance($user->id));
|
||||
|
||||
$this->assertFalse(api::can_create_data_download_request_for_self());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test user cannot create data deletion request for themselves if they don't have
|
||||
* "tool/dataprivacy:requestdelete" capability.
|
||||
|
||||
@@ -14,17 +14,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Unit tests for the data_registry class.
|
||||
*
|
||||
* @package tool_dataprivacy
|
||||
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
use \tool_dataprivacy\data_registry;
|
||||
namespace tool_dataprivacy;
|
||||
|
||||
/**
|
||||
* Unit tests for the data_registry class.
|
||||
@@ -33,7 +23,7 @@ use \tool_dataprivacy\data_registry;
|
||||
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_dataprivacy_dataregistry_testcase extends advanced_testcase {
|
||||
class data_registry_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
* Ensure that the get_effective_context_value only errors if provided an inappropriate element.
|
||||
@@ -41,7 +31,7 @@ class tool_dataprivacy_dataregistry_testcase extends advanced_testcase {
|
||||
* This test is not great because we only test a limited set of values. This is a fault of the underlying API.
|
||||
*/
|
||||
public function test_get_effective_context_value_invalid_element() {
|
||||
$this->expectException(coding_exception::class);
|
||||
$this->expectException(\coding_exception::class);
|
||||
data_registry::get_effective_context_value(\context_system::instance(), 'invalid');
|
||||
}
|
||||
|
||||
@@ -51,7 +41,7 @@ class tool_dataprivacy_dataregistry_testcase extends advanced_testcase {
|
||||
* This test is not great because we only test a limited set of values. This is a fault of the underlying API.
|
||||
*/
|
||||
public function test_get_effective_contextlevel_value_invalid_element() {
|
||||
$this->expectException(coding_exception::class);
|
||||
$this->expectException(\coding_exception::class);
|
||||
data_registry::get_effective_contextlevel_value(\context_system::instance(), 'invalid');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,19 +14,13 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Tests for the data_request persistent.
|
||||
*
|
||||
* @package tool_dataprivacy
|
||||
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
namespace tool_dataprivacy;
|
||||
|
||||
use data_privacy_testcase;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
require_once('data_privacy_testcase.php');
|
||||
|
||||
use tool_dataprivacy\api;
|
||||
|
||||
/**
|
||||
* Tests for the data_request persistent.
|
||||
*
|
||||
@@ -34,7 +28,7 @@ use tool_dataprivacy\api;
|
||||
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_dataprivacy_data_request_testcase extends data_privacy_testcase {
|
||||
class data_request_test extends data_privacy_testcase {
|
||||
|
||||
/**
|
||||
* Data provider for testing is_resettable, and is_active.
|
||||
|
||||
@@ -14,25 +14,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Expired contexts tests.
|
||||
*
|
||||
* @package tool_dataprivacy
|
||||
* @copyright 2018 David Monllao
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
use tool_dataprivacy\api;
|
||||
use tool_dataprivacy\data_registry;
|
||||
use tool_dataprivacy\expired_context;
|
||||
use tool_dataprivacy\purpose;
|
||||
use tool_dataprivacy\purpose_override;
|
||||
use tool_dataprivacy\category;
|
||||
use tool_dataprivacy\contextlevel;
|
||||
use tool_dataprivacy\expired_contexts_manager;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
global $CFG;
|
||||
namespace tool_dataprivacy;
|
||||
|
||||
/**
|
||||
* Expired contexts tests.
|
||||
@@ -41,7 +23,7 @@ global $CFG;
|
||||
* @copyright 2018 David Monllao
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_dataprivacy_expired_contexts_testcase extends advanced_testcase {
|
||||
class expired_contexts_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
* Setup the basics with the specified retention period.
|
||||
|
||||
@@ -14,21 +14,11 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Expired data requests tests.
|
||||
*
|
||||
* @package tool_dataprivacy
|
||||
* @copyright 2018 Michael Hawkins
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
namespace tool_dataprivacy;
|
||||
|
||||
use tool_dataprivacy\api;
|
||||
use tool_dataprivacy\category;
|
||||
use tool_dataprivacy\data_request;
|
||||
use tool_dataprivacy\purpose;
|
||||
use data_privacy_testcase;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
global $CFG;
|
||||
|
||||
require_once('data_privacy_testcase.php');
|
||||
|
||||
@@ -39,7 +29,7 @@ require_once('data_privacy_testcase.php');
|
||||
* @copyright 2018 Michael Hawkins
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_dataprivacy_expired_data_requests_testcase extends data_privacy_testcase {
|
||||
class expired_data_requests_test extends data_privacy_testcase {
|
||||
|
||||
/**
|
||||
* Test tearDown.
|
||||
@@ -59,7 +49,7 @@ class tool_dataprivacy_expired_data_requests_testcase extends data_privacy_testc
|
||||
// Set up test users.
|
||||
$this->setAdminUser();
|
||||
$studentuser = $this->getDataGenerator()->create_user();
|
||||
$studentusercontext = context_user::instance($studentuser->id);
|
||||
$studentusercontext = \context_user::instance($studentuser->id);
|
||||
|
||||
$dpouser = $this->getDataGenerator()->create_user();
|
||||
$this->assign_site_dpo($dpouser);
|
||||
|
||||
@@ -14,13 +14,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Unit tests for the filtered_userlist.
|
||||
*
|
||||
* @package tool_dataprivacy
|
||||
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
namespace tool_dataprivacy;
|
||||
|
||||
/**
|
||||
* Unit tests for the filtered_userlist.
|
||||
@@ -29,7 +23,7 @@
|
||||
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_dataprivacy_filtered_userlist_testcase extends advanced_testcase {
|
||||
class filtered_userlist_test extends \advanced_testcase {
|
||||
/**
|
||||
* Test the apply_expired_contexts_filters function with arange of options.
|
||||
*
|
||||
|
||||
@@ -14,6 +14,13 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace tool_dataprivacy;
|
||||
|
||||
use data_privacy_testcase;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
require_once('data_privacy_testcase.php');
|
||||
|
||||
/**
|
||||
* Tests for the manager observer.
|
||||
*
|
||||
@@ -21,18 +28,7 @@
|
||||
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
require_once('data_privacy_testcase.php');
|
||||
|
||||
/**
|
||||
* API tests.
|
||||
*
|
||||
* @package tool_dataprivacy
|
||||
* @copyright 2018 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_dataprivacy_manager_observer_testcase extends data_privacy_testcase {
|
||||
class manager_observer_test extends data_privacy_testcase {
|
||||
/**
|
||||
* Ensure that when users are configured as DPO, they are sent an message upon failure.
|
||||
*/
|
||||
|
||||
@@ -14,16 +14,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Metadata registry tests.
|
||||
*
|
||||
* @package tool_dataprivacy
|
||||
* @copyright 2018 Adrian Greeve <adriangreeve.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
global $CFG;
|
||||
namespace tool_dataprivacy;
|
||||
|
||||
/**
|
||||
* Metadata registry tests.
|
||||
@@ -32,7 +23,7 @@ global $CFG;
|
||||
* @copyright 2018 Adrian Greeve <adriangreeve.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_dataprivacy_metadata_registry_testcase extends advanced_testcase {
|
||||
class metadata_registry_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
* Fetch the meta data and return it in a form that we can easily unit test.
|
||||
|
||||
@@ -14,18 +14,9 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Tests for the event observer.
|
||||
*
|
||||
* @package tool_dataprivacy
|
||||
* @copyright 2018 Mihail Geshoski <mihail@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
namespace tool_dataprivacy;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
use \tool_dataprivacy\event\user_deleted_observer;
|
||||
use \tool_dataprivacy\api;
|
||||
use tool_dataprivacy\event\user_deleted_observer;
|
||||
|
||||
/**
|
||||
* Event observer test.
|
||||
@@ -34,7 +25,7 @@ use \tool_dataprivacy\api;
|
||||
* @copyright 2018 Mihail Geshoski <mihail@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_dataprivacy_user_deleted_observer_testcase extends advanced_testcase {
|
||||
class user_deleted_observer_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
* Ensure that a delete data request is created upon user deletion.
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
This file describes API changes in /admin/tool/dataprivacy/*
|
||||
Information provided here is intended especially for developers.
|
||||
|
||||
=== 3.11.8 ===
|
||||
* New `api::can_create_data_download_request_for_self` method for determining whether user has permission to create their
|
||||
own data download requests
|
||||
@@ -14,7 +14,9 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
namespace tool_generator;
|
||||
|
||||
use tool_generator_course_backend;
|
||||
|
||||
/**
|
||||
* Automated unit testing. This tests the 'make large course' backend,
|
||||
@@ -24,7 +26,7 @@ defined('MOODLE_INTERNAL') || die();
|
||||
* @copyright 2013 The Open University
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_generator_maketestcourse_testcase extends advanced_testcase {
|
||||
class maketestcourse_test extends \advanced_testcase {
|
||||
/**
|
||||
* Creates a small test course and checks all the components have been put in place.
|
||||
*/
|
||||
@@ -52,7 +54,7 @@ class tool_generator_maketestcourse_testcase extends advanced_testcase {
|
||||
|
||||
// Get course details.
|
||||
$course = get_course($courseid);
|
||||
$context = context_course::instance($courseid);
|
||||
$context = \context_course::instance($courseid);
|
||||
$modinfo = get_fast_modinfo($course);
|
||||
|
||||
// Check course names.
|
||||
@@ -88,7 +90,7 @@ class tool_generator_maketestcourse_testcase extends advanced_testcase {
|
||||
|
||||
// Check it contains 2 files (the default txt and a dat file).
|
||||
$fs = get_file_storage();
|
||||
$resourcecontext = context_module::instance($resource->id);
|
||||
$resourcecontext = \context_module::instance($resource->id);
|
||||
$files = $fs->get_area_files($resourcecontext->id, 'mod_resource', 'content', false, 'filename', false);
|
||||
$files = array_values($files);
|
||||
$this->assertEquals(2, count($files));
|
||||
@@ -106,7 +108,7 @@ class tool_generator_maketestcourse_testcase extends advanced_testcase {
|
||||
$this->assertTrue($ok);
|
||||
|
||||
// Check it contains 2 files.
|
||||
$resourcecontext = context_module::instance($resource->id);
|
||||
$resourcecontext = \context_module::instance($resource->id);
|
||||
$files = $fs->get_area_files($resourcecontext->id, 'mod_resource', 'content', false, 'filename', false);
|
||||
$files = array_values($files);
|
||||
$this->assertEquals(2, count($files));
|
||||
@@ -155,7 +157,7 @@ class tool_generator_maketestcourse_testcase extends advanced_testcase {
|
||||
$lastusernumber = 0;
|
||||
$discussionstarters = array();
|
||||
foreach ($discussions as $discussion) {
|
||||
$usernumber = core_user::get_user($discussion->userid, 'id, idnumber')->idnumber;
|
||||
$usernumber = \core_user::get_user($discussion->userid, 'id, idnumber')->idnumber;
|
||||
|
||||
// Checks that the users are odd numbers.
|
||||
$this->assertEquals(1, $usernumber % 2);
|
||||
@@ -190,7 +192,7 @@ class tool_generator_maketestcourse_testcase extends advanced_testcase {
|
||||
$fs = get_file_storage();
|
||||
$resources = $modinfo->get_instances_of('resource');
|
||||
foreach ($resources as $resource) {
|
||||
$resourcecontext = context_module::instance($resource->id);
|
||||
$resourcecontext = \context_module::instance($resource->id);
|
||||
$files = $fs->get_area_files($resourcecontext->id, 'mod_resource', 'content', false, 'filename', false);
|
||||
foreach ($files as $file) {
|
||||
if ($file->get_mimetype() == 'application/octet-stream') {
|
||||
@@ -210,7 +212,7 @@ class tool_generator_maketestcourse_testcase extends advanced_testcase {
|
||||
$fs = get_file_storage();
|
||||
$resources = $modinfo->get_instances_of('resource');
|
||||
foreach ($resources as $resource) {
|
||||
$resourcecontext = context_module::instance($resource->id);
|
||||
$resourcecontext = \context_module::instance($resource->id);
|
||||
$files = $fs->get_area_files($resourcecontext->id, 'mod_resource', 'content', false, 'filename', false);
|
||||
foreach ($files as $file) {
|
||||
if ($file->get_mimetype() == 'application/octet-stream') {
|
||||
|
||||
@@ -22,27 +22,12 @@
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
namespace tool_generator;
|
||||
|
||||
use tool_generator_site_backend;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
/**
|
||||
* Silly class to access site_backend internal methods.
|
||||
*
|
||||
* @package tool_generator
|
||||
* @copyright 2013 David Monllaó
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class testable_tool_generator_site_backend extends tool_generator_site_backend {
|
||||
|
||||
/**
|
||||
* Public accessor.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public static function get_last_testcourse_id() {
|
||||
return parent::get_last_testcourse_id();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unit test for the site generator
|
||||
*
|
||||
@@ -50,7 +35,7 @@ class testable_tool_generator_site_backend extends tool_generator_site_backend {
|
||||
* @copyright 2013 David Monllaó
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_generator_maketestsite_testcase extends advanced_testcase {
|
||||
class maketestsite_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
* Checks that site courses shortnames are properly generated.
|
||||
@@ -102,5 +87,22 @@ class tool_generator_maketestsite_testcase extends advanced_testcase {
|
||||
$lastshortname = testable_tool_generator_site_backend::get_last_testcourse_id();
|
||||
$this->assertEquals(20, $lastshortname);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Silly class to access site_backend internal methods.
|
||||
*
|
||||
* @copyright 2013 David Monllaó
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class testable_tool_generator_site_backend extends tool_generator_site_backend {
|
||||
|
||||
/**
|
||||
* Public accessor.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public static function get_last_testcourse_id() {
|
||||
return parent::get_last_testcourse_id();
|
||||
}
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 207 B After Width: | Height: | Size: 329 B |
@@ -1,3 +1,3 @@
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
|
||||
<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
|
||||
]><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" preserveAspectRatio="xMinYMid meet" overflow="visible"><path d="M16 9v6c0 .5-.5 1-1 1H1c-.5 0-1-.5-1-1V9c0-.5.5-1 1-1h1c.5 0 1 .5 1 1v4h10V9c0-.5.5-1 1-1h1c.5 0 1 .5 1 1zm-3.6-3.9l-.7-.7c-.4-.4-1-.4-1.4 0l-.8.8V1c0-.5-.4-1-1-1h-1c-.5 0-1 .5-1 1v4.2l-.8-.8c-.4-.4-1-.4-1.4 0l-.7.7c-.4.4-.4 1 0 1.4l3.7 3.7c.2.2.5.3.7.3.3 0 .5-.1.7-.3l3.7-3.7c.4-.3.4-1 0-1.4z" fill="#999"/></svg>
|
||||
]><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" preserveAspectRatio="xMinYMid meet" overflow="visible"><path d="M16 9v6c0 .5-.5 1-1 1H1c-.5 0-1-.5-1-1V9c0-.5.5-1 1-1h1c.5 0 1 .5 1 1v4h10V9c0-.5.5-1 1-1h1c.5 0 1 .5 1 1zm-3.6-3.9l-.7-.7c-.4-.4-1-.4-1.4 0l-.8.8V1c0-.5-.4-1-1-1h-1c-.5 0-1 .5-1 1v4.2l-.8-.8c-.4-.4-1-.4-1.4 0l-.7.7c-.4.4-.4 1 0 1.4l3.7 3.7c.2.2.5.3.7.3.3 0 .5-.1.7-.3l3.7-3.7c.4-.3.4-1 0-1.4z" fill="#888"/></svg>
|
||||
|
Before Width: | Height: | Size: 618 B After Width: | Height: | Size: 618 B |
@@ -15,14 +15,10 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Provides the unit tests class and some helper classes
|
||||
*
|
||||
* @package tool_installaddon
|
||||
* @category test
|
||||
* @copyright 2013 David Mudrak <david@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
namespace tool_installaddon;
|
||||
|
||||
use testable_tool_installaddon_installer;
|
||||
use tool_installaddon_installer;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
@@ -32,10 +28,12 @@ require_once(__DIR__.'/fixtures/testable_installer.php');
|
||||
/**
|
||||
* Unit tests for the {@link tool_installaddon_installer} class
|
||||
*
|
||||
* @package tool_installaddon
|
||||
* @category test
|
||||
* @copyright 2013 David Mudrak <david@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_installaddon_installer_testcase extends advanced_testcase {
|
||||
class installer_test extends \advanced_testcase {
|
||||
|
||||
public function test_get_addons_repository_url() {
|
||||
$installer = testable_tool_installaddon_installer::instance();
|
||||
|
||||
@@ -22,15 +22,17 @@
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
namespace tool_langimport;
|
||||
|
||||
/**
|
||||
* Tests for \tool_langimport\locale class.
|
||||
*
|
||||
* @package tool_langimport
|
||||
* @category test
|
||||
* @copyright 2018 Université Rennes 2 {@link https://www.univ-rennes2.fr}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class locale_testcase extends \advanced_testcase {
|
||||
class locale_test extends \advanced_testcase {
|
||||
/**
|
||||
* Test that \tool_langimport\locale::check_locale_availability() works as expected.
|
||||
*
|
||||
@@ -65,7 +67,7 @@ class locale_testcase extends \advanced_testcase {
|
||||
|
||||
// Test an invalid parameter.
|
||||
$locale = new \tool_langimport\locale();
|
||||
$this->expectException(coding_exception::class);
|
||||
$this->expectException(\coding_exception::class);
|
||||
$locale->check_locale_availability('');
|
||||
}
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 345 B After Width: | Height: | Size: 510 B |
@@ -9,7 +9,7 @@
|
||||
xml:space="preserve" preserveAspectRatio="xMinYMid meet">
|
||||
<defs>
|
||||
</defs>
|
||||
<path style="fill:#999999;" d="M8.5,9.5C8.8,10,9,10.6,9,11.2c0,0.6-0.3,1.1-0.7,1.6l-2.5,2.5C5.2,15.8,4.7,16,4,16
|
||||
<path style="fill:#888;" d="M8.5,9.5C8.8,10,9,10.6,9,11.2c0,0.6-0.3,1.1-0.7,1.6l-2.5,2.5C5.2,15.8,4.7,16,4,16
|
||||
s-1.3-0.2-1.7-0.7l-1.5-1.5C0.2,13.3,0,12.7,0,12c0-0.7,0.2-1.3,0.7-1.7l2.5-2.5C3.7,7.3,4.3,7,5,7c0.5,0,1,0.2,1.5,0.5l-1,1
|
||||
C5.3,8.5,5.2,8.4,5,8.4c-0.3,0-0.5,0.1-0.8,0.3l-2.5,2.5c-0.2,0.2-0.3,0.5-0.3,0.7c0,0.3,0.1,0.5,0.3,0.7l1.5,1.5
|
||||
c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l2.5-2.5c0.2-0.2,0.3-0.5,0.3-0.8c0-0.2,0-0.3-0.1-0.4L8.5,9.5z M5,10L10,5
|
||||
|
||||
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
@@ -27,7 +27,8 @@ require_once($CFG->libdir . '/externallib.php');
|
||||
|
||||
$userid = required_param('userid', PARAM_INT); // The user id the key belongs to (for double-checking).
|
||||
$key = required_param('key', PARAM_ALPHANUMEXT); // The key generated by the tool_mobile_external::get_autologin_key() external function.
|
||||
$urltogo = optional_param('urltogo', $CFG->wwwroot, PARAM_URL); // URL to redirect.
|
||||
$urltogo = optional_param('urltogo', $CFG->wwwroot, PARAM_LOCALURL); // URL to redirect.
|
||||
$urltogo = $urltogo ?: $CFG->wwwroot;
|
||||
|
||||
$context = context_system::instance();
|
||||
$PAGE->set_context($context);
|
||||
|
||||
@@ -14,14 +14,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Unit tests for event observers.
|
||||
*
|
||||
* @package tool_monitor
|
||||
* @category test
|
||||
* @copyright 2014 onwards Ankit Agarwal <ankit.agrr@gmail.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
namespace tool_monitor;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
@@ -30,11 +23,14 @@ require_once($CFG->dirroot . '/blog/locallib.php');
|
||||
require_once($CFG->dirroot . '/blog/lib.php');
|
||||
|
||||
/**
|
||||
* Class tool_monitor_eventobservers_testcase
|
||||
* Unit tests for event observers.
|
||||
*
|
||||
* Tests for event observers
|
||||
* @package tool_monitor
|
||||
* @category test
|
||||
* @copyright 2014 onwards Ankit Agarwal <ankit.agrr@gmail.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_monitor_eventobservers_testcase extends advanced_testcase {
|
||||
class eventobservers_test extends \advanced_testcase {
|
||||
/**
|
||||
* Set up method.
|
||||
*/
|
||||
@@ -57,12 +53,12 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase {
|
||||
$course2 = $this->getDataGenerator()->create_course();
|
||||
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
|
||||
|
||||
$rule = new stdClass();
|
||||
$rule = new \stdClass();
|
||||
$rule->userid = $user->id;
|
||||
$rule->courseid = $course1->id;
|
||||
$rule->plugin = 'test';
|
||||
|
||||
$sub = new stdClass();
|
||||
$sub = new \stdClass();
|
||||
$sub->courseid = $course1->id;
|
||||
$sub->userid = $user->id;
|
||||
|
||||
@@ -83,7 +79,7 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase {
|
||||
}
|
||||
|
||||
// Add a site rule.
|
||||
$rule = new stdClass();
|
||||
$rule = new \stdClass();
|
||||
$rule->userid = $user->id;
|
||||
$rule->courseid = 0;
|
||||
$rule->plugin = 'core';
|
||||
@@ -135,7 +131,7 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase {
|
||||
// Fire a bunch of events.
|
||||
// Trigger a bunch of other events.
|
||||
$eventparams = array(
|
||||
'context' => context_course::instance($course->id)
|
||||
'context' => \context_course::instance($course->id)
|
||||
);
|
||||
for ($i = 0; $i < 5; $i++) {
|
||||
\core\event\course_viewed::create($eventparams)->trigger();
|
||||
@@ -148,14 +144,14 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase {
|
||||
$this->assertEquals(0, $DB->count_records('tool_monitor_events'));
|
||||
|
||||
// Now, let's create a rule so an event can be stored.
|
||||
$rule = new stdClass();
|
||||
$rule = new \stdClass();
|
||||
$rule->courseid = $course->id;
|
||||
$rule->plugin = 'mod_book';
|
||||
$rule->eventname = '\mod_book\event\course_module_instance_list_viewed';
|
||||
$rule = $monitorgenerator->create_rule($rule);
|
||||
|
||||
// Let's subscribe to this rule.
|
||||
$sub = new stdClass;
|
||||
$sub = new \stdClass;
|
||||
$sub->courseid = $course->id;
|
||||
$sub->ruleid = $rule->id;
|
||||
$sub->userid = $user->id;
|
||||
@@ -187,14 +183,14 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase {
|
||||
$DB->delete_records('tool_monitor_events');
|
||||
|
||||
// Now, let's create a site wide rule.
|
||||
$rule = new stdClass();
|
||||
$rule = new \stdClass();
|
||||
$rule->courseid = 0;
|
||||
$rule->plugin = 'mod_book';
|
||||
$rule->eventname = '\mod_book\event\course_module_instance_list_viewed';
|
||||
$rule = $monitorgenerator->create_rule($rule);
|
||||
|
||||
// Let's subscribe to this rule.
|
||||
$sub = new stdClass;
|
||||
$sub = new \stdClass;
|
||||
$sub->courseid = 0;
|
||||
$sub->ruleid = $rule->id;
|
||||
$sub->userid = $user->id;
|
||||
@@ -231,14 +227,14 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase {
|
||||
$course = $this->getDataGenerator()->create_course();
|
||||
$toolgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
|
||||
|
||||
$rulerecord = new stdClass();
|
||||
$rulerecord = new \stdClass();
|
||||
$rulerecord->courseid = $course->id;
|
||||
$rulerecord->eventname = '\mod_book\event\course_module_instance_list_viewed';
|
||||
$rulerecord->frequency = 1;
|
||||
|
||||
$rule = $toolgenerator->create_rule($rulerecord);
|
||||
|
||||
$subrecord = new stdClass();
|
||||
$subrecord = new \stdClass();
|
||||
$subrecord->courseid = $course->id;
|
||||
$subrecord->ruleid = $rule->id;
|
||||
$subrecord->userid = $USER->id;
|
||||
@@ -279,7 +275,7 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase {
|
||||
$DB->delete_records('tool_monitor_events');
|
||||
|
||||
// Now let us create a rule specific to a module instance.
|
||||
$cm = new stdClass();
|
||||
$cm = new \stdClass();
|
||||
$cm->course = $course->id;
|
||||
$book = $this->getDataGenerator()->create_module('book', $cm);
|
||||
$rulerecord->eventname = '\mod_book\event\course_module_viewed';
|
||||
@@ -290,7 +286,7 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase {
|
||||
|
||||
// Let us trigger events.
|
||||
$params = array(
|
||||
'context' => context_module::instance($book->cmid),
|
||||
'context' => \context_module::instance($book->cmid),
|
||||
'objectid' => $book->id
|
||||
);
|
||||
for ($i = 0; $i < 5; $i++) {
|
||||
@@ -337,10 +333,10 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase {
|
||||
$toolgenerator->create_subscription($subrecord);
|
||||
|
||||
// Let us trigger events.
|
||||
$blog = new blog_entry();
|
||||
$blog = new \blog_entry();
|
||||
$blog->subject = "Subject of blog";
|
||||
$blog->userid = $USER->id;
|
||||
$states = blog_entry::get_applicable_publish_states();
|
||||
$states = \blog_entry::get_applicable_publish_states();
|
||||
$blog->publishstate = reset($states);
|
||||
for ($i = 0; $i < 5; $i++) {
|
||||
$newblog = fullclone($blog);
|
||||
@@ -367,14 +363,14 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase {
|
||||
$course = $this->getDataGenerator()->create_course();
|
||||
$toolgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
|
||||
|
||||
$rulerecord = new stdClass();
|
||||
$rulerecord = new \stdClass();
|
||||
$rulerecord->courseid = $course->id;
|
||||
$rulerecord->eventname = '\mod_book\event\course_module_instance_list_viewed';
|
||||
$rulerecord->frequency = 5;
|
||||
|
||||
$rule = $toolgenerator->create_rule($rulerecord);
|
||||
|
||||
$subrecord = new stdClass();
|
||||
$subrecord = new \stdClass();
|
||||
$subrecord->courseid = $course->id;
|
||||
$subrecord->ruleid = $rule->id;
|
||||
$subrecord->userid = $USER->id;
|
||||
@@ -416,7 +412,7 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase {
|
||||
*
|
||||
* @param phpunit_message_sink $msgsink Message sink
|
||||
*/
|
||||
protected function verify_processed_data(phpunit_message_sink $msgsink) {
|
||||
protected function verify_processed_data(\phpunit_message_sink $msgsink) {
|
||||
global $DB, $USER;
|
||||
|
||||
$recordexists = $DB->count_records('task_adhoc', array('component' => 'tool_monitor'));
|
||||
@@ -435,7 +431,7 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase {
|
||||
*
|
||||
* @param phpunit_message_sink $msgsink Message sink
|
||||
*/
|
||||
protected function verify_message_not_sent_yet(phpunit_message_sink $msgsink) {
|
||||
protected function verify_message_not_sent_yet(\phpunit_message_sink $msgsink) {
|
||||
$msgs = $msgsink->get_messages();
|
||||
$this->assertCount(0, $msgs);
|
||||
$msgsink->clear();
|
||||
@@ -457,12 +453,12 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase {
|
||||
$context = \context_user::instance($USER->id, IGNORE_MISSING);
|
||||
|
||||
// Creating book.
|
||||
$cm = new stdClass();
|
||||
$cm = new \stdClass();
|
||||
$cm->course = $course->id;
|
||||
$book = $this->getDataGenerator()->create_module('book', $cm);
|
||||
|
||||
// Creating rule.
|
||||
$rulerecord = new stdClass();
|
||||
$rulerecord = new \stdClass();
|
||||
$rulerecord->courseid = $course->id;
|
||||
$rulerecord->eventname = '\mod_book\event\course_module_viewed';
|
||||
$rulerecord->cmid = $book->cmid;
|
||||
@@ -478,7 +474,7 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase {
|
||||
$rule = $toolgenerator->create_rule($rulerecord);
|
||||
|
||||
// Creating subscription.
|
||||
$subrecord = new stdClass();
|
||||
$subrecord = new \stdClass();
|
||||
$subrecord->courseid = $course->id;
|
||||
$subrecord->ruleid = $rule->id;
|
||||
$subrecord->userid = $USER->id;
|
||||
@@ -486,7 +482,7 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase {
|
||||
|
||||
// Now let us trigger the event.
|
||||
$params = array(
|
||||
'context' => context_module::instance($book->cmid),
|
||||
'context' => \context_module::instance($book->cmid),
|
||||
'objectid' => $book->id
|
||||
);
|
||||
|
||||
@@ -496,7 +492,7 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase {
|
||||
$msgs = $msgsink->get_messages();
|
||||
$msg = array_pop($msgs);
|
||||
|
||||
$modurl = new moodle_url('/mod/book/view.php', array('id' => $book->cmid));
|
||||
$modurl = new \moodle_url('/mod/book/view.php', array('id' => $book->cmid));
|
||||
|
||||
$this->assertMatchesRegularExpression('~<h2>.*' . preg_quote($event->get_url()->out(), '~') . '.*</h2>~',
|
||||
$msg->fullmessagehtml);
|
||||
@@ -529,12 +525,12 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase {
|
||||
$course2 = $this->getDataGenerator()->create_course();
|
||||
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
|
||||
|
||||
$rule = new stdClass();
|
||||
$rule = new \stdClass();
|
||||
$rule->userid = $user->id;
|
||||
$rule->courseid = $course1->id;
|
||||
$rule->plugin = 'test';
|
||||
|
||||
$sub = new stdClass();
|
||||
$sub = new \stdClass();
|
||||
$sub->courseid = $course1->id;
|
||||
$sub->userid = $user->id;
|
||||
|
||||
@@ -585,16 +581,16 @@ class tool_monitor_eventobservers_testcase extends advanced_testcase {
|
||||
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
|
||||
|
||||
// Now let us create a rule specific to a module instance.
|
||||
$cm = new stdClass();
|
||||
$cm = new \stdClass();
|
||||
$cm->course = $course1->id;
|
||||
$book = $this->getDataGenerator()->create_module('book', $cm);
|
||||
|
||||
$rule = new stdClass();
|
||||
$rule = new \stdClass();
|
||||
$rule->userid = $user->id;
|
||||
$rule->courseid = $course1->id;
|
||||
$rule->plugin = 'test';
|
||||
|
||||
$sub = new stdClass();
|
||||
$sub = new \stdClass();
|
||||
$sub->courseid = $course1->id;
|
||||
$sub->userid = $user->id;
|
||||
$sub->cmid = $book->cmid;
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace tool_monitor;
|
||||
|
||||
/**
|
||||
* Unit tests for rule manager api.
|
||||
*
|
||||
@@ -22,17 +24,7 @@
|
||||
* @copyright 2014 onwards Simey Lameze <simey@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
|
||||
/**
|
||||
* Tests for rule manager.
|
||||
*
|
||||
* Class tool_monitor_rule_manager_testcase
|
||||
*/
|
||||
class tool_monitor_rule_manager_testcase extends advanced_testcase {
|
||||
class rule_manager_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
* Set up method.
|
||||
@@ -53,7 +45,7 @@ class tool_monitor_rule_manager_testcase extends advanced_testcase {
|
||||
$course = $this->getDataGenerator()->create_course();
|
||||
$now = time();
|
||||
|
||||
$rule = new stdClass();
|
||||
$rule = new \stdClass();
|
||||
$rule->userid = $user->id;
|
||||
$rule->courseid = $course->id;
|
||||
$rule->name = 'test rule 1';
|
||||
@@ -98,7 +90,7 @@ class tool_monitor_rule_manager_testcase extends advanced_testcase {
|
||||
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
|
||||
$rule = $monitorgenerator->create_rule();
|
||||
|
||||
$ruledata = new stdClass;
|
||||
$ruledata = new \stdClass;
|
||||
$ruledata->id = $rule->id;
|
||||
$ruledata->frequency = 25;
|
||||
|
||||
@@ -119,10 +111,10 @@ class tool_monitor_rule_manager_testcase extends advanced_testcase {
|
||||
$course1 = $this->getDataGenerator()->create_course();
|
||||
$course2 = $this->getDataGenerator()->create_course();
|
||||
|
||||
$record = new stdClass();
|
||||
$record = new \stdClass();
|
||||
$record->courseid = $course1->id;
|
||||
|
||||
$record2 = new stdClass();
|
||||
$record2 = new \stdClass();
|
||||
$record2->courseid = $course2->id;
|
||||
|
||||
$ruleids = array();
|
||||
@@ -147,10 +139,10 @@ class tool_monitor_rule_manager_testcase extends advanced_testcase {
|
||||
|
||||
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
|
||||
|
||||
$record = new stdClass();
|
||||
$record = new \stdClass();
|
||||
$record->plugin = 'core';
|
||||
|
||||
$record2 = new stdClass();
|
||||
$record2 = new \stdClass();
|
||||
$record2->plugin = 'mod_assign';
|
||||
|
||||
$ruleids = array();
|
||||
@@ -175,10 +167,10 @@ class tool_monitor_rule_manager_testcase extends advanced_testcase {
|
||||
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
|
||||
$rule = $monitorgenerator->create_rule();
|
||||
|
||||
$record = new stdClass();
|
||||
$record = new \stdClass();
|
||||
$record->eventname = '\core\event\calendar_event_created';
|
||||
|
||||
$record2 = new stdClass();
|
||||
$record2 = new \stdClass();
|
||||
$record2->eventname = '\core\event\calendar_event_updated';
|
||||
|
||||
$ruleids = array();
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace tool_monitor;
|
||||
|
||||
/**
|
||||
* Unit tests for subscription manager api.
|
||||
*
|
||||
@@ -22,17 +24,7 @@
|
||||
* @copyright 2014 onwards Simey Lameze <simey@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
|
||||
/**
|
||||
* Tests for subscription manager.
|
||||
*
|
||||
* Class tool_monitor_subscription_manager_testcase.
|
||||
*/
|
||||
class tool_monitor_subscription_manager_testcase extends advanced_testcase {
|
||||
class subscription_manager_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
* Test count_rule_subscriptions method.
|
||||
@@ -56,7 +48,7 @@ class tool_monitor_subscription_manager_testcase extends advanced_testcase {
|
||||
$this->assertEquals(0, $subs);
|
||||
|
||||
// Subscribe user 1 to rule 1.
|
||||
$record = new stdClass;
|
||||
$record = new \stdClass;
|
||||
$record->ruleid = $rule1->id;
|
||||
$record->userid = $user1->id;
|
||||
$monitorgenerator->create_subscription($record);
|
||||
@@ -75,4 +67,4 @@ class tool_monitor_subscription_manager_testcase extends advanced_testcase {
|
||||
$this->assertEquals(2, $subs1);
|
||||
$this->assertEquals(1, $subs2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,8 @@
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
defined('MOODLE_INTERNAL') || exit();
|
||||
|
||||
namespace tool_monitor;
|
||||
|
||||
/**
|
||||
* Unit tests for the subscription class.
|
||||
@@ -24,7 +25,7 @@ defined('MOODLE_INTERNAL') || exit();
|
||||
* @copyright 2016 Jake Dallimore <jrhdallimore@gmail.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_monitor_subscription_testcase extends advanced_testcase {
|
||||
class subscription_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
* @var \tool_monitor\subscription $subscription object.
|
||||
@@ -38,7 +39,7 @@ class tool_monitor_subscription_testcase extends advanced_testcase {
|
||||
$this->resetAfterTest(true);
|
||||
|
||||
// Create the mock subscription.
|
||||
$sub = new stdClass();
|
||||
$sub = new \stdClass();
|
||||
$sub->id = 100;
|
||||
$sub->name = 'My test rule';
|
||||
$sub->courseid = 20;
|
||||
@@ -62,7 +63,7 @@ class tool_monitor_subscription_testcase extends advanced_testcase {
|
||||
*/
|
||||
public function test_magic_get() {
|
||||
$this->assertEquals(20, $this->subscription->courseid);
|
||||
$this->expectException(coding_exception::class);
|
||||
$this->expectException(\coding_exception::class);
|
||||
$this->subscription->ruleid;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,8 @@
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
defined('MOODLE_INTERNAL') || exit();
|
||||
|
||||
namespace tool_monitor;
|
||||
|
||||
/**
|
||||
* Unit tests for the tool_monitor clean events task.
|
||||
@@ -24,7 +25,7 @@ defined('MOODLE_INTERNAL') || exit();
|
||||
* @copyright 2016 Jake Dallimore <jrhdallimore@gmail.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_monitor_task_check_subscriptions_testcase extends advanced_testcase {
|
||||
class task_check_subscriptions_test extends \advanced_testcase {
|
||||
|
||||
private $course;
|
||||
private $user;
|
||||
@@ -45,7 +46,7 @@ class tool_monitor_task_check_subscriptions_testcase extends advanced_testcase {
|
||||
$this->user = $this->getDataGenerator()->create_user();
|
||||
$this->course = $this->getDataGenerator()->create_course();
|
||||
|
||||
$rule = new stdClass();
|
||||
$rule = new \stdClass();
|
||||
$rule->userid = 2; // Rule created by admin.
|
||||
$rule->courseid = $this->course->id;
|
||||
$rule->plugin = 'mod_book';
|
||||
@@ -54,7 +55,7 @@ class tool_monitor_task_check_subscriptions_testcase extends advanced_testcase {
|
||||
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
|
||||
$this->rule = $monitorgenerator->create_rule($rule);
|
||||
|
||||
$sub = new stdClass();
|
||||
$sub = new \stdClass();
|
||||
$sub->courseid = $this->course->id;
|
||||
$sub->userid = $this->user->id;
|
||||
$sub->ruleid = $this->rule->id;
|
||||
@@ -90,7 +91,7 @@ class tool_monitor_task_check_subscriptions_testcase extends advanced_testcase {
|
||||
public function test_site_level_subscription() {
|
||||
// Create a site level subscription.
|
||||
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
|
||||
$sub = new stdClass();
|
||||
$sub = new \stdClass();
|
||||
$sub->userid = $this->user->id;
|
||||
$sub->ruleid = $this->rule->id;
|
||||
$this->subscription = $monitorgenerator->create_subscription($sub);
|
||||
@@ -104,7 +105,7 @@ class tool_monitor_task_check_subscriptions_testcase extends advanced_testcase {
|
||||
$this->assertEquals(false, \tool_monitor\subscription_manager::subscription_is_active($this->subscription));
|
||||
|
||||
// Now, assign the user as a teacher role at system context.
|
||||
$this->getDataGenerator()->role_assign($this->teacherrole->id, $this->user->id, context_system::instance());
|
||||
$this->getDataGenerator()->role_assign($this->teacherrole->id, $this->user->id, \context_system::instance());
|
||||
|
||||
// Run the task.
|
||||
$task = new \tool_monitor\task\check_subscriptions();
|
||||
@@ -238,7 +239,7 @@ class tool_monitor_task_check_subscriptions_testcase extends advanced_testcase {
|
||||
$book = $this->getDataGenerator()->create_module('book', array('course' => $this->course->id));
|
||||
|
||||
// And add a subscription to it.
|
||||
$sub = new stdClass();
|
||||
$sub = new \stdClass();
|
||||
$sub->courseid = $this->course->id;
|
||||
$sub->userid = $this->user->id;
|
||||
$sub->ruleid = $this->rule->id;
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace tool_monitor;
|
||||
|
||||
/**
|
||||
* Unit tests for the tool_monitor clean events task.
|
||||
*
|
||||
@@ -22,15 +24,7 @@
|
||||
* @copyright 2014 Mark Nelson <markn@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
|
||||
/**
|
||||
* Class used to test the tool_monitor clean events task.
|
||||
*/
|
||||
class tool_monitor_task_clean_events_testcase extends advanced_testcase {
|
||||
class task_clean_events_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
* Test set up.
|
||||
@@ -51,16 +45,16 @@ class tool_monitor_task_clean_events_testcase extends advanced_testcase {
|
||||
$course = $this->getDataGenerator()->create_course();
|
||||
$bookgenerator = $this->getDataGenerator()->get_plugin_generator('mod_book');
|
||||
$book = $this->getDataGenerator()->create_module('book', array('course' => $course->id));
|
||||
$bookcontext = context_module::instance($book->cmid);
|
||||
$bookcontext = \context_module::instance($book->cmid);
|
||||
$bookchapter = $bookgenerator->create_chapter(array('bookid' => $book->id));
|
||||
$course2 = $this->getDataGenerator()->create_course();
|
||||
$book2 = $this->getDataGenerator()->create_module('book', array('course' => $course2->id));
|
||||
$book2context = context_module::instance($book2->cmid);
|
||||
$book2context = \context_module::instance($book2->cmid);
|
||||
$book2chapter = $bookgenerator->create_chapter(array('bookid' => $book2->id));
|
||||
$monitorgenerator = $this->getDataGenerator()->get_plugin_generator('tool_monitor');
|
||||
|
||||
// Let's set some data for the rules we need before we can generate them.
|
||||
$rule = new stdClass();
|
||||
$rule = new \stdClass();
|
||||
$rule->userid = $user->id;
|
||||
$rule->courseid = $course->id;
|
||||
$rule->plugin = 'mod_book';
|
||||
@@ -96,7 +90,7 @@ class tool_monitor_task_clean_events_testcase extends advanced_testcase {
|
||||
|
||||
|
||||
// Let's subscribe to these rules.
|
||||
$sub = new stdClass;
|
||||
$sub = new \stdClass;
|
||||
$sub->courseid = $course->id;
|
||||
$sub->ruleid = $rule1->id;
|
||||
$sub->userid = $user->id;
|
||||
@@ -133,7 +127,7 @@ class tool_monitor_task_clean_events_testcase extends advanced_testcase {
|
||||
|
||||
// Trigger a bunch of other events.
|
||||
$eventparams = array(
|
||||
'context' => context_course::instance($course->id)
|
||||
'context' => \context_course::instance($course->id)
|
||||
);
|
||||
for ($i = 0; $i < 5; $i++) {
|
||||
\mod_quiz\event\course_module_instance_list_viewed::create($eventparams)->trigger();
|
||||
@@ -164,7 +158,7 @@ class tool_monitor_task_clean_events_testcase extends advanced_testcase {
|
||||
$this->assertEquals($course2->id, $event4->courseid);
|
||||
|
||||
// Update the timewindow for two of the rules.
|
||||
$updaterule = new stdClass();
|
||||
$updaterule = new \stdClass();
|
||||
$updaterule->id = $rule1->id;
|
||||
$updaterule->timewindow = 0;
|
||||
\tool_monitor\rule_manager::update_rule($updaterule);
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
// This file is part of Moodle - http://moodle.org/
|
||||
//
|
||||
// Moodle is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Moodle is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace tool_moodlenet\task;
|
||||
|
||||
use core\message\message;
|
||||
|
||||
/**
|
||||
* Ad-hoc task to send a notification to admin stating that the user data related to the linked MoodleNet profiles has
|
||||
* been removed.
|
||||
*
|
||||
* @package tool_moodlenet
|
||||
* @copyright 2022 Mihail Geshoski <mihail@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class send_mnet_profiles_data_removed_notification extends \core\task\adhoc_task {
|
||||
public function execute(): void {
|
||||
$message = new message();
|
||||
$message->component = 'moodle';
|
||||
$message->name = 'notices';
|
||||
$message->userfrom = \core_user::get_noreply_user();
|
||||
$message->userto = get_admin();
|
||||
$message->notification = 1;
|
||||
$message->subject = get_string('removedmnetprofilenotification_subject', 'tool_moodlenet');
|
||||
$message->fullmessageformat = FORMAT_HTML;
|
||||
$message->fullmessagehtml = get_string('removedmnetprofilenotification', 'tool_moodlenet');
|
||||
$message->smallmessage = strip_tags($message->fullmessagehtml);
|
||||
message_send($message);
|
||||
}
|
||||
}
|
||||
@@ -129,5 +129,24 @@ function xmldb_tool_moodlenet_upgrade(int $oldversion) {
|
||||
// Automatically generated Moodle v3.11.0 release upgrade line.
|
||||
// Put any upgrade step following this.
|
||||
|
||||
if ($oldversion < 2021051701) {
|
||||
|
||||
$selectsql = "moodlenetprofile IS NOT NULL AND moodlenetprofile != ''";
|
||||
|
||||
// If there are any users with MoodleNet profile set.
|
||||
if ($DB->count_records_select('user', $selectsql)) {
|
||||
// Remove the value set for the MoodleNet profile as this format can no longer be used to authenticate
|
||||
// MoodleNet users.
|
||||
$DB->set_field_select('user', 'moodlenetprofile', '', $selectsql);
|
||||
|
||||
// Use an adhoc task to send a notification to admin stating that the user data related to the linked
|
||||
// MoodleNet profiles has been removed.
|
||||
$notificationtask = new tool_moodlenet\task\send_mnet_profiles_data_removed_notification();
|
||||
core\task\manager::queue_adhoc_task($notificationtask);
|
||||
}
|
||||
|
||||
upgrade_plugin_savepoint(true, 2021051701, 'tool', 'moodlenet');
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$string['addingaresource'] = 'Adding content from MoodleNet';
|
||||
$string['aria:enterprofile'] = "Enter your MoodleNet profile URL";
|
||||
$string['aria:enterprofile'] = "Enter your MoodleNet profile ID";
|
||||
$string['aria:footermessage'] = "Browse for content on MoodleNet";
|
||||
$string['browsecontentmoodlenet'] = "Or browse for content on MoodleNet";
|
||||
$string['clearsearch'] = "Clear search";
|
||||
@@ -39,11 +39,11 @@ $string['defaultmoodlenetname_desc'] = 'The name of the MoodleNet instance avail
|
||||
$string['enablemoodlenet'] = 'Enable MoodleNet integration';
|
||||
$string['enablemoodlenet_desc'] = 'If enabled, a user with the capability to create and manage activities can browse MoodleNet via the activity chooser and import MoodleNet resources into their course. In addition, a user with the capability to restore backups can select a backup file on MoodleNet and restore it into Moodle.';
|
||||
$string['errorduringdownload'] = 'An error occurred while downloading the file: {$a}';
|
||||
$string['forminfo'] = 'Your MoodleNet profile will be automatically saved in your profile on this site.';
|
||||
$string['forminfo'] = 'Your MoodleNet profile ID will be automatically saved in your profile on this site.';
|
||||
$string['footermessage'] = "Or browse for content on";
|
||||
$string['instancedescription'] = "MoodleNet is an open social media platform for educators, with a focus on the collaborative curation of collections of open resources. ";
|
||||
$string['instanceplaceholder'] = '@yourprofile@moodle.net';
|
||||
$string['inputhelp'] = 'Or if you have a MoodleNet account already, enter your MoodleNet profile:';
|
||||
$string['instanceplaceholder'] = 'a1b2c3d4e5f6-example@moodle.net';
|
||||
$string['inputhelp'] = 'Or if you have a MoodleNet account already, copy the ID from your MoodleNet profile and paste it here:';
|
||||
$string['invalidmoodlenetprofile'] = '$userprofile is not correctly formatted';
|
||||
$string['importconfirm'] = 'You are about to import the content "{$a->resourcename} ({$a->resourcetype})" into the course "{$a->coursename}". Are you sure you want to continue?';
|
||||
$string['importconfirmnocourse'] = 'You are about to import the content "{$a->resourcename} ({$a->resourcetype})" into your site. Are you sure you want to continue?';
|
||||
@@ -56,12 +56,14 @@ $string['mnetprofiledesc'] = '<p>Enter your MoodleNet profile details here to be
|
||||
$string['moodlenetsettings'] = 'MoodleNet settings';
|
||||
$string['moodlenetnotenabled'] = 'The MoodleNet integration must be enabled in Site administration / MoodleNet before resource imports can be processed.';
|
||||
$string['notification'] = 'You are about to import the content "{$a->name} ({$a->type})" into your site. Select the course in which it should be added, or <a href="{$a->cancellink}">cancel</a>.';
|
||||
$string['removedmnetprofilenotification'] = 'Due to recent changes on the MoodleNet platform, any users who previously saved their MoodleNet profile ID on the site will need to enter a MoodleNet profile ID in the new format in order to authenticate on the MoodleNet platform.';
|
||||
$string['removedmnetprofilenotification_subject'] = 'MoodleNet profile ID format change';
|
||||
$string['searchcourses'] = "Search courses";
|
||||
$string['selectpagetitle'] = 'Select page';
|
||||
$string['pluginname'] = 'MoodleNet';
|
||||
$string['privacy:metadata'] = "The MoodleNet tool only facilitates communication with MoodleNet. It stores no data.";
|
||||
$string['profilevalidationerror'] = 'There was a problem trying to validate your profile';
|
||||
$string['profilevalidationfail'] = 'Please enter a valid MoodleNet profile';
|
||||
$string['profilevalidationerror'] = 'There was a problem trying to validate your MoodleNet profile ID';
|
||||
$string['profilevalidationfail'] = 'Please enter a valid MoodleNet profile ID';
|
||||
$string['profilevalidationpass'] = 'Looks good!';
|
||||
$string['saveandgo'] = "Save and go";
|
||||
$string['uploadlimitexceeded'] = 'The file size {$a->filesize} exceeds the user upload limit of {$a->uploadlimit} bytes.';
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace tool_moodlenet;
|
||||
|
||||
/**
|
||||
* Unit tests for the import_backup_helper
|
||||
*
|
||||
@@ -22,15 +24,7 @@
|
||||
* @copyright 2020 Adrian Greeve <adrian@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
|
||||
/**
|
||||
* Class import_backup_helper tests
|
||||
*/
|
||||
class tool_moodlenet_import_backup_helper_testcase extends advanced_testcase {
|
||||
class import_backup_helper_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
* Test that the first available context with the capability to upload backup files is returned.
|
||||
@@ -47,7 +41,7 @@ class tool_moodlenet_import_backup_helper_testcase extends advanced_testcase {
|
||||
$user5 = $this->getDataGenerator()->create_user();
|
||||
|
||||
$course = $this->getDataGenerator()->create_course();
|
||||
$coursecontext = context_course::instance($course->id);
|
||||
$coursecontext = \context_course::instance($course->id);
|
||||
|
||||
$this->getDataGenerator()->enrol_user($user1->id, $course->id, 'student');
|
||||
$this->getDataGenerator()->enrol_user($user2->id, $course->id, 'editingteacher');
|
||||
@@ -55,12 +49,12 @@ class tool_moodlenet_import_backup_helper_testcase extends advanced_testcase {
|
||||
|
||||
$category = $this->getDataGenerator()->create_category();
|
||||
$rolerecord = $DB->get_record('role', ['shortname' => 'manager']);
|
||||
$categorycontext = context_coursecat::instance($category->id);
|
||||
$categorycontext = \context_coursecat::instance($category->id);
|
||||
$this->getDataGenerator()->role_assign($rolerecord->id, $user3->id, $categorycontext->id);
|
||||
$this->getDataGenerator()->role_assign($rolerecord->id, $user5->id, $categorycontext->id);
|
||||
|
||||
$roleid = $this->getDataGenerator()->create_role();
|
||||
$sitecontext = context_system::instance();
|
||||
$sitecontext = \context_system::instance();
|
||||
assign_capability('moodle/restore:uploadfile', CAP_ALLOW, $roleid, $sitecontext->id, true);
|
||||
accesslib_clear_all_caches_for_unit_testing();
|
||||
$this->getDataGenerator()->role_assign($roleid, $user4->id, $sitecontext->id);
|
||||
@@ -81,4 +75,4 @@ class tool_moodlenet_import_backup_helper_testcase extends advanced_testcase {
|
||||
$this->assertEquals(CONTEXT_COURSECAT, $result->contextlevel);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace tool_moodlenet;
|
||||
|
||||
/**
|
||||
* Unit tests for the profile manager
|
||||
*
|
||||
@@ -22,15 +24,7 @@
|
||||
* @copyright 2020 Adrian Greeve <adrian@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
|
||||
/**
|
||||
* Class profile_manager tests
|
||||
*/
|
||||
class tool_moodlenet_profile_manager_testcase extends advanced_testcase {
|
||||
class profile_manager_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
* Test that on this site we use the user table to hold moodle net profile information.
|
||||
@@ -57,7 +51,7 @@ class tool_moodlenet_profile_manager_testcase extends advanced_testcase {
|
||||
$this->resetAfterTest();
|
||||
$user = $this->getDataGenerator()->create_user();
|
||||
|
||||
$this->expectException(moodle_exception::class);
|
||||
$this->expectException(\moodle_exception::class);
|
||||
$this->expectExceptionMessage(get_string('invalidmoodlenetprofile', 'tool_moodlenet'));
|
||||
$result = new \tool_moodlenet\moodlenet_user_profile("", $user->id);
|
||||
}
|
||||
|
||||
@@ -25,6 +25,6 @@
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
$plugin->component = 'tool_moodlenet';
|
||||
$plugin->version = 2021051700;
|
||||
$plugin->version = 2021051701;
|
||||
$plugin->requires = 2021051100;
|
||||
$plugin->maturity = MATURITY_ALPHA;
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
$string['acceptrisk'] = 'I understand that disabling email verification can be a security issue';
|
||||
$string['acceptrisk_help'] = 'Disabling email verification can be a security issue. As it potentially allows users to authenticate as another in the right circumstances.';
|
||||
$string['acceptrisk'] = 'I understand that disabling email verification can be a security issue.';
|
||||
$string['acceptrisk_help'] = 'Disabling email verification can potentially allow a user to authenticate as another user.';
|
||||
$string['authconfirm'] = 'This action will grant permanent API access to Moodle for the authenticated account. This is intended to be used as a system account for managing files owned by Moodle.';
|
||||
$string['authconnected'] = 'The system account is now connected for offline access';
|
||||
$string['authnotconnected'] = 'The system account was not connected for offline access';
|
||||
|
||||
@@ -16,10 +16,10 @@ Feature: OAuth2 email verification
|
||||
| Name | Testing service |
|
||||
| Client ID | thisistheclientid |
|
||||
| Client secret | supersecret |
|
||||
Then I should not see "I understand that disabling email verification can be a security issue"
|
||||
Then I should not see "I understand that disabling email verification can be a security issue."
|
||||
And I click on "Require email verification" "checkbox"
|
||||
And I should see "I understand that disabling email verification can be a security issue"
|
||||
And I click on "I understand that disabling email verification can be a security issue" "checkbox"
|
||||
And I should see "I understand that disabling email verification can be a security issue."
|
||||
And I click on "I understand that disabling email verification can be a security issue." "checkbox"
|
||||
And I press "Save changes"
|
||||
And I should see "Changes saved"
|
||||
And I click on "Edit" "link" in the "Testing service" "table_row"
|
||||
|
||||
|
Before Width: | Height: | Size: 345 B After Width: | Height: | Size: 294 B |
@@ -56,5 +56,5 @@
|
||||
d="m 10.60981,13.748496 q -0.42076,-0.2046 -0.42076,-0.6595 v -2.1834 H 0.36389001 q -0.15919999,0 -0.26154001,-0.102297 Q 0,10.700897 0,10.541796 V 2.5361969 q 0,-0.2388 0.20469002,-0.3297 0.22743999,-0.091 0.39800999,0.045 L 2.7860701,4.0708971 q 0.1250916,0.1024 0.1250916,0.2842998 v 3.639 H 10.18905 V 5.810797 q 0,-0.4548999 0.42076,-0.6596001 0.42075,-0.1932998 0.77327,0.1024 L 15.749821,8.892496 Q 16,9.0971966 16,9.4496973 16,9.8022974 15.749821,10.006998 l -4.366741,3.638798 q -0.36389,0.307 -0.77327,0.102297 z"
|
||||
id="path4552"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#999999;fill-opacity:1;stroke-width:0.9999997" />
|
||||
style="fill:#888;fill-opacity:1;stroke-width:0.9999997" />
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
@@ -14,31 +14,20 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Provides the {@link tool_policy_sitepolicy_handler_testcase} class.
|
||||
*
|
||||
* @package tool_policy
|
||||
* @category test
|
||||
* @copyright 2018 David Mudrák <david@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
namespace tool_policy;
|
||||
|
||||
use tool_policy\api;
|
||||
use tool_policy\policy_version;
|
||||
use tool_policy\privacy\local\sitepolicy\handler;
|
||||
use tool_policy\test\helper;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
|
||||
/**
|
||||
* Unit tests for the {@link \tool_policy\privacy\local\sitepolicy\handler} class.
|
||||
*
|
||||
* @package tool_policy
|
||||
* @category test
|
||||
* @copyright 2018 David Mudrak <david@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_policy_sitepolicy_handler_testcase extends advanced_testcase {
|
||||
class sitepolicy_handler_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
* Test behaviour of the {@link \tool_policy\privacy\local\sitepolicy\handler::get_redirect_url()} method.
|
||||
|
||||
|
Before Width: | Height: | Size: 229 B After Width: | Height: | Size: 247 B |
@@ -9,7 +9,7 @@
|
||||
xml:space="preserve" preserveAspectRatio="xMinYMid meet">
|
||||
<defs>
|
||||
</defs>
|
||||
<path style="fill:#999999;" d="M2,5v9c0,1.1,0.9,2,2,2h8c1.1,0,2-0.9,2-2V5H2z M5,13.5C5,13.8,4.8,14,4.5,14S4,13.8,4,13.5v-6
|
||||
<path style="fill:#888;" d="M2,5v9c0,1.1,0.9,2,2,2h8c1.1,0,2-0.9,2-2V5H2z M5,13.5C5,13.8,4.8,14,4.5,14S4,13.8,4,13.5v-6
|
||||
C4,7.2,4.2,7,4.5,7S5,7.2,5,7.5V13.5z M8.5,13.5C8.5,13.8,8.3,14,8,14s-0.5-0.2-0.5-0.5v-6C7.5,7.2,7.7,7,8,7s0.5,0.2,0.5,0.5V13.5z
|
||||
M12,13.5c0,0.3-0.2,0.5-0.5,0.5S11,13.8,11,13.5v-6C11,7.2,11.2,7,11.5,7S12,7.2,12,7.5V13.5z M0,4c0-1.1,0.9-2,2-2h4v0
|
||||
c0-1.1,0.9-2,2-2s2,0.9,2,2v0h4c1.1,0,2,0.9,2,2H0z"/>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
@@ -19,14 +19,13 @@ Feature: Backup user data
|
||||
And the following config values are set as admin:
|
||||
| coursebinenable | 1 | tool_recyclebin |
|
||||
| autohide | 0 | tool_recyclebin |
|
||||
And the following "activities" exist:
|
||||
| activity | course | section | name | intro |
|
||||
| quiz | C1 | 1 | Quiz 1 | Test quiz description |
|
||||
|
||||
@javascript
|
||||
Scenario: Delete and restore a quiz with user data
|
||||
Given I log in as "teacher1"
|
||||
And I am on "Course 1" course homepage with editing mode on
|
||||
And I add a "Quiz" to section "1" and I fill the form with:
|
||||
| Name | Quiz 1 |
|
||||
| Description | Test quiz description |
|
||||
Given I am on the "Quiz 1" "quiz activity" page logged in as teacher1
|
||||
And I add a "True/False" question to the "Quiz 1" quiz with:
|
||||
| Question name | TF1 |
|
||||
| Question text | First question |
|
||||
@@ -41,6 +40,8 @@ Feature: Backup user data
|
||||
| Correct answer | False |
|
||||
| Feedback for the response 'True'. | So you think it is true |
|
||||
| Feedback for the response 'False'. | So you think it is false |
|
||||
And I set the field "maxgrade" to "10.0"
|
||||
And I press "savechanges"
|
||||
And I log out
|
||||
When I am on the "Quiz 1" "quiz activity" page logged in as student1
|
||||
And I press "Attempt quiz now"
|
||||
|
||||
@@ -14,15 +14,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Recycle bin tests.
|
||||
*
|
||||
* @package tool_recyclebin
|
||||
* @copyright 2015 University of Kent
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
namespace tool_recyclebin;
|
||||
|
||||
/**
|
||||
* Recycle bin category tests.
|
||||
@@ -31,15 +23,15 @@ defined('MOODLE_INTERNAL') || die();
|
||||
* @copyright 2015 University of Kent
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_recyclebin_category_bin_tests extends advanced_testcase {
|
||||
class category_bin_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
* @var stdClass $course
|
||||
* @var \stdClass $course
|
||||
*/
|
||||
protected $course;
|
||||
|
||||
/**
|
||||
* @var stdClass $coursebeingrestored
|
||||
* @var \stdClass $coursebeingrestored
|
||||
*/
|
||||
protected $coursebeingrestored;
|
||||
|
||||
@@ -96,7 +88,7 @@ class tool_recyclebin_category_bin_tests extends advanced_testcase {
|
||||
$this->assertEquals(1, $DB->count_records('tool_recyclebin_category'));
|
||||
|
||||
// Now let's delete the course category.
|
||||
$category = core_course_category::get($this->course->category);
|
||||
$category = \core_course_category::get($this->course->category);
|
||||
$category->delete_full(false);
|
||||
|
||||
// Check that the course was deleted from the category recycle bin.
|
||||
@@ -242,7 +234,7 @@ class tool_recyclebin_category_bin_tests extends advanced_testcase {
|
||||
$this->assertEquals(0, count($recyclebin->get_items()));
|
||||
|
||||
// Verify that student DOES continue enrolled.
|
||||
$this->assertTrue(is_enrolled(context_course::instance($newcourse->id), $student->id));
|
||||
$this->assertTrue(is_enrolled(\context_course::instance($newcourse->id), $student->id));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -286,6 +278,6 @@ class tool_recyclebin_category_bin_tests extends advanced_testcase {
|
||||
$this->assertEquals(0, count($recyclebin->get_items()));
|
||||
|
||||
// Verify that student DOES NOT continue enrolled.
|
||||
$this->assertFalse(is_enrolled(context_course::instance($newcourse->id), $student->id));
|
||||
$this->assertFalse(is_enrolled(\context_course::instance($newcourse->id), $student->id));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,15 +14,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Recycle bin tests.
|
||||
*
|
||||
* @package tool_recyclebin
|
||||
* @copyright 2015 University of Kent
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
namespace tool_recyclebin;
|
||||
|
||||
/**
|
||||
* Recycle bin course tests.
|
||||
@@ -31,10 +23,10 @@ defined('MOODLE_INTERNAL') || die();
|
||||
* @copyright 2015 University of Kent
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_recyclebin_course_bin_tests extends advanced_testcase {
|
||||
class course_bin_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
* @var stdClass $course
|
||||
* @var \stdClass $course
|
||||
*/
|
||||
protected $course;
|
||||
|
||||
@@ -72,7 +64,7 @@ class tool_recyclebin_course_bin_tests extends advanced_testcase {
|
||||
course_delete_module($this->quiz->cmid);
|
||||
|
||||
// Now, run the course module deletion adhoc task.
|
||||
phpunit_util::run_all_adhoc_tasks();
|
||||
\phpunit_util::run_all_adhoc_tasks();
|
||||
|
||||
// Check the course module is now in the recycle bin.
|
||||
$this->assertEquals(1, $DB->count_records('tool_recyclebin_course'));
|
||||
@@ -116,7 +108,7 @@ class tool_recyclebin_course_bin_tests extends advanced_testcase {
|
||||
course_delete_module($this->quiz->cmid);
|
||||
|
||||
// Now, run the course module deletion adhoc task.
|
||||
phpunit_util::run_all_adhoc_tasks();
|
||||
\phpunit_util::run_all_adhoc_tasks();
|
||||
|
||||
// Try purging.
|
||||
$recyclebin = new \tool_recyclebin\course_bin($this->course->id);
|
||||
@@ -141,7 +133,7 @@ class tool_recyclebin_course_bin_tests extends advanced_testcase {
|
||||
course_delete_module($this->quiz->cmid);
|
||||
|
||||
// Now, run the course module deletion adhoc task.
|
||||
phpunit_util::run_all_adhoc_tasks();
|
||||
\phpunit_util::run_all_adhoc_tasks();
|
||||
|
||||
// Set deleted date to the distant past.
|
||||
$recyclebin = new \tool_recyclebin\course_bin($this->course->id);
|
||||
@@ -157,7 +149,7 @@ class tool_recyclebin_course_bin_tests extends advanced_testcase {
|
||||
course_delete_module($book->cmid);
|
||||
|
||||
// Now, run the course module deletion adhoc task.
|
||||
phpunit_util::run_all_adhoc_tasks();
|
||||
\phpunit_util::run_all_adhoc_tasks();
|
||||
|
||||
// Should have 2 items now.
|
||||
$this->assertEquals(2, count($recyclebin->get_items()));
|
||||
@@ -223,7 +215,7 @@ class tool_recyclebin_course_bin_tests extends advanced_testcase {
|
||||
// Delete quiz.
|
||||
$cm = get_coursemodule_from_instance('quiz', $this->quiz->id);
|
||||
course_delete_module($cm->id);
|
||||
phpunit_util::run_all_adhoc_tasks();
|
||||
\phpunit_util::run_all_adhoc_tasks();
|
||||
$quizzes = get_coursemodules_in_course('quiz', $this->course->id);
|
||||
$this->assertEquals(0, count($quizzes));
|
||||
|
||||
@@ -240,7 +232,7 @@ class tool_recyclebin_course_bin_tests extends advanced_testcase {
|
||||
$attempts = quiz_get_user_attempts($cm->instance, $student->id);
|
||||
$this->assertEquals(1, count($attempts));
|
||||
$attempt = array_pop($attempts);
|
||||
$attemptobj = quiz_attempt::create($attempt->id);
|
||||
$attemptobj = \quiz_attempt::create($attempt->id);
|
||||
$this->assertEquals($student->id, $attemptobj->get_userid());
|
||||
$this->assertEquals(true, $attemptobj->is_finished());
|
||||
}
|
||||
@@ -270,7 +262,7 @@ class tool_recyclebin_course_bin_tests extends advanced_testcase {
|
||||
// Delete quiz.
|
||||
$cm = get_coursemodule_from_instance('quiz', $this->quiz->id);
|
||||
course_delete_module($cm->id);
|
||||
phpunit_util::run_all_adhoc_tasks();
|
||||
\phpunit_util::run_all_adhoc_tasks();
|
||||
$quizzes = get_coursemodules_in_course('quiz', $this->course->id);
|
||||
$this->assertEquals(0, count($quizzes));
|
||||
|
||||
@@ -303,17 +295,17 @@ class tool_recyclebin_course_bin_tests extends advanced_testcase {
|
||||
quiz_add_quiz_question($numq->id, $quiz);
|
||||
|
||||
// Create quiz attempt.
|
||||
$quizobj = quiz::create($quiz->id, $student->id);
|
||||
$quba = question_engine::make_questions_usage_by_activity('mod_quiz', $quizobj->get_context());
|
||||
$quizobj = \quiz::create($quiz->id, $student->id);
|
||||
$quba = \question_engine::make_questions_usage_by_activity('mod_quiz', $quizobj->get_context());
|
||||
$quba->set_preferred_behaviour($quizobj->get_quiz()->preferredbehaviour);
|
||||
$timenow = time();
|
||||
$attempt = quiz_create_attempt($quizobj, 1, false, $timenow, false, $student->id);
|
||||
quiz_start_new_attempt($quizobj, $quba, $attempt, 1, $timenow);
|
||||
quiz_attempt_save_started($quizobj, $quba, $attempt);
|
||||
$attemptobj = quiz_attempt::create($attempt->id);
|
||||
$attemptobj = \quiz_attempt::create($attempt->id);
|
||||
$tosubmit = array(1 => array('answer' => '0'));
|
||||
$attemptobj->process_submitted_actions($timenow, false, $tosubmit);
|
||||
$attemptobj = quiz_attempt::create($attempt->id);
|
||||
$attemptobj = \quiz_attempt::create($attempt->id);
|
||||
$attemptobj->process_finish($timenow, false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,12 +54,16 @@ if (!$task) {
|
||||
throw new moodle_exception('cannotfindinfo', 'error', new moodle_url('/admin/tool/task/scheduledtasks.php'), $taskname);
|
||||
}
|
||||
|
||||
if (!\core\task\manager::is_runnable()) {
|
||||
$redirecturl = new \moodle_url('/admin/settings.php', ['section' => 'systempaths']);
|
||||
throw new moodle_exception('cannotfindthepathtothecli', 'tool_task', $redirecturl->out());
|
||||
}
|
||||
|
||||
$plugininfo = core_plugin_manager::instance()->get_plugin_info($task->get_component());
|
||||
$plugindisabled = $plugininfo && $plugininfo->is_enabled() === false &&
|
||||
!$task->get_run_if_component_disabled();
|
||||
|
||||
$canruntasks = \core\task\manager::is_runnable() && get_config('tool_task', 'enablerunnow');
|
||||
if (!$canruntasks || $plugindisabled) {
|
||||
if (!get_config('tool_task', 'enablerunnow') || $plugindisabled) {
|
||||
throw new moodle_exception('nopermissions', 'error', new moodle_url('/admin/tool/task/scheduledtasks.php'),
|
||||
get_string('runnow', 'tool_task'), $task->get_name());
|
||||
}
|
||||
|
||||
@@ -14,26 +14,16 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* File containing tests for the mform class.
|
||||
*
|
||||
* @package tool_task
|
||||
* @copyright 2014 onwards Ankit Agarwal <ankit.agrr@gmail.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
namespace tool_task;
|
||||
|
||||
/**
|
||||
* Mform test class.
|
||||
* Test for the task mform class.
|
||||
*
|
||||
* @package tool_task
|
||||
* @copyright 2014 onwards Ankit Agarwal <ankit.agrr@gmail.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or late
|
||||
*/
|
||||
class tool_task_form_testcase extends advanced_testcase {
|
||||
class form_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
* Test validations for minute field.
|
||||
|
||||
@@ -44,6 +44,12 @@ class tool_uploadcourse_course {
|
||||
/** Outcome of the process: deleting the course */
|
||||
const DO_DELETE = 3;
|
||||
|
||||
/** @var array assignable roles. */
|
||||
protected $assignableroles = [];
|
||||
|
||||
/** @var array Roles context levels. */
|
||||
protected $contextlevels = [];
|
||||
|
||||
/** @var array final import data. */
|
||||
protected $data = array();
|
||||
|
||||
@@ -794,16 +800,15 @@ class tool_uploadcourse_course {
|
||||
|
||||
// Get enrolment data. Where the course already exists, we can also perform validation.
|
||||
$this->enrolmentdata = tool_uploadcourse_helper::get_enrolment_data($this->rawdata);
|
||||
if ($exists) {
|
||||
$errors = $this->validate_enrolment_data($coursedata['id'], $this->enrolmentdata);
|
||||
$courseid = $coursedata['id'] ?? 0;
|
||||
$errors = $this->validate_enrolment_data($courseid, $this->enrolmentdata);
|
||||
|
||||
if (!empty($errors)) {
|
||||
foreach ($errors as $key => $message) {
|
||||
$this->error($key, $message);
|
||||
}
|
||||
|
||||
return false;
|
||||
if (!empty($errors)) {
|
||||
foreach ($errors as $key => $message) {
|
||||
$this->error($key, $message);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (isset($this->rawdata['tags']) && strval($this->rawdata['tags']) !== '') {
|
||||
@@ -913,6 +918,8 @@ class tool_uploadcourse_course {
|
||||
* @return lang_string[] Errors keyed on error code
|
||||
*/
|
||||
protected function validate_enrolment_data(int $courseid, array $enrolmentdata): array {
|
||||
global $DB;
|
||||
|
||||
// Nothing to validate.
|
||||
if (empty($enrolmentdata)) {
|
||||
return [];
|
||||
@@ -924,46 +931,67 @@ class tool_uploadcourse_course {
|
||||
$instances = enrol_get_instances($courseid, false);
|
||||
|
||||
foreach ($enrolmentdata as $method => $options) {
|
||||
$plugin = $enrolmentplugins[$method];
|
||||
|
||||
// Find matching instances by enrolment method.
|
||||
$methodinstances = array_filter($instances, static function(stdClass $instance) use ($method) {
|
||||
return (strcmp($instance->enrol, $method) == 0);
|
||||
});
|
||||
if (isset($options['role'])) {
|
||||
$role = $options['role'];
|
||||
if ($courseid) {
|
||||
if (!$this->validate_role_context($courseid, $role)) {
|
||||
$errors['contextrolenotallowed'] = new lang_string('contextrolenotallowed', 'core_role', $role);
|
||||
|
||||
if (!empty($options['delete'])) {
|
||||
// Ensure user is able to delete the instances.
|
||||
foreach ($methodinstances as $methodinstance) {
|
||||
if (!$plugin->can_delete_instance($methodinstance)) {
|
||||
$errors['errorcannotdeleteenrolment'] = new lang_string('errorcannotdeleteenrolment', 'tool_uploadcourse',
|
||||
$plugin->get_instance_name($methodinstance));
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
// We can at least check that context level is correct while actual context not exist.
|
||||
$roleid = $DB->get_field('role', 'id', ['shortname' => $role], MUST_EXIST);
|
||||
if (!$this->validate_role_context_level($roleid)) {
|
||||
$errors['contextrolenotallowed'] = new lang_string('contextrolenotallowed', 'core_role', $role);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (!empty($options['disable'])) {
|
||||
// Ensure user is able to toggle instance statuses.
|
||||
foreach ($methodinstances as $methodinstance) {
|
||||
if (!$plugin->can_hide_show_instance($methodinstance)) {
|
||||
$errors['errorcannotdisableenrolment'] =
|
||||
new lang_string('errorcannotdisableenrolment', 'tool_uploadcourse',
|
||||
}
|
||||
|
||||
if ($courseid) {
|
||||
$plugin = $enrolmentplugins[$method];
|
||||
|
||||
// Find matching instances by enrolment method.
|
||||
$methodinstances = array_filter($instances, static function (stdClass $instance) use ($method) {
|
||||
return (strcmp($instance->enrol, $method) == 0);
|
||||
});
|
||||
|
||||
if (!empty($options['delete'])) {
|
||||
// Ensure user is able to delete the instances.
|
||||
foreach ($methodinstances as $methodinstance) {
|
||||
if (!$plugin->can_delete_instance($methodinstance)) {
|
||||
$errors['errorcannotdeleteenrolment'] = new lang_string('errorcannotdeleteenrolment',
|
||||
'tool_uploadcourse', $plugin->get_instance_name($methodinstance));
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if (!empty($options['disable'])) {
|
||||
// Ensure user is able to toggle instance statuses.
|
||||
foreach ($methodinstances as $methodinstance) {
|
||||
if (!$plugin->can_hide_show_instance($methodinstance)) {
|
||||
$errors['errorcannotdisableenrolment'] =
|
||||
new lang_string('errorcannotdisableenrolment', 'tool_uploadcourse',
|
||||
$plugin->get_instance_name($methodinstance));
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Ensure user is able to create/update instance.
|
||||
$methodinstance = empty($methodinstances) ? null : reset($methodinstances);
|
||||
if ((empty($methodinstance) && !$plugin->can_add_instance($courseid)) ||
|
||||
(!empty($methodinstance) && !$plugin->can_edit_instance($methodinstance))) {
|
||||
|
||||
$errors['errorcannotcreateorupdateenrolment'] =
|
||||
new lang_string('errorcannotcreateorupdateenrolment', 'tool_uploadcourse',
|
||||
$plugin->get_instance_name($methodinstance));
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Ensure user is able to create/update instance.
|
||||
$methodinstance = empty($methodinstances) ? null : reset($methodinstances);
|
||||
if ((empty($methodinstance) && !$plugin->can_add_instance($courseid)) ||
|
||||
(!empty($methodinstance) && !$plugin->can_edit_instance($methodinstance))) {
|
||||
|
||||
$errors['errorcannotcreateorupdateenrolment'] =
|
||||
new lang_string('errorcannotcreateorupdateenrolment', 'tool_uploadcourse',
|
||||
$plugin->get_instance_name($methodinstance));
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1079,8 +1107,15 @@ class tool_uploadcourse_course {
|
||||
$instance->enrolenddate = $instance->enrolstartdate;
|
||||
}
|
||||
|
||||
// Sort out the given role. This does not filter the roles allowed in the course.
|
||||
// Sort out the given role.
|
||||
if (isset($method['role'])) {
|
||||
$role = $method['role'];
|
||||
if (!$this->validate_role_context($course->id, $role)) {
|
||||
$this->error('contextrolenotallowed',
|
||||
new lang_string('contextrolenotallowed', 'core_role', $role));
|
||||
break;
|
||||
}
|
||||
|
||||
$roleids = tool_uploadcourse_helper::get_role_ids();
|
||||
if (isset($roleids[$method['role']])) {
|
||||
$instance->roleid = $roleids[$method['role']];
|
||||
@@ -1093,6 +1128,41 @@ class tool_uploadcourse_course {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if role is allowed in course context
|
||||
*
|
||||
* @param int $courseid course context.
|
||||
* @param string $role Role.
|
||||
* @return bool
|
||||
*/
|
||||
protected function validate_role_context(int $courseid, string $role) : bool {
|
||||
if (empty($this->assignableroles[$courseid])) {
|
||||
$coursecontext = \context_course::instance($courseid);
|
||||
$this->assignableroles[$courseid] = get_assignable_roles($coursecontext, ROLENAME_SHORT);
|
||||
}
|
||||
if (!in_array($role, $this->assignableroles[$courseid])) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if role is allowed at this context level.
|
||||
*
|
||||
* @param int $roleid Role ID.
|
||||
* @return bool
|
||||
*/
|
||||
protected function validate_role_context_level(int $roleid) : bool {
|
||||
if (empty($this->contextlevels[$roleid])) {
|
||||
$this->contextlevels[$roleid] = get_role_contextlevels($roleid);
|
||||
}
|
||||
|
||||
if (!in_array(CONTEXT_COURSE, $this->contextlevels[$roleid])) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset the current course.
|
||||
*
|
||||
|
||||
@@ -325,6 +325,11 @@ class tool_uploadcourse_helper {
|
||||
continue;
|
||||
}
|
||||
$rolenames['role_' . $rolesids[$matches[1]]] = $value;
|
||||
} else if (preg_match('/^(.+)?_role$/', $field, $matches)) {
|
||||
if (!isset($rolesids[$value])) {
|
||||
$invalidroles[] = $value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -219,6 +219,10 @@ class tool_uploadcourse_processor {
|
||||
|
||||
$data = array_merge($data, $course->get_data(), array('id' => $course->get_id()));
|
||||
$tracker->output($this->linenb, true, $status, $data);
|
||||
if ($course->has_errors()) {
|
||||
$errors++;
|
||||
$tracker->output($this->linenb, false, $course->get_errors(), $data);
|
||||
}
|
||||
} else {
|
||||
$errors++;
|
||||
$tracker->output($this->linenb, false, $course->get_errors(), $data);
|
||||
|
||||
@@ -105,3 +105,28 @@ Feature: An admin can create courses using a CSV file
|
||||
And I should see "Field 3: b"
|
||||
And I should see "Field 4: Hello"
|
||||
And I should see "Field 5: Some text"
|
||||
|
||||
@javascript
|
||||
Scenario: Validation of role for uploaded courses
|
||||
Given I navigate to "Users > Permissions > Define roles" in site administration
|
||||
And I click on "Add a new role" "button"
|
||||
And I click on "Continue" "button"
|
||||
And I set the following fields to these values:
|
||||
| Short name | notallowed |
|
||||
| Custom full name | notallowed |
|
||||
| contextlevel80 | 1 |
|
||||
And I click on "Create this role" "button"
|
||||
And I navigate to "Courses > Upload courses" in site administration
|
||||
And I upload "admin/tool/uploadcourse/tests/fixtures/enrolment_role.csv" file to "File" filemanager
|
||||
And I click on "Preview" "button"
|
||||
And I should see "Invalid role names: notexist"
|
||||
And I should see "Role notallowed not allowed in this context."
|
||||
When I click on "Upload courses" "button"
|
||||
And I should see "Course created"
|
||||
And I should see "Courses total: 3"
|
||||
And I should see "Courses created: 1"
|
||||
And I should see "Courses errors: 2"
|
||||
And I should see "Invalid role names: notexist"
|
||||
And I should see "Role notallowed not allowed in this context."
|
||||
And I am on site homepage
|
||||
And I should see "coursez"
|
||||
|
||||
@@ -1561,6 +1561,94 @@ class course_test extends \advanced_testcase {
|
||||
$this->assertArrayHasKey('cannotrenameshortnamealreadyinuse', $co->get_errors());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test when role doesn't exist.
|
||||
*
|
||||
* @covers \tool_uploadcourse_course::prepare
|
||||
*/
|
||||
public function test_role_not_exist() {
|
||||
$this->resetAfterTest();
|
||||
$this->setAdminUser();
|
||||
|
||||
$mode = tool_uploadcourse_processor::MODE_CREATE_NEW;
|
||||
$updatemode = tool_uploadcourse_processor::UPDATE_NOTHING;
|
||||
|
||||
$upload = new tool_uploadcourse_course($mode, $updatemode, [
|
||||
'category' => 1,
|
||||
'fullname' => 'Testing',
|
||||
'shortname' => 'T101',
|
||||
'enrolment_1' => 'manual',
|
||||
'enrolment_1_role' => 'notexist'
|
||||
]);
|
||||
|
||||
$this->assertFalse($upload->prepare());
|
||||
$this->assertArrayHasKey('invalidroles', $upload->get_errors());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test when role not allowed in course context.
|
||||
*
|
||||
* @covers \tool_uploadcourse_course::proceed
|
||||
*/
|
||||
public function test_role_not_allowed() {
|
||||
$this->resetAfterTest();
|
||||
$this->setAdminUser();
|
||||
|
||||
$roleid = create_role('New student role', 'student2', 'New student description', 'student');
|
||||
set_role_contextlevels($roleid, [CONTEXT_BLOCK]);
|
||||
|
||||
$mode = tool_uploadcourse_processor::MODE_CREATE_NEW;
|
||||
$updatemode = tool_uploadcourse_processor::UPDATE_NOTHING;
|
||||
|
||||
$upload = new tool_uploadcourse_course($mode, $updatemode, [
|
||||
'category' => 1,
|
||||
'fullname' => 'Testing',
|
||||
'shortname' => 'T101',
|
||||
'enrolment_1' => 'manual',
|
||||
'enrolment_1_role' => 'student2'
|
||||
]);
|
||||
|
||||
$this->assertFalse($upload->prepare());
|
||||
$this->assertArrayHasKey('contextrolenotallowed', $upload->get_errors());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test when role is allowed.
|
||||
*
|
||||
* @covers \tool_uploadcourse_course::proceed
|
||||
*/
|
||||
public function test_role_allowed() {
|
||||
global $DB;
|
||||
|
||||
$this->resetAfterTest();
|
||||
$this->setAdminUser();
|
||||
|
||||
$mode = tool_uploadcourse_processor::MODE_UPDATE_ONLY;
|
||||
$updatemode = tool_uploadcourse_processor::UPDATE_MISSING_WITH_DATA_OR_DEFAUTLS;
|
||||
|
||||
$course = $this->getDataGenerator()->create_course([
|
||||
'shortname' => 'c1',
|
||||
]);
|
||||
|
||||
$instances = enrol_get_instances($course->id, true);
|
||||
$studentrole = $DB->get_record('role', ['shortname' => 'student']);
|
||||
$teacherrole = $DB->get_record('role', ['shortname' => 'teacher']);
|
||||
$instance = reset($instances);
|
||||
$this->assertEquals($studentrole->id, $instance->roleid);
|
||||
|
||||
$upload = new tool_uploadcourse_course($mode, $updatemode, [
|
||||
'shortname' => 'c1',
|
||||
'enrolment_1' => 'manual',
|
||||
'enrolment_1_role' => 'teacher'
|
||||
]);
|
||||
|
||||
$this->assertTrue($upload->prepare());
|
||||
$upload->proceed();
|
||||
$instances = enrol_get_instances($course->id, true);
|
||||
$instance = reset($instances);
|
||||
$this->assertEquals($teacherrole->id, $instance->roleid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get custom field plugin generator
|
||||
*
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
shortname,fullname,category,enrolment_1,enrolment_1_role
|
||||
CX,coursex,1,manual,notexist
|
||||
CY,coursey,1,manual,notallowed
|
||||
CZ,coursez,1,manual,student
|
||||
|
@@ -692,7 +692,11 @@ class process {
|
||||
$dologout = false;
|
||||
|
||||
if ($this->get_update_type() != UU_UPDATE_NOCHANGES and !$remoteuser) {
|
||||
if (!empty($user->auth) and $user->auth !== $existinguser->auth) {
|
||||
|
||||
// Handle 'auth' column separately, the field can never be missing from a user.
|
||||
if (!empty($user->auth) && ($user->auth !== $existinguser->auth) &&
|
||||
($this->get_update_type() != UU_UPDATE_MISSING)) {
|
||||
|
||||
$this->upt->track('auth', s($existinguser->auth).'-->'.s($user->auth), 'info', false);
|
||||
$existinguser->auth = $user->auth;
|
||||
if (!isset($this->supportedauths[$user->auth])) {
|
||||
|
||||
@@ -14,15 +14,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Tests for CLI tool_uploaduser.
|
||||
*
|
||||
* @package tool_uploaduser
|
||||
* @copyright 2020 Marina Glancy
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
use \tool_uploaduser\cli_helper;
|
||||
namespace tool_uploaduser;
|
||||
|
||||
/**
|
||||
* Tests for CLI tool_uploaduser.
|
||||
@@ -31,7 +23,7 @@ use \tool_uploaduser\cli_helper;
|
||||
* @copyright 2020 Marina Glancy
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_uploaduser_cli_testcase extends advanced_testcase {
|
||||
class cli_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
* Generate cli_helper and mock $_SERVER['argv']
|
||||
@@ -117,7 +109,7 @@ class tool_uploaduser_cli_testcase extends advanced_testcase {
|
||||
$this->assertEquals('Users created: 2', $stats[0]);
|
||||
|
||||
// Users have default values applied.
|
||||
$user1 = core_user::get_user_by_username('jonest');
|
||||
$user1 = \core_user::get_user_by_username('jonest');
|
||||
$this->assertEquals('Brighton', $user1->city);
|
||||
$this->assertEquals('Purchasing', $user1->department);
|
||||
}
|
||||
@@ -149,7 +141,7 @@ class tool_uploaduser_cli_testcase extends advanced_testcase {
|
||||
$this->assertEquals('Users created: 2', $stats[0]);
|
||||
|
||||
// Created users have data in the profile fields.
|
||||
$user1 = core_user::get_user_by_username('reznort');
|
||||
$user1 = \core_user::get_user_by_username('reznort');
|
||||
$profilefields1 = profile_user_record($user1->id);
|
||||
$this->assertEquals((object)['superfield' => 'Loves cats'], $profilefields1);
|
||||
}
|
||||
@@ -244,9 +236,9 @@ class tool_uploaduser_cli_testcase extends advanced_testcase {
|
||||
$enrols = array_values(enrol_get_course_users($course->id));
|
||||
$this->assertEqualsCanonicalizing(['jonest'], [$enrols[0]->username]);
|
||||
// User reznor is not created.
|
||||
$this->assertFalse(core_user::get_user_by_username('reznor'));
|
||||
$this->assertFalse(\core_user::get_user_by_username('reznor'));
|
||||
// User jonest is not updated.
|
||||
$this->assertEquals('OLDNAME', core_user::get_user_by_username('jonest')->firstname);
|
||||
$this->assertEquals('OLDNAME', \core_user::get_user_by_username('jonest')->firstname);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -287,8 +279,8 @@ class tool_uploaduser_cli_testcase extends advanced_testcase {
|
||||
$enrols = array_values(enrol_get_course_users($course->id));
|
||||
$this->assertEqualsCanonicalizing(['jonest'], [$enrols[0]->username]);
|
||||
// User reznor is not created.
|
||||
$this->assertFalse(core_user::get_user_by_username('reznor'));
|
||||
$this->assertFalse(\core_user::get_user_by_username('reznor'));
|
||||
// User jonest is updated, new first name is Tom.
|
||||
$this->assertEquals('Tom', core_user::get_user_by_username('jonest')->firstname);
|
||||
$this->assertEquals('Tom', \core_user::get_user_by_username('jonest')->firstname);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,20 +14,10 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Tests for field value validators of tool_uploaduser.
|
||||
*
|
||||
* @package tool_uploaduser
|
||||
* @copyright 2019 Jun Pataleta
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
namespace tool_uploaduser;
|
||||
|
||||
use tool_uploaduser\local\field_value_validators;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
|
||||
/**
|
||||
* Tests for field value validators of tool_uploaduser.
|
||||
*
|
||||
@@ -35,7 +25,7 @@ global $CFG;
|
||||
* @copyright 2019 Jun Pataleta
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class field_value_validators_testcase extends advanced_testcase {
|
||||
class field_value_validators_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
* Data provider for \field_value_validators_testcase::test_validate_theme().
|
||||
|
||||
|
Before Width: | Height: | Size: 257 B After Width: | Height: | Size: 511 B |
@@ -1,3 +1,3 @@
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
|
||||
<!ENTITY ns_flows "http://ns.adobe.com/Flows/1.0/">
|
||||
]><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" preserveAspectRatio="xMinYMid meet" overflow="visible"><path d="M7.9 16c4 0 7.4-3 7.8-7h-3c-.5 2-2.5 4-4.9 4-2.8 0-5-2.2-5-5s2.2-5 5-5c1.1 0 2.1 0 3 1h-1c-.5 0-.8.5-.8 1.1v1c0 .5.3.9.8.9h5c.6 0 1.2-.4 1.2-.9v-5c0-.6-.6-1.1-1.2-1.1h-1c-.5 0-.8.5-.8 1.1V2C12 .9 9.9.2 8 .2 3.6.2 0 3.7 0 8.1 0 12.4 3.5 16 7.9 16z" fill="#999"/></svg>
|
||||
]><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" preserveAspectRatio="xMinYMid meet" overflow="visible"><path d="M7.9 16c4 0 7.4-3 7.8-7h-3c-.5 2-2.5 4-4.9 4-2.8 0-5-2.2-5-5s2.2-5 5-5c1.1 0 2.1 0 3 1h-1c-.5 0-.8.5-.8 1.1v1c0 .5.3.9.8.9h5c.6 0 1.2-.4 1.2-.9v-5c0-.6-.6-1.1-1.2-1.1h-1c-.5 0-.8.5-.8 1.1V2C12 .9 9.9.2 8 .2 3.6.2 0 3.7 0 8.1 0 12.4 3.5 16 7.9 16z" fill="#888"/></svg>
|
||||
|
Before Width: | Height: | Size: 569 B After Width: | Height: | Size: 569 B |
|
Before Width: | Height: | Size: 266 B After Width: | Height: | Size: 342 B |
@@ -9,7 +9,7 @@
|
||||
xml:space="preserve" preserveAspectRatio="xMinYMid meet">
|
||||
<defs>
|
||||
</defs>
|
||||
<path style="fill:#999999;" d="M12,7v4c0,0.5-0.5,1-1,1h-0.5l0,0H1c-0.5,0-1-0.5-1-1V7c0-0.5,0.5-1,1-1h0.5c0.5,0,1,0.5,1,1l0,2.5h7
|
||||
<path style="fill:#888;" d="M12,7v4c0,0.5-0.5,1-1,1h-0.5l0,0H1c-0.5,0-1-0.5-1-1V7c0-0.5,0.5-1,1-1h0.5c0.5,0,1,0.5,1,1l0,2.5h7
|
||||
V7c0-0.5,0.5-1,1-1H11C11.5,6,12,6.5,12,7z M9.9,3.6L6.6,0.3C6.4,0.1,6.2,0,5.9,0C5.7,0,5.4,0.1,5.2,0.3L1.9,3.6
|
||||
C1.5,4,1.5,4.6,1.9,5l0.3,0.3c0.4,0.4,1,0.4,1.4,0l1-1.1l0,2.7c0,0.5,0.5,1,1,1l0.5,0c0.5,0,1-0.5,1-1l0-2.7l1,1
|
||||
c0.4,0.4,1,0.4,1.4,0L10,5C10.3,4.6,10.3,4,9.9,3.6z"/>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
@@ -18,6 +18,7 @@ body div[data-flexitour="step-background-fader"],
|
||||
body div[data-flexitour="step-background"] {
|
||||
position: absolute;
|
||||
background: inherit;
|
||||
background-image: none;
|
||||
}
|
||||
|
||||
div[data-flexitour="step-background-fader"],
|
||||
|
||||
@@ -14,17 +14,8 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Tests for time filter.
|
||||
*
|
||||
* @package tool_usertours
|
||||
* @copyright 2019 Tom Dickman <tomdickman@catalyst-au.net>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
namespace tool_usertours;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
use tool_usertours\tour;
|
||||
use tool_usertours\local\filter\accessdate;
|
||||
|
||||
/**
|
||||
@@ -34,7 +25,7 @@ use tool_usertours\local\filter\accessdate;
|
||||
* @copyright 2019 Tom Dickman <tomdickman@catalyst-au.net>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_usertours_accessdate_filter_test extends advanced_testcase {
|
||||
class accessdate_filter_test extends \advanced_testcase {
|
||||
|
||||
public function setUp(): void {
|
||||
$this->resetAfterTest(true);
|
||||
|
||||
@@ -14,15 +14,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Tests for role filter.
|
||||
*
|
||||
* @package tool_usertours
|
||||
* @copyright 2016 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
namespace tool_usertours;
|
||||
|
||||
/**
|
||||
* Tests for role filter.
|
||||
@@ -31,7 +23,7 @@ defined('MOODLE_INTERNAL') || die();
|
||||
* @copyright 2016 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_usertours_role_filter_testcase extends advanced_testcase {
|
||||
class role_filter_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
* @var $course Test course
|
||||
|
||||
@@ -14,15 +14,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Tests for theme filter.
|
||||
*
|
||||
* @package tool_usertours
|
||||
* @copyright 2016 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
namespace tool_usertours;
|
||||
|
||||
/**
|
||||
* Tests for theme filter.
|
||||
@@ -31,7 +23,7 @@ defined('MOODLE_INTERNAL') || die();
|
||||
* @copyright 2016 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tool_usertours_theme_filter_testcase extends advanced_testcase {
|
||||
class theme_filter_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
* Data Provider for filter_matches function.
|
||||
|
||||
@@ -14,21 +14,13 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Tests for tour.
|
||||
*
|
||||
* @package tool_usertours
|
||||
* @copyright 2016 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
namespace tool_usertours;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
require_once($CFG->libdir . '/formslib.php');
|
||||
|
||||
use tool_usertours\tour;
|
||||
|
||||
/**
|
||||
* Tests for tour.
|
||||
*
|
||||
@@ -36,7 +28,7 @@ use tool_usertours\tour;
|
||||
* @copyright 2016 Andrew Nicols <andrew@nicols.co.uk>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tour_testcase extends advanced_testcase {
|
||||
class tour_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
* @var moodle_database
|
||||
|
||||
@@ -14,6 +14,8 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace auth_db;
|
||||
|
||||
/**
|
||||
* External database auth sync tests, this also tests adodb drivers
|
||||
* that are matching our four supported Moodle database drivers.
|
||||
@@ -23,17 +25,24 @@
|
||||
* @copyright 2012 Petr Skoda {@link http://skodak.org}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
|
||||
class auth_db_testcase extends advanced_testcase {
|
||||
class db_test extends \advanced_testcase {
|
||||
/** @var string Original error log */
|
||||
protected $oldlog;
|
||||
|
||||
/** @var int The amount of users to create for the large user set deletion test */
|
||||
protected $largedeletionsetsize = 128;
|
||||
|
||||
public static function tearDownAfterClass(): void {
|
||||
global $DB;
|
||||
// Apply sqlsrv native driver error and logging default
|
||||
// settings while finishing the AdoDB tests.
|
||||
if ($DB->get_dbfamily() === 'mssql') {
|
||||
sqlsrv_configure("WarningsReturnAsErrors", false);
|
||||
sqlsrv_configure("LogSubsystems", SQLSRV_LOG_SYSTEM_OFF);
|
||||
sqlsrv_configure("LogSeverity", SQLSRV_LOG_SEVERITY_ERROR);
|
||||
}
|
||||
}
|
||||
|
||||
protected function init_auth_database() {
|
||||
global $DB, $CFG;
|
||||
require_once("$CFG->dirroot/auth/db/auth.php");
|
||||
@@ -112,7 +121,7 @@ class auth_db_testcase extends advanced_testcase {
|
||||
throw new exception('Unknown database family ' . $DB->get_dbfamily());
|
||||
}
|
||||
|
||||
$table = new xmldb_table('auth_db_users');
|
||||
$table = new \xmldb_table('auth_db_users');
|
||||
$table->add_field('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
|
||||
$table->add_field('name', XMLDB_TYPE_CHAR, '255', null, null, null);
|
||||
$table->add_field('pass', XMLDB_TYPE_CHAR, '255', null, null, null);
|
||||
@@ -157,7 +166,7 @@ class auth_db_testcase extends advanced_testcase {
|
||||
global $DB;
|
||||
|
||||
$dbman = $DB->get_manager();
|
||||
$table = new xmldb_table('auth_db_users');
|
||||
$table = new \xmldb_table('auth_db_users');
|
||||
$dbman->drop_table($table);
|
||||
|
||||
ini_set('error_log', $this->oldlog);
|
||||
@@ -211,7 +220,7 @@ class auth_db_testcase extends advanced_testcase {
|
||||
|
||||
$this->assertCount(2, $DB->get_records('user'));
|
||||
|
||||
$trace = new null_progress_trace();
|
||||
$trace = new \null_progress_trace();
|
||||
|
||||
// Sync users and make sure that two events user_created werer triggered.
|
||||
$sink = $this->redirectEvents();
|
||||
@@ -472,7 +481,7 @@ class auth_db_testcase extends advanced_testcase {
|
||||
$extdbuser3 = (object)array('name'=>'u3', 'pass'=>'heslo', 'email'=>'u3@example.com',
|
||||
'lastname' => 'user<script>alert(1);</script>xss');
|
||||
$extdbuser3->id = $DB->insert_record('auth_db_users', $extdbuser3);
|
||||
$trace = new null_progress_trace();
|
||||
$trace = new \null_progress_trace();
|
||||
|
||||
// Let's test user sync make sure still works as expected..
|
||||
$auth->sync_users($trace, true);
|
||||
@@ -518,7 +527,7 @@ class auth_db_testcase extends advanced_testcase {
|
||||
}
|
||||
|
||||
// Sync to moodle.
|
||||
$trace = new null_progress_trace();
|
||||
$trace = new \null_progress_trace();
|
||||
$auth->sync_users($trace, true);
|
||||
|
||||
// Check user is there.
|
||||
|
||||
@@ -14,14 +14,9 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Manual authentication tests.
|
||||
*
|
||||
* @package auth_manual
|
||||
* @category test
|
||||
* @copyright 2014 Gilles-Philippe Leblanc <gilles-philippe.leblanc@umontreal.ca>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
namespace auth_manual;
|
||||
|
||||
use auth_plugin_manual;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
@@ -36,7 +31,7 @@ require_once($CFG->dirroot.'/auth/manual/auth.php');
|
||||
* @copyright 2014 Gilles-Philippe Leblanc <gilles-philippe.leblanc@umontreal.ca>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class auth_manual_testcase extends advanced_testcase {
|
||||
class manual_test extends \advanced_testcase {
|
||||
|
||||
/** @var auth_plugin_manual Keeps the authentication plugin. */
|
||||
protected $authplugin;
|
||||
|
||||
@@ -14,26 +14,17 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
namespace auth_oauth2;
|
||||
|
||||
/**
|
||||
* Auth oauth2 auth functions tests.
|
||||
*
|
||||
* @package auth_oauth2
|
||||
* @category test
|
||||
* @copyright 2019 Shamim Rezaie <shamim@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
|
||||
/**
|
||||
* Tests for the \auth_oauth2\auth class.
|
||||
*
|
||||
* @copyright 2019 Shamim Rezaie
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class auth_oauth2_auth_testcase extends advanced_testcase {
|
||||
class auth_test extends \advanced_testcase {
|
||||
|
||||
public function test_get_password_change_info() {
|
||||
$this->resetAfterTest();
|
||||
|
||||
@@ -14,15 +14,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Unit tests for core_auth\digital_consent.
|
||||
*
|
||||
* @package core_auth
|
||||
* @copyright 2018 Mihail Geshoski
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
namespace core_auth;
|
||||
|
||||
/**
|
||||
* Digital consent helper testcase.
|
||||
@@ -31,7 +23,7 @@ defined('MOODLE_INTERNAL') || die();
|
||||
* @copyright 2018 Mihail Geshoski
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class core_auth_digital_consent_testcase extends advanced_testcase {
|
||||
class digital_consent_test extends \advanced_testcase {
|
||||
|
||||
public function test_is_age_digital_consent_verification_enabled() {
|
||||
global $CFG;
|
||||
|
||||
@@ -684,7 +684,7 @@ class tree extends tree_node {
|
||||
} else {
|
||||
unset($this->children[$index]);
|
||||
unset($this->showchildren[$index]);
|
||||
$this->showchildren = array_values($this->showchildren);
|
||||
$this->showchildren = !is_null($this->showchildren) ? array_values($this->showchildren) : null;
|
||||
$changed = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,17 +14,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Unit tests for the capability checker class.
|
||||
*
|
||||
* @package core_availability
|
||||
* @copyright 2014 The Open University
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
use core_availability\capability_checker;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
namespace core_availability;
|
||||
|
||||
/**
|
||||
* Unit tests for the capability checker class.
|
||||
@@ -33,7 +23,7 @@ defined('MOODLE_INTERNAL') || die();
|
||||
* @copyright 2014 The Open University
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class core_availability_capability_checker_testcase extends advanced_testcase {
|
||||
class capability_checker_test extends \advanced_testcase {
|
||||
/**
|
||||
* Tests loading a class from /availability/classes.
|
||||
*/
|
||||
@@ -51,7 +41,7 @@ class core_availability_capability_checker_testcase extends advanced_testcase {
|
||||
$generator->enrol_user($student->id, $course->id, $roleids['student']);
|
||||
|
||||
// Check a capability which they both have.
|
||||
$context = context_course::instance($course->id);
|
||||
$context = \context_course::instance($course->id);
|
||||
$checker = new capability_checker($context);
|
||||
$result = array_keys($checker->get_users_by_capability('mod/forum:replypost'));
|
||||
sort($result);
|
||||
|
||||
@@ -14,15 +14,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Unit tests for the component and plugin definitions for availability system.
|
||||
*
|
||||
* @package core_availability
|
||||
* @copyright 2014 The Open University
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
namespace core_availability;
|
||||
|
||||
/**
|
||||
* Unit tests for the component and plugin definitions for availability system.
|
||||
@@ -31,7 +23,7 @@ defined('MOODLE_INTERNAL') || die();
|
||||
* @copyright 2014 The Open University
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class core_availability_component_testcase extends advanced_testcase {
|
||||
class component_test extends \advanced_testcase {
|
||||
/**
|
||||
* Tests loading a class from /availability/classes.
|
||||
*/
|
||||
@@ -47,7 +39,7 @@ class core_availability_component_testcase extends advanced_testcase {
|
||||
// This code will throw debugging information if the plugininfo class
|
||||
// is missing. Unfortunately it doesn't actually cause the test to
|
||||
// fail, but it's obvious when running test at least.
|
||||
$pluginmanager = core_plugin_manager::instance();
|
||||
$pluginmanager = \core_plugin_manager::instance();
|
||||
$list = $pluginmanager->get_enabled_plugins('availability');
|
||||
$this->assertArrayHasKey('completion', $list);
|
||||
$this->assertArrayHasKey('date', $list);
|
||||
|
||||
@@ -14,19 +14,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Unit tests for info and subclasses.
|
||||
*
|
||||
* @package core_availability
|
||||
* @copyright 2014 The Open University
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
use core_availability\info;
|
||||
use core_availability\info_module;
|
||||
use core_availability\info_section;
|
||||
namespace core_availability;
|
||||
|
||||
/**
|
||||
* Unit tests for info and subclasses.
|
||||
@@ -35,7 +23,7 @@ use core_availability\info_section;
|
||||
* @copyright 2014 The Open University
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class info_testcase extends advanced_testcase {
|
||||
class info_test extends \advanced_testcase {
|
||||
public function setUp(): void {
|
||||
// Load the mock condition so that it can be used.
|
||||
require_once(__DIR__ . '/fixtures/mock_condition.php');
|
||||
@@ -491,7 +479,7 @@ class info_testcase extends advanced_testcase {
|
||||
|
||||
// If the students have viewhiddenactivities, they get past the module
|
||||
// restriction.
|
||||
role_change_permission($studentroleid, context_module::instance($page2->cmid),
|
||||
role_change_permission($studentroleid, \context_module::instance($page2->cmid),
|
||||
'moodle/course:ignoreavailabilityrestrictions', CAP_ALLOW);
|
||||
$expected = array($u1->id, $u2->id);
|
||||
$this->assertEquals($expected, array_keys($info->filter_user_list($allusers)));
|
||||
@@ -502,7 +490,7 @@ class info_testcase extends advanced_testcase {
|
||||
|
||||
// If they have viewhiddensections, they also get past the section
|
||||
// restriction.
|
||||
role_change_permission($studentroleid, context_course::instance($course->id),
|
||||
role_change_permission($studentroleid, \context_course::instance($course->id),
|
||||
'moodle/course:ignoreavailabilityrestrictions', CAP_ALLOW);
|
||||
$expected = array($u1->id, $u2->id, $u3->id);
|
||||
$this->assertEquals($expected, array_keys($info->filter_user_list($allusers)));
|
||||
|
||||
@@ -14,18 +14,7 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Unit tests for the condition tree class and related logic.
|
||||
*
|
||||
* @package core_availability
|
||||
* @copyright 2014 The Open University
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
use core_availability\capability_checker;
|
||||
use \core_availability\tree;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
namespace core_availability;
|
||||
|
||||
/**
|
||||
* Unit tests for the condition tree class and related logic.
|
||||
@@ -34,7 +23,7 @@ defined('MOODLE_INTERNAL') || die();
|
||||
* @copyright 2014 The Open University
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class tree_testcase extends \advanced_testcase {
|
||||
class tree_test extends \advanced_testcase {
|
||||
public function setUp(): void {
|
||||
// Load the mock classes so they can be used.
|
||||
require_once(__DIR__ . '/fixtures/mock_condition.php');
|
||||
@@ -48,83 +37,83 @@ class tree_testcase extends \advanced_testcase {
|
||||
try {
|
||||
new tree('frog');
|
||||
$this->fail();
|
||||
} catch (coding_exception $e) {
|
||||
} catch (\coding_exception $e) {
|
||||
$this->assertStringContainsString('not object', $e->getMessage());
|
||||
}
|
||||
try {
|
||||
new tree((object)array());
|
||||
$this->fail();
|
||||
} catch (coding_exception $e) {
|
||||
} catch (\coding_exception $e) {
|
||||
$this->assertStringContainsString('missing ->op', $e->getMessage());
|
||||
}
|
||||
try {
|
||||
new tree((object)array('op' => '*'));
|
||||
$this->fail();
|
||||
} catch (coding_exception $e) {
|
||||
} catch (\coding_exception $e) {
|
||||
$this->assertStringContainsString('unknown ->op', $e->getMessage());
|
||||
}
|
||||
try {
|
||||
new tree((object)array('op' => '|'));
|
||||
$this->fail();
|
||||
} catch (coding_exception $e) {
|
||||
} catch (\coding_exception $e) {
|
||||
$this->assertStringContainsString('missing ->show', $e->getMessage());
|
||||
}
|
||||
try {
|
||||
new tree((object)array('op' => '|', 'show' => 0));
|
||||
$this->fail();
|
||||
} catch (coding_exception $e) {
|
||||
} catch (\coding_exception $e) {
|
||||
$this->assertStringContainsString('->show not bool', $e->getMessage());
|
||||
}
|
||||
try {
|
||||
new tree((object)array('op' => '&'));
|
||||
$this->fail();
|
||||
} catch (coding_exception $e) {
|
||||
} catch (\coding_exception $e) {
|
||||
$this->assertStringContainsString('missing ->showc', $e->getMessage());
|
||||
}
|
||||
try {
|
||||
new tree((object)array('op' => '&', 'showc' => 0));
|
||||
$this->fail();
|
||||
} catch (coding_exception $e) {
|
||||
} catch (\coding_exception $e) {
|
||||
$this->assertStringContainsString('->showc not array', $e->getMessage());
|
||||
}
|
||||
try {
|
||||
new tree((object)array('op' => '&', 'showc' => array(0)));
|
||||
$this->fail();
|
||||
} catch (coding_exception $e) {
|
||||
} catch (\coding_exception $e) {
|
||||
$this->assertStringContainsString('->showc value not bool', $e->getMessage());
|
||||
}
|
||||
try {
|
||||
new tree((object)array('op' => '|', 'show' => true));
|
||||
$this->fail();
|
||||
} catch (coding_exception $e) {
|
||||
} catch (\coding_exception $e) {
|
||||
$this->assertStringContainsString('missing ->c', $e->getMessage());
|
||||
}
|
||||
try {
|
||||
new tree((object)array('op' => '|', 'show' => true,
|
||||
'c' => 'side'));
|
||||
$this->fail();
|
||||
} catch (coding_exception $e) {
|
||||
} catch (\coding_exception $e) {
|
||||
$this->assertStringContainsString('->c not array', $e->getMessage());
|
||||
}
|
||||
try {
|
||||
new tree((object)array('op' => '|', 'show' => true,
|
||||
'c' => array(3)));
|
||||
$this->fail();
|
||||
} catch (coding_exception $e) {
|
||||
} catch (\coding_exception $e) {
|
||||
$this->assertStringContainsString('child not object', $e->getMessage());
|
||||
}
|
||||
try {
|
||||
new tree((object)array('op' => '|', 'show' => true,
|
||||
'c' => array((object)array('type' => 'doesnotexist'))));
|
||||
$this->fail();
|
||||
} catch (coding_exception $e) {
|
||||
} catch (\coding_exception $e) {
|
||||
$this->assertStringContainsString('Unknown condition type: doesnotexist', $e->getMessage());
|
||||
}
|
||||
try {
|
||||
new tree((object)array('op' => '|', 'show' => true,
|
||||
'c' => array((object)array())));
|
||||
$this->fail();
|
||||
} catch (coding_exception $e) {
|
||||
} catch (\coding_exception $e) {
|
||||
$this->assertStringContainsString('missing ->op', $e->getMessage());
|
||||
}
|
||||
try {
|
||||
@@ -133,7 +122,7 @@ class tree_testcase extends \advanced_testcase {
|
||||
'showc' => array(true, true)
|
||||
));
|
||||
$this->fail();
|
||||
} catch (coding_exception $e) {
|
||||
} catch (\coding_exception $e) {
|
||||
$this->assertStringContainsString('->c, ->showc mismatch', $e->getMessage());
|
||||
}
|
||||
}
|
||||
@@ -336,7 +325,7 @@ class tree_testcase extends \advanced_testcase {
|
||||
/**
|
||||
* Shortcut function to check availability and also get information.
|
||||
*
|
||||
* @param stdClass $structure Tree structure
|
||||
* @param \stdClass $structure Tree structure
|
||||
* @param \core_availability\info $info Location info
|
||||
* @param int $userid User id
|
||||
*/
|
||||
|
||||
@@ -111,8 +111,13 @@ abstract class base_controller extends backup implements loggable {
|
||||
*
|
||||
* @param \stdClass $data The course copy data.
|
||||
* @throws backup_controller_exception
|
||||
* @deprecated since Moodle 4.1 MDL-74548 - please do not use this method anymore.
|
||||
* @todo MDL-75025 This method will be deleted in Moodle 4.5
|
||||
* @see restore_controller::__construct()
|
||||
*/
|
||||
public function set_copy(\stdClass $data): void {
|
||||
debugging('The method base_controller::set_copy() is deprecated.
|
||||
Please use the restore_controller class instead.', DEBUG_DEVELOPER);
|
||||
// Only allow setting of copy data when controller is in copy mode.
|
||||
if ($this->mode != backup::MODE_COPY) {
|
||||
throw new backup_controller_exception('cannot_set_copy_vars_wrong_mode');
|
||||
@@ -124,8 +129,13 @@ abstract class base_controller extends backup implements loggable {
|
||||
* Get the course copy data.
|
||||
*
|
||||
* @return \stdClass
|
||||
* @deprecated since Moodle 4.1 MDL-74548 - please do not use this method anymore.
|
||||
* @todo MDL-75026 This method will be deleted in Moodle 4.5
|
||||
* @see restore_controller::get_copy()
|
||||
*/
|
||||
public function get_copy(): \stdClass {
|
||||
debugging('The method base_controller::get_copy() is deprecated.
|
||||
Please use restore_controller::get_copy() instead.', DEBUG_DEVELOPER);
|
||||
return $this->copy;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,6 +65,13 @@ class restore_controller extends base_controller {
|
||||
/** @var int Number of restore_controllers that are currently executing */
|
||||
protected static $executing = 0;
|
||||
|
||||
/**
|
||||
* Holds the relevant destination information for course copy operations.
|
||||
*
|
||||
* @var \stdClass.
|
||||
*/
|
||||
protected $copy;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
@@ -79,10 +86,17 @@ class restore_controller extends base_controller {
|
||||
* @param int $userid
|
||||
* @param int $target backup::TARGET_[ NEW_COURSE | CURRENT_ADDING | CURRENT_DELETING | EXISTING_ADDING | EXISTING_DELETING ]
|
||||
* @param \core\progress\base $progress Optional progress monitor
|
||||
* @param \stdClass $copydata Course copy data, required when in MODE_COPY
|
||||
* @param bool $releasesession Should release the session? backup::RELEASESESSION_YES or backup::RELEASESESSION_NO
|
||||
*/
|
||||
public function __construct($tempdir, $courseid, $interactive, $mode, $userid, $target,
|
||||
\core\progress\base $progress = null, $releasesession = backup::RELEASESESSION_NO) {
|
||||
\core\progress\base $progress = null, $releasesession = backup::RELEASESESSION_NO, ?\stdClass $copydata = null) {
|
||||
|
||||
if ($mode == backup::MODE_COPY && is_null($copydata)) {
|
||||
throw new restore_controller_exception('cannot_instantiate_missing_copydata');
|
||||
}
|
||||
|
||||
$this->copy = $copydata;
|
||||
$this->tempdir = $tempdir;
|
||||
$this->courseid = $courseid;
|
||||
$this->interactive = $interactive;
|
||||
@@ -563,6 +577,19 @@ class restore_controller extends base_controller {
|
||||
$this->progress->end_progress();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the course copy data.
|
||||
*
|
||||
* @return \stdClass
|
||||
*/
|
||||
public function get_copy(): \stdClass {
|
||||
if ($this->mode != backup::MODE_COPY) {
|
||||
throw new restore_controller_exception('cannot_get_copy_wrong_mode');
|
||||
}
|
||||
|
||||
return $this->copy;
|
||||
}
|
||||
|
||||
// Protected API starts here
|
||||
|
||||
protected function calculate_restoreid() {
|
||||
|
||||
@@ -16,22 +16,33 @@
|
||||
|
||||
/**
|
||||
* @package core_backup
|
||||
* @category phpunit
|
||||
* @category test
|
||||
* @copyright 2010 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
|
||||
namespace core_backup;
|
||||
|
||||
use backup;
|
||||
use backup_controller;
|
||||
use restore_controller;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
// Include all the needed stuff
|
||||
// Include all the needed stuff.
|
||||
global $CFG;
|
||||
require_once($CFG->dirroot . '/backup/util/includes/backup_includes.php');
|
||||
require_once($CFG->dirroot . '/backup/util/includes/restore_includes.php');
|
||||
|
||||
/*
|
||||
* controller tests (all)
|
||||
/**
|
||||
* Tests for the backup and restore controller classes.
|
||||
*
|
||||
* @package core_backup
|
||||
* @category test
|
||||
* @copyright 2010 onwards Eloy Lafuente (stronk7) {@link http://stronk7.com}
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class core_backup_controller_testcase extends advanced_testcase {
|
||||
class controller_test extends \advanced_testcase {
|
||||
|
||||
protected $moduleid; // course_modules id used for testing
|
||||
protected $sectionid; // course_sections id used for testing
|
||||
@@ -61,17 +72,28 @@ class core_backup_controller_testcase extends advanced_testcase {
|
||||
}
|
||||
|
||||
/**
|
||||
* Test set copy method.
|
||||
* Test get_copy
|
||||
*
|
||||
* @covers \restore_controller::get_copy
|
||||
*/
|
||||
public function test_base_controller_set_copy() {
|
||||
$this->expectException(\backup_controller_exception::class);
|
||||
$copy = new \stdClass();
|
||||
public function test_restore_controller_get_copy() {
|
||||
$copydata = (object)["some" => "copydata"];
|
||||
$rc = new \restore_controller(1729, $this->courseid, backup::INTERACTIVE_NO, backup::MODE_COPY,
|
||||
$this->userid, backup::TARGET_NEW_COURSE, null, backup::RELEASESESSION_NO, $copydata);
|
||||
|
||||
// Set up controller as a non-copy operation.
|
||||
$bc = new \backup_controller(backup::TYPE_1COURSE, $this->courseid, backup::FORMAT_MOODLE,
|
||||
backup::INTERACTIVE_NO, backup::MODE_GENERAL, $this->userid, backup::RELEASESESSION_YES);
|
||||
$this->assertEquals($copydata, $rc->get_copy());
|
||||
}
|
||||
|
||||
$bc->set_copy($copy);
|
||||
/**
|
||||
* Test instantiating a restore controller for a course copy without providing copy data.
|
||||
*
|
||||
* @covers \restore_controller::__construct
|
||||
*/
|
||||
public function test_restore_controller_copy_without_copydata() {
|
||||
$this->expectException(\restore_controller_exception::class);
|
||||
|
||||
new \restore_controller(1729, $this->courseid, backup::INTERACTIVE_NO, backup::MODE_COPY,
|
||||
$this->userid, backup::TARGET_NEW_COURSE);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -14,23 +14,33 @@
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
/**
|
||||
* Unit tests for the moodle1 converter
|
||||
*
|
||||
* @package core_backup
|
||||
* @subpackage backup-convert
|
||||
* @category phpunit
|
||||
* @copyright 2011 Mark Nielsen <mark@moodlerooms.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
namespace core_backup;
|
||||
|
||||
use backup;
|
||||
use convert_path;
|
||||
use convert_path_exception;
|
||||
use convert_factory;
|
||||
use convert_helper;
|
||||
use moodle1_converter;
|
||||
use moodle1_convert_empty_storage_exception;
|
||||
use moodle1_convert_exception;
|
||||
use moodle1_convert_storage_exception;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
global $CFG;
|
||||
require_once($CFG->dirroot . '/backup/converter/moodle1/lib.php');
|
||||
|
||||
|
||||
class core_backup_moodle1_converter_testcase extends advanced_testcase {
|
||||
/**
|
||||
* Unit tests for the moodle1 converter
|
||||
*
|
||||
* @package core_backup
|
||||
* @subpackage backup-convert
|
||||
* @category test
|
||||
* @copyright 2011 Mark Nielsen <mark@moodlerooms.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class moodle1_converter_test extends \advanced_testcase {
|
||||
|
||||
/** @var string the name of the directory containing the unpacked Moodle 1.9 backup */
|
||||
protected $tempdir;
|
||||
@@ -68,7 +78,7 @@ class core_backup_moodle1_converter_testcase extends advanced_testcase {
|
||||
"$CFG->dirroot/backup/converter/moodle1/tests/fixtures/icon.gif",
|
||||
"$this->tempdirpath/moddata/unittest/4/icon.gif"
|
||||
);
|
||||
$this->iconhash = file_storage::hash_from_path($this->tempdirpath.'/moddata/unittest/4/icon.gif');
|
||||
$this->iconhash = \file_storage::hash_from_path($this->tempdirpath.'/moddata/unittest/4/icon.gif');
|
||||
copy(
|
||||
"$CFG->dirroot/backup/converter/moodle1/tests/fixtures/icon.gif",
|
||||
"$this->tempdirpath/moddata/unittest/4/7/icon.gif"
|
||||
@@ -351,8 +361,8 @@ class core_backup_moodle1_converter_testcase extends advanced_testcase {
|
||||
$this->assertEquals('array', gettype($files['/file1.gif']));
|
||||
$this->assertEquals('array', gettype($files['/sub1/.']));
|
||||
$this->assertEquals('array', gettype($files['/sub1/file2.gif']));
|
||||
$this->assertEquals(file_storage::hash_from_string(''), $files['/.']['contenthash']);
|
||||
$this->assertEquals(file_storage::hash_from_string(''), $files['/sub1/.']['contenthash']);
|
||||
$this->assertEquals(\file_storage::hash_from_string(''), $files['/.']['contenthash']);
|
||||
$this->assertEquals(\file_storage::hash_from_string(''), $files['/sub1/.']['contenthash']);
|
||||
$this->assertEquals($this->iconhash, $files['/file1.gif']['contenthash']);
|
||||
$this->assertEquals($this->iconhash, $files['/sub1/file2.gif']['contenthash']);
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
*/
|
||||
|
||||
require_once('../config.php');
|
||||
require_once($CFG->dirroot . '/backup/util/includes/backup_includes.php');
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
@@ -70,8 +71,8 @@ if ($mform->is_cancelled()) {
|
||||
} else if ($mdata = $mform->get_data()) {
|
||||
|
||||
// Process the form and create the copy task.
|
||||
$backupcopy = new \core_backup\copy\copy($mdata);
|
||||
$backupcopy->create_copy();
|
||||
$copydata = \copy_helper::process_formdata($mdata);
|
||||
\copy_helper::create_copy($copydata);
|
||||
|
||||
if (!empty($mdata->submitdisplay)) {
|
||||
// Redirect to the copy progress overview.
|
||||
|
||||
@@ -388,8 +388,8 @@ class core_backup_external extends external_api {
|
||||
|
||||
if ($mdata) {
|
||||
// Create the copy task.
|
||||
$backupcopy = new \core_backup\copy\copy($mdata);
|
||||
$copyids = $backupcopy->create_copy();
|
||||
$copydata = \copy_helper::process_formdata($mdata);
|
||||
$copyids = \copy_helper::create_copy($copydata);
|
||||
} else {
|
||||
throw new moodle_exception('copyformfail', 'backup');
|
||||
}
|
||||
|
||||
@@ -408,6 +408,11 @@ class backup_course_structure_step extends backup_structure_step {
|
||||
'shortname', 'type', 'value', 'valueformat'
|
||||
));
|
||||
|
||||
$courseformatoptions = new backup_nested_element('courseformatoptions');
|
||||
$courseformatoption = new backup_nested_element('courseformatoption', [], [
|
||||
'courseid', 'format', 'sectionid', 'name', 'value'
|
||||
]);
|
||||
|
||||
// attach format plugin structure to $course element, only one allowed
|
||||
$this->add_plugin_structure('format', $course, false);
|
||||
|
||||
@@ -445,17 +450,14 @@ class backup_course_structure_step extends backup_structure_step {
|
||||
$course->add_child($customfields);
|
||||
$customfields->add_child($customfield);
|
||||
|
||||
$course->add_child($courseformatoptions);
|
||||
$courseformatoptions->add_child($courseformatoption);
|
||||
|
||||
// Set the sources
|
||||
|
||||
$courserec = $DB->get_record('course', array('id' => $this->task->get_courseid()));
|
||||
$courserec->contextid = $this->task->get_contextid();
|
||||
|
||||
$formatoptions = course_get_format($courserec)->get_format_options();
|
||||
$course->add_final_elements(array_keys($formatoptions));
|
||||
foreach ($formatoptions as $key => $value) {
|
||||
$courserec->$key = $value;
|
||||
}
|
||||
|
||||
// Add 'numsections' in order to be able to restore in previous versions of Moodle.
|
||||
// Even though Moodle does not officially support restore into older verions of Moodle from the
|
||||
// version where backup was made, without 'numsections' restoring will go very wrong.
|
||||
@@ -477,6 +479,10 @@ class backup_course_structure_step extends backup_structure_step {
|
||||
backup_helper::is_sqlparam('course'),
|
||||
backup::VAR_PARENTID));
|
||||
|
||||
$courseformatoption->set_source_sql('SELECT id, format, sectionid, name, value
|
||||
FROM {course_format_options}
|
||||
WHERE courseid = ?', [ backup::VAR_PARENTID ]);
|
||||
|
||||
$handler = core_course\customfield\course_handler::create();
|
||||
$fieldsforbackup = $handler->get_instance_data_for_backup($this->task->get_courseid());
|
||||
$customfield->set_source_array($fieldsforbackup);
|
||||
|
||||