qti 2.2.0 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. checksums.yaml +4 -4
  2. data/lib/qti.rb +1 -0
  3. data/lib/qti/models/assessment_meta.rb +16 -12
  4. data/lib/qti/models/resource.rb +26 -2
  5. data/lib/qti/v1/models/assessment_item.rb +4 -0
  6. data/lib/qti/v1/models/interactions/base_fill_blank_interaction.rb +33 -1
  7. data/lib/qti/v1/models/interactions/canvas_multiple_dropdown.rb +2 -29
  8. data/lib/qti/v1/models/object_bank.rb +14 -0
  9. data/lib/qti/version.rb +1 -1
  10. data/spec/fixtures/items_1.2/canvas_multiple_fib_extra_brackets.xml +244 -0
  11. data/spec/fixtures/{test_qti_1.2_canvas_extended → test_qti_1.2_canvas_extended_1}/gba044ae1fc7cfd3dc413e0df695e0068/assessment_meta.xml +0 -0
  12. data/spec/fixtures/{test_qti_1.2_canvas_extended → test_qti_1.2_canvas_extended_1}/gba044ae1fc7cfd3dc413e0df695e0068/gba044ae1fc7cfd3dc413e0df695e0068.xml +0 -0
  13. data/spec/fixtures/{test_qti_1.2_canvas_extended → test_qti_1.2_canvas_extended_1}/imsmanifest.xml +0 -0
  14. data/spec/fixtures/test_qti_1.2_canvas_extended_2/gba044ae1fc7cfd3dc413e0df695e0068/assessment_meta.xml +76 -0
  15. data/spec/fixtures/test_qti_1.2_canvas_extended_2/gba044ae1fc7cfd3dc413e0df695e0068/gba044ae1fc7cfd3dc413e0df695e0068.xml +17 -0
  16. data/spec/fixtures/test_qti_1.2_canvas_extended_2/imsmanifest.xml +39 -0
  17. data/spec/fixtures/with_banks/g9a20cf3af178b54e4792cbe992f65790/assessment_meta.xml +69 -0
  18. data/spec/fixtures/with_banks/g9a20cf3af178b54e4792cbe992f65790/assessment_qti.xml +99 -0
  19. data/spec/fixtures/with_banks/imsmanifest.xml +54 -0
  20. data/spec/fixtures/with_banks/non_cc_assessments/g195e078fb6e3c4054e38e5c9226287ba.xml.qti +85 -0
  21. data/spec/fixtures/with_banks/non_cc_assessments/g9a20cf3af178b54e4792cbe992f65790.xml.qti +107 -0
  22. data/spec/fixtures/with_banks/non_cc_assessments/gab22de457404cb5cf022078f1e4da75e.xml.qti +59 -0
  23. data/spec/fixtures/with_banks/non_cc_assessments/gf3edf8167be16b3a65a00ca923132b07.xml.qti +145 -0
  24. data/spec/lib/qti/models/assessment_meta_spec.rb +39 -1
  25. data/spec/lib/qti/models/resource_spec.rb +14 -0
  26. data/spec/lib/qti/v1/models/interactions/base_fill_blank_interaction_spec.rb +146 -0
  27. data/spec/lib/qti/v1/models/interactions/canvas_multiple_dropdown_spec.rb +0 -27
  28. data/spec/lib/qti/v1/models/object_bank_spec.rb +39 -0
  29. metadata +36 -9
