paginated_table 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/MIT-LICENSE +20 -0
- data/README.md +132 -0
- data/Rakefile +38 -0
- data/lib/paginated_table.rb +7 -0
- data/lib/paginated_table/controller_helpers.rb +14 -0
- data/lib/paginated_table/engine.rb +7 -0
- data/lib/paginated_table/page.rb +87 -0
- data/lib/paginated_table/railtie.rb +12 -0
- data/lib/paginated_table/version.rb +3 -0
- data/lib/paginated_table/view_helpers.rb +168 -0
- data/lib/tasks/paginated_table_tasks.rake +4 -0
- data/test/dummy/README.rdoc +261 -0
- data/test/dummy/Rakefile +7 -0
- data/test/dummy/app/assets/javascripts/application.js +16 -0
- data/test/dummy/app/assets/stylesheets/application.css +13 -0
- data/test/dummy/app/controllers/application_controller.rb +3 -0
- data/test/dummy/app/controllers/data_controller.rb +27 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/data/_data.html.erb +7 -0
- data/test/dummy/app/views/data/index.html.erb +3 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/config/application.rb +59 -0
- data/test/dummy/config/boot.rb +10 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +37 -0
- data/test/dummy/config/environments/production.rb +67 -0
- data/test/dummy/config/environments/test.rb +37 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/inflections.rb +15 -0
- data/test/dummy/config/initializers/mime_types.rb +5 -0
- data/test/dummy/config/initializers/secret_token.rb +7 -0
- data/test/dummy/config/initializers/session_store.rb +8 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +5 -0
- data/test/dummy/config/routes.rb +59 -0
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/test.log +56930 -0
- data/test/dummy/public/404.html +26 -0
- data/test/dummy/public/422.html +26 -0
- data/test/dummy/public/500.html +25 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/dummy/script/rails +6 -0
- data/test/dummy/tmp/cache/assets/CB7/360/sprockets%2F8334f01490cb91467dfd76ad25b67780 +0 -0
- data/test/dummy/tmp/cache/assets/CD8/370/sprockets%2F357970feca3ac29060c1e3861e2c0953 +0 -0
- data/test/dummy/tmp/cache/assets/D25/810/sprockets%2F4ff88255fbab9775241c5d8c8c6e2088 +0 -0
- data/test/dummy/tmp/cache/assets/D32/A10/sprockets%2F13fe41fee1fe35b49d145bcc06610705 +0 -0
- data/test/dummy/tmp/cache/assets/D4E/1B0/sprockets%2Ff7cbd26ba1d28d48de824f0e94586655 +0 -0
- data/test/dummy/tmp/cache/assets/D5A/EA0/sprockets%2Fd771ace226fc8215a3572e0aa35bb0d6 +0 -0
- data/test/dummy/tmp/cache/assets/D62/6D0/sprockets%2F9b8014b0c5371c3bf5dd4f018a5ec71e +0 -0
- data/test/dummy/tmp/cache/assets/D71/1A0/sprockets%2F32c631252aee35736d93e06f3edffd6d +0 -0
- data/test/dummy/tmp/cache/assets/DD3/F90/sprockets%2Fc24290dff33aff9c3d2f971f6d8ae04b +0 -0
- data/test/dummy/tmp/cache/assets/DD4/950/sprockets%2F09e7f24ef1ff59b4fc390bdf415c60af +0 -0
- data/test/dummy/tmp/cache/assets/DDC/400/sprockets%2Fcffd775d018f68ce5dba1ee0d951a994 +9809 -0
- data/test/dummy/tmp/cache/assets/E04/890/sprockets%2F2f5173deea6c795b8fdde723bb4b63af +9809 -0
- data/test/dummy/tmp/capybara/capybara-201204041545476374284085.html +12 -0
- data/test/integration/paginated_table_integration_test.rb +235 -0
- data/test/test_helper.rb +31 -0
- data/test/units/controller_helpers_test.rb +43 -0
- data/test/units/page_test.rb +192 -0
- data/test/units/view_helpers_test.rb +317 -0
- metadata +276 -0
@@ -0,0 +1,12 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Dummy</title>
|
5
|
+
<link href="/assets/application.css" media="all" rel="stylesheet" type="text/css">
|
6
|
+
<script src="/assets/application.js" type="text/javascript"></script>
|
7
|
+
</head>
|
8
|
+
<body>
|
9
|
+
|
10
|
+
<table class="paginated"><tbody></tbody></table>
|
11
|
+
</body>
|
12
|
+
</html>
|
@@ -0,0 +1,235 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'capybara/webkit'
|
3
|
+
|
4
|
+
describe "paginated_table integration" do
|
5
|
+
|
6
|
+
describe "rendering" do
|
7
|
+
before do
|
8
|
+
visit "/data"
|
9
|
+
end
|
10
|
+
|
11
|
+
it "displays a pagination area" do
|
12
|
+
page.has_xpath?(pagination_xpath).must_equal true
|
13
|
+
end
|
14
|
+
|
15
|
+
it "displays a paginated table" do
|
16
|
+
page.has_xpath?(table_xpath).must_equal true
|
17
|
+
end
|
18
|
+
|
19
|
+
it "displays Name in the first column header" do
|
20
|
+
page.has_xpath?("#{th_xpath(1)}[.='Name']").must_equal true
|
21
|
+
end
|
22
|
+
|
23
|
+
it "displays Raw in the third column header" do
|
24
|
+
page.has_xpath?("#{th_xpath(3)}[.='Raw']").must_equal true
|
25
|
+
end
|
26
|
+
|
27
|
+
it "displays the data names in the first column" do
|
28
|
+
(1..10).each do |row|
|
29
|
+
page.has_xpath?("#{tr_xpath(row)}/td[1][.='Name #{row}']").must_equal true
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
it "displays links to the data in the second column" do
|
34
|
+
(1..10).each do |row|
|
35
|
+
page.has_xpath?("#{tr_xpath(row)}/td[2]/a[@href='/data/#{row}'][.='#{row}']").must_equal true
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe "with javascript" do
|
40
|
+
before do
|
41
|
+
Capybara.current_driver = Capybara.javascript_driver
|
42
|
+
end
|
43
|
+
|
44
|
+
it "updates only the pagination table from pagination table links" do
|
45
|
+
visit "/data"
|
46
|
+
click_link "2"
|
47
|
+
wait_for_ajax_request
|
48
|
+
page.has_xpath?("//h1[2]").must_equal false
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe "pagination" do
|
54
|
+
describe "without javascript" do
|
55
|
+
it "displays one page of results" do
|
56
|
+
visit "/data"
|
57
|
+
pagination_info_text.must_equal "Displaying data controller/data 1 - 10 of 100 in total"
|
58
|
+
end
|
59
|
+
|
60
|
+
it "follows the link to the second page of results" do
|
61
|
+
visit "/data"
|
62
|
+
click_link "2"
|
63
|
+
pagination_info_text.must_equal "Displaying data controller/data 11 - 20 of 100 in total"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe "with javascript" do
|
68
|
+
before do
|
69
|
+
Capybara.current_driver = Capybara.javascript_driver
|
70
|
+
end
|
71
|
+
|
72
|
+
it "displays one page of results" do
|
73
|
+
visit "/data"
|
74
|
+
pagination_info_text.must_equal "Displaying data controller/data 1 - 10 of 100 in total"
|
75
|
+
end
|
76
|
+
|
77
|
+
it "follows the link to the second page of results" do
|
78
|
+
visit "/data"
|
79
|
+
click_link "2"
|
80
|
+
wait_for_ajax_request
|
81
|
+
pagination_info_text.must_equal "Displaying data controller/data 11 - 20 of 100 in total"
|
82
|
+
end
|
83
|
+
|
84
|
+
# Ensures the AJAX content is decorated with event handlers
|
85
|
+
it "follows the link to the fourth page, then back to the third page" do
|
86
|
+
visit "/data"
|
87
|
+
click_link "4"
|
88
|
+
wait_for_ajax_request
|
89
|
+
pagination_info_text.must_equal "Displaying data controller/data 31 - 40 of 100 in total"
|
90
|
+
click_link "3"
|
91
|
+
wait_for_ajax_request
|
92
|
+
pagination_info_text.must_equal "Displaying data controller/data 21 - 30 of 100 in total"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "sorting" do
|
98
|
+
describe "decoration" do
|
99
|
+
it "marks the sortable columns" do
|
100
|
+
visit "/data"
|
101
|
+
page.has_xpath?("#{th_xpath(1)}[@class='sortable'][.='Name']").must_equal true
|
102
|
+
end
|
103
|
+
|
104
|
+
it "marks the sort column when sorted in ascending order" do
|
105
|
+
visit "/data"
|
106
|
+
click_link "Name"
|
107
|
+
page.has_xpath?("#{th_xpath(1)}[@class='sortable sorted_asc'][.='Name']").must_equal true
|
108
|
+
end
|
109
|
+
|
110
|
+
it "marks the sort column when sorted in descending order" do
|
111
|
+
visit "/data"
|
112
|
+
click_link "Name"
|
113
|
+
click_link "Name"
|
114
|
+
page.has_xpath?("#{th_xpath(1)}[@class='sortable sorted_desc'][.='Name']").must_equal true
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe "without javascript" do
|
119
|
+
it "follows the link to sort the first column in ascending order" do
|
120
|
+
visit "/data"
|
121
|
+
click_link "Name"
|
122
|
+
[1, 10, 100, 11, 12, 13, 14, 15, 16, 17].each_with_index do |row, i|
|
123
|
+
page.has_xpath?("#{tr_xpath(i + 1)}/td[1][.='Name #{row}']").must_equal true
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
it "follows the link to sort the first column twice in descending order" do
|
128
|
+
visit "/data"
|
129
|
+
click_link "Name"
|
130
|
+
click_link "Name"
|
131
|
+
[99, 98, 97, 96, 95, 94, 93, 92, 91, 90].each_with_index do |row, i|
|
132
|
+
page.has_xpath?("#{tr_xpath(i + 1)}/td[1][.='Name #{row}']").must_equal true
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
it "follows the link to sort the first column, then to the second page" do
|
137
|
+
visit "/data"
|
138
|
+
click_link "Name"
|
139
|
+
click_link "2"
|
140
|
+
[18, 19, 2, 20, 21, 22, 23, 24, 25, 26].each_with_index do |row, i|
|
141
|
+
page.has_xpath?("#{tr_xpath(i + 1)}/td[1][.='Name #{row}']").must_equal true
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
it "has no link to sort the second column" do
|
146
|
+
visit "/data"
|
147
|
+
page.has_xpath?("a[.='Link']").must_equal false
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
describe "with javascript" do
|
152
|
+
before do
|
153
|
+
Capybara.current_driver = Capybara.javascript_driver
|
154
|
+
end
|
155
|
+
|
156
|
+
it "follows the link to sort the first column in ascending order" do
|
157
|
+
visit "/data"
|
158
|
+
click_link "Name"
|
159
|
+
wait_for_ajax_request
|
160
|
+
[1, 10, 100, 11, 12, 13, 14, 15, 16, 17].each_with_index do |row, i|
|
161
|
+
page.has_xpath?("#{tr_xpath(i + 1)}/td[1][.='Name #{row}']").must_equal true
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
it "follows the link to sort the first column twice in descending order" do
|
166
|
+
visit "/data"
|
167
|
+
click_link "Name"
|
168
|
+
wait_for_ajax_request
|
169
|
+
click_link "Name"
|
170
|
+
wait_for_ajax_request
|
171
|
+
[99, 98, 97, 96, 95, 94, 93, 92, 91, 90].each_with_index do |row, i|
|
172
|
+
page.has_xpath?("#{tr_xpath(i + 1)}/td[1][.='Name #{row}']").must_equal true
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
it "follows the link to sort the first column, then to the second page" do
|
177
|
+
visit "/data"
|
178
|
+
click_link "Name"
|
179
|
+
wait_for_ajax_request
|
180
|
+
click_link "2"
|
181
|
+
wait_for_ajax_request
|
182
|
+
[18, 19, 2, 20, 21, 22, 23, 24, 25, 26].each_with_index do |row, i|
|
183
|
+
page.has_xpath?("#{tr_xpath(i + 1)}/td[1][.='Name #{row}']").must_equal true
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
def pagination_xpath
|
190
|
+
"//div[@class='paginated_table']"
|
191
|
+
end
|
192
|
+
|
193
|
+
def pagination_header_xpath
|
194
|
+
"#{pagination_xpath}/div[@class='header']"
|
195
|
+
end
|
196
|
+
|
197
|
+
def pagination_info_xpath
|
198
|
+
"#{pagination_header_xpath}/div[@class='info']"
|
199
|
+
end
|
200
|
+
|
201
|
+
def table_xpath
|
202
|
+
"#{pagination_xpath}/table[@class='paginated']"
|
203
|
+
end
|
204
|
+
|
205
|
+
def th_xpath(column)
|
206
|
+
"#{table_xpath}/thead/tr[1]/th[#{column}]"
|
207
|
+
end
|
208
|
+
|
209
|
+
def tbody_xpath
|
210
|
+
"#{table_xpath}/tbody[1]"
|
211
|
+
end
|
212
|
+
|
213
|
+
def tr_xpath(row)
|
214
|
+
"#{tbody_xpath}/tr[#{row}]"
|
215
|
+
end
|
216
|
+
|
217
|
+
def pagination_info_text
|
218
|
+
info = find(:xpath, pagination_info_xpath)
|
219
|
+
replace_nbsp(info.text)
|
220
|
+
end
|
221
|
+
|
222
|
+
def replace_nbsp(str)
|
223
|
+
if str.respond_to?(:valid_encoding?)
|
224
|
+
str.force_encoding('UTF-8').gsub(/\xc2\xa0/u, ' ')
|
225
|
+
else
|
226
|
+
str.gsub(/\xc2\xa0/u, ' ')
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
def wait_for_ajax_request
|
231
|
+
wait_until do
|
232
|
+
page.evaluate_script('jQuery.active') == 0
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# Configure Rails Environment
|
2
|
+
ENV["RAILS_ENV"] = "test"
|
3
|
+
|
4
|
+
require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
5
|
+
require "rails/test_help"
|
6
|
+
require 'minitest/autorun'
|
7
|
+
require 'capybara/rails'
|
8
|
+
require 'mocha/integration/mini_test'
|
9
|
+
|
10
|
+
Rails.backtrace_cleaner.remove_silencers!
|
11
|
+
|
12
|
+
# Load support files
|
13
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
14
|
+
|
15
|
+
# Load fixtures from the engine
|
16
|
+
if ActiveSupport::TestCase.method_defined?(:fixture_path=)
|
17
|
+
ActiveSupport::TestCase.fixture_path = File.expand_path("../fixtures", __FILE__)
|
18
|
+
end
|
19
|
+
|
20
|
+
Capybara.javascript_driver = :webkit
|
21
|
+
|
22
|
+
class IntegrationTest < MiniTest::Spec
|
23
|
+
include Capybara::DSL
|
24
|
+
|
25
|
+
after do
|
26
|
+
Capybara.reset_sessions!
|
27
|
+
Capybara.use_default_driver
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
MiniTest::Spec.register_spec_type(/integration$/, IntegrationTest)
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module PaginatedTable
|
2
|
+
describe ControllerHelpers do
|
3
|
+
let(:params) { stub("params") }
|
4
|
+
let(:request) { stub("request", :xhr? => false) }
|
5
|
+
let(:controller) {
|
6
|
+
controller = Object.new
|
7
|
+
controller.extend(ControllerHelpers)
|
8
|
+
controller.stubs(:params => params, :request => request)
|
9
|
+
controller
|
10
|
+
}
|
11
|
+
|
12
|
+
describe "#paginated_table" do
|
13
|
+
let(:collection) { stub("collection") }
|
14
|
+
let(:tables) { { "collection_name" => collection } }
|
15
|
+
let(:page) { stub("page") }
|
16
|
+
let(:data) { stub("data") }
|
17
|
+
let(:data_page) { stub("data_page", :data => data, :page => page) }
|
18
|
+
|
19
|
+
before do
|
20
|
+
PageParams.stubs(:create_page_from_params).with(params).returns(page)
|
21
|
+
DataPage.stubs(:new).with(collection, page).returns(data_page)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "sets an instance variable on the controller with the data page" do
|
25
|
+
controller.paginated_table(tables)
|
26
|
+
controller.instance_variable_get("@collection_name").must_equal data_page
|
27
|
+
end
|
28
|
+
|
29
|
+
it "renders the named partial without layout if request is xhr?" do
|
30
|
+
request.stubs(:xhr? => true)
|
31
|
+
controller.expects(:render).
|
32
|
+
with(:partial => "collection_name", :layout => false)
|
33
|
+
controller.paginated_table(tables)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "does not render if request is not xhr?" do
|
37
|
+
request.stubs(:xhr? => false)
|
38
|
+
controller.expects(:render).never
|
39
|
+
controller.paginated_table(tables)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,192 @@
|
|
1
|
+
module PaginatedTable
|
2
|
+
describe Page do
|
3
|
+
let(:page) { Page.new(:number => 2, :rows => 5, :sort_column => 'name', :sort_direction => 'desc') }
|
4
|
+
|
5
|
+
it "has a page number" do
|
6
|
+
page.number.must_equal 2
|
7
|
+
end
|
8
|
+
|
9
|
+
it "does not accept a negative page number" do
|
10
|
+
lambda { Page.new(:number => -1) }.must_raise ArgumentError
|
11
|
+
end
|
12
|
+
|
13
|
+
it "does not accept a zero page number" do
|
14
|
+
lambda { Page.new(:number => 0) }.must_raise ArgumentError
|
15
|
+
end
|
16
|
+
|
17
|
+
it "does not accept an invalid page number" do
|
18
|
+
lambda { Page.new(:number => 'foo') }.must_raise ArgumentError
|
19
|
+
end
|
20
|
+
|
21
|
+
it "has a rows number" do
|
22
|
+
page.rows.must_equal 5
|
23
|
+
end
|
24
|
+
|
25
|
+
it "does not accept a negative number of rows" do
|
26
|
+
lambda { Page.new(:rows => -1) }.must_raise ArgumentError
|
27
|
+
end
|
28
|
+
|
29
|
+
it "does not accept a zero number of rows "do
|
30
|
+
lambda { Page.new(:rows => 0) }.must_raise ArgumentError
|
31
|
+
end
|
32
|
+
|
33
|
+
it "does not accept an invalid page number" do
|
34
|
+
lambda { Page.new(:rows => 'foo') }.must_raise ArgumentError
|
35
|
+
end
|
36
|
+
|
37
|
+
it "has a sort column" do
|
38
|
+
page.sort_column.must_equal 'name'
|
39
|
+
end
|
40
|
+
|
41
|
+
it "has a sort direction" do
|
42
|
+
page.sort_direction.must_equal 'desc'
|
43
|
+
end
|
44
|
+
|
45
|
+
it "does not accept an invalid sort direction" do
|
46
|
+
lambda { Page.new(:sort_direction => 'foo') }.must_raise ArgumentError
|
47
|
+
end
|
48
|
+
|
49
|
+
describe ".opposite_sort_direction" do
|
50
|
+
it "returns asc for desc" do
|
51
|
+
Page.opposite_sort_direction('asc').must_equal 'desc'
|
52
|
+
end
|
53
|
+
|
54
|
+
it "returns desc for asc" do
|
55
|
+
Page.opposite_sort_direction('desc').must_equal 'asc'
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "#page_for_number" do
|
60
|
+
describe "with a new page number" do
|
61
|
+
let(:number_page) { page.page_for_number(3) }
|
62
|
+
|
63
|
+
it "returns a new page with the new page number" do
|
64
|
+
number_page.number.must_equal 3
|
65
|
+
end
|
66
|
+
|
67
|
+
it "returns a new page with the same number of rows" do
|
68
|
+
number_page.rows.must_equal 5
|
69
|
+
end
|
70
|
+
|
71
|
+
it "returns a new page with the same sort column" do
|
72
|
+
number_page.sort_column.must_equal 'name'
|
73
|
+
end
|
74
|
+
|
75
|
+
it "returns a new page with the same sort direction" do
|
76
|
+
number_page.sort_direction.must_equal 'desc'
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "#page_for_sort_column" do
|
82
|
+
describe "on a new sort column" do
|
83
|
+
let(:sort_page) { page.page_for_sort_column('title') }
|
84
|
+
|
85
|
+
it "returns a new page with page number 1" do
|
86
|
+
sort_page.number.must_equal 1
|
87
|
+
end
|
88
|
+
|
89
|
+
it "returns a new page with the same number of rows" do
|
90
|
+
sort_page.rows.must_equal 5
|
91
|
+
end
|
92
|
+
|
93
|
+
it "returns a new page with the given sort column" do
|
94
|
+
sort_page.sort_column.must_equal 'title'
|
95
|
+
end
|
96
|
+
|
97
|
+
it "returns a new page with sort direction asc" do
|
98
|
+
sort_page.sort_direction.must_equal 'asc'
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe "on the same sort column" do
|
103
|
+
let(:sort_page) { page.page_for_sort_column('name') }
|
104
|
+
|
105
|
+
it "returns a new page with page number 1" do
|
106
|
+
sort_page.number.must_equal 1
|
107
|
+
end
|
108
|
+
|
109
|
+
it "returns a new page with the same number of rows" do
|
110
|
+
sort_page.rows.must_equal 5
|
111
|
+
end
|
112
|
+
|
113
|
+
it "returns a new page with the same sort column" do
|
114
|
+
sort_page.sort_column.must_equal 'name'
|
115
|
+
end
|
116
|
+
|
117
|
+
it "returns a new page with the opposite sort direction" do
|
118
|
+
sort_page.sort_direction.must_equal 'asc'
|
119
|
+
sort_page.page_for_sort_column('name').sort_direction.must_equal 'desc'
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe PageParams do
|
126
|
+
describe ".create_from_params" do
|
127
|
+
it "returns a new page created from the request params" do
|
128
|
+
page = PageParams.create_page_from_params(
|
129
|
+
:page => '2',
|
130
|
+
:per_page => '5',
|
131
|
+
:sort_column => 'name',
|
132
|
+
:sort_direction => 'desc'
|
133
|
+
)
|
134
|
+
page.number.must_equal 2
|
135
|
+
page.rows.must_equal 5
|
136
|
+
page.sort_column.must_equal 'name'
|
137
|
+
page.sort_direction.must_equal 'desc'
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
describe ".to_params" do
|
142
|
+
it "creates a params hash from the page" do
|
143
|
+
page = Page.new(
|
144
|
+
:number => 2,
|
145
|
+
:rows => 5,
|
146
|
+
:sort_column => 'name',
|
147
|
+
:sort_direction => 'desc'
|
148
|
+
)
|
149
|
+
PageParams.to_params(page).must_equal(
|
150
|
+
:page => '2',
|
151
|
+
:per_page => '5',
|
152
|
+
:sort_column => 'name',
|
153
|
+
:sort_direction => 'desc'
|
154
|
+
)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
describe DataPage do
|
160
|
+
describe "#data" do
|
161
|
+
let(:page) {
|
162
|
+
Page.new(
|
163
|
+
:number => 2,
|
164
|
+
:rows => 5,
|
165
|
+
:sort_column => 'name',
|
166
|
+
:sort_direction => 'asc'
|
167
|
+
)
|
168
|
+
}
|
169
|
+
let(:collection) {
|
170
|
+
collection = (1..10).map { |i| "Name #{i}" }
|
171
|
+
def collection.order(clause)
|
172
|
+
raise unless clause == "name asc"
|
173
|
+
sort
|
174
|
+
end
|
175
|
+
collection
|
176
|
+
}
|
177
|
+
|
178
|
+
it "sorts the collection and pages to the given page number" do
|
179
|
+
DataPage.new(collection, page).data.must_equal(
|
180
|
+
["Name 5", "Name 6", "Name 7", "Name 8", "Name 9"]
|
181
|
+
)
|
182
|
+
end
|
183
|
+
|
184
|
+
describe "#page" do
|
185
|
+
it "provides a reference to the given page" do
|
186
|
+
DataPage.new(collection, page).page.must_equal page
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
end
|