diff --git a/.editorconfig b/.editorconfig
index 45d516e66..1cb779bf7 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -11,5 +11,5 @@ indent_style = space
indent_size = 2
charset = utf-8
-[*.php]
+[*.{php,json}]
indent_size = 4
diff --git a/src/transformer/events/mod_quiz/attempt_submitted.php b/src/transformer/events/mod_quiz/attempt_submitted/attempt_submitted.php
similarity index 97%
rename from src/transformer/events/mod_quiz/attempt_submitted.php
rename to src/transformer/events/mod_quiz/attempt_submitted/attempt_submitted.php
index 042b63db0..58d8d3355 100644
--- a/src/transformer/events/mod_quiz/attempt_submitted.php
+++ b/src/transformer/events/mod_quiz/attempt_submitted/attempt_submitted.php
@@ -14,7 +14,7 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see .
-namespace src\transformer\events\mod_quiz;
+namespace src\transformer\events\mod_quiz\attempt_submitted;
defined('MOODLE_INTERNAL') || die();
diff --git a/src/transformer/events/mod_quiz/attempt_submitted/handler.php b/src/transformer/events/mod_quiz/attempt_submitted/handler.php
new file mode 100644
index 000000000..01b2bf676
--- /dev/null
+++ b/src/transformer/events/mod_quiz/attempt_submitted/handler.php
@@ -0,0 +1,36 @@
+.
+
+namespace src\transformer\events\mod_quiz\attempt_submitted;
+
+defined('MOODLE_INTERNAL') || die();
+
+use src\transformer\utils as utils;
+use src\transformer\events\mod_quiz\question_answered as question_answered;
+
+function handler(array $config, \stdClass $event) {
+ $repo = $config['repo'];
+ $questionattempts = $repo->read_records('question_attempts', [
+ 'questionusageid' => $event->objectid
+ ]);
+
+ return array_merge(
+ attempt_submitted($config, $event),
+ array_reduce($questionattempts, function ($result, $questionattempt) use ($config, $event) {
+ return array_merge($result, question_answered\handler($config, $event, $questionattempt));
+ }, [])
+ );
+}
\ No newline at end of file
diff --git a/src/transformer/events/mod_quiz/question_answered/essay.php b/src/transformer/events/mod_quiz/question_answered/essay.php
new file mode 100644
index 000000000..5fafad56b
--- /dev/null
+++ b/src/transformer/events/mod_quiz/question_answered/essay.php
@@ -0,0 +1,74 @@
+.
+
+namespace src\transformer\events\mod_quiz\question_answered;
+
+defined('MOODLE_INTERNAL') || die();
+
+use src\transformer\utils as utils;
+
+function essay(array $config, \stdClass $event, \stdClass $questionattempt, \stdClass $question) {
+ $repo = $config['repo'];
+ $user = $repo->read_record_by_id('user', $event->relateduserid);
+ $course = $repo->read_record_by_id('course', $event->courseid);
+ $attempt = $repo->read_record_by_id('quiz_attempts', $questionattempt->questionusageid);
+ $quiz = $repo->read_record_by_id('quiz', $attempt->quiz);
+ $coursemodule = $repo->read_record_by_id('course_modules', $event->contextinstanceid);
+ $lang = utils\get_course_lang($course);
+
+ return [[
+ 'actor' => utils\get_user($config, $user),
+ 'verb' => [
+ 'id' => 'http://adlnet.gov/expapi/verbs/answered',
+ 'display' => [
+ $lang => 'answered'
+ ],
+ ],
+ 'object' => [
+ 'id' => $config['app_url'].'/question/question.php?cmid='.$coursemodule->id.'&id='.$question->id,
+ 'definition' => [
+ 'type' => 'http://adlnet.gov/expapi/activities/question',
+ 'name' => [
+ $lang => $questionattempt->questionsummary,
+ ],
+ 'interactionType' => 'long-fill-in',
+ ]
+ ],
+ 'timestamp' => utils\get_event_timestamp($event),
+ 'result' => [
+ 'response' => $questionattempt->responsesummary,
+ 'completion' => $questionattempt->responsesummary !== '',
+ ],
+ 'context' => [
+ 'platform' => $config['source_name'],
+ 'language' => $lang,
+ 'extensions' => [
+ utils\INFO_EXTENSION => utils\get_info($config, $event),
+ ],
+ 'contextActivities' => [
+ 'grouping' => [
+ utils\get_activity\site($config),
+ utils\get_activity\course($config, $course),
+ utils\get_activity\module($config, 'quiz', $quiz, $lang),
+ utils\get_activity\module($config, 'attempt', $attempt, $lang),
+ ],
+ 'category' => [
+ utils\get_activity\source($config),
+ ]
+ ],
+ ]
+ ]];
+}
\ No newline at end of file
diff --git a/src/transformer/events/mod_quiz/question_answered/handler.php b/src/transformer/events/mod_quiz/question_answered/handler.php
new file mode 100644
index 000000000..cf8d64850
--- /dev/null
+++ b/src/transformer/events/mod_quiz/question_answered/handler.php
@@ -0,0 +1,33 @@
+.
+
+namespace src\transformer\events\mod_quiz\question_answered;
+
+defined('MOODLE_INTERNAL') || die();
+
+use src\transformer\utils as utils;
+
+function handler(array $config, \stdClass $event, \stdClass $questionattempt) {
+ $repo = $config['repo'];
+ $question = $repo->read_record_by_id('question', $questionattempt->questionid);
+
+ switch ($question->qtype) {
+ case 'essay':
+ return essay($config, $event, $questionattempt, $question);
+ default:
+ return [];
+ }
+}
\ No newline at end of file
diff --git a/src/transformer/get_event_function_map.php b/src/transformer/get_event_function_map.php
index a46f82028..e0b46d64e 100644
--- a/src/transformer/get_event_function_map.php
+++ b/src/transformer/get_event_function_map.php
@@ -47,10 +47,10 @@ function get_event_function_map() {
'\mod_lti\event\course_module_viewed' => 'all\course_module_viewed',
'\mod_page\event\course_module_viewed' => 'all\course_module_viewed',
'\mod_quiz\event\course_module_viewed' => 'all\course_module_viewed',
- '\mod_quiz\event\attempt_abandoned' => 'mod_quiz\attempt_submitted',
+ '\mod_quiz\event\attempt_abandoned' => 'mod_quiz\attempt_submitted\handler',
'\mod_quiz\event\attempt_started' => 'mod_quiz\attempt_started',
'\mod_quiz\event\attempt_reviewed' => 'mod_quiz\attempt_reviewed',
- '\mod_quiz\event\attempt_submitted' => 'mod_quiz\attempt_submitted',
+ '\mod_quiz\event\attempt_submitted' => 'mod_quiz\attempt_submitted\handler',
'\mod_quiz\event\attempt_viewed' => 'all\course_module_viewed',
'\mod_resource\event\course_module_viewed' => 'all\course_module_viewed',
'\mod_scorm\event\course_module_viewed' => 'all\course_module_viewed',
diff --git a/tests/mod_quiz/attempt_submitted/essay/data.json b/tests/mod_quiz/attempt_submitted/essay/data.json
new file mode 100644
index 000000000..fe479690e
--- /dev/null
+++ b/tests/mod_quiz/attempt_submitted/essay/data.json
@@ -0,0 +1,65 @@
+{
+ "user": [
+ {
+ "id": 1,
+ "firstname": "test_fullname",
+ "email": "test@test.com"
+ }
+ ],
+ "course": [
+ {
+ "id": 1,
+ "fullname": "test_name",
+ "lang": "en"
+ }
+ ],
+ "course_modules": [
+ {
+ "id": 1,
+ "course": 1,
+ "module": 1,
+ "instance": 1
+ }
+ ],
+ "quiz_attempts": [
+ {
+ "id": 1,
+ "quiz": 1,
+ "sumgrades": 50,
+ "state": "finished",
+ "timefinish": 1,
+ "timestart": 0
+ }
+ ],
+ "quiz": [
+ {
+ "id": 1,
+ "name": "test_quiz_name"
+ }
+ ],
+ "grade_items": [
+ {
+ "id": 1,
+ "iteminstance": 1,
+ "itemmodule": "quiz",
+ "grademin": 0,
+ "grademax": 100,
+ "gradepass": 50
+ }
+ ],
+ "question_attempts": [
+ {
+ "id": 1,
+ "questionusageid": 1,
+ "questionid": 1,
+ "questionsummary": "test_question",
+ "responsesummary": "test_answer"
+ }
+ ],
+ "question": [
+ {
+ "id": 1,
+ "qtype": "essay"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/tests/mod_quiz/attempt_submitted/existing_attempt_submitted/event.json b/tests/mod_quiz/attempt_submitted/essay/event.json
similarity index 87%
rename from tests/mod_quiz/attempt_submitted/existing_attempt_submitted/event.json
rename to tests/mod_quiz/attempt_submitted/essay/event.json
index 665267df3..0f8370b23 100644
--- a/tests/mod_quiz/attempt_submitted/existing_attempt_submitted/event.json
+++ b/tests/mod_quiz/attempt_submitted/essay/event.json
@@ -5,5 +5,6 @@
"timecreated": 1433946701,
"objecttable": "attempt",
"objectid": 1,
+ "contextinstanceid": 1,
"eventname": "\\mod_quiz\\event\\attempt_submitted"
}
\ No newline at end of file
diff --git a/tests/mod_quiz/attempt_submitted/essay/statements.json b/tests/mod_quiz/attempt_submitted/essay/statements.json
new file mode 100644
index 000000000..13a960436
--- /dev/null
+++ b/tests/mod_quiz/attempt_submitted/essay/statements.json
@@ -0,0 +1,187 @@
+[
+ {
+ "actor": {
+ "name": "test_fullname",
+ "account": {
+ "homePage": "http:\/\/www.example.org",
+ "name": "1"
+ }
+ },
+ "verb": {
+ "id": "http:\/\/adlnet.gov\/expapi\/verbs\/completed",
+ "display": {
+ "en": "completed"
+ }
+ },
+ "object": {
+ "id": "http:\/\/www.example.org\/mod\/quiz\/view.php?id=1",
+ "definition": {
+ "type": "http:\/\/id.tincanapi.com\/activitytype\/lms\/module",
+ "name": {
+ "en": "test_quiz_name"
+ }
+ }
+ },
+ "timestamp": "2015-06-10T15:31:41+01:00",
+ "result": {
+ "score": {
+ "raw": 50,
+ "min": 0,
+ "max": 100,
+ "scaled": 0.5
+ },
+ "completion": true,
+ "success": true,
+ "duration": "PT1S"
+ },
+ "context": {
+ "platform": "Moodle",
+ "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_quiz\\event\\attempt_submitted",
+ "event_function": "\\src\\transformer\\events\\mod_quiz\\attempt_submitted\\handler"
+ }
+ },
+ "contextActivities": {
+ "other": [
+ {
+ "id": "http:\/\/www.example.org\/mod\/attempt\/view.php?id=1",
+ "definition": {
+ "type": "http:\/\/id.tincanapi.com\/activitytype\/lms\/module",
+ "name": {
+ "en": "attempt"
+ }
+ }
+ }
+ ],
+ "grouping": [
+ {
+ "id": "http:\/\/www.example.org",
+ "definition": {
+ "type": "http:\/\/id.tincanapi.com\/activitytype\/lms",
+ "name": {
+ "en": "test_name"
+ }
+ }
+ },
+ {
+ "id": "http:\/\/www.example.org\/course\/view.php?id=1",
+ "definition": {
+ "type": "http:\/\/id.tincanapi.com\/activitytype\/lms\/course",
+ "name": {
+ "en": "test_name"
+ }
+ }
+ }
+ ],
+ "category": [
+ {
+ "id": "http:\/\/moodle.org",
+ "definition": {
+ "type": "http:\/\/id.tincanapi.com\/activitytype\/source",
+ "name": {
+ "en": "Moodle"
+ }
+ }
+ }
+ ]
+ }
+ }
+ },
+ {
+ "actor": {
+ "name": "test_fullname",
+ "account": {
+ "homePage": "http:\/\/www.example.org",
+ "name": "1"
+ }
+ },
+ "verb": {
+ "id": "http:\/\/adlnet.gov\/expapi\/verbs\/answered",
+ "display": {
+ "en": "answered"
+ }
+ },
+ "object": {
+ "id": "http:\/\/www.example.org\/question\/question.php?cmid=1&id=1",
+ "definition": {
+ "type": "http:\/\/adlnet.gov\/expapi\/activities\/question",
+ "name": {
+ "en": "test_question"
+ },
+ "interactionType": "long-fill-in"
+ }
+ },
+ "timestamp": "2015-06-10T15:31:41+01:00",
+ "result": {
+ "response": "test_answer",
+ "completion": true
+ },
+ "context": {
+ "platform": "Moodle",
+ "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_quiz\\event\\attempt_submitted",
+ "event_function": "\\src\\transformer\\events\\mod_quiz\\attempt_submitted\\handler"
+ }
+ },
+ "contextActivities": {
+ "grouping": [
+ {
+ "id": "http:\/\/www.example.org",
+ "definition": {
+ "type": "http:\/\/id.tincanapi.com\/activitytype\/lms",
+ "name": {
+ "en": "test_name"
+ }
+ }
+ },
+ {
+ "id": "http:\/\/www.example.org\/course\/view.php?id=1",
+ "definition": {
+ "type": "http:\/\/id.tincanapi.com\/activitytype\/lms\/course",
+ "name": {
+ "en": "test_name"
+ }
+ }
+ },
+ {
+ "id": "http:\/\/www.example.org\/mod\/quiz\/view.php?id=1",
+ "definition": {
+ "type": "http:\/\/id.tincanapi.com\/activitytype\/lms\/module",
+ "name": {
+ "en": "test_quiz_name"
+ }
+ }
+ },
+ {
+ "id": "http:\/\/www.example.org\/mod\/attempt\/view.php?id=1",
+ "definition": {
+ "type": "http:\/\/id.tincanapi.com\/activitytype\/lms\/module",
+ "name": {
+ "en": "attempt"
+ }
+ }
+ }
+ ],
+ "category": [
+ {
+ "id": "http:\/\/moodle.org",
+ "definition": {
+ "type": "http:\/\/id.tincanapi.com\/activitytype\/source",
+ "name": {
+ "en": "Moodle"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+]
\ No newline at end of file
diff --git a/tests/mod_quiz/attempt_submitted/existing_attempt_submitted/test.php b/tests/mod_quiz/attempt_submitted/essay/test.php
similarity index 92%
rename from tests/mod_quiz/attempt_submitted/existing_attempt_submitted/test.php
rename to tests/mod_quiz/attempt_submitted/essay/test.php
index d84959376..28a56ec51 100644
--- a/tests/mod_quiz/attempt_submitted/existing_attempt_submitted/test.php
+++ b/tests/mod_quiz/attempt_submitted/essay/test.php
@@ -14,7 +14,7 @@
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see .
-namespace tests\mod_quiz\attempt_submitted\existing_attempt_submitted;
+namespace tests\mod_quiz\attempt_submitted\essay;
defined('MOODLE_INTERNAL') || die();
class test extends \tests\xapi_test_case {
diff --git a/tests/mod_quiz/attempt_submitted/existing_attempt_submitted/data.json b/tests/mod_quiz/attempt_submitted/no_questions/data.json
similarity index 79%
rename from tests/mod_quiz/attempt_submitted/existing_attempt_submitted/data.json
rename to tests/mod_quiz/attempt_submitted/no_questions/data.json
index d0e5ba8ec..310e35a85 100644
--- a/tests/mod_quiz/attempt_submitted/existing_attempt_submitted/data.json
+++ b/tests/mod_quiz/attempt_submitted/no_questions/data.json
@@ -13,6 +13,14 @@
"lang": "en"
}
],
+ "course_modules": [
+ {
+ "id": 1,
+ "course": 1,
+ "module": 1,
+ "instance": 1
+ }
+ ],
"quiz_attempts": [
{
"id": 1,
@@ -38,5 +46,7 @@
"grademax": 100,
"gradepass": 50
}
- ]
+ ],
+ "question_attempts": [],
+ "question": []
}
\ No newline at end of file
diff --git a/tests/mod_quiz/attempt_submitted/no_questions/event.json b/tests/mod_quiz/attempt_submitted/no_questions/event.json
new file mode 100644
index 000000000..0f8370b23
--- /dev/null
+++ b/tests/mod_quiz/attempt_submitted/no_questions/event.json
@@ -0,0 +1,10 @@
+{
+ "id": 1,
+ "relateduserid": 1,
+ "courseid": 1,
+ "timecreated": 1433946701,
+ "objecttable": "attempt",
+ "objectid": 1,
+ "contextinstanceid": 1,
+ "eventname": "\\mod_quiz\\event\\attempt_submitted"
+}
\ No newline at end of file
diff --git a/tests/mod_quiz/attempt_submitted/existing_attempt_submitted/statements.json b/tests/mod_quiz/attempt_submitted/no_questions/statements.json
similarity index 98%
rename from tests/mod_quiz/attempt_submitted/existing_attempt_submitted/statements.json
rename to tests/mod_quiz/attempt_submitted/no_questions/statements.json
index 2dcfc4068..8a51be8f9 100644
--- a/tests/mod_quiz/attempt_submitted/existing_attempt_submitted/statements.json
+++ b/tests/mod_quiz/attempt_submitted/no_questions/statements.json
@@ -42,7 +42,7 @@
"http:\/\/moodle.org": "1.0.0",
"https:\/\/github.com\/xAPI-vle\/moodle-logstore_xapi": "0.0.0-development",
"event_name": "\\mod_quiz\\event\\attempt_submitted",
- "event_function": "\\src\\transformer\\events\\mod_quiz\\attempt_submitted"
+ "event_function": "\\src\\transformer\\events\\mod_quiz\\attempt_submitted\\handler"
}
},
"contextActivities": {
diff --git a/tests/mod_quiz/attempt_submitted/no_questions/test.php b/tests/mod_quiz/attempt_submitted/no_questions/test.php
new file mode 100644
index 000000000..9ac10434a
--- /dev/null
+++ b/tests/mod_quiz/attempt_submitted/no_questions/test.php
@@ -0,0 +1,24 @@
+.
+
+namespace tests\mod_quiz\attempt_submitted\no_questions;
+defined('MOODLE_INTERNAL') || die();
+
+class test extends \tests\xapi_test_case {
+ protected function get_test_dir() {
+ return __DIR__;
+ }
+}
\ No newline at end of file
diff --git a/tests/mod_quiz/attempt_submitted/unknown_qtype/data.json b/tests/mod_quiz/attempt_submitted/unknown_qtype/data.json
new file mode 100644
index 000000000..7bb846932
--- /dev/null
+++ b/tests/mod_quiz/attempt_submitted/unknown_qtype/data.json
@@ -0,0 +1,65 @@
+{
+ "user": [
+ {
+ "id": 1,
+ "firstname": "test_fullname",
+ "email": "test@test.com"
+ }
+ ],
+ "course": [
+ {
+ "id": 1,
+ "fullname": "test_name",
+ "lang": "en"
+ }
+ ],
+ "course_modules": [
+ {
+ "id": 1,
+ "course": 1,
+ "module": 1,
+ "instance": 1
+ }
+ ],
+ "quiz_attempts": [
+ {
+ "id": 1,
+ "quiz": 1,
+ "sumgrades": 50,
+ "state": "finished",
+ "timefinish": 1,
+ "timestart": 0
+ }
+ ],
+ "quiz": [
+ {
+ "id": 1,
+ "name": "test_quiz_name"
+ }
+ ],
+ "grade_items": [
+ {
+ "id": 1,
+ "iteminstance": 1,
+ "itemmodule": "quiz",
+ "grademin": 0,
+ "grademax": 100,
+ "gradepass": 50
+ }
+ ],
+ "question_attempts": [
+ {
+ "id": 1,
+ "questionusageid": 1,
+ "questionid": 1,
+ "questionsummary": "test_question",
+ "responsesummary": "test_answer"
+ }
+ ],
+ "question": [
+ {
+ "id": 1,
+ "qtype": "unknown"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/tests/mod_quiz/attempt_submitted/unknown_qtype/event.json b/tests/mod_quiz/attempt_submitted/unknown_qtype/event.json
new file mode 100644
index 000000000..0f8370b23
--- /dev/null
+++ b/tests/mod_quiz/attempt_submitted/unknown_qtype/event.json
@@ -0,0 +1,10 @@
+{
+ "id": 1,
+ "relateduserid": 1,
+ "courseid": 1,
+ "timecreated": 1433946701,
+ "objecttable": "attempt",
+ "objectid": 1,
+ "contextinstanceid": 1,
+ "eventname": "\\mod_quiz\\event\\attempt_submitted"
+}
\ No newline at end of file
diff --git a/tests/mod_quiz/attempt_submitted/unknown_qtype/statements.json b/tests/mod_quiz/attempt_submitted/unknown_qtype/statements.json
new file mode 100644
index 000000000..8a51be8f9
--- /dev/null
+++ b/tests/mod_quiz/attempt_submitted/unknown_qtype/statements.json
@@ -0,0 +1,94 @@
+[
+ {
+ "actor": {
+ "name": "test_fullname",
+ "account": {
+ "homePage": "http:\/\/www.example.org",
+ "name": "1"
+ }
+ },
+ "verb": {
+ "id": "http:\/\/adlnet.gov\/expapi\/verbs\/completed",
+ "display": {
+ "en": "completed"
+ }
+ },
+ "object": {
+ "id": "http:\/\/www.example.org\/mod\/quiz\/view.php?id=1",
+ "definition": {
+ "type": "http:\/\/id.tincanapi.com\/activitytype\/lms\/module",
+ "name": {
+ "en": "test_quiz_name"
+ }
+ }
+ },
+ "timestamp": "2015-06-10T15:31:41+01:00",
+ "result": {
+ "score": {
+ "raw": 50,
+ "min": 0,
+ "max": 100,
+ "scaled": 0.5
+ },
+ "completion": true,
+ "success": true,
+ "duration": "PT1S"
+ },
+ "context": {
+ "platform": "Moodle",
+ "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_quiz\\event\\attempt_submitted",
+ "event_function": "\\src\\transformer\\events\\mod_quiz\\attempt_submitted\\handler"
+ }
+ },
+ "contextActivities": {
+ "other": [
+ {
+ "id": "http:\/\/www.example.org\/mod\/attempt\/view.php?id=1",
+ "definition": {
+ "type": "http:\/\/id.tincanapi.com\/activitytype\/lms\/module",
+ "name": {
+ "en": "attempt"
+ }
+ }
+ }
+ ],
+ "grouping": [
+ {
+ "id": "http:\/\/www.example.org",
+ "definition": {
+ "type": "http:\/\/id.tincanapi.com\/activitytype\/lms",
+ "name": {
+ "en": "test_name"
+ }
+ }
+ },
+ {
+ "id": "http:\/\/www.example.org\/course\/view.php?id=1",
+ "definition": {
+ "type": "http:\/\/id.tincanapi.com\/activitytype\/lms\/course",
+ "name": {
+ "en": "test_name"
+ }
+ }
+ }
+ ],
+ "category": [
+ {
+ "id": "http:\/\/moodle.org",
+ "definition": {
+ "type": "http:\/\/id.tincanapi.com\/activitytype\/source",
+ "name": {
+ "en": "Moodle"
+ }
+ }
+ }
+ ]
+ }
+ }
+ }
+]
\ No newline at end of file
diff --git a/tests/mod_quiz/attempt_submitted/unknown_qtype/test.php b/tests/mod_quiz/attempt_submitted/unknown_qtype/test.php
new file mode 100644
index 000000000..93b4f0d1e
--- /dev/null
+++ b/tests/mod_quiz/attempt_submitted/unknown_qtype/test.php
@@ -0,0 +1,24 @@
+.
+
+namespace tests\mod_quiz\attempt_submitted\unknown_qtype;
+defined('MOODLE_INTERNAL') || die();
+
+class test extends \tests\xapi_test_case {
+ protected function get_test_dir() {
+ return __DIR__;
+ }
+}
\ No newline at end of file