sambal-cle 0.1.3 → 0.1.4

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 (53) hide show
  1. data/README.md +3 -1
  2. data/lib/sambal-cle/base_page.rb +3 -1
  3. data/lib/sambal-cle/data_objects/announcement.rb +7 -10
  4. data/lib/sambal-cle/data_objects/assessment.rb +265 -9
  5. data/lib/sambal-cle/data_objects/assignment.rb +38 -32
  6. data/lib/sambal-cle/data_objects/assignment_permissions.rb +61 -0
  7. data/lib/sambal-cle/data_objects/assignment_submission.rb +126 -0
  8. data/lib/sambal-cle/data_objects/blog.rb +4 -7
  9. data/lib/sambal-cle/data_objects/blogger.rb +4 -10
  10. data/lib/sambal-cle/data_objects/chat_room.rb +5 -8
  11. data/lib/sambal-cle/data_objects/event.rb +6 -17
  12. data/lib/sambal-cle/data_objects/forum.rb +9 -19
  13. data/lib/sambal-cle/data_objects/lesson.rb +8 -29
  14. data/lib/sambal-cle/data_objects/message.rb +7 -10
  15. data/lib/sambal-cle/data_objects/poll.rb +6 -11
  16. data/lib/sambal-cle/data_objects/resource.rb +28 -37
  17. data/lib/sambal-cle/data_objects/site.rb +6 -17
  18. data/lib/sambal-cle/data_objects/syllabus.rb +6 -8
  19. data/lib/sambal-cle/data_objects/user.rb +88 -0
  20. data/lib/sambal-cle/data_objects/web_content_tool.rb +5 -6
  21. data/lib/sambal-cle/data_objects/wiki.rb +6 -6
  22. data/lib/sambal-cle/page_objects/account.rb +0 -2
  23. data/lib/sambal-cle/page_objects/announcements.rb +0 -1
  24. data/lib/sambal-cle/page_objects/assessments.rb +57 -87
  25. data/lib/sambal-cle/page_objects/assignments.rb +117 -337
  26. data/lib/sambal-cle/page_objects/calendar.rb +0 -2
  27. data/lib/sambal-cle/page_objects/login.rb +3 -9
  28. data/lib/sambal-cle/page_objects/sections.rb +2 -3
  29. data/lib/sambal-cle/page_objects/site_setup.rb +9 -19
  30. data/lib/sambal-cle/rich_text.rb +6 -0
  31. data/lib/sambal-cle/utilities.rb +4 -10
  32. data/lib/sambal-cle/workflows.rb +1 -5
  33. data/lib/sambal-cle.rb +2 -10
  34. data/sambal-cle.gemspec +7 -8
  35. data/test/add_assignment_to_calendar_spec.rb +14 -15
  36. data/test/assessment_create_spec.rb +355 -0
  37. data/test/assignment_announcements_spec.rb +14 -15
  38. data/test/assignment_duplicate_spec.rb +56 -0
  39. data/test/assignment_gradebook_spec.rb +16 -15
  40. data/test/assignment_permissions_spec.rb +77 -0
  41. data/test/assignments_grading_spec.rb +123 -0
  42. data/test/assignments_submission_spec.rb +143 -0
  43. data/test/config.yml +3 -0
  44. data/test/directory.yml +120 -0
  45. data/test/duplicate_site_spec.rb +5 -3
  46. data/test/import_site_content_spec.rb +248 -0
  47. metadata +22 -31
  48. data/lib/sambal-cle/core-ext.rb +0 -90
  49. data/lib/sambal-cle/date_makers.rb +0 -118
  50. data/lib/sambal-cle/gem_ext.rb +0 -23
  51. data/lib/sambal-cle/page_helper.rb +0 -22
  52. data/lib/sambal-cle/page_maker.rb +0 -48
  53. data/lib/sambal-cle/randomizers.rb +0 -117
