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
@@ -5,24 +5,18 @@
5
5
  # This is the page where users log in to the site.
6
6
  class Login < BasePage
7
7
 
8
- frame_element
8
+ page_url $base_url
9
9
 
10
- def search_public_courses_and_projects
11
- @browser.frame(:index=>0).link(:text=>"Search Public Courses and Projects").click
12
- SearchPublic.new(@browser)
13
- end
10
+ action(:search_public_courses_and_projects) { |b| b.frame(:index=>0).link(:text=>"Search Public Courses and Projects").click }
14
11
 
15
12
  # Logs in to Sakai using the
16
13
  # specified credentials. Then it
17
14
  # instantiates the MyWorkspace class.
18
- def login(username, password)
15
+ def login_with username, password
19
16
  frame = @browser.frame(:id, "ifrm")
20
17
  frame.text_field(:id, "eid").set username
21
18
  frame.text_field(:id, "pw").set password
22
19
  frame.form(:method, "post").submit
23
- return MyWorkspace.new(@browser)
24
20
  end
25
- alias log_in login
26
- alias sign_in login
27
21
 
28
22
  end
@@ -202,7 +202,6 @@ class SectionsOptions < SectionsBase
202
202
  element(:students_can_switch) { |b| b.frm.checkbox(:id=>"optionsForm:selfSwitch") }
203
203
 
204
204
  action(:update) { |b| b.frm.button(:id=>"optionsForm:_idJsp50").click }
205
- action(:cancel) { |b| b.frm.button(:id=>"optionsForm:_idJsp51").click }
206
205
 
207
206
  end
208
207
 
@@ -213,7 +212,7 @@ class AddSections < SectionsBase
213
212
 
214
213
  element(:num_to_add) { |b| b.frm.select_list(:id=>"addSectionsForm:numToAdd") }
215
214
  element(:category) { |b| b.frm.select_list(:id=>"addSectionsForm:category") }
216
- action(:cancel) { |b| b.frm.button(:id=>"addSectionsForm:_idJsp90").click }
215
+ #action(:cancel) { |b| b.frm.button(:id=>"addSectionsForm:_idJsp90").click }
217
216
  # Note that the following field definitions are appropriate for
218
217
  # ONLY THE FIRST instance of each of the fields. The Add Sections page
219
218
  # allows for an arbitrary number of these fields to exist.
@@ -249,7 +248,7 @@ class EditSections < SectionsBase
249
248
 
250
249
  element(:num_to_add) { |b| b.frm.select_list(:id=>"editSectionsForm:numToAdd") }
251
250
  element(:category) { |b| b.frm.select_list(:id=>"editSectionsForm:category") }
252
- action(:cancel) { |b| b.frm.button(:id=>"editSectionsForm:_idJsp90").click }
251
+ #action(:cancel) { |b| b.frm.button(:id=>"editSectionsForm:_idJsp90").click }
253
252
  # Note that the following field definitions are appropriate for
254
253
  # ONLY THE FIRST instance of each of the fields. The Edit Sections page
255
254
  # allows for an arbitrary number of these fields to exist.
@@ -136,7 +136,6 @@ class Groups < SiteSetupBase
136
136
  action(:create_new_group) { |p| p.create_new_group_link.click }
137
137
  action(:auto_groups) { |b| b.frm.link(:text=>"Auto Groups").click }
138
138
  action(:remove_checked) { |b| b.frm.button(:id=>"delete-groups").click }
139
- action(:cancel) { |b| b.frm.button(:id=>"cancel").click }
140
139
 
141
140
  end
142
141
 
@@ -156,7 +155,6 @@ class CreateNewGroup < SiteSetupBase
156
155
  action(:left) { |b| b.frm.button(:name=>"left", :index=>0).click }
157
156
  action(:all_right) { |b| b.frm.button(:name=>"right", :index=>1).click }
158
157
  action(:all_left) { |b| b.frm.button(:name=>"left",:index=>1).click }
159
- action(:cancel) { |b| b.frm.button(:id=>"cancel").click }
160
158
 
