@@ -31,6 +31,13 @@ def count
3131 elements . each { |element | fulfill ( element , [ element ] ) }
3232 end
3333
34+ n1_optimized :sleepy do |elements |
35+ sleep ( 0.5 )
36+
37+ elements . first . class . perform!
38+ elements . each { |element | fulfill ( element , [ element ] ) }
39+ end
40+
3441 n1_optimized :custom , custom_loader
3542
3643 n1_optimized :single_optimized do
@@ -138,6 +145,42 @@ def perform(elements)
138145 end . not_to raise_error ( NoMethodError )
139146 end
140147
148+ describe "thread-safety" do
149+ it "is thread-safe" do
150+ N1Loader ::Preloader . new ( objects ) . preload ( :sleepy )
151+
152+ threads = [ ]
153+
154+ 10 . times do
155+ threads << Thread . new do
156+ objects . each do |obj |
157+ expect ( obj . sleepy ) . to eq ( [ obj ] )
158+ end
159+ end
160+ end
161+ threads . each ( &:join )
162+
163+ expect ( klass . count ) . to eq ( 1 )
164+ end
165+ end
166+
167+ describe "error handling" do
168+ it "raises the same error on the subsequent calls" do
169+ faulty_klass = Class . new do
170+ include N1Loader ::Loadable
171+
172+ n1_optimized :faulty do |_ |
173+ raise StandardError , "Something went wrong"
174+ end
175+ end
176+
177+ faulty_object = faulty_klass . new
178+
179+ expect { faulty_object . faulty } . to raise_error ( StandardError , "Something went wrong" )
180+ expect { faulty_object . faulty } . to raise_error ( StandardError , "Something went wrong" )
181+ end
182+ end
183+
141184 describe "loaded comparison" do
142185 it "compares by value" do
143186 instance = loader . new ( objects )
0 commit comments