mcmire-rspec-rails 1.1.99.9

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 (164) hide show
  1. data/History.txt +174 -0
  2. data/License.txt +33 -0
  3. data/Manifest.txt +164 -0
  4. data/README.txt +45 -0
  5. data/Rakefile +63 -0
  6. data/TODO.txt +1 -0
  7. data/Upgrade.markdown +52 -0
  8. data/features/step_definitions/people.rb +6 -0
  9. data/features/support/env.rb +13 -0
  10. data/features/transactions/transactions_should_rollback.feature +16 -0
  11. data/generators/rspec/CHANGES +1 -0
  12. data/generators/rspec/rspec_generator.rb +37 -0
  13. data/generators/rspec/templates/previous_failures.txt +0 -0
  14. data/generators/rspec/templates/rcov.opts +2 -0
  15. data/generators/rspec/templates/rspec.rake +177 -0
  16. data/generators/rspec/templates/script/autospec +5 -0
  17. data/generators/rspec/templates/script/spec +4 -0
  18. data/generators/rspec/templates/script/spec_server +37 -0
  19. data/generators/rspec/templates/spec.opts +4 -0
  20. data/generators/rspec/templates/spec_helper.rb +47 -0
  21. data/generators/rspec_controller/USAGE +33 -0
  22. data/generators/rspec_controller/rspec_controller_generator.rb +45 -0
  23. data/generators/rspec_controller/templates/controller_spec.rb +25 -0
  24. data/generators/rspec_controller/templates/helper_spec.rb +11 -0
  25. data/generators/rspec_controller/templates/view_spec.rb +12 -0
  26. data/generators/rspec_default_values.rb +19 -0
  27. data/generators/rspec_model/USAGE +18 -0
  28. data/generators/rspec_model/rspec_model_generator.rb +35 -0
  29. data/generators/rspec_model/templates/model_spec.rb +15 -0
  30. data/generators/rspec_scaffold/rspec_scaffold_generator.rb +150 -0
  31. data/generators/rspec_scaffold/templates/controller_spec.rb +171 -0
  32. data/generators/rspec_scaffold/templates/edit_erb_spec.rb +27 -0
  33. data/generators/rspec_scaffold/templates/helper_spec.rb +11 -0
  34. data/generators/rspec_scaffold/templates/index_erb_spec.rb +28 -0
  35. data/generators/rspec_scaffold/templates/new_erb_spec.rb +27 -0
  36. data/generators/rspec_scaffold/templates/routing_spec.rb +63 -0
  37. data/generators/rspec_scaffold/templates/show_erb_spec.rb +23 -0
  38. data/init.rb +9 -0
  39. data/lib/autotest/discover.rb +1 -0
  40. data/lib/autotest/rails_rspec.rb +76 -0
  41. data/lib/spec/rails.rb +37 -0
  42. data/lib/spec/rails/example.rb +53 -0
  43. data/lib/spec/rails/example/assigns_hash_proxy.rb +39 -0
  44. data/lib/spec/rails/example/controller_example_group.rb +242 -0
  45. data/lib/spec/rails/example/cookies_proxy.rb +29 -0
  46. data/lib/spec/rails/example/functional_example_group.rb +84 -0
  47. data/lib/spec/rails/example/helper_example_group.rb +167 -0
  48. data/lib/spec/rails/example/model_example_group.rb +14 -0
  49. data/lib/spec/rails/example/render_observer.rb +67 -0
  50. data/lib/spec/rails/example/routing_helpers.rb +68 -0
  51. data/lib/spec/rails/example/view_example_group.rb +186 -0
  52. data/lib/spec/rails/extensions.rb +15 -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 +43 -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 +48 -0
  61. data/lib/spec/rails/interop/testcase.rb +14 -0
  62. data/lib/spec/rails/matchers.rb +40 -0
  63. data/lib/spec/rails/matchers/ar_be_valid.rb +44 -0
  64. data/lib/spec/rails/matchers/assert_select.rb +131 -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/mocks.rb +135 -0
  71. data/lib/spec/rails/spec_server.rb +97 -0
  72. data/lib/spec/rails/story_adapter.rb +79 -0
  73. data/lib/spec/rails/version.rb +16 -0
  74. data/rspec-rails.gemspec +39 -0
  75. data/spec/autotest/mappings_spec.rb +36 -0
  76. data/spec/rails_suite.rb +7 -0
  77. data/spec/resources/controllers/action_view_base_spec_controller.rb +2 -0
  78. data/spec/resources/controllers/application.rb +9 -0
  79. data/spec/resources/controllers/controller_spec_controller.rb +116 -0
  80. data/spec/resources/controllers/redirect_spec_controller.rb +70 -0
  81. data/spec/resources/controllers/render_spec_controller.rb +30 -0
  82. data/spec/resources/controllers/rjs_spec_controller.rb +58 -0
  83. data/spec/resources/helpers/addition_helper.rb +5 -0
  84. data/spec/resources/helpers/explicit_helper.rb +46 -0
  85. data/spec/resources/helpers/more_explicit_helper.rb +5 -0
  86. data/spec/resources/helpers/plugin_application_helper.rb +6 -0
  87. data/spec/resources/helpers/view_spec_helper.rb +13 -0
  88. data/spec/resources/models/animal.rb +4 -0
  89. data/spec/resources/models/person.rb +18 -0
  90. data/spec/resources/models/thing.rb +3 -0
  91. data/spec/resources/views/controller_spec/_partial.rhtml +0 -0
  92. data/spec/resources/views/controller_spec/action_setting_flash_after_session_reset.rhtml +1 -0
  93. data/spec/resources/views/controller_spec/action_setting_flash_before_session_reset.rhtml +1 -0
  94. data/spec/resources/views/controller_spec/action_setting_the_assigns_hash.rhtml +0 -0
  95. data/spec/resources/views/controller_spec/action_with_errors_in_template.rhtml +1 -0
  96. data/spec/resources/views/controller_spec/action_with_template.rhtml +1 -0
  97. data/spec/resources/views/layouts/application.rhtml +0 -0
  98. data/spec/resources/views/layouts/simple.rhtml +0 -0
  99. data/spec/resources/views/objects/_object.html.erb +1 -0
  100. data/spec/resources/views/render_spec/_a_partial.rhtml +0 -0
  101. data/spec/resources/views/render_spec/action_with_alternate_layout.rhtml +0 -0
  102. data/spec/resources/views/render_spec/some_action.html.erb +0 -0
  103. data/spec/resources/views/render_spec/some_action.js.rjs +1 -0
  104. data/spec/resources/views/render_spec/some_action.rjs +1 -0
  105. data/spec/resources/views/rjs_spec/_replacement_partial.rhtml +1 -0
  106. data/spec/resources/views/rjs_spec/hide_div.rjs +1 -0
  107. data/spec/resources/views/rjs_spec/hide_page_element.rjs +1 -0
  108. data/spec/resources/views/rjs_spec/insert_html.rjs +1 -0
  109. data/spec/resources/views/rjs_spec/replace.rjs +1 -0
  110. data/spec/resources/views/rjs_spec/replace_html.rjs +1 -0
  111. data/spec/resources/views/rjs_spec/replace_html_with_partial.rjs +1 -0
  112. data/spec/resources/views/rjs_spec/visual_effect.rjs +1 -0
  113. data/spec/resources/views/rjs_spec/visual_toggle_effect.rjs +1 -0
  114. data/spec/resources/views/tag_spec/no_tags.rhtml +1 -0
  115. data/spec/resources/views/tag_spec/single_div_with_no_attributes.rhtml +1 -0
  116. data/spec/resources/views/tag_spec/single_div_with_one_attribute.rhtml +1 -0
  117. data/spec/resources/views/view_spec/_partial.rhtml +2 -0
  118. data/spec/resources/views/view_spec/_partial_used_twice.rhtml +0 -0
  119. data/spec/resources/views/view_spec/_partial_with_local_variable.rhtml +1 -0
  120. data/spec/resources/views/view_spec/_partial_with_sub_partial.rhtml +1 -0
  121. data/spec/resources/views/view_spec/_spacer.rhtml +1 -0
  122. data/spec/resources/views/view_spec/accessor.rhtml +5 -0
  123. data/spec/resources/views/view_spec/block_helper.rhtml +3 -0
  124. data/spec/resources/views/view_spec/entry_form.rhtml +2 -0
  125. data/spec/resources/views/view_spec/explicit_helper.rhtml +2 -0
  126. data/spec/resources/views/view_spec/foo/show.rhtml +1 -0
  127. data/spec/resources/views/view_spec/implicit_helper.rhtml +2 -0
  128. data/spec/resources/views/view_spec/multiple_helpers.rhtml +3 -0
  129. data/spec/resources/views/view_spec/path_params.html.erb +1 -0
  130. data/spec/resources/views/view_spec/should_not_receive.rhtml +3 -0
  131. data/spec/resources/views/view_spec/template_with_partial.rhtml +5 -0
  132. data/spec/resources/views/view_spec/template_with_partial_using_collection.rhtml +3 -0
  133. data/spec/resources/views/view_spec/template_with_partial_with_array.rhtml +1 -0
  134. data/spec/spec/rails/example/assigns_hash_proxy_spec.rb +109 -0
  135. data/spec/spec/rails/example/configuration_spec.rb +65 -0
  136. data/spec/spec/rails/example/controller_example_group_spec.rb +275 -0
  137. data/spec/spec/rails/example/controller_isolation_spec.rb +56 -0
  138. data/spec/spec/rails/example/cookies_proxy_spec.rb +87 -0
  139. data/spec/spec/rails/example/error_handling_spec.rb +90 -0
  140. data/spec/spec/rails/example/example_group_factory_spec.rb +112 -0
  141. data/spec/spec/rails/example/helper_example_group_spec.rb +206 -0
  142. data/spec/spec/rails/example/model_example_group_spec.rb +20 -0
  143. data/spec/spec/rails/example/test_unit_assertion_accessibility_spec.rb +33 -0
  144. data/spec/spec/rails/example/view_example_group_spec.rb +335 -0
  145. data/spec/spec/rails/extensions/action_view_base_spec.rb +48 -0
  146. data/spec/spec/rails/extensions/active_record_spec.rb +14 -0
  147. data/spec/spec/rails/interop/testcase_spec.rb +70 -0
  148. data/spec/spec/rails/matchers/ar_be_valid_spec.rb +45 -0
  149. data/spec/spec/rails/matchers/assert_select_spec.rb +811 -0
  150. data/spec/spec/rails/matchers/errors_on_spec.rb +25 -0
  151. data/spec/spec/rails/matchers/have_text_spec.rb +70 -0
  152. data/spec/spec/rails/matchers/include_text_spec.rb +62 -0
  153. data/spec/spec/rails/matchers/redirect_to_spec.rb +253 -0
  154. data/spec/spec/rails/matchers/render_template_spec.rb +183 -0
  155. data/spec/spec/rails/matchers/should_change_spec.rb +15 -0
  156. data/spec/spec/rails/mocks/ar_classes.rb +10 -0
  157. data/spec/spec/rails/mocks/mock_model_spec.rb +106 -0
  158. data/spec/spec/rails/mocks/stub_model_spec.rb +80 -0
  159. data/spec/spec/rails/sample_modified_fixture.rb +8 -0
  160. data/spec/spec/rails/sample_spec.rb +8 -0
  161. data/spec/spec/rails/spec_server_spec.rb +107 -0
  162. data/spec/spec/rails/spec_spec.rb +11 -0
  163. data/spec/spec_helper.rb +78 -0
  164. metadata +262 -0