161
159
  end
162
160
 
@@ -192,7 +190,7 @@ class SiteSetupAddParticipants < SiteSetupBase
192
190
  element(:assign_each_individually) { |b| b.frm.radio(:id=>"content::role-row:1:role-select") }
193
191
  element(:active_status) { |b| b.frm.radio(:id=>"content::status-row:0:status-select") }
194
192
  element(:inactive_status) { |b| b.frm.radio(:id=>"content::status-row:1:status-select") }
195
- action(:cancel) { |b| b.frm.button(:id=>"content::cancel").click }
193
+ #action(:cancel) { |b| b.frm.button(:id=>"content::cancel").click }
196
194
 
197
195
  end
198
196
 
@@ -205,7 +203,7 @@ class SiteSetupChooseRolesIndiv < SiteSetupBase
205
203
  action(:continue) { |b| b.frm.button(:value=>"Continue").click }
206
204
 
207
205
  action(:back) { |b| b.frm.button(:name=>"command link parameters&Submitting%20control=content%3A%3Aback&Fast%20track%20action=siteAddParticipantHandler.processDifferentRoleBack").click }
208
- action(:cancel) { |b| b.frm.button(:name=>"command link parameters&Submitting%20control=content%3A%3Acancel&Fast%20track%20action=siteAddParticipantHandler.processCancel").click }
206
+ #action(:cancel) { |b| b.frm.button(:name=>"command link parameters&Submitting%20control=content%3A%3Acancel&Fast%20track%20action=siteAddParticipantHandler.processCancel").click }
209
207
  element(:user_role) { |b| b.frm.select(:id=>"content::user-row:0:role-select-selection") }
210
208
 
211
209
  end
@@ -248,7 +246,7 @@ class SiteSetupParticipantEmail < SiteSetupBase
248
246
 
249
247
  action(:continue) { |b| b.frm.button(:value=>"Continue").click }
250
248
  action(:back) { |b| b.frm.button(:name=>"command link parameters&Submitting%20control=content%3A%3Acontinue&Fast%20track%20action=siteAddParticipantHandler.processEmailNotiBack").click }
251
- action(:cancel) { |b| b.frm.button(:name=>"command link parameters&Submitting%20control=content%3A%3Acontinue&Fast%20track%20action=siteAddParticipantHandler.processEmailNotiCancel").click }
249
+ #action(:cancel) { |b| b.frm.button(:name=>"command link parameters&Submitting%20control=content%3A%3Acontinue&Fast%20track%20action=siteAddParticipantHandler.processEmailNotiCancel").click }
252
250
  element(:send_now) { |b| b.frm.radio(:id=>"content::noti-row:0:noti-select") }
253
251
  element(:dont_send) { |b| b.frm.radio(:id=>"content::noti-row:1:noti-select") }
254
252
 
@@ -273,7 +271,7 @@ class SiteSetupParticipantConfirm < SiteSetupBase
273
271
  end
274
272
 
275
273
  action(:back) { |b| b.frm.button(:name=>"command link parameters&Submitting%20control=content%3A%3Aback&Fast%20track%20action=siteAddParticipantHandler.processConfirmBack").click }
276
- action(:cancel) { |b| b.frm.button(:name=>"command link parameters&Submitting%20control=content%3A%3Aback&Fast%20track%20action=siteAddParticipantHandler.processConfirmCancel").click }
274
+ #action(:cancel) { |b| b.frm.button(:name=>"command link parameters&Submitting%20control=content%3A%3Aback&Fast%20track%20action=siteAddParticipantHandler.processConfirmCancel").click }
277
275
 
278
276
  end
279
277
 
@@ -344,7 +342,6 @@ class EditSiteTools < SiteSetupBase
344
342
  element(:yes) { |b| b.frm.radio(:id=>"import_yes") }
345
343
  element(:import_sites) { |b| b.frm.select(:id=>"importSites") }
346
344
  action(:back) { |b| b.frm.button(:name=>"Back").click }
