sambal-kuali 0.0.1

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 (65) hide show
  1. data/Gemfile +6 -0
  2. data/Gemfile.lock +34 -0
  3. data/README.md +40 -0
  4. data/lib/sambal-kuali/base_page_classes.rb +418 -0
  5. data/lib/sambal-kuali/data_objects/academic_calendar.rb +90 -0
  6. data/lib/sambal-kuali/data_objects/activity_offering.rb +438 -0
  7. data/lib/sambal-kuali/data_objects/activity_offering_cluster.rb +52 -0
  8. data/lib/sambal-kuali/data_objects/course_offering.rb +42 -0
  9. data/lib/sambal-kuali/data_objects/holiday_calendar.rb +120 -0
  10. data/lib/sambal-kuali/data_objects/population.rb +257 -0
  11. data/lib/sambal-kuali/data_objects/rollover.rb +67 -0
  12. data/lib/sambal-kuali/data_objects/schedule_of_classes.rb +130 -0
  13. data/lib/sambal-kuali/kuali_base_page.rb +49 -0
  14. data/lib/sambal-kuali/pages/active_population_lookup.rb +22 -0
  15. data/lib/sambal-kuali/pages/activity_offering_inquiry.rb +23 -0
  16. data/lib/sambal-kuali/pages/activity_offering_lookup.rb +11 -0
  17. data/lib/sambal-kuali/pages/activity_offering_maintenance.rb +93 -0
  18. data/lib/sambal-kuali/pages/activity_offering_maintenance_view.rb +44 -0
  19. data/lib/sambal-kuali/pages/add_hold.rb +11 -0
  20. data/lib/sambal-kuali/pages/appointment_window_lookup.rb +12 -0
  21. data/lib/sambal-kuali/pages/calendar_search.rb +82 -0
  22. data/lib/sambal-kuali/pages/copy_holiday_calendar.rb +20 -0
  23. data/lib/sambal-kuali/pages/course_offering_edit.rb +122 -0
  24. data/lib/sambal-kuali/pages/course_offering_info_lookup.rb +12 -0
  25. data/lib/sambal-kuali/pages/create_acad_calendar.rb +22 -0
  26. data/lib/sambal-kuali/pages/create_course_offering.rb +20 -0
  27. data/lib/sambal-kuali/pages/create_holiday_calendar.rb +16 -0
  28. data/lib/sambal-kuali/pages/create_population.rb +19 -0
  29. data/lib/sambal-kuali/pages/create_process.rb +17 -0
  30. data/lib/sambal-kuali/pages/delete_term.rb +17 -0
  31. data/lib/sambal-kuali/pages/delivery_logistics_edit.rb +37 -0
  32. data/lib/sambal-kuali/pages/department_lookup.rb +37 -0
  33. data/lib/sambal-kuali/pages/display_schedule_of_classes.rb +132 -0
  34. data/lib/sambal-kuali/pages/document_search.rb +37 -0
  35. data/lib/sambal-kuali/pages/edit_academic_calendar.rb +57 -0
  36. data/lib/sambal-kuali/pages/edit_population.rb +18 -0
  37. data/lib/sambal-kuali/pages/enrollment.rb +23 -0
  38. data/lib/sambal-kuali/pages/enrollment_fee_lookup.rb +11 -0
  39. data/lib/sambal-kuali/pages/format_offering_info_lookup.rb +9 -0
  40. data/lib/sambal-kuali/pages/header.rb +5 -0
  41. data/lib/sambal-kuali/pages/hold_lookup.rb +34 -0
  42. data/lib/sambal-kuali/pages/holiday_calendar_information.rb +25 -0
  43. data/lib/sambal-kuali/pages/login_page.rb +15 -0
  44. data/lib/sambal-kuali/pages/main_menu.rb +73 -0
  45. data/lib/sambal-kuali/pages/manage_course_offerings.rb +72 -0
  46. data/lib/sambal-kuali/pages/manage_populations.rb +11 -0
  47. data/lib/sambal-kuali/pages/manage_process.rb +20 -0
  48. data/lib/sambal-kuali/pages/manage_registration_groups.rb +89 -0
  49. data/lib/sambal-kuali/pages/manage_registration_windows.rb +12 -0
  50. data/lib/sambal-kuali/pages/organization_lookup.rb +39 -0
  51. data/lib/sambal-kuali/pages/perform_rollover.rb +68 -0
  52. data/lib/sambal-kuali/pages/personnel_lookup.rb +44 -0
  53. data/lib/sambal-kuali/pages/rollover_confirm_release_to_depts.rb +14 -0
  54. data/lib/sambal-kuali/pages/rollover_details.rb +40 -0
  55. data/lib/sambal-kuali/pages/term_info_lookup.rb +10 -0
  56. data/lib/sambal-kuali/pages/term_information.rb +8 -0
  57. data/lib/sambal-kuali/pages/term_lookup.rb +15 -0
  58. data/lib/sambal-kuali/pages/unknown_term_course_offerings.rb +10 -0
  59. data/lib/sambal-kuali/pages/view_population.rb +18 -0
  60. data/lib/sambal-kuali/pages/workflow_preferences.rb +34 -0
  61. data/lib/sambal-kuali/workflows.rb +121 -0
  62. data/lib/sambal-kuali.rb +8 -0
  63. data/linux_headless_setup.sh +107 -0
  64. data/sambal-kuali.gemspec +12 -0
  65. metadata +129 -0
