From 2bb7e34b76ea9d9ecbdc426cc96f4a9b92cf8b55 Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Thu, 8 Jul 2021 12:29:28 +0800 Subject: [PATCH] MDL-72125 mod_assign: Add data generator for assign submissions --- .../submission/file/tests/generator/lib.php | 69 +++++++++++++++++++ .../onlinetext/tests/generator/lib.php | 50 ++++++++++++++ .../assignsubmission_subplugin_generator.php | 39 +++++++++++ .../generator/behat_mod_assign_generator.php | 52 ++++++++++++++ mod/assign/tests/generator/lib.php | 69 +++++++++++++++++++ 5 files changed, 279 insertions(+) create mode 100644 mod/assign/submission/file/tests/generator/lib.php create mode 100644 mod/assign/submission/onlinetext/tests/generator/lib.php create mode 100644 mod/assign/tests/generator/assignsubmission_subplugin_generator.php create mode 100644 mod/assign/tests/generator/behat_mod_assign_generator.php diff --git a/mod/assign/submission/file/tests/generator/lib.php b/mod/assign/submission/file/tests/generator/lib.php new file mode 100644 index 00000000000..67a760b2d20 --- /dev/null +++ b/mod/assign/submission/file/tests/generator/lib.php @@ -0,0 +1,69 @@ +. + +require_once("{$CFG->dirroot}/mod/assign/tests/generator/assignsubmission_subplugin_generator.php"); + +/** + * Online Text assignment submission subplugin data generator. + * + * @package assignsubmission_file + * @category test + * @copyright 2021 Andrew Lyons + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class assignsubmission_file_generator extends assignsubmission_subplugin_generator { + /** + * Add submission data in the correct format for a call to `assign::save_submission()` from a table containing + * submission data for a single activity. + * + * Data should be added to the $submission object passed into the function. + * + * @param stdClass $submission The submission record to be modified + * @param assign $assign The assingment being submitted to + * @param array $data The data received + */ + public function add_submission_data(stdClass $submission, assign $assign, array $data): void { + global $CFG; + + if (array_key_exists('file', $data)) { + $files = explode(',', $data['file']); + $itemid = file_get_unused_draft_itemid(); + + $fs = get_file_storage(); + + foreach ($files as $filepath) { + // All paths are relative to $CFG->dirroot. + $filepath = trim($filepath); + $filepath = "{$CFG->dirroot}/{$filepath}"; + $filename = basename($filepath); + + $fs->create_file_from_pathname((object) [ + 'itemid' => $itemid, + 'contextid' => context_user::instance($submission->userid)->id, + 'component' => 'user', + 'filearea' => 'draft', + 'filepath' => '/', + 'filename' => $filename, + ], $filepath); + } + $submission->files_filemanager = $itemid; + + $submission->file_editor = [ + 'itemid' => $itemid, + ]; + } + } +} diff --git a/mod/assign/submission/onlinetext/tests/generator/lib.php b/mod/assign/submission/onlinetext/tests/generator/lib.php new file mode 100644 index 00000000000..6575de4e2bf --- /dev/null +++ b/mod/assign/submission/onlinetext/tests/generator/lib.php @@ -0,0 +1,50 @@ +. + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; +require_once(__DIR__ . '/../../../../tests/generator/assignsubmission_subplugin_generator.php'); + +/** + * Online Text assignment submission subplugin data generator. + * + * @package assignsubmission_onlinetext + * @category test + * @copyright 2021 Andrew Lyons + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class assignsubmission_onlinetext_generator extends assignsubmission_subplugin_generator { + /** + * Add submission data in the correct format for a call to `assign::save_submission()` from a table containing + * submission data for a single activity. + * + * Data should be added to the $submission object passed into the function. + * + * @param stdClass $submission The submission record to be modified + * @param assign $assign The assingment being submitted to + * @param array $data The data received + */ + public function add_submission_data(stdClass $submission, assign $assign, array $data): void { + if (array_key_exists('onlinetext', $data)) { + $submission->onlinetext_editor = [ + 'itemid' => file_get_unused_draft_itemid(), + 'text' => $data['onlinetext'], + 'format' => FORMAT_HTML, + ]; + } + } +} diff --git a/mod/assign/tests/generator/assignsubmission_subplugin_generator.php b/mod/assign/tests/generator/assignsubmission_subplugin_generator.php new file mode 100644 index 00000000000..f21eff591d7 --- /dev/null +++ b/mod/assign/tests/generator/assignsubmission_subplugin_generator.php @@ -0,0 +1,39 @@ +. + +defined('MOODLE_INTERNAL') || die(); + +/** + * Online Text assignment submission subplugin data generator. + * + * @package assignsubmission_onlinetext + * @category test + * @copyright 2021 Andrew Lyons + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +abstract class assignsubmission_subplugin_generator extends testing_module_generator { + /** + * Add submission data in the correct format for a call to `assign::save_submission()` from a table containing + * submission data for a single activity. + * + * Data should be added to the $submission object passed into the function. + * + * @param stdClass $submission The submission record to be modified + * @param assign $assign The assingment being submitted to + * @param array $data The data received + */ + abstract public function add_submission_data(stdClass $submission, assign $assign, array $data): void; +} diff --git a/mod/assign/tests/generator/behat_mod_assign_generator.php b/mod/assign/tests/generator/behat_mod_assign_generator.php new file mode 100644 index 00000000000..615fd04c342 --- /dev/null +++ b/mod/assign/tests/generator/behat_mod_assign_generator.php @@ -0,0 +1,52 @@ +. + +/** + * Behat data generator for mod_assign. + * + * @package mod_assign + * @category test + * @copyright 2021 Andrew Lyons + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class behat_mod_assign_generator extends behat_generator_base { + + /** + * Get a list of the entities that Behat can create using the generator step. + * + * @return array + */ + protected function get_creatable_entities(): array { + return [ + 'submissions' => [ + 'singular' => 'submission', + 'datagenerator' => 'submission', + 'required' => ['assign', 'user'], + 'switchids' => ['assign' => 'assignid', 'user' => 'userid'], + ], + ]; + } + + /** + * Get the assignment CMID using an activity idnumber. + * + * @param string $idnumber + * @return int The cmid + */ + protected function get_assign_id(string $idnumber): int { + return $this->get_activity_id($idnumber); + } +} diff --git a/mod/assign/tests/generator/lib.php b/mod/assign/tests/generator/lib.php index fd14b86578e..e72e0de975d 100644 --- a/mod/assign/tests/generator/lib.php +++ b/mod/assign/tests/generator/lib.php @@ -26,6 +26,13 @@ defined('MOODLE_INTERNAL') || die(); */ class mod_assign_generator extends testing_module_generator { + /** + * Create a new instance of the assignment activity. + * + * @param array|stdClass|null $record + * @param array|null $options + * @return stdClass + */ public function create_instance($record = null, array $options = null) { $record = (object)(array)$record; @@ -51,6 +58,10 @@ class mod_assign_generator extends testing_module_generator { 'markingallocation' => 0, ); + if (property_exists($record, 'teamsubmissiongroupingid')) { + $record->teamsubmissiongroupingid = $this->get_grouping_id($record->teamsubmissiongroupingid); + } + foreach ($defaultsettings as $name => $value) { if (!isset($record->{$name})) { $record->{$name} = $value; @@ -60,6 +71,64 @@ class mod_assign_generator extends testing_module_generator { return parent::create_instance($record, (array)$options); } + /** + * Create an assignment submission. + * + * @param array $data + */ + public function create_submission(array $data): void { + global $USER; + + $currentuser = $USER; + $user = \core_user::get_user($data['userid']); + $this->set_user($user); + + $submission = (object) [ + 'userid' => $user->id, + ]; + + [$course, $cm] = get_course_and_cm_from_cmid($data['assignid'], 'assign'); + $context = context_module::instance($cm->id); + $assign = new assign($context, $cm, $course); + + foreach ($assign->get_submission_plugins() as $plugin) { + $pluginname = $plugin->get_type(); + if (array_key_exists($pluginname, $data)) { + $plugingenerator = $this->datagenerator->get_plugin_generator("assignsubmission_{$pluginname}"); + $plugingenerator->add_submission_data($submission, $assign, $data); + } + } + + $assign->save_submission((object) $submission, $notices); + + $this->set_user($currentuser); + } + + /** + * Gets the grouping id from it's idnumber. + * + * @throws Exception + * @param string $idnumber + * @return int + */ + protected function get_grouping_id(string $idnumber): int { + global $DB; + + // Do not fetch grouping ID for empty grouping idnumber. + if (empty($idnumber)) { + return null; + } + + if (!$id = $DB->get_field('groupings', 'id', ['idnumber' => $idnumber])) { + if (is_numeric($idnumber)) { + return $idnumber; + } + throw new Exception('The specified grouping with idnumber "' . $idnumber . '" does not exist'); + } + + return $id; + } + /** * Create an assign override (either user or group). *