view_mapper 0.3.3 → 0.3.4

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 (81) hide show
  1. data/README.rdoc +3 -1
  2. data/VERSION +1 -1
  3. data/lib/view_mapper.rb +1 -0
  4. data/lib/view_mapper/belongs_to_parent_models.rb +12 -26
  5. data/lib/view_mapper/has_many_child_models.rb +9 -9
  6. data/lib/view_mapper/model_info.rb +56 -18
  7. data/lib/view_mapper/views/belongs_to/belongs_to_view.rb +14 -0
  8. data/lib/view_mapper/views/belongs_to_auto_complete/belongs_to_auto_complete_view.rb +9 -2
  9. data/lib/view_mapper/views/has_many/templates/helper.rb +1 -1
  10. data/lib/view_mapper/views/has_many/templates/view_child_form.html.erb +1 -1
  11. data/lib/view_mapper/views/has_many/templates/view_form.html.erb +1 -1
  12. data/lib/view_mapper/views/has_many_existing/has_many_existing_view.rb +126 -0
  13. data/lib/view_mapper/views/has_many_existing/templates/model.rb +21 -0
  14. data/lib/view_mapper/views/has_many_existing/templates/view_child_form.html.erb +16 -0
  15. data/lib/view_mapper/views/has_many_existing/templates/view_form.html.erb +20 -0
  16. data/lib/view_mapper/views/has_many_existing/templates/view_show.html.erb +26 -0
  17. data/test/generators/scaffold_for_view/scaffold_for_view_generator_test.rb +15 -15
  18. data/test/generators/view_for/view_for_generator_test.rb +18 -18
  19. data/test/model_info_test.rb +91 -20
  20. data/test/test_helper.rb +75 -105
  21. data/test/views/auto_complete/auto_complete_test.rb +104 -102
  22. data/test/views/auto_complete/expected_templates/edit.html.erb +6 -6
  23. data/test/views/auto_complete/expected_templates/expected_routes.rb +1 -1
  24. data/test/views/auto_complete/expected_templates/index.html.erb +10 -10
  25. data/test/views/auto_complete/expected_templates/new.html.erb +5 -5
  26. data/test/views/auto_complete/expected_templates/show.html.erb +6 -6
  27. data/test/views/auto_complete/expected_templates/{testies.html.erb → test_models.html.erb} +1 -1
  28. data/test/views/auto_complete/expected_templates/test_models_controller.rb +89 -0
  29. data/test/views/belongs_to/belongs_to_test.rb +238 -202
  30. data/test/views/belongs_to/expected_templates/_form.html.erb +4 -4
  31. data/test/views/belongs_to/expected_templates/child_model.rb +10 -0
  32. data/test/views/belongs_to/expected_templates/create_child_models.rb +18 -0
  33. data/test/views/belongs_to/expected_templates/edit.html.erb +4 -4
  34. data/test/views/belongs_to/expected_templates/index.html.erb +11 -11
  35. data/test/views/belongs_to/expected_templates/new.html.erb +3 -3
  36. data/test/views/belongs_to/expected_templates/show.html.erb +7 -7
  37. data/test/views/belongs_to_auto_complete/belongs_to_auto_complete_test.rb +440 -406
  38. data/test/views/belongs_to_auto_complete/expected_templates/_form.html.erb +4 -4
  39. data/test/views/belongs_to_auto_complete/expected_templates/child_model.rb +16 -0
  40. data/test/views/belongs_to_auto_complete/expected_templates/{some_other_models.html.erb → child_models.html.erb} +1 -1
  41. data/test/views/belongs_to_auto_complete/expected_templates/child_models_controller.rb +89 -0
  42. data/test/views/belongs_to_auto_complete/expected_templates/create_child_models.rb +18 -0
  43. data/test/views/belongs_to_auto_complete/expected_templates/edit.html.erb +4 -4
  44. data/test/views/belongs_to_auto_complete/expected_templates/expected_routes.rb +2 -2
  45. data/test/views/belongs_to_auto_complete/expected_templates/index.html.erb +11 -11
  46. data/test/views/belongs_to_auto_complete/expected_templates/new.html.erb +3 -3
  47. data/test/views/belongs_to_auto_complete/expected_templates/show.html.erb +7 -7
  48. data/test/views/has_many/expected_templates/_form.html.erb +8 -8
  49. data/test/views/has_many/expected_templates/{_person.html.erb → _second_child_model.html.erb} +5 -5
  50. data/test/views/has_many/expected_templates/create_parent_models.rb +16 -0
  51. data/test/views/has_many/expected_templates/edit.html.erb +4 -4
  52. data/test/views/has_many/expected_templates/index.html.erb +7 -7
  53. data/test/views/has_many/expected_templates/new.html.erb +3 -3
  54. data/test/views/has_many/expected_templates/{parent.rb → parent_model.rb} +5 -5
  55. data/test/views/has_many/expected_templates/show.html.erb +15 -15
  56. data/test/views/has_many/has_many_view_test.rb +334 -292
  57. data/test/views/has_many_existing/expected_templates/_assignment.html.erb +14 -0
  58. data/test/views/has_many_existing/expected_templates/_form.html.erb +16 -0
  59. data/test/views/{has_many/expected_templates/create_parents.rb → has_many_existing/expected_templates/create_programmers.rb} +3 -3
  60. data/test/views/has_many_existing/expected_templates/edit.html.erb +11 -0
  61. data/test/views/has_many_existing/expected_templates/index.html.erb +20 -0
  62. data/test/views/has_many_existing/expected_templates/new.html.erb +10 -0
  63. data/test/views/has_many_existing/expected_templates/programmer.rb +10 -0
  64. data/test/views/has_many_existing/expected_templates/show.html.erb +20 -0
  65. data/test/views/has_many_existing/has_many_existing_test.rb +495 -0
  66. data/test/views/paperclip/expected_templates/{create_testies.rb → create_test_models.rb} +3 -3
  67. data/test/views/paperclip/expected_templates/edit.html.erb +4 -4
  68. data/test/views/paperclip/expected_templates/index.html.erb +10 -10
  69. data/test/views/paperclip/expected_templates/new.html.erb +3 -3
  70. data/test/views/paperclip/expected_templates/show.html.erb +8 -8
  71. data/test/views/paperclip/expected_templates/{testy.rb → test_model.rb} +1 -1
  72. data/test/views/paperclip/paperclip_view_test.rb +254 -226
  73. data/view_mapper.gemspec +43 -27
  74. metadata +64 -37
  75. data/test/views/auto_complete/expected_templates/actual_index +0 -26
  76. data/test/views/auto_complete/expected_templates/testies_controller.rb +0 -89
  77. data/test/views/belongs_to/expected_templates/create_some_other_models.rb +0 -18
  78. data/test/views/belongs_to/expected_templates/some_other_model.rb +0 -10
  79. data/test/views/belongs_to_auto_complete/expected_templates/create_some_other_models.rb +0 -18
  80. data/test/views/belongs_to_auto_complete/expected_templates/some_other_model.rb +0 -16
  81. data/test/views/belongs_to_auto_complete/expected_templates/some_other_models_controller.rb +0 -89
