175 lines
5.2 KiB
Ruby
175 lines
5.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "rails_helper"
|
|
|
|
RSpec.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 necessary 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 "with 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 "with 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
|