moodle2cc 0.2.5 → 0.2.6

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 (89) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog +7 -0
  3. data/lib/moodle2cc.rb +3 -0
  4. data/lib/moodle2cc/canvas_cc/calculated_question_writer.rb +11 -0
  5. data/lib/moodle2cc/canvas_cc/matching_question_writer.rb +6 -4
  6. data/lib/moodle2cc/canvas_cc/models/assessment.rb +1 -1
  7. data/lib/moodle2cc/canvas_cc/models/calculated_question.rb +13 -1
  8. data/lib/moodle2cc/canvas_cc/models/course.rb +2 -2
  9. data/lib/moodle2cc/canvas_cc/models/multiple_dropdowns_question.rb +7 -0
  10. data/lib/moodle2cc/canvas_cc/models/page.rb +7 -1
  11. data/lib/moodle2cc/canvas_cc/models/question.rb +1 -0
  12. data/lib/moodle2cc/canvas_cc/multiple_answers_question_writer.rb +7 -6
  13. data/lib/moodle2cc/canvas_cc/multiple_dropdowns_question_writer.rb +30 -0
  14. data/lib/moodle2cc/canvas_cc/question_writer.rb +2 -1
  15. data/lib/moodle2cc/moodle2/extractor.rb +7 -0
  16. data/lib/moodle2cc/moodle2/models.rb +1 -1
  17. data/lib/moodle2cc/moodle2/models/course.rb +3 -2
  18. data/lib/moodle2cc/moodle2/models/label.rb +5 -5
  19. data/lib/moodle2cc/moodle2/models/questionnaire.rb +1 -1
  20. data/lib/moodle2cc/moodle2/models/quizzes.rb +1 -0
  21. data/lib/moodle2cc/moodle2/models/quizzes/calculated_question.rb +2 -1
  22. data/lib/moodle2cc/moodle2/models/quizzes/multichoice_question.rb +6 -0
  23. data/lib/moodle2cc/moodle2/models/quizzes/question.rb +1 -1
  24. data/lib/moodle2cc/moodle2/models/wiki.rb +10 -0
  25. data/lib/moodle2cc/moodle2/parsers.rb +1 -0
  26. data/lib/moodle2cc/moodle2/parsers/course_parser.rb +5 -5
  27. data/lib/moodle2cc/moodle2/parsers/parser_helper.rb +7 -2
  28. data/lib/moodle2cc/moodle2/parsers/question_parsers/calculated_parser.rb +11 -1
  29. data/lib/moodle2cc/moodle2/parsers/question_parsers/match_parser.rb +2 -1
  30. data/lib/moodle2cc/moodle2/parsers/question_parsers/multichoice_parser.rb +2 -0
  31. data/lib/moodle2cc/moodle2/parsers/questionnaire_parser.rb +5 -0
  32. data/lib/moodle2cc/moodle2/parsers/quiz_parser.rb +5 -0
  33. data/lib/moodle2cc/moodle2/parsers/section_parser.rb +5 -1
  34. data/lib/moodle2cc/moodle2/parsers/wiki_parser.rb +47 -0
  35. data/lib/moodle2cc/moodle2converter/assessment_converter.rb +6 -4
  36. data/lib/moodle2cc/moodle2converter/assignment_converter.rb +1 -1
  37. data/lib/moodle2cc/moodle2converter/book_converter.rb +4 -4
  38. data/lib/moodle2cc/moodle2converter/converter_helper.rb +14 -0
  39. data/lib/moodle2cc/moodle2converter/discussion_converter.rb +1 -1
  40. data/lib/moodle2cc/moodle2converter/feedback_converter.rb +3 -3
  41. data/lib/moodle2cc/moodle2converter/html_converter.rb +16 -1
  42. data/lib/moodle2cc/moodle2converter/label_converter.rb +2 -2
  43. data/lib/moodle2cc/moodle2converter/migrator.rb +70 -2
  44. data/lib/moodle2cc/moodle2converter/question_bank_converter.rb +1 -1
  45. data/lib/moodle2cc/moodle2converter/question_converters.rb +1 -0
  46. data/lib/moodle2cc/moodle2converter/question_converters/calculated_converter.rb +1 -0
  47. data/lib/moodle2cc/moodle2converter/question_converters/matching_converter.rb +3 -0
  48. data/lib/moodle2cc/moodle2converter/question_converters/multichoice_converter.rb +15 -0
  49. data/lib/moodle2cc/moodle2converter/question_converters/multiple_blanks_converter.rb +1 -1
  50. data/lib/moodle2cc/moodle2converter/question_converters/question_converter.rb +3 -5
  51. data/lib/moodle2cc/moodle2converter/questionnaire_converter.rb +44 -8
  52. data/lib/moodle2cc/moodle2converter/section_converter.rb +3 -3
  53. data/lib/moodle2cc/moodle2converter/wiki_converter.rb +37 -0
  54. data/lib/moodle2cc/version.rb +1 -1
  55. data/spec/moodle2cc/canvas_cc/calculated_question_writer_spec.rb +7 -0
  56. data/spec/moodle2cc/canvas_cc/matching_question_writer_spec.rb +2 -2
  57. data/spec/moodle2cc/canvas_cc/models/assessment_spec.rb +1 -1
  58. data/spec/moodle2cc/canvas_cc/models/calculated_question_spec.rb +25 -0
  59. data/spec/moodle2cc/canvas_cc/models/page_spec.rb +6 -0
  60. data/spec/moodle2cc/canvas_cc/multiple_answers_question_writer_spec.rb +4 -1
  61. data/spec/moodle2cc/canvas_cc/multiple_blanks_question_writer_spec.rb +1 -1
  62. data/spec/moodle2cc/canvas_cc/multiple_dropdowns_question_writer_spec.rb +46 -0
  63. data/spec/moodle2cc/moodle2/extractor_spec.rb +8 -0
  64. data/spec/moodle2cc/moodle2/models/label_spec.rb +4 -4
  65. data/spec/moodle2cc/moodle2/parsers/parser_helper_spec.rb +10 -0
  66. data/spec/moodle2cc/moodle2/parsers/question_parsers/calculated_parser_spec.rb +17 -0
  67. data/spec/moodle2cc/moodle2/parsers/questionnaire_parser_spec.rb +4 -0
  68. data/spec/moodle2cc/moodle2/parsers/quiz_parser_spec.rb +1 -1
  69. data/spec/moodle2cc/moodle2/parsers/wiki_parser_spec.rb +23 -0
  70. data/spec/moodle2cc/moodle2converter/assessment_converter_spec.rb +12 -7
  71. data/spec/moodle2cc/moodle2converter/converter_helper_spec.rb +5 -0
  72. data/spec/moodle2cc/moodle2converter/html_converter_spec.rb +7 -2
  73. data/spec/moodle2cc/moodle2converter/label_converter_spec.rb +17 -0
  74. data/spec/moodle2cc/moodle2converter/migrator_spec.rb +83 -2
  75. data/spec/moodle2cc/moodle2converter/question_converters/calculated_converter_spec.rb +2 -0
  76. data/spec/moodle2cc/moodle2converter/question_converters/matching_converter_spec.rb +2 -3
  77. data/spec/moodle2cc/moodle2converter/question_converters/multichoice_converter_spec.rb +26 -0
  78. data/spec/moodle2cc/moodle2converter/question_converters/question_converter_spec.rb +0 -3
  79. data/spec/moodle2cc/moodle2converter/wiki_converter_spec.rb +36 -0
  80. data/test/fixtures/moodle2/backup/activities/quiz_5/quiz.xml +1 -1
  81. data/test/fixtures/moodle2/backup/activities/wiki_58541/calendar.xml +3 -0
  82. data/test/fixtures/moodle2/backup/activities/wiki_58541/completion.xml +3 -0
  83. data/test/fixtures/moodle2/backup/activities/wiki_58541/grades.xml +7 -0
  84. data/test/fixtures/moodle2/backup/activities/wiki_58541/inforef.xml +47 -0
  85. data/test/fixtures/moodle2/backup/activities/wiki_58541/module.xml +28 -0
  86. data/test/fixtures/moodle2/backup/activities/wiki_58541/roles.xml +7 -0
  87. data/test/fixtures/moodle2/backup/activities/wiki_58541/wiki.xml +70 -0
  88. data/test/fixtures/moodle2/backup/moodle_backup.xml +7 -0
  89. metadata +33 -2
