qti 2.2.0 → 2.5.1

Sign up to get free protection for your applications and to get access to all the features.
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