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.
- data/README.md +3 -1
- data/lib/sambal-cle/base_page.rb +3 -1
- data/lib/sambal-cle/data_objects/announcement.rb +7 -10
- data/lib/sambal-cle/data_objects/assessment.rb +265 -9
- data/lib/sambal-cle/data_objects/assignment.rb +38 -32
- data/lib/sambal-cle/data_objects/assignment_permissions.rb +61 -0
- data/lib/sambal-cle/data_objects/assignment_submission.rb +126 -0
- data/lib/sambal-cle/data_objects/blog.rb +4 -7
- data/lib/sambal-cle/data_objects/blogger.rb +4 -10
- data/lib/sambal-cle/data_objects/chat_room.rb +5 -8
- data/lib/sambal-cle/data_objects/event.rb +6 -17
- data/lib/sambal-cle/data_objects/forum.rb +9 -19
- data/lib/sambal-cle/data_objects/lesson.rb +8 -29
- data/lib/sambal-cle/data_objects/message.rb +7 -10
- data/lib/sambal-cle/data_objects/poll.rb +6 -11
- data/lib/sambal-cle/data_objects/resource.rb +28 -37
- data/lib/sambal-cle/data_objects/site.rb +6 -17
- data/lib/sambal-cle/data_objects/syllabus.rb +6 -8
- data/lib/sambal-cle/data_objects/user.rb +88 -0
- data/lib/sambal-cle/data_objects/web_content_tool.rb +5 -6
- data/lib/sambal-cle/data_objects/wiki.rb +6 -6
- data/lib/sambal-cle/page_objects/account.rb +0 -2
- data/lib/sambal-cle/page_objects/announcements.rb +0 -1
- data/lib/sambal-cle/page_objects/assessments.rb +57 -87
- data/lib/sambal-cle/page_objects/assignments.rb +117 -337
- data/lib/sambal-cle/page_objects/calendar.rb +0 -2
- data/lib/sambal-cle/page_objects/login.rb +3 -9
- data/lib/sambal-cle/page_objects/sections.rb +2 -3
- data/lib/sambal-cle/page_objects/site_setup.rb +9 -19
- data/lib/sambal-cle/rich_text.rb +6 -0
- data/lib/sambal-cle/utilities.rb +4 -10
- data/lib/sambal-cle/workflows.rb +1 -5
- data/lib/sambal-cle.rb +2 -10
- data/sambal-cle.gemspec +7 -8
- data/test/add_assignment_to_calendar_spec.rb +14 -15
- data/test/assessment_create_spec.rb +355 -0
- data/test/assignment_announcements_spec.rb +14 -15
- data/test/assignment_duplicate_spec.rb +56 -0
- data/test/assignment_gradebook_spec.rb +16 -15
- data/test/assignment_permissions_spec.rb +77 -0
- data/test/assignments_grading_spec.rb +123 -0
- data/test/assignments_submission_spec.rb +143 -0
- data/test/config.yml +3 -0
- data/test/directory.yml +120 -0
- data/test/duplicate_site_spec.rb +5 -3
- data/test/import_site_content_spec.rb +248 -0
- metadata +22 -31
- data/lib/sambal-cle/core-ext.rb +0 -90
- data/lib/sambal-cle/date_makers.rb +0 -118
- data/lib/sambal-cle/gem_ext.rb +0 -23
- data/lib/sambal-cle/page_helper.rb +0 -22
- data/lib/sambal-cle/page_maker.rb +0 -48
- 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
|
-
|
8
|
+
page_url $base_url
|
9
9
|
|
10
|
-
|
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
|
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
|
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
|
|
data/lib/sambal-cle/rich_text.rb
CHANGED
@@ -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
|
data/lib/sambal-cle/utilities.rb
CHANGED
@@ -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
|
-
|
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
|
data/lib/sambal-cle/workflows.rb
CHANGED
@@ -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 '
|
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
|
-
|
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.
|
4
|
-
s.summary = %q{
|
5
|
-
s.description = %q{
|
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
|
11
|
-
s.add_dependency '
|
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
|
10
|
-
include
|
11
|
-
include
|
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 =
|
22
|
-
|
23
|
-
@instructor1 =
|
24
|
-
|
25
|
-
|
26
|
-
@instructor2 =
|
27
|
-
|
28
|
-
|
29
|
-
@
|
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
|
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)
|