ibm_db 2.5.6-x86-mingw32 → 2.5.7-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +6 -0
 - data/README +1 -1
 - data/ext/Makefile.nt32 +3 -3
 - data/ext/Makefile.nt32.191 +212 -0
 - data/ext/ibm_db.c +30 -5
 - data/lib/active_record/connection_adapters/ibm_db_adapter.rb +300 -108
 - data/lib/active_record/connection_adapters/ibm_db_pstmt.rb +1 -1
 - data/lib/mswin32/rb18x/ibm_db.so +0 -0
 - data/lib/mswin32/rb19x/ibm_db.so +0 -0
 - data/test/cases/adapter_test.rb +25 -22
 - data/test/cases/associations/belongs_to_associations_test.rb +245 -43
 - data/test/cases/associations/cascaded_eager_loading_test.rb +28 -26
 - data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +60 -156
 - data/test/cases/associations/join_model_test.rb +96 -146
 - data/test/cases/attribute_methods_test.rb +98 -33
 - data/test/cases/base_test.rb +525 -103
 - data/test/cases/calculations_test.rb +92 -8
 - data/test/cases/migration_test.rb +533 -207
 - data/test/cases/persistence_test.rb +636 -0
 - data/test/cases/query_cache_test.rb +242 -0
 - data/test/cases/relations_test.rb +1019 -0
 - data/test/cases/schema_dumper_test.rb +37 -17
 - data/test/cases/transaction_callbacks_test.rb +300 -0
 - data/test/cases/validations/uniqueness_validation_test.rb +38 -22
 - data/test/cases/xml_serialization_test.rb +276 -0
 - data/test/config.yml +154 -0
 - data/test/connections/native_ibm_db/connection.rb +2 -0
 - data/test/models/warehouse_thing.rb +4 -4
 - data/test/schema/i5/ibm_db_specific_schema.rb +3 -1
 - data/test/schema/ids/ibm_db_specific_schema.rb +3 -1
 - data/test/schema/luw/ibm_db_specific_schema.rb +2 -0
 - data/test/schema/schema.rb +174 -89
 - data/test/schema/zOS/ibm_db_specific_schema.rb +3 -1
 - metadata +10 -7
 - data/test/cases/associations/eager_test.rb +0 -862
 - data/test/cases/associations/has_many_through_associations_test.rb +0 -461
 - data/test/cases/finder_test.rb +0 -1088
 - data/test/cases/fixtures_test.rb +0 -684
 
    
        data/test/cases/base_test.rb
    CHANGED
    
    | 
         @@ -18,7 +18,9 @@ require 'models/comment' 
     | 
|
| 
       18 
18 
     | 
    
         
             
            require 'models/minimalistic'
         
     | 
| 
       19 
19 
     | 
    
         
             
            require 'models/warehouse_thing'
         
     | 
| 
       20 
20 
     | 
    
         
             
            require 'models/parrot'
         
     | 
| 
       21 
     | 
    
         
            -
            require 'models/ 
     | 
| 
      
 21 
     | 
    
         
            +
            require 'models/person'
         
     | 
| 
      
 22 
     | 
    
         
            +
            require 'models/edge'
         
     | 
| 
      
 23 
     | 
    
         
            +
            require 'models/joke'
         
     | 
| 
       22 
24 
     | 
    
         
             
            require 'rexml/document'
         
     | 
| 
       23 
25 
     | 
    
         
             
            require 'active_support/core_ext/exception'
         
     | 
| 
       24 
26 
     | 
    
         | 
| 
         @@ -43,10 +45,98 @@ class ReadonlyTitlePost < Post 
     | 
|
| 
       43 
45 
     | 
    
         
             
              attr_readonly :title
         
     | 
| 
       44 
46 
     | 
    
         
             
            end
         
     | 
| 
       45 
47 
     | 
    
         | 
| 
      
 48 
     | 
    
         
            +
            class ProtectedTitlePost < Post
         
     | 
| 
      
 49 
     | 
    
         
            +
              attr_protected :title
         
     | 
| 
      
 50 
     | 
    
         
            +
            end
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
            class Weird < ActiveRecord::Base; end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
       46 
54 
     | 
    
         
             
            class Boolean < ActiveRecord::Base; end
         
     | 
| 
       47 
55 
     | 
    
         | 
| 
       48 
56 
     | 
    
         
             
            class BasicsTest < ActiveRecord::TestCase
         
     | 
| 
       49 
     | 
    
         
            -
              fixtures :topics, :companies, :developers, :projects, :computers, :accounts, :minimalistics,  
     | 
| 
      
 57 
     | 
    
         
            +
              fixtures :topics, :companies, :developers, :projects, :computers, :accounts, :minimalistics, 'warehouse_things', :authors, :categorizations, :categories, :posts
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
              def test_column_names_are_escaped
         
     | 
| 
      
 60 
     | 
    
         
            +
                conn      = ActiveRecord::Base.connection
         
     | 
| 
      
 61 
     | 
    
         
            +
                classname = conn.class.name[/[^:]*$/]
         
     | 
| 
      
 62 
     | 
    
         
            +
                badchar   = {
         
     | 
| 
      
 63 
     | 
    
         
            +
                  'SQLite3Adapter'    => '"',
         
     | 
| 
      
 64 
     | 
    
         
            +
                  'MysqlAdapter'      => '`',
         
     | 
| 
      
 65 
     | 
    
         
            +
                  'Mysql2Adapter'     => '`',
         
     | 
| 
      
 66 
     | 
    
         
            +
                  'PostgreSQLAdapter' => '"',
         
     | 
| 
      
 67 
     | 
    
         
            +
                  'OracleAdapter'     => '"',
         
     | 
| 
      
 68 
     | 
    
         
            +
            	  'IBM_DBAdapter'     => '"'
         
     | 
| 
      
 69 
     | 
    
         
            +
                }.fetch(classname) {
         
     | 
| 
      
 70 
     | 
    
         
            +
                  raise "need a bad char for #{classname}"
         
     | 
| 
      
 71 
     | 
    
         
            +
                }
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                quoted = conn.quote_column_name "foo#{badchar}bar"
         
     | 
| 
      
 74 
     | 
    
         
            +
                if current_adapter?(:OracleAdapter)
         
     | 
| 
      
 75 
     | 
    
         
            +
                  # Oracle does not allow double quotes in table and column names at all
         
     | 
| 
      
 76 
     | 
    
         
            +
                  # therefore quoting removes them
         
     | 
| 
      
 77 
     | 
    
         
            +
                  assert_equal("#{badchar}foobar#{badchar}", quoted)
         
     | 
| 
      
 78 
     | 
    
         
            +
                elsif current_adapter?(:IBM_DBAdapter)
         
     | 
| 
      
 79 
     | 
    
         
            +
                  assert_equal("foo#{badchar}bar", quoted)
         
     | 
| 
      
 80 
     | 
    
         
            +
                else
         
     | 
| 
      
 81 
     | 
    
         
            +
                  assert_equal("#{badchar}foo#{badchar * 2}bar#{badchar}", quoted)
         
     | 
| 
      
 82 
     | 
    
         
            +
                end
         
     | 
| 
      
 83 
     | 
    
         
            +
              end
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
              def test_columns_should_obey_set_primary_key
         
     | 
| 
      
 86 
     | 
    
         
            +
                pk = Subscriber.columns.find { |x| x.name == 'nick' }
         
     | 
| 
      
 87 
     | 
    
         
            +
                assert pk.primary, 'nick should be primary key'
         
     | 
| 
      
 88 
     | 
    
         
            +
              end
         
     | 
| 
      
 89 
     | 
    
         
            +
             
     | 
| 
      
 90 
     | 
    
         
            +
              def test_primary_key_with_no_id
         
     | 
| 
      
 91 
     | 
    
         
            +
                assert_nil Edge.primary_key
         
     | 
| 
      
 92 
     | 
    
         
            +
              end
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
      
 94 
     | 
    
         
            +
              unless current_adapter?(:PostgreSQLAdapter,:OracleAdapter,:SQLServerAdapter, :IBM_DBAdapter)
         
     | 
| 
      
 95 
     | 
    
         
            +
                def test_limit_with_comma
         
     | 
| 
      
 96 
     | 
    
         
            +
                  assert_nothing_raised do
         
     | 
| 
      
 97 
     | 
    
         
            +
                    Topic.limit("1,2").all
         
     | 
| 
      
 98 
     | 
    
         
            +
                  end
         
     | 
| 
      
 99 
     | 
    
         
            +
                end
         
     | 
| 
      
 100 
     | 
    
         
            +
              end
         
     | 
| 
      
 101 
     | 
    
         
            +
             
     | 
| 
      
 102 
     | 
    
         
            +
              def test_limit_without_comma
         
     | 
| 
      
 103 
     | 
    
         
            +
                assert_nothing_raised do
         
     | 
| 
      
 104 
     | 
    
         
            +
                  assert_equal 1, Topic.limit("1").all.length
         
     | 
| 
      
 105 
     | 
    
         
            +
                end
         
     | 
| 
      
 106 
     | 
    
         
            +
             
     | 
| 
      
 107 
     | 
    
         
            +
                assert_nothing_raised do
         
     | 
| 
      
 108 
     | 
    
         
            +
                  assert_equal 1, Topic.limit(1).all.length
         
     | 
| 
      
 109 
     | 
    
         
            +
                end
         
     | 
| 
      
 110 
     | 
    
         
            +
              end
         
     | 
| 
      
 111 
     | 
    
         
            +
             
     | 
| 
      
 112 
     | 
    
         
            +
              def test_invalid_limit
         
     | 
| 
      
 113 
     | 
    
         
            +
                assert_raises(ArgumentError) do
         
     | 
| 
      
 114 
     | 
    
         
            +
                  Topic.limit("asdfadf").all
         
     | 
| 
      
 115 
     | 
    
         
            +
                end
         
     | 
| 
      
 116 
     | 
    
         
            +
              end
         
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
      
 118 
     | 
    
         
            +
              def test_limit_should_sanitize_sql_injection_for_limit_without_comas
         
     | 
| 
      
 119 
     | 
    
         
            +
                assert_raises(ArgumentError) do
         
     | 
| 
      
 120 
     | 
    
         
            +
                  Topic.limit("1 select * from schema").all
         
     | 
| 
      
 121 
     | 
    
         
            +
                end
         
     | 
| 
      
 122 
     | 
    
         
            +
              end
         
     | 
| 
      
 123 
     | 
    
         
            +
             
     | 
| 
      
 124 
     | 
    
         
            +
              def test_limit_should_sanitize_sql_injection_for_limit_with_comas
         
     | 
| 
      
 125 
     | 
    
         
            +
                assert_raises(ArgumentError) do
         
     | 
| 
      
 126 
     | 
    
         
            +
                  Topic.limit("1, 7 procedure help()").all
         
     | 
| 
      
 127 
     | 
    
         
            +
                end
         
     | 
| 
      
 128 
     | 
    
         
            +
              end
         
     | 
| 
      
 129 
     | 
    
         
            +
             
     | 
