FIX: consider events without ends_at as expired on EOD (#485)

This commit is contained in:
Renato Atilio 2023-11-28 10:01:53 -03:00 committed by GitHub
parent 87793eac8d
commit e10339bc7b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 51 additions and 20 deletions

View File

@ -88,7 +88,7 @@ module DiscoursePostEvent
scope :visible, -> { where(deleted_at: nil) }
def expired?
!!(self.ends_at && Time.now > self.ends_at)
(ends_at || starts_at.end_of_day) <= Time.now
end
def starts_at
@ -128,11 +128,7 @@ module DiscoursePostEvent
if self.raw_invitees && self.raw_invitees.length > 10
errors.add(
:base,
I18n.t(
"discourse_post_event.errors.models.event.raw_invitees_length
",
count: 10,
),
I18n.t("discourse_post_event.errors.models.event.raw_invitees_length", count: 10),
)
end
end
@ -365,7 +361,7 @@ module DiscoursePostEvent
end
def calculate_next_date
if !original_ends_at || self.recurrence.blank? || original_starts_at > Time.current
if self.recurrence.blank? || original_starts_at > Time.current
return { starts_at: original_starts_at, ends_at: original_ends_at, rescheduled: false }
end
@ -401,8 +397,12 @@ module DiscoursePostEvent
next_starts_at = RRuleGenerator.generate(recurrence, localized_start, tzid: self.timezone)
if original_ends_at
difference = original_ends_at - original_starts_at
next_ends_at = next_starts_at + difference.seconds
else
next_ends_at = nil
end
{ starts_at: next_starts_at, ends_at: next_ends_at, rescheduled: true }
end

View File

@ -51,8 +51,7 @@ module DiscoursePostEvent
end
def ended?
return false if ends_at.nil?
ends_at <= Time.current
(ends_at || starts_at.end_of_day) <= Time.current
end
end
end

View File

@ -4,6 +4,7 @@ require "rails_helper"
describe DiscourseCalendar::MonitorEventDates do
fab!(:post_1) { Fabricate(:post) }
fab!(:post_2) { Fabricate(:post) }
fab!(:post_3) { Fabricate(:post) }
fab!(:past_event) do
Fabricate(
:event,
@ -24,6 +25,11 @@ describe DiscourseCalendar::MonitorEventDates do
end
let(:future_date) { future_event.event_dates.first }
fab!(:past_event_no_end_time) do
Fabricate(:event, post: post_3, original_starts_at: 7.days.after)
end
let(:past_date_no_end_time) { past_event_no_end_time.event_dates.first }
describe "#send_reminder" do
it "lodge reminder jobs in correct times" do
expect_not_enqueued_with(job: :discourse_post_event_send_reminder) do
@ -129,23 +135,39 @@ describe DiscourseCalendar::MonitorEventDates do
freeze_time 8.days.after
described_class.new.execute({})
future_date.reload
expect(future_date.finished_at).to eq(nil)
expect(past_event.event_dates.pending.count).to eq(0)
# expect(past_date.finished_at).not_to eq(nil)
past_date.reload
expect(past_date.finished_at).not_to eq(nil)
past_event_no_end_time.reload
expect(past_date_no_end_time.finished_at).not_to eq(nil)
end
it "creates new date for recurrent events" do
past_event.update!(recurrence: "every_week")
past_event_no_end_time.update!(recurrence: "every_week")
freeze_time 8.days.after
events = DiscourseEvent.track_events { described_class.new.execute({}) }
expect(future_date.finished_at).to eq(nil)
expect(past_event.event_dates.pending.count).to eq(1)
expect(past_event.event_dates.pending.first.starts_at.to_s).to eq(
(past_date.starts_at + 7.days).to_s,
)
expect(past_event_no_end_time.event_dates.pending.count).to eq(1)
expect(past_event_no_end_time.event_dates.pending.first.starts_at.to_s).to eq(
(past_date_no_end_time.starts_at + 7.days).to_s,
)
expect(events).to include(event_name: :discourse_post_event_event_ended, params: [past_event])
expect(events).to include(
event_name: :discourse_post_event_event_ended,
params: [past_event_no_end_time],
)
end
end

View File

@ -5,13 +5,17 @@ describe DiscoursePostEvent::EventDate do
let(:user) { Fabricate(:user, admin: true) }
let(:topic) { Fabricate(:topic, user: user) }
let!(:first_post) { Fabricate(:post, topic: topic) }
let(:second_post) { Fabricate(:post, topic: topic) }
let!(:starts_at) { "2020-04-24 14:15:00" }
let!(:ends_at) { "2020-04-24 16:15:00" }
let!(:alt_starts_at) { "2020-04-25 17:15:25" }
let!(:alt_ends_at) { "2020-04-25 19:15:25" }
let!(:second_post) { Fabricate(:post, topic: topic) }
let!(:starts_at) { "2020-04-24 08:15:00" }
let!(:starts_at_yesterday) { "2020-04-23 19:15:00" }
let!(:post_event) { Fabricate(:event, post: first_post, original_starts_at: starts_at) }
let!(:event_date) { Fabricate(:event_date, event: post_event) }
let!(:event_date) { Fabricate(:event_date, event: post_event, starts_at: starts_at) }
let!(:yesterday_post_event) do
Fabricate(:event, post: second_post, original_starts_at: starts_at_yesterday)
end
let!(:yesterday_event_date) do
Fabricate(:event_date, event: yesterday_post_event, starts_at: starts_at_yesterday)
end
before do
freeze_time DateTime.parse("2020-04-24 14:10")
@ -21,8 +25,14 @@ describe DiscoursePostEvent::EventDate do
end
describe "Event Date Ended?" do
it "returns false if no end time has been specified" do
context "with no end date time" do
it "returns false if started today" do
expect(event_date.ended?).to eq(false)
end
it "returns true if started before today" do
expect(yesterday_event_date.ended?).to eq(true)
end
end
end
end