dry_crud 1.2.0 → 1.2.5
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/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
|