presenting 1.0.0 → 2.0.0

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.
Files changed (84) hide show
  1. data/app/controllers/presentation/assets_controller.rb +1 -1
  2. data/app/views/presentations/_details.erb +1 -1
  3. data/app/views/presentations/_field_search.erb +1 -1
  4. data/app/views/presentations/_form.erb +1 -1
  5. data/app/views/presentations/_grid.erb +1 -1
  6. data/app/views/presentations/_search.erb +1 -1
  7. data/config/routes.rb +7 -2
  8. data/lib/presentation/base.rb +10 -27
  9. data/lib/presentation/details.rb +2 -0
  10. data/lib/presentation/field_search.rb +2 -0
  11. data/lib/presentation/grid.rb +1 -1
  12. data/lib/presenting/engine.rb +7 -0
  13. data/lib/presenting/form_helpers.rb +1 -1
  14. data/lib/presenting/helpers.rb +7 -3
  15. data/lib/presenting/view.rb +3 -3
  16. data/lib/presenting.rb +38 -5
  17. data/test/assets_test.rb +5 -7
  18. data/test/details_test.rb +1 -1
  19. data/test/field_search_test.rb +1 -1
  20. data/test/form_test.rb +316 -287
  21. data/test/grid_test.rb +28 -8
  22. data/test/helpers_test.rb +2 -2
  23. data/test/presenting_test.rb +1 -1
  24. data/test/r3/Gemfile +7 -0
  25. data/test/r3/Gemfile.lock +82 -0
  26. data/test/r3/config/application.rb +12 -0
  27. data/test/r3/config/boot.rb +6 -0
  28. data/test/{rails → r3}/config/database.yml +6 -1
  29. data/test/r3/config/environment.rb +5 -0
  30. data/test/r3/config/environments/test.rb +35 -0
  31. data/test/r3/config.ru +4 -0
  32. data/test/r3/db/test.sqlite3 +0 -0
  33. data/test/r3/log/test.log +2354 -0
  34. data/test/r3/public/javascripts/presenting/grid.js +0 -0
  35. data/test/r3/public/javascripts/presenting/search.js +13 -0
  36. data/test/r3/public/stylesheets/presenting/details-color.css +7 -0
  37. data/test/r3/public/stylesheets/presenting/details.css +10 -0
  38. data/test/r3/public/stylesheets/presenting/form.css +1 -0
  39. data/test/r3/public/stylesheets/presenting/grid-color.css +71 -0
  40. data/test/r3/public/stylesheets/presenting/grid.css +64 -0
  41. data/test/r3/public/stylesheets/presenting/search-color.css +16 -0
  42. data/test/r3/public/stylesheets/presenting/search.css +45 -0
  43. data/test/search_conditions_test.rb +2 -2
  44. data/test/search_test.rb +1 -1
  45. data/test/test_helper.rb +8 -39
  46. metadata +45 -79
  47. data/rails/init.rb +0 -12
  48. data/test/rails/app/controllers/application_controller.rb +0 -15
  49. data/test/rails/app/controllers/users_controller.rb +0 -36
  50. data/test/rails/app/helpers/application_helper.rb +0 -3
  51. data/test/rails/app/helpers/users_helper.rb +0 -2
  52. data/test/rails/app/models/user.rb +0 -2
  53. data/test/rails/app/views/layouts/application.html.erb +0 -15
  54. data/test/rails/app/views/users/index.html.erb +0 -10
  55. data/test/rails/app/views/users/new.html.erb +0 -2
  56. data/test/rails/app/views/users/show.html.erb +0 -1
  57. data/test/rails/config/boot.rb +0 -109
  58. data/test/rails/config/environment.rb +0 -13
  59. data/test/rails/config/environments/development.rb +0 -17
  60. data/test/rails/config/environments/production.rb +0 -24
  61. data/test/rails/config/environments/test.rb +0 -22
  62. data/test/rails/config/locales/en.yml +0 -5
  63. data/test/rails/config/routes.rb +0 -5
  64. data/test/rails/db/development.sqlite3 +0 -0
  65. data/test/rails/db/migrate/20090213085444_create_users.rb +0 -13
  66. data/test/rails/db/migrate/20090213085607_populate_users.rb +0 -13
  67. data/test/rails/db/schema.rb +0 -23
  68. data/test/rails/db/test.sqlite3 +0 -0
  69. data/test/rails/log/development.log +0 -858
  70. data/test/rails/public/404.html +0 -30
  71. data/test/rails/public/422.html +0 -30
  72. data/test/rails/public/500.html +0 -33
  73. data/test/rails/public/javascripts/application.js +0 -2
  74. data/test/rails/public/javascripts/jquery.livequery.min.js +0 -11
  75. data/test/rails/public/javascripts/prototype.js +0 -4320
  76. data/test/rails/script/console +0 -3
  77. data/test/rails/script/dbconsole +0 -3
  78. data/test/rails/script/destroy +0 -3
  79. data/test/rails/script/generate +0 -3
  80. data/test/rails/script/plugin +0 -3
  81. data/test/rails/script/runner +0 -3
  82. data/test/rails/script/server +0 -3
  83. /data/app/assets/{javascript → javascripts}/grid.js +0 -0
  84. /data/app/assets/{javascript → javascripts}/search.js +0 -0
