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
|
# frozen_string_literal: true
RSpec.describe FaradayMiddleware::ParseXml, type: :response do
let(:xml) { '<user><name>Erik Michaels-Ober</name><screen_name>sferik</screen_name></user>' }
let(:user) { { 'user' => { 'name' => 'Erik Michaels-Ober', 'screen_name' => 'sferik' } } }
context 'no type matching' do
it "doesn't change nil body" do
expect(process(nil).body).to be_nil
end
it 'turns empty body into empty hash' do
expect(process('').body).to be_eql({})
end
it 'parses xml body' do
response = process(xml)
expect(response.body).to eq(user)
expect(response.env[:raw_body]).to be_nil
end
end
context 'with preserving raw' do
let(:options) { { preserve_raw: true } }
it 'parses xml body' do
response = process(xml)
expect(response.body).to eq(user)
expect(response.env[:raw_body]).to eq(xml)
end
it 'can opt out of preserving raw' do
response = process(xml, nil, preserve_raw: false)
expect(response.env[:raw_body]).to be_nil
end
end
context 'with regexp type matching' do
let(:options) { { content_type: /\bxml$/ } }
it 'parses xml body of correct type' do
response = process(xml, 'application/xml')
expect(response.body).to eq(user)
end
it 'ignores xml body of incorrect type' do
response = process(xml, 'text/html')
expect(response.body).to eq(xml)
end
end
context 'with array type matching' do
let(:options) { { content_type: %w[a/b c/d] } }
it 'parses xml body of correct type' do
expect(process(xml, 'a/b').body).to be_a(Hash)
expect(process(xml, 'c/d').body).to be_a(Hash)
end
it 'ignores xml body of incorrect type' do
expect(process(xml, 'a/d').body).not_to be_a(Hash)
end
end
it 'chokes on invalid xml' do
['{!', '"a"', 'true', 'null', '1'].each do |data|
expect { process(data) }.to raise_error(Faraday::ParsingError)
end
end
context 'MultiXml options' do
let(:options) do
{
parser_options: {
symbolize_names: true
}
}
end
it 'passes relevant options to MultiXml parse' do
expect(::MultiXml).to receive(:parse)
.with(xml, options[:parser_options])
.and_return(user)
response = process(xml)
expect(response.body).to be(user)
end
end
end
|