aboutsummaryrefslogblamecommitdiffstats
path: root/railties/test/generators_test.rb
blob: 33cc27bd84200be49e2565fcb489c8f6fead88be (plain) (tree)
1
2
3
4
5
6
7
8
9
                                           

                                                    

               

                                                  
 
           





                                               

     
                        
                                                                             



                                                                              









                                                                                     






                                                                               

                                                                           


                                                
                                    
                                                                                           
                                                                    

     



                                                              




                                                               
                                               




                                                                        
                                                   

     
                                                   




                                                         
                                         

                                                                         
                                                         

     

                                                        
                
                                                 

     

                                                                               

     



                                                                             

     

                                                         


                                                  
                                     


                                                   





                                                       

     





                                                     
 



                                                                     
                                                    

     



                                                                             
                                                    

     





                                                                              



                                                                              
     



                                                                      



                                                 
 
                                                              

                                              
     
 






                                                                                 

















                                                                                              
                                                     

                                                                                            
     
   
require 'generators/generators_test_helper'
require 'generators/rails/model/model_generator'
require 'generators/test_unit/model/model_generator'
require 'mocha'

class GeneratorsTest < Rails::Generators::TestCase
  include GeneratorsTestHelper

  def setup
    @path = File.expand_path("lib", Rails.root)
    $LOAD_PATH.unshift(@path)
  end

  def teardown
    $LOAD_PATH.delete(@path)
  end

  def test_simple_invoke
    assert File.exists?(File.join(@path, 'generators', 'model_generator.rb'))
    TestUnit::Generators::ModelGenerator.expects(:start).with(["Account"], {})
    Rails::Generators.invoke("test_unit:model", ["Account"])
  end

  def test_invoke_when_generator_is_not_found
    output = capture(:stdout){ Rails::Generators.invoke :unknown }
    assert_equal "Could not find generator unknown.\n", output
  end

  def test_help_when_a_generator_with_required_arguments_is_invoked_without_arguments
    output = capture(:stdout){ Rails::Generators.invoke :model, [] }
    assert_match /Description:/, output
  end

  def test_should_give_higher_preference_to_rails_generators
    assert File.exists?(File.join(@path, 'generators', 'model_generator.rb'))
    Rails::Generators::ModelGenerator.expects(:start).with(["Account"], {})
    warnings = capture(:stderr){ Rails::Generators.invoke :model, ["Account"] }
    assert warnings.empty?
  end

  def test_invoke_with_default_values
    Rails::Generators::ModelGenerator.expects(:start).with(["Account"], {})
    Rails::Generators.invoke :model, ["Account"]
  end

  def test_invoke_with_config_values
    Rails::Generators::ModelGenerator.expects(:start).with(["Account"], :behavior => :skip)
    Rails::Generators.invoke :model, ["Account"], :behavior => :skip
  end

  def test_find_by_namespace
    klass = Rails::Generators.find_by_namespace("rails:model")
    assert klass
    assert_equal "rails:model", klass.namespace
  end

  def test_find_by_namespace_with_base
    klass = Rails::Generators.find_by_namespace(:model, :rails)
    assert klass
    assert_equal "rails:model", klass.namespace
  end

  def test_find_by_namespace_with_context
    klass = Rails::Generators.find_by_namespace(:test_unit, nil, :model)
    assert klass
    assert_equal "test_unit:model", klass.namespace
  end

  def test_find_by_namespace_with_generator_on_root
    klass = Rails::Generators.find_by_namespace(:fixjour)
    assert klass
    assert_equal "fixjour", klass.namespace
  end

  def test_find_by_namespace_in_subfolder
    klass = Rails::Generators.find_by_namespace(:fixjour, :active_record)
    assert klass
    assert_equal "active_record:fixjour", klass.namespace
  end

  def test_find_by_namespace_with_duplicated_name
    klass = Rails::Generators.find_by_namespace(:foobar)
    assert klass
    assert_equal "foobar:foobar", klass.namespace
  end

  def test_find_by_namespace_without_base_or_context_looks_into_rails_namespace
    assert Rails::Generators.find_by_namespace(:model)
  end

  def test_find_by_namespace_show_warning_if_generator_cant_be_loaded
    output = capture(:stderr) { Rails::Generators.find_by_namespace(:wrong) }
    assert_match /\[WARNING\] Could not load generator/, output
    assert_match /Rails 2\.x generator/, output
  end

  def test_rails_generators_help_with_builtin_information
    output = capture(:stdout){ Rails::Generators.help }
    assert_match /Rails:/, output
    assert_match /^  model$/, output
    assert_match /^  scaffold_controller$/, output
    assert_no_match /^  app$/, output
  end

  def test_rails_generators_with_others_information
    output = capture(:stdout){ Rails::Generators.help }
    assert_match /ActiveRecord:/, output
    assert_match /Fixjour:/, output
    assert_match /^  active_record:model$/, output
    assert_match /^  active_record:fixjour$/, output
    assert_match /^  fixjour$/, output
  end

  def test_no_color_sets_proper_shell
    Rails::Generators.no_color!
    assert_equal Thor::Shell::Basic, Thor::Base.shell
  ensure
    Thor::Base.shell = Thor::Shell::Color
  end

  def test_fallbacks_for_generators_on_find_by_namespace
    Rails::Generators.fallbacks[:remarkable] = :test_unit
    klass = Rails::Generators.find_by_namespace(:plugin, :remarkable)
    assert klass
    assert_equal "test_unit:plugin", klass.namespace
  end

  def test_fallbacks_for_generators_on_find_by_namespace_with_context
    Rails::Generators.fallbacks[:remarkable] = :test_unit
    klass = Rails::Generators.find_by_namespace(:remarkable, :rails, :plugin)
    assert klass
    assert_equal "test_unit:plugin", klass.namespace
  end

  def test_fallbacks_for_generators_on_invoke
    Rails::Generators.fallbacks[:shoulda] = :test_unit
    TestUnit::Generators::ModelGenerator.expects(:start).with(["Account"], {})
    Rails::Generators.invoke "shoulda:model", ["Account"]
  end

  def test_nested_fallbacks_for_generators
    Rails::Generators.fallbacks[:super_shoulda] = :shoulda
    TestUnit::Generators::ModelGenerator.expects(:start).with(["Account"], {})
    Rails::Generators.invoke "super_shoulda:model", ["Account"]
  end

  def test_developer_options_are_overwriten_by_user_options
    Rails::Generators.options[:new_generator] = { :generate => false }

    klass = Class.new(Rails::Generators::Base) do
      def self.name() 'NewGenerator' end
      class_option :generate, :default => true
    end

    assert_equal false, klass.class_options[:generate].default
  ensure
    Rails::Generators.subclasses.delete(klass)
  end

  def test_load_generators_from_railties
    Rails::Generators::ModelGenerator.expects(:start).with(["Account"], {})
    Rails::Generators.send(:remove_instance_variable, :@generators_from_railties)
    Rails.application.expects(:load_generators)
    Rails::Generators.invoke("model", ["Account"])
  end

  def test_rails_root_templates
    template = File.join(Rails.root, "lib", "templates", "active_record", "model", "model.rb")

    # Create template
    mkdir_p(File.dirname(template))
    File.open(template, 'w'){ |f| f.write "empty" }

    output = capture(:stdout) do
      Rails::Generators.invoke :model, ["user"], :destination_root => destination_root
    end

    assert_file "app/models/user.rb" do |content|
      assert_equal "empty", content
    end
  ensure
    rm_rf File.dirname(template)
  end

  def test_source_paths_for_not_namespaced_generators
    mspec = Rails::Generators.find_by_namespace :fixjour
    assert mspec.source_paths.include?(File.join(Rails.root, "lib", "templates", "fixjour"))
  end
end