@@ -0,0 +1,14 @@
1
+ <div class="child">
2
+ <p>
3
+ Assignment <%= f.label :name %><br />
4
+ <%= f.text_field :name %>
5
+ </p>
6
+ <p>
7
+ Project:<br />
8
+ <%= f.collection_select(:project_id, Project.all, :id, :name, { :prompt => true }) %>
9
+ </p>
10
+ <p>
11
+ <%= f.hidden_field :_destroy, :class => 'delete' %>
12
+ <%= remove_child_link 'remove', f %>
13
+ </p>
14
+ </div>
@@ -0,0 +1,16 @@
1
+ <%= f.error_messages %>
2
+
3
+ <p>
4
+ <%= f.label :name %><br />
5
+ <%= f.text_field :name %>
6
+ </p>
7
+
8
+ <div id='assignment_children'>
9
+ <% f.fields_for :assignments do |assignment_form| %>
10
+ <%= render :partial => 'assignment', :locals => { :f => assignment_form } %>
11
+ <% end %>
12
+ </div>
13
+
14
+ <p>
15
+ <%= add_child_link 'Add Assignment', 'assignment', f %>
16
+ </p>
@@ -1,6 +1,6 @@
1
- class CreateParents < ActiveRecord::Migration
1
+ class CreateProgrammers < ActiveRecord::Migration
2
2
  def self.up
3
- create_table :parents do |t|
3
+ create_table :programmers do |t|
4
4
  t.string :first_name
5
5
  t.string :last_name
6
6
  t.string :address
@@ -11,6 +11,6 @@ class CreateParents < ActiveRecord::Migration
11
11
  end
12
12
 
13
13
  def self.down
14
- drop_table :parents
14
+ drop_table :programmers
15
15
  end
