spree 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of spree might be problematic. Click here for more details.

Files changed (211) hide show
  1. data/History.txt +5 -0
  2. data/Manifest.txt +158 -21
  3. data/config/hoe.rb +2 -1
  4. data/lib/spree/version.rb +1 -1
  5. data/starter-app/app/views/layouts/application.rhtml +6 -4
  6. data/starter-app/db/sample/line_items.yml +6 -4
  7. data/starter-app/db/sample/{variations.yml → variants.yml} +16 -0
  8. data/starter-app/log/README +1 -0
  9. data/starter-app/public/images/spree.jpg +0 -0
  10. data/starter-app/public/stylesheets/application.css +2 -2
  11. data/starter-app/script/spec +4 -0
  12. data/starter-app/script/spec_server +102 -0
  13. data/starter-app/spec/models/cart_item_spec.rb +50 -0
  14. data/starter-app/spec/models/cart_spec.rb +51 -0
  15. data/starter-app/spec/models/line_item_spec.rb +33 -0
  16. data/starter-app/spec/models/product_spec.rb +29 -0
  17. data/starter-app/spec/rcov.opts +2 -0
  18. data/starter-app/spec/spec.opts +6 -0
  19. data/starter-app/spec/spec_helper.rb +39 -0
  20. data/starter-app/stories/all.rb +4 -0
  21. data/starter-app/stories/helper.rb +3 -0
  22. data/starter-app/vendor/plugins/rspec_on_rails/MIT-LICENSE +31 -0
  23. data/starter-app/vendor/plugins/rspec_on_rails/README +3 -0
  24. data/starter-app/vendor/plugins/rspec_on_rails/Rakefile +9 -0
  25. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec/CHANGES +1 -0
  26. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec/rspec_generator.rb +35 -0
  27. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec/templates/all_stories.rb +4 -0
  28. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec/templates/previous_failures.txt +0 -0
  29. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec/templates/rcov.opts +2 -0
  30. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec/templates/script/spec +4 -0
  31. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec/templates/script/spec_server +102 -0
  32. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec/templates/spec.opts +6 -0
  33. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec/templates/spec_helper.rb +39 -0
  34. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec/templates/stories_helper.rb +3 -0
  35. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec_controller/USAGE +33 -0
  36. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec_controller/rspec_controller_generator.rb +49 -0
  37. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec_controller/templates/controller_spec.rb +25 -0
  38. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec_controller/templates/helper_spec.rb +11 -0
  39. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec_controller/templates/view_spec.rb +12 -0
  40. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec_model/USAGE +18 -0
  41. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec_model/rspec_model_generator.rb +30 -0
  42. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec_model/templates/model_spec.rb +11 -0
  43. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec_scaffold/rspec_scaffold_generator.rb +167 -0
  44. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec_scaffold/templates/controller_spec.rb +313 -0
  45. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec_scaffold/templates/edit_erb_spec.rb +25 -0
  46. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec_scaffold/templates/helper_spec.rb +11 -0
  47. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec_scaffold/templates/index_erb_spec.rb +22 -0
  48. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec_scaffold/templates/new_erb_spec.rb +26 -0
  49. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec_scaffold/templates/routing_spec.rb +61 -0
  50. data/starter-app/vendor/plugins/rspec_on_rails/generators/rspec_scaffold/templates/show_erb_spec.rb +22 -0
  51. data/starter-app/vendor/plugins/rspec_on_rails/init.rb +9 -0
  52. data/starter-app/vendor/plugins/rspec_on_rails/lib/autotest/discover.rb +1 -0
  53. data/starter-app/vendor/plugins/rspec_on_rails/lib/autotest/rails_rspec.rb +81 -0
  54. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails.rb +51 -0
  55. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/example.rb +47 -0
  56. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/example/assigns_hash_proxy.rb +42 -0
  57. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/example/controller_example_group.rb +255 -0
  58. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/example/functional_example_group.rb +66 -0
  59. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/example/helper_example_group.rb +82 -0
  60. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/example/ivar_proxy.rb +62 -0
  61. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/example/model_example_group.rb +14 -0
  62. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/example/rails_example_group.rb +68 -0
  63. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/example/render_observer.rb +90 -0
  64. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/example/view_example_group.rb +171 -0
  65. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/extensions.rb +12 -0
  66. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/extensions/action_controller/base.rb +14 -0
  67. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/extensions/action_controller/rescue.rb +21 -0
  68. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/extensions/action_controller/test_response.rb +11 -0
  69. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/extensions/action_view/base.rb +27 -0
  70. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/extensions/active_record/base.rb +30 -0
  71. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/extensions/object.rb +5 -0
  72. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/extensions/spec/example/configuration.rb +66 -0
  73. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/extensions/spec/matchers/have.rb +21 -0
  74. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers.rb +29 -0
  75. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/assert_select.rb +130 -0
  76. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/have_text.rb +55 -0
  77. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/redirect_to.rb +113 -0
  78. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/matchers/render_template.rb +70 -0
  79. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/story_adapter.rb +71 -0
  80. data/starter-app/vendor/plugins/rspec_on_rails/lib/spec/rails/version.rb +23 -0
  81. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/autotest/mappings_spec.rb +36 -0
  82. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/autotest/rails_rspec_spec.rb +8 -0
  83. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/example/assigns_hash_proxy_spec.rb +55 -0
  84. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/example/configuration_spec.rb +83 -0
  85. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/example/controller_isolation_spec.rb +43 -0
  86. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/example/controller_spec_spec.rb +187 -0
  87. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/example/example_group_factory_spec.rb +112 -0
  88. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/example/helper_spec_spec.rb +118 -0
  89. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/example/ivar_proxy_spec.rb +64 -0
  90. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/example/model_spec_spec.rb +18 -0
  91. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/example/shared_behaviour_spec.rb +16 -0
  92. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/example/test_unit_assertion_accessibility_spec.rb +33 -0
  93. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/example/view_spec_spec.rb +263 -0
  94. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/extensions/action_controller_rescue_action_spec.rb +54 -0
  95. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/extensions/action_view_base_spec.rb +48 -0
  96. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/extensions/active_record_spec.rb +14 -0
  97. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/matchers/assert_select_spec.rb +783 -0
  98. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/matchers/description_generation_spec.rb +37 -0
  99. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/matchers/errors_on_spec.rb +13 -0
  100. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/matchers/have_text_spec.rb +62 -0
  101. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/matchers/redirect_to_spec.rb +203 -0
  102. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/matchers/render_spec.rb +169 -0
  103. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/mocks/mock_model_spec.rb +65 -0
  104. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/sample_spec.rb +7 -0
  105. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/spec_server_spec.rb +89 -0
  106. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails/spec_spec.rb +11 -0
  107. data/starter-app/vendor/plugins/rspec_on_rails/spec/rails_suite.rb +7 -0
  108. data/starter-app/vendor/plugins/rspec_on_rails/spec/spec_helper.rb +46 -0
  109. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/controllers/action_view_base_spec_controller.rb +2 -0
  110. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/controllers/controller_spec_controller.rb +56 -0
  111. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/controllers/redirect_spec_controller.rb +59 -0
  112. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/controllers/render_spec_controller.rb +26 -0
  113. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/controllers/rjs_spec_controller.rb +58 -0
  114. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/helpers/explicit_helper.rb +10 -0
  115. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/helpers/more_explicit_helper.rb +5 -0
  116. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/helpers/plugin_application_helper.rb +6 -0
  117. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/helpers/view_spec_helper.rb +13 -0
  118. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/controller_spec/_partial.rhtml +0 -0
  119. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/controller_spec/action_setting_flash_after_session_reset.rhtml +1 -0
  120. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/controller_spec/action_setting_flash_before_session_reset.rhtml +1 -0
  121. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/controller_spec/action_setting_the_assigns_hash.rhtml +0 -0
  122. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/controller_spec/action_with_errors_in_template.rhtml +1 -0
  123. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/controller_spec/action_with_template.rhtml +1 -0
  124. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/render_spec/_a_partial.rhtml +0 -0
  125. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/render_spec/some_action.js.rjs +1 -0
  126. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/render_spec/some_action.rhtml +0 -0
  127. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/render_spec/some_action.rjs +1 -0
  128. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/rjs_spec/_replacement_partial.rhtml +1 -0
  129. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/rjs_spec/hide_div.rjs +1 -0
  130. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/rjs_spec/hide_page_element.rjs +1 -0
  131. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/rjs_spec/insert_html.rjs +1 -0
  132. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/rjs_spec/replace.rjs +1 -0
  133. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/rjs_spec/replace_html.rjs +1 -0
  134. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/rjs_spec/replace_html_with_partial.rjs +1 -0
  135. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/rjs_spec/visual_effect.rjs +1 -0
  136. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/rjs_spec/visual_toggle_effect.rjs +1 -0
  137. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/tag_spec/no_tags.rhtml +1 -0
  138. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/tag_spec/single_div_with_no_attributes.rhtml +1 -0
  139. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/tag_spec/single_div_with_one_attribute.rhtml +1 -0
  140. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/view_spec/_partial.rhtml +2 -0
  141. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/view_spec/_partial_used_twice.rhtml +0 -0
  142. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/view_spec/_partial_with_local_variable.rhtml +1 -0
  143. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/view_spec/_partial_with_sub_partial.rhtml +1 -0
  144. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/view_spec/_spacer.rhtml +1 -0
  145. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/view_spec/accessor.rhtml +3 -0
  146. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/view_spec/entry_form.rhtml +2 -0
  147. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/view_spec/explicit_helper.rhtml +2 -0
  148. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/view_spec/foo/show.rhtml +1 -0
  149. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/view_spec/implicit_helper.rhtml +2 -0
  150. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/view_spec/multiple_helpers.rhtml +3 -0
  151. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/view_spec/template_with_partial.rhtml +5 -0
  152. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/view_spec/template_with_partial_using_collection.rhtml +3 -0
  153. data/starter-app/vendor/plugins/rspec_on_rails/spec_resources/views/view_spec/template_with_partial_with_array.rhtml +1 -0
  154. data/starter-app/vendor/plugins/rspec_on_rails/stories/all.rb +10 -0
  155. data/starter-app/vendor/plugins/rspec_on_rails/stories/helper.rb +5 -0
  156. data/starter-app/vendor/plugins/rspec_on_rails/stories/steps/people.rb +8 -0
  157. data/starter-app/vendor/plugins/rspec_on_rails/stories/transactions_should_rollback +15 -0
  158. data/starter-app/vendor/plugins/rspec_on_rails/stories/transactions_should_rollback.rb +25 -0
  159. data/starter-app/vendor/plugins/rspec_on_rails/tasks/rspec.rake +137 -0
  160. data/starter-app/vendor/plugins/spree/LICENSE +1 -1
  161. data/starter-app/vendor/plugins/spree/app/controllers/admin/categories_controller.rb +0 -24
  162. data/starter-app/vendor/plugins/spree/app/controllers/admin/products_controller.rb +16 -16
  163. data/starter-app/vendor/plugins/spree/app/controllers/cart_controller.rb +2 -8
  164. data/starter-app/vendor/plugins/spree/app/helpers/admin/products_helper.rb +1 -1
  165. data/starter-app/vendor/plugins/spree/app/helpers/spree/base_helper.rb +2 -2
  166. data/starter-app/vendor/plugins/spree/app/models/cart.rb +7 -20
  167. data/starter-app/vendor/plugins/spree/app/models/cart_item.rb +3 -6
  168. data/starter-app/vendor/plugins/spree/app/models/category.rb +6 -22
  169. data/starter-app/vendor/plugins/spree/app/models/line_item.rb +3 -5
  170. data/starter-app/vendor/plugins/spree/app/models/option_value.rb +1 -1
  171. data/starter-app/vendor/plugins/spree/app/models/product.rb +18 -2
  172. data/starter-app/vendor/plugins/spree/app/models/variant.rb +5 -0
  173. data/starter-app/vendor/plugins/spree/app/views/admin/categories/_form.rhtml +1 -5
  174. data/starter-app/vendor/plugins/spree/app/views/admin/overview/index.rhtml +3 -0
  175. data/starter-app/vendor/plugins/spree/app/views/admin/products/_form.rhtml +2 -2
  176. data/starter-app/vendor/plugins/spree/app/views/admin/products/{_new_variation.rhtml → _new_variant.rhtml} +1 -1
  177. data/starter-app/vendor/plugins/spree/app/views/admin/products/_variants.rhtml +43 -0
  178. data/starter-app/vendor/plugins/spree/app/views/cart/index.rhtml +4 -4
  179. data/starter-app/vendor/plugins/spree/app/views/layouts/admin.rhtml +1 -1
  180. data/starter-app/vendor/plugins/spree/app/views/order_mailer/cancel.rhtml +1 -1
  181. data/starter-app/vendor/plugins/spree/app/views/order_mailer/confirm.rhtml +1 -1
  182. data/starter-app/vendor/plugins/spree/app/views/shared/_order_details.rhtml +1 -1
  183. data/starter-app/vendor/plugins/spree/app/views/store/show.rhtml +30 -29
  184. data/starter-app/vendor/plugins/spree/assets/images/spree/spree.jpg +0 -0
  185. data/starter-app/vendor/plugins/spree/assets/stylesheets/spree-admin.css +1 -1
  186. data/starter-app/vendor/plugins/spree/assets/stylesheets/store/_controller.css +1 -1
  187. data/starter-app/vendor/plugins/spree/db/migrate/002_create_cart_items.rb +1 -2
  188. data/starter-app/vendor/plugins/spree/db/migrate/006_create_line_items.rb +5 -7
  189. data/starter-app/vendor/plugins/spree/db/migrate/011_create_variants.rb +11 -0
  190. data/starter-app/vendor/plugins/spree/db/migrate/018_create_option_values_variants.rb +12 -0
  191. data/starter-app/vendor/plugins/spree/test/unit/product_test.rb +0 -33
  192. metadata +170 -23
  193. data/starter-app/vendor/plugins/spree/app/controllers/admin/variations_controller.rb +0 -73
  194. data/starter-app/vendor/plugins/spree/app/helpers/admin/variations_helper.rb +0 -2
  195. data/starter-app/vendor/plugins/spree/app/models/variation.rb +0 -8
  196. data/starter-app/vendor/plugins/spree/app/views/admin/option_types/test.rhtml +0 -8
  197. data/starter-app/vendor/plugins/spree/app/views/admin/products/_variations.rhtml +0 -41
  198. data/starter-app/vendor/plugins/spree/app/views/admin/variations/_form.rhtml +0 -33
  199. data/starter-app/vendor/plugins/spree/app/views/admin/variations/_option_values.rhtml +0 -5
  200. data/starter-app/vendor/plugins/spree/app/views/admin/variations/list.rhtml +0 -23
  201. data/starter-app/vendor/plugins/spree/app/views/admin/variations/new.rhtml +0 -14
  202. data/starter-app/vendor/plugins/spree/assets/images/spree/spree_logo142x65.gif +0 -0
  203. data/starter-app/vendor/plugins/spree/assets/images/spree/spree_logo245x112.gif +0 -0
  204. data/starter-app/vendor/plugins/spree/db/migrate/011_create_variations.rb +0 -11
  205. data/starter-app/vendor/plugins/spree/db/migrate/018_create_option_values_variations.rb +0 -12
  206. data/starter-app/vendor/plugins/spree/test/functional/admin/variations_controller_test.rb +0 -18
  207. data/starter-app/vendor/plugins/spree/test/integration/variations_test.rb +0 -24
  208. data/starter-app/vendor/plugins/spree/test/unit/cart_item_test.rb +0 -55
  209. data/starter-app/vendor/plugins/spree/test/unit/cart_test.rb +0 -35
  210. data/starter-app/vendor/plugins/spree/test/unit/line_item_test.rb +0 -61
  211. data/starter-app/vendor/plugins/spree/test/unit/variation_test.rb +0 -9
