require "spec_helper"

require "massive_sitemap/builder"
require "massive_sitemap/writer/string"

describe MassiveSitemap::Builder::Base do
  let(:header) { %Q(<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">) }
  let(:writer) { MassiveSitemap::Writer::String.new }
  let(:builder) { MassiveSitemap::Builder.new(writer) }

  describe "#arguments" do
    it 'fail if no writer given' do
      expect do
        MassiveSitemap::Builder.new
      end.to raise_error(ArgumentError)
    end
  end

  context "no content added" do
    it 'empty per default' do
      builder

      writer.should == ""
    end

    it 'generate basic skeleton' do
      builder.init!
      writer.should == header
    end

    it 'generate basic skeleton on double init' do
      builder.init!
      builder.init!
      writer.should == header
    end

    it 'generate nothing when not inited' do
      builder.close!
      writer.should == ""
    end

    it "same result on double close" do
      builder.close!
      builder.close!
      writer.should == ""
    end

    it "same result on double close" do
      builder.init!
      builder.close!
      builder.close!
      writer.should == %Q(#{header}\n</urlset>)
    end

    it "same result on double close" do
      builder.init! do
        add "test"
      end
      writer.should == %Q(#{header}\n  <url>\n    <loc>/test</loc>\n  </url>\n</urlset>)
    end
  end

  context "adding content" do
    it 'seq: generate one url' do
      builder.add 'test'
      builder.close!
      writer.should == %Q(#{header}\n  <url>\n    <loc>/test</loc>\n  </url>\n</urlset>)
    end
  end

  context "as block" do
    it 'generate basic skeleton' do
      MassiveSitemap::Builder.new(writer)  {}
      writer.should == ""
    end

    it 'generate one url' do
      MassiveSitemap::Builder.new(writer) do
        add 'test'
      end
      writer.should == %Q(#{header}\n  <url>\n    <loc>/test</loc>\n  </url>\n</urlset>)
    end

    it 'generate one url with init!' do
      MassiveSitemap::Builder.new(writer) do
        init!
        add 'test'
      end
      writer.should == %Q(#{header}\n  <url>\n    <loc>/test</loc>\n  </url>\n</urlset>)
    end

    it 'generate one url with init! block' do
      MassiveSitemap::Builder.new(writer) do
        init! do
          add 'test'
        end
      end
      writer.should == %Q(#{header}\n  <url>\n    <loc>/test</loc>\n  </url>\n</urlset>)
    end

    it 'generate one url with close!' do
      MassiveSitemap::Builder.new(writer) do
        add 'test'
        close!
      end
      writer.should == %Q(#{header}\n  <url>\n    <loc>/test</loc>\n  </url>\n</urlset>)
    end

    it 'generate one url, no indent' do
      MassiveSitemap::Builder.new(writer, :indent_by => 0) do
        add_url! 'test'
      end
      writer.should == %Q(#{header}\n<url>\n<loc>test</loc>\n</url>\n</urlset>)
    end

    it 'generate two url' do
      MassiveSitemap::Builder.new(writer) do
        add_url! 'test'
        add_url! 'test2'
      end
      writer.should == %Q(#{header}\n  <url>\n    <loc>test</loc>\n  </url>\n  <url>\n    <loc>test2</loc>\n  </url>\n</urlset>)
    end

    it 'generate one url with attrs' do
      MassiveSitemap::Builder.new(writer, :indent_by => 0) do
        add_url! 'test', :change_frequency => 'weekly', :priority => 0.8
      end
      writer.should include("<loc>test</loc>\n<changefreq>weekly</changefreq>\n<priority>0.8</priority>")
    end
  end

  describe ".url" do
    URLS = %w(
      http://test.de/
      test.de/
      test.de
    )

    URLS.each do |url|
      it "transforms to valid url" do
        MassiveSitemap::Builder.new(writer, :url => url).send(:url).should == "http://test.de/"
      end
    end

    it "transforms to valid url with https" do
      MassiveSitemap::Builder.new(writer, :url => "https://test.de/").send(:url).should == "https://test.de/"
    end
  end
end