347
- action(:cancel) { |b| b.frm.button(:name=>"Cancel").click }
348
345
 
349
346
  end
350
347
 
@@ -394,13 +391,8 @@ class DeleteSite < SiteSetupBase
394
391
 
395
392
  menu_elements
396
393
 
397
- # Clicks the Remove button, then instantiates
398
- # the SiteSetup class.
394
+ # Clicks the Remove button
399
395
  action(:remove) { |b| b.frm.button(:value=>"Remove").click }
400
-
401
- # Clicks the Cancel button, then instantiates
402
- # the SiteSetup class.
403
- action(:cancel) { |b| b.frm.button(:value=>"Cancel").click }
404
396
 
405
397
  end
406
398
 
@@ -427,7 +419,7 @@ class SiteType < SiteSetupBase
427
419
  element(:academic_term) { |b| b.frm.select(:id=>"selectTerm") }
428
420
  element(:select_template) { |b| b.frm.select(:id=>"templateSiteId") }
429
421
  element(:select_term) { |b| b.frm.select(:id=>"selectTermTemplate") }
430
- action(:cancel) { |b| b.frm.button(:id=>"cancelCreate").click }
422
+ #action(:cancel) { |b| b.frm.button(:id=>"cancelCreate").click }
431
423
  element(:copy_users) { |b| b.frm.checkbox(:id=>"copyUsers") }
432
424
  element(:copy_content) { |b| b.frm.checkbox(:id=>"copyContent") }
433
425
  end
@@ -461,7 +453,6 @@ class AddMultipleTools < SiteSetupBase
461
453
  element(:web_content_source) { |b| b.frm.text_field(:id=>"source_sakai.iframe") }
462
454
  element(:more_web_content_tools) { |b| b.frm.select(:id=>"num_sakai.iframe") }
463
455
  action(:back) { |b| b.frm.button(:name=>"Back").click }
464
- action(:cancel) { |b| b.frm.button(:name=>"Cancel").click }
465
456
 
466
457
  end
467
458
 
@@ -470,7 +461,8 @@ end
470
461
  class CourseSectionInfo < SiteSetupBase
471
462
 
472
463
  menu_elements
473
-
464
+ expected_element :subject
465
+
474
466
  # Clicks the Continue button, then instantiates
475
467
  # the CourseSiteInfo Class.
476
468
  action(:continue) { |b| b.frm.button(:value=>"Continue").click }
@@ -497,7 +489,6 @@ class CourseSectionInfo < SiteSetupBase
497
489
  element(:special_instructions) { |b| b.frm.text_field(:id=>"additional") }
498
490
  element(:add_more_rosters) { |b| b.frm.select(:id=>"number") }
499
491
  action(:back) { |b| b.frm.button(:name=>"Back").click }
500
- action(:cancel) { |b| b.frm.button(:name=>"Cancel").click }
501
492
 
502
493
  end
503
494
 
@@ -507,6 +498,7 @@ end
507
498
  class SiteAccess < SiteSetupBase
508
499
 
509
500
  menu_elements
501
+ expected_element :allow
510
502
 
511
503
  # The page element that displays the joiner role
512
504
  # select list. Use this method to validate whether the
@@ -524,7 +516,6 @@ class SiteAccess < SiteSetupBase
524
516
  element(:limited) { |b| b.frm.radio(:id=>"unjoinable") }
525
517
  element(:allow) { |b| b.frm.radio(:id=>"joinable") }
526
518
  action(:back) { |b| b.frm.button(:name=>"eventSubmit_doBack").click }
527
- action(:cancel) { |b| b.frm.button(:name=>"eventSubmit_doCancel_create").click }
528
519
  element(:joiner_role) { |b| b.frm.select(:id=>"joinerRole") }
529
520
 
530
521
  end
@@ -571,7 +562,6 @@ class CourseSiteInfo < BasePage
571
562
  element(:site_contact_name) { |b| b.frm.text_field(:id=>"siteContactName") }