@@ -0,0 +1,107 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <questestinterop xmlns="http://www.imsglobal.org/xsd/ims_qtiasiv1p2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.imsglobal.org/xsd/ims_qtiasiv1p2 http://www.imsglobal.org/xsd/ims_qtiasiv1p2p1.xsd">
3
+ <assessment ident="g9a20cf3af178b54e4792cbe992f65790" title="Some Old Quiz">
4
+ <qtimetadata>
5
+ <qtimetadatafield>
6
+ <fieldlabel>cc_maxattempts</fieldlabel>
7
+ <fieldentry>1</fieldentry>
8
+ </qtimetadatafield>
9
+ </qtimetadata>
10
+ <section ident="root_section">
11
+ <item ident="g067eae0eb6c36be5b3386c35c2cdfa14" title="Question">
12
+ <itemmetadata>
13
+ <qtimetadata>
14
+ <qtimetadatafield>
15
+ <fieldlabel>question_type</fieldlabel>
16
+ <fieldentry>true_false_question</fieldentry>
17
+ </qtimetadatafield>
18
+ <qtimetadatafield>
19
+ <fieldlabel>points_possible</fieldlabel>
20
+ <fieldentry>1.0</fieldentry>
21
+ </qtimetadatafield>
22
+ <qtimetadatafield>
23
+ <fieldlabel>original_answer_ids</fieldlabel>
24
+ <fieldentry>5972,5959</fieldentry>
25
+ </qtimetadatafield>
26
+ <qtimetadatafield>
27
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
28
+ <fieldentry>gb11064031e54bbf6bf076a722e0ac941</fieldentry>
29
+ </qtimetadatafield>
30
+ </qtimetadata>
31
+ </itemmetadata>
32
+ <presentation>
33
+ <material>
34
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;Is this an old quiz?&lt;/p&gt;&lt;/div&gt;</mattext>
35
+ </material>
36
+ <response_lid ident="response1" rcardinality="Single">
37
+ <render_choice>
38
+ <response_label ident="5972">
39
+ <material>
40
+ <mattext texttype="text/plain">True</mattext>
41
+ </material>
42
+ </response_label>
43
+ <response_label ident="5959">
44
+ <material>
45
+ <mattext texttype="text/plain">False</mattext>
46
+ </material>
47
+ </response_label>
48
+ </render_choice>
49
+ </response_lid>
50
+ </presentation>
51
+ <resprocessing>
52
+ <outcomes>
53
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
54
+ </outcomes>
55
+ <respcondition continue="No">
56
+ <conditionvar>
57
+ <varequal respident="response1">5972</varequal>
58
+ </conditionvar>
59
+ <setvar action="Set" varname="SCORE">100</setvar>
60
+ </respcondition>
61
+ </resprocessing>
62
+ </item>
63
+ <item ident="g566842feff3b50f778290f11021b365e" title="Question">
64
+ <itemmetadata>
65
+ <qtimetadata>
66
+ <qtimetadatafield>
67
+ <fieldlabel>question_type</fieldlabel>
68
+ <fieldentry>essay_question</fieldentry>
69
+ </qtimetadatafield>
70
+ <qtimetadatafield>
71
+ <fieldlabel>points_possible</fieldlabel>
72
+ <fieldentry>1.0</fieldentry>
73
+ </qtimetadatafield>
74
+ <qtimetadatafield>
75
+ <fieldlabel>original_answer_ids</fieldlabel>
76
+ <fieldentry></fieldentry>
77
+ </qtimetadatafield>
78
+ <qtimetadatafield>
79
+ <fieldlabel>assessment_question_identifierref</fieldlabel>
80
+ <fieldentry>gfc230151001d8b7ba5325da6b895c0e3</fieldentry>
81
+ </qtimetadatafield>
82
+ </qtimetadata>
83
+ </itemmetadata>
84
+ <presentation>
85
+ <material>
86
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;Write an essay about banks&lt;/p&gt;&lt;/div&gt;</mattext>
87
+ </material>
88
+ <response_str ident="response1" rcardinality="Single">
89
+ <render_fib>
90
+ <response_label ident="answer1" rshuffle="No"/>
91
+ </render_fib>
92
+ </response_str>
93
+ </presentation>
94
+ <resprocessing>
95
+ <outcomes>
96
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
97
+ </outcomes>
98
+ <respcondition continue="No">
99
+ <conditionvar>
100
+ <other/>
101
+ </conditionvar>
102
+ </respcondition>
103
+ </resprocessing>
104
+ </item>
105
+ </section>
106
+ </assessment>
107
+ </questestinterop>
@@ -0,0 +1,59 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <questestinterop xmlns="http://www.imsglobal.org/xsd/ims_qtiasiv1p2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.imsglobal.org/xsd/ims_qtiasiv1p2 http://www.imsglobal.org/xsd/ims_qtiasiv1p2p1.xsd">
3
+ <objectbank ident="gab22de457404cb5cf022078f1e4da75e">
4
+ <qtimetadata>
5
+ <qtimetadatafield>
6
+ <fieldlabel>bank_title</fieldlabel>
7
+ <fieldentry>Unfiled Questions</fieldentry>
8
+ </qtimetadatafield>
9
+ </qtimetadata>
10
+ <item ident="gb11064031e54bbf6bf076a722e0ac941" title="Question">
11
+ <itemmetadata>
12
+ <qtimetadata>
13
+ <qtimetadatafield>
14
+ <fieldlabel>question_type</fieldlabel>
15
+ <fieldentry>true_false_question</fieldentry>
16
+ </qtimetadatafield>
17
+ <qtimetadatafield>
18
+ <fieldlabel>points_possible</fieldlabel>
19
+ <fieldentry>1.0</fieldentry>
20
+ </qtimetadatafield>
21
+ <qtimetadatafield>
22
+ <fieldlabel>original_answer_ids</fieldlabel>
23
+ <fieldentry>5972,5959</fieldentry>
24
+ </qtimetadatafield>
25
+ </qtimetadata>
26
+ </itemmetadata>
27
+ <presentation>
28
+ <material>
29
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;Is this an old quiz?&lt;/p&gt;&lt;/div&gt;</mattext>
30
+ </material>
31
+ <response_lid ident="response1" rcardinality="Single">
32
+ <render_choice>
33
+ <response_label ident="5972">
34
+ <material>
35
+ <mattext texttype="text/plain">True</mattext>
36
+ </material>
37
+ </response_label>
38
+ <response_label ident="5959">
39
+ <material>
40
+ <mattext texttype="text/plain">False</mattext>
41
+ </material>
42
+ </response_label>
43
+ </render_choice>
44
+ </response_lid>
45
+ </presentation>
46
+ <resprocessing>
47
+ <outcomes>
48
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
49
+ </outcomes>
50
+ <respcondition continue="No">
51
+ <conditionvar>
52
+ <varequal respident="response1">5972</varequal>
53
+ </conditionvar>
54
+ <setvar action="Set" varname="SCORE">100</setvar>
55
+ </respcondition>
56
+ </resprocessing>
57
+ </item>
58
+ </objectbank>
59
+ </questestinterop>
@@ -0,0 +1,145 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <questestinterop xmlns="http://www.imsglobal.org/xsd/ims_qtiasiv1p2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.imsglobal.org/xsd/ims_qtiasiv1p2 http://www.imsglobal.org/xsd/ims_qtiasiv1p2p1.xsd">
3
+ <objectbank ident="gf3edf8167be16b3a65a00ca923132b07">
4
+ <qtimetadata>
5
+ <qtimetadatafield>
6
+ <fieldlabel>bank_title</fieldlabel>
7
+ <fieldentry>First Bank</fieldentry>
8
+ </qtimetadatafield>
9
+ </qtimetadata>
10
+ <item ident="gfc230151001d8b7ba5325da6b895c0e3" title="Question">
11
+ <itemmetadata>
12
+ <qtimetadata>
13
+ <qtimetadatafield>
14
+ <fieldlabel>question_type</fieldlabel>
15
+ <fieldentry>essay_question</fieldentry>
16
+ </qtimetadatafield>
17
+ <qtimetadatafield>
18
+ <fieldlabel>points_possible</fieldlabel>
19
+ <fieldentry>1.0</fieldentry>
20
+ </qtimetadatafield>
21
+ <qtimetadatafield>
22
+ <fieldlabel>original_answer_ids</fieldlabel>
23
+ <fieldentry></fieldentry>
24
+ </qtimetadatafield>
25
+ </qtimetadata>
26
+ </itemmetadata>
27
+ <presentation>
28
+ <material>
29
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;Write an essay about banks&lt;/p&gt;&lt;/div&gt;</mattext>
30
+ </material>
31
+ <response_str ident="response1" rcardinality="Single">
32
+ <render_fib>
33
+ <response_label ident="answer1" rshuffle="No"/>
34
+ </render_fib>
35
+ </response_str>
36
+ </presentation>
37
+ <resprocessing>
38
+ <outcomes>
39
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
40
+ </outcomes>
41
+ <respcondition continue="No">
42
+ <conditionvar>
43
+ <other/>
44
+ </conditionvar>
45
+ </respcondition>
46
+ </resprocessing>
47
+ </item>
48
+ <item ident="ga9b15165c2d169765d9a7583be507cf7" title="Question">
49
+ <itemmetadata>
50
+ <qtimetadata>
51
+ <qtimetadatafield>
52
+ <fieldlabel>question_type</fieldlabel>
53
+ <fieldentry>multiple_choice_question</fieldentry>
54
+ </qtimetadatafield>
55
+ <qtimetadatafield>
56
+ <fieldlabel>points_possible</fieldlabel>
57
+ <fieldentry>1.0</fieldentry>
58
+ </qtimetadatafield>
59
+ <qtimetadatafield>
60
+ <fieldlabel>original_answer_ids</fieldlabel>
61
+ <fieldentry>1999,9339</fieldentry>
62
+ </qtimetadatafield>
63
+ </qtimetadata>
64
+ </itemmetadata>
65
+ <presentation>
66
+ <material>
67
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;Pick the vowel&lt;/p&gt;&lt;/div&gt;</mattext>
68
+ </material>
69
+ <response_lid ident="response1" rcardinality="Single">
70
+ <render_choice>
71
+ <response_label ident="1999">
72
+ <material>
73
+ <mattext texttype="text/plain">E</mattext>
74
+ </material>
75
+ </response_label>
76
+ <response_label ident="9339">
77
+ <material>
78
+ <mattext texttype="text/plain">G</mattext>
79
+ </material>
80
+ </response_label>
81
+ </render_choice>
82
+ </response_lid>
83
+ </presentation>
84
+ <resprocessing>
85
+ <outcomes>
86
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
87
+ </outcomes>
88
+ <respcondition continue="No">
89
+ <conditionvar>
90
+ <varequal respident="response1">1999</varequal>
91
+ </conditionvar>
92
+ <setvar action="Set" varname="SCORE">100</setvar>
93
+ </respcondition>
94
+ </resprocessing>
95
+ </item>
96
+ <item ident="g67e8c6bbb51f71dd55ac0d0cbf460e3f" title="Question">
97
+ <itemmetadata>
98
+ <qtimetadata>
99
+ <qtimetadatafield>
100
+ <fieldlabel>question_type</fieldlabel>
101
+ <fieldentry>true_false_question</fieldentry>
102
+ </qtimetadatafield>
103
+ <qtimetadatafield>
104
+ <fieldlabel>points_possible</fieldlabel>
105
+ <fieldentry>1.0</fieldentry>
106
+ </qtimetadatafield>
107
+ <qtimetadatafield>
108
+ <fieldlabel>original_answer_ids</fieldlabel>
109
+ <fieldentry>7085,6110</fieldentry>
110
+ </qtimetadatafield>
111
+ </qtimetadata>
112
+ </itemmetadata>
113
+ <presentation>
114
+ <material>
115
+ <mattext texttype="text/html">&lt;div&gt;&lt;p&gt;Is this question in a bank?&lt;/p&gt;&lt;/div&gt;</mattext>
116
+ </material>
117
+ <response_lid ident="response1" rcardinality="Single">
118
+ <render_choice>
119
+ <response_label ident="7085">
120
+ <material>
121
+ <mattext texttype="text/plain">True</mattext>
122
+ </material>
123
+ </response_label>
124
+ <response_label ident="6110">
125
+ <material>
126
+ <mattext texttype="text/plain">False</mattext>
127
+ </material>
128
+ </response_label>
129
+ </render_choice>
130
+ </response_lid>
131
+ </presentation>
132
+ <resprocessing>
133
+ <outcomes>
134
+ <decvar maxvalue="100" minvalue="0" varname="SCORE" vartype="Decimal"/>
135
+ </outcomes>
136
+ <respcondition continue="No">
137
+ <conditionvar>
138
+ <varequal respident="response1">7085</varequal>
139
+ </conditionvar>
140
+ <setvar action="Set" varname="SCORE">100</setvar>
141
+ </respcondition>
142
+ </resprocessing>
143
+ </item>
144
+ </objectbank>
145
+ </questestinterop>
@@ -27,6 +27,7 @@ context 'Canvas Assessment Meta Data' do
27
27
  expect(assessment.canvas_access_code).to eq(access_code)
