dry_crud 0.6.0 → 1.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 (43) hide show
  1. data/README.rdoc +41 -36
  2. data/Rakefile +51 -43
  3. data/VERSION +1 -1
  4. data/lib/generators/dry_crud/USAGE +1 -0
  5. data/lib/generators/dry_crud/dry_crud_generator.rb +20 -0
  6. data/{rails_generators → lib/generators}/dry_crud/templates/INSTALL +4 -3
  7. data/{rails_generators → lib/generators}/dry_crud/templates/app/controllers/crud_controller.rb +31 -9
  8. data/lib/generators/dry_crud/templates/app/controllers/render_inheritable.rb +152 -0
  9. data/{rails_generators → lib/generators}/dry_crud/templates/app/helpers/crud_helper.rb +4 -4
  10. data/{rails_generators/dry_crud/templates/lib → lib/generators/dry_crud/templates/app/helpers}/standard_form_builder.rb +0 -0
  11. data/{rails_generators → lib/generators}/dry_crud/templates/app/helpers/standard_helper.rb +81 -76
  12. data/{rails_generators/dry_crud/templates/lib → lib/generators/dry_crud/templates/app/helpers}/standard_table_builder.rb +45 -46
  13. data/{rails_generators → lib/generators}/dry_crud/templates/app/views/crud/_attrs.html.erb +0 -0
  14. data/lib/generators/dry_crud/templates/app/views/crud/_form.html.erb +1 -0
  15. data/{rails_generators → lib/generators}/dry_crud/templates/app/views/crud/_list.html.erb +0 -0
  16. data/{rails_generators → lib/generators}/dry_crud/templates/app/views/crud/edit.html.erb +1 -1
  17. data/{rails_generators → lib/generators}/dry_crud/templates/app/views/crud/index.html.erb +1 -1
  18. data/{rails_generators → lib/generators}/dry_crud/templates/app/views/crud/new.html.erb +1 -1
  19. data/{rails_generators → lib/generators}/dry_crud/templates/app/views/crud/show.html.erb +1 -1
  20. data/{rails_generators → lib/generators}/dry_crud/templates/app/views/layouts/crud.html.erb +1 -0
  21. data/lib/generators/dry_crud/templates/app/views/shared/_error_messages.html.erb +10 -0
  22. data/lib/generators/dry_crud/templates/app/views/shared/_labeled.html.erb +4 -0
  23. data/{rails_generators → lib/generators}/dry_crud/templates/public/stylesheets/crud.css +5 -5
  24. data/{rails_generators → lib/generators}/dry_crud/templates/test/crud_test_model.rb +25 -17
  25. data/{rails_generators → lib/generators}/dry_crud/templates/test/functional/crud_controller_test_helper.rb +36 -32
  26. data/{rails_generators → lib/generators}/dry_crud/templates/test/functional/crud_test_models_controller_test.rb +17 -4
  27. data/{rails_generators → lib/generators}/dry_crud/templates/test/unit/crud_helper_test.rb +51 -6
  28. data/{rails_generators → lib/generators}/dry_crud/templates/test/unit/render_inheritable_test.rb +31 -39
  29. data/{rails_generators → lib/generators}/dry_crud/templates/test/unit/standard_form_builder_test.rb +0 -0
  30. data/{rails_generators → lib/generators}/dry_crud/templates/test/unit/standard_helper_test.rb +76 -54
  31. data/{rails_generators → lib/generators}/dry_crud/templates/test/unit/standard_table_builder_test.rb +42 -40
  32. data/test/templates/app/views/ajax/ajax.js.rjs +1 -1
  33. data/test/templates/app/views/ajax/index.html.erb +2 -2
  34. data/test/templates/app/views/cities/_form.html.erb +1 -1
  35. data/test/templates/app/views/cities/_list.html.erb +1 -2
  36. data/test/templates/config/routes.rb +14 -5
  37. metadata +51 -37
  38. data/rails_generators/dry_crud/USAGE +0 -1
  39. data/rails_generators/dry_crud/dry_crud_generator.rb +0 -22
  40. data/rails_generators/dry_crud/templates/app/views/crud/_form.html.erb +0 -1
  41. data/rails_generators/dry_crud/templates/app/views/shared/_labeled.html.erb +0 -5
  42. data/rails_generators/dry_crud/templates/lib/crud_callbacks.rb +0 -55
  43. data/rails_generators/dry_crud/templates/lib/render_inheritable.rb +0 -118
