cavalle-rspec-rails 1.2.2.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 (168) hide show
  1. data/.document +7 -0
  2. data/History.rdoc +207 -0
  3. data/License.txt +33 -0
  4. data/Manifest.txt +167 -0
  5. data/README.rdoc +45 -0
  6. data/Rakefile +79 -0
  7. data/TODO.txt +1 -0
  8. data/Upgrade.rdoc +103 -0
  9. data/features/step_definitions/people.rb +6 -0
  10. data/features/support/env.rb +13 -0
  11. data/features/transactions/transactions_should_rollback.feature +16 -0
  12. data/generators/rspec/CHANGES +1 -0
  13. data/generators/rspec/rspec_generator.rb +54 -0
  14. data/generators/rspec/templates/previous_failures.txt +0 -0
  15. data/generators/rspec/templates/rcov.opts +2 -0
  16. data/generators/rspec/templates/rspec.rake +165 -0
  17. data/generators/rspec/templates/script/autospec +6 -0
  18. data/generators/rspec/templates/script/spec +10 -0
  19. data/generators/rspec/templates/script/spec_server +9 -0
  20. data/generators/rspec/templates/spec.opts +4 -0
  21. data/generators/rspec/templates/spec_helper.rb +47 -0
  22. data/generators/rspec_controller/USAGE +33 -0
  23. data/generators/rspec_controller/rspec_controller_generator.rb +45 -0
  24. data/generators/rspec_controller/templates/controller_spec.rb +25 -0
  25. data/generators/rspec_controller/templates/helper_spec.rb +11 -0
  26. data/generators/rspec_controller/templates/view_spec.rb +12 -0
  27. data/generators/rspec_default_values.rb +19 -0
  28. data/generators/rspec_model/USAGE +18 -0
  29. data/generators/rspec_model/rspec_model_generator.rb +35 -0
  30. data/generators/rspec_model/templates/model_spec.rb +15 -0
  31. data/generators/rspec_scaffold/rspec_scaffold_generator.rb +150 -0
  32. data/generators/rspec_scaffold/templates/controller_spec.rb +171 -0
  33. data/generators/rspec_scaffold/templates/edit_erb_spec.rb +27 -0
  34. data/generators/rspec_scaffold/templates/helper_spec.rb +11 -0
  35. data/generators/rspec_scaffold/templates/index_erb_spec.rb +28 -0
  36. data/generators/rspec_scaffold/templates/new_erb_spec.rb +27 -0
  37. data/generators/rspec_scaffold/templates/routing_spec.rb +63 -0
  38. data/generators/rspec_scaffold/templates/show_erb_spec.rb +23 -0
  39. data/init.rb +9 -0
  40. data/lib/autotest/discover.rb +1 -0
  41. data/lib/autotest/rails_rspec.rb +76 -0
  42. data/lib/spec/rails/example/assigns_hash_proxy.rb +39 -0
  43. data/lib/spec/rails/example/controller_example_group.rb +247 -0
  44. data/lib/spec/rails/example/cookies_proxy.rb +29 -0
  45. data/lib/spec/rails/example/functional_example_group.rb +84 -0
  46. data/lib/spec/rails/example/helper_example_group.rb +153 -0
  47. data/lib/spec/rails/example/model_example_group.rb +14 -0
  48. data/lib/spec/rails/example/render_observer.rb +67 -0
  49. data/lib/spec/rails/example/routing_example_group.rb +13 -0
  50. data/lib/spec/rails/example/routing_helpers.rb +70 -0
  51. data/lib/spec/rails/example/view_example_group.rb +186 -0
  52. data/lib/spec/rails/example.rb +47 -0
  53. data/lib/spec/rails/extensions/action_controller/rescue.rb +42 -0
  54. data/lib/spec/rails/extensions/action_controller/test_case.rb +16 -0
  55. data/lib/spec/rails/extensions/action_controller/test_response.rb +21 -0
  56. data/lib/spec/rails/extensions/action_view/base.rb +33 -0
  57. data/lib/spec/rails/extensions/active_record/base.rb +45 -0
  58. data/lib/spec/rails/extensions/active_support/test_case.rb +7 -0
  59. data/lib/spec/rails/extensions/spec/matchers/have.rb +23 -0
  60. data/lib/spec/rails/extensions/spec/runner/configuration.rb +44 -0
  61. data/lib/spec/rails/extensions.rb +11 -0
  62. data/lib/spec/rails/interop/testcase.rb +14 -0
  63. data/lib/spec/rails/matchers/ar_be_valid.rb +44 -0
  64. data/lib/spec/rails/matchers/assert_select.rb +146 -0
  65. data/lib/spec/rails/matchers/change.rb +11 -0
  66. data/lib/spec/rails/matchers/have_text.rb +57 -0
  67. data/lib/spec/rails/matchers/include_text.rb +54 -0
  68. data/lib/spec/rails/matchers/redirect_to.rb +126 -0
  69. data/lib/spec/rails/matchers/render_template.rb +114 -0
  70. data/lib/spec/rails/matchers.rb +32 -0
  71. data/lib/spec/rails/mocks.rb +135 -0
  72. data/lib/spec/rails/spec_server.rb +127 -0
  73. data/lib/spec/rails/story_adapter.rb +79 -0
  74. data/lib/spec/rails/version.rb +15 -0
  75. data/lib/spec/rails.rb +28 -0
  76. data/rspec-rails.gemspec +57 -0
  77. data/spec/autotest/mappings_spec.rb +86 -0
  78. data/spec/rails_suite.rb +7 -0
  79. data/spec/resources/controllers/action_view_base_spec_controller.rb +2 -0
  80. data/spec/resources/controllers/application.rb +9 -0
  81. data/spec/resources/controllers/controller_spec_controller.rb +120 -0
  82. data/spec/resources/controllers/example.txt +1 -0
  83. data/spec/resources/controllers/redirect_spec_controller.rb +70 -0
  84. data/spec/resources/controllers/render_spec_controller.rb +30 -0
  85. data/spec/resources/controllers/rjs_spec_controller.rb +58 -0
  86. data/spec/resources/helpers/addition_helper.rb +5 -0
  87. data/spec/resources/helpers/explicit_helper.rb +46 -0
  88. data/spec/resources/helpers/more_explicit_helper.rb +5 -0
  89. data/spec/resources/helpers/plugin_application_helper.rb +6 -0
  90. data/spec/resources/helpers/view_spec_helper.rb +13 -0
  91. data/spec/resources/models/animal.rb +4 -0
  92. data/spec/resources/models/person.rb +18 -0
  93. data/spec/resources/models/thing.rb +3 -0
  94. data/spec/resources/views/controller_spec/_partial.html.erb +0 -0
  95. data/spec/resources/views/controller_spec/action_setting_flash_after_session_reset.html.erb +1 -0
  96. data/spec/resources/views/controller_spec/action_setting_flash_before_session_reset.html.erb +1 -0
  97. data/spec/resources/views/controller_spec/action_setting_the_assigns_hash.html.erb +0 -0
  98. data/spec/resources/views/controller_spec/action_with_errors_in_template.html.erb +1 -0
  99. data/spec/resources/views/controller_spec/action_with_template.html.erb +1 -0
  100. data/spec/resources/views/layouts/application.html.erb +0 -0
  101. data/spec/resources/views/layouts/simple.html.erb +0 -0
  102. data/spec/resources/views/objects/_object.html.erb +1 -0
  103. data/spec/resources/views/render_spec/_a_partial.html.erb +0 -0
  104. data/spec/resources/views/render_spec/action_with_alternate_layout.html.erb +0 -0
  105. data/spec/resources/views/render_spec/some_action.html.erb +0 -0
  106. data/spec/resources/views/render_spec/some_action.js.rjs +1 -0
  107. data/spec/resources/views/rjs_spec/_replacement_partial.html.erb +1 -0
  108. data/spec/resources/views/rjs_spec/hide_div.js.rjs +1 -0
  109. data/spec/resources/views/rjs_spec/hide_page_element.js.rjs +1 -0
  110. data/spec/resources/views/rjs_spec/insert_html.js.rjs +1 -0
  111. data/spec/resources/views/rjs_spec/replace.js.rjs +1 -0
  112. data/spec/resources/views/rjs_spec/replace_html.js.rjs +1 -0
  113. data/spec/resources/views/rjs_spec/replace_html_with_partial.js.rjs +1 -0
  114. data/spec/resources/views/rjs_spec/visual_effect.js.rjs +1 -0
  115. data/spec/resources/views/rjs_spec/visual_toggle_effect.js.rjs +1 -0
  116. data/spec/resources/views/tag_spec/no_tags.html.erb +1 -0
  117. data/spec/resources/views/tag_spec/single_div_with_no_attributes.html.erb +1 -0
  118. data/spec/resources/views/tag_spec/single_div_with_one_attribute.html.erb +1 -0
  119. data/spec/resources/views/view_spec/_partial.html.erb +2 -0
  120. data/spec/resources/views/view_spec/_partial_used_twice.html.erb +0 -0
  121. data/spec/resources/views/view_spec/_partial_with_local_variable.html.erb +1 -0
  122. data/spec/resources/views/view_spec/_partial_with_sub_partial.html.erb +1 -0
  123. data/spec/resources/views/view_spec/_spacer.html.erb +1 -0
  124. data/spec/resources/views/view_spec/accessor.html.erb +5 -0
  125. data/spec/resources/views/view_spec/block_helper.html.erb +3 -0
  126. data/spec/resources/views/view_spec/entry_form.html.erb +2 -0
  127. data/spec/resources/views/view_spec/explicit_helper.html.erb +2 -0
  128. data/spec/resources/views/view_spec/foo/show.html.erb +1 -0
  129. data/spec/resources/views/view_spec/implicit_helper.html.erb +2 -0
  130. data/spec/resources/views/view_spec/multiple_helpers.html.erb +3 -0
  131. data/spec/resources/views/view_spec/path_params.html.erb +1 -0
  132. data/spec/resources/views/view_spec/should_not_receive.html.erb +3 -0
  133. data/spec/resources/views/view_spec/template_with_partial.html.erb +5 -0
  134. data/spec/resources/views/view_spec/template_with_partial_using_collection.html.erb +3 -0
  135. data/spec/resources/views/view_spec/template_with_partial_with_array.html.erb +1 -0
  136. data/spec/spec/rails/example/assigns_hash_proxy_spec.rb +109 -0
  137. data/spec/spec/rails/example/configuration_spec.rb +65 -0
  138. data/spec/spec/rails/example/controller_example_group_spec.rb +299 -0
  139. data/spec/spec/rails/example/controller_isolation_spec.rb +56 -0
  140. data/spec/spec/rails/example/cookies_proxy_spec.rb +87 -0
  141. data/spec/spec/rails/example/error_handling_spec.rb +90 -0
  142. data/spec/spec/rails/example/example_group_factory_spec.rb +112 -0
  143. data/spec/spec/rails/example/helper_example_group_spec.rb +233 -0
  144. data/spec/spec/rails/example/model_example_group_spec.rb +20 -0
  145. data/spec/spec/rails/example/routing_example_group_spec.rb +9 -0
  146. data/spec/spec/rails/example/shared_routing_example_group_examples.rb +44 -0
  147. data/spec/spec/rails/example/test_unit_assertion_accessibility_spec.rb +33 -0
  148. data/spec/spec/rails/example/view_example_group_spec.rb +335 -0
  149. data/spec/spec/rails/extensions/action_view_base_spec.rb +48 -0
  150. data/spec/spec/rails/extensions/active_record_spec.rb +14 -0
  151. data/spec/spec/rails/interop/testcase_spec.rb +70 -0
  152. data/spec/spec/rails/matchers/ar_be_valid_spec.rb +45 -0
  153. data/spec/spec/rails/matchers/assert_select_spec.rb +809 -0
  154. data/spec/spec/rails/matchers/errors_on_spec.rb +25 -0
  155. data/spec/spec/rails/matchers/have_text_spec.rb +70 -0
  156. data/spec/spec/rails/matchers/include_text_spec.rb +62 -0
  157. data/spec/spec/rails/matchers/redirect_to_spec.rb +253 -0
  158. data/spec/spec/rails/matchers/render_template_spec.rb +191 -0
  159. data/spec/spec/rails/matchers/should_change_spec.rb +15 -0
  160. data/spec/spec/rails/mocks/ar_classes.rb +10 -0
  161. data/spec/spec/rails/mocks/mock_model_spec.rb +106 -0
  162. data/spec/spec/rails/mocks/stub_model_spec.rb +80 -0
  163. data/spec/spec/rails/sample_modified_fixture.rb +8 -0
  164. data/spec/spec/rails/sample_spec.rb +8 -0
  165. data/spec/spec/rails/spec_server_spec.rb +107 -0
  166. data/spec/spec/rails/spec_spec.rb +11 -0
  167. data/spec/spec_helper.rb +79 -0
  168. metadata +277 -0