572
563
  element(:site_contact_email) { |b| b.frm.text_field(:id=>"siteContactEmail") }
573
564
  action(:back) { |b| b.frm.button(:name=>"Back").click }
574
- action(:cancel) { |b| b.frm.button(:name=>"Cancel").click }
575
565
 
576
566
  end
577
567
 
@@ -24,6 +24,12 @@ module FCKEditor
24
24
  source_field(editor).value
25
25
  end
26
26
 
27
+ # Adds the specified string of text to the beginning of the existing
28
+ # text in the target FCKEditor.
29
+ def prepend(editor, string)
30
+ editor.td(:id, "xEditingArea").frame(:index=>0).send_keys(string)
31
+ end
32
+
27
33
  def entity_picker(editor)
28
34
  editor.div(:title=>"Sakai_Entity_Link").wait_until_present
29
35
  editor.div(:title=>"Sakai_Entity_Link").click
@@ -16,16 +16,10 @@ module Utilities
16
16
  return $~.to_s
17
17
  end
18
18
 
19
+ # TODO: Pull this out because it's a dupe. Fix anything that's broken because this is commented out...
19
20
  # Shorthand method for making a data object for testing.
20
- def make data_object_class, opts={}
21
- data_object_class.new @browser, opts
22
- end
23
-
24
- # Transform for use with data object instance variables
25
- # that refer to checkboxes or radio buttons.
26
- def checkbox_setting(checkbox)
27
- checkbox.set? ? :set : :clear
28
- end
29
- alias radio_setting checkbox_setting
21
+ #def make data_object_class, opts={}
22
+ # data_object_class.new @browser, opts
23
+ #end
30
24
 
31
25
  end
@@ -199,6 +199,7 @@ module Workflows
199
199
 
200
200
  # AssessmentsList class OR the TakeAssessmentList for students
201
201
  menu_link :assessments, :class=>"icon-sakai-samigo"
202
+ alias :tests_and_quizzes :assessments
202
203
 
203
204
  # UserMembership
204
205
  menu_link :user_membership, :class=>"icon-sakai-usermembership"
@@ -215,9 +216,4 @@ module Workflows
215
216
  # The Page Reset button, found on all Site pages
216
217
  menu_link :reset, :href=>/tool-reset/
217
218
 
218
- # Login class.
219
- menu_link :logout, :text=>"Logout"
220
- alias :log_out :logout
221
- alias :sign_out :logout
222
-
223
219
  end
data/lib/sambal-cle.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  require 'cgi'
2
- require 'watir-webdriver'
3
- require 'sambal-cle/page_maker.rb'
2
+ require 'test-factory'
4
3
  Dir["#{File.dirname(__FILE__)}/sambal-cle/*.rb"].each {|f| require f }
5
4
  Dir["#{File.dirname(__FILE__)}/sambal-cle/page_objects/*.rb"].each {|f| require f }
6
5
  Dir["#{File.dirname(__FILE__)}/sambal-cle/data_objects/*.rb"].each {|f| require f }
