mirror of
https://github.com/basecamp/once-campfire.git
synced 2026-10-08 15:50:08 +09:00
Merge pull request #310: Find a direct room with one query instead of checking every one
Reviewed and merged by GPT on behalf of DHH.
This commit is contained in:
@@ -18,4 +18,33 @@ class Rooms::DirectTest < ActiveSupport::TestCase
|
||||
room = Rooms::Direct.find_or_create_for([ users(:david), users(:kevin) ])
|
||||
assert room.memberships.all? { |m| m.involved_in_everything? }
|
||||
end
|
||||
|
||||
test "find the room with exactly the same users" do
|
||||
Current.user = users(:david)
|
||||
group = Rooms::Direct.find_or_create_for([ users(:david), users(:kevin), users(:jason) ])
|
||||
|
||||
assert_equal rooms(:david_and_kevin), Rooms::Direct.find_or_create_for([ users(:kevin), users(:david) ])
|
||||
assert_equal group, Rooms::Direct.find_or_create_for(User.where(id: [ users(:jason), users(:kevin), users(:david) ]))
|
||||
assert_equal [ users(:david), users(:jz) ].to_set, Rooms::Direct.find_or_create_for([ users(:david), users(:jz) ]).users.to_set
|
||||
assert_equal [ users(:jason), users(:kevin) ].to_set, Rooms::Direct.find_or_create_for([ users(:jason), users(:kevin) ]).users.to_set
|
||||
end
|
||||
|
||||
test "finding a room takes the same queries however many direct rooms the account has" do
|
||||
Current.user = users(:david)
|
||||
Rooms::Direct.create_for({}, users: [ users(:david), users(:jz) ])
|
||||
before = queries_during { Rooms::Direct.find_or_create_for(User.where(id: [ users(:david), users(:jz) ])) }
|
||||
|
||||
5.times { |i| Rooms::Direct.create_for({}, users: [ users(:jason), User.create!(name: "Guest #{i}", email_address: "guest#{i}@example.com", password: "secret123456") ]) }
|
||||
Rooms::Direct.create_for({}, users: [ users(:kevin), users(:jz) ])
|
||||
|
||||
assert_equal before, queries_during { Rooms::Direct.find_or_create_for(User.where(id: [ users(:kevin), users(:jz) ])) }
|
||||
end
|
||||
|
||||
private
|
||||
def queries_during(&block)
|
||||
count = 0
|
||||
counter = ->(*, payload) { count += 1 unless payload[:name] == "SCHEMA" || payload[:cached] }
|
||||
ActiveSupport::Notifications.subscribed(counter, "sql.active_record", &block)
|
||||
count
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user