Skip to content

Commit

Permalink
Merge pull request #3482 from samvera/never-rollback-actor-stack
Browse files Browse the repository at this point in the history
Remove `Hyrax::Actors::TransactionalRequest` from default middleware
  • Loading branch information
jeremyf authored Jan 29, 2019
2 parents ea11cbf + 818ca18 commit 355770a
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 7 deletions.
4 changes: 0 additions & 4 deletions app/services/hyrax/default_middleware_stack.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,6 @@ class DefaultMiddlewareStack
# rubocop:disable Metrics/MethodLength
def self.build_stack
ActionDispatch::MiddlewareStack.new.tap do |middleware|
# Wrap everything in a database transaction, if the save of the resource
# fails then roll back any database AdminSetChangeSet
middleware.use Hyrax::Actors::TransactionalRequest

# Ensure you are mutating the most recent version
middleware.use Hyrax::Actors::OptimisticLockValidator

Expand Down
48 changes: 48 additions & 0 deletions spec/features/actor_stack_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
require 'rails_helper'

# Integration tests for the full midddleware stack
RSpec.describe Hyrax::DefaultMiddlewareStack, :clean_repo do
subject(:actor) { stack.build(Hyrax::Actors::Terminator.new) }
let(:ability) { ::Ability.new(user) }
let(:attributes) { {} }
let(:stack) { described_class.build_stack }
let(:terminator) { Hyrax::Actors::Terminator.new }
let(:user) { FactoryBot.create(:user) }
let(:work) { FactoryBot.build(:work) }
let(:env) { Hyrax::Actors::Environment.new(work, ability, attributes) }

let(:delayed_failure_actor) do
Class.new(Hyrax::Actors::AbstractActor) do
def create(env)
next_actor.create(env) && raise('ALWAYS RAISE')
end
end
end

describe '#create' do
it 'persists the work' do
expect { actor.create(env) }
.to change { work.persisted? }
.to true
end

context 'when failing on the way back up the actor stack' do
before { stack.insert_before(Hyrax::Actors::ModelActor, delayed_failure_actor) }

before(:context) do
Hyrax.config.enable_noids = true
# we need to mint once to set the `rand` database column and
# make minter behavior predictable
::Noid::Rails.config.minter_class.new.mint
end

after(:context) { Hyrax.config.enable_noids = false }

it 'leaves a valid minter state', :aggregate_failures do
expect { actor.create(env) }.to raise_error 'ALWAYS RAISE'

expect(GenericWork.new.assign_id).not_to eq work.id
end
end
end
end
2 changes: 1 addition & 1 deletion spec/services/hyrax/curation_concern_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
describe ".actor" do
subject { described_class.actor }

it { is_expected.to be_kind_of Hyrax::Actors::TransactionalRequest }
it { is_expected.to be_kind_of Hyrax::Actors::AbstractActor }
end

describe ".actor_factory" do
Expand Down
3 changes: 1 addition & 2 deletions spec/services/hyrax/default_middleware_stack_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

it "has the correct stack frames" do
expect(subject.middlewares).to eq [
Hyrax::Actors::TransactionalRequest,
Hyrax::Actors::OptimisticLockValidator,
Hyrax::Actors::CreateWithRemoteFilesActor,
Hyrax::Actors::CreateWithFilesActor,
Expand All @@ -30,7 +29,7 @@

describe 'Hyrax::CurationConcern.actor' do
it "calls the Hyrax::ActorFactory" do
expect(Hyrax::CurationConcern.actor).to be_instance_of Hyrax::Actors::TransactionalRequest
expect(Hyrax::CurationConcern.actor).to be_instance_of Hyrax::Actors::OptimisticLockValidator
end
end
end

0 comments on commit 355770a

Please sign in to comment.