@@ -12,20 +11,13 @@ Dir["#{File.dirname(__FILE__)}/sambal-cle/data_objects/*.rb"].each {|f| require
12
11
  # create the @browser variable used throughout the page classes
13
12
  class SakaiCLE
14
13
 
15
- #include PageObject
16
- #include ToolsMenu
17
-
18
14
  attr_reader :browser
19
15
 
20
16
  def initialize(web_browser, url)
21
17
  @browser = Watir::Browser.new web_browser
22
18
  @browser.window.resize_to(1400,900)
23
19
  @browser.goto url
24
- end
25
-
26
- # Returns the class containing the welcome page's page elements.
27
- def page
28
- Login.new @browser
20
+ $base_url=url
29
21
  end
30
22
 
31
23
  end
data/sambal-cle.gemspec CHANGED
@@ -1,14 +1,13 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'sambal-cle'
3
- s.version = '0.1.3'
4
- s.summary = %q{Sakai-CLE functional testing API for the rSmart Collaborative Learning Environment}
5
- s.description = %q{The Sambal-CLE gem provides an API for interacting with pages and page elements in rSmart's deployment of the Sakai Collaborative Learning Environment.}
3
+ s.version = '0.1.4'
4
+ s.summary = %q{rSmart's test framework for testing Sakai-CLE}
5
+ s.description = %q{This gem is used for creating test scripts for the Sakai Collaborative Learning Environment.}
6
6
  s.files = Dir.glob("**/**/**")
7
7
  s.test_files = Dir.glob("test/*test_rb")
8
- s.authors = ["Abraham Heward"]
9
- s.email = %w{"aheward@rsmart.com"}
10
- s.homepage = 'https://github.com/rSmart/sambal-cle'
11
- s.add_dependency 'watir-webdriver', '>= 0.5.5'
12
- s.add_dependency 'selenium-webdriver', '>= 2.21.2'
8
+ s.authors = ["Abraham Heward", "Jon Utter"]
9
+ s.email = %w{"aheward@rsmart.com" "jutter@rsmart.com"}
10
+ s.homepage = 'https://github.com/rSmart'
11
+ s.add_dependency 'test-factory', '>= 0.0.1'
13
12
  s.required_ruby_version = '>= 1.9.2'
14
13
  end
@@ -6,9 +6,9 @@ describe "Assignment Due Date on Calendar" do
6
6
 
7
7
  include Utilities
8
8
  include Workflows
9
- include PageHelper
10
- include Randomizers
11
- include DateMakers
9
+ include Foundry
10
+ include StringFactory
11
+ include DateFactory
12
12
 
13
13
  before :all do
14
14
 
@@ -18,21 +18,20 @@ describe "Assignment Due Date on Calendar" do
18
18
  @sakai = SakaiCLE.new(@config['browser'], @config['url'])
19
19
  @browser = @sakai.browser
20
20
 
21
- @student = @directory['person1']['id']
22
- @spassword = @directory['person1']['password']
23
- @instructor1 = @directory['person3']['id']
24
- @ipassword = @directory['person3']['password']
25
-
26
- @instructor2 = @directory['person4']['id']
27
- @password1 = @directory['person4']['password']
28
-
29
- @sakai.page.login(@instructor1, @ipassword)
21
+ @student = make UserObject, :id=>@directory['person1']['id'], :password=>@directory['person1']['password'],
22
+ :first_name=>@directory['person1']['firstname'], :last_name=>@directory['person1']['lastname']
23
+ @instructor1 = make UserObject, :id=>@directory['person3']['id'], :password=>@directory['person3']['password'],
24
+ :first_name=>@directory['person3']['firstname'], :last_name=>@directory['person3']['lastname'],
25
+ :type=>"Instructor"
26
+ @instructor2 = make UserObject, :id=>@directory['person4']['id'], :password=>@directory['person4']['password'],
27
+ :first_name=>@directory['person4']['firstname'], :last_name=>@directory['person4']['lastname'],
28
+ :type=>"Instructor"
29
+ @instructor1.log_in
30
30
 
31
31
  @site = make SiteObject
32
32
  @site.create
33
-
34
- @site.add_official_participants :role=>"Student", :participants=>[@student]
35
- @site.add_official_participants :role=>"Instructor", :participants=>[@instructor2]
33
+ @site.add_official_participants :role=>@student.type, :participants=>[@student.id]
34
+ @site.add_official_participants :role=>@instructor2.type, :participants=>[@instructor2.id]
36
35
 
37
36
  @assignment1 = make AssignmentObject, :site=>@site.name, :title=>random_string, :grade_scale=>"Letter grade", :instructions=>random_multiline(500, 10, :string), :open=>minutes_ago(5)
38
37
  @assignment2 = make AssignmentObject, :allow_resubmission=>:set, :add_due_date=>:set, :site=>@site.name, :title=>random_nicelink(15), :open=>hours_ago(5), :student_submissions=>"Inline only", :grade_scale=>"Letter grade", :instructions=>random_multiline(750, 13, :string)