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 it 'can be filled with dynamic named variables' do Gon.clear check = {} 3.times do |i| Gon.set_variable("variable#{i}", i) check["variable#{i}"] = i end Gon.all_variables.should == check end it 'can set and get variable with dynamic name' do Gon.clear var_name = "variable#{rand}" Gon.set_variable var_name, 1 Gon.get_variable(var_name).should == 1 end end describe '#include_gon' do before(:each) do Gon.clear Gon::Request. 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 it 'outputs correct js with an integer, camel-case and namespace' do Gon.int_cased = 1 @base.include_gon(camel_case: true, namespace: 'camel_cased').should == \ '' end it 'outputs correct js with an integer and without tag' do Gon.int = 1 @base.include_gon(need_tag: false).should == \ 'window.gon = {};' + 'gon.int=1;' end it 'outputs correct js without variables, without tag and gon init if before there was data' do Gon::Request. instance_variable_set(:@request_id, 123) Gon::Request.instance_variable_set(:@request_env, { 'gon' => { :a => 1 } }) @base.include_gon(need_tag: false, init: true).should == \ 'window.gon = {};' end it 'outputs correct js without variables, without tag and gon init' do @base.include_gon(need_tag: false, init: true).should == \ 'window.gon = {};' end it 'outputs correct js without variables, without tag, gon init and an integer' do Gon.int = 1 @base.include_gon(need_tag: false, init: true).should == \ 'window.gon = {};' + 'gon.int=1;' end it 'outputs correct js with type text/javascript' do @base.include_gon(need_type: true, init: true).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 def request @request ||= double 'request', :env => {} end end