Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'spec/support/helpers/next_found_instance_of.rb')
-rw-r--r--spec/support/helpers/next_found_instance_of.rb32
1 files changed, 26 insertions, 6 deletions
diff --git a/spec/support/helpers/next_found_instance_of.rb b/spec/support/helpers/next_found_instance_of.rb
index c8cdbaf2c5d..c7079e64ffd 100644
--- a/spec/support/helpers/next_found_instance_of.rb
+++ b/spec/support/helpers/next_found_instance_of.rb
@@ -2,19 +2,36 @@
module NextFoundInstanceOf
ERROR_MESSAGE = 'NextFoundInstanceOf mock helpers can only be used with ActiveRecord targets'
+ HELPER_METHOD_PATTERN = /(?:allow|expect)_next_found_(?<number>\d+)_instances_of/.freeze
- def expect_next_found_instance_of(klass)
+ def method_missing(method_name, ...)
+ return super unless match_data = method_name.match(HELPER_METHOD_PATTERN)
+
+ helper_method = method_name.to_s.sub("_#{match_data[:number]}", '')
+
+ public_send(helper_method, *args, match_data[:number].to_i, &block)
+ end
+
+ def expect_next_found_instance_of(klass, &block)
+ expect_next_found_instances_of(klass, nil, &block)
+ end
+
+ def expect_next_found_instances_of(klass, number)
check_if_active_record!(klass)
- stub_allocate(expect(klass), klass) do |expectation|
+ stub_allocate(expect(klass), klass, number) do |expectation|
yield(expectation)
end
end
- def allow_next_found_instance_of(klass)
+ def allow_next_found_instance_of(klass, &block)
+ allow_next_found_instances_of(klass, nil, &block)
+ end
+
+ def allow_next_found_instances_of(klass, number)
check_if_active_record!(klass)
- stub_allocate(allow(klass), klass) do |allowance|
+ stub_allocate(allow(klass), klass, number) do |allowance|
yield(allowance)
end
end
@@ -25,8 +42,11 @@ module NextFoundInstanceOf
raise ArgumentError, ERROR_MESSAGE unless klass < ActiveRecord::Base
end
- def stub_allocate(target, klass)
- target.to receive(:allocate).and_wrap_original do |method|
+ def stub_allocate(target, klass, number)
+ stub = receive(:allocate)
+ stub.exactly(number).times if number
+
+ target.to stub.and_wrap_original do |method|
method.call.tap do |allocation|
# ActiveRecord::Core.allocate returns a frozen object:
# https://github.com/rails/rails/blob/291a3d2ef29a3842d1156ada7526f4ee60dd2b59/activerecord/lib/active_record/core.rb#L620