mirror of
https://github.com/discourse/discourse.git
synced 2024-12-01 20:25:48 +08:00
335be272ff
We cap new and unread at 2/5th of SiteSetting.max_tracked_new_unread This dynamic capping is applied under 2 conditions: 1. New capping is applied once every 15 minutes in the periodical job, this effectively ensures that usually even super active sites are capped at 200 new items 2. Unread capping is applied if a user hits max_tracked_new_unread, meaning if new + unread == 500, we defer a job that runs within 15 minutes that will cap user at 200 unread This logic ensures that at worst case a user gets "bad" numbers for 15 minutes and then the system goes ahead and fixes itself up
134 lines
3.6 KiB
Ruby
134 lines
3.6 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe TopicTrackingState do
|
|
|
|
let(:user) do
|
|
Fabricate(:user)
|
|
end
|
|
|
|
let(:post) do
|
|
create_post
|
|
end
|
|
|
|
it "can correctly publish unread" do
|
|
# TODO setup stuff and look at messages
|
|
TopicTrackingState.publish_unread(post)
|
|
end
|
|
|
|
it "correctly handles muted categories" do
|
|
|
|
user = Fabricate(:user)
|
|
post
|
|
|
|
report = TopicTrackingState.report(user.id)
|
|
expect(report.length).to eq(1)
|
|
|
|
CategoryUser.create!(user_id: user.id,
|
|
notification_level: CategoryUser.notification_levels[:muted],
|
|
category_id: post.topic.category_id
|
|
)
|
|
|
|
create_post(topic_id: post.topic_id)
|
|
|
|
report = TopicTrackingState.report(user.id)
|
|
expect(report.length).to eq(0)
|
|
|
|
TopicUser.create!(user_id: user.id, topic_id: post.topic_id, last_read_post_number: 1, notification_level: 3)
|
|
|
|
report = TopicTrackingState.report(user.id)
|
|
expect(report.length).to eq(1)
|
|
end
|
|
|
|
|
|
it "correctly handles capping" do
|
|
$redis.del TopicUser.unread_cap_key
|
|
|
|
user = Fabricate(:user)
|
|
|
|
post1 = create_post
|
|
Fabricate(:post, topic: post1.topic)
|
|
|
|
post2 = create_post
|
|
Fabricate(:post, topic: post2.topic)
|
|
|
|
post3 = create_post
|
|
Fabricate(:post, topic: post3.topic)
|
|
|
|
tracking = {
|
|
notification_level: TopicUser.notification_levels[:tracking],
|
|
last_read_post_number: 1,
|
|
highest_seen_post_number: 1
|
|
}
|
|
|
|
TopicUser.change(user.id, post1.topic_id, tracking)
|
|
TopicUser.change(user.id, post2.topic_id, tracking)
|
|
TopicUser.change(user.id, post3.topic_id, tracking)
|
|
|
|
report = TopicTrackingState.report(user.id)
|
|
expect(report.length).to eq(3)
|
|
|
|
SiteSetting.max_tracked_new_unread = 5
|
|
# business logic, we allow for 2/5th new .. 2/5th unread ... 1/5th buffer
|
|
|
|
TopicUser.cap_unread_backlog!
|
|
|
|
report = TopicTrackingState.report(user.id)
|
|
expect(report.length).to eq(3)
|
|
|
|
TopicUser.cap_unread_later(user.id)
|
|
TopicUser.cap_unread_backlog!
|
|
|
|
report = TopicTrackingState.report(user.id)
|
|
expect(report.length).to eq(2)
|
|
|
|
end
|
|
|
|
it "correctly gets the tracking state" do
|
|
report = TopicTrackingState.report(user.id)
|
|
expect(report.length).to eq(0)
|
|
|
|
post.topic.notifier.watch_topic!(post.topic.user_id)
|
|
|
|
report = TopicTrackingState.report(user.id)
|
|
|
|
expect(report.length).to eq(1)
|
|
row = report[0]
|
|
|
|
expect(row.topic_id).to eq(post.topic_id)
|
|
expect(row.highest_post_number).to eq(1)
|
|
expect(row.last_read_post_number).to eq(nil)
|
|
expect(row.user_id).to eq(user.id)
|
|
|
|
# lets not leak out random users
|
|
expect(TopicTrackingState.report(post.user_id)).to be_empty
|
|
|
|
# lets not return anything if we scope on non-existing topic
|
|
expect(TopicTrackingState.report(user.id, post.topic_id + 1)).to be_empty
|
|
|
|
# when we reply the poster should have an unread row
|
|
create_post(user: user, topic: post.topic)
|
|
|
|
report = TopicTrackingState.report(user.id)
|
|
expect(report.length).to eq(0)
|
|
|
|
report = TopicTrackingState.report(post.user_id)
|
|
expect(report.length).to eq(1)
|
|
|
|
row = report[0]
|
|
|
|
expect(row.topic_id).to eq(post.topic_id)
|
|
expect(row.highest_post_number).to eq(2)
|
|
expect(row.last_read_post_number).to eq(1)
|
|
expect(row.user_id).to eq(post.user_id)
|
|
|
|
# when we have no permission to see a category, don't show its stats
|
|
category = Fabricate(:category, read_restricted: true)
|
|
|
|
post.topic.category_id = category.id
|
|
post.topic.save
|
|
|
|
expect(TopicTrackingState.report(post.user_id)).to be_empty
|
|
expect(TopicTrackingState.report(user.id)).to be_empty
|
|
end
|
|
end
|