@@ -0,0 +1,150 @@
1
+ require File.dirname(__FILE__) + '/../rspec_default_values'
2
+
3
+ class RspecScaffoldGenerator < Rails::Generator::NamedBase
4
+ default_options :skip_migration => false
5
+
6
+ attr_reader :controller_name,
7
+ :controller_class_path,
8
+ :controller_file_path,
9
+ :controller_class_nesting,
10
+ :controller_class_nesting_depth,
11
+ :controller_class_name,
12
+ :controller_singular_name,
13
+ :controller_plural_name,
14
+ :resource_edit_path,
15
+ :default_file_extension
16
+ alias_method :controller_file_name, :controller_singular_name
17
+ alias_method :controller_table_name, :controller_plural_name
18
+
19
+ def initialize(runtime_args, runtime_options = {})
20
+ super
21
+
22
+ @controller_name = @name.pluralize
23
+
24
+ base_name, @controller_class_path, @controller_file_path, @controller_class_nesting, @controller_class_nesting_depth = extract_modules(@controller_name)
25
+ @controller_class_name_without_nesting, @controller_singular_name, @controller_plural_name = inflect_names(base_name)
26
+
27
+ if @controller_class_nesting.empty?
28
+ @controller_class_name = @controller_class_name_without_nesting
29
+ else
30
+ @controller_class_name = "#{@controller_class_nesting}::#{@controller_class_name_without_nesting}"
31
+ end
32
+
33
+ @default_file_extension = "html.erb"
34
+ end
35
+
36
+ def manifest
37
+ record do |m|
38
+
39
+ # Check for class naming collisions.
40
+ m.class_collisions(controller_class_path, "#{controller_class_name}Controller", "#{controller_class_name}Helper")
41
+ m.class_collisions(class_path, "#{class_name}")
42
+
43
+ # Controller, helper, views, and spec directories.
44
+ m.directory(File.join('app/models', class_path))
45
+ m.directory(File.join('app/controllers', controller_class_path))
46
+ m.directory(File.join('app/helpers', controller_class_path))
47
+ m.directory(File.join('app/views', controller_class_path, controller_file_name))
48
+ m.directory(File.join('app/views/layouts', controller_class_path))
49
+ m.directory(File.join('public/stylesheets', class_path))
50
+
51
+ m.directory(File.join('spec/controllers', controller_class_path))
52
+ m.directory(File.join('spec/routing', controller_class_path))
53
+ m.directory(File.join('spec/models', class_path))
54
+ m.directory(File.join('spec/helpers', class_path))
55
+ m.directory File.join('spec/fixtures', class_path)
56
+ m.directory File.join('spec/views', controller_class_path, controller_file_name)
57
+
58
+ # Layout and stylesheet.
59
+ m.template("scaffold:layout.html.erb", File.join('app/views/layouts', controller_class_path, "#{controller_file_name}.html.erb"))
60
+ m.template("scaffold:style.css", 'public/stylesheets/scaffold.css')
61
+
62
+ # Controller spec, class, and helper.
63
+ m.template 'rspec_scaffold:routing_spec.rb',
64
+ File.join('spec/routing', controller_class_path, "#{controller_file_name}_routing_spec.rb")
65
+
66
+ m.template 'rspec_scaffold:controller_spec.rb',
67
+ File.join('spec/controllers', controller_class_path, "#{controller_file_name}_controller_spec.rb")
68
+
69
+ m.template "scaffold:controller.rb",
70
+ File.join('app/controllers', controller_class_path, "#{controller_file_name}_controller.rb")
71
+
72
+ m.template 'rspec_scaffold:helper_spec.rb',
73
+ File.join('spec/helpers', class_path, "#{controller_file_name}_helper_spec.rb")
74
+
75
+ m.template "scaffold:helper.rb",
76
+ File.join('app/helpers', controller_class_path, "#{controller_file_name}_helper.rb")
77
+
78
+ for action in scaffold_views
79
+ m.template(
80
+ "scaffold:view_#{action}.#{@default_file_extension}",
81
+ File.join('app/views', controller_class_path, controller_file_name, "#{action}.#{default_file_extension}")
82
+ )
83
+ end
84
+
85
+ # Model class, unit test, and fixtures.
86
+ m.template 'model:model.rb', File.join('app/models', class_path, "#{file_name}.rb")
87
+ m.template 'model:fixtures.yml', File.join('spec/fixtures', class_path, "#{table_name}.yml")
88
+ m.template 'rspec_model:model_spec.rb', File.join('spec/models', class_path, "#{file_name}_spec.rb")
89
+
90
+ # View specs
91
+ m.template "rspec_scaffold:edit_erb_spec.rb",
92
+ File.join('spec/views', controller_class_path, controller_file_name, "edit.#{default_file_extension}_spec.rb")
93
+ m.template "rspec_scaffold:index_erb_spec.rb",
94
+ File.join('spec/views', controller_class_path, controller_file_name, "index.#{default_file_extension}_spec.rb")
95
+ m.template "rspec_scaffold:new_erb_spec.rb",
96
+ File.join('spec/views', controller_class_path, controller_file_name, "new.#{default_file_extension}_spec.rb")
97
+ m.template "rspec_scaffold:show_erb_spec.rb",
98
+ File.join('spec/views', controller_class_path, controller_file_name, "show.#{default_file_extension}_spec.rb")
99
+
100
+ unless options[:skip_migration]
101
+ m.migration_template(
102
+ 'model:migration.rb', 'db/migrate',
103
+ :assigns => {
104
+ :migration_name => "Create#{class_name.pluralize.gsub(/::/, '')}",
105
+ :attributes => attributes
106
+ },
107
+ :migration_file_name => "create_#{file_path.gsub(/\//, '_').pluralize}"
108
+ )
109
+ end
110
+
111
+ m.route_resources controller_file_name
112
+
113
+ end
114
+ end
115
+
116
+ protected
117
+ # Override with your own usage banner.
118
+ def banner
119
+ "Usage: #{$0} rspec_scaffold ModelName [field:type field:type]"
120
+ end
121
+
122
+ def add_options!(opt)
123
+ opt.separator ''
124
+ opt.separator 'Options:'
125
+ opt.on("--skip-migration",
126
+ "Don't generate a migration file for this model") { |v| options[:skip_migration] = v }
127
+ end
128
+
129
+ def scaffold_views
130
+ %w[ index show new edit ]
131
+ end
132
+
133
+ def model_name
134
+ class_name.demodulize
135
+ end
136
+ end
137
+
138
+ module Rails
139
+ module Generator
140
+ class GeneratedAttribute
141
+ def input_type
142
+ @input_type ||= case type
143
+ when :text then "textarea"
144
+ else
145
+ "input"
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,171 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../spec_helper')
2
+
3
+ describe <%= controller_class_name %>Controller do
4
+
5
+ def mock_<%= file_name %>(stubs={})
6
+ @mock_<%= file_name %> ||= mock_model(<%= class_name %>, stubs)
7
+ end
8
+
9
+ describe "GET index" do
10
+
11
+ it "exposes all <%= table_name.pluralize %> as @<%= table_name.pluralize %>" do
12
+ <%= class_name %>.should_receive(:find).with(:all).and_return([mock_<%= file_name %>])
13
+ get :index
14
+ assigns[:<%= table_name %>].should == [mock_<%= file_name %>]
15
+ end
16
+
17
+ describe "with mime type of xml" do
18
+
19
+ it "renders all <%= table_name.pluralize %> as xml" do
20
+ <%= class_name %>.should_receive(:find).with(:all).and_return(<%= file_name.pluralize %> = mock("Array of <%= class_name.pluralize %>"))
21
+ <%= file_name.pluralize %>.should_receive(:to_xml).and_return("generated XML")
22
+ get :index, :format => 'xml'
23
+ response.body.should == "generated XML"
24
+ end
25
+
26
+ end
27
+
28
+ end
29
+
30
+ describe "GET show" do
31
+
32
+ it "exposes the requested <%= file_name %> as @<%= file_name %>" do
33
+ <%= class_name %>.should_receive(:find).with("37").and_return(mock_<%= file_name %>)
34
+ get :show, :id => "37"
35
+ assigns[:<%= file_name %>].should equal(mock_<%= file_name %>)
36
+ end
37
+
38
+ describe "with mime type of xml" do
39
+
40
+ it "renders the requested <%= file_name %> as xml" do
41
+ <%= class_name %>.should_receive(:find).with("37").and_return(mock_<%= file_name %>)
42
+ mock_<%= file_name %>.should_receive(:to_xml).and_return("generated XML")
43
+ get :show, :id => "37", :format => 'xml'
44
+ response.body.should == "generated XML"
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+
51
+ describe "GET new" do
52
+
53
+ it "exposes a new <%= file_name %> as @<%= file_name %>" do
54
+ <%= class_name %>.should_receive(:new).and_return(mock_<%= file_name %>)
55
+ get :new
56
+ assigns[:<%= file_name %>].should equal(mock_<%= file_name %>)
57
+ end
58
+
59
+ end
60
+
61
+ describe "GET edit" do
62
+
63
+ it "exposes the requested <%= file_name %> as @<%= file_name %>" do
64
+ <%= class_name %>.should_receive(:find).with("37").and_return(mock_<%= file_name %>)
65
+ get :edit, :id => "37"
66
+ assigns[:<%= file_name %>].should equal(mock_<%= file_name %>)
67
+ end
68
+
69
+ end
70
+
71
+ describe "POST create" do
72
+
73
+ describe "with valid params" do
74
+
75
+ it "exposes a newly created <%= file_name %> as @<%= file_name %>" do
76
+ <%= class_name %>.should_receive(:new).with({'these' => 'params'}).and_return(mock_<%= file_name %>(:save => true))
77
+ post :create, :<%= file_name %> => {:these => 'params'}
78
+ assigns(:<%= file_name %>).should equal(mock_<%= file_name %>)
79
+ end
80
+
81
+ it "redirects to the created <%= file_name %>" do
82
+ <%= class_name %>.stub!(:new).and_return(mock_<%= file_name %>(:save => true))
83
+ post :create, :<%= file_name %> => {}
84
+ response.should redirect_to(<%= table_name.singularize %>_url(mock_<%= file_name %>))
85
+ end
86
+
87
+ end
88
+
89
+ describe "with invalid params" do
90
+
91
+ it "exposes a newly created but unsaved <%= file_name %> as @<%= file_name %>" do
92
+ <%= class_name %>.stub!(:new).with({'these' => 'params'}).and_return(mock_<%= file_name %>(:save => false))
93
+ post :create, :<%= file_name %> => {:these => 'params'}
94
+ assigns(:<%= file_name %>).should equal(mock_<%= file_name %>)
95
+ end
96
+
97
+ it "re-renders the 'new' template" do
98
+ <%= class_name %>.stub!(:new).and_return(mock_<%= file_name %>(:save => false))
99
+ post :create, :<%= file_name %> => {}
100
+ response.should render_template('new')
101
+ end
102
+
103
+ end
104
+
105
+ end
106
+
107
+ describe "PUT udpate" do
108
+
109
+ describe "with valid params" do
110
+
111
+ it "updates the requested <%= file_name %>" do
112
+ <%= class_name %>.should_receive(:find).with("37").and_return(mock_<%= file_name %>)
113
+ mock_<%= file_name %>.should_receive(:update_attributes).with({'these' => 'params'})
114
+ put :update, :id => "37", :<%= file_name %> => {:these => 'params'}
115
+ end
116
+
117
+ it "exposes the requested <%= file_name %> as @<%= file_name %>" do
118
+ <%= class_name %>.stub!(:find).and_return(mock_<%= file_name %>(:update_attributes => true))
119
+ put :update, :id => "1"
120
+ assigns(:<%= file_name %>).should equal(mock_<%= file_name %>)
121
+ end
122
+
123
+ it "redirects to the <%= file_name %>" do
124
+ <%= class_name %>.stub!(:find).and_return(mock_<%= file_name %>(:update_attributes => true))
125
+ put :update, :id => "1"
126
+ response.should redirect_to(<%= table_name.singularize %>_url(mock_<%= file_name %>))
127
+ end
128
+
129
+ end
130
+
131
+ describe "with invalid params" do
132
+
133
+ it "updates the requested <%= file_name %>" do
134
+ <%= class_name %>.should_receive(:find).with("37").and_return(mock_<%= file_name %>)
135
+ mock_<%= file_name %>.should_receive(:update_attributes).with({'these' => 'params'})
136
+ put :update, :id => "37", :<%= file_name %> => {:these => 'params'}
137
+ end
138
+
139
+ it "exposes the <%= file_name %> as @<%= file_name %>" do
140
+ <%= class_name %>.stub!(:find).and_return(mock_<%= file_name %>(:update_attributes => false))
141
+ put :update, :id => "1"
142
+ assigns(:<%= file_name %>).should equal(mock_<%= file_name %>)
143
+ end
144
+
145
+ it "re-renders the 'edit' template" do
146
+ <%= class_name %>.stub!(:find).and_return(mock_<%= file_name %>(:update_attributes => false))
147
+ put :update, :id => "1"
148
+ response.should render_template('edit')
149
+ end
150
+
151
+ end
152
+
153
+ end
154
+
155
+ describe "DELETE destroy" do
156
+
157
+ it "destroys the requested <%= file_name %>" do
158
+ <%= class_name %>.should_receive(:find).with("37").and_return(mock_<%= file_name %>)
159
+ mock_<%= file_name %>.should_receive(:destroy)
160
+ delete :destroy, :id => "37"
161
+ end
162
+
163
+ it "redirects to the <%= table_name %> list" do
164
+ <%= class_name %>.stub!(:find).and_return(mock_<%= file_name %>(:destroy => true))
165
+ delete :destroy, :id => "1"
166
+ response.should redirect_to(<%= table_name %>_url)
167
+ end
168
+
169
+ end
170
+
171
+ end
@@ -0,0 +1,27 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../../spec_helper')
2
+
3
+ <% output_attributes = attributes.reject{|attribute| [:datetime, :timestamp, :time, :date].index(attribute.type) } -%>
4
+ describe "/<%= table_name %>/edit.<%= default_file_extension %>" do
5
+ include <%= controller_class_name %>Helper
6
+
7
+ before(:each) do
8
+ assigns[:<%= file_name %>] = @<%= file_name %> = stub_model(<%= class_name %>,
9
+ :new_record? => false<%= output_attributes.empty? ? '' : ',' %>
10
+ <% output_attributes.each_with_index do |attribute, attribute_index| -%>
11
+ :<%= attribute.name %> => <%= attribute.default_value %><%= attribute_index == output_attributes.length - 1 ? '' : ','%>
12
+ <% end -%>
13
+ )
14
+ end
15
+
16
+ it "renders the edit <%= file_name %> form" do
17
+ render
18
+
19
+ response.should have_tag("form[action=#{<%= file_name %>_path(@<%= file_name %>)}][method=post]") do
20
+ <% for attribute in output_attributes -%>
21
+ with_tag('<%= attribute.input_type -%>#<%= file_name %>_<%= attribute.name %>[name=?]', "<%= file_name %>[<%= attribute.name %>]")
22
+ <% end -%>
23
+ end
24
+ end
25
+ end
26
+
27
+
@@ -0,0 +1,11 @@
1
+ require File.expand_path(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 "is included in the helper object" do
7
+ included_modules = (class << helper; self; end).send :included_modules
8
+ included_modules.should include(<%= controller_class_name %>Helper)
9
+ end
10
+
11
+ end
@@ -0,0 +1,28 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../../spec_helper')
2
+
3
+ <% output_attributes = attributes.reject{|attribute| [:datetime, :timestamp, :time, :date].index(attribute.type) } -%>
4
+ describe "/<%= table_name %>/index.<%= default_file_extension %>" do
5
+ include <%= controller_class_name %>Helper
6
+
7
+ before(:each) do
8
+ assigns[:<%= table_name %>] = [
9
+ <% [1,2].each_with_index do |id, model_index| -%>
10
+ stub_model(<%= class_name %><%= output_attributes.empty? ? (model_index == 1 ? ')' : '),') : ',' %>
11
+ <% output_attributes.each_with_index do |attribute, attribute_index| -%>
12
+ :<%= attribute.name %> => <%= attribute.default_value %><%= attribute_index == output_attributes.length - 1 ? '' : ','%>
13
+ <% end -%>
14
+ <% if !output_attributes.empty? -%>
15
+ <%= model_index == 1 ? ')' : '),' %>
16
+ <% end -%>
17
+ <% end -%>
18
+ ]
19
+ end
20
+
21
+ it "renders a list of <%= table_name %>" do
22
+ render
23
+ <% for attribute in output_attributes -%>
24
+ response.should have_tag("tr>td", <%= attribute.default_value %>.to_s, 2)
25
+ <% end -%>
26
+ end
27
+ end
28
+
@@ -0,0 +1,27 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../../spec_helper')
2
+
3
+ <% output_attributes = attributes.reject{|attribute| [:datetime, :timestamp, :time, :date].index(attribute.type) } -%>
4
+ describe "/<%= table_name %>/new.<%= default_file_extension %>" do
5
+ include <%= controller_class_name %>Helper
6
+
7
+ before(:each) do
8
+ assigns[:<%= file_name %>] = stub_model(<%= class_name %>,
9
+ :new_record? => true<%= output_attributes.empty? ? '' : ',' %>
10
+ <% output_attributes.each_with_index do |attribute, attribute_index| -%>
11
+ :<%= attribute.name %> => <%= attribute.default_value %><%= attribute_index == output_attributes.length - 1 ? '' : ','%>
12
+ <% end -%>
13
+ )
14
+ end
15
+
16
+ it "renders new <%= file_name %> form" do
17
+ render
18
+
19
+ response.should have_tag("form[action=?][method=post]", <%= table_name %>_path) do
20
+ <% for attribute in output_attributes -%>
21
+ with_tag("<%= attribute.input_type -%>#<%= file_name %>_<%= attribute.name %>[name=?]", "<%= file_name %>[<%= attribute.name %>]")
22
+ <% end -%>
23
+ end
24
+ end
25
+ end
26
+
27
+
@@ -0,0 +1,63 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../spec_helper')
2
+
3
+ describe <%= controller_class_name %>Controller do
4
+ describe "route generation" do
5
+ it "maps #index" do
6
+ route_for(:controller => "<%= table_name %>", :action => "index").should == "/<%= table_name %>"
7
+ end
8
+
9
+ it "maps #new" do
10
+ route_for(:controller => "<%= table_name %>", :action => "new").should == "/<%= table_name %>/new"
11
+ end
12
+
13
+ it "maps #show" do
14
+ route_for(:controller => "<%= table_name %>", :action => "show", :id => "1").should == "/<%= table_name %>/1"
15
+ end
16
+
17
+ it "maps #edit" do
18
+ route_for(:controller => "<%= table_name %>", :action => "edit", :id => "1").should == "/<%= table_name %>/1/edit"
19
+ end
20
+
21
+ it "maps #create" do
22
+ route_for(:controller => "<%= table_name %>", :action => "create").should == {:path => "/<%= table_name %>", :method => :post}
23
+ end
24
+
25
+ it "maps #update" do
26
+ route_for(:controller => "<%= table_name %>", :action => "update", :id => "1").should == {:path =>"/<%= table_name %>/1", :method => :put}
27
+ end
28
+
29
+ it "maps #destroy" do
30
+ route_for(:controller => "<%= table_name %>", :action => "destroy", :id => "1").should == {:path =>"/<%= table_name %>/1", :method => :delete}
31
+ end
32
+ end
33
+
34
+ describe "route recognition" do
35
+ it "generates params for #index" do
36
+ params_from(:get, "/<%= table_name %>").should == {:controller => "<%= table_name %>", :action => "index"}
37
+ end
38
+
39
+ it "generates params for #new" do
40
+ params_from(:get, "/<%= table_name %>/new").should == {:controller => "<%= table_name %>", :action => "new"}
41
+ end
42
+
43
+ it "generates params for #create" do
44
+ params_from(:post, "/<%= table_name %>").should == {:controller => "<%= table_name %>", :action => "create"}
45
+ end
46
+
47
+ it "generates params for #show" do
48
+ params_from(:get, "/<%= table_name %>/1").should == {:controller => "<%= table_name %>", :action => "show", :id => "1"}
49
+ end
50
+
51
+ it "generates params for #edit" do
52
+ params_from(:get, "/<%= table_name %>/1/edit").should == {:controller => "<%= table_name %>", :action => "edit", :id => "1"}
53
+ end
54
+
55
+ it "generates params for #update" do
56
+ params_from(:put, "/<%= table_name %>/1").should == {:controller => "<%= table_name %>", :action => "update", :id => "1"}
57
+ end
58
+
59
+ it "generates params for #destroy" do
60
+ params_from(:delete, "/<%= table_name %>/1").should == {:controller => "<%= table_name %>", :action => "destroy", :id => "1"}
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,23 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../../spec_helper')
2
+
3
+ <% output_attributes = attributes.reject{|attribute| [:datetime, :timestamp, :time, :date].index(attribute.type) } -%>
4
+ describe "/<%= table_name %>/show.<%= default_file_extension %>" do
5
+ include <%= controller_class_name %>Helper
6
+ before(:each) do
7
+ assigns[:<%= file_name %>] = @<%= file_name %> = stub_model(<%= class_name %><%= output_attributes.empty? ? ')' : ',' %>
8
+ <% output_attributes.each_with_index do |attribute, attribute_index| -%>
9
+ :<%= attribute.name %> => <%= attribute.default_value %><%= attribute_index == output_attributes.length - 1 ? '' : ','%>
10
+ <% end -%>
11
+ <% if !output_attributes.empty? -%>
12
+ )
13
+ <% end -%>
14
+ end
15
+
16
+ it "renders attributes in <p>" do
17
+ render
18
+ <% for attribute in output_attributes -%>
19
+ response.should have_text(/<%= Regexp.escape(attribute.default_value).gsub(/^"|"$/, '')%>/)
20
+ <% end -%>
21
+ end
22
+ end
23
+
data/init.rb ADDED
@@ -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,76 @@
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/ tmp/ 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|routing|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|routing|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|routing|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
+ end
@@ -0,0 +1,39 @@
1
+ module Spec
2
+ module Rails
3
+ module Example
4
+ class AssignsHashProxy #:nodoc:
5
+ def initialize(example_group, &block)
6
+ @target = block.call
7
+ @example_group = example_group
8
+ end
9
+
10
+ def [](key)
11
+ return false if false == assigns[key] || false == assigns[key.to_s]
12
+ assigns[key] || assigns[key.to_s] || @target.instance_variable_get("@#{key}")
13
+ end
14
+
15
+ def []=(key, val)
16
+ @target.instance_variable_set("@#{key}", val)
17
+ end
18
+
19
+ def delete(key)
20
+ assigns.delete(key.to_s)
21
+ @target.instance_variable_set("@#{key}", nil)
22
+ end
23
+
24
+ def each(&block)
25
+ assigns.each &block
26
+ end
27
+
28
+ def has_key?(key)
29
+ assigns.key?(key.to_s)
30
+ end
31
+
32
+ protected
33
+ def assigns
34
+ @example_group.orig_assigns
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end