@@ -45,66 +45,6 @@ module StandardHelper
45
45
  end
46
46
  end
47
47
 
48
- # Formats an active record association
49
- def format_assoc(obj, assoc)
50
- if assoc_val = obj.send(assoc.name)
51
- link_to_unless(no_assoc_link?(assoc), h(assoc_val.label), assoc_val)
52
- else
53
- '(none)'
54
- end
55
- end
56
-
57
- # Returns true if no link should be created when formatting the given association.
58
- def no_assoc_link?(assoc)
59
- (respond_to?(:no_assoc_links) && no_assoc_links.to_a.include?(assoc.name.to_sym)) ||
60
- !respond_to?("#{assoc.klass.name.underscore}_path".to_sym)
61
- end
62
-
63
- # Formats an arbitrary attribute of the given object depending on its data type.
64
- # For ActiveRecords, take the defined data type into account for special types
65
- # that have no own object class.
66
- def format_type(obj, attr)
67
- val = obj.send(attr)
68
- return EMPTY_STRING if val.nil?
69
- case column_type(obj, attr)
70
- when :time then val.strftime(TIME_FORMAT)
71
- when :date then val.to_date.to_s
72
- when :text then simple_format(h(val))
73
- when :decimal then f(val.to_s.to_f)
74
- else f(val)
75
- end
76
- end
77
-
78
- # Returns the ActiveRecord column type or nil.
79
- def column_type(obj, attr)
80
- column_property(obj, attr, :type)
81
- end
82
-
83
- # Returns an ActiveRecord column property for the passed attr or nil
84
- def column_property(obj, attr, property)
85
- if obj.respond_to?(:column_for_attribute)
86
- column = obj.column_for_attribute(attr)
87
- column.try(property)
88
- end
89
- end
90
-
91
- # Returns the :belongs_to association for the given attribute or nil if there is none.
92
- def belongs_to_association(obj, attr)
93
- if assoc = association(obj, attr)
94
- assoc if assoc.macro == :belongs_to
95
- end
96
- end
97
-
98
- # Returns the association proxy for the given attribute. The attr parameter
99
- # may be the _id column or the association name. Returns nil if no association
100
- # was found.
101
- def association(obj, attr)
102
- if obj.class.respond_to?(:reflect_on_association)
103
- assoc = attr.to_s =~ /_id$/ ? attr.to_s[0..-4].to_sym : attr
104
- obj.class.reflect_on_association(assoc)
105
- end
106
- end
107
-
108
48
 
109
49
  ############## STANDARD HTML SECTIONS ############################
110
50
 
@@ -113,8 +53,7 @@ module StandardHelper
113
53
  # Without block, this may be used in the form <%= labeled(...) %>, with like <% labeled(..) do %>
114
54
  def labeled(label, content = nil, &block)
115
55
  content = capture(&block) if block_given?
116
- html = render(:partial => 'shared/labeled', :locals => { :label => label, :content => content})
117
- block_given? ? concat(html) : html
56
+ render(:partial => 'shared/labeled', :locals => { :label => label, :content => content})
118
57
  end
119
58
 
120
59
  # Transform the given text into a form as used by labels or table headers.
@@ -131,16 +70,20 @@ module StandardHelper
131
70
  def render_attrs(obj, attrs, div = true)
132
71
  html = attrs.collect do |a|
133
72
  labeled(captionize(a, obj.class), format_attr(obj, a))
134
- end.join
73
+ end.join.html_safe
135
74
 
136
75
  div ? content_tag(:div, html, :class => 'attributes') : html
137
76
  end
138
77
 
139
- # Renders a table for the given entries as defined by the following block.
140
- # If entries are empty, an appropriate message is rendered.
141
- def table(entries, &block)
78
+ # Renders a table for the given entries. One column is rendered for each attribute passed.
79
+ # If a block is given, the columns defined therein are appended to the attribute columns.
80
+ # If entries is empty, an appropriate message is rendered.
81
+ def table(entries, *attrs, &block)
142
82
  if entries.present?
143
- StandardTableBuilder.table(entries, self, &block)
83
+ StandardTableBuilder.table(entries, self) do |t|
84
+ t.attrs(*attrs)
85
+ yield t if block_given?
86
+ end
144
87
  else
