101 lines
2.7 KiB
Ruby
101 lines
2.7 KiB
Ruby
|
require 'spec_helper'
|
||
|
|
||
|
describe HTTP::Response do
|
||
|
it 'includes HTTP::Headers::Mixin' do
|
||
|
expect(described_class).to include HTTP::Headers::Mixin
|
||
|
end
|
||
|
|
||
|
describe 'to_a' do
|
||
|
let(:body) { 'Hello world' }
|
||
|
let(:content_type) { 'text/plain' }
|
||
|
subject { HTTP::Response.new(200, '1.1', {'Content-Type' => content_type}, body) }
|
||
|
|
||
|
it 'returns a Rack-like array' do
|
||
|
expect(subject.to_a).to eq([200, {'Content-Type' => content_type}, body])
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe 'mime_type' do
|
||
|
subject { HTTP::Response.new(200, '1.1', headers, '').mime_type }
|
||
|
|
||
|
context 'without Content-Type header' do
|
||
|
let(:headers) { {} }
|
||
|
it { should be_nil }
|
||
|
end
|
||
|
|
||
|
context 'with Content-Type: text/html' do
|
||
|
let(:headers) { {'Content-Type' => 'text/html'} }
|
||
|
it { should eq 'text/html' }
|
||
|
end
|
||
|
|
||
|
context 'with Content-Type: text/html; charset=utf-8' do
|
||
|
let(:headers) { {'Content-Type' => 'text/html; charset=utf-8'} }
|
||
|
it { should eq 'text/html' }
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe 'charset' do
|
||
|
subject { HTTP::Response.new(200, '1.1', headers, '').charset }
|
||
|
|
||
|
context 'without Content-Type header' do
|
||
|
let(:headers) { {} }
|
||
|
it { should be_nil }
|
||
|
end
|
||
|
|
||
|
context 'with Content-Type: text/html' do
|
||
|
let(:headers) { {'Content-Type' => 'text/html'} }
|
||
|
it { should be_nil }
|
||
|
end
|
||
|
|
||
|
context 'with Content-Type: text/html; charset=utf-8' do
|
||
|
let(:headers) { {'Content-Type' => 'text/html; charset=utf-8'} }
|
||
|
it { should eq 'utf-8' }
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe '#parse' do
|
||
|
let(:headers) { {'Content-Type' => content_type} }
|
||
|
let(:body) { '{"foo":"bar"}' }
|
||
|
let(:response) { HTTP::Response.new 200, '1.1', headers, body }
|
||
|
|
||
|
context 'with known content type' do
|
||
|
let(:content_type) { 'application/json' }
|
||
|
it 'returns parsed body' do
|
||
|
expect(response.parse).to eq 'foo' => 'bar'
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with unknown content type' do
|
||
|
let(:content_type) { 'application/deadbeef' }
|
||
|
it 'raises HTTP::Error' do
|
||
|
expect { response.parse }.to raise_error HTTP::Error
|
||
|
end
|
||
|
end
|
||
|
|
||
|
context 'with explicitly given mime type' do
|
||
|
let(:content_type) { 'application/deadbeef' }
|
||
|
it 'ignores mime_type of response' do
|
||
|
expect(response.parse 'application/json').to eq 'foo' => 'bar'
|
||
|
end
|
||
|
|
||
|
it 'supports MIME type aliases' do
|
||
|
expect(response.parse :json).to eq 'foo' => 'bar'
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
describe '#flush' do
|
||
|
let(:body) { double :to_s => '' }
|
||
|
let(:response) { HTTP::Response.new 200, '1.1', {}, body }
|
||
|
|
||
|
it 'returns response self-reference' do
|
||
|
expect(response.flush).to be response
|
||
|
end
|
||
|
|
||
|
it 'flushes body' do
|
||
|
expect(body).to receive :to_s
|
||
|
response.flush
|
||
|
end
|
||
|
end
|
||
|
end
|