diff --git a/test/command_checker/add_reference_test.rb b/test/command_checker/add_reference_test.rb index 2db919f..5f1d4e7 100644 --- a/test/command_checker/add_reference_test.rb +++ b/test/command_checker/add_reference_test.rb @@ -138,6 +138,30 @@ def test_add_reference_foreign_key_no_validate assert_safe AddReferenceForeignKeyNoValidate end + def test_add_reference_foreign_key_no_validate_is_not_idempotent + assert_empty @connection.foreign_keys(:projects) + + migrate AddReferenceForeignKeyNoValidate + assert_raises_with_message(StandardError, /column "user_id" of relation "projects" already exists/) do + migrate AddReferenceForeignKeyNoValidate + end + ensure + migrate AddReferenceForeignKeyNoValidate, direction: :down + assert_empty @connection.foreign_keys(:projects) + end + + class AddReferenceForeignKeyNoValidatePluralizeName < TestMigration + disable_ddl_transaction! + + def change + add_reference :projects, :users, index: false, foreign_key: { validate: false } + end + end + + def test_add_reference_foreign_key_no_validate_with_pluralized_table_name + assert_safe AddReferenceForeignKeyNoValidatePluralizeName + end + class AddReferenceForeignKeyValidate < TestMigration def change add_reference :projects, :user, index: false, foreign_key: { validate: true } diff --git a/test/command_checker/foreign_keys_test.rb b/test/command_checker/foreign_keys_test.rb index 4b7a560..6ee363e 100644 --- a/test/command_checker/foreign_keys_test.rb +++ b/test/command_checker/foreign_keys_test.rb @@ -69,6 +69,31 @@ def test_add_foreign_key_no_validate assert_safe AddForeignKeyNoValidate end + def test_add_foreign_key_no_validate_is_idempotent + assert_empty @connection.foreign_keys(:projects) + + migrate AddForeignKeyNoValidate + migrate AddForeignKeyNoValidate + migrate AddForeignKeyNoValidate + + assert_equal 1, @connection.foreign_keys(:projects).size + ensure + migrate AddForeignKeyNoValidate, direction: :down + assert_empty @connection.foreign_keys(:projects) + end + + class AddForeignKeySingularToTable < TestMigration + def change + add_foreign_key :projects, :user, validate: false + end + end + + def test_add_foreign_key_no_validate + assert_raises_with_message(StandardError, /PG::UndefinedTable: ERROR: relation "user" does not exist/i) do + assert_safe AddForeignKeySingularToTable + end + end + class AddForeignKeyFromNewTable < TestMigration def change create_table :posts_new do |t| diff --git a/test/schema_statements/add_reference_concurrently_test.rb b/test/schema_statements/add_reference_concurrently_test.rb index 7f4cf8d..459f9ad 100644 --- a/test/schema_statements/add_reference_concurrently_test.rb +++ b/test/schema_statements/add_reference_concurrently_test.rb @@ -71,6 +71,35 @@ def test_add_reference_concurrently_with_foreign_key end end + def test_add_reference_concurrently_with_foreign_key_is_idempotent + assert_empty @connection.foreign_keys(:projects) + + connection.add_reference_concurrently :milestones, :project, foreign_key: true + connection.add_reference_concurrently :milestones, :project, foreign_key: true + connection.add_reference_concurrently :milestones, :project, foreign_key: true + + assert_equal 1, @connection.foreign_keys(:projects).size + end + + def test_add_reference_concurrently_with_foreign_key_with_pluralized_table_name + assert_sql( + 'REFERENCES "projects" ("id") NOT VALID', + 'ALTER TABLE "milestones" VALIDATE CONSTRAINT' + ) do + connection.add_reference_concurrently :milestones, :projects, foreign_key: true + end + end + + def test_add_reference_concurrently_with_foreign_key_is_idempotent_with_pluralized_table_name + assert_empty @connection.foreign_keys(:projects) + + connection.add_reference_concurrently :milestones, :projects, foreign_key: true + connection.add_reference_concurrently :milestones, :projects, foreign_key: true + connection.add_reference_concurrently :milestones, :projects, foreign_key: true + + assert_equal 1, @connection.foreign_keys(:projects).size + end + def test_add_reference_concurrently_with_unvalidated_foreign_key refute_sql("VALIDATE CONSTRAINT") do connection.add_reference_concurrently :milestones, :project, foreign_key: { validate: false }