145
88
  content_tag(:div, NO_LIST_ENTRIES_MESSAGE, :class => 'list')
146
89
  end
@@ -150,20 +93,18 @@ module StandardHelper
150
93
  # Before the input fields, the error messages are rendered, if present.
151
94
  # The form is rendered with a basic save button.
152
95
  # If a block is given, custom input fields may be rendered and attrs is ignored.
153
- #
154
- # The form is always directly printed into the erb, so the call must
155
- # go within a normal <% form(...) %> section, not in a <%= output section
156
- def standard_form(object, attrs = [], options = {})
96
+ def standard_form(object, attrs = [], options = {}, &block)
157
97
  form_for(object, {:builder => StandardFormBuilder}.merge(options)) do |form|
158
- concat form.error_messages
98
+ content = ""
99
+ content << render(:partial => 'shared/error_messages', :locals => {:errors => object.errors})
159
100
 
160
- if block_given?
161
- yield(form)
101
+ content << if block_given?
102
+ capture(form, &block)
162
103
  else
163
- concat form.labeled_input_fields(*attrs)
104
+ form.labeled_input_fields(*attrs)
164
105
  end
165
106
 
166
- concat labeled(EMPTY_STRING, form.submit("Save"))
107
+ content << labeled(nil, form.submit("Save"))
167
108
  end
168
109
  end
169
110
 
@@ -206,4 +147,68 @@ module StandardHelper
206
147
  link_to("[#{label}]", options, {:class => 'action'}.merge(html_options))
207
148
  end
208
149
 
150
+ protected
151
+
152
+ # Helper methods that are not necessarely called from templates.
153
+
154
+ # Formats an active record association
155
+ def format_assoc(obj, assoc)
156
+ if assoc_val = obj.send(assoc.name)
157
+ link_to_unless(no_assoc_link?(assoc), h(assoc_val.label), assoc_val)
158
+ else
159
+ '(none)'
160
+ end
161
+ end
162
+
163
+ # Returns true if no link should be created when formatting the given association.
164
+ def no_assoc_link?(assoc)
165
+ (respond_to?(:no_assoc_links) && no_assoc_links.to_a.include?(assoc.name.to_sym)) ||
166
+ !respond_to?("#{assoc.klass.name.underscore}_path".to_sym)
167
+ end
168
+
169
+ # Formats an arbitrary attribute of the given object depending on its data type.
170
+ # For ActiveRecords, take the defined data type into account for special types
171
+ # that have no own object class.
172
+ def format_type(obj, attr)
173
+ val = obj.send(attr)
174
+ return EMPTY_STRING if val.nil?
175
+ case column_type(obj, attr)
176
+ when :time then val.strftime(TIME_FORMAT)
177
+ when :date then val.to_date.to_s
178
+ when :text then simple_format(h(val))
179
+ when :decimal then f(val.to_s.to_f)
180
+ else f(val)
181
+ end
182
+ end
183
+
184
+ # Returns the ActiveRecord column type or nil.
185
+ def column_type(obj, attr)
186
+ column_property(obj, attr, :type)
187
+ end
188
+
189
+ # Returns an ActiveRecord column property for the passed attr or nil
190
+ def column_property(obj, attr, property)
191
+ if obj.respond_to?(:column_for_attribute)
192
+ column = obj.column_for_attribute(attr)
193
+ column.try(property)
194
+ end
195
+ end
196
+
197
+ # Returns the :belongs_to association for the given attribute or nil if there is none.
198
+ def belongs_to_association(obj, attr)
199
+ if assoc = association(obj, attr)
200
+ assoc if assoc.macro == :belongs_to
201
+ end
202
+ end
203
+
204
+ # Returns the association proxy for the given attribute. The attr parameter
205
+ # may be the _id column or the association name. Returns nil if no association
206
+ # was found.
207
+ def association(obj, attr)
208
+ if obj.class.respond_to?(:reflect_on_association)
209
+ assoc = attr.to_s =~ /_id$/ ? attr.to_s[0..-4].to_sym : attr
210
+ obj.class.reflect_on_association(assoc)
211
+ end
212
+ end
213
+
209
214
  end
@@ -6,17 +6,17 @@
6
6
  # t.attrs :name, :city
7
7
  # end
8
8
  class StandardTableBuilder
9
- attr_reader :entries, :cols, :template
9
+ attr_reader :entries, :cols, :template
10
10
 