28
28
  expect(assessment.canvas_ip_filter).to eq(ip_filter)
29
29
  expect(assessment.canvas_time_limit).to eq(time_limit)
30
+ expect(assessment.canvas_show_correct_answers?).to eq(show_answers)
30
31
  expect(assessment.canvas_show_correct_answers_at).to eq(show_answers_at)
31
32
  expect(assessment.canvas_hide_correct_answers_at).to eq(hide_answers_at)
32
33
  expect(assessment.canvas_require_lockdown_browser?).to eq(rlb)
@@ -59,6 +60,7 @@ context 'Canvas Assessment Meta Data' do
59
60
  let(:access_code) { nil }
60
61
  let(:ip_filter) { nil }
61
62
  let(:time_limit) { nil }
63
+ let(:show_answers) { true }
62
64
  let(:show_answers_at) { nil }
63
65
  let(:hide_answers_at) { nil }
64
66
  let(:rlb) { false }
@@ -70,7 +72,7 @@ context 'Canvas Assessment Meta Data' do
70
72
  end
71
73
 
72
74
  describe 'in a QTI 1.2 container with extended fields' do
73
- let(:qti_file) { 'test_qti_1.2_canvas_extended' }
75
+ let(:qti_file) { 'test_qti_1.2_canvas_extended_1' }
74
76
  let(:assessment_type) { Qti::V1::Models::Assessment }
