exception2db 0.0.1

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 (213) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/Rakefile +48 -0
  3. data/app/controllers/exception2db/main_controller.rb +34 -0
  4. data/app/models/e2db.rb +68 -0
  5. data/app/views/exception2db/main/index.html.erb +15 -0
  6. data/app/views/exception2db/main/show.html.erb +77 -0
  7. data/app/views/layouts/exception2db.html.erb +25 -0
  8. data/config/routes.rb +12 -0
  9. data/init.rb +23 -0
  10. data/lib/css/style.css +377 -0
  11. data/lib/exception2db.rb +27 -0
  12. data/lib/exception2db/config.rb +22 -0
  13. data/lib/exception2db/railtie.rb +12 -0
  14. data/lib/exception2db/util.rb +17 -0
  15. data/lib/exception2db/version.rb +3 -0
  16. data/lib/js/app.js +1 -0
  17. data/spec/exception2db_spec.rb +74 -0
  18. data/spec/spec_helper.rb +175 -0
  19. data/test/error_xml.rb +134 -0
  20. data/test/rails_root/Rakefile +10 -0
  21. data/test/rails_root/app/controllers/application_controller.rb +10 -0
  22. data/test/rails_root/app/controllers/articles_controller.rb +7 -0
  23. data/test/rails_root/app/models/article.rb +25 -0
  24. data/test/rails_root/app/models/city.rb +15 -0
  25. data/test/rails_root/app/models/comment.rb +13 -0
  26. data/test/rails_root/app/models/tech_magazine.rb +2 -0
  27. data/test/rails_root/app/models/vehicle/car.rb +4 -0
  28. data/test/rails_root/app/models/vehicle/door.rb +3 -0
  29. data/test/rails_root/app/models/vehicle/engine.rb +3 -0
  30. data/test/rails_root/config/boot.rb +110 -0
  31. data/test/rails_root/config/database.yml +14 -0
  32. data/test/rails_root/config/environment.rb +17 -0
  33. data/test/rails_root/config/environments/cucumber.rb +26 -0
  34. data/test/rails_root/config/environments/development.rb +0 -0
  35. data/test/rails_root/config/environments/test.rb +0 -0
  36. data/test/rails_root/config/initializers/new_rails_defaults.rb +19 -0
  37. data/test/rails_root/config/routes.rb +6 -0
  38. data/test/rails_root/db/migrate/20090809061114_create_tables.rb +15 -0
  39. data/test/rails_root/db/schema.rb +74 -0
  40. data/test/rails_root/db/sqlite3.db +0 -0
  41. data/test/rails_root/log/cucumber.log +3531 -0
  42. data/test/rails_root/log/development.log +445 -0
  43. data/test/rails_root/log/test.log +59223 -0
  44. data/test/rails_root/script/console +3 -0
  45. data/test/rails_root/script/dbconsole +3 -0
  46. data/test/rails_root/script/runner +3 -0
  47. data/test/rails_root/script/server +3 -0
  48. data/test/rspec-rails/Contribute.rdoc +4 -0
  49. data/test/rspec-rails/History.rdoc +283 -0
  50. data/test/rspec-rails/License.txt +33 -0
  51. data/test/rspec-rails/Manifest.txt +165 -0
  52. data/test/rspec-rails/README.rdoc +45 -0
  53. data/test/rspec-rails/Rakefile +72 -0
  54. data/test/rspec-rails/TODO.txt +17 -0
  55. data/test/rspec-rails/Upgrade.rdoc +148 -0
  56. data/test/rspec-rails/generators/integration_spec/integration_spec_generator.rb +10 -0
  57. data/test/rspec-rails/generators/integration_spec/templates/integration_spec.rb +4 -0
  58. data/test/rspec-rails/generators/rspec/CHANGES +1 -0
  59. data/test/rspec-rails/generators/rspec/rspec_generator.rb +53 -0
  60. data/test/rspec-rails/generators/rspec/templates/previous_failures.txt +0 -0
  61. data/test/rspec-rails/generators/rspec/templates/rcov.opts +2 -0
  62. data/test/rspec-rails/generators/rspec/templates/rspec.rake +144 -0
  63. data/test/rspec-rails/generators/rspec/templates/script/autospec +6 -0
  64. data/test/rspec-rails/generators/rspec/templates/script/spec +10 -0
  65. data/test/rspec-rails/generators/rspec/templates/spec.opts +4 -0
  66. data/test/rspec-rails/generators/rspec/templates/spec_helper.rb +54 -0
  67. data/test/rspec-rails/generators/rspec_controller/USAGE +33 -0
  68. data/test/rspec-rails/generators/rspec_controller/rspec_controller_generator.rb +47 -0
  69. data/test/rspec-rails/generators/rspec_controller/templates/controller_spec.rb +25 -0
  70. data/test/rspec-rails/generators/rspec_controller/templates/helper_spec.rb +11 -0
  71. data/test/rspec-rails/generators/rspec_controller/templates/view_spec.rb +12 -0
  72. data/test/rspec-rails/generators/rspec_default_values.rb +28 -0
  73. data/test/rspec-rails/generators/rspec_model/USAGE +18 -0
  74. data/test/rspec-rails/generators/rspec_model/rspec_model_generator.rb +35 -0
  75. data/test/rspec-rails/generators/rspec_model/templates/model_spec.rb +13 -0
  76. data/test/rspec-rails/generators/rspec_scaffold/rspec_scaffold_generator.rb +154 -0
  77. data/test/rspec-rails/generators/rspec_scaffold/templates/controller_spec.rb +131 -0
  78. data/test/rspec-rails/generators/rspec_scaffold/templates/edit_erb_spec.rb +25 -0
  79. data/test/rspec-rails/generators/rspec_scaffold/templates/helper_spec.rb +11 -0
  80. data/test/rspec-rails/generators/rspec_scaffold/templates/index_erb_spec.rb +27 -0
  81. data/test/rspec-rails/generators/rspec_scaffold/templates/new_erb_spec.rb +25 -0
  82. data/test/rspec-rails/generators/rspec_scaffold/templates/routing_spec.rb +33 -0
  83. data/test/rspec-rails/generators/rspec_scaffold/templates/show_erb_spec.rb +22 -0
  84. data/test/rspec-rails/init.rb +9 -0
  85. data/test/rspec-rails/lib/autotest/discover.rb +5 -0
  86. data/test/rspec-rails/lib/autotest/rails_rspec.rb +76 -0
  87. data/test/rspec-rails/lib/spec/rails.rb +26 -0
  88. data/test/rspec-rails/lib/spec/rails/example.rb +48 -0
  89. data/test/rspec-rails/lib/spec/rails/example/assigns_hash_proxy.rb +39 -0
  90. data/test/rspec-rails/lib/spec/rails/example/controller_example_group.rb +278 -0
  91. data/test/rspec-rails/lib/spec/rails/example/cookies_proxy.rb +29 -0
  92. data/test/rspec-rails/lib/spec/rails/example/functional_example_group.rb +106 -0
  93. data/test/rspec-rails/lib/spec/rails/example/helper_example_group.rb +153 -0
  94. data/test/rspec-rails/lib/spec/rails/example/integration_example_group.rb +16 -0
  95. data/test/rspec-rails/lib/spec/rails/example/model_example_group.rb +14 -0
  96. data/test/rspec-rails/lib/spec/rails/example/render_observer.rb +80 -0
  97. data/test/rspec-rails/lib/spec/rails/example/routing_example_group.rb +13 -0
  98. data/test/rspec-rails/lib/spec/rails/example/routing_helpers.rb +66 -0
  99. data/test/rspec-rails/lib/spec/rails/example/view_example_group.rb +199 -0
  100. data/test/rspec-rails/lib/spec/rails/extensions.rb +11 -0
  101. data/test/rspec-rails/lib/spec/rails/extensions/action_controller/rescue.rb +42 -0
  102. data/test/rspec-rails/lib/spec/rails/extensions/action_controller/test_case.rb +16 -0
  103. data/test/rspec-rails/lib/spec/rails/extensions/action_controller/test_response.rb +21 -0
  104. data/test/rspec-rails/lib/spec/rails/extensions/action_view/base.rb +33 -0
  105. data/test/rspec-rails/lib/spec/rails/extensions/active_record/base.rb +45 -0
  106. data/test/rspec-rails/lib/spec/rails/extensions/active_support/test_case.rb +7 -0
  107. data/test/rspec-rails/lib/spec/rails/extensions/spec/matchers/have.rb +23 -0
  108. data/test/rspec-rails/lib/spec/rails/extensions/spec/runner/configuration.rb +44 -0
  109. data/test/rspec-rails/lib/spec/rails/interop/testcase.rb +14 -0
  110. data/test/rspec-rails/lib/spec/rails/matchers.rb +33 -0
  111. data/test/rspec-rails/lib/spec/rails/matchers/ar_be_valid.rb +46 -0
  112. data/test/rspec-rails/lib/spec/rails/matchers/assert_select.rb +180 -0
  113. data/test/rspec-rails/lib/spec/rails/matchers/change.rb +13 -0
  114. data/test/rspec-rails/lib/spec/rails/matchers/have_text.rb +57 -0
  115. data/test/rspec-rails/lib/spec/rails/matchers/include_text.rb +54 -0
  116. data/test/rspec-rails/lib/spec/rails/matchers/redirect_to.rb +126 -0
  117. data/test/rspec-rails/lib/spec/rails/matchers/render_template.rb +129 -0
  118. data/test/rspec-rails/lib/spec/rails/matchers/route_to.rb +149 -0
  119. data/test/rspec-rails/lib/spec/rails/mocks.rb +135 -0
  120. data/test/rspec-rails/lib/spec/rails/version.rb +16 -0
  121. data/test/rspec-rails/spec/autotest/mappings_spec.rb +86 -0
  122. data/test/rspec-rails/spec/rails_suite.rb +7 -0
  123. data/test/rspec-rails/spec/resources/controllers/action_view_base_spec_controller.rb +2 -0
  124. data/test/rspec-rails/spec/resources/controllers/application.rb +9 -0
  125. data/test/rspec-rails/spec/resources/controllers/controller_spec_controller.rb +127 -0
  126. data/test/rspec-rails/spec/resources/controllers/example.txt +1 -0
  127. data/test/rspec-rails/spec/resources/controllers/redirect_spec_controller.rb +70 -0
  128. data/test/rspec-rails/spec/resources/controllers/render_spec_controller.rb +34 -0
  129. data/test/rspec-rails/spec/resources/controllers/rjs_spec_controller.rb +58 -0
  130. data/test/rspec-rails/spec/resources/helpers/addition_helper.rb +5 -0
  131. data/test/rspec-rails/spec/resources/helpers/explicit_helper.rb +46 -0
  132. data/test/rspec-rails/spec/resources/helpers/more_explicit_helper.rb +5 -0
  133. data/test/rspec-rails/spec/resources/helpers/plugin_application_helper.rb +6 -0
  134. data/test/rspec-rails/spec/resources/helpers/view_spec_helper.rb +13 -0
  135. data/test/rspec-rails/spec/resources/models/animal.rb +4 -0
  136. data/test/rspec-rails/spec/resources/models/person.rb +18 -0
  137. data/test/rspec-rails/spec/resources/models/thing.rb +3 -0
  138. data/test/rspec-rails/spec/resources/views/controller_spec/_partial.html.erb +0 -0
  139. data/test/rspec-rails/spec/resources/views/controller_spec/action_setting_flash_after_session_reset.html.erb +1 -0
  140. data/test/rspec-rails/spec/resources/views/controller_spec/action_setting_flash_before_session_reset.html.erb +1 -0
  141. data/test/rspec-rails/spec/resources/views/controller_spec/action_setting_the_assigns_hash.html.erb +0 -0
  142. data/test/rspec-rails/spec/resources/views/controller_spec/action_with_errors_in_template.html.erb +1 -0
  143. data/test/rspec-rails/spec/resources/views/controller_spec/action_with_template.html.erb +1 -0
  144. data/test/rspec-rails/spec/resources/views/controller_spec/non_existent_action_with_existent_template.html.erb +0 -0
  145. data/test/rspec-rails/spec/resources/views/layouts/application.html.erb +0 -0
  146. data/test/rspec-rails/spec/resources/views/layouts/simple.html.erb +0 -0
  147. data/test/rspec-rails/spec/resources/views/objects/_object.html.erb +1 -0
  148. data/test/rspec-rails/spec/resources/views/render_spec/_a_partial.html.erb +0 -0
  149. data/test/rspec-rails/spec/resources/views/render_spec/action_with_alternate_layout.html.erb +0 -0
  150. data/test/rspec-rails/spec/resources/views/render_spec/some_action.html.erb +0 -0
  151. data/test/rspec-rails/spec/resources/views/render_spec/some_action.js.rjs +1 -0
  152. data/test/rspec-rails/spec/resources/views/rjs_spec/_replacement_partial.html.erb +1 -0
  153. data/test/rspec-rails/spec/resources/views/rjs_spec/hide_div.js.rjs +1 -0
  154. data/test/rspec-rails/spec/resources/views/rjs_spec/hide_page_element.js.rjs +1 -0
  155. data/test/rspec-rails/spec/resources/views/rjs_spec/insert_html.js.rjs +1 -0
  156. data/test/rspec-rails/spec/resources/views/rjs_spec/replace.js.rjs +1 -0
  157. data/test/rspec-rails/spec/resources/views/rjs_spec/replace_html.js.rjs +1 -0
  158. data/test/rspec-rails/spec/resources/views/rjs_spec/replace_html_with_partial.js.rjs +1 -0
  159. data/test/rspec-rails/spec/resources/views/rjs_spec/visual_effect.js.rjs +1 -0
  160. data/test/rspec-rails/spec/resources/views/rjs_spec/visual_toggle_effect.js.rjs +1 -0
  161. data/test/rspec-rails/spec/resources/views/tag_spec/no_tags.html.erb +1 -0
  162. data/test/rspec-rails/spec/resources/views/tag_spec/single_div_with_no_attributes.html.erb +1 -0
  163. data/test/rspec-rails/spec/resources/views/tag_spec/single_div_with_one_attribute.html.erb +1 -0
  164. data/test/rspec-rails/spec/resources/views/view_spec/_partial.html.erb +2 -0
  165. data/test/rspec-rails/spec/resources/views/view_spec/_partial_used_twice.html.erb +0 -0
  166. data/test/rspec-rails/spec/resources/views/view_spec/_partial_with_local_variable.html.erb +1 -0
  167. data/test/rspec-rails/spec/resources/views/view_spec/_partial_with_sub_partial.html.erb +1 -0
  168. data/test/rspec-rails/spec/resources/views/view_spec/_spacer.html.erb +1 -0
  169. data/test/rspec-rails/spec/resources/views/view_spec/accessor.html.erb +5 -0
  170. data/test/rspec-rails/spec/resources/views/view_spec/block_helper.html.erb +3 -0
  171. data/test/rspec-rails/spec/resources/views/view_spec/entry_form.html.erb +2 -0
  172. data/test/rspec-rails/spec/resources/views/view_spec/explicit_helper.html.erb +2 -0
  173. data/test/rspec-rails/spec/resources/views/view_spec/foo/show.html.erb +1 -0
  174. data/test/rspec-rails/spec/resources/views/view_spec/implicit_helper.html.erb +2 -0
  175. data/test/rspec-rails/spec/resources/views/view_spec/multiple_helpers.html.erb +3 -0
  176. data/test/rspec-rails/spec/resources/views/view_spec/path_params.html.erb +1 -0
  177. data/test/rspec-rails/spec/resources/views/view_spec/should_not_receive.html.erb +3 -0
  178. data/test/rspec-rails/spec/resources/views/view_spec/template_with_partial.html.erb +5 -0
  179. data/test/rspec-rails/spec/resources/views/view_spec/template_with_partial_using_collection.html.erb +3 -0
  180. data/test/rspec-rails/spec/resources/views/view_spec/template_with_partial_with_array.html.erb +1 -0
  181. data/test/rspec-rails/spec/resources/views/view_spec/view_helpers.html.erb +1 -0
  182. data/test/rspec-rails/spec/spec/rails/example/assigns_hash_proxy_spec.rb +109 -0
  183. data/test/rspec-rails/spec/spec/rails/example/configuration_spec.rb +65 -0
  184. data/test/rspec-rails/spec/spec/rails/example/controller_example_group_spec.rb +307 -0
  185. data/test/rspec-rails/spec/spec/rails/example/controller_isolation_spec.rb +75 -0
  186. data/test/rspec-rails/spec/spec/rails/example/cookies_proxy_spec.rb +87 -0
  187. data/test/rspec-rails/spec/spec/rails/example/error_handling_spec.rb +90 -0
  188. data/test/rspec-rails/spec/spec/rails/example/example_group_factory_spec.rb +112 -0
  189. data/test/rspec-rails/spec/spec/rails/example/helper_example_group_spec.rb +233 -0
  190. data/test/rspec-rails/spec/spec/rails/example/model_example_group_spec.rb +20 -0
  191. data/test/rspec-rails/spec/spec/rails/example/routing_example_group_spec.rb +10 -0
  192. data/test/rspec-rails/spec/spec/rails/example/shared_routing_example_group_examples.rb +237 -0
  193. data/test/rspec-rails/spec/spec/rails/example/test_unit_assertion_accessibility_spec.rb +33 -0
  194. data/test/rspec-rails/spec/spec/rails/example/view_example_group_spec.rb +349 -0
  195. data/test/rspec-rails/spec/spec/rails/extensions/action_view_base_spec.rb +74 -0
  196. data/test/rspec-rails/spec/spec/rails/extensions/active_record_spec.rb +14 -0
  197. data/test/rspec-rails/spec/spec/rails/interop/testcase_spec.rb +70 -0
  198. data/test/rspec-rails/spec/spec/rails/matchers/ar_be_valid_spec.rb +19 -0
  199. data/test/rspec-rails/spec/spec/rails/matchers/assert_select_spec.rb +835 -0
  200. data/test/rspec-rails/spec/spec/rails/matchers/errors_on_spec.rb +37 -0
  201. data/test/rspec-rails/spec/spec/rails/matchers/have_text_spec.rb +69 -0
  202. data/test/rspec-rails/spec/spec/rails/matchers/include_text_spec.rb +62 -0
  203. data/test/rspec-rails/spec/spec/rails/matchers/redirect_to_spec.rb +253 -0
  204. data/test/rspec-rails/spec/spec/rails/matchers/render_template_spec.rb +208 -0
  205. data/test/rspec-rails/spec/spec/rails/matchers/should_change_spec.rb +15 -0
  206. data/test/rspec-rails/spec/spec/rails/mocks/ar_classes.rb +10 -0
  207. data/test/rspec-rails/spec/spec/rails/mocks/mock_model_spec.rb +106 -0
  208. data/test/rspec-rails/spec/spec/rails/mocks/stub_model_spec.rb +80 -0
  209. data/test/rspec-rails/spec/spec/rails/sample_modified_fixture.rb +8 -0
  210. data/test/rspec-rails/spec/spec/rails/sample_spec.rb +8 -0
  211. data/test/rspec-rails/spec/spec/rails/spec_spec.rb +11 -0
  212. data/test/rspec-rails/spec/spec_helper.rb +78 -0
  213. metadata +476 -0
