activerecord 2.3.18 → 3.0.0.beta

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 (378) hide show
  1. data/CHANGELOG +105 -34
  2. data/examples/performance.rb +3 -39
  3. data/examples/simple.rb +14 -0
  4. data/lib/active_record.rb +81 -47
  5. data/lib/active_record/aggregations.rb +1 -3
  6. data/lib/active_record/association_preload.rb +39 -54
  7. data/lib/active_record/associations.rb +262 -419
  8. data/lib/active_record/associations/association_collection.rb +85 -100
  9. data/lib/active_record/associations/association_proxy.rb +20 -18
  10. data/lib/active_record/associations/belongs_to_association.rb +8 -8
  11. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +13 -35
  12. data/lib/active_record/associations/has_many_association.rb +11 -19
  13. data/lib/active_record/associations/has_many_through_association.rb +30 -183
  14. data/lib/active_record/associations/has_one_association.rb +10 -10
  15. data/lib/active_record/associations/has_one_through_association.rb +13 -11
  16. data/lib/active_record/associations/through_association_scope.rb +153 -0
  17. data/lib/active_record/attribute_methods.rb +17 -370
  18. data/lib/active_record/attribute_methods/before_type_cast.rb +33 -0
  19. data/lib/active_record/attribute_methods/dirty.rb +87 -0
  20. data/lib/active_record/attribute_methods/primary_key.rb +44 -0
  21. data/lib/active_record/attribute_methods/query.rb +37 -0
  22. data/lib/active_record/attribute_methods/read.rb +116 -0
  23. data/lib/active_record/attribute_methods/time_zone_conversion.rb +60 -0
  24. data/lib/active_record/attribute_methods/write.rb +37 -0
  25. data/lib/active_record/autosave_association.rb +20 -41
  26. data/lib/active_record/base.rb +357 -1180
  27. data/lib/active_record/batches.rb +10 -16
  28. data/lib/active_record/callbacks.rb +66 -126
  29. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +17 -13
  30. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +5 -25
  31. data/lib/active_record/connection_adapters/abstract/database_statements.rb +4 -43
  32. data/lib/active_record/connection_adapters/abstract/query_cache.rb +3 -2
  33. data/lib/active_record/connection_adapters/abstract/quoting.rb +15 -4
  34. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +1 -1
  35. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +18 -72
  36. data/lib/active_record/connection_adapters/abstract_adapter.rb +16 -49
  37. data/lib/active_record/connection_adapters/mysql_adapter.rb +15 -27
  38. data/lib/active_record/connection_adapters/postgresql_adapter.rb +84 -46
  39. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +9 -3
  40. data/lib/active_record/connection_adapters/sqlite_adapter.rb +34 -65
  41. data/lib/active_record/fixtures.rb +21 -25
  42. data/lib/active_record/locale/en.yml +9 -27
  43. data/lib/active_record/locking/optimistic.rb +16 -48
  44. data/lib/active_record/migration.rb +59 -46
  45. data/lib/active_record/named_scope.rb +85 -92
  46. data/lib/active_record/nested_attributes.rb +18 -24
  47. data/lib/active_record/observer.rb +18 -94
  48. data/lib/active_record/railtie.rb +83 -0
  49. data/lib/active_record/railties/controller_runtime.rb +38 -0
  50. data/lib/active_record/railties/databases.rake +477 -0
  51. data/lib/active_record/railties/subscriber.rb +27 -0
  52. data/lib/active_record/reflection.rb +2 -15
  53. data/lib/active_record/relation.rb +339 -0
  54. data/lib/active_record/relation/calculations.rb +259 -0
  55. data/lib/active_record/relation/finder_methods.rb +315 -0
  56. data/lib/active_record/relation/predicate_builder.rb +46 -0
  57. data/lib/active_record/relation/query_methods.rb +218 -0
  58. data/lib/active_record/relation/spawn_methods.rb +102 -0
  59. data/lib/active_record/schema_dumper.rb +10 -6
  60. data/lib/active_record/serialization.rb +31 -74
  61. data/lib/active_record/serializers/xml_serializer.rb +33 -121
  62. data/lib/active_record/session_store.rb +1 -9
  63. data/lib/active_record/test_case.rb +1 -3
  64. data/lib/active_record/timestamp.rb +7 -5
  65. data/lib/active_record/transactions.rb +9 -9
  66. data/lib/active_record/validations.rb +51 -1100
  67. data/lib/active_record/validations/associated.rb +47 -0
  68. data/lib/active_record/validations/uniqueness.rb +181 -0
  69. data/lib/active_record/version.rb +3 -3
  70. data/lib/generators/active_record.rb +30 -0
  71. data/lib/generators/active_record/migration/migration_generator.rb +25 -0
  72. data/lib/generators/active_record/migration/templates/migration.rb +11 -0
  73. data/lib/generators/active_record/model/model_generator.rb +33 -0
  74. data/lib/generators/active_record/model/templates/migration.rb +16 -0
  75. data/lib/generators/active_record/model/templates/model.rb +5 -0
  76. data/lib/generators/active_record/observer/observer_generator.rb +15 -0
  77. data/lib/generators/active_record/observer/templates/observer.rb +2 -0
  78. data/lib/generators/active_record/session_migration/session_migration_generator.rb +24 -0
  79. data/lib/generators/active_record/session_migration/templates/migration.rb +16 -0
  80. metadata +67 -325
  81. data/RUNNING_UNIT_TESTS +0 -36
  82. data/Rakefile +0 -268
  83. data/install.rb +0 -30
  84. data/lib/active_record/calculations.rb +0 -321
  85. data/lib/active_record/connection_adapters/abstract/database_limits.rb +0 -57
  86. data/lib/active_record/dirty.rb +0 -183
  87. data/lib/active_record/serializers/json_serializer.rb +0 -91
  88. data/lib/activerecord.rb +0 -2
  89. data/test/assets/example.log +0 -1
  90. data/test/assets/flowers.jpg +0 -0
  91. data/test/cases/aaa_create_tables_test.rb +0 -24
  92. data/test/cases/active_schema_test_mysql.rb +0 -122
  93. data/test/cases/active_schema_test_postgresql.rb +0 -24
  94. data/test/cases/adapter_test.rb +0 -144
  95. data/test/cases/aggregations_test.rb +0 -167
  96. data/test/cases/ar_schema_test.rb +0 -32
  97. data/test/cases/associations/belongs_to_associations_test.rb +0 -438
  98. data/test/cases/associations/callbacks_test.rb +0 -161
  99. data/test/cases/associations/cascaded_eager_loading_test.rb +0 -131
  100. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +0 -36
  101. data/test/cases/associations/eager_load_nested_include_test.rb +0 -131
  102. data/test/cases/associations/eager_load_nested_polymorphic_include.rb +0 -19
  103. data/test/cases/associations/eager_singularization_test.rb +0 -145
  104. data/test/cases/associations/eager_test.rb +0 -852
  105. data/test/cases/associations/extension_test.rb +0 -62
  106. data/test/cases/associations/habtm_join_table_test.rb +0 -56
  107. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +0 -827
  108. data/test/cases/associations/has_many_associations_test.rb +0 -1273
  109. data/test/cases/associations/has_many_through_associations_test.rb +0 -360
  110. data/test/cases/associations/has_one_associations_test.rb +0 -330
  111. data/test/cases/associations/has_one_through_associations_test.rb +0 -209
  112. data/test/cases/associations/inner_join_association_test.rb +0 -93
  113. data/test/cases/associations/inverse_associations_test.rb +0 -566
  114. data/test/cases/associations/join_model_test.rb +0 -712
  115. data/test/cases/associations_test.rb +0 -282
  116. data/test/cases/attribute_methods_test.rb +0 -305
  117. data/test/cases/autosave_association_test.rb +0 -1218
  118. data/test/cases/base_test.rb +0 -2166
  119. data/test/cases/batches_test.rb +0 -81
  120. data/test/cases/binary_test.rb +0 -30
  121. data/test/cases/calculations_test.rb +0 -360
  122. data/test/cases/callbacks_observers_test.rb +0 -38
  123. data/test/cases/callbacks_test.rb +0 -438
  124. data/test/cases/class_inheritable_attributes_test.rb +0 -32
  125. data/test/cases/column_alias_test.rb +0 -17
  126. data/test/cases/column_definition_test.rb +0 -70
  127. data/test/cases/connection_pool_test.rb +0 -25
  128. data/test/cases/connection_test_firebird.rb +0 -8
  129. data/test/cases/connection_test_mysql.rb +0 -65
  130. data/test/cases/copy_table_test_sqlite.rb +0 -80
  131. data/test/cases/counter_cache_test.rb +0 -84
  132. data/test/cases/database_statements_test.rb +0 -12
  133. data/test/cases/datatype_test_postgresql.rb +0 -204
  134. data/test/cases/date_time_test.rb +0 -37
  135. data/test/cases/default_test_firebird.rb +0 -16
  136. data/test/cases/defaults_test.rb +0 -111
  137. data/test/cases/deprecated_finder_test.rb +0 -30
  138. data/test/cases/dirty_test.rb +0 -316
  139. data/test/cases/finder_respond_to_test.rb +0 -76
  140. data/test/cases/finder_test.rb +0 -1098
  141. data/test/cases/fixtures_test.rb +0 -661
  142. data/test/cases/helper.rb +0 -68
  143. data/test/cases/i18n_test.rb +0 -46
  144. data/test/cases/inheritance_test.rb +0 -262
  145. data/test/cases/invalid_date_test.rb +0 -24
  146. data/test/cases/json_serialization_test.rb +0 -219
  147. data/test/cases/lifecycle_test.rb +0 -193
  148. data/test/cases/locking_test.rb +0 -350
  149. data/test/cases/method_scoping_test.rb +0 -704
  150. data/test/cases/migration_test.rb +0 -1649
  151. data/test/cases/migration_test_firebird.rb +0 -124
  152. data/test/cases/mixin_test.rb +0 -96
  153. data/test/cases/modules_test.rb +0 -109
  154. data/test/cases/multiple_db_test.rb +0 -85
  155. data/test/cases/named_scope_test.rb +0 -372
  156. data/test/cases/nested_attributes_test.rb +0 -840
  157. data/test/cases/pk_test.rb +0 -119
  158. data/test/cases/pooled_connections_test.rb +0 -103
  159. data/test/cases/query_cache_test.rb +0 -129
  160. data/test/cases/readonly_test.rb +0 -107
  161. data/test/cases/reflection_test.rb +0 -234
  162. data/test/cases/reload_models_test.rb +0 -22
  163. data/test/cases/repair_helper.rb +0 -50
  164. data/test/cases/reserved_word_test_mysql.rb +0 -176
  165. data/test/cases/sanitize_test.rb +0 -25
  166. data/test/cases/schema_authorization_test_postgresql.rb +0 -75
  167. data/test/cases/schema_dumper_test.rb +0 -211
  168. data/test/cases/schema_test_postgresql.rb +0 -178
  169. data/test/cases/serialization_test.rb +0 -47
  170. data/test/cases/sp_test_mysql.rb +0 -16
  171. data/test/cases/synonym_test_oracle.rb +0 -17
  172. data/test/cases/timestamp_test.rb +0 -75
  173. data/test/cases/transactions_test.rb +0 -543
  174. data/test/cases/unconnected_test.rb +0 -32
  175. data/test/cases/validations_i18n_test.rb +0 -925
  176. data/test/cases/validations_test.rb +0 -1684
  177. data/test/cases/xml_serialization_test.rb +0 -240
  178. data/test/cases/yaml_serialization_test.rb +0 -11
  179. data/test/config.rb +0 -5
  180. data/test/connections/jdbc_jdbcderby/connection.rb +0 -18
  181. data/test/connections/jdbc_jdbch2/connection.rb +0 -18
  182. data/test/connections/jdbc_jdbchsqldb/connection.rb +0 -18
  183. data/test/connections/jdbc_jdbcmysql/connection.rb +0 -26
  184. data/test/connections/jdbc_jdbcpostgresql/connection.rb +0 -26
  185. data/test/connections/jdbc_jdbcsqlite3/connection.rb +0 -25
  186. data/test/connections/native_db2/connection.rb +0 -25
  187. data/test/connections/native_firebird/connection.rb +0 -26
  188. data/test/connections/native_frontbase/connection.rb +0 -27
  189. data/test/connections/native_mysql/connection.rb +0 -25
  190. data/test/connections/native_openbase/connection.rb +0 -21
  191. data/test/connections/native_oracle/connection.rb +0 -27
  192. data/test/connections/native_postgresql/connection.rb +0 -21
  193. data/test/connections/native_sqlite/connection.rb +0 -25
  194. data/test/connections/native_sqlite3/connection.rb +0 -25
  195. data/test/connections/native_sqlite3/in_memory_connection.rb +0 -18
  196. data/test/connections/native_sybase/connection.rb +0 -23
  197. data/test/fixtures/accounts.yml +0 -29
  198. data/test/fixtures/all/developers.yml +0 -0
  199. data/test/fixtures/all/people.csv +0 -0
  200. data/test/fixtures/all/tasks.yml +0 -0
  201. data/test/fixtures/author_addresses.yml +0 -5
  202. data/test/fixtures/author_favorites.yml +0 -4
  203. data/test/fixtures/authors.yml +0 -9
  204. data/test/fixtures/binaries.yml +0 -132
  205. data/test/fixtures/books.yml +0 -7
  206. data/test/fixtures/categories.yml +0 -14
  207. data/test/fixtures/categories/special_categories.yml +0 -9
  208. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +0 -4
  209. data/test/fixtures/categories_ordered.yml +0 -7
  210. data/test/fixtures/categories_posts.yml +0 -23
  211. data/test/fixtures/categorizations.yml +0 -17
  212. data/test/fixtures/clubs.yml +0 -6
  213. data/test/fixtures/comments.yml +0 -59
  214. data/test/fixtures/companies.yml +0 -56
  215. data/test/fixtures/computers.yml +0 -4
  216. data/test/fixtures/courses.yml +0 -7
  217. data/test/fixtures/customers.yml +0 -26
  218. data/test/fixtures/developers.yml +0 -21
  219. data/test/fixtures/developers_projects.yml +0 -17
  220. data/test/fixtures/edges.yml +0 -6
  221. data/test/fixtures/entrants.yml +0 -14
  222. data/test/fixtures/faces.yml +0 -11
  223. data/test/fixtures/fk_test_has_fk.yml +0 -3
  224. data/test/fixtures/fk_test_has_pk.yml +0 -2
  225. data/test/fixtures/funny_jokes.yml +0 -10
  226. data/test/fixtures/interests.yml +0 -33
  227. data/test/fixtures/items.yml +0 -4
  228. data/test/fixtures/jobs.yml +0 -7
  229. data/test/fixtures/legacy_things.yml +0 -3
  230. data/test/fixtures/mateys.yml +0 -4
  231. data/test/fixtures/member_types.yml +0 -6
  232. data/test/fixtures/members.yml +0 -6
  233. data/test/fixtures/memberships.yml +0 -20
  234. data/test/fixtures/men.yml +0 -5
  235. data/test/fixtures/minimalistics.yml +0 -2
  236. data/test/fixtures/mixed_case_monkeys.yml +0 -6
  237. data/test/fixtures/mixins.yml +0 -29
  238. data/test/fixtures/movies.yml +0 -7
  239. data/test/fixtures/naked/csv/accounts.csv +0 -1
  240. data/test/fixtures/naked/yml/accounts.yml +0 -1
  241. data/test/fixtures/naked/yml/companies.yml +0 -1
  242. data/test/fixtures/naked/yml/courses.yml +0 -1
  243. data/test/fixtures/organizations.yml +0 -5
  244. data/test/fixtures/owners.yml +0 -7
  245. data/test/fixtures/parrots.yml +0 -27
  246. data/test/fixtures/parrots_pirates.yml +0 -7
  247. data/test/fixtures/people.yml +0 -15
  248. data/test/fixtures/pets.yml +0 -14
  249. data/test/fixtures/pirates.yml +0 -9
  250. data/test/fixtures/polymorphic_designs.yml +0 -19
  251. data/test/fixtures/polymorphic_prices.yml +0 -19
  252. data/test/fixtures/posts.yml +0 -52
  253. data/test/fixtures/price_estimates.yml +0 -7
  254. data/test/fixtures/projects.yml +0 -7
  255. data/test/fixtures/readers.yml +0 -9
  256. data/test/fixtures/references.yml +0 -17
  257. data/test/fixtures/reserved_words/distinct.yml +0 -5
  258. data/test/fixtures/reserved_words/distincts_selects.yml +0 -11
  259. data/test/fixtures/reserved_words/group.yml +0 -14
  260. data/test/fixtures/reserved_words/select.yml +0 -8
  261. data/test/fixtures/reserved_words/values.yml +0 -7
  262. data/test/fixtures/ships.yml +0 -5
  263. data/test/fixtures/sponsors.yml +0 -9
  264. data/test/fixtures/subscribers.yml +0 -7
  265. data/test/fixtures/subscriptions.yml +0 -12
  266. data/test/fixtures/taggings.yml +0 -28
  267. data/test/fixtures/tags.yml +0 -7
  268. data/test/fixtures/tasks.yml +0 -7
  269. data/test/fixtures/tees.yml +0 -4
  270. data/test/fixtures/ties.yml +0 -4
  271. data/test/fixtures/topics.yml +0 -42
  272. data/test/fixtures/toys.yml +0 -4
  273. data/test/fixtures/treasures.yml +0 -10
  274. data/test/fixtures/vertices.yml +0 -4
  275. data/test/fixtures/warehouse-things.yml +0 -3
  276. data/test/fixtures/zines.yml +0 -5
  277. data/test/migrations/broken/100_migration_that_raises_exception.rb +0 -10
  278. data/test/migrations/decimal/1_give_me_big_numbers.rb +0 -15
  279. data/test/migrations/duplicate/1_people_have_last_names.rb +0 -9
  280. data/test/migrations/duplicate/2_we_need_reminders.rb +0 -12
  281. data/test/migrations/duplicate/3_foo.rb +0 -7
  282. data/test/migrations/duplicate/3_innocent_jointable.rb +0 -12
  283. data/test/migrations/duplicate_names/20080507052938_chunky.rb +0 -7
  284. data/test/migrations/duplicate_names/20080507053028_chunky.rb +0 -7
  285. data/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +0 -12
  286. data/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +0 -9
  287. data/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +0 -12
  288. data/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +0 -9
  289. data/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +0 -8
  290. data/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +0 -12
  291. data/test/migrations/missing/1000_people_have_middle_names.rb +0 -9
  292. data/test/migrations/missing/1_people_have_last_names.rb +0 -9
  293. data/test/migrations/missing/3_we_need_reminders.rb +0 -12
  294. data/test/migrations/missing/4_innocent_jointable.rb +0 -12
  295. data/test/migrations/valid/1_people_have_last_names.rb +0 -9
  296. data/test/migrations/valid/2_we_need_reminders.rb +0 -12
  297. data/test/migrations/valid/3_innocent_jointable.rb +0 -12
  298. data/test/models/author.rb +0 -151
  299. data/test/models/auto_id.rb +0 -4
  300. data/test/models/binary.rb +0 -2
  301. data/test/models/bird.rb +0 -9
  302. data/test/models/book.rb +0 -4
  303. data/test/models/categorization.rb +0 -5
  304. data/test/models/category.rb +0 -34
  305. data/test/models/citation.rb +0 -6
  306. data/test/models/club.rb +0 -13
  307. data/test/models/column_name.rb +0 -3
  308. data/test/models/comment.rb +0 -29
  309. data/test/models/company.rb +0 -173
  310. data/test/models/company_in_module.rb +0 -78
  311. data/test/models/computer.rb +0 -3
  312. data/test/models/contact.rb +0 -16
  313. data/test/models/contract.rb +0 -5
  314. data/test/models/course.rb +0 -3
  315. data/test/models/customer.rb +0 -73
  316. data/test/models/default.rb +0 -2
  317. data/test/models/developer.rb +0 -101
  318. data/test/models/edge.rb +0 -5
  319. data/test/models/entrant.rb +0 -3
  320. data/test/models/essay.rb +0 -3
  321. data/test/models/event.rb +0 -3
  322. data/test/models/event_author.rb +0 -8
  323. data/test/models/face.rb +0 -7
  324. data/test/models/guid.rb +0 -2
  325. data/test/models/interest.rb +0 -5
  326. data/test/models/invoice.rb +0 -4
  327. data/test/models/item.rb +0 -7
  328. data/test/models/job.rb +0 -5
  329. data/test/models/joke.rb +0 -3
  330. data/test/models/keyboard.rb +0 -3
  331. data/test/models/legacy_thing.rb +0 -3
  332. data/test/models/line_item.rb +0 -3
  333. data/test/models/man.rb +0 -9
  334. data/test/models/matey.rb +0 -4
  335. data/test/models/member.rb +0 -12
  336. data/test/models/member_detail.rb +0 -5
  337. data/test/models/member_type.rb +0 -3
  338. data/test/models/membership.rb +0 -9
  339. data/test/models/minimalistic.rb +0 -2
  340. data/test/models/mixed_case_monkey.rb +0 -3
  341. data/test/models/movie.rb +0 -5
  342. data/test/models/order.rb +0 -4
  343. data/test/models/organization.rb +0 -6
  344. data/test/models/owner.rb +0 -5
  345. data/test/models/parrot.rb +0 -22
  346. data/test/models/person.rb +0 -16
  347. data/test/models/pet.rb +0 -5
  348. data/test/models/pirate.rb +0 -80
  349. data/test/models/polymorphic_design.rb +0 -3
  350. data/test/models/polymorphic_price.rb +0 -3
  351. data/test/models/post.rb +0 -102
  352. data/test/models/price_estimate.rb +0 -3
  353. data/test/models/project.rb +0 -30
  354. data/test/models/reader.rb +0 -4
  355. data/test/models/reference.rb +0 -4
  356. data/test/models/reply.rb +0 -46
  357. data/test/models/ship.rb +0 -19
  358. data/test/models/ship_part.rb +0 -7
  359. data/test/models/sponsor.rb +0 -4
  360. data/test/models/subject.rb +0 -4
  361. data/test/models/subscriber.rb +0 -8
  362. data/test/models/subscription.rb +0 -4
  363. data/test/models/tag.rb +0 -7
  364. data/test/models/tagging.rb +0 -10
  365. data/test/models/task.rb +0 -3
  366. data/test/models/tee.rb +0 -4
  367. data/test/models/tie.rb +0 -4
  368. data/test/models/topic.rb +0 -80
  369. data/test/models/toy.rb +0 -6
  370. data/test/models/treasure.rb +0 -8
  371. data/test/models/vertex.rb +0 -9
  372. data/test/models/warehouse_thing.rb +0 -5
  373. data/test/models/zine.rb +0 -3
  374. data/test/schema/mysql_specific_schema.rb +0 -31
  375. data/test/schema/postgresql_specific_schema.rb +0 -114
  376. data/test/schema/schema.rb +0 -550
  377. data/test/schema/schema2.rb +0 -6
  378. data/test/schema/sqlite_specific_schema.rb +0 -25