@@ -35,7 +35,6 @@ class AssessmentsBase <BasePage
35
35
  element(:keywords) { |b| b.frm.text_field(:id=>/:keyfield/) }
36
36
  # QuestionPoolsList
37
37
  action(:save) { |b| b.frm.button(:id=>"questionpool:submit").click }
38
- action(:cancel) { |b| b.frm.button(:value=>"Cancel").click }
39
38
  end
40
39
  end
41
40
  end
@@ -56,7 +55,6 @@ class AssessmentsList < AssessmentsBase
56
55
  # then returns them as an Array.
57
56
  def pending_assessment_titles
58
57
  titles =[]
59
- pending_table = frm.table(:id=>"authorIndexForm:coreAssessments")
60
58
  1.upto(pending_table.rows.size-1) do |x|
61
59
  titles << pending_table[x][1].span(:id=>/assessmentTitle/).text
62
60
  end
@@ -67,7 +65,6 @@ class AssessmentsList < AssessmentsBase
67
65
  # then returns them as an Array.
68
66
  def published_assessment_titles
69
67
  titles =[]
70
- published_table = frm.div(:class=>"tier2", :index=>2).table(:class=>"listHier", :index=>0)
71
68
  1.upto(published_table.rows.size-1) do |x|
72
69
  titles << published_table[x][1].span(:id=>/publishedAssessmentTitle/).text
73
70
  end
@@ -78,7 +75,6 @@ class AssessmentsList < AssessmentsBase
78
75
  # in the list.
79
76
  def inactive_assessment_titles
80
77
  titles =[]
81
- inactive_table = frm.div(:class=>"tier2", :index=>2).table(:id=>"authorIndexForm:inactivePublishedAssessments")
82
78
  1.upto(inactive_table.rows.size-1) do |x|
83
79
  titles << inactive_table[x][1].span(:id=>/inactivePublishedAssessmentTitle/).text
84
80
  end
@@ -88,12 +84,16 @@ class AssessmentsList < AssessmentsBase
88
84
  # Opens the selected test for scoring
89
85
  # then instantiates the AssessmentTotalScores class.
90
86
  # @param test_title [String] the title of the test to be clicked.
