@@ -1950,6 +1950,120 @@ class ::TestComment < ActiveRecord::Base
19501950 expect ( fk ) . not_to be_nil
19511951 expect ( fk . options . key? ( :validate ) ) . to be ( false )
19521952 end
1953+
1954+ it "creates DISABLE VALIDATE when enforced: false is given (validate defaults to true)" do
1955+ schema_define do
1956+ add_foreign_key :test_comments , :test_posts , enforced : false
1957+ end
1958+ fk = ActiveRecord ::Base . lease_connection . foreign_keys ( :test_comments ) . first
1959+ expect ( fk . options [ :enforced ] ) . to be ( false )
1960+ expect ( fk . options . key? ( :validate ) ) . to be ( false )
1961+ expect do
1962+ TestComment . create ( body : "test" , test_post_id : 1 )
1963+ end . to raise_error ( /ORA-25128/ )
1964+ end
1965+
1966+ it "creates DISABLE NOVALIDATE when both enforced: false and validate: false are given (closest to PG NOT ENFORCED)" do
1967+ schema_define do
1968+ add_foreign_key :test_comments , :test_posts , enforced : false , validate : false
1969+ end
1970+ fk = ActiveRecord ::Base . lease_connection . foreign_keys ( :test_comments ) . first
1971+ expect ( fk . options [ :enforced ] ) . to be ( false )
1972+ expect ( fk . options [ :validate ] ) . to be ( false )
1973+ expect do
1974+ TestComment . create ( body : "test" , test_post_id : 1 )
1975+ end . not_to raise_error
1976+ end
1977+
1978+ it "leaves both :enforced and :validate absent when the foreign key is ENABLE VALIDATE" do
1979+ schema_define do
1980+ add_foreign_key :test_comments , :test_posts
1981+ end
1982+ fk = ActiveRecord ::Base . lease_connection . foreign_keys ( :test_comments ) . first
1983+ expect ( fk . options . key? ( :enforced ) ) . to be ( false )
1984+ expect ( fk . options . key? ( :validate ) ) . to be ( false )
1985+ end
1986+
1987+ it "enables a DISABLEd foreign key via change_foreign_key" do
1988+ schema_define do
1989+ add_foreign_key :test_comments , :test_posts , enforced : false , validate : false
1990+ change_foreign_key :test_comments , :test_posts , enforced : true
1991+ end
1992+ fk = ActiveRecord ::Base . lease_connection . foreign_keys ( :test_comments ) . first
1993+ expect ( fk . options . key? ( :enforced ) ) . to be ( false )
1994+ expect ( fk . options . key? ( :validate ) ) . to be ( false )
1995+ expect do
1996+ TestComment . create ( body : "test" , test_post_id : 1 )
1997+ end . to raise_error ( /ORA-02291/ )
1998+ end
1999+
2000+ it "disables an ENFORCED foreign key via change_foreign_key" do
2001+ schema_define do
2002+ add_foreign_key :test_comments , :test_posts
2003+ change_foreign_key :test_comments , :test_posts , enforced : false
2004+ end
2005+ fk = ActiveRecord ::Base . lease_connection . foreign_keys ( :test_comments ) . first
2006+ expect ( fk . options [ :enforced ] ) . to be ( false )
2007+ expect ( fk . options [ :validate ] ) . to be ( false )
2008+ expect do
2009+ TestComment . create ( body : "test" , test_post_id : 1 )
2010+ end . not_to raise_error
2011+ end
2012+
2013+ it "raises ArgumentError when change_foreign_key is called without :enforced" do
2014+ schema_define do
2015+ add_foreign_key :test_comments , :test_posts
2016+ end
2017+ expect do
2018+ ActiveRecord ::Base . lease_connection . change_foreign_key :test_comments , :test_posts
2019+ end . to raise_error ( ArgumentError , /change_foreign_key requires at least one option/ )
2020+ end
2021+
2022+ it "toggles enforced via change_foreign_key identified by name:" do
2023+ schema_define do
2024+ add_foreign_key :test_comments , :test_posts , name : "comments_posts_fk"
2025+ change_foreign_key :test_comments , name : "comments_posts_fk" , enforced : false
2026+ end
2027+ fk = ActiveRecord ::Base . lease_connection . foreign_keys ( :test_comments ) . first
2028+ expect ( fk . options [ :enforced ] ) . to be ( false )
2029+ end
2030+
2031+ it "honors enforced: false on add_reference foreign_key option hash" do
2032+ schema_define do
2033+ drop_table :test_comments , if_exists : true
2034+ create_table :test_comments , force : true do |t |
2035+ t . string :body , limit : 4000
2036+ end
2037+ add_reference :test_comments , :test_post , foreign_key : { enforced : false , validate : false }
2038+ end
2039+ fk = ActiveRecord ::Base . lease_connection . foreign_keys ( :test_comments ) . first
2040+ expect ( fk . options [ :enforced ] ) . to be ( false )
2041+ expect ( fk . options [ :validate ] ) . to be ( false )
2042+ end
2043+
2044+ it "honors enforced: false on inline t.foreign_key inside create_table" do
2045+ schema_define do
2046+ drop_table :test_comments , if_exists : true
2047+ create_table :test_comments , force : true do |t |
2048+ t . string :body , limit : 4000
2049+ t . references :test_post
2050+ t . foreign_key :test_posts , enforced : false , validate : false
2051+ end
2052+ end
2053+ fk = ActiveRecord ::Base . lease_connection . foreign_keys ( :test_comments ) . first
2054+ expect ( fk . options [ :enforced ] ) . to be ( false )
2055+ expect ( fk . options [ :validate ] ) . to be ( false )
2056+ end
2057+
2058+ it "round-trips enforced: false combined with deferrable: :deferred" do
2059+ schema_define do
2060+ add_foreign_key :test_comments , :test_posts , enforced : false , validate : false , deferrable : :deferred
2061+ end
2062+ fk = ActiveRecord ::Base . lease_connection . foreign_keys ( :test_comments ) . first
2063+ expect ( fk . options [ :enforced ] ) . to be ( false )
2064+ expect ( fk . options [ :validate ] ) . to be ( false )
2065+ expect ( fk . options [ :deferrable ] ) . to eq ( :deferred )
2066+ end
19532067 end
19542068
19552069 describe "check constraints" do
0 commit comments