qti 2.1.0 → 2.5.0

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 +5 -5
  2. data/lib/qti.rb +1 -0
  3. data/lib/qti/models/assessment_meta.rb +78 -3
  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_1/gba044ae1fc7cfd3dc413e0df695e0068/assessment_meta.xml +76 -0
  12. data/spec/fixtures/test_qti_1.2_canvas_extended_1/gba044ae1fc7cfd3dc413e0df695e0068/gba044ae1fc7cfd3dc413e0df695e0068.xml +17 -0
  13. data/spec/fixtures/test_qti_1.2_canvas_extended_1/imsmanifest.xml +39 -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 +104 -2
  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 -4
@@ -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
@@ -10,12 +10,6 @@ describe Qti::V1::Models::Interactions::CanvasMultipleDropdownInteraction do
10
10
  end
11
11
  end
12
12
 
13
- shared_examples_for 'blanks' do
14
- it 'returns the blanks' do
15
- expect(loaded_class.blanks).to eq(expected_blanks)
16
- end
17
- end
18
-
19
13
  shared_examples_for 'answers' do
20
14
  it 'returns the answers' do
21
15
  expect(loaded_class.answers.count).to eq answer_count
@@ -47,26 +41,6 @@ describe Qti::V1::Models::Interactions::CanvasMultipleDropdownInteraction do
47
41
  { id: '6951', position: 2, item_body: 'blue' }
48
42
  ]
49
43
  end
50
- let(:expected_blanks) do
51
- [
52
- {
53
- id: 'response_color1',
54
- choices:
55
- [
56
- { id: '6548', position: 2, item_body: 'red' },
57
- { id: '5550', position: 3, item_body: 'plaid' }
58
- ]
59
- },
60
- {
61
- id: 'response_color2',
62
- choices:
63
- [
64
- { id: '6951', position: 2, item_body: 'blue' },
65
- { id: '4500', position: 3, item_body: 'paisely' }
66
- ]
67
- }
68
- ]
69
- end
70
44
  let(:expected_stem_items) do
