mirror of
https://github.com/basecamp/once-campfire.git
synced 2026-10-09 00:00:12 +09:00
32748e7fd6
Drop the explicit fixture list and prepend module. Override load_fixtures only long enough to ensure! + backfill after alphabetical fixture load. Move destructive trigger DDL into its own test file so parallel CI workers do not strip triggers from the counter examples. Co-authored-by: Thomas Klemm <github@tklemm.eu>
87 lines
2.8 KiB
Ruby
87 lines
2.8 KiB
Ruby
require "test_helper"
|
|
|
|
class Room::MessagesCountTest < ActiveSupport::TestCase
|
|
setup do
|
|
@room = rooms(:designers)
|
|
@other_room = rooms(:pets)
|
|
end
|
|
|
|
test "fixture rooms start with an accurate messages_count" do
|
|
[ rooms(:watercooler), rooms(:designers), rooms(:bender_and_kevin) ].each do |room|
|
|
assert_equal room.messages.count, room.messages_count, "#{room.name || room.id} fixture count"
|
|
end
|
|
end
|
|
|
|
test "ActiveRecord create and destroy adjust the counter once" do
|
|
assert_difference -> { @room.reload.messages_count }, +1 do
|
|
assert_difference -> { @room.messages.count }, +1 do
|
|
@room.messages.create!(creator: users(:jason), body: "Hello", client_message_id: "count-ar-create")
|
|
end
|
|
end
|
|
|
|
assert_equal @room.messages.count, @room.reload.messages_count
|
|
|
|
assert_difference -> { @room.reload.messages_count }, -1 do
|
|
assert_difference -> { @room.messages.count }, -1 do
|
|
@room.messages.order(:id).last.destroy
|
|
end
|
|
end
|
|
|
|
assert_equal @room.messages.count, @room.reload.messages_count
|
|
end
|
|
|
|
test "bulk insert_all and delete_all keep the counter in step" do
|
|
rows = Array.new(3) do |i|
|
|
{
|
|
room_id: @room.id,
|
|
creator_id: users(:david).id,
|
|
client_message_id: "count-bulk-#{i}",
|
|
created_at: Time.current,
|
|
updated_at: Time.current
|
|
}
|
|
end
|
|
|
|
assert_difference -> { @room.reload.messages_count }, +3 do
|
|
Message.insert_all!(rows)
|
|
end
|
|
|
|
assert_equal @room.messages.count, @room.reload.messages_count
|
|
|
|
assert_difference -> { @room.reload.messages_count }, -3 do
|
|
@room.messages.where(client_message_id: rows.map { it[:client_message_id] }).delete_all
|
|
end
|
|
|
|
assert_equal @room.messages.count, @room.reload.messages_count
|
|
end
|
|
|
|
test "rolled back writes leave the counter unchanged" do
|
|
before = @room.reload.messages_count
|
|
|
|
Message.transaction do
|
|
@room.messages.create!(creator: users(:jason), body: "Nope", client_message_id: "count-rollback")
|
|
raise ActiveRecord::Rollback
|
|
end
|
|
|
|
assert_equal before, @room.reload.messages_count
|
|
assert_nil Message.find_by(client_message_id: "count-rollback")
|
|
end
|
|
|
|
test "moving a message between rooms moves the counter" do
|
|
message = @room.messages.create!(creator: users(:jason), body: "Move me", client_message_id: "count-move")
|
|
|
|
assert_difference -> { @room.reload.messages_count }, -1 do
|
|
assert_difference -> { @other_room.reload.messages_count }, +1 do
|
|
message.update!(room: @other_room)
|
|
end
|
|
end
|
|
|
|
assert_equal @room.messages.count, @room.reload.messages_count
|
|
assert_equal @other_room.messages.count, @other_room.reload.messages_count
|
|
end
|
|
|
|
test "Message does not declare an ActiveRecord counter_cache" do
|
|
reflection = Message.reflect_on_association(:room)
|
|
assert_not reflection.counter_cache_column
|
|
end
|
|
end
|