sambal-cle 0.1.3

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 (90) hide show
  1. data/README.md +4 -0
  2. data/lib/sambal-cle/base_page.rb +20 -0
  3. data/lib/sambal-cle/core-ext.rb +90 -0
  4. data/lib/sambal-cle/data_objects/announcement.rb +82 -0
  5. data/lib/sambal-cle/data_objects/assessment.rb +32 -0
  6. data/lib/sambal-cle/data_objects/assignment.rb +205 -0
  7. data/lib/sambal-cle/data_objects/blog.rb +46 -0
  8. data/lib/sambal-cle/data_objects/blogger.rb +49 -0
  9. data/lib/sambal-cle/data_objects/chat_room.rb +54 -0
  10. data/lib/sambal-cle/data_objects/event.rb +89 -0
  11. data/lib/sambal-cle/data_objects/forum.rb +212 -0
  12. data/lib/sambal-cle/data_objects/lesson.rb +185 -0
  13. data/lib/sambal-cle/data_objects/message.rb +57 -0
  14. data/lib/sambal-cle/data_objects/poll.rb +74 -0
  15. data/lib/sambal-cle/data_objects/resource.rb +209 -0
  16. data/lib/sambal-cle/data_objects/site.rb +295 -0
  17. data/lib/sambal-cle/data_objects/syllabus.rb +73 -0
  18. data/lib/sambal-cle/data_objects/web_content_tool.rb +51 -0
  19. data/lib/sambal-cle/data_objects/wiki.rb +63 -0
  20. data/lib/sambal-cle/date_makers.rb +118 -0
  21. data/lib/sambal-cle/gem_ext.rb +23 -0
  22. data/lib/sambal-cle/page_helper.rb +22 -0
  23. data/lib/sambal-cle/page_maker.rb +48 -0
  24. data/lib/sambal-cle/page_objects/account.rb +111 -0
  25. data/lib/sambal-cle/page_objects/aliases.rb +43 -0
  26. data/lib/sambal-cle/page_objects/announcements.rb +190 -0
  27. data/lib/sambal-cle/page_objects/assessments.rb +874 -0
  28. data/lib/sambal-cle/page_objects/assignments.rb +770 -0
  29. data/lib/sambal-cle/page_objects/basic_lti.rb +6 -0
  30. data/lib/sambal-cle/page_objects/blogger.rb +205 -0
  31. data/lib/sambal-cle/page_objects/blogs.rb +60 -0
  32. data/lib/sambal-cle/page_objects/calendar.rb +330 -0
  33. data/lib/sambal-cle/page_objects/calendar_summary.rb +1 -0
  34. data/lib/sambal-cle/page_objects/chat_room.rb +22 -0
  35. data/lib/sambal-cle/page_objects/drop_box.rb +9 -0
  36. data/lib/sambal-cle/page_objects/email_archive.rb +22 -0
  37. data/lib/sambal-cle/page_objects/entity_picker.rb +62 -0
  38. data/lib/sambal-cle/page_objects/evaluations.rb +158 -0
  39. data/lib/sambal-cle/page_objects/feedback.rb +36 -0
  40. data/lib/sambal-cle/page_objects/forms.rb +120 -0
  41. data/lib/sambal-cle/page_objects/forums.rb +254 -0
  42. data/lib/sambal-cle/page_objects/glossary.rb +117 -0
  43. data/lib/sambal-cle/page_objects/gradebook.rb +29 -0
  44. data/lib/sambal-cle/page_objects/gradebook2.rb +17 -0
  45. data/lib/sambal-cle/page_objects/home.rb +36 -0
  46. data/lib/sambal-cle/page_objects/jforums.rb +444 -0
  47. data/lib/sambal-cle/page_objects/job_scheduler.rb +121 -0
  48. data/lib/sambal-cle/page_objects/lessons.rb +361 -0
  49. data/lib/sambal-cle/page_objects/login.rb +28 -0
  50. data/lib/sambal-cle/page_objects/matrix.rb +241 -0
  51. data/lib/sambal-cle/page_objects/media_gallery.rb +13 -0
  52. data/lib/sambal-cle/page_objects/messages.rb +622 -0
  53. data/lib/sambal-cle/page_objects/my_workspace.rb +44 -0
  54. data/lib/sambal-cle/page_objects/news.rb +8 -0
  55. data/lib/sambal-cle/page_objects/podcasts.rb +27 -0
  56. data/lib/sambal-cle/page_objects/polls.rb +69 -0
  57. data/lib/sambal-cle/page_objects/portfolio_templates.rb +161 -0
  58. data/lib/sambal-cle/page_objects/portfolios.rb +162 -0
  59. data/lib/sambal-cle/page_objects/post_em.rb +1 -0
  60. data/lib/sambal-cle/page_objects/profile.rb +51 -0
  61. data/lib/sambal-cle/page_objects/profile2.rb +344 -0
  62. data/lib/sambal-cle/page_objects/public_search.rb +61 -0
  63. data/lib/sambal-cle/page_objects/realms.rb +19 -0
  64. data/lib/sambal-cle/page_objects/resources.rb +326 -0
  65. data/lib/sambal-cle/page_objects/resources_roster.rb +0 -0
  66. data/lib/sambal-cle/page_objects/rosters.rb +70 -0
  67. data/lib/sambal-cle/page_objects/rwiki.rb +34 -0
  68. data/lib/sambal-cle/page_objects/search.rb +34 -0
  69. data/lib/sambal-cle/page_objects/sections.rb +295 -0
  70. data/lib/sambal-cle/page_objects/single_user.rb +1 -0
  71. data/lib/sambal-cle/page_objects/site_setup.rb +621 -0
  72. data/lib/sambal-cle/page_objects/site_statistics.rb +1 -0
  73. data/lib/sambal-cle/page_objects/sites.rb +255 -0
  74. data/lib/sambal-cle/page_objects/styles.rb +74 -0
  75. data/lib/sambal-cle/page_objects/syllabus.rb +166 -0
  76. data/lib/sambal-cle/page_objects/user_membership.rb +57 -0
  77. data/lib/sambal-cle/page_objects/users.rb +88 -0
  78. data/lib/sambal-cle/randomizers.rb +117 -0
  79. data/lib/sambal-cle/rich_text.rb +38 -0
  80. data/lib/sambal-cle/utilities.rb +31 -0
  81. data/lib/sambal-cle/workflows.rb +223 -0
  82. data/lib/sambal-cle.rb +31 -0
  83. data/sambal-cle.gemspec +14 -0
  84. data/test/add_assignment_to_calendar_spec.rb +86 -0
  85. data/test/assignment_announcements_spec.rb +71 -0
  86. data/test/assignment_gradebook_spec.rb +98 -0
  87. data/test/config.yml.template +4 -0
  88. data/test/directory.yml.template +123 -0
  89. data/test/duplicate_site_spec.rb +244 -0
  90. metadata +167 -0
