classic_pagination plugin

This commit is contained in:
Eugene Korbut 2009-01-08 06:22:44 +10:00
parent ab8bf72949
commit 53fd7ad6ee
23 changed files with 1267 additions and 487 deletions

View file

@ -0,0 +1,24 @@
thirty_seven_signals:
id: 1
name: 37Signals
rating: 4
TextDrive:
id: 2
name: TextDrive
rating: 4
PlanetArgon:
id: 3
name: Planet Argon
rating: 4
Google:
id: 4
name: Google
rating: 4
Ionist:
id: 5
name: Ioni.st
rating: 4

View file

@ -0,0 +1,9 @@
class Company < ActiveRecord::Base
attr_protected :rating
set_sequence_name :companies_nonstd_seq
validates_presence_of :name
def validate
errors.add('rating', 'rating should not be 2') if rating == 2
end
end

View file

@ -0,0 +1,7 @@
class Developer < ActiveRecord::Base
has_and_belongs_to_many :projects
end
class DeVeLoPeR < ActiveRecord::Base
set_table_name "developers"
end

View file

@ -0,0 +1,21 @@
david:
id: 1
name: David
salary: 80000
jamis:
id: 2
name: Jamis
salary: 150000
<% for digit in 3..10 %>
dev_<%= digit %>:
id: <%= digit %>
name: fixture_<%= digit %>
salary: 100000
<% end %>
poor_jamis:
id: 11
name: Jamis
salary: 9000

View file

@ -0,0 +1,13 @@
david_action_controller:
developer_id: 1
project_id: 2
joined_on: 2004-10-10
david_active_record:
developer_id: 1
project_id: 1
joined_on: 2004-10-10
jamis_active_record:
developer_id: 2
project_id: 1

View file

@ -0,0 +1,3 @@
class Project < ActiveRecord::Base
has_and_belongs_to_many :developers, :uniq => true
end

View file

@ -0,0 +1,7 @@
action_controller:
id: 2
name: Active Controller
active_record:
id: 1
name: Active Record

View file

@ -0,0 +1,13 @@
witty_retort:
id: 1
topic_id: 1
content: Birdman is better!
created_at: <%= 6.hours.ago.to_s(:db) %>
updated_at: nil
another:
id: 2
topic_id: 2
content: Nuh uh!
created_at: <%= 1.hour.ago.to_s(:db) %>
updated_at: nil

View file

@ -0,0 +1,5 @@
class Reply < ActiveRecord::Base
belongs_to :topic, :include => [:replies]
validates_presence_of :content
end

View file

@ -0,0 +1,42 @@
CREATE TABLE 'companies' (
'id' INTEGER PRIMARY KEY NOT NULL,
'name' TEXT DEFAULT NULL,
'rating' INTEGER DEFAULT 1
);
CREATE TABLE 'replies' (
'id' INTEGER PRIMARY KEY NOT NULL,
'content' text,
'created_at' datetime,
'updated_at' datetime,
'topic_id' integer
);
CREATE TABLE 'topics' (
'id' INTEGER PRIMARY KEY NOT NULL,
'title' varchar(255),
'subtitle' varchar(255),
'content' text,
'created_at' datetime,
'updated_at' datetime
);
CREATE TABLE 'developers' (
'id' INTEGER PRIMARY KEY NOT NULL,
'name' TEXT DEFAULT NULL,
'salary' INTEGER DEFAULT 70000,
'created_at' DATETIME DEFAULT NULL,
'updated_at' DATETIME DEFAULT NULL
);
CREATE TABLE 'projects' (
'id' INTEGER PRIMARY KEY NOT NULL,
'name' TEXT DEFAULT NULL
);
CREATE TABLE 'developers_projects' (
'developer_id' INTEGER NOT NULL,
'project_id' INTEGER NOT NULL,
'joined_on' DATE DEFAULT NULL,
'access_level' INTEGER DEFAULT 1
);

View file

@ -0,0 +1,3 @@
class Topic < ActiveRecord::Base
has_many :replies, :include => [:user], :dependent => :destroy
end

View file

@ -0,0 +1,22 @@
futurama:
id: 1
title: Isnt futurama awesome?
subtitle: It really is, isnt it.
content: I like futurama
created_at: <%= 1.day.ago.to_s(:db) %>
updated_at:
harvey_birdman:
id: 2
title: Harvey Birdman is the king of all men
subtitle: yup
content: It really is
created_at: <%= 2.hours.ago.to_s(:db) %>
updated_at:
rails:
id: 3
title: Rails is nice
subtitle: It makes me happy
content: except when I have to hack internals to fix pagination. even then really.
created_at: <%= 20.minutes.ago.to_s(:db) %>

View file