91
- def score_test(test_title)
92
- frm.tbody(:id=>"authorIndexForm:_id88:tbody_element").row(:text=>/#{Regexp.escape(test_title)}/).link(:id=>/authorIndexToScore/).click
93
- AssessmentTotalScores.new(@browser)
94
- end
87
+ pgmd(:score_test) { |test_title, b| b.frm.tbody(:id=>"authorIndexForm:_id88:tbody_element").row(:text=>/#{Regexp.escape(test_title)}/).link(:id=>/authorIndexToScore/).click }
88
+
89
+ pgmd(:publish) { |test_title, b| b.pending_table.tr(:text=>/#{Regexp.escape(test_title)}/).select(:name=>/Select/).select "Publish" }
90
+
91
+ pgmd(:edit) { |test_title, b| b.form(:id=>"authorIndexForm").tr(:text=>/#{Regexp.escape(test_title)}/).select(:name=>/Select/).select "Edit" }
95
92
 
96
93
  element(:title) { |b| b.frm.text_field(:id=>"authorIndexForm:title") }
94
+ element(:pending_table) { |b| b.frm.table(:id=>"authorIndexForm:coreAssessments") }
95
+ element(:published_table) { |b| b.frm.div(:class=>"tier2", :index=>2).table(:class=>"listHier", :index=>0) }
96
+ element(:inactive_table) { |b| b.frm.div(:class=>"tier2", :index=>2).table(:id=>"authorIndexForm:inactivePublishedAssessments") }
97
97
  element(:create_using_builder) { |b| b.frm.radio(:name=>"authorIndexForm:_id29", :index=>0) }
98
98
  element(:create_using_text) { |b| b.frm.radio(:name=>"authorIndexForm:_id29") }
99
99
  element(:select_assessment_type) { |b| b.frm.select(:id=>"authorIndexForm:assessmentTemplate") }
@@ -108,31 +108,20 @@ class PreviewOverview < BasePage
108
108
  frame_element
109
109
 
110
110
  # Scrapes the value of the due date from the page. Returns it as a string.
111
- def due_date
112
- frm.div(:class=>"tier2").table(:index=>0)[0][0].text
113
- end
111
+ value(:due_date) { |b| b.frm.frm.div(:class=>"tier2").table(:index=>0)[0][0].text }
114
112
 
115
113
  # Scrapes the value of the time limit from the page. Returns it as a string.
116
- def time_limit
117
- frm.div(:class=>"tier2").table(:index=>0)[3][0].text
118
- end
114
+ value(:time_limit) { |b| b.frm.frm.div(:class=>"tier2").table(:index=>0)[3][0].text }
119
115
 
120
116
  # Scrapes the submission limit from the page. Returns it as a string.
121
- def submission_limit
122
- frm.div(:class=>"tier2").table(:index=>0)[6][0].text
123
- end
117
+ value(:submission_limit) { |b| b.frm.frm.div(:class=>"tier2").table(:index=>0)[6][0].text }
124
118
 
125
119
  # Scrapes the Feedback policy from the page. Returns it as a string.
126
- def feedback
127
- frm.div(:class=>"tier2").table(:index=>0)[9][0].text
128
- end
120
+ value(:feedback) { |b| b.frm.div(:class=>"tier2").table(:index=>0)[9][0].text }
129
121
 
130
122
  # Clicks the Done button, then instantiates
131
123
  # the EditAssessment class.
132
- def done
133
- frm.button(:name=>"takeAssessmentForm:_id5").click
134
- EditAssessment.new(@browser)
135
- end
124
+ action(:done) { |b| b.frm.button(:name=>"takeAssessmentForm:_id5").click }
136
125
 
137
126
  action(:begin_assessment) { |b| b.frm.button(:id=>"takeAssessmentForm:beginAssessment3").click }
138
127
 
@@ -143,45 +132,44 @@ class AssessmentSettings < AssessmentsBase
143
132
 
144
133
  menu_bar_elements
145
134
 
135
+ expected_element :cancel_button
136
+
146
137
  # Scrapes the Assessment Type from the page and returns it as a string.
147
- def assessment_type_title
148
- frm.div(:class=>"tier2").table(:index=>0)[0][1].text
149
- end
138
+ value(:assessment_type_title) { |b| b.frm.div(:class=>"tier2").table(:index=>0)[0][1].text }
150
139
 
151
140
  # Scrapes the Assessment Author information from the page and returns it as a string.
152
- def assessment_type_author
153
- frm.div(:class=>"tier2").table(:index=>0)[1][1].text
154
- end
141
+ value(:assessment_type_author) { |b| b.frm.div(:class=>"tier2").table(:index=>0)[1][1].text }
155
142
 
156
143
  # Scrapes the Assessment Type Description from the page and returns it as a string.
157
- def assessment_type_description
158
- frm.div(:class=>"tier2").table(:index=>0)[2][1].text
159
- end
144
+ value(:assessment_type_description) { |b| b.frm.div(:class=>"tier2").table(:index=>0)[2][1].text }
160
145
 
161
146
  # Clicks the Save Settings and Publish button
162
147
  # then instantiates the PublishAssessment class.
163
- def save_and_publish
164
- frm.button(:value=>"Save Settings and Publish").click
165
- PublishAssessment.new(@browser)
166
- end
148
+ action(:save_and_publish) { |b| b.frm.button(:value=>"Save Settings and Publish").click }
167
149
 
168
- action(:open) { |b| b.frm.link(:text=>"Open") }
169
- action(:close) { |b| b.frm.link(:text=>"Close") }
150
+ action(:open) { |b| b.frm.link(:text=>"Open").click }
151
+ action(:close) { |b| b.frm.link(:text=>"Close").click }
152
+ # Introduction
170
153
  element(:title) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:intro:assessment_title") }
171
154
  element(:authors) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:intro:assessment_author") }
172
155
  element(:description) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:intro:_id44_textinput") }
173
156
  action(:add_attachments_to_intro) { |b| b.frm.button(:name=>"assessmentSettingsAction:intro:_id90").click }
157
+ # Delivery Dates
174
158
  element(:available_date) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:startDate") }
175
159
  element(:due_date) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:endDate") }
176
160
  element(:retract_date) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:retractDate") }
161
+ # Assessment Released To
177
162
  element(:released_to_anonymous) { |b| b.frm.radio(:name=>"assessmentSettingsAction:_id117") }
178
163
  element(:released_to_site) { |b| b.frm.radio(:name=>"assessmentSettingsAction:_id117") }
179
164
  element(:specified_ips) { |b| b.frm.text_field(:name=>"assessmentSettingsAction:_id132") }
165
+ # High Security
180
166
  element(:secondary_id) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:username") }
181
167
  element(:secondary_pw) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:password") }
168
+ element(:allow_specified_ips) { |b| b.frm.text_field(:name=>"assessmentSettingsAction:_id132") }
182
169
  element(:timed_assessment) { |b| b.frm.checkbox(:id=>"assessmentSettingsAction:selTimeAssess") }
183
170
  element(:limit_hour) { |b| b.frm.select(:id=>"assessmentSettingsAction:timedHours") }
184
171
  element(:limit_mins) { |b| b.frm.select(:id=>"assessmentSettingsAction:timedMinutes") }
172
+ # Assessment Organization
185
173
  element(:linear_access) { |b| b.frm.radio(:name=>"assessmentSettingsAction:itemNavigation") }
186
174
  element(:random_access) { |b| b.frm.radio(:name=>"assessmentSettingsAction:itemNavigation") }
187
175
  element(:question_per_page) { |b| b.frm.radio(:name=>"assessmentSettingsAction:assessmentFormat") }
@@ -189,14 +177,17 @@ class AssessmentSettings < AssessmentsBase
189
177
  element(:assessment_per_page) { |b| b.frm.radio(:name=>"assessmentSettingsAction:assessmentFormat") }
190
178
  element(:continuous_numbering) { |b| b.frm.radio(:name=>"assessmentSettingsAction:itemNumbering") }
191
179
  element(:restart_per_part) { |b| b.frm.radio(:name=>"assessmentSettingsAction:itemNumbering") }
180
+ # Mark for review
192
181
  element(:add_mark_for_review) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:markForReview1") }
193
182
  element(:unlimited_submissions) { |b| b.frm.radio(:name=>"assessmentSettingsAction:unlimitedSubmissions") }
194
183
  element(:only_x_submissions) { |b| b.frm.radio(:name=>"assessmentSettingsAction:unlimitedSubmissions") }
195
184
  element(:allowed_submissions) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:submissions_Allowed") }
196
185
  element(:late_submissions_not_accepted) { |b| b.frm.radio(:name=>"assessmentSettingsAction:lateHandling") }
197
186
  element(:late_submissions_accepted) { |b| b.frm.radio(:name=>"assessmentSettingsAction:lateHandling") }
198
- element(:submission_message) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:_id245_textinput") }
187
+ # Submission Message
188
+ element(:submission_message) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:_id250_textinput") }
199
189
  element(:final_page_url) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:finalPageUrl") }
190
+ # Feedback
200
191
  element(:question_level_feedback) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackAuthoring") }
201
192
  element(:selection_level_feedback) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackAuthoring") }
202
193
  element(:both_feedback_levels) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackAuthoring") }
@@ -229,8 +220,9 @@ class AssessmentSettings < AssessmentsBase
229
220
  #text_field(:objectives, :=>"") }
230
221
  #text_field(:rubrics, :=>"") }
231
222
  #checkbox(:record_metadata_for_questions, :=>"") }
232
- action(:save) { |b| b.frm.button(:name=>"assessmentSettingsAction:_id383").click }
233
- action(:cancel) { |b| b.frm.button(:name=>"assessmentSettingsAction:_id385").click }
223
+ action(:save) { |b| b.frm.button(:value=>"Save Settings").click }
224
+ element(:cancel_button) { |b| b.frm.button(:value=>"Cancel") }
225
+ action(:cancel) { |p| p.cancel_button.click }
234
226
 
235
227
  end
236
228
 
@@ -252,7 +244,7 @@ class AssessmentTotalScores < BasePage
252
244
  scores_table = frm.table(:id=>"editTotalResults:totalScoreTable").to_a
253
245
  scores_table.delete_at(0)
254
246
  scores_table.each { |row| ids << row[1] }
255
- return ids
247
+ ids
256
248
  end
257
249
 
258
250
  # Adds a comment to the specified student's comment box.
@@ -262,10 +254,10 @@ class AssessmentTotalScores < BasePage
262
254
  # selecting the appropriate comment box.
263
255
  # @param student_id [String] the target student id
264
256
  # @param comment [String] the text of the comment being made to the student
265
- def comment_for_student(student_id, comment)
266
- index_val = student_ids.index(student_id)
267
- frm.text_field(:name=>"editTotalResults:totalScoreTable:#{index_val}:_id345").value=comment
268
- end
257
+ pgmd(:comment_for_student) { |student_id, comment, b|
258
+ index_val = b.student_ids.index(student_id)
259
+ b.frm.text_field(:name=>"editTotalResults:totalScoreTable:#{index_val}:_id345").value=comment
260
+ }
269
261
 
270
262
  # Clicks the Submit Date link in the table header to sort/reverse sort the list.
271
263
  def sort_by_submit_date
@@ -340,60 +332,41 @@ class EditAssessment < AssessmentsBase
340
332
  # Allows removing a specified
341
333
  # Assessment part number.
342
334
  # @param part_num [String] the part number of the assessment you want
343
- def remove_part(part_num)
344
- frm.link(:xpath, "//a[contains(@onclick, 'assesssmentForm:parts:#{part_num.to_i-1}:copyToPool')]").click
345
- end
335
+ pgmd(:remove_part) { |part_num, b| b.frm.link(:xpath, "//a[contains(@onclick, 'assesssmentForm:parts:#{part_num.to_i-1}:copyToPool')]").click }
346
336
 
347
337
  # Clicks the Add Part button, then
348
338
  # instantiates the AddEditAssessmentPart page class.
349
- def add_part
350
- frm.link(:text=>"Add Part").click
351
- AddEditAssessmentPart.new(@browser)
352
- end
339
+ action(:add_part) { |b| b.frm.link(:text=>"Add Part").click }
353
340
 
354
341
  # Selects the desired question type from the
355
- # drop down list.
356
- element(:question_type) { |b| b.frm.select(:id=>"assesssmentForm:changeQType").select(qtype) }
342
+ # drop down list at the top of the page.
343
+ pgmd(:question_type) { |qtype, b| b.frm.select(:id=>"assesssmentForm:changeQType").select(qtype) }
357
344
 
358
345
  # Clicks the Preview button,
359
346
  # then instantiates the PreviewOverview page class.
360
- def preview
361
- frm.link(:text=>"Preview").click
362
- PreviewOverview.new(@browser)
363
- end
347
+ action(:preview) { |b| b.frm.link(:text=>"Preview").click }
364
348
 
365
349
  # Clicks the Settings link, then
366
350
  # instantiates the AssessmentSettings page class.
367
- def settings
368
- frm.link(:text=>"Settings").click
369
- AssessmentSettings.new(@browser)
370
- end
351
+ action(:settings) { |b| b.frm.link(:text=>"Settings").click }
371
352
 
372
353
  # Clicks the Publish button, then
373
354
  # instantiates the PublishAssessment page class.
374
- def publish
375
- frm.link(:text=>"Publish").click
376
- PublishAssessment.new(@browser)
377
- end
378
-
379
- # Clicks the Question Pools button, then
380
- # instantiates the QuestionPoolsList page class.
381
- def question_pools
382
- frm.link(:text=>"Question Pools").click
383
- QuestionPoolsList.new(@browser)
384
- end
355
+ action(:publish) { |b| b.frm.link(:text=>"Publish").click }
385
356
 
386
357
  # Allows retrieval of a specified question's
387
358
  # text, by part and question number.
388
359
  # @param part_num [String] the Part number containing the question you want
389
360
  # @param question_num [String] the number of the question you want
390
- def get_question_text(part_number, question_number)
391
- frm.table(:id=>"assesssmentForm:parts:#{part_number.to_i-1}:parts").div(:class=>"tier3", :index=>question_number.to_i-1).text
392
- end
361
+ pgmd(:get_question_text) { |part_number, question_number, b| b.frm.table(:id=>"assesssmentForm:parts:#{part_number.to_i-1}:parts").div(:class=>"tier3", :index=>question_number.to_i-1).text }
393
362
 
394
363
  action(:print) { |b| b.frm.button(:text=>"Print").click }
395
364
  action(:update_points) { |b| b.frm.button(:id=>"assesssmentForm:pointsUpdate").click }
396
365
 
366
+ pgmd(:add_question_to_part) { |part, p| p.assessment_form.row(:text=>/#{Regexp.escape(part)}/).select(:id=>/changeQType/) }
367
+
368
+ element(:assessment_form) { |b| b.table(:id=>"assesssmentForm:parts") }
369
+
397
370
  end
398
371
 
399
372
  # This is the page for adding and editing a part of an assessment
@@ -401,17 +374,16 @@ class AddEditAssessmentPart < BasePage
401
374
 
402
375
  frame_element
403
376
 
404
- # Clicks the Save button, then instantiates
405
- # the EditAssessment page class.
377
+ # Clicks the Save button
406
378
  def save
407
379
  frm.button(:name=>"modifyPartForm:_id89").click
408
- EditAssessment.new(@browser)
380
+
409
381
  end
410
382
 
411
383
  element(:title) { |b| b.frm.text_field(:id=>"modifyPartForm:title") }
412
384
  element(:information) { |b| b.frm.text_field(:id=>"modifyPartForm:_id10_textinput") }
413
385
  action(:add_attachments) { |b| b.frm.button(:name=>"modifyPartForm:_id54").click }
414
- element(:questions_one_by_one) { |b| b.frm.radio(:index=>0, :name=>"modifyPartForm:_id60") }
386
+ element(:one_by_one) { |b| b.frm.radio(:index=>0, :name=>"modifyPartForm:_id60") }
415
387
  element(:random_draw) { |b| b.frm.radio(:index=>1, :name=>"modifyPartForm:_id60") }
416
388
  element(:pool_name) { |b| b.frm.select(:id=>"modifyPartForm:assignToPool") }
417
389
  element(:number_of_questions) { |b| b.frm.text_field(:id=>"modifyPartForm:numSelected") }
@@ -433,14 +405,12 @@ end
433
405
  class PublishAssessment < BasePage
434
406
 
435
407
  frame_element
408
+ basic_page_elements
409
+
436
410
  # Clicks the Publish button, then
437
411
  # instantiates the AssessmentsList page class.
438
- def publish
439
- frm.button(:value=>"Publish").click
440
- AssessmentsList.new(@browser)
441
- end
412
+ action(:publish) { |b| b.frm.button(:value=>"Publish").click }
442
413
 
443
- action(:cancel) { |b| b.frm.button(:value=>"Cancel").click }
444
414
  action(:edit) { |b| b.frm.button(:name=>"publishAssessmentForm:_id23").click }
445
415
  element(:notification) { |b| b.frm.select(:id=>"publishAssessmentForm:number") }
446
416