activerecord 2.0.5 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (289) hide show
  1. data/CHANGELOG +168 -6
  2. data/README +27 -22
  3. data/RUNNING_UNIT_TESTS +7 -4
  4. data/Rakefile +22 -25
  5. data/lib/active_record.rb +8 -2
  6. data/lib/active_record/aggregations.rb +21 -12
  7. data/lib/active_record/association_preload.rb +277 -0
  8. data/lib/active_record/associations.rb +481 -295
  9. data/lib/active_record/associations/association_collection.rb +162 -37
  10. data/lib/active_record/associations/association_proxy.rb +71 -7
  11. data/lib/active_record/associations/belongs_to_association.rb +5 -3
  12. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +5 -6
  13. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +12 -64
  14. data/lib/active_record/associations/has_many_association.rb +8 -73
  15. data/lib/active_record/associations/has_many_through_association.rb +68 -117
  16. data/lib/active_record/associations/has_one_association.rb +7 -5
  17. data/lib/active_record/associations/has_one_through_association.rb +28 -0
  18. data/lib/active_record/attribute_methods.rb +69 -19
  19. data/lib/active_record/base.rb +496 -275
  20. data/lib/active_record/calculations.rb +28 -21
  21. data/lib/active_record/callbacks.rb +9 -38
  22. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +3 -2
  23. data/lib/active_record/connection_adapters/abstract/database_statements.rb +2 -2
  24. data/lib/active_record/connection_adapters/abstract/query_cache.rb +6 -0
  25. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +232 -45
  26. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +141 -27
  27. data/lib/active_record/connection_adapters/abstract_adapter.rb +9 -13
  28. data/lib/active_record/connection_adapters/mysql_adapter.rb +57 -24
  29. data/lib/active_record/connection_adapters/postgresql_adapter.rb +143 -42
  30. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +1 -1
  31. data/lib/active_record/connection_adapters/sqlite_adapter.rb +18 -10
  32. data/lib/active_record/dirty.rb +158 -0
  33. data/lib/active_record/fixtures.rb +121 -156
  34. data/lib/active_record/locking/optimistic.rb +14 -11
  35. data/lib/active_record/locking/pessimistic.rb +2 -2
  36. data/lib/active_record/migration.rb +157 -77
  37. data/lib/active_record/named_scope.rb +163 -0
  38. data/lib/active_record/observer.rb +19 -5
  39. data/lib/active_record/reflection.rb +34 -14
  40. data/lib/active_record/schema.rb +7 -14
  41. data/lib/active_record/schema_dumper.rb +4 -4
  42. data/lib/active_record/serialization.rb +5 -5
  43. data/lib/active_record/serializers/json_serializer.rb +37 -28
  44. data/lib/active_record/serializers/xml_serializer.rb +52 -29
  45. data/lib/active_record/test_case.rb +36 -0
  46. data/lib/active_record/timestamp.rb +4 -4
  47. data/lib/active_record/transactions.rb +3 -3
  48. data/lib/active_record/validations.rb +182 -248
  49. data/lib/active_record/version.rb +2 -2
  50. data/test/{fixtures → assets}/example.log +0 -0
  51. data/test/{fixtures → assets}/flowers.jpg +0 -0
  52. data/test/cases/aaa_create_tables_test.rb +24 -0
  53. data/test/cases/active_schema_test_mysql.rb +95 -0
  54. data/test/cases/active_schema_test_postgresql.rb +24 -0
  55. data/test/{adapter_test.rb → cases/adapter_test.rb} +15 -14
  56. data/test/{adapter_test_sqlserver.rb → cases/adapter_test_sqlserver.rb} +95 -95
  57. data/test/{aggregations_test.rb → cases/aggregations_test.rb} +20 -20
  58. data/test/{ar_schema_test.rb → cases/ar_schema_test.rb} +6 -6
  59. data/test/cases/associations/belongs_to_associations_test.rb +412 -0
  60. data/test/{associations → cases/associations}/callbacks_test.rb +24 -10
  61. data/test/{associations → cases/associations}/cascaded_eager_loading_test.rb +18 -17
  62. data/test/cases/associations/eager_load_nested_include_test.rb +83 -0
  63. data/test/{associations → cases/associations}/eager_singularization_test.rb +5 -5
  64. data/test/{associations → cases/associations}/eager_test.rb +216 -51
  65. data/test/{associations → cases/associations}/extension_test.rb +8 -8
  66. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +684 -0
  67. data/test/cases/associations/has_many_associations_test.rb +932 -0
  68. data/test/cases/associations/has_many_through_associations_test.rb +190 -0
  69. data/test/cases/associations/has_one_associations_test.rb +323 -0
  70. data/test/cases/associations/has_one_through_associations_test.rb +74 -0
  71. data/test/{associations → cases/associations}/inner_join_association_test.rb +20 -20
  72. data/test/{associations → cases/associations}/join_model_test.rb +175 -35
  73. data/test/cases/associations_test.rb +262 -0
  74. data/test/{attribute_methods_test.rb → cases/attribute_methods_test.rb} +103 -11
  75. data/test/{base_test.rb → cases/base_test.rb} +338 -191
  76. data/test/{binary_test.rb → cases/binary_test.rb} +6 -4
  77. data/test/{calculations_test.rb → cases/calculations_test.rb} +35 -23
  78. data/test/{callbacks_test.rb → cases/callbacks_test.rb} +7 -7
  79. data/test/{class_inheritable_attributes_test.rb → cases/class_inheritable_attributes_test.rb} +3 -3
  80. data/test/{column_alias_test.rb → cases/column_alias_test.rb} +3 -3
  81. data/test/{connection_test_firebird.rb → cases/connection_test_firebird.rb} +2 -2
  82. data/test/{connection_test_mysql.rb → cases/connection_test_mysql.rb} +2 -2
  83. data/test/{copy_table_test_sqlite.rb → cases/copy_table_test_sqlite.rb} +13 -13
  84. data/test/{datatype_test_postgresql.rb → cases/datatype_test_postgresql.rb} +8 -8
  85. data/test/{date_time_test.rb → cases/date_time_test.rb} +5 -5
  86. data/test/{default_test_firebird.rb → cases/default_test_firebird.rb} +3 -3
  87. data/test/{defaults_test.rb → cases/defaults_test.rb} +8 -6
  88. data/test/{deprecated_finder_test.rb → cases/deprecated_finder_test.rb} +3 -3
  89. data/test/cases/dirty_test.rb +163 -0
  90. data/test/cases/finder_respond_to_test.rb +76 -0
  91. data/test/{finder_test.rb → cases/finder_test.rb} +266 -33
  92. data/test/{fixtures_test.rb → cases/fixtures_test.rb} +88 -72
  93. data/test/cases/helper.rb +47 -0
  94. data/test/{inheritance_test.rb → cases/inheritance_test.rb} +61 -17
  95. data/test/cases/invalid_date_test.rb +24 -0
  96. data/test/{json_serialization_test.rb → cases/json_serialization_test.rb} +36 -11
  97. data/test/{lifecycle_test.rb → cases/lifecycle_test.rb} +16 -13
  98. data/test/{locking_test.rb → cases/locking_test.rb} +17 -10
  99. data/test/{method_scoping_test.rb → cases/method_scoping_test.rb} +75 -39
  100. data/test/{migration_test.rb → cases/migration_test.rb} +420 -80
  101. data/test/{migration_test_firebird.rb → cases/migration_test_firebird.rb} +3 -3
  102. data/test/{mixin_test.rb → cases/mixin_test.rb} +7 -6
  103. data/test/{modules_test.rb → cases/modules_test.rb} +11 -6
  104. data/test/{multiple_db_test.rb → cases/multiple_db_test.rb} +5 -5
  105. data/test/cases/named_scope_test.rb +157 -0
  106. data/test/{pk_test.rb → cases/pk_test.rb} +10 -10
  107. data/test/{query_cache_test.rb → cases/query_cache_test.rb} +12 -10
  108. data/test/{readonly_test.rb → cases/readonly_test.rb} +11 -11
  109. data/test/{reflection_test.rb → cases/reflection_test.rb} +15 -14
  110. data/test/{reserved_word_test_mysql.rb → cases/reserved_word_test_mysql.rb} +4 -5
  111. data/test/{schema_authorization_test_postgresql.rb → cases/schema_authorization_test_postgresql.rb} +5 -5
  112. data/test/cases/schema_dumper_test.rb +138 -0
  113. data/test/cases/schema_test_postgresql.rb +102 -0
  114. data/test/{serialization_test.rb → cases/serialization_test.rb} +7 -7
  115. data/test/{synonym_test_oracle.rb → cases/synonym_test_oracle.rb} +5 -5
  116. data/test/{table_name_test_sqlserver.rb → cases/table_name_test_sqlserver.rb} +3 -3
  117. data/test/{threaded_connections_test.rb → cases/threaded_connections_test.rb} +7 -7
  118. data/test/{transactions_test.rb → cases/transactions_test.rb} +31 -5
  119. data/test/{unconnected_test.rb → cases/unconnected_test.rb} +2 -2
  120. data/test/{validations_test.rb → cases/validations_test.rb} +141 -39
  121. data/test/{xml_serialization_test.rb → cases/xml_serialization_test.rb} +12 -12
  122. data/test/config.rb +5 -0
  123. data/test/connections/native_db2/connection.rb +1 -1
  124. data/test/connections/native_firebird/connection.rb +1 -1
  125. data/test/connections/native_frontbase/connection.rb +1 -1
  126. data/test/connections/native_mysql/connection.rb +1 -1
  127. data/test/connections/native_openbase/connection.rb +1 -1
  128. data/test/connections/native_oracle/connection.rb +1 -1
  129. data/test/connections/native_postgresql/connection.rb +1 -3
  130. data/test/connections/native_sqlite/connection.rb +2 -2
  131. data/test/connections/native_sqlite3/connection.rb +2 -2
  132. data/test/connections/native_sqlite3/in_memory_connection.rb +3 -3
  133. data/test/connections/native_sybase/connection.rb +1 -1
  134. data/test/fixtures/author_addresses.yml +5 -0
  135. data/test/fixtures/authors.yml +2 -0
  136. data/test/fixtures/clubs.yml +6 -0
  137. data/test/fixtures/jobs.yml +7 -0
  138. data/test/fixtures/members.yml +4 -0
  139. data/test/fixtures/memberships.yml +20 -0
  140. data/test/fixtures/owners.yml +7 -0
  141. data/test/fixtures/people.yml +4 -1
  142. data/test/fixtures/pets.yml +14 -0
  143. data/test/fixtures/posts.yml +1 -0
  144. data/test/fixtures/price_estimates.yml +7 -0
  145. data/test/fixtures/readers.yml +5 -0
  146. data/test/fixtures/references.yml +17 -0
  147. data/test/fixtures/sponsors.yml +9 -0
  148. data/test/fixtures/subscribers.yml +7 -0
  149. data/test/fixtures/subscriptions.yml +12 -0
  150. data/test/fixtures/taggings.yml +4 -1
  151. data/test/fixtures/topics.yml +22 -2
  152. data/test/fixtures/warehouse-things.yml +3 -0
  153. data/test/{fixtures/migrations_with_decimal → migrations/decimal}/1_give_me_big_numbers.rb +0 -0
  154. data/test/{fixtures/migrations_with_duplicate → migrations/duplicate}/1_people_have_last_names.rb +1 -1
  155. data/test/{fixtures/migrations_with_duplicate → migrations/duplicate}/2_we_need_reminders.rb +1 -1
  156. data/test/{fixtures/migrations_with_duplicate → migrations/duplicate}/3_foo.rb +0 -0
  157. data/test/{fixtures/migrations → migrations/duplicate}/3_innocent_jointable.rb +0 -0
  158. data/test/migrations/duplicate_names/20080507052938_chunky.rb +7 -0
  159. data/test/migrations/duplicate_names/20080507053028_chunky.rb +7 -0
  160. data/test/{fixtures/migrations_with_duplicate → migrations/interleaved/pass_1}/3_innocent_jointable.rb +0 -0
  161. data/test/{fixtures/migrations → migrations/interleaved/pass_2}/1_people_have_last_names.rb +1 -1
  162. data/test/{fixtures/migrations_with_missing_versions/4_innocent_jointable.rb → migrations/interleaved/pass_2/3_innocent_jointable.rb} +0 -0
  163. data/test/{fixtures/migrations_with_missing_versions → migrations/interleaved/pass_3}/1_people_have_last_names.rb +1 -1
  164. data/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +8 -0
  165. data/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +12 -0
  166. data/test/{fixtures/migrations_with_missing_versions → migrations/missing}/1000_people_have_middle_names.rb +1 -1
  167. data/test/migrations/missing/1_people_have_last_names.rb +9 -0
  168. data/test/{fixtures/migrations_with_missing_versions → migrations/missing}/3_we_need_reminders.rb +1 -1
  169. data/test/migrations/missing/4_innocent_jointable.rb +12 -0
  170. data/test/migrations/valid/1_people_have_last_names.rb +9 -0
  171. data/test/{fixtures/migrations → migrations/valid}/2_we_need_reminders.rb +1 -1
  172. data/test/migrations/valid/3_innocent_jointable.rb +12 -0
  173. data/test/{fixtures → models}/author.rb +28 -4
  174. data/test/{fixtures → models}/auto_id.rb +0 -0
  175. data/test/{fixtures → models}/binary.rb +0 -0
  176. data/test/{fixtures → models}/book.rb +0 -0
  177. data/test/{fixtures → models}/categorization.rb +0 -0
  178. data/test/{fixtures → models}/category.rb +8 -5
  179. data/test/{fixtures → models}/citation.rb +0 -0
  180. data/test/models/club.rb +7 -0
  181. data/test/{fixtures → models}/column_name.rb +0 -0
  182. data/test/{fixtures → models}/comment.rb +5 -3
  183. data/test/{fixtures → models}/company.rb +15 -6
  184. data/test/{fixtures → models}/company_in_module.rb +5 -3
  185. data/test/{fixtures → models}/computer.rb +0 -1
  186. data/test/{fixtures → models}/contact.rb +1 -1
  187. data/test/{fixtures → models}/course.rb +0 -0
  188. data/test/{fixtures → models}/customer.rb +8 -8
  189. data/test/{fixtures → models}/default.rb +0 -0
  190. data/test/{fixtures → models}/developer.rb +14 -10
  191. data/test/{fixtures → models}/edge.rb +0 -0
  192. data/test/{fixtures → models}/entrant.rb +0 -0
  193. data/test/models/guid.rb +2 -0
  194. data/test/{fixtures → models}/item.rb +0 -0
  195. data/test/models/job.rb +5 -0
  196. data/test/{fixtures → models}/joke.rb +0 -0
  197. data/test/{fixtures → models}/keyboard.rb +0 -0
  198. data/test/{fixtures → models}/legacy_thing.rb +0 -0
  199. data/test/{fixtures → models}/matey.rb +0 -0
  200. data/test/models/member.rb +9 -0
  201. data/test/models/membership.rb +9 -0
  202. data/test/{fixtures → models}/minimalistic.rb +0 -0
  203. data/test/{fixtures → models}/mixed_case_monkey.rb +0 -0
  204. data/test/{fixtures → models}/movie.rb +0 -0
  205. data/test/{fixtures → models}/order.rb +2 -2
  206. data/test/models/owner.rb +4 -0
  207. data/test/{fixtures → models}/parrot.rb +0 -0
  208. data/test/models/person.rb +10 -0
  209. data/test/models/pet.rb +4 -0
  210. data/test/models/pirate.rb +9 -0
  211. data/test/{fixtures → models}/post.rb +23 -2
  212. data/test/models/price_estimate.rb +3 -0
  213. data/test/{fixtures → models}/project.rb +1 -0
  214. data/test/{fixtures → models}/reader.rb +0 -0
  215. data/test/models/reference.rb +4 -0
  216. data/test/{fixtures → models}/reply.rb +7 -5
  217. data/test/{fixtures → models}/ship.rb +0 -0
  218. data/test/models/sponsor.rb +4 -0
  219. data/test/{fixtures → models}/subject.rb +0 -0
  220. data/test/{fixtures → models}/subscriber.rb +2 -0
  221. data/test/models/subscription.rb +4 -0
  222. data/test/{fixtures → models}/tag.rb +0 -0
  223. data/test/{fixtures → models}/tagging.rb +0 -0
  224. data/test/{fixtures → models}/task.rb +0 -0
  225. data/test/{fixtures → models}/topic.rb +32 -4
  226. data/test/{fixtures → models}/treasure.rb +2 -0
  227. data/test/{fixtures → models}/vertex.rb +0 -0
  228. data/test/models/warehouse_thing.rb +5 -0
  229. data/test/schema/mysql_specific_schema.rb +12 -0
  230. data/test/schema/postgresql_specific_schema.rb +103 -0
  231. data/test/schema/schema.rb +421 -0
  232. data/test/schema/schema2.rb +6 -0
  233. data/test/schema/sqlite_specific_schema.rb +25 -0
  234. data/test/schema/sqlserver_specific_schema.rb +5 -0
  235. metadata +192 -176
  236. data/test/aaa_create_tables_test.rb +0 -72
  237. data/test/abstract_unit.rb +0 -84
  238. data/test/active_schema_test_mysql.rb +0 -46
  239. data/test/all.sh +0 -8
  240. data/test/association_inheritance_reload.rb +0 -14
  241. data/test/associations_test.rb +0 -2177
  242. data/test/fixtures/bad_fixtures/attr_with_numeric_first_char +0 -1
  243. data/test/fixtures/bad_fixtures/attr_with_spaces +0 -1
  244. data/test/fixtures/bad_fixtures/blank_line +0 -3
  245. data/test/fixtures/bad_fixtures/duplicate_attributes +0 -3
  246. data/test/fixtures/bad_fixtures/missing_value +0 -1
  247. data/test/fixtures/db_definitions/db2.drop.sql +0 -33
  248. data/test/fixtures/db_definitions/db2.sql +0 -235
  249. data/test/fixtures/db_definitions/db22.drop.sql +0 -2
  250. data/test/fixtures/db_definitions/db22.sql +0 -5
  251. data/test/fixtures/db_definitions/firebird.drop.sql +0 -65
  252. data/test/fixtures/db_definitions/firebird.sql +0 -310
  253. data/test/fixtures/db_definitions/firebird2.drop.sql +0 -2
  254. data/test/fixtures/db_definitions/firebird2.sql +0 -6
  255. data/test/fixtures/db_definitions/frontbase.drop.sql +0 -33
  256. data/test/fixtures/db_definitions/frontbase.sql +0 -273
  257. data/test/fixtures/db_definitions/frontbase2.drop.sql +0 -1
  258. data/test/fixtures/db_definitions/frontbase2.sql +0 -4
  259. data/test/fixtures/db_definitions/openbase.drop.sql +0 -2
  260. data/test/fixtures/db_definitions/openbase.sql +0 -318
  261. data/test/fixtures/db_definitions/openbase2.drop.sql +0 -2
  262. data/test/fixtures/db_definitions/openbase2.sql +0 -7
  263. data/test/fixtures/db_definitions/oracle.drop.sql +0 -67
  264. data/test/fixtures/db_definitions/oracle.sql +0 -330
  265. data/test/fixtures/db_definitions/oracle2.drop.sql +0 -2
  266. data/test/fixtures/db_definitions/oracle2.sql +0 -6
  267. data/test/fixtures/db_definitions/postgresql.drop.sql +0 -44
  268. data/test/fixtures/db_definitions/postgresql.sql +0 -292
  269. data/test/fixtures/db_definitions/postgresql2.drop.sql +0 -2
  270. data/test/fixtures/db_definitions/postgresql2.sql +0 -4
  271. data/test/fixtures/db_definitions/schema.rb +0 -354
  272. data/test/fixtures/db_definitions/schema2.rb +0 -11
  273. data/test/fixtures/db_definitions/sqlite.drop.sql +0 -33
  274. data/test/fixtures/db_definitions/sqlite.sql +0 -219
  275. data/test/fixtures/db_definitions/sqlite2.drop.sql +0 -2
  276. data/test/fixtures/db_definitions/sqlite2.sql +0 -5
  277. data/test/fixtures/db_definitions/sybase.drop.sql +0 -35
  278. data/test/fixtures/db_definitions/sybase.sql +0 -222
  279. data/test/fixtures/db_definitions/sybase2.drop.sql +0 -4
  280. data/test/fixtures/db_definitions/sybase2.sql +0 -5
  281. data/test/fixtures/developers_projects/david_action_controller +0 -3
  282. data/test/fixtures/developers_projects/david_active_record +0 -3
  283. data/test/fixtures/developers_projects/jamis_active_record +0 -2
  284. data/test/fixtures/person.rb +0 -4
  285. data/test/fixtures/pirate.rb +0 -5
  286. data/test/fixtures/subscribers/first +0 -2
  287. data/test/fixtures/subscribers/second +0 -2
  288. data/test/schema_dumper_test.rb +0 -131
  289. data/test/schema_test_postgresql.rb +0 -64
