Skip to content

Fix history pagination with paper_trail, specs #2054

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Aug 27, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ group :test do
gem 'rubocop', '>= 0.25'
gem 'simplecov', '>= 0.9', require: false
gem 'timecop', '>= 0.5'
gem 'paper_trail', '~> 3.0.3'
end

gemspec
11 changes: 9 additions & 2 deletions lib/rails_admin/extensions/paper_trail/auditing_adapter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -90,12 +90,19 @@ def listing_for_model_or_object(model, object, query, sort, sort_reverse, all, p

model_name = model.model.name

current_page = page.presence || '1'

versions = version_class_for(model_name).where item_type: model_name
versions = versions.where item_id: object.id if object
versions = versions.where('event LIKE ?', "%#{query}%") if query.present?
versions = versions.order(sort_reverse == 'true' ? "#{sort} DESC" : sort)
versions = all ? versions : versions.send(Kaminari.config.page_method_name, page.presence || '1').per(per_page)
versions.collect { |version| VersionProxy.new(version, @user_class) }
versions = all ? versions : versions.send(Kaminari.config.page_method_name, current_page).per(per_page)
paginated_proxies = Kaminari.paginate_array([], total_count: versions.total_count)
paginated_proxies = paginated_proxies.page(current_page).per(per_page)
versions.each do |version|
paginated_proxies << VersionProxy.new(version, @user_class)
end
paginated_proxies
end

def version_class_for(model_name)
Expand Down
1 change: 1 addition & 0 deletions spec/dummy_app/Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ gem 'dragonfly', '~> 1.0'
gem 'mini_magick', '>= 3.4'
gem 'mlb', '>= 0.7'
gem 'paperclip', '3.5.4'
gem 'paper_trail', '~> 3.0.3'
gem 'rails_admin', path: '../../'

# Gems used only for assets and not required
Expand Down
3 changes: 3 additions & 0 deletions spec/dummy_app/app/active_record/paper_trail_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class PaperTrailTest < ActiveRecord::Base
has_paper_trail
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
class CreatePaperTrailTests < ActiveRecord::Migration
def change
create_table :paper_trail_tests do |t|
t.string :name

t.timestamps
end
end
end
13 changes: 13 additions & 0 deletions spec/dummy_app/db/migrate/20140826093552_create_versions.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
class CreateVersions < ActiveRecord::Migration
def change
create_table :versions do |t|
t.string :item_type, null: false
t.integer :item_id, null: false
t.string :event, null: false
t.string :whodunnit
t.text :object
t.datetime :created_at
end
add_index :versions, [:item_type, :item_id]
end
end
4 changes: 4 additions & 0 deletions spec/factories.rb
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,8 @@
factory :image do
file File.open(Rails.root.join('public', 'robots.txt'))
end

factory :paper_trail_test do
sequence(:name) { |n| "name #{n}" }
end
end
94 changes: 94 additions & 0 deletions spec/integration/history/rails_admin_paper_trail_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
require 'spec_helper'

describe 'RailsAdmin PaperTrail history', active_record: true do
describe 'model history fetch' do
before(:all) do
RailsAdmin.config do |config|
config.audit_with :paper_trail, 'User', 'PaperTrail::Version'
end
end

before(:each) do
PaperTrail::Version.delete_all
@model = RailsAdmin::AbstractModel.new('PaperTrailTest')
@user = FactoryGirl.create :user
@paper_trail_test = FactoryGirl.create :paper_trail_test
with_versioning do
PaperTrail.whodunnit = @user.id
30.times do |i|
@paper_trail_test.update!(name: "updated name #{i}")
end
end
end

it 'creates versions' do
expect(PaperTrail::Version.count).to eq(30)
end

describe 'model history fetch with auditing adapter' do
before(:all) do
@adapter = RailsAdmin::Extensions::PaperTrail::AuditingAdapter.new(nil, 'User', 'PaperTrail::Version')
end

it 'fetches on page of history' do
versions = @adapter.listing_for_model @model, nil, false, false, false, nil, 20
expect(versions.total_count).to eq(30)
expect(versions.count).to eq(20)
end

it 'respects RailsAdmin::Config.default_items_per_page' do
RailsAdmin.config.default_items_per_page = 15
versions = @adapter.listing_for_model @model, nil, false, false, false, nil
expect(versions.total_count).to eq(30)
expect(versions.count).to eq(15)
end

it 'sets correct next page' do
versions = @adapter.listing_for_model @model, nil, false, false, false, 2, 10
expect(versions.next_page).to eq(3)
end

describe 'returned version objects' do
before(:each) do
@padinated_listing = @adapter.listing_for_model @model, nil, false, false, false, nil
@version = @padinated_listing.first
end

it '#username returns user email' do
expect(@version.username).to eq(@user.email)
end

it '#message returns event' do
expect(@version.message).to eq('update')
end

describe 'changed item attributes' do
it '#item returns item.id' do
expect(@version.item).to eq(@paper_trail_test.id)
end

it '#table returns item class name' do
expect(@version.table.to_s).to eq('PaperTrailTest')
end
end

context 'with Kaminari' do
before do
@paged = @adapter.listing_for_model @model, nil, false, false, false, nil
Kaminari.config.page_method_name = :per_page_kaminari
end

after do
Kaminari.config.page_method_name = :page
end

it "supports pagination when Kaminari's page_method_name is customized" do
expect(PaperTrail::Version).to receive(:per_page_kaminari).twice.and_return(@paged)
@adapter.listing_for_model @model, nil, false, false, false, nil
@adapter.listing_for_object @model, @paper_trail_test, nil, false, false, false, nil
end
end
end
end
end
end