mirror of
https://github.com/discourse/discourse.git
synced 2024-11-24 03:08:35 +08:00
6d72c8ab19
This PR revamps the topic timer UI, using the time shortcut selector from the bookmark modal. * Fixes an issue where the duration of hours/days after last reply or auto delete replies was not enforced to be > 0 * Fixed an issue where the timer dropdown options were not reloaded correctly if the topic status changes in the background (use `MessageBus` to publish topic state in the open/close timer jobs) * Moved the duration input and the "based on last post" option from the `future-date-input` component, as it was only used for topic timers. Also moved out the notice that is displayed which was also only relevant for topic timers.
108 lines
3.0 KiB
Ruby
108 lines
3.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'rails_helper'
|
|
|
|
describe Jobs::CloseTopic do
|
|
fab!(:admin) { Fabricate(:admin) }
|
|
|
|
fab!(:topic) do
|
|
Fabricate(:topic_timer, user: admin).topic
|
|
end
|
|
|
|
it 'should be able to close a topic' do
|
|
freeze_time(61.minutes.from_now) do
|
|
described_class.new.execute(
|
|
topic_timer_id: topic.public_topic_timer.id,
|
|
state: true
|
|
)
|
|
|
|
expect(topic.reload.closed).to eq(true)
|
|
|
|
expect(Post.last.raw).to eq(I18n.t(
|
|
'topic_statuses.autoclosed_enabled_minutes', count: 61
|
|
))
|
|
end
|
|
end
|
|
|
|
it "publishes to the topic message bus so the topic status reloads" do
|
|
MessageBus.expects(:publish).at_least_once
|
|
MessageBus.expects(:publish).with("/topic/#{topic.id}", reload_topic: true).once
|
|
freeze_time(61.minutes.from_now) do
|
|
described_class.new.execute(topic_timer_id: topic.public_topic_timer.id)
|
|
end
|
|
end
|
|
|
|
describe 'when trying to close a topic that has already been closed' do
|
|
it 'should delete the topic timer' do
|
|
freeze_time(topic.public_topic_timer.execute_at + 1.minute)
|
|
|
|
topic.update!(closed: true)
|
|
|
|
expect do
|
|
described_class.new.execute(
|
|
topic_timer_id: topic.public_topic_timer.id,
|
|
state: true
|
|
)
|
|
end.to change { TopicTimer.exists?(topic_id: topic.id) }.from(true).to(false)
|
|
end
|
|
end
|
|
|
|
describe 'when trying to close a topic that has been deleted' do
|
|
it 'should delete the topic timer' do
|
|
freeze_time(topic.public_topic_timer.execute_at + 1.minute)
|
|
|
|
topic.trash!
|
|
|
|
expect do
|
|
described_class.new.execute(
|
|
topic_timer_id: topic.public_topic_timer.id,
|
|
state: true
|
|
)
|
|
end.to change { TopicTimer.exists?(topic_id: topic.id) }.from(true).to(false)
|
|
end
|
|
end
|
|
|
|
describe 'when user is no longer authorized to close topics' do
|
|
fab!(:user) { Fabricate(:user) }
|
|
|
|
fab!(:topic) do
|
|
Fabricate(:topic_timer, user: user).topic
|
|
end
|
|
|
|
it 'should destroy the topic timer' do
|
|
freeze_time(topic.public_topic_timer.execute_at + 1.minute)
|
|
|
|
expect do
|
|
described_class.new.execute(
|
|
topic_timer_id: topic.public_topic_timer.id,
|
|
state: true
|
|
)
|
|
end.to change { TopicTimer.exists?(topic_id: topic.id) }.from(true).to(false)
|
|
|
|
expect(topic.reload.closed).to eq(false)
|
|
end
|
|
|
|
it "should reconfigure topic timer if category's topics are set to autoclose" do
|
|
category = Fabricate(:category,
|
|
auto_close_based_on_last_post: true,
|
|
auto_close_hours: 5
|
|
)
|
|
|
|
topic = Fabricate(:topic, category: category)
|
|
topic.public_topic_timer.update!(user: user)
|
|
|
|
freeze_time(topic.public_topic_timer.execute_at + 1.minute)
|
|
|
|
expect do
|
|
described_class.new.execute(
|
|
topic_timer_id: topic.public_topic_timer.id,
|
|
state: true
|
|
)
|
|
end.to change { topic.reload.public_topic_timer.user }.from(user).to(Discourse.system_user)
|
|
.and change { topic.public_topic_timer.id }
|
|
|
|
expect(topic.reload.closed).to eq(false)
|
|
end
|
|
end
|
|
end
|