From c972b25df56e12a995774aa0291b2d8c2f3eabb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Wed, 1 Jul 2009 22:06:05 +0200 Subject: [PATCH] Tests for scaffold generator. --- .../erb/scaffold/scaffold_generator.rb | 4 + .../rails/plugin/plugin_generator.rb | 12 +- .../stylesheets/stylesheets_generator.rb | 2 +- .../test/generators/plugin_generator_test.rb | 9 +- .../generators/scaffold_generator_test.rb | 143 ++++++++++++++++++ .../generators/stylesheets_generator_test.rb | 10 +- 6 files changed, 174 insertions(+), 6 deletions(-) create mode 100644 railties/test/generators/scaffold_generator_test.rb diff --git a/railties/lib/generators/erb/scaffold/scaffold_generator.rb b/railties/lib/generators/erb/scaffold/scaffold_generator.rb index 618742dde6..1841124ae4 100644 --- a/railties/lib/generators/erb/scaffold/scaffold_generator.rb +++ b/railties/lib/generators/erb/scaffold/scaffold_generator.rb @@ -10,6 +10,10 @@ module Erb class_option :singleton, :type => :boolean, :desc => "Supply to skip index action" class_option :layout, :type => :boolean + def create_root_folder + empty_directory File.join("app/views", controller_file_path) + end + def copy_index_file return if options[:singleton] copy_view :index diff --git a/railties/lib/generators/rails/plugin/plugin_generator.rb b/railties/lib/generators/rails/plugin/plugin_generator.rb index c2583ee147..ec563be805 100644 --- a/railties/lib/generators/rails/plugin/plugin_generator.rb +++ b/railties/lib/generators/rails/plugin/plugin_generator.rb @@ -11,7 +11,7 @@ module Rails def create_root self.root = File.expand_path("vendor/plugins/#{file_name}", root) - empty_directory '.' + empty_directory '.' if behavior == :invoke FileUtils.cd(root) end @@ -36,6 +36,16 @@ module Rails return unless options[:with_generator] directory 'generators' end + + # Work around for generator to work on revoke. If we remove the root + # folder at the beginning, it will raise an error since FileUtils.cd + # will move to a non-existent folder. + # + def remove_on_revoke + return unless behavior == :revoke + FileUtils.cd("../../..") + empty_directory "vendor/plugins/#{file_name}" + end end end end diff --git a/railties/lib/generators/rails/stylesheets/stylesheets_generator.rb b/railties/lib/generators/rails/stylesheets/stylesheets_generator.rb index 256b9a208f..ce68443c39 100644 --- a/railties/lib/generators/rails/stylesheets/stylesheets_generator.rb +++ b/railties/lib/generators/rails/stylesheets/stylesheets_generator.rb @@ -2,7 +2,7 @@ module Rails module Generators class StylesheetsGenerator < Base def copy_stylesheets_file - copy_file "scaffold.css", "public/stylesheets/scaffold.css" + template "scaffold.css", "public/stylesheets/scaffold.css" if behavior == :invoke end end end diff --git a/railties/test/generators/plugin_generator_test.rb b/railties/test/generators/plugin_generator_test.rb index 3388b2f6f5..f9adf6ea14 100644 --- a/railties/test/generators/plugin_generator_test.rb +++ b/railties/test/generators/plugin_generator_test.rb @@ -44,10 +44,15 @@ class PluginGeneratorTest < GeneratorsTestCase assert_file "vendor/plugins/plugin_fu/generators/plugin_fu/plugin_fu_generator.rb", flag end + def test_plugin_generator_on_revoke + run_generator + run_generator ["plugin_fu"], :behavior => :revoke + end + protected - def run_generator(args=["plugin_fu"]) - silence(:stdout) { Rails::Generators::PluginGenerator.start args, :root => destination_root } + def run_generator(args=["plugin_fu"], config={}) + silence(:stdout) { Rails::Generators::PluginGenerator.start args, config.merge(:root => destination_root) } end end diff --git a/railties/test/generators/scaffold_generator_test.rb b/railties/test/generators/scaffold_generator_test.rb new file mode 100644 index 0000000000..85c039a9cb --- /dev/null +++ b/railties/test/generators/scaffold_generator_test.rb @@ -0,0 +1,143 @@ +require 'abstract_unit' +require 'generators/generators_test_helper' +require 'generators/active_record' +require 'generators/rails/scaffold/scaffold_generator' +require 'generators/rails/stylesheets/stylesheets_generator' + +# Model +require 'generators/active_record/model/model_generator' +require 'generators/rails/model/model_generator' +require 'generators/test_unit/model/model_generator' + +# Controller +require 'generators/erb/scaffold/scaffold_generator' +require 'generators/rails/scaffold_controller/scaffold_controller_generator' +require 'generators/rails/helper/helper_generator' +require 'generators/test_unit/scaffold/scaffold_generator' +require 'generators/test_unit/helper/helper_generator' + +class ScaffoldGeneratorTest < GeneratorsTestCase + + def setup + super + routes = Rails::Generators::ResourceGenerator.source_root + routes = File.join(routes, "..", "..", "app", "templates", "config", "routes.rb") + destination = File.join(destination_root, "config") + + FileUtils.mkdir_p(destination) + FileUtils.cp File.expand_path(routes), destination + end + + def test_scaffold_on_invoke + run_generator + + # 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/fixtures/product_lines.yml" + assert_migration "db/migrate/create_product_lines.rb" + + # Route + assert_file "config/routes.rb" do |route| + assert_match /map\.resources :product_lines$/, route + end + + # Controller + assert_file "app/controllers/product_lines_controller.rb" do |content| + assert_match /class ProductLinesController < ApplicationController/, content + + assert_instance_method content, :index do |m| + assert_match /@product_lines = ProductLine\.all/, m + end + + assert_instance_method content, :show do |m| + assert_match /@product_line = ProductLine\.find\(params\[:id\]\)/, m + end + + assert_instance_method content, :new do |m| + assert_match /@product_line = ProductLine\.new/, m + end + + assert_instance_method content, :edit do |m| + assert_match /@product_line = ProductLine\.find\(params\[:id\]\)/, m + end + + assert_instance_method content, :create do |m| + assert_match /@product_line = ProductLine\.new\(params\[:product_line\]\)/, m + assert_match /@product_line\.save/, m + assert_match /@product_line\.errors/, m + end + + assert_instance_method content, :update do |m| + assert_match /@product_line = ProductLine\.find\(params\[:id\]\)/, m + assert_match /@product_line\.update_attributes\(params\[:product_line\]\)/, m + assert_match /@product_line\.errors/, m + end + + assert_instance_method content, :destroy do |m| + assert_match /@product_line = ProductLine\.find\(params\[:id\]\)/, m + assert_match /@product_line\.destroy/, m + end + end + + assert_file "test/functional/product_lines_controller_test.rb", + /class ProductLinesControllerTest < ActionController::TestCase/ + + # Views + %w( + index + edit + new + show + ).each { |view| assert_file "app/views/product_lines/#{view}.html.erb" } + assert_file "app/views/layouts/product_lines.html.erb" + + # Helpers + assert_file "app/helpers/product_lines_helper.rb" + assert_file "test/unit/helpers/product_lines_helper_test.rb" + + # Stylesheets + assert_file "public/stylesheets/scaffold.css" + end + + def test_scaffold_on_revoke + run_generator + run_generator :behavior => :revoke + + # Model + assert_no_file "app/models/product_line.rb" + assert_no_file "test/unit/product_line_test.rb" + assert_no_file "test/fixtures/product_lines.yml" + assert_no_migration "db/migrate/create_product_lines.rb" + + # Route + assert_file "config/routes.rb" do |route| + assert_no_match /map\.resources :product_lines$/, route + end + + # Controller + assert_no_file "app/controllers/product_lines_controller.rb" + assert_no_file "test/functional/product_lines_controller_test.rb" + + # Views + assert_no_file "app/views/product_lines" + assert_no_file "app/views/layouts/product_lines.html.erb" + + # Helpers + assert_no_file "app/helpers/product_lines_helper.rb" + assert_no_file "test/unit/helpers/product_lines_helper_test.rb" + + # Stylesheets (should not be removed) + assert_file "public/stylesheets/scaffold.css" + end + + protected + + def run_generator(config={}) + silence(:stdout) do + Rails::Generators::ScaffoldGenerator.start ["product_line", "title:string", "price:integer"], + config.merge(:root => destination_root) + end + end + +end diff --git a/railties/test/generators/stylesheets_generator_test.rb b/railties/test/generators/stylesheets_generator_test.rb index 89bcbc87a3..e2cddedf1a 100644 --- a/railties/test/generators/stylesheets_generator_test.rb +++ b/railties/test/generators/stylesheets_generator_test.rb @@ -9,10 +9,16 @@ class StylesheetsGeneratorTest < GeneratorsTestCase assert_file "public/stylesheets/scaffold.css" end + def test_stylesheets_are_not_deleted_on_revoke + run_generator + run_generator :behavior => :revoke + assert_file "public/stylesheets/scaffold.css" + end + protected - def run_generator(args=[]) - silence(:stdout) { Rails::Generators::StylesheetsGenerator.start args, :root => destination_root } + def run_generator(config={}) + silence(:stdout) { Rails::Generators::StylesheetsGenerator.start [], config.merge(:root => destination_root) } end end