@@ -6,7 +6,7 @@ module Moodle2CC::Moodle2Converter
6
6
  canvas_bank = Moodle2CC::CanvasCC::Models::QuestionBank.new
7
7
 
8
8
  canvas_bank.identifier = generate_unique_identifier_for(moodle_category.id, QUESTION_BANK_SUFFIX)
9
- canvas_bank.title = moodle_category.name
9
+ canvas_bank.title = truncate_text(moodle_category.name)
10
10
 
11
11
  question_converter = Moodle2CC::Moodle2Converter::QuestionConverters::QuestionConverter.new
12
12
  moodle_category.questions.each do |moodle_question|
@@ -3,6 +3,7 @@ module Moodle2CC::Moodle2Converter
3
3
  require_relative 'question_converters/question_converter'
4
4
  require_relative 'question_converters/calculated_converter'
5
5
  require_relative 'question_converters/matching_converter'
6
+ require_relative 'question_converters/multichoice_converter'
6
7
  require_relative 'question_converters/multiple_blanks_converter'
7
8
  require_relative 'question_converters/numerical_converter'
8
9
  require_relative 'question_converters/random_sa_converter'
@@ -9,6 +9,7 @@ module Moodle2CC::Moodle2Converter
9
9
  canvas_question.correct_answer_format = moodle_question.correct_answer_format
