mirror of
https://github.com/discourse/discourse.git
synced 2024-12-02 04:43:43 +08:00
6f76a12e0a
* 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`.
162 lines
5.0 KiB
Ruby
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
|