Skip to content
Fetching contributors…
Cannot retrieve contributors at this time
213 lines (193 sloc) 6.45 KB
require 'rest-core/test'
describe RC::Cache do
after do
WebMock.reset!
RR.verify
end
should 'basic 0' do
c = RC::Builder.client do
use RC::Cache, {}, 3600
run Class.new{
attr_accessor :tick
def initialize
self.tick = 0
end
def call env
self.tick +=1
yield(env.merge(RC::RESPONSE_BODY => 'response',
RC::RESPONSE_HEADERS => {'A' => 'B'},
RC::RESPONSE_STATUS => 200))
end
}
end.new
c.get('/')
key = Digest::MD5.hexdigest('get:/:')
c.cache.should.eq("rest-core:cache:#{key}" => "200\nA: B\n\nresponse")
c.app.app.tick.should.eq 1
c.get('/')
c.app.app.tick.should.eq 1
c.cache.clear
c.get('/')
c.app.app.tick.should.eq 2
c.head('/').should.eq('A' => 'B')
c.get('/').should.eq 'response'
c.request({RC::REQUEST_PATH => '/'}, RC::RESPONSE_STATUS).should.eq 200
end
should 'basic 1' do
path = 'http://a'
stub_request(:get , path).to_return(:body => 'OK')
stub_request(:post, path).to_return(:body => 'OK')
c = RC::Builder.client do
use RC::Cache, nil, nil
end
c.new . get(path).should.eq('OK')
c.new(:cache => (h={})).post(path).should.eq('OK')
h.should.eq({})
c.new(:cache => (h={})). get(path).should.eq('OK')
h.size.should.eq 1
c.new(:cache => (h={})). get(path, {}, :cache => false).should.eq('OK')
h.should.eq({})
c.new . get(path, {}, 'cache.update' => true).
should.eq('OK')
end
should 'not raise error if headers is nil' do
path = 'http://a'
stub_request(:get , path).to_return(:body => 'OK', :headers => nil)
c = RC::Builder.client do
use RC::Cache, {}, nil
end.new
c.get(path).should.eq 'OK'
c.get(path).should.eq 'OK'
end
should 'head then get' do
c = RC::Builder.client do
use RC::Cache, {}, nil
end.new
path = 'http://example.com'
stub_request(:head, path).to_return(:headers => {'A' => 'B'})
c.head(path).should.eq('A' => 'B')
stub_request(:get , path).to_return(:body => 'body')
c.get(path).should.eq('body')
end
should 'cancel timeout for fiber' do
any_instance_of(RC::Timeout::EventMachineTimer) do |timer|
proxy.mock(timer).cancel.times(2)
end
path = 'http://example.com/'
stub_request(:get, path).to_return(:body => 'response')
c = RC::Builder.client do
use RC::Timeout, 10
use RC::Cache, {}, 3600
run RC::EmHttpRequest
end.new
EM.run{ Fiber.new{
c.request(RC::REQUEST_PATH => path).should.eq 'response'
c.request(RC::REQUEST_PATH => path).should.eq 'response'
EM.stop }.resume }
c.cache.size.should.eq 1
end
should 'cancel timeout for async' do
path = 'http://example.com/'
any_instance_of(RC::Timeout::EventMachineTimer) do |timer|
mock(timer).cancel.times(2)
end
stub_request(:get, path).to_return(:body => 'response')
c = RC::Builder.client do
use RC::Timeout, 10
use RC::Cache, {}, 3600
run RC::EmHttpRequest
end.new
EM.run{
c.request_full(RC::REQUEST_PATH => path){
c.request_full(RC::REQUEST_PATH => path){
EM.stop }}}
c.cache.size.should.eq 1
end
should 'only [] and []= should be implemented' do
cache = Class.new do
def initialize ; @h = {} ; end
def [] key ; @h[key] ; end
def []= key, value; @h[key] = value.sub('4', '5'); end
end.new
c = RC::Builder.client do
use RC::Cache, cache, 0
run Class.new{
def call env
yield(env.merge(RC::RESPONSE_BODY => env[RC::REQUEST_PATH],
RC::RESPONSE_STATUS => 200))
end
}
end.new
c.get('4')
c.get('4').should.eq '5'
end
should 'cache the original response' do
c = RC::Builder.client do
use RC::Cache, {}, 3600 do
use RC::JsonDecode, true
end
end.new
stub_request(:get, 'me').to_return(:body => body = '{"a":"b"}')
c.get('me').should.eq 'a' => 'b'
c.cache.values.first.should.eq "200\n\n\n#{body}"
end
should "follow redirect with cache.update correctly" do
c = RC::Builder.client do
use RC::FollowRedirect, 10
use RC::Cache, {}, nil
end.new
x, y, z = 'http://X', 'http://Y', 'http://Z'
stub_request(:get, x).to_return(:headers => {'Location' => y},
:status => 301)
stub_request(:get, y).to_return(:headers => {'Location' => z},
:status => 302)
stub_request(:get, z).to_return(:body => 'OK')
c.get(x, {}, 'cache.update' => true).should.eq 'OK'
end
should 'not cache post/put/delete' do
[:put, :post, :delete].each{ |meth|
url, body = "https://cache", 'ok'
stub_request(meth, url).to_return(:body => body).times(3)
cache = {}
c = RC::Builder.client{use RC::Cache, cache, nil}.new
3.times{
if meth == :delete
c.send(meth, url).should.eq(body)
else
c.send(meth, url, 'payload').should.eq(body)
end
}
cache.should.eq({})
}
end
should 'update cache if there is cache option set to false' do
url, body = "https://cache", 'ok'
stub_request(:get, url).to_return(:body => body)
c = RC::Builder.client{use RC::Cache, {}, nil}.new
c.get(url) .should.eq body
stub_request(:get, url).to_return(:body => body.reverse).times(2)
c.get(url) .should.eq body
c.get(url, {}, 'cache.update' => true).should.eq body.reverse
c.get(url) .should.eq body.reverse
c.cache = nil
c.get(url, {}, 'cache.update' => true).should.eq body.reverse
end
describe 'expires_in' do
before do
@url, @body = "https://cache", 'ok'
stub_request(:get, @url).to_return(:body => @body)
@cache = {}
mock(@cache).method(:store){ mock!.arity{ -3 } }
mock(@cache).store(is_a(String), is_a(String), :expires_in => 3)
@cache
end
should 'respect in options' do
c = RC::Builder.client{use RC::Cache, nil, nil}.new
c.get(@url, {}, :cache => @cache, :expires_in => 3).should.eq @body
end
should 'respect in middleware' do
c = RC::Builder.client{use RC::Cache, nil, 3}.new(:cache => @cache)
c.get(@url).should.eq @body
end
end
end
Jump to Line
Something went wrong with that request. Please try again.