@@ -0,0 +1,45 @@
1
+ require 'rails_generator/generators/components/controller/controller_generator'
2
+
3
+ class RspecControllerGenerator < ControllerGenerator
4
+
5
+ def manifest
6
+ record do |m|
7
+ # Check for class naming collisions.
8
+ m.class_collisions class_path, "#{class_name}Controller", "#{class_name}Helper"
9
+
10
+ # Controller, helper, views, and spec directories.
11
+ m.directory File.join('app/controllers', class_path)
12
+ m.directory File.join('app/helpers', class_path)
13
+ m.directory File.join('app/views', class_path, file_name)
14
+ m.directory File.join('spec/controllers', class_path)
15
+ m.directory File.join('spec/helpers', class_path)
16
+ m.directory File.join('spec/views', class_path, file_name)
17
+
18
+ @default_file_extension = "html.erb"
19
+
20
+ # Controller spec, class, and helper.
21
+ m.template 'controller_spec.rb',
22
+ File.join('spec/controllers', class_path, "#{file_name}_controller_spec.rb")
23
+
24
+ m.template 'helper_spec.rb',
25
+ File.join('spec/helpers', class_path, "#{file_name}_helper_spec.rb")
26
+
27
+ m.template 'controller:controller.rb',
28
+ File.join('app/controllers', class_path, "#{file_name}_controller.rb")
29
+
30
+ m.template 'controller:helper.rb',
31
+ File.join('app/helpers', class_path, "#{file_name}_helper.rb")
32
+
33
+ # Spec and view template for each action.
34
+ actions.each do |action|
35
+ m.template 'view_spec.rb',
36
+ File.join('spec/views', class_path, file_name, "#{action}.#{@default_file_extension}_spec.rb"),
37
+ :assigns => { :action => action, :model => file_name }
38
+ path = File.join('app/views', class_path, file_name, "#{action}.#{@default_file_extension}")
39
+ m.template "controller:view.#{@default_file_extension}",
40
+ path,
41
+ :assigns => { :action => action, :path => path }
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,25 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../spec_helper')
2
+
3
+ describe <%= class_name %>Controller do
4
+
5
+ <% if actions.empty? -%>
6
+ #Delete this example and add some real ones
7
+ <% else -%>
8
+ #Delete these examples and add some real ones
9
+ <% end -%>
10
+ it "should use <%= class_name %>Controller" do
11
+ controller.should be_an_instance_of(<%= class_name %>Controller)
12
+ end
13
+
14
+ <% unless actions.empty? -%>
15
+ <% for action in actions -%>
16
+
17
+ describe "GET '<%= action %>'" do
18
+ it "should be successful" do
19
+ get '<%= action %>'
20
+ response.should be_success
21
+ end
22
+ end
23
+ <% end -%>
24
+ <% end -%>
25
+ end
@@ -0,0 +1,11 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../spec_helper')
2
+
3
+ describe <%= class_name %>Helper do
4
+
5
+ #Delete this example and add some real ones or delete this file
6
+ it "should be included in the object returned by #helper" do
7
+ included_modules = (class << helper; self; end).send :included_modules
8
+ included_modules.should include(<%= class_name %>Helper)
9
+ end
10
+
11
+ end
@@ -0,0 +1,12 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../../spec_helper')
2
+
3
+ describe "/<%= class_name.underscore %>/<%= action %>" do
4
+ before(:each) do
5
+ render '<%= class_name.underscore %>/<%= action %>'
6
+ end
7
+
8
+ #Delete this example and add some real ones or delete this file
9
+ it "should tell you where to find the file" do
10
+ response.should have_tag('p', %r[Find me in app/views/<%= class_name.underscore %>/<%= action %>])
11
+ end
12
+ end
@@ -0,0 +1,19 @@
1
+ module Rails
2
+ module Generator
3
+ class GeneratedAttribute
4
+ def default_value
5
+ @default_value ||= case type
6
+ when :int, :integer then "1"
7
+ when :float then "1.5"
8
+ when :decimal then "9.99"
9
+ when :datetime, :timestamp, :time then "Time.now"
10
+ when :date then "Date.today"
11
+ when :string, :text then "\"value for #{@name}\""
12
+ when :boolean then "false"
13
+ else
14
+ ""
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,18 @@
1
+ Description:
2
+ The rspec_model generator creates stubs for a new model.
3
+
4
+ The generator takes a model name as its argument. The model name may be
5
+ given in CamelCase or under_score and should not be suffixed with 'Model'.
6
+
7
+ The generator creates a model class in app/models, an RSpec spec in
8
+ spec/models, database fixtures in spec/fixtures/plural_name.yml, and a migration
9
+ in db/migrate.
10
+
11
+ Example:
12
+ ./script/generate rspec_model Account
13
+
14
+ This will create an Account model:
15
+ Model: app/models/account.rb
16
+ Spec: spec/models/account_spec.rb
17
+ Fixtures: spec/fixtures/accounts.yml
18
+ Migration: db/migrate/XXX_add_accounts.rb
@@ -0,0 +1,35 @@
1
+ require 'rails_generator/generators/components/model/model_generator'
2
+ require File.dirname(__FILE__) + '/../rspec_default_values'
3
+
4
+ class RspecModelGenerator < ModelGenerator
5
+
6
+ def manifest
7
+
8
+ record do |m|
9
+ # Check for class naming collisions.
10
+ m.class_collisions class_path, class_name
11
+
12
+ # Model, spec, and fixture directories.
13
+ m.directory File.join('app/models', class_path)
14
+ m.directory File.join('spec/models', class_path)
15
+ unless options[:skip_fixture]
16
+ m.directory File.join('spec/fixtures', class_path)
17
+ end
18
+
19
+ # Model class, spec and fixtures.
20
+ m.template 'model:model.rb', File.join('app/models', class_path, "#{file_name}.rb")
21
+ m.template 'model_spec.rb', File.join('spec/models', class_path, "#{file_name}_spec.rb")
22
+ unless options[:skip_fixture]
23
+ m.template 'model:fixtures.yml', File.join('spec/fixtures', "#{table_name}.yml")
24
+ end
25
+
26
+ unless options[:skip_migration]
27
+ m.migration_template 'model:migration.rb', 'db/migrate', :assigns => {
28
+ :migration_name => "Create#{class_name.pluralize.gsub(/::/, '')}"
29
+ }, :migration_file_name => "create_#{file_path.gsub(/\//, '_').pluralize}"
30
+ end
31
+
32
+ end
33
+ end
34
+
35
+ end
@@ -0,0 +1,15 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../spec_helper')
2
+
3
+ describe <%= class_name %> do
4
+ before(:each) do
5
+ @valid_attributes = {
6
+ <% attributes.each_with_index do |attribute, attribute_index| -%>
7
+ :<%= attribute.name %> => <%= attribute.default_value %><%= attribute_index == attributes.length - 1 ? '' : ','%>
8
+ <% end -%>
9
+ }
10
+ end
11
+
12
+ it "should create a new instance given valid attributes" do
13
+ <%= class_name %>.create!(@valid_attributes)
14
+ end
15
+ end
@@ -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