Sha256: 4a4c014bb716e5de771fd94af2e25d9a6df469ea9a1f2bb811311121bf238e9d

Contents?: true

Size: 1.91 KB

Versions: 4

Compression:

Stored size: 1.91 KB

Contents

require "rails_helper"

module PaperTrail
  RSpec.describe Cleaner, versioning: true do
    after do
      PaperTrail.config.version_limit = nil
    end

    it "cleans up old versions" do
      PaperTrail.config.version_limit = 10
      widget = Widget.create

      100.times do |i|
        widget.update_attributes(name: "Name #{i}")
        expect(Widget.find(widget.id).versions.count).to be <= 11
        # 11 versions = 10 updates + 1 create.
      end
    end

    it "deletes oldest versions, when the database returns them in a different order" do
      epoch = DateTime.new(2017, 1, 1)

      widget = Timecop.freeze(epoch) { Widget.create }

      # Sometimes a database will returns records in a different order than
      # they were inserted. That's hard to get the database to do, so we'll
      # just create them out-of-order:
      (1..5).to_a.shuffle.each do |n|
        Timecop.freeze(epoch + n.hours) do
          PaperTrail::Version.create!(
            item: widget,
            event: "update",
            object: { "id" => widget.id, "name" => "Name #{n}" }.to_yaml
          )
        end
      end
      expect(Widget.find(widget.id).versions.count).to eq(6) # 1 create + 5 updates

      # Now, we've recreated the scenario where we can accidentally clean up
      # the wrong versions. Re-enable the version_limit, and trigger the
      # clean-up:
      PaperTrail.config.version_limit = 3
      widget.versions.last.send(:enforce_version_limit!)

      # Verify that we have fewer versions:
      expect(widget.reload.versions.count).to eq(4) # 1 create + 4 updates

      # Exclude the create, because the create will return nil for `#reify`.
      last_names = widget.versions.not_creates.map(&:reify).map(&:name)
      expect(last_names).to eq(["Name 3", "Name 4", "Name 5"])
      # No matter what order the version records are returned it, we should
      # always keep the most-recent changes.
    end
  end
end

Version data entries

4 entries across 4 versions & 2 rubygems

Version Path
enju_leaf-1.2.1 vendor/bundle/ruby/2.3/gems/paper_trail-7.0.2/spec/paper_trail/version_limit_spec.rb
paper_trail-7.0.2 spec/paper_trail/version_limit_spec.rb
paper_trail-7.0.1 spec/paper_trail/version_limit_spec.rb
paper_trail-7.0.0 spec/paper_trail/version_limit_spec.rb