mirror of
https://github.com/discourse/discourse.git
synced 2024-11-23 08:04:03 +08:00
7829558c6d
The bug was mentioned on meta: https://meta.discourse.org/t/pressing-dismiss-new-doesnt-clear-new-topics/179858 Problem is that sometimes the user has TopicUser records with `last_read_post_number` set as NULL. In that case, the topic is still "new" to them and should be dismissed when they click dismiss button. In addition, I added that condition to post_migration and bumped the number to fix existing records. Migration is written to be idempotent so it will make no harm to already deployed instances.
56 lines
2.2 KiB
Ruby
56 lines
2.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'rails_helper'
|
|
|
|
describe DismissTopics do
|
|
fab!(:user) { Fabricate(:user, created_at: 1.days.ago) }
|
|
fab!(:category) { Fabricate(:category) }
|
|
fab!(:topic1) { Fabricate(:topic, category: category, created_at: 60.minutes.ago) }
|
|
fab!(:topic2) { Fabricate(:topic, category: category, created_at: 120.minutes.ago) }
|
|
|
|
describe '#perform!' do
|
|
it 'dismisses two topics' do
|
|
expect { described_class.new(user, Topic.all).perform! }.to change { DismissedTopicUser.count }.by(2)
|
|
end
|
|
|
|
it 'returns dismissed topic ids' do
|
|
expect(described_class.new(user, Topic.all).perform!.sort).to eq([topic1.id, topic2.id])
|
|
end
|
|
|
|
it 'respects max_new_topics limit' do
|
|
SiteSetting.max_new_topics = 1
|
|
expect { described_class.new(user, Topic.all).perform! }.to change { DismissedTopicUser.count }.by(1)
|
|
|
|
dismissed_topic_user = DismissedTopicUser.last
|
|
|
|
expect(dismissed_topic_user.user_id).to eq(user.id)
|
|
expect(dismissed_topic_user.topic_id).to eq(topic1.id)
|
|
expect(dismissed_topic_user.created_at).not_to be_nil
|
|
end
|
|
|
|
it 'respects seen topics' do
|
|
Fabricate(:topic_user, user: user, topic: topic1, last_read_post_number: 1)
|
|
Fabricate(:topic_user, user: user, topic: topic2, last_read_post_number: 1)
|
|
expect { described_class.new(user, Topic.all).perform! }.to change { DismissedTopicUser.count }.by(0)
|
|
end
|
|
|
|
it 'dismisses when topic user without last_read_post_number' do
|
|
Fabricate(:topic_user, user: user, topic: topic1, last_read_post_number: nil)
|
|
Fabricate(:topic_user, user: user, topic: topic2, last_read_post_number: nil)
|
|
expect { described_class.new(user, Topic.all).perform! }.to change { DismissedTopicUser.count }.by(2)
|
|
end
|
|
|
|
it 'respects new_topic_duration_minutes' do
|
|
user.user_option.update!(new_topic_duration_minutes: 70)
|
|
|
|
expect { described_class.new(user, Topic.all).perform! }.to change { DismissedTopicUser.count }.by(1)
|
|
|
|
dismissed_topic_user = DismissedTopicUser.last
|
|
|
|
expect(dismissed_topic_user.user_id).to eq(user.id)
|
|
expect(dismissed_topic_user.topic_id).to eq(topic1.id)
|
|
expect(dismissed_topic_user.created_at).not_to be_nil
|
|
end
|
|
end
|
|
end
|