docbrown/spec/services/badges/award_first_post_spec.rb
2024-02-09 12:20:14 -05:00

66 lines
2 KiB
Ruby

require "rails_helper"
RSpec.describe Badges::AwardFirstPost do
describe ".call" do
before do
create(:badge, title: "Writing Debut")
end
after do
Timecop.return
end
context "when the article is created outside the award window" do
it "does not award the badge for an article created more than a week ago" do
Timecop.freeze(2.weeks.ago) do
create(:article)
end
Timecop.return
expect { described_class.call }.not_to change(BadgeAchievement, :count)
end
it "does not award the badge for an article created less than an hour ago" do
create(:article)
expect { described_class.call }.not_to change(BadgeAchievement, :count)
end
end
context "when the article is created within the award window" do
it "awards the badge" do
Timecop.freeze(2.days.ago) do
create(:article, user: create(:user))
end
Timecop.return
expect { described_class.call }.to change(BadgeAchievement, :count).by(1)
end
it "does not award the badge if the article score is less than zero" do
Timecop.freeze(2.days.ago) do
create(:article, user: create(:user), score: -1)
end
Timecop.return
expect { described_class.call }.not_to change(BadgeAchievement, :count)
end
end
context "when the user has a spam or suspended role" do
it "does not award the badge to a spam user" do
user = create(:user).tap { |u| u.add_role(:spam) }
Timecop.freeze(2.days.ago) do
create(:article, user: user)
end
Timecop.return
expect { described_class.call }.not_to change(BadgeAchievement, :count)
end
it "does not award the badge to a suspended user" do
user = create(:user).tap { |u| u.add_role(:suspended) }
Timecop.freeze(2.days.ago) do
create(:article, user: user)
end
Timecop.return
expect { described_class.call }.not_to change(BadgeAchievement, :count)
end
end
end
end