diff --git a/spec/shared/models/acts_as_paranoid.rb b/spec/shared/models/acts_as_paranoid.rb new file mode 100644 index 000000000..ee88d13a8 --- /dev/null +++ b/spec/shared/models/acts_as_paranoid.rb @@ -0,0 +1,65 @@ +shared_examples "acts as paranoid" do |factory_name| + let!(:resource) { create(factory_name) } + + it "#{described_class} can be recovered after soft deletion" do + resource.destroy + resource.reload + + expect(resource.hidden_at).not_to be_blank + resource.restore! + resource.reload + + expect(resource.hidden_at).to be_blank + end + + describe "#{described_class} translations" do + + it "should be hidden after parent resource destroy" do + resource.destroy + resource.reload + + expect(resource.translations.with_deleted.first.hidden_at).not_to be_blank + end + + it "should be destroyed after parent resource really_destroy" do + expect{ resource.really_destroy! }.to change { resource.translations.with_deleted.count }.from(1).to(0) + end + + it "cannot be recovered through non recursive restore" do + resource.destroy + resource.reload + + expect{ resource.restore }.not_to change { resource.translations.with_deleted.first.hidden_at } + end + + it "can be recovered through recursive restore after non-recursive restore" do + resource.destroy + resource.restore + resource.destroy + resource.reload + + expect{ resource.restore(recursive: true) }.to change { resource.translations.with_deleted.first.hidden_at } + end + + it "can be recovered after soft deletion through recursive restore" do + original_translation = resource.translations.first + new_translation = resource.translations.build + described_class.translated_attribute_names.each do |translated_attribute_name| + new_translation.send("#{translated_attribute_name}=", original_translation.send(translated_attribute_name)) + end + new_translation.locale = :fr + new_translation.save + + expect(resource.translations.with_deleted.count).to eq(2) + resource.destroy + resource.reload + expect(resource.translations.with_deleted.count).to eq(2) + expect(resource.translations.with_deleted.first.hidden_at).not_to be_blank + expect(resource.translations.with_deleted.second.hidden_at).not_to be_blank + resource.restore!(recursive: true) + resource.reload + expect(resource.translations.with_deleted.first.hidden_at).to be_blank + expect(resource.translations.with_deleted.second.hidden_at).to be_blank + end + end +end