sakai-oae-test-api 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,495 @@
1
+ # coding: UTF-8
2
+
3
+ # Methods related to the expandable Collector item that can appear at the top of any page.
4
+ module CollectorWidget
5
+
6
+ include PageObject
7
+
8
+ end
9
+
10
+ # Methods associated with documents that use the TinyMCE Editor.
11
+ module DocumentWidget
12
+
13
+ include PageObject
14
+
15
+ # Page Objects
16
+ button(:dont_save, :id=>"sakaidocs_edit_cancel_button")
17
+ button(:save_button, :id=>"sakaidocs_edit_save_button")
18
+ button(:insert, :id=>"sakaidocs_insert_dropdown_button")
19
+ select_list(:format, :id=>/formatselect/)
20
+ select_list(:font, :id=>/fontselect/)
21
+ select_list(:font_size, :id=>/fontsizeselect/)
22
+ link(:bold, :id=>/_bold/)
23
+ link(:italic, :id=>/_italic/)
24
+ link(:underline, :id=>/_underline/)
25
+
26
+ # These methods click the Insert button (you must be editing the document first),
27
+ # then select the specified menu item, to bring up the Widget settings dialog.
28
+ # The first argument is the method name (which automatically gets pre-pended
29
+ # with "insert_", the second is the id of the target
30
+ # button in the Insert menu, and the last argument is the name of the module
31
+ # to be included in the current Class object. The module name can be nil,
32
+ # since not every item in the insert button list brings up a Pop Up dialog.
33
+ insert_button(:files_and_documents, "embedcontent", "FilesAndDocsPopUp")
34
+ insert_button(:discussion, "discussion", "Discussion")
35
+ insert_button(:remote_content, "remotecontent", "RemoteContentPopUp" )
36
+ insert_button(:inline_content, "inlinecontent", "InlineContentPopUp" )
37
+ insert_button(:google_maps, "googlemaps", "GoogleMapsPopUp" )
38
+ insert_button(:comments, "comments", "CommentsPopUp" )
39
+ insert_button(:rss_feed_reader, "rss", "RSSFeedPopUp" )
40
+ insert_button(:google_gadget, "ggadget", "GoogleGadgetPopUp" )
41
+ insert_button(:horizontal_line, "hr")
42
+ insert_button(:tests_and_quizzes, "sakai2samigo")
43
+ insert_button(:calendar, "sakai2calendar")
44
+ insert_button(:jisc_content, "jisccontent")
45
+ insert_button(:assignments, "sakai2assignments")
46
+ insert_button(:basic_lti, "basiclti")
47
+ insert_button(:gradebook, "sakai2gradebook")
48
+
49
+ # Custom Methods...
50
+
51
+ # Clicks the Save button. Waits for Ajax calls to fall off.
52
+ def save
53
+ self.save_button
54
+ sleep 1
55
+ self.wait_for_ajax
56
+ end
57
+
58
+ # Erases the entire contents of the TinyMCE Editor, then
59
+ # enters the specified string into the Editor.
60
+ def set_content=(text)
61
+ self.frame(:id=>"elm1_ifr").body(:id=>"tinymce").fire_event("onclick")
62
+ self.frame(:id=>"elm1_ifr").send_keys( [:command, 'a'] )
63
+ self.frame(:id=>"elm1_ifr").send_keys(text)
64
+ end
65
+
66
+ # Appends the specified string to the contents of the TinyMCE Editor.
67
+ def add_content=(text)
68
+ self.frame(:id=>"elm1_ifr").body(:id=>"tinymce").fire_event("onclick")
69
+ self.frame(:id=>"elm1_ifr").send_keys(text)
70
+ end
71
+
72
+ # Selects all the contents of the TinyMCE Editor
73
+ def select_all
74
+ self.frame(:id=>"elm1_ifr").send_keys( [:command, 'a'] )
75
+ end
76
+
77
+ # Clicks the Text Box of the TinyMCE Editor so that the edit cursor
78
+ # will become active in the Editor.
79
+ def insert_text
80
+ self.frame(:id=>"elm1_ifr").body(:id=>"tinymce").fire_event("onclick")
81
+ end
82
+
83
+ # Other MCE Objects TBD later, maybe, though we're not in the business of testing TinyMCE...
84
+
85
+ end
86
+
87
+ # Methods related to the Library List page.
88
+ module LibraryWidget
89
+
90
+ include PageObject
91
+
92
+ text_field(:search_library, :id=>"mylibrary_livefilter")
93
+ checkbox(:select_all_library_items, :id=>"mylibrary_select_checkbox")
94
+ button(:add_selected_to_buton, :id=>"mylibrary_addpeople_button")
95
+ button(:remove_selected_button, :id=>"mylibrary_remove")
96
+ button(:share_selected_button, :id=>"mylibrary_content_share")
97
+ select_list(:sort_by_list, :id=>"mylibrary_sortby")
98
+
99
+ # Enters the specified string in the search field.
100
+ # Note that it appends a line feed on the string, so the
101
+ # search occurs immediately.
102
+ def search_library_for=(text)
103
+ self.search_library=("#{text}\n")
104
+ self.wait_for_ajax
105
+ end
106
+
107
+ def sort_by=(sort_option)
108
+ self.sort_by_list=sort_option
109
+ self.linger_for_ajax(2)
110
+ end
111
+
112
+ # Returns the checkbox element itself for the specified
113
+ # item in the list. Use this method for checking whether or
114
+ # not the checkbox in question is selected or not--e.g.,
115
+ # library.checkbox("textfile.txt").should be_set
116
+ def checkbox(item)
117
+ name_li(item).checkbox
118
+ end
119
+
120
+ # Checks the specified Library item.
121
+ def check_content(item)
122
+ name_li(item).checkbox.set
123
+ end
124
+
125
+ # Unchecks the specified library item.
126
+ def uncheck_content(item)
127
+ name_li(item).checkbox.clear
128
+ end
129
+
130
+ def add_selected_to
131
+ self.add_selected_to_button
132
+ self.wait_for_ajax
133
+ self.class.class_eval { include AddToGroupsPopUp }
134
+ end
135
+
136
+ def add_to(name)
137
+ name_li(name)
138
+ # TODO - Finish writing this method
139
+ end
140
+
141
+ def share_selected
142
+ self.share_selected_button
143
+ self.text_field(:name=>"newsharecontent_sharelist").wait_until_present
144
+ self.class.class_eval { include ShareWithPopUp }
145
+ end
146
+
147
+ def remove_selected
148
+ self.remove_selected_button
149
+ self.div(:id=>"deletecontent_dialog").wait_until_present
150
+ self.class.class_eval { include DeleteContentPopUp }
151
+ end
152
+
153
+ end
154
+
155
+ # Contains methods common to all Results lists
156
+ module ListWidget
157
+
158
+ include PageObject
159
+
160
+ # Page Objects
161
+ # select_list(:sort_by, :id=>/sortby/) Collision with method in Library widget
162
+ select_list(:filter_by, :id=>"facted_select")
163
+
164
+ # Custom Methods...
165
+
166
+ # Returns an array containing the text of the links (for Groups, Courses, etc.) listed
167
+ def results_list
168
+ list = []
169
+ begin
170
+ self.spans(:class=>"s3d-search-result-name").each do |element|
171
+ list << element.text
172
+ end
173
+ rescue
174
+ list = []
175
+ end
176
+ list
177
+ end
178
+ alias courses results_list
179
+ alias course_list results_list
180
+ alias groups_list results_list
181
+ alias groups results_list
182
+ alias projects results_list
183
+ alias documents results_list
184
+ alias documents_list results_list
185
+ alias content_list results_list
186
+ alias results results_list
187
+ alias people_list results_list
188
+ alias contacts results_list
189
+ alias memberships results_list
190
+
191
+ # Gets the text describing when the specified item was last changed.
192
+ def last_updated(name)
193
+ # Get the target class...
194
+ klass = case
195
+ when name_li(name).div(:class=>"searchgroups_result_usedin").present?
196
+ "searchgroups_result_usedin"
197
+ when name_li(name).div(:class=>"searchcontent_result_by").present?
198
+ "searchcontent_result_by"
199
+ when name_li(name).div(:class=>"mymemberships_item_usedin").present?
200
+ "mymemberships_item_usedin"
201
+ when name_li(name).div(:class=>"mylibrary_item_by").present?
202
+ "mylibrary_item_by"
203
+ else
204
+ puts "Didn't find any expected DIVs. Please investigate and add missing class value"
205
+ puts
206
+ puts name_li(name).html
207
+ end
208
+ # Grab the text now that we know the class of the div...
209
+ div_text = name_li(name).div(:class=>klass).text
210
+ case(klass)
211
+ when "mylibrary_item_by"
212
+ return div_text[/(?<=\|.).+/]
213
+ when "searchgroups_result_usedin"
214
+ return div_text[/^.+(?=.\|)/]
215
+ when "mymemberships_item_usedin"
216
+ return div_text[/^.+(?=.\|)/]
217
+ when "searchcontent_result_by"
218
+ return div_text[/(?<=\|.).+/]
219
+ end
220
+
221
+ end
222
+ alias last_changed last_updated
223
+
224
+ end
225
+
226
+ # Methods related to lists of Collections
227
+ module ListCollections
228
+
229
+ include PageObject
230
+
231
+ end
232
+
233
+ # Methods related to lists of Content-type objects
234
+ module ListContent
235
+
236
+ include PageObject
237
+
238
+ # Returns the src text for the specified item's
239
+ # Thumbnail image.
240
+ def thumbnail(name)
241
+ name_li(name).link(:title=>"View this item").image.src
242
+ end
243
+
244
+ # Clicks to share the specified item. Waits for the page
245
+ # to refresh to bring up the Share Pop Up dialog.
246
+ def share(name)
247
+ name_li(name).button(:title=>"Share content").click
248
+ self.wait_until { self.text.include? "Or, share it on a webservice:" }
249
+ self.class.class_eval { include ShareWithPopUp }
250
+ end
251
+
252
+ # Adds the specified (listed) content to the library.
253
+ def add_to_library(name)
254
+ name_li(name).button(:title=>/^Save /).click
255
+ self.wait_until { self.div(:id=>"savecontent_widget").visible? }
256
+ self.class.class_eval { include SaveContentPopUp }
257
+ end
258
+
259
+ def delete(name)
260
+ name_li(name).button(:title=>"Remove").click
261
+ self.div(:id=>"deletecontent_dialog").wait_until_present
262
+ self.class.class_eval { include DeleteContentPopUp }
263
+ end
264
+ alias remove_item delete
265
+
266
+ # Clicks to view the owner information of the specified item.
267
+ def view_owner_of(name)
268
+ name_li(name).link(:class=>/s3d-regular-light-links (mylibrary_item_|searchcontent_result_)username/).click
269
+ self.div(:id=>"entity_name").wait_until_present
270
+ ViewPerson.new @browser
271
+ end
272
+
273
+ # Returns the item's owner name (as a text string).
274
+ def content_owner(name)
275
+ name_li(name).div(:class=>/(mylibrary_item_|searchcontent_result_)by/).link.text
276
+ end
277
+
278
+ # Returns an Array object containing the list of tags/categories
279
+ # listed for the specified content item.
280
+ def content_tags(name)
281
+ array = []
282
+ name_li(name).div(:class=>/(mylibrary_item_|searchcontent_result_)tags/).lis.each do |li|
283
+ array << li.span(:class=>"s3d-search-result-tag").text
284
+ end
285
+ return array
286
+ end
287
+
288
+ # Returns the mimetype text next to the Content name--the text that describes
289
+ # what the system thinks the content is.
290
+ def content_type(name)
291
+ name_li(name).span(:class=>/(mylibrary_item_|searchcontent_result_)mimetype/).text
292
+ end
293
+
294
+ def content_description(name)
295
+ name_li(name).div(:class=>/(mylibrary_item_|searchcontent_result_)description/).text
296
+ end
297
+
298
+ def search_by_tag(tag)
299
+ name_link(tag).click
300
+ sleep 3
301
+ self.wait_for_ajax
302
+ ExploreAll.new @browser
303
+ end
304
+
305
+ def used_in_count(name)
306
+ used_in_text(name)[/(?<=in.)\d+/].to_i
307
+ end
308
+
309
+ def comments_count(name)
310
+ used_in_text(name)[/\d+(?=.comment)/].to_i
311
+ end
312
+
313
+ #Private methods
314
+ private
315
+
316
+ def used_in_text(name)
317
+ name_li(name).div(:class=>/(mylibrary_item_|searchcontent_result_)usedin/).text
318
+ end
319
+
320
+ end # ListContent
321
+
322
+ # Methods related to lists of People/Participants
323
+ module ListPeople
324
+
325
+ include PageObject
326
+
327
+ # Clicks the plus sign next to the specified Contact name.
328
+ # Obviously the name must exist in the list.
329
+ def add_contact(name)
330
+ self.button(:title=>"Request connection with #{name}").click
331
+ self.wait_until { @browser.button(:text=>"Invite").visible? }
332
+ self.class.class_eval { include AddToContactsPopUp }
333
+ end
334
+ alias request_contact add_contact
335
+ alias request_connection add_contact
336
+
337
+ # Clicks the X to remove the selected person from the
338
+ # Contacts list (in My Contacts).
339
+ def remove(name)
340
+ self.button(:title=>"Remove contact #{name}").click
341
+ self.wait_for_ajax
342
+ self.class.class_eval { include RemoveContactsPopUp }
343
+ end
344
+ alias remove_contact remove
345
+
346
+ def send_message_to(name)
347
+ name_li(name).button(:class=>"s3d-link-button s3d-action-icon s3d-actions-message searchpeople_result_message_icon sakai_sendmessage_overlay").click
348
+ self.wait_for_ajax
349
+ self.class.class_eval { include SendMessagePopUp }
350
+ end
351
+
352
+ # This method checks whether or not the listed
353
+ # person has the "Add contact" button available.
354
+ # To ensure the test case will be valid, it first
355
+ # makes sure the specified person is in the list.
356
+ # Returns true if the button is available.
357
+ def addable?(name)
358
+ if name_li(name).exists?
359
+ self.button(:title=>"Request connection with #{name}").present?
360
+ else
361
+ puts "\n#{name} isn't in the results list. Check your script.\nThis may be a false negative.\n"
362
+ return false
363
+ end
364
+ end
365
+
366
+ end
367
+
368
+ # Methods related to lists of Groups/Courses
369
+ module ListGroups
370
+
371
+ include PageObject
372
+
373
+ def join_button_for(name)
374
+ name_li(name).div(:class=>/searchgroups_result_left_filler/)
375
+ end
376
+
377
+ # Clicks on the plus sign image for the specified group in the list.
378
+ def add_group(name)
379
+ name_li(name).div(:class=>/searchgroups_result_left_filler/).fire_event("onclick")
380
+ end
381
+ alias add_course add_group
382
+ alias add_research add_group
383
+ alias join_course add_group
384
+ alias join_group add_group
385
+
386
+ #
387
+ def remove_membership(name)
388
+ remove_membership_button(name).click
389
+ self.linger_for_ajax
390
+ self.class.class_eval { include LeaveWorldPopUp }
391
+ end
392
+ alias leave_group remove_membership
393
+
394
+ # This returns the Remove button element itself, for the
395
+ # specified Group/Course/Research listed. This is useful
396
+ # for interacting directly with the element instead of
397
+ # simply clicking on it.
398
+ def remove_membership_button(name)
399
+ name_li(name).button(:title=>/Remove membership from/)
400
+ end
401
+
402
+ # Checks the checkbox for the specified group _
403
+ def check_group(name)
404
+ name_li(name).checkbox(:title=>/Select/).set
405
+ end
406
+ alias select_group check_group
407
+
408
+ # Returns the specified item's "type", as shown next to the item name--i.e.,
409
+ # "GROUP", "COURSE", etc.
410
+ def group_type(name)
411
+ self.span(:class=>"s3d-search-result-name",:text=>name).parent.parent.span(:class=>"mymemberships_item_grouptype").text
412
+ end
413
+ alias course_type group_type
414
+ alias research_type group_type
415
+
416
+ # Returns the number of content items (as an Integer, not a String) in the specified
417
+ # course/group.
418
+ def content_item_count(name)
419
+ text = self.span(:class=>"s3d-search-result-name",:text=>name).parent.parent.parent.link(:title=>/\d+.content items/).text
420
+ text[/\d+/].to_i
421
+ end
422
+
423
+ # Returns the count (as an Integer, not a String) of participants in the specified group/course.
424
+ def participants_count(name)
425
+ text = self.span(:class=>"s3d-search-result-name",:text=>name).parent.parent.parent.link(:title=>/\d+.participant/).text
426
+ text[/\d+/].to_i
427
+ end
428
+
429
+ def view_group_participants(name)
430
+ name_li(name).link(:title=>/\d+.participant/i).click
431
+ self.linger_for_ajax(2)
432
+ Participants.new @browser
433
+ end
434
+
435
+ # Clicks the Message button for the specified listed item.
436
+ def message_course(name)
437
+ message_button(name).click
438
+ self.linger_for_ajax(2)
439
+ self.class.class_eval { include SendMessagePopUp }
440
+ end
441
+ alias send_message_to_course message_course
442
+ alias send_message_to_group message_course
443
+ alias message_group message_course
444
+ alias message_person message_course
445
+ alias message_research message_course
446
+
447
+ # Returns the message button element itself.
448
+ def message_button(name)
449
+ name_li(name).button(:class=>/sakai_sendmessage_overlay/)
450
+ end
451
+
452
+ end
453
+
454
+ # Methods related to lists of Research Projects
455
+ module ListProjects
456
+
457
+ include PageObject
458
+
459
+ # Page Objects
460
+
461
+ # Custom Methods...
462
+
463
+ # Clicks the specified Link (will open any link that matches the
464
+ # supplied text, but it's made for clicking on a Research item listed on
465
+ # the page because it will instantiate the ResearchIntro class).
466
+ def open_research(name)
467
+ name_link(name).click
468
+ sleep 1
469
+ self.wait_for_ajax
470
+ self.execute_script("$('#joinrequestbuttons_widget').css({display: 'block'})")
471
+ ResearchIntro.new @browser
472
+ end
473
+
474
+ alias view_research open_research
475
+ alias open_project open_research
476
+
477
+ end
478
+
479
+ # Methods related to the Participants "Area" or "Page" in
480
+ # Groups/Courses. This is not the same thing as the ManageParticipants
481
+ # module, which relates to the "Add People" Pop Up.
482
+ module ParticipantsWidget
483
+
484
+ include PageObject
485
+
486
+ end
487
+
488
+ # Page Elements and Custom Methods that are shared among the three Error pages
489
+ module CommonErrorElements
490
+
491
+ include PageObject
492
+
493
+ # TBD
494
+
495
+ end