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

Add specs to check how paranoia and globalize work together
Add specs to check how paranoia and globalize work together

Create shared model spec to test paranoia and globalize behavior on
globalizable and paranoid models.