10
10
  canvas_question.correct_answer_length = moodle_question.correct_answer_length
11
11
  canvas_question.dataset_definitions = moodle_question.dataset_definitions
12
+ canvas_question.var_sets = moodle_question.var_sets
12
13
  canvas_question.tolerance = moodle_question.tolerance
13
14
  canvas_question
14
15
  end
@@ -13,6 +13,9 @@ module Moodle2CC::Moodle2Converter
13
13
  copy[:question_text] ||= ''
14
14
  copy[:question_text].gsub(/\{(.*?)\}/, '[\1]')
15
15
  copy[:question_text] = RDiscount.new(copy[:question_text]).to_html if copy[:question_text_format].to_i == 4 # markdown
16
+ copy[:question_text] = Nokogiri::HTML(copy[:question_text]).text
17
+ copy[:answer_text] = Nokogiri::HTML(copy[:answer_text]).text
18
+
16
19
  canvas_question.matches << copy
17
20
  end
18
21
  canvas_question
@@ -0,0 +1,15 @@
1
+ module Moodle2CC::Moodle2Converter
2
+ module QuestionConverters
3
+ class MultichoiceConverter < QuestionConverter
4
+ register_converter_type 'multichoice'
5
+
6
+ def create_canvas_question(question_type, moodle_question)
7
+ if moodle_question.single
8
+ Moodle2CC::CanvasCC::Models::Question.create('multiple_choice_question')
9
+ else
10
+ Moodle2CC::CanvasCC::Models::Question.create('multiple_answers_question')
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -7,7 +7,7 @@ module Moodle2CC::Moodle2Converter
7
7
  def convert_question(moodle_question)
8
8
  canvas_question = super
9
9
 