| 
      
 130 
     | 
    
         
            +
              unless current_adapter?(:MysqlAdapter) || current_adapter?(:Mysql2Adapter) || current_adapter?(:IBM_DBAdapter)
         
     | 
| 
      
 131 
     | 
    
         
            +
                def test_limit_should_allow_sql_literal
         
     | 
| 
      
 132 
     | 
    
         
            +
                  assert_equal 1, Topic.limit(Arel.sql('2-1')).all.length
         
     | 
| 
      
 133 
     | 
    
         
            +
                end
         
     | 
| 
      
 134 
     | 
    
         
            +
              end
         
     | 
| 
      
 135 
     | 
    
         
            +
             
     | 
| 
      
 136 
     | 
    
         
            +
              def test_select_symbol
         
     | 
| 
      
 137 
     | 
    
         
            +
                topic_ids = Topic.select(:id).map(&:id).sort
         
     | 
| 
      
 138 
     | 
    
         
            +
                assert_equal Topic.all.map(&:id).sort, topic_ids
         
     | 
| 
      
 139 
     | 
    
         
            +
              end
         
     | 
| 
       50 
140 
     | 
    
         | 
| 
       51 
141 
     | 
    
         
             
              def test_table_exists
         
     | 
| 
       52 
142 
     | 
    
         
             
                assert !NonExistentTable.table_exists?
         
     | 
| 
         @@ -69,24 +159,6 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       69 
159 
     | 
    
         
             
                end
         
     | 
| 
       70 
160 
     | 
    
         
             
              end
         
     | 
| 
       71 
161 
     | 
    
         | 
| 
       72 
     | 
    
         
            -
              def test_use_table_engine_for_quoting_where
         
     | 
| 
       73 
     | 
    
         
            -
                relation = Topic.where(Topic.arel_table[:id].eq(1))
         
     | 
| 
       74 
     | 
    
         
            -
                engine = relation.table.engine
         
     | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
       76 
     | 
    
         
            -
                fakepool = Class.new(Struct.new(:spec)) {
         
     | 
| 
       77 
     | 
    
         
            -
                  def with_connection; yield self; end
         
     | 
| 
       78 
     | 
    
         
            -
                  def connection_pool; self; end
         
     | 
| 
       79 
     | 
    
         
            -
                  def quote_table_name(*args); raise "lol quote_table_name"; end
         
     | 
| 
       80 
     | 
    
         
            -
                }
         
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
     | 
    
         
            -
                relation.table.engine = fakepool.new(engine.connection_pool.spec)
         
     | 
| 
       83 
     | 
    
         
            -
             
     | 
| 
       84 
     | 
    
         
            -
                error = assert_raises(RuntimeError) { relation.to_a }
         
     | 
| 
       85 
     | 
    
         
            -
                assert_match('lol', error.message)
         
     | 
| 
       86 
     | 
    
         
            -
              ensure
         
     | 
| 
       87 
     | 
    
         
            -
                relation.table.engine = engine
         
     | 
| 
       88 
     | 
    
         
            -
              end
         
     | 
| 
       89 
     | 
    
         
            -
             
     | 
| 
       90 
162 
     | 
    
         
             
              def test_preserving_time_objects
         
     | 
| 
       91 