16
16
  end
@@ -0,0 +1,11 @@
1
+ <h1>Editing programmer</h1>
2
+
3
+ <% form_for(@programmer) do |f| %>
4
+ <%= render :partial => 'form', :locals => { :f => f } %>
5
+ <p>
6
+ <%= f.submit 'Update' %>
7
+ </p>
8
+ <% end %>
9
+
10
+ <%= link_to 'Show', @programmer %> |
11
+ <%= link_to 'Back', programmers_path %>
@@ -0,0 +1,20 @@
1
+ <h1>Listing programmers</h1>
2
+
3
+ <table>
4
+ <tr>
5
+ <th>Name</th>
6
+ </tr>
7
+
8
+ <% @programmers.each do |programmer| %>
9
+ <tr>
10
+ <td><%=h programmer.name %></td>
11
+ <td><%= link_to 'Show', programmer %></td>
12
+ <td><%= link_to 'Edit', edit_programmer_path(programmer) %></td>
13
+ <td><%= link_to 'Destroy', programmer, :confirm => 'Are you sure?', :method => :delete %></td>
14
+ </tr>
15
+ <% end %>
16
+ </table>
17
+
18
+ <br />
19
+
20
+ <%= link_to 'New programmer', new_programmer_path %>
@@ -0,0 +1,10 @@
1
+ <h1>New programmer</h1>
2
+
3
+ <% form_for(@programmer) do |f| %>
4
+ <%= render :partial => 'form', :locals => { :f => f } %>
5
+ <p>
6
+ <%= f.submit 'Create' %>
7
+ </p>
8
+ <% end %>
9
+
10
+ <%= link_to 'Back', programmers_path %>
@@ -0,0 +1,10 @@
1
+ class Programmer < ActiveRecord::Base
2
+ has_many :projects, :through => :assignments
3
+ has_many :assignments
4
+ accepts_nested_attributes_for :assignments,
5
+ :allow_destroy => true,
6
+ :reject_if => proc { |attrs|
7
+ attrs['name'].blank? &&
8
+ attrs['project_id'].blank?
9
+ }
10
+ end
@@ -0,0 +1,20 @@
1
+ <p>
2
+ <b>Name:</b>
3
+ <%=h @programmer.name %>
4
+ </p>
5
+
6
+ <% @programmer.assignments.each do |assignment| %>
7
+ <div class="child">
8
+ <p>
9
+ <b>Assignment Name:</b>
10
+ <%=h assignment.name %>
11
+ </p>
12
+ <p>
13
+ <b>Project:</b>
14
+ <%=h assignment.project_name %>
15
+ </p>
16
+ </div>
17
+ <% end %>
18
+
19
+ <%= link_to 'Edit', edit_programmer_path(@programmer) %> |
20
+ <%= link_to 'Back', programmers_path %>
@@ -0,0 +1,495 @@
1
+ require File.dirname(__FILE__) + '/../../test_helper'
2
+
3
+ class HasManyExistingViewTest < Test::Unit::TestCase
4
+
5
+ attr_reader :singular_name
6
+ attr_reader :attributes
7
+ attr_reader :plural_name
8
+ attr_reader :has_many_through_models
9
+ attr_reader :hmt_model
10
+ attr_reader :class_name
11
+ attr_reader :migration_name
12
+ attr_reader :table_name
13
+ attr_reader :options
14
+
15
+ context "When a target model and a through model exist" do
16
+ setup do
17
+ ClassFactory :project
18
+ ClassFactory :programmer
19
+ ClassFactory :assignment
20
+ end
21
+
22
+ should "detect the existing hmt models when no parent is specified" do
23
+ gen = new_generator_for_test_model('view_for', ['--view', 'has_many_existing'], 'programmer')
24
+ has_many_through_models = gen.has_many_through_models
25
+ assert_equal 1, has_many_through_models.size
26
+ assert_equal 'Project', has_many_through_models[0].name
27
+ assert_equal 'Assignment', has_many_through_models[0].through_model.name
28
+ end
29
+
30
+ should "use find the specified valid child model if provided" do
31
+ gen = new_generator_for_test_model('view_for', ['--view', 'has_many_existing:projects'], 'programmer')
32
+ has_many_through_models = gen.has_many_through_models
33
+ assert_equal 1, has_many_through_models.size
34
+ assert_equal 'Project', has_many_through_models[0].name
35
+ assert_equal 'Assignment', has_many_through_models[0].through_model.name
36
+ end
37
+
38
+ should "return an error message with a bad child model param" do
39
+ Rails::Generator::Base.logger.expects('error').with('Class \'blah\' does not exist or contains a syntax error and could not be loaded.')
40
+ gen = new_generator_for_test_model('view_for', ['--view', 'has_many_existing:blah'], 'programmer')
41
+ assert_equal [], gen.has_many_through_models
42
+ end
43
+ end
44
+
45
+ context "A test model with no hmt associations" do
46
+ setup do
47
+ ClassFactory :test_model
48
+ end
49
+
50
+ should "return a error when run with view_for and not run any actions" do
51
+ expect_no_actions
52
+ Rails::Generator::Base.logger.expects('error').with('No has_many through associations exist in class TestModel.')
53
+ @generator_script = Rails::Generator::Scripts::Generate.new
54
+ @generator_script.run(generator_script_cmd_line('view_for', ['--view', 'has_many_existing']))
55
+ end
56
+
57
+ should "return a error when run with scaffold_for_view and not run any actions" do
58
+ expect_no_actions
59
+ Rails::Generator::Base.logger.expects('error').with('No has_many through association specified.')
60
+ @generator_script = Rails::Generator::Scripts::Generate.new
61
+ @generator_script.run(generator_script_cmd_line('scaffold_for_view', ['--view', 'has_many_existing']))
62
+ end
63
+ end
64
+
65
+ context "A through model with a belongs_to association for an hmt model for which it does not have a name virtual attribute" do
66
+ setup do
67
+ ClassFactory :project
68
+ ClassFactory :programmer
69
+ through_model_code = <<SRC
70
+ belongs_to :project
71
+ belongs_to :programmer
72
+ SRC
73
+ ClassFactory :assignment, :class_eval => through_model_code
74
+ end
75
+
76
+ should "return a warning and stop when the problem model is specified" do
77
+ expect_no_actions
78
+ Rails::Generator::Base.logger.expects('warning').with('Model Assignment does not have a method project_name.')
79
+ @generator_script = Rails::Generator::Scripts::Generate.new
80
+ @generator_script.run(generator_script_cmd_line('view_for', ['--view', 'has_many_existing:projects'], 'programmer'))
81
+ end
82
+ end
83
+
84
+ context "A through model with a belongs_to association for an hmt model which does not have a name method or column" do
85
+ setup do
86
+ ClassFactory :project do |p|
87
+ p.string :not_the_name_column
88
+ end
89
+ ClassFactory :assignment
90
+ ClassFactory :programmer
91
+ end
92
+
93
+ should "return a warning and stop when the problem model is specified" do
94
+ expect_no_actions
95
+ Rails::Generator::Base.logger.expects('warning').with('Model Project does not have a name attribute.')
96
+ @generator_script = Rails::Generator::Scripts::Generate.new
97
+ @generator_script.run(generator_script_cmd_line('view_for', ['--view', 'has_many_existing:projects'], 'programmer'))
98
+ end
99
+ end
100
+
101
+ context "A through model with a belongs_to association for an hmt model which has a name method but not a name column" do
102
+ setup do
103
+ parent_code_with_name_method = <<SRC
104
+ has_many :programmers, :through => :assignments
105
+ has_many :assignments
106
+ def name
107
+ 'the name'
108
+ end
109
+ SRC
110
+ ClassFactory :project, :class_eval => parent_code_with_name_method do |p|
111
+ p.string :not_the_name_column
112
+ end
113
+ ClassFactory :assignment
114
+ ClassFactory :programmer
115
+ end
116
+
117
+ should "continue to generate as usual" do
118
+ stub_actions
119
+ Rails::Generator::Commands::Create.any_instance.expects(:directory).with('app/controllers/')
120
+ @generator_script = Rails::Generator::Scripts::Generate.new
121
+ @generator_script.run(generator_script_cmd_line('view_for', ['--view', 'has_many_existing:projects'], 'programmer'))
122
+ end
123
+ end
124
+
125
+ context "A through model with a belongs_to association for an hmt model for which it does not have a foreign key" do
126
+ setup do
127
+ ClassFactory :project
128
+ ClassFactory :programmer
129
+ ClassFactory :assignment do |a|
130
+ a.integer :not_the_project_id
131
+ a.integer :programmer_id
132
+ end
133
+ end
134
+
135
+ should "return a warning and stop when the problem model is specified" do
136
+ expect_no_actions
137
+ Rails::Generator::Base.logger.expects('warning').with('Model Assignment does not contain a foreign key for Project.')
138
+ @generator_script = Rails::Generator::Scripts::Generate.new
139
+ @generator_script.run(generator_script_cmd_line('view_for', ['--view', 'has_many_existing:projects'], 'programmer'))
140
+ end
141
+ end
142
+
143
+ context "A through model with a belongs_to association for an hmt model for which it does not have a foreign key for the source model" do
144
+ setup do
145
+ ClassFactory :project
146
+ ClassFactory :programmer
147
+ ClassFactory :assignment do |a|
148
+ a.integer :project_id
149
+ a.integer :not_the_programmer_id
150
+ end
151
+ end
152
+
153
+ should "return a warning and stop when the problem model is specified" do
154
+ expect_no_actions
155
+ Rails::Generator::Base.logger.expects('warning').with('Model Assignment does not contain a foreign key for Programmer.')
156
+ @generator_script = Rails::Generator::Scripts::Generate.new
157
+ @generator_script.run(generator_script_cmd_line('view_for', ['--view', 'has_many_existing:projects'], 'programmer'))
158
+ end
159
+ end
160
+
161
+ context "A Rails generator script with an hmt model without a has_many association for the through model" do
162
+ setup do
163
+ @generator_script = Rails::Generator::Scripts::Generate.new
164
+ has_many_through_code = <<SRC
165
+ has_many :programmers, :through => :assignments
166
+ SRC
167
+ ClassFactory :project, :class_eval => has_many_through_code
168
+ ClassFactory :programmer
169
+ ClassFactory :assignment
170
+ end
171
+
172
+ should "return a warning when run with view_for and not run any actions" do
173
+ expect_no_actions
174
+ Rails::Generator::Base.logger.expects('warning').with('Model Project does not contain a has_many association for Assignment.')
175
+ @generator_script.run(generator_script_cmd_line('view_for', ['--view', 'has_many_existing:projects'], 'programmer'))
176
+ end
177
+ end
178
+
179
+ context "A Rails generator script with an hmt model without a has_many association for the source model" do
180
+ setup do
181
+ @generator_script = Rails::Generator::Scripts::Generate.new
182
+ has_many_through_code = <<SRC
183
+ has_many :assignments
184
+ SRC
185
+ ClassFactory :project, :class_eval => has_many_through_code
186
+ ClassFactory :programmer
187
+ ClassFactory :assignment
188
+ end
189
+
190
+ should "return a warning when run with view_for and not run any actions" do
191
+ expect_no_actions
192
+ Rails::Generator::Base.logger.expects('warning').with('Model Project does not contain a has_many through association for Programmer.')
193
+ @generator_script.run(generator_script_cmd_line('view_for', ['--view', 'has_many_existing:projects'], 'programmer'))
194
+ end
195
+ end
196
+
197
+ context "A Rails generator script with a child model without a belongs_to association for the source model" do
198
+ setup do
199
+ ClassFactory :project
200
+ ClassFactory :programmer
201
+ through_model_code = <<SRC
202
+ belongs_to :project
203
+ def project_name
204
+ 'something'
205
+ end
206
+ def project_name=
207
+ end
208
+ SRC
209
+ ClassFactory :assignment, :class_eval => through_model_code
210
+ @generator_script = Rails::Generator::Scripts::Generate.new
211
+ end
212
+
213
+ should "return a warning when run with view_for and not run any actions" do
214
+ expect_no_actions
215
+ Rails::Generator::Base.logger.expects('warning').with('Model Assignment does not contain a belongs_to association for Programmer.')
216
+ @generator_script.run(generator_script_cmd_line('view_for', ['--view', 'has_many_existing:projects'], 'programmer'))
217
+ end
218
+ end
219
+
220
+ context "A Rails generator script with a child model without a belongs_to association for the hmt model" do
221
+ setup do
222
+ ClassFactory :project
223
+ ClassFactory :programmer
224
+ through_model_code = <<SRC
225
+ belongs_to :programmer
226
+ def project_name
227
+ 'something'
228
+ end
229
+ def project_name=
230
+ end
231
+ SRC
232
+ ClassFactory :assignment, :class_eval => through_model_code
233
+ @generator_script = Rails::Generator::Scripts::Generate.new
234
+ end
235
+
236
+ should "return a warning when run with view_for and not run any actions" do
237
+ expect_no_actions
238
+ Rails::Generator::Base.logger.expects('warning').with('Model Assignment does not belong to model Project.')
239
+ @generator_script.run(generator_script_cmd_line('view_for', ['--view', 'has_many_existing:projects'], 'programmer'))
240
+ end
241
+ end
242
+
243
+ context "A test model with a has_many through association with a through model for which it does not accept nested attributes" do
244
+ setup do
245
+ missing_nested_attribute_code = <<SRC
246
+ has_many :projects, :through => :assignments
247
+ has_many :assignments
248
+ SRC
249
+ ClassFactory :project
250
+ ClassFactory :programmer, :class_eval => missing_nested_attribute_code
251
+ ClassFactory :assignment
252
+ end
253
+
254
+ should "return a warning and stop when the problem model is specified" do
255
+ expect_no_actions
256
+ Rails::Generator::Base.logger.expects('warning').with('Model Programmer does not accept nested attributes for model Assignment.')
257
+ @generator_script = Rails::Generator::Scripts::Generate.new
258
+ @generator_script.run(generator_script_cmd_line('view_for', ['--view', 'has_many_existing:projects'], 'programmer'))
259
+ end
260
+ end
261
+
262
+ context "When a target model and a through model exist" do
263
+ setup do
264
+ ClassFactory :project
265
+ ClassFactory :programmer
266
+ ClassFactory :assignment
267
+ end
268
+
269
+ context "A Rails generator script" do
270
+ setup do
271
+ @generator_script = Rails::Generator::Scripts::Generate.new
272
+ end
273
+
274
+ should "return a warning when run with view_for on an invalid child model and not run any actions" do
275
+ expect_no_actions
276
+ Rails::Generator::Base.logger.expects('error').with('Class \'blah\' does not exist or contains a syntax error and could not be loaded.')
277
+ @generator_script = Rails::Generator::Scripts::Generate.new
278
+ @generator_script.run(generator_script_cmd_line('view_for', ['--view', 'has_many_existing:blah'], 'programmer'))
279
+ end
280
+
281
+ should "create the correct manifest when the view_for generator is run with valid htm models" do
282
+
283
+ expect_no_warnings
284
+
285
+ directories = [
286
+ 'app/controllers/',
287
+ 'app/helpers/',
288
+ 'app/views/programmers',
289
+ 'app/views/layouts/',
290
+ 'test/functional/',
291
+ 'test/unit/',
292
+ 'test/unit/helpers/',
293
+ 'public/stylesheets/'
294
+ ].each { |path| Rails::Generator::Commands::Create.any_instance.expects(:directory).with(path) }
295
+
296
+ templates = {
297
+ 'view_index.html.erb' => 'app/views/programmers/index.html.erb',
298
+ 'view_new.html.erb' => 'app/views/programmers/new.html.erb',
299
+ 'view_edit.html.erb' => 'app/views/programmers/edit.html.erb',
300
+ 'view_form.html.erb' => 'app/views/programmers/_form.html.erb',
301
+ 'layout.html.erb' => 'app/views/layouts/programmers.html.erb',
302
+ 'style.css' => 'public/stylesheets/scaffold.css',
303
+ 'controller.rb' => 'app/controllers/programmers_controller.rb',
304
+ 'functional_test.rb' => 'test/functional/programmers_controller_test.rb',
305
+ 'helper.rb' => 'app/helpers/programmers_helper.rb',
306
+ 'helper_test.rb' => 'test/unit/helpers/programmers_helper_test.rb'
307
+ }.each { |template, target| Rails::Generator::Commands::Create.any_instance.expects(:template).with(template, target) }
308
+
309
+ project_model_info = ViewMapper::ModelInfo.new('project')
310
+ assignment_model_info = ViewMapper::ModelInfo.new('assignment')
311
+ programmer_info = ViewMapper::ModelInfo.new('Programmer')
312
+ ViewMapper::ModelInfo.stubs(:new).with('project').returns(project_model_info)
313
+ ViewMapper::ModelInfo.stubs(:new).with('programmer').returns(programmer_info)
314
+ ViewMapper::ModelInfo.stubs(:new).with('Programmer').returns(programmer_info)
315
+ ViewMapper::ModelInfo.stubs(:new).with('assignment').returns(assignment_model_info)
316
+ Rails::Generator::Commands::Create.any_instance.expects(:template).with(
317
+ 'view_show.html.erb',
318
+ 'app/views/programmers/show.html.erb',
319
+ { :assigns => { :has_many_through_models => [ project_model_info ] } }
320
+ )
321
+ Rails::Generator::Commands::Create.any_instance.expects(:template).with(
322
+ 'view_child_form.html.erb',
323
+ 'app/views/programmers/_assignment.html.erb',
324
+ { :assigns => { :hmt_model => project_model_info } }
325
+ )
326
+ Rails::Generator::Commands::Create.any_instance.expects(:file).with(
327
+ 'nested_attributes.js', 'public/javascripts/nested_attributes.js'
328
+ )
329
+ Rails::Generator::Commands::Create.any_instance.expects(:route_resources).with('programmers')
330
+ Rails::Generator::Commands::Create.any_instance.expects(:file).never
331
+ Rails::Generator::Commands::Create.any_instance.expects(:dependency).never
332
+
333
+ @generator_script.run(generator_script_cmd_line('view_for', ['--view', 'has_many_existing:projects'], 'programmer'))
334
+ end
335
+
336
+ should "create the correct manifest when the scaffold_for_view generator is run with valid htm models" do
337
+
338
+ expect_no_warnings
339
+
340
+ directories = [
341
+ 'app/models/',
342
+ 'app/controllers/',
343
+ 'app/helpers/',
344
+ 'app/views/programmers',
345
+ 'app/views/layouts/',
346
+ 'test/functional/',
347
+ 'test/unit/',
348
+ 'test/unit/helpers/',
349
+ 'test/fixtures/',
350
+ 'public/stylesheets/'
351
+ ].each { |path| Rails::Generator::Commands::Create.any_instance.expects(:directory).with(path) }
352
+
353
+ templates = {
354
+ 'view_index.html.erb' => 'app/views/programmers/index.html.erb',
355
+ 'view_new.html.erb' => 'app/views/programmers/new.html.erb',
356
+ 'view_edit.html.erb' => 'app/views/programmers/edit.html.erb',
357
+ 'view_form.html.erb' => 'app/views/programmers/_form.html.erb',
358
+ 'layout.html.erb' => 'app/views/layouts/programmers.html.erb',
359
+ 'style.css' => 'public/stylesheets/scaffold.css',
360
+ 'controller.rb' => 'app/controllers/programmers_controller.rb',
361
+ 'functional_test.rb' => 'test/functional/programmers_controller_test.rb',
362
+ 'helper.rb' => 'app/helpers/programmers_helper.rb',
363
+ 'helper_test.rb' => 'test/unit/helpers/programmers_helper_test.rb',
364
+ 'model.rb' => 'app/models/programmer.rb',
365
+ 'unit_test.rb' => 'test/unit/programmer_test.rb',
366
+ 'fixtures.yml' => 'test/fixtures/programmers.yml'
367
+ }.each { |template, target| Rails::Generator::Commands::Create.any_instance.expects(:template).with(template, target) }
368
+
369
+ project_model_info = ViewMapper::ModelInfo.new('project')
370
+ assignment_model_info = ViewMapper::ModelInfo.new('assignment')
371
+ programmer_info = ViewMapper::ModelInfo.new('Programmer')
372
+ ViewMapper::ModelInfo.stubs(:new).with('project').returns(project_model_info)
373
+ ViewMapper::ModelInfo.stubs(:new).with('programmer').returns(programmer_info)
374
+ ViewMapper::ModelInfo.stubs(:new).with('Programmer').returns(programmer_info)
375
+ ViewMapper::ModelInfo.stubs(:new).with('assignment').returns(assignment_model_info)
376
+ Rails::Generator::Commands::Create.any_instance.expects(:template).with(
377
+ 'view_show.html.erb',
378
+ 'app/views/programmers/show.html.erb',
379
+ { :assigns => { :has_many_through_models => [ project_model_info ] } }
380
+ )
381
+ Rails::Generator::Commands::Create.any_instance.expects(:template).with(
382
+ 'view_child_form.html.erb',
383
+ 'app/views/programmers/_assignment.html.erb',
384
+ { :assigns => { :hmt_model => project_model_info } }
385
+ )
386
+ Rails::Generator::Commands::Create.any_instance.expects(:file).with(
387
+ 'nested_attributes.js', 'public/javascripts/nested_attributes.js'
388
+ )
389
+ Rails::Generator::Commands::Create.any_instance.expects(:route_resources).with('programmers')
390
+ Rails::Generator::Commands::Create.any_instance.expects(:file).never
391
+ Rails::Generator::Commands::Create.any_instance.expects(:dependency).never
392
+
393
+ Rails::Generator::Commands::Create.any_instance.expects(:migration_template).with(
394
+ 'migration.rb',
395
+ 'db/migrate',
396
+ :assigns => { :migration_name => "CreateProgrammers" },
397
+ :migration_file_name => "create_programmers"
398
+ )
399
+
400
+ @generator_script.run(generator_script_cmd_line('scaffold_for_view', ['--view', 'has_many_existing:projects'], 'programmer'))
401
+ end
402
+
403
+ end
404
+ end
405
+
406
+ context "When a target model and a through model exist" do
407
+ setup do
408
+ ClassFactory :project
409
+ ClassFactory :programmer
410
+ ClassFactory :assignment do |a|
411
+ a.string :name
412
+ a.integer :project_id
413
+ a.integer :programmer_id
414
+ end
415
+ end
416
+
417
+ context "A view_for generator" do
418
+ setup do
419
+ @gen = new_generator_for_test_model('view_for', ['--view', 'has_many_existing:projects'], 'programmer')
420
+ end
421
+
422
+ should "return the proper source root" do
423
+ assert_equal File.expand_path(File.dirname(__FILE__) + '/../../..//lib/view_mapper/views/has_many_existing/templates'), ViewMapper::HasManyExistingView.source_root
424
+ end
425
+
426
+ view_for_templates = %w{ new edit show index }
427
+ view_for_templates.each do | template |
428
+ should "render the #{template} template as expected" do
429
+ @attributes = @gen.attributes
430
+ @singular_name = @gen.singular_name
431
+ @plural_name = @gen.plural_name
432
+ @child_models = @gen.child_models
433
+ @has_many_through_models = @gen.has_many_through_models
434
+ template_file = File.open(@gen.source_path("view_#{template}.html.erb"))
435
+ result = ERB.new(template_file.read, nil, '-').result(binding)
436
+ expected_file = File.open(File.join(File.dirname(__FILE__), "expected_templates/#{template}.html.erb"))
437
+ assert_equal expected_file.read, result
438
+ end
439
+ end
440
+
441
+ should "render the form partial as expected" do
442
+ @attributes = @gen.attributes
443
+ @singular_name = @gen.singular_name
444
+ @plural_name = @gen.plural_name
445
+ @child_models = @gen.child_models
446
+ @has_many_through_models = @gen.has_many_through_models
447
+ template_file = File.open(@gen.source_path("view_form.html.erb"))
448
+ result = ERB.new(template_file.read, nil, '-').result(binding)
449
+ expected_file = File.open(File.join(File.dirname(__FILE__), "expected_templates/_form.html.erb"))
450
+ assert_equal expected_file.read, result
451
+ end
452
+
453
+ should "render the child model partial as expected" do
454
+ @hmt_model = @gen.has_many_through_models[0]
455
+ template_file = File.open(@gen.source_path("view_child_form.html.erb"))
456
+ result = ERB.new(template_file.read, nil, '-').result(binding)
457
+ expected_file = File.open(File.join(File.dirname(__FILE__), "expected_templates/_assignment.html.erb"))
458
+ assert_equal expected_file.read, result
459
+ end
460
+ end
461
+
462
+ context "A scaffold_for_view generator" do
463
+ setup do
464
+ @gen = new_generator_for_test_model('scaffold_for_view', ['--view', 'has_many_existing:projects'], 'programmer')
465
+ end
466
+
467
+ should "render the model template as expected" do
468
+ @has_many_through_models = @gen.has_many_through_models
469
+ @class_name = @gen.class_name
470
+ @attributes = @gen.attributes
471
+ template_file = File.open(@gen.source_path("model.rb"))
472
+ result = ERB.new(template_file.read, nil, '-').result(binding)
473
+ expected_file = File.open(File.join(File.dirname(__FILE__), "expected_templates/programmer.rb"))
474
+ assert_equal expected_file.read, result
475
+ end
476
+
477
+ should "render the migration template as expected" do
478
+ @class_name = @gen.class_name
479
+ @attributes = @gen.attributes
480
+ @migration_name = 'CreateProgrammers'
481
+ @table_name = @gen.table_name
482
+ @options = {}
483
+ template_file = File.open(@gen.source_path("migration.rb"))
484
+ result = ERB.new(template_file.read, nil, '-').result(binding)
485
+ expected_file = File.open(File.join(File.dirname(__FILE__), "expected_templates/create_programmers.rb"))
486
+ assert_equal expected_file.read, result
487
+ end
488
+ end
489
+ end
490
+
491
+ def field_for(parent_model)
492
+ @gen.field_for(parent_model)
493
+ end
494
+ end
495
+