require 'spec_helper'

describe Gon do

  before(:all) do
    ensure_rabl_is_loaded
  end

  describe '.rabl' do

    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
        expect(Gon.objects.length).to eq(2)
      end
    end

    context 'option locals' do
      it 'works without locals object properly' do
        Gon.rabl(
          :template   => 'spec/test_data/sample.rabl',
          :controller => controller
        )
        expect(Gon.objects.map { |it| it['object']['inspect'] }).to eq(%w(1 2))
      end

      it 'works with different locals object' do
        Gon.rabl(
          :template   => 'spec/test_data/sample.rabl',
          :controller => controller,
          :locals     => { :objects => [3, 4] }
        )
        expect(Gon.objects.map { |it| it['object']['inspect'] }).to eq(%w(3 4))
      end
    end

    it 'works if rabl is included' do
      Gon.rabl :template => 'spec/test_data/sample.rabl', :controller => controller
      expect(Gon.objects.length).to eq(2)
    end

    it 'works with ActionView::Helpers' do
      Gon.rabl :template => 'spec/test_data/sample_with_helpers.rabl', :controller => controller
      expect(Gon.objects.first['object']['time_ago']).to eq('about 6 hours')
    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 '.template_path' do
      context 'template is specified' do

        it 'add the extension if not included in the template name' do
          expect(Gon::EnvFinder.send(:template_path, { :template => 'spec/test_data/sample' }, 'rabl')).to eql('spec/test_data/sample.rabl')
        end

        it 'return the specified template' do
          expect(Gon::EnvFinder.send(:template_path, { :template => 'spec/test_data/sample.rabl' }, 'rabl')).to 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
            expect(Gon::EnvFinder.send(:template_path, { :controller => controller }, 'rabl')).to eql('app/views/action_controller/base/show.json.rabl')
          end
        end

      end
    end

  end

  def request
    @request ||= double 'request', :env => {}
  end

end
