require 'spec_helper'

describe Stache::Handlebars::Handler do
  before do
    @template = ActionView::Template.new("{{body}}", "hello handlebars", Stache::Handlebars::Handler, { virtual_path: "hello_world"})
    @handler = Stache::Handlebars::Handler.new
  end

  describe "#handlebars_class_from_template" do
    it "returns the appropriate handlebars class" do
      class HelloWorld < Stache::Handlebars::View; end
      @handler.handlebars_class_from_template(@template).should == HelloWorld
      Object.send(:remove_const, :HelloWorld)
    end
    it "is clever about folders and such" do
      @template.stub(:virtual_path).and_return("profiles/index")
      module Profiles; class Index < Stache::Handlebars::View; end; end
      @handler.handlebars_class_from_template(@template).should == Profiles::Index
      Object.send(:remove_const, :Profiles)
    end
    it "retuns Stache::Handlebars::View if it can't find none" do
      @handler.handlebars_class_from_template(@template).should == Stache::Handlebars::View
    end
    it "reraises error if loaded handlebars_class raises a NameError" do
      @template.stub(:virtual_path).and_return("profiles/index")
      module Profiles; end
      # Emulate autoload behavior so the error gets raised upon const_get
      Profiles.autoload :Index, File.join(File.dirname(__FILE__), "profile_autoload.rb")

      lambda {
        @handler.handlebars_class_from_template(@template)
      }.should raise_error(NameError, "uninitialized constant Profiles::Index::Foo")

      Object.send(:remove_const, :Profiles)
    end
  end

  describe "#handlebars_class_from_template with config module wrapper set" do
    before do
      Stache.wrapper_module_name = "Wrapper"
    end

    it "returns the appropriate handlebars class" do
      module Wrapper; class HelloWorld < ::Stache::Handlebars::View; end; end
      @handler.handlebars_class_from_template(@template).should == Wrapper::HelloWorld
      Object.send(:remove_const, :Wrapper)
    end
    it "is clever about folders and such" do
      @template.stub(:virtual_path).and_return("profiles/index")
      module Wrapper; module Profiles; class Index < ::Stache::Handlebars::View; end; end; end
      @handler.handlebars_class_from_template(@template).should == Wrapper::Profiles::Index
      Object.send(:remove_const, :Wrapper)
    end

    after do
      Stache.wrapper_module_name = nil
    end
  end
end
