diff options
| author | Robert | 2017-12-01 11:53:54 +0100 |
|---|---|---|
| committer | Robert | 2017-12-01 11:53:54 +0100 |
| commit | 25701bf9d5011b5f673b7ffa7a7f6b65e34c5111 (patch) | |
| tree | 99752cdf3a3ba33c883f65d19bce09c626dd21f6 | |
| parent | 544971cb286e29583ffc7e30f10ec46fe0293ba3 (diff) | |
| download | chouette-core-25701bf9d5011b5f673b7ffa7a7f6b65e34c5111.tar.bz2 | |
suggesting CR chages0000-cr-for-5024
| -rw-r--r-- | spec/models/referential/referential_lock_during_creation_spec.rb | 80 | ||||
| -rw-r--r-- | spec/models/referential_spec.rb | 80 |
2 files changed, 80 insertions, 80 deletions
diff --git a/spec/models/referential/referential_lock_during_creation_spec.rb b/spec/models/referential/referential_lock_during_creation_spec.rb new file mode 100644 index 000000000..ec2471015 --- /dev/null +++ b/spec/models/referential/referential_lock_during_creation_spec.rb @@ -0,0 +1,80 @@ +RSpec.describe Referential, type: :model do + + context "when two identical Referentials are created, only one is saved" do + let( :workbench ){ create :workbench } + + it "works synchronously" do + referential_1 = build( + :referential, + workbench: workbench, + organisation: workbench.organisation + ) + referential_2 = referential_1.dup + referential_2.slug = "#{referential_1.slug}_different" + + metadata_1 = build(:referential_metadata) + metadata_2 = metadata_1.dup + + referential_1.metadatas << metadata_1 + referential_2.metadatas << metadata_2 + + referential_1.save + referential_2.save + + expect(referential_1).to be_persisted + expect(referential_2).not_to be_persisted + end + + it "works asynchronously", truncation: true do + begin + referential_1 = build( + :referential, + workbench: workbench, + organisation: workbench.organisation + ) + referential_2 = referential_1.dup + referential_2.slug = "#{referential_1.slug}_different" + referential_3 = nil + + metadata_1 = build(:referential_metadata) + metadata_2 = metadata_1.dup + + referential_1.metadatas << metadata_1 + referential_2.metadatas << metadata_2 + + thread_1 = Thread.new do + ActiveRecord::Base.transaction do + # seize LOCK + referential_1.save + sleep 10 + # release LOCK + end + end + + thread_2 = Thread.new do + sleep 5 + ActiveRecord::Base.transaction do + # waits for LOCK, (because of sleep 5) + referential_2.save + # when lock was eventually obtained validation failed + referential_3 = create(:referential) + end + end + + thread_1.join + thread_2.join + + expect(referential_1).to be_persisted + expect(referential_2).not_to be_persisted + expect(referential_3).to be_persisted + ensure + Apartment::Tenant.drop(referential_1.slug) if referential_1.persisted? + Apartment::Tenant.drop(referential_2.slug) if referential_2.persisted? + + if referential_3.try(:persisted?) + Apartment::Tenant.drop(referential_3.slug) + end + end + end + end +end diff --git a/spec/models/referential_spec.rb b/spec/models/referential_spec.rb index 022ece7ef..7816e7232 100644 --- a/spec/models/referential_spec.rb +++ b/spec/models/referential_spec.rb @@ -1,5 +1,3 @@ -require 'spec_helper' - describe Referential, :type => :model do let(:ref) { create :workbench_referential, metadatas: [create(:referential_metadata)] } @@ -127,82 +125,4 @@ describe Referential, :type => :model do end end - context "when two identical Referentials are created, only one is saved" do - it "works synchronously" do - begin - workbench = create(:workbench) - referential_1 = build( - :referential, - workbench: workbench, - organisation: workbench.organisation - ) - referential_2 = referential_1.dup - referential_2.slug = "#{referential_1.slug}_different" - - metadata_1 = build(:referential_metadata) - metadata_2 = metadata_1.dup - - referential_1.metadatas << metadata_1 - referential_2.metadatas << metadata_2 - - referential_1.save - referential_2.save - - expect(referential_1).to be_persisted - expect(referential_2).not_to be_persisted - ensure - Apartment::Tenant.drop(referential_1.slug) if referential_1.persisted? - Apartment::Tenant.drop(referential_2.slug) if referential_2.persisted? - end - end - - it "works asynchronously", truncation: true do - begin - workbench = create(:workbench) - referential_1 = build( - :referential, - workbench: workbench, - organisation: workbench.organisation - ) - referential_2 = referential_1.dup - referential_2.slug = "#{referential_1.slug}_different" - referential_3 = nil - - metadata_1 = build(:referential_metadata) - metadata_2 = metadata_1.dup - - referential_1.metadatas << metadata_1 - referential_2.metadatas << metadata_2 - - thread_1 = Thread.new do - ActiveRecord::Base.transaction do - referential_1.save - sleep 10 - end - end - - thread_2 = Thread.new do - sleep 5 - ActiveRecord::Base.transaction do - referential_2.save - referential_3 = create(:referential) - end - end - - thread_1.join - thread_2.join - - expect(referential_1).to be_persisted - expect(referential_2).not_to be_persisted - expect(referential_3).to be_persisted - ensure - Apartment::Tenant.drop(referential_1.slug) if referential_1.persisted? - Apartment::Tenant.drop(referential_2.slug) if referential_2.persisted? - - if referential_3.try(:persisted?) - Apartment::Tenant.drop(referential_3.slug) - end - end - end - end end |