75
77
  let(:title) { 'asd09sdfaxsdflj' }
76
78
  let(:instructions) { '<p>dlkjfaflkjla3rlajl3lafd</p>' }
@@ -92,6 +94,7 @@ context 'Canvas Assessment Meta Data' do
92
94
  let(:access_code) { '98aAlfmxtw#!£$s' }
93
95
  let(:ip_filter) { '192.168.217.1/24' }
94
96
  let(:time_limit) { 187 }
97
+ let(:show_answers) { true }
95
98
  let(:show_answers_at) { '2041-02-17 06:00:00 UTC' }
96
99
  let(:hide_answers_at) { '2042-12-26 06:00:00 UTC' }
97
100
  let(:rlb) { false }
@@ -102,6 +105,40 @@ context 'Canvas Assessment Meta Data' do
102
105
  include_examples('loads canvas meta data')
103
106
  end
104
107
 
108
+ describe 'in a QTI 1.2 container with extended fields and empty tags' do
109
+ let(:qti_file) { 'test_qti_1.2_canvas_extended_2' }
110
+ let(:assessment_type) { Qti::V1::Models::Assessment }
111
+ let(:title) { '' }
112
+ let(:instructions) { '' }
113
+ let(:points_possible) { 0.0 }
114
+ let(:oqaat) { false }
115
+ let(:allowed_attempts) { 0 }
116
+ let(:hide_results) { nil }
117
+ let(:quiz_type) { nil }
118
+ let('anon_submissions') { false }
119
+ let(:could_be_locked) { false }
120
+ let(:nobacktracking) { false }
121
+ let(:available) { false }
122
+ let(:one_time_results) { false }
123
+ let(:scoring_policy) { nil }
124
+ let(:shuffle_answers) { false }
125
+ let(:lock_at) { nil }
126
+ let(:unlock_at) { nil }
127
+ let(:due_at) { nil }
128
+ let(:access_code) { nil }
129
+ let(:ip_filter) { nil }
130
+ let(:time_limit) { nil }
131
+ let(:show_answers) { false }
132
+ let(:show_answers_at) { nil }
133
+ let(:hide_answers_at) { nil }
134
+ let(:rlb) { false }
135
+ let(:rlb_results) { false }
136
+ let(:rlb_monitor) { false }
137
+ let(:lb_monitor_data) { nil }
138
+
139
+ include_examples('loads canvas meta data')
140
+ end
141
+
105
142
  describe 'in a Common Cartridge container' do
