From 146743aca33a16e2369791545d07932e7c2b9f1e Mon Sep 17 00:00:00 2001 From: tom johnson Date: Thu, 7 May 2020 16:44:59 -0700 Subject: [PATCH] expand the `LeaseManager` interface to handle releasing leases --- app/services/hyrax/lease_manager.rb | 21 +++++++ spec/services/hyrax/lease_manager_spec.rb | 68 +++++++++++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/app/services/hyrax/lease_manager.rb b/app/services/hyrax/lease_manager.rb index 05692a5b80..97fbf6c8e1 100644 --- a/app/services/hyrax/lease_manager.rb +++ b/app/services/hyrax/lease_manager.rb @@ -62,12 +62,33 @@ def apply! apply || raise(NotEnforcableError) end + ## + # @return [Boolean] + def enforced? + lease.visibility_during_lease.to_s == resource.visibility + end + ## # @return [Hyrax::Lease] def lease resource.lease || Lease.new end + ## + # @return [Boolean] + def release + return false if under_lease? + return true if lease.visibility_after_lease.nil? + + resource.visibility = lease.visibility_after_lease + end + + ## + # @return [void] + def release! + release || raise(NotReleasableError) + end + ## # @return [Boolean] def under_lease? diff --git a/spec/services/hyrax/lease_manager_spec.rb b/spec/services/hyrax/lease_manager_spec.rb index a5e2c22e75..2d269370ef 100644 --- a/spec/services/hyrax/lease_manager_spec.rb +++ b/spec/services/hyrax/lease_manager_spec.rb @@ -44,6 +44,36 @@ end end + describe '#enforced' do + it { is_expected.not_to be_enforced } + + context 'when under lease' do + include_context 'when under lease' + + it { is_expected.not_to be_enforced } + + context 'and it is applied' do + before { manager.apply! } + + it { is_expected.to be_enforced } + end + end + + context 'with expired lease' do + include_context 'with expired lease' + + it { is_expected.not_to be_enforced } + end + + context 'with an lease that is in force, but expired' do + include_context 'with expired lease' + + before { resource.visibility = lease.visibility_during_lease } + + it { is_expected.to be_enforced } + end + end + describe '#lease' do it 'gives an inactive lease' do expect(manager.lease).not_to be_active @@ -66,6 +96,44 @@ end end + describe '#release' do + context 'with no lease' do + it 'is a no-op' do + expect { manager.release } + .not_to change { resource.visibility } + end + end + + context 'with expired lease' do + include_context 'with expired lease' + + it 'ensures the post-lease visibility is set' do + manager.release + expect(resource.visibility).to eq lease.visibility_after_lease + end + + context 'and lease was applied' do + before { resource.visibility = lease.visibility_during_lease } + + it 'ensures the post-lease visibility is set' do + expect { manager.release } + .to change { resource.visibility } + .from(lease.visibility_during_lease) + .to lease.visibility_after_lease + end + end + end + + context 'when under lease' do + include_context 'when under lease' + + it 'is a no-op' do + expect { manager.release } + .not_to change { resource.visibility } + end + end + end + describe '#under_lease?' do it { is_expected.not_to be_under_lease }