From 7a47f362c8246c20437f49111e5dcc0781d6d024 Mon Sep 17 00:00:00 2001
From: Dmitrii Samoilov <e2718281828@ya.ru>
Date: Wed, 17 Aug 2011 12:16:04 +0300
Subject: added ability to specify from cli when generating a model/migration
 whether particular property should be an index like this 'rails g model
 person name:string:index profile:string'

---
 .../test/generators/generated_attribute_test.rb    |  2 +-
 .../test/generators/migration_generator_test.rb    | 62 ++++++++++++++++++++
 railties/test/generators/model_generator_test.rb   | 68 ++++++++++++++++++++++
 3 files changed, 131 insertions(+), 1 deletion(-)

(limited to 'railties/test')

diff --git a/railties/test/generators/generated_attribute_test.rb b/railties/test/generators/generated_attribute_test.rb
index a85829085c..ea6c6e4e2c 100644
--- a/railties/test/generators/generated_attribute_test.rb
+++ b/railties/test/generators/generated_attribute_test.rb
@@ -69,7 +69,7 @@ class GeneratedAttributeTest < Rails::Generators::TestCase
   end
 
   def test_default_value_for_type
-    att = Rails::Generators::GeneratedAttribute.new("type", "string")
+    att = Rails::Generators::GeneratedAttribute.new("type:string")
     assert_equal("", att.default)
   end
 
diff --git a/railties/test/generators/migration_generator_test.rb b/railties/test/generators/migration_generator_test.rb
index 337257df7d..6b6c9dee7c 100644
--- a/railties/test/generators/migration_generator_test.rb
+++ b/railties/test/generators/migration_generator_test.rb
@@ -58,6 +58,68 @@ class MigrationGeneratorTest < Rails::Generators::TestCase
     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:unique"]
+
+    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_not_match(/add_index :books, :title/, content)
+      assert_not_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{5,2}:index", "discount:decimal{3,2}: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=>5, :scale=>2/, up)
+        assert_match(/add_column :books, :discount, :decimal, :precision=>3, :scale=>2/, 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"]
diff --git a/railties/test/generators/model_generator_test.rb b/railties/test/generators/model_generator_test.rb
index 1b0cb425c6..7a8cf1d8a7 100644
--- a/railties/test/generators/model_generator_test.rb
+++ b/railties/test/generators/model_generator_test.rb
@@ -113,6 +113,74 @@ class ModelGeneratorTest < Rails::Generators::TestCase
     end
   end
 
+  def test_migration_with_attributes_and_with_index
+    run_generator ["product", "name:string:index", "supplier_id:integer:index", "user_id:integer:uniq", "order_id:unique"]
+
+    assert_migration "db/migrate/create_products.rb" do |m|
+      assert_method :change, m do |up|
+        assert_match(/create_table :products/, up)
+        assert_match(/t\.string :name/, up)
+        assert_match(/t\.integer :supplier_id/, up)
+        assert_match(/t\.integer :user_id/, up)
+        assert_match(/t\.string :order_id/, up)
+
+        assert_match(/add_index :products, :name/, up)
+        assert_match(/add_index :products, :supplier_id/, up)
+        assert_match(/add_index :products, :user_id, :unique => true/, up)
+        assert_match(/add_index :products, :order_id, :unique => true/, up)
+      end
+    end
+  end
+
+  def test_migration_with_attributes_and_with_wrong_index_declaration
+    run_generator ["product", "name:string", "supplier_id:integer:inex", "user_id:integer:unqu"]
+
+    assert_migration "db/migrate/create_products.rb" do |m|
+      assert_method :change, m do |up|
+        assert_match(/create_table :products/, up)
+        assert_match(/t\.string :name/, up)
+        assert_match(/t\.integer :supplier_id/, up)
+        assert_match(/t\.integer :user_id/, up)
+
+        assert_not_match(/add_index :products, :name/, up)
+        assert_not_match(/add_index :products, :supplier_id/, up)
+        assert_not_match(/add_index :products, :user_id/, up)
+      end
+    end
+  end
+
+  def test_migration_with_missing_attribute_type_and_with_index
+    run_generator ["product", "name:index", "supplier_id:integer:index", "year:integer"]
+
+    assert_migration "db/migrate/create_products.rb" do |m|
+      assert_method :change, m do |up|
+        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_not_match(/add_index :products, :year/, up)
+      end
+    end
+  end
+
+  def test_add_migration_with_attributes_index_declaration_and_attribute_options
+    run_generator ["product", "title:string{40}:index", "content:string{255}", "price:decimal{5,2}:index", "discount:decimal{5,2}:uniq"]
+
+    assert_migration "db/migrate/create_products.rb" do |content|
+      assert_method :change, content do |up|
+        assert_match(/create_table :products/, up)
+        assert_match(/t.string :title, :limit=>40/, up)
+        assert_match(/t.string :content, :limit=>255/, up)
+        assert_match(/t.decimal :price, :precision=>5, :scale=>2/, up)
+      end
+      assert_match(/add_index :products, :title/, content)
+      assert_match(/add_index :products, :price/, content)
+      assert_match(/add_index :products, :discount, :unique => true/, content)
+    end
+  end
+  
   def test_migration_without_timestamps
     ActiveRecord::Base.timestamped_migrations = false
     run_generator ["account"]
-- 
cgit v1.2.3