@@ -0,0 +1,770 @@
1
+
2
+ #================
3
+ # Assignments Pages
4
+ #================
5
+
6
+ class AssignmentsBase < BasePage
7
+
8
+ frame_element
9
+
10
+ class << self
11
+
12
+ def menu_elements
13
+ action(:add_assignment) { |b| b.frm.link(:text=>"Add").click }
14
+ action(:assignment_list) { |b| b.frm.link(:text=>"Assignment List").click }
15
+ action(:grade_report) { |b| b.frm.link(:text=>"Grade Report").click }
16
+ action(:student_view) { |b| b.frm.link(:text=>"Student View").click }
17
+ action(:permissions) { |b| b.frm.link(:text=>"Permissions").click }
18
+ action(:options) { |b| b.frm.link(:text=>"Options").click }
19
+ end
20
+
21
+ def listview_elements
22
+ element(:select_page_size) { |b| b.frm.select(:name=>"selectPageSize") }
23
+ action(:next) { |b| b.frm.button(:name=>"eventSubmit_doList_next").click }
24
+ action(:last) { |b| b.frm.button(:name=>"eventSubmit_doList_last").click }
25
+ action(:previous) { |b| b.frm.button(:name=>"eventSubmit_doList_prev").click }
26
+ action(:first) { |b| b.frm.button(:name=>"eventSubmit_doList_first").click }
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+
33
+ # The page where you create a new assignment
34
+ class AssignmentAdd < AssignmentsBase
35
+
36
+ include FCKEditor
37
+ menu_elements
38
+
39
+ expected_element :editor
40
+
41
+ # Clicks the Post button, then
42
+ # next is the AssignmentsList page class.
43
+ action(:post) { |b| b.frm.button(:value=>"Post").click }
44
+
45
+ # Clicks the Cancel button, then
46
+ # next is the AssignmentsList page class.
47
+ action(:cancel) { |b| b.frm.button(:value=>"Cancel", :index=>-1).click }
48
+
49
+ # Clicks the Save Draft button, then
50
+ # next is the AssignmentsList page class.
51
+ action(:save_draft) { |b| b.frm.button(:name=>"save").click }
52
+
53
+ # Grabs the text contained in the alert box when
54
+ # it is present on the page (will throw an error if
55
+ # called when the box is not present).
56
+ value(:alert_text) { |b| b.frm.div(:class=>"portletBody").div(:class=>"alertMessage").text }
57
+
58
+ element(:editor) { |b| b.frm.frame(:id, "new_assignment_instructions___Frame") }
59
+
60
+ # Sends the specified text to the text box in the FCKEditor
61
+ # on the page.
62
+ def instructions=(instructions)
63
+ editor.td(:id, "xEditingArea").frame(:index=>0).send_keys([:command, 'a'], :backspace)
64
+ editor.td(:id, "xEditingArea").frame(:index=>0).send_keys(instructions)
65
+ end
66
+
67
+ # Clicks the Preview button, next is
68
+ # the AssignmentsPreview page class.
69
+ action(:preview) { |b| b.frm.button(:value=>"Preview").click }
70
+
71
+ # This is the warning message that appears when you
72
+ # select to add an assignment to the gradebook.
73
+ element(:gradebook_warning) { |b| b.frm.div(:class, "portletBody").span(:id, "gradebookListWarnAssoc") }
74
+
75
+ # Clicks the Add Attachments button, then
76
+ # next is the AssignmentAttachments page class.
77
+ action(:add_attachments) { |b| b.frm.button(:value=>"Add Attachments").click }
78
+
79
+ element(:assignment_id) { |b| b.frm.hidden(:name=>"assignmentId") }
80
+
81
+ element(:title) { |b| b.frm.text_field(:id=>"new_assignment_title") }
82
+ element(:open_month) { |b| b.frm.select(:id=>"new_assignment_openmonth") }
83
+ element(:open_day) { |b| b.frm.select(:id=>"new_assignment_openday") }
84
+ element(:open_year) { |b| b.frm.select(:id=>"new_assignment_openyear") }
85
+ element(:open_hour) { |b| b.frm.select(:id=>"new_assignment_openhour") }
86
+ element(:open_minute) { |b| b.frm.select(:id=>"new_assignment_openmin") }
87
+ element(:open_meridian) { |b| b.frm.select(:id=>"new_assignment_openampm") }
88
+ element(:due_month) { |b| b.frm.select(:id=>"new_assignment_duemonth") }
89
+ element(:due_day) { |b| b.frm.select(:id=>"new_assignment_dueday") }
90
+ element(:due_year) { |b| b.frm.select(:id=>"new_assignment_dueyear") }
91
+ element(:due_hour) { |b| b.frm.select(:id=>"new_assignment_duehour") }
92
+ element(:due_minute) { |b| b.frm.select(:id=>"new_assignment_duemin") }
93
+ element(:due_meridian) { |b| b.frm.select(:id=>"new_assignment_dueampm") }
94
+ element(:accept_month) { |b| b.frm.select(:id=>"new_assignment_closemonth") }
95
+ element(:accept_day) { |b| b.frm.select(:id=>"new_assignment_closeday") }
96
+ element(:accept_year) { |b| b.frm.select(:id=>"new_assignment_closeyear") }
97
+ element(:accept_hour) { |b| b.frm.select(:id=>"new_assignment_closehour") }
98
+ element(:accept_minute) { |b| b.frm.select(:id=>"new_assignment_closemin") }
99
+ element(:accept_meridian) { |b| b.frm.select(:id=>"new_assignment_closeampm") }
100
+ element(:student_submissions) { |b| b.frm.select(:id=>"subType") }
101
+ element(:grade_scale) { |b| b.frm.select(:id=>"new_assignment_grade_type") }
102
+ element(:allow_resubmission) { |b| b.frm.checkbox(:id=>"allowResToggle") }
103
+ element(:num_resubmissions) { |b| b.frm.form(:name=>"newAssignmentForm").select(:id=>"allowResubmitNumber") }
104
+ element(:resub_until_month) { |b| b.frm.form(:name=>"newAssignmentForm").select(:id=>"allow_resubmit_closeMonth") }
105
+ element(:resub_until_day) { |b| b.frm.form(:name=>"newAssignmentForm").select(:id=>"allow_resubmit_closeDay") }
106
+ element(:resub_until_year) { |b| b.frm.form(:name=>"newAssignmentForm").select(:id=>"allow_resubmit_closeYear") }
107
+ element(:resub_until_hour) { |b| b.frm.form(:name=>"newAssignmentForm").select(:id=>"allow_resubmit_closeHour") }
108
+ element(:resub_until_minute) { |b| b.frm.form(:name=>"newAssignmentForm").select(:id=>"allow_resubmit_closeMin") }
109
+ element(:resub_until_meridian) { |b| b.frm.form(:name=>"newAssignmentForm").select(:id=>"allow_resubmit_closeAMPM") }
110
+ element(:max_points) { |b| b.frm.text_field(:name=>"new_assignment_grade_points") }
111
+ element(:add_due_date) { |b| b.frm.checkbox(:id=>"new_assignment_check_add_due_date") }
112
+ element(:add_open_announcement) { |b| b.frm.checkbox(:id=>"new_assignment_check_auto_announce") }
113
+ element(:add_honor_pledge) { |b| b.frm.checkbox(:id=>"new_assignment_check_add_honor_pledge") }
114
+
115
+ element(:use_turnitin) { |b| b.frm.checkbox(:id=>"new_assignment_use_review_service") }
116
+ element(:allow_students_to_view_report) { |b| b.frm.checkbox(:id=>"new_assignment_allow_student_view") }
117
+
118
+ element(:do_not_add_to_gradebook) { |b| b.frm.radio(:id=>"no",:name=>"new_assignment_add_to_gradebook") }
119
+ element(:add_to_gradebook) { |b| b.frm.radio(:id=>"add", :name=>"new_assignment_add_to_gradebook") }
120
+ element(:do_not_send_notifications) { |b| b.frm.radio(:id=>"notsendnotif") }
121
+ element(:send_notifications) { |b| b.frm.radio(:id=>"sendnotif") }
122
+ element(:send_summary_email) { |b| b.frm.radio(:id=>"sendnotifsummary") }
123
+ element(:do_not_send_grade_notif) { |b| b.frm.radio(:id=>"notsendreleasegradenotif") }
124
+ element(:send_grade_notif) { |b| b.frm.radio(:id=>"sendreleasegradenotif") }
125
+ action(:add_model_answer) { |b| b.frm.link(:id=>"modelanswer_add").click }
126
+ action(:add_private_note) { |b| b.frm.link(:id=>"note_add").click }
127
+ action(:add_all_purpose_item) { |b| b.frm.link(:id=>"allPurpose_add").click }
128
+
129
+ element(:model_answer) { |b| b.frm.text_field(:id=>"modelanswer_text") }
130
+ action(:model_answer_attach) { |b| b.frm.button(:name=>"modelAnswerAttach").click }
131
+ element(:show_model_answer) { |b| b.frm.select(:id=>"modelanswer_to") }
132
+ action(:save_model_answer) { |b| b.frm.button(:id=>"modelanswer_save").click }
133
+ action(:cancel_model_answer) { |b| b.frm.button(:id=>"modelanswer_cancel").click }
134
+ element(:private_note) { |b| b.frm.text_field(:id=>"note_text") }
135
+ element(:share_note_with) { |b| b.frm.select(:id=>"note_to") }
136
+ action(:save_note) { |b| b.frm.button(:id=>"note_save").click }
137
+ action(:cancel_note) { |b| b.frm.button(:id=>"note_cancel").click }
138
+ element(:all_purpose_title) { |b| b.frm.text_field(:id=>"allPurpose_title") }
139
+ element(:all_purpose_text) { |b| b.frm.text_field(:id=>"allPurpose_text") }
140
+ action(:add_all_purpose_attachments) { |b| b.frm.button(:id=>"allPurposeAttach").click }
141
+ element(:show_this_all_purpose_item) { |b| b.frm.radio(:id=>"allPurposeHide1") }
142
+ element(:hide_this_all_purpose_item) { |b| b.frm.radio(:id=>"allPurposeHide2") }
143
+ element(:show_from) { |b| b.frm.checkbox(:id=>"allPurposeShowFrom") }
144
+ element(:show_until) { |b| b.frm.checkbox(:id=>"allPurposeShowTo") }
145
+ element(:show_from_month) { |b| b.frm.select(:id=>"allPurpose_releaseMonth") }
146
+ element(:show_from_day) { |b| b.frm.select(:id=>"allPurpose_releaseDay") }
147
+ element(:show_from_year) { |b| b.frm.select(:id=>"allPurpose_releaseYear") }
148
+ element(:show_from_hour) { |b| b.frm.select(:id=>"allPurpose_releaseHour") }
149
+ element(:show_from_minute) { |b| b.frm.select(:id=>"allPurpose_releaseMin") }
150
+ element(:show_from_meridian) { |b| b.frm.select(:id=>"allPurpose_releaseAMPM") }
151
+ element(:show_until_month) { |b| b.frm.select(:id=>"allPurpose_retractMonth") }
152
+ element(:show_until_day) { |b| b.frm.select(:id=>"allPurpose_retractDay") }
153
+ element(:show_until_year) { |b| b.frm.select(:id=>"allPurpose_retractYear") }
154
+ element(:show_until_hour) { |b| b.frm.select(:id=>"allPurpose_retractHour") }
155
+ element(:show_until_minute) { |b| b.frm.select(:id=>"allPurpose_retractMin") }
156
+ element(:show_until_meridian) { |b| b.frm.select(:id=>"allPurpose_retractAMPM") }
157
+ action(:expand_guest_list) { |b| b.frm.link(:id=>"expand_1").click }
158
+ action(:collapse_guest_list) { |b| b.frm.link(:id=>"collapse_1").click }
159
+ action(:expand_TA_list) { |b| b.frm.link(:id=>"expand_2").click }
160
+ action(:collapse_TA_list) { |b| b.frm.link(:id=>"collapse_2").click }
161
+ action(:expand_instructor_list) { |b| b.frm.link(:id=>"expand_3").click }
162
+ action(:collapse_instructor_list) { |b| b.frm.link(:is=>"collapse_3").click }
163
+
164
+ # Note that only the "All" checkboxes are defined, since other items may or may not be there
165
+ element(:all_guests) { |b| b.frm.checkbox(:id=>"allPurpose_Guest") }
166
+ element(:all_TAs) { |b| b.frm.checkbox(:id=>"allPurpose_Teaching Assistant") }
167
+ element(:all_instructors) { |b| b.frm.checkbox(:id=>"allPurpose_Instructor") }
168
+
169
+ end
170
+
171
+ # Page that appears when you first click the Assignments link
172
+ class AssignmentsList < AssignmentsBase
173
+
174
+ menu_elements
175
+ listview_elements
176
+ alias :add :add_assignment
177
+
178
+ # Returns an array of the displayed assignment titles.
179
+ # Use for verification of test steps.
180
+ def assignments_titles
181
+ titles = []
182
+ a_table = frm.table(:class=>"listHier lines nolines")
183
+ 1.upto(a_table.rows.size-1) do |x|
184
+ titles << a_table[x][1].h4(:index=>0).text
185
+ end
186
+ return titles
187
+ end
188
+ alias assignment_titles assignments_titles
189
+ alias assignment_list assignments_titles
190
+ alias assignments_list assignments_titles
191
+
192
+ # Clicks the Edit link for the assignment with the specified
193
+ # id, then instantiates the AssignmentAdd page class.
194
+ def edit_assignment_id(id)
195
+ frm.link(:href=>/#{Regexp.escape(id)}/).click
196
+ AssignmentAdd.new(@browser)
197
+ end
198
+
199
+ # Clicks the Edit link for the Assignment specified.
200
+ # next is the AssignmentAdd page class.
201
+ def edit_assignment(assignment_name)
202
+ index = assignments_titles.index(assignment_name)
203
+ frm.link(:text=>"Edit", :index=>index).click
204
+ end
205
+
206
+ # Checks the appropriate checkbox, based on the specified assignment_name
207
+ # Then clicks the Update button and confirms the deletion request.
208
+ # It then reinstantiates the AssignmentsList class because of the page
209
+ # update.
210
+ def delete_assignment(assignment_name)
211
+ frm.table(:class=>"listHier lines nolines").row(:text=>/#{Regexp.escape(assignment_name)}/).checkbox(:name=>"selectedAssignments").set
212
+ frm.button(:value=>"Update").click
213
+ frm.button(:value=>"Delete").click
214
+ AssignmentsList.new(@browser)
215
+ end
216
+
217
+ # Clicks on the Duplicate link for the Assignment specified.
218
+ # Then instantiates the AssignmentsList page class.
219
+ def duplicate_assignment(assignment_name)
220
+ index = assignments_titles.index(assignment_name)
221
+ frm.link(:text=>"Duplicate", :index=>index).click
222
+ AssignmentsList.new(@browser)
223
+ end
224
+
225
+ # Gets the assignment id from the href of the specified
226
+ # Assignment link.
227
+ def get_assignment_id(assignment_name)
228
+ assignment_href(assignment_name) =~ /(?<=\/a\/\S{36}\/).+(?=&pan)/
229
+ return $~.to_s
230
+ end
231
+
232
+ def assignment_href(name)
233
+ frm.link(:text=>/#{Regexp.escape(name)}/).href
234
+ end
235
+
236
+ # Checks the checkbox for the specified Assignment,
237
+ # using the assignment id as the identifier.
238
+ def check_assignment(id) #FIXME to use name instead of id.
239
+ frm.checkbox(:value, /#{id}/).set
240
+ end
241
+
242
+ # Opens the specified assignment for viewing
243
+ def open_assignment(assignment_name)
244
+ frm.link(:text=>assignment_name).click
245
+ end
246
+
247
+ # Gets the contents of the status column
248
+ # for the specified assignment
249
+ def status_of(assignment_name)
250
+ frm.table(:class=>/listHier lines/).row(:text=>/#{Regexp.escape(assignment_name)}/).td(:headers=>"status").text
251
+ end
252
+
253
+ # Clicks the View Submissions link for the specified
254
+ # Assignment, then instantiates the AssignmentSubmissionList
255
+ # page class.
256
+ def view_submissions_for(assignment_name)
257
+ frm.table(:class=>"listHier lines nolines").row(:text=>/#{Regexp.escape(assignment_name)}/).link(:text=>"View Submissions").click
258
+ AssignmentSubmissionList.new(@browser)
259
+ end
260
+
261
+ # Clicks the Grade link for the specified Assignment,
262
+ # then instantiates the AssignmentSubmissionList page class.
263
+ def grade(assignment_name)
264
+ frm.table(:class=>"listHier lines nolines").row(:text=>/#{Regexp.escape(assignment_name)}/).link(:text=>"Grade").click
265
+ AssignmentSubmissionList.new(@browser)
266
+ end
267
+
268
+ action(:sort_assignment_title) { |b| b.frm.link(:text=>"Assignment title").click }
269
+ action(:sort_status) { |b| b.frm.link(:text=>"Status").click }
270
+ action(:sort_open) { |b| b.frm.link(:text=>"Open").click }
271
+ action(:sort_due) { |b| b.frm.link(:text=>"Due").click }
272
+ action(:sort_in) { |b| b.frm.link(:text=>"In").click }
273
+ action(:sort_new) { |b| b.frm.link(:text=>"New").click }
274
+ action(:sort_scale) { |b| b.frm.link(:text=>"Scale").click }
275
+ element(:view) { |b| b.frm.select(:id=>"view") }
276
+ action(:update) { |b| b.frm.button(:name=>"eventSubmit_doDelete_confirm_assignment").click }
277
+
278
+ end
279
+
280
+ # The Permissions Page in Assignments
281
+ class AssignmentsPermissions < AssignmentsBase
282
+
283
+ # Clicks the Save button, next is
284
+ # the AssignmentsList page class.
285
+ action(:save) {|b| b.frm.button(:value=>"Save").click }
286
+
287
+ element(:evaluators_share_drafts) { |b| b.frm.checkbox(:id=>"Evaluatorasn.share.drafts") }
288
+ element(:organizers_share_drafts) { |b| b.frm.checkbox(:id=>"Organizerasn.share.drafts") }
289
+
290
+ element(:guests_all_groups) { |b| b.frm.checkbox(:id=>"Guestasn.all.groups") }
291
+ element(:guests_create_assignments) { |b| b.frm.checkbox(:id=>"Guestasn.new") }
292
+ element(:guests_submit_to_assigments) { |b| b.frm.checkbox(:id=>"Guestasn.submit") }
293
+ element(:guests_delete_assignments) { |b| b.frm.checkbox(:id=>"Guestasn.delete") }
294
+ element(:guests_read_assignments) { |b| b.frm.checkbox(:id=>"Guestasn.read") }
295
+ element(:guests_revise_assignments) { |b| b.frm.checkbox(:id=>"Guestasn.revise") }
296
+ element(:guests_grade_assignments) { |b| b.frm.checkbox(:id=>"Guestasn.grade") }
297
+ element(:guests_receive_notifications) { |b| b.frm.checkbox(:id=>"Guestasn.receive.notifications") }
298
+ element(:guests_share_drafts) { |b| b.frm.checkbox(:id=>"Guestasn.share.drafts") }
299
+ element(:instructors_all_groups) { |b| b.frm.checkbox(:id=>"Instructorasn.all.groups") }
300
+ element(:instructors_create_assignments) { |b| b.frm.checkbox(:id=>"Instructorasn.new") }
301
+ element(:instructors_submit_to_assigments) { |b| b.frm.checkbox(:id=>"Instructorasn.submit") }
302
+ element(:instructors_delete_assignments) { |b| b.frm.checkbox(:id=>"Instructorasn.delete") }
303
+ element(:instructors_read_assignments) { |b| b.frm.checkbox(:id=>"Instructorasn.read") }
304
+ element(:instructors_revise_assignments) { |b| b.frm.checkbox(:id=>"Instructorasn.revise") }
305
+ element(:instructors_grade_assignments) { |b| b.frm.checkbox(:id=>"Instructorasn.grade") }
306
+ element(:instructors_receive_notifications) { |b| b.frm.checkbox(:id=>"Instructorasn.receive.notifications") }
307
+ element(:instructors_share_drafts) { |b| b.frm.checkbox(:id=>"Instructorasn.share.drafts") }
308
+ element(:students_all_groups) { |b| b.frm.checkbox(:id=>"Studentasn.all.groups") }
309
+ element(:students_create_assignments) { |b| b.frm.checkbox(:id=>"Studentasn.new") }
310
+ element(:students_submit_to_assigments) { |b| b.frm.checkbox(:id=>"Studentasn.submit") }
311
+ element(:students_delete_assignments) { |b| b.frm.checkbox(:id=>"Studentasn.delete") }
312
+ element(:students_read_assignments) { |b| b.frm.checkbox(:id=>"Studentasn.read") }
313
+ element(:students_revise_assignments) { |b| b.frm.checkbox(:id=>"Studentasn.revise") }
314
+ element(:students_grade_assignments) { |b| b.frm.checkbox(:id=>"Studentasn.grade") }
315
+ element(:students_receive_notifications) { |b| b.frm.checkbox(:id=>"Studentasn.receive.notifications") }
316
+ element(:students_share_drafts) { |b| b.frm.checkbox(:id=>"Studentasn.share.drafts") }
317
+ element(:tas_all_groups) { |b| b.frm.checkbox(:id=>"Teaching Assistantasn.all.groups") }
318
+ element(:tas_create_assignments) { |b| b.frm.checkbox(:id=>"Teaching Assistantasn.new") }
319
+ element(:tas_submit_to_assigments) { |b| b.frm.checkbox(:id=>"Teaching Assistantasn.submit") }
320
+ element(:tas_delete_assignments) { |b| b.frm.checkbox(:id=>"Teaching Assistantasn.delete") }
321
+ element(:tas_read_assignments) { |b| b.frm.checkbox(:id=>"Teaching Assistantasn.read") }
322
+ element(:tas_revise_assignments) { |b| b.frm.checkbox(:id=>"Teaching Assistantasn.revise") }
323
+ element(:tas_grade_assignments) { |b| b.frm.checkbox(:id=>"Teaching Assistantasn.grade") }
324
+ element(:tas_receive_notifications) { |b| b.frm.checkbox(:id=>"Teaching Assistantasn.receive.notifications") }
325
+ element(:tas_share_drafts) { |b| b.frm.checkbox(:id=>"Teaching Assistantasn.share.drafts") }
326
+ action(:undo_changes) { |b| b.frm.link(:text=>"Undo changes").click }
327
+ action(:cancel) { |b| b.frm.button(:id=>"eventSubmit_doCancel").click }
328
+ action(:permission) { |b| b.frm.link(:text=>"Permission").click }
329
+ action(:guest) { |b| b.frm.link(:text=>"Guest").click }
330
+ action(:instructor) { |b| b.frm.link(:text=>"Instructor").click }
331
+ action(:student) { |b| b.frm.link(:text=>"Student").click }
332
+ action(:teaching_assistant) { |b| b.frm.link(:text=>"Teaching Assistant").click }
333
+ action(:same_permissions_for_all_groups) { |b| b.frm.link(:text=>"Same site level permissions for all groups inside the site").click }
334
+ action(:create_new_assignments) { |b| b.frm.link(:text=>"Create new assignment(s)").click }
335
+ action(:submit_to_assignments) { |b| b.frm.link(:text=>"Submit to assignment(s)").click }
336
+ action(:delete_assignments) { |b| b.frm.link(:text=>"Delete assignment(s)").click }
337
+ action(:read_assignments) { |b| b.frm.link(:text=>"Read Assignment(s)").click }
338
+ action(:revise_assignments) { |b| b.frm.link(:text=>"Revise assignment(s)").click }
339
+ action(:grade_submissions) { |b| b.frm.link(:text=>"Grade assignment submission(s)").click }
340
+ action(:receive_email_notifications) { |b| b.frm.link(:text=>"Receive email notifications").click }
341
+ action(:view_drafts_from_others) { |b| b.frm.link(:text=>"Able to view draft assignment(s) created by other users").click }
342
+
343
+ end
344
+
345
+ # Page that appears when you click to preview an Assignment
346
+ class AssignmentsPreview < AssignmentsBase
347
+
348
+ menu_elements
349
+
350
+ # Returns the text content of the page header
351
+ def header
352
+ frm.div(:class=>"portletBody").h3.text
353
+ end
354
+
355
+ # Returns a hash object containing the contents of the Item Summary table.
356
+ # The hash's Key is the header column and the value is the content column.
357
+ def item_summary
358
+ hash = {}
359
+ frm.table(:class=>"itemSummary").rows.each do |row|
360
+ hash.store(row.th.text, row.td.text)
361
+ end
362
+ return hash
363
+ end
364
+
365
+ # Grabs the Assignment Instructions text.
366
+ def assignment_instructions
367
+ frm.div(:class=>"textPanel").text
368
+ end
369
+
370
+ # Grabs the instructor comments text.
371
+ def instructor_comments
372
+ frm.div(:class=>"portletBody").div(:class=>"textPanel", :index=>2).text
373
+ end
374
+
375
+ #
376
+ def back_to_list
377
+ frm.button(:value=>"Back to list").click
378
+ AssignmentsList.new(@browser)
379
+ end
380
+
381
+ # Clicks the Post button, then instantiates
382
+ # the AssignmentsList page class.
383
+ def post
384
+ frm.button(:name=>"post").click
385
+ AssignmentsList.new(@browser)
386
+ end
387
+
388
+ # Clicks the Cancel button and instantiates the
389
+ # AssignmentsList Class.
390
+ def cancel
391
+ frm.button(:value=>"Cancel").click
392
+ AssignmentsList.new(@browser)
393
+ end
394
+
395
+ element(:assignment_id) { |b| b.frm.hidden(:name=>"assignmentId") }
396
+ action(:hide_assignment) { |b| b.frm.link(:href=>/doHide_preview_assignment_assignment/).click }
397
+ action(:show_assignment) { |b| b.frm.link(:href=>/doShow_preview_assignment_assignment/).click }
398
+ action(:hide_student_view) { |b| b.frm.link(:href=>/doHide_preview_assignment_student_view/).click }
399
+ action(:show_student_view) { |b| b.frm.link(:href=>/doShow_preview_assignment_student_view/).click }
400
+ action(:edit) { |b| b.frm.button(:name=>"revise").click }
401
+ action(:save_draft) { |b| b.frm.button(:name=>"save").click }
402
+ action(:done) { |b| b.frm.button(:name=>"done").click }
403
+
404
+ end
405
+
406
+ # The reorder page for Assignments
407
+ class AssignmentsReorder < AssignmentsBase
408
+
409
+ menu_elements
410
+
411
+ # Clicks the Save button, then instantiates
412
+ # the AssignmentsList page class.
413
+ def save
414
+ frm.button(:value=>"Save").click
415
+ AssignmentsList.new(@browser)
416
+ end
417
+
418
+ # Clicks the Cancel button, then instantiates
419
+ # the AssignmentsList Class.
420
+ def cancel
421
+ frm.button(:value=>"Cancel").click
422
+ AssignmentsList.new(@browser)
423
+ end
424
+
425
+ action(:sort_by_title) { |b| b.frm.link(:text=>"Sort by title").click }
426
+ action(:sort_by_open_date) { |b| b.frm.link(:text=>"Sort by open date").click }
427
+ action(:sort_by_due_date) { |b| b.frm.link(:text=>"Sort by due date").click }
428
+ action(:undo_last) { |b| b.frm.link(:text=>"Undo last").click }
429
+ action(:undo_all) { |b| b.frm.link(:text=>"Undo all").click }
430
+
431
+ end
432
+
433
+ # A Student user's page for editing/submitting/view an assignment.
434
+ class AssignmentStudent < BasePage
435
+
436
+ frame_element
437
+
438
+ # Returns the text content of the page header
439
+ def header
440
+ frm.div(:class=>"portletBody").h3.text
441
+ end
442
+
443
+ # Returns a hash object containing the contents of the Item Summary table.
444
+ # The hash's Key is the header column and the value is the content column.
445
+ def item_summary
446
+ hash = {}
447
+ frm.table(:class=>"itemSummary").rows.each do |row|
448
+ hash.store(row.th.text, row.td.text)
449
+ end
450
+ return hash
451
+ end
452
+
453
+ # Grabs the instructor comments text.
454
+ def instructor_comments
455
+ frm.div(:class=>"portletBody").div(:class=>"textPanel", :index=>2).text
456
+ end
457
+
458
+ # Enters the specified text into the Assignment Text FCKEditor.
459
+ def assignment_text=(text)
460
+ frm.frame(:id, "Assignment.view_submission_text___Frame").td(:id, "xEditingArea").frame(:index=>0).send_keys(text)
461
+ end
462
+
463
+ # Clears out any existing text from the Assignment Text FCKEditor.
464
+ def remove_assignment_text
465
+ frm.frame(:id, "Assignment.view_submission_text___Frame").div(:title=>"Select All").fire_event("onclick")
466
+ frm.frame(:id, "Assignment.view_submission_text___Frame").td(:id, "xEditingArea").frame(:index=>0).send_keys :backspace
467
+ end
468
+
469
+ # This class variable allows adding an arbitrary number of
470
+ # files to the page, as long as the adding steps alternate between
471
+ # selecting the file and clicking the add more files button
472
+ @@file_number = 0
473
+
474
+ # Enters the specified file name into the file field. Entering the path
475
+ # separately is optional.
476
+ # Once the filename is entered in the field, the
477
+ # @@file_number class variable is increased by one
478
+ # in case any more files need to be added to the upload
479
+ # list.
480
+ def select_file(file_name, file_path="")
481
+ frm.file_field(:id=>"clonableUpload", :name=>"upload#{@@file_number}").set(file_path + file_name)
482
+ @@file_number += 1
483
+ end
484
+
485
+ # Clicks the Submit button, then instantiates
486
+ # the appropriate page class, based on the
487
+ # page that gets loaded.
488
+ def submit
489
+ frm.button(:value=>"Submit").click
490
+ @@file_number=0
491
+ if frm.div(:class=>"portletBody").h3.text=~/Submission Confirmation/
492
+ SubmissionConfirmation.new(@browser)
493
+ elsif frm.button(:value=>"Back to list").exist?
494
+ SubmissionConfirmation.new(@browser)
495
+ else
496
+ AssessmentsList.new(@browser)
497
+ end
498
+ end
499
+
500
+ # Clicks the Resubmit button, then instantiates
501
+ # the appropriate page class, based on the
502
+ # page that gets loaded.
503
+ #
504
+ # Resets @@file_number to zero so that file
505
+ # uploads will work if this page is visited again
506
+ # in the same script.
507
+ def resubmit
508
+ frm.button(:value=>"Resubmit").click
509
+ @@file_number=0
510
+ if frm.link(:text=>"Assignment title").exist?
511
+ puts "list..."
512
+ AssessmentsList.new(@browser)
513
+ else
514
+ SubmissionConfirmation.new(@browser)
515
+ end
516
+ end
517
+
518
+ # Clicks the Preview button, then
519
+ # instantiates the AssignmentStudentPreview page class.
520
+ #
521
+ # Resets @@file_number to zero so that file
522
+ # uploads will work if this page is visited again
523
+ # in the same script.
524
+ def preview
525
+ frm.button(:value=>"Preview").click
526
+ @@file_number=0
527
+ AssignmentStudentPreview.new(@browser)
528
+ end
529
+
530
+ # Clicks the Save Draft button, then
531
+ # instantiates the SubmissionConfirmation
532
+ # page class.
533
+ def save_draft
534
+ frm.button(:value=>"Save Draft").click
535
+ SubmissionConfirmation.new(@browser)
536
+ end
537
+
538
+ # Clicks the link to select more files
539
+ # from the Workspace. Then instantiates
540
+ # the AssignmentAttachments page class.
541
+ def select_more_files_from_workspace
542
+ frm.link(:id=>"attach").click
543
+ AssignmentAttachments.new(@browser)
544
+ end
545
+
546
+ # Clicks the Back to list button, then
547
+ # instantiates the AssignmentList page class.
548
+ def back_to_list
549
+ frm.button(:value=>"Back to list").click
550
+ AssignmentsList.new(@browser)
551
+ end
552
+
553
+ # Clicks the Cancel button and instantiates the
554
+ # AssignmentsList Class.
555
+ def cancel
556
+ frm.button(:value=>"Cancel").click
557
+ AssignmentsList.new(@browser)
558
+ end
559
+
560
+ action(:add_another_file) { |b| b.frm.link(:id=>"addMoreAttachmentControls") }
561
+
562
+ end
563
+
564
+ # Page that appears when a Student User clicks to Preview an
565
+ # assignment that is in progress.
566
+ class AssignmentStudentPreview < BasePage
567
+
568
+ frame_element
569
+
570
+ # Clicks the Submit button, then
571
+ # instantiates the SubmissionConfirmation
572
+ # page class.
573
+ def submit
574
+ frm.button(:value=>"Submit").click
575
+ SubmissionConfirmation.new(@browser)
576
+ end
577
+
578
+ # Clicks the Save Draft button, then
579
+ # instantiates the SubmissionConfirmation
580
+ # page class.
581
+ def save_draft
582
+ frm.button(:value=>"Save Draft").click
583
+ SubmissionConfirmation.new(@browser)
584
+ end
585
+
586
+ # Returns the contents of the submission box.
587
+ def submission_text
588
+ frm.div(:class=>"portletBody").div(:class=>/textPanel/).text
589
+ end
590
+
591
+ # Returns an array of strings. Each element in the
592
+ # array is the name of attached files.
593
+ def attachments
594
+ names = []
595
+ frm.ul(:class=>"attachList indnt1").links.each { |link| names << link.text }
596
+ return names
597
+ end
598
+
599
+ end
600
+
601
+ # The page that appears when a Student user has fully submitted an assignment
602
+ # or saves it as a draft.
603
+ class SubmissionConfirmation < BasePage
604
+
605
+ frame_element
606
+
607
+ # Returns the text of the success message on the page.
608
+ def confirmation_text
609
+ frm.div(:class=>"portletBody").div(:class=>"success").text
610
+ end
611
+
612
+ # Returns the text of the assignment submission.
613
+ def submission_text
614
+ frm.div(:class=>"portletBody").div(:class=>"textPanel indnt2").text
615
+ end
616
+
617
+ # Clicks the Back to list button, then
618
+ # instantiates the AssignmentsList page class.
619
+ def back_to_list
620
+ frm.button(:value=>"Back to list").click
621
+ frm.link(:text=>"Assignment title").wait_until_present
622
+ AssignmentsList.new(@browser)
623
+ end
624
+ end
625
+
626
+ # The page that appears when you click on an assignment's "Grade" or "View Submission" link
627
+ # as an instructor. Shows the list of students and their
628
+ # assignment submission status.
629
+ class AssignmentSubmissionList < AssignmentsBase
630
+
631
+ menu_elements
632
+ listview_elements
633
+
634
+ # Clicks the Assignment List link and instantiates the AssignmentsList Class.
635
+ def assignment_list
636
+ frm.link(:text=>"Assignment List").click
637
+ AssignmentsList.new(@browser)
638
+ end
639
+ # Clicks the Show Resubmission Settings button
640
+ def show_resubmission_settings
641
+ frm.image(:src, "/library/image/sakai/expand.gif?panel=Main").click
642
+ end
643
+
644
+ # Clicks the Show Assignment Details button.
645
+ def show_assignment_details
646
+ frm.image(:src, "/library/image/sakai/expand.gif").click
647
+ end
648
+
649
+ # Gets the Student table text and returns it in an Array object.
650
+ def student_table
651
+ table = frm.table(:class=>"listHier lines nolines").to_a
652
+ end
653
+
654
+ # Clicks the Grade link for the specified student, then
655
+ # instantiates the AssignmentSubmission page class.
656
+ def grade(student_name)
657
+ frm.table(:class=>"listHier lines nolines").row(:text=>/#{Regexp.escape(student_name)}/).link(:text=>"Grade").click
658
+ frm.frame(:id, "grade_submission_feedback_comment___Frame").td(:id, "xEditingArea").frame(:index=>0).wait_until_present
659
+ AssignmentSubmission.new(@browser)
660
+ end
661
+
662
+ # Gets the value of the status field for the specified
663
+ # Student. Note that the student's name needs to be entered
664
+ # so that it's unique for the row, but it does not have
665
+ # to match the entire name/id value--unless there are two
666
+ # students with the same name.
667
+ #
668
+ # Useful for verification purposes.
669
+ def submission_status_of(student_name)
670
+ frm.table(:class=>"listHier lines nolines").row(:text=>/#{Regexp.escape(student_name)}/)[4].text
671
+ end
672
+
673
+ element(:search_input) { |b| b.frm.text_field(:id=>"search") }
674
+ action(:find) { |b| b.frm.button(:value=>"Find").click }
675
+ action(:clear) { |b| b.frm.button(:value=>"Clear").click }
676
+ action(:download_all) { |b| b.frm.link(:text=>"Download All").click }
677
+ action(:upload_all) { |b| b.frm.link(:text=>"Upload All").click }
678
+ action(:release_grades) { |b| b.frm.link(:text=>"Release Grades").click }
679
+ action(:sort_by_student) { |b| b.frm.link(:text=>"Student").click }
680
+ action(:sort_by_submitted) { |b| b.frm.link(:text=>"Submitted").click }
681
+ action(:sort_by_status) { |b| b.frm.link(:text=>"Status").click }
682
+ action(:sort_by_grade) { |b| b.frm.link(:text=>"Grade").click }
683
+ action(:sort_by_release) { |b| b.frm.link(:text=>"Release").click }
684
+ element(:default_grade) { |b| b.frm.select(:id=>"defaultGrade_1") }
685
+ action(:apply) { |b| b.frm.button(:name=>"apply").click }
686
+ element(:num_resubmissions) { |b| b.frm.select(:id=>"allowResubmitNumber") }
687
+ element(:accept_until_month) { |b| b.frm.select(:id=>"allow_resubmit_closeMonth") }
688
+ element(:accept_until_day) { |b| b.frm.select(:id=>"allow_resubmit_closeDay") }
689
+ element(:accept_until_year) { |b| b.frm.select(:id=>"allow_resubmit_closeYear") }
690
+ element(:accept_until_hour) { |b| b.frm.select(:id=>"allow_resubmit_closeHour") }
691
+ element(:accept_until_min) { |b| b.frm.select(:id=>"allow_resubmit_closeMin") }
692
+ element(:accept_until_meridian) { |b| b.frm.select(:id=>"allow_resubmit_closeAMPM") }
693
+ action(:update) { |b| b.frm.button(:id=>"eventSubmit_doSave_resubmission_option").click }
694
+ action(:delete) { |b| b.frm.button(:name=>"eventSubmit_doDelete_confirm_assignment").click }
695
+
696
+ end
697
+
698
+ # The page that shows a student's submitted assignment to an instructor user.
699
+ class AssignmentSubmission < BasePage
700
+
701
+ include FCKEditor
702
+ frame_element
703
+
704
+ expected_element :editor
705
+
706
+ element(:editor) { |b| b.frm.frame(:id, "grade_submission_feedback_text___Frame") }
707
+
708
+ # Enters the specified text string in the FCKEditor box for the assignment text.
709
+ def assignment_text=(text)
710
+ editor.td(:id, "xEditingArea").frame(:index=>0).send_keys(text)
711
+ end
712
+
713
+ # Removes all the contents of the FCKEditor Assignment Text box.
714
+ def remove_assignment_text
715
+ editor.div(:title=>"Select All").fire_event("onclick")
716
+ editor.td(:id, "xEditingArea").frame(:index=>0).send_keys :backspace
717
+ end
718
+
719
+ # Enters the specified string into the Instructor Comments FCKEditor box.
720
+ def instructor_comments=(text)
721
+ editor.td(:id, "xEditingArea").frame(:index=>0).send_keys(text)
722
+ end
723
+
724
+ # Clicks the Add Attachments button, then instantiates the AssignmentAttachments Class.
725
+ def add_attachments
726
+ frm.button(:name=>"attach").click
727
+ AssignmentAttachments.new(@browser)
728
+ end
729
+
730
+ # Clicks the Return to List button, then instantiates the
731
+ # AssignmentSubmissionList Class.
732
+ def return_to_list
733
+ frm.button(:value=>"Return to List").click
734
+ AssignmentSubmissionList.new(@browser)
735
+ end
736
+
737
+ element(:select_default_grade) { |b| b.frm.select(:name=>"grade_submission_grade") }
738
+ element(:allow_resubmission) { |b| b.frm.checkbox(:id=>"allowResToggle") }
739
+ element(:num_resubmissions) { |b| b.frm.select(:id=>"allowResubmitNumberSelect") }
740
+ element(:accept_until_month) { |b| b.frm.select(:id=>"allow_resubmit_closeMonth") }
741
+ element(:accept_until_day) { |b| b.frm.select(:id=>"allow_resubmit_closeDay") }
742
+ element(:accept_until_year) { |b| b.frm.select(:id=>"allow_resubmit_closeYear") }
743
+ element(:accept_until_hour) { |b| b.frm.select(:id=>"allow_resubmit_closeHour") }
744
+ element(:accept_until_min) { |b| b.frm.select(:id=>"allow_resubmit_closeMin") }
745
+ element(:accept_until_meridian) { |b| b.frm.select(:id=>"allow_resubmit_closeAMPM") }
746
+ action(:save_and_release) { |b| b.frm.button(:value=>"Save and Release to Student").click }
747
+ action(:save_and_dont_release) { |b| b.frm.button(:value=>"Save and Don't Release to Student").click }
748
+
749
+ end
750
+
751
+ # The Grade Report page accessed from the Assignments page
752
+ class GradeReport < BasePage
753
+
754
+ frame_element
755
+
756
+ end
757
+
758
+ # The Student View page accessed from the Assignments page
759
+ class StudentView < AssignmentsBase
760
+
761
+ menu_elements
762
+ listview_elements
763
+
764
+ action(:sort_assignment_title) { |b| b.frm.link(:text=>"Assignment title").click }
765
+ action(:sort_status) { |b| b.frm.link(:text=>"Status").click }
766
+ action(:sort_open) { |b| b.frm.link(:text=>"Open").click }
767
+ action(:sort_due) { |b| b.frm.link(:text=>"Due").click }
768
+ action(:sort_scale) { |b| b.frm.link(:text=>"Scale").click }
769
+
770
+ end