canvas_cc 0.0.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 (167) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +29 -0
  6. data/Rakefile +1 -0
  7. data/canvas_cc.gemspec +37 -0
  8. data/lib/canvas_cc/canvas/assessment.rb +124 -0
  9. data/lib/canvas_cc/canvas/assignment.rb +98 -0
  10. data/lib/canvas_cc/canvas/converter.rb +30 -0
  11. data/lib/canvas_cc/canvas/course.rb +143 -0
  12. data/lib/canvas_cc/canvas/discussion_topic.rb +64 -0
  13. data/lib/canvas_cc/canvas/label.rb +8 -0
  14. data/lib/canvas_cc/canvas/question.rb +492 -0
  15. data/lib/canvas_cc/canvas/question_bank.rb +57 -0
  16. data/lib/canvas_cc/canvas/question_group.rb +35 -0
  17. data/lib/canvas_cc/canvas/resource.rb +16 -0
  18. data/lib/canvas_cc/canvas/templates/assignment.html.erb +9 -0
  19. data/lib/canvas_cc/canvas/templates/syllabus.html.erb +9 -0
  20. data/lib/canvas_cc/canvas/templates/wiki_content.html.erb +10 -0
  21. data/lib/canvas_cc/canvas/web_content.rb +15 -0
  22. data/lib/canvas_cc/canvas/web_link.rb +16 -0
  23. data/lib/canvas_cc/canvas/wiki.rb +26 -0
  24. data/lib/canvas_cc/canvas_cc/assessment_writer.rb +82 -0
  25. data/lib/canvas_cc/canvas_cc/assignment_group_writer.rb +48 -0
  26. data/lib/canvas_cc/canvas_cc/assignment_writer.rb +68 -0
  27. data/lib/canvas_cc/canvas_cc/calculated_question_writer.rb +72 -0
  28. data/lib/canvas_cc/canvas_cc/canvas_export_writer.rb +18 -0
  29. data/lib/canvas_cc/canvas_cc/cartridge_creator.rb +60 -0
  30. data/lib/canvas_cc/canvas_cc/course_setting_writer.rb +35 -0
  31. data/lib/canvas_cc/canvas_cc/discussion_writer.rb +52 -0
  32. data/lib/canvas_cc/canvas_cc/essay_question_writer.rb +19 -0
  33. data/lib/canvas_cc/canvas_cc/file_meta_writer.rb +38 -0
  34. data/lib/canvas_cc/canvas_cc/ims_manifest_generator.rb +123 -0
  35. data/lib/canvas_cc/canvas_cc/matching_question_writer.rb +43 -0
  36. data/lib/canvas_cc/canvas_cc/models/answer.rb +12 -0
  37. data/lib/canvas_cc/canvas_cc/models/assessment.rb +102 -0
  38. data/lib/canvas_cc/canvas_cc/models/assignment.rb +30 -0
  39. data/lib/canvas_cc/canvas_cc/models/assignment_group.rb +9 -0
  40. data/lib/canvas_cc/canvas_cc/models/calculated_question.rb +19 -0
  41. data/lib/canvas_cc/canvas_cc/models/canvas_file.rb +22 -0
  42. data/lib/canvas_cc/canvas_cc/models/canvas_module.rb +10 -0
  43. data/lib/canvas_cc/canvas_cc/models/course.rb +53 -0
  44. data/lib/canvas_cc/canvas_cc/models/discussion.rb +36 -0
  45. data/lib/canvas_cc/canvas_cc/models/discussion_topic.rb +5 -0
  46. data/lib/canvas_cc/canvas_cc/models/matching_question.rb +7 -0
  47. data/lib/canvas_cc/canvas_cc/models/module_item.rb +16 -0
  48. data/lib/canvas_cc/canvas_cc/models/multiple_dropdowns_question.rb +7 -0
  49. data/lib/canvas_cc/canvas_cc/models/numerical_question.rb +7 -0
  50. data/lib/canvas_cc/canvas_cc/models/page.rb +41 -0
  51. data/lib/canvas_cc/canvas_cc/models/question.rb +37 -0
  52. data/lib/canvas_cc/canvas_cc/models/question_bank.rb +42 -0
  53. data/lib/canvas_cc/canvas_cc/models/question_group.rb +10 -0
  54. data/lib/canvas_cc/canvas_cc/models/resource.rb +23 -0
  55. data/lib/canvas_cc/canvas_cc/models/web_content.rb +7 -0
  56. data/lib/canvas_cc/canvas_cc/models/web_link.rb +7 -0
  57. data/lib/canvas_cc/canvas_cc/models/workflow_state.rb +6 -0
  58. data/lib/canvas_cc/canvas_cc/module_meta_writer.rb +52 -0
  59. data/lib/canvas_cc/canvas_cc/multiple_answers_question_writer.rb +41 -0
  60. data/lib/canvas_cc/canvas_cc/multiple_blanks_question_writer.rb +51 -0
  61. data/lib/canvas_cc/canvas_cc/multiple_choice_question_writer.rb +48 -0
  62. data/lib/canvas_cc/canvas_cc/multiple_dropdowns_question_writer.rb +30 -0
  63. data/lib/canvas_cc/canvas_cc/numerical_question_writer.rb +40 -0
  64. data/lib/canvas_cc/canvas_cc/page_writer.rb +38 -0
  65. data/lib/canvas_cc/canvas_cc/question_bank_writer.rb +44 -0
  66. data/lib/canvas_cc/canvas_cc/question_group_writer.rb +23 -0
  67. data/lib/canvas_cc/canvas_cc/question_writer.rb +129 -0
  68. data/lib/canvas_cc/canvas_cc/short_answer_question_writer.rb +42 -0
  69. data/lib/canvas_cc/canvas_cc/text_only_question_writer.rb +19 -0
  70. data/lib/canvas_cc/canvas_cc/true_false_question_writer.rb +38 -0
  71. data/lib/canvas_cc/cc/assessment.rb +25 -0
  72. data/lib/canvas_cc/cc/assignment.rb +61 -0
  73. data/lib/canvas_cc/cc/cc_helper.rb +285 -0
  74. data/lib/canvas_cc/cc/converter.rb +137 -0
  75. data/lib/canvas_cc/cc/course.rb +16 -0
  76. data/lib/canvas_cc/cc/discussion_topic.rb +53 -0
  77. data/lib/canvas_cc/cc/label.rb +6 -0
  78. data/lib/canvas_cc/cc/question.rb +23 -0
  79. data/lib/canvas_cc/cc/resource.rb +30 -0
  80. data/lib/canvas_cc/cc/templates/assignment.html.erb +13 -0
  81. data/lib/canvas_cc/cc/templates/syllabus.html.erb +9 -0
  82. data/lib/canvas_cc/cc/templates/wiki_content.html.erb +10 -0
  83. data/lib/canvas_cc/cc/web_content.rb +48 -0
  84. data/lib/canvas_cc/cc/web_link.rb +75 -0
  85. data/lib/canvas_cc/cc/wiki.rb +73 -0
  86. data/lib/canvas_cc/version.rb +3 -0
  87. data/lib/canvas_cc.rb +94 -0
  88. data/spec/moodle2cc/canvas_cc/assessment_writer_spec.rb +95 -0
  89. data/spec/moodle2cc/canvas_cc/assignment_group_writer_spec.rb +51 -0
  90. data/spec/moodle2cc/canvas_cc/assignment_writer_spec.rb +74 -0
  91. data/spec/moodle2cc/canvas_cc/calculated_question_writer_spec.rb +88 -0
  92. data/spec/moodle2cc/canvas_cc/canvas_export_writer_spec.rb +26 -0
  93. data/spec/moodle2cc/canvas_cc/cartridge_creator_spec.rb +50 -0
  94. data/spec/moodle2cc/canvas_cc/course_setting_writer_spec.rb +47 -0
  95. data/spec/moodle2cc/canvas_cc/discussion_writer_spec.rb +38 -0
  96. data/spec/moodle2cc/canvas_cc/essay_question_writer_spec.rb +31 -0
  97. data/spec/moodle2cc/canvas_cc/file_meta_writer_spec.rb +57 -0
  98. data/spec/moodle2cc/canvas_cc/ims_manifest_generator_spec.rb +141 -0
  99. data/spec/moodle2cc/canvas_cc/matching_question_writer_spec.rb +51 -0
  100. data/spec/moodle2cc/canvas_cc/models/assessment_spec.rb +131 -0
  101. data/spec/moodle2cc/canvas_cc/models/assignment_group_spec.rb +9 -0
  102. data/spec/moodle2cc/canvas_cc/models/assignment_spec.rb +45 -0
  103. data/spec/moodle2cc/canvas_cc/models/calculated_question_spec.rb +25 -0
  104. data/spec/moodle2cc/canvas_cc/models/canvas_file_spec.rb +23 -0
  105. data/spec/moodle2cc/canvas_cc/models/canvas_module_spec.rb +16 -0
  106. data/spec/moodle2cc/canvas_cc/models/course_spec.rb +43 -0
  107. data/spec/moodle2cc/canvas_cc/models/discussion_spec.rb +47 -0
  108. data/spec/moodle2cc/canvas_cc/models/discussion_topic_spec.rb +7 -0
  109. data/spec/moodle2cc/canvas_cc/models/module_item_spec.rb +15 -0
  110. data/spec/moodle2cc/canvas_cc/models/page_spec.rb +34 -0
  111. data/spec/moodle2cc/canvas_cc/models/question_spec.rb +8 -0
  112. data/spec/moodle2cc/canvas_cc/models/resource_spec.rb +17 -0
  113. data/spec/moodle2cc/canvas_cc/models/web_content_spec.rb +7 -0
  114. data/spec/moodle2cc/canvas_cc/models/web_link_spec.rb +9 -0
  115. data/spec/moodle2cc/canvas_cc/module_meta_writer_spec.rb +118 -0
  116. data/spec/moodle2cc/canvas_cc/multiple_answers_question_writer_spec.rb +50 -0
  117. data/spec/moodle2cc/canvas_cc/multiple_blanks_question_writer_spec.rb +77 -0
  118. data/spec/moodle2cc/canvas_cc/multiple_choice_question_writer_spec.rb +69 -0
  119. data/spec/moodle2cc/canvas_cc/multiple_dropdowns_question_writer_spec.rb +46 -0
  120. data/spec/moodle2cc/canvas_cc/numerical_question_writer_spec.rb +69 -0
  121. data/spec/moodle2cc/canvas_cc/page_writer_spec.rb +29 -0
  122. data/spec/moodle2cc/canvas_cc/question_bank_writer_spec.rb +43 -0
  123. data/spec/moodle2cc/canvas_cc/question_writer_spec.rb +129 -0
  124. data/spec/moodle2cc/canvas_cc/short_answer_question_writer_spec.rb +50 -0
  125. data/spec/moodle2cc/canvas_cc/text_only_question_writer_spec.rb +23 -0
  126. data/spec/moodle2cc/canvas_cc/true_false_question_writer_spec.rb +62 -0
  127. data/spec/spec_helper.rb +12 -0
  128. data/spec/support/shared_examples_for_models.rb +26 -0
  129. data/test/acceptance/migrator_test.rb +24 -0
  130. data/test/fixtures/cc.imscc +0 -0
  131. data/test/fixtures/common_cartridge/ims_manifest_simple.xml +45 -0
  132. data/test/fixtures/common_cartridge/schema/cccv1p0.xsd +563 -0
  133. data/test/fixtures/common_cartridge/schema/ccv1p1_imsccauth_v1p1.xsd +203 -0
  134. data/test/fixtures/common_cartridge/schema/ccv1p1_imscp_v1p2_v1p0.xsd +827 -0
  135. data/test/fixtures/common_cartridge/schema/ccv1p1_lommanifest_v1p0.xsd +822 -0
  136. data/test/fixtures/common_cartridge/schema/ccv1p1_lomresource_v1p0.xsd +273 -0
  137. data/test/fixtures/common_cartridge/schema/xml.xsd +286 -0
  138. data/test/test_helper.rb +71 -0
  139. data/test/test_question_helper.rb +122 -0
  140. data/test/test_wiki_helper.rb +21 -0
  141. data/test/unit/canvas/assessment_test.rb +261 -0
  142. data/test/unit/canvas/assignment_test.rb +220 -0
  143. data/test/unit/canvas/converter_test.rb +171 -0
  144. data/test/unit/canvas/course_test.rb +176 -0
  145. data/test/unit/canvas/discussion_topic_test.rb +129 -0
  146. data/test/unit/canvas/label_test.rb +32 -0
  147. data/test/unit/canvas/question_bank_test.rb +92 -0
  148. data/test/unit/canvas/question_group_test.rb +90 -0
  149. data/test/unit/canvas/question_test.rb +876 -0
  150. data/test/unit/canvas/web_content_test.rb +46 -0
  151. data/test/unit/canvas/web_link_test.rb +48 -0
  152. data/test/unit/canvas/wiki_test.rb +74 -0
  153. data/test/unit/cc/assessment_test.rb +48 -0
  154. data/test/unit/cc/assignment_test.rb +72 -0
  155. data/test/unit/cc/cc_helper_test.rb +19 -0
  156. data/test/unit/cc/converter_test.rb +173 -0
  157. data/test/unit/cc/course_test.rb +36 -0
  158. data/test/unit/cc/discussion_topic_test.rb +83 -0
  159. data/test/unit/cc/label_test.rb +29 -0
  160. data/test/unit/cc/question_test.rb +54 -0
  161. data/test/unit/cc/web_content_test.rb +76 -0
  162. data/test/unit/cc/web_link_test.rb +159 -0
  163. data/test/unit/cc/wiki_test.rb +139 -0
  164. data/test/unit/logger_test.rb +33 -0
  165. data/test/unit/migrator_test.rb +67 -0
  166. data/test/unit/resource_factory_test.rb +216 -0
  167. metadata +499 -0
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ module CanvasCc::CanvasCC
4
+ describe QuestionBankWriter do
5
+ subject { CanvasCc::CanvasCC::QuestionBankWriter.new(work_dir, question_bank) }
6
+ let(:work_dir) { Dir.mktmpdir }
7
+ let(:question_bank) { CanvasCc::CanvasCC::Models::QuestionBank.new }
8
+
9
+ after(:each) do
10
+ FileUtils.rm_r work_dir
11
+ end
12
+
13
+ it 'creates the question bank xml file' do
14
+ question = CanvasCc::CanvasCC::Models::Question.new
15
+ question.identifier = 42
16
+
17
+ QuestionWriter.register_writer_type(nil)
18
+ QuestionWriter.stub(:write_responses)
19
+ QuestionWriter.stub(:write_response_conditions)
20
+
21
+ question_bank.identifier = 'qb_id'
22
+ question_bank.title = 'Bank title'
23
+ question_bank.questions = [question]
24
+
25
+ subject.write
26
+ xml = Nokogiri::XML(File.read(File.join(work_dir, question_bank.question_bank_resource.href)))
27
+
28
+ expect(xml.root.attributes['schemaLocation'].value).to eq "http://www.imsglobal.org/xsd/ims_qtiasiv1p2 http://www.imsglobal.org/xsd/ims_qtiasiv1p2p1.xsd"
29
+ expect(xml.namespaces['xmlns:xsi']).to eq "http://www.w3.org/2001/XMLSchema-instance"
30
+ expect(xml.namespaces['xmlns']).to eq "http://www.imsglobal.org/xsd/ims_qtiasiv1p2"
31
+
32
+ root = xml.at_xpath('xmlns:questestinterop')
33
+ expect(root).to_not be_nil
34
+ expect(root.%('objectbank').attributes['ident'].value).to eq question_bank.identifier
35
+
36
+ meta = root.%('objectbank/qtimetadata/qtimetadatafield')
37
+ expect(meta.%('fieldlabel').text).to eq 'bank_title'
38
+ expect(meta.%('fieldentry').text).to eq question_bank.title
39
+
40
+ expect(root.%('objectbank/item').attributes['ident'].value).to eq question.identifier.to_s
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,129 @@
1
+ require 'spec_helper'
2
+
3
+ module CanvasCc::CanvasCC
4
+ describe QuestionWriter do
5
+ subject { CanvasCc::CanvasCC::QuestionWriter }
6
+ let(:question) { CanvasCc::CanvasCC::Models::Question.new }
7
+
8
+ class FooBarWriter < QuestionWriter
9
+ def self.write_additional_nodes(item_node, question)
10
+ write_standard_answer_feedbacks(item_node, question)
11
+ item_node.randomnode
12
+ end
13
+
14
+ def self.write_responses(item_node, question)
15
+ item_node.mockresponsesnode
16
+ end
17
+
18
+ def self.write_response_conditions(item_node, question)
19
+ item_node.mockresponseconditionsnode
20
+ end
21
+ end
22
+
23
+ before :each do
24
+ question.question_type = 'foobar_type'
25
+ FooBarWriter.register_writer_type 'foobar_type'
26
+ end
27
+
28
+ it 'registers a question type for writing' do
29
+ FooBarWriter.stub(:write_question_item_xml)
30
+ Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |node|
31
+ QuestionWriter.write_question(node, question)
32
+ end
33
+ expect(FooBarWriter).to have_received(:write_question_item_xml)
34
+ end
35
+
36
+ it 'raises an exception for unknown converter types' do
37
+ question.question_type = 'nonexistenttype'
38
+
39
+ expect {
40
+ Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |node|
41
+ QuestionWriter.write_question(node, question)
42
+ end
43
+ }.to raise_exception
44
+ end
45
+
46
+ it 'writes item metadata' do
47
+ question.identifier = 'blah'
48
+ question.title = 'titled'
49
+ question.points_possible = 41
50
+ question.assessment_question_identifierref = 'reffed'
51
+
52
+ xml = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |node|
53
+ QuestionWriter.write_question(node, question)
54
+ end.doc
55
+
56
+ expect(xml.at_xpath('item/@ident').value).to eq question.identifier.to_s
57
+ expect(xml.at_xpath('item/@title').value).to eq question.title
58
+ expect(xml.at_xpath("item/itemmetadata/qtimetadata/qtimetadatafield[fieldlabel=\"question_type\" and fieldentry=\"#{question.question_type}\"]")).to_not be_nil
59
+ expect(xml.at_xpath("item/itemmetadata/qtimetadata/qtimetadatafield[fieldlabel=\"points_possible\" and fieldentry=\"#{question.points_possible}\"]")).to_not be_nil
60
+ expect(xml.at_xpath("item/itemmetadata/qtimetadata/qtimetadatafield[fieldlabel=\"assessment_question_identifierref\" and fieldentry=\"#{question.assessment_question_identifierref}\"]")).to_not be_nil
61
+ end
62
+
63
+ it 'writes item presentation node' do
64
+ question.material = 'bunch of stuff in here'
65
+
66
+ xml = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |node|
67
+ QuestionWriter.write_question(node, question)
68
+ end.doc
69
+
70
+ expect(xml.at_xpath('item/presentation/material/mattext[@texttype="text/html"]').text).to eq question.material
71
+ expect(xml.at_xpath('item/presentation/mockresponsesnode')).to_not be_nil
72
+ end
73
+
74
+ it 'writes item resprocessing node' do
75
+ xml = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |node|
76
+ QuestionWriter.write_question(node, question)
77
+ end.doc
78
+
79
+ outcome = xml.at_xpath('item/resprocessing/outcomes/decvar')
80
+ expect(outcome.attributes['maxvalue'].value).to eq '100'
81
+ expect(outcome.attributes['minvalue'].value).to eq '0'
82
+ expect(outcome.attributes['varname'].value).to eq 'SCORE'
83
+ expect(outcome.attributes['vartype'].value).to eq 'Decimal'
84
+
85
+ expect(xml.at_xpath('item/resprocessing/mockresponseconditionsnode')).to_not be_nil
86
+ end
87
+
88
+ it 'writes general feedback' do
89
+ question.general_feedback = 'here, have some (un)helpful feedback'
90
+
91
+ xml = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |node|
92
+ QuestionWriter.write_question(node, question)
93
+ end.doc
94
+
95
+ general_feedback = xml.at_xpath('item/resprocessing/respcondition[1]')
96
+ expect(general_feedback.attributes['continue'].value).to eq 'Yes'
97
+ expect(general_feedback.at_xpath('conditionvar/other')).to_not be_nil
98
+ expect(general_feedback.at_xpath('displayfeedback').attributes['feedbacktype'].value).to eq 'Response'
99
+ expect(general_feedback.at_xpath('displayfeedback').attributes['linkrefid'].value).to eq 'general_fb'
100
+
101
+ general_feedback = xml.at_xpath('item/itemfeedback[@ident="general_fb"]')
102
+ expect(general_feedback).to_not be_nil
103
+ expect(general_feedback.at_xpath('flow_mat/material/mattext[@texttype="text/html"]').text).to eq question.general_feedback
104
+ end
105
+
106
+ it 'writes standard answer feedback if called' do
107
+ answer = CanvasCc::CanvasCC::Models::Answer.new
108
+ answer.id = 'an_id'
109
+ answer.feedback = 'much feedback'
110
+ question.answers = [answer]
111
+
112
+ xml = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |node|
113
+ QuestionWriter.write_question(node, question)
114
+ end.doc
115
+
116
+ feedback = xml.at_xpath("item/itemfeedback[@ident=\"#{answer.id}_fb\"]/flow_mat/material/mattext[@texttype=\"text/html\"]")
117
+ expect(feedback.text).to eq answer.feedback
118
+ end
119
+
120
+ it 'writes additional nodes' do
121
+ xml = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |node|
122
+ QuestionWriter.write_question(node, question)
123
+ end.doc
124
+
125
+ expect(xml.at_xpath('item/randomnode')).to_not be_nil
126
+ end
127
+
128
+ end
129
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ module CanvasCc::CanvasCC
4
+ describe ShortAnswerQuestionWriter do
5
+
6
+ let(:question) { CanvasCc::CanvasCC::Models::Question.create('short_answer_question')}
7
+
8
+ it 'creates the question item xml for an short_answer_question' do
9
+ question.identifier = 422
10
+ question.title = 'hi short answer tiftle'
11
+ question.general_feedback = 'more constructive feedback'
12
+ question.material = 'materials galore'
13
+
14
+ answer = CanvasCc::CanvasCC::Models::Answer.new
15
+ answer.id = 'answe_id'
16
+ answer.answer_text = 'the answer'
17
+ answer.feedback = 'so much feedback'
18
+ answer.fraction = 1
19
+ question.answers = [answer]
20
+
21
+ xml = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |node|
22
+ QuestionWriter.write_question(node, question)
23
+ end.doc
24
+
25
+ expect(xml.at_xpath('item/@ident').value).to eq question.identifier.to_s
26
+ expect(xml.at_xpath('item/@title').value).to eq question.title
27
+ expect(xml.at_xpath("item/itemmetadata/qtimetadata/qtimetadatafield[fieldlabel=\"question_type\" and fieldentry=\"#{question.question_type}\"]")).to_not be_nil
28
+
29
+ response = xml.at_xpath('item/presentation/response_str')
30
+ expect(response.attributes['rcardinality'].value).to eq 'Single'
31
+ expect(response.attributes['ident'].value).to eq 'response1'
32
+ expect(response.at_xpath('render_fib/response_label').attributes['ident'].value).to eq 'answer1'
33
+
34
+ # Conditions
35
+ condition = xml.at_xpath("item/resprocessing/respcondition[@continue=\"No\"]/conditionvar/varequal[@respident=\"response1\" and text()=\"#{answer.answer_text}\"]/../..")
36
+ expect(condition).to_not be_nil
37
+ set_var = condition.at_xpath('setvar[@varname="SCORE" and @action="Set" and text()="100"]')
38
+ expect(set_var).to_not be_nil
39
+
40
+ # Feedback
41
+ condition = xml.at_xpath("item/resprocessing/respcondition[@continue=\"Yes\"]/conditionvar/varequal[@respident=\"response1\" and text()=\"#{answer.answer_text}\"]/../..")
42
+ expect(condition).to_not be_nil
43
+ feedback = condition.at_xpath("displayfeedback[@feedbacktype=\"Response\" and @linkrefid=\"#{answer.id}_fb\"]")
44
+ expect(feedback).to_not be_nil
45
+
46
+ feedback = xml.at_xpath("item/itemfeedback[@ident=\"#{answer.id}_fb\"]/flow_mat/material/mattext[@texttype=\"text/html\"]")
47
+ expect(feedback.text).to eq answer.feedback
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ module CanvasCc::CanvasCC
4
+ describe TextOnlyQuestionWriter do
5
+
6
+ let(:question) { CanvasCc::CanvasCC::Models::Question.create('text_only_question')}
7
+
8
+ it 'creates the question item xml for a true_false_question' do
9
+ question.identifier = 300
10
+ question.title = 'hi title and stuff'
11
+ question.material = 'heressome material'
12
+
13
+ xml = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |node|
14
+ QuestionWriter.write_question(node, question)
15
+ end.doc
16
+
17
+ expect(xml.at_xpath('item/@ident').value).to eq question.identifier.to_s
18
+ expect(xml.at_xpath('item/@title').value).to eq question.title
19
+ expect(xml.at_xpath("item/itemmetadata/qtimetadata/qtimetadatafield[fieldlabel=\"question_type\" and fieldentry=\"#{question.question_type}\"]")).to_not be_nil
20
+ expect(xml.at_xpath('item/presentation/material/mattext[@texttype="text/html"]').text).to eq question.material
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ module CanvasCc::CanvasCC
4
+ describe TrueFalseQuestionWriter do
5
+
6
+ let(:question) { CanvasCc::CanvasCC::Models::Question.create('true_false_question')}
7
+
8
+ it 'creates the question item xml for a true_false_question' do
9
+ question.identifier = 42
10
+ question.title = 'hi title'
11
+ question.general_feedback = 'unconstructive feedback'
12
+ question.material = 'materia'
13
+
14
+ true_answer = CanvasCc::CanvasCC::Models::Answer.new
15
+ true_answer.id = 'tr00'
16
+ true_answer.fraction = 1.0
17
+ true_answer.answer_text = 'so true'
18
+ true_answer.feedback = 'was there ever any doubt?'
19
+ false_answer = CanvasCc::CanvasCC::Models::Answer.new
20
+ false_answer.id = 'furse'
21
+ false_answer.fraction = 0.0
22
+ false_answer.answer_text = 'falrse'
23
+ false_answer.feedback = 'bakaaaa'
24
+ question.answers = [true_answer, false_answer]
25
+
26
+ xml = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |node|
27
+ QuestionWriter.write_question(node, question)
28
+ end.doc
29
+
30
+ expect(xml.at_xpath('item/@ident').value).to eq question.identifier.to_s
31
+ expect(xml.at_xpath('item/@title').value).to eq question.title
32
+ expect(xml.at_xpath("item/itemmetadata/qtimetadata/qtimetadatafield[fieldlabel=\"question_type\" and fieldentry=\"#{question.question_type}\"]")).to_not be_nil
33
+
34
+ response = xml.at_xpath('item/presentation/response_lid')
35
+ expect(response.attributes['rcardinality'].value).to eq 'Single'
36
+ expect(response.attributes['ident'].value).to eq 'response1'
37
+
38
+ expect(response.at_xpath("render_choice/response_label[@ident=\"#{true_answer.id}\"]/material/mattext[@texttype=\"text/html\" and text()=\"#{true_answer.answer_text}\"]")).not_to be_nil
39
+ expect(response.at_xpath("render_choice/response_label[@ident=\"#{false_answer.id}\"]/material/mattext[@texttype=\"text/html\" and text()=\"#{false_answer.answer_text}\"]")).not_to be_nil
40
+
41
+ condition = xml.at_xpath("item/resprocessing/respcondition[@continue=\"No\"]/conditionvar/varequal[@respident=\"response1\" and text()=\"#{true_answer.id}\"]/../..")
42
+ expect(condition).not_to be_nil
43
+ feedback = condition.at_xpath("displayfeedback[@feedbacktype=\"Response\" and @linkrefid=\"#{true_answer.id}_fb\"]")
44
+ expect(feedback).not_to be_nil
45
+ setvar = condition.at_xpath('setvar[@varname="SCORE" and @action="Set" and text()="100"]')
46
+ expect(setvar).not_to be_nil
47
+
48
+ condition = xml.at_xpath("item/resprocessing/respcondition[@continue=\"No\"]/conditionvar/varequal[@respident=\"response1\" and text()=\"#{false_answer.id}\"]/../..")
49
+ expect(condition).not_to be_nil
50
+ feedback = condition.at_xpath("displayfeedback[@feedbacktype=\"Response\" and @linkrefid=\"#{false_answer.id}_fb\"]")
51
+ expect(feedback).not_to be_nil
52
+ setvar = condition.at_xpath('setvar[@varname="SCORE" and @action="Set" and text()="0"]')
53
+ expect(setvar).not_to be_nil
54
+
55
+ feedback = xml.at_xpath("item/itemfeedback[@ident=\"#{true_answer.id}_fb\"]/flow_mat/material/mattext[@texttype=\"text/html\"]")
56
+ expect(feedback.text).to eq true_answer.feedback
57
+
58
+ feedback = xml.at_xpath("item/itemfeedback[@ident=\"#{false_answer.id}_fb\"]/flow_mat/material/mattext[@texttype=\"text/html\"]")
59
+ expect(feedback.text).to eq false_answer.feedback
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,12 @@
1
+ require 'rspec'
2
+ require 'canvas_cc'
3
+ require 'tmpdir'
4
+ Dir["./spec/support/**/*.rb"].sort.each {|f| require f}
5
+
6
+ def fixture_path(path)
7
+ File.join(File.expand_path("../../test/fixtures", __FILE__), path)
8
+ end
9
+
10
+ def moodle2_backup_dir
11
+ fixture_path(File.join('moodle2', 'backup'))
12
+ end
@@ -0,0 +1,26 @@
1
+ shared_examples 'it has an attribute for' do |attribute, default_value = nil|
2
+ it "the attribute '#{attribute}'" do
3
+ obj = described_class.new
4
+ expect(obj.send(attribute)).to eq default_value
5
+ obj.send("#{attribute}=", :foo)
6
+ expect(obj.send(attribute)).to eq :foo
7
+ end
8
+ end
9
+
10
+ shared_examples 'a CanvasCc::CanvasCC::Models::Resource' do
11
+ it "by inheriting CanvasCc::CanvasCC::Models::Resource" do
12
+ expect(described_class.ancestors).to include CanvasCc::CanvasCC::Models::Resource
13
+ end
14
+ end
15
+
16
+ shared_examples 'a CanvasCc::Moodle2::Models::Quizzes::Question' do
17
+ it "by inheriting CanvasCc::Moodle2::Models::Quizzes:Question" do
18
+ expect(described_class.ancestors).to include CanvasCc::Moodle2::Models::Quizzes::Question
19
+ end
20
+ end
21
+
22
+ shared_examples 'it is registered as a Question' do |type|
23
+ it "for the type '#{type}'" do
24
+ expect(CanvasCc::Moodle2::Models::Quizzes::Question.create(type)).to be_instance_of described_class
25
+ end
26
+ end
@@ -0,0 +1,24 @@
1
+ puts $LOAD_PATH
2
+ require 'minitest/autorun'
3
+ require 'test_helper'
4
+ require 'moodle2cc'
5
+
6
+ class TestAcceptanceMigrator < MiniTest::Unit::TestCase
7
+ include TestHelper
8
+
9
+ def setup
10
+ @source = create_moodle_backup_zip
11
+ @destination = File.expand_path("../../tmp", __FILE__)
12
+ @package = File.expand_path("../../tmp/my-course.imscc", __FILE__)
13
+ end
14
+
15
+ def teardown
16
+ clean_tmp_folder
17
+ end
18
+
19
+ def test_it_creates_a_cc_package
20
+ migrator = CanvasCc::Migrator.new @source, @destination
21
+ migrator.migrate
22
+ assert File.exists?(@package), "#{@package} not created"
23
+ end
24
+ end
Binary file
@@ -0,0 +1,45 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <manifest identifier="icc16454176b28467d5eaeb311a7a107d" xmlns="http://www.imsglobal.org/xsd/imsccv1p1/imscp_v1p1" xmlns:lom="http://ltsc.ieee.org/xsd/imsccv1p1/LOM/resource" xmlns:lomimscc="http://ltsc.ieee.org/xsd/imsccv1p1/LOM/manifest" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.imsglobal.org/xsd/imsccv1p1/imscp_v1p1 http://www.imsglobal.org/profile/cc/ccv1p1/ccv1p1_imscp_v1p2_v1p0.xsd http://ltsc.ieee.org/xsd/imsccv1p1/LOM/resource http://www.imsglobal.org/profile/cc/ccv1p1/LOM/ccv1p1_lomresource_v1p0.xsd http://ltsc.ieee.org/xsd/imsccv1p1/LOM/manifest http://www.imsglobal.org/profile/cc/ccv1p1/LOM/ccv1p1_lommanifest_v1p0.xsd">
3
+ <metadata>
4
+ <schema>IMS Common Cartridge</schema>
5
+ <schemaversion>1.1.0</schemaversion>
6
+ <lomimscc:lom>
7
+ <lomimscc:general>
8
+ <lomimscc:title>
9
+ <lomimscc:string>Sample Course</lomimscc:string>
10
+ </lomimscc:title>
11
+ </lomimscc:general>
12
+ <lomimscc:lifeCycle>
13
+ <lomimscc:contribute>
14
+ <lomimscc:date>
15
+ <lomimscc:dateTime>2014-02-05</lomimscc:dateTime>
16
+ </lomimscc:date>
17
+ </lomimscc:contribute>
18
+ </lomimscc:lifeCycle>
19
+ <lomimscc:rights>
20
+ <lomimscc:copyrightAndOtherRestrictions>
21
+ <lomimscc:value>yes</lomimscc:value>
22
+ </lomimscc:copyrightAndOtherRestrictions>
23
+ <lomimscc:description>
24
+ <lomimscc:string>Private (Copyrighted) - http://en.wikipedia.org/wiki/Copyright</lomimscc:string>
25
+ </lomimscc:description>
26
+ </lomimscc:rights>
27
+ </lomimscc:lom>
28
+ </metadata>
29
+ <organizations>
30
+ <organization identifier="org_1" structure="rooted-hierarchy">
31
+ <item identifier="LearningModules">
32
+ </item>
33
+ </organization>
34
+ </organizations>
35
+ <resources>
36
+ <resource identifier="i1df71e5dc5307ca91998f80fc71275e7_syllabus" type="associatedcontent/imscc_xmlv1p1/learning-application-resource" href="course_settings/syllabus.html" intendeduse="syllabus">
37
+ <file href="course_settings/syllabus.html"/>
38
+ </resource>
39
+ <resource identifier="i1df71e5dc5307ca91998f80fc71275e7" type="associatedcontent/imscc_xmlv1p1/learning-application-resource" href="course_settings/canvas_export.txt">
40
+ <file href="course_settings/course_settings.xml"/>
41
+ <file href="course_settings/files_meta.xml"/>
42
+ <file href="course_settings/canvas_export.txt"/>
43
+ </resource>
44
+ </resources>
45
+ </manifest>