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

View File

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

View File

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

View File

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