Skip to content

Commit 1f2be1d

Browse files
davezuckermanDavid Zuckerman
andauthored
fixed merge conflict (#27)
Co-authored-by: David Zuckerman <dzuckerm@library.berkeley.edu>
1 parent c7f7bc4 commit 1f2be1d

5 files changed

Lines changed: 306 additions & 39 deletions

spec/jobs/bibliographic_job_spec.rb

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,56 @@
3535

3636
end
3737

38+
describe 'email notifications' do
39+
let(:mailer_double) { instance_double(ActionMailer::MessageDelivery, deliver_now: true) }
40+
41+
context 'when job succeeds' do
42+
it 'sends completion email with attachments' do
43+
fake_attachments = {
44+
'fake_completed.csv' => { mime_type: 'text/csv', content: 'csvdata' }
45+
}
46+
47+
allow_any_instance_of(BibliographicJob)
48+
.to receive(:generate_attatchments)
49+
.and_return(fake_attachments)
50+
51+
expect(RequestMailer)
52+
.to receive(:bibliographic_email)
53+
.with(
54+
email,
55+
fake_attachments,
56+
'Host Bibliographic Upload - Completed',
57+
'When there is an attached log file, please review unusual MMS ID information.'
58+
).and_return(mailer_double)
59+
60+
BibliographicJob.perform_now(host_bib_task)
61+
62+
expect(host_bib_task.reload.status).to eq('succeeded')
63+
end
64+
end
65+
66+
context 'when job fails' do
67+
it 'sends failure email' do
68+
host_bib = host_bib_task.host_bibs.create(mms_id: mms_id1, marc_status: 'pending')
69+
70+
allow(Bibliographic::HostBib)
71+
.to receive(:create_linked_bibs)
72+
.with(host_bib)
73+
.and_raise(StandardError.new('Error'))
74+
75+
expect(RequestMailer)
76+
.to receive(:bibliographic_email)
77+
.with(
78+
email,
79+
[],
80+
'Host Bibliographic Upload - Failed',
81+
'Host Bibliographic upload failed, please reach out to our support team.'
82+
).and_return(mailer_double)
83+
84+
expect { BibliographicJob.perform_now(host_bib_task) }.to raise_error(StandardError)
85+
86+
expect(host_bib_task.reload.status).to eq('failed')
87+
end
88+
end
89+
end
3890
end
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
require 'rails_helper'
2+
3+
describe PatronNoteJobBase, type: :job do
4+
let(:patron_id) { '12345' }
5+
let(:mailer_prefix) { 'test_prefix' }
6+
let(:note_txt) { 'Test note text' }
7+
8+
let(:job) do
9+
described_class.new(mailer_prefix:, note_txt:)
10+
end
11+
12+
let(:patron) do
13+
instance_double(
14+
Alma::User,
15+
email: 'mrperson@test.com',
16+
id: patron_id,
17+
name: 'Bud Powell'
18+
)
19+
end
20+
21+
let(:mail_double) do
22+
instance_double(ActionMailer::MessageDelivery, deliver_now: true)
23+
end
24+
25+
before do
26+
allow(Alma::User).to receive(:find_if_active).with(patron_id).and_return(patron)
27+
28+
allow(patron).to receive(:delete_note)
29+
allow(patron).to receive(:add_note)
30+
allow(patron).to receive(:save)
31+
end
32+
33+
describe '#perform' do
34+
it 'finds patron and adds note' do
35+
expect(patron).to receive(:delete_note).with(note_txt)
36+
expect(patron).to receive(:add_note).with(job.note)
37+
expect(patron).to receive(:save)
38+
39+
allow(RequestMailer)
40+
.to receive(:send)
41+
.and_return(mail_double)
42+
43+
job.perform(patron_id)
44+
end
45+
46+
it 'sends confirmation email' do
47+
expect(RequestMailer)
48+
.to receive(:send)
49+
.with("#{mailer_prefix}_confirmation_email", patron.email)
50+
.and_return(mail_double)
51+
52+
job.perform(patron_id)
53+
end
54+
55+
it 'formats note with date and tag' do
56+
allow(RequestMailer).to receive(:send).and_return(mail_double)
57+
58+
travel_to Date.new(2025, 1, 1) do
59+
job.perform(patron_id)
60+
expect(job.note).to eq("20250101 #{note_txt} [litscript]")
61+
end
62+
end
63+
end
64+
65+
describe 'when patron lookup fails' do
66+
it 'logs and raises error' do
67+
allow(Alma::User).to receive(:find_if_active).and_raise(StandardError.new('fail'))
68+
69+
expect(job).to receive(:log_error).at_least(:once)
70+
71+
expect { job.perform(patron_id) }.to raise_error(StandardError)
72+
end
73+
end
74+
75+
describe 'when add_note fails' do
76+
before do
77+
allow(RequestMailer).to receive(:send).and_return(mail_double)
78+
allow(patron).to receive(:add_note).and_raise(StandardError.new('boom'))
79+
end
80+
81+
it 'sends failure email' do
82+
expect(RequestMailer)
83+
.to receive(:send)
84+
.with(
85+
"#{mailer_prefix}_failure_email",
86+
patron.id,
87+
patron.name,
88+
job.note
89+
)
90+
.and_return(mail_double)
91+
92+
expect { job.perform(patron_id) }.to raise_error(StandardError)
93+
end
94+
95+
it 'logs error' do
96+
expect(job).to receive(:log_error).at_least(:once)
97+
98+
expect { job.perform(patron_id) }.to raise_error(StandardError)
99+
end
100+
end
101+
102+
describe 'when confirmation email fails' do
103+
it 'logs and raises error' do
104+
allow(RequestMailer)
105+
.to receive(:send)
106+
.and_raise(StandardError.new('mail fail'))
107+
108+
expect(job).to receive(:log_error).at_least(:once)
109+
110+
expect { job.perform(patron_id) }.to raise_error(StandardError)
111+
end
112+
end
113+
114+
describe 'when failure email itself fails' do
115+
before do
116+
allow(patron).to receive(:add_note).and_raise(StandardError.new('note fail'))
117+
allow(RequestMailer).to receive(:send).and_raise(StandardError.new('mail fail'))
118+
end
119+
120+
it 'logs and raises error' do
121+
expect(job).to receive(:log_error).at_least(:once)
122+
123+
expect { job.perform(patron_id) }.to raise_error(StandardError)
124+
end
125+
end
126+
end

spec/request/proxy_borrower_forms_request_spec.rb

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
require 'forms_helper'
22

33
describe 'Proxy Borrower Forms', type: :request do
4+
include ActiveJob::TestHelper
5+
after { clear_enqueued_jobs }
6+
47
attr_reader :patron_id
58
attr_reader :patron
69
attr_reader :user
@@ -189,5 +192,42 @@
189192
expect(response).to have_http_status :unprocessable_entity
190193
expect(response.body).to match(/Please correct these and resubmit the form/)
191194
end
195+
196+
it 'submission enqueues confirmation + alert emails' do
197+
expect do
198+
post(forms_proxy_borrower_request_dsp_path, params: {
199+
proxy_borrower_requests: {
200+
student_name: 'Veronica Names',
201+
dsp_rep: 'DSP Rep',
202+
research_last: 'last',
203+
research_first: 'first',
204+
date_term: Date.tomorrow,
205+
renewal: 0
206+
}
207+
})
208+
end.to have_enqueued_job(ActionMailer::MailDeliveryJob).exactly(2).times
209+
210+
expect(response).to have_http_status(:created)
211+
end
212+
213+
it 'Faculty submission enqueues confirmation + alert emails' do
214+
allow_any_instance_of(User).to receive(:ucb_faculty?).and_return(true)
215+
216+
expect do
217+
post(forms_proxy_borrower_request_faculty_path, params: {
218+
proxy_borrower_requests: {
219+
faculty_name: 'Thelonius Monk',
220+
department: 'History',
221+
research_last: 'Last',
222+
research_first: 'First',
223+
date_term: Date.tomorrow,
224+
renewal: 0
225+
}
226+
})
227+
end.to have_enqueued_job(ActionMailer::MailDeliveryJob).exactly(2).times
228+
229+
expect(response).to have_http_status(:created)
230+
end
231+
192232
end
193233
end

spec/request/reference_card_forms_request_spec.rb

Lines changed: 47 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
require 'forms_helper'
22

33
describe 'Reference Card Form', type: :request do
4+
include ActiveJob::TestHelper
5+
after { clear_enqueued_jobs }
6+
47
attr_reader :patron_id
58
attr_reader :patron
69
attr_reader :user
@@ -26,6 +29,7 @@
2629

2730
it 'rejects a submission with a captcha verification error' do
2831
expect_any_instance_of(Recaptcha::Verify).to receive(:verify_recaptcha).and_raise(Recaptcha::RecaptchaError)
32+
2933
params = {
3034
reference_card_form: {
3135
email: 'jrdoe@affiliate.test',
@@ -37,13 +41,15 @@
3741
local_id: '123456789'
3842
}
3943
}
44+
4045
post('/forms/reference-card', params:)
4146
expect(response).to redirect_to(action: :new, params:)
47+
4248
get response.header['Location']
4349
expect(response.body).to match('RECaptcha Error')
4450
end
4551

46-
it 'accepts a submission with a valid date' do
52+
it 'accepts a submission with a valid date and enqueues email' do
4753
params = {
4854
reference_card_form: {
4955
email: 'jrdoe@affiliate.test',
@@ -55,24 +61,28 @@
5561
local_id: '123456789'
5662
}
5763
}
58-
post('/forms/reference-card', params:)
64+
65+
expect { post('/forms/reference-card', params:) }.to have_enqueued_job(ActionMailer::MailDeliveryJob)
66+
5967
expect(response).to have_http_status :created
6068
end
6169

6270
it 'rejects a submission with a requested end date before the start date' do
6371
params = {
6472
reference_card_form: {
65-
email: 'jrdoe@affiliate.test',
66-
name: 'Jane R. Doe',
73+
email: 'jrdupree@affiliate.test',
74+
name: 'Jane R. Duprie',
6775
affiliation: 'nowhere',
6876
research_desc: 'research goes here....',
6977
pass_date: Date.current,
7078
pass_date_end: Date.current - 5.days,
7179
local_id: '123456789'
7280
}
7381
}
82+
7483
post('/forms/reference-card', params:)
7584
expect(response).to have_http_status :found
85+
7686
follow_redirect!
7787
expect(response.body).to include('Requested access end date must not precede access start date')
7888
end
@@ -86,22 +96,24 @@
8696
end
8797

8898
it 'renders process form for unprocessed request' do
89-
form = ReferenceCardForm.create(id: 1, email: 'openreq@test.com', name: 'John Doe',
99+
form = ReferenceCardForm.create(id: 1, email: 'openreq@test.com', name: 'John Testy',
90100
pass_date: Date.current, pass_date_end: Date.current + 1,
91101
research_desc: 'This is research', affiliation: 'Affiliation 1',
92102
local_id: '8675309')
103+
93104
get "/forms/reference-card/#{form.id}"
94105
expect(response.body).to include('<h3>This Reference Card request needs to be processed.</h3>')
95106
end
96107

97108
it 'renders processed page for processed request' do
98109
form = ReferenceCardForm.create(
99-
email: 'closedreq@test.com', name: 'Jane Doe',
110+
email: 'closedreq@test.com', name: 'Jane Testy',
100111
pass_date: Date.current, pass_date_end: Date.current + 1,
101112
research_desc: 'This is research', affiliation: 'Affiliation 1',
102113
local_id: '8675309',
103114
approvedeny: true, processed_by: 'Test Admin'
104115
)
116+
105117
get "/forms/reference-card/#{form.id}"
106118
expect(response.body).to include('<h2>This request has been processed</h2>')
107119
end
@@ -112,23 +124,41 @@
112124
expect(response.body).to include(path)
113125
end
114126

115-
it 'allows an admin to deny a request' do
127+
it 'allows an admin to deny a request and enqueues denial email' do
116128
form = ReferenceCardForm.create(email: 'openreq@test.com', name: 'John Doe',
117-
affiliation: 'Red Bull', pass_date: Date.current, pass_date_end: Date.current + 1, local_id: '8675309')
129+
affiliation: 'Red Bull',
130+
pass_date: Date.current,
131+
pass_date_end: Date.current + 1,
132+
local_id: '8675309')
118133

119-
params = {
120-
'stack_pass_[approve_deny]' => false,
121-
'processed_by' => 'ADMIN USER',
122-
'denial_reason' => 'Item listed at another library'
123-
}
124-
patch("/forms/reference-card/#{form.id}", params:)
125-
expect(response).to redirect_to(action: :show, id: 1)
134+
expect do
135+
patch("/forms/reference-card/#{form.id}", params: {
136+
'stack_pass_[approve_deny]' => false,
137+
'processed_by' => 'ADMIN USER',
138+
'denial_reason' => 'Item listed at another library'
139+
})
140+
end.to have_enqueued_job(ActionMailer::MailDeliveryJob)
141+
142+
expect(response).to redirect_to(action: :show, id: form.id)
126143

127144
get(response.headers['Location'])
128-
expect(response.body).to include(params['denial_reason'])
145+
expect(response.body).to include('Item listed at another library')
129146
expect(response.body).to include('This request has been processed')
130147
end
131148

132-
end
149+
it 'enqueues approval email when admin approves request' do
150+
form = ReferenceCardForm.create(email: 'openreq@test.com', name: 'John Doe',
151+
affiliation: 'Test',
152+
pass_date: Date.current,
153+
pass_date_end: Date.current + 1,
154+
local_id: '8675309')
133155

156+
expect do
157+
patch("/forms/reference-card/#{form.id}", params: {
158+
'stack_pass_[approve_deny]' => true,
159+
'processed_by' => 'ADMIN USER'
160+
})
161+
end.to have_enqueued_job(ActionMailer::MailDeliveryJob)
162+
end
163+
end
134164
end

0 commit comments

Comments
 (0)