-
Notifications
You must be signed in to change notification settings - Fork 479
/
regional_partner_test.rb
310 lines (240 loc) · 13.1 KB
/
regional_partner_test.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
require 'test_helper'
class RegionalPartnerTest < ActiveSupport::TestCase
freeze_time
include Pd::SharedWorkshopConstants
setup do
Pd::Workshop.any_instance.stubs(:process_location) # don't actually call Geocoder service
end
test "create regional partner with valid attributes creates regional partner" do
assert_creates RegionalPartner do
create :regional_partner,
urban: true,
attention: "code.org",
street: '1501 4th Ave',
apartment_or_suite: 'Suite 900',
city: 'Seattle',
state: 'WA',
zip_code: '98101',
phone_number: '555-111-2222',
is_active: true
end
end
test "create regional partner with invalid attributes does not create" do
regional_partner = RegionalPartner.new
assert_does_not_create RegionalPartner do
regional_partner.update(name: "", group: "fish", phone_number: 'fish', is_active: nil)
end
refute regional_partner.valid?
assert_includes regional_partner.errors.full_messages, "Name is too short (minimum is 1 character)"
assert_includes regional_partner.errors.full_messages, "Group is not a number"
assert_includes regional_partner.errors.full_messages, "Phone number is invalid"
assert_includes regional_partner.errors.full_messages, "Is active is required"
end
test "create regional partner with programs offered cleans empties" do
regional_partner = RegionalPartner.new
assert_creates RegionalPartner do
regional_partner.update(name: "valid regional partner", pl_programs_offered: ['', 'Fish'], is_active: true)
end
assert regional_partner.valid?
assert_includes regional_partner.pl_programs_offered, "Fish"
refute_includes regional_partner.pl_programs_offered, ""
end
test 'state must be in list' do
regional_partner = build :regional_partner, state: 'invalid'
refute regional_partner.valid?
assert_equal ['State is not included in the list'], regional_partner.errors.full_messages
end
test 'zip code must be a valid format' do
regional_partner = build :regional_partner, zip_code: 'invalid'
refute regional_partner.valid?
assert_equal ['Zip code is invalid'], regional_partner.errors.full_messages
end
test 'Fails lookup with nil zip' do
assert_equal RegionalPartner.find_by_zip(nil), [nil, nil]
end
test 'assign program manager to regional partner assigns program manager' do
regional_partner = create :regional_partner
program_manager = create :teacher
assert_creates RegionalPartnerProgramManager do
regional_partner.program_manager = program_manager.id
end
assert regional_partner.program_managers.exists?(program_manager.id)
end
test 'assign existing program manager does not create duplicate regional partner program managers' do
regional_partner = create :regional_partner
program_manager = create(:regional_partner_program_manager, regional_partner: regional_partner).program_manager
assert_does_not_create RegionalPartnerProgramManager do
regional_partner.program_manager = program_manager.id
end
end
test 'find_by_region finds matching regional_partner' do
regional_partner_wa = create :regional_partner, name: "partner_WA"
regional_partner_wa.mappings.find_or_create_by!(state: "WA")
regional_partner_wa_98104 = create :regional_partner, name: "partner_WA_98104"
regional_partner_wa_98104.mappings.find_or_create_by!(zip_code: "98104")
regional_partner_wa_98105 = create :regional_partner, name: "partner_WA_98105"
regional_partner_wa_98105.mappings.find_or_create_by!(zip_code: "98105")
regional_partner_ny = create :regional_partner, name: "partner_NY"
regional_partner_ny.mappings.find_or_create_by!(state: "NY")
regional_partner_ma_02138 = create :regional_partner, name: "partner_MA_02138"
regional_partner_ma_02138.mappings.find_or_create_by!(state: "MA")
regional_partner_ma_02138.mappings.find_or_create_by!(zip_code: "02138")
regional_partner_ca_94305 = create :regional_partner, name: "partner_CA_94305"
regional_partner_ca_94305.mappings.find_or_create_by!(state: "CA")
regional_partner_ca_94305.mappings.find_or_create_by!(zip_code: "94305")
regional_partner_70808 = create :regional_partner, name: "partner_70808"
regional_partner_70808.mappings.find_or_create_by!(zip_code: "70808")
create :regional_partner, name: "partner_nomappings"
# TEST find_by_region with different combinations of zip code and state
# state=nil/zip=nil [return nil (no match)]
assert_nil RegionalPartner.find_by_region(nil, nil)
# state=NY [search by state only where there is only one match]
assert_equal regional_partner_ny, RegionalPartner.find_by_region(nil, "NY")
# zip=70808 [search by zip only where there is only one match]
assert_equal regional_partner_70808, RegionalPartner.find_by_region("70808", nil)
# state=MA/zip=02138 [search by state & zip where both match with one partner]
assert_equal regional_partner_ma_02138, RegionalPartner.find_by_region("02138", "MA")
# state=LA [state only, no match]
assert_nil RegionalPartner.find_by_region(nil, "LA")
# zip=90210 [zip only, no match]
assert_nil RegionalPartner.find_by_region("90210", nil)
# state=CA/zip=90210 [state matches one partner, zip code does not match]
assert_equal regional_partner_ca_94305, RegionalPartner.find_by_region("94305", "CA")
# state=LA/zip=70808 [zip code matches one partner, state does not match]
assert_equal regional_partner_70808, RegionalPartner.find_by_region("70808", "LA")
# state=WA/zip=98104 [state matches many, zip matches one]
assert_equal regional_partner_wa_98104, RegionalPartner.find_by_region("98104", "WA")
# state=WA [state matches partner that covers whole state, not specific zips in state]
assert_equal regional_partner_wa, RegionalPartner.find_by_region(nil, "WA")
end
test 'pd_workshops association as workshop_organizer' do
regional_partner = create :regional_partner
partner_organizer = create :workshop_organizer
create :regional_partner_program_manager, regional_partner: regional_partner, program_manager: partner_organizer
partner_workshops = create_list :workshop, 2, organizer: partner_organizer
# non-partner workshops
non_partner_organizer = create :workshop_organizer
create_list :workshop, 2, organizer: non_partner_organizer
assert_equal partner_workshops, regional_partner.pd_workshops_organized
end
test 'pd_workshops association' do
regional_partner = create :regional_partner
partner_organizer = create :program_manager, regional_partner: regional_partner
partner_workshops = create_list :workshop, 2, organizer: partner_organizer
# non-partner workshops
non_partner_organizer = create :program_manager
create_list :workshop, 2, organizer: non_partner_organizer
assert_equal partner_workshops, regional_partner.pd_workshops_organized
end
test 'future_pd_workshops_organized as workshop_organizer' do
regional_partner = create :regional_partner
partner_organizer = create :workshop_organizer
create :regional_partner_program_manager, regional_partner: regional_partner, program_manager: partner_organizer
future_partner_workshops = [
create(:workshop, organizer: partner_organizer, sessions_from: Time.zone.today),
create(:workshop, organizer: partner_organizer, sessions_from: Time.zone.tomorrow)
]
# excluded (past or ended) partner workshops
create :workshop, organizer: partner_organizer, sessions_from: Time.zone.yesterday
create :workshop, :ended, organizer: partner_organizer, sessions_from: Time.zone.today
assert_equal future_partner_workshops, regional_partner.future_pd_workshops_organized
end
test 'future_pd_workshops_organized' do
regional_partner = create :regional_partner
partner_organizer = create :program_manager, regional_partner: regional_partner
create :regional_partner_program_manager, regional_partner: regional_partner, program_manager: partner_organizer
future_partner_workshops = [
create(:workshop, organizer: partner_organizer, sessions_from: Time.zone.today),
create(:workshop, organizer: partner_organizer, sessions_from: Time.zone.tomorrow)
]
# excluded (past or ended) partner workshops
create :workshop, organizer: partner_organizer, sessions_from: Time.zone.yesterday
create :workshop, :ended, organizer: partner_organizer, sessions_from: Time.zone.today
assert_equal future_partner_workshops, regional_partner.future_pd_workshops_organized
end
test 'contact_email_with_backup falls back to first pm' do
# contact_email
regional_partner = create :regional_partner, contact_email: 'contact_email@partner.net'
assert_equal 'contact_email@partner.net', regional_partner.contact_email_with_backup
# no contact_email, use first PM
regional_partner.update!(contact_email: nil, program_managers: [create(:teacher, email: 'first_pm@partner.net')])
assert_equal 'first_pm@partner.net', regional_partner.contact_email_with_backup
# nothing :(
regional_partner.update!(program_managers: [])
assert_nil regional_partner.contact_email_with_backup
end
test 'are_apps_closed returns false if RP app closed date is not specified' do
Timecop.freeze do
regional_partner = create :regional_partner
regional_partner.update!(apps_close_date_teacher: nil)
refute regional_partner.are_apps_closed
end
end
test 'are_apps_closed returns false if RP app closed date is after current date' do
Timecop.freeze do
regional_partner = create :regional_partner
regional_partner.update!(apps_close_date_teacher: (Time.zone.today + 1.day).strftime("%Y-%m-%d"))
refute regional_partner.are_apps_closed
end
end
test 'are_apps_closed returns false if RP app closed date is on current date' do
Timecop.freeze do
regional_partner = create :regional_partner
regional_partner.update!(apps_close_date_teacher: (Time.zone.today).strftime("%Y-%m-%d"))
refute regional_partner.are_apps_closed
end
end
test 'are_apps_closed returns true if RP app closed date is before current date' do
Timecop.freeze do
regional_partner = create :regional_partner
regional_partner.update!(apps_close_date_teacher: (Time.zone.today - 1.day).strftime("%Y-%m-%d"))
assert regional_partner.are_apps_closed
end
end
test 'principal_approval must be valid' do
regional_partner = build :regional_partner, applications_principal_approval: 'Invalid principal_approval'
refute regional_partner.valid?
assert_equal ["Applications principal approval is not included in the list"], regional_partner.errors.full_messages
end
test 'regional_partner_summer_workshop_open' do
regional_partner = nil
Timecop.freeze Time.zone.local(2018, 9, 27, 21, 25) do
regional_partner = create :regional_partner_with_summer_workshops, :with_apps_priority_deadline_date
assert_equal "Contact Name", regional_partner.contact_name
assert_equal "contact@code.org", regional_partner.contact_email
summer_workshops = regional_partner.upcoming_summer_workshops
assert_equal 1, summer_workshops.length
assert_equal "Training building", summer_workshops[0][:location_name]
assert_equal "CS Principles", summer_workshops[0][:course]
assert_equal "December 27, 2018 - December 31, 2018", summer_workshops[0][:workshop_date_range_string]
assert_equal WORKSHOP_APPLICATION_STATES[:currently_open], regional_partner.summer_workshops_application_state
assert_equal "September 25, 2018", regional_partner.summer_workshops_earliest_apps_open_date
assert_nil regional_partner.link_to_partner_application
assert_equal "October 2, 2018", regional_partner.upcoming_priority_deadline_date
end
end
test 'regional_partner_summer_workshop_open_custom_link' do
regional_partner = build :regional_partner_illinois
assert_equal WORKSHOP_APPLICATION_STATES[:currently_open], regional_partner.summer_workshops_application_state
assert_equal "https://code.org/specific-link", regional_partner.link_to_partner_application
end
test 'regional_partner_summer_workshop_closed' do
regional_partner = build :regional_partner_kentucky
assert_equal WORKSHOP_APPLICATION_STATES[:now_closed], regional_partner.summer_workshops_application_state
assert_nil regional_partner.upcoming_priority_deadline_date
end
test 'regional_partner_summer_workshop_missing_information' do
regional_partner = build :regional_partner_newjersey
assert_nil regional_partner.contact_name
assert_nil regional_partner.contact_email
assert_equal WORKSHOP_APPLICATION_STATES[:opening_sometime], regional_partner.summer_workshops_application_state
end
test 'regional_partner_summer_workshop_opening_on_date' do
regional_partner = build :regional_partner_oregon
assert_equal WORKSHOP_APPLICATION_STATES[:opening_at], regional_partner.summer_workshops_application_state
end
test 'regional_partner_summer_workshop_opening_on_date_for_csd_only' do
regional_partner = build :regional_partner_wyoming
assert_equal WORKSHOP_APPLICATION_STATES[:opening_at], regional_partner.summer_workshops_application_state
end
end