@@ -1,37 +0,0 @@
1
- require "cases/helper"
2
- require 'models/topic'
3
- require 'models/task'
4
-
5
- class DateTimeTest < ActiveRecord::TestCase
6
- def test_saves_both_date_and_time
7
- time_values = [1807, 2, 10, 15, 30, 45]
8
- now = DateTime.civil(*time_values)
9
-
10
- task = Task.new
11
- task.starting = now
12
- task.save!
13
-
14
- # check against Time.local_time, since some platforms will return a Time instead of a DateTime
15
- assert_equal Time.local_time(*time_values), Task.find(task.id).starting
16
- end
17
-
18
- def test_assign_empty_date_time
19
- task = Task.new
20
- task.starting = ''
21
- task.ending = nil
22
- assert_nil task.starting
23
- assert_nil task.ending
24
- end
25
-
26
- def test_assign_empty_date
27
- topic = Topic.new
28
- topic.last_read = ''
29
- assert_nil topic.last_read
30
- end
31
-
32
- def test_assign_empty_time
33
- topic = Topic.new
34
- topic.bonus_time = ''
35
- assert_nil topic.bonus_time
36
- end
37
- end
@@ -1,16 +0,0 @@
1
- require "cases/helper"
2
- require 'models/default'
3
-
4
- class DefaultTest < ActiveRecord::TestCase
5
- def test_default_timestamp
6
- default = Default.new
7
- assert_instance_of(Time, default.default_timestamp)
8
- assert_equal(:datetime, default.column_for_attribute(:default_timestamp).type)
9
-
10
- # Variance should be small; increase if required -- e.g., if test db is on
11
- # remote host and clocks aren't synchronized.
12
- t1 = Time.new
13
- accepted_variance = 1.0
14
- assert_in_delta(t1.to_f, default.default_timestamp.to_f, accepted_variance)
15
- end
16
- end
@@ -1,111 +0,0 @@
1
- require "cases/helper"
2
- require 'models/default'
3
- require 'models/entrant'
4
-
5
- class DefaultTest < ActiveRecord::TestCase
6
- def test_nil_defaults_for_not_null_columns
7
- column_defaults =
8
- if current_adapter?(:MysqlAdapter) && (Mysql.client_version < 50051 || (50100..50122).include?(Mysql.client_version))
9
- { 'id' => nil, 'name' => '', 'course_id' => nil }
10
- else
11
- { 'id' => nil, 'name' => nil, 'course_id' => nil }
12
- end
13
-
14
- column_defaults.each do |name, default|
15
- column = Entrant.columns_hash[name]
16
- assert !column.null, "#{name} column should be NOT NULL"
17
- assert_equal default, column.default, "#{name} column should be DEFAULT #{default.inspect}"
18
- end
19
- end
20
-
21
- if current_adapter?(:PostgreSQLAdapter, :FirebirdAdapter, :OpenBaseAdapter, :OracleAdapter)
22
- def test_default_integers
23
- default = Default.new
24
- assert_instance_of Fixnum, default.positive_integer
25
- assert_equal 1, default.positive_integer
26
- assert_instance_of Fixnum, default.negative_integer
27
- assert_equal -1, default.negative_integer
28
- assert_instance_of BigDecimal, default.decimal_number
29
- assert_equal BigDecimal.new("2.78"), default.decimal_number
30
- end
31
- end
32
-
33
- if current_adapter?(:PostgreSQLAdapter)
34
- def test_multiline_default_text
35
- # older postgres versions represent the default with escapes ("\\012" for a newline)
36
- assert ( "--- []\n\n" == Default.columns_hash['multiline_default'].default ||
37
- "--- []\\012\\012" == Default.columns_hash['multiline_default'].default)
38
- end
39
- end
40
- end
41
-
42
- if current_adapter?(:MysqlAdapter)
43
- class DefaultsTestWithoutTransactionalFixtures < ActiveRecord::TestCase
44
- # ActiveRecord::Base#create! (and #save and other related methods) will
45
- # open a new transaction. When in transactional fixtures mode, this will
46
- # cause ActiveRecord to create a new savepoint. However, since MySQL doesn't
47
- # support DDL transactions, creating a table will result in any created
48
- # savepoints to be automatically released. This in turn causes the savepoint
49
- # release code in AbstractAdapter#transaction to fail.
50
- #
51
- # We don't want that to happen, so we disable transactional fixtures here.
52
- self.use_transactional_fixtures = false
53
-
54
- # MySQL 5 and higher is quirky with not null text/blob columns.
55
- # With MySQL Text/blob columns cannot have defaults. If the column is not
56
- # null MySQL will report that the column has a null default
57
- # but it behaves as though the column had a default of ''
58
- def test_mysql_text_not_null_defaults
59
- klass = Class.new(ActiveRecord::Base)
60
- klass.table_name = 'test_mysql_text_not_null_defaults'
61
- klass.connection.create_table klass.table_name do |t|
62
- t.column :non_null_text, :text, :null => false
63
- t.column :non_null_blob, :blob, :null => false
64
- t.column :null_text, :text, :null => true
65
- t.column :null_blob, :blob, :null => true
66
- end
67
- assert_equal '', klass.columns_hash['non_null_blob'].default
68
- assert_equal '', klass.columns_hash['non_null_text'].default
69
-
70
- assert_equal nil, klass.columns_hash['null_blob'].default
71
- assert_equal nil, klass.columns_hash['null_text'].default
72
-
73
- assert_nothing_raised do
74
- instance = klass.create!
75
- assert_equal '', instance.non_null_text
76
- assert_equal '', instance.non_null_blob
77
- assert_nil instance.null_text
78
- assert_nil instance.null_blob
79
- end
80
- ensure
81
- klass.connection.drop_table(klass.table_name) rescue nil
82
- end
83
-
84
- # MySQL uses an implicit default 0 rather than NULL unless in strict mode.
85
- # We use an implicit NULL so schema.rb is compatible with other databases.
86
- def test_mysql_integer_not_null_defaults
87
- klass = Class.new(ActiveRecord::Base)
88
- klass.table_name = 'test_integer_not_null_default_zero'
89
- klass.connection.create_table klass.table_name do |t|
90
- t.column :zero, :integer, :null => false, :default => 0
91
- t.column :omit, :integer, :null => false
92
- end
93
-
94
- assert_equal 0, klass.columns_hash['zero'].default
95
- assert !klass.columns_hash['zero'].null
96
- # 0 in MySQL 4, nil in 5.
97
- assert [0, nil].include?(klass.columns_hash['omit'].default)
98
- assert !klass.columns_hash['omit'].null
99
-
100
- assert_raise(ActiveRecord::StatementInvalid) { klass.create! }
101
-
102
- assert_nothing_raised do
103
- instance = klass.create!(:omit => 1)
104
- assert_equal 0, instance.zero
105
- assert_equal 1, instance.omit
106
- end
107
- ensure
108
- klass.connection.drop_table(klass.table_name) rescue nil
109
- end
110
- end
111
- end
@@ -1,30 +0,0 @@
1
- require "cases/helper"
2
- require 'models/entrant'
3
-
4
- class DeprecatedFinderTest < ActiveRecord::TestCase
5
- fixtures :entrants
6
-
7
- def test_deprecated_find_all_was_removed
8
- assert_raise(NoMethodError) { Entrant.find_all }
9
- end
10
-
11
- def test_deprecated_find_first_was_removed
12
- assert_raise(NoMethodError) { Entrant.find_first }
13
- end
14
-
15
- def test_deprecated_find_on_conditions_was_removed
16
- assert_raise(NoMethodError) { Entrant.find_on_conditions }
17
- end
18
-
19
- def test_count
20
- assert_equal(0, Entrant.count(:conditions => "id > 3"))
21
- assert_equal(1, Entrant.count(:conditions => ["id > ?", 2]))
22
- assert_equal(2, Entrant.count(:conditions => ["id > ?", 1]))
23
- end
24
-
25
- def test_count_by_sql
26
- assert_equal(0, Entrant.count_by_sql("SELECT COUNT(*) FROM entrants WHERE id > 3"))
27
- assert_equal(1, Entrant.count_by_sql(["SELECT COUNT(*) FROM entrants WHERE id > ?", 2]))
28
- assert_equal(2, Entrant.count_by_sql(["SELECT COUNT(*) FROM entrants WHERE id > ?", 1]))
29
- end
30
- end
@@ -1,316 +0,0 @@
1
- require 'cases/helper'
2
- require 'models/topic' # For booleans
3
- require 'models/pirate' # For timestamps
4
- require 'models/parrot'
5
- require 'models/person' # For optimistic locking
6
-
7
- class Pirate # Just reopening it, not defining it
8
- attr_accessor :detected_changes_in_after_update # Boolean for if changes are detected
9
- attr_accessor :changes_detected_in_after_update # Actual changes
10
-
11
- after_update :check_changes
12
-
13
- private
14
- # after_save/update in sweepers, observers, and the model itself
15
- # can end up checking dirty status and acting on the results
16
- def check_changes
17
- if self.changed?
18
- self.detected_changes_in_after_update = true
19
- self.changes_detected_in_after_update = self.changes
20
- end
21
- end
22
- end
23
-
24
- class NumericData < ActiveRecord::Base
25
- self.table_name = 'numeric_data'
26
- end
27
-
28
- class DirtyTest < ActiveRecord::TestCase
29
- def test_attribute_changes
30
- # New record - no changes.
31
- pirate = Pirate.new
32
- assert !pirate.catchphrase_changed?
33
- assert_nil pirate.catchphrase_change
34
-
35
- # Change catchphrase.
36
- pirate.catchphrase = 'arrr'
37
- assert pirate.catchphrase_changed?
38
- assert_nil pirate.catchphrase_was
39
- assert_equal [nil, 'arrr'], pirate.catchphrase_change
40
-
41
- # Saved - no changes.
42
- pirate.save!
43
- assert !pirate.catchphrase_changed?
44
- assert_nil pirate.catchphrase_change
45
-
46
- # Same value - no changes.
47
- pirate.catchphrase = 'arrr'
48
- assert !pirate.catchphrase_changed?
49
- assert_nil pirate.catchphrase_change
50
- end
51
-
52
- def test_aliased_attribute_changes
53
- # the actual attribute here is name, title is an
54
- # alias setup via alias_attribute
55
- parrot = Parrot.new
56
- assert !parrot.title_changed?
57
- assert_nil parrot.title_change
58
-
59
- parrot.name = 'Sam'
60
- assert parrot.title_changed?
61
- assert_nil parrot.title_was
62
- assert_equal parrot.name_change, parrot.title_change
63
- end
64
-
65
- def test_nullable_number_not_marked_as_changed_if_new_value_is_blank
66
- pirate = Pirate.new
67
-
68
- ["", nil].each do |value|
69
- pirate.parrot_id = value
70
- assert !pirate.parrot_id_changed?
71
- assert_nil pirate.parrot_id_change
72
- end
73
- end
74
-
75
- def test_nullable_decimal_not_marked_as_changed_if_new_value_is_blank
76
- numeric_data = NumericData.new
77
-
78
- ["", nil].each do |value|
79
- numeric_data.bank_balance = value
80
- assert !numeric_data.bank_balance_changed?
81
- assert_nil numeric_data.bank_balance_change
82
- end
83
- end
84
-
85
- def test_nullable_float_not_marked_as_changed_if_new_value_is_blank
86
- numeric_data = NumericData.new
87
-
88
- ["", nil].each do |value|
89
- numeric_data.temperature = value
90
- assert !numeric_data.temperature_changed?
91
- assert_nil numeric_data.temperature_change
92
- end
93
- end
94
-
95
- def test_nullable_integer_zero_to_string_zero_not_marked_as_changed
96
- pirate = Pirate.new
97
- pirate.parrot_id = 0
98
- pirate.catchphrase = 'arrr'
99
- assert pirate.save!
100
-
101
- assert !pirate.changed?
102
-
103
- pirate.parrot_id = '0'
104
- assert !pirate.changed?
105
- end
106
-
107
- def test_zero_to_blank_marked_as_changed
108
- pirate = Pirate.new
109
- pirate.catchphrase = "Yarrrr, me hearties"
110
- pirate.parrot_id = 1
111
- pirate.save
112
-
113
- # check the change from 1 to ''
114
- pirate = Pirate.find_by_catchphrase("Yarrrr, me hearties")
115
- pirate.parrot_id = ''
116
- assert pirate.parrot_id_changed?
117
- assert_equal([1, nil], pirate.parrot_id_change)
118
- pirate.save
119
-
120
- # check the change from nil to 0
121
- pirate = Pirate.find_by_catchphrase("Yarrrr, me hearties")
122
- pirate.parrot_id = 0
123
- assert pirate.parrot_id_changed?
124
- assert_equal([nil, 0], pirate.parrot_id_change)
125
- pirate.save
126
-
127
- # check the change from 0 to ''
128
- pirate = Pirate.find_by_catchphrase("Yarrrr, me hearties")
129
- pirate.parrot_id = ''
130
- assert pirate.parrot_id_changed?
131
- assert_equal([0, nil], pirate.parrot_id_change)
132
- end
133
-
134
- def test_object_should_be_changed_if_any_attribute_is_changed
135
- pirate = Pirate.new
136
- assert !pirate.changed?
137
- assert_equal [], pirate.changed
138
- assert_equal Hash.new, pirate.changes
139
-
140
- pirate.catchphrase = 'arrr'
141
- assert pirate.changed?
142
- assert_nil pirate.catchphrase_was
143
- assert_equal %w(catchphrase), pirate.changed
144
- assert_equal({'catchphrase' => [nil, 'arrr']}, pirate.changes)
145
-
146
- pirate.save
147
- assert !pirate.changed?
148
- assert_equal [], pirate.changed
149
- assert_equal Hash.new, pirate.changes
150
- end
151
-
152
- def test_attribute_will_change!
153
- pirate = Pirate.create!(:catchphrase => 'arr')
154
-
155
- pirate.catchphrase << ' matey'
156
- assert !pirate.catchphrase_changed?
157
-
158
- assert pirate.catchphrase_will_change!
159
- assert pirate.catchphrase_changed?
160
- assert_equal ['arr matey', 'arr matey'], pirate.catchphrase_change
161
-
162
- pirate.catchphrase << '!'
163
- assert pirate.catchphrase_changed?
164
- assert_equal ['arr matey', 'arr matey!'], pirate.catchphrase_change
165
- end
166
-
167
- def test_association_assignment_changes_foreign_key
168
- pirate = Pirate.create!(:catchphrase => 'jarl')
169
- pirate.parrot = Parrot.create!(:name => 'Lorre')
170
- assert pirate.changed?
171
- assert_equal %w(parrot_id), pirate.changed
172
- end
173
-
174
- def test_attribute_should_be_compared_with_type_cast
175
- topic = Topic.new
176
- assert topic.approved?
177
- assert !topic.approved_changed?
178
-
179
- # Coming from web form.
180
- params = {:topic => {:approved => 1}}
181
- # In the controller.
182
- topic.attributes = params[:topic]
183
- assert topic.approved?
184
- assert !topic.approved_changed?
185
- end
186
-
187
- def test_partial_update
188
- pirate = Pirate.new(:catchphrase => 'foo')
189
- old_updated_on = 1.hour.ago.beginning_of_day
190
-
191
- with_partial_updates Pirate, false do
192
- assert_queries(2) { 2.times { pirate.save! } }
193
- Pirate.update_all({ :updated_on => old_updated_on }, :id => pirate.id)
194
- end
195
-
196
- with_partial_updates Pirate, true do
197
- assert_queries(0) { 2.times { pirate.save! } }
198
- assert_equal old_updated_on, pirate.reload.updated_on
199
-
200
- assert_queries(1) { pirate.catchphrase = 'bar'; pirate.save! }
201
- assert_not_equal old_updated_on, pirate.reload.updated_on
202
- end
203
- end
204
-
205
- def test_partial_update_with_optimistic_locking
206
- person = Person.new(:first_name => 'foo')
207
- old_lock_version = 1
208
-
209
- with_partial_updates Person, false do
210
- assert_queries(2) { 2.times { person.save! } }
211
- Person.update_all({ :first_name => 'baz' }, :id => person.id)
212
- end
213
-
214
- with_partial_updates Person, true do
215
- assert_queries(0) { 2.times { person.save! } }
216
- assert_equal old_lock_version, person.reload.lock_version
217
-
218
- assert_queries(1) { person.first_name = 'bar'; person.save! }
219
- assert_not_equal old_lock_version, person.reload.lock_version
220
- end
221
- end
222
-
223
- def test_changed_attributes_should_be_preserved_if_save_failure
224
- pirate = Pirate.new
225
- pirate.parrot_id = 1
226
- assert !pirate.save
227
- check_pirate_after_save_failure(pirate)
228
-
229
- pirate = Pirate.new
230
- pirate.parrot_id = 1
231
- assert_raise(ActiveRecord::RecordInvalid) { pirate.save! }
232
- check_pirate_after_save_failure(pirate)
233
- end
234
-
235
- def test_reload_should_clear_changed_attributes
236
- pirate = Pirate.create!(:catchphrase => "shiver me timbers")
237
- pirate.catchphrase = "*hic*"
238
- assert pirate.changed?
239
- pirate.reload
240
- assert !pirate.changed?
241
- end
242
-
243
- def test_reverted_changes_are_not_dirty
244
- phrase = "shiver me timbers"
245
- pirate = Pirate.create!(:catchphrase => phrase)
246
- pirate.catchphrase = "*hic*"
247
- assert pirate.changed?
248
- pirate.catchphrase = phrase
249
- assert !pirate.changed?
250
- end
251
-
252
- def test_reverted_changes_are_not_dirty_after_multiple_changes
253
- phrase = "shiver me timbers"
254
- pirate = Pirate.create!(:catchphrase => phrase)
255
- 10.times do |i|
256
- pirate.catchphrase = "*hic*" * i
257
- assert pirate.changed?
258
- end
259
- assert pirate.changed?
260
- pirate.catchphrase = phrase
261
- assert !pirate.changed?
262
- end
263
-
264
-
265
- def test_reverted_changes_are_not_dirty_going_from_nil_to_value_and_back
266
- pirate = Pirate.create!(:catchphrase => "Yar!")
267
-
268
- pirate.parrot_id = 1
269
- assert pirate.changed?
270
- assert pirate.parrot_id_changed?
271
- assert !pirate.catchphrase_changed?
272
-
273
- pirate.parrot_id = nil
274
- assert !pirate.changed?
275
- assert !pirate.parrot_id_changed?
276
- assert !pirate.catchphrase_changed?
277
- end
278
-
279
- def test_save_should_store_serialized_attributes_even_with_partial_updates
280
- with_partial_updates(Topic) do
281
- topic = Topic.create!(:content => {:a => "a"})
282
- topic.content[:b] = "b"
283
- #assert topic.changed? # Known bug, will fail
284
- topic.save!
285
- assert_equal "b", topic.content[:b]
286
- topic.reload
287
- assert_equal "b", topic.content[:b]
288
- end
289
- end
290
-
291
- def test_save_should_not_save_serialized_attribute_with_partial_updates_if_not_present
292
- with_partial_updates(Topic) do
293
- Topic.create!(:author_name => 'Bill', :content => {:a => "a"})
294
- topic = Topic.first(:select => 'id, author_name')
295
- topic.update_attribute :author_name, 'John'
296
- topic = Topic.first
297
- assert_not_nil topic.content
298
- end
299
- end
300
-
301
- private
302
- def with_partial_updates(klass, on = true)
303
- old = klass.partial_updates?
304
- klass.partial_updates = on
305
- yield
306
- ensure
307
- klass.partial_updates = old
308
- end
309
-
310
- def check_pirate_after_save_failure(pirate)
311
- assert pirate.changed?
312
- assert pirate.parrot_id_changed?
313
- assert_equal %w(parrot_id), pirate.changed
314
- assert_nil pirate.parrot_id_was
315
- end
316
- end