11
11
  # Delegate called methods to template.
12
12
  # including StandardHelper would lead to problems with indirectly called methods.
13
- delegate :content_tag, :format_attr, :column_type, :belongs_to_association,
13
+ delegate :content_tag, :format_attr, :column_type, :belongs_to_association,
14
14
  :captionize, :tr_alt, :to => :template
15
15
 
16
- def initialize(entries, template)
17
- @entries = entries
18
- @template = template
19
- @cols = []
16
+ def initialize(entries, template)
17
+ @entries = entries
18
+ @template = template
19
+ @cols = []
20
20
  end
21
21
 
22
22
  # Convenience method to directly generate a table. Renders a row for each entry in entries.
@@ -31,26 +31,25 @@ class StandardTableBuilder
31
31
  # Define a column for the table with the given header, the html_options used for
32
32
  # each td and a block rendering the contents of a cell for the current entry.
33
33
  # The columns appear in the order they are defined.
34
- def col(header = '', html_options = {}, &block)
35
- @cols << Col.new(header, html_options, @template, block)
36
- end
37
-
34
+ def col(header = '', html_options = {}, &block)
35
+ @cols << Col.new(header, html_options, @template, block)
36
+ end
37
+
38
38
  # Convenience method to add one or more attribute columns.
39
39
  # The attribute name will become the header, the cells will contain
40
40
  # the formatted attribute value for the current entry.
41
- def attrs(*attrs)
42
- attrs.each do |a|
43
- col(captionize(a, entry_class), :class => align_class(a)) { |e| format_attr(e, a) }
44
- end
45
- end
46
-
41
+ def attrs(*attrs)
42
+ attrs.each do |a|
43
+ col(captionize(a, entry_class), :class => align_class(a)) { |e| format_attr(e, a) }
44
+ end
45
+ end
46
+
47
47
  # Renders the table as HTML.
48
- def to_html
49
- content_tag :table, :class => 'list' do
50
- [html_header] +
51
- entries.collect { |e| html_row(e) }
52
- end
53
- end
48
+ def to_html
49
+ content_tag :table, :class => 'list' do
50
+ html_header + entries.collect { |e| html_row(e) }.join.html_safe
51
+ end
52
+ end
54
53
 
55
54
  # Returns css classes used for alignment of the cell data.
56
55
  # Based on the column type of the attribute.
@@ -66,38 +65,38 @@ class StandardTableBuilder
66
65
 
67
66
  private
68
67
 
69
- def html_header
70
- content_tag :tr do
71
- cols.collect { |c| c.html_header }
72
- end
68
+ def html_header
69
+ content_tag :tr do
70
+ cols.collect { |c| c.html_header }.join
71
+ end
73
72
  end
74
73
 
75
- def html_row(entry)
76
- tr_alt do
77
- cols.collect { |c| c.html_cell(entry) }
78
- end
74
+ def html_row(entry)
75
+ tr_alt do
76
+ cols.collect { |c| c.html_cell(entry) }.join
77
+ end
79
78
  end
80
79
 
81
80
  def entry_class
82
81
  entries.first.class
83
82
  end
84
-
83
+
85
84
  # Helper class to store column information.
86
- class Col < Struct.new(:header, :html_options, :template, :block) #:nodoc:
87
-
88
- delegate :content_tag, :to => :template
89
-
90
- def content(entry)
91
- block.call(entry)
92
- end
93
-
94
- def html_header
95
- content_tag :th, header
96
- end
97
-
98
- def html_cell(entry)
99
- content_tag :td, content(entry), html_options
100
- end
85
+ class Col < Struct.new(:header, :html_options, :template, :block) #:nodoc:
86
+
87
+ delegate :content_tag, :to => :template
88
+
89
+ def content(entry)
90
+ block.call(entry)
91
+ end
92
+
93
+ def html_header
94
+ content_tag :th, header
95
+ end
96
+
97
+ def html_cell(entry)
98
+ content_tag :td, content(entry), html_options
99
+ end
101
100
 
102
101
  end
103
102
 
@@ -1,6 +1,6 @@
1
1
  <% @title = "Edit #{full_entry_label}" -%>
2
2
 
3
- <%= render_inheritable :partial => 'form' %>
3
+ <%= render :partial => 'form' %>
4
4
 
5
5
  <br/>
6
6
 
