require "spec_helper"

require "massive_sitemap/writer/file"

describe MassiveSitemap::Writer::File do
  let(:filename) { 'sitemap.xml' }
  let(:filename2) { 'sitemap-1.xml' }
  let(:writer) {  MassiveSitemap::Writer::File.new.tap { |w| w.init! } }

  after do
    FileUtils.rm(filename) rescue nil
    FileUtils.rm(filename2) rescue nil
  end

  describe "root" do
    let(:root) { "test/test2" }

    after do
      FileUtils.rm_rf(root) rescue nil
    end

    it 'mkdir_p folder' do
      expect do
        MassiveSitemap::Writer::File.new(:root => root).tap do |w|
          w.init!
          w.close!
        end
      end.to change { File.exists?(root) }.to(true)
    end

    it 'appends root' do
      expect do
        MassiveSitemap::Writer::File.new(:root => root).tap do |w|
          w.init!
          w.close!
        end
      end.to change { File.exists?("#{root}/#{filename}") }.to(true)
    end

    it 'appends root' do
      expect do
        MassiveSitemap::Writer::File.new(:root => "#{root}/").tap do |w|
          w.init!
          w.close!
        end
      end.to change { File.exists?("#{root}/#{filename}") }.to(true)
    end
  end

  it 'create file' do
    expect do
      writer.close!
    end.to change { File.exists?(filename) }.to(true)
  end

  it 'create second file on rotation' do
    expect do
      expect do
        writer.close!
      end.to change { File.exists?(filename) }.to(true)
      writer.init!(:filename => filename2)
      writer.close!
    end.to change { File.exists?(filename2) }.to(true)
  end

  it 'write into file' do
    writer.print 'test'
    writer.close!
    `cat '#{filename}'`.should == "test"
  end

  it 'init new file closes current' do
    writer.print 'test'
    writer.init!(:filename => filename2)
    `cat '#{filename}'`.should == "test"
  end

  it 'write into second file' do
    writer.print 'test'
    writer.init!(:filename => filename2)
    writer.print 'test2'
    writer.close!
    `cat '#{filename2}'`.should == "test2"
  end

  context "opening write file" do
    before do
      File.open(filename, 'w') {}
    end

    after do
      FileUtils.rm(filename) rescue nil
    end

    it 'raises when file exits' do
      writer = MassiveSitemap::Writer::File.new
      expect do
        writer.init!
      end.to raise_error(MassiveSitemap::Writer::File::FileExistsException)
    end

    it 'raises when file exits' do
      writer = MassiveSitemap::Writer::File.new(:force_overwrite => true)
      expect do
        writer.init!
      end.to_not raise_error(MassiveSitemap::Writer::File::FileExistsException)
    end
  end
end