10
- canvas_question.material.gsub!(/\[\#(\d+)\]/) do |match|
10
+ canvas_question.material.gsub!(/\{\#(\d+)\}/) do |match|
11
11
  "[response#{$1}]"
12
12
  end
13
13
 
@@ -15,7 +15,6 @@ module Moodle2CC::Moodle2Converter
15
15
  STANDARD_CONVERSIONS = {
16
16
  'description' => 'text_only_question',
17
17
  'essay' => 'essay_question',
18
- 'multichoice' => 'multiple_choice_question',
19
18
  'shortanswer' => 'short_answer_question'
20
19
  }
21
20
 
@@ -31,10 +30,10 @@ module Moodle2CC::Moodle2Converter
31
30
  end
32
31
 
33
32
  def convert_question(moodle_question, question_type = nil)
34
- canvas_question = create_canvas_question(question_type)
33
+ canvas_question = create_canvas_question(question_type, moodle_question)
35
34
  canvas_question.identifier = generate_unique_identifier_for(moodle_question.id, '_quiz_question')
36
35
  canvas_question.original_identifier = moodle_question.id
37
- canvas_question.title = moodle_question.name
36
+ canvas_question.title = truncate_text(moodle_question.name)
38
37
  canvas_question.general_feedback = moodle_question.general_feedback
39
38
  canvas_question.answers = moodle_question.answers.map do |moodle_answer|
40
39
  Moodle2CC::CanvasCC::Models::Answer.new(moodle_answer)
@@ -45,12 +44,11 @@ module Moodle2CC::Moodle2Converter
45
44
 
46
45
  def convert_question_text(moodle_question)
47
46
  material = moodle_question.question_text || ''
48
- material = material.gsub(/\{(.*?)\}/, '[\1]')
49
47
  material = RDiscount.new(material).to_html if moodle_question.question_text_format.to_i == 4 # markdown
50
48
  material
51
49
  end
52
50
 
53
- def create_canvas_question(question_type = nil)
51
+ def create_canvas_question(question_type = nil, question = nil)
54
52
  question_type ||= self.class.canvas_question_type
55
53
  raise 'set canvas_question_type in question converter subclasses' unless question_type
56
54
  Moodle2CC::CanvasCC::Models::Question.create(question_type)
@@ -5,7 +5,7 @@ module Moodle2CC::Moodle2Converter
5
5
  def convert_questionnaire(moodle_questionnaire)
6
6
  canvas_assessment = Moodle2CC::CanvasCC::Models::Assessment.new
7
7
  canvas_assessment.identifier = generate_unique_identifier_for(moodle_questionnaire.id, QUESTIONNAIRE_ASSESSMENT_SUFFIX)
8
- canvas_assessment.title = moodle_questionnaire.name
8
+ canvas_assessment.title = truncate_text(moodle_questionnaire.name)
9
9
  canvas_assessment.description = moodle_questionnaire.intro
10
10
  canvas_assessment.workflow_state = workflow_state(moodle_questionnaire.visible)
11
11
 
@@ -17,6 +17,7 @@ module Moodle2CC::Moodle2Converter
17
17
 
18
18
  canvas_assessment.items = []
19
19
  moodle_questionnaire.questions.each do |question|
20
+ next if question.deleted
20
21
  if canvas_question = convert_questionnaire_question(question)
21
22
  canvas_assessment.items << canvas_question
22
23
  end
@@ -32,7 +33,7 @@ module Moodle2CC::Moodle2Converter
32
33
  4 => 'multiple_choice_question', # radio buttons question
33
34
  5 => 'multiple_answers_question', # check boxes question
34
35
  6 => 'multiple_choice_question', # dropdown box question
35
- 8 => 'multiple_choice_question', # rate 1..5 question
36
+ 8 => 'multiple_dropdowns_question', # rate 1..5 question
36
37
  9 => 'essay_question', # date question
37
38
  10 => 'numerical_question', # numeric question
38
39
  100 => 'text_only_question', # label question
@@ -43,16 +44,51 @@ module Moodle2CC::Moodle2Converter
43
44
 
44
45
  canvas_question = Moodle2CC::CanvasCC::Models::Question.create(canvas_type)
45
46
  canvas_question.identifier = generate_unique_identifier_for(moodle_question.id, "_questionnaire_question")
46
- canvas_question.title = moodle_question.name
47
+ canvas_question.title = truncate_text(moodle_question.name)
47
48
  canvas_question.material = moodle_question.content
48
49
  canvas_question.answers = []
49
- moodle_question.choices.each do |choice|
50
- answer = Moodle2CC::CanvasCC::Models::Answer.new
51
- answer.id = choice[:id]
52
- answer.answer_text = choice[:content]
53
- canvas_question.answers << answer
50
+
51
+ if canvas_type == 'multiple_dropdowns_question'
52
+ # rating scale question
53
+ convert_rating_question(moodle_question, canvas_question)
54
+ else
55
+ moodle_question.choices.each do |choice|
56
+ answer = Moodle2CC::CanvasCC::Models::Answer.new
57
+ answer.id = choice[:id]
58
+ answer.answer_text = choice[:content]
59
+ canvas_question.answers << answer
60
+ end
54
61
  end
62
+
55
63
  canvas_question
56
64
  end
65
+
66
+ # For l..x rating questions
67
+ def convert_rating_question(moodle_question, canvas_question)
68
+ choices = create_rating_choices(moodle_question)
69
+ canvas_question.responses = []
70
+
71
+ moodle_question.choices.each_with_index do |answer, answer_idx|
72
+ response = {:id => "response#{answer_idx + 1}", :choices => []}
73
+
74
+ # add dropdown to the question text
75
+ canvas_question.material = canvas_question.material.to_s + "<p>#{answer[:content]} [#{response[:id]}]</p>"
76
+
77
+ choices.each_with_index do |choice, choice_idx|
78
+ response[:choices] << {:id => "#{moodle_question.id}_choice_#{answer_idx}_#{choice_idx}", :text => choice}
79
+ end
80
+
81
+ canvas_question.responses << response
82
+ end
83
+ end
84
+
85
+ def create_rating_choices(moodle_question)
86
+ scale = (moodle_question.length || 5).to_i
87
+ choices = (1..scale).map(&:to_s)
88
+ if moodle_question.precise.to_i == 1
89
+ choices << "N/A"
90
+ end
91
+ choices
92
+ end
57
93
  end
58
94
  end
@@ -14,7 +14,7 @@ module Moodle2CC
14
14
  def convert(moodle_section)
15
15
  canvas_module = CanvasCC::Models::CanvasModule.new
16
16
  canvas_module.identifier = generate_unique_identifier_for(moodle_section.id, MODULE_SUFFIX)
17
- canvas_module.title = moodle_section.name
17
+ canvas_module.title = truncate_text(moodle_section.name)
18
18
  canvas_module.workflow_state = workflow_state(moodle_section.visible)
19
19
 
20
20
  canvas_module.module_items += convert_activity(moodle_section) if moodle_section.summary && !moodle_section.summary.strip.empty?
@@ -27,7 +27,7 @@ module Moodle2CC
27
27
  def convert_to_summary_page(moodle_section)
28
28
  canvas_page = CanvasCC::Models::Page.new
29
29
  canvas_page.identifier = generate_unique_identifier_for_activity(moodle_section)
30
- canvas_page.title = moodle_section.name
30
+ canvas_page.title = truncate_text(moodle_section.name)
31
31
  canvas_page.workflow_state = workflow_state(moodle_section.visible)
32
32
  canvas_page.editing_roles = CanvasCC::Models::Page::EDITING_ROLE_TEACHER
33
33
  canvas_page.body = moodle_section.summary
@@ -48,7 +48,7 @@ module Moodle2CC
48
48
  module_item = CanvasCC::Models::ModuleItem.new
49
49
  module_item.identifier = generate_unique_identifier
50
50
  module_item.workflow_state = workflow_state(moodle_activity.visible)
51
- module_item.title = moodle_activity.name
51
+ module_item.title = truncate_text(moodle_activity.name)
52
52
  unless moodle_activity.is_a? Moodle2::Models::Label
53
53
  if moodle_activity.is_a? Moodle2::Models::ExternalUrl
54
54
  module_item.identifierref = module_item.identifier
@@ -0,0 +1,37 @@
1
+ module Moodle2CC::Moodle2Converter
2
+ class WikiConverter
3
+ include ConverterHelper
4
+
5
+ def convert(moodle_wiki)
6
+ canvas_pages = []
7
+
8
+ moodle_wiki.pages.each do |moodle_page|
9
+ canvas_page = Moodle2CC::CanvasCC::Models::Page.new
10
+ canvas_page.identifier = generate_unique_identifier_for("#{moodle_wiki.id}#{moodle_page[:id]}") + PAGE_SUFFIX
11
+ canvas_page.page_name = truncate_text(moodle_page[:title])
12
+ canvas_page.workflow_state = workflow_state(moodle_wiki.visible)
13
+ canvas_page.editing_roles = 'teachers'
14
+ canvas_page.body = moodle_page[:content]
15
+ canvas_pages << canvas_page
16
+ end
17
+
18
+ if moodle_wiki.first_page_title.to_s.strip.length > 0 &&
19
+ (first_page = canvas_pages.detect{|page| page.title.to_s.strip == moodle_wiki.first_page_title.to_s.strip})
20
+ first_page.identifier = generate_unique_identifier_for("#{moodle_wiki.id}") + PAGE_SUFFIX
21
+ first_page.body = moodle_wiki.intro.to_s + first_page.body.to_s
22
+ first_page.page_name = moodle_wiki.name
23
+ else
24
+ first_page = Moodle2CC::CanvasCC::Models::Page.new
25
+ first_page.identifier = generate_unique_identifier_for("#{moodle_wiki.id}") + PAGE_SUFFIX
26
+ first_page.body = moodle_wiki.intro
27
+ first_page.workflow_state = workflow_state(moodle_wiki.visible)
28
+ first_page.editing_roles = 'teachers'
29
+ first_page.page_name = moodle_wiki.name
30
+ canvas_pages << first_page
31
+ end
32
+
33
+ canvas_pages
34
+ end
35
+
36
+ end
37
+ end
@@ -1,3 +1,3 @@
1
1
  module Moodle2CC
2
- VERSION = "0.2.5"
2
+ VERSION = "0.2.6"
3
3
  end
@@ -31,6 +31,8 @@ module Moodle2CC::CanvasCC
31
31
  }
32
32
  ]
33
33
 
34
+ question.var_sets = [{:ident => '1', :vars => {'A' => '3.6', 'B' => '3.1'}}]
35
+
34
36
  xml = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |node|
35
37
  QuestionWriter.write_question(node, question)
36
38
  end.doc
@@ -76,6 +78,11 @@ module Moodle2CC::CanvasCC
76
78
  b_var = calculated.at_xpath('vars/var[@scale="1"][@name="B"]')
77
79
  expect(b_var.at_xpath('min').text).to eq '10.0'
78
80
  expect(b_var.at_xpath('max').text).to eq '20.0'
81
+
82
+ # Var sets
83
+ var_set = calculated.at_xpath('var_sets/var_set[@ident="3631"]')
84
+ expect(var_set.at_xpath('var[@name="A"]').text).to eq "3.6"
85
+ expect(var_set.at_xpath('var[@name="B"]').text).to eq "3.1"
79
86
  end
80
87
  end
81
88
  end
@@ -24,12 +24,12 @@ module Moodle2CC::CanvasCC
24
24
  expect(xml.at_xpath("item/itemmetadata/qtimetadata/qtimetadatafield[fieldlabel=\"question_type\" and fieldentry=\"#{question.question_type}\"]")).to_not be_nil
25
25
 
26
26
  response = xml.at_xpath("item/presentation/response_lid[@ident=\"response_#{match1[:id]}\"]")
27
- expect(response.at_xpath('material/mattext[@texttype="text/html"]').text).to eq match1[:question_text]
27
+ expect(response.at_xpath('material/mattext[@texttype="text/plain"]').text).to eq match1[:question_text]
28
28
  expect(response.at_xpath("render_choice/response_label[@ident=\"#{match1[:id]}\"]/material/mattext").text).to eq match1[:answer_text]
29
29
  expect(response.at_xpath("render_choice/response_label[@ident=\"#{match2[:id]}\"]/material/mattext").text).to eq match2[:answer_text]
30
30
 
31
31
  response = xml.at_xpath("item/presentation/response_lid[@ident=\"response_#{match2[:id]}\"]")
32
- expect(response.at_xpath('material/mattext[@texttype="text/html"]').text).to eq match2[:question_text]
32
+ expect(response.at_xpath('material/mattext[@texttype="text/plain"]').text).to eq match2[:question_text]
33
33
  expect(response.at_xpath("render_choice/response_label[@ident=\"#{match1[:id]}\"]/material/mattext").text).to eq match1[:answer_text]
34
34
  expect(response.at_xpath("render_choice/response_label[@ident=\"#{match2[:id]}\"]/material/mattext").text).to eq match2[:answer_text]
35
35
 
@@ -72,7 +72,7 @@ describe Moodle2CC::CanvasCC::Models::Assessment do
72
72
  group.questions = [q2]
73
73
  qb2.question_groups = [group]
74
74
 
75
- subject.resolve_question_references([qb1, qb2])
75
+ subject.resolve_question_references!([qb1, qb2])
76
76
 
77
77
  expect(subject.items.count).to eq 3
78
78
  expect(subject.items[0].points_possible).to eq '2'
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+
3
+ describe Moodle2CC::CanvasCC::Models::CalculatedQuestion do
4
+
5
+ context '#post_process!' do
6
+ it 'should replace {variables} with [variables] in material' do
7
+ subject.material = "{varname} {not * s valid var name and stuff}"
8
+
9
+ subject.post_process!
10
+
11
+ expect(subject.material).to eq "[varname] {not * s valid var name and stuff}"
12
+ end
13
+
14
+ it 'should replace {variables} with variables in formulae (and strip =)' do
15
+ answer = Moodle2CC::CanvasCC::Models::Answer.new
16
+ answer.answer_text = "={A}*{B}"
17
+ subject.answers = [answer]
18
+
19
+ subject.post_process!
20
+
21
+ expect(subject.answers.first.answer_text).to eq "A*B"
22
+ end
23
+ end
24
+
25
+ end
@@ -24,5 +24,11 @@ module Moodle2CC::CanvasCC::Models
24
24
  expect(page.title).to eq 'My Page Name'
25
25
  end
26
26
 
27
+ it "truncates urls that are too long" do
28
+ page.page_name = 'a' * 500
29
+ expected = "wiki_content/#{'a' * Moodle2CC::CanvasCC::Models::Page::MAX_URL_LENGTH}.html"
30
+ expect(page.href).to eq expected
31
+ end
32
+
27
33
  end
28
34
  end
@@ -14,12 +14,15 @@ module Moodle2CC::CanvasCC
14
14
  answer1 = Moodle2CC::CanvasCC::Models::Answer.new
15
15
  answer1.id = '1'
16
16
  answer1.answer_text = 'something'
17
+ answer1.fraction = '0.5'
17
18
  answer2 = Moodle2CC::CanvasCC::Models::Answer.new
18
19
  answer2.id = '2'
19
20
  answer2.answer_text = 'something else'
21
+ answer2.fraction = '0'
20
22
  answer3 = Moodle2CC::CanvasCC::Models::Answer.new
21
23
  answer3.id = '3'
22
24
  answer3.answer_text = 'something something else'
25
+ answer3.fraction = '0.5'
23
26
  question.answers = [answer1, answer2, answer3]
24
27
 
25
28
  xml = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |node|
@@ -41,7 +44,7 @@ module Moodle2CC::CanvasCC
41
44
  condition = xml.at_xpath("item/resprocessing/respcondition[@continue=\"No\"]")
42
45
  expect(condition.at_xpath("conditionvar/and/varequal[@respident=\"response1\" and text()=\"#{answer1.id}\"]")).not_to be_nil
43
46
  expect(condition.at_xpath("conditionvar/and/not/varequal[@respident=\"response1\" and text()=\"#{answer2.id}\"]")).not_to be_nil
44
- expect(condition.at_xpath("conditionvar/and/not/varequal[@respident=\"response1\" and text()=\"#{answer3.id}\"]")).not_to be_nil
47
+ expect(condition.at_xpath("conditionvar/and/varequal[@respident=\"response1\" and text()=\"#{answer3.id}\"]")).not_to be_nil
45
48
  end
46
49
  end
47
50
  end
@@ -5,7 +5,7 @@ module Moodle2CC::CanvasCC
5
5
 
6
6
  let(:question) { Moodle2CC::CanvasCC::Models::Question.create('fill_in_multiple_blanks_question')}
7
7
 
8
- it 'creates the question item xml for a multiple_choice_question' do
8
+ it 'creates the question item xml for a multiple blanks question' do
9
9
  question.identifier = 4200
10
10
  question.title = 'hello'
11
11
  question.general_feedback = 'feedbacks'
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ module Moodle2CC::CanvasCC
4
+ describe MultipleDropdownsQuestionWriter do
5
+
6
+ let(:question) { Moodle2CC::CanvasCC::Models::Question.create('multiple_dropdowns_question')}
7
+
8
+ it 'creates the question item xml for a multiple_dropdowns_question' do
9
+ question.identifier = 4200
10
+ question.title = 'hello'
11
+ question.general_feedback = 'feedbacks'
12
+ question.material = 'the first question is [response1] and the second is [response2]'
13
+ question.answers = []
14
+ question.responses = [
15
+ {:id => "response1", :choices => [
16
+ {:id => "3_choice_0_0", :text => "1"},
17
+ {:id => "3_choice_0_1", :text => "2"}
18
+ ]},
19
+ {:id => "response2", :choices => [
20
+ {:id => "3_choice_1_0", :text => "1"},
21
+ {:id => "3_choice_1_1", :text => "2"}
22
+ ]}
23
+ ]
24
+
25
+ xml = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |node|
26
+ QuestionWriter.write_question(node, question)
27
+ end.doc
28
+
29
+ expect(xml.at_xpath('item/@ident').value).to eq question.identifier.to_s
30
+ expect(xml.at_xpath('item/@title').value).to eq question.title
31
+ expect(xml.at_xpath("item/itemmetadata/qtimetadata/qtimetadatafield[fieldlabel=\"question_type\" and fieldentry=\"#{question.question_type}\"]")).to_not be_nil
32
+
33
+ # first response
34
+ response = xml.xpath('item/presentation/response_lid')[0]
35
+ expect(response.attributes['ident'].value).to eq 'response_response1'
36
+ expect(response.at_xpath("render_choice/response_label[@ident=\"3_choice_0_0\"]/material/mattext[@texttype=\"text/plain\" and text()=\"1\"]")).not_to be_nil
37
+ expect(response.at_xpath("render_choice/response_label[@ident=\"3_choice_0_1\"]/material/mattext[@texttype=\"text/plain\" and text()=\"2\"]")).not_to be_nil
38
+
39
+ # second response
40
+ response = xml.xpath('item/presentation/response_lid')[1]
41
+ expect(response.attributes['ident'].value).to eq 'response_response2'
42
+ expect(response.at_xpath("render_choice/response_label[@ident=\"3_choice_1_0\"]/material/mattext[@texttype=\"text/plain\" and text()=\"1\"]")).not_to be_nil
43
+ expect(response.at_xpath("render_choice/response_label[@ident=\"3_choice_1_1\"]/material/mattext[@texttype=\"text/plain\" and text()=\"2\"]")).not_to be_nil
44
+ end
45
+ end
46
+ end
@@ -11,6 +11,7 @@ module Moodle2CC::Moodle2
11
11
  Parsers::SectionParser.any_instance.stub(:parse)
12
12
  Parsers::FileParser.any_instance.stub(:parse)
13
13
  Parsers::PageParser.any_instance.stub(:parse)
14
+ Parsers::WikiParser.any_instance.stub(:parse)
14
15
  Parsers::ForumParser.any_instance.stub(:parse)
15
16
  Parsers::AssignmentParser.any_instance.stub(:parse)
16
17
  Parsers::BookParser.any_instance.stub(:parse)
@@ -103,6 +104,13 @@ module Moodle2CC::Moodle2
103
104
  expect(course.pages).to eq [page]
104
105
  end
105
106
 
107
+ it 'parses wikis' do
108
+ wiki = Models::Wiki.new
109
+ Parsers::WikiParser.any_instance.stub(:parse).and_return([wiki])
110
+ extractor.extract {}
111
+ expect(course.wikis).to eq [wiki]
112
+ end
113
+
106
114
  it 'parses forums' do
107
115
  forum = Models::Forum.new
108
116
  Parsers::ForumParser.any_instance.stub(:parse).and_return([forum])