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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
require File.dirname(__FILE__) + '/helper'
describe 'Rack::Flash' do
extend Rack::Test::Methods
def app(&block)
return Sinatra.new &block
end
before do
@fake_session = {}
end
def new_flash(entries={})
flash = Rack::Flash::FlashHash.new(@fake_session)
entries.each { |key,val| flash[key] = val }
flash
end
it 'stores entries' do
new_flash[:foo] = 'bar'
new_flash[:foo].should.equal('bar')
end
it 'accepts strings or hashes' do
new_flash[:foo] = 'bar'
new_flash['foo'].should.equal('bar')
end
it 'deletes entries from session after retrieval' do
new_flash[:foo] = 'bar'
new_flash[:foo]
new_flash[:foo].should.be.nil
end
it 'caches retrieved entries in instance' do
flash = new_flash(:foo => 'bar')
flash[:foo].should.equal('bar')
flash[:foo].should.equal('bar')
end
it 'does not step on session keys' do
@fake_session[:foo] = true
new_flash[:foo] = false
@fake_session[:foo].should.be.true
end
it 'can flag existing entries' do
flash = new_flash(:foo => 'bar', :fizz => 'buzz')
flash.flag!
flash.flagged.should.include(:foo)
flash.flagged.should.include(:fizz)
end
it 'can sweep flagged entries' do
err_explain do
flash = new_flash(:foo => 'bar', :fizz => 'buzz')
flash.flag!
flash.sweep!
flash.flagged.should.be.empty
new_flash[:foo].should.be.nil
new_flash[:fizz].should.be.nil
end
end
it 'allows setters with Flash.now semantics' do
flash = new_flash
flash.now[:foo] = 'bar'
flash[:foo].should.equal('bar')
new_flash[:foo].should.be.nil
end
it 'does not raise an error when session is cleared' do
flash = new_flash
flash[:foo] = 'bar'
@fake_session.clear
flash['foo'].should.equal(nil)
end
describe 'accessorize option' do
def new_flash(entries={})
flash = Rack::Flash::FlashHash.new(@fake_session, :accessorize => [:foo, :fizz])
entries.each { |key,val| flash[key] = val }
flash
end
it 'allows getters' do
flash = new_flash(:foo => 'bar')
flash.foo.should.equal('bar')
end
it 'allows setters' do
flash = new_flash
flash.fizz = 'buzz'
flash.fizz.should.equal('buzz')
end
it 'allows declarative setters' do
flash = new_flash
flash.fizz 'buzz'
flash.fizz.should.equal('buzz')
end
it 'allows setters with Flash.now semantics' do
flash = new_flash
flash.foo! 'bar'
flash.foo.should.equal('bar')
new_flash[:foo].should.be.nil
end
it 'only defines accessors for passed entry types' do
err_explain do
flash = new_flash
proc {
flash.bliggety = 'blam'
}.should.raise(NoMethodError)
end
end
end
it 'does not provide getters by default' do
proc {
new_flash(:foo => 'bar').foo
}.should.raise(NoMethodError)
end
it 'does not provide setters by default' do
proc {
flash = new_flash
flash.fizz = 'buzz'
}.should.raise(NoMethodError)
end
describe 'integration' do
it 'provides :sweep option to clear unused entries' do
app {
use Rack::Flash, :sweep => true
set :sessions, true
get '/' do
'ok'
end
}
fake_flash = Rack::FakeFlash.new(:foo => 'bar')
get '/', :env=>{ 'x-rack.flash' => fake_flash }
fake_flash.should.be.flagged
fake_flash.should.be.swept
fake_flash.store[:foo].should.be.nil
end
end
# Testing sessions is a royal pain in the ass.
end
|