Skip to content

Commit e11f03b

Browse files
committed
WIP
1 parent d8a5df1 commit e11f03b

File tree

4 files changed

+61
-43
lines changed

4 files changed

+61
-43
lines changed

activerecord/lib/active_record/associations/association.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ def async_load_target
191191
@target = find_target(async: true) if (@stale_state && stale_target?) || find_target?
192192

193193
loaded! unless loaded?
194-
target
194+
@target
195195
end
196196

197197
# We can't dump @reflection and @through_reflection since it contains the scope proc

activerecord/test/cases/associations/belongs_to_associations_test.rb

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1843,19 +1843,35 @@ def test_destroy_linked_models
18431843
end
18441844

18451845
class AsyncBelongsToAssociationsTest < ActiveRecord::TestCase
1846+
include WaitForAsyncTestHelper
1847+
18461848
fixtures :companies
18471849

18481850
self.use_transactional_tests = false
18491851

18501852
def test_temp_async_load_belongs_to
1851-
# TODO: proper test?
18521853
client = Client.find(3)
18531854
first_firm = companies(:first_firm)
1854-
assert_queries_match(/LIMIT|ROWNUM <=|FETCH FIRST/) do
1855-
client.association(:firm).async_load_target
18561855

1856+
promise = client.association(:firm).async_load_target
1857+
wait_for_async_query
1858+
1859+
events = []
1860+
callback = -> (event) do
1861+
events << event unless event.payload[:name] == "SCHEMA"
1862+
end
1863+
ActiveSupport::Notifications.subscribed(callback, "sql.active_record") do
1864+
client.firm
1865+
end
1866+
1867+
assert_no_queries do
18571868
assert_equal first_firm, client.firm
18581869
assert_equal first_firm.name, client.firm.name
18591870
end
1871+
1872+
assert_equal 1, events.size
1873+
assert_equal true, events.first.payload[:async]
1874+
ensure
1875+
ActiveRecord::Base.logger = Logger.new(nil)
18601876
end
18611877
end

activerecord/test/cases/helper.rb

Lines changed: 41 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -40,36 +40,53 @@
4040
ActiveRecord::ConnectionAdapters.register("abstract", "ActiveRecord::ConnectionAdapters::AbstractAdapter", "active_record/connection_adapters/abstract_adapter")
4141
ActiveRecord::ConnectionAdapters.register("fake", "FakeActiveRecordAdapter", File.expand_path("../support/fake_adapter.rb", __dir__))
4242

43-
class SQLSubscriber
44-
attr_reader :logged
45-
attr_reader :payloads
43+
class ActiveRecord::TestCase
44+
class SQLSubscriber
45+
attr_reader :logged
46+
attr_reader :payloads
47+
48+
def initialize
49+
@logged = []
50+
@payloads = []
51+
end
52+
53+
def start(name, id, payload)
54+
@payloads << payload
55+
@logged << [payload[:sql].squish, payload[:name], payload[:binds]]
56+
end
4657

47-
def initialize
48-
@logged = []
49-
@payloads = []
58+
def finish(name, id, payload); end
5059
end
5160

52-
def start(name, id, payload)
53-
@payloads << payload
54-
@logged << [payload[:sql].squish, payload[:name], payload[:binds]]
61+
module InTimeZone
62+
private
63+
def in_time_zone(zone)
64+
old_zone = Time.zone
65+
old_tz = ActiveRecord::Base.time_zone_aware_attributes
66+
67+
Time.zone = zone ? ActiveSupport::TimeZone[zone] : nil
68+
ActiveRecord::Base.time_zone_aware_attributes = !zone.nil?
69+
yield
70+
ensure
71+
Time.zone = old_zone
72+
ActiveRecord::Base.time_zone_aware_attributes = old_tz
73+
end
5574
end
5675

57-
def finish(name, id, payload); end
58-
end
76+
module WaitForAsyncTestHelper
77+
private
78+
def wait_for_async_query(connection = ActiveRecord::Base.lease_connection, timeout: 5)
79+
return unless connection.async_enabled?
5980

60-
module InTimeZone
61-
private
62-
def in_time_zone(zone)
63-
old_zone = Time.zone
64-
old_tz = ActiveRecord::Base.time_zone_aware_attributes
65-
66-
Time.zone = zone ? ActiveSupport::TimeZone[zone] : nil
67-
ActiveRecord::Base.time_zone_aware_attributes = !zone.nil?
68-
yield
69-
ensure
70-
Time.zone = old_zone
71-
ActiveRecord::Base.time_zone_aware_attributes = old_tz
72-
end
81+
executor = connection.pool.async_executor
82+
(timeout * 100).times do
83+
return unless executor.scheduled_task_count > executor.completed_task_count
84+
sleep 0.01
85+
end
86+
87+
raise Timeout::Error, "The async executor wasn't drained after #{timeout} seconds"
88+
end
89+
end
7390
end
7491

7592
# Encryption

activerecord/test/cases/relation/load_async_test.rb

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,6 @@
77
require "models/other_dog"
88

99
module ActiveRecord
10-
module WaitForAsyncTestHelper
11-
private
12-
def wait_for_async_query(connection = ActiveRecord::Base.lease_connection, timeout: 5)
13-
return unless connection.async_enabled?
14-
15-
executor = connection.pool.async_executor
16-
(timeout * 100).times do
17-
return unless executor.scheduled_task_count > executor.completed_task_count
18-
sleep 0.01
19-
end
20-
21-
raise Timeout::Error, "The async executor wasn't drained after #{timeout} seconds"
22-
end
23-
end
24-
2510
class LoadAsyncTest < ActiveRecord::TestCase
2611
include WaitForAsyncTestHelper
2712

0 commit comments

Comments
 (0)