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 "is hidden after parent resource destroy" do
      resource.destroy!
      resource.reload

      expect(resource.translations.with_deleted.first.hidden_at).not_to be_blank
    end

    it "is 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 do
        resource.restore(recursive: true)
      end.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
