qti 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/qti/assessment_item_exporter.rb +13 -11
- data/lib/qti/exporter.rb +16 -12
- data/spec/lib/qti/assessment_item_exporter_spec.rb +48 -0
- data/spec/lib/qti/exporter_spec.rb +91 -0
- data/spec/{qti → lib/qti}/models/base_spec.rb +0 -0
- data/spec/{qti → lib/qti}/models/manifest_spec.rb +0 -0
- data/spec/{qti → lib/qti}/v1/models/assessment_item_spec.rb +0 -0
- data/spec/{qti → lib/qti}/v1/models/assessment_spec.rb +0 -0
- data/spec/{qti → lib/qti}/v1/models/choices/logical_identifier_choice_spec.rb +0 -0
- data/spec/{qti → lib/qti}/v1/models/interactions/logical_identifier_interaction_spec.rb +0 -0
- data/spec/{qti → lib/qti}/v2/models/assessment_item_spec.rb +0 -0
- data/spec/{qti → lib/qti}/v2/models/assessment_test_spec.rb +0 -0
- data/spec/{qti → lib/qti}/v2/models/choices/simple_choice_spec.rb +0 -0
- data/spec/{qti → lib/qti}/v2/models/interactions/choice_interaction_spec.rb +0 -0
- data/spec/{qti → lib/qti}/v2/models/interactions/extended_text_interaction_spec.rb +0 -0
- data/spec/{qti_spec.rb → lib/qti_spec.rb} +0 -0
- data/spec/spec_helper.rb +2 -1
- data/spec/support/custom_matchers.rb +42 -0
- metadata +32 -30
- data/lib/qti/item_exporter_factory.rb +0 -15
- data/lib/qti/true_false_item_exporter.rb +0 -7
- data/spec/qti/exporter_spec.rb +0 -55
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: afd52bad22c9796edfbb8fd2fe412c955b0099a7
|
4
|
+
data.tar.gz: 73018306444c63ced0e4f45cc4b7d6a21a40ec99
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c96942dbe69be8e0bcedc61fd42d606d9d7d0cb14612d7d50e80dc17b52e1a363db023e0ba818e2c9bd533862cc25c9fa9ef68af5f5c1cd2c8e7af472fbd09c5
|
7
|
+
data.tar.gz: e6d932d96f046715d18fac372b095c01a416f300bb1383bef7b6f609ad51bb7bc52e86d9fda7d968b14ced89ccc7ab2631003dd8337c13f37597376b53417c86
|
@@ -1,23 +1,26 @@
|
|
1
1
|
module Qti
|
2
2
|
class AssessmentItemExporter
|
3
|
-
attr_reader :
|
3
|
+
attr_reader :assessment_item, :package_root_path, :exported_file_path
|
4
4
|
|
5
|
-
def initialize(
|
6
|
-
@index = index
|
5
|
+
def initialize(assessment_item, args = {})
|
7
6
|
@assessment_item = assessment_item
|
8
7
|
@package_root_path = args[:package_root_path] || '.'
|
9
8
|
end
|
10
9
|
|
10
|
+
def exported_file_path
|
11
|
+
@exported_file_path ||= File.join(package_root_path, "#{assessment_item.identifier}.xml")
|
12
|
+
end
|
13
|
+
|
11
14
|
def export
|
12
|
-
File.open(
|
13
|
-
f.write xml_string_for_assessment_item
|
15
|
+
File.open(exported_file_path, 'wb') do |f|
|
16
|
+
f.write xml_string_for_assessment_item
|
14
17
|
end
|
15
18
|
end
|
16
19
|
|
17
20
|
private
|
18
21
|
|
19
|
-
def xml_string_for_assessment_item
|
20
|
-
|
22
|
+
def xml_string_for_assessment_item
|
23
|
+
Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
|
21
24
|
xml.assessmentItem(assesment_item_attributes) do
|
22
25
|
xml.responseDeclaration('identifier' => 'RESPONSE',
|
23
26
|
'cardinality' => cardinality_for_response(assessment_item),
|
@@ -28,8 +31,7 @@ module Qti
|
|
28
31
|
end
|
29
32
|
xml_assessment_item_body(xml, assessment_item)
|
30
33
|
end
|
31
|
-
end
|
32
|
-
builder.to_xml
|
34
|
+
end.to_xml
|
33
35
|
end
|
34
36
|
|
35
37
|
def cardinality_for_response(assessment_item)
|
@@ -60,8 +62,8 @@ module Qti
|
|
60
62
|
def assesment_item_attributes
|
61
63
|
{ 'xmlns' => 'http://www.imsglobal.org/xsd/imsqti_v2p2', 'xmlns:xi' => 'http://www.w3.org/2001/XInclude',
|
62
64
|
'xmlns:m' => 'http://www.w3.org/1998/Math/MathML', 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
63
|
-
'xsi:schemaLocation' => 'http://www.imsglobal.org/xsd/imsqti_v2p2
|
64
|
-
|
65
|
+
'xsi:schemaLocation' => 'http://www.imsglobal.org/xsd/imsqti_v2p2 ' \
|
66
|
+
'http://www.imsglobal.org/xsd/qti/qtiv2p2/imsqti_v2p2.xsd' }
|
65
67
|
end
|
66
68
|
end
|
67
69
|
end
|
data/lib/qti/exporter.rb
CHANGED
@@ -29,18 +29,20 @@ module Qti
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def create_assessment_xml
|
32
|
-
|
32
|
+
File.open(File.join(package_root_path, 'assessment.xml'), 'wb') do |f|
|
33
|
+
f.write assessment_xml_string
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def assessment_xml_string
|
38
|
+
Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
|
33
39
|
xml.assessmentTest(assesment_test_attributes(title: assessment_test.title)) do
|
34
40
|
outcome_declarations(xml, assessment_test)
|
35
41
|
xml.testPart do
|
36
42
|
xml_assessment_section(xml)
|
37
43
|
end
|
38
44
|
end
|
39
|
-
end
|
40
|
-
|
41
|
-
File.open(File.join(package_root_path, 'assessment.xml'), 'wb') do |f|
|
42
|
-
f.write builder.to_xml
|
43
|
-
end
|
45
|
+
end.to_xml
|
44
46
|
end
|
45
47
|
|
46
48
|
def outcome_declarations(xml, assessment_test)
|
@@ -56,9 +58,11 @@ module Qti
|
|
56
58
|
end
|
57
59
|
|
58
60
|
def xml_assessment_section(xml)
|
59
|
-
|
60
|
-
|
61
|
-
|
61
|
+
unless assessment_test.items.empty?
|
62
|
+
xml.assessmentSection('identifier' => 'S1', 'visible' => 'true', 'title' => 'Section 1') do
|
63
|
+
assessment_test.items.each do |item|
|
64
|
+
xml.assessmentItemRef('identifier' => item.identifier, 'href' => "#{item.identifier}.xml")
|
65
|
+
end
|
62
66
|
end
|
63
67
|
end
|
64
68
|
end
|
@@ -123,15 +127,15 @@ module Qti
|
|
123
127
|
end
|
124
128
|
|
125
129
|
def export_items
|
126
|
-
assessment_test.items.
|
127
|
-
Qti::AssessmentItemExporter.new(
|
130
|
+
assessment_test.items.each do |assessment_item|
|
131
|
+
Qti::AssessmentItemExporter.new(assessment_item, package_root_path: package_root_path).export
|
128
132
|
end
|
129
133
|
end
|
130
134
|
|
131
135
|
def assesment_test_attributes(args = {})
|
132
136
|
{ 'xmlns' => 'http://www.imsglobal.org/xsd/imsqti_v2p2', 'xmlns:xi' => 'http://www.w3.org/2001/XInclude',
|
133
137
|
'xmlns:m' => 'http://www.w3.org/1998/Math/MathML', 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
|
134
|
-
'xsi:schemaLocation' => 'http://www.imsglobal.org/xsd/imsqti_v2p2' \
|
138
|
+
'xsi:schemaLocation' => 'http://www.imsglobal.org/xsd/imsqti_v2p2 ' \
|
135
139
|
'http://www.imsglobal.org/xsd/qti/qtiv2p2/imsqti_v2p2.xsd' }.merge(args)
|
136
140
|
end
|
137
141
|
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Qti::AssessmentItemExporter do
|
4
|
+
let(:assessment_item) do
|
5
|
+
Qti::ContentPackaging::AssessmentItem.new(
|
6
|
+
identifier: '1', title: 'Question 1', response: 'true',
|
7
|
+
interaction: Qti::ContentPackaging::ChoiceInteraction.new(
|
8
|
+
prompt: 'Is 1+1 equals 2?', maxChoices: 1,
|
9
|
+
choices: [
|
10
|
+
Qti::ContentPackaging::SimpleChoice.new(
|
11
|
+
identifier: 'true', body: 'True'
|
12
|
+
),
|
13
|
+
Qti::ContentPackaging::SimpleChoice.new(
|
14
|
+
identifier: 'false', body: 'False'
|
15
|
+
)
|
16
|
+
]
|
17
|
+
)
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#export' do
|
22
|
+
it 'generates the xml for an item' do
|
23
|
+
dir = Dir.mktmpdir
|
24
|
+
exporter = Qti::AssessmentItemExporter.new(1, assessment_item, package_root_path: dir)
|
25
|
+
exporter.export
|
26
|
+
|
27
|
+
expect(exporter.exported_file_path).to have_file_content(
|
28
|
+
<<-XML.strip_heredoc
|
29
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
30
|
+
<assessmentItem xmlns="http://www.imsglobal.org/xsd/imsqti_v2p2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.imsglobal.org/xsd/imsqti_v2p2 http://www.imsglobal.org/xsd/qti/qtiv2p2/imsqti_v2p2.xsd">
|
31
|
+
<responseDeclaration identifier="RESPONSE" cardinality="single" baseType="identifier">
|
32
|
+
<correctResponse>
|
33
|
+
<value>true</value>
|
34
|
+
</correctResponse>
|
35
|
+
</responseDeclaration>
|
36
|
+
<itemBody>
|
37
|
+
<choiceInteraction responseIdentifier="RESPONSE" shuffle="false" maxChoices="1">
|
38
|
+
<prompt>Is 1+1 equals 2?</prompt>
|
39
|
+
<simpleChoice identifier="true" fixed="true">True</simpleChoice>
|
40
|
+
<simpleChoice identifier="false" fixed="true">False</simpleChoice>
|
41
|
+
</choiceInteraction>
|
42
|
+
</itemBody>
|
43
|
+
</assessmentItem>
|
44
|
+
XML
|
45
|
+
)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Qti::Exporter do
|
4
|
+
let(:empty_assessment_test) do
|
5
|
+
Qti::ContentPackaging::AssessmentTest.new(
|
6
|
+
title: 'Empty test',
|
7
|
+
items: [],
|
8
|
+
outcome_declarations: []
|
9
|
+
)
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:assessment_test) do
|
13
|
+
Qti::ContentPackaging::AssessmentTest.new(
|
14
|
+
title: 'Example test',
|
15
|
+
items: [
|
16
|
+
Qti::ContentPackaging::AssessmentItem.new(
|
17
|
+
identifier: '0b8664be39cf69ef76402f3e41eb05', title: 'Question 1', response: 'true',
|
18
|
+
interaction: Qti::ContentPackaging::ChoiceInteraction.new(
|
19
|
+
prompt: 'Is 1+1 equals 2?', maxChoices: 1,
|
20
|
+
choices: [
|
21
|
+
Qti::ContentPackaging::SimpleChoice.new(
|
22
|
+
identifier: 'true', body: 'True'
|
23
|
+
),
|
24
|
+
Qti::ContentPackaging::SimpleChoice.new(
|
25
|
+
identifier: 'false', body: 'False'
|
26
|
+
)
|
27
|
+
]
|
28
|
+
)
|
29
|
+
)
|
30
|
+
],
|
31
|
+
outcome_declarations: [
|
32
|
+
Qti::ContentPackaging::OutcomeDeclaration.new(
|
33
|
+
identifier: 'TEST_total', baseType: 'float', cardinality: 'single', defaultValue: 0.0
|
34
|
+
),
|
35
|
+
Qti::ContentPackaging::OutcomeDeclaration.new(
|
36
|
+
identifier: 'S1', baseType: 'float', cardinality: 'single', defaultValue: 0.0
|
37
|
+
)
|
38
|
+
]
|
39
|
+
)
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '#export' do
|
43
|
+
it 'generates the xml for the empty assessment' do
|
44
|
+
dir = Dir.mktmpdir
|
45
|
+
|
46
|
+
exporter = Qti::Exporter.new(empty_assessment_test, package_root_path: dir)
|
47
|
+
exporter.export
|
48
|
+
|
49
|
+
expect(exporter.exported_file_path).to have_zip_entry('assessment.xml').with_content(
|
50
|
+
<<-XML.strip_heredoc
|
51
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
52
|
+
<assessmentTest xmlns="http://www.imsglobal.org/xsd/imsqti_v2p2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.imsglobal.org/xsd/imsqti_v2p2 http://www.imsglobal.org/xsd/qti/qtiv2p2/imsqti_v2p2.xsd" title="Empty test">
|
53
|
+
<testPart/>
|
54
|
+
</assessmentTest>
|
55
|
+
XML
|
56
|
+
)
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'generates the xml for an assessment with an item' do
|
60
|
+
dir = Dir.mktmpdir
|
61
|
+
|
62
|
+
exporter = Qti::Exporter.new(assessment_test, package_root_path: dir)
|
63
|
+
exporter.export
|
64
|
+
|
65
|
+
expect(exporter.exported_file_path).to contain_zip_entry('imsmanifest.xml')
|
66
|
+
expect(exporter.exported_file_path).to contain_zip_entry('0b8664be39cf69ef76402f3e41eb05.xml')
|
67
|
+
expect(exporter.exported_file_path).to have_zip_entry('assessment.xml').with_content(
|
68
|
+
<<-XML.strip_heredoc
|
69
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
70
|
+
<assessmentTest xmlns="http://www.imsglobal.org/xsd/imsqti_v2p2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.imsglobal.org/xsd/imsqti_v2p2 http://www.imsglobal.org/xsd/qti/qtiv2p2/imsqti_v2p2.xsd" title="Example test">
|
71
|
+
<outcomeDeclaration baseType="float" cardinality="single" identifier="TEST_total">
|
72
|
+
<defaultValue>
|
73
|
+
<value>0</value>
|
74
|
+
</defaultValue>
|
75
|
+
</outcomeDeclaration>
|
76
|
+
<outcomeDeclaration baseType="float" cardinality="single" identifier="S1">
|
77
|
+
<defaultValue>
|
78
|
+
<value>0</value>
|
79
|
+
</defaultValue>
|
80
|
+
</outcomeDeclaration>
|
81
|
+
<testPart>
|
82
|
+
<assessmentSection identifier="S1" visible="true" title="Section 1">
|
83
|
+
<assessmentItemRef identifier="0b8664be39cf69ef76402f3e41eb05" href="0b8664be39cf69ef76402f3e41eb05.xml"/>
|
84
|
+
</assessmentSection>
|
85
|
+
</testPart>
|
86
|
+
</assessmentTest>
|
87
|
+
XML
|
88
|
+
)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
data/spec/spec_helper.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
require 'bundler/setup'
|
2
2
|
require 'byebug'
|
3
|
-
|
4
3
|
Bundler.setup
|
5
4
|
|
6
5
|
require 'qti'
|
7
6
|
|
7
|
+
Dir[File.expand_path(File.join(File.dirname(__FILE__),'support','**','*.rb'))].each {|f| require f}
|
8
|
+
|
8
9
|
RSpec.configure do |config|
|
9
10
|
config.expect_with :rspec do |expectations|
|
10
11
|
expectations.syntax = :expect
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'rspec/expectations'
|
2
|
+
|
3
|
+
RSpec::Matchers.define :have_file_content do |expected|
|
4
|
+
match do |actual|
|
5
|
+
File.read(actual) == expected
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
RSpec::Matchers.define :contain_zip_entry do |entry|
|
10
|
+
match do |file_path|
|
11
|
+
zip_entry = Zip::File.open(file_path) do |zip_file|
|
12
|
+
zip_file.glob(entry).first
|
13
|
+
end
|
14
|
+
expect(zip_entry).to be_present
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
RSpec::Matchers.define :have_zip_entry do |entry|
|
19
|
+
match do |file_path|
|
20
|
+
expect(file_content_in_zip_file(file_path, entry)).to eq(@expected_content)
|
21
|
+
end
|
22
|
+
|
23
|
+
failure_message do |file_path|
|
24
|
+
c = file_content_in_zip_file(file_path, entry)
|
25
|
+
if c.empty?
|
26
|
+
"expect #{file_path} to contain an entry #{entry}"
|
27
|
+
elsif c != @expected_content
|
28
|
+
RSpec::Support::Differ.new.diff(c, @expected_content)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def file_content_in_zip_file(file_path, entry)
|
33
|
+
Zip::File.open(file_path) do |zip_file|
|
34
|
+
e = zip_file.glob(entry).first
|
35
|
+
e.get_input_stream.read
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
chain :with_content do |expected_content|
|
40
|
+
@expected_content = expected_content
|
41
|
+
end
|
42
|
+
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: 0.2.
|
4
|
+
version: 0.2.3
|
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: 2017-03-
|
12
|
+
date: 2017-03-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
@@ -186,10 +186,8 @@ files:
|
|
186
186
|
- lib/qti/content_packaging/outcome_declaration.rb
|
187
187
|
- lib/qti/content_packaging/simple_choice.rb
|
188
188
|
- lib/qti/exporter.rb
|
189
|
-
- lib/qti/item_exporter_factory.rb
|
190
189
|
- lib/qti/models/base.rb
|
191
190
|
- lib/qti/models/manifest.rb
|
192
|
-
- lib/qti/true_false_item_exporter.rb
|
193
191
|
- lib/qti/v1/models/assessment.rb
|
194
192
|
- lib/qti/v1/models/assessment_item.rb
|
195
193
|
- lib/qti/v1/models/base.rb
|
@@ -366,20 +364,22 @@ files:
|
|
366
364
|
- spec/fixtures/tests/tests/rtest25.xml
|
367
365
|
- spec/fixtures/tests/tests/rtest26.xml
|
368
366
|
- spec/fixtures/tests/tests/rtest27.xml
|
369
|
-
- spec/qti/
|
370
|
-
- spec/qti/
|
371
|
-
- spec/qti/models/
|
372
|
-
- spec/qti/
|
373
|
-
- spec/qti/v1/models/
|
374
|
-
- spec/qti/v1/models/
|
375
|
-
- spec/qti/v1/models/
|
376
|
-
- spec/qti/
|
377
|
-
- spec/qti/v2/models/
|
378
|
-
- spec/qti/v2/models/
|
379
|
-
- spec/qti/v2/models/
|
380
|
-
- spec/qti/v2/models/interactions/
|
381
|
-
- spec/
|
367
|
+
- spec/lib/qti/assessment_item_exporter_spec.rb
|
368
|
+
- spec/lib/qti/exporter_spec.rb
|
369
|
+
- spec/lib/qti/models/base_spec.rb
|
370
|
+
- spec/lib/qti/models/manifest_spec.rb
|
371
|
+
- spec/lib/qti/v1/models/assessment_item_spec.rb
|
372
|
+
- spec/lib/qti/v1/models/assessment_spec.rb
|
373
|
+
- spec/lib/qti/v1/models/choices/logical_identifier_choice_spec.rb
|
374
|
+
- spec/lib/qti/v1/models/interactions/logical_identifier_interaction_spec.rb
|
375
|
+
- spec/lib/qti/v2/models/assessment_item_spec.rb
|
376
|
+
- spec/lib/qti/v2/models/assessment_test_spec.rb
|
377
|
+
- spec/lib/qti/v2/models/choices/simple_choice_spec.rb
|
378
|
+
- spec/lib/qti/v2/models/interactions/choice_interaction_spec.rb
|
379
|
+
- spec/lib/qti/v2/models/interactions/extended_text_interaction_spec.rb
|
380
|
+
- spec/lib/qti_spec.rb
|
382
381
|
- spec/spec_helper.rb
|
382
|
+
- spec/support/custom_matchers.rb
|
383
383
|
homepage:
|
384
384
|
licenses: []
|
385
385
|
metadata: {}
|
@@ -566,17 +566,19 @@ test_files:
|
|
566
566
|
- spec/fixtures/tests/tests/rtest25.xml
|
567
567
|
- spec/fixtures/tests/tests/rtest26.xml
|
568
568
|
- spec/fixtures/tests/tests/rtest27.xml
|
569
|
-
- spec/qti/
|
570
|
-
- spec/qti/
|
571
|
-
- spec/qti/models/
|
572
|
-
- spec/qti/
|
573
|
-
- spec/qti/v1/models/
|
574
|
-
- spec/qti/v1/models/
|
575
|
-
- spec/qti/v1/models/
|
576
|
-
- spec/qti/
|
577
|
-
- spec/qti/v2/models/
|
578
|
-
- spec/qti/v2/models/
|
579
|
-
- spec/qti/v2/models/
|
580
|
-
- spec/qti/v2/models/interactions/
|
581
|
-
- spec/
|
569
|
+
- spec/lib/qti/assessment_item_exporter_spec.rb
|
570
|
+
- spec/lib/qti/exporter_spec.rb
|
571
|
+
- spec/lib/qti/models/base_spec.rb
|
572
|
+
- spec/lib/qti/models/manifest_spec.rb
|
573
|
+
- spec/lib/qti/v1/models/assessment_item_spec.rb
|
574
|
+
- spec/lib/qti/v1/models/assessment_spec.rb
|
575
|
+
- spec/lib/qti/v1/models/choices/logical_identifier_choice_spec.rb
|
576
|
+
- spec/lib/qti/v1/models/interactions/logical_identifier_interaction_spec.rb
|
577
|
+
- spec/lib/qti/v2/models/assessment_item_spec.rb
|
578
|
+
- spec/lib/qti/v2/models/assessment_test_spec.rb
|
579
|
+
- spec/lib/qti/v2/models/choices/simple_choice_spec.rb
|
580
|
+
- spec/lib/qti/v2/models/interactions/choice_interaction_spec.rb
|
581
|
+
- spec/lib/qti/v2/models/interactions/extended_text_interaction_spec.rb
|
582
|
+
- spec/lib/qti_spec.rb
|
582
583
|
- spec/spec_helper.rb
|
584
|
+
- spec/support/custom_matchers.rb
|
@@ -1,15 +0,0 @@
|
|
1
|
-
module Qti
|
2
|
-
class ItemExporterFactory
|
3
|
-
EXPORTER_CLASS = { 'TrueFalse' => TrueFalseItemExporter }.freeze
|
4
|
-
|
5
|
-
def self.create(item, args = {})
|
6
|
-
exporter_class = EXPORTER_CLASS[item.interaction_type] || NullExporter
|
7
|
-
exporter_class.new(item, args)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
class NullExporter < ItemExporter
|
12
|
-
def export
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
data/spec/qti/exporter_spec.rb
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Qti::Exporter do
|
4
|
-
let(:assessment_test) do
|
5
|
-
Qti::ContentPackaging::AssessmentTest.new(
|
6
|
-
title: 'Example test',
|
7
|
-
items: [
|
8
|
-
Qti::ContentPackaging::AssessmentItem.new(
|
9
|
-
identifier: '1', title: 'Question 1', response: 'true',
|
10
|
-
interaction: Qti::ContentPackaging::ChoiceInteraction.new(
|
11
|
-
prompt: 'Is 1+1 equals 2?', maxChoices: 1,
|
12
|
-
choices: [
|
13
|
-
Qti::ContentPackaging::SimpleChoice.new(
|
14
|
-
identifier: 'true', body: 'True'
|
15
|
-
),
|
16
|
-
Qti::ContentPackaging::SimpleChoice.new(
|
17
|
-
identifier: 'false', body: 'False'
|
18
|
-
)
|
19
|
-
]
|
20
|
-
)
|
21
|
-
)
|
22
|
-
],
|
23
|
-
outcome_declarations: [
|
24
|
-
Qti::ContentPackaging::OutcomeDeclaration.new(
|
25
|
-
identifier: 'TEST_total', baseType: 'float', cardinality: 'single', defaultValue: 0.0
|
26
|
-
),
|
27
|
-
Qti::ContentPackaging::OutcomeDeclaration.new(
|
28
|
-
identifier: 'S1', baseType: 'float', cardinality: 'single', defaultValue: 0.0
|
29
|
-
)
|
30
|
-
]
|
31
|
-
)
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'creates the zip file' do
|
35
|
-
dir = Dir.mktmpdir
|
36
|
-
|
37
|
-
exporter = Qti::Exporter.new(assessment_test, package_root_path: dir)
|
38
|
-
exporter.export
|
39
|
-
|
40
|
-
expect(File.exist?(exporter.exported_file_path)).to be_truthy
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'contains an imsnanifest.xml and an assessment.xml files' do
|
44
|
-
dir = Dir.mktmpdir
|
45
|
-
|
46
|
-
exporter = Qti::Exporter.new(assessment_test, package_root_path: dir)
|
47
|
-
exporter.export
|
48
|
-
|
49
|
-
Zip::File.open(exporter.exported_file_path, 'r') do |zip_file|
|
50
|
-
expect(zip_file.glob('imsmanifest.xml').first).to be_present
|
51
|
-
expect(zip_file.glob('assessment.xml').first).to be_present
|
52
|
-
expect(zip_file.glob('item-1.xml').first).to be_present
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|