106
143
  let(:qti_file) { 'test_imscc_canvas' }
107
144
  let(:assessment_type) { Qti::V1::Models::Assessment }
@@ -125,6 +162,7 @@ context 'Canvas Assessment Meta Data' do
125
162
  let(:access_code) { nil }
126
163
  let(:ip_filter) { nil }
127
164
  let(:time_limit) { nil }
165
+ let(:show_answers) { true }
128
166
  let(:show_answers_at) { nil }
129
167
  let(:hide_answers_at) { nil }
130
168
  let(:rlb) { false }
@@ -48,4 +48,18 @@ describe Qti::Models::Manifest do
48
48
  expect(assessment_test.assessment_items.first[:resource]).not_to eq(nil)
49
49
  end
50
50
  end
51
+
52
+ describe 'object banks' do
53
+ file = File.join(fixtures_path, 'with_banks/imsmanifest.xml')
54
+ manifest = described_class.from_path!(file)
55
+
56
+ it 'has associated content' do
57
+ expect(manifest.associated_content_list.count).to eq(4)
58
+ end
59
+
60
+ it 'loads objectbanks' do
61
+ expect(manifest.objectbanks.count).to eq(3)
62
+ expect(manifest.objectbanks.first).to be_kind_of(Qti::V1::Models::ObjectBank)
63
+ end
64
+ end
51
65
  end
