table_helper 0.0.3
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/CHANGELOG +19 -0
- data/MIT-LICENSE +20 -0
- data/README +161 -0
- data/Rakefile +80 -0
- data/init.rb +1 -0
- data/lib/table_helper/body.rb +119 -0
- data/lib/table_helper/body_row.rb +86 -0
- data/lib/table_helper/cell.rb +51 -0
- data/lib/table_helper/collection_table.rb +60 -0
- data/lib/table_helper/footer.rb +47 -0
- data/lib/table_helper/header.rb +125 -0
- data/lib/table_helper/html_element.rb +46 -0
- data/lib/table_helper/row.rb +72 -0
- data/lib/table_helper.rb +182 -0
- data/test/body_row_test.rb +105 -0
- data/test/body_test.rb +271 -0
- data/test/cell_test.rb +52 -0
- data/test/collection_table_test.rb +254 -0
- data/test/footer_test.rb +72 -0
- data/test/header_test.rb +210 -0
- data/test/html_element_test.rb +74 -0
- data/test/row_test.rb +115 -0
- data/test/table_helper_test.rb +37 -0
- data/test/test_helper.rb +14 -0
- metadata +85 -0
data/test/footer_test.rb
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class FooterByDefaultTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@footer = PluginAWeek::TableHelper::Footer.new([])
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_should_hdie_when_empty
|
9
|
+
assert @footer.hide_when_empty
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class FooterTest < Test::Unit::TestCase
|
14
|
+
def setup
|
15
|
+
@footer = PluginAWeek::TableHelper::Footer.new([1])
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_should_include_custom_attributes
|
19
|
+
@footer[:class] = 'pretty'
|
20
|
+
|
21
|
+
expected = <<-end_eval
|
22
|
+
<tfoot class="pretty">
|
23
|
+
<tr>
|
24
|
+
</tr>
|
25
|
+
</tfoot>
|
26
|
+
end_eval
|
27
|
+
assert_html_equal expected, @footer.html
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_should_include_created_cells_when_built
|
31
|
+
@footer.cell :total, 20
|
32
|
+
|
33
|
+
expected = <<-end_eval
|
34
|
+
<tfoot>
|
35
|
+
<tr>
|
36
|
+
<td class="total">20</td>
|
37
|
+
</tr>
|
38
|
+
</tfoot>
|
39
|
+
end_eval
|
40
|
+
assert_html_equal expected, @footer.html
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class FooterWithEmptyCollectionTest < Test::Unit::TestCase
|
45
|
+
def setup
|
46
|
+
@footer = PluginAWeek::TableHelper::Footer.new([])
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_should_not_display_if_hide_when_empty
|
50
|
+
@footer.hide_when_empty = true
|
51
|
+
|
52
|
+
expected = <<-end_eval
|
53
|
+
<tfoot style="display: none;">
|
54
|
+
<tr>
|
55
|
+
</tr>
|
56
|
+
</tfoot>
|
57
|
+
end_eval
|
58
|
+
assert_html_equal expected, @footer.html
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_should_display_if_not_hide_when_empty
|
62
|
+
@footer.hide_when_empty = false
|
63
|
+
|
64
|
+
expected = <<-end_eval
|
65
|
+
<tfoot>
|
66
|
+
<tr>
|
67
|
+
</tr>
|
68
|
+
</tfoot>
|
69
|
+
end_eval
|
70
|
+
assert_html_equal expected, @footer.html
|
71
|
+
end
|
72
|
+
end
|
data/test/header_test.rb
ADDED
@@ -0,0 +1,210 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class HeaderByDefaultTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@header = PluginAWeek::TableHelper::Header.new([])
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_should_hide_when_empty
|
9
|
+
assert @header.hide_when_empty
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_should_have_no_columns
|
13
|
+
assert_equal [], @header.column_names
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class HeaderTest < Test::Unit::TestCase
|
18
|
+
class Post
|
19
|
+
def self.column_names
|
20
|
+
['title', 'author_name']
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class Reflection
|
25
|
+
def klass
|
26
|
+
Post
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
class PostCollection < Array
|
31
|
+
def proxy_reflection
|
32
|
+
Reflection.new
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_should_use_class_columns_if_class_has_column_names
|
37
|
+
header = PluginAWeek::TableHelper::Header.new([], Post)
|
38
|
+
assert_equal ['title', 'author_name'], header.column_names
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_should_have_no_column_names_if_class_has_no_column_names
|
42
|
+
header = PluginAWeek::TableHelper::Header.new([], Array)
|
43
|
+
assert_equal [], header.column_names
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_should_use_class_columns_if_collection_has_objects
|
47
|
+
header = PluginAWeek::TableHelper::Header.new([Post.new])
|
48
|
+
assert_equal ['title', 'author_name'], header.column_names
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_should_use_class_columns_if_collection_is_proxy
|
52
|
+
header = PluginAWeek::TableHelper::Header.new(PostCollection.new)
|
53
|
+
assert_equal ['title', 'author_name'], header.column_names
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_should_create_column_readers_if_column_names_found
|
57
|
+
header = PluginAWeek::TableHelper::Header.new([], Post)
|
58
|
+
|
59
|
+
assert header.respond_to?(:title)
|
60
|
+
assert_instance_of PluginAWeek::TableHelper::Cell, header.title
|
61
|
+
|
62
|
+
assert header.respond_to?(:author_name)
|
63
|
+
assert_instance_of PluginAWeek::TableHelper::Cell, header.author_name
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_should_create_column_reader_when_column_is_created
|
67
|
+
header = PluginAWeek::TableHelper::Header.new([])
|
68
|
+
header.column :title
|
69
|
+
|
70
|
+
assert_equal ['title'], header.column_names
|
71
|
+
assert_instance_of PluginAWeek::TableHelper::Cell, header.title
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_should_set_column_scope
|
75
|
+
header = PluginAWeek::TableHelper::Header.new([])
|
76
|
+
header.column :title
|
77
|
+
assert_equal 'col', header.title[:scope]
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_should_allow_html_options_to_be_specified_for_new_columns
|
81
|
+
header = PluginAWeek::TableHelper::Header.new([])
|
82
|
+
header.column :title, 'Title', :class => 'pretty'
|
83
|
+
assert_equal 'title pretty', header.title[:class]
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_should_use_column_name_for_default_content
|
87
|
+
header = PluginAWeek::TableHelper::Header.new([])
|
88
|
+
header.column :title
|
89
|
+
assert_equal '<th class="title" scope="col">Title</th>', header.title.html
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_should_sanitize_column_names
|
93
|
+
header = PluginAWeek::TableHelper::Header.new([])
|
94
|
+
header.column 'the-title'
|
95
|
+
|
96
|
+
assert header.respond_to?(:the_title)
|
97
|
+
assert_instance_of PluginAWeek::TableHelper::Cell, header.the_title
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_should_clear_existing_columns_when_first_column_is_created
|
101
|
+
header = PluginAWeek::TableHelper::Header.new([], Post)
|
102
|
+
assert_equal ['title', 'author_name'], header.column_names
|
103
|
+
|
104
|
+
header.column :created_on
|
105
|
+
|
106
|
+
assert !header.respond_to?(:title)
|
107
|
+
assert !header.respond_to?(:author_name)
|
108
|
+
assert_equal ['created_on'], header.column_names
|
109
|
+
end
|
110
|
+
|
111
|
+
def test_should_include_html_options
|
112
|
+
header = PluginAWeek::TableHelper::Header.new([Post.new])
|
113
|
+
header[:class] = 'pretty'
|
114
|
+
|
115
|
+
expected = <<-end_eval
|
116
|
+
<thead class="pretty">
|
117
|
+
<tr>
|
118
|
+
<th class="title" scope="col">Title</th>
|
119
|
+
<th class="author_name" scope="col">Author Name</th>
|
120
|
+
</tr>
|
121
|
+
</thead>
|
122
|
+
end_eval
|
123
|
+
assert_html_equal expected, header.html
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_should_include_html_options_for_header_row
|
127
|
+
header = PluginAWeek::TableHelper::Header.new([Post.new])
|
128
|
+
header.row[:class] = 'pretty'
|
129
|
+
|
130
|
+
expected = <<-end_eval
|
131
|
+
<thead>
|
132
|
+
<tr class="pretty">
|
133
|
+
<th class="title" scope="col">Title</th>
|
134
|
+
<th class="author_name" scope="col">Author Name</th>
|
135
|
+
</tr>
|
136
|
+
</thead>
|
137
|
+
end_eval
|
138
|
+
assert_html_equal expected, header.html
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
class HeaderWithEmptyCollectionTest < Test::Unit::TestCase
|
143
|
+
def setup
|
144
|
+
@header = PluginAWeek::TableHelper::Header.new([])
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_should_not_display_if_hide_when_empty
|
148
|
+
@header.hide_when_empty = true
|
149
|
+
|
150
|
+
expected = <<-end_eval
|
151
|
+
<thead style="display: none;">
|
152
|
+
<tr>
|
153
|
+
</tr>
|
154
|
+
</thead>
|
155
|
+
end_eval
|
156
|
+
assert_html_equal expected, @header.html
|
157
|
+
end
|
158
|
+
|
159
|
+
def test_should_display_if_not_hide_when_empty
|
160
|
+
@header.hide_when_empty = false
|
161
|
+
|
162
|
+
expected = <<-end_eval
|
163
|
+
<thead>
|
164
|
+
<tr>
|
165
|
+
</tr>
|
166
|
+
</thead>
|
167
|
+
end_eval
|
168
|
+
assert_html_equal expected, @header.html
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
class HeaderWithCollectionTest < Test::Unit::TestCase
|
173
|
+
class Post
|
174
|
+
def self.column_names
|
175
|
+
['title', 'author_name']
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
def setup
|
180
|
+
@header = PluginAWeek::TableHelper::Header.new([Post.new])
|
181
|
+
end
|
182
|
+
|
183
|
+
def test_should_display_if_hide_when_empty
|
184
|
+
@header.hide_when_empty = true
|
185
|
+
|
186
|
+
expected = <<-end_eval
|
187
|
+
<thead>
|
188
|
+
<tr>
|
189
|
+
<th class="title" scope="col">Title</th>
|
190
|
+
<th class="author_name" scope="col">Author Name</th>
|
191
|
+
</tr>
|
192
|
+
</thead>
|
193
|
+
end_eval
|
194
|
+
assert_html_equal expected, @header.html
|
195
|
+
end
|
196
|
+
|
197
|
+
def test_should_display_if_not_hide_when_empty
|
198
|
+
@header.hide_when_empty = false
|
199
|
+
|
200
|
+
expected = <<-end_eval
|
201
|
+
<thead>
|
202
|
+
<tr>
|
203
|
+
<th class="title" scope="col">Title</th>
|
204
|
+
<th class="author_name" scope="col">Author Name</th>
|
205
|
+
</tr>
|
206
|
+
</thead>
|
207
|
+
end_eval
|
208
|
+
assert_html_equal expected, @header.html
|
209
|
+
end
|
210
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class HtmlElementByDefaultTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@element = PluginAWeek::TableHelper::HtmlElement.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_should_generate_an_empty_tag
|
9
|
+
assert_equal '<></>', @element.html
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_not_have_any_html_options
|
13
|
+
element = PluginAWeek::TableHelper::HtmlElement.new
|
14
|
+
assert_nil element[:class]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class HtmlElementTest < Test::Unit::TestCase
|
19
|
+
class DivElement < PluginAWeek::TableHelper::HtmlElement
|
20
|
+
def tag_name
|
21
|
+
'div'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_should_set_html_options_on_initialization
|
26
|
+
element = PluginAWeek::TableHelper::HtmlElement.new(:class => 'fancy')
|
27
|
+
assert_equal 'fancy', element[:class]
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_should_symbolize_html_options
|
31
|
+
element = PluginAWeek::TableHelper::HtmlElement.new('class' => 'fancy')
|
32
|
+
assert_equal 'fancy', element[:class]
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_should_generate_entire_element_if_content_and_tag_name_specified
|
36
|
+
element = DivElement.new
|
37
|
+
element.instance_eval do
|
38
|
+
def content
|
39
|
+
'hello world'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
assert_equal '<div>hello world</div>', element.html
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_should_include_html_options_in_element_tag
|
47
|
+
element = DivElement.new
|
48
|
+
element[:class] = 'fancy'
|
49
|
+
|
50
|
+
assert_equal '<div class="fancy"></div>', element.html
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_should_save_changes_in_html_options
|
54
|
+
element = PluginAWeek::TableHelper::HtmlElement.new
|
55
|
+
element[:float] = 'left'
|
56
|
+
assert_equal 'left', element[:float]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class HtmlElementWithNoContentTest < Test::Unit::TestCase
|
61
|
+
class DivElement < PluginAWeek::TableHelper::HtmlElement
|
62
|
+
def tag_name
|
63
|
+
'div'
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def setup
|
68
|
+
@element = DivElement.new
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_should_generate_empty_tags
|
72
|
+
assert_equal '<div></div>', @element.html
|
73
|
+
end
|
74
|
+
end
|
data/test/row_test.rb
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
class RowByDefaultTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@row = PluginAWeek::TableHelper::Row.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_should_not_set_any_html_options
|
9
|
+
assert_nil @row[:class]
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_should_not_have_any_cells
|
13
|
+
assert_equal [], @row.cell_names
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
class RowTest < Test::Unit::TestCase
|
19
|
+
def setup
|
20
|
+
@row = PluginAWeek::TableHelper::Row.new
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_should_create_reader_after_building_cell
|
24
|
+
@row.cell :name
|
25
|
+
assert @row.respond_to?(:name)
|
26
|
+
assert_instance_of PluginAWeek::TableHelper::Cell, @row.name
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_should_use_cell_name_for_class_name
|
30
|
+
@row.cell :name
|
31
|
+
assert_equal 'name', @row.name[:class]
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_should_sanitize_cell_name_for_reader_method
|
35
|
+
@row.cell 'the-name'
|
36
|
+
|
37
|
+
assert @row.respond_to?(:the_name)
|
38
|
+
assert_instance_of PluginAWeek::TableHelper::Cell, @row.the_name
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_should_use_unsanitized_cell_name_for_cell_class
|
42
|
+
@row.cell 'the-name'
|
43
|
+
assert_equal ['the-name'], @row.cell_names
|
44
|
+
assert_equal 'the-name', @row.the_name[:class]
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_should_allow_html_options_when_building_cell
|
48
|
+
@row.cell :name, 'Name', :class => 'pretty'
|
49
|
+
|
50
|
+
assert_equal 'name pretty', @row.name[:class]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class RowWithoutCellsTest < Test::Unit::TestCase
|
55
|
+
def setup
|
56
|
+
@row = PluginAWeek::TableHelper::Row.new
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_should_be_able_to_clear_cells
|
60
|
+
@row.clear
|
61
|
+
assert_equal [], @row.cell_names
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_should_build_html
|
65
|
+
assert_equal '<tr></tr>', @row.html
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
class RowWithCellsTest < Test::Unit::TestCase
|
70
|
+
def setup
|
71
|
+
@row = PluginAWeek::TableHelper::Row.new
|
72
|
+
@row.cell :name
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_should_have_cell_names
|
76
|
+
assert_equal ['name'], @row.cell_names
|
77
|
+
end
|
78
|
+
|
79
|
+
def test_should_be_able_to_clear_existing_cells
|
80
|
+
@row.clear
|
81
|
+
|
82
|
+
assert_equal [], @row.cell_names
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_should_build_html
|
86
|
+
assert_equal '<tr><td class="name">Name</td></tr>', @row.html
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_should_create_new_cell_if_cell_already_exists
|
90
|
+
old_cell = @row.name
|
91
|
+
|
92
|
+
@row.cell :name
|
93
|
+
assert_not_same old_cell, @row.name
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_should_be_able_to_read_cell_after_clearing
|
97
|
+
@row.clear
|
98
|
+
@row.cell :name
|
99
|
+
|
100
|
+
assert_equal ['name'], @row.cell_names
|
101
|
+
assert @row.respond_to?(:name)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
class RowWithMultipleCellsTest < Test::Unit::TestCase
|
106
|
+
def setup
|
107
|
+
@row = PluginAWeek::TableHelper::Row.new
|
108
|
+
@row.cell :name
|
109
|
+
@row.cell :location
|
110
|
+
end
|
111
|
+
|
112
|
+
def test_should_build_html
|
113
|
+
assert_equal '<tr><td class="name">Name</td><td class="location">Location</td></tr>', @row.html
|
114
|
+
end
|
115
|
+
end
|