@@ -1,6 +1,6 @@
1
1
  <% @title = "Listing #{models_label}" -%>
2
2
 
3
- <%= render_inheritable :partial => 'list' %>
3
+ <%= render :partial => 'list' %>
4
4
 
5
5
  <br/>
6
6
 
@@ -1,6 +1,6 @@
1
1
  <% @title = "New #{models_label.singularize}" -%>
2
2
 
3
- <%= render_inheritable :partial => 'form' %>
3
+ <%= render :partial => 'form' %>
4
4
 
5
5
  <br/>
6
6
 
@@ -1,6 +1,6 @@
1
1
  <% @title = full_entry_label -%>
2
2
 
3
- <%= render_inheritable :partial => 'attrs' %>
3
+ <%= render :partial => 'attrs' %>
4
4
 
5
5
  <br/>
6
6
 
@@ -7,6 +7,7 @@
7
7
  <title><%= @title %></title>
8
8
  <%= stylesheet_link_tag 'crud' %>
9
9
  <%= javascript_include_tag :all %>
10
+ <%= csrf_meta_tag %>
10
11
  </head>
11
12
  <body>
12
13
 
@@ -0,0 +1,10 @@
1
+ <% if errors.any? %>
2
+ <div id="error_explanation">
3
+ <h2><%= pluralize(errors.count, "error") %> prohibited this entry from being saved:</h2>
4
+ <ul>
5
+ <% errors.full_messages.each do |msg| %>
6
+ <li><%= msg %></li>
7
+ <% end %>
8
+ </ul>
9
+ </div>
10
+ <% end -%>
@@ -0,0 +1,4 @@
1
+ <div class="labeled">
2
+ <div class="caption"><%= label.presence || raw(StandardHelper::EMPTY_STRING) %></div>
3
+ <div class="value"><%= content.presence || raw(StandardHelper::EMPTY_STRING) %></div>
4
+ </div>
@@ -67,25 +67,25 @@ a:visited.action {
67
67
  color: #663333;
68
68
  }
69
69
 
70
- div.errorExplanation {
70
+ #error_explanation {
71
71
  border: solid 1px #999999;
72
72
  margin: 10pt;
73
73
  padding: 5pt;
74
74
  background-color: #FFBBBB;
75
75
  }
76
76
 
77
- .errorExplanation h2 {
77
+ #error_explanation h2 {
78
78
  font-size: 12pt;
79
79
  margin-top: 0pt;
80
80
  }
81
81
 
82
- .errorExplanation ul {
82
+ #error_explanation ul {
83
83
  margin-bottom: 5pt;
84
84
  }
85
85
 
