sambal-cle 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
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)