mirror of
https://github.com/aasm/aasm
synced 2023-03-27 23:22:41 -04:00
95 lines
2.7 KiB
Ruby
95 lines
2.7 KiB
Ruby
require 'spec_helper'
|
|
|
|
describe AASM::Core::Invokers::ClassInvoker do
|
|
let(:target) { Class.new { def call; end } }
|
|
let(:record) { double }
|
|
let(:args) { [] }
|
|
|
|
subject { described_class.new(target, record, args) }
|
|
|
|
describe '#may_invoke?' do
|
|
context 'when subject is a Class and responds to #call' do
|
|
it 'then returns "true"' do
|
|
expect(subject.may_invoke?).to eq(true)
|
|
end
|
|
end
|
|
|
|
context 'when subject is not a class or not respond to #call' do
|
|
let(:target) { Class.new {} }
|
|
|
|
it 'then returns "false"' do
|
|
expect(subject.may_invoke?).to eq(false)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '#log_failure' do
|
|
context 'when subject respond to #source_location' do
|
|
it 'then adds "source_location" to a failures buffer' do
|
|
subject.log_failure
|
|
|
|
expect(subject.failures)
|
|
.to eq([target.instance_method(:call).source_location.join('#')])
|
|
end
|
|
end
|
|
|
|
context 'when subject does not respond to #source_location' do
|
|
before do
|
|
Method.__send__(:alias_method, :original_source_location, :source_location)
|
|
Method.__send__(:undef_method, :source_location)
|
|
end
|
|
|
|
after do
|
|
Method.__send__(
|
|
:define_method,
|
|
:source_location,
|
|
Method.instance_method(:original_source_location)
|
|
)
|
|
end
|
|
|
|
it 'then adds the subject to a failures buffer' do
|
|
subject.log_failure
|
|
|
|
expect(subject.failures.first).to be_a(Method)
|
|
end
|
|
end
|
|
end
|
|
|
|
describe '#invoke_subject' do
|
|
context 'when passing no arguments' do
|
|
let(:args) { [1, 2 ,3] }
|
|
let(:target) { Class.new { def call; end } }
|
|
|
|
it 'then correctly uses passed arguments' do
|
|
expect { subject.invoke_subject }.not_to raise_error
|
|
end
|
|
end
|
|
|
|
context 'when passing single argument' do
|
|
let(:args) { [1, 2 ,3, 4, 5, 6] }
|
|
let(:target) { Class.new { def initialize(_a); end; def call; end } }
|
|
|
|
it 'then correctly uses passed arguments' do
|
|
expect { subject.invoke_subject }.not_to raise_error
|
|
end
|
|
end
|
|
|
|
context 'when passing variable number arguments' do
|
|
let(:args) { [1, 2 ,3, 4, 5, 6] }
|
|
let(:target) { Class.new { def initialize(_a, _b, *_c); end; def call; end } }
|
|
|
|
it 'then correctly uses passed arguments' do
|
|
expect { subject.invoke_subject }.not_to raise_error
|
|
end
|
|
end
|
|
|
|
context 'when passing one or more arguments' do
|
|
let(:args) { [1, 2 ,3, 4, 5, 6] }
|
|
let(:target) { Class.new { def initialize(_a, _b, _c); end; def call; end } }
|
|
|
|
it 'then correctly uses passed arguments' do
|
|
expect { subject.invoke_subject }.not_to raise_error
|
|
end
|
|
end
|
|
end
|
|
end
|