@@ -1,4 +1,4 @@
1
- require 'abstract_unit'
1
+ require "cases/helper"
2
2
 
3
3
  # Without using prepared statements, it makes no sense to test
4
4
  # BLOB data with SQL Server, because the length of a statement is
@@ -8,16 +8,18 @@ require 'abstract_unit'
8
8
  # BLOB data with DB2 or Firebird, because the length of a statement
9
9
  # is limited to 32KB.
10
10
  unless current_adapter?(:SQLServerAdapter, :SybaseAdapter, :DB2Adapter, :FirebirdAdapter)
11
- require 'fixtures/binary'
11
+ require 'models/binary'
12
12
 
13
- class BinaryTest < Test::Unit::TestCase
13
+ class BinaryTest < ActiveRecord::TestCase
14
14
  FIXTURES = %w(flowers.jpg example.log)
15
15
 
16
16
  def test_load_save
17
17
  Binary.delete_all
18
18
 
19
19
  FIXTURES.each do |filename|
20
- data = File.read("#{File.dirname(__FILE__)}/fixtures/#{filename}").freeze
20
+ data = File.read(ASSETS_ROOT + "/#{filename}")
21
+ data.force_encoding('ASCII-8BIT') if data.respond_to?(:force_encoding)
22
+ data.freeze
21
23
 