@@ -0,0 +1,257 @@
1
+ class Population
2
+
3
+ include Foundry
4
+ include DataFactory
5
+ include DateFactory
6
+ include StringFactory
7
+ include Workflows
8
+
9
+ attr_accessor :name, :description, :rule, :operation, :child_populations,
10
+ :reference_population, :status, :type
11
+
12
+ def initialize(browser, opts={})
13
+ @browser = browser
14
+
15
+ defaults = {
16
+ :name=>random_alphanums.strip,
17
+ :description=>random_alphanums_plus.strip, # TODO: figure out why random_multiline does not validate properly
18
+ :type=>"rule-based",
19
+ :child_populations=>[],
20
+ :rule=>nil,
21
+ :reference_population=>nil,
22
+ :status=>"Active"
23
+ }
24
+ options = defaults.merge(opts)
25
+
26
+ set_options(options)
27
+ operations = {:"union-based"=>"union",:"intersection-based"=>"intersection",:"exclusion-based"=>"exclusion"}
28
+ @operation = operations[type.to_sym]
29
+ end
30
+
31
+ def create
32
+ go_to_create_population
33
+ on CreatePopulation do |page|
34
+ page.name.set @name
35
+ page.description.set @description
36
+ page.by_using_populations unless @type == 'rule-based'
37
+ case(@type)
38
+ when 'rule-based'
39
+ # Select a random rule if none is defined
40
+ @rule=random_rule(page) if @rule == nil
41
+ page.rule.select @rule
42
+ when 'union-based'
43
+ # Select union...
44
+ page.union
45
+ when 'intersection-based'
46
+ # Select intersection...
47
+ page.intersection
48
+ when 'exclusion-based'
49
+ # Select exclusion...
50
+ page.exclusion
51
+ @reference_population == nil ? @reference_population = add_random_ref_pop : add_ref_pop(@reference_population) unless @reference_population == " "
52
+ else
53
+ raise "Your population type value must be one of the following:\n'rule-based', 'union-based', 'intersection-based', or 'exclusion-based'.\nPlease update your script"
54
+ end
55
+ unless type=='rule-based'
56
+ if @child_populations.length == 0
57
+ 2.times { @child_populations << add_random_population }
58
+ else
59
+ @child_populations.each do |pop|
60
+ if pop == "random"
61
+ pop.replace(add_random_population)
62
+ else
63
+ add_child_population(pop)
64
+ end
65
+ end
66
+ end
67
+ end
68
+ end
69
+ on CreatePopulation do |page|
70
+ # Click the create population button...
71
+ page.create
72
+ end
73
+ sleep 10
74
+ end
75
+
76
+ def edit_population opts={}
77
+
78
+ defaults = {
79
+ :name=>@name,
80
+ :description=>@description,
81
+ :status=>@status,
82
+ :rule=>@rule,
83
+ :reference_population=>@reference_population,
84
+ :child_populations=>@child_populations
85
+ }
86
+ options=defaults.merge(opts)
87
+
88
+ go_to_manage_population
89
+ on ManagePopulations do |page|
90
+ page.keyword.set @name
91
+ page.both.set
92
+ page.search
93
+ page.edit @name
94
+ end
95
+ on EditPopulation do |page|
96
+ page.name.set options[:name]
97
+ page.description.set options[:description]
98
+ page.send(options[:status].downcase).set
99
+ if options[:rule] == "random"
100
+ options[:rule]=new_random_rule(page)
101
+ end
102
+ page.rule.select(options[:rule]) unless options[:rule] == nil
103
+
104
+ if options[:reference_population] == "random"
105
+ options[:reference_population] = update_random_ref_pop
106
+ @reference_population = options[:reference_population] #updating instance variable immediately - don't want to reuse this pop
107
+ else
108
+ update_ref_pop(options[:reference_population]) unless options[:reference_population] == @reference_population or options[:reference_population] == nil
109
+ end
110
+
111
+ unless @child_populations == options[:child_populations] or options[:child_populations] == []
112
+ page.child_populations.reverse.each { |pop| page.remove_population(pop) }
113
+ @child_populations = options[:child_populations] #updating instance variable immediately - don't want to reuse this pop
114
+ @child_populations.each do |pop|
115
+ if pop == "random"
116
+ pop.replace(add_random_population)
117
+ else
118
+ add_child_population(pop)
119
+ end
120
+ end
121
+ options[:child_populations] = @child_populations #keep in sync
122
+ end
123
+
124
+ page.update
125
+
126
+ if page.first_msg == "Document was successfully submitted."
127
+ set_options(options)
128
+ else
129
+ # Do not update the Population attributes.
130
+ end
131
+ end
132
+ end
133
+
134
+ def add_child_population(child_population)
135
+ on CreatePopulation do |page|
136
+ page.lookup_population
137
+ end
138
+ on ActivePopulationLookup do |page|
139
+ page.keyword.wait_until_present
140
+ page.keyword.set child_population
141
+ page.search
142
+ page.return_value child_population
143
+ end
144
+ on CreatePopulation do |page|
145
+ page.wait_until(30) { page.child_population.value == child_population }
146
+ page.add
147
+ end
148
+ end
149
+
150
+ def add_random_population
151
+ on CreatePopulation do |page|
152
+ page.lookup_population
153
+ end
154
+ population = search_for_random_pop
155
+ on ActivePopulationLookup do |page|
156
+ page.return_value population
157
+ end
158
+ on CreatePopulation do |page|
159
+ page.wait_until(30) { page.child_population.value == population }
160
+ page.add
161
+ end
162
+ population
163
+ end
164
+
165
+ def add_ref_pop(population)
166
+ on CreatePopulation do |page|
167
+ page.lookup_ref_population
168
+ end
169
+ on ActivePopulationLookup do |page|
170
+ page.keyword.wait_until_present
171
+ page.keyword.set population
172
+ page.search
173
+ page.return_value population
174
+ end
175
+ on CreatePopulation do |page|
176
+ page.wait_until(30) { page.reference_population.value == population }
177
+ end
178
+ end
179
+
180
+ def add_random_ref_pop
181
+ on CreatePopulation do |page|
182
+ page.lookup_ref_population
183
+ end
184
+ population = search_for_random_pop
185
+ on ActivePopulationLookup do |page|
186
+ page.return_value population
187
+ end
188
+ on CreatePopulation do |page|
189
+ page.wait_until(30) { page.reference_population.value == population }
190
+ end
191
+ population
192
+ end
193
+
194
+ def update_ref_pop(pop)
195
+ on EditPopulation do |page|
196
+ page.lookup_ref_population
197
+ end
198
+ pop = search_for_random_pop
199
+ on ActivePopulationLookup do |page|
200
+ page.return_value pop
201
+ end
202
+ on CreatePopulation do |page|
203
+ page.wait_until(30) { page.reference_population.value == pop }
204
+ end
205
+ end
206
+
207
+ def update_random_ref_pop
208
+ pop = ""
209
+ on EditPopulation do |page|
210
+ page.lookup_ref_population
211
+ end
212
+ pop = search_for_random_pop
213
+ on ActivePopulationLookup do |page|
214
+ page.return_value pop
215
+ end
216
+ on CreatePopulation do |page|
217
+ page.wait_until(30) { page.reference_population.value == pop }
218
+ end
219
+ pop
220
+ end
221
+
222
+ # Returns (as a string) one of the rules listed in the Rule selection list.
223
+ def random_rule(page)
224
+ rules = []
225
+ page.rule.options.to_a.each { |item| rules << item.text }
226
+ rules.delete(@rule) unless @rule == nil
227
+ rules.shuffle!
228
+ rules[0]
229
+ end
230
+
231
+ def new_random_rule(page)
232
+ new_rule = random_rule(page)
233
+ if new_rule == @rule
234
+ new_random_rule(page)
235
+ else
236
+ new_rule
237
+ end
238
+ end
239
+
240
+ private
241
+
242
+ def search_for_random_pop #checks to make sure not already used
243
+ names = []
244
+ on ActivePopulationLookup do |page|
245
+ page.keyword.wait_until_present
246
+ page.search
247
+ no_of_full_pages = [(page.no_of_entries.to_i/10).to_i,5].min
248
+ page.change_results_page(1+rand(no_of_full_pages))
249
+ names = page.results_list
250
+ end
251
+ #next 2 lines ensures populat
252
+ names = names - @child_populations unless @child_populations == nil
253
+ names.delete(@reference_population) unless @reference_population == nil
254
+ names[1+rand(names.length-1)]
255
+ end
256
+
257
+ end
@@ -0,0 +1,67 @@
1
+ class Rollover
2
+
3
+ include Foundry
4
+ include DataFactory
5
+ include DateFactory
6
+ include StringFactory
7
+ include Workflows
8
+
9
+ attr_accessor :source_term,
10
+ :target_term
11
+
12
+ def initialize(browser, opts={})
13
+ @browser = browser
14
+
15
+ defaults = {
16
+ :source_term=>"20122",
17
+ :target_term=>"20212"
18
+ }
19
+ options = defaults.merge(opts)
20
+ set_options(options)
21
+ end
22
+
23
+ def perform_rollover
24
+ go_to_perform_rollover
25
+ on PerformRollover do |page|
26
+ @target_term = page.select_terms(@target_term,@source_term)
27
+ raise "source_term_code issue" unless page.source_term_code == @source_term
28
+ raise "target_term_code issue" unless page.target_term_code == @target_term
29
+ page.rollover_course_offerings
30
+ raise "rollover issue" unless page.status == "In Progress"
31
+ end
32
+ end
33
+
34
+ def wait_for_rollover_to_complete
35
+ go_to_rollover_details
36
+ on RolloverDetails do |page|
37
+ page.term.set @target_term
38
+ page.go
39
+ poll_ctr = 0
40
+ while page.status != "Finished" and poll_ctr < 20 #will wait 10 mins
41
+ poll_ctr = poll_ctr + 1
42
+ sleep 30
43
+ page.go
44
+ end
45
+ end
46
+ end
47
+
48
+ def release_to_depts
49
+ go_to_rollover_details
50
+ on RolloverDetails do |page|
51
+ page.term.set @target_term
52
+ page.go
53
+ raise "rollover details - release to depts not enabled" unless page.release_to_departments_button.enabled?
54
+ page.release_to_departments
55
+ end
56
+
57
+ on RolloverConfirmReleaseToDepts do |page|
58
+ page.confirm
59
+ page.release_to_departments
60
+ end
61
+
62
+ on RolloverDetails do |page|
63
+ raise "release to depts not completed" unless page.status_detail_msg =~ /have been released to the departments/
64
+ end
65
+ end
66
+
67
+ end
@@ -0,0 +1,130 @@
1
+ class ScheduleOfClasses
2
+
3
+ include Foundry
4
+ include DataFactory
5
+ include DateFactory
6
+ include StringFactory
7
+ include Workflows
8
+
9
+ attr_accessor :term,
10
+ :course_search_parm,
11
+ :keyword,
12
+ :instructor_principal_name,
13
+ :instructor_long_name,
14
+ :department_short_name,
15
+ :type_of_search,
16
+ :exp_course_list #TODO: exp results can be expanded to include AO info, etc.
17
+
18
+ def initialize(browser, opts={})
19
+ @browser = browser
20
+
21
+ defaults = {
22
+ :term=>"Spring 2012",
23
+ :course_search_parm=>"ENGL103",
24
+ :department_short_name=>"ENGL",
25
+ :instructor_principal_name=>"B.JOHND",
26
+ :keyword=>"WRITING FROM SOURCES" ,
27
+ :type_of_search=>"Course", #Course, Department, Instructor, Title & Description
28
+ :exp_course_list=>["ENGL103"]
29
+ }
30
+ options = defaults.merge(opts)
31
+ set_options(options)
32
+ end
33
+
34
+ def display
35
+ on DisplayScheduleOfClasses do |page|
36
+ page.term.select @term
37
+ page.select_type_of_search(@type_of_search)
38
+ case @type_of_search
39
+ when "Course" then page.course_search_parm.set @course_search_parm
40
+ when "Instructor" then instructor_lookup(@instructor_principal_name)
41
+ when "Department" then department_lookup(@department_short_name)
42
+ when "Title & Description" then page.title_description_search_parm.set @keyword
43
+ else raise "ScheduleOfClasses - search type not recognized"
44
+ end
45
+
46
+ page.show
47
+ end
48
+ end
49
+
50
+ def department_lookup(short_name)
51
+ on DisplayScheduleOfClasses do |page|
52
+ page.department_search_lookup
53
+ end
54
+ on DepartmentLookup do |page|
55
+ page.short_name.set(short_name)
56
+ page.search
57
+ page.return_value(short_name)
58
+ end
59
+ end
60
+
61
+ def instructor_lookup(principal_name)
62
+ on DisplayScheduleOfClasses do |page|
63
+ page.instructor_search_lookup
64
+ end
65
+ on PersonnelLookup do |page|
66
+ page.principal_name.set(principal_name)
67
+ page.search
68
+ @instructor_long_name = page.get_long_name(principal_name)
69
+ page.return_value(principal_name)
70
+ end
71
+ end
72
+
73
+ def check_results_for_subject_code_match(subject_code)
74
+ on DisplayScheduleOfClasses do |page|
75
+ page.get_results_course_list.each do |course_code|
76
+ raise "correct subject prefix not found for #{course_code}" unless course_code.match /^#{subject_code}/
77
+ end
78
+ end
79
+ end
80
+
81
+ def check_expected_results
82
+ on DisplayScheduleOfClasses do |page|
83
+ @exp_course_list.each do |course_code|
84
+ raise "correct course not found" unless page.target_course_row(course_code).exists?
85
+ end
86
+ end
87
+ end
88
+
89
+ def expand_course_details
90
+ on DisplayScheduleOfClasses do |page|
91
+ page.course_expand(@exp_course_list[0])
92
+ raise "error expanding course details for #{@exp_course_list[0]}" unless page.course_ao_information_table(@exp_course_list[0]).exists?
93
+ end
94
+ end
95
+
96
+ def expand_all_course_details
97
+ on DisplayScheduleOfClasses do |page|
98
+ list_of_courses = page.get_results_course_list()
99
+ page.get_results_course_list().each do |course|
100
+ page.course_expand(course)
101
+ if !page.course_ao_information_table(course).exists?
102
+ puts "error expanding course details for #{course}"
103
+ #need to re-login after stacktrace
104
+ log_in "admin", "admin"
105
+ go_to_display_schedule_of_classes
106
+ display
107
+ else
108
+ page.course_expand(course) #collapses
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+
115
+ def check_results_for_instructor
116
+ course_list = []
117
+ on DisplayScheduleOfClasses do |page|
118
+ course_list = page.get_results_course_list
119
+ course_list.each do |course_code|
120
+ page.course_expand(course_code)
121
+ raise "error expanding course details for #{course_code}" unless page.course_ao_information_table(course_code).exists?
122
+ instructor_list = page.get_instructor_list(course_code)
123
+ raise "data validation issues: instructor #{@instructor_long_name} not found for course: #{course_code}" unless instructor_list.include?(@instructor_long_name)
124
+ page.course_expand(course_code) #closes details
125
+ end
126
+ end
127
+ end
128
+
129
+ end
130
+
@@ -0,0 +1,49 @@
1
+ class BasePage < PageFactory
2
+
3
+ class << self
4
+
5
+ def wrapper_elements
6
+ crucial_element(:main_menu_el) { |b| b.link(title: "Main Menu") }
7
+ crucial_element(:logout_el) { |b| b.button(value: "Logout") }
8
+ crucial_element(:administration_el) { |b| b.link(title: "Administration") }
9
+
10
+ action(:home) { |b| b.link(text: "Home").click }
11
+ action(:main_menu) { |p| p.main_menu_el.click }
12
+ action(:provide_feedback) { |b| b.link(title: "Provide Feedback").click }
13
+ action(:administration) { |p| p.administration_el.click }
14
+ action(:action_list) { |b| b.link(title: "Action List").click }
15
+ action(:doc_search) { |b| b.link(title: "Document Search").click }
16
+
17
+ value(:build) { |b| b.div(id: "build").text }
18
+ value(:logged_in_user) { |b| b.div(id: "login-info").text[/(?<=:.).*$/] }
19
+
20
+ value(:copyright) { |b| b.div(id: "footer-copyright").text }
21
+ action(:acknowledgements) { |b| b.link(href: "acknowledgments.jsp").click }
22
+
23
+ element(:loading) { |b| b.image(alt: "Loading...") }
24
+ end
25
+
26
+ def frame_element
27
+ #crucial_element(:frm) { |b| b.frame(id: "iframeportlet") }
28
+ crucial_element(:frm) { |b| b } #with iframe removed
29
+ end
30
+
31
+ def green_search_buttons
32
+ action(:search) { |b| b.frm.button(text: "Search").click; b.loading.wait_while_present } # Persistent ID needed!
33
+ action(:clear_values) { |b| b.frm.button(text: "Clear Values").click; b.loading.wait_while_present } # Persistent ID needed!
34
+ action(:cancel) { |b| b.frm.button(text: "Cancel").click; b.loading.wait_while_present } # Persistent ID needed!
35
+ action(:close) { |b| b.frm.button(text: "Close").click; b.loading.wait_while_present } # Persistent ID needed!
36
+ end
37
+
38
+ def validation_elements
39
+ value(:error_header) { |b| b.frm.h3(id: "pageValidationHeader").text }
40
+ value(:info_header) { |b| b.frm.h3(id: "pageValidationHeader").text }
41
+ element(:error_list) { |b| b.frm.ul(id: "pageValidationList") }
42
+ element(:info_list) { |b| b.frm.ul(id: "pageValidationList") }
43
+ value(:first_error) { |b| b.error_list.link.text }
44
+ value(:first_msg) { |b| b.info_list.li.text }
45
+ end
46
+ end
47
+
48
+
49
+ end
@@ -0,0 +1,22 @@
1
+ class ActivePopulationLookup < PopulationsBase
2
+
3
+ expected_element :keyword
4
+
5
+ def frm
6
+ self.frame(class: "fancybox-iframe")
7
+ end
8
+
9
+ include PopulationsSearch
10
+
11
+ population_lookup_elements
12
+ green_search_buttons
13
+ element(:paginate_links_span) { |b| b.frm.div(class: "dataTables_paginate paging_full_numbers").span() }
14
+ element(:no_of_pages_info_div) { |b| b.frm.div(class: "dataTables_info") }
15
+ value(:no_of_entries) { |b| b.no_of_pages_info_div.text[/\d+(?=.ent)/] }
16
+
17
+
18
+ def change_results_page(page_number)
19
+ results_table.wait_until_present
20
+ paginate_links_span.link(text: "#{page_number}").click
21
+ end
22
+ end
@@ -0,0 +1,23 @@
1
+ class ActivityOfferingInquiry < BasePage
2
+
3
+ def frm
4
+ self.frame(class: "fancybox-iframe")
5
+ end
6
+
7
+ action(:close) { |b| b.frm.button(text: "Close").click; b.loading.wait_while_present }
8
+
9
+ value(:course_offering_code) { |b| b.frm.span(id: "u14").text } # Persistent ID needed!
10
+ value(:activity_code) { |b| b.frm.span(id: "u23").text } # Persistent ID needed!
11
+ value(:course_offering_title) { |b| b.frm.span(id: "u32").text } # Persistent ID needed!
12
+ value(:term) { |b| b.frm.span(id: "u41").text } # Persistent ID needed!
13
+ value(:type) { |b| b.frm.span(id: "u50").text } # Persistent ID needed!
14
+ value(:format_offering) { |b| b.frm.span(id: "u59").text } # Persistent ID needed!
15
+ value(:total_maximum_enrollment) { |b| b.frm.span(id: "u68").text } # Persistent ID needed!
16
+ value(:state) { |b| b.frm.span(id: "u77").text } # Persistent ID needed!
17
+ value(:requires_evaluation) { |b| b.frm.span(id: "u86").text } # Persistent ID needed!
18
+ value(:honors_offering) { |b| b.frm.span(id: "u95").text } # Persistent ID needed!
19
+ value(:activity_offering_url) { |b| b.frm.span(id: "u104").text } # Persistent ID needed!
20
+ value(:affiliated_personnel) { |b| b.frm.span(id: "u114").text } # Persistent ID needed!
21
+ value(:maximum_enrollment) { |b| b.frm.span(id: "u123").text } # Persistent ID needed!
22
+
23
+ end
@@ -0,0 +1,11 @@
1
+ class ActivityOfferingLookup < BasePage
2
+
3
+ expected_element :id
4
+
5
+ wrapper_elements
6
+ frame_element
7
+ green_search_buttons
8
+
9
+ element(:id) { |b| b.frm.text_field(name: "criteriaFields[id]") }
10
+
11
+ end
@@ -0,0 +1,93 @@
1
+ class ActivityOfferingMaintenance < ActivityOfferingMaintenanceBase
2
+
3
+ expected_element :activity_code
4
+
5
+ action(:submit) { |b| b.frm.button(text: "submit").click; b.loading.wait_while_present }
6
+
7
+ element(:activity_code) { |b| b.frm.text_field(name: "document.newMaintainableObject.dataObject.aoInfo.activityCode") }
8
+ element(:total_maximum_enrollment) { |b| b.frm.text_field(id: "maximumEnrollment_control") }
9
+
10
+ PERS_ACTION_COLUMN = 4
11
+
12
+ element(:add_person_id) { |b| b.personnel_table.rows[1].cells[ID_COLUMN].text_field() }
13
+
14
+ action(:lookup_person) { |b| b.personnel_table.rows[1].cells[ID_COLUMN].button().click; b.loading.wait_while_present }
15
+ element(:add_affiliation) { |b| b.personnel_table.rows[1].cells[AFFILIATION_COLUMN].select() }
16
+ element(:add_inst_effort) { |b| b.personnel_table.rows[1].cells[INST_EFFORT_COLUMN].text_field() }
17
+ action(:add_personnel) { |b| b.personnel_table.rows[1].cells[PERS_ACTION_COLUMN].button().click; b.loading.wait_while_present }
18
+
19
+ def get_inst_effort(id)
20
+ target_person_row(id).cells[INST_EFFORT_COLUMN].text_field.value
21
+ end
22
+
23
+ def update_affiliation(id, affiliation)
24
+ target_person_row(id).select affiliation
25
+ end
26
+
27
+ def update_inst_effort(id, effort)
28
+ target_person_row(id).text_field.set effort
29
+ end
30
+
31
+ def delete_id(id)
32
+ target_person_row(id).button.click
33
+ loading.wait_while_present
34
+ end
35
+
36
+
37
+ SEATS_ACTION_COLUMN = 5
38
+
39
+ #seat pool validation elements
40
+ element(:seatpool_error_list) { |b| b.seat_pools_div.ul(class: "uif-validationMessagesList") }
41
+ element(:seatpool_info_list) { |b| b.seat_pools_div.ul(class: "uif-validationMessagesList") }
42
+ value(:seatpool_first_msg) { |b| b.seatpool_info_list.li.text }
43
+
44
+ element(:add_pool_priority) { |b| b.seat_pools_table.rows[1].cells[PRIORITY_COLUMN].text_field() }
45
+ element(:add_pool_seats) { |b| b.seat_pools_table.rows[1].cells[SEATS_COLUMN].text_field() }
46
+ value(:add_pool_name) { |b| b.seat_pools_table.rows[1].cells[POP_NAME_COLUMN].text_field().text }
47
+
48
+ action(:lookup_population_name) { |b| b.seat_pools_table.button(title: "Search Field").click; b.loading.wait_while_present }
49
+
50
+ element(:add_pool_expiration_milestone) { |b| b.seat_pools_table.rows[1].cells[EXP_MILESTONE_COLUMN].select() }
51
+
52
+ action(:add_seat_pool) { |b| b.seat_pools_table.rows[1].cells[SEATS_ACTION_COLUMN].button().click; b.loading.wait_while_present }
53
+
54
+ def remove_seatpool(pop_name)
55
+ target_pool_row(pop_name).button(text: "remove").click
56
+ loading.wait_while_present
57
+ end
58
+
59
+ def update_priority(pop_name, priority)
60
+ target_pool_row(pop_name).text_field(name: /processingPriority/).set priority
61
+ end
62
+
63
+ def update_seats(pop_name, seats)
64
+ target_pool_row(pop_name).text_field(name: /seatLimit/).set seats
65
+ end
66
+
67
+ def update_expiration_milestone(pop_name, milestone)
68
+ target_pool_row(pop_name).cells[EXP_MILESTONE_COLUMN].select.select(milestone)
69
+ end
70
+
71
+ def get_priority(pop_name)
72
+ target_pool_row(pop_name).cells[PRIORITY_COLUMN].text_field.value #cell is hard-coded, getting this value was very problematic
73
+ end
74
+
75
+ def get_seats(pop_name)
76
+ target_pool_row(pop_name).cells[SEATS_COLUMN].text_field.value #cell is hard-coded, getting this value was very problematic
77
+ end
78
+
79
+ def get_expiration_milestone(pop_name)
80
+ target_pool_row(pop_name).cells[EXP_MILESTONE_COLUMN].select.selected_options[0].text #cell is hard-coded, getting this value was very problematic
81
+ end
82
+
83
+ element(:course_url) { |b| b.frm.text_field(name: "document.newMaintainableObject.dataObject.aoInfo.activityOfferingURL") }
84
+ element(:requires_evaluation) { |b| b.frm.checkbox(name: "document.newMaintainableObject.dataObject.aoInfo.isEvaluated") }
85
+ element(:honors_flag) { |b| b.frm.checkbox(name: "document.newMaintainableObject.dataObject.aoInfo.isHonorsOffering") }
86
+
87
+ #validation error dialog
88
+ element(:validation_error_dialog_div) { |b| b.frm.div(class: "fancybox-wrap fancybox-desktop fancybox-type-html fancybox-opened") }
89
+ value(:validation_error_dialog_text) { |b| b.validation_error_dialog_div.div(index: 2).text }
90
+ action(:close_validation_error_dialog) { |b| b.validation_error_dialog_div.div(title: "Close").click}
91
+ #validation error dialog
92
+
93
+ end