@@ -0,0 +1,153 @@
1
+ module Spec
2
+ module Rails
3
+ module Example
4
+ class HelperExampleGroupController < ApplicationController #:nodoc:
5
+ attr_accessor :request, :url
6
+ end
7
+
8
+ # Helper Specs live in $RAILS_ROOT/spec/helpers/.
9
+ #
10
+ # Helper Specs use Spec::Rails::Example::HelperExampleGroup, which allows you to
11
+ # include your Helper directly in the context and write specs directly
12
+ # against its methods.
13
+ #
14
+ # HelperExampleGroup also includes the standard lot of ActionView::Helpers in case your
15
+ # helpers rely on any of those.
16
+ #
17
+ # == Example
18
+ #
19
+ # module ThingHelper
20
+ # def number_of_things
21
+ # Thing.count
22
+ # end
23
+ # end
24
+ #
25
+ # describe "ThingHelper example_group" do
26
+ # include ThingHelper
27
+ # it "should tell you the number of things" do
28
+ # Thing.should_receive(:count).and_return(37)
29
+ # number_of_things.should == 37
30
+ # end
31
+ # end
32
+ class HelperExampleGroup < FunctionalExampleGroup
33
+ tests HelperExampleGroupController
34
+ attr_accessor :output_buffer
35
+
36
+ class HelperObject < ActionView::Base
37
+ def initialize(*args)
38
+ @template = self
39
+ super
40
+ end
41
+ def protect_against_forgery?
42
+ false
43
+ end
44
+
45
+ attr_writer :session, :request, :flash, :params, :controller
46
+
47
+ private
48
+ attr_reader :session, :request, :flash, :params, :controller
49
+ end
50
+
51
+ class << self
52
+ # The helper name....
53
+ def helper_name(name=nil)
54
+ @helper_being_described = "#{name}_helper".camelize.constantize
55
+ send :include, @helper_being_described
56
+ end
57
+
58
+ def helper
59
+ @helper_object ||= returning HelperObject.new do |helper_object|
60
+ if @helper_being_described.nil?
61
+ if described_type.class == Module
62
+ helper_object.extend described_type
63
+ end
64
+ else
65
+ helper_object.extend @helper_being_described
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ # Returns an instance of ActionView::Base with the helper being spec'd
72
+ # included.
73
+ #
74
+ # == Example
75
+ #
76
+ # describe PersonHelper do
77
+ # it "should write a link to person with the name" do
78
+ # assigns[:person] = mock_model(Person, :full_name => "Full Name", :id => 37, :new_record? => false)
79
+ # helper.link_to_person.should == %{<a href="/people/37">Full Name</a>}
80
+ # end
81
+ # end
82
+ #
83
+ # module PersonHelper
84
+ # def link_to_person
85
+ # link_to person.full_name, url_for(person)
86
+ # end
87
+ # end
88
+ #
89
+ def helper
90
+ self.class.helper
91
+ end
92
+
93
+ def orig_assigns
94
+ helper.assigns
95
+ end
96
+
97
+ # Reverse the load order so that custom helpers which are defined last
98
+ # are also loaded last.
99
+ ActionView::Base.included_modules.reverse.each do |mod|
100
+ include mod if mod.parents.include?(ActionView::Helpers)
101
+ end
102
+
103
+ before(:each) do
104
+ @controller.request = @request
105
+ @controller.url = ActionController::UrlRewriter.new @request, {} # url_for
106
+
107
+ @flash = ActionController::Flash::FlashHash.new
108
+ session['flash'] = @flash
109
+
110
+ @output_buffer = ""
111
+ @template = helper
112
+ ActionView::Helpers::AssetTagHelper::reset_javascript_include_default
113
+
114
+ helper.session = session
115
+ helper.request = @request
116
+ helper.flash = flash
117
+ helper.params = params
118
+ helper.controller = @controller
119
+ end
120
+
121
+ def flash
122
+ @flash
123
+ end
124
+
125
+ def eval_erb(text)
126
+ erb_args = [text]
127
+ if helper.respond_to?(:output_buffer)
128
+ erb_args += [nil, nil, '@output_buffer']
129
+ end
130
+
131
+ helper.instance_eval do
132
+ ERB.new(*erb_args).result(binding)
133
+ end
134
+ end
135
+
136
+ # TODO: BT - Helper Examples should proxy method_missing to a Rails View instance.
137
+ # When that is done, remove this method
138
+ def protect_against_forgery?
139
+ false
140
+ end
141
+
142
+ Spec::Example::ExampleGroupFactory.register(:helper, self)
143
+
144
+ protected
145
+
146
+ def _assigns_hash_proxy
147
+ @_assigns_hash_proxy ||= AssignsHashProxy.new(self) {helper}
148
+ end
149
+
150
+ end
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,16 @@
1
+ class ActionController::IntegrationTest
2
+ alias_method :orig_initialize, :initialize
3
+ def initialize(*args)
4
+ super
5
+ end
6
+ end
7
+
8
+ module Spec
9
+ module Rails
10
+ module Example
11
+ class IntegrationExampleGroup < ActionController::IntegrationTest
12
+ Spec::Example::ExampleGroupFactory.register(:integration, self)
13
+ end
14
+ end
15
+ end
16
+ 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 < ActiveSupport::TestCase
10
+ Spec::Example::ExampleGroupFactory.register(:model, self)
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,80 @@
1
+ require 'spec/mocks/framework'
2
+
3
+ module Spec
4
+ module Rails
5
+ module Example
6
+ # Extends the #should_receive, #should_not_receive and #stub! methods in rspec's
7
+ # mocking framework to handle #render calls to controller in controller examples
8
+ # and template and view examples
9
+ module RenderObserver
10
+
11
+ def verify_rendered # :nodoc:
12
+ render_proxy.rspec_verify
13
+ end
14
+
15
+ def unregister_verify_after_each #:nodoc:
16
+ proc = verify_rendered_proc
17
+ Spec::Example::ExampleGroup.remove_after(:each, &proc)
18
+ end
19
+
20
+ def should_receive(*args)
21
+ if args[0] == :render
22
+ register_verify_after_each
23
+ render_proxy.should_receive(:render, :expected_from => caller(1)[0])
24
+ else
25
+ super
26
+ end
27
+ end
28
+
29
+ def should_not_receive(*args)
30
+ if args[0] == :render
31
+ register_verify_after_each
32
+ render_proxy.should_not_receive(:render)
33
+ else
34
+ super
35
+ end
36
+ end
37
+
38
+ def stub(*args)
39
+ if args[0] == :render
40
+ register_verify_after_each
41
+ render_proxy.stub(args.first, :expected_from => caller(1)[0])
42
+ else
43
+ super
44
+ end
45
+ end
46
+
47
+ # FIXME - for some reason, neither alias nor alias_method are working
48
+ # as expected in the else branch, so this is a duplicate of stub()
49
+ # above. Could delegate, but then we'd run into craziness handling
50
+ # :expected_from. This will have to do for the moment.
51
+ def stub!(*args)
52
+ if args[0] == :render
53
+ register_verify_after_each
54
+ render_proxy.stub!(args.first, :expected_from => caller(1)[0])
55
+ else
56
+ super
57
+ end
58
+ end
59
+
60
+ def verify_rendered_proc #:nodoc:
61
+ template = self
62
+ @verify_rendered_proc ||= Proc.new do
63
+ template.verify_rendered
64
+ template.unregister_verify_after_each
65
+ end
66
+ end
67
+
68
+ def register_verify_after_each #:nodoc:
69
+ proc = verify_rendered_proc
70
+ Spec::Example::ExampleGroup.after(:each, &proc)
71
+ end
72
+
73
+ def render_proxy #:nodoc:
74
+ @render_proxy ||= Spec::Mocks::Mock.new("render_proxy")
75
+ end
76
+
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,13 @@
1
+ module Spec
2
+ module Rails
3
+ module Example
4
+
5
+ class RoutingExampleGroup < ActionController::TestCase
6
+ tests Class.new(ActionController::Base)
7
+
8
+ Spec::Example::ExampleGroupFactory.register(:routing, self)
9
+ end
10
+
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,66 @@
1
+ require 'rack/utils'
2
+
3
+ module Spec
4
+ module Rails
5
+ module Example
6
+ module RoutingHelpers
7
+
8
+ class RouteFor
9
+ def initialize(example, options)
10
+ @example, @options = example, options
11
+ end
12
+
13
+ def ==(expected)
14
+ if Hash === expected
15
+ path, querystring = expected[:path].split('?')
16
+ path_string = path
17
+ path = expected.merge(:path => path)
18
+ else
19
+ path, querystring = expected.split('?')
20
+ path_string = path
21
+ path = { :path => path, :method => :get }
22
+ end
23
+ params = querystring.blank? ? {} : Rack::Utils.parse_query(querystring).symbolize_keys!
24
+ begin
25
+ @example.assert_routing(path, @options, {}, params)
26
+ true
27
+ rescue ActionController::RoutingError, ::Test::Unit::AssertionFailedError => e
28
+ raise e.class, "#{e}\nIf you're expecting this failure, we suggest {:#{path[:method]}=>\"#{path[:path]}\"}.should_not be_routable"
29
+ end
30
+ end
31
+ end
32
+ # Uses ActionController::Routing::Routes to generate
33
+ # the correct route for a given set of options.
34
+ # == Examples
35
+ # route_for(:controller => 'registrations', :action => 'edit', :id => '1')
36
+ # => '/registrations/1/edit'
37
+ # route_for(:controller => 'registrations', :action => 'create')
38
+ # => {:path => "/registrations", :method => :post}
39
+ def route_for(options)
40
+ RouteFor.new(self, options)
41
+ end
42
+
43
+ # Uses ActionController::Routing::Routes to parse
44
+ # an incoming path so the parameters it generates can be checked
45
+ #
46
+ # Note that this method is obsoleted by the route_to matcher.
47
+ # == Example
48
+ # params_from(:get, '/registrations/1/edit')
49
+ # => :controller => 'registrations', :action => 'edit', :id => '1'
50
+ def params_from(method, path)
51
+ ensure_that_routes_are_loaded
52
+ path, querystring = path.split('?')
53
+ params = ActionController::Routing::Routes.recognize_path(path, :method => method)
54
+ querystring.blank? ? params : params.merge(Rack::Utils.parse_query(querystring).symbolize_keys!)
55
+ end
56
+
57
+ private
58
+
59
+ def ensure_that_routes_are_loaded
60
+ ActionController::Routing::Routes.reload if ActionController::Routing::Routes.empty?
61
+ end
62
+
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,199 @@
1
+ module Spec
2
+ module Rails
3
+ module Example
4
+ class ViewExampleGroupController < ApplicationController #:nodoc:
5
+ include Spec::Rails::Example::RenderObserver
6
+ attr_reader :template
7
+
8
+ def add_helper_for(template_path)
9
+ add_helper(template_path.split('/')[0])
10
+ end
11
+
12
+ def add_helper(name)
13
+ begin
14
+ helper_module = "#{name}_helper".camelize.constantize
15
+ rescue
16
+ return
17
+ end
18
+ (class << template; self; end).class_eval do
19
+ include helper_module
20
+ end
21
+ end
22
+
23
+ def forget_variables_added_to_assigns
24
+ end
25
+ end
26
+
27
+ # View Examples live in $RAILS_ROOT/spec/views/.
28
+ #
29
+ # View Specs use Spec::Rails::Example::ViewExampleGroup,
30
+ # which provides access to views without invoking any of your controllers.
31
+ # See Spec::Rails::Expectations::Matchers for information about specific
32
+ # expectations that you can set on views.
33
+ #
34
+ # == Example
35
+ #
36
+ # describe "login/login" do
37
+ # before do
38
+ # render 'login/login'
39
+ # end
40
+ #
41
+ # it "should display login form" do
42
+ # response.should have_tag("form[action=/login]") do
43
+ # with_tag("input[type=text][name=email]")
44
+ # with_tag("input[type=password][name=password]")
45
+ # with_tag("input[type=submit][value=Login]")
46
+ # end
47
+ # end
48
+ # end
49
+ class ViewExampleGroup < FunctionalExampleGroup
50
+ if ActionView::Base.respond_to?(:load_helpers) # Rails 2.0.x
51
+ ActionView::Helpers.constants.each do |name|
52
+ const = ActionView::Helpers.const_get(name)
53
+ include const if name.include?("Helper") && Module === const
54
+ end
55
+ elsif ActionView::Base.respond_to?(:helper_modules) # Rails 2.1.x
56
+ ActionView::Base.helper_modules.each do |helper_module|
57
+ include helper_module
58
+ end
59
+ else # Rails 2.2.x
60
+ include ActionView::Helpers
61
+ end
62
+
63
+ tests ViewExampleGroupController
64
+ class << self
65
+ def inherited(klass) # :nodoc:
66
+ klass.subject { template }
67
+ super
68
+ end
69
+ end
70
+
71
+ before {ensure_that_flash_and_session_work_properly}
72
+ after {ensure_that_base_view_path_is_not_set_across_example_groups}
73
+
74
+ def ensure_that_flash_and_session_work_properly #:nodoc:
75
+ @controller.class.__send__ :public, :flash
76
+ @controller.__send__ :initialize_template_class, @response
77
+ @controller.__send__ :assign_shortcuts, @request, @response
78
+ @controller.__send__ :initialize_current_url
79
+ @session = @controller.session
80
+ end
81
+
82
+ def ensure_that_base_view_path_is_not_set_across_example_groups #:nodoc:
83
+ ActionView::Base.base_view_path = nil
84
+ end
85
+
86
+ def set_base_view_path(options) #:nodoc:
87
+ ActionView::Base.base_view_path = base_view_path(options)
88
+ end
89
+
90
+ def base_view_path(options) #:nodoc:
91
+ "/#{derived_controller_name(options)}/"
92
+ end
93
+
94
+ def derived_controller_name(options) #:nodoc:
95
+ parts = subject_of_render(options).split('/').reject { |part| part.empty? }
96
+ "#{parts[0..-2].join('/')}"
97
+ end
98
+
99
+ def derived_action_name(options) #:nodoc:
100
+ parts = subject_of_render(options).split('/').reject { |part| part.empty? }
101
+ "#{parts.last}".split('.').first
102
+ end
103
+
104
+ def subject_of_render(options) #:nodoc:
105
+ [:template, :partial, :file].each do |render_type|
106
+ if options.has_key?(render_type)
107
+ return options[render_type]
108
+ end
109
+ end
110
+ return ""
111
+ end
112
+
113
+ def add_helpers(options) #:nodoc:
114
+ @controller.add_helper("application")
115
+ @controller.add_helper(derived_controller_name(options))
116
+ @controller.add_helper(options[:helper]) if options[:helper]
117
+ options[:helpers].each { |helper| @controller.add_helper(helper) } if options[:helpers]
118
+ end
119
+
120
+ # Renders a template for a View Spec, which then provides access to the result
121
+ # through the +response+. Also supports render with :inline, which you can
122
+ # use to spec custom form builders, helpers, etc, in the context of a view.
123
+ #
124
+ # == Examples
125
+ #
126
+ # render('/people/list')
127
+ # render('/people/list', :helper => MyHelper)
128
+ # render('/people/list', :helpers => [MyHelper, MyOtherHelper])
129
+ # render(:partial => '/people/_address')
130
+ # render(:inline => "<% custom_helper 'argument', 'another argument' %>")
131
+ #
132
+ # See Spec::Rails::Example::ViewExampleGroup for more information.
133
+ def render(*args)
134
+ options = Hash === args.last ? args.pop : {}
135
+
136
+ if args.empty?
137
+ unless [:partial, :inline, :file, :template, :xml, :json, :update].any? {|k| options.has_key? k}
138
+ args << self.class.description_parts.first
139
+ end
140
+ end
141
+
142
+ options[:template] = args.first.to_s.sub(/^\//,'') unless args.empty?
143
+
144
+ set_base_view_path(options)
145
+ add_helpers(options)
146
+
147
+ assigns[:action_name] = @action_name
148
+
149
+ @request.path_parameters = @request.path_parameters.merge(
150
+ :controller => derived_controller_name(options),
151
+ :action => derived_action_name(options)
152
+ ).merge(options[:path_parameters] || {})
153
+
154
+ defaults = { :layout => false }
155
+ options = defaults.merge options
156
+
157
+ @controller.__send__(:params).reverse_merge! @request.parameters
158
+
159
+ @controller.class.instance_eval %{
160
+ def controller_path
161
+ "#{derived_controller_name(options)}"
162
+ end
163
+
164
+ def controller_name
165
+ "#{derived_controller_name(options).split('/').last}"
166
+ end
167
+ }
168
+
169
+ @controller.__send__ :forget_variables_added_to_assigns
170
+ @controller.__send__ :render, options
171
+ @controller.__send__ :process_cleanup
172
+ end
173
+
174
+ # This provides the template. Use this to set mock
175
+ # expectations for dealing with partials
176
+ #
177
+ # == Example
178
+ #
179
+ # describe "/person/new" do
180
+ # it "should use the form partial" do
181
+ # template.should_receive(:render).with(:partial => 'form')
182
+ # render "/person/new"
183
+ # end
184
+ # end
185
+ def template
186
+ @controller.template
187
+ end
188
+
189
+ Spec::Example::ExampleGroupFactory.register(:view, self)
190
+
191
+ protected
192
+ def _assigns_hash_proxy
193
+ @_assigns_hash_proxy ||= AssignsHashProxy.new(self) {@response.template}
194
+ end
195
+ end
196
+
197
+ end
198
+ end
199
+ end