require "spec_helper"
require "massive_sitemap/writer/gzip_file"
describe MassiveSitemap do
let(:index_filename) { 'sitemap_index.xml' }
let(:filename) { 'sitemap.xml' }
let(:filename2) { 'sitemap2.xml' }
def output(file = filename)
`cat '#{file}'`
end
def gz_filename(file = filename)
"#{file}.gz"
end
after do
FileUtils.rm(index_filename) rescue nil
FileUtils.rm(filename) rescue nil
FileUtils.rm(filename2) rescue nil
end
describe "generate" do
context "initalize" do
it 'fail if no url given' do
expect do
MassiveSitemap.generate
end.to raise_error(ArgumentError)
end
it "does not create empty sitemap file" do
expect do
MassiveSitemap.generate(:url => 'test.de/')
end.to_not change { ::File.exists?(filename) }
end
context "custom writer" do
after do
FileUtils.rm(gz_filename(index_filename)) rescue nil
FileUtils.rm(gz_filename) rescue nil
end
it 'takes gzips writer' do
expect do
MassiveSitemap.generate(:url => 'test.de/', :gzip => true) do
add "dummy"
end
end.to change { ::File.exists?(gz_filename) }.to(true)
end
it 'takes custom writer' do
expect do
MassiveSitemap.generate(:url => 'test.de/', :writer => MassiveSitemap::Writer::GzipFile) do
add "dummy"
end
end.to change { ::File.exists?(gz_filename) }.to(true)
end
end
end
context "generate" do
it 'adds url' do
MassiveSitemap.generate(:url => 'test.de') do
add "track/name"
end
output.should include("http://test.de/track/name")
end
it 'adds url with root slash' do
MassiveSitemap.generate(:url => 'test.de/') do
add "/track/name"
end
output.should include("http://test.de/track/name")
end
it "doesn't fail for existing file" do
File.open(filename, 'w') {}
expect do
MassiveSitemap.generate(:url => 'test.de/') do
add "/track/name"
end
end.to_not change { File.stat(filename).mtime }
end
context 'nested generation' do
it 'adds url of nested builder' do
MassiveSitemap.generate(:url => 'test.de/') do
writer = @writer.class.new(@options.merge(:filename => 'sitemap2.xml'))
MassiveSitemap::Builder::Rotating.new(writer, @options) do
add "/set/name"
end
end
output(filename2).should include("http://test.de/set/name")
end
it 'executes block altough first sitemap exists' do
File.open(filename, 'w') {}
MassiveSitemap.generate(:url => 'test.de/') do
writer = @writer.class.new(@options.merge(:filename => 'sitemap2.xml'))
MassiveSitemap::Builder::Rotating.new(writer, @options) do
add "/set/name"
end
end
output(filename2).should include("http://test.de/set/name")
end
end
end
context "generate_index" do
let(:lastmod) { File.stat(index_filename).mtime.utc.strftime('%Y-%m-%dT%H:%M:%S+00:00') }
it "does not create empty files" do
MassiveSitemap.generate(:url => 'test.de/')
::File.exists?(index_filename).should be_false
end
it 'includes urls' do
MassiveSitemap.generate(:url => 'test.de/', :indent_by => 0) do
add "dummy"
end
output(index_filename).should include("\nhttp://test.de/sitemap.xml\n#{lastmod}\n")
end
it 'includes index base url' do
MassiveSitemap.generate(:url => 'test.de/', :index_url => 'index.de/') do
add "dummy"
end
output(index_filename).should include("http://index.de/sitemap.xml")
end
it 'overwrites existing one' do
File.open(index_filename, 'w') {}
MassiveSitemap.generate(:url => 'test.de/', :index_url => 'index.de/') do
add "dummy"
end
output(index_filename).should include("http://index.de/sitemap.xml")
end
context "gziped" do
after do
FileUtils.rm(gz_filename(index_filename)) rescue nil
FileUtils.rm(gz_filename) rescue nil
end
it 'creates sitemap file' do
expect do
MassiveSitemap.generate(:url => 'test.de/', :writer => MassiveSitemap::Writer::GzipFile) do
add "dummy"
end
end.to change { ::File.exists?(gz_filename(index_filename)) }.to(true)
end
end
end
end
describe "ping" do
PINGS = [
"http://www.google.com/webmasters/tools/ping?sitemap=http%3A%2F%2Ftest.de%2Fsitemap_index.xml",
"http://www.bing.com/webmaster/ping.aspx?siteMap=http%3A%2F%2Ftest.de%2Fsitemap_index.xml",
"http://submissions.ask.com/ping?sitemap=http%3A%2F%2Ftest.de%2Fsitemap_index.xml",
]
it 'calls all engines' do
MassiveSitemap.should_receive(:open).exactly(3).times.with { |arg|
arg.should == PINGS.shift
}.and_return(true)
index_url = MassiveSitemap.generate(:url => 'test.de/') do
add "dummy"
end
MassiveSitemap.ping(index_url)
end
end
end