86
- div.fieldWithErrors {
86
+ .value div.field_with_errors {
87
87
  background-color: #FFBBBB;
88
88
  display: inline-block;
89
- padding: 2px;
89
+ padding: 1px;
90
90
  }
91
91
 
@@ -34,6 +34,7 @@ class CrudTestModelsController < CrudController #:nodoc:
34
34
  end
35
35
  end
36
36
 
37
+ # create callback methods that record the before/after callbacks
37
38
  [:create, :update, :save, :destroy].each do |a|
38
39
  callback = "before_#{a.to_s}"
39
40
  send(callback.to_sym, :"#{HANDLE_PREFIX}#{callback}")
@@ -41,10 +42,18 @@ class CrudTestModelsController < CrudController #:nodoc:
41
42
  send(callback.to_sym, :"#{HANDLE_PREFIX}#{callback}")
42
43
  end
43
44
 
45
+ # create callback methods that record the before_render callbacks
46
+ [:index, :show, :new, :edit].each do |a|
47
+ callback = "before_render_#{a.to_s}"
48
+ send(callback.to_sym, :"#{HANDLE_PREFIX}#{callback}")
49
+ end
50
+
51
+ # handle the called callbacks
44
52
  def method_missing(sym, *args)
45
53
  called_callback(sym.to_s[HANDLE_PREFIX.size..-1].to_sym) if sym.to_s.starts_with?(HANDLE_PREFIX)
46
54
  end
47
55
 
56
+ # callback to redirect if @should_redirect is set
48
57
  def possibly_redirect
49
58
  redirect_to :action => 'index' if should_redirect && !performed?
50
59
  !should_redirect
@@ -54,6 +63,7 @@ class CrudTestModelsController < CrudController #:nodoc:
54
63
  @companions = CrudTestModel.all :conditions => {:human => true}
55
64
  end
56
65
 
66
+ # records a callback
57
67
  def called_callback(callback)
58
68
  @called_callbacks ||= []
59
69
  @called_callbacks << callback
@@ -61,10 +71,6 @@ class CrudTestModelsController < CrudController #:nodoc:
61
71
 
62
72
  end
63
73
 
64
- ActionController::Routing::Routes.draw do |map|
65
- map.resources :crud_test_models
66
- end
67
-
68
74
  # A simple test helper to prepare the test database with a CrudTestModel model.
69
75
  module CrudTestHelper
70
76
 
@@ -74,20 +80,22 @@ module CrudTestHelper
74
80
  # Look at the source to view the column definition.
75
81
  def setup_db
76
82
  silence_stream(STDOUT) do
77
- ActiveRecord::Base.connection.create_table :crud_test_models, :force => true do |t|
78
- t.string :name, :null => false, :limit => 50
79
- t.string :whatever
80
- t.integer :children
81
- t.integer :companion_id
82
- t.float :rating
83
- t.decimal :income, :precision => 14, :scale => 2
84
- t.date :birthdate
85
- t.boolean :human, :default => true
86
- t.text :remarks
87
-
88
- t.timestamps
83
+ ActiveRecord::Base.connection.create_table :crud_test_models, :force => true do |t|
84
+ t.string :name, :null => false, :limit => 50
85
+ t.string :whatever
86
+ t.integer :children
87
+ t.integer :companion_id
88
+ t.float :rating
89
+ t.decimal :income, :precision => 14, :scale => 2
90
+ t.date :birthdate
91
+ t.boolean :human, :default => true
92
+ t.text :remarks
93
+
94
+ t.timestamps
89
95
  end
90
96
  end
97
+
98
+ CrudTestModel.reset_column_information
91
99
  end
92
100
 
93
101
  # Removes the crud_test_models table from the database.
@@ -121,4 +129,4 @@ module CrudTestHelper
121
129
  :remarks => "#{c} #{c} #{c}\n" * 3)
122
130
  end
123
131
 
124
- end
132
+ end
@@ -39,8 +39,9 @@ module CrudControllerTestHelper
39
39
  end
40
40
 
41
41
  def test_show_without_id_redirects_to_index
42
- get :show
43
- assert_redirected_to_index
42
+ assert_raise(ActionController::RoutingError) do
43
+ get :show
44
+ end
44
45
  end
45
46
 
46
47
  def test_new
@@ -59,17 +60,6 @@ module CrudControllerTestHelper
59
60
  assert_test_attrs_equal
60
61
  end
61
62
 
62
- def test_create_with_wrong_http_method_redirects
63
- get :create, model_identifier => test_entry_attrs
64
- assert_redirected_to_index
65
-
66
- put :create, model_identifier => test_entry_attrs
67
- assert_redirected_to_index
68
-
69
- delete :create, model_identifier => test_entry_attrs
70
- assert_redirected_to_index
71
- end
72
-
73
63
  def test_create_xml
74
64
  assert_difference("#{model_class.name}.count") do
75
65
  post :create, model_identifier => test_entry_attrs, :format => 'xml'
@@ -86,7 +76,7 @@ module CrudControllerTestHelper
86
76
  end
87
77
 
88
78
  def test_edit_without_id_raises_RecordNotFound
89
- assert_raise(ActiveRecord::RecordNotFound) do
79
+ assert_raise(ActionController::RoutingError) do
90
80
  get :edit
91
81
  end
92
82
  end
@@ -98,15 +88,7 @@ module CrudControllerTestHelper
98
88
  assert_test_attrs_equal
99
89
  assert_redirected_to assigns(:entry)
100
90
  end
101
-
102
- def test_update_with_wrong_http_method_redirects
103
- get :update, :id => test_entry.id, model_identifier => test_entry_attrs
104
- assert_redirected_to_index
105
-
106
- delete :update, :id => test_entry.id, model_identifier => test_entry_attrs
107
- assert_redirected_to_index
108
- end
109
-
91
+
110
92
  def test_update_xml
111
93
  assert_no_difference("#{model_class.name}.count") do
112
94
  put :update, :id => test_entry.id, model_identifier => test_entry_attrs, :format => 'xml'