@@ -0,0 +1,25 @@
1
+ require File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../../spec_helper'
2
+
3
+ describe "/<%= table_name %>/edit.<%= default_file_extension %>" do
4
+ include <%= controller_class_name %>Helper
5
+
6
+ before do
7
+ @<%= file_name %> = mock_model(<%= class_name %>)
8
+ <% for attribute in attributes -%>
9
+ @<%= file_name %>.stub!(:<%= attribute.name %>).and_return(<%= attribute.default_value %>)
10
+ <% end -%>
11
+ assigns[:<%= file_name %>] = @<%= file_name %>
12
+ end
13
+
14
+ it "should render edit form" do
15
+ render "/<%= table_name %>/edit.<%= default_file_extension %>"
16
+
17
+ response.should have_tag("form[action=#{<%= file_name %>_path(@<%= file_name %>)}][method=post]") do
18
+ <% for attribute in attributes -%><% unless attribute.name =~ /_id/ || [:datetime, :timestamp, :time, :date].index(attribute.type) -%>
19
+ with_tag('<%= attribute.input_type -%>#<%= file_name %>_<%= attribute.name %>[name=?]', "<%= file_name %>[<%= attribute.name %>]")
20
+ <% end -%><% end -%>
21
+ end
22
+ end
23
+ end
24
+
25
+
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../spec_helper'
2
+
3
+ describe <%= controller_class_name %>Helper do
4
+
5
+ #Delete this example and add some real ones or delete this file
6
+ it "should include the <%= class_name %>Helper" do
7
+ included_modules = self.metaclass.send :included_modules
8
+ included_modules.should include(<%= controller_class_name %>Helper)
9
+ end
10
+
11
+ end
@@ -0,0 +1,22 @@
1
+ require File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../../spec_helper'
2
+
3
+ describe "/<%= table_name %>/index.<%= default_file_extension %>" do
4
+ include <%= controller_class_name %>Helper
5
+
6
+ before(:each) do
7
+ <% [98,99].each do |id| -%>
8
+ <%= file_name %>_<%= id %> = mock_model(<%= class_name %>)
9
+ <% for attribute in attributes -%>
10
+ <%= file_name %>_<%= id %>.should_receive(:<%= attribute.name %>).and_return(<%= attribute.default_value %>)
11
+ <% end -%><% end %>
12
+ assigns[:<%= table_name %>] = [<%= file_name %>_98, <%= file_name %>_99]
13
+ end
14
+
15
+ it "should render list of <%= table_name %>" do
16
+ render "/<%= table_name %>/index.<%= default_file_extension %>"
17
+ <% for attribute in attributes -%><% unless attribute.name =~ /_id/ || [:datetime, :timestamp, :time, :date].index(attribute.type) -%>
18
+ response.should have_tag("tr>td", <%= attribute.default_value %>, 2)
19
+ <% end -%><% end -%>
20
+ end
21
+ end
22
+
@@ -0,0 +1,26 @@
1
+ require File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../../spec_helper'
2
+
3
+ describe "/<%= table_name %>/new.<%= default_file_extension %>" do
4
+ include <%= controller_class_name %>Helper
5
+
6
+ before(:each) do
7
+ @<%= file_name %> = mock_model(<%= class_name %>)
8
+ @<%= file_name %>.stub!(:new_record?).and_return(true)
9
+ <% for attribute in attributes -%>
10
+ @<%= file_name %>.stub!(:<%= attribute.name %>).and_return(<%= attribute.default_value %>)
11
+ <% end -%>
12
+ assigns[:<%= file_name %>] = @<%= file_name %>
13
+ end
14
+
15
+ it "should render new form" do
16
+ render "/<%= table_name %>/new.<%= default_file_extension %>"
17
+
18
+ response.should have_tag("form[action=?][method=post]", <%= table_name %>_path) do
19
+ <% for attribute in attributes -%><% unless attribute.name =~ /_id/ || [:datetime, :timestamp, :time, :date].index(attribute.type) -%>
20
+ with_tag("<%= attribute.input_type -%>#<%= file_name %>_<%= attribute.name %>[name=?]", "<%= file_name %>[<%= attribute.name %>]")
21
+ <% end -%><% end -%>
22
+ end
23
+ end
24
+ end
25
+
26
+
@@ -0,0 +1,61 @@
1
+ require File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../spec_helper'
2
+
3
+ describe <%= controller_class_name %>Controller do
4
+ describe "route generation" do
5
+
6
+ it "should map { :controller => '<%= table_name %>', :action => 'index' } to /<%= table_name %>" do
7
+ route_for(:controller => "<%= table_name %>", :action => "index").should == "/<%= table_name %>"
8
+ end
9
+
10
+ it "should map { :controller => '<%= table_name %>', :action => 'new' } to /<%= table_name %>/new" do
11
+ route_for(:controller => "<%= table_name %>", :action => "new").should == "/<%= table_name %>/new"
12
+ end
13
+
14
+ it "should map { :controller => '<%= table_name %>', :action => 'show', :id => 1 } to /<%= table_name %>/1" do
15
+ route_for(:controller => "<%= table_name %>", :action => "show", :id => 1).should == "/<%= table_name %>/1"
16
+ end
17
+
18
+ it "should map { :controller => '<%= table_name %>', :action => 'edit', :id => 1 } to /<%= table_name %>/1<%= resource_edit_path %>" do
19
+ route_for(:controller => "<%= table_name %>", :action => "edit", :id => 1).should == "/<%= table_name %>/1<%= resource_edit_path %>"
20
+ end
21
+
22
+ it "should map { :controller => '<%= table_name %>', :action => 'update', :id => 1} to /<%= table_name %>/1" do
23
+ route_for(:controller => "<%= table_name %>", :action => "update", :id => 1).should == "/<%= table_name %>/1"
24
+ end
25
+
26
+ it "should map { :controller => '<%= table_name %>', :action => 'destroy', :id => 1} to /<%= table_name %>/1" do
27
+ route_for(:controller => "<%= table_name %>", :action => "destroy", :id => 1).should == "/<%= table_name %>/1"
28
+ end
29
+ end
30
+
31
+ describe "route recognition" do
32
+
33
+ it "should generate params { :controller => '<%= table_name %>', action => 'index' } from GET /<%= table_name %>" do
34
+ params_from(:get, "/<%= table_name %>").should == {:controller => "<%= table_name %>", :action => "index"}
35
+ end
36
+
37
+ it "should generate params { :controller => '<%= table_name %>', action => 'new' } from GET /<%= table_name %>/new" do
38
+ params_from(:get, "/<%= table_name %>/new").should == {:controller => "<%= table_name %>", :action => "new"}
39
+ end
40
+
41
+ it "should generate params { :controller => '<%= table_name %>', action => 'create' } from POST /<%= table_name %>" do
42
+ params_from(:post, "/<%= table_name %>").should == {:controller => "<%= table_name %>", :action => "create"}
43
+ end
44
+
45
+ it "should generate params { :controller => '<%= table_name %>', action => 'show', id => '1' } from GET /<%= table_name %>/1" do
46
+ params_from(:get, "/<%= table_name %>/1").should == {:controller => "<%= table_name %>", :action => "show", :id => "1"}
47
+ end
48
+
49
+ it "should generate params { :controller => '<%= table_name %>', action => 'edit', id => '1' } from GET /<%= table_name %>/1;edit" do
50
+ params_from(:get, "/<%= table_name %>/1<%= resource_edit_path %>").should == {:controller => "<%= table_name %>", :action => "edit", :id => "1"}
51
+ end
52
+
53
+ it "should generate params { :controller => '<%= table_name %>', action => 'update', id => '1' } from PUT /<%= table_name %>/1" do
54
+ params_from(:put, "/<%= table_name %>/1").should == {:controller => "<%= table_name %>", :action => "update", :id => "1"}
55
+ end
56
+
57
+ it "should generate params { :controller => '<%= table_name %>', action => 'destroy', id => '1' } from DELETE /<%= table_name %>/1" do
58
+ params_from(:delete, "/<%= table_name %>/1").should == {:controller => "<%= table_name %>", :action => "destroy", :id => "1"}
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,22 @@
1
+ require File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../../spec_helper'
2
+
3
+ describe "/<%= table_name %>/show.<%= default_file_extension %>" do
4
+ include <%= controller_class_name %>Helper
5
+
6
+ before(:each) do
7
+ @<%= file_name %> = mock_model(<%= class_name %>)
8
+ <% for attribute in attributes -%>
9
+ @<%= file_name %>.stub!(:<%= attribute.name %>).and_return(<%= attribute.default_value %>)
10
+ <% end -%>
11
+
12
+ assigns[:<%= file_name %>] = @<%= file_name %>
13
+ end
14
+
15
+ it "should render attributes in <p>" do
16
+ render "/<%= table_name %>/show.<%= default_file_extension %>"
17
+ <% for attribute in attributes -%><% unless attribute.name =~ /_id/ || [:datetime, :timestamp, :time, :date].index(attribute.type) -%>
18
+ response.should have_text(/<%= Regexp.escape(attribute.default_value)[1..-2]%>/)
19
+ <% end -%><% end -%>
20
+ end
21
+ end
22
+
@@ -0,0 +1,9 @@
1
+ # Placeholder to satisfy Rails.
2
+ #
3
+ # Do NOT add any require statements to this file. Doing
4
+ # so will cause Rails to load this plugin all of the time.
5
+ #
6
+ # Running 'ruby script/generate rspec' will
7
+ # generate spec/spec_helper.rb, which includes the necessary
8
+ # require statements and configuration. This file should
9
+ # be required by all of your spec files.
@@ -0,0 +1 @@
1
+ # This needs to be here for >= ZenTest-3.9.0 to add this directory to the load path.
@@ -0,0 +1,81 @@
1
+ # (c) Copyright 2006 Nick Sieger <nicksieger@gmail.com>
2
+ #
3
+ # Permission is hereby granted, free of charge, to any person
4
+ # obtaining a copy of this software and associated documentation files
5
+ # (the "Software"), to deal in the Software without restriction,
6
+ # including without limitation the rights to use, copy, modify, merge,
7
+ # publish, distribute, sublicense, and/or sell copies of the Software,
8
+ # and to permit persons to whom the Software is furnished to do so,
9
+ # subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be
12
+ # included in all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
18
+ # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
19
+ # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ # SOFTWARE.
22
+
23
+ $:.push(*Dir["vendor/rails/*/lib"])
24
+
25
+ require 'active_support'
26
+ require 'autotest/rspec'
27
+
28
+ Autotest.add_hook :initialize do |at|
29
+ %w{^config/ ^coverage/ ^db/ ^doc/ ^log/ ^public/ ^script ^vendor/rails ^vendor/plugins previous_failures.txt}.each do |exception|
30
+ at.add_exception(exception)
31
+ end
32
+
33
+ at.clear_mappings
34
+
35
+ at.add_mapping(%r%^(test|spec)/fixtures/(.*).yml$%) { |_, m|
36
+ ["spec/models/#{m[2].singularize}_spec.rb"] + at.files_matching(%r%^spec\/views\/#{m[2]}/.*_spec\.rb$%)
37
+ }
38
+ at.add_mapping(%r%^spec/(models|controllers|views|helpers|lib)/.*rb$%) { |filename, _|
39
+ filename
40
+ }
41
+ at.add_mapping(%r%^app/models/(.*)\.rb$%) { |_, m|
42
+ ["spec/models/#{m[1]}_spec.rb"]
43
+ }
44
+ at.add_mapping(%r%^app/views/(.*)$%) { |_, m|
45
+ at.files_matching %r%^spec/views/#{m[1]}_spec.rb$%
46
+ }
47
+ at.add_mapping(%r%^app/controllers/(.*)\.rb$%) { |_, m|
48
+ if m[1] == "application"
49
+ at.files_matching %r%^spec/controllers/.*_spec\.rb$%
50
+ else
51
+ ["spec/controllers/#{m[1]}_spec.rb"]
52
+ end
53
+ }
54
+ at.add_mapping(%r%^app/helpers/(.*)_helper\.rb$%) { |_, m|
55
+ if m[1] == "application" then
56
+ at.files_matching(%r%^spec/(views|helpers)/.*_spec\.rb$%)
57
+ else
58
+ ["spec/helpers/#{m[1]}_helper_spec.rb"] + at.files_matching(%r%^spec\/views\/#{m[1]}/.*_spec\.rb$%)
59
+ end
60
+ }
61
+ at.add_mapping(%r%^config/routes\.rb$%) {
62
+ at.files_matching %r%^spec/(controllers|views|helpers)/.*_spec\.rb$%
63
+ }
64
+ at.add_mapping(%r%^config/database\.yml$%) { |_, m|
65
+ at.files_matching %r%^spec/models/.*_spec\.rb$%
66
+ }
67
+ at.add_mapping(%r%^(spec/(spec_helper|shared/.*)|config/(boot|environment(s/test)?))\.rb$%) {
68
+ at.files_matching %r%^spec/(models|controllers|views|helpers)/.*_spec\.rb$%
69
+ }
70
+ at.add_mapping(%r%^lib/(.*)\.rb$%) { |_, m|
71
+ ["spec/lib/#{m[1]}_spec.rb"]
72
+ }
73
+ end
74
+
75
+ class Autotest::RailsRspec < Autotest::Rspec
76
+
77
+ def spec_command
78
+ "script/spec"
79
+ end
80
+
81
+ end
@@ -0,0 +1,51 @@
1
+ silence_warnings { RAILS_ENV = "test" }
2
+
3
+ require 'application'
4
+ require 'action_controller/test_process'
5
+ require 'action_controller/integration'
6
+ require 'active_record/fixtures' if defined?(ActiveRecord::Base)
7
+ require 'test/unit'
8
+
9
+ require 'spec'
10
+
11
+ require 'spec/rails/extensions'
12
+ require 'spec/rails/example'
13
+ require 'spec/rails/version'
14
+ require 'spec/rails/matchers'
15
+
16
+ module Spec
17
+ # = Spec::Rails
18
+ #
19
+ # Spec::Rails (a.k.a. RSpec on Rails) is a Ruby on Rails plugin that allows you to drive the development
20
+ # of your RoR application using RSpec, a framework that aims to enable Example Driven Development
21
+ # in Ruby.
22
+ #
23
+ # == Features
24
+ #
25
+ # * Use RSpec to independently specify Rails Models, Views, Controllers and Helpers
26
+ # * Integrated fixture loading
27
+ # * Special generators for Resources, Models, Views and Controllers that generate Specs instead of Tests.
28
+ #
29
+ # == Vision
30
+ #
31
+ # For people for whom TDD is a brand new concept, the testing support built into Ruby on Rails
32
+ # is a huge leap forward. The fact that it is built right in is fantastic, and Ruby on Rails
33
+ # apps are generally much easier to maintain than they might have been without such support.
34
+ #
35
+ # For those of us coming from a history with TDD, and now BDD, the existing support presents some problems related to dependencies across specs. To that end, RSpec on Rails supports 4 types of specs. We’ve also built in first class mocking and stubbing support in order to break dependencies across these different concerns.
36
+ #
37
+ # == More Information
38
+ #
39
+ # See Spec::Rails::Runner for information about the different kinds of contexts
40
+ # you can use to spec the different Rails components
41
+ #
42
+ # See Spec::Rails::Expectations for information about Rails-specific expectations
43
+ # you can set on responses and models, etc.
44
+ #
45
+ # == License
46
+ #
47
+ # RSpec on Rails is licensed under the same license as RSpec itself,
48
+ # the MIT-LICENSE.
49
+ module Rails
50
+ end
51
+ end
@@ -0,0 +1,47 @@
1
+ dir = File.dirname(__FILE__)
2
+
3
+ require 'spec/rails/example/ivar_proxy'
4
+ require 'spec/rails/example/assigns_hash_proxy'
5
+
6
+ require "spec/rails/example/render_observer"
7
+ require "spec/rails/example/rails_example_group"
8
+ require "spec/rails/example/model_example_group"
9
+ require "spec/rails/example/functional_example_group"
10
+ require "spec/rails/example/controller_example_group"
11
+ require "spec/rails/example/helper_example_group"
12
+ require "spec/rails/example/view_example_group"
13
+
14
+ module Spec
15
+ module Rails
16
+ # Spec::Rails::Example extends Spec::Example (RSpec's core Example module) to provide
17
+ # Rails-specific contexts for describing Rails Models, Views, Controllers and Helpers.
18
+ #
19
+ # == Model Examples
20
+ #
21
+ # These are the equivalent of unit tests in Rails' built in testing. Ironically (for the traditional TDD'er) these are the only specs that we feel should actually interact with the database.
22
+ #
23
+ # See Spec::Rails::Example::ModelExampleGroup
24
+ #
25
+ # == Controller Examples
26
+ #
27
+ # These align somewhat with functional tests in rails, except that they do not actually render views (though you can force rendering of views if you prefer). Instead of setting expectations about what goes on a page, you set expectations about what templates get rendered.
28
+ #
29
+ # See Spec::Rails::Example::ControllerExampleGroup
30
+ #
31
+ # == View Examples
32
+ #
33
+ # This is the other half of Rails functional testing. View specs allow you to set up assigns and render
34
+ # a template. By assigning mock model data, you can specify view behaviour with no dependency on a database
35
+ # or your real models.
36
+ #
37
+ # See Spec::Rails::Example::ViewExampleGroup
38
+ #
39
+ # == Helper Examples
40
+ #
41
+ # These let you specify directly methods that live in your helpers.
42
+ #
43
+ # See Spec::Rails::Example::HelperExampleGroup
44
+ module Example
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,42 @@
1
+ module Spec
2
+ module Rails
3
+ module Example
4
+ class AssignsHashProxy #:nodoc:
5
+ def initialize(object)
6
+ @object = object
7
+ end
8
+
9
+ def [](ivar)
10
+ if assigns.include?(ivar.to_s)
11
+ assigns[ivar.to_s]
12
+ elsif assigns.include?(ivar)
13
+ assigns[ivar]
14
+ else
15
+ nil
16
+ end
17
+ end
18
+
19
+ def []=(ivar, val)
20
+ assigns[ivar.to_s] = val
21
+ end
22
+
23
+ def delete(name)
24
+ assigns.delete(name.to_s)
25
+ end
26
+
27
+ def each(&block)
28
+ assigns.each &block
29
+ end
30
+
31
+ def has_key?(key)
32
+ assigns.key?(key.to_s)
33
+ end
34
+
35
+ protected
36
+ def assigns
37
+ @object.assigns
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,255 @@
1
+ module Spec
2
+ module Rails
3
+ module Example
4
+ # Controller Examples live in $RAILS_ROOT/spec/controllers/.
5
+ #
6
+ # Controller Examples use Spec::Rails::Example::ControllerExampleGroup, which supports running specs for
7
+ # Controllers in two modes, which represent the tension between the more granular
8
+ # testing common in TDD and the more high level testing built into
9
+ # rails. BDD sits somewhere in between: we want to a balance between
10
+ # specs that are close enough to the code to enable quick fault
11
+ # isolation and far enough away from the code to enable refactoring
12
+ # with minimal changes to the existing specs.
13
+ #
14
+ # == Isolation mode (default)
15
+ #
16
+ # No dependencies on views because none are ever rendered. The
17
+ # benefit of this mode is that can spec the controller completely
18
+ # independent of the view, allowing that responsibility to be
19
+ # handled later, or by somebody else. Combined w/ separate view
20
+ # specs, this also provides better fault isolation.
21
+ #
22
+ # == Integration mode
23
+ #
24
+ # To run in this mode, include the +integrate_views+ declaration
25
+ # in your controller context:
26
+ #
27
+ # describe ThingController do
28
+ # integrate_views
29
+ # ...
30
+ #
31
+ # In this mode, controller specs are run in the same way that
32
+ # rails functional tests run - one set of tests for both the
33
+ # controllers and the views. The benefit of this approach is that
34
+ # you get wider coverage from each spec. Experienced rails
35
+ # developers may find this an easier approach to begin with, however
36
+ # we encourage you to explore using the isolation mode and revel
37
+ # in its benefits.
38
+ #
39
+ # == Expecting Errors
40
+ #
41
+ # Rspec on Rails will raise errors that occur in controller actions.
42
+ # In contrast, Rails will swallow errors that are raised in controller
43
+ # actions and return an error code in the header. If you wish to override
44
+ # Rspec and have Rail's default behaviour,tell the controller to use
45
+ # rails error handling ...
46
+ #
47
+ # before(:each) do
48
+ # controller.use_rails_error_handling!
49
+ # end
50
+ #
51
+ # When using Rail's error handling, you can expect error codes in headers ...
52
+ #
53
+ # it "should return an error in the header" do
54
+ # response.should be_error
55
+ # end
56
+ #
57
+ # it "should return a 501" do
58
+ # response.response_code.should == 501
59
+ # end
60
+ #
61
+ # it "should return a 501" do
62
+ # response.code.should == "501"
63
+ # end
64
+ class ControllerExampleGroup < FunctionalExampleGroup
65
+ class << self
66
+
67
+ # Use this to instruct RSpec to render views in your controller examples (Integration Mode).
68
+ #
69
+ # describe ThingController do
70
+ # integrate_views
71
+ # ...
72
+ #
73
+ # See Spec::Rails::Example::ControllerExampleGroup for more information about
74
+ # Integration and Isolation modes.
75
+ def integrate_views
76
+ @integrate_views = true
77
+ end
78
+ def integrate_views? # :nodoc:
79
+ @integrate_views
80
+ end
81
+
82
+ # You MUST provide a controller_name within the context of
83
+ # your controller specs:
84
+ #
85
+ # describe "ThingController" do
86
+ # controller_name :thing
87
+ # ...
88
+ def controller_name(name)
89
+ @controller_class_name = "#{name}_controller".camelize
90
+ end
91
+ attr_accessor :controller_class_name # :nodoc:
92
+ end
93
+
94
+ before(:each) do
95
+ # Some Rails apps explicitly disable ActionMailer in environment.rb
96
+ if defined?(ActionMailer)
97
+ @deliveries = []
98
+ ActionMailer::Base.deliveries = @deliveries
99
+ end
100
+
101
+ unless @controller.class.ancestors.include?(ActionController::Base)
102
+ Spec::Expectations.fail_with <<-EOE
103
+ You have to declare the controller name in controller specs. For example:
104
+ describe "The ExampleController" do
105
+ controller_name "example" #invokes the ExampleController
106
+ end
107
+ EOE
108
+ end
109
+ @controller.metaclass.class_eval do
110
+ def controller_path #:nodoc:
111
+ self.class.name.underscore.gsub('_controller', '')
112
+ end
113
+ include ControllerInstanceMethods
114
+ end
115
+ @controller.integrate_views! if @integrate_views
116
+ @controller.session = session
117
+ end
118
+
119
+ attr_reader :response, :request, :controller
120
+
121
+ def initialize(defined_description, &implementation) #:nodoc:
122
+ super
123
+ controller_class_name = self.class.controller_class_name
124
+ if controller_class_name
125
+ @controller_class_name = controller_class_name.to_s
126
+ else
127
+ @controller_class_name = self.class.described_type.to_s
128
+ end
129
+ @integrate_views = self.class.integrate_views?
130
+ end
131
+
132
+ # Uses ActionController::Routing::Routes to generate
133
+ # the correct route for a given set of options.
134
+ # == Example
135
+ # route_for(:controller => 'registrations', :action => 'edit', :id => 1)
136
+ # => '/registrations/1;edit'
137
+ def route_for(options)
138
+ ensure_that_routes_are_loaded
139
+ ActionController::Routing::Routes.generate(options)
140
+ end
141
+
142
+ # Uses ActionController::Routing::Routes to parse
143
+ # an incoming path so the parameters it generates can be checked
144
+ # == Example
145
+ # params_from(:get, '/registrations/1;edit')
146
+ # => :controller => 'registrations', :action => 'edit', :id => 1
147
+ def params_from(method, path)
148
+ ensure_that_routes_are_loaded
149
+ ActionController::Routing::Routes.recognize_path(path, :method => method)
150
+ end
151
+
152
+ protected
153
+ def _controller_ivar_proxy
154
+ @controller_ivar_proxy ||= AssignsHashProxy.new @controller
155
+ end
156
+
157
+ private
158
+ def ensure_that_routes_are_loaded
159
+ ActionController::Routing::Routes.reload if ActionController::Routing::Routes.empty?
160
+ end
161
+
162
+ module ControllerInstanceMethods #:nodoc:
163
+ include Spec::Rails::Example::RenderObserver
164
+
165
+ # === render(options = nil, deprecated_status = nil, &block)
166
+ #
167
+ # This gets added to the controller's singleton meta class,
168
+ # allowing Controller Examples to run in two modes, freely switching
169
+ # from context to context.
170
+ def render(options=nil, deprecated_status=nil, &block)
171
+ unless block_given?
172
+ unless integrate_views?
173
+ @template.metaclass.class_eval do
174
+ define_method :file_exists? do
175
+ true
176
+ end
177
+ define_method :render_file do |*args|
178
+ @first_render ||= args[0]
179
+ end
180
+ end
181
+ end
182
+ end
183
+
184
+ if matching_message_expectation_exists(options)
185
+ expect_render_mock_proxy.render(options, &block)
186
+ @performed_render = true
187
+ else
188
+ unless matching_stub_exists(options)
189
+ super(options, deprecated_status, &block)
190
+ end
191
+ end
192
+ end
193
+
194
+ private
195
+ def matching_message_expectation_exists(options)
196
+ expect_render_mock_proxy.send(:__mock_proxy).send(:find_matching_expectation, :render, options)
197
+ end
198
+
199
+ def matching_stub_exists(options)
200
+ expect_render_mock_proxy.send(:__mock_proxy).send(:find_matching_method_stub, :render, options)
201
+ end
202
+
203
+ public
204
+ if self.respond_to?(:should_receive) && self.respond_to?(:stub!)
205
+ self.send :alias_method, :orig_should_receive, :should_receive
206
+ self.send :alias_method, :orig_stub!, :stub!
207
+ def raise_with_disable_message(old_method, new_method)
208
+ raise %Q|
209
+ controller.#{old_method}(:render) has been disabled because it
210
+ can often produce unexpected results. Instead, you should
211
+ use the following (before the action):
212
+
213
+ controller.#{new_method}(*args)
214
+
215
+ See the rdoc for #{new_method} for more information.
216
+ |
217
+ end
218
+ def should_receive(*args)
219
+ if args[0] == :render
220
+ raise_with_disable_message("should_receive", "expect_render")
221
+ else
222
+ orig_should_receive(*args)
223
+ end
224
+ end
225
+ def stub!(*args)
226
+ if args[0] == :render
227
+ raise_with_disable_message("stub!", "stub_render")
228
+ else
229
+ orig_stub!(*args)
230
+ end
231
+ end
232
+ end
233
+
234
+ def response(&block)
235
+ # NOTE - we're setting @update for the assert_select_spec - kinda weird, huh?
236
+ @update = block
237
+ @_response || @response
238
+ end
239
+
240
+ def integrate_views!
241
+ @integrate_views = true
242
+ end
243
+
244
+ private
245
+
246
+ def integrate_views?
247
+ @integrate_views
248
+ end
249
+ end
250
+
251
+ Spec::Example::ExampleGroupFactory.register(:controller, self)
252
+ end
253
+ end
254
+ end
255
+ end