@ -0,0 +1,117 @@
require 'test/unit'
unless defined?(ActiveRecord)
plugin_root = File.join(File.dirname(__FILE__), '..')
# first look for a symlink to a copy of the framework
if framework_root = ["#{plugin_root}/rails", "#{plugin_root}/../../rails"].find { |p| File.directory? p }
puts "found framework root: #{framework_root}"
# this allows for a plugin to be tested outside an app
$:.unshift "#{framework_root}/activesupport/lib", "#{framework_root}/activerecord/lib", "#{framework_root}/actionpack/lib"
else
# is the plugin installed in an application?
app_root = plugin_root + '/../../..'
if File.directory? app_root + '/config'
puts 'using config/boot.rb'
ENV['RAILS_ENV'] = 'test'
require File.expand_path(app_root + '/config/boot')
else
# simply use installed gems if available
puts 'using rubygems'
require 'rubygems'
gem 'actionpack'; gem 'activerecord'
end
end
%w(action_pack active_record action_controller active_record/fixtures action_controller/test_process).each {|f| require f}
Dependencies.load_paths.unshift "#{plugin_root}/lib"
end
# Define the connector
class ActiveRecordTestConnector
cattr_accessor :able_to_connect
cattr_accessor :connected
# Set our defaults
self.connected = false
self.able_to_connect = true
class << self
def setup
unless self.connected || !self.able_to_connect
setup_connection
load_schema
require_fixture_models
self.connected = true
end
rescue Exception => e # errors from ActiveRecord setup
$stderr.puts "\nSkipping ActiveRecord assertion tests: #{e}"
#$stderr.puts " #{e.backtrace.join("\n ")}\n"
self.able_to_connect = false
end
private
def setup_connection
if Object.const_defined?(:ActiveRecord)
defaults = { :database => ':memory:' }
begin
options = defaults.merge :adapter => 'sqlite3', :timeout => 500
ActiveRecord::Base.establish_connection(options)
ActiveRecord::Base.configurations = { 'sqlite3_ar_integration' => options }
ActiveRecord::Base.connection
rescue Exception # errors from establishing a connection
$stderr.puts 'SQLite 3 unavailable; trying SQLite 2.'
options = defaults.merge :adapter => 'sqlite'
ActiveRecord::Base.establish_connection(options)
ActiveRecord::Base.configurations = { 'sqlite2_ar_integration' => options }
ActiveRecord::Base.connection
end
Object.send(:const_set, :QUOTED_TYPE, ActiveRecord::Base.connection.quote_column_name('type')) unless Object.const_defined?(:QUOTED_TYPE)
else
raise "Can't setup connection since ActiveRecord isn't loaded."
end
end
# Load actionpack sqlite tables
def load_schema
File.read(File.dirname(__FILE__) + "/fixtures/schema.sql").split(';').each do |sql|
ActiveRecord::Base.connection.execute(sql) unless sql.blank?
end
end
def require_fixture_models
Dir.glob(File.dirname(__FILE__) + "/fixtures/*.rb").each {|f| require f}
end
end
end
# Test case for inheritance
class ActiveRecordTestCase < Test::Unit::TestCase
# Set our fixture path
if ActiveRecordTestConnector.able_to_connect
self.fixture_path = "#{File.dirname(__FILE__)}/fixtures/"
self.use_transactional_fixtures = false
end
def self.fixtures(*args)
super if ActiveRecordTestConnector.connected
end
def run(*args)
super if ActiveRecordTestConnector.connected
end
# Default so Test::Unit::TestCase doesn't complain
def test_truth
end
end
ActiveRecordTestConnector.setup
ActionController::Routing::Routes.reload rescue nil
ActionController::Routing::Routes.draw do |map|
map.connect ':controller/:action/:id'
end

View file

@ -0,0 +1,38 @@
require File.dirname(__FILE__) + '/helper'
require File.dirname(__FILE__) + '/../init'
class PaginationHelperTest < Test::Unit::TestCase
include ActionController::Pagination
include ActionView::Helpers::PaginationHelper
include ActionView::Helpers::UrlHelper
include ActionView::Helpers::TagHelper
def setup
@controller = Class.new do
attr_accessor :url, :request
def url_for(options, *parameters_for_method_reference)
url
end
end
@controller = @controller.new
@controller.url = "http://www.example.com"
end
def test_pagination_links
total, per_page, page = 30, 10, 1
output = pagination_links Paginator.new(@controller, total, per_page, page)
assert_equal "1 <a href=\"http://www.example.com\">2</a> <a href=\"http://www.example.com\">3</a> ", output
end
def test_pagination_links_with_prefix
total, per_page, page = 30, 10, 1
output = pagination_links Paginator.new(@controller, total, per_page, page), :prefix => 'Newer '
assert_equal "Newer 1 <a href=\"http://www.example.com\">2</a> <a href=\"http://www.example.com\">3</a> ", output
end
def test_pagination_links_with_suffix
total, per_page, page = 30, 10, 1
output = pagination_links Paginator.new(@controller, total, per_page, page), :suffix => 'Older'
assert_equal "1 <a href=\"http://www.example.com\">2</a> <a href=\"http://www.example.com\">3</a> Older", output
end
end

View file