22
24
  bin = Binary.new(:data => data)
23
25
  assert_equal data, bin.data, 'Newly assigned data differs from original'
@@ -1,6 +1,6 @@
1
- require 'abstract_unit'
2
- require 'fixtures/company'
3
- require 'fixtures/topic'
1
+ require "cases/helper"
2
+ require 'models/company'
3
+ require 'models/topic'
4
4
 
5
5
  Company.has_many :accounts
6
6
 
@@ -8,7 +8,7 @@ class NumericData < ActiveRecord::Base
8
8
  self.table_name = 'numeric_data'
9
9
  end
10
10
 
11
- class CalculationsTest < Test::Unit::TestCase
11
+ class CalculationsTest < ActiveRecord::TestCase
12
12
  fixtures :companies, :accounts, :topics
13
13
 
14
14
  def test_should_sum_field
@@ -79,7 +79,7 @@ class CalculationsTest < Test::Unit::TestCase
79
79
  end
80
80
 
81
81
  def test_should_group_by_summed_field_having_condition
82
- c = Account.sum(:credit_limit, :group => :firm_id,
82
+ c = Account.sum(:credit_limit, :group => :firm_id,
83
83
  :having => 'sum(credit_limit) > 50')
84
84
  assert_nil c[1]
85
85
  assert_equal 105, c[6]
@@ -92,22 +92,26 @@ class CalculationsTest < Test::Unit::TestCase
92
92
  assert_equal 105, c[companies(:rails_core)]
93
93
  assert_equal 60, c[companies(:first_client)]
94
94
  end
95
-
95
+
96
96
  def test_should_sum_field_with_conditions
97
97
  assert_equal 105, Account.sum(:credit_limit, :conditions => 'firm_id = 6')
98
98
  end
99
99
 
100
+ def test_should_return_zero_if_sum_conditions_return_nothing
101
+ assert_equal 0, Account.sum(:credit_limit, :conditions => '1 = 2')
102
+ end
103
+
100
104
  def test_should_group_by_summed_field_with_conditions
101
- c = Account.sum(:credit_limit, :conditions => 'firm_id > 1',
105
+ c = Account.sum(:credit_limit, :conditions => 'firm_id > 1',
102
106
  :group => :firm_id)
103
107
  assert_nil c[1]
104
108
  assert_equal 105, c[6]
105
109
  assert_equal 60, c[2]
106
110
  end
107
-
111
+
108
112
  def test_should_group_by_summed_field_with_conditions_and_having
109
- c = Account.sum(:credit_limit, :conditions => 'firm_id > 1',
110
- :group => :firm_id,
113
+ c = Account.sum(:credit_limit, :conditions => 'firm_id > 1',
114
+ :group => :firm_id,
111
115
  :having => 'sum(credit_limit) > 60')
112
116
  assert_nil c[1]
113
117
  assert_equal 105, c[6]
@@ -120,19 +124,19 @@ class CalculationsTest < Test::Unit::TestCase
120
124
  assert_equal 105, c[6]
121
125
  assert_equal 60, c[2]
122
126
  end
123
-
127
+
124
128
  def test_should_calculate_with_invalid_field
125
129
  assert_equal 6, Account.calculate(:count, '*')
126
130
  assert_equal 6, Account.calculate(:count, :all)
127
131
  end
128
-
132
+
129
133
  def test_should_calculate_grouped_with_invalid_field
130
134
  c = Account.count(:all, :group => 'accounts.firm_id')
131
135
  assert_equal 1, c[1]
132
136
  assert_equal 2, c[6]
133
137
  assert_equal 1, c[2]
134
138
  end
135
-
139
+
136
140
  def test_should_calculate_grouped_association_with_invalid_field
137
141
  c = Account.count(:all, :group => :firm)
138
142
  assert_equal 1, c[companies(:first_firm)]
@@ -171,7 +175,7 @@ class CalculationsTest < Test::Unit::TestCase
171
175
  def test_should_not_modify_options_when_using_includes
172
176
  options = {:conditions => 'companies.id > 1', :include => :firm}
173
177
  options_copy = options.dup
174
-
178
+
175
179
  Account.count(:all, options)
176
180
  assert_equal options_copy, options
177
181
  end
@@ -183,7 +187,7 @@ class CalculationsTest < Test::Unit::TestCase
183
187
  assert_equal 3, c['CLIENT']
184
188
  assert_equal 2, c['FIRM']
185
189
  end
186
-
190
+
187
191
  def test_should_calculate_grouped_by_function_with_table_alias
188
192
  c = Company.count(:all, :group => "UPPER(companies.#{QUOTED_TYPE})")
189
193
  assert_equal 2, c[nil]
@@ -191,7 +195,7 @@ class CalculationsTest < Test::Unit::TestCase
191
195
  assert_equal 3, c['CLIENT']
192
196
  assert_equal 2, c['FIRM']
193
197
  end
194
-
198
+
195
199
  def test_should_not_overshadow_enumerable_sum
196
200
  assert_equal 6, [1, 2, 3].sum(&:abs)
197
201
  end
@@ -223,32 +227,36 @@ class CalculationsTest < Test::Unit::TestCase
223
227
  # empty options are valid
224
228
  Company.send(:validate_calculation_options, func)
225
229
  # these options are valid for all calculations
226
- [:select, :conditions, :joins, :order, :group, :having, :distinct].each do |opt|
230
+ [:select, :conditions, :joins, :order, :group, :having, :distinct].each do |opt|
227
231
  Company.send(:validate_calculation_options, func, opt => true)
228
232
  end
229
233
  end
230
-
234
+
231
235
  # :include is only valid on :count
232
236
  Company.send(:validate_calculation_options, :count, :include => true)
233
237
  end
234
-
238
+
235
239
  assert_raises(ArgumentError) { Company.send(:validate_calculation_options, :sum, :foo => :bar) }
236
240
  assert_raises(ArgumentError) { Company.send(:validate_calculation_options, :count, :foo => :bar) }
237
241
  end
238
-
242
+
239
243
  def test_should_count_selected_field_with_include
240
244
  assert_equal 6, Account.count(:distinct => true, :include => :firm)
241
245
  assert_equal 4, Account.count(:distinct => true, :include => :firm, :select => :credit_limit)
242
246
  end
243
-
247
+
248
+ def test_should_count_manual_select_with_include
249
+ assert_equal 6, Account.count(:select => "DISTINCT accounts.id", :include => :firm)
250
+ end
251
+
244
252
  def test_count_with_column_parameter
245
253
  assert_equal 5, Account.count(:firm_id)
246
254
  end
247
-
255
+
248
256
  def test_count_with_column_and_options_parameter
249
257
  assert_equal 2, Account.count(:firm_id, :conditions => "credit_limit = 50")
250
258
  end
251
-
259
+
252
260
  def test_count_with_no_parameters_isnt_deprecated
253
261
  assert_not_deprecated { Account.count }
254
262
  end
@@ -256,4 +264,8 @@ class CalculationsTest < Test::Unit::TestCase
256
264
  def test_count_with_too_many_parameters_raises
257
265
  assert_raise(ArgumentError) { Account.count(1, 2, 3) }
258
266
  end
267
+
268
+ def test_should_sum_expression
269
+ assert_equal "636", Account.sum("2 * credit_limit")
270
+ end
259
271
  end
@@ -1,4 +1,4 @@
1
- require 'abstract_unit'
1
+ require "cases/helper"
2
2
 
3
3
  class CallbackDeveloper < ActiveRecord::Base
4
4
  set_table_name 'developers'
@@ -56,7 +56,7 @@ class ParentDeveloper < ActiveRecord::Base
56
56
  end
57
57
 
58
58
  class ChildDeveloper < ParentDeveloper
59
-
59
+
60
60
  end
61
61
 
62
62
  class RecursiveCallbackDeveloper < ActiveRecord::Base
@@ -126,7 +126,7 @@ class CallbackCancellationDeveloper < ActiveRecord::Base
126
126
  end
127
127
  end
128
128
 
129
- class CallbacksTest < Test::Unit::TestCase
129
+ class CallbacksTest < ActiveRecord::TestCase
130
130
  fixtures :developers
131
131
 
132
132
  def test_initialize
@@ -361,7 +361,7 @@ class CallbacksTest < Test::Unit::TestCase
361
361
  david = ImmutableDeveloper.find(1)
362
362
  assert !david.destroy
363
363
  assert_not_nil ImmutableDeveloper.find_by_id(1)
364
- end
364
+ end
365
365
 
366
366
  def test_zzz_callback_returning_false # must be run last since we modify CallbackDeveloper
367
367
  david = CallbackDeveloper.find(1)
@@ -384,17 +384,17 @@ class CallbacksTest < Test::Unit::TestCase
384
384
  [ :before_validation, :returning_false ]
385
385
  ], david.history
386
386
  end
387
-
387
+
388
388
  def test_inheritence_of_callbacks
389
389
  parent = ParentDeveloper.new
390
390
  assert !parent.after_save_called
391
391
  parent.save
392
392
  assert parent.after_save_called
393
-
393
+
394
394
  child = ChildDeveloper.new
395
395
  assert !child.after_save_called
396
396
  child.save
397
397
  assert child.after_save_called
398
398
  end
399
-
399
+
400
400
  end
@@ -1,5 +1,5 @@
1
1
  require 'test/unit'
2
- require 'abstract_unit'
2
+ require "cases/helper"
3
3
  require 'active_support/core_ext/class/inheritable_attributes'
4
4
 
5
5
  class A
@@ -19,12 +19,12 @@ class D < B
19
19
  end
20
20
 
21
21
 
22
- class ClassInheritableAttributesTest < Test::Unit::TestCase
22
+ class ClassInheritableAttributesTest < ActiveRecord::TestCase
23
23
  def test_first_level
24
24
  assert_equal [ :one, :two ], B.read_inheritable_attribute("first")
25
25
  assert_equal [ :three ], C.read_inheritable_attribute("first")
26
26
  end
27
-
27
+
28
28
  def test_second_level
29
29
  assert_equal [ :one, :two, :four ], D.read_inheritable_attribute("first")
30
30
  assert_equal [ :one, :two ], B.read_inheritable_attribute("first")
@@ -1,7 +1,7 @@
1
- require 'abstract_unit'
2
- require 'fixtures/topic'
1
+ require "cases/helper"
2
+ require 'models/topic'
3
3
 
4
- class TestColumnAlias < Test::Unit::TestCase
4
+ class TestColumnAlias < ActiveRecord::TestCase
5
5
  fixtures :topics
6
6
 
7
7
  QUERY = if 'Oracle' == ActiveRecord::Base.connection.adapter_name
@@ -1,6 +1,6 @@
1
- require "#{File.dirname(__FILE__)}/abstract_unit"
1
+ require "cases/helper"
2
2
 
3
- class FirebirdConnectionTest < Test::Unit::TestCase
3
+ class FirebirdConnectionTest < ActiveRecord::TestCase
4
4
  def test_charset_properly_set
5
5
  fb_conn = ActiveRecord::Base.connection.instance_variable_get(:@connection)
6
6
  assert_equal 'UTF8', fb_conn.database.character_set
@@ -1,6 +1,6 @@
1
- require "#{File.dirname(__FILE__)}/abstract_unit"
1
+ require "cases/helper"
2
2
 
3
- class MysqlConnectionTest < Test::Unit::TestCase
3
+ class MysqlConnectionTest < ActiveRecord::TestCase
4
4
  def setup
5
5
  @connection = ActiveRecord::Base.connection
6
6
  end
@@ -1,37 +1,37 @@
1
- require 'abstract_unit'
1
+ require "cases/helper"
2
2
 
3
- class CopyTableTest < Test::Unit::TestCase
3
+ class CopyTableTest < ActiveRecord::TestCase
4
4
  fixtures :companies, :comments
5
-
5
+
6
6
  def setup
7
7
  @connection = ActiveRecord::Base.connection
8
8
  class << @connection
9
9
  public :copy_table, :table_structure, :indexes
10
10
  end
11
11
  end
12
-
12
+
13
13
  def test_copy_table(from = 'companies', to = 'companies2', options = {})
14
14
  assert_nothing_raised {copy_table(from, to, options)}
15
15
  assert_equal row_count(from), row_count(to)
16
-
16
+
17
17
  if block_given?
18
18
  yield from, to, options
19
19
  else
20
20
  assert_equal column_names(from), column_names(to)
21
21
  end
22
-
22
+
23
23
  @connection.drop_table(to) rescue nil
24
24
  end
25
-
25
+
26
26
  def test_copy_table_renaming_column
27
- test_copy_table('companies', 'companies2',
27
+ test_copy_table('companies', 'companies2',
28
28
  :rename => {'client_of' => 'fan_of'}) do |from, to, options|
29
29
  expected = column_values(from, 'client_of')
30
30
  assert expected.any?, 'only nils in resultset; real values are needed'
31
31
  assert_equal expected, column_values(to, 'fan_of')
32
32
  end
33
33
  end
34
-
34
+
35
35
  def test_copy_table_with_index
36
36
  test_copy_table('comments', 'comments_with_index') do
37
37
  @connection.add_index('comments_with_index', ['post_id', 'type'])
@@ -41,11 +41,11 @@ class CopyTableTest < Test::Unit::TestCase
41
41
  end
42
42
  end
43
43
  end
44
-
44
+
45
45
  def test_copy_table_without_primary_key
46
46
  test_copy_table('developers_projects', 'programmers_projects')
47
47
  end
48
-
48
+
49
49
  protected
50
50
  def copy_table(from, to, options = {})
51
51
  @connection.copy_table(from, to, {:temporary => true}.merge(options))
@@ -54,7 +54,7 @@ protected
54
54
  def column_names(table)
55
55
  @connection.table_structure(table).map {|column| column['name']}
56
56
  end
57
-
57
+
58
58
  def column_values(table, column)
59
59
  @connection.select_all("SELECT #{column} FROM #{table} ORDER BY id").map {|row| row[column]}
60
60
  end
@@ -62,7 +62,7 @@ protected
62
62
  def table_indexes_without_name(table)
63
63
  @connection.indexes('comments_with_index').delete(:name)
64
64
  end
65
-
65
+
66
66
  def row_count(table)
67
67
  @connection.select_one("SELECT COUNT(*) AS count FROM #{table}")['count']
68
68
  end
@@ -1,4 +1,4 @@
1
- require 'abstract_unit'
1
+ require "cases/helper"
2
2
 
3
3
  class PostgresqlArray < ActiveRecord::Base
4
4
  end
@@ -21,7 +21,7 @@ end
21
21
  class PostgresqlOid < ActiveRecord::Base
22
22
  end
23
23
 
24
- class PostgresqlDataTypeTest < Test::Unit::TestCase
24
+ class PostgresqlDataTypeTest < ActiveRecord::TestCase
25
25
  self.use_transactional_fixtures = false
26
26
 
27
27
  def setup
@@ -30,8 +30,8 @@ class PostgresqlDataTypeTest < Test::Unit::TestCase
30
30
  @connection.execute("INSERT INTO postgresql_arrays (commission_by_quarter, nicknames) VALUES ( '{35000,21000,18000,17000}', '{foo,bar,baz}' )")
31
31
  @first_array = PostgresqlArray.find(1)
32
32
 
33
- @connection.execute("INSERT INTO postgresql_moneys (wealth) VALUES ('$567.89')")
34
- @connection.execute("INSERT INTO postgresql_moneys (wealth) VALUES ('-$567.89')")
33
+ @connection.execute("INSERT INTO postgresql_moneys (wealth) VALUES ('567.89'::money)")
34
+ @connection.execute("INSERT INTO postgresql_moneys (wealth) VALUES ('-567.89'::money)")
35
35
  @first_money = PostgresqlMoney.find(1)
36
36
  @second_money = PostgresqlMoney.find(2)
37
37
 
@@ -43,10 +43,10 @@ class PostgresqlDataTypeTest < Test::Unit::TestCase
43
43
 
44
44
  @connection.execute("INSERT INTO postgresql_network_addresses (cidr_address, inet_address, mac_address) VALUES('192.168.0/24', '172.16.1.254/32', '01:23:45:67:89:0a')")
45
45
  @first_network_address = PostgresqlNetworkAddress.find(1)
46
-
46
+
47
47
  @connection.execute("INSERT INTO postgresql_bit_strings (bit_string, bit_string_varying) VALUES (B'00010101', X'15')")
48
48
  @first_bit_string = PostgresqlBitString.find(1)
49
-
49
+
50
50
  @connection.execute("INSERT INTO postgresql_oids (obj_id) VALUES (1234)")
51
51
  @first_oid = PostgresqlOid.find(1)
52
52
  end
@@ -143,11 +143,11 @@ class PostgresqlDataTypeTest < Test::Unit::TestCase
143
143
  end
144
144
 
145
145
  def test_update_money
146
- new_value = 123.45
146
+ new_value = BigDecimal.new('123.45')
147
147
  assert @first_money.wealth = new_value
148
148
  assert @first_money.save
149
149
  assert @first_money.reload
150
- assert_equal @first_money.wealth, new_value
150
+ assert_equal new_value, @first_money.wealth
151
151
  end
152
152
 
153
153
  def test_update_number
@@ -1,8 +1,8 @@
1
- require 'abstract_unit'
2
- require 'fixtures/topic'
3
- require 'fixtures/task'
1
+ require "cases/helper"
2
+ require 'models/topic'
3
+ require 'models/task'
4
4
 
5
- class DateTimeTest < Test::Unit::TestCase
5
+ class DateTimeTest < ActiveRecord::TestCase
6
6
  def test_saves_both_date_and_time
7
7
  time_values = [1807, 2, 10, 15, 30, 45]
8
8
  now = DateTime.civil(*time_values)
@@ -10,7 +10,7 @@ class DateTimeTest < Test::Unit::TestCase
10
10
  task = Task.new
11
11
  task.starting = now
12
12
  task.save!
13
-
13
+
14
14
  # check against Time.local_time, since some platforms will return a Time instead of a DateTime
15
15
  assert_equal Time.local_time(*time_values), Task.find(task.id).starting
16
16
  end
@@ -1,7 +1,7 @@
1
- require 'abstract_unit'
2
- require 'fixtures/default'
1
+ require "cases/helper"
2
+ require 'models/default'
3
3
 
4
- class DefaultTest < Test::Unit::TestCase
4
+ class DefaultTest < ActiveRecord::TestCase
5
5
  def test_default_timestamp
6
6
  default = Default.new
7
7
  assert_instance_of(Time, default.default_timestamp)