discourse/spec/models/sitemap_spec.rb
Roman Rizzi 6f76a12e0a
FEATURE: Let sites add a sitemap.xml file. (#16357)
* FEATURE: Let sites add a sitemap.xml file.

This PR adds the same features discourse-sitemap provides to core. Sitemaps are only added to the robots.txt file if the `enable_sitemap` setting is enabled and `login_required` disabled.

After merging discourse/discourse-sitemap#34, this change will take priority over the sitemap plugin because it will disable itself. We're also using the same sitemaps table, so our migration won't try to create it
again using `if_not_exists: true`.
2022-04-12 10:33:59 -03:00

162 lines
5.0 KiB
Ruby

# frozen_string_literal: true
require 'rails_helper'
describe Sitemap do
describe '.regenerate_sitemaps' do
fab!(:topic) { Fabricate(:topic) }
it 'always create the news and recent sitemaps' do
described_class.regenerate_sitemaps
sitemaps = Sitemap.where(name: [Sitemap::NEWS_SITEMAP_NAME, Sitemap::RECENT_SITEMAP_NAME], enabled: true)
expect(sitemaps.exists?).to eq(true)
end
it 'bumps existing sitemaps last_posted_at attribute' do
news = Sitemap.create!(name: Sitemap::NEWS_SITEMAP_NAME, enabled: true, last_posted_at: 10.days.ago)
described_class.regenerate_sitemaps
expect(news.reload.last_posted_at).to eq_time(topic.updated_at)
end
it 'creates the sitemap first page when there is a topic' do
described_class.regenerate_sitemaps
first_page = Sitemap.find_by(name: '1')
expect(first_page.enabled).to eq(true)
end
it "only counts topics from unrestricted categories" do
restricted_category = Fabricate(:category, read_restricted: true)
topic.update!(category: restricted_category)
Category.update_stats
described_class.regenerate_sitemaps
first_page = Sitemap.find_by(name: '1')
expect(first_page).to be_nil
end
it 'disable empty pages' do
unused_page = Sitemap.touch('10')
described_class.regenerate_sitemaps
expect(unused_page.reload.enabled).to eq(false)
end
end
describe '#topics' do
shared_examples 'Excludes hidden and restricted topics' do
it "doesn't include topics from restricted categories" do
restricted_category = Fabricate(:category, read_restricted: true)
Fabricate(:topic, category: restricted_category)
topics_data = sitemap.topics
expect(topics_data).to be_empty
end
it "doesn't include hidden topics" do
Fabricate(:topic, visible: false)
topics_data = sitemap.topics
expect(topics_data).to be_empty
end
end
context 'when the sitemap corresponds to a page' do
let(:sitemap) { described_class.new(enabled: true, last_posted_at: 1.minute.ago, name: '1') }
it 'returns an empty array if there no topics' do
expect(sitemap.topics).to be_empty
end
it 'returns all the neccessary topic attributes to render a sitemap URL' do
topic = Fabricate(:topic)
topics_data = sitemap.topics.first
expect(topics_data[0]).to eq(topic.id)
expect(topics_data[1]).to eq(topic.slug)
expect(topics_data[2]).to eq_time(topic.bumped_at)
expect(topics_data[3]).to eq_time(topic.updated_at)
end
it 'returns empty when the page is empty because the previous page is not full' do
Fabricate(:topic)
sitemap.name = '2'
topics_data = sitemap.topics
expect(topics_data).to be_empty
end
it "order topics by bumped_at asc" do
topic_1 = Fabricate(:topic, bumped_at: 3.minute.ago)
topic_2 = Fabricate(:topic, bumped_at: 1.minutes.ago)
topic_3 = Fabricate(:topic, bumped_at: 20.minutes.ago)
topic_ids = sitemap.topics.map { |td| td[0] }
expect(topic_ids).to contain_exactly(topic_2.id, topic_1.id, topic_3.id)
end
it_behaves_like 'Excludes hidden and restricted topics'
end
context 'sitemap for recent topics' do
let(:sitemap) do
described_class.new(
enabled: true, last_posted_at: 1.minute.ago, name: described_class::RECENT_SITEMAP_NAME
)
end
it 'return topics that were bumped less than three days ago' do
Fabricate(:topic, bumped_at: 4.days.ago)
recent_topic = Fabricate(:topic, bumped_at: 2.days.ago, posts_count: 3)
topics_data = sitemap.topics
expect(topics_data.length).to eq(1)
recent_topic_data = topics_data.first
expect(recent_topic_data[0]).to eq(recent_topic.id)
expect(recent_topic_data[1]).to eq(recent_topic.slug)
expect(recent_topic_data[2]).to eq_time(recent_topic.bumped_at)
expect(recent_topic_data[3]).to eq_time(recent_topic.updated_at)
expect(recent_topic_data[4]).to eq(recent_topic.posts_count)
end
it_behaves_like 'Excludes hidden and restricted topics'
end
context 'news sitemap' do
let(:sitemap) do
described_class.new(
enabled: true, last_posted_at: 1.minute.ago, name: described_class::NEWS_SITEMAP_NAME
)
end
it 'returns topics that were bumped in the last 72 hours' do
Fabricate(:topic, bumped_at: 73.hours.ago)
recent_topic = Fabricate(:topic, bumped_at: 71.hours.ago)
topics_data = sitemap.topics
expect(topics_data.length).to eq(1)
recent_topic_data = topics_data.first
expect(recent_topic_data[0]).to eq(recent_topic.id)
expect(recent_topic_data[1]).to eq(recent_topic.title)
expect(recent_topic_data[2]).to eq(recent_topic.slug)
expect(recent_topic_data[3]).to eq_time(recent_topic.updated_at)
end
it_behaves_like 'Excludes hidden and restricted topics'
end
end
end