@ -0,0 +1,177 @@
require File.dirname(__FILE__) + '/helper'
require File.dirname(__FILE__) + '/../init'
class PaginationTest < ActiveRecordTestCase
fixtures :topics, :replies, :developers, :projects, :developers_projects
class PaginationController < ActionController::Base
if respond_to? :view_paths=
self.view_paths = [ "#{File.dirname(__FILE__)}/../fixtures/" ]
else
self.template_root = [ "#{File.dirname(__FILE__)}/../fixtures/" ]
end
def simple_paginate
@topic_pages, @topics = paginate(:topics)
render :nothing => true
end
def paginate_with_per_page
@topic_pages, @topics = paginate(:topics, :per_page => 1)
render :nothing => true
end
def paginate_with_order
@topic_pages, @topics = paginate(:topics, :order => 'created_at asc')
render :nothing => true
end
def paginate_with_order_by
@topic_pages, @topics = paginate(:topics, :order_by => 'created_at asc')
render :nothing => true
end
def paginate_with_include_and_order
@topic_pages, @topics = paginate(:topics, :include => :replies, :order => 'replies.created_at asc, topics.created_at asc')
render :nothing => true
end
def paginate_with_conditions
@topic_pages, @topics = paginate(:topics, :conditions => ["created_at > ?", 30.minutes.ago])
render :nothing => true
end
def paginate_with_class_name
@developer_pages, @developers = paginate(:developers, :class_name => "DeVeLoPeR")
render :nothing => true
end
def paginate_with_singular_name
@developer_pages, @developers = paginate()
render :nothing => true
end
def paginate_with_joins
@developer_pages, @developers = paginate(:developers,
:joins => 'LEFT JOIN developers_projects ON developers.id = developers_projects.developer_id',
:conditions => 'project_id=1')
render :nothing => true
end
def paginate_with_join
@developer_pages, @developers = paginate(:developers,
:join => 'LEFT JOIN developers_projects ON developers.id = developers_projects.developer_id',
:conditions => 'project_id=1')
render :nothing => true
end
def paginate_with_join_and_count
@developer_pages, @developers = paginate(:developers,
:join => 'd LEFT JOIN developers_projects ON d.id = developers_projects.developer_id',
:conditions => 'project_id=1',
:count => "d.id")
render :nothing => true
end
def paginate_with_join_and_group
@developer_pages, @developers = paginate(:developers,
:join => 'INNER JOIN developers_projects ON developers.id = developers_projects.developer_id',
:group => 'developers.id')
render :nothing => true
end
def rescue_errors(e) raise e end
def rescue_action(e) raise end
end
def setup
@controller = PaginationController.new
@request = ActionController::TestRequest.new
@response = ActionController::TestResponse.new
super
end
# Single Action Pagination Tests
def test_simple_paginate
get :simple_paginate
assert_equal 1, assigns(:topic_pages).page_count
assert_equal 3, assigns(:topics).size
end
def test_paginate_with_per_page
get :paginate_with_per_page
assert_equal 1, assigns(:topics).size
assert_equal 3, assigns(:topic_pages).page_count
end
def test_paginate_with_order
get :paginate_with_order
expected = [topics(:futurama),
topics(:harvey_birdman),
topics(:rails)]
assert_equal expected, assigns(:topics)
assert_equal 1, assigns(:topic_pages).page_count
end
def test_paginate_with_order_by
get :paginate_with_order
expected = assigns(:topics)
get :paginate_with_order_by
assert_equal expected, assigns(:topics)
assert_equal 1, assigns(:topic_pages).page_count
end
def test_paginate_with_conditions
get :paginate_with_conditions
expected = [topics(:rails)]
assert_equal expected, assigns(:topics)
assert_equal 1, assigns(:topic_pages).page_count
end
def test_paginate_with_class_name
get :paginate_with_class_name
assert assigns(:developers).size > 0
assert_equal DeVeLoPeR, assigns(:developers).first.class
end
def test_paginate_with_joins
get :paginate_with_joins
assert_equal 2, assigns(:developers).size
developer_names = assigns(:developers).map { |d| d.name }
assert developer_names.include?('David')
assert developer_names.include?('Jamis')
end
def test_paginate_with_join_and_conditions
get :paginate_with_joins
expected = assigns(:developers)
get :paginate_with_join
assert_equal expected, assigns(:developers)
end
def test_paginate_with_join_and_count
get :paginate_with_joins
expected = assigns(:developers)
get :paginate_with_join_and_count
assert_equal expected, assigns(:developers)
end
def test_paginate_with_include_and_order
get :paginate_with_include_and_order
expected = Topic.find(:all, :include => 'replies', :order => 'replies.created_at asc, topics.created_at asc', :limit => 10)
assert_equal expected, assigns(:topics)
end
def test_paginate_with_join_and_group
get :paginate_with_join_and_group
assert_equal 2, assigns(:developers).size
assert_equal 2, assigns(:developer_pages).item_count
developer_names = assigns(:developers).map { |d| d.name }
assert developer_names.include?('David')
assert developer_names.include?('Jamis')
end
end