dry_crud 1.2.0 → 1.2.5
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +28 -11
- data/Rakefile +2 -1
- data/VERSION +1 -1
- data/lib/generators/dry_crud/templates/INSTALL +0 -1
- data/lib/generators/dry_crud/templates/app/controllers/crud_controller.rb +11 -183
- data/lib/generators/dry_crud/templates/app/controllers/list_controller.rb +212 -0
- data/lib/generators/dry_crud/templates/app/helpers/crud_helper.rb +10 -20
- data/lib/generators/dry_crud/templates/app/helpers/list_helper.rb +25 -0
- data/lib/generators/dry_crud/templates/app/helpers/standard_helper.rb +5 -4
- data/lib/generators/dry_crud/templates/app/helpers/standard_table_builder.rb +2 -2
- data/lib/generators/dry_crud/templates/app/views/crud/edit.html.erb +1 -1
- data/lib/generators/dry_crud/templates/app/views/crud/new.html.erb +1 -1
- data/lib/generators/dry_crud/templates/app/views/crud/show.html.erb +1 -1
- data/lib/generators/dry_crud/templates/app/views/layouts/crud.html.erb +5 -1
- data/lib/generators/dry_crud/templates/app/views/list/_actions_index.html.erb +0 -0
- data/lib/generators/dry_crud/templates/app/views/list/_list.html.erb +1 -0
- data/lib/generators/dry_crud/templates/app/views/list/_search.html.erb +7 -0
- data/lib/generators/dry_crud/templates/app/views/{crud → list}/index.html.erb +1 -1
- data/lib/generators/dry_crud/templates/public/stylesheets/crud.css +13 -10
- data/lib/generators/dry_crud/templates/test/crud_test_model.rb +50 -25
- data/lib/generators/dry_crud/templates/test/custom_assertions.rb +8 -0
- data/lib/generators/dry_crud/templates/test/functional/crud_test_models_controller_test.rb +23 -3
- data/lib/generators/dry_crud/templates/test/unit/custom_assertions_test.rb +18 -0
- data/lib/generators/dry_crud/templates/test/unit/helpers/crud_helper_test.rb +22 -75
- data/lib/generators/dry_crud/templates/test/unit/helpers/list_helper_test.rb +139 -0
- data/lib/generators/dry_crud/templates/test/unit/helpers/standard_form_builder_test.rb +4 -7
- data/lib/generators/dry_crud/templates/test/unit/helpers/standard_helper_test.rb +6 -10
- data/test/templates/app/controllers/people_controller.rb +1 -0
- data/test/templates/app/controllers/vips_controller.rb +24 -0
- data/test/templates/app/views/cities/_list.html.erb +3 -3
- data/test/templates/app/views/layouts/application.html.erb +33 -0
- data/test/templates/app/views/people/_list.html.erb +1 -0
- data/test/templates/config/routes.rb +2 -0
- data/test/templates/db/seeds.rb +1 -1
- data/test/templates/public/stylesheets/demo.css +113 -0
- metadata +15 -7
- data/lib/generators/dry_crud/templates/app/views/crud/_search.html.erb +0 -8
- data/test/templates/app/views/layouts/crud.html.erb +0 -26
@@ -13,7 +13,11 @@
|
|
13
13
|
|
14
14
|
<h1><%= @title %></h1>
|
15
15
|
|
16
|
-
|
16
|
+
<% if flash[:notice].present? %>
|
17
|
+
<div id="flash_notice"><%= flash[:notice] %></div>
|
18
|
+
<% elsif flash[:alert].present? %>
|
19
|
+
<div id="flash_alert"><%= flash[:alert] %></div>
|
20
|
+
<% end %>
|
17
21
|
|
18
22
|
<%= yield %>
|
19
23
|
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= list_table %>
|
@@ -28,11 +28,11 @@ td p {
|
|
28
28
|
margin: 0;
|
29
29
|
}
|
30
30
|
|
31
|
-
.
|
31
|
+
.right {
|
32
32
|
text-align: right;
|
33
33
|
}
|
34
34
|
|
35
|
-
.
|
35
|
+
.center {
|
36
36
|
text-align: center;
|
37
37
|
}
|
38
38
|
|
@@ -72,18 +72,21 @@ a:visited.action {
|
|
72
72
|
}
|
73
73
|
|
74
74
|
#flash_notice {
|
75
|
-
|
75
|
+
border: solid 2px #6a6;
|
76
|
+
background-color: #afa;
|
77
|
+
margin: 20pt;
|
78
|
+
padding: 5pt 10pt;
|
76
79
|
}
|
77
80
|
|
78
81
|
#error_explanation {
|
79
|
-
border: solid
|
80
|
-
margin:
|
81
|
-
padding: 5pt;
|
82
|
-
background-color: #
|
82
|
+
border: solid 2pt #da9;
|
83
|
+
margin: 20pt;
|
84
|
+
padding: 5pt 10pt;
|
85
|
+
background-color: #fec;
|
83
86
|
}
|
84
87
|
|
85
88
|
#error_explanation h2 {
|
86
|
-
font-size:
|
89
|
+
font-size: 11pt;
|
87
90
|
margin-top: 0pt;
|
88
91
|
}
|
89
92
|
|
@@ -92,8 +95,8 @@ a:visited.action {
|
|
92
95
|
}
|
93
96
|
|
94
97
|
.value div.field_with_errors {
|
95
|
-
background-color: #
|
98
|
+
background-color: #da9;
|
96
99
|
display: inline-block;
|
97
|
-
padding: 1px;
|
100
|
+
padding: 1px 1px;
|
98
101
|
}
|
99
102
|
|
@@ -1,9 +1,10 @@
|
|
1
|
+
# A dummy model used for general testing.
|
1
2
|
class CrudTestModel < ActiveRecord::Base #:nodoc:
|
2
3
|
|
3
4
|
validates :name, :presence => true
|
4
5
|
validates :rating, :inclusion => { :in => 1..10 }
|
5
6
|
|
6
|
-
|
7
|
+
default_scope order('name')
|
7
8
|
|
8
9
|
belongs_to :companion, :class_name => 'CrudTestModel'
|
9
10
|
|
@@ -16,6 +17,7 @@ class CrudTestModel < ActiveRecord::Base #:nodoc:
|
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
20
|
+
# Controller for the dummy model.
|
19
21
|
class CrudTestModelsController < CrudController #:nodoc:
|
20
22
|
HANDLE_PREFIX = 'handle_'
|
21
23
|
|
@@ -42,7 +44,7 @@ class CrudTestModelsController < CrudController #:nodoc:
|
|
42
44
|
def list_entries
|
43
45
|
entries = super
|
44
46
|
if params[:filter]
|
45
|
-
entries = entries.where(['rating < ?', 3]).order('children DESC')
|
47
|
+
entries = entries.where(['rating < ?', 3]).except(:order).order('children DESC')
|
46
48
|
end
|
47
49
|
entries
|
48
50
|
end
|
@@ -95,6 +97,8 @@ class CrudTestModelsController < CrudController #:nodoc:
|
|
95
97
|
end
|
96
98
|
|
97
99
|
# A simple test helper to prepare the test database with a CrudTestModel model.
|
100
|
+
# This helper is used to test the CrudController and various helpers
|
101
|
+
# without the need for an application based model.
|
98
102
|
module CrudTestHelper
|
99
103
|
|
100
104
|
protected
|
@@ -102,29 +106,34 @@ module CrudTestHelper
|
|
102
106
|
# Sets up the test database with a crud_test_models table.
|
103
107
|
# Look at the source to view the column definition.
|
104
108
|
def setup_db
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
109
|
+
without_transaction do
|
110
|
+
silence_stream(STDOUT) do
|
111
|
+
ActiveRecord::Base.connection.create_table :crud_test_models, :force => true do |t|
|
112
|
+
t.string :name, :null => false, :limit => 50
|
113
|
+
t.string :whatever
|
114
|
+
t.integer :children
|
115
|
+
t.integer :companion_id
|
116
|
+
t.float :rating
|
117
|
+
t.decimal :income, :precision => 14, :scale => 2
|
118
|
+
t.date :birthdate
|
119
|
+
t.boolean :human, :default => true
|
120
|
+
t.text :remarks
|
121
|
+
|
122
|
+
t.timestamps
|
123
|
+
end
|
118
124
|
end
|
125
|
+
|
126
|
+
CrudTestModel.reset_column_information
|
119
127
|
end
|
120
|
-
|
121
|
-
CrudTestModel.reset_column_information
|
122
128
|
end
|
123
129
|
|
124
130
|
# Removes the crud_test_models table from the database.
|
125
131
|
def reset_db
|
132
|
+
c = ActiveRecord::Base.connection
|
126
133
|
[:crud_test_models].each do |table|
|
127
|
-
|
134
|
+
if c.table_exists?(table)
|
135
|
+
c.drop_table(table) rescue nil
|
136
|
+
end
|
128
137
|
end
|
129
138
|
end
|
130
139
|
|
@@ -137,6 +146,16 @@ module CrudTestHelper
|
|
137
146
|
def crud_test_models(name)
|
138
147
|
CrudTestModel.find_by_name(name.to_s)
|
139
148
|
end
|
149
|
+
|
150
|
+
def with_test_routing
|
151
|
+
with_routing do |set|
|
152
|
+
set.draw { resources :crud_test_models }
|
153
|
+
# used to define a controller in these tests
|
154
|
+
set.default_url_options = {:controller => 'crud_test_models'}
|
155
|
+
yield
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
140
159
|
|
141
160
|
private
|
142
161
|
|
@@ -156,13 +175,19 @@ module CrudTestHelper
|
|
156
175
|
(index + 64).chr * 5
|
157
176
|
end
|
158
177
|
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
178
|
+
# hack to avoid ddl in transaction issues with mysql.
|
179
|
+
def without_transaction
|
180
|
+
c = ActiveRecord::Base.connection
|
181
|
+
start_transaction = false
|
182
|
+
if c.adapter_name.downcase.include?('mysql') && c.open_transactions > 0
|
183
|
+
# in transactional tests, we may simply rollback
|
184
|
+
c.execute("ROLLBACK")
|
185
|
+
start_transaction = true
|
165
186
|
end
|
187
|
+
|
188
|
+
yield
|
189
|
+
|
190
|
+
c.execute("BEGIN") if start_transaction
|
166
191
|
end
|
167
|
-
|
192
|
+
|
168
193
|
end
|
@@ -23,6 +23,14 @@ module CustomAssertions
|
|
23
23
|
assert_block(full_message) { !collection.include?(element) }
|
24
24
|
end
|
25
25
|
|
26
|
+
# Asserts that <regexp> occurs exactly <expected> times in <string>.
|
27
|
+
def assert_count(expected, regexp, string, message = "")
|
28
|
+
actual = string.scan(regexp).size
|
29
|
+
full_message = build_message(message, "<?> expected to occur ? time(s), but occured ? time(s) in \n<?>.",
|
30
|
+
regexp, expected, actual, string)
|
31
|
+
assert_block(full_message) { expected == actual }
|
32
|
+
end
|
33
|
+
|
26
34
|
# Asserts that the given active model record is valid.
|
27
35
|
# This method used to be part of Rails but was deprecated, no idea why.
|
28
36
|
def assert_valid(record, message = "")
|
@@ -2,6 +2,9 @@ require 'test_helper'
|
|
2
2
|
require 'crud_test_model'
|
3
3
|
require File.join(File.dirname(__FILE__), 'crud_controller_test_helper')
|
4
4
|
|
5
|
+
# Tests all actions of the CrudController based on a dummy model
|
6
|
+
# (CrudTestModel). This is useful to test the general behavior
|
7
|
+
# of CrudController.
|
5
8
|
class CrudTestModelsControllerTest < ActionController::TestCase
|
6
9
|
|
7
10
|
include CrudControllerTestHelper
|
@@ -27,11 +30,13 @@ class CrudTestModelsControllerTest < ActionController::TestCase
|
|
27
30
|
super
|
28
31
|
assert_equal 6, assigns(:entries).size
|
29
32
|
assert_equal assigns(:entries).sort_by(&:name), assigns(:entries)
|
33
|
+
assert_equal Hash.new, session[:list_params]
|
30
34
|
end
|
31
35
|
|
32
36
|
def test_index_search
|
33
37
|
super
|
34
38
|
assert_equal 1, assigns(:entries).size
|
39
|
+
assert_equal({:q => 'AAAA'}, session[:list_params]['/crud_test_models'])
|
35
40
|
end
|
36
41
|
|
37
42
|
def test_index_with_custom_options
|
@@ -50,6 +55,7 @@ class CrudTestModelsControllerTest < ActionController::TestCase
|
|
50
55
|
assert_present assigns(:entries)
|
51
56
|
assert_equal 1, assigns(:entries).size
|
52
57
|
assert_equal [CrudTestModel.find_by_name('BBBBB')], assigns(:entries)
|
58
|
+
assert_equal({:q => 'DDD'}, session[:list_params]['/crud_test_models'])
|
53
59
|
end
|
54
60
|
|
55
61
|
def test_sort_given_column
|
@@ -58,7 +64,8 @@ class CrudTestModelsControllerTest < ActionController::TestCase
|
|
58
64
|
assert_template 'index'
|
59
65
|
assert_present assigns(:entries)
|
60
66
|
assert_equal 6, assigns(:entries).size
|
61
|
-
assert_equal CrudTestModel.
|
67
|
+
assert_equal CrudTestModel.all.sort_by(&:children), assigns(:entries)
|
68
|
+
assert_equal({:sort => 'children', :sort_dir => 'asc'}, session[:list_params]['/crud_test_models'])
|
62
69
|
end
|
63
70
|
|
64
71
|
def test_sort_virtual_column
|
@@ -67,8 +74,20 @@ class CrudTestModelsControllerTest < ActionController::TestCase
|
|
67
74
|
assert_template 'index'
|
68
75
|
assert_present assigns(:entries)
|
69
76
|
assert_equal 6, assigns(:entries).size
|
70
|
-
|
71
|
-
|
77
|
+
assert_equal({:sort => 'chatty', :sort_dir => 'desc'}, session[:list_params]['/crud_test_models'])
|
78
|
+
|
79
|
+
sorted = CrudTestModel.all.sort_by(&:chatty)
|
80
|
+
|
81
|
+
# sort order is ambiguous, use index
|
82
|
+
names = assigns(:entries).collect(&:name)
|
83
|
+
assert names.index('BBBBB') < names.index('AAAAA')
|
84
|
+
assert names.index('BBBBB') < names.index('DDDDD')
|
85
|
+
assert names.index('EEEEE') < names.index('AAAAA')
|
86
|
+
assert names.index('EEEEE') < names.index('DDDDD')
|
87
|
+
assert names.index('AAAAA') < names.index('CCCCC')
|
88
|
+
assert names.index('AAAAA') < names.index('FFFFF')
|
89
|
+
assert names.index('DDDDD') < names.index('CCCCC')
|
90
|
+
assert names.index('DDDDD') < names.index('FFFFF')
|
72
91
|
end
|
73
92
|
|
74
93
|
def test_sort_with_search
|
@@ -78,6 +97,7 @@ class CrudTestModelsControllerTest < ActionController::TestCase
|
|
78
97
|
assert_present assigns(:entries)
|
79
98
|
assert_equal 3, assigns(:entries).size
|
80
99
|
assert_equal ['CCCCC', 'DDDDD', 'BBBBB'], assigns(:entries).collect(&:name)
|
100
|
+
assert_equal({:sort => 'chatty', :sort_dir => 'asc', :q => 'DDD'}, session[:list_params]['/crud_test_models'])
|
81
101
|
end
|
82
102
|
|
83
103
|
def test_new
|
@@ -41,6 +41,24 @@ class CustomAssertionsTest < ActiveSupport::TestCase
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
+
test "assert count succeeds if count matches" do
|
45
|
+
assert_nothing_raised do
|
46
|
+
assert_count 3, "ba", "barbabapa"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
test "assert count succeeds if count is zero" do
|
51
|
+
assert_nothing_raised do
|
52
|
+
assert_count 0, "bo", "barbabapa"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
test "assert count fails if count does not match" do
|
57
|
+
assert_raise(Test::Unit::AssertionFailedError) do
|
58
|
+
assert_count 2, "ba", "barbabapa"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
44
62
|
test "assert valid record succeeds" do
|
45
63
|
assert_nothing_raised do
|
46
64
|
assert_valid crud_test_models("AAAAA")
|
@@ -1,9 +1,17 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
require 'crud_test_model'
|
3
|
+
require 'custom_assertions'
|
3
4
|
|
4
5
|
class CrudHelperTest < ActionView::TestCase
|
5
6
|
|
7
|
+
REGEXP_ROWS = /<tr.+?<\/tr>/m
|
8
|
+
REGEXP_HEADERS = /<th.+?<\/th>/m
|
9
|
+
REGEXP_SORT_HEADERS = /<th><a .*?sort_dir=asc.*?>.*?<\/a><\/th>/m
|
10
|
+
REGEXP_ACTION_CELL = /<td class=\"center\"><a href.+?<\/a><\/td>/m
|
11
|
+
|
12
|
+
include CustomAssertions
|
6
13
|
include StandardHelper
|
14
|
+
include ListHelper
|
7
15
|
include CrudTestHelper
|
8
16
|
|
9
17
|
setup :reset_db, :setup_db, :create_test_data
|
@@ -16,9 +24,9 @@ class CrudHelperTest < ActionView::TestCase
|
|
16
24
|
crud_table
|
17
25
|
end
|
18
26
|
|
19
|
-
|
20
|
-
|
21
|
-
|
27
|
+
assert_count 7, REGEXP_ROWS, t
|
28
|
+
assert_count 11, REGEXP_SORT_HEADERS, t
|
29
|
+
assert_count 18, REGEXP_ACTION_CELL, t # show, edit, delete links
|
22
30
|
end
|
23
31
|
|
24
32
|
test "custom crud table with attributes" do
|
@@ -28,9 +36,9 @@ class CrudHelperTest < ActionView::TestCase
|
|
28
36
|
crud_table :name, :children, :companion_id
|
29
37
|
end
|
30
38
|
|
31
|
-
|
32
|
-
|
33
|
-
|
39
|
+
assert_count 7, REGEXP_ROWS, t
|
40
|
+
assert_count 3, REGEXP_SORT_HEADERS, t
|
41
|
+
assert_count 18, REGEXP_ACTION_CELL, t # show, edit, delete links
|
34
42
|
end
|
35
43
|
|
36
44
|
test "custom crud table with block" do
|
@@ -43,10 +51,10 @@ class CrudHelperTest < ActionView::TestCase
|
|
43
51
|
end
|
44
52
|
end
|
45
53
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
54
|
+
assert_count 7, REGEXP_ROWS, t
|
55
|
+
assert_count 4, REGEXP_HEADERS, t
|
56
|
+
assert_count 6, /<span>.+?<\/span>/m, t
|
57
|
+
assert_count 0, REGEXP_ACTION_CELL, t # no show, edit, delete links
|
50
58
|
end
|
51
59
|
|
52
60
|
test "custom crud table with attributes and block" do
|
@@ -58,62 +66,12 @@ class CrudHelperTest < ActionView::TestCase
|
|
58
66
|
end
|
59
67
|
end
|
60
68
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
69
|
+
assert_count 7, REGEXP_ROWS, t
|
70
|
+
assert_count 4, REGEXP_HEADERS, t
|
71
|
+
assert_count 6, /<span>.+?<\/span>/m, t
|
72
|
+
assert_count 0, REGEXP_ACTION_CELL, t # no show, edit, delete links
|
65
73
|
end
|
66
|
-
|
67
|
-
test "standard crud table with ascending sort params" do
|
68
|
-
def params
|
69
|
-
{:sort => 'children', :sort_dir => 'asc'}
|
70
|
-
end
|
71
74
|
|
72
|
-
@entries = CrudTestModel.all
|
73
|
-
|
74
|
-
t = with_test_routing do
|
75
|
-
crud_table
|
76
|
-
end
|
77
|
-
|
78
|
-
assert_match /(<tr.+?<\/tr>){7}/m, t
|
79
|
-
assert_match /(<th><a .*desc.*>Children<\/a> ↓<\/th>){1}/m, t
|
80
|
-
assert_match /(<th><a .*asc.*>.*<\/a><\/th>){3}/m, t
|
81
|
-
assert_match /(<td><a href.+?<\/a><\/td>.*?){18}/m, t
|
82
|
-
end
|
83
|
-
|
84
|
-
test "standard crud table with descending sort params" do
|
85
|
-
def params
|
86
|
-
{:sort => 'children', :sort_dir => 'desc'}
|
87
|
-
end
|
88
|
-
|
89
|
-
@entries = CrudTestModel.all
|
90
|
-
|
91
|
-
t = with_test_routing do
|
92
|
-
crud_table
|
93
|
-
end
|
94
|
-
|
95
|
-
assert_match /(<tr.+?<\/tr>){7}/m, t
|
96
|
-
assert_match /(<th><a .*asc.*>Children<\/a> ↑<\/th>){1}/m, t
|
97
|
-
assert_match /(<th><a .*asc.*>.*<\/a><\/th>){4}/m, t
|
98
|
-
assert_match /(<td><a href.+?<\/a><\/td>.*?){18}/m, t
|
99
|
-
end
|
100
|
-
|
101
|
-
test "crud table with custom column sort params" do
|
102
|
-
def params
|
103
|
-
{:sort => 'chatty', :sort_dir => 'asc'}
|
104
|
-
end
|
105
|
-
|
106
|
-
@entries = CrudTestModel.all
|
107
|
-
|
108
|
-
t = with_test_routing do
|
109
|
-
crud_table :name, :children, :chatty
|
110
|
-
end
|
111
|
-
|
112
|
-
assert_match /(<tr.+?<\/tr>){7}/m, t
|
113
|
-
assert_match /(<th><a .*desc.*>Chatty<\/a> ↓<\/th>){1}/m, t
|
114
|
-
assert_match /(<th><a .*asc.*>.*<\/a><\/th>){2}/m, t
|
115
|
-
assert_match /(<td><a href.+?<\/a><\/td>.*?){18}/m, t
|
116
|
-
end
|
117
75
|
|
118
76
|
test "crud form" do
|
119
77
|
@entry = CrudTestModel.first
|
@@ -152,15 +110,4 @@ class CrudHelperTest < ActionView::TestCase
|
|
152
110
|
true
|
153
111
|
end
|
154
112
|
|
155
|
-
|
156
|
-
private
|
157
|
-
|
158
|
-
def with_test_routing
|
159
|
-
with_routing do |set|
|
160
|
-
set.draw { resources :crud_test_models }
|
161
|
-
# used to define a controller in these tests
|
162
|
-
set.default_url_options = {:controller => 'crud_test_models'}
|
163
|
-
yield
|
164
|
-
end
|
165
|
-
end
|
166
113
|
end
|
@@ -0,0 +1,139 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'crud_test_model'
|
3
|
+
require 'custom_assertions'
|
4
|
+
|
5
|
+
class ListHelperTest < ActionView::TestCase
|
6
|
+
|
7
|
+
REGEXP_ROWS = /<tr.+?<\/tr>/m
|
8
|
+
REGEXP_HEADERS = /<th.+?<\/th>/m
|
9
|
+
REGEXP_SORT_HEADERS = /<th><a .*?sort_dir=asc.*?>.*?<\/a><\/th>/m
|
10
|
+
|
11
|
+
include StandardHelper
|
12
|
+
include CrudTestHelper
|
13
|
+
include CustomAssertions
|
14
|
+
|
15
|
+
setup :reset_db, :setup_db, :create_test_data
|
16
|
+
teardown :reset_db
|
17
|
+
|
18
|
+
test "standard list table" do
|
19
|
+
@entries = CrudTestModel.all
|
20
|
+
|
21
|
+
t = with_test_routing do
|
22
|
+
list_table
|
23
|
+
end
|
24
|
+
|
25
|
+
assert_count 7, REGEXP_ROWS, t
|
26
|
+
assert_count 11, REGEXP_SORT_HEADERS, t
|
27
|
+
end
|
28
|
+
|
29
|
+
test "custom list table with attributes" do
|
30
|
+
@entries = CrudTestModel.all
|
31
|
+
|
32
|
+
t = with_test_routing do
|
33
|
+
list_table :name, :children, :companion_id
|
34
|
+
end
|
35
|
+
|
36
|
+
assert_count 7, REGEXP_ROWS, t
|
37
|
+
assert_count 3, REGEXP_SORT_HEADERS, t
|
38
|
+
end
|
39
|
+
|
40
|
+
test "custom list table with block" do
|
41
|
+
@entries = CrudTestModel.all
|
42
|
+
|
43
|
+
t = with_test_routing do
|
44
|
+
list_table do |t|
|
45
|
+
t.attrs :name, :children, :companion_id
|
46
|
+
t.col("head") {|e| content_tag :span, e.income.to_s }
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
assert_count 7, REGEXP_ROWS, t
|
51
|
+
assert_count 4, REGEXP_HEADERS, t
|
52
|
+
assert_count 0, REGEXP_SORT_HEADERS, t
|
53
|
+
assert_count 6, /<span>.+?<\/span>/, t
|
54
|
+
end
|
55
|
+
|
56
|
+
test "custom list table with attributes and block" do
|
57
|
+
@entries = CrudTestModel.all
|
58
|
+
|
59
|
+
t = with_test_routing do
|
60
|
+
list_table :name, :children, :companion_id do |t|
|
61
|
+
t.col("head") {|e| content_tag :span, e.income.to_s }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
assert_count 7, REGEXP_ROWS, t
|
66
|
+
assert_count 3, REGEXP_SORT_HEADERS, t
|
67
|
+
assert_count 4, REGEXP_HEADERS, t
|
68
|
+
assert_count 6, /<span>.+?<\/span>/, t
|
69
|
+
end
|
70
|
+
|
71
|
+
test "standard list table with ascending sort params" do
|
72
|
+
def params
|
73
|
+
{:sort => 'children', :sort_dir => 'asc'}
|
74
|
+
end
|
75
|
+
|
76
|
+
@entries = CrudTestModel.all
|
77
|
+
|
78
|
+
t = with_test_routing do
|
79
|
+
list_table
|
80
|
+
end
|
81
|
+
|
82
|
+
assert_count 7, REGEXP_ROWS, t
|
83
|
+
assert_count 10, REGEXP_SORT_HEADERS, t
|
84
|
+
assert_count 1, /<th><a .*?sort_dir=desc.*?>Children<\/a> ↓<\/th>/, t
|
85
|
+
end
|
86
|
+
|
87
|
+
test "standard list table with descending sort params" do
|
88
|
+
def params
|
89
|
+
{:sort => 'children', :sort_dir => 'desc'}
|
90
|
+
end
|
91
|
+
|
92
|
+
@entries = CrudTestModel.all
|
93
|
+
|
94
|
+
t = with_test_routing do
|
95
|
+
list_table
|
96
|
+
end
|
97
|
+
|
98
|
+
assert_count 7, REGEXP_ROWS, t
|
99
|
+
assert_count 10, REGEXP_SORT_HEADERS, t
|
100
|
+
assert_count 1, /<th><a .*?sort_dir=asc.*?>Children<\/a> ↑<\/th>/, t
|
101
|
+
end
|
102
|
+
|
103
|
+
test "list table with custom column sort params" do
|
104
|
+
def params
|
105
|
+
{:sort => 'chatty', :sort_dir => 'asc'}
|
106
|
+
end
|
107
|
+
|
108
|
+
@entries = CrudTestModel.all
|
109
|
+
|
110
|
+
t = with_test_routing do
|
111
|
+
list_table :name, :children, :chatty
|
112
|
+
end
|
113
|
+
|
114
|
+
assert_count 7, REGEXP_ROWS, t
|
115
|
+
assert_count 2, REGEXP_SORT_HEADERS, t
|
116
|
+
assert_count 1, /<th><a .*?sort_dir=desc.*?>Chatty<\/a> ↓<\/th>/, t
|
117
|
+
end
|
118
|
+
|
119
|
+
test "default attributes do not include id" do
|
120
|
+
assert_equal [:name, :whatever, :children, :companion_id, :rating, :income,
|
121
|
+
:birthdate, :human, :remarks, :created_at, :updated_at], default_attrs
|
122
|
+
end
|
123
|
+
|
124
|
+
# Controller helper methods for the tests
|
125
|
+
|
126
|
+
def model_class
|
127
|
+
CrudTestModel
|
128
|
+
end
|
129
|
+
|
130
|
+
def params
|
131
|
+
{}
|
132
|
+
end
|
133
|
+
|
134
|
+
def sortable?(attr)
|
135
|
+
true
|
136
|
+
end
|
137
|
+
|
138
|
+
|
139
|
+
end
|
@@ -58,30 +58,27 @@ class StandardFormBuilderTest < ActionView::TestCase
|
|
58
58
|
|
59
59
|
test "belongs_to_field has all options by default" do
|
60
60
|
f = form.belongs_to_field(:companion_id)
|
61
|
-
|
62
|
-
assert_no_match /(\<option .*?){8}/m, f
|
61
|
+
assert_equal 7, f.scan('</option>').size
|
63
62
|
end
|
64
63
|
|
65
64
|
test "belongs_to_field with :list option" do
|
66
65
|
list = CrudTestModel.all
|
67
66
|
f = form.belongs_to_field(:companion_id, :list => [list.first, list.second])
|
68
|
-
|
69
|
-
assert_no_match /(\<option .*?){4}/m, f
|
67
|
+
assert_equal 3, f.scan('</option>').size
|
70
68
|
end
|
71
69
|
|
72
70
|
test "belongs_to_field with instance variable" do
|
73
71
|
list = CrudTestModel.all
|
74
72
|
@companions = [list.first, list.second]
|
75
73
|
f = form.belongs_to_field(:companion_id)
|
76
|
-
|
77
|
-
assert_no_match /(\<option .*?){4}/m, f
|
74
|
+
assert_equal 3, f.scan('</option>').size
|
78
75
|
end
|
79
76
|
|
80
77
|
test "belongs_to_field with empty list" do
|
81
78
|
@companions = []
|
82
79
|
f = form.belongs_to_field(:companion_id)
|
83
80
|
assert_match /none available/m, f
|
84
|
-
|
81
|
+
assert_equal 0, f.scan('</option>').size
|
85
82
|
end
|
86
83
|
|
87
84
|
test "string_field sets maxlength attribute if limit" do
|