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.
- data/History.txt +174 -0
- data/License.txt +33 -0
- data/Manifest.txt +164 -0
- data/README.txt +45 -0
- data/Rakefile +63 -0
- data/TODO.txt +1 -0
- data/Upgrade.markdown +52 -0
- data/features/step_definitions/people.rb +6 -0
- data/features/support/env.rb +13 -0
- data/features/transactions/transactions_should_rollback.feature +16 -0
- data/generators/rspec/CHANGES +1 -0
- data/generators/rspec/rspec_generator.rb +37 -0
- data/generators/rspec/templates/previous_failures.txt +0 -0
- data/generators/rspec/templates/rcov.opts +2 -0
- data/generators/rspec/templates/rspec.rake +177 -0
- data/generators/rspec/templates/script/autospec +5 -0
- data/generators/rspec/templates/script/spec +4 -0
- data/generators/rspec/templates/script/spec_server +37 -0
- data/generators/rspec/templates/spec.opts +4 -0
- data/generators/rspec/templates/spec_helper.rb +47 -0
- data/generators/rspec_controller/USAGE +33 -0
- data/generators/rspec_controller/rspec_controller_generator.rb +45 -0
- data/generators/rspec_controller/templates/controller_spec.rb +25 -0
- data/generators/rspec_controller/templates/helper_spec.rb +11 -0
- data/generators/rspec_controller/templates/view_spec.rb +12 -0
- data/generators/rspec_default_values.rb +19 -0
- data/generators/rspec_model/USAGE +18 -0
- data/generators/rspec_model/rspec_model_generator.rb +35 -0
- data/generators/rspec_model/templates/model_spec.rb +15 -0
- data/generators/rspec_scaffold/rspec_scaffold_generator.rb +150 -0
- data/generators/rspec_scaffold/templates/controller_spec.rb +171 -0
- data/generators/rspec_scaffold/templates/edit_erb_spec.rb +27 -0
- data/generators/rspec_scaffold/templates/helper_spec.rb +11 -0
- data/generators/rspec_scaffold/templates/index_erb_spec.rb +28 -0
- data/generators/rspec_scaffold/templates/new_erb_spec.rb +27 -0
- data/generators/rspec_scaffold/templates/routing_spec.rb +63 -0
- data/generators/rspec_scaffold/templates/show_erb_spec.rb +23 -0
- data/init.rb +9 -0
- data/lib/autotest/discover.rb +1 -0
- data/lib/autotest/rails_rspec.rb +76 -0
- data/lib/spec/rails.rb +37 -0
- data/lib/spec/rails/example.rb +53 -0
- data/lib/spec/rails/example/assigns_hash_proxy.rb +39 -0
- data/lib/spec/rails/example/controller_example_group.rb +242 -0
- data/lib/spec/rails/example/cookies_proxy.rb +29 -0
- data/lib/spec/rails/example/functional_example_group.rb +84 -0
- data/lib/spec/rails/example/helper_example_group.rb +167 -0
- data/lib/spec/rails/example/model_example_group.rb +14 -0
- data/lib/spec/rails/example/render_observer.rb +67 -0
- data/lib/spec/rails/example/routing_helpers.rb +68 -0
- data/lib/spec/rails/example/view_example_group.rb +186 -0
- data/lib/spec/rails/extensions.rb +15 -0
- data/lib/spec/rails/extensions/action_controller/rescue.rb +42 -0
- data/lib/spec/rails/extensions/action_controller/test_case.rb +16 -0
- data/lib/spec/rails/extensions/action_controller/test_response.rb +21 -0
- data/lib/spec/rails/extensions/action_view/base.rb +33 -0
- data/lib/spec/rails/extensions/active_record/base.rb +43 -0
- data/lib/spec/rails/extensions/active_support/test_case.rb +7 -0
- data/lib/spec/rails/extensions/spec/matchers/have.rb +23 -0
- data/lib/spec/rails/extensions/spec/runner/configuration.rb +48 -0
- data/lib/spec/rails/interop/testcase.rb +14 -0
- data/lib/spec/rails/matchers.rb +40 -0
- data/lib/spec/rails/matchers/ar_be_valid.rb +44 -0
- data/lib/spec/rails/matchers/assert_select.rb +131 -0
- data/lib/spec/rails/matchers/change.rb +11 -0
- data/lib/spec/rails/matchers/have_text.rb +57 -0
- data/lib/spec/rails/matchers/include_text.rb +54 -0
- data/lib/spec/rails/matchers/redirect_to.rb +126 -0
- data/lib/spec/rails/matchers/render_template.rb +114 -0
- data/lib/spec/rails/mocks.rb +135 -0
- data/lib/spec/rails/spec_server.rb +97 -0
- data/lib/spec/rails/story_adapter.rb +79 -0
- data/lib/spec/rails/version.rb +16 -0
- data/rspec-rails.gemspec +39 -0
- data/spec/autotest/mappings_spec.rb +36 -0
- data/spec/rails_suite.rb +7 -0
- data/spec/resources/controllers/action_view_base_spec_controller.rb +2 -0
- data/spec/resources/controllers/application.rb +9 -0
- data/spec/resources/controllers/controller_spec_controller.rb +116 -0
- data/spec/resources/controllers/redirect_spec_controller.rb +70 -0
- data/spec/resources/controllers/render_spec_controller.rb +30 -0
- data/spec/resources/controllers/rjs_spec_controller.rb +58 -0
- data/spec/resources/helpers/addition_helper.rb +5 -0
- data/spec/resources/helpers/explicit_helper.rb +46 -0
- data/spec/resources/helpers/more_explicit_helper.rb +5 -0
- data/spec/resources/helpers/plugin_application_helper.rb +6 -0
- data/spec/resources/helpers/view_spec_helper.rb +13 -0
- data/spec/resources/models/animal.rb +4 -0
- data/spec/resources/models/person.rb +18 -0
- data/spec/resources/models/thing.rb +3 -0
- data/spec/resources/views/controller_spec/_partial.rhtml +0 -0
- data/spec/resources/views/controller_spec/action_setting_flash_after_session_reset.rhtml +1 -0
- data/spec/resources/views/controller_spec/action_setting_flash_before_session_reset.rhtml +1 -0
- data/spec/resources/views/controller_spec/action_setting_the_assigns_hash.rhtml +0 -0
- data/spec/resources/views/controller_spec/action_with_errors_in_template.rhtml +1 -0
- data/spec/resources/views/controller_spec/action_with_template.rhtml +1 -0
- data/spec/resources/views/layouts/application.rhtml +0 -0
- data/spec/resources/views/layouts/simple.rhtml +0 -0
- data/spec/resources/views/objects/_object.html.erb +1 -0
- data/spec/resources/views/render_spec/_a_partial.rhtml +0 -0
- data/spec/resources/views/render_spec/action_with_alternate_layout.rhtml +0 -0
- data/spec/resources/views/render_spec/some_action.html.erb +0 -0
- data/spec/resources/views/render_spec/some_action.js.rjs +1 -0
- data/spec/resources/views/render_spec/some_action.rjs +1 -0
- data/spec/resources/views/rjs_spec/_replacement_partial.rhtml +1 -0
- data/spec/resources/views/rjs_spec/hide_div.rjs +1 -0
- data/spec/resources/views/rjs_spec/hide_page_element.rjs +1 -0
- data/spec/resources/views/rjs_spec/insert_html.rjs +1 -0
- data/spec/resources/views/rjs_spec/replace.rjs +1 -0
- data/spec/resources/views/rjs_spec/replace_html.rjs +1 -0
- data/spec/resources/views/rjs_spec/replace_html_with_partial.rjs +1 -0
- data/spec/resources/views/rjs_spec/visual_effect.rjs +1 -0
- data/spec/resources/views/rjs_spec/visual_toggle_effect.rjs +1 -0
- data/spec/resources/views/tag_spec/no_tags.rhtml +1 -0
- data/spec/resources/views/tag_spec/single_div_with_no_attributes.rhtml +1 -0
- data/spec/resources/views/tag_spec/single_div_with_one_attribute.rhtml +1 -0
- data/spec/resources/views/view_spec/_partial.rhtml +2 -0
- data/spec/resources/views/view_spec/_partial_used_twice.rhtml +0 -0
- data/spec/resources/views/view_spec/_partial_with_local_variable.rhtml +1 -0
- data/spec/resources/views/view_spec/_partial_with_sub_partial.rhtml +1 -0
- data/spec/resources/views/view_spec/_spacer.rhtml +1 -0
- data/spec/resources/views/view_spec/accessor.rhtml +5 -0
- data/spec/resources/views/view_spec/block_helper.rhtml +3 -0
- data/spec/resources/views/view_spec/entry_form.rhtml +2 -0
- data/spec/resources/views/view_spec/explicit_helper.rhtml +2 -0
- data/spec/resources/views/view_spec/foo/show.rhtml +1 -0
- data/spec/resources/views/view_spec/implicit_helper.rhtml +2 -0
- data/spec/resources/views/view_spec/multiple_helpers.rhtml +3 -0
- data/spec/resources/views/view_spec/path_params.html.erb +1 -0
- data/spec/resources/views/view_spec/should_not_receive.rhtml +3 -0
- data/spec/resources/views/view_spec/template_with_partial.rhtml +5 -0
- data/spec/resources/views/view_spec/template_with_partial_using_collection.rhtml +3 -0
- data/spec/resources/views/view_spec/template_with_partial_with_array.rhtml +1 -0
- data/spec/spec/rails/example/assigns_hash_proxy_spec.rb +109 -0
- data/spec/spec/rails/example/configuration_spec.rb +65 -0
- data/spec/spec/rails/example/controller_example_group_spec.rb +275 -0
- data/spec/spec/rails/example/controller_isolation_spec.rb +56 -0
- data/spec/spec/rails/example/cookies_proxy_spec.rb +87 -0
- data/spec/spec/rails/example/error_handling_spec.rb +90 -0
- data/spec/spec/rails/example/example_group_factory_spec.rb +112 -0
- data/spec/spec/rails/example/helper_example_group_spec.rb +206 -0
- data/spec/spec/rails/example/model_example_group_spec.rb +20 -0
- data/spec/spec/rails/example/test_unit_assertion_accessibility_spec.rb +33 -0
- data/spec/spec/rails/example/view_example_group_spec.rb +335 -0
- data/spec/spec/rails/extensions/action_view_base_spec.rb +48 -0
- data/spec/spec/rails/extensions/active_record_spec.rb +14 -0
- data/spec/spec/rails/interop/testcase_spec.rb +70 -0
- data/spec/spec/rails/matchers/ar_be_valid_spec.rb +45 -0
- data/spec/spec/rails/matchers/assert_select_spec.rb +811 -0
- data/spec/spec/rails/matchers/errors_on_spec.rb +25 -0
- data/spec/spec/rails/matchers/have_text_spec.rb +70 -0
- data/spec/spec/rails/matchers/include_text_spec.rb +62 -0
- data/spec/spec/rails/matchers/redirect_to_spec.rb +253 -0
- data/spec/spec/rails/matchers/render_template_spec.rb +183 -0
- data/spec/spec/rails/matchers/should_change_spec.rb +15 -0
- data/spec/spec/rails/mocks/ar_classes.rb +10 -0
- data/spec/spec/rails/mocks/mock_model_spec.rb +106 -0
- data/spec/spec/rails/mocks/stub_model_spec.rb +80 -0
- data/spec/spec/rails/sample_modified_fixture.rb +8 -0
- data/spec/spec/rails/sample_spec.rb +8 -0
- data/spec/spec/rails/spec_server_spec.rb +107 -0
- data/spec/spec/rails/spec_spec.rb +11 -0
- data/spec/spec_helper.rb +78 -0
- 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
|