Fix undefined method error in sidekiq (#9807)

* Fix undefined method error in sidekiq

Body can be not nil but still be empty, which causes a
`NoMethodError: undefined method `[]' for nil:NilClass` further in the
code. This checks for an empty body to avoid the issue.

* Fix codeclimate issue
This commit is contained in:
Renato "Lond" Cerqueira 2019-01-14 17:28:41 +01:00 committed by Eugen Rochko
parent b4e6384aea
commit 5c5e14c816
3 changed files with 26 additions and 1 deletions

View File

@ -43,7 +43,7 @@ class FetchOEmbedService
res.code != 200 ? nil : res.body_with_limit res.code != 200 ? nil : res.body_with_limit
end end
validate(parse_for_format(body)) unless body.nil? validate(parse_for_format(body)) if body.present?
rescue Oj::ParseError, Ox::ParseError rescue Oj::ParseError, Ox::ParseError
nil nil
end end

View File

@ -0,0 +1,7 @@
<!DOCTYPE html>
<html>
<head>
<link href='https://host.test/empty_provider.json' rel='alternate' type='application/json+oembed'>
</head>
<body></body>
</html>

View File

@ -8,6 +8,7 @@ describe FetchOEmbedService, type: :service do
before do before do
stub_request(:get, "https://host.test/provider.json").to_return(status: 404) stub_request(:get, "https://host.test/provider.json").to_return(status: 404)
stub_request(:get, "https://host.test/provider.xml").to_return(status: 404) stub_request(:get, "https://host.test/provider.xml").to_return(status: 404)
stub_request(:get, "https://host.test/empty_provider.json").to_return(status: 200)
end end
describe 'discover_provider' do describe 'discover_provider' do
@ -93,6 +94,23 @@ describe FetchOEmbedService, type: :service do
expect(subject.call('https://host.test/oembed.html')).to be_nil expect(subject.call('https://host.test/oembed.html')).to be_nil
end end
end end
context 'Empty JSON provider is discoverable' do
before do
stub_request(:get, 'https://host.test/oembed.html').to_return(
status: 200,
headers: { 'Content-Type': 'text/html' },
body: request_fixture('oembed_json_empty.html')
)
end
it 'returns new OEmbed::Provider for JSON provider' do
subject.call('https://host.test/oembed.html')
expect(subject.endpoint_url).to eq 'https://host.test/empty_provider.json'
expect(subject.format).to eq :json
end
end
end end
context 'when status code is not 200' do context 'when status code is not 200' do