Skip to content
This repository
tree: fff3e75e1c
Fetching contributors…

Cannot retrieve contributors at this time

file 159 lines (132 sloc) 6.11 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
require 'generators/generators_test_helper'
require 'rails/generators/rails/migration/migration_generator'

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

  def test_migration
    migration = "change_title_body_from_posts"
    run_generator [migration]
    assert_migration "db/migrate/#{migration}.rb", /class ChangeTitleBodyFromPosts < ActiveRecord::Migration/
  end

  def test_migrations_generated_simultaneously
    migrations = ["change_title_body_from_posts", "change_email_from_comments"]

    first_migration_number, second_migration_number = migrations.collect do |migration|
      run_generator [migration]
      file_name = migration_file_name "db/migrate/#{migration}.rb"

      File.basename(file_name).split('_').first
    end

    assert_not_equal first_migration_number, second_migration_number
  end

  def test_migration_with_class_name
    migration = "ChangeTitleBodyFromPosts"
    run_generator [migration]
    assert_migration "db/migrate/change_title_body_from_posts.rb", /class #{migration} < ActiveRecord::Migration/
  end

  def test_add_migration_with_attributes
    migration = "add_title_body_to_posts"
    run_generator [migration, "title:string", "body:text"]

    assert_migration "db/migrate/#{migration}.rb" do |content|
      assert_method :change, content do |up|
        assert_match(/add_column :posts, :title, :string/, up)
        assert_match(/add_column :posts, :body, :text/, up)
      end
    end
  end

  def test_remove_migration_with_indexed_attribute
    migration = "remove_title_body_from_posts"
    run_generator [migration, "title:string:index", "body:text"]

    assert_migration "db/migrate/#{migration}.rb" do |content|
      assert_method :up, content do |up|
        assert_match(/remove_column :posts, :title/, up)
        assert_match(/remove_column :posts, :body/, up)
      end

      assert_method :down, content do |down|
        assert_match(/add_column :posts, :title, :string/, down)
        assert_match(/add_column :posts, :body, :text/, down)
        assert_match(/add_index :posts, :title/, down)
      end
    end
  end

  def test_remove_migration_with_attributes
    migration = "remove_title_body_from_posts"
    run_generator [migration, "title:string", "body:text"]

    assert_migration "db/migrate/#{migration}.rb" do |content|
      assert_method :up, content do |up|
        assert_match(/remove_column :posts, :title/, up)
        assert_match(/remove_column :posts, :body/, up)
      end

      assert_method :down, content do |down|
        assert_match(/add_column :posts, :title, :string/, down)
        assert_match(/add_column :posts, :body, :text/, down)
      end
    end
  end

  def test_add_migration_with_attributes_and_indices
    migration = "add_title_with_index_and_body_to_posts"
    run_generator [migration, "title:string:index", "body:text", "user_id:integer:uniq"]

    assert_migration "db/migrate/#{migration}.rb" do |content|
      assert_method :change, content do |up|
        assert_match(/add_column :posts, :title, :string/, up)
        assert_match(/add_column :posts, :body, :text/, up)
        assert_match(/add_column :posts, :user_id, :integer/, up)
      end
      assert_match(/add_index :posts, :title/, content)
      assert_match(/add_index :posts, :user_id, unique: true/, content)
    end
  end

  def test_add_migration_with_attributes_and_wrong_index_declaration
    migration = "add_title_and_content_to_books"
    run_generator [migration, "title:string:inex", "content:text", "user_id:integer:unik"]

    assert_migration "db/migrate/#{migration}.rb" do |content|
      assert_method :change, content do |up|
        assert_match(/add_column :books, :title, :string/, up)
        assert_match(/add_column :books, :content, :text/, up)
        assert_match(/add_column :books, :user_id, :integer/, up)
      end
      assert_no_match(/add_index :books, :title/, content)
      assert_no_match(/add_index :books, :user_id/, content)
    end
  end

  def test_add_migration_with_attributes_without_type_and_index
    migration = "add_title_with_index_and_body_to_posts"
    run_generator [migration, "title:index", "body:text", "user_uuid:uniq"]

    assert_migration "db/migrate/#{migration}.rb" do |content|
      assert_method :change, content do |up|
        assert_match(/add_column :posts, :title, :string/, up)
        assert_match(/add_column :posts, :body, :text/, up)
        assert_match(/add_column :posts, :user_uuid, :string/, up)
      end
      assert_match(/add_index :posts, :title/, content)
      assert_match(/add_index :posts, :user_uuid, unique: true/, content)
    end
  end

  def test_add_migration_with_attributes_index_declaration_and_attribute_options
    migration = "add_title_and_content_to_books"
    run_generator [migration, "title:string{40}:index", "content:string{255}", "price:decimal{1,2}:index", "discount:decimal{3.4}:uniq"]

    assert_migration "db/migrate/#{migration}.rb" do |content|
      assert_method :change, content do |up|
        assert_match(/add_column :books, :title, :string, limit: 40/, up)
        assert_match(/add_column :books, :content, :string, limit: 255/, up)
        assert_match(/add_column :books, :price, :decimal, precision: 1, scale: 2/, up)
        assert_match(/add_column :books, :discount, :decimal, precision: 3, scale: 4/, up)
      end
      assert_match(/add_index :books, :title/, content)
      assert_match(/add_index :books, :price/, content)
      assert_match(/add_index :books, :discount, unique: true/, content)
    end
  end

  def test_should_create_empty_migrations_if_name_not_start_with_add_or_remove
    migration = "create_books"
    run_generator [migration, "title:string", "content:text"]

    assert_migration "db/migrate/#{migration}.rb" do |content|
      assert_method :up, content do |up|
        assert_match(/^\s*$/, up)
      end

      assert_method :down, content do |down|
        assert_match(/^\s*$/, down)
      end
    end
  end

  def test_properly_identifies_usage_file
    assert generator_class.send(:usage_path)
  end
end
Something went wrong with that request. Please try again.