require 'awestruct/engine'
require 'awestruct/site'
require 'awestruct/page_loader'
require 'awestruct/config'

describe Awestruct::PageLoader do

  before :each do
    @opts = Awestruct::CLI::Options.new
    @opts.source_dir = test_data_dir 'page-loader'
    @config = Awestruct::Config.new( @opts )
    @engine = Awestruct::Engine.new
    @engine.pipeline.handler_chains << :defaults
    @site   = Awestruct::Site.new( @engine, @config )
    @loader = Awestruct::PageLoader.new( @site, :pages )
  end

  it "should be able to load a site page" do
    page = @loader.load_page( File.join( @config.dir, "page-one.md" ) )
    page.should_not be_nil
    page.handler.to_chain.collect{|e| e.class}.should be_include Awestruct::Handlers::TiltHandler
    page.relative_source_path.to_s.should == "/page-one.md"
  end

  it "should be able to load an out-of-site page" do
    page = @loader.load_page( File.join( @config.dir, '../out-of-site', "page-three.html.haml" ) )
    page.should_not be_nil
    page.handler.to_chain.collect{|e| e.class }.should be_include Awestruct::Handlers::TiltHandler
  end

  it "should be able to load all non-draft site pages" do
    @loader.load_all
    @site.pages.size.should == 2

    @site.pages.sort!{|l,r| l.relative_source_path <=> r.relative_source_path }

    @site.pages[0].relative_source_path.to_s.should == '/page-one.md'
    @site.pages[0].output_path.to_s.should          == '/page-one.html'

    @site.pages[1].relative_source_path.to_s.should == '/page-two.html.haml'
    @site.pages[1].output_path.to_s.should          == '/page-two.html'
  end

  it "should be able to load all site pages (even drafts) if show_drafts is true" do
    @site.show_drafts = true
    @loader.load_all
    @site.pages.size.should == 3

    @site.pages.sort!{|l,r| l.relative_source_path <=> r.relative_source_path }

    @site.pages[0].relative_source_path.to_s.should == '/page-draft.md'
    @site.pages[0].output_path.to_s.should          == '/page-draft.html'

    @site.pages[1].relative_source_path.to_s.should == '/page-one.md'
    @site.pages[1].output_path.to_s.should          == '/page-one.html'

    @site.pages[2].relative_source_path.to_s.should == '/page-two.html.haml'
    @site.pages[2].output_path.to_s.should          == '/page-two.html'

  end

  context 'with layouts' do
    before :each do
      @opts = Awestruct::CLI::Options.new
      @opts.source_dir = test_data_dir 'page-loader' 
      @config = Awestruct::Config.new( @opts )
      @engine = Awestruct::Engine.new
      @engine.pipeline.handler_chains << :defaults
      @site   = Awestruct::Site.new( @engine, @config )
      @loader = Awestruct::PageLoader.new( @site, :layouts )
    end

    it "should be able to load a site layout" do
      page = @loader.load_page( File.join( @config.dir, "_layouts", "layout-one.md" ) )
      page.should_not be_nil
      page.handler.to_chain.collect{|e| e.class}.should be_include Awestruct::Handlers::TiltHandler
      page.relative_source_path.to_s.should == "/_layouts/layout-one.md"
    end

    it "should be able to load all site layouts" do
      @loader.load_all
      @site.layouts.size.should == 2

      @site.layouts.sort!{|l,r| l.relative_source_path <=> r.relative_source_path }

      @site.layouts[0].relative_source_path.to_s.should == '/_layouts/layout-one.md'
      @site.layouts[0].output_path.to_s.should          == '/_layouts/layout-one.html'

      @site.layouts[1].relative_source_path.to_s.should == '/_layouts/layout-two.html.haml'
      @site.layouts[1].output_path.to_s.should          == '/_layouts/layout-two.html'
    end

  end

end
