diff --git a/src/transformer/events/mod_feedback/item_answered/handler.php b/src/transformer/events/mod_feedback/item_answered/handler.php index 0bfb272b8..9a5187890 100644 --- a/src/transformer/events/mod_feedback/item_answered/handler.php +++ b/src/transformer/events/mod_feedback/item_answered/handler.php @@ -34,23 +34,24 @@ * @param array $config The transformer config settings. * @param \stdClass $event The event to be transformed. * @param \stdClass $feedbackvalue The value of the feedback type. + * @param array $actor The xAPI actor. * @return array */ -function handler(array $config, \stdClass $event, \stdClass $feedbackvalue) { +function handler(array $config, \stdClass $event, \stdClass $feedbackvalue, array $actor) { $repo = $config['repo']; $feedbackitem = $repo->read_record_by_id('feedback_item', $feedbackvalue->item); switch ($feedbackitem->typ) { case 'multichoicerated': - return multichoicerated($config, $event, $feedbackvalue, $feedbackitem); + return multichoicerated($config, $event, $feedbackvalue, $feedbackitem, $actor); case 'multichoice': - return multichoice($config, $event, $feedbackvalue, $feedbackitem); + return multichoice($config, $event, $feedbackvalue, $feedbackitem, $actor); case 'numeric': - return numerical($config, $event, $feedbackvalue, $feedbackitem); + return numerical($config, $event, $feedbackvalue, $feedbackitem, $actor); case 'textarea': - return textarea($config, $event, $feedbackvalue, $feedbackitem); + return textarea($config, $event, $feedbackvalue, $feedbackitem, $actor); case 'textfield': - return textfield($config, $event, $feedbackvalue, $feedbackitem); + return textfield($config, $event, $feedbackvalue, $feedbackitem, $actor); default: return []; } diff --git a/src/transformer/events/mod_feedback/item_answered/multichoice.php b/src/transformer/events/mod_feedback/item_answered/multichoice.php index 4902380a4..4c87f8500 100644 --- a/src/transformer/events/mod_feedback/item_answered/multichoice.php +++ b/src/transformer/events/mod_feedback/item_answered/multichoice.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 */ @@ -34,12 +35,18 @@ * @param array $config The transformer config settings. * @param \stdClass $event The event to be transformed. * @param \stdClass $feedbackvalue The value of the feedback type. - * @param \stdClass $feedbackitem The id of the feedback item. + * @param \stdClass $feedbackitem The feedback item. + * @param array $actor The xAPI Actor. * @return array */ -function multichoice(array $config, \stdClass $event, \stdClass $feedbackvalue, \stdClass $feedbackitem) { +function multichoice( + array $config, + \stdClass $event, + \stdClass $feedbackvalue, + \stdClass $feedbackitem, + array $actor +) { $repo = $config['repo']; - $user = $repo->read_record_by_id('user', $event->userid); $course = $repo->read_record_by_id('course', $event->courseid); $feedback = $repo->read_record_by_id('feedback', $feedbackitem->feedback); $lang = utils\get_course_lang($course); @@ -47,22 +54,22 @@ function multichoice(array $config, \stdClass $event, \stdClass $feedbackvalue, $selectedchoice = $choices[intval($feedbackvalue->value) - 1]; return [[ - 'actor' => utils\get_user($config, $user), + 'actor' => $actor, 'verb' => [ 'id' => 'http://adlnet.gov/expapi/verbs/answered', 'display' => [ - $lang => 'answered' + $lang => 'Answered' ], ], 'object' => [ 'id' => $config['app_url'].'/mod/feedback/edit_item.php?id='.$feedbackitem->id, - 'definition' => [ - 'type' => 'http://adlnet.gov/expapi/activities/cmi.interaction', - 'name' => [ - $lang => $feedbackitem->name, - ], - 'interactionType' => 'choice', - ], + 'definition' => utils\get_activity\definition\cmi\choice( + $config, + $feedbackitem->name, + null, + $choices, + $lang + ), ], 'result' => [ 'response' => $selectedchoice, diff --git a/src/transformer/events/mod_feedback/item_answered/multichoicerated.php b/src/transformer/events/mod_feedback/item_answered/multichoicerated.php index 30795dc2a..8a2cd9279 100644 --- a/src/transformer/events/mod_feedback/item_answered/multichoicerated.php +++ b/src/transformer/events/mod_feedback/item_answered/multichoicerated.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 */ @@ -34,12 +35,18 @@ * @param array $config The transformer config settings. * @param \stdClass $event The event to be transformed. * @param \stdClass $feedbackvalue The value of the feedback type. - * @param \stdClass $feedbackitem The id of the feedback item. + * @param \stdClass $feedbackitem The feedback item. + * @param array $actor The xAPI Actor. * @return array */ -function multichoicerated(array $config, \stdClass $event, \stdClass $feedbackvalue, \stdClass $feedbackitem) { +function multichoicerated( + array $config, + \stdClass $event, + \stdClass $feedbackvalue, + \stdClass $feedbackitem, + array $actor +) { $repo = $config['repo']; - $user = $repo->read_record_by_id('user', $event->userid); $course = $repo->read_record_by_id('course', $event->courseid); $feedback = $repo->read_record_by_id('feedback', $feedbackitem->feedback); $lang = utils\get_course_lang($course); @@ -57,22 +64,27 @@ function multichoicerated(array $config, \stdClass $event, \stdClass $feedbackva $selectedchoice = $choices[intval($feedbackvalue->value) - 1]; return [[ - 'actor' => utils\get_user($config, $user), + 'actor' => $actor, 'verb' => [ 'id' => 'http://adlnet.gov/expapi/verbs/answered', 'display' => [ - $lang => 'answered' + $lang => 'Answered' ], ], 'object' => [ 'id' => $config['app_url'].'/mod/feedback/edit_item.php?id='.$feedbackitem->id, - 'definition' => [ - 'type' => 'http://adlnet.gov/expapi/activities/cmi.interaction', - 'name' => [ - $lang => $feedbackitem->name, - ], - 'interactionType' => 'choice', - ] + 'definition' => utils\get_activity\definition\cmi\choice( + $config, + $feedbackitem->name, + null, + array_map( + function($choice) { + return $choice->name; + }, + $choices + ), + $lang + ), ], 'result' => [ 'response' => $selectedchoice->name, diff --git a/src/transformer/events/mod_feedback/item_answered/numerical.php b/src/transformer/events/mod_feedback/item_answered/numerical.php index 112d91ca5..8a34b5e0f 100644 --- a/src/transformer/events/mod_feedback/item_answered/numerical.php +++ b/src/transformer/events/mod_feedback/item_answered/numerical.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 */ @@ -34,33 +35,41 @@ * @param array $config The transformer config settings. * @param \stdClass $event The event to be transformed. * @param \stdClass $feedbackvalue The value of the feedback type. - * @param \stdClass $feedbackitem The id of the feedback item. + * @param \stdClass $feedbackitem The feedback item. + * @param array $actor The xAPI Actor. * @return array */ -function numerical(array $config, \stdClass $event, \stdClass $feedbackvalue, \stdClass $feedbackitem) { +function numerical( + array $config, + \stdClass $event, + \stdClass $feedbackvalue, + \stdClass $feedbackitem, + array $actor +) { $repo = $config['repo']; - $user = $repo->read_record_by_id('user', $event->userid); $course = $repo->read_record_by_id('course', $event->courseid); $feedback = $repo->read_record_by_id('feedback', $feedbackitem->feedback); $lang = utils\get_course_lang($course); + [$min, $max] = explode('|', $feedbackitem->presentation); return [[ - 'actor' => utils\get_user($config, $user), + 'actor' => $actor, 'verb' => [ 'id' => 'http://adlnet.gov/expapi/verbs/answered', 'display' => [ - $lang => 'answered' + $lang => 'Answered' ], ], 'object' => [ 'id' => $config['app_url'].'/mod/feedback/edit_item.php?id='.$feedbackitem->id, - 'definition' => [ - 'type' => 'http://adlnet.gov/expapi/activities/cmi.interaction', - 'name' => [ - $lang => $feedbackitem->name, - ], - 'interactionType' => 'numeric', - ], + 'definition' => utils\get_activity\definition\cmi\numeric( + $config, + $feedbackitem->name, + null, + $min, + $max, + $lang + ), ], 'result' => [ 'response' => $feedbackvalue->value, diff --git a/src/transformer/events/mod_feedback/item_answered/textarea.php b/src/transformer/events/mod_feedback/item_answered/textarea.php index 0d99815d0..fc1d80c12 100644 --- a/src/transformer/events/mod_feedback/item_answered/textarea.php +++ b/src/transformer/events/mod_feedback/item_answered/textarea.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,32 +36,37 @@ * @param \stdClass $event The event to be transformed. * @param \stdClass $feedbackvalue The value of the feedback type. * @param \stdClass $feedbackitem The id of the feedback item. + * @param array $actor The xAPI Actor. * @return array */ -function textarea(array $config, \stdClass $event, \stdClass $feedbackvalue, \stdClass $feedbackitem) { +function textarea( + array $config, + \stdClass $event, + \stdClass $feedbackvalue, + \stdClass $feedbackitem, + array $actor +) { $repo = $config['repo']; - $user = $repo->read_record_by_id('user', $event->userid); $course = $repo->read_record_by_id('course', $event->courseid); $feedback = $repo->read_record_by_id('feedback', $feedbackitem->feedback); $lang = utils\get_course_lang($course); return [[ - 'actor' => utils\get_user($config, $user), + 'actor' => $actor, 'verb' => [ 'id' => 'http://adlnet.gov/expapi/verbs/answered', 'display' => [ - $lang => 'answered' + $lang => 'Answered' ], ], 'object' => [ 'id' => $config['app_url'].'/mod/feedback/edit_item.php?id='.$feedbackitem->id, - 'definition' => [ - 'type' => 'http://adlnet.gov/expapi/activities/cmi.interaction', - 'name' => [ - $lang => $feedbackitem->name, - ], - 'interactionType' => 'long-fill-in', - ] + 'definition' => utils\get_activity\definition\cmi\long_fill_in( + $config, + $feedbackitem->name, + null, + $lang + ), ], 'result' => [ 'response' => $feedbackvalue->value, diff --git a/src/transformer/events/mod_feedback/item_answered/textfield.php b/src/transformer/events/mod_feedback/item_answered/textfield.php index 93dbcc39e..69dca8c24 100644 --- a/src/transformer/events/mod_feedback/item_answered/textfield.php +++ b/src/transformer/events/mod_feedback/item_answered/textfield.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,32 +36,37 @@ * @param \stdClass $event The event to be transformed. * @param \stdClass $feedbackvalue The value of the feedback type. * @param \stdClass $feedbackitem The id of the feedback item. + * @param array $actor The xAPI Actor. * @return array */ -function textfield(array $config, \stdClass $event, \stdClass $feedbackvalue, \stdClass $feedbackitem) { +function textfield( + array $config, + \stdClass $event, + \stdClass $feedbackvalue, + \stdClass $feedbackitem, + array $actor +) { $repo = $config['repo']; - $user = $repo->read_record_by_id('user', $event->userid); $course = $repo->read_record_by_id('course', $event->courseid); $feedback = $repo->read_record_by_id('feedback', $feedbackitem->feedback); $lang = utils\get_course_lang($course); return [[ - 'actor' => utils\get_user($config, $user), + 'actor' => $actor, 'verb' => [ 'id' => 'http://adlnet.gov/expapi/verbs/answered', 'display' => [ - $lang => 'answered' + $lang => 'Answered' ], ], 'object' => [ 'id' => $config['app_url'].'/mod/feedback/edit_item.php?id='.$feedbackitem->id, - 'definition' => [ - 'type' => 'http://adlnet.gov/expapi/activities/cmi.interaction', - 'name' => [ - $lang => $feedbackitem->name, - ], - 'interactionType' => 'fill-in', - ] + 'definition' => utils\get_activity\definition\cmi\fill_in( + $config, + $feedbackitem->name, + null, + $lang + ), ], 'result' => [ 'response' => $feedbackvalue->value, diff --git a/src/transformer/events/mod_feedback/response_submitted/handler.php b/src/transformer/events/mod_feedback/response_submitted/handler.php index 2800a403c..2d912fd59 100644 --- a/src/transformer/events/mod_feedback/response_submitted/handler.php +++ b/src/transformer/events/mod_feedback/response_submitted/handler.php @@ -38,14 +38,26 @@ */ function handler(array $config, \stdClass $event) { $repo = $config['repo']; + $user = $repo->read_record_by_id('user', $event->userid); $feedbackvalues = $repo->read_records('feedback_value', [ 'completed' => $event->objectid ]); + $feedbackcompleted = $repo->read_record_by_id('feedback_completed', $event->objectid); + $isanon = ($feedbackcompleted->anonymous_response === 1) ? true : false; + $actor = ($isanon) + ? [ + 'name' => 'Anonymous Course Participant', + 'account' => [ + 'homePage' => $config['app_url'], + 'name' => 'anonymous' + ] + ] + : utils\get_user($config, $user); return array_merge( - response_submitted($config, $event), - array_reduce($feedbackvalues, function ($result, $feedbackvalue) use ($config, $event) { - return array_merge($result, item_answered\handler($config, $event, $feedbackvalue)); + response_submitted($config, $event, $actor), + array_reduce($feedbackvalues, function ($result, $feedbackvalue) use ($config, $event, $actor) { + return array_merge($result, item_answered\handler($config, $event, $feedbackvalue, $actor)); }, []) ); } diff --git a/src/transformer/events/mod_feedback/response_submitted/response_submitted.php b/src/transformer/events/mod_feedback/response_submitted/response_submitted.php index 1ee7d8180..42264db43 100644 --- a/src/transformer/events/mod_feedback/response_submitted/response_submitted.php +++ b/src/transformer/events/mod_feedback/response_submitted/response_submitted.php @@ -33,9 +33,10 @@ * * @param array $config The transformer config settings. * @param \stdClass $event The event to be transformed. + * @param array $actor The xAPI Actor to use. * @return array */ -function response_submitted(array $config, \stdClass $event) { +function response_submitted(array $config, \stdClass $event, array $actor) { $repo = $config['repo']; $user = $repo->read_record_by_id('user', $event->userid); $course = $repo->read_record_by_id('course', $event->courseid); @@ -44,14 +45,16 @@ function response_submitted(array $config, \stdClass $event) { $feedback = $repo->read_record_by_id('feedback', $feedbackcompleted->feedback); return [[ - 'actor' => utils\get_user($config, $user), + 'actor' => $actor, 'verb' => [ 'id' => 'http://activitystrea.ms/schema/1.0/submit', 'display' => [ - $lang => 'submitted' + $lang => 'Submitted' ], ], - 'object' => utils\get_activity\course_feedback($config, $course, $event->contextinstanceid), + 'object' => utils\get_activity\course_module( + $config, $course, $event->contextinstanceid + ), 'context' => [ 'language' => $lang, 'extensions' => utils\extensions\base($config, $event, $course), diff --git a/src/transformer/utils/get_activity/definition/choice.php b/src/transformer/utils/get_activity/definition/choice.php index 50280b527..184dfaec3 100644 --- a/src/transformer/utils/get_activity/definition/choice.php +++ b/src/transformer/utils/get_activity/definition/choice.php @@ -15,7 +15,7 @@ // along with Moodle. If not, see . /** - * Transformer utilities for creating Choice xAPI Activity object definitions. + * Transformer utilities for creating Moodle Choice xAPI Activity object definitions. * * @package logstore_xapi * @copyright Milt Reder @@ -43,39 +43,16 @@ function get_choice_definition( 'choice_options', ['choiceid' => $choice->id], 'id ASC' ); - return [ - 'type' => 'http://adlnet.gov/expapi/activities/cmi.interaction', - 'name' => [ - $lang => $choice->name, - ], - 'description' => [ - $lang => utils\get_string_html_removed($choice->intro), - ], - 'interactionType' => 'choice', - 'correctResponsesPattern' => [ - implode( - '[,]', - array_map( - function($option) { - return $option->text; - }, - $options - ) - ), - ], - // use array values because this sometimes comes out associative - 'choices' => array_values( - array_map( - function($option) use ($lang) { - return [ - 'id' => utils\slugify($option->text), - 'description' => [ - $lang => $option->text, - ], - ]; - }, - $options - ) - ) - ]; + return utils\get_activity\definition\cmi\choice( + $config, + $choice->name, + utils\get_string_html_removed($choice->intro), + array_map( + function($option) { + return $option->text; + }, + $options + ), + $lang + ); } diff --git a/src/transformer/utils/get_activity/definition/cmi/choice.php b/src/transformer/utils/get_activity/definition/cmi/choice.php new file mode 100644 index 000000000..666bebb7d --- /dev/null +++ b/src/transformer/utils/get_activity/definition/cmi/choice.php @@ -0,0 +1,73 @@ +. + +/** + * Transformer utilities for creating CMI choice xAPI Activity object definitions. + * + * @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\definition\cmi; + +use src\transformer\utils as utils; + +/** + * Transformer util for creating choice definitions + * + * @param array $config The transformer config settings. + * @param string $name The activity name. + * @param ?string $description The activity description. + * @param array $choices The choices available. + * @param string $lang The language. + */ +function choice( + array $config, + string $name, + ?string $description, + array $choices, + string $lang +) { + $cmichoices = array_map( + function($choice) use ($lang) { + return [ + 'id' => utils\slugify($choice), + 'description' => [ + $lang => $choice, + ], + ]; + }, + $choices + ); + + return [ + ...common($config, $name, $description, $lang), + 'interactionType' => 'choice', + 'correctResponsesPattern' => [ + implode( + '[,]', + array_map( + function($cmichoice) { + return $cmichoice['id']; + }, + $cmichoices + ) + ), + ], + 'choices' => $cmichoices + ]; +} diff --git a/src/transformer/utils/get_activity/definition/cmi/common.php b/src/transformer/utils/get_activity/definition/cmi/common.php new file mode 100644 index 000000000..1b166ec04 --- /dev/null +++ b/src/transformer/utils/get_activity/definition/cmi/common.php @@ -0,0 +1,54 @@ +. + +/** + * Transformer utilities for creating CMI common xAPI Activity object definition fields. + * + * @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\definition\cmi; + +use src\transformer\utils as utils; + +/** + * Transformer util for creating common definition fields + * + * @param array $config The transformer config settings. + * @param string $name The activity name. + * @param ?string $description The activity description. + * @param string $lang The language. + */ +function common( + array $config, + string $name, + ?string $description, + string $lang +) { + return [ + 'type' => 'http://adlnet.gov/expapi/activities/cmi.interaction', + 'name' => [ + $lang => $name, + ], + ...( + $description !== null + ? ['description' => [$lang => $description]] + : [] + ), + ]; +} diff --git a/src/transformer/utils/get_activity/course_feedback.php b/src/transformer/utils/get_activity/definition/cmi/fill_in.php similarity index 58% rename from src/transformer/utils/get_activity/course_feedback.php rename to src/transformer/utils/get_activity/definition/cmi/fill_in.php index a0ba048e6..14410468b 100644 --- a/src/transformer/utils/get_activity/course_feedback.php +++ b/src/transformer/utils/get_activity/definition/cmi/fill_in.php @@ -15,31 +15,33 @@ // along with Moodle. If not, see . /** - * Transformer utility for retrieving (course feedback) activities. + * Transformer utilities for creating CMI fill-in xAPI Activity object definitions. * * @package logstore_xapi - * @copyright Jerret Fowler - * Ryan Smith - * David Pesce + * @copyright Milt Reder * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -namespace src\transformer\utils\get_activity; +namespace src\transformer\utils\get_activity\definition\cmi; use src\transformer\utils as utils; /** - * Transformer utility for retrieving (course feedback) activities. + * Transformer util for creating fill-in definitions. * * @param array $config The transformer config settings. - * @param \stdClass $course The course object. - * @param string $cmid The id of the context. - * @return array + * @param string $name The activity name. + * @param ?string $description The activity description. + * @param string $lang The language. */ -function course_feedback(array $config, \stdClass $course, string $cmid) { - return utils\get_activity\course_module( - $config, - $course, - $cmid - ); +function fill_in( + array $config, + string $name, + ?string $description, + string $lang +) { + return [ + ...common($config, $name, $description, $lang), + 'interactionType' => 'fill-in', + ]; } diff --git a/src/transformer/utils/get_activity/definition/cmi/long_fill_in.php b/src/transformer/utils/get_activity/definition/cmi/long_fill_in.php new file mode 100644 index 000000000..5f9c81d58 --- /dev/null +++ b/src/transformer/utils/get_activity/definition/cmi/long_fill_in.php @@ -0,0 +1,47 @@ +. + +/** + * Transformer utilities for creating CMI long-fill-in xAPI Activity object definitions. + * + * @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\definition\cmi; + +use src\transformer\utils as utils; + +/** + * Transformer util for creating long-fill-in definitions. + * + * @param array $config The transformer config settings. + * @param string $name The activity name. + * @param ?string $description The activity description. + * @param string $lang The language. + */ +function long_fill_in( + array $config, + string $name, + ?string $description, + string $lang +) { + return [ + ...common($config, $name, $description, $lang), + 'interactionType' => 'long-fill-in', + ]; +} diff --git a/src/transformer/utils/get_activity/definition/cmi/numeric.php b/src/transformer/utils/get_activity/definition/cmi/numeric.php new file mode 100644 index 000000000..1e4569c61 --- /dev/null +++ b/src/transformer/utils/get_activity/definition/cmi/numeric.php @@ -0,0 +1,54 @@ +. + +/** + * Transformer utilities for creating CMI numeric xAPI Activity object definitions. + * + * @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\definition\cmi; + +use src\transformer\utils as utils; + +/** + * Transformer util for creating numeric definitions + * + * @param array $config The transformer config settings. + * @param string $name The activity name. + * @param ?string $description The activity description. + * @param ?string $min The minimum numeric value. + * @param ?string $max The maximum numeric value. + * @param string $lang The language. + */ +function numeric( + array $config, + string $name, + ?string $description, + ?string $min, + ?string $max, + string $lang +) { + return [ + ...common($config, $name, $description, $lang), + 'interactionType' => 'numeric', + 'correctResponsesPattern' => [ + $min . '[:]' . $max, + ], + ]; +} diff --git a/src/transformer/utils/slugify.php b/src/transformer/utils/slugify.php index 1ad720257..4bd8c631c 100644 --- a/src/transformer/utils/slugify.php +++ b/src/transformer/utils/slugify.php @@ -35,8 +35,8 @@ function slugify($string) { // Convert the string to lowercase $string = strtolower($string); - // Replace spaces and consecutive whitespace with a single dash - $string = preg_replace('/\s+/', '-', $string); + // Replace spaces, underscores and consecutive whitespace with a single dash + $string = preg_replace('/[\s_]+/', '-', $string); // Remove any non-alphanumeric characters except dashes $string = preg_replace('/[^a-z0-9-]/', '', $string); diff --git a/tests/mod_choice/answer_created/statements.json b/tests/mod_choice/answer_created/statements.json index b3b3c6be6..baa30cc67 100644 --- a/tests/mod_choice/answer_created/statements.json +++ b/tests/mod_choice/answer_created/statements.json @@ -25,7 +25,7 @@ }, "interactionType": "choice", "correctResponsesPattern": [ - "To be[,]Not to be" + "to-be[,]not-to-be" ], "choices": [ { diff --git a/tests/mod_choice/course_module_viewed/existing_module/statements.json b/tests/mod_choice/course_module_viewed/existing_module/statements.json index 52d04a848..da41cb721 100644 --- a/tests/mod_choice/course_module_viewed/existing_module/statements.json +++ b/tests/mod_choice/course_module_viewed/existing_module/statements.json @@ -25,7 +25,7 @@ }, "interactionType": "choice", "correctResponsesPattern": [ - "To be[,]Not to be" + "to-be[,]not-to-be" ], "choices": [ { diff --git a/tests/mod_feedback/response_submitted/multichoice/data.json b/tests/mod_feedback/response_submitted/multichoice/data.json index c4469ce73..3f73c969b 100644 --- a/tests/mod_feedback/response_submitted/multichoice/data.json +++ b/tests/mod_feedback/response_submitted/multichoice/data.json @@ -8,7 +8,8 @@ "feedback_completed": [ { "id": 1, - "feedback": 1 + "feedback": 1, + "anonymous_response": 0 } ], "feedback": [ diff --git a/tests/mod_feedback/response_submitted/multichoice/statements.json b/tests/mod_feedback/response_submitted/multichoice/statements.json index 801650636..c8a16d20b 100644 --- a/tests/mod_feedback/response_submitted/multichoice/statements.json +++ b/tests/mod_feedback/response_submitted/multichoice/statements.json @@ -10,7 +10,7 @@ "verb": { "id": "http://activitystrea.ms/schema/1.0/submit", "display": { - "en": "submitted" + "en": "Submitted" } }, "object": { @@ -79,7 +79,7 @@ "verb": { "id": "http://adlnet.gov/expapi/verbs/answered", "display": { - "en": "answered" + "en": "Answered" } }, "object": { @@ -89,7 +89,30 @@ "name": { "en": "test_feedback_item" }, - "interactionType": "choice" + "interactionType": "choice", + "correctResponsesPattern": [ + "test-choice-1[,]test-choice-2[,]test-choice-3" + ], + "choices": [ + { + "id": "test-choice-1", + "description": { + "en": "test_choice_1" + } + }, + { + "id": "test-choice-2", + "description": { + "en": "test_choice_2" + } + }, + { + "id": "test-choice-3", + "description": { + "en": "test_choice_3" + } + } + ] } }, "result": { diff --git a/tests/mod_feedback/response_submitted/multichoicerated/data.json b/tests/mod_feedback/response_submitted/multichoicerated/data.json index b6cc87587..c438629b1 100644 --- a/tests/mod_feedback/response_submitted/multichoicerated/data.json +++ b/tests/mod_feedback/response_submitted/multichoicerated/data.json @@ -8,7 +8,8 @@ "feedback_completed": [ { "id": 1, - "feedback": 1 + "feedback": 1, + "anonymous_response": 0 } ], "feedback": [ diff --git a/tests/mod_feedback/response_submitted/multichoicerated/statements.json b/tests/mod_feedback/response_submitted/multichoicerated/statements.json index c9b0858e2..11b39005f 100644 --- a/tests/mod_feedback/response_submitted/multichoicerated/statements.json +++ b/tests/mod_feedback/response_submitted/multichoicerated/statements.json @@ -10,7 +10,7 @@ "verb": { "id": "http://activitystrea.ms/schema/1.0/submit", "display": { - "en": "submitted" + "en": "Submitted" } }, "object": { @@ -79,7 +79,7 @@ "verb": { "id": "http://adlnet.gov/expapi/verbs/answered", "display": { - "en": "answered" + "en": "Answered" } }, "object": { @@ -89,7 +89,30 @@ "name": { "en": "test_feedback_item" }, - "interactionType": "choice" + "interactionType": "choice", + "correctResponsesPattern": [ + "test-choice-1[,]test-choice-2[,]test-choice-3" + ], + "choices": [ + { + "id": "test-choice-1", + "description": { + "en": "test_choice_1" + } + }, + { + "id": "test-choice-2", + "description": { + "en": "test_choice_2" + } + }, + { + "id": "test-choice-3", + "description": { + "en": "test_choice_3" + } + } + ] } }, "result": { diff --git a/tests/mod_feedback/response_submitted/no_items/data.json b/tests/mod_feedback/response_submitted/no_items/data.json index fa23a45c2..3e0cfe56b 100644 --- a/tests/mod_feedback/response_submitted/no_items/data.json +++ b/tests/mod_feedback/response_submitted/no_items/data.json @@ -8,7 +8,8 @@ "feedback_completed": [ { "id": 1, - "feedback": 1 + "feedback": 1, + "anonymous_response": 0 } ], "feedback": [ diff --git a/tests/mod_feedback/response_submitted/no_items/statements.json b/tests/mod_feedback/response_submitted/no_items/statements.json index 812a81381..c55c5d677 100644 --- a/tests/mod_feedback/response_submitted/no_items/statements.json +++ b/tests/mod_feedback/response_submitted/no_items/statements.json @@ -10,7 +10,7 @@ "verb": { "id": "http://activitystrea.ms/schema/1.0/submit", "display": { - "en": "submitted" + "en": "Submitted" } }, "object": { diff --git a/tests/mod_feedback/response_submitted/numerical/data.json b/tests/mod_feedback/response_submitted/numerical/data.json index b97f59e9e..7e713d163 100644 --- a/tests/mod_feedback/response_submitted/numerical/data.json +++ b/tests/mod_feedback/response_submitted/numerical/data.json @@ -8,7 +8,8 @@ "feedback_completed": [ { "id": 1, - "feedback": 1 + "feedback": 1, + "anonymous_response": 0 } ], "feedback": [ @@ -22,7 +23,8 @@ "id": 1, "feedback": 1, "name": "test_feedback_item", - "typ": "numeric" + "typ": "numeric", + "presentation": "0|10" } ], "feedback_value": [ diff --git a/tests/mod_feedback/response_submitted/numerical/statements.json b/tests/mod_feedback/response_submitted/numerical/statements.json index ea9439a00..392284c8a 100644 --- a/tests/mod_feedback/response_submitted/numerical/statements.json +++ b/tests/mod_feedback/response_submitted/numerical/statements.json @@ -10,7 +10,7 @@ "verb": { "id": "http://activitystrea.ms/schema/1.0/submit", "display": { - "en": "submitted" + "en": "Submitted" } }, "object": { @@ -79,7 +79,7 @@ "verb": { "id": "http://adlnet.gov/expapi/verbs/answered", "display": { - "en": "answered" + "en": "Answered" } }, "object": { @@ -89,7 +89,10 @@ "name": { "en": "test_feedback_item" }, - "interactionType": "numeric" + "interactionType": "numeric", + "correctResponsesPattern": [ + "0[:]10" + ] } }, "result": { diff --git a/tests/mod_feedback/response_submitted/textarea/data.json b/tests/mod_feedback/response_submitted/textarea/data.json index 714aa3b14..50a185786 100644 --- a/tests/mod_feedback/response_submitted/textarea/data.json +++ b/tests/mod_feedback/response_submitted/textarea/data.json @@ -8,7 +8,8 @@ "feedback_completed": [ { "id": 1, - "feedback": 1 + "feedback": 1, + "anonymous_response": 0 } ], "feedback": [ diff --git a/tests/mod_feedback/response_submitted/textarea/statements.json b/tests/mod_feedback/response_submitted/textarea/statements.json index e288168f5..dc3cda333 100644 --- a/tests/mod_feedback/response_submitted/textarea/statements.json +++ b/tests/mod_feedback/response_submitted/textarea/statements.json @@ -10,7 +10,7 @@ "verb": { "id": "http://activitystrea.ms/schema/1.0/submit", "display": { - "en": "submitted" + "en": "Submitted" } }, "object": { @@ -79,7 +79,7 @@ "verb": { "id": "http://adlnet.gov/expapi/verbs/answered", "display": { - "en": "answered" + "en": "Answered" } }, "object": { diff --git a/tests/mod_feedback/response_submitted/textarea_anon/data.json b/tests/mod_feedback/response_submitted/textarea_anon/data.json new file mode 100644 index 000000000..0ff469cd0 --- /dev/null +++ b/tests/mod_feedback/response_submitted/textarea_anon/data.json @@ -0,0 +1,37 @@ +{ + "modules": [ + { + "id": 1, + "name": "feedback" + } + ], + "feedback_completed": [ + { + "id": 1, + "feedback": 1, + "anonymous_response": 1 + } + ], + "feedback": [ + { + "id": 1, + "name": "test_feedback_name" + } + ], + "feedback_item": [ + { + "id": 1, + "feedback": 1, + "name": "test_feedback_item", + "typ": "textarea" + } + ], + "feedback_value": [ + { + "id": 1, + "item": 1, + "completed": 1, + "value": "test_long_text_answer" + } + ] +} diff --git a/tests/mod_feedback/response_submitted/textarea_anon/event.json b/tests/mod_feedback/response_submitted/textarea_anon/event.json new file mode 100644 index 000000000..bd62a9675 --- /dev/null +++ b/tests/mod_feedback/response_submitted/textarea_anon/event.json @@ -0,0 +1,9 @@ +{ + "id": 1, + "userid": 1, + "courseid": 1, + "timecreated": 1433946701, + "objectid": 1, + "contextinstanceid": 1, + "eventname": "\\mod_feedback\\event\\response_submitted" +} diff --git a/tests/mod_feedback/response_submitted/textarea_anon/statements.json b/tests/mod_feedback/response_submitted/textarea_anon/statements.json new file mode 100644 index 000000000..8d7552f3d --- /dev/null +++ b/tests/mod_feedback/response_submitted/textarea_anon/statements.json @@ -0,0 +1,154 @@ +[ + { + "actor": { + "name": "Anonymous Course Participant", + "account": { + "homePage": "http://www.example.org", + "name": "anonymous" + } + }, + "verb": { + "id": "http://activitystrea.ms/schema/1.0/submit", + "display": { + "en": "Submitted" + } + }, + "object": { + "id": "http://www.example.org/mod/feedback/view.php?id=1", + "definition": { + "type": "https://xapi.edlm/profiles/edlm-lms/concepts/activity-types/feedback", + "name": { + "en": "test_feedback_name" + } + } + }, + "context": { + "language": "en", + "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": "\\mod_feedback\\event\\response_submitted", + "event_function": "\\src\\transformer\\events\\mod_feedback\\response_submitted\\handler" + } + }, + "contextActivities": { + "parent": [ + { + "id": "http://www.example.org/course/section.php?id=1", + "objectType": "Activity", + "definition": { + "name": { + "en": "test_name Section 0" + }, + "type": "http://id.tincanapi.com/activitytype/section" + } + }, + { + "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" + } + } + } + ] + } + } + }, + { + "actor": { + "name": "Anonymous Course Participant", + "account": { + "homePage": "http://www.example.org", + "name": "anonymous" + } + }, + "verb": { + "id": "http://adlnet.gov/expapi/verbs/answered", + "display": { + "en": "Answered" + } + }, + "object": { + "id": "http://www.example.org/mod/feedback/edit_item.php?id=1", + "definition": { + "type": "http://adlnet.gov/expapi/activities/cmi.interaction", + "name": { + "en": "test_feedback_item" + }, + "interactionType": "long-fill-in" + } + }, + "result": { + "response": "test_long_text_answer", + "completion": true + }, + "context": { + "language": "en", + "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": "\\mod_feedback\\event\\response_submitted", + "event_function": "\\src\\transformer\\events\\mod_feedback\\response_submitted\\handler" + } + }, + "contextActivities": { + "parent": [ + { + "id": "http://www.example.org/mod/feedback/view.php?id=1", + "definition": { + "type": "https://xapi.edlm/profiles/edlm-lms/concepts/activity-types/feedback", + "name": { + "en": "test_feedback_name" + } + } + }, + { + "id": "http://www.example.org/course/section.php?id=1", + "objectType": "Activity", + "definition": { + "name": { + "en": "test_name Section 0" + }, + "type": "http://id.tincanapi.com/activitytype/section" + } + }, + { + "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" + } + } + } + ] + } + } + } +] diff --git a/tests/mod_feedback/response_submitted/textarea_anon/textarea_test.php b/tests/mod_feedback/response_submitted/textarea_anon/textarea_test.php new file mode 100644 index 000000000..cb610a964 --- /dev/null +++ b/tests/mod_feedback/response_submitted/textarea_anon/textarea_test.php @@ -0,0 +1,72 @@ +. + +namespace logstore_xapi\mod_feedback\response_submitted\textarea_anon; + +defined('MOODLE_INTERNAL') || die(); + +global $CFG; + +require_once($CFG->dirroot . '/admin/tool/log/store/xapi/tests/xapi_test_case.php'); + +/** + * Unit test for mod_feedback response (textarea) submitted event. + * + * @package logstore_xapi + * @copyright Jerret Fowler + * Ryan Smith + * David Pesce + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class textarea_anon_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 "mod"; + } + + /** + * Retrieve the plugin name being tested. + * + * @return string + */ + protected function get_plugin_name() { + return "feedback"; + } + + /** + * Appease auto-detecting of test cases. xapi_test_case has default test cases. + * + * @covers ::response_submitted + * @return void + */ + public function test_init() { + + } +} diff --git a/tests/mod_feedback/response_submitted/textfield/data.json b/tests/mod_feedback/response_submitted/textfield/data.json index 7abc4aaed..8e9b958e5 100644 --- a/tests/mod_feedback/response_submitted/textfield/data.json +++ b/tests/mod_feedback/response_submitted/textfield/data.json @@ -8,7 +8,8 @@ "feedback_completed": [ { "id": 1, - "feedback": 1 + "feedback": 1, + "anonymous_response": 0 } ], "feedback": [ diff --git a/tests/mod_feedback/response_submitted/textfield/statements.json b/tests/mod_feedback/response_submitted/textfield/statements.json index 09b51a22b..f37d01821 100644 --- a/tests/mod_feedback/response_submitted/textfield/statements.json +++ b/tests/mod_feedback/response_submitted/textfield/statements.json @@ -10,7 +10,7 @@ "verb": { "id": "http://activitystrea.ms/schema/1.0/submit", "display": { - "en": "submitted" + "en": "Submitted" } }, "object": { @@ -79,7 +79,7 @@ "verb": { "id": "http://adlnet.gov/expapi/verbs/answered", "display": { - "en": "answered" + "en": "Answered" } }, "object": { diff --git a/tests/mod_feedback/response_submitted/unknown_typ/data.json b/tests/mod_feedback/response_submitted/unknown_typ/data.json index 5782d4752..a7adc7eeb 100644 --- a/tests/mod_feedback/response_submitted/unknown_typ/data.json +++ b/tests/mod_feedback/response_submitted/unknown_typ/data.json @@ -8,7 +8,8 @@ "feedback_completed": [ { "id": 1, - "feedback": 1 + "feedback": 1, + "anonymous_response": 0 } ], "feedback": [ diff --git a/tests/mod_feedback/response_submitted/unknown_typ/statements.json b/tests/mod_feedback/response_submitted/unknown_typ/statements.json index 812a81381..c55c5d677 100644 --- a/tests/mod_feedback/response_submitted/unknown_typ/statements.json +++ b/tests/mod_feedback/response_submitted/unknown_typ/statements.json @@ -10,7 +10,7 @@ "verb": { "id": "http://activitystrea.ms/schema/1.0/submit", "display": { - "en": "submitted" + "en": "Submitted" } }, "object": {