163 
     | 
    
         
             
                assert_kind_of(
         
     | 
| 
       92 
164 
     | 
    
         
             
                  Time, Topic.find(1).bonus_time,
         
     | 
| 
         @@ -111,7 +183,7 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       111 
183 
     | 
    
         
             
                  with_active_record_default_timezone :utc do
         
     | 
| 
       112 
184 
     | 
    
         
             
                    time = Time.local(2000)
         
     | 
| 
       113 
185 
     | 
    
         
             
                    topic = Topic.create('written_on' => time)
         
     | 
| 
       114 
     | 
    
         
            -
                    saved_time = Topic.find(topic.id).written_on
         
     | 
| 
      
 186 
     | 
    
         
            +
                    saved_time = Topic.find(topic.id).reload.written_on
         
     | 
| 
       115 
187 
     | 
    
         
             
                    assert_equal time, saved_time
         
     | 
| 
       116 
188 
     | 
    
         
             
                    assert_equal [0, 0, 0, 1, 1, 2000, 6, 1, false, "EST"], time.to_a
         
     | 
| 
       117 
189 
     | 
    
         
             
                    assert_equal [0, 0, 5, 1, 1, 2000, 6, 1, false, "UTC"], saved_time.to_a
         
     | 
| 
         @@ -125,7 +197,7 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       125 
197 
     | 
    
         
             
                    Time.use_zone 'Central Time (US & Canada)' do
         
     | 
| 
       126 
198 
     | 
    
         
             
                      time = Time.zone.local(2000)
         
     | 
| 
       127 
199 
     | 
    
         
             
                      topic = Topic.create('written_on' => time)
         
     | 
| 
       128 
     | 
    
         
            -
                      saved_time = Topic.find(topic.id).written_on
         
     | 
| 
      
 200 
     | 
    
         
            +
                      saved_time = Topic.find(topic.id).reload.written_on
         
     | 
| 
       129 
201 
     | 
    
         
             
                      assert_equal time, saved_time
         
     | 
| 
       130 
202 
     | 
    
         
             
                      assert_equal [0, 0, 0, 1, 1, 2000, 6, 1, false, "CST"], time.to_a
         
     | 
| 
       131 
203 
     | 
    
         
             
                      assert_equal [0, 0, 6, 1, 1, 2000, 6, 1, false, "UTC"], saved_time.to_a
         
     | 
| 
         @@ -138,7 +210,7 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       138 
210 
     | 
    
         
             
                with_env_tz 'America/New_York' do
         
     | 
| 
       139 
211 
     | 
    
         
             
                  time = Time.utc(2000)
         
     | 
| 
       140 
212 
     | 
    
         
             
                  topic = Topic.create('written_on' => time)
         
     | 
| 
       141 
     | 
    
         
            -
                  saved_time = Topic.find(topic.id).written_on
         
     | 
| 
      
 213 
     | 
    
         
            +
                  saved_time = Topic.find(topic.id).reload.written_on
         
     | 
| 
       142 
214 
     | 
    
         
             
                  assert_equal time, saved_time
         
     | 
| 
       143 
215 
     | 
    
         
             
                  assert_equal [0, 0, 0, 1, 1, 2000, 6, 1, false, "UTC"], time.to_a
         
     | 
| 
       144 
216 
     | 
    
         
             
                  assert_equal [0, 0, 19, 31, 12, 1999, 5, 365, false, "EST"], saved_time.to_a
         
     | 
| 
         @@ -151,7 +223,7 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       151 
223 
     | 
    
         
             
                    Time.use_zone 'Central Time (US & Canada)' do
         
     | 
| 
       152 
224 
     | 
    
         
             
                      time = Time.zone.local(2000)
         
     | 
| 
       153 
225 
     | 
    
         
             
                      topic = Topic.create('written_on' => time)
         
     | 
| 
       154 
     | 
    
         
            -
                      saved_time = Topic.find(topic.id).written_on
         
     | 
| 
      
 226 
     | 
    
         
            +
                      saved_time = Topic.find(topic.id).reload.written_on
         
     | 
| 
       155 
227 
     | 
    
         
             
                      assert_equal time, saved_time
         
     | 
| 
       156 
228 
     | 
    
         
             
                      assert_equal [0, 0, 0, 1, 1, 2000, 6, 1, false, "CST"], time.to_a
         
     | 
| 
       157 
229 
     | 
    
         
             
                      assert_equal [0, 0, 1, 1, 1, 2000, 6, 1, false, "EST"], saved_time.to_a
         
     | 
| 
         @@ -177,7 +249,7 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       177 
249 
     | 
    
         | 
| 
       178 
250 
     | 
    
         
             
              def test_initialize_with_invalid_attribute
         
     | 
| 
       179 
251 
     | 
    
         
             
                begin
         
     | 
| 
       180 
     | 
    
         
            -
                   
     | 
| 
      
 252 
     | 
    
         
            +
                  Topic.new({ "title" => "test",
         
     | 
| 
       181 
253 
     | 
    
         
             
                    "last_read(1i)" => "2005", "last_read(2i)" => "2", "last_read(3i)" => "31"})
         
     | 
| 
       182 
254 
     | 
    
         
             
                rescue ActiveRecord::MultiparameterAssignmentErrors => ex
         
     | 
| 
       183 
255 
     | 
    
         
             
                  assert_equal(1, ex.errors.size)
         
     | 
| 
         @@ -302,6 +374,15 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       302 
374 
     | 
    
         
             
                GUESSED_CLASSES.each(&:reset_table_name)
         
     | 
| 
       303 
375 
     | 
    
         
             
              end
         
     | 
| 
       304 
376 
     | 
    
         | 
| 
      
 377 
     | 
    
         
            +
              def test_singular_table_name_guesses_for_individual_table
         
     | 
| 
      
 378 
     | 
    
         
            +
                CreditCard.pluralize_table_names = false
         
     | 
| 
      
 379 
     | 
    
         
            +
                CreditCard.reset_table_name
         
     | 
| 
      
 380 
     | 
    
         
            +
                assert_equal "credit_card", CreditCard.table_name
         
     | 
| 
      
 381 
     | 
    
         
            +
                assert_equal "categories", Category.table_name
         
     | 
| 
      
 382 
     | 
    
         
            +
              ensure
         
     | 
| 
      
 383 
     | 
    
         
            +
                CreditCard.pluralize_table_names = true
         
     | 
| 
      
 384 
     | 
    
         
            +
                CreditCard.reset_table_name
         
     | 
| 
      
 385 
     | 
    
         
            +
              end
         
     | 
| 
       305 
386 
     | 
    
         | 
| 
       306 
387 
     | 
    
         
             
              if current_adapter?(:MysqlAdapter) or current_adapter?(:Mysql2Adapter)
         
     | 
| 
       307 
388 
     | 
    
         
             
                def test_update_all_with_order_and_limit
         
     | 
| 
         @@ -384,6 +465,10 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       384 
465 
     | 
    
         
             
                assert_equal Topic.find(1), Topic.find(2).topic
         
     | 
| 
       385 
466 
     | 
    
         
             
              end
         
     | 
| 
       386 
467 
     | 
    
         | 
| 
      
 468 
     | 
    
         
            +
              def test_find_by_slug
         
     | 
| 
      
 469 
     | 
    
         
            +
                assert_equal Topic.find('1-meowmeow'), Topic.find(1)
         
     | 
| 
      
 470 
     | 
    
         
            +
              end
         
     | 
| 
      
 471 
     | 
    
         
            +
             
     | 
| 
       387 
472 
     | 
    
         
             
              def test_equality_of_new_records
         
     | 
| 
       388 
473 
     | 
    
         
             
                assert_not_equal Topic.new, Topic.new
         
     | 
| 
       389 
474 
     | 
    
         
             
              end
         
     | 
| 
         @@ -401,6 +486,19 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       401 
486 
     | 
    
         
             
                assert_equal [ Topic.find(1) ], [ Topic.find(2).topic ] & [ Topic.find(1) ]
         
     | 
| 
       402 
487 
     | 
    
         
             
              end
         
     | 
| 
       403 
488 
     | 
    
         | 
| 
      
 489 
     | 
    
         
            +
              def test_comparison
         
     | 
| 
      
 490 
     | 
    
         
            +
                topic_1 = Topic.create!
         
     | 
| 
      
 491 
     | 
    
         
            +
                topic_2 = Topic.create!
         
     | 
| 
      
 492 
     | 
    
         
            +
             
     | 
| 
      
 493 
     | 
    
         
            +
                assert_equal [topic_2, topic_1].sort, [topic_1, topic_2]
         
     | 
| 
      
 494 
     | 
    
         
            +
              end
         
     | 
| 
      
 495 
     | 
    
         
            +
             
     | 
| 
      
 496 
     | 
    
         
            +
              def test_comparison_with_different_objects
         
     | 
| 
      
 497 
     | 
    
         
            +
                topic = Topic.create
         
     | 
| 
      
 498 
     | 
    
         
            +
                category = Category.create(:name => "comparison")
         
     | 
| 
      
 499 
     | 
    
         
            +
                assert_nil topic <=> category
         
     | 
| 
      
 500 
     | 
    
         
            +
              end
         
     | 
| 
      
 501 
     | 
    
         
            +
             
     | 
| 
       404 
502 
     | 
    
         
             
              def test_readonly_attributes
         
     | 
| 
       405 
503 
     | 
    
         
             
                assert_equal Set.new([ 'title' , 'comments_count' ]), ReadonlyTitlePost.readonly_attributes
         
     | 
| 
       406 
504 
     | 
    
         | 
| 
         @@ -414,6 +512,23 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       414 
512 
     | 
    
         
             
                assert_equal "changed", post.body
         
     | 
| 
       415 
513 
     | 
    
         
             
              end
         
     | 
| 
       416 
514 
     | 
    
         | 
| 
      
 515 
     | 
    
         
            +
              def test_non_valid_identifier_column_name
         
     | 
| 
      
 516 
     | 
    
         
            +
                weird = Weird.create('a$b' => 'value')
         
     | 
| 
      
 517 
     | 
    
         
            +
                weird.reload
         
     | 
| 
      
 518 
     | 
    
         
            +
                assert_equal 'value', weird.send('a$b')
         
     | 
| 
      
 519 
     | 
    
         
            +
             
     | 
| 
      
 520 
     | 
    
         
            +
                weird.update_column('a$b', 'value2')
         
     | 
| 
      
 521 
     | 
    
         
            +
                weird.reload
         
     | 
| 
      
 522 
     | 
    
         
            +
                assert_equal 'value2', weird.send('a$b')
         
     | 
| 
      
 523 
     | 
    
         
            +
              end
         
     | 
| 
      
 524 
     | 
    
         
            +
             
     | 
| 
      
 525 
     | 
    
         
            +
              def test_attributes_guard_protected_attributes_is_deprecated
         
     | 
| 
      
 526 
     | 
    
         
            +
                attributes = { "title" => "An amazing title" }
         
     | 
| 
      
 527 
     | 
    
         
            +
                post = ProtectedTitlePost.new
         
     | 
| 
      
 528 
     | 
    
         
            +
                assert_deprecated { post.send(:attributes=, attributes, false) }
         
     | 
| 
      
 529 
     | 
    
         
            +
                assert_equal "An amazing title", post.title
         
     | 
| 
      
 530 
     | 
    
         
            +
              end
         
     | 
| 
      
 531 
     | 
    
         
            +
             
     | 
| 
       417 
532 
     | 
    
         
             
              def test_multiparameter_attributes_on_date
         
     | 
| 
       418 
533 
     | 
    
         
             
                attributes = { "last_read(1i)" => "2004", "last_read(2i)" => "6", "last_read(3i)" => "24" }
         
     | 
| 
       419 
534 
     | 
    
         
             
                topic = Topic.find(1)
         
     | 
| 
         @@ -494,6 +609,29 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       494 
609 
     | 
    
         
             
                assert_equal Time.local(2004, 6, 24, 16, 24, 0), topic.written_on
         
     | 
| 
       495 
610 
     | 
    
         
             
              end
         
     | 
| 
       496 
611 
     | 
    
         | 
| 
      
 612 
     | 
    
         
            +
              def test_multiparameter_attributes_on_time_with_no_date
         
     | 
| 
      
 613 
     | 
    
         
            +
                ex = assert_raise(ActiveRecord::MultiparameterAssignmentErrors) do
         
     | 
| 
      
 614 
     | 
    
         
            +
                  attributes = {
         
     | 
| 
      
 615 
     | 
    
         
            +
                    "written_on(4i)" => "16", "written_on(5i)" => "24", "written_on(6i)" => "00"
         
     | 
| 
      
 616 
     | 
    
         
            +
                  }
         
     | 
| 
      
 617 
     | 
    
         
            +
                  topic = Topic.find(1)
         
     | 
| 
      
 618 
     | 
    
         
            +
                  topic.attributes = attributes
         
     | 
| 
      
 619 
     | 
    
         
            +
                end
         
     | 
| 
      
 620 
     | 
    
         
            +
                assert_equal("written_on", ex.errors[0].attribute)
         
     | 
| 
      
 621 
     | 
    
         
            +
              end
         
     | 
| 
      
 622 
     | 
    
         
            +
             
     | 
| 
      
 623 
     | 
    
         
            +
              def test_multiparameter_attributes_on_time_with_invalid_time_params
         
     | 
| 
      
 624 
     | 
    
         
            +
                ex = assert_raise(ActiveRecord::MultiparameterAssignmentErrors) do
         
     | 
| 
      
 625 
     | 
    
         
            +
                  attributes = {
         
     | 
| 
      
 626 
     | 
    
         
            +
                    "written_on(1i)" => "2004", "written_on(2i)" => "6", "written_on(3i)" => "24",
         
     | 
| 
      
 627 
     | 
    
         
            +
                    "written_on(4i)" => "2004", "written_on(5i)" => "36", "written_on(6i)" => "64",
         
     | 
| 
      
 628 
     | 
    
         
            +
                  }
         
     | 
| 
      
 629 
     | 
    
         
            +
                  topic = Topic.find(1)
         
     | 
| 
      
 630 
     | 
    
         
            +
                  topic.attributes = attributes
         
     | 
| 
      
 631 
     | 
    
         
            +
                end
         
     | 
| 
      
 632 
     | 
    
         
            +
                assert_equal("written_on", ex.errors[0].attribute)
         
     | 
| 
      
 633 
     | 
    
         
            +
              end
         
     | 
| 
      
 634 
     | 
    
         
            +
             
     | 
| 
       497 
635 
     | 
    
         
             
              def test_multiparameter_attributes_on_time_with_old_date
         
     | 
| 
       498 
636 
     | 
    
         
             
                attributes = {
         
     | 
| 
       499 
637 
     | 
    
         
             
                  "written_on(1i)" => "1850", "written_on(2i)" => "6", "written_on(3i)" => "24",
         
     | 
| 
         @@ -505,6 +643,82 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       505 
643 
     | 
    
         
             
                assert_equal "1850-06-24 16:24:00", topic.written_on.to_s(:db)
         
     | 
| 
       506 
644 
     | 
    
         
             
              end
         
     | 
| 
       507 
645 
     | 
    
         | 
| 
      
 646 
     | 
    
         
            +
              def test_multiparameter_attributes_on_time_will_raise_on_big_time_if_missing_date_parts
         
     | 
| 
      
 647 
     | 
    
         
            +
                ex = assert_raise(ActiveRecord::MultiparameterAssignmentErrors) do
         
     | 
| 
      
 648 
     | 
    
         
            +
                  attributes = {
         
     | 
| 
      
 649 
     | 
    
         
            +
                    "written_on(4i)" => "16", "written_on(5i)" => "24"
         
     | 
| 
      
 650 
     | 
    
         
            +
                  }
         
     | 
| 
      
 651 
     | 
    
         
            +
                  topic = Topic.find(1)
         
     | 
| 
      
 652 
     | 
    
         
            +
                  topic.attributes = attributes
         
     | 
| 
      
 653 
     | 
    
         
            +
                end
         
     | 
| 
      
 654 
     | 
    
         
            +
                assert_equal("written_on", ex.errors[0].attribute)
         
     | 
| 
      
 655 
     | 
    
         
            +
              end
         
     | 
| 
      
 656 
     | 
    
         
            +
             
     | 
| 
      
 657 
     | 
    
         
            +
              def test_multiparameter_attributes_on_time_with_raise_on_small_time_if_missing_date_parts
         
     | 
| 
      
 658 
     | 
    
         
            +
                ex = assert_raise(ActiveRecord::MultiparameterAssignmentErrors) do
         
     | 
| 
      
 659 
     | 
    
         
            +
                  attributes = {
         
     | 
| 
      
 660 
     | 
    
         
            +
                    "written_on(4i)" => "16", "written_on(5i)" => "12", "written_on(6i)" => "02"
         
     | 
| 
      
 661 
     | 
    
         
            +
                  }
         
     | 
| 
      
 662 
     | 
    
         
            +
                  topic = Topic.find(1)
         
     | 
| 
      
 663 
     | 
    
         
            +
                  topic.attributes = attributes
         
     | 
| 
      
 664 
     | 
    
         
            +
                end
         
     | 
| 
      
 665 
     | 
    
         
            +
                assert_equal("written_on", ex.errors[0].attribute)
         
     | 
| 
      
 666 
     | 
    
         
            +
              end
         
     | 
| 
      
 667 
     | 
    
         
            +
             
     | 
| 
      
 668 
     | 
    
         
            +
              def test_multiparameter_attributes_on_time_will_ignore_hour_if_missing
         
     | 
| 
      
 669 
     | 
    
         
            +
                attributes = {
         
     | 
| 
      
 670 
     | 
    
         
            +
                  "written_on(1i)" => "2004", "written_on(2i)" => "12", "written_on(3i)" => "12",
         
     | 
| 
      
 671 
     | 
    
         
            +
                  "written_on(5i)" => "12", "written_on(6i)" => "02"
         
     | 
| 
      
 672 
     | 
    
         
            +
                }
         
     | 
| 
      
 673 
     | 
    
         
            +
                topic = Topic.find(1)
         
     | 
| 
      
 674 
     | 
    
         
            +
                topic.attributes = attributes
         
     | 
| 
      
 675 
     | 
    
         
            +
                assert_equal Time.local(2004, 12, 12, 0, 12, 2), topic.written_on
         
     | 
| 
      
 676 
     | 
    
         
            +
              end
         
     | 
| 
      
 677 
     | 
    
         
            +
             
     | 
| 
      
 678 
     | 
    
         
            +
              def test_multiparameter_attributes_on_time_will_ignore_hour_if_blank
         
     | 
| 
      
 679 
     | 
    
         
            +
                attributes = {
         
     | 
| 
      
 680 
     | 
    
         
            +
                  "written_on(1i)" => "", "written_on(2i)" => "", "written_on(3i)" => "",
         
     | 
| 
      
 681 
     | 
    
         
            +
                  "written_on(4i)" => "", "written_on(5i)" => "12", "written_on(6i)" => "02"
         
     | 
| 
      
 682 
     | 
    
         
            +
                }
         
     | 
| 
      
 683 
     | 
    
         
            +
                topic = Topic.find(1)
         
     | 
| 
      
 684 
     | 
    
         
            +
                topic.attributes = attributes
         
     | 
| 
      
 685 
     | 
    
         
            +
                assert_equal 1, topic.written_on.year
         
     | 
| 
      
 686 
     | 
    
         
            +
                assert_equal 1, topic.written_on.month
         
     | 
| 
      
 687 
     | 
    
         
            +
                assert_equal 1, topic.written_on.day
         
     | 
| 
      
 688 
     | 
    
         
            +
                assert_equal 0, topic.written_on.hour
         
     | 
| 
      
 689 
     | 
    
         
            +
                assert_equal 12, topic.written_on.min
         
     | 
| 
      
 690 
     | 
    
         
            +
                assert_equal 2, topic.written_on.sec
         
     | 
| 
      
 691 
     | 
    
         
            +
              end
         
     | 
| 
      
 692 
     | 
    
         
            +
             
     | 
| 
      
 693 
     | 
    
         
            +
              def test_multiparameter_attributes_on_time_will_ignore_date_if_empty
         
     | 
| 
      
 694 
     | 
    
         
            +
                attributes = {
         
     | 
| 
      
 695 
     | 
    
         
            +
                  "written_on(1i)" => "", "written_on(2i)" => "", "written_on(3i)" => "",
         
     | 
| 
      
 696 
     | 
    
         
            +
                  "written_on(4i)" => "16", "written_on(5i)" => "24"
         
     | 
| 
      
 697 
     | 
    
         
            +
                }
         
     | 
| 
      
 698 
     | 
    
         
            +
                topic = Topic.find(1)
         
     | 
| 
      
 699 
     | 
    
         
            +
                topic.attributes = attributes
         
     | 
| 
      
 700 
     | 
    
         
            +
                assert_equal 1, topic.written_on.year
         
     | 
| 
      
 701 
     | 
    
         
            +
                assert_equal 1, topic.written_on.month
         
     | 
| 
      
 702 
     | 
    
         
            +
                assert_equal 1, topic.written_on.day
         
     | 
| 
      
 703 
     | 
    
         
            +
                assert_equal 16, topic.written_on.hour
         
     | 
| 
      
 704 
     | 
    
         
            +
                assert_equal 24, topic.written_on.min
         
     | 
| 
      
 705 
     | 
    
         
            +
                assert_equal 0, topic.written_on.sec
         
     | 
| 
      
 706 
     | 
    
         
            +
              end
         
     | 
| 
      
 707 
     | 
    
         
            +
              def test_multiparameter_attributes_on_time_with_seconds_will_ignore_date_if_empty
         
     | 
| 
      
 708 
     | 
    
         
            +
                attributes = {
         
     | 
| 
      
 709 
     | 
    
         
            +
                  "written_on(1i)" => "", "written_on(2i)" => "", "written_on(3i)" => "",
         
     | 
| 
      
 710 
     | 
    
         
            +
                  "written_on(4i)" => "16", "written_on(5i)" => "12", "written_on(6i)" => "02"
         
     | 
| 
      
 711 
     | 
    
         
            +
                }
         
     | 
| 
      
 712 
     | 
    
         
            +
                topic = Topic.find(1)
         
     | 
| 
      
 713 
     | 
    
         
            +
                topic.attributes = attributes
         
     | 
| 
      
 714 
     | 
    
         
            +
                assert_equal 1, topic.written_on.year
         
     | 
| 
      
 715 
     | 
    
         
            +
                assert_equal 1, topic.written_on.month
         
     | 
| 
      
 716 
     | 
    
         
            +
                assert_equal 1, topic.written_on.day
         
     | 
| 
      
 717 
     | 
    
         
            +
                assert_equal 16, topic.written_on.hour
         
     | 
| 
      
 718 
     | 
    
         
            +
                assert_equal 12, topic.written_on.min
         
     | 
| 
      
 719 
     | 
    
         
            +
                assert_equal 02, topic.written_on.sec
         
     | 
| 
      
 720 
     | 
    
         
            +
              end
         
     | 
| 
      
 721 
     | 
    
         
            +
             
     | 
| 
       508 
722 
     | 
    
         
             
              def test_multiparameter_attributes_on_time_with_utc
         
     | 
| 
       509 
723 
     | 
    
         
             
                ActiveRecord::Base.default_timezone = :utc
         
     | 
| 
       510 
724 
     | 
    
         
             
                attributes = {
         
     | 
| 
         @@ -611,6 +825,42 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       611 
825 
     | 
    
         
             
                assert_equal address, customer.address
         
     | 
| 
       612 
826 
     | 
    
         
             
              end
         
     | 
| 
       613 
827 
     | 
    
         | 
| 
      
 828 
     | 
    
         
            +
              def test_multiparameter_assignment_of_aggregation_out_of_order
         
     | 
| 
      
 829 
     | 
    
         
            +
                customer = Customer.new
         
     | 
| 
      
 830 
     | 
    
         
            +
                address = Address.new("The Street", "The City", "The Country")
         
     | 
| 
      
 831 
     | 
    
         
            +
                attributes = { "address(3)" => address.country, "address(2)" => address.city, "address(1)" => address.street }
         
     | 
| 
      
 832 
     | 
    
         
            +
                customer.attributes = attributes
         
     | 
| 
      
 833 
     | 
    
         
            +
                assert_equal address, customer.address
         
     | 
| 
      
 834 
     | 
    
         
            +
              end
         
     | 
| 
      
 835 
     | 
    
         
            +
             
     | 
| 
      
 836 
     | 
    
         
            +
              def test_multiparameter_assignment_of_aggregation_with_missing_values
         
     | 
| 
      
 837 
     | 
    
         
            +
                ex = assert_raise(ActiveRecord::MultiparameterAssignmentErrors) do
         
     | 
| 
      
 838 
     | 
    
         
            +
                  customer = Customer.new
         
     | 
| 
      
 839 
     | 
    
         
            +
                  address = Address.new("The Street", "The City", "The Country")
         
     | 
| 
      
 840 
     | 
    
         
            +
                  attributes = { "address(2)" => address.city, "address(3)" => address.country }
         
     | 
| 
      
 841 
     | 
    
         
            +
                  customer.attributes = attributes
         
     | 
| 
      
 842 
     | 
    
         
            +
                end
         
     | 
| 
      
 843 
     | 
    
         
            +
                assert_equal("address", ex.errors[0].attribute)
         
     | 
| 
      
 844 
     | 
    
         
            +
              end
         
     | 
| 
      
 845 
     | 
    
         
            +
             
     | 
| 
      
 846 
     | 
    
         
            +
              def test_multiparameter_assignment_of_aggregation_with_blank_values
         
     | 
| 
      
 847 
     | 
    
         
            +
                customer = Customer.new
         
     | 
| 
      
 848 
     | 
    
         
            +
                address = Address.new("The Street", "The City", "The Country")
         
     | 
| 
      
 849 
     | 
    
         
            +
                attributes = { "address(1)" => "", "address(2)" => address.city, "address(3)" => address.country }
         
     | 
| 
      
 850 
     | 
    
         
            +
                customer.attributes = attributes
         
     | 
| 
      
 851 
     | 
    
         
            +
                assert_equal Address.new(nil, "The City", "The Country"), customer.address
         
     | 
| 
      
 852 
     | 
    
         
            +
              end
         
     | 
| 
      
 853 
     | 
    
         
            +
             
     | 
| 
      
 854 
     | 
    
         
            +
              def test_multiparameter_assignment_of_aggregation_with_large_index
         
     | 
| 
      
 855 
     | 
    
         
            +
                ex = assert_raise(ActiveRecord::MultiparameterAssignmentErrors) do
         
     | 
| 
      
 856 
     | 
    
         
            +
                  customer = Customer.new
         
     | 
| 
      
 857 
     | 
    
         
            +
                  address = Address.new("The Street", "The City", "The Country")
         
     | 
| 
      
 858 
     | 
    
         
            +
                  attributes = { "address(1)" => "The Street", "address(2)" => address.city, "address(3000)" => address.country }
         
     | 
| 
      
 859 
     | 
    
         
            +
                  customer.attributes = attributes
         
     | 
| 
      
 860 
     | 
    
         
            +
                end
         
     | 
| 
      
 861 
     | 
    
         
            +
                assert_equal("address", ex.errors[0].attribute)
         
     | 
| 
      
 862 
     | 
    
         
            +
              end
         
     | 
| 
      
 863 
     | 
    
         
            +
             
     | 
| 
       614 
864 
     | 
    
         
             
              def test_attributes_on_dummy_time
         
     | 
| 
       615 
865 
     | 
    
         
             
                # Oracle, and Sybase do not have a TIME datatype.
         
     | 
| 
       616 
866 
     | 
    
         
             
                return true if current_adapter?(:OracleAdapter, :SybaseAdapter)
         
     | 
| 
         @@ -660,60 +910,65 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       660 
910 
     | 
    
         
             
                assert_equal true, Topic.find(1).persisted?
         
     | 
| 
       661 
911 
     | 
    
         
             
              end
         
     | 
| 
       662 
912 
     | 
    
         | 
| 
       663 
     | 
    
         
            -
              def  
     | 
| 
      
 913 
     | 
    
         
            +
              def test_dup
         
     | 
| 
       664 
914 
     | 
    
         
             
                topic = Topic.find(1)
         
     | 
| 
       665 
     | 
    
         
            -
                 
     | 
| 
       666 
     | 
    
         
            -
                assert_nothing_raised {  
     | 
| 
       667 
     | 
    
         
            -
                assert_equal topic.title,  
     | 
| 
       668 
     | 
    
         
            -
                assert ! 
     | 
| 
      
 915 
     | 
    
         
            +
                duped_topic = nil
         
     | 
| 
      
 916 
     | 
    
         
            +
                assert_nothing_raised { duped_topic = topic.dup }
         
     | 
| 
      
 917 
     | 
    
         
            +
                assert_equal topic.title, duped_topic.title
         
     | 
| 
      
 918 
     | 
    
         
            +
                assert !duped_topic.persisted?
         
     | 
| 
       669 
919 
     | 
    
         | 
| 
       670 
     | 
    
         
            -
                # test if the attributes have been  
     | 
| 
      
 920 
     | 
    
         
            +
                # test if the attributes have been duped
         
     | 
| 
       671 
921 
     | 
    
         
             
                topic.title = "a"
         
     | 
| 
       672 
     | 
    
         
            -
                 
     | 
| 
      
 922 
     | 
    
         
            +
                duped_topic.title = "b"
         
     | 
| 
       673 
923 
     | 
    
         
             
                assert_equal "a", topic.title
         
     | 
| 
       674 
     | 
    
         
            -
                assert_equal "b",  
     | 
| 
      
 924 
     | 
    
         
            +
                assert_equal "b", duped_topic.title
         
     | 
| 
       675 
925 
     | 
    
         | 
| 
       676 
     | 
    
         
            -
                # test if the attribute values have been  
     | 
| 
      
 926 
     | 
    
         
            +
                # test if the attribute values have been duped
         
     | 
| 
       677 
927 
     | 
    
         
             
                topic.title = {"a" => "b"}
         
     | 
| 
       678 
     | 
    
         
            -
                 
     | 
| 
       679 
     | 
    
         
            -
                 
     | 
| 
      
 928 
     | 
    
         
            +
                duped_topic = topic.dup
         
     | 
| 
      
 929 
     | 
    
         
            +
                duped_topic.title["a"] = "c"
         
     | 
| 
       680 
930 
     | 
    
         
             
                assert_equal "b", topic.title["a"]
         
     | 
| 
       681 
931 
     | 
    
         | 
| 
       682 
     | 
    
         
            -
                # test if attributes set as part of after_initialize are  
     | 
| 
       683 
     | 
    
         
            -
                assert_equal topic.author_email_address,  
     | 
| 
      
 932 
     | 
    
         
            +
                # test if attributes set as part of after_initialize are duped correctly
         
     | 
| 
      
 933 
     | 
    
         
            +
                assert_equal topic.author_email_address, duped_topic.author_email_address
         
     | 
| 
       684 
934 
     | 
    
         | 
| 
       685 
935 
     | 
    
         
             
                # test if saved clone object differs from original
         
     | 
| 
       686 
     | 
    
         
            -
                 
     | 
| 
       687 
     | 
    
         
            -
                assert  
     | 
| 
       688 
     | 
    
         
            -
                assert_not_equal  
     | 
| 
      
 936 
     | 
    
         
            +
                duped_topic.save
         
     | 
| 
      
 937 
     | 
    
         
            +
                assert duped_topic.persisted?
         
     | 
| 
      
 938 
     | 
    
         
            +
                assert_not_equal duped_topic.id, topic.id
         
     | 
| 
      
 939 
     | 
    
         
            +
             
     | 
| 
      
 940 
     | 
    
         
            +
                duped_topic.reload
         
     | 
| 
      
 941 
     | 
    
         
            +
                # FIXME: I think this is poor behavior, and will fix it with #5686
         
     | 
| 
      
 942 
     | 
    
         
            +
                assert_equal({'a' => 'c'}.to_yaml, duped_topic.title)
         
     | 
| 
       689 
943 
     | 
    
         
             
              end
         
     | 
| 
       690 
944 
     | 
    
         | 
| 
       691 
     | 
    
         
            -
              def  
     | 
| 
      
 945 
     | 
    
         
            +
              def test_dup_with_aggregate_of_same_name_as_attribute
         
     | 
| 
       692 
946 
     | 
    
         
             
                dev = DeveloperWithAggregate.find(1)
         
     | 
| 
       693 
947 
     | 
    
         
             
                assert_kind_of DeveloperSalary, dev.salary
         
     | 
| 
       694 
948 
     | 
    
         | 
| 
       695 
     | 
    
         
            -
                 
     | 
| 
       696 
     | 
    
         
            -
                assert_nothing_raised {  
     | 
| 
       697 
     | 
    
         
            -
                assert_kind_of DeveloperSalary,  
     | 
| 
       698 
     | 
    
         
            -
                assert_equal dev.salary.amount,  
     | 
| 
       699 
     | 
    
         
            -
                assert ! 
     | 
| 
      
 949 
     | 
    
         
            +
                dup = nil
         
     | 
| 
      
 950 
     | 
    
         
            +
                assert_nothing_raised { dup = dev.dup }
         
     | 
| 
      
 951 
     | 
    
         
            +
                assert_kind_of DeveloperSalary, dup.salary
         
     | 
| 
      
 952 
     | 
    
         
            +
                assert_equal dev.salary.amount, dup.salary.amount
         
     | 
| 
      
 953 
     | 
    
         
            +
                assert !dup.persisted?
         
     | 
| 
       700 
954 
     | 
    
         | 
| 
       701 
     | 
    
         
            -
                # test if the attributes have been  
     | 
| 
       702 
     | 
    
         
            -
                original_amount =  
     | 
| 
      
 955 
     | 
    
         
            +
                # test if the attributes have been dupd
         
     | 
| 
      
 956 
     | 
    
         
            +
                original_amount = dup.salary.amount
         
     | 
| 
       703 
957 
     | 
    
         
             
                dev.salary.amount = 1
         
     | 
| 
       704 
     | 
    
         
            -
                assert_equal original_amount,  
     | 
| 
      
 958 
     | 
    
         
            +
                assert_equal original_amount, dup.salary.amount
         
     | 
| 
       705 
959 
     | 
    
         | 
| 
       706 
     | 
    
         
            -
                assert  
     | 
| 
       707 
     | 
    
         
            -
                assert  
     | 
| 
       708 
     | 
    
         
            -
                assert_not_equal  
     | 
| 
      
 960 
     | 
    
         
            +
                assert dup.save
         
     | 
| 
      
 961 
     | 
    
         
            +
                assert dup.persisted?
         
     | 
| 
      
 962 
     | 
    
         
            +
                assert_not_equal dup.id, dev.id
         
     | 
| 
       709 
963 
     | 
    
         
             
              end
         
     | 
| 
       710 
964 
     | 
    
         | 
| 
       711 
     | 
    
         
            -
              def  
     | 
| 
      
 965 
     | 
    
         
            +
              def test_dup_does_not_copy_associations
         
     | 
| 
       712 
966 
     | 
    
         
             
                author = authors(:david)
         
     | 
| 
       713 
967 
     | 
    
         
             
                assert_not_equal [], author.posts
         
     | 
| 
      
 968 
     | 
    
         
            +
                author.send(:clear_association_cache)
         
     | 
| 
       714 
969 
     | 
    
         | 
| 
       715 
     | 
    
         
            -
                 
     | 
| 
       716 
     | 
    
         
            -
                assert_equal [],  
     | 
| 
      
 970 
     | 
    
         
            +
                author_dup = author.dup
         
     | 
| 
      
 971 
     | 
    
         
            +
                assert_equal [], author_dup.posts
         
     | 
| 
       717 
972 
     | 
    
         
             
              end
         
     | 
| 
       718 
973 
     | 
    
         | 
| 
       719 
974 
     | 
    
         
             
              def test_clone_preserves_subtype
         
     | 
| 
         @@ -752,24 +1007,24 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       752 
1007 
     | 
    
         
             
                assert !cloned_developer.salary_changed?  # ... and cloned instance should behave same
         
     | 
| 
       753 
1008 
     | 
    
         
             
              end
         
     | 
| 
       754 
1009 
     | 
    
         | 
| 
       755 
     | 
    
         
            -
              def  
     | 
| 
      
 1010 
     | 
    
         
            +
              def test_dup_of_saved_object_marks_attributes_as_dirty
         
     | 
| 
       756 
1011 
     | 
    
         
             
                developer = Developer.create! :name => 'Bjorn', :salary => 100000
         
     | 
| 
       757 
1012 
     | 
    
         
             
                assert !developer.name_changed?
         
     | 
| 
       758 
1013 
     | 
    
         
             
                assert !developer.salary_changed?
         
     | 
| 
       759 
1014 
     | 
    
         | 
| 
       760 
     | 
    
         
            -
                cloned_developer = developer. 
     | 
| 
      
 1015 
     | 
    
         
            +
                cloned_developer = developer.dup
         
     | 
| 
       761 
1016 
     | 
    
         
             
                assert cloned_developer.name_changed?     # both attributes differ from defaults
         
     | 
| 
       762 
1017 
     | 
    
         
             
                assert cloned_developer.salary_changed?
         
     | 
| 
       763 
1018 
     | 
    
         
             
              end
         
     | 
| 
       764 
1019 
     | 
    
         | 
| 
       765 
     | 
    
         
            -
              def  
     | 
| 
      
 1020 
     | 
    
         
            +
              def test_dup_of_saved_object_marks_as_dirty_only_changed_attributes
         
     | 
| 
       766 
1021 
     | 
    
         
             
                developer = Developer.create! :name => 'Bjorn'
         
     | 
| 
       767 
     | 
    
         
            -
                assert !developer.name_changed?           # both attributes of saved object should be  
     | 
| 
      
 1022 
     | 
    
         
            +
                assert !developer.name_changed?           # both attributes of saved object should be treated as not changed
         
     | 
| 
       768 
1023 
     | 
    
         
             
                assert !developer.salary_changed?
         
     | 
| 
       769 
1024 
     | 
    
         | 
| 
       770 
     | 
    
         
            -
                cloned_developer = developer. 
     | 
| 
      
 1025 
     | 
    
         
            +
                cloned_developer = developer.dup
         
     | 
| 
       771 
1026 
     | 
    
         
             
                assert cloned_developer.name_changed?     # ... but on cloned object should be
         
     | 
| 
       772 
     | 
    
         
            -
                assert !cloned_developer.salary_changed?  # ... BUT salary has non-nil default which should be  
     | 
| 
      
 1027 
     | 
    
         
            +
                assert !cloned_developer.salary_changed?  # ... BUT salary has non-nil default which should be treated as not changed on cloned instance
         
     | 
| 
       773 
1028 
     | 
    
         
             
              end
         
     | 
| 
       774 
1029 
     | 
    
         | 
| 
       775 
1030 
     | 
    
         
             
              def test_bignum
         
     | 
| 
         @@ -815,7 +1070,7 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       815 
1070 
     | 
    
         
             
                  assert g.save
         
     | 
| 
       816 
1071 
     | 
    
         | 
| 
       817 
1072 
     | 
    
         
             
                  # Reload and check that we have all the geometric attributes.
         
     | 
| 
       818 
     | 
    
         
            -
                  h = Geometric.find(g.id)
         
     | 
| 
      
 1073 
     | 
    
         
            +
                  h = ActiveRecord::IdentityMap.without { Geometric.find(g.id) }
         
     | 
| 
       819 
1074 
     | 
    
         | 
| 
       820 
1075 
     | 
    
         
             
                  assert_equal '(5,6.1)', h.a_point
         
     | 
| 
       821 
1076 
     | 
    
         
             
                  assert_equal '[(2,3),(5.5,7)]', h.a_line_segment
         
     | 
| 
         @@ -843,7 +1098,7 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       843 
1098 
     | 
    
         
             
                  assert g.save
         
     | 
| 
       844 
1099 
     | 
    
         | 
| 
       845 
1100 
     | 
    
         
             
                  # Reload and check that we have all the geometric attributes.
         
     | 
| 
       846 
     | 
    
         
            -
                  h = Geometric.find(g.id)
         
     | 
| 
      
 1101 
     | 
    
         
            +
                  h = ActiveRecord::IdentityMap.without { Geometric.find(g.id) }
         
     | 
| 
       847 
1102 
     | 
    
         | 
| 
       848 
1103 
     | 
    
         
             
                  assert_equal '(5,6.1)', h.a_point
         
     | 
| 
       849 
1104 
     | 
    
         
             
                  assert_equal '[(2,3),(5.5,7)]', h.a_line_segment
         
     | 
| 
         @@ -862,6 +1117,17 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       862 
1117 
     | 
    
         
             
                self.table_name = 'numeric_data'
         
     | 
| 
       863 
1118 
     | 
    
         
             
              end
         
     | 
| 
       864 
1119 
     | 
    
         | 
| 
      
 1120 
     | 
    
         
            +
              def test_big_decimal_conditions
         
     | 
| 
      
 1121 
     | 
    
         
            +
                m = NumericData.new(
         
     | 
| 
      
 1122 
     | 
    
         
            +
                  :bank_balance => 1586.43,
         
     | 
| 
      
 1123 
     | 
    
         
            +
                  :big_bank_balance => BigDecimal("1000234000567.95"),
         
     | 
| 
      
 1124 
     | 
    
         
            +
                  :world_population => 6000000000,
         
     | 
| 
      
 1125 
     | 
    
         
            +
                  :my_house_population => 3
         
     | 
| 
      
 1126 
     | 
    
         
            +
                )
         
     | 
| 
      
 1127 
     | 
    
         
            +
                assert m.save
         
     | 
| 
      
 1128 
     | 
    
         
            +
                assert_equal 0, NumericData.where("bank_balance > ?", 2000.0).count
         
     | 
| 
      
 1129 
     | 
    
         
            +
              end
         
     | 
| 
      
 1130 
     | 
    
         
            +
             
     | 
| 
       865 
1131 
     | 
    
         
             
              def test_numeric_fields
         
     | 
| 
       866 
1132 
     | 
    
         
             
                m = NumericData.new(
         
     | 
| 
       867 
1133 
     | 
    
         
             
                  :bank_balance => 1586.43,
         
     | 
| 
         @@ -881,13 +1147,14 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       881 
1147 
     | 
    
         
             
                  assert_kind_of Integer, m1.world_population
         
     | 
| 
       882 
1148 
     | 
    
         
             
                else
         
     | 
| 
       883 
1149 
     | 
    
         
             
                  assert_kind_of BigDecimal, m1.world_population
         
     | 
| 
       884 
     | 
    
         
            -
                end 
     | 
| 
      
 1150 
     | 
    
         
            +
                end
         
     | 
| 
       885 
1151 
     | 
    
         
             
                assert_equal 6000000000, m1.world_population
         
     | 
| 
      
 1152 
     | 
    
         
            +
             
     | 
| 
       886 
1153 
     | 
    
         
             
                unless current_adapter?(:IBM_DBAdapter)
         
     | 
| 
       887 
1154 
     | 
    
         
             
                  assert_kind_of Fixnum, m1.my_house_population
         
     | 
| 
       888 
1155 
     | 
    
         
             
                else
         
     | 
| 
       889 
1156 
     | 
    
         
             
                  assert_kind_of BigDecimal, m1.my_house_population
         
     | 
| 
       890 
     | 
    
         
            -
                end 
     | 
| 
      
 1157 
     | 
    
         
            +
                end
         
     | 
| 
       891 
1158 
     | 
    
         
             
                assert_equal 3, m1.my_house_population
         
     | 
| 
       892 
1159 
     | 
    
         | 
| 
       893 
1160 
     | 
    
         
             
                assert_kind_of BigDecimal, m1.bank_balance
         
     | 
| 
         @@ -966,7 +1233,6 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       966 
1233 
     | 
    
         
             
              end
         
     | 
| 
       967 
1234 
     | 
    
         | 
| 
       968 
1235 
     | 
    
         
             
              def test_nil_serialized_attribute_with_class_constraint
         
     | 
| 
       969 
     | 
    
         
            -
                myobj = MyObject.new('value1', 'value2')
         
     | 
| 
       970 
1236 
     | 
    
         
             
                topic = Topic.new
         
     | 
| 
       971 
1237 
     | 
    
         
             
                assert_nil topic.content
         
     | 
| 
       972 
1238 
     | 
    
         
             
              end
         
     | 
| 
         @@ -976,7 +1242,7 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       976 
1242 
     | 
    
         
             
                topic = Topic.new(:content => myobj)
         
     | 
| 
       977 
1243 
     | 
    
         
             
                assert topic.save
         
     | 
| 
       978 
1244 
     | 
    
         
             
                Topic.serialize(:content, Hash)
         
     | 
| 
       979 
     | 
    
         
            -
                assert_raise(ActiveRecord::SerializationTypeMismatch) { Topic.find(topic.id).content }
         
     | 
| 
      
 1245 
     | 
    
         
            +
                assert_raise(ActiveRecord::SerializationTypeMismatch) { Topic.find(topic.id).reload.content }
         
     | 
| 
       980 
1246 
     | 
    
         
             
              ensure
         
     | 
| 
       981 
1247 
     | 
    
         
             
                Topic.serialize(:content)
         
     | 
| 
       982 
1248 
     | 
    
         
             
              end
         
     | 
| 
         @@ -991,6 +1257,87 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       991 
1257 
     | 
    
         
             
                Topic.serialize(:content)
         
     | 
| 
       992 
1258 
     | 
    
         
             
              end
         
     | 
| 
       993 
1259 
     | 
    
         | 
| 
      
 1260 
     | 
    
         
            +
              def test_serialized_default_class
         
     | 
| 
      
 1261 
     | 
    
         
            +
                Topic.serialize(:content, Hash)
         
     | 
| 
      
 1262 
     | 
    
         
            +
                topic = Topic.new
         
     | 
| 
      
 1263 
     | 
    
         
            +
                assert_equal Hash, topic.content.class
         
     | 
| 
      
 1264 
     | 
    
         
            +
                assert_equal Hash, topic.read_attribute(:content).class
         
     | 
| 
      
 1265 
     | 
    
         
            +
                topic.content["beer"] = "MadridRb"
         
     | 
| 
      
 1266 
     | 
    
         
            +
                assert topic.save
         
     | 
| 
      
 1267 
     | 
    
         
            +
                topic.reload
         
     | 
| 
      
 1268 
     | 
    
         
            +
                assert_equal Hash, topic.content.class
         
     | 
| 
      
 1269 
     | 
    
         
            +
                assert_equal "MadridRb", topic.content["beer"]
         
     | 
| 
      
 1270 
     | 
    
         
            +
              ensure
         
     | 
| 
      
 1271 
     | 
    
         
            +
                Topic.serialize(:content)
         
     | 
| 
      
 1272 
     | 
    
         
            +
              end
         
     | 
| 
      
 1273 
     | 
    
         
            +
             
     | 
| 
      
 1274 
     | 
    
         
            +
              def test_serialized_no_default_class_for_object
         
     | 
| 
      
 1275 
     | 
    
         
            +
                topic = Topic.new
         
     | 
| 
      
 1276 
     | 
    
         
            +
                assert_nil topic.content
         
     | 
| 
      
 1277 
     | 
    
         
            +
              end
         
     | 
| 
      
 1278 
     | 
    
         
            +
             
     | 
| 
      
 1279 
     | 
    
         
            +
              def test_serialized_boolean_value_true
         
     | 
| 
      
 1280 
     | 
    
         
            +
                Topic.serialize(:content)
         
     | 
| 
      
 1281 
     | 
    
         
            +
                topic = Topic.new(:content => true)
         
     | 
| 
      
 1282 
     | 
    
         
            +
                assert topic.save
         
     | 
| 
      
 1283 
     | 
    
         
            +
                topic = topic.reload
         
     | 
| 
      
 1284 
     | 
    
         
            +
                assert_equal topic.content, true
         
     | 
| 
      
 1285 
     | 
    
         
            +
              end
         
     | 
| 
      
 1286 
     | 
    
         
            +
             
     | 
| 
      
 1287 
     | 
    
         
            +
              def test_serialized_boolean_value_false
         
     | 
| 
      
 1288 
     | 
    
         
            +
                Topic.serialize(:content)
         
     | 
| 
      
 1289 
     | 
    
         
            +
                topic = Topic.new(:content => false)
         
     | 
| 
      
 1290 
     | 
    
         
            +
                assert topic.save
         
     | 
| 
      
 1291 
     | 
    
         
            +
                topic = topic.reload
         
     | 
| 
      
 1292 
     | 
    
         
            +
                assert_equal topic.content, false
         
     | 
| 
      
 1293 
     | 
    
         
            +
              end
         
     | 
| 
      
 1294 
     | 
    
         
            +
             
     | 
| 
      
 1295 
     | 
    
         
            +
              def test_serialize_with_coder
         
     | 
| 
      
 1296 
     | 
    
         
            +
                coder = Class.new {
         
     | 
| 
      
 1297 
     | 
    
         
            +
                  # Identity
         
     | 
| 
      
 1298 
     | 
    
         
            +
                  def load(thing)
         
     | 
| 
      
 1299 
     | 
    
         
            +
                    thing
         
     | 
| 
      
 1300 
     | 
    
         
            +
                  end
         
     | 
| 
      
 1301 
     | 
    
         
            +
             
     | 
| 
      
 1302 
     | 
    
         
            +
                  # base 64
         
     | 
| 
      
 1303 
     | 
    
         
            +
                  def dump(thing)
         
     | 
| 
      
 1304 
     | 
    
         
            +
                    [thing].pack('m')
         
     | 
| 
      
 1305 
     | 
    
         
            +
                  end
         
     | 
| 
      
 1306 
     | 
    
         
            +
                }.new
         
     | 
| 
      
 1307 
     | 
    
         
            +
             
     | 
| 
      
 1308 
     | 
    
         
            +
                Topic.serialize(:content, coder)
         
     | 
| 
      
 1309 
     | 
    
         
            +
                s = 'hello world'
         
     | 
| 
      
 1310 
     | 
    
         
            +
                topic = Topic.new(:content => s)
         
     | 
| 
      
 1311 
     | 
    
         
            +
                assert topic.save
         
     | 
| 
      
 1312 
     | 
    
         
            +
                topic = topic.reload
         
     | 
| 
      
 1313 
     | 
    
         
            +
                assert_equal [s].pack('m'), topic.content
         
     | 
| 
      
 1314 
     | 
    
         
            +
              ensure
         
     | 
| 
      
 1315 
     | 
    
         
            +
                Topic.serialize(:content)
         
     | 
| 
      
 1316 
     | 
    
         
            +
              end
         
     | 
| 
      
 1317 
     | 
    
         
            +
             
     | 
| 
      
 1318 
     | 
    
         
            +
              def test_serialize_with_bcrypt_coder
         
     | 
| 
      
 1319 
     | 
    
         
            +
                crypt_coder = Class.new {
         
     | 
| 
      
 1320 
     | 
    
         
            +
                  def load(thing)
         
     | 
| 
      
 1321 
     | 
    
         
            +
                    return unless thing
         
     | 
| 
      
 1322 
     | 
    
         
            +
                    BCrypt::Password.new thing
         
     | 
| 
      
 1323 
     | 
    
         
            +
                  end
         
     | 
| 
      
 1324 
     | 
    
         
            +
             
     | 
| 
      
 1325 
     | 
    
         
            +
                  def dump(thing)
         
     | 
| 
      
 1326 
     | 
    
         
            +
                    BCrypt::Password.create(thing).to_s
         
     | 
| 
      
 1327 
     | 
    
         
            +
                  end
         
     | 
| 
      
 1328 
     | 
    
         
            +
                }.new
         
     | 
| 
      
 1329 
     | 
    
         
            +
             
     | 
| 
      
 1330 
     | 
    
         
            +
                Topic.serialize(:content, crypt_coder)
         
     | 
| 
      
 1331 
     | 
    
         
            +
                password = 'password'
         
     | 
| 
      
 1332 
     | 
    
         
            +
                topic = Topic.new(:content => password)
         
     | 
| 
      
 1333 
     | 
    
         
            +
                assert topic.save
         
     | 
| 
      
 1334 
     | 
    
         
            +
                topic = topic.reload
         
     | 
| 
      
 1335 
     | 
    
         
            +
                assert_kind_of BCrypt::Password, topic.content
         
     | 
| 
      
 1336 
     | 
    
         
            +
                assert_equal(true, topic.content == password, 'password should equal')
         
     | 
| 
      
 1337 
     | 
    
         
            +
              ensure
         
     | 
| 
      
 1338 
     | 
    
         
            +
                Topic.serialize(:content)
         
     | 
| 
      
 1339 
     | 
    
         
            +
              end
         
     | 
| 
      
 1340 
     | 
    
         
            +
             
     | 
| 
       994 
1341 
     | 
    
         
             
              def test_quote
         
     | 
| 
       995 
1342 
     | 
    
         
             
                author_name = "\\ \001 ' \n \\n \""
         
     | 
| 
       996 
1343 
     | 
    
         
             
                topic = Topic.create('author_name' => author_name)
         
     | 
| 
         @@ -1046,9 +1393,14 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       1046 
1393 
     | 
    
         
             
              end
         
     | 
| 
       1047 
1394 
     | 
    
         | 
| 
       1048 
1395 
     | 
    
         
             
              def test_define_attr_method_with_block
         
     | 
| 
       1049 
     | 
    
         
            -
                k = Class.new( ActiveRecord::Base )
         
     | 
| 
       1050 
     | 
    
         
            -
             
     | 
| 
       1051 
     | 
    
         
            -
             
     | 
| 
      
 1396 
     | 
    
         
            +
                k = Class.new( ActiveRecord::Base ) do
         
     | 
| 
      
 1397 
     | 
    
         
            +
                  class << self
         
     | 
| 
      
 1398 
     | 
    
         
            +
                    attr_accessor :foo_key
         
     | 
| 
      
 1399 
     | 
    
         
            +
                  end
         
     | 
| 
      
 1400 
     | 
    
         
            +
                end
         
     | 
| 
      
 1401 
     | 
    
         
            +
                k.foo_key = "id"
         
     | 
| 
      
 1402 
     | 
    
         
            +
                k.send(:define_attr_method, :foo_key) { "sys_" + original_foo_key }
         
     | 
| 
      
 1403 
     | 
    
         
            +
                assert_equal "sys_id", k.foo_key
         
     | 
| 
       1052 
1404 
     | 
    
         
             
              end
         
     | 
| 
       1053 
1405 
     | 
    
         | 
| 
       1054 
1406 
     | 
    
         
             
              def test_set_table_name_with_value
         
     | 
| 
         @@ -1059,6 +1411,16 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       1059 
1411 
     | 
    
         
             
                assert_equal "bar", k.table_name
         
     | 
| 
       1060 
1412 
     | 
    
         
             
              end
         
     | 
| 
       1061 
1413 
     | 
    
         | 
| 
      
 1414 
     | 
    
         
            +
              def test_switching_between_table_name
         
     | 
| 
      
 1415 
     | 
    
         
            +
                assert_difference("GoodJoke.count") do
         
     | 
| 
      
 1416 
     | 
    
         
            +
                  Joke.set_table_name "cold_jokes"
         
     | 
| 
      
 1417 
     | 
    
         
            +
                  Joke.create
         
     | 
| 
      
 1418 
     | 
    
         
            +
             
     | 
| 
      
 1419 
     | 
    
         
            +
                  Joke.set_table_name "funny_jokes"
         
     | 
| 
      
 1420 
     | 
    
         
            +
                  Joke.create
         
     | 
| 
      
 1421 
     | 
    
         
            +
                end
         
     | 
| 
      
 1422 
     | 
    
         
            +
              end
         
     | 
| 
      
 1423 
     | 
    
         
            +
             
     | 
| 
       1062 
1424 
     | 
    
         
             
              def test_quoted_table_name_after_set_table_name
         
     | 
| 
       1063 
1425 
     | 
    
         
             
                klass = Class.new(ActiveRecord::Base)
         
     | 
| 
       1064 
1426 
     | 
    
         | 
| 
         @@ -1087,6 +1449,7 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       1087 
1449 
     | 
    
         | 
| 
       1088 
1450 
     | 
    
         
             
              def test_set_primary_key_with_block
         
     | 
| 
       1089 
1451 
     | 
    
         
             
                k = Class.new( ActiveRecord::Base )
         
     | 
| 
      
 1452 
     | 
    
         
            +
                k.primary_key = 'id'
         
     | 
| 
       1090 
1453 
     | 
    
         
             
                k.set_primary_key { "sys_" + original_primary_key }
         
     | 
| 
       1091 
1454 
     | 
    
         
             
                assert_equal "sys_id", k.primary_key
         
     | 
| 
       1092 
1455 
     | 
    
         
             
              end
         
     | 
| 
         @@ -1139,12 +1502,6 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       1139 
1502 
     | 
    
         
             
                assert_equal res6, res7
         
     | 
| 
       1140 
1503 
     | 
    
         
             
              end
         
     | 
| 
       1141 
1504 
     | 
    
         | 
| 
       1142 
     | 
    
         
            -
              def test_interpolate_sql
         
     | 
| 
       1143 
     | 
    
         
            -
                assert_nothing_raised { Category.new.send(:interpolate_sql, 'foo@bar') }
         
     | 
| 
       1144 
     | 
    
         
            -
                assert_nothing_raised { Category.new.send(:interpolate_sql, 'foo bar) baz') }
         
     | 
| 
       1145 
     | 
    
         
            -
                assert_nothing_raised { Category.new.send(:interpolate_sql, 'foo bar} baz') }
         
     | 
| 
       1146 
     | 
    
         
            -
              end
         
     | 
| 
       1147 
     | 
    
         
            -
             
     | 
| 
       1148 
1505 
     | 
    
         
             
              def test_scoped_find_conditions
         
     | 
| 
       1149 
1506 
     | 
    
         
             
                scoped_developers = Developer.send(:with_scope, :find => { :conditions => 'salary > 90000' }) do
         
     | 
| 
       1150 
1507 
     | 
    
         
             
                  Developer.find(:all, :conditions => 'id < 5')
         
     | 
| 
         @@ -1153,6 +1510,12 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       1153 
1510 
     | 
    
         
             
                assert_equal 3, scoped_developers.size
         
     | 
| 
       1154 
1511 
     | 
    
         
             
              end
         
     | 
| 
       1155 
1512 
     | 
    
         | 
| 
      
 1513 
     | 
    
         
            +
              def test_no_limit_offset
         
     | 
| 
      
 1514 
     | 
    
         
            +
                assert_nothing_raised do
         
     | 
| 
      
 1515 
     | 
    
         
            +
                  Developer.find(:all, :offset => 2)
         
     | 
| 
      
 1516 
     | 
    
         
            +
                end
         
     | 
| 
      
 1517 
     | 
    
         
            +
              end
         
     | 
| 
      
 1518 
     | 
    
         
            +
             
     | 
| 
       1156 
1519 
     | 
    
         
             
              def test_scoped_find_limit_offset
         
     | 
| 
       1157 
1520 
     | 
    
         
             
                scoped_developers = Developer.send(:with_scope, :find => { :limit => 3, :offset => 2 }) do
         
     | 
| 
       1158 
1521 
     | 
    
         
             
                  Developer.find(:all, :order => 'id')
         
     | 
| 
         @@ -1278,6 +1641,10 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       1278 
1641 
     | 
    
         
             
                assert !LooseDescendant.abstract_class?
         
     | 
| 
       1279 
1642 
     | 
    
         
             
              end
         
     | 
| 
       1280 
1643 
     | 
    
         | 
| 
      
 1644 
     | 
    
         
            +
              def test_abstract_class_table_name
         
     | 
| 
      
 1645 
     | 
    
         
            +
                assert_nil AbstractCompany.table_name
         
     | 
| 
      
 1646 
     | 
    
         
            +
              end
         
     | 
| 
      
 1647 
     | 
    
         
            +
             
     | 
| 
       1281 
1648 
     | 
    
         
             
              def test_base_class
         
     | 
| 
       1282 
1649 
     | 
    
         
             
                assert_equal LoosePerson,     LoosePerson.base_class
         
     | 
| 
       1283 
1650 
     | 
    
         
             
                assert_equal LooseDescendant, LooseDescendant.base_class
         
     | 
| 
         @@ -1350,7 +1717,7 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       1350 
1717 
     | 
    
         | 
| 
       1351 
1718 
     | 
    
         
             
              def test_inspect_instance
         
     | 
| 
       1352 
1719 
     | 
    
         
             
                topic = topics(:first)
         
     | 
| 
       1353 
     | 
    
         
            -
                assert_equal %(#<Topic id: 1, title: "The First Topic", author_name: "David", author_email_address: "david@loudthinking.com", written_on: "#{topic.written_on.to_s(:db)}", bonus_time: "#{topic.bonus_time.to_s(:db)}", last_read: "#{topic.last_read.to_s(:db)}", content: "Have a nice day", approved: false, replies_count: 1, parent_id: nil, parent_title: nil, type: nil, group: nil>), topic.inspect
         
     | 
| 
      
 1720 
     | 
    
         
            +
                assert_equal %(#<Topic id: 1, title: "The First Topic", author_name: "David", author_email_address: "david@loudthinking.com", written_on: "#{topic.written_on.to_s(:db)}", bonus_time: "#{topic.bonus_time.to_s(:db)}", last_read: "#{topic.last_read.to_s(:db)}", content: "Have a nice day", approved: false, replies_count: 1, parent_id: nil, parent_title: nil, type: nil, group: nil, created_at: "#{topic.created_at.to_s(:db)}", updated_at: "#{topic.updated_at.to_s(:db)}">), topic.inspect
         
     | 
| 
       1354 
1721 
     | 
    
         
             
              end
         
     | 
| 
       1355 
1722 
     | 
    
         | 
| 
       1356 
1723 
     | 
    
         
             
              def test_inspect_new_instance
         
     | 
| 
         @@ -1432,10 +1799,6 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       1432 
1799 
     | 
    
         
             
                ActiveRecord::Base.logger = original_logger
         
     | 
| 
       1433 
1800 
     | 
    
         
             
              end
         
     | 
| 
       1434 
1801 
     | 
    
         | 
| 
       1435 
     | 
    
         
            -
              def test_dup
         
     | 
| 
       1436 
     | 
    
         
            -
                assert !Minimalistic.new.freeze.dup.frozen?
         
     | 
| 
       1437 
     | 
    
         
            -
              end
         
     | 
| 
       1438 
     | 
    
         
            -
             
     | 
| 
       1439 
1802 
     | 
    
         
             
              def test_compute_type_success
         
     | 
| 
       1440 
1803 
     | 
    
         
             
                assert_equal Author, ActiveRecord::Base.send(:compute_type, 'Author')
         
     | 
| 
       1441 
1804 
     | 
    
         
             
              end
         
     | 
| 
         @@ -1453,34 +1816,93 @@ class BasicsTest < ActiveRecord::TestCase 
     | 
|
| 
       1453 
1816 
     | 
    
         
             
                end
         
     | 
| 
       1454 
1817 
     | 
    
         
             
              end
         
     | 
| 
       1455 
1818 
     | 
    
         | 
| 
       1456 
     | 
    
         
            -
              def  
     | 
| 
       1457 
     | 
    
         
            -
                 
     | 
| 
       1458 
     | 
    
         
            -
                 
     | 
| 
       1459 
     | 
    
         
            -
             
     | 
| 
       1460 
     | 
    
         
            -
                  default_scope order('posts.comments_count ASC')
         
     | 
| 
      
 1819 
     | 
    
         
            +
              def test_compute_type_argument_error
         
     | 
| 
      
 1820 
     | 
    
         
            +
                ActiveSupport::Dependencies.stubs(:constantize).raises(ArgumentError)
         
     | 
| 
      
 1821 
     | 
    
         
            +
                assert_raises ArgumentError do
         
     | 
| 
      
 1822 
     | 
    
         
            +
                  ActiveRecord::Base.send :compute_type, 'InvalidModel'
         
     | 
| 
       1461 
1823 
     | 
    
         
             
                end
         
     | 
| 
       1462 
     | 
    
         
            -
             
     | 
| 
      
 1824 
     | 
    
         
            +
              end
         
     | 
| 
      
 1825 
     | 
    
         
            +
             
     | 
| 
      
 1826 
     | 
    
         
            +
              def test_clear_cache!
         
     | 
| 
      
 1827 
     | 
    
         
            +
                # preheat cache
         
     | 
| 
      
 1828 
     | 
    
         
            +
                c1 = Post.columns
         
     | 
| 
      
 1829 
     | 
    
         
            +
                ActiveRecord::Base.clear_cache!
         
     | 
| 
      
 1830 
     | 
    
         
            +
                c2 = Post.columns
         
     | 
| 
      
 1831 
     | 
    
         
            +
                assert_not_equal c1, c2
         
     | 
| 
      
 1832 
     | 
    
         
            +
              end
         
     | 
| 
      
 1833 
     | 
    
         
            +
             
     | 
| 
      
 1834 
     | 
    
         
            +
              def test_current_scope_is_reset
         
     | 
| 
      
 1835 
     | 
    
         
            +
                Object.const_set :UnloadablePost, Class.new(ActiveRecord::Base)
         
     | 
| 
      
 1836 
     | 
    
         
            +
                UnloadablePost.send(:current_scope=, UnloadablePost.scoped)
         
     | 
| 
       1463 
1837 
     | 
    
         | 
| 
       1464 
1838 
     | 
    
         
             
                UnloadablePost.unloadable
         
     | 
| 
       1465 
     | 
    
         
            -
                assert_not_nil Thread.current[: 
     | 
| 
      
 1839 
     | 
    
         
            +
                assert_not_nil Thread.current[:UnloadablePost_current_scope]
         
     | 
| 
       1466 
1840 
     | 
    
         
             
                ActiveSupport::Dependencies.remove_unloadable_constants!
         
     | 
| 
       1467 
     | 
    
         
            -
                assert_nil Thread.current[: 
     | 
| 
      
 1841 
     | 
    
         
            +
                assert_nil Thread.current[:UnloadablePost_current_scope]
         
     | 
| 
       1468 
1842 
     | 
    
         
             
              ensure
         
     | 
| 
       1469 
1843 
     | 
    
         
             
                Object.class_eval{ remove_const :UnloadablePost } if defined?(UnloadablePost)
         
     | 
| 
       1470 
1844 
     | 
    
         
             
              end
         
     | 
| 
       1471 
1845 
     | 
    
         | 
| 
       1472 
     | 
    
         
            -
               
     | 
| 
       1473 
     | 
    
         
            -
                 
     | 
| 
       1474 
     | 
    
         
            -
             
     | 
| 
       1475 
     | 
    
         
            -
             
     | 
| 
       1476 
     | 
    
         
            -
                ensure
         
     | 
| 
       1477 
     | 
    
         
            -
                  old_tz ? ENV['TZ'] = old_tz : ENV.delete('TZ')
         
     | 
| 
       1478 
     | 
    
         
            -
                end
         
     | 
| 
      
 1846 
     | 
    
         
            +
              def test_marshal_round_trip
         
     | 
| 
      
 1847 
     | 
    
         
            +
                expected = posts(:welcome)
         
     | 
| 
      
 1848 
     | 
    
         
            +
                marshalled = Marshal.dump(expected)
         
     | 
| 
      
 1849 
     | 
    
         
            +
                actual   = Marshal.load(marshalled)
         
     | 
| 
       1479 
1850 
     | 
    
         | 
| 
       1480 
     | 
    
         
            -
                 
     | 
| 
       1481 
     | 
    
         
            -
             
     | 
| 
       1482 
     | 
    
         
            -
             
     | 
| 
       1483 
     | 
    
         
            -
             
     | 
| 
       1484 
     | 
    
         
            -
             
     | 
| 
       1485 
     | 
    
         
            -
                 
     | 
| 
      
 1851 
     | 
    
         
            +
                assert_equal expected.attributes, actual.attributes
         
     | 
| 
      
 1852 
     | 
    
         
            +
              end
         
     | 
| 
      
 1853 
     | 
    
         
            +
             
     | 
| 
      
 1854 
     | 
    
         
            +
              def test_marshal_new_record_round_trip
         
     | 
| 
      
 1855 
     | 
    
         
            +
                marshalled = Marshal.dump(Post.new)
         
     | 
| 
      
 1856 
     | 
    
         
            +
                post       = Marshal.load(marshalled)
         
     | 
| 
      
 1857 
     | 
    
         
            +
             
     | 
| 
      
 1858 
     | 
    
         
            +
                assert post.new_record?, "should be a new record"
         
     | 
| 
      
 1859 
     | 
    
         
            +
              end
         
     | 
| 
      
 1860 
     | 
    
         
            +
             
     | 
| 
      
 1861 
     | 
    
         
            +
              def test_marshalling_with_associations
         
     | 
| 
      
 1862 
     | 
    
         
            +
                post = Post.new
         
     | 
| 
      
 1863 
     | 
    
         
            +
                post.comments.build
         
     | 
| 
      
 1864 
     | 
    
         
            +
             
     | 
| 
      
 1865 
     | 
    
         
            +
                marshalled = Marshal.dump(post)
         
     | 
| 
      
 1866 
     | 
    
         
            +
                post       = Marshal.load(marshalled)
         
     | 
| 
      
 1867 
     | 
    
         
            +
             
     | 
| 
      
 1868 
     | 
    
         
            +
                assert_equal 1, post.comments.length
         
     | 
| 
      
 1869 
     | 
    
         
            +
              end
         
     | 
| 
      
 1870 
     | 
    
         
            +
             
     | 
| 
      
 1871 
     | 
    
         
            +
              def test_attribute_names
         
     | 
| 
      
 1872 
     | 
    
         
            +
                assert_equal ["id", "type", "ruby_type", "firm_id", "firm_name", "name", "client_of", "rating", "account_id"],
         
     | 
| 
      
 1873 
     | 
    
         
            +
                             Company.attribute_names
         
     | 
| 
      
 1874 
     | 
    
         
            +
              end
         
     | 
| 
      
 1875 
     | 
    
         
            +
             
     | 
| 
      
 1876 
     | 
    
         
            +
              def test_attribute_names_on_table_not_exists
         
     | 
| 
      
 1877 
     | 
    
         
            +
                assert_equal [], NonExistentTable.attribute_names
         
     | 
| 
      
 1878 
     | 
    
         
            +
              end
         
     | 
| 
      
 1879 
     | 
    
         
            +
             
     | 
| 
      
 1880 
     | 
    
         
            +
              def test_attribtue_names_on_abstract_class
         
     | 
| 
      
 1881 
     | 
    
         
            +
                assert_equal [], AbstractCompany.attribute_names
         
     | 
| 
      
 1882 
     | 
    
         
            +
              end
         
     | 
| 
      
 1883 
     | 
    
         
            +
             
     | 
| 
      
 1884 
     | 
    
         
            +
              def test_cache_key_for_existing_record_is_not_timezone_dependent
         
     | 
| 
      
 1885 
     | 
    
         
            +
                ActiveRecord::Base.time_zone_aware_attributes = true
         
     | 
| 
      
 1886 
     | 
    
         
            +
             
     | 
| 
      
 1887 
     | 
    
         
            +
                Time.zone = "UTC"
         
     | 
| 
      
 1888 
     | 
    
         
            +
                utc_key = Developer.first.cache_key
         
     | 
| 
      
 1889 
     | 
    
         
            +
             
     | 
| 
      
 1890 
     | 
    
         
            +
                Time.zone = "EST"
         
     | 
| 
      
 1891 
     | 
    
         
            +
                est_key = Developer.first.cache_key
         
     | 
| 
      
 1892 
     | 
    
         
            +
             
     | 
| 
      
 1893 
     | 
    
         
            +
                assert_equal utc_key, est_key
         
     | 
| 
      
 1894 
     | 
    
         
            +
              ensure
         
     | 
| 
      
 1895 
     | 
    
         
            +
                ActiveRecord::Base.time_zone_aware_attributes = false
         
     | 
| 
      
 1896 
     | 
    
         
            +
              end
         
     | 
| 
      
 1897 
     | 
    
         
            +
             
     | 
| 
      
 1898 
     | 
    
         
            +
              def test_cache_key_format_for_existing_record_with_updated_at
         
     | 
| 
      
 1899 
     | 
    
         
            +
                dev = Developer.first
         
     | 
| 
      
 1900 
     | 
    
         
            +
                assert_equal "developers/#{dev.id}-#{dev.updated_at.utc.to_s(:number)}", dev.cache_key
         
     | 
| 
      
 1901 
     | 
    
         
            +
              end
         
     | 
| 
      
 1902 
     | 
    
         
            +
             
     | 
| 
      
 1903 
     | 
    
         
            +
              def test_cache_key_format_for_existing_record_with_nil_updated_at
         
     | 
| 
      
 1904 
     | 
    
         
            +
                dev = Developer.first
         
     | 
| 
      
 1905 
     | 
    
         
            +
                dev.update_attribute(:updated_at, nil)
         
     | 
| 
      
 1906 
     | 
    
         
            +
                assert_match /\/#{dev.id}$/, dev.cache_key
         
     | 
| 
      
 1907 
     | 
    
         
            +
              end
         
     | 
| 
       1486 
1908 
     | 
    
         
             
            end
         
     |