data/test/form_test.rb CHANGED
@@ -1,287 +1,316 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
-
3
- class FormTest < Presenting::Test
4
- def setup
5
- @f = Presentation::Form.new
6
- end
7
-
8
- def test_method_for_new_record
9
- @f.presentable = stub('record', :new_record? => true)
10
- assert_equal :post, @f.method
11
- end
12
-
13
- def test_method_for_existing_record
14
- @f.presentable = stub('record', :new_record? => false)
15
- assert_equal :put, @f.method
16
- end
17
-
18
- def test_button_for_new_record
19
- @f.presentable = stub('record', :new_record? => true)
20
- assert_equal 'Create', @f.button
21
- end
22
-
23
- def test_button_for_existing_record
24
- @f.presentable = stub('record', :new_record? => false)
25
- assert_equal 'Update', @f.button
26
- end
27
-
28
- def test_adding_a_field_by_name
29
- @f.fields = [:a]
30
-
31
- assert_equal :a, @f.fields.first.name
32
- assert_equal 'A', @f.fields.first.label
33
- assert_equal :string, @f.fields.first.type
34
- end
35
-
36
- def test_adding_a_field_by_name_and_type
37
- @f.fields = [{:b => :boolean}]
38
-
39
- assert_equal :b, @f.fields.first.name
40
- assert_equal 'B', @f.fields.first.label
41
- assert_equal :boolean, @f.fields.first.type
42
- end
43
-
44
- def test_adding_a_field_by_name_and_options
45
- @f.fields = [{:foo => {:label => "Foo Bar", :type => :select}}]
46
-
47
- assert_equal :foo, @f.fields.first.name
48
- assert_equal 'Foo Bar', @f.fields.first.label
49
- assert_equal :select, @f.fields.first.type
50
- end
51
-
52
- def test_fields_accessors_are_shortcuts_to_first_group
53
- @f.fields = [:a]
54
- assert_equal :a, @f.groups.first.fields.first.name
55
- assert_equal @f.fields, @f.groups.first.fields
56
- end
57
-
58
- def test_adding_an_unnamed_group_of_fields
59
- @f.groups = [[:a]]
60
-
61
- assert_nil @f.groups.first.name
62
- assert_equal :a, @f.groups.first.fields.first.name
63
- end
64
-
65
- def test_adding_a_named_group_of_fields
66
- @f.groups = [{"foo" => [:a]}]
67
-
68
- assert_equal "foo", @f.groups.first.name
69
- assert_equal :a, @f.groups.first.fields.first.name
70
- end
71
- end
72
-
73
- class FormFieldTest < Presenting::Test
74
- def setup
75
- @f = Presentation::Form::Field.new
76
- end
77
-
78
- def test_default_value
79
- @f.name = 'foo'
80
- assert_equal :foo, @f.value
81
- end
82
-
83
- def test_symbol_value
84
- @f.value = :foo
85
- assert_equal 'bar', @f.value_from(stub('record', :foo => 'bar'))
86
- end
87
-
88
- def test_string_value
89
- @f.value = 'foo'
90
- assert_equal 'foo', @f.value_from(stub('record', :foo => 'bar'))
91
- end
92
-
93
- def test_proc_value
94
- @f.value = proc{|r| r.foo }
95
- assert_equal 'bar', @f.value_from(stub('record', :foo => 'bar'))
96
- end
97
- end
98
-
99
- class FormRenderingTest < Presentation::RenderTest
100
- def setup
101
- @presentation = Presentation::Form.new
102
- @presentation.controller = TestController.new
103
- end
104
-
105
- def test_rendering_a_string_field
106
- @presentation.presentable = User.new(:name => 'bob smith')
107
- @presentation.fields = [:name]
108
-
109
- assert_select 'form div.field' do
110
- assert_select 'label', 'Name'
111
- assert_select "input[type=text][name='user[name]'][value='bob smith']"
112
- end
113
- end
114
-
115
- def test_rendering_a_string_field_with_a_custom_value
116
- @presentation.presentable = User.new(:name => 'bob smith')
117
- @presentation.fields << {:name => {:value => 'test'}}
118
-
119
- assert_select 'form div.field' do
120
- assert_select "input[type=text][name='user[name]'][value='test']"
121
- end
122
- end
123
-
124
- def test_rendering_a_text_field
125
- @presentation.presentable = User.new(:name => 'bob smith')
126
- @presentation.fields = [{:name => :text}]
127
-
128
- assert_select 'form div.field' do
129
- assert_select 'label', 'Name'
130
- assert_select "textarea[name='user[name]']", 'bob smith'
131
- end
132
- end
133
-
134
- def test_rendering_a_text_field_with_a_custom_value
135
- @presentation.presentable = User.new(:name => 'bob smith')
136
- @presentation.fields << {:name => {:type => :text, :value => 'test'}}
137
-
138
- assert_select 'form div.field' do
139
- assert_select "textarea[name='user[name]']", 'test'
140
- end
141
- end
142
-
143
- def test_rendering_a_readonly_field
144
- @presentation.presentable = User.new(:name => 'bob smith')
145
- @presentation.fields = [{:name => :readonly}]
146
-
147
- assert_select 'form div.field' do
148
- assert_select 'label', 'Name'
149
- assert_select "input[type=text][disabled=disabled][name='user[name]'][value='bob smith']"
150
- end
151
- end
152
-
153
- def test_rendering_a_readonly_field_with_a_custom_value
154
- @presentation.presentable = User.new(:name => 'bob smith')
155
- @presentation.fields << {:name => {:type => :readonly, :value => 'test'}}
156
-
157
- assert_select 'form div.field' do
158
- assert_select "input[type=text][disabled=disabled][name='user[name]'][value='test']"
159
- end
160
- end
161
-
162
- def test_rendering_a_password_field
163
- @presentation.presentable = User.new(:name => 'bob smith')
164
- @presentation.fields = [{:name => :password}]
165
-
166
- assert_select 'form div.field' do
167
- assert_select 'label', 'Name'
168
- assert_select "input[type=password][name='user[name]'][value='bob smith']"
169
- end
170
- end
171
-
172
- def test_rendering_a_boolean_field
173
- @presentation.presentable = User.new(:suspended => false, :registered => true)
174
- @presentation.fields = [{:suspended => :boolean}, {:registered => :boolean}]
175
-
176
- assert_select 'form div.field:nth-of-type(1)' do
177
- assert_select 'label', 'Suspended'
178
- assert_select "input[type=checkbox][name='user[suspended]']"
179
- end
180
- assert_select 'form div.field:nth-of-type(2)' do
181
- assert_select 'label', 'Registered'
182
- assert_select "input[type=checkbox][name='user[registered]'][checked=checked]"
183
- end
184
- end
185
-
186
- def test_rendering_a_hidden_field
187
- @presentation.presentable = User.new(:suspended => false)
188
- @presentation.fields = [{:suspended => :hidden}]
189
-
190
- assert_select 'form' do
191
- assert_select 'label', {:text => 'Suspended', :count => 0}
192
- assert_select "input[type=hidden][name='user[suspended]']"
193
- end
194
- end
195
-
196
- def test_rendering_a_dropdown_field
197
- @presentation.presentable = User.new(:prefix => 'mr')
198
- @presentation.fields = [{:prefix => {:type => :dropdown, :type_options => [['Mr.', 'mr'], ['Mrs.', 'mrs']]}}]
199
-
200
- assert_select 'form div.field' do
201
- assert_select 'label', 'Prefix'
202
- assert_select "select[name='user[prefix]']" do
203
- assert_select "option[value=mr][selected=selected]", "Mr."
204
- assert_select "option[value=mrs]", "Mrs."
205
- end
206
- end
207
- end
208
-
209
- def test_rendering_a_radios_field
210
- @presentation.presentable = User.new(:prefix => 'mr')
211
- @presentation.fields = [{:prefix => {:type => :radios, :type_options => [['Mr.', 'mr'], ['Mrs.', 'mrs']]}}]
212
-
213
- assert_select 'form div.field' do
214
- assert_select 'label', 'Prefix'
215
- assert_select "label[for=user_prefix_mr]", "Mr."
216
- assert_select "input[type=radio][name='user[prefix]'][value=mr][checked=checked]"
217
- assert_select "label[for=user_prefix_mrs]", "Mrs."
218
- assert_select "input[type=radio][name='user[prefix]'][value=mrs]"
219
- end
220
- end
221
-
222
- def test_rendering_a_multi_select_field
223
- @presentation.presentable = User.new(:role_ids => [1,3])
224
- @presentation.fields = [{:role_ids => {:type => :multi_select, :type_options => [['A', 1], ['B', 2], ['C', 3]], :label => "Roles"}}]
225
-
226
- assert_select 'form div.field' do
227
- assert_select 'label', 'Roles'
228
- assert_select "select[name='user[role_ids][]'][multiple=multiple]" do
229
- assert_select "option[value=1][selected=selected]", "A"
230
- assert_select "option[value=2]", "B"
231
- assert_select "option[value=3][selected=selected]", "C"
232
- end
233
- end
234
- end
235
-
236
- def test_rendering_a_group_of_fields
237
- @presentation.presentable = User.new
238
- @presentation.groups = [
239
- [:name, :email],
240
- {"flags" => [:registered, :suspended]}
241
- ]
242
-
243
- assert_select "form fieldset:nth-of-type(1)" do
244
- assert_select "legend", false
245
- assert_select "div.field input[name='user[name]']"
246
- assert_select "div.field input[name='user[email]']"
247
- end
248
- assert_select "form fieldset:nth-of-type(2)" do
249
- assert_select "legend", "flags"
250
- assert_select "div.field input[name='user[registered]']"
251
- assert_select "div.field input[name='user[suspended]']"
252
- end
253
- end
254
-
255
- class User
256
- include Presenting::Configurable
257
-
258
- attr_accessor :prefix
259
- attr_accessor :name
260
- attr_accessor :email
261
- attr_accessor :registered
262
- attr_accessor :suspended
263
- attr_accessor :role_ids
264
-
265
- ##
266
- ## duck typing
267
- ##
268
-
269
- def new_record=(val)
270
- @new_record = val
271
- end
272
-
273
- def new_record?
274
- !! @new_record
275
- end
276
-
277
- def id
278
- @id ||= new_record? ? nil : '12345'
279
- end
280
-
281
- def to_param
282
- id
283
- end
284
-
285
- def self.name; 'User' end
286
- end
287
- end
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class FormTest < Presenting::Test
4
+ def setup
5
+ @f = Presentation::Form.new
6
+ end
7
+
8
+ def test_method_for_new_record
9
+ @f.presentable = stub('record', :new_record? => true)
10
+ assert_equal :post, @f.method
11
+ end
12
+
13
+ def test_method_for_existing_record
14
+ @f.presentable = stub('record', :new_record? => false)
15
+ assert_equal :put, @f.method
16
+ end
17
+
18
+ def test_button_for_new_record
19
+ @f.presentable = stub('record', :new_record? => true)
20
+ assert_equal 'Create', @f.button
21
+ end
22
+
23
+ def test_button_for_existing_record
24
+ @f.presentable = stub('record', :new_record? => false)
25
+ assert_equal 'Update', @f.button
26
+ end
27
+
28
+ def test_adding_a_field_by_name
29
+ @f.fields = [:a]
30
+
31
+ assert_equal :a, @f.fields.first.name
32
+ assert_equal 'A', @f.fields.first.label
33
+ assert_equal :string, @f.fields.first.type
34
+ end
35
+
36
+ def test_adding_a_field_by_name_and_type
37
+ @f.fields = [{:b => :boolean}]
38
+
39
+ assert_equal :b, @f.fields.first.name
40
+ assert_equal 'B', @f.fields.first.label
41
+ assert_equal :boolean, @f.fields.first.type
42
+ end
43
+
44
+ def test_adding_a_field_by_name_and_options
45
+ @f.fields = [{:foo => {:label => "Foo Bar", :type => :select}}]
46
+
47
+ assert_equal :foo, @f.fields.first.name
48
+ assert_equal 'Foo Bar', @f.fields.first.label
49
+ assert_equal :select, @f.fields.first.type
50
+ end
51
+
52
+ def test_fields_accessors_are_shortcuts_to_first_group
53
+ @f.fields = [:a]
54
+ assert_equal :a, @f.groups.first.fields.first.name
55
+ assert_equal @f.fields, @f.groups.first.fields
56
+ end
57
+
58
+ def test_adding_an_unnamed_group_of_fields
59
+ @f.groups = [[:a]]
60
+
61
+ assert_nil @f.groups.first.name
62
+ assert_equal :a, @f.groups.first.fields.first.name
63
+ end
64
+
65
+ def test_adding_a_named_group_of_fields
66
+ @f.groups = [{"foo" => [:a]}]
67
+
68
+ assert_equal "foo", @f.groups.first.name
69
+ assert_equal :a, @f.groups.first.fields.first.name
70
+ end
71
+ end
72
+
73
+ class FormFieldTest < Presenting::Test
74
+ def setup
75
+ @f = Presentation::Form::Field.new
76
+ end
77
+
78
+ def test_default_value
79
+ @f.name = 'foo'
80
+ assert_equal :foo, @f.value
81
+ end
82
+
83
+ def test_symbol_value
84
+ @f.value = :foo
85
+ assert_equal 'bar', @f.value_from(stub('record', :foo => 'bar'))
86
+ end
87
+
88
+ def test_string_value
89
+ @f.value = 'foo'
90
+ assert_equal 'foo', @f.value_from(stub('record', :foo => 'bar'))
91
+ end
92
+
93
+ def test_proc_value
94
+ @f.value = proc{|r| r.foo }
95
+ assert_equal 'bar', @f.value_from(stub('record', :foo => 'bar'))
96
+ end
97
+ end
98
+
99
+ class FormRenderingTest < Presentation::RenderTest
100
+ def setup
101
+ Rails.application.routes.draw do resources :users end
102
+ @presentation = Presentation::Form.new
103
+ @presentation.controller = ActionView::TestCase::TestController.new
104
+ end
105
+
106
+ def teardown
107
+ Rails.application.reload_routes!
108
+ end
109
+
110
+ def test_rendering_a_string_field
111
+ @presentation.presentable = User.new(:name => 'bob smith')
112
+ @presentation.fields = [:name]
113
+
114
+ assert_select 'form div.field' do
115
+ assert_select 'label', 'Name'
116
+ assert_select "input[type=text][name='user[name]'][value='bob smith']"
117
+ end
118
+ end
119
+
120
+ def test_rendering_a_string_field_with_a_custom_value
121
+ @presentation.presentable = User.new(:name => 'bob smith')
122
+ @presentation.fields << {:name => {:value => 'test'}}
123
+
124
+ assert_select 'form div.field' do
125
+ assert_select "input[type=text][name='user[name]'][value='test']"
126
+ end
127
+ end
128
+
129
+ def test_rendering_a_text_field
130
+ @presentation.presentable = User.new(:name => 'bob smith')
131
+ @presentation.fields = [{:name => :text}]
132
+
133
+ assert_select 'form div.field' do
134
+ assert_select 'label', 'Name'
135
+ assert_select "textarea[name='user[name]']", 'bob smith'
136
+ end
137
+ end
138
+
139
+ def test_rendering_a_text_field_with_a_custom_value
140
+ @presentation.presentable = User.new(:name => 'bob smith')
141
+ @presentation.fields << {:name => {:type => :text, :value => 'test'}}
142
+
143
+ assert_select 'form div.field' do
144
+ assert_select "textarea[name='user[name]']", 'test'
145
+ end
146
+ end
147
+
148
+ def test_rendering_a_readonly_field
149
+ @presentation.presentable = User.new(:name => 'bob smith')
150
+ @presentation.fields = [{:name => :readonly}]
151
+
152
+ assert_select 'form div.field' do
153
+ assert_select 'label', 'Name'
154
+ assert_select "input[type=text][disabled=disabled][name='user[name]'][value='bob smith']"
155
+ end
156
+ end
157
+
158
+ def test_rendering_a_readonly_field_with_a_custom_value
159
+ @presentation.presentable = User.new(:name => 'bob smith')
160
+ @presentation.fields << {:name => {:type => :readonly, :value => 'test'}}
161
+
162
+ assert_select 'form div.field' do
163
+ assert_select "input[type=text][disabled=disabled][name='user[name]'][value='test']"
164
+ end
165
+ end
166
+
167
+ def test_rendering_a_password_field
168
+ @presentation.presentable = User.new(:name => 'bob smith')
169
+ @presentation.fields = [{:name => :password}]
170
+
171
+ assert_select 'form div.field' do
172
+ assert_select 'label', 'Name'
173
+ assert_select "input[type=password][name='user[name]'][value='bob smith']"
174
+ end
175
+ end
176
+
177
+ def test_rendering_a_boolean_field
178
+ @presentation.presentable = User.new(:suspended => false, :registered => true)
179
+ @presentation.fields = [{:suspended => :boolean}, {:registered => :boolean}]
180
+
181
+ assert_select 'form div.field:nth-of-type(1)' do
182
+ assert_select 'label', 'Suspended'
183
+ assert_select "input[type=checkbox][name='user[suspended]']"
184
+ end
185
+ assert_select 'form div.field:nth-of-type(2)' do
186
+ assert_select 'label', 'Registered'
187
+ assert_select "input[type=checkbox][name='user[registered]'][checked=checked]"
188
+ end
189
+ end
190
+
191
+ def test_rendering_a_hidden_field
192
+ @presentation.presentable = User.new(:suspended => false)
193
+ @presentation.fields = [{:suspended => :hidden}]
194
+
195
+ assert_select 'form' do
196
+ assert_select 'label', {:text => 'Suspended', :count => 0}
197
+ assert_select "input[type=hidden][name='user[suspended]']"
198
+ end
199
+ end
200
+
201
+ def test_rendering_a_dropdown_field
202
+ @presentation.presentable = User.new(:prefix => 'mr')
203
+ @presentation.fields = [{:prefix => {:type => :dropdown, :type_options => [['Mr.', 'mr'], ['Mrs.', 'mrs']]}}]
204
+
205
+ assert_select 'form div.field' do
206
+ assert_select 'label', 'Prefix'
207
+ assert_select "select[name='user[prefix]']" do
208
+ assert_select "option[value=mr][selected=selected]", "Mr."
209
+ assert_select "option[value=mrs]", "Mrs."
210
+ end
211
+ end
212
+ end
213
+
214
+ def test_rendering_a_radios_field
215
+ @presentation.presentable = User.new(:prefix => 'mr')
216
+ @presentation.fields = [{:prefix => {:type => :radios, :type_options => [['Mr.', 'mr'], ['Mrs.', 'mrs']]}}]
217
+
218
+ assert_select 'form div.field' do
219
+ assert_select 'label', 'Prefix'
220
+ assert_select "label[for=user_prefix_mr]", "Mr."
221
+ assert_select "input[type=radio][name='user[prefix]'][value=mr][checked=checked]"
222
+ assert_select "label[for=user_prefix_mrs]", "Mrs."
223
+ assert_select "input[type=radio][name='user[prefix]'][value=mrs]"
224
+ end
225
+ end
226
+
227
+ def test_rendering_a_multi_select_field
228
+ @presentation.presentable = User.new(:role_ids => [1,3])
229
+ @presentation.fields = [{:role_ids => {:type => :multi_select, :type_options => [['A', 1], ['B', 2], ['C', 3]], :label => "Roles"}}]
230
+
231
+ assert_select 'form div.field' do
232
+ assert_select 'label', 'Roles'
233
+ assert_select "select[name='user[role_ids][]'][multiple=multiple]" do
234
+ assert_select "option[value=1][selected=selected]", "A"
235
+ assert_select "option[value=2]", "B"
236
+ assert_select "option[value=3][selected=selected]", "C"
237
+ end
238
+ end
239
+ end
240
+
241
+ def test_rendering_a_group_of_fields
242
+ @presentation.presentable = User.new
243
+ @presentation.groups = [
244
+ [:name, :email],
245
+ {"flags" => [:registered, :suspended]}
246
+ ]
247
+
248
+ assert_select "form fieldset:nth-of-type(1)" do
249
+ assert_select "legend", false
250
+ assert_select "div.field input[name='user[name]']"
251
+ assert_select "div.field input[name='user[email]']"
252
+ end
253
+ assert_select "form fieldset:nth-of-type(2)" do
254
+ assert_select "legend", "flags"
255
+ assert_select "div.field input[name='user[registered]']"
256
+ assert_select "div.field input[name='user[suspended]']"
257
+ end
258
+ end
259
+
260
+ class User
261
+ include Presenting::Configurable
262
+
263
+ attr_accessor :prefix
264
+ attr_accessor :name
265
+ attr_accessor :email
266
+ attr_accessor :registered
267
+ attr_accessor :suspended
268
+ attr_accessor :role_ids
269
+
270
+ ##
271
+ ## duck typing
272
+ ##
273
+
274
+ def new_record=(val)
275
+ @new_record = val
276
+ end
277
+
278
+ def new_record?
279
+ !! @new_record
280
+ end
281
+
282
+ ##
283
+ ## Keys
284
+ ##
285
+
286
+ def id
287
+ @id ||= new_record? ? nil : '12345'
288
+ end
289
+
290
+ def to_key
291
+ new_record? ? nil : [ id ]
292
+ end
293
+
294
+ def to_param
295
+ id
296
+ end
297
+
298
+ ##
299
+ ## Naming
300
+ ##
301
+
302
+ extend ActiveModel::Naming
303
+
304
+ # i actually want this model's name to not include the FormRenderingTest namespace
305
+ # so i'm stubbing out the ActiveModel::Name with my own structure
306
+ def self.model_name
307
+ @_model_name ||= Name.new(:plural => 'users', :singular => 'user')
308
+ end
309
+ class Name
310
+ attr_accessor :plural, :singular
311
+ def initialize(hash)
312
+ hash.each { |k, v| self.instance_variable_set("@#{k}", v) }
313
+ end
314
+ end
315
+ end
316
+ end