mirror of
https://github.com/discourse/discourse.git
synced 2024-11-27 09:50:23 +08:00
e7a84948b9
When preloading topic_list data we were giving it a 'preload key' which was loosely based on the parameters of the list. However, it did not include all parameters, and mismatches between client/server-side logic would cause the preloaded data to be ignored. This commit simplifies things by using a single key for all topic_list preloading. This works on the assumption that "The first topic_list the JS app will load is the one which was preloaded". That assumption also existed to some extent in the old design, so we don't expect any regressions here.
106 lines
3.3 KiB
Ruby
106 lines
3.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
RSpec.describe TopicList do
|
|
let!(:topic) {
|
|
t = Fabricate(:topic)
|
|
t.allowed_user_ids = [t.user.id]
|
|
t
|
|
}
|
|
|
|
let(:user) { topic.user }
|
|
let(:topic_list) { TopicList.new("liked", user, [topic]) }
|
|
|
|
before do
|
|
TopicList.preloaded_custom_fields.clear
|
|
end
|
|
|
|
after do
|
|
TopicList.preloaded_custom_fields.clear
|
|
end
|
|
|
|
describe ".preloaded_custom_fields" do
|
|
it "should return a unique set of values" do
|
|
TopicList.preloaded_custom_fields << "test"
|
|
TopicList.preloaded_custom_fields << "test"
|
|
TopicList.preloaded_custom_fields << "apple"
|
|
|
|
expect(TopicList.preloaded_custom_fields).to eq(Set.new(%w{test apple}))
|
|
end
|
|
end
|
|
|
|
describe "preload" do
|
|
it "allows preloading of data" do
|
|
preloaded_topic = false
|
|
preloader = lambda do |topics, topic_list|
|
|
expect(TopicList === topic_list).to eq(true)
|
|
expect(topics.length).to eq(1)
|
|
preloaded_topic = true
|
|
end
|
|
|
|
TopicList.on_preload(&preloader)
|
|
|
|
topic_list.topics
|
|
expect(preloaded_topic).to eq(true)
|
|
|
|
TopicList.cancel_preload(&preloader)
|
|
end
|
|
end
|
|
|
|
describe '#load_topics' do
|
|
it 'loads additional data for serialization' do
|
|
category_user = CategoryUser.create!(
|
|
user: user,
|
|
category: topic.category,
|
|
notification_level: NotificationLevels.all[:regular]
|
|
)
|
|
|
|
topic = topic_list.load_topics.first
|
|
|
|
expect(topic.category_user_data).to eq(category_user)
|
|
end
|
|
end
|
|
|
|
describe '#top_tags' do
|
|
it 'should return the right tags' do
|
|
tag = Fabricate(:tag, topics: [topic])
|
|
other_tag = Fabricate(:tag, topics: [topic], name: "use-anywhere")
|
|
output = [tag.name, other_tag.name]
|
|
expect(topic_list.top_tags.sort).to eq(output.sort)
|
|
end
|
|
|
|
describe 'when there are tags restricted to a category' do
|
|
fab!(:category) { Fabricate(:category) }
|
|
fab!(:topic) { Fabricate(:topic, category: category) }
|
|
fab!(:other_topic) { Fabricate(:topic) } # uncategorized
|
|
fab!(:tag) { Fabricate(:tag, topics: [topic], categories: [category], name: "category-tag") }
|
|
fab!(:other_tag) { Fabricate(:tag, topics: [topic], name: "use-anywhere") }
|
|
let(:topic_list) { TopicList.new('latest', topic.user, [topic], category: category.id, category_id: category.id) }
|
|
|
|
it 'should return tags used in the category' do
|
|
expect(topic_list.top_tags).to eq([tag.name, other_tag.name].sort)
|
|
end
|
|
|
|
it "with no category, should return all tags" do
|
|
expect(TopicList.new('latest', other_topic.user, [other_topic]).top_tags.sort).to eq([tag.name, other_tag.name].sort)
|
|
end
|
|
|
|
it "with another category with no tags, should return no tags" do
|
|
other_category = Fabricate(:category)
|
|
topic3 = Fabricate(:topic, category: other_category)
|
|
list = TopicList.new('latest', topic3.user, [topic3], category: other_category.id, category_id: other_category.id)
|
|
expect(list.top_tags).to be_empty
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "#preload_key" do
|
|
let(:category) { Fabricate(:category) }
|
|
let(:tag) { Fabricate(:tag) }
|
|
|
|
it "returns topic_list" do
|
|
topic_list = TopicList.new('latest', nil, nil, category: category, category_id: category.id)
|
|
expect(topic_list.preload_key).to eq("topic_list")
|
|
end
|
|
end
|
|
end
|