# gon_spec_rb
require 'gon'
describe Gon do
before(:each) do
Gon.request_env = {}
end
describe '#all_variables' do
it 'returns all variables in hash' do
Gon.a = 1
Gon.b = 2
Gon.c = Gon.a + Gon.b
Gon.c.should == 3
Gon.all_variables.should == {'a' => 1, 'b' => 2, 'c' => 3}
end
it 'supports all data types' do
Gon.clear
Gon.int = 1
Gon.float = 1.1
Gon.string = 'string'
Gon.array = [ 1, 'string' ]
Gon.hash_var = { :a => 1, :b => '2'}
Gon.hash_w_array = { :a => [ 2, 3 ] }
Gon.klass = Hash
end
end
describe '#include_gon' do
before(:each) do
Gon.clear
Gon.instance_variable_set(:@request_id, request.object_id)
ActionView::Base.instance_methods.map(&:to_s).include?('include_gon').should == true
@base = ActionView::Base.new
@base.request = request
end
it 'outputs correct js with an integer' do
Gon.int = 1
@base.include_gon.should == ''
end
it 'outputs correct js with a string' do
Gon.str = %q(a'b"c)
@base.include_gon.should == ''
end
it 'outputs correct js with a script string' do
Gon.str = %q()
@base.include_gon.should == ''
end
end
it 'returns exception if try to set public method as variable' do
Gon.clear
lambda { Gon.all_variables = 123 }.should raise_error
lambda { Gon.rabl = 123 }.should raise_error
end
describe '.rabl' do
require 'rabl'
require 'gon/rabl'
before :each do
Gon.clear
controller.instance_variable_set('@objects', objects)
end
let(:controller) { ActionController::Base.new }
let(:objects) { [1,2] }
context 'render template with deprecation' do
it 'still works' do
Gon.rabl 'spec/test_data/sample.rabl', :controller => controller
Gon.objects.length.should == 2
end
end
it 'works if rabl is included' do
Gon.rabl :template =>'spec/test_data/sample.rabl', :controller => controller
Gon.objects.length.should == 2
end
it 'raise exception if rabl is not included' do
Gon.send :remove_const, 'Rabl'
expect { Gon.rabl :template =>'spec/test_data/sample.rabl', :controller => controller}.to raise_error
load 'rabl.rb'
load 'gon/rabl.rb'
end
context '.get_template_path' do
context 'template is specified' do
it 'add the extension if not included in the template name' do
Gon.send(:get_template_path, { :template => 'spec/test_data/sample'}, 'rabl').should eql('spec/test_data/sample.rabl')
end
it 'return the specified template' do
Gon.send(:get_template_path, { :template => 'spec/test_data/sample.rabl'}, 'rabl').should eql('spec/test_data/sample.rabl')
end
end
context 'template is not specified' do
before do
Gon.clear
controller.instance_variable_set('@objects', objects)
controller.action_name = 'show'
end
let(:controller) { ActionController::Base.new }
let(:objects) { [1,2] }
context 'the action doesn as a template at a different format' do
it 'return the same template as the action with rabl extension' do
Gon.send(:get_template_path, {:controller => controller}, 'rabl').should eql('app/views/action_controller/base/show.json.rabl')
end
end
end
end
end
if RUBY_VERSION > '1.9'
require 'jbuilder'
require 'gon/jbuilder'
describe '.jbuilder' do
context 'render jbuilder templates' do
before do
Gon.clear
controller.instance_variable_set('@objects', objects)
end
let(:controller) { ActionController::Base.new }
let(:objects) { [1,2] }
it 'render json from jbuilder template' do
Gon.jbuilder 'spec/test_data/sample.json.jbuilder', :controller => controller
Gon.objects.length.should == 2
end
it 'render json from jbuilder template with a partial' do
controller.view_paths << 'spec/test_data'
Gon.jbuilder 'spec/test_data/sample_with_partial.json.jbuilder', :controller => controller
Gon.objects.length.should == 2
end
end
it 'should throw error if you use gon.jbuilder with ruby < 1.9+' do
RUBY_VERSION = '1.8.7'
expect { Gon.jbuilder 'some_path'}.to raise_error(NoMethodError, /1.9/)
end
it 'should raise error if you use gon.jbuilder without requiring jbuilder gem' do
RUBY_VERSION = '1.9.2'
Gon.send(:remove_const, :Jbuilder)
expect { Gon.jbuilder 'some_path' }.to raise_error(NoMethodError, /Gemfile/)
load 'jbuilder.rb'
load 'gon/jbuilder.rb'
end
end
describe '.get_template_path' do
context 'template is specified' do
it 'add the extension if not included in the template name' do
Gon.send(:get_template_path, { :template => 'spec/test_data/sample'}, 'jbuilder').should eql('spec/test_data/sample.jbuilder')
end
it 'return the specified template' do
Gon.send(:get_template_path, { :template => 'spec/test_data/sample.jbuilder'}, 'jbuilder').should eql('spec/test_data/sample.jbuilder')
end
end
context 'template is not specified' do
before do
Gon.clear
controller.instance_variable_set('@objects', objects)
controller.action_name = 'show'
end
let(:controller) { ActionController::Base.new }
let(:objects) { [1,2] }
context 'the action doesn as a template at a different format' do
it 'return the same template as the action with rabl extension' do
Gon.send(:get_template_path, {:controller => controller}, 'jbuilder').should eql('app/views/action_controller/base/show.json.jbuilder')
end
end
end
end
end
def request
@request ||= double 'request', :env => {}
end
end