@@ -121,15 +103,7 @@ module CrudControllerTestHelper
121
103
  end
122
104
  assert_redirected_to_index
123
105
  end
124
-
125
- def test_destroy_with_wrong_http_method_redirects
126
- get :destroy, :id => test_entry.id
127
- assert_redirected_to_index
128
-
129
- put :destroy, :id => test_entry.id
130
- assert_redirected_to_index
131
- end
132
-
106
+
133
107
  def test_destroy_xml
134
108
  assert_difference("#{model_class.name}.count", -1) do
135
109
  delete :destroy, :id => test_entry.id, :format => 'xml'
@@ -138,6 +112,36 @@ module CrudControllerTestHelper
138
112
  assert_equal "", @response.body.strip
139
113
  end
140
114
 
115
+ # no need to test http methods for pure restfull controllers
116
+ def ignore_test_create_with_wrong_http_method_redirects
117
+ get :create, model_identifier => test_entry_attrs
118
+ assert_redirected_to_index
119
+
120
+ put :create, model_identifier => test_entry_attrs
121
+ assert_redirected_to_index
122
+
123
+ delete :create, model_identifier => test_entry_attrs
124
+ assert_redirected_to_index
125
+ end
126
+
127
+ # no need to test http methods for pure restfull controllers
128
+ def ignore_test_update_with_wrong_http_method_redirects
129
+ get :update, :id => test_entry.id, model_identifier => test_entry_attrs
130
+ assert_redirected_to_index
131
+
132
+ delete :update, :id => test_entry.id, model_identifier => test_entry_attrs
133
+ assert_redirected_to_index
134
+ end
135
+
136
+ # no need to test http methods for pure restfull controllers
137
+ def ignore_test_destroy_with_wrong_http_method_redirects
138
+ get :destroy, :id => test_entry.id
139
+ assert_redirected_to_index
140
+
141
+ put :destroy, :id => test_entry.id
142
+ assert_redirected_to_index
143
+ end
144
+
141
145
  protected
142
146
 
143
147
  def assert_redirected_to_index
@@ -9,16 +9,18 @@ class CrudTestModelsControllerTest < ActionController::TestCase
9
9
 
10
10
  attr_accessor :models
11
11
 
12
- setup :reset_db, :setup_db, :create_test_data
12
+ setup :reset_db, :setup_db, :create_test_data, :special_routing
13
13
 
14
14
  teardown :reset_db
15
+
15
16
 
16
17
  def test_setup
17
18
  assert_equal 6, CrudTestModel.count
18
19
  assert_equal CrudTestModelsController, @controller.class
19
20
  assert_recognizes({:controller => 'crud_test_models', :action => 'index'}, '/crud_test_models')
20
21
  assert_recognizes({:controller => 'crud_test_models', :action => 'show', :id => '1'}, '/crud_test_models/1')
21
- assert_equal %w(index show new create edit update destroy).to_set, CrudTestModelsController.send(:action_methods)
22
+ # no need to hide actions for pure restful controllers
23
+ #assert_equal %w(index show new create edit update destroy).to_set, CrudTestModelsController.send(:action_methods)
22
24
  end
23
25
 
24
26
  def test_index
@@ -56,7 +58,7 @@ class CrudTestModelsControllerTest < ActionController::TestCase
56
58
  assert assigns(:companions)
57
59
  assert flash[:error].present?
58
60
  assert_equal 'illegal', assigns(:entry).name
59
- assert_nil @controller.called_callbacks
61
+ assert_equal [:before_render_new], @controller.called_callbacks
60
62
  end
61
63
 
62
64
  def test_create_with_before_callback_redirect
@@ -75,9 +77,20 @@ class CrudTestModelsControllerTest < ActionController::TestCase
75
77
  assert_nil assigns(:companions)
76
78
  end
77
79
 
78
-
79
80
  protected
80
81
 
82
+ def special_routing
83
+ @routes = ActionDispatch::Routing::RouteSet.new
84
+ _routes = @routes
85
+
86
+ @controller.singleton_class.send(:include, _routes.url_helpers)
87
+ @controller.view_context_class = Class.new(@controller.view_context_class) do
88
+ include _routes.url_helpers
89
+ end
90
+
91
+ @routes.draw { resources :crud_test_models }
92
+ end
93
+
81
94
  def test_entry
82
95
  crud_test_models(:AAAAA)
83
96
  end