71
45
  [
72
46
  { id: 'stem_0', position: 1, type: 'text', value: '<div><p>Roses are ' },
@@ -97,7 +71,6 @@ describe Qti::V1::Models::Interactions::CanvasMultipleDropdownInteraction do
97
71
 
98
72
  include_examples 'shuffled?'
99
73
  include_examples 'answers'
100
- include_examples 'blanks'
101
74
  include_examples 'stem_items'
102
75
  include_examples 'scoring_data_structs'
103
76
  end
@@ -0,0 +1,39 @@
1
+ describe Qti::V1::Models::ObjectBank do
2
+ describe 'bank loading' do
3
+ [
4
+ 'gf3edf8167be16b3a65a00ca923132b07.xml.qti',
5
+ 'g195e078fb6e3c4054e38e5c9226287ba.xml.qti',
6
+ 'gab22de457404cb5cf022078f1e4da75e.xml.qti'
7
+ ].each do |bankfile|
8
+ file = File.join('spec', 'fixtures', 'with_banks', 'non_cc_assessments', bankfile)
9
+ context "File: #{file}" do
10
+ it 'parses the objectbank without error' do
11
+ expect do
12
+ bank = described_class.from_path!(file)
13
+ expect(bank.assessment_items) # at least one
14
+ end.not_to raise_error
15
+ end
16
+ end
17
+ end
18
+ end
19
+
20
+ describe '#title' do
21
+ it 'missing bank_title defaults to filename' do
22
+ allow(File).to receive(:read).and_return(<<~XML)
23
+ <?xml version="1.0" encoding="UTF-8"?>
24
+ <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">
25
+ <objectbank ident="gooblegobble12345">
26
+ <qtimetadata>
27
+ <qtimetadatafield>
28
+ <fieldlabel>not_a_bank_title</fieldlabel>
29
+ <fieldentry>A different metadata entry</fieldentry>
30
+ </qtimetadatafield>
31
+ </qtimetadata>
32
+ </objectbank>
33
+ </questestinterop>
34
+ XML
35
+ objectbank = described_class.new path: '/etc/FakeBank007.xml'
36
+ expect(objectbank.title).to eq 'FakeBank007'
37
+ end
38
+ end
39
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qti
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hannah Bottalla
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-11-12 00:00:00.000000000 Z
12
+ date: 2021-01-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: actionview
@@ -312,6 +312,7 @@ files:
312
312
  - lib/qti/v1/models/numerics/scoring_data.rb
313
313
  - lib/qti/v1/models/numerics/scoring_node.rb
314
314
  - lib/qti/v1/models/numerics/within_range.rb
315
+ - lib/qti/v1/models/object_bank.rb
315
316
  - lib/qti/v1/models/question_group.rb
316
317
  - lib/qti/v1/models/scoring_data.rb
317
318
  - lib/qti/v1/models/stimulus_item.rb
@@ -355,6 +356,7 @@ files:
355
356
  - spec/fixtures/items_1.2/canvas_multiple_dropdowns.xml
356
357
  - spec/fixtures/items_1.2/canvas_multiple_fib.xml
357
358
  - spec/fixtures/items_1.2/canvas_multiple_fib_as_single.xml
359
+ - spec/fixtures/items_1.2/canvas_multiple_fib_extra_brackets.xml
358
360
  - spec/fixtures/items_1.2/choice.xml
359
361
  - spec/fixtures/items_1.2/essay.xml
360
362
  - spec/fixtures/items_1.2/fib.xml
@@ -510,6 +512,12 @@ files:
510
512
  - spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/assessment_meta.xml
511
513
  - spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/i00f37ac2af026e5a607e4a5d9a70b1d5.xml
512
514
  - spec/fixtures/test_qti_1.2_canvas/imsmanifest.xml
515
+ - spec/fixtures/test_qti_1.2_canvas_extended_1/gba044ae1fc7cfd3dc413e0df695e0068/assessment_meta.xml
516
+ - spec/fixtures/test_qti_1.2_canvas_extended_1/gba044ae1fc7cfd3dc413e0df695e0068/gba044ae1fc7cfd3dc413e0df695e0068.xml
517
+ - spec/fixtures/test_qti_1.2_canvas_extended_1/imsmanifest.xml
518
+ - spec/fixtures/test_qti_1.2_canvas_extended_2/gba044ae1fc7cfd3dc413e0df695e0068/assessment_meta.xml
519
+ - spec/fixtures/test_qti_1.2_canvas_extended_2/gba044ae1fc7cfd3dc413e0df695e0068/gba044ae1fc7cfd3dc413e0df695e0068.xml
520
+ - spec/fixtures/test_qti_1.2_canvas_extended_2/imsmanifest.xml
513
521
  - spec/fixtures/test_qti_1.2_multi/i913965373124f56ca136e87deb040c03/assessment_meta.xml
514
522
  - spec/fixtures/test_qti_1.2_multi/i913965373124f56ca136e87deb040c03/i913965373124f56ca136e87deb040c03.xml
515
523
  - spec/fixtures/test_qti_1.2_multi/ife643a8a04b48b22acab95de6c01f1cc/assessment_meta.xml
@@ -598,6 +606,13 @@ files:
598
606
  - spec/fixtures/tests/tests/rtest26.xml
599
607
  - spec/fixtures/tests/tests/rtest27.xml
600
608
  - spec/fixtures/unsupported_version/imsmanifest.xml
609
+ - spec/fixtures/with_banks/g9a20cf3af178b54e4792cbe992f65790/assessment_meta.xml
610
+ - spec/fixtures/with_banks/g9a20cf3af178b54e4792cbe992f65790/assessment_qti.xml
611
+ - spec/fixtures/with_banks/imsmanifest.xml
612
+ - spec/fixtures/with_banks/non_cc_assessments/g195e078fb6e3c4054e38e5c9226287ba.xml.qti
613
+ - spec/fixtures/with_banks/non_cc_assessments/g9a20cf3af178b54e4792cbe992f65790.xml.qti
614
+ - spec/fixtures/with_banks/non_cc_assessments/gab22de457404cb5cf022078f1e4da75e.xml.qti
615
+ - spec/fixtures/with_banks/non_cc_assessments/gf3edf8167be16b3a65a00ca923132b07.xml.qti
601
616
  - spec/gemfiles/rails-5.1.gemfile
602
617
  - spec/gemfiles/rails-5.2.gemfile
603
618
  - spec/gemfiles/rails-6.0.gemfile
@@ -612,6 +627,7 @@ files:
612
627
  - spec/lib/qti/v1/models/assessment_spec.rb
613
628
  - spec/lib/qti/v1/models/choices/fill_blank_choice_spec.rb
614
629
  - spec/lib/qti/v1/models/choices/logical_identifier_choice_spec.rb
630
+ - spec/lib/qti/v1/models/interactions/base_fill_blank_interaction_spec.rb
615
631
  - spec/lib/qti/v1/models/interactions/base_interaction_spec.rb
616
632
  - spec/lib/qti/v1/models/interactions/canvas_multiple_dropdown_spec.rb
617
633
  - spec/lib/qti/v1/models/interactions/choice_interaction_spec.rb
@@ -629,6 +645,7 @@ files:
629
645
  - spec/lib/qti/v1/models/numerics/scoring_base_spec.rb
630
646
  - spec/lib/qti/v1/models/numerics/scoring_node_spec.rb
631
647
  - spec/lib/qti/v1/models/numerics/within_range_spec.rb
648
+ - spec/lib/qti/v1/models/object_bank_spec.rb
632
649
  - spec/lib/qti/v1/models/question_group_spec.rb
633
650
  - spec/lib/qti/v1/models/stimulus_item_spec.rb
634
651
  - spec/lib/qti/v2/models/assessment_item_spec.rb
@@ -668,8 +685,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
668
685
  - !ruby/object:Gem::Version
669
686
  version: '0'
670
687
  requirements: []
671
- rubyforge_project:
672
- rubygems_version: 2.6.14.4
688
+ rubygems_version: 3.0.3
673
689
  signing_key:
674
690
  specification_version: 4
675
691
  summary: QTI 1.2 and 2.1 import and export models
@@ -692,6 +708,7 @@ test_files:
692
708
  - spec/fixtures/items_1.2/canvas_multiple_dropdowns.xml
693
709
  - spec/fixtures/items_1.2/canvas_multiple_fib.xml
694
710
  - spec/fixtures/items_1.2/canvas_multiple_fib_as_single.xml
711
+ - spec/fixtures/items_1.2/canvas_multiple_fib_extra_brackets.xml
695
712
  - spec/fixtures/items_1.2/choice.xml
696
713
  - spec/fixtures/items_1.2/essay.xml
697
714
  - spec/fixtures/items_1.2/fib.xml
@@ -847,6 +864,12 @@ test_files:
847
864
  - spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/assessment_meta.xml
848
865
  - spec/fixtures/test_qti_1.2_canvas/i00f37ac2af026e5a607e4a5d9a70b1d5/i00f37ac2af026e5a607e4a5d9a70b1d5.xml
849
866
  - spec/fixtures/test_qti_1.2_canvas/imsmanifest.xml
867
+ - spec/fixtures/test_qti_1.2_canvas_extended_1/gba044ae1fc7cfd3dc413e0df695e0068/assessment_meta.xml
868
+ - spec/fixtures/test_qti_1.2_canvas_extended_1/gba044ae1fc7cfd3dc413e0df695e0068/gba044ae1fc7cfd3dc413e0df695e0068.xml
869
+ - spec/fixtures/test_qti_1.2_canvas_extended_1/imsmanifest.xml
870
+ - spec/fixtures/test_qti_1.2_canvas_extended_2/gba044ae1fc7cfd3dc413e0df695e0068/assessment_meta.xml
871
+ - spec/fixtures/test_qti_1.2_canvas_extended_2/gba044ae1fc7cfd3dc413e0df695e0068/gba044ae1fc7cfd3dc413e0df695e0068.xml
872
+ - spec/fixtures/test_qti_1.2_canvas_extended_2/imsmanifest.xml
850
873
  - spec/fixtures/test_qti_1.2_multi/i913965373124f56ca136e87deb040c03/assessment_meta.xml
851
874
  - spec/fixtures/test_qti_1.2_multi/i913965373124f56ca136e87deb040c03/i913965373124f56ca136e87deb040c03.xml
852
875
  - spec/fixtures/test_qti_1.2_multi/ife643a8a04b48b22acab95de6c01f1cc/assessment_meta.xml
@@ -935,6 +958,13 @@ test_files:
935
958
  - spec/fixtures/tests/tests/rtest26.xml
936
959
  - spec/fixtures/tests/tests/rtest27.xml
937
960
  - spec/fixtures/unsupported_version/imsmanifest.xml
961
+ - spec/fixtures/with_banks/g9a20cf3af178b54e4792cbe992f65790/assessment_meta.xml
962
+ - spec/fixtures/with_banks/g9a20cf3af178b54e4792cbe992f65790/assessment_qti.xml
963
+ - spec/fixtures/with_banks/imsmanifest.xml
964
+ - spec/fixtures/with_banks/non_cc_assessments/g195e078fb6e3c4054e38e5c9226287ba.xml.qti
965
+ - spec/fixtures/with_banks/non_cc_assessments/g9a20cf3af178b54e4792cbe992f65790.xml.qti
966
+ - spec/fixtures/with_banks/non_cc_assessments/gab22de457404cb5cf022078f1e4da75e.xml.qti
967
+ - spec/fixtures/with_banks/non_cc_assessments/gf3edf8167be16b3a65a00ca923132b07.xml.qti
938
968
  - spec/gemfiles/rails-5.1.gemfile
939
969
  - spec/gemfiles/rails-5.2.gemfile
940
970
  - spec/gemfiles/rails-6.0.gemfile
@@ -949,6 +979,7 @@ test_files:
949
979
  - spec/lib/qti/v1/models/assessment_spec.rb
950
980
  - spec/lib/qti/v1/models/choices/fill_blank_choice_spec.rb
951
981
  - spec/lib/qti/v1/models/choices/logical_identifier_choice_spec.rb
982
+ - spec/lib/qti/v1/models/interactions/base_fill_blank_interaction_spec.rb
952
983
  - spec/lib/qti/v1/models/interactions/base_interaction_spec.rb
953
984
  - spec/lib/qti/v1/models/interactions/canvas_multiple_dropdown_spec.rb
954
985
  - spec/lib/qti/v1/models/interactions/choice_interaction_spec.rb
@@ -966,6 +997,7 @@ test_files:
966
997
  - spec/lib/qti/v1/models/numerics/scoring_base_spec.rb
967
998
  - spec/lib/qti/v1/models/numerics/scoring_node_spec.rb
968
999
  - spec/lib/qti/v1/models/numerics/within_range_spec.rb
1000
+ - spec/lib/qti/v1/models/object_bank_spec.rb
969
1001
  - spec/lib/qti/v1/models/question_group_spec.rb
970
1002
  - spec/lib/qti/v1/models/stimulus_item_spec.rb
971
1003
  - spec/lib/qti/v2/models/assessment_item_spec.rb