2021-06-01 12:20:20 +00:00
|
|
|
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
|
|
|
|
2019-04-10 17:14:34 +00:00
|
|
|
require 'rails_helper'
|
|
|
|
|
|
|
|
RSpec.describe ApplicationHandleInfo do
|
|
|
|
describe '.use' do
|
|
|
|
it 'requires a block' do
|
2019-04-15 01:41:17 +00:00
|
|
|
expect { described_class.use('foo') }
|
2019-04-10 17:14:34 +00:00
|
|
|
.to raise_error(ArgumentError)
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'for a given starting ApplicationHandleInfo' do
|
2019-07-03 16:12:05 +00:00
|
|
|
# This `around` block is identical to ApplicationHandleInfo.use.
|
|
|
|
#
|
|
|
|
# Q: So why don't we just use it here to DRY things up?
|
|
|
|
# A: Because that's the method we're trying to test, dummy!
|
|
|
|
#
|
|
|
|
# Q: Why can't we do `before { ApplicationHandleInfo.current = 'foo' }` instead?
|
|
|
|
# A: Because that would change `ApplicationHandleInfo.current` for all subsequent specs.
|
|
|
|
# (RSpec uses database transactions to keep test environments clean,
|
|
|
|
# but `ApplicationHandleInfo.current` lives outside of the database.)
|
|
|
|
around do |example|
|
|
|
|
original = described_class.current
|
|
|
|
described_class.current = 'foo'
|
|
|
|
example.run
|
|
|
|
described_class.current = original
|
|
|
|
end
|
2019-04-10 17:14:34 +00:00
|
|
|
|
|
|
|
it 'runs the block using the given ApplicationHandleInfo' do
|
2019-04-15 01:41:17 +00:00
|
|
|
described_class.use('bar') do
|
|
|
|
expect(described_class.current).to eq('bar')
|
2019-04-10 17:14:34 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'resets ApplicationHandleInfo to its original value' do
|
2020-11-05 16:31:00 +00:00
|
|
|
described_class.use('bar') { nil }
|
2019-04-10 17:14:34 +00:00
|
|
|
|
2019-04-15 01:41:17 +00:00
|
|
|
expect(described_class.current).to eq('foo')
|
2019-04-10 17:14:34 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'when an error is raised in the given block' do
|
|
|
|
it 'does not rescue the error, and still resets ApplicationHandleInfo' do
|
2019-04-15 01:41:17 +00:00
|
|
|
expect { described_class.use('bar') { raise } }
|
2019-04-10 17:14:34 +00:00
|
|
|
.to raise_error(StandardError)
|
2019-07-03 16:12:05 +00:00
|
|
|
.and not_change(described_class, :current)
|
2019-04-10 17:14:34 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|