Skip to content

Commit d411b62

Browse files
committed
test: update the tests
1 parent cae0dad commit d411b62

2 files changed

Lines changed: 97 additions & 33 deletions

File tree

spec/requests/api/subscriptions_spec.rb

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,14 @@
2626
message: 'Subscription provider is currently unavailable.'
2727
)
2828
end
29+
let(:submitter_result_rejected) do
30+
Subscriptions::PardotFormHandlerSubmitter::Result.new(
31+
success?: false,
32+
status: :bad_gateway,
33+
error_code: 'subscription_provider_rejected',
34+
message: 'Subscription provider rejected the request.'
35+
)
36+
end
2937
let(:submitter) { instance_double(Subscriptions::PardotFormHandlerSubmitter) }
3038

3139
before do
@@ -89,5 +97,18 @@
8997
'message' => 'Subscription provider is currently unavailable.'
9098
)
9199
end
100+
101+
it 'returns provider rejection shape when provider rejects request' do
102+
allow(submitter).to receive(:call).and_return(submitter_result_rejected)
103+
104+
post(path, params: payload, as: :json)
105+
106+
expect(response).to have_http_status(:bad_gateway)
107+
expect(response.parsed_body).to include(
108+
'ok' => false,
109+
'error_code' => 'subscription_provider_rejected',
110+
'message' => 'Subscription provider rejected the request.'
111+
)
112+
end
92113
end
93114
end

spec/services/subscriptions/pardot_form_handler_submitter_spec.rb

Lines changed: 76 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,56 +3,99 @@
33
require 'rails_helper'
44

55
RSpec.describe Subscriptions::PardotFormHandlerSubmitter do
6-
let(:endpoint_url) { 'https://example.com/form-handler' }
7-
let(:service) { described_class.new(endpoint_url: endpoint_url) }
8-
let(:payload) { { 'email' => 'teacher@example.com', 'privacy_policy' => true } }
6+
let(:endpoint_url) { 'https://example.test/form-handler' }
7+
let(:submitter) { described_class.new(endpoint_url:) }
8+
let(:connection) { instance_double(Faraday::Connection) }
9+
10+
let(:payload) do
11+
{
12+
'email' => 'teacher@example.com',
13+
'test_opt_in' => true,
14+
'privacy_policy' => true
15+
}
16+
end
17+
18+
let(:headers) { {} }
19+
let(:response_body) { '' }
20+
let(:response_status) { 200 }
21+
let(:response) { instance_double(Faraday::Response, status: response_status, body: response_body, headers:) }
22+
23+
before do
24+
allow(submitter).to receive(:faraday).and_return(connection)
25+
allow(connection).to receive(:post).and_return(response)
26+
allow(Sentry).to receive(:capture_exception)
27+
end
928

1029
describe '#call' do
11-
let(:connection) { instance_double(Faraday::Connection) }
12-
let(:response) { instance_double(Faraday::Response, status: status, headers: headers, success?: success) }
13-
let(:headers) { {} }
14-
let(:status) { 200 }
15-
let(:success) { true }
16-
17-
before do
18-
allow(Faraday).to receive(:new).and_return(connection)
19-
allow(connection).to receive(:post).and_return(response)
20-
end
30+
it 'returns success when status 200 and body contains success marker' do
31+
allow(response).to receive(:body).and_return('Cannot find success page to redirect to.')
2132

22-
it 'returns success for a 200 response' do
23-
result = service.call(form_payload: payload)
33+
result = submitter.call(form_payload: payload)
2434

2535
expect(result.success?).to be(true)
2636
end
2737

28-
it 'returns success for a 302 success redirect location' do
29-
allow(response).to receive_messages(status: 302, success?: false, headers: { 'location' => '/subscriptions/success' })
38+
it 'returns rejected when body contains error marker even with status 200' do
39+
allow(response).to receive(:body).and_return('Cannot find error page to redirect to.')
3040

31-
result = service.call(form_payload: payload)
41+
result = submitter.call(form_payload: payload)
3242

33-
expect(result.success?).to be(true)
43+
expect(result.success?).to be(false)
44+
expect(result.status).to eq(:bad_gateway)
45+
expect(result.error_code).to eq('subscription_provider_rejected')
46+
end
47+
48+
it 'returns rejected when status is not 200' do
49+
allow(response).to receive(:status).and_return(302)
50+
51+
result = submitter.call(form_payload: payload)
52+
53+
expect(result.success?).to be(false)
54+
expect(result.status).to eq(:bad_gateway)
55+
expect(result.error_code).to eq('subscription_provider_rejected')
3456
end
3557

36-
it 'returns rejected for a 302 error redirect location' do
37-
allow(response).to receive_messages(status: 302, success?: false, headers: { 'location' => '/subscriptions/error' })
58+
it 'returns ambiguous when status is 200 and body has no markers' do
59+
allow(response).to receive(:body).and_return('ok')
3860

39-
result = service.call(form_payload: payload)
61+
result = submitter.call(form_payload: payload)
4062

41-
aggregate_failures do
42-
expect(result.success?).to be(false)
43-
expect(result.error_code).to eq('subscription_provider_rejected')
44-
end
63+
expect(result.success?).to be(false)
64+
expect(result.status).to eq(:bad_gateway)
65+
expect(result.error_code).to eq('subscription_provider_ambiguous')
4566
end
4667

47-
it 'returns ambiguous for an unknown 302 redirect location' do
48-
allow(response).to receive_messages(status: 302, success?: false, headers: { 'location' => '/subscriptions/unknown' })
68+
it 'returns unavailable on Faraday::Error' do
69+
allow(connection).to receive(:post).and_raise(Faraday::Error, 'connection failed')
70+
71+
result = submitter.call(form_payload: payload)
72+
73+
expect(result.success?).to be(false)
74+
expect(result.status).to eq(:service_unavailable)
75+
expect(result.error_code).to eq('subscription_provider_unavailable')
76+
expect(Sentry).to have_received(:capture_exception)
77+
end
78+
79+
it 'returns not configured when endpoint_url is blank' do
80+
blank_submitter = described_class.new(endpoint_url: '')
81+
82+
result = blank_submitter.call(form_payload: payload)
83+
84+
expect(result.success?).to be(false)
85+
expect(result.status).to eq(:service_unavailable)
86+
expect(result.error_code).to eq('subscription_provider_not_configured')
87+
end
4988

50-
result = service.call(form_payload: payload)
89+
it 'posts payload mapped to email and Tester only' do
90+
submitter.call(form_payload: payload)
5191

52-
aggregate_failures do
53-
expect(result.success?).to be(false)
54-
expect(result.error_code).to eq('subscription_provider_ambiguous')
55-
end
92+
expect(connection).to have_received(:post).with(
93+
endpoint_url,
94+
{
95+
'email' => 'teacher@example.com',
96+
'Tester' => true
97+
}
98+
)
5699
end
57100
end
58101
end

0 commit comments

Comments
 (0)