diff --git a/src/transformer/events/core/group_member_added.php b/src/transformer/events/core/group_member_added.php new file mode 100644 index 000000000..78f99efaf --- /dev/null +++ b/src/transformer/events/core/group_member_added.php @@ -0,0 +1,66 @@ +. + +/** + * Transform for the group member added event. + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace src\transformer\events\core; + +use src\transformer\utils as utils; + +/** + * Transform for the group member added event. + * + * @param array $config The transformer config settings. + * @param \stdClass $event The event to be transformed. + * @return array + */ +function group_member_added(array $config, \stdClass $event) { + $repo = $config['repo']; + $user = $repo->read_record_by_id('user', $event->userid); + $member = $repo->read_record_by_id('user', $event->relateduserid); + $course = $repo->read_record_by_id('course', $event->courseid); + $lang = utils\get_course_lang($course); + $group = $repo->read_record_by_id($event->objecttable, $event->objectid); + + return [[ + 'actor' => utils\get_user($config, $member), + 'verb' => [ + 'id' => 'http://activitystrea.ms/join', + 'display' => [ + $lang => 'Joined' + ], + ], + 'object' => utils\get_activity\course_group($config, $course, $group), + 'context' => [ + 'instructor' => utils\get_user($config, $user), + 'extensions' => utils\extensions\base($config, $event, null), + 'contextActivities' => [ + 'parent' => [ + utils\get_activity\course($config, $course), + ], + 'category' => [ + utils\get_activity\site($config), + ], + ], + ] + ]]; +} diff --git a/src/transformer/events/core/group_member_removed.php b/src/transformer/events/core/group_member_removed.php new file mode 100644 index 000000000..e60381d8c --- /dev/null +++ b/src/transformer/events/core/group_member_removed.php @@ -0,0 +1,66 @@ +. + +/** + * Transform for the group member removed event. + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace src\transformer\events\core; + +use src\transformer\utils as utils; + +/** + * Transform for the group member removed event. + * + * @param array $config The transformer config settings. + * @param \stdClass $event The event to be transformed. + * @return array + */ +function group_member_removed(array $config, \stdClass $event) { + $repo = $config['repo']; + $user = $repo->read_record_by_id('user', $event->userid); + $member = $repo->read_record_by_id('user', $event->relateduserid); + $course = $repo->read_record_by_id('course', $event->courseid); + $lang = utils\get_course_lang($course); + $group = $repo->read_record_by_id($event->objecttable, $event->objectid); + + return [[ + 'actor' => utils\get_user($config, $member), + 'verb' => [ + 'id' => 'http://activitystrea.ms/leave', + 'display' => [ + $lang => 'Left' + ], + ], + 'object' => utils\get_activity\course_group($config, $course, $group), + 'context' => [ + 'instructor' => utils\get_user($config, $user), + 'extensions' => utils\extensions\base($config, $event, null), + 'contextActivities' => [ + 'parent' => [ + utils\get_activity\course($config, $course), + ], + 'category' => [ + utils\get_activity\site($config), + ], + ], + ] + ]]; +} diff --git a/src/transformer/events/core/group_message_sent.php b/src/transformer/events/core/group_message_sent.php new file mode 100644 index 000000000..a5a7342bc --- /dev/null +++ b/src/transformer/events/core/group_message_sent.php @@ -0,0 +1,74 @@ +. + +/** + * Transformer fn for group message sent event. + * + * @package logstore_xapi + * @copyright Milt Reder + * + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace src\transformer\events\core; + +use src\transformer\utils as utils; + +/** + * Transformer fn for group message sent event. + * + * @param array $config The transformer config settings. + * @param \stdClass $event The event to be transformed. + * @return array + */ + +function group_message_sent(array $config, \stdClass $event) { + $repo = $config['repo']; + $user = $repo->read_record_by_id('user', $event->userid); + $message = $repo->read_record_by_id('messages', $event->objectid); + $conversation = $repo->read_record_by_id( + 'message_conversations', + $message->conversationid + ); + $group = $repo->read_record_by_id('groups', $conversation->itemid); + $course = $repo->read_record_by_id('course', $group->courseid); + $lang = utils\get_course_lang($course); + + return [[ + 'actor' => utils\get_user($config, $user), + 'verb' => [ + 'id' => 'http://activitystrea.ms/send', + 'display' => [ + $lang => 'Sent' + ], + ], + 'object' => utils\get_activity\message($config, $lang, $message), + 'context' => [ + 'extensions' => utils\extensions\base($config, $event, null), + 'contextActivities' => [ + 'grouping' => [ + utils\get_activity\course_group($config, $course, $group) + ], + 'parent' => [ + utils\get_activity\course($config, $course), + ], + 'category' => [ + utils\get_activity\site($config), + ], + ], + ] + ]]; +} diff --git a/src/transformer/events/core/question_created.php b/src/transformer/events/core/question_created.php new file mode 100644 index 000000000..00e2e40fb --- /dev/null +++ b/src/transformer/events/core/question_created.php @@ -0,0 +1,74 @@ +. + +/** + * Transformer fn for question created event. + * + * @package logstore_xapi + * @copyright Milt Reder + * + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace src\transformer\events\core; + +use src\transformer\utils as utils; +use src\transformer\utils\get_activity\definition\question as qdef; + +/** + * Transformer fn for question created event. + * + * @param array $config The transformer config settings. + * @param \stdClass $event The event to be transformed. + * @return array + */ + +function question_created(array $config, \stdClass $event) { + $repo = $config['repo']; + $user = $repo->read_record_by_id('user', $event->userid); + $course = $repo->read_record_by_id('course', $event->courseid); + $question = $repo->read_record_by_id('question', $event->objectid); + $lang = utils\get_course_lang($course); + + $definition = qdef\get_definition($config, $question, $lang); + + $definition['extensions']['https://xapi.edlm/profiles/edlm-lms/concepts/activity-extensions/moodle-question-type'] = $question->qtype; + + return [[ + 'actor' => utils\get_user($config, $user), + 'verb' => [ + 'id' => 'http://activitystrea.ms/create', + 'display' => [ + $lang => 'Created' + ], + ], + 'object' => [ + 'id' => $config['app_url'] . '/question?id=' . $question->id, + 'definition' => $definition, + ], + 'context' => [ + 'extensions' => utils\extensions\base($config, $event, null), + 'contextActivities' => [ + 'parent' => [ + utils\get_activity\course($config, $course) + ], + 'category' => [ + utils\get_activity\site($config), + ], + ], + ] + ]]; +} diff --git a/src/transformer/events/core/search_results_viewed.php b/src/transformer/events/core/search_results_viewed.php new file mode 100644 index 000000000..87569c45c --- /dev/null +++ b/src/transformer/events/core/search_results_viewed.php @@ -0,0 +1,75 @@ +. + +/** + * Transformer fn for search results viewed event. + * + * @package logstore_xapi + * @copyright Milt Reder + * + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace src\transformer\events\core; + +use src\transformer\utils as utils; + +/** + * Transformer fn for search results viewed event. + * + * @param array $config The transformer config settings. + * @param \stdClass $event The event to be transformed. + * @return array + */ + +function search_results_viewed(array $config, \stdClass $event) { + $repo = $config['repo']; + $user = $repo->read_record_by_id('user', $event->userid); + $lang = $config['source_lang']; + $info = unserialize($event->other); + + return [[ + 'actor' => utils\get_user($config, $user), + 'verb' => [ + 'id' => 'https://w3id.org/xapi/acrossx/verbs/searched', + 'display' => [ + $lang => 'Searched' + ], + ], + 'object' => [ + 'id' => $config['app_url'] . '/search/index.php', + 'objectType' => 'Activity', + 'definition' => [ + 'type' => 'https://w3id.org/xapi/acrossx/activities/webpage', + 'name' => [ + $lang => 'Global Search' + ], + ], + ], + 'result' => [ + 'response' => $info['q'], + ], + 'context' => [ + 'extensions' => utils\extensions\base($config, $event, null), + 'contextActivities' => [ + 'category' => [ + utils\get_activity\site($config), + ], + ], + ], + ]]; + +} diff --git a/src/transformer/events/core/user_enrolment_created.php b/src/transformer/events/core/user_enrolment_created.php index 97ff3758c..2e5c90381 100644 --- a/src/transformer/events/core/user_enrolment_created.php +++ b/src/transformer/events/core/user_enrolment_created.php @@ -21,6 +21,7 @@ * @copyright Jerret Fowler * Ryan Smith * David Pesce + * Milt Reder * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ @@ -37,31 +38,28 @@ */ function user_enrolment_created(array $config, \stdClass $event) { $repo = $config['repo']; - $user = $repo->read_record_by_id('user', $event->relateduserid); + $user = $repo->read_record_by_id('user', $event->userid); + $cuser = $repo->read_record_by_id('user', $event->relateduserid); $course = $repo->read_record_by_id('course', $event->courseid); $lang = utils\get_course_lang($course); - return[[ - 'actor' => utils\get_user($config, $user), + return [[ + 'actor' => utils\get_user($config, $cuser), 'verb' => [ - 'id' => 'http://adlnet.gov/expapi/verbs/registered', + 'id' => 'https://xapi.edlm/profiles/edlm-lms/concepts/verbs/enrolled', 'display' => [ - $lang => 'enrolled to' + $lang => 'Enrolled', ], ], 'object' => utils\get_activity\course($config, $course), - 'context' => [ - 'language' => $lang, - 'extensions' => utils\extensions\base($config, $event, $course), - 'contextActivities' => [ - 'grouping' => [ - utils\get_activity\site($config) - ], - 'category' => [ - utils\get_activity\source($config) - ] - ], - ] + 'context' => utils\get_enrolment_context( + $config, + $event, + $course, + $cuser, + $user, + $lang + ), ]]; } diff --git a/src/transformer/events/core/user_enrolment_deleted.php b/src/transformer/events/core/user_enrolment_deleted.php new file mode 100644 index 000000000..6dd2fc8b5 --- /dev/null +++ b/src/transformer/events/core/user_enrolment_deleted.php @@ -0,0 +1,63 @@ +. + +/** + * Transformer fn for user enrolment deleted event. + * + * @package logstore_xapi + * @copyright Milt Reder + * + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace src\transformer\events\core; + +use src\transformer\utils as utils; + +/** + * Transformer fn for user enrolment deleted event. + * + * @param array $config The transformer config settings. + * @param \stdClass $event The event to be transformed. + * @return array + */ + +function user_enrolment_deleted(array $config, \stdClass $event) { + $repo = $config['repo']; + $user = $repo->read_record_by_id('user', $event->userid); + $cuser = $repo->read_record_by_id('user', $event->relateduserid); + $course = $repo->read_record_by_id('course', $event->courseid); + $lang = utils\get_course_lang($course); + + return [[ + 'actor' => utils\get_user($config, $cuser), + 'verb' => [ + 'id' => 'http://activitystrea.ms/leave', + 'display' => [ + $lang => 'Left', + ], + ], + 'object' => utils\get_activity\course($config, $course), + 'context' => utils\get_enrolment_context( + $config, + $event, + $course, + $cuser, + $user, + $lang + ), + ]]; +} diff --git a/src/transformer/events/core/user_enrolment_updated.php b/src/transformer/events/core/user_enrolment_updated.php new file mode 100644 index 000000000..c47ff0800 --- /dev/null +++ b/src/transformer/events/core/user_enrolment_updated.php @@ -0,0 +1,74 @@ +. + +/** + * Transform for user enrolment updated event. + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace src\transformer\events\core; + +use src\transformer\utils as utils; + +/** + * Transformer for the user enrolment updated event. + * + * @param array $config The transformer config settings. + * @param \stdClass $event The event to be transformed. + * @return array + */ +function user_enrolment_updated(array $config, \stdClass $event) { + $repo = $config['repo']; + $enrolment = $repo->read_record_by_id('user_enrolments', $event->objectid); + $user = $repo->read_record_by_id('user', $event->userid); + $cuser = $repo->read_record_by_id('user', $event->relateduserid); + $course = $repo->read_record_by_id('course', $event->courseid); + $lang = utils\get_course_lang($course); + + if ($enrolment->status == 1) { + $verb = [ + 'id' => 'https://w3id.org/xapi/tla/verbs/suspended', + 'display' => [ + $lang => 'Suspended', + ], + ]; + } else { + $verb = [ + 'id' => 'https://w3id.org/xapi/tla/verbs/resumed', + 'display' => [ + $lang => 'Resumed', + ], + ]; + } + + return [[ + 'actor' => utils\get_user($config, $cuser), + 'verb' => $verb, + 'object' => utils\get_activity\course($config, $course), + 'context' => utils\get_enrolment_context( + $config, + $event, + $course, + $cuser, + $user, + $lang + ), + ]]; + +} diff --git a/src/transformer/events/mod_quiz/question_answered/essay.php b/src/transformer/events/mod_quiz/question_answered/essay.php index 5ce97471f..5dc1773d3 100644 --- a/src/transformer/events/mod_quiz/question_answered/essay.php +++ b/src/transformer/events/mod_quiz/question_answered/essay.php @@ -27,6 +27,7 @@ namespace src\transformer\events\mod_quiz\question_answered; use src\transformer\utils as utils; +use src\transformer\utils\get_activity\definition\question as question; /** * Transformer for quiz question (essay) answered event. @@ -58,13 +59,9 @@ function essay(array $config, \stdClass $event, \stdClass $questionattempt, \std ], 'object' => [ 'id' => utils\get_quiz_question_id($config, $coursemodule->id, $question->id), - 'definition' => [ - 'type' => 'http://adlnet.gov/expapi/activities/cmi.interaction', - 'name' => [ - $lang => utils\get_string_html_removed($question->questiontext) - ], - 'interactionType' => 'long-fill-in', - ] + 'definition' => question\get_essay_definition( + $config, $question, $lang + ) ], 'result' => [ 'response' => $responsesummary, diff --git a/src/transformer/events/mod_quiz/question_answered/gapselect.php b/src/transformer/events/mod_quiz/question_answered/gapselect.php index 48da62aa1..8006f2c5d 100644 --- a/src/transformer/events/mod_quiz/question_answered/gapselect.php +++ b/src/transformer/events/mod_quiz/question_answered/gapselect.php @@ -27,6 +27,7 @@ namespace src\transformer\events\mod_quiz\question_answered; use src\transformer\utils as utils; +use src\transformer\utils\get_activity\definition\question as question; /** * Transformer for quiz question (gapselect) answered event. @@ -57,7 +58,13 @@ function gapselect(array $config, \stdClass $event, \stdClass $questionattempt, ], 'object' => [ 'id' => utils\get_quiz_question_id($config, $coursemodule->id, $question->id), - 'definition' => utils\get_multichoice_definition($config, $questionattempt, $question, $lang, 'sequencing'), + 'definition' => question\get_multichoice_definition( + $config, + $question, + $lang, + 'sequencing', + $questionattempt->rightanswer + ), ], 'result' => [ 'response' => implode ('[,]', $selections), diff --git a/src/transformer/events/mod_quiz/question_answered/match.php b/src/transformer/events/mod_quiz/question_answered/match.php index 0de71cd07..b231bea9d 100644 --- a/src/transformer/events/mod_quiz/question_answered/match.php +++ b/src/transformer/events/mod_quiz/question_answered/match.php @@ -27,6 +27,7 @@ namespace src\transformer\events\mod_quiz\question_answered; use src\transformer\utils as utils; +use src\transformer\utils\get_activity\definition\question as question; /** * Transformer for quiz question (match) answered event. @@ -67,13 +68,7 @@ function ($reduction, $selection) { ], 'object' => [ 'id' => utils\get_quiz_question_id($config, $coursemodule->id, $question->id), - 'definition' => [ - 'type' => 'http://adlnet.gov/expapi/activities/cmi.interaction', - 'name' => [ - $lang => utils\get_string_html_removed($question->questiontext) - ], - 'interactionType' => 'matching', - ] + 'definition' => question\get_match_definition($config, $question, $lang) ], 'result' => [ 'response' => $questionattempt->responsesummary, diff --git a/src/transformer/events/mod_quiz/question_answered/multichoice.php b/src/transformer/events/mod_quiz/question_answered/multichoice.php index 83b9900b6..d9e8a90ea 100644 --- a/src/transformer/events/mod_quiz/question_answered/multichoice.php +++ b/src/transformer/events/mod_quiz/question_answered/multichoice.php @@ -27,6 +27,7 @@ namespace src\transformer\events\mod_quiz\question_answered; use src\transformer\utils as utils; +use src\transformer\utils\get_activity\definition\question as question; /** * Transformer for quiz question (multichoice) answered event. @@ -56,7 +57,13 @@ function multichoice(array $config, \stdClass $event, \stdClass $questionattempt ], 'object' => [ 'id' => utils\get_quiz_question_id($config, $coursemodule->id, $question->id), - 'definition' => utils\get_multichoice_definition($config, $questionattempt, $question, $lang), + 'definition' => question\get_multichoice_definition( + $config, + $question, + $lang, + 'choice', + $questionattempt->rightanswer + ), ], 'result' => [ 'response' => implode ('[,]', $selections), diff --git a/src/transformer/events/mod_quiz/question_answered/numerical.php b/src/transformer/events/mod_quiz/question_answered/numerical.php index fd0248d45..338f794eb 100644 --- a/src/transformer/events/mod_quiz/question_answered/numerical.php +++ b/src/transformer/events/mod_quiz/question_answered/numerical.php @@ -27,6 +27,7 @@ namespace src\transformer\events\mod_quiz\question_answered; use src\transformer\utils as utils; +use src\transformer\utils\get_activity\definition\question as question; /** * Transformer for quiz question (numerical) answered event. @@ -56,13 +57,7 @@ function numerical(array $config, \stdClass $event, \stdClass $questionattempt, ], 'object' => [ 'id' => utils\get_quiz_question_id($config, $coursemodule->id, $question->id), - 'definition' => [ - 'type' => 'http://adlnet.gov/expapi/activities/cmi.interaction', - 'name' => [ - $lang => utils\get_string_html_removed($question->questiontext) - ], - 'interactionType' => 'numeric', - ] + 'definition' => question\get_numerical_definition($config, $question, $lang) ], 'result' => [ 'response' => $questionattempt->responsesummary, diff --git a/src/transformer/events/mod_quiz/question_answered/randomsamatch.php b/src/transformer/events/mod_quiz/question_answered/randomsamatch.php index a557b7876..a21951d60 100644 --- a/src/transformer/events/mod_quiz/question_answered/randomsamatch.php +++ b/src/transformer/events/mod_quiz/question_answered/randomsamatch.php @@ -27,6 +27,7 @@ namespace src\transformer\events\mod_quiz\question_answered; use src\transformer\utils as utils; +use src\transformer\utils\get_activity\definition\question as question; /** * Transformer for quiz question (randomsamatch) answered event. @@ -67,13 +68,7 @@ function ($reduction, $selection) { ], 'object' => [ 'id' => utils\get_quiz_question_id($config, $coursemodule->id, $question->id), - 'definition' => [ - 'type' => 'http://adlnet.gov/expapi/activities/cmi.interaction', - 'name' => [ - $lang => utils\get_string_html_removed($question->questiontext) - ], - 'interactionType' => 'matching', - ] + 'definition' => question\get_match_definition($config, $question, $lang) ], 'result' => [ 'response' => $questionattempt->responsesummary, diff --git a/src/transformer/events/mod_quiz/question_answered/shortanswer.php b/src/transformer/events/mod_quiz/question_answered/shortanswer.php index a02499b6c..9e9d4a879 100644 --- a/src/transformer/events/mod_quiz/question_answered/shortanswer.php +++ b/src/transformer/events/mod_quiz/question_answered/shortanswer.php @@ -27,6 +27,7 @@ namespace src\transformer\events\mod_quiz\question_answered; use src\transformer\utils as utils; +use src\transformer\utils\get_activity\definition\question as question; /** * Transformer for quiz question (shortanswer) answered event. @@ -56,13 +57,7 @@ function shortanswer(array $config, \stdClass $event, \stdClass $questionattempt ], 'object' => [ 'id' => utils\get_quiz_question_id($config, $coursemodule->id, $question->id), - 'definition' => [ - 'type' => 'http://adlnet.gov/expapi/activities/cmi.interaction', - 'name' => [ - $lang => utils\get_string_html_removed($question->questiontext) - ], - 'interactionType' => 'fill-in', - ] + 'definition' => question\get_shortanswer_definition($config, $question, $lang) ], 'result' => [ 'response' => $questionattempt->responsesummary, diff --git a/src/transformer/events/mod_quiz/question_answered/truefalse.php b/src/transformer/events/mod_quiz/question_answered/truefalse.php index edd3236ee..1fca5d529 100644 --- a/src/transformer/events/mod_quiz/question_answered/truefalse.php +++ b/src/transformer/events/mod_quiz/question_answered/truefalse.php @@ -27,6 +27,7 @@ namespace src\transformer\events\mod_quiz\question_answered; use src\transformer\utils as utils; +use src\transformer\utils\get_activity\definition\question as question; /** * Transformer for quiz question (truefalse) answered event. @@ -55,13 +56,7 @@ function truefalse(array $config, \stdClass $event, \stdClass $questionattempt, ], 'object' => [ 'id' => utils\get_quiz_question_id($config, $coursemodule->id, $question->id), - 'definition' => [ - 'type' => 'http://adlnet.gov/expapi/activities/cmi.interaction', - 'name' => [ - $lang => utils\get_string_html_removed($question->questiontext), - ], - 'interactionType' => 'true-false', - ] + 'definition' => question\get_true_false_definition($config, $question, $lang) ], 'result' => [ 'response' => utils\get_string_html_removed($questionattempt->responsesummary), diff --git a/src/transformer/get_event_function_map.php b/src/transformer/get_event_function_map.php index 5414e8d6b..8d67493a5 100644 --- a/src/transformer/get_event_function_map.php +++ b/src/transformer/get_event_function_map.php @@ -48,13 +48,20 @@ function get_event_function_map() { '\core\event\course_resources_list_viewed' => 'core\course_resources_list_viewed', '\core\event\group_created' => 'core\group_created', '\core\event\group_deleted' => 'core\group_deleted', + '\core\event\group_message_sent' => 'core\group_message_sent', + '\core\event\group_member_added' => 'core\group_member_added', + '\core\event\group_member_removed' => 'core\group_member_removed', '\core\event\user_created' => 'core\user_created', '\core\event\user_enrolment_created' => 'core\user_enrolment_created', + '\core\event\user_enrolment_deleted' => 'core\user_enrolment_deleted', + '\core\event\user_enrolment_updated' => 'core\user_enrolment_updated', '\core\event\user_loggedin' => 'core\user_loggedin', '\core\event\user_loggedout' => 'core\user_loggedout', '\core\event\course_module_created' => 'core\course_module_created', '\core\event\course_module_completion_updated' => 'core\course_module_completion_updated', '\core_h5p\event\h5p_viewed' => 'all\course_module_viewed', + '\core\event\search_results_viewed' => 'core\search_results_viewed', + '\core\event\question_created' => 'core\question_created', '\mod_assign\event\assessable_submitted' => 'mod_assign\assignment_submitted', '\mod_assign\event\submission_graded' => 'mod_assign\assignment_graded', '\mod_bigbluebuttonbn\event\activity_viewed' => 'mod_bigbluebuttonbn\activity_viewed', diff --git a/src/transformer/utils/get_activity/definition/question.php b/src/transformer/utils/get_activity/definition/question.php new file mode 100644 index 000000000..005ade74e --- /dev/null +++ b/src/transformer/utils/get_activity/definition/question.php @@ -0,0 +1,237 @@ +. + +/** + * Transformer utilities for creating Question xAPI Activity object definitions. + * + * @package logstore_xapi + * @copyright Jerret Fowler + * Ryan Smith + * David Pesce + * Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace src\transformer\utils\get_activity\definition\question; + +use src\transformer\utils as utils; + +/** + * Helper for getting basic interaction activity def data. + * + * @param array $config The transformer config settings. + * @param \stdClass $question The question object. + * @param string $lang The language. + */ +function get_def_base(array $config, \stdClass $question, string $lang) { + return [ + 'type' => 'http://adlnet.gov/expapi/activities/cmi.interaction', + 'name' => [ + $lang => $question->name, + ], + 'description' => [ + $lang => utils\get_string_html_removed($question->questiontext), + ], + ]; +} + +/** + * Transformer util for creating essay definitions + * + * @param array $config The transformer config settings. + * @param \stdClass $question The question object. + * @param string $lang The language. + */ +function get_essay_definition(array $config, \stdClass $question, string $lang) { + return array_merge( + get_def_base($config, $question, $lang), + [ + 'interactionType' => 'long-fill-in', + ] + ); +} + +/** + * Transformer util for creating multichoice definitions. + * + * @param array $config The transformer config settings. + * @param \stdClass $question The question object. + * @param string $lang The language. + * @param ?string $interactiontype The type of interaction. + * @param ?string $rightanswer The correct answer, not always available. + * @return array + */ +function get_multichoice_definition( + array $config, + \stdClass $question, + string $lang, + ?string $interactiontype = 'choice', + ?string $rightanswer = null +) { + if ($config['send_response_choices']) { + $repo = $config['repo']; + $answers = $repo->read_records('question_answers', [ + 'question' => $question->id + ]); + $choices = array_map(function ($answer) use ($lang) { + return [ + "id" => "$answer->id", + "description" => [ + $lang => utils\get_string_html_removed($answer->answer) + ] + ]; + }, $answers); + + $correctresponsepattern; + + if (!is_null($rightanswer)) { + switch ($interactiontype) { + case 'sequencing': + $selections = explode('} {', rtrim(ltrim($rightanswer, '{'), '}')); + $correctresponsepattern = implode ('[,]', $selections); + break; + default: + $selections = explode('; ', utils\get_string_html_removed($rightanswer)); + $correctresponsepattern = implode ('[,]', $selections); + break; + } + } + + $def = array_merge( + get_def_base($config, $question, $lang), + [ + 'interactionType' => $interactiontype, + 'correctResponsesPattern' => [$correctresponsepattern], + // Need to pull out id's that are appended during array_map so json parses it correctly as an array. + 'choices' => array_values($choices) + ] + ); + + if (!is_null($correctresponsepattern)) { + $def['correctResponsesPattern'] = [$correctresponsepattern]; + } + + return $def; + } else { + return array_merge( + get_def_base($config, $question, $lang), + [ + 'interactionType' => $interactiontype + ] + ); + } + + +} + +/** + * Transformer util for creating match definitions + * + * @param array $config The transformer config settings. + * @param \stdClass $question The question object. + * @param string $lang The language. + */ +function get_match_definition(array $config, \stdClass $question, string $lang) { + return array_merge( + get_def_base($config, $question, $lang), + [ + 'interactionType' => 'matching', + ] + ); +} + +/** + * Transformer util for creating numerical definitions + * + * @param array $config The transformer config settings. + * @param \stdClass $question The question object. + * @param string $lang The language. + */ +function get_numerical_definition(array $config, \stdClass $question, string $lang) { + return array_merge( + get_def_base($config, $question, $lang), + [ + 'interactionType' => 'numeric', + ] + ); +} + +/** + * Transformer util for creating shortanswer definitions + * + * @param array $config The transformer config settings. + * @param \stdClass $question The question object. + * @param string $lang The language. + */ +function get_shortanswer_definition(array $config, \stdClass $question, string $lang) { + return array_merge( + get_def_base($config, $question, $lang), + [ + 'interactionType' => 'fill-in', + ] + ); +} + +/** + * Transformer util for creating true/false definitions + * + * @param array $config The transformer config settings. + * @param \stdClass $question The question object. + * @param string $lang The language. + */ +function get_true_false_definition(array $config, \stdClass $question, string $lang) { + return array_merge( + get_def_base($config, $question, $lang), + [ + 'interactionType' => 'true-false', + ] + ); +} + +/** + * Generic handler for question definitions. + * + * @param array $config The transformer config settings. + * @param \stdClass $question The question. + * @param string $lang The language to use. + * @return array + */ +function get_definition(array $config, \stdClass $question, string $lang) { + switch ($question->qtype) { + case 'essay': + return get_essay_definition($config, $question, $lang); + case 'gapselect': + return get_multichoice_definition( + $config, $question, $lang, 'sequencing' + ); + case 'truefalse': + return get_true_false_definition($config, $question, $lang); + case 'randomsamatch': + case 'match': + return get_match_definition($config, $question, $lang); + case 'shortanswer': + return get_shortanswer_definition($config, $question, $lang); + case 'multichoice': + case 'multichoiceset': + return get_multichoice_definition( + $config, $question, $lang, 'choice' + ); + case 'numerical': + return get_numerical_definition($config, $question, $lang); + default: + return []; + } +} diff --git a/src/transformer/utils/get_activity/message.php b/src/transformer/utils/get_activity/message.php new file mode 100644 index 000000000..5c2640eee --- /dev/null +++ b/src/transformer/utils/get_activity/message.php @@ -0,0 +1,51 @@ +. + +/** + * Transformer utility for retrieving message activities. + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace src\transformer\utils\get_activity; + +use src\transformer\utils as utils; + +/** + * Transformer utility for retrieving message activities. + * + * @param array $config The transformer config settings. + * @param string $lang The language tag to use. + * @param \stdClass $message The message. + * @return array + */ +function message(array $config, string $lang, \stdClass $message) { + return [ + 'id' => $config['app_url'] . '/message?id=' . $message->id, + 'objectType' => 'Activity', + 'definition' => [ + 'type' => 'http://id.tincanapi.com/activitytype/chat-message', + 'name' => [ + $lang => $message->subject ?? '[Untitled Message]', + ], + 'description' => [ + $lang => $message->fullmessage, + ], + ] + ]; +} diff --git a/src/transformer/utils/get_enrolment_context.php b/src/transformer/utils/get_enrolment_context.php new file mode 100644 index 000000000..f5007003b --- /dev/null +++ b/src/transformer/utils/get_enrolment_context.php @@ -0,0 +1,70 @@ +. + +/** + * Transformer utility for retrieving enrolment context object. + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace src\transformer\utils; + +use src\transformer\utils as utils; + +/** + * Return a context object for a user enrolment. + * @param array $config The transformer config array. + * @param \stdClass $event The moodle event. + * @param \stdClass $course The moodle course. + * @param \stdClass $cuser The user attending the course. + * @param \stdClass $user The user triggering the event. + * @param string $lang The language to use. + * @return array + */ +function get_enrolment_context( + array $config, + \stdClass $event, + \stdClass $course, + \stdClass $cuser, + \stdClass $user, + string $lang +) { + $info = unserialize($event->other); + + $ctx = [ + 'language' => $lang, + 'extensions' => array_merge( + utils\extensions\base($config, $event, $course), + [ + 'https://xapi.edlm/profiles/edlm-lms/concepts/context-extensions/enrolment-type' => + $info['enrol'] + ] + ), + 'contextActivities' => [ + 'category' => [ + utils\get_activity\site($config), + ], + ], + ]; + + // add a possible instructor different from course user + if ($cuser->id !== $user->id) { + $ctx['instructor'] = utils\get_user($config, $user); + } + return $ctx; +} diff --git a/src/transformer/utils/get_multichoice_definition.php b/src/transformer/utils/get_multichoice_definition.php deleted file mode 100644 index 671f857bd..000000000 --- a/src/transformer/utils/get_multichoice_definition.php +++ /dev/null @@ -1,87 +0,0 @@ -. - -/** - * Transformer utility for retrieving the multichoice definition. - * - * @package logstore_xapi - * @copyright Jerret Fowler - * Ryan Smith - * David Pesce - * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */ - -namespace src\transformer\utils; -use src\transformer\utils as utils; - -/** - * Transformer for course module viewed event. - * - * @param array $config The transformer config settings. - * @param \stdClass $questionattempt The questionattempt object. - * @param \stdClass $question The question object. - * @param string $lang The language. - * @param string $interactiontype The type of interaction. - * @return array - */ -function get_multichoice_definition(array $config, \stdClass $questionattempt, -\stdClass $question, string $lang, string $interactiontype = 'choice') { - if ($config['send_response_choices']) { - $repo = $config['repo']; - $answers = $repo->read_records('question_answers', [ - 'question' => $questionattempt->questionid - ]); - $choices = array_map(function ($answer) use ($lang) { - return [ - "id" => "$answer->id", - "description" => [ - $lang => utils\get_string_html_removed($answer->answer) - ] - ]; - }, $answers); - - $correctresponsepattern; - switch ($interactiontype) { - case 'sequencing': - $selections = explode('} {', rtrim(ltrim($questionattempt->rightanswer, '{'), '}')); - $correctresponsepattern = implode ('[,]', $selections); - break; - default: - $selections = explode('; ', utils\get_string_html_removed($questionattempt->rightanswer)); - $correctresponsepattern = implode ('[,]', $selections); - break; - } - - return [ - 'type' => 'http://adlnet.gov/expapi/activities/cmi.interaction', - 'name' => [ - $lang => utils\get_string_html_removed($question->questiontext), - ], - 'interactionType' => $interactiontype, - 'correctResponsesPattern' => [$correctresponsepattern], - // Need to pull out id's that are appended during array_map so json parses it correctly as an array. - 'choices' => array_values($choices) - ]; - } - - return [ - 'type' => 'http://adlnet.gov/expapi/activities/cmi.interaction', - 'name' => [ - $lang => utils\get_string_html_removed($question->questiontext), - ], - 'interactionType' => $interactiontype - ]; -} diff --git a/src/transformer/utils/get_scaled_score.php b/src/transformer/utils/get_scaled_score.php index 4b279c2a5..835717f53 100644 --- a/src/transformer/utils/get_scaled_score.php +++ b/src/transformer/utils/get_scaled_score.php @@ -21,6 +21,7 @@ * @copyright Jerret Fowler * Ryan Smith * David Pesce + * Milt Reder * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ @@ -35,9 +36,5 @@ * @return int */ function get_scaled_score($rawscore, $minscore, $maxscore) { - if ($rawscore >= 0) { - return $rawscore / $maxscore; - } else { - return $rawscore / $minscore; - } + return (($rawscore - $minscore) / ($maxscore - $minscore) * 2) - 1; } diff --git a/tests/core/group_member_added/new_group_member_added/data.json b/tests/core/group_member_added/new_group_member_added/data.json new file mode 100644 index 000000000..a58cca882 --- /dev/null +++ b/tests/core/group_member_added/new_group_member_added/data.json @@ -0,0 +1,20 @@ +{ + "user": [ + { + "id": 1, + "firstname": "test_fullname1", + "email": "test1@test.com" + }, + { + "id": 2, + "firstname": "test_fullname2", + "email": "test2@test.com" + } + ], + "groups": [ + { + "id": 1, + "name": "test_name" + } + ] +} diff --git a/tests/core/group_member_added/new_group_member_added/event.json b/tests/core/group_member_added/new_group_member_added/event.json new file mode 100644 index 000000000..b0d97e497 --- /dev/null +++ b/tests/core/group_member_added/new_group_member_added/event.json @@ -0,0 +1,10 @@ +{ + "id": 1, + "objecttable": "groups", + "timecreated": 1433946701, + "objectid": 1, + "courseid": 1, + "eventname": "\\core\\event\\group_member_added", + "userid": 1, + "relateduserid": 2 +} diff --git a/tests/core/group_member_added/new_group_member_added/new_group_member_added_test.php b/tests/core/group_member_added/new_group_member_added/new_group_member_added_test.php new file mode 100644 index 000000000..3ab1a44fb --- /dev/null +++ b/tests/core/group_member_added/new_group_member_added/new_group_member_added_test.php @@ -0,0 +1,70 @@ +. + +namespace logstore_xapi\core\group_member_added\new_group_member_added_test; + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + +require_once($CFG->dirroot . '/admin/tool/log/store/xapi/tests/xapi_test_case.php'); + +/** + * Unit test for group member added event. + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class new_group_member_added_test extends \logstore_xapi\xapi_test_case { + + /** + * Retrieve the directory of the unit test. + * + * @return string + */ + protected function get_test_dir() { + return __DIR__; + } + + /** + * Retrieve the plugin type being tested. + * + * @return string + */ + protected function get_plugin_type() { + return "core"; + } + + /** + * Retrieve the plugin name being tested. + * + * @return string + */ + protected function get_plugin_name() { + return "course"; + } + + /** + * Appease auto-detecting of test cases. xapi_test_case has default test cases. + * + * @covers ::attempt_submitted + * @return void + */ + public function test_init() { + + } +} diff --git a/tests/core/group_member_added/new_group_member_added/statements.json b/tests/core/group_member_added/new_group_member_added/statements.json new file mode 100644 index 000000000..3ab0f906f --- /dev/null +++ b/tests/core/group_member_added/new_group_member_added/statements.json @@ -0,0 +1,68 @@ +[ + { + "actor": { + "account": { + "homePage": "http://www.example.org", + "name": "2" + }, + "name": "test_fullname2" + }, + "verb": { + "id": "http://activitystrea.ms/join", + "display": { + "en": "Joined" + } + }, + "object": { + "id": "http://www.example.org/group/index.php?id=1", + "objectType": "Activity", + "definition": { + "type": "https://xapi.edlm/profiles/edlm-lms/concepts/activity-types/group", + "name": { + "en": "test_name" + } + } + }, + "context": { + "instructor": { + "account": { + "homePage": "http://www.example.org", + "name": "1" + }, + "name": "test_fullname1" + }, + "contextActivities": { + "parent": [ + { + "id": "http://www.example.org/course/view.php?id=1", + "definition": { + "type": "https://w3id.org/xapi/cmi5/activitytype/course", + "name": { + "en": "test_name" + } + } + } + ], + "category": [ + { + "id": "http://www.example.org", + "definition": { + "type": "http://id.tincanapi.com/activitytype/lms", + "name": { + "en": "test_name" + } + } + } + ] + }, + "extensions": { + "http://lrs.learninglocker.net/define/extensions/info": { + "http://moodle.org": "1.0.0", + "https://github.com/xAPI-vle/moodle-logstore_xapi": "0.0.0-development", + "event_name": "\\core\\event\\group_member_added", + "event_function": "\\src\\transformer\\events\\core\\group_member_added" + } + } + } + } +] diff --git a/tests/core/group_member_removed/existing_group_member_removed/data.json b/tests/core/group_member_removed/existing_group_member_removed/data.json new file mode 100644 index 000000000..a58cca882 --- /dev/null +++ b/tests/core/group_member_removed/existing_group_member_removed/data.json @@ -0,0 +1,20 @@ +{ + "user": [ + { + "id": 1, + "firstname": "test_fullname1", + "email": "test1@test.com" + }, + { + "id": 2, + "firstname": "test_fullname2", + "email": "test2@test.com" + } + ], + "groups": [ + { + "id": 1, + "name": "test_name" + } + ] +} diff --git a/tests/core/group_member_removed/existing_group_member_removed/event.json b/tests/core/group_member_removed/existing_group_member_removed/event.json new file mode 100644 index 000000000..4ac35312c --- /dev/null +++ b/tests/core/group_member_removed/existing_group_member_removed/event.json @@ -0,0 +1,10 @@ +{ + "id": 1, + "objecttable": "groups", + "timecreated": 1433946701, + "objectid": 1, + "courseid": 1, + "eventname": "\\core\\event\\group_member_removed", + "userid": 1, + "relateduserid": 2 +} diff --git a/tests/core/group_member_removed/existing_group_member_removed/existing_group_member_removed_test.php b/tests/core/group_member_removed/existing_group_member_removed/existing_group_member_removed_test.php new file mode 100644 index 000000000..942464ab3 --- /dev/null +++ b/tests/core/group_member_removed/existing_group_member_removed/existing_group_member_removed_test.php @@ -0,0 +1,70 @@ +. + +namespace logstore_xapi\core\group_member_removed\existing_group_member_removed_test; + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + +require_once($CFG->dirroot . '/admin/tool/log/store/xapi/tests/xapi_test_case.php'); + +/** + * Unit test for group member removed event. + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class existing_group_member_removed_test extends \logstore_xapi\xapi_test_case { + + /** + * Retrieve the directory of the unit test. + * + * @return string + */ + protected function get_test_dir() { + return __DIR__; + } + + /** + * Retrieve the plugin type being tested. + * + * @return string + */ + protected function get_plugin_type() { + return "core"; + } + + /** + * Retrieve the plugin name being tested. + * + * @return string + */ + protected function get_plugin_name() { + return "course"; + } + + /** + * Appease auto-detecting of test cases. xapi_test_case has default test cases. + * + * @covers ::attempt_submitted + * @return void + */ + public function test_init() { + + } +} diff --git a/tests/core/group_member_removed/existing_group_member_removed/statements.json b/tests/core/group_member_removed/existing_group_member_removed/statements.json new file mode 100644 index 000000000..ae714fdcc --- /dev/null +++ b/tests/core/group_member_removed/existing_group_member_removed/statements.json @@ -0,0 +1,68 @@ +[ + { + "actor": { + "account": { + "homePage": "http://www.example.org", + "name": "2" + }, + "name": "test_fullname2" + }, + "verb": { + "id": "http://activitystrea.ms/leave", + "display": { + "en": "Left" + } + }, + "object": { + "id": "http://www.example.org/group/index.php?id=1", + "objectType": "Activity", + "definition": { + "type": "https://xapi.edlm/profiles/edlm-lms/concepts/activity-types/group", + "name": { + "en": "test_name" + } + } + }, + "context": { + "instructor": { + "account": { + "homePage": "http://www.example.org", + "name": "1" + }, + "name": "test_fullname1" + }, + "contextActivities": { + "parent": [ + { + "id": "http://www.example.org/course/view.php?id=1", + "definition": { + "type": "https://w3id.org/xapi/cmi5/activitytype/course", + "name": { + "en": "test_name" + } + } + } + ], + "category": [ + { + "id": "http://www.example.org", + "definition": { + "type": "http://id.tincanapi.com/activitytype/lms", + "name": { + "en": "test_name" + } + } + } + ] + }, + "extensions": { + "http://lrs.learninglocker.net/define/extensions/info": { + "http://moodle.org": "1.0.0", + "https://github.com/xAPI-vle/moodle-logstore_xapi": "0.0.0-development", + "event_name": "\\core\\event\\group_member_removed", + "event_function": "\\src\\transformer\\events\\core\\group_member_removed" + } + } + } + } +] diff --git a/tests/core/group_message_sent/new_group_message_sent/data.json b/tests/core/group_message_sent/new_group_message_sent/data.json new file mode 100644 index 000000000..7c8d49e43 --- /dev/null +++ b/tests/core/group_message_sent/new_group_message_sent/data.json @@ -0,0 +1,23 @@ +{ + "groups": [ + { + "id": 1, + "name": "test_name", + "courseid": 1 + } + ], + "messages": [ + { + "id": 1, + "subject": "test_message_subject", + "fullmessage": "test_message_body", + "conversationid": 1 + } + ], + "message_conversations": [ + { + "id": 1, + "itemid": 1 + } + ] +} diff --git a/tests/core/group_message_sent/new_group_message_sent/event.json b/tests/core/group_message_sent/new_group_message_sent/event.json new file mode 100644 index 000000000..d73534937 --- /dev/null +++ b/tests/core/group_message_sent/new_group_message_sent/event.json @@ -0,0 +1,9 @@ +{ + "courseid": 1, + "eventname": "\\core\\event\\group_message_sent", + "id": 1, + "objectid": 1, + "objecttable": "messages", + "timecreated": 1433946701, + "userid": 1 +} diff --git a/tests/core/group_message_sent/new_group_message_sent/new_group_message_sent_test.php b/tests/core/group_message_sent/new_group_message_sent/new_group_message_sent_test.php new file mode 100644 index 000000000..8f9f0ed46 --- /dev/null +++ b/tests/core/group_message_sent/new_group_message_sent/new_group_message_sent_test.php @@ -0,0 +1,70 @@ +. + +namespace logstore_xapi\core\group_message_sent\new_group_message_sent; + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + +require_once($CFG->dirroot . '/admin/tool/log/store/xapi/tests/xapi_test_case.php'); + +/** + * Unit test for group_message_sent event. + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class new_group_message_sent_test extends \logstore_xapi\xapi_test_case { + + /** + * Retrieve the directory of the unit test. + * + * @return string + */ + protected function get_test_dir() { + return __DIR__; + } + + /** + * Retrieve the plugin type being tested. + * + * @return string + */ + protected function get_plugin_type() { + return "core"; + } + + /** + * Retrieve the plugin name being tested. + * + * @return string + */ + protected function get_plugin_name() { + return "course"; + } + + /** + * Appease auto-detecting of test cases. xapi_test_case has default test cases. + * + * @covers ::attempt_submitted + * @return void + */ + public function test_init() { + + } +} diff --git a/tests/core/group_message_sent/new_group_message_sent/statements.json b/tests/core/group_message_sent/new_group_message_sent/statements.json new file mode 100644 index 000000000..b913c4494 --- /dev/null +++ b/tests/core/group_message_sent/new_group_message_sent/statements.json @@ -0,0 +1,76 @@ +[ + { + "actor": { + "account": { + "homePage": "http://www.example.org", + "name": "1" + }, + "name": "test_fullname" + }, + "verb": { + "display": { + "en": "Sent" + }, + "id": "http://activitystrea.ms/send" + }, + "object": { + "id": "http://www.example.org/message?id=1", + "objectType": "Activity", + "definition": { + "name": { + "en": "test_message_subject" + }, + "description": { + "en": "test_message_body" + }, + "type": "http://id.tincanapi.com/activitytype/chat-message" + } + }, + "context": { + "contextActivities": { + "grouping": [ + { + "id": "http://www.example.org/group/index.php?id=1", + "objectType": "Activity", + "definition": { + "type": "https://xapi.edlm/profiles/edlm-lms/concepts/activity-types/group", + "name": { + "en": "test_name" + } + } + } + ], + "parent": [ + { + "id": "http://www.example.org/course/view.php?id=1", + "definition": { + "type": "https://w3id.org/xapi/cmi5/activitytype/course", + "name": { + "en": "test_name" + } + } + } + ], + "category": [ + { + "id": "http://www.example.org", + "definition": { + "type": "http://id.tincanapi.com/activitytype/lms", + "name": { + "en": "test_name" + } + } + } + ] + }, + "extensions": { + "http://lrs.learninglocker.net/define/extensions/info": { + "event_function": "\\src\\transformer\\events\\core\\group_message_sent", + "event_name": "\\core\\event\\group_message_sent", + "http://moodle.org": "1.0.0", + "https://github.com/xAPI-vle/moodle-logstore_xapi": "0.0.0-development" + } + } + } + } +] diff --git a/tests/core/question_created/new_question_created/data.json b/tests/core/question_created/new_question_created/data.json new file mode 100644 index 000000000..170132afa --- /dev/null +++ b/tests/core/question_created/new_question_created/data.json @@ -0,0 +1,10 @@ +{ + "question": [ + { + "id": 1, + "qtype": "truefalse", + "name": "True or False?", + "questiontext": "

Is the sky blue?

" + } + ] +} diff --git a/tests/core/question_created/new_question_created/event.json b/tests/core/question_created/new_question_created/event.json new file mode 100644 index 000000000..e16203a9e --- /dev/null +++ b/tests/core/question_created/new_question_created/event.json @@ -0,0 +1,9 @@ +{ + "courseid": 1, + "eventname": "\\core\\event\\question_created", + "id": 1, + "objectid": 1, + "objecttable": "question", + "timecreated": 1433946701, + "userid": 1 +} diff --git a/tests/core/question_created/new_question_created/new_question_created_test.php b/tests/core/question_created/new_question_created/new_question_created_test.php new file mode 100644 index 000000000..4bd39c2f5 --- /dev/null +++ b/tests/core/question_created/new_question_created/new_question_created_test.php @@ -0,0 +1,70 @@ +. + +namespace logstore_xapi\core\question_created\new_question_created_test; + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + +require_once($CFG->dirroot . '/admin/tool/log/store/xapi/tests/xapi_test_case.php'); + +/** + * Unit test for question_created event + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class new_question_created_test extends \logstore_xapi\xapi_test_case { + + /** + * Retrieve the directory of the unit test. + * + * @return string + */ + protected function get_test_dir() { + return __DIR__; + } + + /** + * Retrieve the plugin type being tested. + * + * @return string + */ + protected function get_plugin_type() { + return "core"; + } + + /** + * Retrieve the plugin name being tested. + * + * @return string + */ + protected function get_plugin_name() { + return "core"; + } + + /** + * Appease auto-detecting of test cases. xapi_test_case has default test cases. + * + * @covers ::attempt_submitted + * @return void + */ + public function test_init() { + + } +} diff --git a/tests/core/question_created/new_question_created/statements.json b/tests/core/question_created/new_question_created/statements.json new file mode 100644 index 000000000..8f57a393a --- /dev/null +++ b/tests/core/question_created/new_question_created/statements.json @@ -0,0 +1,67 @@ +[ + { + "actor": { + "name": "test_fullname", + "account": { + "homePage": "http://www.example.org", + "name": "1" + } + }, + "verb": { + "display": { + "en": "Created" + }, + "id": "http://activitystrea.ms/create" + }, + "object": { + "id": "http://www.example.org/question?id=1", + "definition": { + "name": { + "en": "True or False?" + }, + "description": { + "en": "Is the sky blue?" + }, + "type": "http://adlnet.gov/expapi/activities/cmi.interaction", + "interactionType": "true-false", + "extensions": { + "https://xapi.edlm/profiles/edlm-lms/concepts/activity-extensions/moodle-question-type": "truefalse" + } + } + }, + "context": { + "contextActivities": { + "parent": [ + { + "id": "http://www.example.org/course/view.php?id=1", + "definition": { + "type": "https://w3id.org/xapi/cmi5/activitytype/course", + "name": { + "en": "test_name" + } + } + } + ], + "category": [ + { + "id": "http://www.example.org", + "definition": { + "type": "http://id.tincanapi.com/activitytype/lms", + "name": { + "en": "test_name" + } + } + } + ] + }, + "extensions": { + "http://lrs.learninglocker.net/define/extensions/info": { + "event_function": "\\src\\transformer\\events\\core\\question_created", + "event_name": "\\core\\event\\question_created", + "http://moodle.org": "1.0.0", + "https://github.com/xAPI-vle/moodle-logstore_xapi": "0.0.0-development" + } + } + } + } +] diff --git a/tests/core/search_results_viewed/user_viewed_search_results/data.json b/tests/core/search_results_viewed/user_viewed_search_results/data.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/tests/core/search_results_viewed/user_viewed_search_results/data.json @@ -0,0 +1 @@ +{} diff --git a/tests/core/search_results_viewed/user_viewed_search_results/event.json b/tests/core/search_results_viewed/user_viewed_search_results/event.json new file mode 100644 index 000000000..7c5cf6e1c --- /dev/null +++ b/tests/core/search_results_viewed/user_viewed_search_results/event.json @@ -0,0 +1,10 @@ +{ + "courseid": null, + "eventname": "\\core\\event\\search_results_viewed", + "id": 1, + "objectid": null, + "objecttable": null, + "timecreated": 1433946701, + "userid": 1, + "other": "a:7:{s:1:\"q\";s:5:\"query\";s:4:\"page\";i:0;s:5:\"title\";s:0:\"\";s:7:\"areaids\";a:0:{}s:9:\"courseids\";a:0:{}s:9:\"timestart\";i:0;s:7:\"timeend\";i:0;}" +} diff --git a/tests/core/search_results_viewed/user_viewed_search_results/statements.json b/tests/core/search_results_viewed/user_viewed_search_results/statements.json new file mode 100644 index 000000000..12158fb26 --- /dev/null +++ b/tests/core/search_results_viewed/user_viewed_search_results/statements.json @@ -0,0 +1,53 @@ +[ + { + "actor": { + "account": { + "homePage": "http://www.example.org", + "name": "1" + }, + "name": "test_fullname" + }, + "verb": { + "id": "https://w3id.org/xapi/acrossx/verbs/searched", + "display": { + "en": "Searched" + } + }, + "object": { + "id": "http://www.example.org/search/index.php", + "objectType": "Activity", + "definition": { + "type": "https://w3id.org/xapi/acrossx/activities/webpage", + "name": { + "en": "Global Search" + } + } + }, + "result": { + "response": "query" + }, + "context": { + "contextActivities": { + "category": [ + { + "id": "http://www.example.org", + "definition": { + "type": "http://id.tincanapi.com/activitytype/lms", + "name": { + "en": "test_name" + } + } + } + ] + }, + "extensions": { + "http://lrs.learninglocker.net/define/extensions/info": { + "event_function": "\\src\\transformer\\events\\core\\search_results_viewed", + "event_name": "\\core\\event\\search_results_viewed", + "http://moodle.org": "1.0.0", + "https://github.com/xAPI-vle/moodle-logstore_xapi": "0.0.0-development" + } + } + } + } +] diff --git a/tests/core/search_results_viewed/user_viewed_search_results/user_viewed_search_results_test.php b/tests/core/search_results_viewed/user_viewed_search_results/user_viewed_search_results_test.php new file mode 100644 index 000000000..065a16272 --- /dev/null +++ b/tests/core/search_results_viewed/user_viewed_search_results/user_viewed_search_results_test.php @@ -0,0 +1,70 @@ +. + +namespace logstore_xapi\core\search_results_viewed\user_viewed_search_results; + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + +require_once($CFG->dirroot . '/admin/tool/log/store/xapi/tests/xapi_test_case.php'); + +/** + * Unit test for search_results_viewed event + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class user_viewed_search_results_test extends \logstore_xapi\xapi_test_case { + + /** + * Retrieve the directory of the unit test. + * + * @return string + */ + protected function get_test_dir() { + return __DIR__; + } + + /** + * Retrieve the plugin type being tested. + * + * @return string + */ + protected function get_plugin_type() { + return "core"; + } + + /** + * Retrieve the plugin name being tested. + * + * @return string + */ + protected function get_plugin_name() { + return "core"; + } + + /** + * Appease auto-detecting of test cases. xapi_test_case has default test cases. + * + * @covers ::attempt_submitted + * @return void + */ + public function test_init() { + + } +} diff --git a/tests/core/user_enrolment_created/existing_user_enrolled/data.json b/tests/core/user_enrolment_created/existing_user_enrolled/data.json index 614658e31..65f4262d0 100644 --- a/tests/core/user_enrolment_created/existing_user_enrolled/data.json +++ b/tests/core/user_enrolment_created/existing_user_enrolled/data.json @@ -2,15 +2,13 @@ "user": [ { "id": 1, - "firstname": "test_fullname", + "firstname": "test_fullname1", "email": "test@test.com" - } - ], - "course": [ + }, { - "id": 1, - "fullname": "test_name", - "lang": "en" + "id": 2, + "firstname": "test_fullname2", + "email": "test@test.com" } ] } diff --git a/tests/core/user_enrolment_created/existing_user_enrolled/event.json b/tests/core/user_enrolment_created/existing_user_enrolled/event.json index 4a93d9e9d..f0e9e8ea4 100644 --- a/tests/core/user_enrolment_created/existing_user_enrolled/event.json +++ b/tests/core/user_enrolment_created/existing_user_enrolled/event.json @@ -1,9 +1,11 @@ { "id": 1, - "relateduserid": 1, + "userid": 1, + "relateduserid": 2, "courseid": 1, "timecreated": 1433946701, - "objecttable": "user", + "objecttable": "user_enrolments", "objectid": 1, - "eventname": "\\core\\event\\user_enrolment_created" + "eventname": "\\core\\event\\user_enrolment_created", + "other": "a:1:{s:5:\"enrol\";s:6:\"manual\";}" } diff --git a/tests/core/user_enrolment_created/existing_user_enrolled/statements.json b/tests/core/user_enrolment_created/existing_user_enrolled/statements.json index ebe395e5c..0485311b3 100644 --- a/tests/core/user_enrolment_created/existing_user_enrolled/statements.json +++ b/tests/core/user_enrolment_created/existing_user_enrolled/statements.json @@ -1,16 +1,16 @@ [ { "actor": { - "name": "test_fullname", + "name": "test_fullname2", "account": { "homePage": "http://www.example.org", - "name": "1" + "name": "2" } }, "verb": { - "id": "http://adlnet.gov/expapi/verbs/registered", + "id": "https://xapi.edlm/profiles/edlm-lms/concepts/verbs/enrolled", "display": { - "en": "enrolled to" + "en": "Enrolled" } }, "object": { @@ -23,8 +23,16 @@ } }, "context": { + "instructor": { + "name": "test_fullname1", + "account": { + "homePage": "http://www.example.org", + "name": "1" + } + }, "language": "en", "extensions": { + "https://xapi.edlm/profiles/edlm-lms/concepts/context-extensions/enrolment-type": "manual", "http://lrs.learninglocker.net/define/extensions/info": { "http://moodle.org": "1.0.0", "https://github.com/xAPI-vle/moodle-logstore_xapi": "0.0.0-development", @@ -33,7 +41,7 @@ } }, "contextActivities": { - "grouping": [ + "category": [ { "id": "http://www.example.org", "definition": { @@ -43,17 +51,6 @@ } } } - ], - "category": [ - { - "id": "http://moodle.org", - "definition": { - "type": "http://id.tincanapi.com/activitytype/source", - "name": { - "en": "Moodle" - } - } - } ] } } diff --git a/tests/core/user_enrolment_deleted/existing_user_enrolment_deleted/data.json b/tests/core/user_enrolment_deleted/existing_user_enrolment_deleted/data.json new file mode 100644 index 000000000..65f4262d0 --- /dev/null +++ b/tests/core/user_enrolment_deleted/existing_user_enrolment_deleted/data.json @@ -0,0 +1,14 @@ +{ + "user": [ + { + "id": 1, + "firstname": "test_fullname1", + "email": "test@test.com" + }, + { + "id": 2, + "firstname": "test_fullname2", + "email": "test@test.com" + } + ] +} diff --git a/tests/core/user_enrolment_deleted/existing_user_enrolment_deleted/event.json b/tests/core/user_enrolment_deleted/existing_user_enrolment_deleted/event.json new file mode 100644 index 000000000..6b4d92275 --- /dev/null +++ b/tests/core/user_enrolment_deleted/existing_user_enrolment_deleted/event.json @@ -0,0 +1,11 @@ +{ + "courseid": 1, + "eventname": "\\core\\event\\user_enrolment_deleted", + "id": 1, + "objectid": 1, + "objecttable": "user_enrolments", + "timecreated": 1433946701, + "userid": 1, + "relateduserid": 2, + "other": "a:1:{s:5:\"enrol\";s:6:\"manual\";}" +} diff --git a/tests/core/user_enrolment_deleted/existing_user_enrolment_deleted/existing_user_enrolment_deleted_test.php b/tests/core/user_enrolment_deleted/existing_user_enrolment_deleted/existing_user_enrolment_deleted_test.php new file mode 100644 index 000000000..b00b9c7b8 --- /dev/null +++ b/tests/core/user_enrolment_deleted/existing_user_enrolment_deleted/existing_user_enrolment_deleted_test.php @@ -0,0 +1,70 @@ +. + +namespace logstore_xapi\core\user_enrolment_deleted\existing_user_enrolment_deleted; + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + +require_once($CFG->dirroot . '/admin/tool/log/store/xapi/tests/xapi_test_case.php'); + +/** + * Unit test for user_enrolment_deleted event + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class existing_user_enrolment_deleted_test extends \logstore_xapi\xapi_test_case { + + /** + * Retrieve the directory of the unit test. + * + * @return string + */ + protected function get_test_dir() { + return __DIR__; + } + + /** + * Retrieve the plugin type being tested. + * + * @return string + */ + protected function get_plugin_type() { + return "core"; + } + + /** + * Retrieve the plugin name being tested. + * + * @return string + */ + protected function get_plugin_name() { + return "core"; + } + + /** + * Appease auto-detecting of test cases. xapi_test_case has default test cases. + * + * @covers ::attempt_submitted + * @return void + */ + public function test_init() { + + } +} diff --git a/tests/core/user_enrolment_deleted/existing_user_enrolment_deleted/statements.json b/tests/core/user_enrolment_deleted/existing_user_enrolment_deleted/statements.json new file mode 100644 index 000000000..e35c6f5d8 --- /dev/null +++ b/tests/core/user_enrolment_deleted/existing_user_enrolment_deleted/statements.json @@ -0,0 +1,58 @@ +[ + { + "actor": { + "name": "test_fullname2", + "account": { + "homePage": "http://www.example.org", + "name": "2" + } + }, + "verb": { + "id": "http://activitystrea.ms/leave", + "display": { + "en": "Left" + } + }, + "object": { + "id": "http://www.example.org/course/view.php?id=1", + "definition": { + "type": "https://w3id.org/xapi/cmi5/activitytype/course", + "name": { + "en": "test_name" + } + } + }, + "context": { + "instructor": { + "name": "test_fullname1", + "account": { + "homePage": "http://www.example.org", + "name": "1" + } + }, + "language": "en", + "extensions": { + "https://xapi.edlm/profiles/edlm-lms/concepts/context-extensions/enrolment-type": "manual", + "http://lrs.learninglocker.net/define/extensions/info": { + "http://moodle.org": "1.0.0", + "https://github.com/xAPI-vle/moodle-logstore_xapi": "0.0.0-development", + "event_name": "\\core\\event\\user_enrolment_deleted", + "event_function": "\\src\\transformer\\events\\core\\user_enrolment_deleted" + } + }, + "contextActivities": { + "category": [ + { + "id": "http://www.example.org", + "definition": { + "type": "http://id.tincanapi.com/activitytype/lms", + "name": { + "en": "test_name" + } + } + } + ] + } + } + } +] diff --git a/tests/core/user_enrolment_updated/user_resumed_course/data.json b/tests/core/user_enrolment_updated/user_resumed_course/data.json new file mode 100644 index 000000000..487c142dc --- /dev/null +++ b/tests/core/user_enrolment_updated/user_resumed_course/data.json @@ -0,0 +1,20 @@ +{ + "user": [ + { + "id": 1, + "firstname": "test_fullname1", + "email": "test@test.com" + }, + { + "id": 2, + "firstname": "test_fullname2", + "email": "test@test.com" + } + ], + "user_enrolments": [ + { + "id": 1, + "status": 0 + } + ] +} diff --git a/tests/core/user_enrolment_updated/user_resumed_course/event.json b/tests/core/user_enrolment_updated/user_resumed_course/event.json new file mode 100644 index 000000000..710673801 --- /dev/null +++ b/tests/core/user_enrolment_updated/user_resumed_course/event.json @@ -0,0 +1,11 @@ +{ + "id": 1, + "userid": 1, + "relateduserid": 2, + "courseid": 1, + "timecreated": 1433946701, + "objecttable": "user_enrolments", + "objectid": 1, + "eventname": "\\core\\event\\user_enrolment_updated", + "other": "a:1:{s:5:\"enrol\";s:6:\"manual\";}" +} diff --git a/tests/core/user_enrolment_updated/user_resumed_course/statements.json b/tests/core/user_enrolment_updated/user_resumed_course/statements.json new file mode 100644 index 000000000..cd49f34ed --- /dev/null +++ b/tests/core/user_enrolment_updated/user_resumed_course/statements.json @@ -0,0 +1,58 @@ +[ + { + "actor": { + "name": "test_fullname2", + "account": { + "homePage": "http://www.example.org", + "name": "2" + } + }, + "verb": { + "id": "https://w3id.org/xapi/tla/verbs/resumed", + "display": { + "en": "Resumed" + } + }, + "object": { + "id": "http://www.example.org/course/view.php?id=1", + "definition": { + "type": "https://w3id.org/xapi/cmi5/activitytype/course", + "name": { + "en": "test_name" + } + } + }, + "context": { + "instructor": { + "name": "test_fullname1", + "account": { + "homePage": "http://www.example.org", + "name": "1" + } + }, + "language": "en", + "extensions": { + "https://xapi.edlm/profiles/edlm-lms/concepts/context-extensions/enrolment-type": "manual", + "http://lrs.learninglocker.net/define/extensions/info": { + "http://moodle.org": "1.0.0", + "https://github.com/xAPI-vle/moodle-logstore_xapi": "0.0.0-development", + "event_name": "\\core\\event\\user_enrolment_updated", + "event_function": "\\src\\transformer\\events\\core\\user_enrolment_updated" + } + }, + "contextActivities": { + "category": [ + { + "id": "http://www.example.org", + "definition": { + "type": "http://id.tincanapi.com/activitytype/lms", + "name": { + "en": "test_name" + } + } + } + ] + } + } + } +] diff --git a/tests/core/user_enrolment_updated/user_resumed_course/user_resumed_course_test.php b/tests/core/user_enrolment_updated/user_resumed_course/user_resumed_course_test.php new file mode 100644 index 000000000..7a59bac50 --- /dev/null +++ b/tests/core/user_enrolment_updated/user_resumed_course/user_resumed_course_test.php @@ -0,0 +1,70 @@ +. + +namespace logstore_xapi\core\user_enrolment_updated\user_resumed_course; + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + +require_once($CFG->dirroot . '/admin/tool/log/store/xapi/tests/xapi_test_case.php'); + +/** + * Unit test for user enrolment updated event. + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class user_resumed_course_test extends \logstore_xapi\xapi_test_case { + + /** + * Retrieve the directory of the unit test. + * + * @return string + */ + protected function get_test_dir() { + return __DIR__; + } + + /** + * Retrieve the plugin type being tested. + * + * @return string + */ + protected function get_plugin_type() { + return "core"; + } + + /** + * Retrieve the plugin name being tested. + * + * @return string + */ + protected function get_plugin_name() { + return "user"; + } + + /** + * Appease auto-detecting of test cases. xapi_test_case has default test cases. + * + * @covers ::user_enrolment_created + * @return void + */ + public function test_init() { + + } +} diff --git a/tests/core/user_enrolment_updated/user_suspended_course/data.json b/tests/core/user_enrolment_updated/user_suspended_course/data.json new file mode 100644 index 000000000..aa1811f1f --- /dev/null +++ b/tests/core/user_enrolment_updated/user_suspended_course/data.json @@ -0,0 +1,20 @@ +{ + "user": [ + { + "id": 1, + "firstname": "test_fullname1", + "email": "test@test.com" + }, + { + "id": 2, + "firstname": "test_fullname2", + "email": "test@test.com" + } + ], + "user_enrolments": [ + { + "id": 1, + "status": 1 + } + ] +} diff --git a/tests/core/user_enrolment_updated/user_suspended_course/event.json b/tests/core/user_enrolment_updated/user_suspended_course/event.json new file mode 100644 index 000000000..710673801 --- /dev/null +++ b/tests/core/user_enrolment_updated/user_suspended_course/event.json @@ -0,0 +1,11 @@ +{ + "id": 1, + "userid": 1, + "relateduserid": 2, + "courseid": 1, + "timecreated": 1433946701, + "objecttable": "user_enrolments", + "objectid": 1, + "eventname": "\\core\\event\\user_enrolment_updated", + "other": "a:1:{s:5:\"enrol\";s:6:\"manual\";}" +} diff --git a/tests/core/user_enrolment_updated/user_suspended_course/statements.json b/tests/core/user_enrolment_updated/user_suspended_course/statements.json new file mode 100644 index 000000000..8fb039379 --- /dev/null +++ b/tests/core/user_enrolment_updated/user_suspended_course/statements.json @@ -0,0 +1,58 @@ +[ + { + "actor": { + "name": "test_fullname2", + "account": { + "homePage": "http://www.example.org", + "name": "2" + } + }, + "verb": { + "id": "https://w3id.org/xapi/tla/verbs/suspended", + "display": { + "en": "Suspended" + } + }, + "object": { + "id": "http://www.example.org/course/view.php?id=1", + "definition": { + "type": "https://w3id.org/xapi/cmi5/activitytype/course", + "name": { + "en": "test_name" + } + } + }, + "context": { + "instructor": { + "name": "test_fullname1", + "account": { + "homePage": "http://www.example.org", + "name": "1" + } + }, + "language": "en", + "extensions": { + "https://xapi.edlm/profiles/edlm-lms/concepts/context-extensions/enrolment-type": "manual", + "http://lrs.learninglocker.net/define/extensions/info": { + "http://moodle.org": "1.0.0", + "https://github.com/xAPI-vle/moodle-logstore_xapi": "0.0.0-development", + "event_name": "\\core\\event\\user_enrolment_updated", + "event_function": "\\src\\transformer\\events\\core\\user_enrolment_updated" + } + }, + "contextActivities": { + "category": [ + { + "id": "http://www.example.org", + "definition": { + "type": "http://id.tincanapi.com/activitytype/lms", + "name": { + "en": "test_name" + } + } + } + ] + } + } + } +] diff --git a/tests/core/user_enrolment_updated/user_suspended_course/user_suspended_course_test.php b/tests/core/user_enrolment_updated/user_suspended_course/user_suspended_course_test.php new file mode 100644 index 000000000..8f9c2ed8f --- /dev/null +++ b/tests/core/user_enrolment_updated/user_suspended_course/user_suspended_course_test.php @@ -0,0 +1,70 @@ +. + +namespace logstore_xapi\core\user_enrolment_updated\user_suspended_course; + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + +require_once($CFG->dirroot . '/admin/tool/log/store/xapi/tests/xapi_test_case.php'); + +/** + * Unit test for user enrolment updated event. + * + * @package logstore_xapi + * @copyright Milt Reder + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class user_suspended_course_test extends \logstore_xapi\xapi_test_case { + + /** + * Retrieve the directory of the unit test. + * + * @return string + */ + protected function get_test_dir() { + return __DIR__; + } + + /** + * Retrieve the plugin type being tested. + * + * @return string + */ + protected function get_plugin_type() { + return "core"; + } + + /** + * Retrieve the plugin name being tested. + * + * @return string + */ + protected function get_plugin_name() { + return "user"; + } + + /** + * Appease auto-detecting of test cases. xapi_test_case has default test cases. + * + * @covers ::user_enrolment_created + * @return void + */ + public function test_init() { + + } +} diff --git a/tests/mod_quiz/attempt_submitted/essay/data.json b/tests/mod_quiz/attempt_submitted/essay/data.json index e11b39952..2ace8c900 100644 --- a/tests/mod_quiz/attempt_submitted/essay/data.json +++ b/tests/mod_quiz/attempt_submitted/essay/data.json @@ -49,6 +49,7 @@ { "id": 1, "qtype": "essay", + "name": "test_name", "questiontext": "test_question" } ], diff --git a/tests/mod_quiz/attempt_submitted/essay/statements.json b/tests/mod_quiz/attempt_submitted/essay/statements.json index 6ea2648ca..210a0dc06 100644 --- a/tests/mod_quiz/attempt_submitted/essay/statements.json +++ b/tests/mod_quiz/attempt_submitted/essay/statements.json @@ -27,7 +27,7 @@ "raw": 50, "min": 0, "max": 100, - "scaled": 0.5 + "scaled": 0.0 }, "completion": true, "success": true, @@ -109,6 +109,9 @@ "definition": { "type": "http://adlnet.gov/expapi/activities/cmi.interaction", "name": { + "en": "test_name" + }, + "description": { "en": "test_question" }, "interactionType": "long-fill-in" diff --git a/tests/mod_quiz/attempt_submitted/essay_null_response/data.json b/tests/mod_quiz/attempt_submitted/essay_null_response/data.json index 9901dd72c..73ea53c4f 100644 --- a/tests/mod_quiz/attempt_submitted/essay_null_response/data.json +++ b/tests/mod_quiz/attempt_submitted/essay_null_response/data.json @@ -49,6 +49,7 @@ { "id": 1, "qtype": "essay", + "name": "test_name", "questiontext": "test_question" } ], diff --git a/tests/mod_quiz/attempt_submitted/essay_null_response/statements.json b/tests/mod_quiz/attempt_submitted/essay_null_response/statements.json index cfc37195f..9c7fd0a1e 100644 --- a/tests/mod_quiz/attempt_submitted/essay_null_response/statements.json +++ b/tests/mod_quiz/attempt_submitted/essay_null_response/statements.json @@ -27,7 +27,7 @@ "raw": 50, "min": 0, "max": 100, - "scaled": 0.5 + "scaled": 0.0 }, "completion": true, "success": true, @@ -109,6 +109,9 @@ "definition": { "type": "http://adlnet.gov/expapi/activities/cmi.interaction", "name": { + "en": "test_name" + }, + "description": { "en": "test_question" }, "interactionType": "long-fill-in" diff --git a/tests/mod_quiz/attempt_submitted/gapselect/data.json b/tests/mod_quiz/attempt_submitted/gapselect/data.json index 2214fbb76..24ce66d32 100644 --- a/tests/mod_quiz/attempt_submitted/gapselect/data.json +++ b/tests/mod_quiz/attempt_submitted/gapselect/data.json @@ -50,6 +50,7 @@ { "id": 1, "qtype": "gapselect", + "name": "test_name", "questiontext": "

Example [[1]] missing [[2]] words [[3]]

" } ], diff --git a/tests/mod_quiz/attempt_submitted/gapselect/statements.json b/tests/mod_quiz/attempt_submitted/gapselect/statements.json index 39191467a..dc799cc41 100644 --- a/tests/mod_quiz/attempt_submitted/gapselect/statements.json +++ b/tests/mod_quiz/attempt_submitted/gapselect/statements.json @@ -27,7 +27,7 @@ "raw": 50, "min": 0, "max": 100, - "scaled": 0.5 + "scaled": 0.0 }, "completion": true, "success": true, @@ -109,6 +109,9 @@ "definition": { "type": "http://adlnet.gov/expapi/activities/cmi.interaction", "name": { + "en": "test_name" + }, + "description": { "en": "Example [[1]] missing [[2]] words [[3]]" }, "interactionType": "sequencing" diff --git a/tests/mod_quiz/attempt_submitted/match/data.json b/tests/mod_quiz/attempt_submitted/match/data.json index 158229b72..e75a6ce16 100644 --- a/tests/mod_quiz/attempt_submitted/match/data.json +++ b/tests/mod_quiz/attempt_submitted/match/data.json @@ -50,6 +50,7 @@ { "id": 1, "qtype": "match", + "name": "test_name", "questiontext": "test_question" } ], diff --git a/tests/mod_quiz/attempt_submitted/match/statements.json b/tests/mod_quiz/attempt_submitted/match/statements.json index da00b4e5d..29044727e 100644 --- a/tests/mod_quiz/attempt_submitted/match/statements.json +++ b/tests/mod_quiz/attempt_submitted/match/statements.json @@ -27,7 +27,7 @@ "raw": 50, "min": 0, "max": 100, - "scaled": 0.5 + "scaled": 0.0 }, "completion": true, "success": true, @@ -109,6 +109,9 @@ "definition": { "type": "http://adlnet.gov/expapi/activities/cmi.interaction", "name": { + "en": "test_name" + }, + "description": { "en": "test_question" }, "interactionType": "matching" diff --git a/tests/mod_quiz/attempt_submitted/multichoice/data.json b/tests/mod_quiz/attempt_submitted/multichoice/data.json index 2095ee4b7..26f52b325 100644 --- a/tests/mod_quiz/attempt_submitted/multichoice/data.json +++ b/tests/mod_quiz/attempt_submitted/multichoice/data.json @@ -50,6 +50,7 @@ { "id": 1, "qtype": "multichoice", + "name": "test_name", "questiontext": "test_question" } ], diff --git a/tests/mod_quiz/attempt_submitted/multichoice/statements.json b/tests/mod_quiz/attempt_submitted/multichoice/statements.json index 432e882b6..8e801224e 100644 --- a/tests/mod_quiz/attempt_submitted/multichoice/statements.json +++ b/tests/mod_quiz/attempt_submitted/multichoice/statements.json @@ -27,7 +27,7 @@ "raw": 50, "min": 0, "max": 100, - "scaled": 0.5 + "scaled": 0.0 }, "completion": true, "success": true, @@ -109,6 +109,9 @@ "definition": { "type": "http://adlnet.gov/expapi/activities/cmi.interaction", "name": { + "en": "test_name" + }, + "description": { "en": "test_question" }, "interactionType": "choice" diff --git a/tests/mod_quiz/attempt_submitted/multichoice_withchoices/data.json b/tests/mod_quiz/attempt_submitted/multichoice_withchoices/data.json index db6b38782..d6edf04cd 100644 --- a/tests/mod_quiz/attempt_submitted/multichoice_withchoices/data.json +++ b/tests/mod_quiz/attempt_submitted/multichoice_withchoices/data.json @@ -50,6 +50,7 @@ { "id": 1, "qtype": "multichoice", + "name": "test_name", "questiontext": "test_question" } ], diff --git a/tests/mod_quiz/attempt_submitted/multichoice_withchoices/statements.json b/tests/mod_quiz/attempt_submitted/multichoice_withchoices/statements.json index 4c1a38be6..e7f80b696 100644 --- a/tests/mod_quiz/attempt_submitted/multichoice_withchoices/statements.json +++ b/tests/mod_quiz/attempt_submitted/multichoice_withchoices/statements.json @@ -27,7 +27,7 @@ "raw": 50, "min": 0, "max": 100, - "scaled": 0.5 + "scaled": 0.0 }, "completion": true, "success": true, @@ -109,6 +109,9 @@ "definition": { "type": "http://adlnet.gov/expapi/activities/cmi.interaction", "name": { + "en": "test_name" + }, + "description": { "en": "test_question" }, "interactionType": "choice", diff --git a/tests/mod_quiz/attempt_submitted/multichoiceset/data.json b/tests/mod_quiz/attempt_submitted/multichoiceset/data.json index bb2300cc5..0fc560517 100644 --- a/tests/mod_quiz/attempt_submitted/multichoiceset/data.json +++ b/tests/mod_quiz/attempt_submitted/multichoiceset/data.json @@ -50,6 +50,7 @@ { "id": 1, "qtype": "multichoiceset", + "name": "test_name", "questiontext": "test_question" } ], diff --git a/tests/mod_quiz/attempt_submitted/multichoiceset/statements.json b/tests/mod_quiz/attempt_submitted/multichoiceset/statements.json index 4eb088886..5ea3c7c4f 100644 --- a/tests/mod_quiz/attempt_submitted/multichoiceset/statements.json +++ b/tests/mod_quiz/attempt_submitted/multichoiceset/statements.json @@ -27,7 +27,7 @@ "raw": 50, "min": 0, "max": 100, - "scaled": 0.5 + "scaled": 0.0 }, "completion": true, "success": true, @@ -109,6 +109,9 @@ "definition": { "type": "http://adlnet.gov/expapi/activities/cmi.interaction", "name": { + "en": "test_name" + }, + "description": { "en": "test_question" }, "interactionType": "choice" diff --git a/tests/mod_quiz/attempt_submitted/multichoiceset_withchoices/data.json b/tests/mod_quiz/attempt_submitted/multichoiceset_withchoices/data.json index bb2300cc5..0fc560517 100644 --- a/tests/mod_quiz/attempt_submitted/multichoiceset_withchoices/data.json +++ b/tests/mod_quiz/attempt_submitted/multichoiceset_withchoices/data.json @@ -50,6 +50,7 @@ { "id": 1, "qtype": "multichoiceset", + "name": "test_name", "questiontext": "test_question" } ], diff --git a/tests/mod_quiz/attempt_submitted/multichoiceset_withchoices/statements.json b/tests/mod_quiz/attempt_submitted/multichoiceset_withchoices/statements.json index adb9a5277..ace45bcb9 100644 --- a/tests/mod_quiz/attempt_submitted/multichoiceset_withchoices/statements.json +++ b/tests/mod_quiz/attempt_submitted/multichoiceset_withchoices/statements.json @@ -27,7 +27,7 @@ "raw": 50, "min": 0, "max": 100, - "scaled": 0.5 + "scaled": 0.0 }, "completion": true, "success": true, @@ -109,6 +109,9 @@ "definition": { "type": "http://adlnet.gov/expapi/activities/cmi.interaction", "name": { + "en": "test_name" + }, + "description": { "en": "test_question" }, "interactionType": "choice", diff --git a/tests/mod_quiz/attempt_submitted/no_questions/statements.json b/tests/mod_quiz/attempt_submitted/no_questions/statements.json index 49b90b123..f913ed1c6 100644 --- a/tests/mod_quiz/attempt_submitted/no_questions/statements.json +++ b/tests/mod_quiz/attempt_submitted/no_questions/statements.json @@ -27,7 +27,7 @@ "raw": 50, "min": 0, "max": 100, - "scaled": 0.5 + "scaled": 0.0 }, "completion": true, "success": true, diff --git a/tests/mod_quiz/attempt_submitted/numerical/data.json b/tests/mod_quiz/attempt_submitted/numerical/data.json index 29e6097d4..354d469aa 100644 --- a/tests/mod_quiz/attempt_submitted/numerical/data.json +++ b/tests/mod_quiz/attempt_submitted/numerical/data.json @@ -50,6 +50,7 @@ { "id": 1, "qtype": "numerical", + "name": "test_name", "questiontext": "test_question" } ], diff --git a/tests/mod_quiz/attempt_submitted/numerical/statements.json b/tests/mod_quiz/attempt_submitted/numerical/statements.json index f97e330da..b171e5059 100644 --- a/tests/mod_quiz/attempt_submitted/numerical/statements.json +++ b/tests/mod_quiz/attempt_submitted/numerical/statements.json @@ -27,7 +27,7 @@ "raw": 50, "min": 0, "max": 100, - "scaled": 0.5 + "scaled": 0.0 }, "completion": true, "success": true, @@ -109,6 +109,9 @@ "definition": { "type": "http://adlnet.gov/expapi/activities/cmi.interaction", "name": { + "en": "test_name" + }, + "description": { "en": "test_question" }, "interactionType": "numeric" diff --git a/tests/mod_quiz/attempt_submitted/randomsamatch/data.json b/tests/mod_quiz/attempt_submitted/randomsamatch/data.json index 25bb26415..fcf45eecf 100644 --- a/tests/mod_quiz/attempt_submitted/randomsamatch/data.json +++ b/tests/mod_quiz/attempt_submitted/randomsamatch/data.json @@ -50,6 +50,7 @@ { "id": 1, "qtype": "randomsamatch", + "name": "test_name", "questiontext": "

Example Random short-answer matching question

" } ], diff --git a/tests/mod_quiz/attempt_submitted/randomsamatch/statements.json b/tests/mod_quiz/attempt_submitted/randomsamatch/statements.json index 698e0d1e8..88454309f 100644 --- a/tests/mod_quiz/attempt_submitted/randomsamatch/statements.json +++ b/tests/mod_quiz/attempt_submitted/randomsamatch/statements.json @@ -27,7 +27,7 @@ "raw": 50, "min": 0, "max": 100, - "scaled": 0.5 + "scaled": 0.0 }, "completion": true, "success": true, @@ -109,6 +109,9 @@ "definition": { "type": "http://adlnet.gov/expapi/activities/cmi.interaction", "name": { + "en": "test_name" + }, + "description": { "en": "Example Random short-answer matching question" }, "interactionType": "matching" diff --git a/tests/mod_quiz/attempt_submitted/shortanswer/data.json b/tests/mod_quiz/attempt_submitted/shortanswer/data.json index 18a603450..61e655fc0 100644 --- a/tests/mod_quiz/attempt_submitted/shortanswer/data.json +++ b/tests/mod_quiz/attempt_submitted/shortanswer/data.json @@ -49,6 +49,7 @@ { "id": 1, "qtype": "shortanswer", + "name": "test_name", "questiontext": "test_question" } ], diff --git a/tests/mod_quiz/attempt_submitted/shortanswer/statements.json b/tests/mod_quiz/attempt_submitted/shortanswer/statements.json index 190c0ed04..f3589b05a 100644 --- a/tests/mod_quiz/attempt_submitted/shortanswer/statements.json +++ b/tests/mod_quiz/attempt_submitted/shortanswer/statements.json @@ -27,7 +27,7 @@ "raw": 50, "min": 0, "max": 100, - "scaled": 0.5 + "scaled": 0.0 }, "completion": true, "success": true, @@ -109,6 +109,9 @@ "definition": { "type": "http://adlnet.gov/expapi/activities/cmi.interaction", "name": { + "en": "test_name" + }, + "description": { "en": "test_question" }, "interactionType": "fill-in" diff --git a/tests/mod_quiz/attempt_submitted/truefalse/data.json b/tests/mod_quiz/attempt_submitted/truefalse/data.json index 1127a5efc..16dbf9981 100644 --- a/tests/mod_quiz/attempt_submitted/truefalse/data.json +++ b/tests/mod_quiz/attempt_submitted/truefalse/data.json @@ -50,6 +50,7 @@ { "id": 1, "qtype": "truefalse", + "name": "test_name", "questiontext": "test_question" } ], diff --git a/tests/mod_quiz/attempt_submitted/truefalse/statements.json b/tests/mod_quiz/attempt_submitted/truefalse/statements.json index 138aeca59..3b2b0e42f 100644 --- a/tests/mod_quiz/attempt_submitted/truefalse/statements.json +++ b/tests/mod_quiz/attempt_submitted/truefalse/statements.json @@ -27,7 +27,7 @@ "raw": 50, "min": 0, "max": 100, - "scaled": 0.5 + "scaled": 0.0 }, "completion": true, "success": true, @@ -109,6 +109,9 @@ "definition": { "type": "http://adlnet.gov/expapi/activities/cmi.interaction", "name": { + "en": "test_name" + }, + "description": { "en": "test_question" }, "interactionType": "true-false" diff --git a/tests/mod_quiz/attempt_submitted/unknown_qtype/data.json b/tests/mod_quiz/attempt_submitted/unknown_qtype/data.json index ab066f907..4fc1c6fe5 100644 --- a/tests/mod_quiz/attempt_submitted/unknown_qtype/data.json +++ b/tests/mod_quiz/attempt_submitted/unknown_qtype/data.json @@ -49,6 +49,7 @@ { "id": 1, "qtype": "unknown", + "name": "test_name", "questiontext": "test_question" } ], diff --git a/tests/mod_quiz/attempt_submitted/unknown_qtype/statements.json b/tests/mod_quiz/attempt_submitted/unknown_qtype/statements.json index 49b90b123..f913ed1c6 100644 --- a/tests/mod_quiz/attempt_submitted/unknown_qtype/statements.json +++ b/tests/mod_quiz/attempt_submitted/unknown_qtype/statements.json @@ -27,7 +27,7 @@ "raw": 50, "min": 0, "max": 100, - "scaled": 0.5 + "scaled": 0.0 }, "completion": true, "success": true,