Skip to content

Commit

Permalink
Adjust digest rate if recent clicks tracked (#20838)
Browse files Browse the repository at this point in the history
* Adjust digest rate if recent clicks tracked

* Fix issues

* Fix issues

* Fix issues

* Fiddle with tests

* Fix syntax

* Fiddle with tests

* Fiddle with tests

* Fiddle with tests

* Fiddle with tests

* Fiddle with tests

* Fiddle with tests

* Fiddle with tests

* Remove .env.test symlink (#20839)

* Update the mdx vscode extension (#20840)

* Update @cypress/code-coverage to version 3.12.30 (#20803)

Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
Co-authored-by: Mac Siri <mac@forem.com>

* Update ruby VSCode extensions for debugging (#20816)

The 'rebornix.Ruby' extension is deprecated. I replaced with the
'Shopify.ruby-lsp' extension since VSCode's Ruby docs pointed
users to ruby-lsp, see https://code.visualstudio.com/docs/languages/ruby.

* Update esbuild to version 0.19.12 (#20841)

Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>

* Update eslint to version 8.57.0 (#20853)

Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>

* fix: remove listings option from views/dashboards/_actions_mobile.html.erb (#20849)

Co-authored-by: Mac Siri <mac@forem.com>

* Update eslint-import-resolver-webpack to version 0.13.8 (#20854)

Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>

* add timestamp to users roles table (#20844)

* Update eslint-plugin-import to version 2.29.1 (#20855)

Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>

* Adjust tests to account for clicks

* Adjust tests to account for clicks

---------

Co-authored-by: Mac Siri <mac@forem.com>
Co-authored-by: Meredith <meredith.edwards1771@gmail.com>
Co-authored-by: depfu[bot] <23717796+depfu[bot]@users.noreply.github.com>
Co-authored-by: Gabriel Quaresma <j.quaresmasantos_98@hotmail.com>
Co-authored-by: Philip How <philip.j.how@gmail.com>
  • Loading branch information
6 people committed Apr 10, 2024
1 parent 8884a64 commit 9b15329
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 3 deletions.
17 changes: 14 additions & 3 deletions app/services/email_digest_article_collector.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ class EmailDigestArticleCollector

ARTICLES_TO_SEND = "EmailDigestArticleCollector#articles_to_send".freeze
RESULTS_COUNT = 7 # Winner of digest_count_03_18 field test
CLICK_LOOKBACK = 30

def initialize(user)
@user = user
Expand Down Expand Up @@ -48,12 +49,22 @@ def articles_to_send
# rubocop:enable Metrics/BlockLength
end

private

def should_receive_email?
return true unless last_email_sent

last_email_sent.before? Settings::General.periodic_email_digest.days.ago
email_sent_within_lookback_period = last_email_sent >= Settings::General.periodic_email_digest.days.ago
return false if email_sent_within_lookback_period && !recent_tracked_click?

true
end

private

def recent_tracked_click?
@user.email_messages
.where(mailer: "DigestMailer#digest_email")
.where("sent_at > ?", CLICK_LOOKBACK.days.ago)
.where.not(clicked_at: nil).any?
end

def last_email_sent
Expand Down
63 changes: 63 additions & 0 deletions spec/services/email_digest_article_collector_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,67 @@
end
end
end

describe "#should_receive_email?" do
let(:user) { create(:user) }
let(:collector) { described_class.new(user) }

before do
Settings::General.periodic_email_digest = 3
end

context "when the user clicked the last email within the lookback period" do
it "returns true" do
Ahoy::Message.create(mailer: "DigestMailer#digest_email",
user_id: user.id, sent_at: 2.days.ago, clicked_at: 1.day.ago)
expect(collector.should_receive_email?).to be true
end
end

context "when the user has not received any emails" do
it "returns true" do
expect(collector.should_receive_email?).to be true
end
end

context "when the last email was received outside the periodic email digest days" do
it "returns true" do
Ahoy::Message.create(mailer: "DigestMailer#digest_email",
user_id: user.id, sent_at: 4.days.ago)
expect(collector.should_receive_email?).to be true
end
end

context "when the last email was received within the periodic email digest days without click" do
it "returns false" do
Ahoy::Message.create(mailer: "DigestMailer#digest_email",
user_id: user.id, sent_at: 2.days.ago)
expect(collector.should_receive_email?).to be false
end
end

context "when the last email was received just before the periodic email digest days limit" do
it "returns true" do
Ahoy::Message.create(mailer: "DigestMailer#digest_email",
user_id: user.id, sent_at: 3.days.ago)
expect(collector.should_receive_email?).to be true
end
end

context "when the last email was clicked but outside the lookback period" do
it "returns true" do
Ahoy::Message.create(mailer: "DigestMailer#digest_email",
user_id: user.id, sent_at: 33.days.ago, clicked_at: 32.days.ago)
expect(collector.should_receive_email?).to be true
end

it "returns false when there is a sent at within the thredhold" do
Ahoy::Message.create(mailer: "DigestMailer#digest_email",
user_id: user.id, sent_at: 33.days.ago, clicked_at: 32.days.ago)
Ahoy::Message.create(mailer: "DigestMailer#digest_email",
user_id: user.id, sent_at: 2.days.ago)
expect(collector.should_receive_email?).to be false
end
end
end
end

0 comments on commit 9b15329

Please sign in to comment.