sinatra/sinatra-contrib/spec/content_for_spec.rb

247 lines
7.7 KiB
Ruby
Raw Normal View History

2014-05-09 06:39:16 +00:00
require 'spec_helper'
2011-03-28 08:11:57 +00:00
describe Sinatra::ContentFor do
subject do
Sinatra.new do
helpers Sinatra::ContentFor
set :views, File.expand_path("../content_for", __FILE__)
end.new!
end
2011-04-26 20:19:03 +00:00
Tilt.prefer Tilt::ERBTemplate
extend Forwardable
def_delegators :subject, :content_for, :clear_content_for, :yield_content
def render(engine, template)
subject.send(:render, engine, template, :layout => false).gsub(/\s/, '')
end
describe "without templates" do
it 'renders blocks declared with the same key you use when rendering' do
content_for(:foo) { "foo" }
2016-05-10 14:08:54 +00:00
expect(yield_content(:foo)).to eq("foo")
end
it 'renders blocks more than once' do
content_for(:foo) { "foo" }
2016-05-10 14:08:54 +00:00
3.times { expect(yield_content(:foo)).to eq("foo") }
end
it 'does not render a block with a different key' do
content_for(:bar) { "bar" }
2016-05-10 14:08:54 +00:00
expect(yield_content(:foo)).to be_empty
end
it 'renders default content if no block matches the key and a default block is specified' do
content_for(:bar) { "bar" }
2016-05-10 14:08:54 +00:00
expect(yield_content(:foo) { "foo" }).to eq("foo")
end
it 'renders multiple blocks with the same key' do
content_for(:foo) { "foo" }
content_for(:foo) { "bar" }
content_for(:bar) { "WON'T RENDER ME" }
content_for(:foo) { "baz" }
2016-05-10 14:08:54 +00:00
expect(yield_content(:foo)).to eq("foobarbaz")
end
it 'renders multiple blocks more than once' do
content_for(:foo) { "foo" }
content_for(:foo) { "bar" }
content_for(:bar) { "WON'T RENDER ME" }
content_for(:foo) { "baz" }
2016-05-10 14:08:54 +00:00
3.times { expect(yield_content(:foo)).to eq("foobarbaz") }
end
it 'passes values to the blocks' do
content_for(:foo) { |a| a.upcase }
2016-05-10 14:08:54 +00:00
expect(yield_content(:foo, 'a')).to eq("A")
expect(yield_content(:foo, 'b')).to eq("B")
end
2015-03-06 22:31:18 +00:00
it 'clears named blocks with the specified key' do
content_for(:foo) { "foo" }
2016-05-10 14:08:54 +00:00
expect(yield_content(:foo)).to eq("foo")
2015-03-06 22:31:18 +00:00
clear_content_for(:foo)
2016-05-10 14:08:54 +00:00
expect(yield_content(:foo)).to be_empty
2015-03-06 22:31:18 +00:00
end
it 'takes an immediate value instead of a block' do
content_for(:foo, "foo")
2016-05-10 14:08:54 +00:00
expect(yield_content(:foo)).to eq("foo")
end
end
2011-03-28 14:56:54 +00:00
# TODO: liquid radius markaby builder nokogiri
2018-11-04 16:41:24 +00:00
engines = %w[erb erubi erubis haml slim]
2011-03-28 08:11:57 +00:00
engines.each do |inner|
describe inner.capitalize do
before :all do
begin
require inner
rescue LoadError => e
2016-05-10 14:08:54 +00:00
skip "Skipping: " << e.message
2011-03-28 08:11:57 +00:00
end
end
2011-03-28 08:11:57 +00:00
describe "with yield_content in Ruby" do
it 'renders blocks declared with the same key you use when rendering' do
render inner, :same_key
2016-05-10 14:08:54 +00:00
expect(yield_content(:foo).strip).to eq("foo")
2011-03-28 08:11:57 +00:00
end
it 'renders blocks more than once' do
render inner, :same_key
2016-05-10 14:08:54 +00:00
3.times { expect(yield_content(:foo).strip).to eq("foo") }
end
it 'does not render a block with a different key' do
render inner, :different_key
2016-05-10 14:08:54 +00:00
expect(yield_content(:foo)).to be_empty
end
it 'renders default content if no block matches the key and a default block is specified' do
render inner, :different_key
2016-05-10 14:08:54 +00:00
expect(yield_content(:foo) { "foo" }).to eq("foo")
end
it 'renders multiple blocks with the same key' do
render inner, :multiple_blocks
2016-05-10 14:08:54 +00:00
expect(yield_content(:foo).gsub(/\s/, '')).to eq("foobarbaz")
2011-03-28 08:11:57 +00:00
end
it 'renders multiple blocks more than once' do
render inner, :multiple_blocks
2016-05-10 14:08:54 +00:00
3.times { expect(yield_content(:foo).gsub(/\s/, '')).to eq("foobarbaz") }
end
it 'passes values to the blocks' do
render inner, :takes_values
2016-05-10 14:08:54 +00:00
expect(yield_content(:foo, 1, 2).gsub(/\s/, '')).to eq("<i>1</i>2")
end
end
describe "with content_for in Ruby" do
2011-03-28 08:11:57 +00:00
it 'renders blocks declared with the same key you use when rendering' do
content_for(:foo) { "foo" }
2016-05-10 14:08:54 +00:00
expect(render(inner, :layout)).to eq("foo")
2011-03-28 08:11:57 +00:00
end
it 'renders blocks more than once' do
content_for(:foo) { "foo" }
2016-05-10 14:08:54 +00:00
expect(render(inner, :multiple_yields)).to eq("foofoofoo")
end
2011-03-28 08:11:57 +00:00
it 'does not render a block with a different key' do
content_for(:bar) { "foo" }
2016-05-10 14:08:54 +00:00
expect(render(inner, :layout)).to be_empty
2011-03-28 08:11:57 +00:00
end
it 'renders multiple blocks with the same key' do
content_for(:foo) { "foo" }
content_for(:foo) { "bar" }
content_for(:bar) { "WON'T RENDER ME" }
content_for(:foo) { "baz" }
2016-05-10 14:08:54 +00:00
expect(render(inner, :layout)).to eq("foobarbaz")
2011-03-28 08:11:57 +00:00
end
it 'renders multiple blocks more than once' do
content_for(:foo) { "foo" }
content_for(:foo) { "bar" }
content_for(:bar) { "WON'T RENDER ME" }
content_for(:foo) { "baz" }
2016-05-10 14:08:54 +00:00
expect(render(inner, :multiple_yields)).to eq("foobarbazfoobarbazfoobarbaz")
end
2011-03-28 08:11:57 +00:00
it 'passes values to the blocks' do
content_for(:foo) { |a,b| "<i>#{a}</i>#{b}" }
2016-05-10 14:08:54 +00:00
expect(render(inner, :passes_values)).to eq("<i>1</i>2")
end
2015-03-06 22:31:18 +00:00
it 'clears named blocks with the specified key' do
content_for(:foo) { "foo" }
2016-05-10 14:08:54 +00:00
expect(render(inner, :layout)).to eq("foo")
2015-03-06 22:31:18 +00:00
clear_content_for(:foo)
2016-05-10 14:08:54 +00:00
expect(render(inner, :layout)).to be_empty
2015-03-06 22:31:18 +00:00
end
end
2012-12-09 19:10:08 +00:00
describe "with content_for? in Ruby" do
2012-12-09 19:10:08 +00:00
it 'renders block if key is set' do
content_for(:foo) { "foot" }
2016-05-10 14:08:54 +00:00
expect(render(inner, :footer)).to eq("foot")
end
2012-12-09 19:10:08 +00:00
it 'does not render a block if different key' do
content_for(:different_key) { "foot" }
2016-05-10 14:08:54 +00:00
expect(render(inner, :footer)).to be_empty
end
end
engines.each do |outer|
describe "with yield_content in #{outer.capitalize}" do
def body
last_response.body.gsub(/\s/, '')
end
before :all do
begin
require outer
rescue LoadError => e
2016-05-10 14:08:54 +00:00
skip "Skipping: " << e.message
end
end
before do
mock_app do
helpers Sinatra::ContentFor
set inner, :layout_engine => outer
set :views, File.expand_path("../content_for", __FILE__)
get('/:view') { render(inner, params[:view].to_sym) }
get('/:layout/:view') do
render inner, params[:view].to_sym, :layout => params[:layout].to_sym
end
end
end
it 'renders default content' do
expect(get('/yield_block')).to be_ok
expect(body).to eq("bar")
end
it 'renders blocks declared with the same key you use when rendering' do
2016-05-10 14:08:54 +00:00
expect(get('/same_key')).to be_ok
expect(body).to eq("foo")
end
it 'renders blocks more than once' do
2016-05-10 14:08:54 +00:00
expect(get('/multiple_yields/same_key')).to be_ok
expect(body).to eq("foofoofoo")
end
it 'does not render a block with a different key' do
2016-05-10 14:08:54 +00:00
expect(get('/different_key')).to be_ok
expect(body).to be_empty
end
it 'renders multiple blocks with the same key' do
2016-05-10 14:08:54 +00:00
expect(get('/multiple_blocks')).to be_ok
expect(body).to eq("foobarbaz")
end
it 'renders multiple blocks more than once' do
2016-05-10 14:08:54 +00:00
expect(get('/multiple_yields/multiple_blocks')).to be_ok
expect(body).to eq("foobarbazfoobarbazfoobarbaz")
end
it 'passes values to the blocks' do
2016-05-10 14:08:54 +00:00
expect(get('/passes_values/takes_values')).to be_ok
expect(body).to eq("<i>1</i>2")
end
2011-03-28 08:11:57 +00:00
end
end
end
end
end