@@ -0,0 +1,146 @@
1
+ describe Qti::V1::Models::Interactions::BaseFillBlankInteraction do
2
+ let(:fixtures_path) { File.join('spec', 'fixtures', 'items_1.2') }
3
+ let(:test_object) { Qti::V1::Models::Assessment.from_path!(file_path) }
4
+ let(:assessment_item_refs) { test_object.assessment_items }
5
+ let(:loaded_class) { described_class.new(assessment_item_refs.first, test_object) }
6
+
7
+ shared_examples_for 'canvas_fib_responses' do
8
+ it 'returns the canvas_fib_responses' do
9
+ expect(loaded_class.canvas_fib_responses).to eq(expected_blanks)
10
+ end
11
+ end
12
+
13
+ context 'canvas_multiple_dropdowns.xml' do
14
+ let(:file_path) { File.join(fixtures_path, 'canvas_multiple_dropdowns.xml') }
15
+ let(:expected_blanks) do
16
+ [
17
+ {
18
+ id: 'response_color1',
19
+ choices:
20
+ [
21
+ { id: '6548', position: 2, item_body: 'red' },
22
+ { id: '5550', position: 3, item_body: 'plaid' }
23
+ ]
24
+ },
25
+ {
26
+ id: 'response_color2',
27
+ choices:
28
+ [
29
+ { id: '6951', position: 2, item_body: 'blue' },
30
+ { id: '4500', position: 3, item_body: 'paisely' }
31
+ ]
32
+ }
33
+ ]
34
+ end
35
+
36
+ include_examples 'canvas_fib_responses'
37
+ end
38
+
39
+ context 'canvas_multiple_fib.xml' do
40
+ let(:file_path) { File.join(fixtures_path, 'canvas_multiple_fib.xml') }
41
+ let(:expected_blanks) do
42
+ [
43
+ {
44
+ id: 'response_color1',
45
+ choices:
46
+ [
47
+ { id: '9799', item_body: 'red', position: 2 },
48
+ { id: '5231', item_body: 'Red', position: 3 }
49
+ ]
50
+ },
51
+ {
52
+ id: 'response_color2',
53
+ choices:
54
+ [
55
+ { id: '5939', item_body: 'blue', position: 2 },
56
+ { id: '6364', item_body: 'Blue', position: 3 }
57
+ ]
58
+ }
59
+ ]
60
+ end
61
+
62
+ include_examples 'canvas_fib_responses'
63
+ end
64
+
65
+ context 'canvas multiple fill in the blank questions with a single blank' do
66
+ let(:file_path) { File.join(fixtures_path, 'canvas_multiple_fib_as_single.xml') }
67
+ let(:expected_blanks) do
68
+ [
69
+ {
70
+ id: 'response_word',
71
+ choices:
72
+ [
73
+ { id: '3537', item_body: 'word', position: 2 }
74
+ ]
75
+ }
76
+ ]
77
+ end
78
+
79
+ include_examples 'canvas_fib_responses'
80
+ end
81
+
82
+ context 'canvas multiple fill in the blank questions with a single blank' do
83
+ let(:file_path) { File.join(fixtures_path, 'canvas_multiple_fib_extra_brackets.xml') }
84
+ let(:expected_blanks) do
85
+ [
86
+ {
87
+ id: 'response_1',
88
+ choices:
89
+ [
90
+ { id: '8464', item_body: 'A', position: 2 },
91
+ { id: '265', item_body: 'B', position: 3 },
92
+ { id: '3002', item_body: 'C', position: 4 },
93
+ { id: '1356', item_body: 'D', position: 5 },
94
+ { id: '5614', item_body: 'E', position: 6 }
95
+ ]
96
+ },
97
+ {
98
+ id: 'response_2',
99
+ choices:
100
+ [
101
+ { id: '4002', item_body: 'A', position: 2 },
102
+ { id: '8630', item_body: 'B', position: 3 },
103
+ { id: '7844', item_body: 'C', position: 4 },
104
+ { id: '3602', item_body: 'D', position: 5 },
105
+ { id: '9525', item_body: 'E', position: 6 }
106
+ ]
107
+ },
108
+ {
109
+ id: 'response_3',
110
+ choices:
111
+ [
112
+ { id: '8390', item_body: 'A', position: 2 },
113
+ { id: '8745', item_body: 'B', position: 3 },
114
+ { id: '3760', item_body: 'C', position: 4 },
115
+ { id: '7542', item_body: 'D', position: 5 },
116
+ { id: '1523', item_body: 'E', position: 6 }
117
+ ]
118
+ },
119
+ {
120
+ id: 'response_4',
121
+ choices:
122
+ [
123
+ { id: '3317', item_body: 'A', position: 2 },
124
+ { id: '6768', item_body: 'B', position: 3 },
125
+ { id: '5823', item_body: 'C', position: 4 },
126
+ { id: '2492', item_body: 'D', position: 5 },
127
+ { id: '4494', item_body: 'E', position: 6 }
128
+ ]
129
+ },
130
+ {
131
+ id: 'response_5',
132
+ choices:
133
+ [
134
+ { id: '6742', item_body: 'A', position: 2 },
135
+ { id: '794', item_body: 'B', position: 3 },
136
+ { id: '4259', item_body: 'C', position: 4 },
137
+ { id: '4851', item_body: 'D', position: 5 },
138
+ { id: '8574', item_body: 'E', position: 6 }
139
+ ]
140
+ }
141
+ ]
142
+ end
143
+
144
+ include_examples 'canvas_fib_responses'
145
+ end
146
+ end