Files
fizzy/test/models/card/activity_spike/detector_test.rb
T
Mike Dalessio 1bbb6d0c03 Fix race condition in Card::ActivitySpike::DetectionJob
The check-then-act pattern in `register_activity_spike` has been
replaced with `find_or_create_by!` to eliminate the race condition
that could lead to creating multiple activity spikes for a card. To
support this change, the `card_id` index on `cards_activity_spikes`
has been made unique.

ref: https://app.fizzy.do/5986089/cards/3063
2025-11-20 15:40:42 -05:00

66 lines
1.6 KiB
Ruby

require "test_helper"
class Card::ActivitySpike::DetectorTest < ActiveSupport::TestCase
include CardActivityTestHelper
setup do
Current.session = sessions(:david)
@card = cards(:logo)
end
test "detect multiple people commenting" do
assert_activity_spike_detected do
multiple_people_comment_on(@card)
end
end
test "detect assignments" do
assert_activity_spike_detected do
@card.toggle_assignment users(:kevin)
end
end
test "detect reopened cards" do
assert_activity_spike_detected(card: cards(:shipping)) do
cards(:shipping).reopen
end
end
test "refresh the activity spike on new spikes" do
multiple_people_comment_on(@card)
@card = Card.find(@card.id)
original_last_spike_at = @card.activity_spike.updated_at
travel 2.months
multiple_people_comment_on(@card.reload)
assert @card.reload.activity_spike.updated_at > original_last_spike_at
end
test "concurrent spike creation should not create multiple spikes for a card" do
multiple_people_comment_on(@card)
@card.activity_spike&.destroy
5.times.map do
Thread.new do
ActiveRecord::Base.connection_pool.with_connection do
Card.find(@card.id).detect_activity_spikes
end
end
end.each(&:join)
assert_equal 1, Card::ActivitySpike.where(card: @card).count
end
private
def assert_activity_spike_detected(card: @card)
assert card.activity_spike.blank?
perform_enqueued_jobs only: Card::ActivitySpike::DetectionJob do
yield
end
assert card.reload.activity_spike.present?
end
end