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,66 @@
1
+ module Spec
2
+ module Rails
3
+ module Example
4
+ class FunctionalExampleGroup < RailsExampleGroup
5
+ include ActionController::TestProcess
6
+ include ActionController::Assertions
7
+
8
+ attr_reader :request, :response
9
+ before(:each) do
10
+ @controller_class = Object.path2class @controller_class_name
11
+ raise "Can't determine controller class for #{@controller_class_name}" if @controller_class.nil?
12
+
13
+ @controller = @controller_class.new
14
+
15
+ @request = ActionController::TestRequest.new
16
+ @response = ActionController::TestResponse.new
17
+ end
18
+
19
+ def params
20
+ request.parameters
21
+ end
22
+
23
+ def flash
24
+ response.flash
25
+ end
26
+
27
+ def session
28
+ request.session
29
+ end
30
+
31
+ # :call-seq:
32
+ # assigns()
33
+ #
34
+ # Hash of instance variables to values that are made available to
35
+ # views. == Examples
36
+ #
37
+ # #in thing_controller.rb
38
+ # def new
39
+ # @thing = Thing.new
40
+ # end
41
+ #
42
+ # #in thing_controller_spec
43
+ # get 'new'
44
+ # assigns[:registration].should == Thing.new
45
+ #--
46
+ # NOTE - Even though docs only use assigns[:key] format, this supports
47
+ # assigns(:key) in order to avoid breaking old specs.
48
+ #++
49
+ def assigns(key = nil)
50
+ if key.nil?
51
+ @controller.assigns
52
+ _controller_ivar_proxy
53
+ else
54
+ @controller.assigns[key]
55
+ _controller_ivar_proxy[key]
56
+ end
57
+ end
58
+
59
+ protected
60
+ def _controller_ivar_proxy
61
+ @controller_ivar_proxy ||= IvarProxy.new @controller
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,82 @@
1
+ module Spec
2
+ module Rails
3
+ module Example
4
+ # Helper Specs live in $RAILS_ROOT/spec/helpers/.
5
+ #
6
+ # Helper Specs use Spec::Rails::Example::HelperExampleGroup, which allows you to
7
+ # include your Helper directly in the context and write specs directly
8
+ # against its methods.
9
+ #
10
+ # HelperExampleGroup also includes the standard lot of ActionView::Helpers in case your
11
+ # helpers rely on any of those.
12
+ #
13
+ # == Example
14
+ #
15
+ # class ThingHelper
16
+ # def number_of_things
17
+ # Thing.count
18
+ # end
19
+ # end
20
+ #
21
+ # describe "ThingHelper example_group" do
22
+ # include ThingHelper
23
+ # it "should tell you the number of things" do
24
+ # Thing.should_receive(:count).and_return(37)
25
+ # number_of_things.should == 37
26
+ # end
27
+ # end
28
+ class HelperExampleGroup < FunctionalExampleGroup
29
+ class << self
30
+ # The helper name....
31
+ def helper_name(name=nil)
32
+ send :include, "#{name}_helper".camelize.constantize
33
+ end
34
+ end
35
+
36
+ # Reverse the load order so that custom helpers which
37
+ # are defined last are also loaded last.
38
+ ActionView::Base.included_modules.reverse.each do |mod|
39
+ include mod if mod.parents.include?(ActionView::Helpers)
40
+ end
41
+
42
+ before(:all) do
43
+ @controller_class_name = 'Spec::Rails::Example::HelperBehaviourController'
44
+ end
45
+
46
+ before(:each) do
47
+ @controller.request = @request
48
+ @controller.url = ActionController::UrlRewriter.new @request, {} # url_for
49
+
50
+ @flash = ActionController::Flash::FlashHash.new
51
+ session['flash'] = @flash
52
+
53
+ ActionView::Helpers::AssetTagHelper::reset_javascript_include_default
54
+ end
55
+
56
+ def flash
57
+ @flash
58
+ end
59
+
60
+ def eval_erb(text)
61
+ ERB.new(text).result(binding)
62
+ end
63
+
64
+
65
+ # TODO: BT - Helper Examples should proxy method_missing to a Rails View instance.
66
+ # When that is done, remove this method
67
+ def protect_against_forgery?
68
+ false
69
+ end
70
+
71
+ Spec::Example::ExampleGroupFactory.register(:helper, self)
72
+ end
73
+
74
+ class HelperBehaviourController < ApplicationController #:nodoc:
75
+ attr_accessor :request, :url
76
+
77
+ # Re-raise errors
78
+ def rescue_action(e); raise e; end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,62 @@
1
+ ##
2
+ # A wrapper that allows instance variables to be manipulated using +[]+ and
3
+ # +[]=+
4
+
5
+ module Spec
6
+ module Rails
7
+ module Example
8
+ class IvarProxy #:nodoc:
9
+
10
+ ##
11
+ # Wraps +object+ allowing its instance variables to be manipulated.
12
+
13
+ def initialize(object)
14
+ @object = object
15
+ end
16
+
17
+ ##
18
+ # Retrieves +ivar+ from the wrapped object.
19
+
20
+ def [](ivar)
21
+ get_variable "@#{ivar}"
22
+ end
23
+
24
+ ##
25
+ # Sets +ivar+ to +val+ on the wrapped object.
26
+
27
+ def []=(ivar, val)
28
+ set_variable "@#{ivar}", val
29
+ end
30
+
31
+ def each
32
+ @object.instance_variables.each do |variable_full_name|
33
+ variable_name = variable_full_name[1...variable_full_name.length]
34
+ yield variable_name, get_variable(variable_full_name)
35
+ end
36
+ end
37
+
38
+ def delete(key)
39
+ var_name = "@#{key}"
40
+ if @object.instance_variables.include?(var_name)
41
+ @object.send(:remove_instance_variable, var_name)
42
+ else
43
+ return nil
44
+ end
45
+ end
46
+
47
+ def has_key?(key)
48
+ @object.instance_variables.include?("@#{key}")
49
+ end
50
+
51
+ protected
52
+ def get_variable(name)
53
+ @object.instance_variable_get name
54
+ end
55
+
56
+ def set_variable(name, value)
57
+ @object.instance_variable_set name, value
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,14 @@
1
+ module Spec
2
+ module Rails
3
+ module Example
4
+ # Model examples live in $RAILS_ROOT/spec/models/.
5
+ #
6
+ # Model examples use Spec::Rails::Example::ModelExampleGroup, which
7
+ # provides support for fixtures and some custom expectations via extensions
8
+ # to ActiveRecord::Base.
9
+ class ModelExampleGroup < RailsExampleGroup
10
+ Spec::Example::ExampleGroupFactory.register(:model, self)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec/interop/test'
2
+
3
+ ActionView::Base.cache_template_extensions = false
4
+
5
+ module Spec
6
+ module Rails
7
+ module Example
8
+ class RailsExampleGroup < Test::Unit::TestCase
9
+ # Rails >= r8570 uses setup/teardown_fixtures explicitly
10
+ before(:each) do
11
+ setup_fixtures if self.respond_to?(:setup_fixtures)
12
+ end
13
+ after(:each) do
14
+ teardown_fixtures if self.respond_to?(:teardown_fixtures)
15
+ end
16
+
17
+ include Spec::Rails::Matchers
18
+
19
+ @@model_id = 1000
20
+ # Creates a mock object instance for a +model_class+ with common
21
+ # methods stubbed out.
22
+ # Additional methods may be easily stubbed (via add_stubs) if +stubs+ is passed.
23
+ def mock_model(model_class, options_and_stubs = {})
24
+ # null = options_and_stubs.delete(:null_object)
25
+ # stubs = options_and_stubs
26
+ id = @@model_id
27
+ @@model_id += 1
28
+ options_and_stubs = {
29
+ :id => id,
30
+ :to_param => id.to_s,
31
+ :new_record? => false,
32
+ :errors => stub("errors", :count => 0)
33
+ }.merge(options_and_stubs)
34
+ m = mock("#{model_class.name}_#{id}", options_and_stubs)
35
+ m.send(:__mock_proxy).instance_eval <<-CODE
36
+ def @target.is_a?(other)
37
+ #{model_class}.ancestors.include?(other)
38
+ end
39
+ def @target.kind_of?(other)
40
+ #{model_class}.ancestors.include?(other)
41
+ end
42
+ def @target.instance_of?(other)
43
+ other == #{model_class}
44
+ end
45
+ def @target.class
46
+ #{model_class}
47
+ end
48
+ CODE
49
+ yield m if block_given?
50
+ m
51
+ end
52
+
53
+ #--
54
+ # TODO - Shouldn't this just be an extension of stub! ??
55
+ # - object.stub!(:method => return_value, :method2 => return_value2, :etc => etc)
56
+ #++
57
+ # Stubs methods on +object+ (if +object+ is a symbol or string a new mock
58
+ # with that name will be created). +stubs+ is a Hash of <tt>method=>value</tt>
59
+ def add_stubs(object, stubs = {}) #:nodoc:
60
+ m = [String, Symbol].index(object.class) ? mock(object.to_s) : object
61
+ stubs.each {|k,v| m.stub!(k).and_return(v)}
62
+ m
63
+ end
64
+ Spec::Example::ExampleGroupFactory.default(self)
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,90 @@
1
+ require 'spec/mocks'
2
+
3
+ module Spec
4
+ module Rails
5
+ module Example
6
+ # Provides specialized mock-like behaviour for controller and view examples,
7
+ # allowing you to mock or stub calls to render with specific arguments while
8
+ # ignoring all other calls.
9
+ module RenderObserver
10
+
11
+ # Similar to mocking +render+ with the exception that calls to +render+ with
12
+ # any other options are passed on to the receiver (i.e. controller in
13
+ # controller examples, template in view examples).
14
+ #
15
+ # This is necessary because Rails uses the +render+ method on both
16
+ # controllers and templates as a dispatcher to render different kinds of
17
+ # things, sometimes resulting in many calls to the render method within one
18
+ # request. This approach makes it impossible to use a normal mock object, which
19
+ # is designed to observe all incoming messages with a given name.
20
+ #
21
+ # +expect_render+ is auto-verifying, so failures will be reported without
22
+ # requiring you to explicitly request verification.
23
+ #
24
+ # Also, +expect_render+ uses parts of RSpec's mock expectation framework. Because
25
+ # it wraps only a subset of the framework, using this will create no conflict with
26
+ # other mock frameworks if you choose to use them. Additionally, the object returned
27
+ # by expect_render is an RSpec mock object, which means that you can call any of the
28
+ # chained methods available in RSpec's mocks.
29
+ #
30
+ # == Controller Examples
31
+ #
32
+ # controller.expect_render(:partial => 'thing', :object => thing)
33
+ # controller.expect_render(:partial => 'thing', :collection => things).once
34
+ #
35
+ # controller.stub_render(:partial => 'thing', :object => thing)
36
+ # controller.stub_render(:partial => 'thing', :collection => things).twice
37
+ #
38
+ # == View Examples
39
+ #
40
+ # template.expect_render(:partial => 'thing', :object => thing)
41
+ # template.expect_render(:partial => 'thing', :collection => things)
42
+ #
43
+ # template.stub_render(:partial => 'thing', :object => thing)
44
+ # template.stub_render(:partial => 'thing', :collection => things)
45
+ #
46
+ def expect_render(opts={})
47
+ register_verify_after_each
48
+ expect_render_mock_proxy.should_receive(:render, :expected_from => caller(1)[0]).with(opts)
49
+ end
50
+
51
+ # This is exactly like expect_render, with the exception that the call to render will not
52
+ # be verified. Use this if you are trying to isolate your example from a complicated render
53
+ # operation but don't care whether it is called or not.
54
+ def stub_render(opts={})
55
+ register_verify_after_each
56
+ expect_render_mock_proxy.stub!(:render, :expected_from => caller(1)[0]).with(opts)
57
+ end
58
+
59
+ def verify_rendered # :nodoc:
60
+ expect_render_mock_proxy.rspec_verify
61
+ end
62
+
63
+ def unregister_verify_after_each #:nodoc:
64
+ proc = verify_rendered_proc
65
+ Spec::Example::ExampleGroup.remove_after(:each, &proc)
66
+ end
67
+
68
+ protected
69
+
70
+ def verify_rendered_proc #:nodoc:
71
+ template = self
72
+ @verify_rendered_proc ||= Proc.new do
73
+ template.verify_rendered
74
+ template.unregister_verify_after_each
75
+ end
76
+ end
77
+
78
+ def register_verify_after_each #:nodoc:
79
+ proc = verify_rendered_proc
80
+ Spec::Example::ExampleGroup.after(:each, &proc)
81
+ end
82
+
83
+ def expect_render_mock_proxy #:nodoc:
84
+ @expect_render_mock_proxy ||= Spec::Mocks::Mock.new("expect_render_mock_proxy")
85
+ end
86
+
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,171 @@
1
+ module Spec
2
+ module Rails
3
+ module Example
4
+ # View Examples live in $RAILS_ROOT/spec/views/.
5
+ #
6
+ # View Specs use Spec::Rails::Example::ViewExampleGroup,
7
+ # which provides access to views without invoking any of your controllers.
8
+ # See Spec::Rails::Expectations::Matchers for information about specific
9
+ # expectations that you can set on views.
10
+ #
11
+ # == Example
12
+ #
13
+ # describe "login/login" do
14
+ # before do
15
+ # render 'login/login'
16
+ # end
17
+ #
18
+ # it "should display login form" do
19
+ # response.should have_tag("form[action=/login]") do
20
+ # with_tag("input[type=text][name=email]")
21
+ # with_tag("input[type=password][name=password]")
22
+ # with_tag("input[type=submit][value=Login]")
23
+ # end
24
+ # end
25
+ # end
26
+ class ViewExampleGroup < FunctionalExampleGroup
27
+ before(:each) do
28
+ ensure_that_flash_and_session_work_properly
29
+ end
30
+
31
+ after(:each) do
32
+ ensure_that_base_view_path_is_not_set_across_example_groups
33
+ end
34
+
35
+ def initialize(defined_description, &implementation) #:nodoc:
36
+ super
37
+ @controller_class_name = "Spec::Rails::Example::ViewExampleGroupController"
38
+ end
39
+
40
+ def ensure_that_flash_and_session_work_properly #:nodoc:
41
+ @controller.send :initialize_template_class, @response
42
+ @controller.send :assign_shortcuts, @request, @response
43
+ @session = @controller.session
44
+ @controller.class.send :public, :flash
45
+ end
46
+
47
+ def ensure_that_base_view_path_is_not_set_across_example_groups #:nodoc:
48
+ ActionView::Base.base_view_path = nil
49
+ end
50
+
51
+ def set_base_view_path(options) #:nodoc:
52
+ ActionView::Base.base_view_path = base_view_path(options)
53
+ end
54
+
55
+ def base_view_path(options) #:nodoc:
56
+ "/#{derived_controller_name(options)}/"
57
+ end
58
+
59
+ def derived_controller_name(options) #:nodoc:
60
+ parts = subject_of_render(options).split('/').reject { |part| part.empty? }
61
+ "#{parts[0..-2].join('/')}"
62
+ end
63
+
64
+ def derived_action_name(options) #:nodoc:
65
+ parts = subject_of_render(options).split('/').reject { |part| part.empty? }
66
+ "#{parts.last}"
67
+ end
68
+
69
+ def subject_of_render(options) #:nodoc:
70
+ [:template, :partial, :file].each do |render_type|
71
+ if options.has_key?(render_type)
72
+ return options[render_type]
73
+ end
74
+ end
75
+ raise Exception.new("Unhandled render type in view spec.")
76
+ end
77
+
78
+ def add_helpers(options) #:nodoc:
79
+ @controller.add_helper("application")
80
+ @controller.add_helper(derived_controller_name(options))
81
+ @controller.add_helper(options[:helper]) if options[:helper]
82
+ options[:helpers].each { |helper| @controller.add_helper(helper) } if options[:helpers]
83
+ end
84
+
85
+ # Renders a template for a View Spec, which then provides access to the result
86
+ # through the +response+.
87
+ #
88
+ # == Examples
89
+ #
90
+ # render('/people/list')
91
+ # render('/people/list', :helper => MyHelper)
92
+ # render('/people/list', :helpers => [MyHelper, MyOtherHelper])
93
+ # render(:partial => '/people/_address')
94
+ #
95
+ # See Spec::Rails::Example::ViewExampleGroup for more information.
96
+ def render(*args)
97
+ options = Hash === args.last ? args.pop : {}
98
+ options[:template] = args.first.to_s unless args.empty?
99
+
100
+ set_base_view_path(options)
101
+ add_helpers(options)
102
+
103
+ assigns[:action_name] = @action_name
104
+
105
+ @request.path_parameters = {
106
+ :controller => derived_controller_name(options),
107
+ :action => derived_action_name(options)
108
+ }
109
+
110
+ defaults = { :layout => false }
111
+ options = defaults.merge options
112
+
113
+ @controller.instance_variable_set :@params, @request.parameters
114
+
115
+ @controller.send :initialize_current_url
116
+
117
+ @controller.class.instance_eval %{
118
+ def controller_path
119
+ "#{derived_controller_name(options)}"
120
+ end
121
+
122
+ def controller_name
123
+ "#{derived_controller_name(options).split('/').last}"
124
+ end
125
+ }
126
+
127
+ @controller.send :forget_variables_added_to_assigns
128
+ @controller.send :render, options
129
+ @controller.send :process_cleanup
130
+ end
131
+
132
+ # This provides the template. Use this to set mock
133
+ # expectations for dealing with partials
134
+ #
135
+ # == Example
136
+ #
137
+ # describe "/person/new" do
138
+ # it "should use the form partial" do
139
+ # template.should_receive(:render).with(:partial => 'form')
140
+ # render "/person/new"
141
+ # end
142
+ # end
143
+ def template
144
+ @controller.template
145
+ end
146
+
147
+ Spec::Example::ExampleGroupFactory.register(:view, self)
148
+ end
149
+
150
+ class ViewExampleGroupController < ApplicationController #:nodoc:
151
+ include Spec::Rails::Example::RenderObserver
152
+ attr_reader :template
153
+
154
+ def add_helper_for(template_path)
155
+ add_helper(template_path.split('/')[0])
156
+ end
157
+
158
+ def add_helper(name)
159
+ begin
160
+ helper_module = "#{name}_helper".camelize.constantize
161
+ rescue
162
+ return
163
+ end
164
+ template.metaclass.class_eval do
165
+ include helper_module
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end
171
+ end