Testing Enum Version Tracking Functionality in PaperTrail
This test suite validates the PaperTrail gem’s handling of enum values in model versioning, focusing on the PostWithStatus model. It ensures proper version tracking for enum state changes and compatibility with different PaperTrail versions.
Test Coverage Overview
Implementation Analysis
Technical Details
Best Practices Demonstrated
paper-trail-gem/paper_trail
spec/models/post_with_status_spec.rb
# frozen_string_literal: true
require "spec_helper"
RSpec.describe PostWithStatus, type: :model do
with_versioning do
let(:post) { described_class.create!(status: "draft") }
it "saves the enum value in versions" do
post.published!
post.archived!
expect(post.paper_trail.previous_version.published?).to be true
end
it "can read enums in version records written by PT 4" do
post = described_class.create(status: "draft")
post.published!
version = post.versions.last
# Simulate behavior PT 4, which used to save the string version of
# enums to `object_changes`
version.update(object_changes: "---\nid:\n- \n- 1\nstatus:\n- draft\n- published\n")
assert_equal %w[draft published], version.changeset["status"]
end
context "when storing enum object_changes" do
it "saves the enum value properly in versions object_changes" do
post.published!
post.archived!
post_version = post.versions.last
expect(post_version.changeset["status"]).to eql(%w[published archived])
end
end
describe "#save_with_version" do
context "when passing *args" do
it "passes *args down correctly" do
post = described_class.create(status: :draft)
expect do
post.paper_trail.save_with_version(validate: false)
end.to change(post.versions, :count).by(1)
end
end
it "preserves the enum value (and all other attributes)" do
post = described_class.create(status: :draft)
expect(post.versions.count).to eq(1)
expect(post.status).to eq("draft")
post.paper_trail.save_with_version
expect(post.versions.count).to eq(2)
expect(post.versions.last[:object]).to include("status: 0")
expect(post.paper_trail.previous_version.status).to eq("draft")
end
end
end
end