提交 affd05d2 编写于 作者: D David Heinemeier Hansson

Merge branch 'master' of github.com:rails/rails

......@@ -27,4 +27,8 @@
* Asynchronously send messages via the Rails Queue *Brian Cardarella*
* Allow callbacks to be defined in mailers similar to `ActionController::Base`. You can configure default
settings, headers, attachments, delivery settings or change delivery using
`before_filter`, `after_filter` etc. *Justin S. Leitgeb*
Please check [3-2-stable](https://github.com/rails/rails/blob/3-2-stable/actionmailer/CHANGELOG.md) for previous changes.
......@@ -13,6 +13,6 @@ Example:
creates a Notifications mailer class, views, test, and fixtures:
Mailer: app/mailers/notifications.rb
Views: app/views/notifications/signup.erb [...]
Test: test/functional/notifications_test.rb
Test: test/mailers/notifications_test.rb
Fixtures: test/fixtures/notifications/signup [...]
require 'active_support/core_ext/string/inflections'
require 'active_support/core_ext/file'
require 'action_view/helpers/tag_helper'
module ActionView
module Helpers
module AssetTagHelper
class AssetIncludeTag #:nodoc:
include TagHelper
attr_reader :config, :asset_paths
class_attribute :expansions
def self.inherited(base)
base.expansions = { }
end
def initialize(config, asset_paths)
@config = config
@asset_paths = asset_paths
end
def asset_name
raise NotImplementedError
end
def extension
raise NotImplementedError
end
def custom_dir
raise NotImplementedError
end
def asset_tag(source, options)
raise NotImplementedError
end
def include_tag(*sources)
options = sources.extract_options!.stringify_keys
concat = options.delete("concat")
cache = concat || options.delete("cache")
recursive = options.delete("recursive")
if concat || (config.perform_caching && cache)
joined_name = (cache == true ? "all" : cache) + ".#{extension}"
joined_path = File.join((joined_name[/^#{File::SEPARATOR}/] ? config.assets_dir : custom_dir), joined_name)
unless config.perform_caching && File.exists?(joined_path)
write_asset_file_contents(joined_path, compute_paths(sources, recursive))
end
asset_tag(joined_name, options)
else
sources = expand_sources(sources, recursive)
ensure_sources!(sources) if cache
sources.collect { |source| asset_tag(source, options) }.join("\n").html_safe
end
end
private
def path_to_asset(source, options = {})
asset_paths.compute_public_path(source, asset_name.to_s.pluralize, options.merge(:ext => extension))
end
def path_to_asset_source(source)
asset_paths.compute_source_path(source, asset_name.to_s.pluralize, extension)
end
def compute_paths(*args)
expand_sources(*args).collect { |source| path_to_asset_source(source) }
end
def expand_sources(sources, recursive)
if sources.first == :all
collect_asset_files(custom_dir, ('**' if recursive), "*.#{extension}")
else
sources.inject([]) do |list, source|
determined_source = determine_source(source, expansions)
update_source_list(list, determined_source)
end
end
end
def update_source_list(list, source)
case source
when String
list.delete(source)
list << source
when Array
updated_sources = source - list
list.concat(updated_sources)
end
end
def ensure_sources!(sources)
sources.each do |source|
asset_file_path!(path_to_asset_source(source))
end
end
def collect_asset_files(*path)
dir = path.first
Dir[File.join(*path.compact)].collect do |file|
file[-(file.size - dir.size - 1)..-1].sub(/\.\w+$/, '')
end.sort
end
def determine_source(source, collection)
case source
when Symbol
collection[source] || raise(ArgumentError, "No expansion found for #{source.inspect}")
else
source
end
end
def join_asset_file_contents(paths)
paths.collect { |path| File.read(asset_file_path!(path, true)) }.join("\n\n")
end
def write_asset_file_contents(joined_asset_path, asset_paths)
FileUtils.mkdir_p(File.dirname(joined_asset_path))
File.atomic_write(joined_asset_path) { |cache| cache.write(join_asset_file_contents(asset_paths)) }
# Set mtime to the latest of the combined files to allow for
# consistent ETag without a shared filesystem.
mt = asset_paths.map { |p| File.mtime(asset_file_path!(p)) }.max
File.utime(mt, mt, joined_asset_path)
end
def asset_file_path!(absolute_path, error_if_file_is_uri = false)
if asset_paths.is_uri?(absolute_path)
raise(Errno::ENOENT, "Asset file #{path} is uri and cannot be merged into single file") if error_if_file_is_uri
else
raise(Errno::ENOENT, "Asset file not found at '#{absolute_path}'" ) unless File.exist?(absolute_path)
return absolute_path
end
end
end
end
end
end
require 'active_support/core_ext/file'
require 'action_view/helpers/asset_tag_helpers/asset_include_tag'
module ActionView
module Helpers
module AssetTagHelper
class JavascriptIncludeTag < AssetIncludeTag #:nodoc:
def asset_name
'javascript'
end
def extension
'js'
end
def asset_tag(source, options)
content_tag("script", "", { "src" => path_to_asset(source) }.merge(options))
end
def custom_dir
config.javascripts_dir
end
private
def expand_sources(sources, recursive = false)
if sources.include?(:all)
all_asset_files = (collect_asset_files(custom_dir, ('**' if recursive), "*.#{extension}") - ['application'])
add_application_js(all_asset_files, sources)
((determine_source(:defaults, expansions).dup & all_asset_files) + all_asset_files).uniq
else
expanded_sources = sources.inject([]) do |list, source|
determined_source = determine_source(source, expansions)
update_source_list(list, determined_source)
end
add_application_js(expanded_sources, sources)
expanded_sources
end
end
def add_application_js(expanded_sources, sources)
if (sources.include?(:defaults) || sources.include?(:all)) && File.exist?(File.join(custom_dir, "application.#{extension}"))
expanded_sources.delete('application')
expanded_sources << "application"
end
end
end
module JavascriptTagHelpers
extend ActiveSupport::Concern
module ClassMethods
# Register one or more javascript files to be included when <tt>symbol</tt>
# is passed to <tt>javascript_include_tag</tt>. This method is typically intended
# to be called from plugin initialization to register javascript files
# that the plugin installed in <tt>public/javascripts</tt>.
#
# ActionView::Helpers::AssetTagHelper.register_javascript_expansion :monkey => ["head", "body", "tail"]
#
# javascript_include_tag :monkey # =>
# <script src="/javascripts/head.js"></script>
# <script src="/javascripts/body.js"></script>
# <script src="/javascripts/tail.js"></script>
def register_javascript_expansion(expansions)
js_expansions = JavascriptIncludeTag.expansions
expansions.each do |key, values|
js_expansions[key] = (js_expansions[key] || []) | Array(values)
end
end
end
# Computes the path to a javascript asset in the public javascripts directory.
# If the +source+ filename has no extension, .js will be appended (except for explicit URIs)
# Full paths from the document root will be passed through.
......@@ -101,15 +36,6 @@ def javascript_url(source)
#
# When passing paths, the ".js" extension is optional.
#
# If the application is not using the asset pipeline, to include the default JavaScript
# expansion pass <tt>:defaults</tt> as source. By default, <tt>:defaults</tt> loads jQuery,
# and that can be overridden in <tt>config/application.rb</tt>:
#
# config.action_view.javascript_expansions[:defaults] = %w(foo.js bar.js)
#
# When using <tt>:defaults</tt> or <tt>:all</tt>, if an <tt>application.js</tt> file exists
# in <tt>public/javascripts</tt> it will be included as well at the end.
#
# You can modify the HTML attributes of the script tag by passing a hash as the
# last argument.
#
......@@ -129,65 +55,14 @@ def javascript_url(source)
# javascript_include_tag "http://www.example.com/xmlhr.js"
# # => <script src="http://www.example.com/xmlhr.js"></script>
#
# javascript_include_tag :defaults
# # => <script src="/javascripts/jquery.js?1284139606"></script>
# # <script src="/javascripts/rails.js?1284139606"></script>
# # <script src="/javascripts/application.js?1284139606"></script>
#
# Note: The application.js file is only referenced if it exists
#
# You can also include all JavaScripts in the +javascripts+ directory using <tt>:all</tt> as the source:
#
# javascript_include_tag :all
# # => <script src="/javascripts/jquery.js?1284139606"></script>
# # <script src="/javascripts/rails.js?1284139606"></script>
# # <script src="/javascripts/shop.js?1284139606"></script>
# # <script src="/javascripts/checkout.js?1284139606"></script>
# # <script src="/javascripts/application.js?1284139606"></script>
#
# Note that your defaults of choice will be included first, so they will be available to all subsequently
# included files.
#
# If you want Rails to search in all the subdirectories under <tt>public/javascripts</tt>, you should
# explicitly set <tt>:recursive</tt>:
#
# javascript_include_tag :all, :recursive => true
#
# == Caching multiple JavaScripts into one
#
# You can also cache multiple JavaScripts into one file, which requires less HTTP connections to download
# and can better be compressed by gzip (leading to faster transfers). Caching will only happen if
# <tt>config.perform_caching</tt> is set to true (which is the case by default for the Rails
# production environment, but not for the development environment).
#
# # assuming config.perform_caching is false
# javascript_include_tag :all, :cache => true
# # => <script src="/javascripts/jquery.js?1284139606"></script>
# # <script src="/javascripts/rails.js?1284139606"></script>
# # <script src="/javascripts/shop.js?1284139606"></script>
# # <script src="/javascripts/checkout.js?1284139606"></script>
# # <script src="/javascripts/application.js?1284139606"></script>
#
# # assuming config.perform_caching is true
# javascript_include_tag :all, :cache => true
# # => <script src="/javascripts/all.js?1344139789"></script>
#
# # assuming config.perform_caching is false
# javascript_include_tag "jquery", "cart", "checkout", :cache => "shop"
# # => <script src="/javascripts/jquery.js?1284139606"></script>
# # <script src="/javascripts/cart.js?1289139157"></script>
# # <script src="/javascripts/checkout.js?1299139816"></script>
#
# # assuming config.perform_caching is true
# javascript_include_tag "jquery", "cart", "checkout", :cache => "shop"
# # => <script src="/javascripts/shop.js?1299139816"></script>
#
# The <tt>:recursive</tt> option is also available for caching:
#
# javascript_include_tag :all, :cache => true, :recursive => true
def javascript_include_tag(*sources)
@javascript_include ||= JavascriptIncludeTag.new(config, asset_paths)
@javascript_include.include_tag(*sources)
options = sources.extract_options!.stringify_keys
sources.dup.map { |source|
tag_options = {
"src" => path_to_javascript(source)
}.merge(options)
content_tag(:script, "", tag_options)
}.join("\n").html_safe
end
end
end
......
require 'active_support/core_ext/file'
require 'action_view/helpers/asset_tag_helpers/asset_include_tag'
module ActionView
module Helpers
module AssetTagHelper
class StylesheetIncludeTag < AssetIncludeTag #:nodoc:
def asset_name
'stylesheet'
end
def extension
'css'
end
def asset_tag(source, options)
# We force the :request protocol here to avoid a double-download bug in IE7 and IE8
tag("link", { "rel" => "stylesheet", "media" => "screen", "href" => path_to_asset(source, :protocol => :request) }.merge(options))
end
def custom_dir
config.stylesheets_dir
end
end
module StylesheetTagHelpers
extend ActiveSupport::Concern
module ClassMethods
# Register one or more stylesheet files to be included when <tt>symbol</tt>
# is passed to <tt>stylesheet_link_tag</tt>. This method is typically intended
# to be called from plugin initialization to register stylesheet files
# that the plugin installed in <tt>public/stylesheets</tt>.
#
# ActionView::Helpers::AssetTagHelper.register_stylesheet_expansion :monkey => ["head", "body", "tail"]
#
# stylesheet_link_tag :monkey # =>
# <link href="/stylesheets/head.css" media="screen" rel="stylesheet" />
# <link href="/stylesheets/body.css" media="screen" rel="stylesheet" />
# <link href="/stylesheets/tail.css" media="screen" rel="stylesheet" />
def register_stylesheet_expansion(expansions)
style_expansions = StylesheetIncludeTag.expansions
expansions.each do |key, values|
style_expansions[key] = (style_expansions[key] || []) | Array(values)
end
end
end
# Computes the path to a stylesheet asset in the public stylesheets directory.
# If the +source+ filename has no extension, <tt>.css</tt> will be appended (except for explicit URIs).
# Full paths from the document root will be passed through.
......@@ -96,56 +54,18 @@ def stylesheet_url(source)
# <link href="/stylesheets/random.styles" media="screen" rel="stylesheet" />
# <link href="/css/stylish.css" media="screen" rel="stylesheet" />
#
# You can also include all styles in the stylesheets directory using <tt>:all</tt> as the source:
#
# stylesheet_link_tag :all # =>
# <link href="/stylesheets/style1.css" media="screen" rel="stylesheet" />
# <link href="/stylesheets/styleB.css" media="screen" rel="stylesheet" />
# <link href="/stylesheets/styleX2.css" media="screen" rel="stylesheet" />
#
# If you want Rails to search in all the subdirectories under stylesheets, you should explicitly set <tt>:recursive</tt>:
#
# stylesheet_link_tag :all, :recursive => true
#
# == Caching multiple stylesheets into one
#
# You can also cache multiple stylesheets into one file, which requires less HTTP connections and can better be
# compressed by gzip (leading to faster transfers). Caching will only happen if +config.perform_caching+
# is set to true (which is the case by default for the Rails production environment, but not for the development
# environment). Examples:
#
# stylesheet_link_tag :all, :cache => true # when config.perform_caching is false =>
# <link href="/stylesheets/style1.css" media="screen" rel="stylesheet" />
# <link href="/stylesheets/styleB.css" media="screen" rel="stylesheet" />
# <link href="/stylesheets/styleX2.css" media="screen" rel="stylesheet" />
#
# stylesheet_link_tag :all, :cache => true # when config.perform_caching is true =>
# <link href="/stylesheets/all.css" media="screen" rel="stylesheet" />
#
# stylesheet_link_tag "shop", "cart", "checkout", :cache => "payment" # when config.perform_caching is false =>
# <link href="/stylesheets/shop.css" media="screen" rel="stylesheet" />
# <link href="/stylesheets/cart.css" media="screen" rel="stylesheet" />
# <link href="/stylesheets/checkout.css" media="screen" rel="stylesheet" />
#
# stylesheet_link_tag "shop", "cart", "checkout", :cache => "payment" # when config.perform_caching is true =>
# <link href="/stylesheets/payment.css" media="screen" rel="stylesheet" />
#
# The <tt>:recursive</tt> option is also available for caching:
#
# stylesheet_link_tag :all, :cache => true, :recursive => true
#
# To force concatenation (even in development mode) set <tt>:concat</tt> to true. This is useful if
# you have too many stylesheets for IE to load.
#
# stylesheet_link_tag :all, :concat => true
#
def stylesheet_link_tag(*sources)
@stylesheet_include ||= StylesheetIncludeTag.new(config, asset_paths)
@stylesheet_include.include_tag(*sources)
options = sources.extract_options!.stringify_keys
sources.uniq.map { |source|
tag_options = {
"rel" => "stylesheet",
"media" => "screen",
"href" => path_to_stylesheet(source)
}.merge(options)
tag(:link, tag_options)
}.join("\n").html_safe
end
end
end
end
end
......@@ -5,8 +5,6 @@ module ActionView
# = Action View Railtie
class Railtie < Rails::Railtie
config.action_view = ActiveSupport::OrderedOptions.new
config.action_view.stylesheet_expansions = {}
config.action_view.javascript_expansions = { :defaults => %w(jquery jquery_ujs) }
config.action_view.embed_authenticity_token_in_remote_forms = false
config.eager_load_namespaces << ActionView
......@@ -30,18 +28,6 @@ class Railtie < Rails::Railtie
end
end
initializer "action_view.javascript_expansions" do |app|
ActiveSupport.on_load(:action_view) do
ActionView::Helpers::AssetTagHelper.register_javascript_expansion(
app.config.action_view.delete(:javascript_expansions)
)
ActionView::Helpers::AssetTagHelper.register_stylesheet_expansion(
app.config.action_view.delete(:stylesheet_expansions)
)
end
end
initializer "action_view.set_configs" do |app|
ActiveSupport.on_load(:action_view) do
app.config.action_view.each do |k,v|
......
......@@ -414,7 +414,7 @@ def merge_target_lists(persisted, memory)
persisted.map! do |record|
if mem_record = memory.delete(record)
(record.attribute_names - mem_record.changes.keys).each do |name|
((record.attribute_names & mem_record.attribute_names) - mem_record.changes.keys).each do |name|
mem_record[name] = record[name]
end
......
......@@ -141,23 +141,6 @@ def replace_named_bind_variables(statement, bind_vars) #:nodoc:
end
end
def expand_range_bind_variables(bind_vars) #:nodoc:
expanded = []
bind_vars.each do |var|
next if var.is_a?(Hash)
if var.is_a?(Range)
expanded << var.first
expanded << var.last
else
expanded << var
end
end
expanded
end
def quote_bound_value(value, c = connection) #:nodoc:
if value.respond_to?(:map) && !value.acts_like?(:string)
if value.respond_to?(:empty?) && value.empty?
......
......@@ -231,6 +231,14 @@ def test_has_many_with_piggyback
assert_equal "2", categories(:sti_test).authors_with_select.first.post_id.to_s
end
def test_create_through_has_many_with_piggyback
category = categories(:sti_test)
ernie = category.authors_with_select.create(:name => 'Ernie')
assert_nothing_raised do
assert_equal ernie, category.authors_with_select.detect {|a| a.name == 'Ernie'}
end
end
def test_include_has_many_through
posts = Post.all.merge!(:order => 'posts.id').to_a
posts_with_authors = Post.all.merge!(:includes => :authors, :order => 'posts.id').to_a
......
require 'active_support/xml_mini'
require 'active_support/core_ext/hash/keys'
require 'active_support/core_ext/string/inflections'
require 'active_support/core_ext/object/to_param'
require 'active_support/core_ext/object/to_query'
class Array
# Converts the array to a comma-separated sentence where the last element is
......
......@@ -28,7 +28,7 @@ def beginning_of_week=(week_start)
# Returns week start day symbol (e.g. :monday), or raises an ArgumentError for invalid day symbol.
def find_beginning_of_week!(week_start)
raise ArgumentError, "Invalid beginning of week: #{week_start}" unless ::Date::DAYS_INTO_WEEK.keys.include?(week_start)
raise ArgumentError, "Invalid beginning of week: #{week_start}" unless ::Date::DAYS_INTO_WEEK.key?(week_start)
week_start
end
......
require 'active_support/xml_mini'
require 'active_support/time'
require 'active_support/core_ext/object/blank'
require 'active_support/core_ext/object/to_param'
require 'active_support/core_ext/object/to_query'
require 'active_support/core_ext/array/wrap'
require 'active_support/core_ext/hash/reverse_merge'
require 'active_support/core_ext/object/blank'
require 'active_support/core_ext/string/inflections'
class Hash
......
require 'active_support/core_ext/object/acts_like'
require 'active_support/core_ext/object/blank'
require 'active_support/core_ext/object/duplicable'
require 'active_support/core_ext/object/deep_dup'
require 'active_support/core_ext/object/try'
require 'active_support/core_ext/object/duplicable'
require 'active_support/core_ext/object/inclusion'
require 'active_support/core_ext/object/conversions'
require 'active_support/core_ext/object/instance_variables'
require 'active_support/core_ext/object/to_json'
require 'active_support/core_ext/object/to_param'
require 'active_support/core_ext/object/to_query'
require 'active_support/core_ext/object/try'
require 'active_support/core_ext/object/with_options'
require 'active_support/core_ext/object/to_param'
require 'active_support/core_ext/object/to_query'
require 'active_support/core_ext/array/conversions'
require 'active_support/core_ext/hash/conversions'
require 'abstract_unit'
require 'active_support/core_ext/array'
require 'active_support/core_ext/big_decimal'
require 'active_support/core_ext/object/conversions'
require 'active_support/core_ext' # FIXME: pulling in all to_xml extensions
require 'active_support/hash_with_indifferent_access'
......
......@@ -3,7 +3,6 @@
require 'bigdecimal'
require 'active_support/core_ext/string/access'
require 'active_support/ordered_hash'
require 'active_support/core_ext/object/conversions'
require 'active_support/core_ext/object/deep_dup'
require 'active_support/inflections'
......
## Rails 4.0.0 (unreleased) ##
* Guides updated to reflect new test locations. *Mike Moore*
* Guides have a responsive design. *Joe Fiorini*
......@@ -5,7 +5,7 @@
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// the compiled file.
// compiled file.
//
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
// GO AFTER THE REQUIRES BELOW.
......
......@@ -141,6 +141,8 @@ Action Mailer
end
```
* Allow for callbacks in mailers similar to ActionController::Base. You can now set up headers/attachments using `before_filter` or `after_filter`. You could also change delivery settings or prevent delivery in an after filter based on instance variables set in your mailer action. You have access to `ActionMailer::Base` instance methods like `message`, `attachments`, `headers`.
Action Pack
-----------
......
......@@ -27,7 +27,7 @@ create app/mailers/user_mailer.rb
invoke erb
create app/views/user_mailer
invoke test_unit
create test/functional/user_mailer_test.rb
create test/mailers/user_mailer_test.rb
```
So we got the mailer, the views, and the tests.
......
......@@ -3097,7 +3097,8 @@ Time.local(2000, 11, 31).next_quarter # => Wed, 28 Feb 2001
The methods `beginning_of_week` and `end_of_week` return the dates for the
beginning and end of the week, respectively. Weeks are assumed to start on
Monday, but that can be changed passing an argument.
Monday, but that can be changed passing an argument, setting thread local
`Date.beginning_of_week` or `config.beginning_of_week`.
```ruby
d = Date.new(2010, 5, 8) # => Sat, 08 May 2010
......@@ -3111,18 +3112,24 @@ d.end_of_week(:sunday) # => Sat, 08 May 2010
##### `monday`, `sunday`
The methods `monday` and `sunday` return the dates for the beginning and
end of the week, respectively. Weeks are assumed to start on Monday.
The methods `monday` and `sunday` return the dates for the previous Monday and
next Sunday, respectively.
```ruby
d = Date.new(2010, 5, 8) # => Sat, 08 May 2010
d.monday # => Mon, 03 May 2010
d.sunday # => Sun, 09 May 2010
d = Date.new(2012, 9, 10) # => Mon, 10 Sep 2012
d.monday # => Mon, 10 Sep 2012
d = Date.new(2012, 9, 16) # => Sun, 16 Sep 2012
d.sunday # => Sun, 16 Sep 2012
```
##### `prev_week`, `next_week`
The method `next_week` receives a symbol with a day name in English (in lowercase, default is `:monday`) and it returns the date corresponding to that day:
The method `next_week` receives a symbol with a day name in English (default is the thread local `Date.beginning_of_week`, or `config.beginning_of_week`, or `:monday`) and it returns the date corresponding to that day.
```ruby
d = Date.new(2010, 5, 9) # => Sun, 09 May 2010
......@@ -3140,6 +3147,8 @@ d.prev_week(:friday) # => Fri, 30 Apr 2010
`prev_week` is aliased to `last_week`.
Both `next_week` and `prev_week` work as expected when `Date.beginning_of_week` or `config.beginning_of_week` are set.
##### `beginning_of_month`, `end_of_month`
The methods `beginning_of_month` and `end_of_month` return the dates for the beginning and end of the month:
......@@ -3617,6 +3626,8 @@ now = Time.current
# => Mon, 09 Aug 2010 23:20:05 UTC +00:00
now.all_week
# => Mon, 09 Aug 2010 00:00:00 UTC +00:00..Sun, 15 Aug 2010 23:59:59 UTC +00:00
now.all_week(:sunday)
# => Sun, 16 Sep 2012 00:00:00 UTC +00:00..Sat, 22 Sep 2012 23:59:59 UTC +00:00
now.all_month
# => Sat, 01 Aug 2010 00:00:00 UTC +00:00..Tue, 31 Aug 2010 23:59:59 UTC +00:00
now.all_quarter
......
......@@ -134,10 +134,10 @@ Example:
`rails generate controller CreditCard open debit credit close`
Credit card controller with URLs like /credit_card/debit.
Controller: app/controllers/credit_card_controller.rb
Functional Test: test/functional/credit_card_controller_test.rb
Views: app/views/credit_card/debit.html.erb [...]
Helper: app/helpers/credit_card_helper.rb
Controller: app/controllers/credit_card_controller.rb
Test: test/controllers/credit_card_controller_test.rb
Views: app/views/credit_card/debit.html.erb [...]
Helper: app/helpers/credit_card_helper.rb
```
The controller generator is expecting parameters in the form of `generate controller ControllerName action1 action2`. Let's make a `Greetings` controller with an action of **hello**, which will say something nice to us.
......@@ -150,11 +150,11 @@ $ rails generate controller Greetings hello
create app/views/greetings
create app/views/greetings/hello.html.erb
invoke test_unit
create test/functional/greetings_controller_test.rb
create test/controllers/greetings_controller_test.rb
invoke helper
create app/helpers/greetings_helper.rb
invoke test_unit
create test/unit/helpers/greetings_helper_test.rb
create test/helpers/greetings_helper_test.rb
invoke assets
invoke coffee
create app/assets/javascripts/greetings.js.coffee
......@@ -223,7 +223,7 @@ $ rails generate scaffold HighScore game:string score:integer
create db/migrate/20120528060026_create_high_scores.rb
create app/models/high_score.rb
invoke test_unit
create test/unit/high_score_test.rb
create test/models/high_score_test.rb
create test/fixtures/high_scores.yml
route resources :high_scores
invoke scaffold_controller
......@@ -236,11 +236,11 @@ $ rails generate scaffold HighScore game:string score:integer
create app/views/high_scores/new.html.erb
create app/views/high_scores/_form.html.erb
invoke test_unit
create test/functional/high_scores_controller_test.rb
create test/controllers/high_scores_controller_test.rb
invoke helper
create app/helpers/high_scores_helper.rb
invoke test_unit
create test/unit/helpers/high_scores_helper_test.rb
create test/helpers/high_scores_helper_test.rb
invoke assets
invoke coffee
create app/assets/javascripts/high_scores.js.coffee
......@@ -327,7 +327,7 @@ $ rails generate model Oops
create db/migrate/20120528062523_create_oops.rb
create app/models/oops.rb
invoke test_unit
create test/unit/oops_test.rb
create test/models/oops_test.rb
create test/fixtures/oops.yml
```
```bash
......@@ -336,7 +336,7 @@ $ rails destroy model Oops
remove db/migrate/20120528062523_create_oops.rb
remove app/models/oops.rb
invoke test_unit
remove test/unit/oops_test.rb
remove test/models/oops_test.rb
remove test/fixtures/oops.yml
```
......
......@@ -130,7 +130,7 @@ end
This line mounts the engine at the path `/blorgh`, which will make it accessible through the application only at that path.
Also in the test directory is the `test/integration` directory, where integration tests for the engine should be placed. Other directories can be created in the `test` directory also. For example, you may wish to create a `test/unit` directory for your unit tests.
Also in the test directory is the `test/integration` directory, where integration tests for the engine should be placed. Other directories can be created in the `test` directory also. For example, you may wish to create a `test/models` directory for your models tests.
Providing engine functionality
------------------------------
......@@ -152,7 +152,7 @@ invoke active_record
create db/migrate/[timestamp]_create_blorgh_posts.rb
create app/models/blorgh/post.rb
invoke test_unit
create test/unit/blorgh/post_test.rb
create test/models/blorgh/post_test.rb
create test/fixtures/blorgh/posts.yml
route resources :posts
invoke scaffold_controller
......@@ -165,11 +165,11 @@ create app/views/blorgh/posts/show.html.erb
create app/views/blorgh/posts/new.html.erb
create app/views/blorgh/posts/_form.html.erb
invoke test_unit
create test/functional/blorgh/posts_controller_test.rb
create test/controllers/blorgh/posts_controller_test.rb
invoke helper
create app/helpers/blorgh/posts_helper.rb
invoke test_unit
create test/unit/helpers/blorgh/posts_helper_test.rb
create test/helpers/blorgh/posts_helper_test.rb
invoke assets
invoke js
create app/assets/javascripts/blorgh/posts.js
......@@ -181,7 +181,7 @@ create app/assets/stylesheets/scaffold.css
The first thing that the scaffold generator does is invoke the `active_record` generator, which generates a migration and a model for the resource. Note here, however, that the migration is called `create_blorgh_posts` rather than the usual `create_posts`. This is due to the `isolate_namespace` method called in the `Blorgh::Engine` class's definition. The model here is also namespaced, being placed at `app/models/blorgh/post.rb` rather than `app/models/post.rb` due to the `isolate_namespace` call within the `Engine` class.
Next, the `test_unit` generator is invoked for this model, generating a unit test at `test/unit/blorgh/post_test.rb` (rather than `test/unit/post_test.rb`) and a fixture at `test/fixtures/blorgh/posts.yml` (rather than `test/fixtures/posts.yml`).
Next, the `test_unit` generator is invoked for this model, generating a model test at `test/models/blorgh/post_test.rb` (rather than `test/models/post_test.rb`) and a fixture at `test/fixtures/blorgh/posts.yml` (rather than `test/fixtures/posts.yml`).
After that, a line for the resource is inserted into the `config/routes.rb` file for the engine. This line is simply `resources :posts`, turning the `config/routes.rb` file for the engine into this:
......@@ -193,7 +193,7 @@ end
Note here that the routes are drawn upon the `Blorgh::Engine` object rather than the `YourApp::Application` class. This is so that the engine routes are confined to the engine itself and can be mounted at a specific point as shown in the [test directory](#test-directory) section. This is also what causes the engine's routes to be isolated from those routes that are within the application. This is discussed further in the [Routes](#routes) section of this guide.
Next, the `scaffold_controller` generator is invoked, generating a controller called `Blorgh::PostsController` (at `app/controllers/blorgh/posts_controller.rb`) and its related views at `app/views/blorgh/posts`. This generator also generates a functional test for the controller (`test/functional/blorgh/posts_controller_test.rb`) and a helper (`app/helpers/blorgh/posts_controller.rb`).
Next, the `scaffold_controller` generator is invoked, generating a controller called `Blorgh::PostsController` (at `app/controllers/blorgh/posts_controller.rb`) and its related views at `app/views/blorgh/posts`. This generator also generates a test for the controller (`test/controllers/blorgh/posts_controller_test.rb`) and a helper (`app/helpers/blorgh/posts_controller.rb`).
Everything this generator has created is neatly namespaced. The controller's class is defined within the `Blorgh` module:
......@@ -261,7 +261,7 @@ invoke active_record
create db/migrate/[timestamp]_create_blorgh_comments.rb
create app/models/blorgh/comment.rb
invoke test_unit
create test/unit/blorgh/comment_test.rb
create test/models/blorgh/comment_test.rb
create test/fixtures/blorgh/comments.yml
```
......@@ -334,11 +334,11 @@ create app/controllers/blorgh/comments_controller.rb
invoke erb
exist app/views/blorgh/comments
invoke test_unit
create test/functional/blorgh/comments_controller_test.rb
create test/controllers/blorgh/comments_controller_test.rb
invoke helper
create app/helpers/blorgh/comments_helper.rb
invoke test_unit
create test/unit/helpers/blorgh/comments_helper_test.rb
create test/helpers/blorgh/comments_helper_test.rb
invoke assets
invoke js
create app/assets/javascripts/blorgh/comments.js
......
......@@ -176,7 +176,7 @@ $ rails generate scaffold User name:string
create db/migrate/20091120125558_create_users.rb
create app/models/user.rb
invoke test_unit
create test/unit/user_test.rb
create test/models/user_test.rb
create test/fixtures/users.yml
route resources :users
invoke scaffold_controller
......@@ -189,11 +189,11 @@ $ rails generate scaffold User name:string
create app/views/users/new.html.erb
create app/views/users/_form.html.erb
invoke test_unit
create test/functional/users_controller_test.rb
create test/controllers/users_controller_test.rb
invoke helper
create app/helpers/users_helper.rb
invoke test_unit
create test/unit/helpers/users_helper_test.rb
create test/helpers/users_helper_test.rb
invoke stylesheets
create app/assets/stylesheets/scaffold.css
```
......@@ -350,7 +350,7 @@ $ rails generate scaffold Comment body:text
create db/migrate/20091120151323_create_comments.rb
create app/models/comment.rb
invoke shoulda
create test/unit/comment_test.rb
create test/models/comment_test.rb
create test/fixtures/comments.yml
route resources :comments
invoke scaffold_controller
......@@ -364,11 +364,11 @@ $ rails generate scaffold Comment body:text
create app/views/comments/_form.html.erb
create app/views/layouts/comments.html.erb
invoke shoulda
create test/functional/comments_controller_test.rb
create test/controllers/comments_controller_test.rb
invoke my_helper
create app/helpers/comments_helper.rb
invoke shoulda
create test/unit/helpers/comments_helper_test.rb
create test/helpers/comments_helper_test.rb
```
Fallbacks allow your generators to have a single responsibility, increasing code reuse and reducing the amount of duplication.
......
......@@ -185,11 +185,11 @@ invoke erb
create app/views/welcome
create app/views/welcome/index.html.erb
invoke test_unit
create test/functional/welcome_controller_test.rb
create test/controllers/welcome_controller_test.rb
invoke helper
create app/helpers/welcome_helper.rb
invoke test_unit
create test/unit/helpers/welcome_helper_test.rb
create test/helpers/welcome_helper_test.rb
invoke assets
invoke coffee
create app/assets/javascripts/welcome.js.coffee
......@@ -1239,7 +1239,7 @@ This command will generate four files:
| -------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| db/migrate/20100207235629_create_comments.rb | Migration to create the comments table in your database (your name will include a different timestamp) |
| app/models/comment.rb | The Comment model |
| test/unit/comment_test.rb | Unit testing harness for the comments model |
| test/models/comment_test.rb | Testing harness for the comments model |
| test/fixtures/comments.yml | Sample comments for use in testing |
First, take a look at `comment.rb`:
......@@ -1360,15 +1360,15 @@ $ rails generate controller Comments
This creates six files and one empty directory:
| File/Directory | Purpose |
| ------------------------------------------- | ---------------------------------------- |
| app/controllers/comments_controller.rb | The Comments controller |
| app/views/comments/ | Views of the controller are stored here |
| test/functional/comments_controller_test.rb | The functional tests for the controller |
| app/helpers/comments_helper.rb | A view helper file |
| test/unit/helpers/comments_helper_test.rb | The unit tests for the helper |
| app/assets/javascripts/comment.js.coffee | CoffeeScript for the controller |
| app/assets/stylesheets/comment.css.scss | Cascading style sheet for the controller |
| File/Directory | Purpose |
| -------------------------------------------- | ---------------------------------------- |
| app/controllers/comments_controller.rb | The Comments controller |
| app/views/comments/ | Views of the controller are stored here |
| test/controllers/comments_controller_test.rb | The test for the controller |
| app/helpers/comments_helper.rb | A view helper file |
| test/helpers/comments_helper_test.rb | The test for the helper |
| app/assets/javascripts/comment.js.coffee | CoffeeScript for the controller |
| app/assets/stylesheets/comment.css.scss | Cascading style sheet for the controller |
Like with any blog, our readers will create their comments directly after
reading the post, and once they have added their comment, will be sent back to
......
......@@ -367,7 +367,7 @@ on your needs.
### `Rails::Server#start`
After `congif/application` is loaded, `server.start` is called. This method is defined like this:
After `config/application` is loaded, `server.start` is called. This method is defined like this:
```ruby
def start
......
......@@ -121,18 +121,18 @@ For this guide we will be using Rails _scaffolding_. It will create the model, a
NOTE: For more information on Rails <i>scaffolding</i>, refer to [Getting Started with Rails](getting_started.html)
When you use `rails generate scaffold`, for a resource among other things it creates a test stub in the `test/unit` folder:
When you use `rails generate scaffold`, for a resource among other things it creates a test stub in the `test/models` folder:
```bash
$ rails generate scaffold post title:string body:text
...
create app/models/post.rb
create test/unit/post_test.rb
create test/models/post_test.rb
create test/fixtures/posts.yml
...
```
The default test stub in `test/unit/post_test.rb` looks like this:
The default test stub in `test/models/post_test.rb` looks like this:
```ruby
require 'test_helper'
......@@ -225,9 +225,9 @@ TIP: You can see all these rake tasks and their descriptions by running `rake --
Running a test is as simple as invoking the file containing the test cases through Ruby:
```bash
$ ruby -Itest test/unit/post_test.rb
$ ruby -Itest test/models/post_test.rb
Loaded suite unit/post_test
Loaded suite models/post_test
Started
.
Finished in 0.023513 seconds.
......@@ -240,9 +240,9 @@ This will run all the test methods from the test case. Note that `test_helper.rb
You can also run a particular test method from the test case by using the `-n` switch with the `test method name`.
```bash
$ ruby -Itest test/unit/post_test.rb -n test_the_truth
$ ruby -Itest test/models/post_test.rb -n test_the_truth
Loaded suite unit/post_test
Loaded suite models/post_test
Started
.
Finished in 0.023513 seconds.
......@@ -271,7 +271,7 @@ F
Finished in 0.102072 seconds.
1) Failure:
test_should_not_save_post_without_title(PostTest) [/test/unit/post_test.rb:6]:
test_should_not_save_post_without_title(PostTest) [/test/models/post_test.rb:6]:
<false> is not true.
1 tests, 1 assertions, 1 failures, 0 errors
......@@ -290,7 +290,7 @@ Running this test shows the friendlier assertion message:
```bash
1) Failure:
test_should_not_save_post_without_title(PostTest) [/test/unit/post_test.rb:6]:
test_should_not_save_post_without_title(PostTest) [/test/models/post_test.rb:6]:
Saved the post without a title.
<false> is not true.
```
......@@ -341,7 +341,7 @@ Finished in 0.082603 seconds.
1) Error:
test_should_report_error(PostTest):
NameError: undefined local variable or method `some_undefined_variable' for #<PostTest:0x249d354>
/test/unit/post_test.rb:6:in `test_should_report_error'
/test/models/post_test.rb:6:in `test_should_report_error'
1 tests, 0 assertions, 0 failures, 1 errors
```
......@@ -420,7 +420,7 @@ You should test for things such as:
* was the correct object stored in the response template?
* was the appropriate message displayed to the user in the view?
Now that we have used Rails scaffold generator for our `Post` resource, it has already created the controller code and functional tests. You can take look at the file `posts_controller_test.rb` in the `test/functional` directory.
Now that we have used Rails scaffold generator for our `Post` resource, it has already created the controller code and tests. You can take look at the file `posts_controller_test.rb` in the `test/controllers` directory.
Let me take you through one such test, `test_should_get_index` from the file `posts_controller_test.rb`.
......@@ -762,12 +762,16 @@ You don't need to set up and run your tests by hand on a test-by-test basis. Rai
| ------------------------------- | ----------- |
| `rake test` | Runs all unit, functional and integration tests. You can also simply run `rake` as the _test_ target is the default.|
| `rake test:benchmark` | Benchmark the performance tests|
| `rake test:functionals` | Runs all the functional tests from `test/functional`|
| `rake test:controllers` | Runs all the controller tests from `test/controllers`|
| `rake test:functionals` | Runs all the functional tests from `test/controllers`, `test/mailers`, and `test/functional`|
| `rake test:helpers` | Runs all the helper tests from `test/helpers`|
| `rake test:integration` | Runs all the integration tests from `test/integration`|
| `rake test:mailers` | Runs all the mailer tests from `test/mailers`|
| `rake test:models` | Runs all the model tests from `test/models`|
| `rake test:profile` | Profile the performance tests|
| `rake test:recent` | Tests recent changes|
| `rake test:uncommitted` | Runs all the tests which are uncommitted. Supports Subversion and Git|
| `rake test:units` | Runs all the unit tests from `test/unit`|
| `rake test:units` | Runs all the unit tests from `test/models`, `test/helpers`, and `test/unit`|
Brief Note About `Test::Unit`
......
## Rails 4.0.0 (unreleased) ##
* New test locations `test/models`, `test/helpers`, `test/controllers`, and
`test/mailers`. Corresponding rake tasks added as well. *Mike Moore*
* Set a different cache per environment for assets pipeline
through `config.assets.cache`.
*Guillermo Iguaran*
* `Rails.public_path` now returns a Pathname object. *Prem Sichanugrist*
* Remove highly uncommon `config.assets.manifest` option for moving the manifest path.
This option is now unsupported in sprockets-rails.
This option is now unsupported in sprockets-rails.
*Guillermo Iguaran & Dmitry Vorotilin*
......@@ -12,7 +20,7 @@
*Guillermo Iguaran*
* Remove `config.active_record.whitelist_attributes` and
* Remove `config.active_record.whitelist_attributes` and
`config.active_record.mass_assignment_sanitizer` from new applications since
MassAssignmentSecurity has been extracted from Rails.
......
......@@ -113,9 +113,11 @@ def script
def test
empty_directory_with_keep_file 'test/fixtures'
empty_directory_with_keep_file 'test/functional'
empty_directory_with_keep_file 'test/controllers'
empty_directory_with_keep_file 'test/mailers'
empty_directory_with_keep_file 'test/models'
empty_directory_with_keep_file 'test/helpers'
empty_directory_with_keep_file 'test/integration'
empty_directory_with_keep_file 'test/unit'
template 'test/performance/browsing_test.rb'
template 'test/test_helper.rb'
......
......@@ -5,7 +5,7 @@
// or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
//
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// the compiled file.
// compiled file.
//
// WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
// GO AFTER THE REQUIRES BELOW.
......
......@@ -23,14 +23,6 @@ class Application < Rails::Application
# Custom directories with classes and modules you want to be autoloadable.
# config.autoload_paths += %W(#{config.root}/extras)
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
# config.time_zone = 'Central Time (US & Canada)'
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
# config.i18n.default_locale = :de
# Configure sensitive parameters which will be filtered from the log file.
config.filter_parameters += [:password]
......
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
# Rails.application.config.time_zone = 'Central Time (US & Canada)'
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
# Rails.application.config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
# Rails.application.config.i18n.default_locale = :de
......@@ -12,7 +12,7 @@ Example:
`rails generate controller CreditCards open debit credit close`
CreditCards controller with URLs like /credit_cards/debit.
Controller: app/controllers/credit_cards_controller.rb
Functional Test: test/functional/credit_cards_controller_test.rb
Views: app/views/credit_cards/debit.html.erb [...]
Helper: app/helpers/credit_cards_helper.rb
Controller: app/controllers/credit_cards_controller.rb
Test: test/controllers/credit_cards_controller_test.rb
Views: app/views/credit_cards/debit.html.erb [...]
Helper: app/helpers/credit_cards_helper.rb
......@@ -13,5 +13,5 @@ Example:
Credit card helper.
Helper: app/helpers/credit_card_helper.rb
Test: test/unit/helpers/credit_card_helper_test.rb
Test: test/helpers/credit_card_helper_test.rb
......@@ -74,7 +74,7 @@ Examples:
For ActiveRecord and TestUnit it creates:
Model: app/models/account.rb
Test: test/unit/account_test.rb
Test: test/models/account_test.rb
Fixtures: test/fixtures/accounts.yml
Migration: db/migrate/XXX_add_accounts.rb
......@@ -88,7 +88,7 @@ Examples:
Module: app/models/admin.rb
Model: app/models/admin/account.rb
Test: test/unit/admin/account_test.rb
Test: test/models/admin/account_test.rb
Fixtures: test/fixtures/admin/accounts.yml
Migration: db/migrate/XXX_add_admin_accounts.rb
......@@ -9,4 +9,4 @@ Example:
For ActiveRecord and TestUnit it creates:
Observer: app/models/account_observer.rb
TestUnit: test/unit/account_observer_test.rb
TestUnit: test/models/account_observer_test.rb
......@@ -13,7 +13,7 @@ Example:
`rails generate scaffold_controller CreditCard`
Credit card controller with URLs like /credit_card/debit.
Controller: app/controllers/credit_cards_controller.rb
Functional Test: test/functional/credit_cards_controller_test.rb
Views: app/views/credit_cards/index.html.erb [...]
Helper: app/helpers/credit_cards_helper.rb
Controller: app/controllers/credit_cards_controller.rb
Test: test/controllers/credit_cards_controller_test.rb
Views: app/views/credit_cards/index.html.erb [...]
Helper: app/helpers/credit_cards_helper.rb
......@@ -8,7 +8,7 @@ class ControllerGenerator < Base
def create_test_files
template 'functional_test.rb',
File.join('test/functional', class_path, "#{file_name}_controller_test.rb")
File.join('test/controllers', class_path, "#{file_name}_controller_test.rb")
end
end
end
......
......@@ -6,7 +6,7 @@ class HelperGenerator < Base
check_class_collision :suffix => "HelperTest"
def create_helper_files
template 'helper_test.rb', File.join('test/unit/helpers', class_path, "#{file_name}_helper_test.rb")
template 'helper_test.rb', File.join('test/helpers', class_path, "#{file_name}_helper_test.rb")
end
end
end
......
......@@ -7,7 +7,7 @@ class MailerGenerator < Base
check_class_collision :suffix => "Test"
def create_test_files
template "functional_test.rb", File.join('test/functional', class_path, "#{file_name}_test.rb")
template "functional_test.rb", File.join('test/mailers', class_path, "#{file_name}_test.rb")
end
end
end
......
......@@ -9,7 +9,7 @@ class ModelGenerator < Base
check_class_collision :suffix => "Test"
def create_test_file
template 'unit_test.rb', File.join('test/unit', class_path, "#{file_name}_test.rb")
template 'unit_test.rb', File.join('test/models', class_path, "#{file_name}_test.rb")
end
hook_for :fixture_replacement
......
......@@ -6,7 +6,7 @@ class ObserverGenerator < Base
check_class_collision :suffix => "ObserverTest"
def create_test_files
template 'unit_test.rb', File.join('test/unit', class_path, "#{file_name}_observer_test.rb")
template 'unit_test.rb', File.join('test/models', class_path, "#{file_name}_observer_test.rb")
end
end
end
......
......@@ -12,7 +12,7 @@ class ScaffoldGenerator < Base
def create_test_files
template "functional_test.rb",
File.join("test/functional", controller_class_path, "#{controller_file_name}_controller_test.rb")
File.join("test/controllers", controller_class_path, "#{controller_file_name}_controller_test.rb")
end
private
......
......@@ -6,9 +6,13 @@ STATS_DIRECTORIES = [
%w(Javascripts app/assets/javascripts),
%w(Libraries lib/),
%w(APIs app/apis),
%w(Controller\ tests test/controllers),
%w(Helper\ tests test/helpers),
%w(Model\ tests test/models),
%w(Mailer\ tests test/mailers),
%w(Integration\ tests test/integration),
%w(Functional\ tests test/functional),
%w(Unit\ tests test/unit)
%w(Functional\ tests\ (old) test/functional),
%w(Unit\ tests \ (old) test/unit)
].collect { |name, dir| [ name, "#{Rails.root}/#{dir}" ] }.select { |name, dir| File.directory?(dir) }
desc "Report code statistics (KLOCs, etc) from the application"
......
......@@ -15,11 +15,11 @@ def recent_tests(source_pattern, test_path, touched_since = 10.minutes.ago)
# Support subdirs in app/models and app/controllers
modified_test_path = source_dir.length > 2 ? "#{test_path}/" << source_dir[1..source_dir.length].join('/') : test_path
# For modified files in app/ run the tests for it. ex. /test/functional/account_controller.rb
# For modified files in app/ run the tests for it. ex. /test/controllers/account_controller.rb
test = "#{modified_test_path}/#{source_file}_test.rb"
tests.push test if File.exist?(test)
# For modified files in app, run tests in subdirs too. ex. /test/functional/account/*_test.rb
# For modified files in app, run tests in subdirs too. ex. /test/controllers/account/*_test.rb
test = "#{modified_test_path}/#{File.basename(path, '.rb').sub("_controller","")}"
FileList["#{test}/*_test.rb"].each { |f| tests.push f } if File.exist?(test)
......@@ -74,7 +74,9 @@ namespace :test do
Rake::TestTask.new(:recent => "test:prepare") do |t|
since = TEST_CHANGES_SINCE
touched = FileList['test/**/*_test.rb'].select { |path| File.mtime(path) > since } +
recent_tests('app/models/**/*.rb', 'test/models', since) +
recent_tests('app/models/**/*.rb', 'test/unit', since) +
recent_tests('app/controllers/**/*.rb', 'test/controllers', since) +
recent_tests('app/controllers/**/*.rb', 'test/functional', since)
t.libs << 'test'
......@@ -95,8 +97,10 @@ namespace :test do
models = changed_since_checkin.select { |path| path =~ /app[\\\/]models[\\\/].*\.rb$/ }
controllers = changed_since_checkin.select { |path| path =~ /app[\\\/]controllers[\\\/].*\.rb$/ }
unit_tests = models.map { |model| "test/unit/#{File.basename(model, '.rb')}_test.rb" }
functional_tests = controllers.map { |controller| "test/functional/#{File.basename(controller, '.rb')}_test.rb" }
unit_tests = models.map { |model| "test/models/#{File.basename(model, '.rb')}_test.rb" } +
models.map { |model| "test/unit/#{File.basename(model, '.rb')}_test.rb" } +
functional_tests = controllers.map { |controller| "test/controllers/#{File.basename(controller, '.rb')}_test.rb" } +
controllers.map { |controller| "test/functional/#{File.basename(controller, '.rb')}_test.rb" }
(unit_tests + functional_tests).uniq.select { |file| File.exist?(file) }
end
......@@ -108,14 +112,34 @@ namespace :test do
t.libs << "test"
end
Rails::SubTestTask.new(:models => "test:prepare") do |t|
t.libs << "test"
t.pattern = 'test/models/**/*_test.rb'
end
Rails::SubTestTask.new(:helpers => "test:prepare") do |t|
t.libs << "test"
t.pattern = 'test/helpers/**/*_test.rb'
end
Rails::SubTestTask.new(:units => "test:prepare") do |t|
t.libs << "test"
t.pattern = 'test/unit/**/*_test.rb'
t.pattern = 'test/{models,helpers,unit}/**/*_test.rb'
end
Rails::SubTestTask.new(:controllers => "test:prepare") do |t|
t.libs << "test"
t.pattern = 'test/controllers/**/*_test.rb'
end
Rails::SubTestTask.new(:mailers => "test:prepare") do |t|
t.libs << "test"
t.pattern = 'test/mailers/**/*_test.rb'
end
Rails::SubTestTask.new(:functionals => "test:prepare") do |t|
t.libs << "test"
t.pattern = 'test/functional/**/*_test.rb'
t.pattern = 'test/{controllers,mailers,functional}/**/*_test.rb'
end
Rails::SubTestTask.new(:integration => "test:prepare") do |t|
......
......@@ -50,7 +50,7 @@ class ::PostsController < ActionController::Base ; end
end
test "assets aren't concatened when compile is true is on and debug_assets params is true" do
app_file "config/initializers/compile.rb", "Rails.application.config.assets.compile = true"
add_to_env_config "production", "config.assets.compile = true"
ENV["RAILS_ENV"] = "production"
require "#{app_path}/config/environment"
......
......@@ -396,21 +396,6 @@ class ::PostsController < ActionController::Base ; end
assert_no_match(/<script src="\/assets\/xmlhr-([0-z]+)\.js"><\/script>/, last_response.body)
end
test "assets aren't concatened when compile is true is on and debug_assets params is true" do
app_with_assets_in_view
add_to_env_config "production", "config.assets.compile = true"
add_to_env_config "production", "config.assets.allow_debugging = true"
ENV["RAILS_ENV"] = "production"
require "#{app_path}/config/environment"
class ::PostsController < ActionController::Base ; end
get '/posts?debug_assets=true'
assert_match(/<script src="\/assets\/application-([0-z]+)\.js\?body=1"><\/script>/, last_response.body)
assert_match(/<script src="\/assets\/xmlhr-([0-z]+)\.js\?body=1"><\/script>/, last_response.body)
end
test "assets can access model information when precompiling" do
app_file "app/models/post.rb", "class Post; end"
app_file "app/assets/javascripts/application.js", "//= require_tree ."
......
......@@ -86,12 +86,12 @@ def test_code_statistics_sanity
def test_rake_test_error_output
Dir.chdir(app_path){ `rake db:migrate` }
app_file "test/unit/one_unit_test.rb", <<-RUBY
raise 'unit'
app_file "test/models/one_model_test.rb", <<-RUBY
raise 'models'
RUBY
app_file "test/functional/one_functional_test.rb", <<-RUBY
raise 'functional'
app_file "test/controllers/one_controller_test.rb", <<-RUBY
raise 'controllers'
RUBY
app_file "test/integration/one_integration_test.rb", <<-RUBY
......@@ -100,8 +100,8 @@ def test_rake_test_error_output
silence_stderr do
output = Dir.chdir(app_path) { `rake test 2>&1` }
assert_match 'unit', output
assert_match 'functional', output
assert_match 'models', output
assert_match 'controllers', output
assert_match 'integration', output
end
end
......
......@@ -68,40 +68,40 @@ def test_console_defaults_to_IRB
def test_default_environment_with_no_rails_env
with_rails_env nil do
start
assert_match /\sdevelopment\s/, output
assert_match(/\sdevelopment\s/, output)
end
end
def test_default_environment_with_rails_env
with_rails_env 'special-production' do
start
assert_match /\sspecial-production\s/, output
assert_match(/\sspecial-production\s/, output)
end
end
def test_e_option
start ['-e', 'special-production']
assert_match /\sspecial-production\s/, output
assert_match(/\sspecial-production\s/, output)
end
def test_environment_option
start ['--environment=special-production']
assert_match /\sspecial-production\s/, output
assert_match(/\sspecial-production\s/, output)
end
def test_rails_env_is_production_when_first_argument_is_p
start ['p']
assert_match /\sproduction\s/, output
assert_match(/\sproduction\s/, output)
end
def test_rails_env_is_test_when_first_argument_is_t
start ['t']
assert_match /\stest\s/, output
assert_match(/\stest\s/, output)
end
def test_rails_env_is_development_when_argument_is_d
start ['d']
assert_match /\sdevelopment\s/, output
assert_match(/\sdevelopment\s/, output)
end
private
......
......@@ -26,10 +26,12 @@
log
script/rails
test/fixtures
test/functional
test/controllers
test/models
test/helpers
test/mailers
test/integration
test/performance
test/unit
vendor
vendor/assets
tmp/cache
......
......@@ -28,13 +28,13 @@ def test_check_class_collision
def test_invokes_helper
run_generator
assert_file "app/helpers/account_helper.rb"
assert_file "test/unit/helpers/account_helper_test.rb"
assert_file "test/helpers/account_helper_test.rb"
end
def test_does_not_invoke_helper_if_required
run_generator ["account", "--skip-helper"]
assert_no_file "app/helpers/account_helper.rb"
assert_no_file "test/unit/helpers/account_helper_test.rb"
assert_no_file "test/helpers/account_helper_test.rb"
end
def test_invokes_assets
......@@ -45,12 +45,12 @@ def test_invokes_assets
def test_invokes_default_test_framework
run_generator
assert_file "test/functional/account_controller_test.rb"
assert_file "test/controllers/account_controller_test.rb"
end
def test_does_not_invoke_test_framework_if_required
run_generator ["account", "--no-test-framework"]
assert_no_file "test/functional/account_controller_test.rb"
assert_no_file "test/controllers/account_controller_test.rb"
end
def test_invokes_default_template_engine
......
......@@ -15,7 +15,7 @@ def test_helper_skeleton_is_created
def test_invokes_default_test_framework
run_generator
assert_file "test/unit/helpers/admin_helper_test.rb", /class AdminHelperTest < ActionView::TestCase/
assert_file "test/helpers/admin_helper_test.rb", /class AdminHelperTest < ActionView::TestCase/
end
def test_logs_if_the_test_framework_cannot_be_found
......
......@@ -29,7 +29,7 @@ def test_check_class_collision
def test_invokes_default_test_framework
run_generator
assert_file "test/functional/notifier_test.rb" do |test|
assert_file "test/mailers/notifier_test.rb" do |test|
assert_match(/class NotifierTest < ActionMailer::TestCase/, test)
assert_match(/test "foo"/, test)
assert_match(/test "bar"/, test)
......
......@@ -157,7 +157,7 @@ def test_migration_with_missing_attribute_type_and_with_index
assert_match(/create_table :products/, up)
assert_match(/t\.string :name/, up)
assert_match(/t\.integer :supplier_id/, up)
assert_match(/add_index :products, :name/, up)
assert_match(/add_index :products, :supplier_id/, up)
assert_no_match(/add_index :products, :year/, up)
......@@ -181,7 +181,7 @@ def test_add_migration_with_attributes_index_declaration_and_attribute_options
assert_match(/add_index :products, :discount, unique: true/, content)
end
end
def test_migration_without_timestamps
ActiveRecord::Base.timestamped_migrations = false
run_generator ["account"]
......@@ -269,7 +269,7 @@ def test_existing_migration_is_removed_on_force
def test_invokes_default_test_framework
run_generator
assert_file "test/unit/account_test.rb", /class AccountTest < ActiveSupport::TestCase/
assert_file "test/models/account_test.rb", /class AccountTest < ActiveSupport::TestCase/
assert_file "test/fixtures/accounts.yml", /name: MyString/, /age: 1/
end
......
......@@ -25,7 +25,7 @@ def test_namespaced_controller_skeleton_is_created
/module TestApp/,
/ class AccountController < ApplicationController/
assert_file "test/functional/test_app/account_controller_test.rb",
assert_file "test/controllers/test_app/account_controller_test.rb",
/module TestApp/,
/ class AccountControllerTest/
end
......@@ -46,12 +46,12 @@ def test_namespaced_controller_with_additional_namespace
def test_helpr_is_also_namespaced
run_generator
assert_file "app/helpers/test_app/account_helper.rb", /module TestApp/, / module AccountHelper/
assert_file "test/unit/helpers/test_app/account_helper_test.rb", /module TestApp/, / class AccountHelperTest/
assert_file "test/helpers/test_app/account_helper_test.rb", /module TestApp/, / class AccountHelperTest/
end
def test_invokes_default_test_framework
run_generator
assert_file "test/functional/test_app/account_controller_test.rb"
assert_file "test/controllers/test_app/account_controller_test.rb"
end
def test_invokes_default_template_engine
......@@ -136,7 +136,7 @@ def test_migration_with_nested_namespace_without_pluralization
def test_invokes_default_test_framework
run_generator
assert_file "test/unit/test_app/account_test.rb", /module TestApp/, /class AccountTest < ActiveSupport::TestCase/
assert_file "test/models/test_app/account_test.rb", /module TestApp/, /class AccountTest < ActiveSupport::TestCase/
assert_file "test/fixtures/test_app/accounts.yml", /name: MyString/, /age: 1/
end
end
......@@ -158,7 +158,7 @@ def test_invokes_default_orm_with_class_path
def test_invokes_default_test_framework
run_generator
assert_file "test/unit/test_app/account_observer_test.rb", /module TestApp/, / class AccountObserverTest < ActiveSupport::TestCase/
assert_file "test/models/test_app/account_observer_test.rb", /module TestApp/, / class AccountObserverTest < ActiveSupport::TestCase/
end
end
......@@ -186,7 +186,7 @@ def test_mailer_with_i18n_helper
def test_invokes_default_test_framework
run_generator
assert_file "test/functional/test_app/notifier_test.rb" do |test|
assert_file "test/mailers/test_app/notifier_test.rb" do |test|
assert_match(/module TestApp/, test)
assert_match(/class NotifierTest < ActionMailer::TestCase/, test)
assert_match(/test "foo"/, test)
......@@ -225,7 +225,7 @@ def test_scaffold_on_invoke
# Model
assert_file "app/models/test_app/product_line.rb", /module TestApp\n class ProductLine < ActiveRecord::Base/
assert_file "test/unit/test_app/product_line_test.rb", /module TestApp\n class ProductLineTest < ActiveSupport::TestCase/
assert_file "test/models/test_app/product_line_test.rb", /module TestApp\n class ProductLineTest < ActiveSupport::TestCase/
assert_file "test/fixtures/test_app/product_lines.yml"
assert_migration "db/migrate/create_test_app_product_lines.rb"
......@@ -240,7 +240,7 @@ def test_scaffold_on_invoke
/module TestApp/,
/class ProductLinesController < ApplicationController/
assert_file "test/functional/test_app/product_lines_controller_test.rb",
assert_file "test/controllers/test_app/product_lines_controller_test.rb",
/module TestApp\n class ProductLinesControllerTest < ActionController::TestCase/
# Views
......@@ -255,7 +255,7 @@ def test_scaffold_on_invoke
# Helpers
assert_file "app/helpers/test_app/product_lines_helper.rb"
assert_file "test/unit/helpers/test_app/product_lines_helper_test.rb"
assert_file "test/helpers/test_app/product_lines_helper_test.rb"
# Stylesheets
assert_file "app/assets/stylesheets/scaffold.css"
......@@ -267,7 +267,7 @@ def test_scaffold_on_revoke
# Model
assert_no_file "app/models/test_app/product_line.rb"
assert_no_file "test/unit/test_app/product_line_test.rb"
assert_no_file "test/models/test_app/product_line_test.rb"
assert_no_file "test/fixtures/test_app/product_lines.yml"
assert_no_migration "db/migrate/create_test_app_product_lines.rb"
......@@ -278,7 +278,7 @@ def test_scaffold_on_revoke
# Controller
assert_no_file "app/controllers/test_app/product_lines_controller.rb"
assert_no_file "test/functional/test_app/product_lines_controller_test.rb"
assert_no_file "test/controllers/test_app/product_lines_controller_test.rb"
# Views
assert_no_file "app/views/test_app/product_lines"
......@@ -286,7 +286,7 @@ def test_scaffold_on_revoke
# Helpers
assert_no_file "app/helpers/test_app/product_lines_helper.rb"
assert_no_file "test/unit/helpers/test_app/product_lines_helper_test.rb"
assert_no_file "test/helpers/test_app/product_lines_helper_test.rb"
# Stylesheets (should not be removed)
assert_file "app/assets/stylesheets/scaffold.css"
......@@ -298,7 +298,7 @@ def test_scaffold_with_namespace_on_invoke
# Model
assert_file "app/models/test_app/admin.rb", /module TestApp\n module Admin/
assert_file "app/models/test_app/admin/role.rb", /module TestApp\n class Admin::Role < ActiveRecord::Base/
assert_file "test/unit/test_app/admin/role_test.rb", /module TestApp\n class Admin::RoleTest < ActiveSupport::TestCase/
assert_file "test/models/test_app/admin/role_test.rb", /module TestApp\n class Admin::RoleTest < ActiveSupport::TestCase/
assert_file "test/fixtures/test_app/admin/roles.yml"
assert_migration "db/migrate/create_test_app_admin_roles.rb"
......@@ -312,7 +312,7 @@ def test_scaffold_with_namespace_on_invoke
assert_match(/module TestApp\n class Admin::RolesController < ApplicationController/, content)
end
assert_file "test/functional/test_app/admin/roles_controller_test.rb",
assert_file "test/controllers/test_app/admin/roles_controller_test.rb",
/module TestApp\n class Admin::RolesControllerTest < ActionController::TestCase/
# Views
......@@ -327,7 +327,7 @@ def test_scaffold_with_namespace_on_invoke
# Helpers
assert_file "app/helpers/test_app/admin/roles_helper.rb"
assert_file "test/unit/helpers/test_app/admin/roles_helper_test.rb"
assert_file "test/helpers/test_app/admin/roles_helper_test.rb"
# Stylesheets
assert_file "app/assets/stylesheets/scaffold.css"
......@@ -340,7 +340,7 @@ def test_scaffold_with_namespace_on_revoke
# Model
assert_file "app/models/test_app/admin.rb" # ( should not be remove )
assert_no_file "app/models/test_app/admin/role.rb"
assert_no_file "test/unit/test_app/admin/role_test.rb"
assert_no_file "test/models/test_app/admin/role_test.rb"
assert_no_file "test/fixtures/test_app/admin/roles.yml"
assert_no_migration "db/migrate/create_test_app_admin_roles.rb"
......@@ -351,7 +351,7 @@ def test_scaffold_with_namespace_on_revoke
# Controller
assert_no_file "app/controllers/test_app/admin/roles_controller.rb"
assert_no_file "test/functional/test_app/admin/roles_controller_test.rb"
assert_no_file "test/controllers/test_app/admin/roles_controller_test.rb"
# Views
assert_no_file "app/views/test_app/admin/roles"
......@@ -359,19 +359,19 @@ def test_scaffold_with_namespace_on_revoke
# Helpers
assert_no_file "app/helpers/test_app/admin/roles_helper.rb"
assert_no_file "test/unit/helpers/test_app/admin/roles_helper_test.rb"
assert_no_file "test/helpers/test_app/admin/roles_helper_test.rb"
# Stylesheets (should not be removed)
assert_file "app/assets/stylesheets/scaffold.css"
end
def test_scaffold_with_nested_namespace_on_invoke
run_generator [ "admin/user/special/role", "name:string", "description:string" ]
# Model
assert_file "app/models/test_app/admin/user/special.rb", /module TestApp\n module Admin/
assert_file "app/models/test_app/admin/user/special/role.rb", /module TestApp\n class Admin::User::Special::Role < ActiveRecord::Base/
assert_file "test/unit/test_app/admin/user/special/role_test.rb", /module TestApp\n class Admin::User::Special::RoleTest < ActiveSupport::TestCase/
assert_file "test/models/test_app/admin/user/special/role_test.rb", /module TestApp\n class Admin::User::Special::RoleTest < ActiveSupport::TestCase/
assert_file "test/fixtures/test_app/admin/user/special/roles.yml"
assert_migration "db/migrate/create_test_app_admin_user_special_roles.rb"
......@@ -385,7 +385,7 @@ def test_scaffold_with_nested_namespace_on_invoke
assert_match(/module TestApp\n class Admin::User::Special::RolesController < ApplicationController/, content)
end
assert_file "test/functional/test_app/admin/user/special/roles_controller_test.rb",
assert_file "test/controllers/test_app/admin/user/special/roles_controller_test.rb",
/module TestApp\n class Admin::User::Special::RolesControllerTest < ActionController::TestCase/
# Views
......@@ -400,7 +400,7 @@ def test_scaffold_with_nested_namespace_on_invoke
# Helpers
assert_file "app/helpers/test_app/admin/user/special/roles_helper.rb"
assert_file "test/unit/helpers/test_app/admin/user/special/roles_helper_test.rb"
assert_file "test/helpers/test_app/admin/user/special/roles_helper_test.rb"
# Stylesheets
assert_file "app/assets/stylesheets/scaffold.css"
......@@ -413,7 +413,7 @@ def test_scaffold_with_nested_namespace_on_revoke
# Model
assert_file "app/models/test_app/admin/user/special.rb" # ( should not be remove )
assert_no_file "app/models/test_app/admin/user/special/role.rb"
assert_no_file "test/unit/test_app/admin/user/special/role_test.rb"
assert_no_file "test/models/test_app/admin/user/special/role_test.rb"
assert_no_file "test/fixtures/test_app/admin/user/special/roles.yml"
assert_no_migration "db/migrate/create_test_app_admin_user_special_roles.rb"
......@@ -424,14 +424,14 @@ def test_scaffold_with_nested_namespace_on_revoke
# Controller
assert_no_file "app/controllers/test_app/admin/user/special/roles_controller.rb"
assert_no_file "test/functional/test_app/admin/user/special/roles_controller_test.rb"
assert_no_file "test/controllers/test_app/admin/user/special/roles_controller_test.rb"
# Views
assert_no_file "app/views/test_app/admin/user/special/roles"
# Helpers
assert_no_file "app/helpers/test_app/admin/user/special/roles_helper.rb"
assert_no_file "test/unit/helpers/test_app/admin/user/special/roles_helper_test.rb"
assert_no_file "test/helpers/test_app/admin/user/special/roles_helper_test.rb"
# Stylesheets (should not be removed)
assert_file "app/assets/stylesheets/scaffold.css"
......
......@@ -17,7 +17,7 @@ def test_invokes_default_orm_with_class_path
def test_invokes_default_test_framework
run_generator
assert_file "test/unit/account_observer_test.rb", /class AccountObserverTest < ActiveSupport::TestCase/
assert_file "test/models/account_observer_test.rb", /class AccountObserverTest < ActiveSupport::TestCase/
end
def test_logs_if_the_test_framework_cannot_be_found
......
......@@ -18,7 +18,7 @@ def test_files_from_inherited_invocation
%w(
app/models/account.rb
test/unit/account_test.rb
test/models/account_test.rb
test/fixtures/accounts.yml
).each { |path| assert_file path }
......@@ -33,10 +33,10 @@ def test_inherited_invocations_with_attributes
def test_resource_controller_with_pluralized_class_name
run_generator
assert_file "app/controllers/accounts_controller.rb", /class AccountsController < ApplicationController/
assert_file "test/functional/accounts_controller_test.rb", /class AccountsControllerTest < ActionController::TestCase/
assert_file "test/controllers/accounts_controller_test.rb", /class AccountsControllerTest < ActionController::TestCase/
assert_file "app/helpers/accounts_helper.rb", /module AccountsHelper/
assert_file "test/unit/helpers/accounts_helper_test.rb", /class AccountsHelperTest < ActionView::TestCase/
assert_file "test/helpers/accounts_helper_test.rb", /class AccountsHelperTest < ActionView::TestCase/
end
def test_resource_controller_with_actions
......@@ -62,14 +62,14 @@ def test_resource_routes_are_added
def test_plural_names_are_singularized
content = run_generator ["accounts".freeze]
assert_file "app/models/account.rb", /class Account < ActiveRecord::Base/
assert_file "test/unit/account_test.rb", /class AccountTest/
assert_file "test/models/account_test.rb", /class AccountTest/
assert_match(/Plural version of the model detected, using singularized version. Override with --force-plural./, content)
end
def test_plural_names_can_be_forced
content = run_generator ["accounts", "--force-plural"]
assert_file "app/models/accounts.rb", /class Accounts < ActiveRecord::Base/
assert_file "test/unit/accounts_test.rb", /class AccountsTest/
assert_file "test/models/accounts_test.rb", /class AccountsTest/
assert_no_match(/Plural version of the model detected/, content)
end
......
......@@ -57,7 +57,7 @@ def test_controller_skeleton_is_created
def test_helper_are_invoked_with_a_pluralized_name
run_generator
assert_file "app/helpers/users_helper.rb", /module UsersHelper/
assert_file "test/unit/helpers/users_helper_test.rb", /class UsersHelperTest < ActionView::TestCase/
assert_file "test/helpers/users_helper_test.rb", /class UsersHelperTest < ActionView::TestCase/
end
def test_views_are_generated
......@@ -75,7 +75,7 @@ def test_views_are_generated
def test_functional_tests
run_generator
assert_file "test/functional/users_controller_test.rb" do |content|
assert_file "test/controllers/users_controller_test.rb" do |content|
assert_match(/class UsersControllerTest < ActionController::TestCase/, content)
assert_match(/test "should get index"/, content)
assert_match(/post :create, user: \{ age: @user.age, name: @user.name \}/, content)
......@@ -86,7 +86,7 @@ def test_functional_tests
def test_functional_tests_without_attributes
run_generator ["User"]
assert_file "test/functional/users_controller_test.rb" do |content|
assert_file "test/controllers/users_controller_test.rb" do |content|
assert_match(/class UsersControllerTest < ActionController::TestCase/, content)
assert_match(/test "should get index"/, content)
assert_match(/post :create, user: \{ \}/, content)
......@@ -97,7 +97,7 @@ def test_functional_tests_without_attributes
def test_skip_helper_if_required
run_generator ["User", "name:string", "age:integer", "--no-helper"]
assert_no_file "app/helpers/users_helper.rb"
assert_no_file "test/unit/helpers/users_helper_test.rb"
assert_no_file "test/helpers/users_helper_test.rb"
end
def test_skip_layout_if_required
......
......@@ -12,7 +12,7 @@ def test_scaffold_on_invoke
# Model
assert_file "app/models/product_line.rb", /class ProductLine < ActiveRecord::Base/
assert_file "test/unit/product_line_test.rb", /class ProductLineTest < ActiveSupport::TestCase/
assert_file "test/models/product_line_test.rb", /class ProductLineTest < ActiveSupport::TestCase/
assert_file "test/fixtures/product_lines.yml"
assert_migration "db/migrate/create_product_lines.rb", /belongs_to :product, index: true/
assert_migration "db/migrate/create_product_lines.rb", /references :user, index: true/
......@@ -60,7 +60,7 @@ def test_scaffold_on_invoke
end
end
assert_file "test/functional/product_lines_controller_test.rb" do |test|
assert_file "test/controllers/product_lines_controller_test.rb" do |test|
assert_match(/class ProductLinesControllerTest < ActionController::TestCase/, test)
assert_match(/post :create, product_line: \{ title: @product_line.title \}/, test)
assert_match(/put :update, id: @product_line, product_line: \{ title: @product_line.title \}/, test)
......@@ -78,7 +78,7 @@ def test_scaffold_on_invoke
# Helpers
assert_file "app/helpers/product_lines_helper.rb"
assert_file "test/unit/helpers/product_lines_helper_test.rb"
assert_file "test/helpers/product_lines_helper_test.rb"
# Assets
assert_file "app/assets/stylesheets/scaffold.css"
......@@ -89,7 +89,7 @@ def test_scaffold_on_invoke
def test_functional_tests_without_attributes
run_generator ["product_line"]
assert_file "test/functional/product_lines_controller_test.rb" do |content|
assert_file "test/controllers/product_lines_controller_test.rb" do |content|
assert_match(/class ProductLinesControllerTest < ActionController::TestCase/, content)
assert_match(/test "should get index"/, content)
assert_match(/post :create, product_line: \{ \}/, content)
......@@ -103,7 +103,7 @@ def test_scaffold_on_revoke
# Model
assert_no_file "app/models/product_line.rb"
assert_no_file "test/unit/product_line_test.rb"
assert_no_file "test/models/product_line_test.rb"
assert_no_file "test/fixtures/product_lines.yml"
assert_no_migration "db/migrate/create_product_lines.rb"
......@@ -114,7 +114,7 @@ def test_scaffold_on_revoke
# Controller
assert_no_file "app/controllers/product_lines_controller.rb"
assert_no_file "test/functional/product_lines_controller_test.rb"
assert_no_file "test/controllers/product_lines_controller_test.rb"
# Views
assert_no_file "app/views/product_lines"
......@@ -122,7 +122,7 @@ def test_scaffold_on_revoke
# Helpers
assert_no_file "app/helpers/product_lines_helper.rb"
assert_no_file "test/unit/helpers/product_lines_helper_test.rb"
assert_no_file "test/helpers/product_lines_helper_test.rb"
# Assets
assert_file "app/assets/stylesheets/scaffold.css", /:visited/
......@@ -136,7 +136,7 @@ def test_scaffold_with_namespace_on_invoke
# Model
assert_file "app/models/admin.rb", /module Admin/
assert_file "app/models/admin/role.rb", /class Admin::Role < ActiveRecord::Base/
assert_file "test/unit/admin/role_test.rb", /class Admin::RoleTest < ActiveSupport::TestCase/
assert_file "test/models/admin/role_test.rb", /class Admin::RoleTest < ActiveSupport::TestCase/
assert_file "test/fixtures/admin/roles.yml"
assert_migration "db/migrate/create_admin_roles.rb"
......@@ -183,7 +183,7 @@ def test_scaffold_with_namespace_on_invoke
end
end
assert_file "test/functional/admin/roles_controller_test.rb",
assert_file "test/controllers/admin/roles_controller_test.rb",
/class Admin::RolesControllerTest < ActionController::TestCase/
# Views
......@@ -198,7 +198,7 @@ def test_scaffold_with_namespace_on_invoke
# Helpers
assert_file "app/helpers/admin/roles_helper.rb"
assert_file "test/unit/helpers/admin/roles_helper_test.rb"
assert_file "test/helpers/admin/roles_helper_test.rb"
# Assets
assert_file "app/assets/stylesheets/scaffold.css", /:visited/
......@@ -213,7 +213,7 @@ def test_scaffold_with_namespace_on_revoke
# Model
assert_file "app/models/admin.rb" # ( should not be remove )
assert_no_file "app/models/admin/role.rb"
assert_no_file "test/unit/admin/role_test.rb"
assert_no_file "test/models/admin/role_test.rb"
assert_no_file "test/fixtures/admin/roles.yml"
assert_no_migration "db/migrate/create_admin_roles.rb"
......@@ -224,7 +224,7 @@ def test_scaffold_with_namespace_on_revoke
# Controller
assert_no_file "app/controllers/admin/roles_controller.rb"
assert_no_file "test/functional/admin/roles_controller_test.rb"
assert_no_file "test/controllers/admin/roles_controller_test.rb"
# Views
assert_no_file "app/views/admin/roles"
......@@ -232,7 +232,7 @@ def test_scaffold_with_namespace_on_revoke
# Helpers
assert_no_file "app/helpers/admin/roles_helper.rb"
assert_no_file "test/unit/helpers/admin/roles_helper_test.rb"
assert_no_file "test/helpers/admin/roles_helper_test.rb"
# Assets
assert_file "app/assets/stylesheets/scaffold.css"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册