activerecord 2.3.18 → 3.2.22

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 (454) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +1014 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.rdoc +222 -0
  5. data/examples/performance.rb +100 -126
  6. data/examples/simple.rb +14 -0
  7. data/lib/active_record/aggregations.rb +93 -99
  8. data/lib/active_record/associations/alias_tracker.rb +76 -0
  9. data/lib/active_record/associations/association.rb +247 -0
  10. data/lib/active_record/associations/association_scope.rb +134 -0
  11. data/lib/active_record/associations/belongs_to_association.rb +54 -61
  12. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +17 -59
  13. data/lib/active_record/associations/builder/association.rb +55 -0
  14. data/lib/active_record/associations/builder/belongs_to.rb +88 -0
  15. data/lib/active_record/associations/builder/collection_association.rb +75 -0
  16. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +57 -0
  17. data/lib/active_record/associations/builder/has_many.rb +71 -0
  18. data/lib/active_record/associations/builder/has_one.rb +62 -0
  19. data/lib/active_record/associations/builder/singular_association.rb +32 -0
  20. data/lib/active_record/associations/collection_association.rb +580 -0
  21. data/lib/active_record/associations/collection_proxy.rb +133 -0
  22. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +39 -119
  23. data/lib/active_record/associations/has_many_association.rb +60 -79
  24. data/lib/active_record/associations/has_many_through_association.rb +127 -206
  25. data/lib/active_record/associations/has_one_association.rb +55 -114
  26. data/lib/active_record/associations/has_one_through_association.rb +25 -26
  27. data/lib/active_record/associations/join_dependency/join_association.rb +159 -0
  28. data/lib/active_record/associations/join_dependency/join_base.rb +24 -0
  29. data/lib/active_record/associations/join_dependency/join_part.rb +78 -0
  30. data/lib/active_record/associations/join_dependency.rb +214 -0
  31. data/lib/active_record/associations/join_helper.rb +55 -0
  32. data/lib/active_record/associations/preloader/association.rb +125 -0
  33. data/lib/active_record/associations/preloader/belongs_to.rb +17 -0
  34. data/lib/active_record/associations/preloader/collection_association.rb +24 -0
  35. data/lib/active_record/associations/preloader/has_and_belongs_to_many.rb +60 -0
  36. data/lib/active_record/associations/preloader/has_many.rb +17 -0
  37. data/lib/active_record/associations/preloader/has_many_through.rb +15 -0
  38. data/lib/active_record/associations/preloader/has_one.rb +23 -0
  39. data/lib/active_record/associations/preloader/has_one_through.rb +9 -0
  40. data/lib/active_record/associations/preloader/singular_association.rb +21 -0
  41. data/lib/active_record/associations/preloader/through_association.rb +67 -0
  42. data/lib/active_record/associations/preloader.rb +181 -0
  43. data/lib/active_record/associations/singular_association.rb +64 -0
  44. data/lib/active_record/associations/through_association.rb +87 -0
  45. data/lib/active_record/associations.rb +693 -1337
  46. data/lib/active_record/attribute_assignment.rb +221 -0
  47. data/lib/active_record/attribute_methods/before_type_cast.rb +31 -0
  48. data/lib/active_record/attribute_methods/deprecated_underscore_read.rb +32 -0
  49. data/lib/active_record/attribute_methods/dirty.rb +111 -0
  50. data/lib/active_record/attribute_methods/primary_key.rb +114 -0
  51. data/lib/active_record/attribute_methods/query.rb +39 -0
  52. data/lib/active_record/attribute_methods/read.rb +136 -0
  53. data/lib/active_record/attribute_methods/serialization.rb +120 -0
  54. data/lib/active_record/attribute_methods/time_zone_conversion.rb +65 -0
  55. data/lib/active_record/attribute_methods/write.rb +70 -0
  56. data/lib/active_record/attribute_methods.rb +211 -339
  57. data/lib/active_record/autosave_association.rb +179 -149
  58. data/lib/active_record/base.rb +401 -2907
  59. data/lib/active_record/callbacks.rb +91 -176
  60. data/lib/active_record/coders/yaml_column.rb +41 -0
  61. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +236 -119
  62. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +110 -58
  63. data/lib/active_record/connection_adapters/abstract/database_limits.rb +12 -11
  64. data/lib/active_record/connection_adapters/abstract/database_statements.rb +175 -74
  65. data/lib/active_record/connection_adapters/abstract/query_cache.rb +31 -35
  66. data/lib/active_record/connection_adapters/abstract/quoting.rb +71 -21
  67. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +81 -311
  68. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +194 -78
  69. data/lib/active_record/connection_adapters/abstract_adapter.rb +130 -83
  70. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +676 -0
  71. data/lib/active_record/connection_adapters/column.rb +296 -0
  72. data/lib/active_record/connection_adapters/mysql2_adapter.rb +280 -0
  73. data/lib/active_record/connection_adapters/mysql_adapter.rb +272 -493
  74. data/lib/active_record/connection_adapters/postgresql_adapter.rb +650 -405
  75. data/lib/active_record/connection_adapters/schema_cache.rb +69 -0
  76. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +30 -9
  77. data/lib/active_record/connection_adapters/sqlite_adapter.rb +276 -147
  78. data/lib/active_record/connection_adapters/statement_pool.rb +40 -0
  79. data/lib/active_record/counter_cache.rb +123 -0
  80. data/lib/active_record/dynamic_finder_match.rb +41 -14
  81. data/lib/active_record/dynamic_matchers.rb +84 -0
  82. data/lib/active_record/dynamic_scope_match.rb +13 -15
  83. data/lib/active_record/errors.rb +195 -0
  84. data/lib/active_record/explain.rb +86 -0
  85. data/lib/active_record/explain_subscriber.rb +25 -0
  86. data/lib/active_record/fixtures/file.rb +65 -0
  87. data/lib/active_record/fixtures.rb +695 -770
  88. data/lib/active_record/identity_map.rb +162 -0
  89. data/lib/active_record/inheritance.rb +174 -0
  90. data/lib/active_record/integration.rb +60 -0
  91. data/lib/active_record/locale/en.yml +9 -27
  92. data/lib/active_record/locking/optimistic.rb +76 -73
  93. data/lib/active_record/locking/pessimistic.rb +32 -10
  94. data/lib/active_record/log_subscriber.rb +72 -0
  95. data/lib/active_record/migration/command_recorder.rb +105 -0
  96. data/lib/active_record/migration.rb +415 -205
  97. data/lib/active_record/model_schema.rb +368 -0
  98. data/lib/active_record/nested_attributes.rb +153 -63
  99. data/lib/active_record/observer.rb +27 -103
  100. data/lib/active_record/persistence.rb +376 -0
  101. data/lib/active_record/query_cache.rb +49 -8
  102. data/lib/active_record/querying.rb +58 -0
  103. data/lib/active_record/railtie.rb +131 -0
  104. data/lib/active_record/railties/console_sandbox.rb +6 -0
  105. data/lib/active_record/railties/controller_runtime.rb +49 -0
  106. data/lib/active_record/railties/databases.rake +659 -0
  107. data/lib/active_record/railties/jdbcmysql_error.rb +16 -0
  108. data/lib/active_record/readonly_attributes.rb +26 -0
  109. data/lib/active_record/reflection.rb +269 -120
  110. data/lib/active_record/relation/batches.rb +90 -0
  111. data/lib/active_record/relation/calculations.rb +372 -0
  112. data/lib/active_record/relation/delegation.rb +49 -0
  113. data/lib/active_record/relation/finder_methods.rb +402 -0
  114. data/lib/active_record/relation/predicate_builder.rb +63 -0
  115. data/lib/active_record/relation/query_methods.rb +417 -0
  116. data/lib/active_record/relation/spawn_methods.rb +180 -0
  117. data/lib/active_record/relation.rb +537 -0
  118. data/lib/active_record/result.rb +40 -0
  119. data/lib/active_record/sanitization.rb +194 -0
  120. data/lib/active_record/schema.rb +9 -6
  121. data/lib/active_record/schema_dumper.rb +55 -32
  122. data/lib/active_record/scoping/default.rb +142 -0
  123. data/lib/active_record/scoping/named.rb +200 -0
  124. data/lib/active_record/scoping.rb +152 -0
  125. data/lib/active_record/serialization.rb +8 -91
  126. data/lib/active_record/serializers/xml_serializer.rb +43 -197
  127. data/lib/active_record/session_store.rb +129 -103
  128. data/lib/active_record/store.rb +52 -0
  129. data/lib/active_record/test_case.rb +30 -23
  130. data/lib/active_record/timestamp.rb +95 -52
  131. data/lib/active_record/transactions.rb +212 -66
  132. data/lib/active_record/translation.rb +22 -0
  133. data/lib/active_record/validations/associated.rb +43 -0
  134. data/lib/active_record/validations/uniqueness.rb +180 -0
  135. data/lib/active_record/validations.rb +43 -1106
  136. data/lib/active_record/version.rb +5 -4
  137. data/lib/active_record.rb +121 -48
  138. data/lib/rails/generators/active_record/migration/migration_generator.rb +25 -0
  139. data/lib/rails/generators/active_record/migration/templates/migration.rb +34 -0
  140. data/lib/rails/generators/active_record/migration.rb +15 -0
  141. data/lib/rails/generators/active_record/model/model_generator.rb +47 -0
  142. data/lib/rails/generators/active_record/model/templates/migration.rb +15 -0
  143. data/lib/rails/generators/active_record/model/templates/model.rb +12 -0
  144. data/lib/rails/generators/active_record/model/templates/module.rb +7 -0
  145. data/lib/rails/generators/active_record/observer/observer_generator.rb +15 -0
  146. data/lib/rails/generators/active_record/observer/templates/observer.rb +4 -0
  147. data/lib/rails/generators/active_record/session_migration/session_migration_generator.rb +25 -0
  148. data/lib/rails/generators/active_record/session_migration/templates/migration.rb +12 -0
  149. data/lib/rails/generators/active_record.rb +25 -0
  150. metadata +187 -363
  151. data/CHANGELOG +0 -5904
  152. data/README +0 -351
  153. data/RUNNING_UNIT_TESTS +0 -36
  154. data/Rakefile +0 -268
  155. data/install.rb +0 -30
  156. data/lib/active_record/association_preload.rb +0 -406
  157. data/lib/active_record/associations/association_collection.rb +0 -533
  158. data/lib/active_record/associations/association_proxy.rb +0 -288
  159. data/lib/active_record/batches.rb +0 -85
  160. data/lib/active_record/calculations.rb +0 -321
  161. data/lib/active_record/dirty.rb +0 -183
  162. data/lib/active_record/named_scope.rb +0 -197
  163. data/lib/active_record/serializers/json_serializer.rb +0 -91
  164. data/lib/activerecord.rb +0 -2
  165. data/test/assets/example.log +0 -1
  166. data/test/assets/flowers.jpg +0 -0
  167. data/test/cases/aaa_create_tables_test.rb +0 -24
  168. data/test/cases/active_schema_test_mysql.rb +0 -122
  169. data/test/cases/active_schema_test_postgresql.rb +0 -24
  170. data/test/cases/adapter_test.rb +0 -144
  171. data/test/cases/aggregations_test.rb +0 -167
  172. data/test/cases/ar_schema_test.rb +0 -32
  173. data/test/cases/associations/belongs_to_associations_test.rb +0 -438
  174. data/test/cases/associations/callbacks_test.rb +0 -161
  175. data/test/cases/associations/cascaded_eager_loading_test.rb +0 -131
  176. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +0 -36
  177. data/test/cases/associations/eager_load_nested_include_test.rb +0 -131
  178. data/test/cases/associations/eager_load_nested_polymorphic_include.rb +0 -19
  179. data/test/cases/associations/eager_singularization_test.rb +0 -145
  180. data/test/cases/associations/eager_test.rb +0 -852
  181. data/test/cases/associations/extension_test.rb +0 -62
  182. data/test/cases/associations/habtm_join_table_test.rb +0 -56
  183. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +0 -827
  184. data/test/cases/associations/has_many_associations_test.rb +0 -1273
  185. data/test/cases/associations/has_many_through_associations_test.rb +0 -360
  186. data/test/cases/associations/has_one_associations_test.rb +0 -330
  187. data/test/cases/associations/has_one_through_associations_test.rb +0 -209
  188. data/test/cases/associations/inner_join_association_test.rb +0 -93
  189. data/test/cases/associations/inverse_associations_test.rb +0 -566
  190. data/test/cases/associations/join_model_test.rb +0 -712
  191. data/test/cases/associations_test.rb +0 -282
  192. data/test/cases/attribute_methods_test.rb +0 -305
  193. data/test/cases/autosave_association_test.rb +0 -1218
  194. data/test/cases/base_test.rb +0 -2166
  195. data/test/cases/batches_test.rb +0 -81
  196. data/test/cases/binary_test.rb +0 -30
  197. data/test/cases/calculations_test.rb +0 -360
  198. data/test/cases/callbacks_observers_test.rb +0 -38
  199. data/test/cases/callbacks_test.rb +0 -438
  200. data/test/cases/class_inheritable_attributes_test.rb +0 -32
  201. data/test/cases/column_alias_test.rb +0 -17
  202. data/test/cases/column_definition_test.rb +0 -70
  203. data/test/cases/connection_pool_test.rb +0 -25
  204. data/test/cases/connection_test_firebird.rb +0 -8
  205. data/test/cases/connection_test_mysql.rb +0 -65
  206. data/test/cases/copy_table_test_sqlite.rb +0 -80
  207. data/test/cases/counter_cache_test.rb +0 -84
  208. data/test/cases/database_statements_test.rb +0 -12
  209. data/test/cases/datatype_test_postgresql.rb +0 -204
  210. data/test/cases/date_time_test.rb +0 -37
  211. data/test/cases/default_test_firebird.rb +0 -16
  212. data/test/cases/defaults_test.rb +0 -111
  213. data/test/cases/deprecated_finder_test.rb +0 -30
  214. data/test/cases/dirty_test.rb +0 -316
  215. data/test/cases/finder_respond_to_test.rb +0 -76
  216. data/test/cases/finder_test.rb +0 -1098
  217. data/test/cases/fixtures_test.rb +0 -661
  218. data/test/cases/helper.rb +0 -68
  219. data/test/cases/i18n_test.rb +0 -46
  220. data/test/cases/inheritance_test.rb +0 -262
  221. data/test/cases/invalid_date_test.rb +0 -24
  222. data/test/cases/json_serialization_test.rb +0 -219
  223. data/test/cases/lifecycle_test.rb +0 -193
  224. data/test/cases/locking_test.rb +0 -350
  225. data/test/cases/method_scoping_test.rb +0 -704
  226. data/test/cases/migration_test.rb +0 -1649
  227. data/test/cases/migration_test_firebird.rb +0 -124
  228. data/test/cases/mixin_test.rb +0 -96
  229. data/test/cases/modules_test.rb +0 -109
  230. data/test/cases/multiple_db_test.rb +0 -85
  231. data/test/cases/named_scope_test.rb +0 -372
  232. data/test/cases/nested_attributes_test.rb +0 -840
  233. data/test/cases/pk_test.rb +0 -119
  234. data/test/cases/pooled_connections_test.rb +0 -103
  235. data/test/cases/query_cache_test.rb +0 -129
  236. data/test/cases/readonly_test.rb +0 -107
  237. data/test/cases/reflection_test.rb +0 -234
  238. data/test/cases/reload_models_test.rb +0 -22
  239. data/test/cases/repair_helper.rb +0 -50
  240. data/test/cases/reserved_word_test_mysql.rb +0 -176
  241. data/test/cases/sanitize_test.rb +0 -25
  242. data/test/cases/schema_authorization_test_postgresql.rb +0 -75
  243. data/test/cases/schema_dumper_test.rb +0 -211
  244. data/test/cases/schema_test_postgresql.rb +0 -178
  245. data/test/cases/serialization_test.rb +0 -47
  246. data/test/cases/sp_test_mysql.rb +0 -16
  247. data/test/cases/synonym_test_oracle.rb +0 -17
  248. data/test/cases/timestamp_test.rb +0 -75
  249. data/test/cases/transactions_test.rb +0 -543
  250. data/test/cases/unconnected_test.rb +0 -32
  251. data/test/cases/validations_i18n_test.rb +0 -925
  252. data/test/cases/validations_test.rb +0 -1684
  253. data/test/cases/xml_serialization_test.rb +0 -240
  254. data/test/cases/yaml_serialization_test.rb +0 -11
  255. data/test/config.rb +0 -5
  256. data/test/connections/jdbc_jdbcderby/connection.rb +0 -18
  257. data/test/connections/jdbc_jdbch2/connection.rb +0 -18
  258. data/test/connections/jdbc_jdbchsqldb/connection.rb +0 -18
  259. data/test/connections/jdbc_jdbcmysql/connection.rb +0 -26
  260. data/test/connections/jdbc_jdbcpostgresql/connection.rb +0 -26
  261. data/test/connections/jdbc_jdbcsqlite3/connection.rb +0 -25
  262. data/test/connections/native_db2/connection.rb +0 -25
  263. data/test/connections/native_firebird/connection.rb +0 -26
  264. data/test/connections/native_frontbase/connection.rb +0 -27
  265. data/test/connections/native_mysql/connection.rb +0 -25
  266. data/test/connections/native_openbase/connection.rb +0 -21
  267. data/test/connections/native_oracle/connection.rb +0 -27
  268. data/test/connections/native_postgresql/connection.rb +0 -21
  269. data/test/connections/native_sqlite/connection.rb +0 -25
  270. data/test/connections/native_sqlite3/connection.rb +0 -25
  271. data/test/connections/native_sqlite3/in_memory_connection.rb +0 -18
  272. data/test/connections/native_sybase/connection.rb +0 -23
  273. data/test/fixtures/accounts.yml +0 -29
  274. data/test/fixtures/all/developers.yml +0 -0
  275. data/test/fixtures/all/people.csv +0 -0
  276. data/test/fixtures/all/tasks.yml +0 -0
  277. data/test/fixtures/author_addresses.yml +0 -5
  278. data/test/fixtures/author_favorites.yml +0 -4
  279. data/test/fixtures/authors.yml +0 -9
  280. data/test/fixtures/binaries.yml +0 -132
  281. data/test/fixtures/books.yml +0 -7
  282. data/test/fixtures/categories/special_categories.yml +0 -9
  283. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +0 -4
  284. data/test/fixtures/categories.yml +0 -14
  285. data/test/fixtures/categories_ordered.yml +0 -7
  286. data/test/fixtures/categories_posts.yml +0 -23
  287. data/test/fixtures/categorizations.yml +0 -17
  288. data/test/fixtures/clubs.yml +0 -6
  289. data/test/fixtures/comments.yml +0 -59
  290. data/test/fixtures/companies.yml +0 -56
  291. data/test/fixtures/computers.yml +0 -4
  292. data/test/fixtures/courses.yml +0 -7
  293. data/test/fixtures/customers.yml +0 -26
  294. data/test/fixtures/developers.yml +0 -21
  295. data/test/fixtures/developers_projects.yml +0 -17
  296. data/test/fixtures/edges.yml +0 -6
  297. data/test/fixtures/entrants.yml +0 -14
  298. data/test/fixtures/faces.yml +0 -11
  299. data/test/fixtures/fk_test_has_fk.yml +0 -3
  300. data/test/fixtures/fk_test_has_pk.yml +0 -2
  301. data/test/fixtures/funny_jokes.yml +0 -10
  302. data/test/fixtures/interests.yml +0 -33
  303. data/test/fixtures/items.yml +0 -4
  304. data/test/fixtures/jobs.yml +0 -7
  305. data/test/fixtures/legacy_things.yml +0 -3
  306. data/test/fixtures/mateys.yml +0 -4
  307. data/test/fixtures/member_types.yml +0 -6
  308. data/test/fixtures/members.yml +0 -6
  309. data/test/fixtures/memberships.yml +0 -20
  310. data/test/fixtures/men.yml +0 -5
  311. data/test/fixtures/minimalistics.yml +0 -2
  312. data/test/fixtures/mixed_case_monkeys.yml +0 -6
  313. data/test/fixtures/mixins.yml +0 -29
  314. data/test/fixtures/movies.yml +0 -7
  315. data/test/fixtures/naked/csv/accounts.csv +0 -1
  316. data/test/fixtures/naked/yml/accounts.yml +0 -1
  317. data/test/fixtures/naked/yml/companies.yml +0 -1
  318. data/test/fixtures/naked/yml/courses.yml +0 -1
  319. data/test/fixtures/organizations.yml +0 -5
  320. data/test/fixtures/owners.yml +0 -7
  321. data/test/fixtures/parrots.yml +0 -27
  322. data/test/fixtures/parrots_pirates.yml +0 -7
  323. data/test/fixtures/people.yml +0 -15
  324. data/test/fixtures/pets.yml +0 -14
  325. data/test/fixtures/pirates.yml +0 -9
  326. data/test/fixtures/polymorphic_designs.yml +0 -19
  327. data/test/fixtures/polymorphic_prices.yml +0 -19
  328. data/test/fixtures/posts.yml +0 -52
  329. data/test/fixtures/price_estimates.yml +0 -7
  330. data/test/fixtures/projects.yml +0 -7
  331. data/test/fixtures/readers.yml +0 -9
  332. data/test/fixtures/references.yml +0 -17
  333. data/test/fixtures/reserved_words/distinct.yml +0 -5
  334. data/test/fixtures/reserved_words/distincts_selects.yml +0 -11
  335. data/test/fixtures/reserved_words/group.yml +0 -14
  336. data/test/fixtures/reserved_words/select.yml +0 -8
  337. data/test/fixtures/reserved_words/values.yml +0 -7
  338. data/test/fixtures/ships.yml +0 -5
  339. data/test/fixtures/sponsors.yml +0 -9
  340. data/test/fixtures/subscribers.yml +0 -7
  341. data/test/fixtures/subscriptions.yml +0 -12
  342. data/test/fixtures/taggings.yml +0 -28
  343. data/test/fixtures/tags.yml +0 -7
  344. data/test/fixtures/tasks.yml +0 -7
  345. data/test/fixtures/tees.yml +0 -4
  346. data/test/fixtures/ties.yml +0 -4
  347. data/test/fixtures/topics.yml +0 -42
  348. data/test/fixtures/toys.yml +0 -4
  349. data/test/fixtures/treasures.yml +0 -10
  350. data/test/fixtures/vertices.yml +0 -4
  351. data/test/fixtures/warehouse-things.yml +0 -3
  352. data/test/fixtures/zines.yml +0 -5
  353. data/test/migrations/broken/100_migration_that_raises_exception.rb +0 -10
  354. data/test/migrations/decimal/1_give_me_big_numbers.rb +0 -15
  355. data/test/migrations/duplicate/1_people_have_last_names.rb +0 -9
  356. data/test/migrations/duplicate/2_we_need_reminders.rb +0 -12
  357. data/test/migrations/duplicate/3_foo.rb +0 -7
  358. data/test/migrations/duplicate/3_innocent_jointable.rb +0 -12
  359. data/test/migrations/duplicate_names/20080507052938_chunky.rb +0 -7
  360. data/test/migrations/duplicate_names/20080507053028_chunky.rb +0 -7
  361. data/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +0 -12
  362. data/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +0 -9
  363. data/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +0 -12
  364. data/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +0 -9
  365. data/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +0 -8
  366. data/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +0 -12
  367. data/test/migrations/missing/1000_people_have_middle_names.rb +0 -9
  368. data/test/migrations/missing/1_people_have_last_names.rb +0 -9
  369. data/test/migrations/missing/3_we_need_reminders.rb +0 -12
  370. data/test/migrations/missing/4_innocent_jointable.rb +0 -12
  371. data/test/migrations/valid/1_people_have_last_names.rb +0 -9
  372. data/test/migrations/valid/2_we_need_reminders.rb +0 -12
  373. data/test/migrations/valid/3_innocent_jointable.rb +0 -12
  374. data/test/models/author.rb +0 -151
  375. data/test/models/auto_id.rb +0 -4
  376. data/test/models/binary.rb +0 -2
  377. data/test/models/bird.rb +0 -9
  378. data/test/models/book.rb +0 -4
  379. data/test/models/categorization.rb +0 -5
  380. data/test/models/category.rb +0 -34
  381. data/test/models/citation.rb +0 -6
  382. data/test/models/club.rb +0 -13
  383. data/test/models/column_name.rb +0 -3
  384. data/test/models/comment.rb +0 -29
  385. data/test/models/company.rb +0 -173
  386. data/test/models/company_in_module.rb +0 -78
  387. data/test/models/computer.rb +0 -3
  388. data/test/models/contact.rb +0 -16
  389. data/test/models/contract.rb +0 -5
  390. data/test/models/course.rb +0 -3
  391. data/test/models/customer.rb +0 -73
  392. data/test/models/default.rb +0 -2
  393. data/test/models/developer.rb +0 -101
  394. data/test/models/edge.rb +0 -5
  395. data/test/models/entrant.rb +0 -3
  396. data/test/models/essay.rb +0 -3
  397. data/test/models/event.rb +0 -3
  398. data/test/models/event_author.rb +0 -8
  399. data/test/models/face.rb +0 -7
  400. data/test/models/guid.rb +0 -2
  401. data/test/models/interest.rb +0 -5
  402. data/test/models/invoice.rb +0 -4
  403. data/test/models/item.rb +0 -7
  404. data/test/models/job.rb +0 -5
  405. data/test/models/joke.rb +0 -3
  406. data/test/models/keyboard.rb +0 -3
  407. data/test/models/legacy_thing.rb +0 -3
  408. data/test/models/line_item.rb +0 -3
  409. data/test/models/man.rb +0 -9
  410. data/test/models/matey.rb +0 -4
  411. data/test/models/member.rb +0 -12
  412. data/test/models/member_detail.rb +0 -5
  413. data/test/models/member_type.rb +0 -3
  414. data/test/models/membership.rb +0 -9
  415. data/test/models/minimalistic.rb +0 -2
  416. data/test/models/mixed_case_monkey.rb +0 -3
  417. data/test/models/movie.rb +0 -5
  418. data/test/models/order.rb +0 -4
  419. data/test/models/organization.rb +0 -6
  420. data/test/models/owner.rb +0 -5
  421. data/test/models/parrot.rb +0 -22
  422. data/test/models/person.rb +0 -16
  423. data/test/models/pet.rb +0 -5
  424. data/test/models/pirate.rb +0 -80
  425. data/test/models/polymorphic_design.rb +0 -3
  426. data/test/models/polymorphic_price.rb +0 -3
  427. data/test/models/post.rb +0 -102
  428. data/test/models/price_estimate.rb +0 -3
  429. data/test/models/project.rb +0 -30
  430. data/test/models/reader.rb +0 -4
  431. data/test/models/reference.rb +0 -4
  432. data/test/models/reply.rb +0 -46
  433. data/test/models/ship.rb +0 -19
  434. data/test/models/ship_part.rb +0 -7
  435. data/test/models/sponsor.rb +0 -4
  436. data/test/models/subject.rb +0 -4
  437. data/test/models/subscriber.rb +0 -8
  438. data/test/models/subscription.rb +0 -4
  439. data/test/models/tag.rb +0 -7
  440. data/test/models/tagging.rb +0 -10
  441. data/test/models/task.rb +0 -3
  442. data/test/models/tee.rb +0 -4
  443. data/test/models/tie.rb +0 -4
  444. data/test/models/topic.rb +0 -80
  445. data/test/models/toy.rb +0 -6
  446. data/test/models/treasure.rb +0 -8
  447. data/test/models/vertex.rb +0 -9
  448. data/test/models/warehouse_thing.rb +0 -5
  449. data/test/models/zine.rb +0 -3
  450. data/test/schema/mysql_specific_schema.rb +0 -31
  451. data/test/schema/postgresql_specific_schema.rb +0 -114
  452. data/test/schema/schema.rb +0 -550
  453. data/test/schema/schema2.rb +0 -6
  454. data/test/schema/sqlite_specific_schema.rb +0 -25
@@ -1,438 +0,0 @@
1
- require "cases/helper"
2
- require 'models/developer'
3
- require 'models/project'
4
- require 'models/company'
5
- require 'models/topic'
6
- require 'models/reply'
7
- require 'models/computer'
8
- require 'models/customer'
9
- require 'models/order'
10
- require 'models/post'
11
- require 'models/author'
12
- require 'models/tag'
13
- require 'models/tagging'
14
- require 'models/comment'
15
- require 'models/sponsor'
16
- require 'models/member'
17
- require 'models/essay'
18
-
19
- class BelongsToAssociationsTest < ActiveRecord::TestCase
20
- fixtures :accounts, :companies, :developers, :projects, :topics,
21
- :developers_projects, :computers, :authors, :posts, :tags, :taggings, :comments
22
-
23
- def test_belongs_to
24
- Client.find(3).firm.name
25
- assert_equal companies(:first_firm).name, Client.find(3).firm.name
26
- assert !Client.find(3).firm.nil?, "Microsoft should have a firm"
27
- end
28
-
29
- def test_belongs_to_with_primary_key
30
- client = Client.create(:name => "Primary key client", :firm_name => companies(:first_firm).name)
31
- assert_equal companies(:first_firm).name, client.firm_with_primary_key.name
32
- end
33
-
34
- def test_belongs_to_with_primary_key_joins_on_correct_column
35
- sql = Client.send(:construct_finder_sql, :joins => :firm_with_primary_key)
36
- assert sql !~ /\.id/
37
- assert sql =~ /\.name/
38
- end
39
-
40
- def test_proxy_assignment
41
- account = Account.find(1)
42
- assert_nothing_raised { account.firm = account.firm }
43
- end
44
-
45
- def test_triple_equality
46
- assert Client.find(3).firm === Firm
47
- assert Firm === Client.find(3).firm
48
- end
49
-
50
- def test_type_mismatch
51
- assert_raise(ActiveRecord::AssociationTypeMismatch) { Account.find(1).firm = 1 }
52
- assert_raise(ActiveRecord::AssociationTypeMismatch) { Account.find(1).firm = Project.find(1) }
53
- end
54
-
55
- def test_natural_assignment
56
- apple = Firm.create("name" => "Apple")
57
- citibank = Account.create("credit_limit" => 10)
58
- citibank.firm = apple
59
- assert_equal apple.id, citibank.firm_id
60
- end
61
-
62
- def test_natural_assignment_with_primary_key
63
- apple = Firm.create("name" => "Apple")
64
- citibank = Client.create("name" => "Primary key client")
65
- citibank.firm_with_primary_key = apple
66
- assert_equal apple.name, citibank.firm_name
67
- end
68
-
69
- def test_eager_loading_with_primary_key
70
- apple = Firm.create("name" => "Apple")
71
- citibank = Client.create("name" => "Citibank", :firm_name => "Apple")
72
- citibank_result = Client.find(:first, :conditions => {:name => "Citibank"}, :include => :firm_with_primary_key)
73
- assert_not_nil citibank_result.instance_variable_get("@firm_with_primary_key")
74
- end
75
-
76
- def test_no_unexpected_aliasing
77
- first_firm = companies(:first_firm)
78
- another_firm = companies(:another_firm)
79
-
80
- citibank = Account.create("credit_limit" => 10)
81
- citibank.firm = first_firm
82
- original_proxy = citibank.firm
83
- citibank.firm = another_firm
84
-
85
- assert_equal first_firm.object_id, original_proxy.target.object_id
86
- assert_equal another_firm.object_id, citibank.firm.target.object_id
87
- end
88
-
89
- def test_creating_the_belonging_object
90
- citibank = Account.create("credit_limit" => 10)
91
- apple = citibank.create_firm("name" => "Apple")
92
- assert_equal apple, citibank.firm
93
- citibank.save
94
- citibank.reload
95
- assert_equal apple, citibank.firm
96
- end
97
-
98
- def test_creating_the_belonging_object_with_primary_key
99
- client = Client.create(:name => "Primary key client")
100
- apple = client.create_firm_with_primary_key("name" => "Apple")
101
- assert_equal apple, client.firm_with_primary_key
102
- client.save
103
- client.reload
104
- assert_equal apple, client.firm_with_primary_key
105
- end
106
-
107
- def test_building_the_belonging_object
108
- citibank = Account.create("credit_limit" => 10)
109
- apple = citibank.build_firm("name" => "Apple")
110
- citibank.save
111
- assert_equal apple.id, citibank.firm_id
112
- end
113
-
114
- def test_building_the_belonging_object_with_primary_key
115
- client = Client.create(:name => "Primary key client")
116
- apple = client.build_firm_with_primary_key("name" => "Apple")
117
- client.save
118
- assert_equal apple.name, client.firm_name
119
- end
120
-
121
- def test_natural_assignment_to_nil
122
- client = Client.find(3)
123
- client.firm = nil
124
- client.save
125
- assert_nil client.firm(true)
126
- assert_nil client.client_of
127
- end
128
-
129
- def test_natural_assignment_to_nil_with_primary_key
130
- client = Client.create(:name => "Primary key client", :firm_name => companies(:first_firm).name)
131
- client.firm_with_primary_key = nil
132
- client.save
133
- assert_nil client.firm_with_primary_key(true)
134
- assert_nil client.client_of
135
- end
136
-
137
- def test_with_different_class_name
138
- assert_equal Company.find(1).name, Company.find(3).firm_with_other_name.name
139
- assert_not_nil Company.find(3).firm_with_other_name, "Microsoft should have a firm"
140
- end
141
-
142
- def test_with_condition
143
- assert_equal Company.find(1).name, Company.find(3).firm_with_condition.name
144
- assert_not_nil Company.find(3).firm_with_condition, "Microsoft should have a firm"
145
- end
146
-
147
- def test_with_select
148
- assert_equal Company.find(2).firm_with_select.attributes.size, 1
149
- assert_equal Company.find(2, :include => :firm_with_select ).firm_with_select.attributes.size, 1
150
- end
151
-
152
- def test_belongs_to_counter
153
- debate = Topic.create("title" => "debate")
154
- assert_equal 0, debate.send(:read_attribute, "replies_count"), "No replies yet"
155
-
156
- trash = debate.replies.create("title" => "blah!", "content" => "world around!")
157
- assert_equal 1, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply created"
158
-
159
- trash.destroy
160
- assert_equal 0, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply deleted"
161
- end
162
-
163
- def test_belongs_to_with_primary_key_counter
164
- debate = Topic.create("title" => "debate")
165
- assert_equal 0, debate.send(:read_attribute, "replies_count"), "No replies yet"
166
-
167
- trash = debate.replies_with_primary_key.create("title" => "blah!", "content" => "world around!")
168
- assert_equal 1, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply created"
169
-
170
- trash.destroy
171
- assert_equal 0, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply deleted"
172
- end
173
-
174
- def test_belongs_to_counter_with_assigning_nil
175
- p = Post.find(1)
176
- c = Comment.find(1)
177
-
178
- assert_equal p.id, c.post_id
179
- assert_equal 2, Post.find(p.id).comments.size
180
-
181
- c.post = nil
182
-
183
- assert_equal 1, Post.find(p.id).comments.size
184
- end
185
-
186
- def test_belongs_to_with_primary_key_counter_with_assigning_nil
187
- debate = Topic.create("title" => "debate")
188
- reply = Reply.create("title" => "blah!", "content" => "world around!", "parent_title" => "debate")
189
-
190
- assert_equal debate.title, reply.parent_title
191
- assert_equal 1, Topic.find(debate.id).send(:read_attribute, "replies_count")
192
-
193
- reply.topic_with_primary_key = nil
194
-
195
- assert_equal 0, Topic.find(debate.id).send(:read_attribute, "replies_count")
196
- end
197
-
198
- def test_belongs_to_counter_with_reassigning
199
- t1 = Topic.create("title" => "t1")
200
- t2 = Topic.create("title" => "t2")
201
- r1 = Reply.new("title" => "r1", "content" => "r1")
202
- r1.topic = t1
203
-
204
- assert r1.save
205
- assert_equal 1, Topic.find(t1.id).replies.size
206
- assert_equal 0, Topic.find(t2.id).replies.size
207
-
208
- r1.topic = Topic.find(t2.id)
209
-
210
- assert r1.save
211
- assert_equal 0, Topic.find(t1.id).replies.size
212
- assert_equal 1, Topic.find(t2.id).replies.size
213
-
214
- r1.topic = nil
215
-
216
- assert_equal 0, Topic.find(t1.id).replies.size
217
- assert_equal 0, Topic.find(t2.id).replies.size
218
-
219
- r1.topic = t1
220
-
221
- assert_equal 1, Topic.find(t1.id).replies.size
222
- assert_equal 0, Topic.find(t2.id).replies.size
223
-
224
- r1.destroy
225
-
226
- assert_equal 0, Topic.find(t1.id).replies.size
227
- assert_equal 0, Topic.find(t2.id).replies.size
228
- end
229
-
230
- def test_belongs_to_reassign_with_namespaced_models_and_counters
231
- t1 = Web::Topic.create("title" => "t1")
232
- t2 = Web::Topic.create("title" => "t2")
233
- r1 = Web::Reply.new("title" => "r1", "content" => "r1")
234
- r1.topic = t1
235
-
236
- assert r1.save
237
- assert_equal 1, Web::Topic.find(t1.id).replies.size
238
- assert_equal 0, Web::Topic.find(t2.id).replies.size
239
-
240
- r1.topic = Web::Topic.find(t2.id)
241
-
242
- assert r1.save
243
- assert_equal 0, Web::Topic.find(t1.id).replies.size
244
- assert_equal 1, Web::Topic.find(t2.id).replies.size
245
- end
246
-
247
- def test_belongs_to_counter_after_save
248
- topic = Topic.create!(:title => "monday night")
249
- topic.replies.create!(:title => "re: monday night", :content => "football")
250
- assert_equal 1, Topic.find(topic.id)[:replies_count]
251
-
252
- topic.save!
253
- assert_equal 1, Topic.find(topic.id)[:replies_count]
254
- end
255
-
256
- def test_belongs_to_counter_after_update_attributes
257
- topic = Topic.create!(:title => "37s")
258
- topic.replies.create!(:title => "re: 37s", :content => "rails")
259
- assert_equal 1, Topic.find(topic.id)[:replies_count]
260
-
261
- topic.update_attributes(:title => "37signals")
262
- assert_equal 1, Topic.find(topic.id)[:replies_count]
263
- end
264
-
265
- def test_assignment_before_child_saved
266
- final_cut = Client.new("name" => "Final Cut")
267
- firm = Firm.find(1)
268
- final_cut.firm = firm
269
- assert final_cut.new_record?
270
- assert final_cut.save
271
- assert !final_cut.new_record?
272
- assert !firm.new_record?
273
- assert_equal firm, final_cut.firm
274
- assert_equal firm, final_cut.firm(true)
275
- end
276
-
277
- def test_assignment_before_child_saved_with_primary_key
278
- final_cut = Client.new("name" => "Final Cut")
279
- firm = Firm.find(1)
280
- final_cut.firm_with_primary_key = firm
281
- assert final_cut.new_record?
282
- assert final_cut.save
283
- assert !final_cut.new_record?
284
- assert !firm.new_record?
285
- assert_equal firm, final_cut.firm_with_primary_key
286
- assert_equal firm, final_cut.firm_with_primary_key(true)
287
- end
288
-
289
- def test_new_record_with_foreign_key_but_no_object
290
- c = Client.new("firm_id" => 1)
291
- assert_equal Firm.find(:first), c.firm_with_basic_id
292
- end
293
-
294
- def test_forgetting_the_load_when_foreign_key_enters_late
295
- c = Client.new
296
- assert_nil c.firm_with_basic_id
297
-
298
- c.firm_id = 1
299
- assert_equal Firm.find(:first), c.firm_with_basic_id
300
- end
301
-
302
- def test_field_name_same_as_foreign_key
303
- computer = Computer.find(1)
304
- assert_not_nil computer.developer, ":foreign key == attribute didn't lock up" # '
305
- end
306
-
307
- def test_counter_cache
308
- topic = Topic.create :title => "Zoom-zoom-zoom"
309
- assert_equal 0, topic[:replies_count]
310
-
311
- reply = Reply.create(:title => "re: zoom", :content => "speedy quick!")
312
- reply.topic = topic
313
-
314
- assert_equal 1, topic.reload[:replies_count]
315
- assert_equal 1, topic.replies.size
316
-
317
- topic[:replies_count] = 15
318
- assert_equal 15, topic.replies.size
319
- end
320
-
321
- def test_custom_counter_cache
322
- reply = Reply.create(:title => "re: zoom", :content => "speedy quick!")
323
- assert_equal 0, reply[:replies_count]
324
-
325
- silly = SillyReply.create(:title => "gaga", :content => "boo-boo")
326
- silly.reply = reply
327
-
328
- assert_equal 1, reply.reload[:replies_count]
329
- assert_equal 1, reply.replies.size
330
-
331
- reply[:replies_count] = 17
332
- assert_equal 17, reply.replies.size
333
- end
334
-
335
- def test_association_assignment_sticks
336
- post = Post.find(:first)
337
-
338
- author1, author2 = Author.find(:all, :limit => 2)
339
- assert_not_nil author1
340
- assert_not_nil author2
341
-
342
- # make sure the association is loaded
343
- post.author
344
-
345
- # set the association by id, directly
346
- post.author_id = author2.id
347
-
348
- # save and reload
349
- post.save!
350
- post.reload
351
-
352
- # the author id of the post should be the id we set
353
- assert_equal post.author_id, author2.id
354
- end
355
-
356
- def test_cant_save_readonly_association
357
- assert_raise(ActiveRecord::ReadOnlyRecord) { companies(:first_client).readonly_firm.save! }
358
- assert companies(:first_client).readonly_firm.readonly?
359
- end
360
-
361
- def test_polymorphic_assignment_foreign_type_field_updating
362
- # should update when assigning a saved record
363
- sponsor = Sponsor.new
364
- member = Member.create
365
- sponsor.sponsorable = member
366
- assert_equal "Member", sponsor.sponsorable_type
367
-
368
- # should update when assigning a new record
369
- sponsor = Sponsor.new
370
- member = Member.new
371
- sponsor.sponsorable = member
372
- assert_equal "Member", sponsor.sponsorable_type
373
- end
374
-
375
- def test_polymorphic_assignment_with_primary_key_foreign_type_field_updating
376
- # should update when assigning a saved record
377
- essay = Essay.new
378
- writer = Author.create(:name => "David")
379
- essay.writer = writer
380
- assert_equal "Author", essay.writer_type
381
-
382
- # should update when assigning a new record
383
- essay = Essay.new
384
- writer = Author.new
385
- essay.writer = writer
386
- assert_equal "Author", essay.writer_type
387
- end
388
-
389
- def test_polymorphic_assignment_updates_foreign_id_field_for_new_and_saved_records
390
- sponsor = Sponsor.new
391
- saved_member = Member.create
392
- new_member = Member.new
393
-
394
- sponsor.sponsorable = saved_member
395
- assert_equal saved_member.id, sponsor.sponsorable_id
396
-
397
- sponsor.sponsorable = new_member
398
- assert_equal nil, sponsor.sponsorable_id
399
- end
400
-
401
- def test_polymorphic_assignment_with_primary_key_updates_foreign_id_field_for_new_and_saved_records
402
- essay = Essay.new
403
- saved_writer = Author.create(:name => "David")
404
- new_writer = Author.new
405
-
406
- essay.writer = saved_writer
407
- assert_equal saved_writer.name, essay.writer_id
408
-
409
- essay.writer = new_writer
410
- assert_equal nil, essay.writer_id
411
- end
412
-
413
- def test_belongs_to_proxy_should_not_respond_to_private_methods
414
- assert_raise(NoMethodError) { companies(:first_firm).private_method }
415
- assert_raise(NoMethodError) { companies(:second_client).firm.private_method }
416
- end
417
-
418
- def test_belongs_to_proxy_should_respond_to_private_methods_via_send
419
- companies(:first_firm).send(:private_method)
420
- companies(:second_client).firm.send(:private_method)
421
- end
422
-
423
- def test_save_of_record_with_loaded_belongs_to
424
- @account = companies(:first_firm).account
425
-
426
- assert_nothing_raised do
427
- Account.find(@account.id).save!
428
- Account.find(@account.id, :include => :firm).save!
429
- end
430
-
431
- @account.firm.delete
432
-
433
- assert_nothing_raised do
434
- Account.find(@account.id).save!
435
- Account.find(@account.id, :include => :firm).save!
436
- end
437
- end
438
- end
@@ -1,161 +0,0 @@
1
- require "cases/helper"
2
- require 'models/post'
3
- require 'models/comment'
4
- require 'models/author'
5
- require 'models/category'
6
- require 'models/project'
7
- require 'models/developer'
8
-
9
- class AssociationCallbacksTest < ActiveRecord::TestCase
10
- fixtures :posts, :authors, :projects, :developers
11
-
12
- def setup
13
- @david = authors(:david)
14
- @thinking = posts(:thinking)
15
- @authorless = posts(:authorless)
16
- assert @david.post_log.empty?
17
- end
18
-
19
- def test_adding_macro_callbacks
20
- @david.posts_with_callbacks << @thinking
21
- assert_equal ["before_adding#{@thinking.id}", "after_adding#{@thinking.id}"], @david.post_log
22
- @david.posts_with_callbacks << @thinking
23
- assert_equal ["before_adding#{@thinking.id}", "after_adding#{@thinking.id}", "before_adding#{@thinking.id}",
24
- "after_adding#{@thinking.id}"], @david.post_log
25
- end
26
-
27
- def test_adding_with_proc_callbacks
28
- @david.posts_with_proc_callbacks << @thinking
29
- assert_equal ["before_adding#{@thinking.id}", "after_adding#{@thinking.id}"], @david.post_log
30
- @david.posts_with_proc_callbacks << @thinking
31
- assert_equal ["before_adding#{@thinking.id}", "after_adding#{@thinking.id}", "before_adding#{@thinking.id}",
32
- "after_adding#{@thinking.id}"], @david.post_log
33
- end
34
-
35
- def test_removing_with_macro_callbacks
36
- first_post, second_post = @david.posts_with_callbacks[0, 2]
37
- @david.posts_with_callbacks.delete(first_post)
38
- assert_equal ["before_removing#{first_post.id}", "after_removing#{first_post.id}"], @david.post_log
39
- @david.posts_with_callbacks.delete(second_post)
40
- assert_equal ["before_removing#{first_post.id}", "after_removing#{first_post.id}", "before_removing#{second_post.id}",
41
- "after_removing#{second_post.id}"], @david.post_log
42
- end
43
-
44
- def test_removing_with_proc_callbacks
45
- first_post, second_post = @david.posts_with_callbacks[0, 2]
46
- @david.posts_with_proc_callbacks.delete(first_post)
47
- assert_equal ["before_removing#{first_post.id}", "after_removing#{first_post.id}"], @david.post_log
48
- @david.posts_with_proc_callbacks.delete(second_post)
49
- assert_equal ["before_removing#{first_post.id}", "after_removing#{first_post.id}", "before_removing#{second_post.id}",
50
- "after_removing#{second_post.id}"], @david.post_log
51
- end
52
-
53
- def test_multiple_callbacks
54
- @david.posts_with_multiple_callbacks << @thinking
55
- assert_equal ["before_adding#{@thinking.id}", "before_adding_proc#{@thinking.id}", "after_adding#{@thinking.id}",
56
- "after_adding_proc#{@thinking.id}"], @david.post_log
57
- @david.posts_with_multiple_callbacks << @thinking
58
- assert_equal ["before_adding#{@thinking.id}", "before_adding_proc#{@thinking.id}", "after_adding#{@thinking.id}",
59
- "after_adding_proc#{@thinking.id}", "before_adding#{@thinking.id}", "before_adding_proc#{@thinking.id}",
60
- "after_adding#{@thinking.id}", "after_adding_proc#{@thinking.id}"], @david.post_log
61
- end
62
-
63
- def test_has_many_callbacks_with_create
64
- morten = Author.create :name => "Morten"
65
- post = morten.posts_with_proc_callbacks.create! :title => "Hello", :body => "How are you doing?"
66
- assert_equal ["before_adding<new>", "after_adding#{post.id}"], morten.post_log
67
- end
68
-
69
- def test_has_many_callbacks_with_create!
70
- morten = Author.create! :name => "Morten"
71
- post = morten.posts_with_proc_callbacks.create :title => "Hello", :body => "How are you doing?"
72
- assert_equal ["before_adding<new>", "after_adding#{post.id}"], morten.post_log
73
- end
74
-
75
- def test_has_many_callbacks_for_save_on_parent
76
- jack = Author.new :name => "Jack"
77
- post = jack.posts_with_callbacks.build :title => "Call me back!", :body => "Before you wake up and after you sleep"
78
-
79
- callback_log = ["before_adding<new>", "after_adding#{jack.posts_with_callbacks.first.id}"]
80
- assert_equal callback_log, jack.post_log
81
- assert jack.save
82
- assert_equal 1, jack.posts_with_callbacks.count
83
- assert_equal callback_log, jack.post_log
84
- end
85
-
86
- def test_has_and_belongs_to_many_add_callback
87
- david = developers(:david)
88
- ar = projects(:active_record)
89
- assert ar.developers_log.empty?
90
- ar.developers_with_callbacks << david
91
- assert_equal ["before_adding#{david.id}", "after_adding#{david.id}"], ar.developers_log
92
- ar.developers_with_callbacks << david
93
- assert_equal ["before_adding#{david.id}", "after_adding#{david.id}", "before_adding#{david.id}",
94
- "after_adding#{david.id}"], ar.developers_log
95
- end
96
-
97
- def test_has_and_belongs_to_many_after_add_called_after_save
98
- ar = projects(:active_record)
99
- assert ar.developers_log.empty?
100
- alice = Developer.new(:name => 'alice')
101
- ar.developers_with_callbacks << alice
102
- assert_equal"after_adding#{alice.id}", ar.developers_log.last
103
-
104
- bob = ar.developers_with_callbacks.create(:name => 'bob')
105
- assert_equal "after_adding#{bob.id}", ar.developers_log.last
106
-
107
- ar.developers_with_callbacks.build(:name => 'charlie')
108
- assert_equal "after_adding<new>", ar.developers_log.last
109
- end
110
-
111
-
112
- def test_has_and_belongs_to_many_remove_callback
113
- david = developers(:david)
114
- jamis = developers(:jamis)
115
- activerecord = projects(:active_record)
116
- assert activerecord.developers_log.empty?
117
- activerecord.developers_with_callbacks.delete(david)
118
- assert_equal ["before_removing#{david.id}", "after_removing#{david.id}"], activerecord.developers_log
119
-
120
- activerecord.developers_with_callbacks.delete(jamis)
121
- assert_equal ["before_removing#{david.id}", "after_removing#{david.id}", "before_removing#{jamis.id}",
122
- "after_removing#{jamis.id}"], activerecord.developers_log
123
- end
124
-
125
- def test_has_and_belongs_to_many_remove_callback_on_clear
126
- activerecord = projects(:active_record)
127
- assert activerecord.developers_log.empty?
128
- if activerecord.developers_with_callbacks.size == 0
129
- activerecord.developers << developers(:david)
130
- activerecord.developers << developers(:jamis)
131
- activerecord.reload
132
- assert activerecord.developers_with_callbacks.size == 2
133
- end
134
- log_array = activerecord.developers_with_callbacks.collect {|d| ["before_removing#{d.id}","after_removing#{d.id}"]}.flatten.sort
135
- assert activerecord.developers_with_callbacks.clear
136
- assert_equal log_array, activerecord.developers_log.sort
137
- end
138
-
139
- def test_has_many_and_belongs_to_many_callbacks_for_save_on_parent
140
- project = Project.new :name => "Callbacks"
141
- project.developers_with_callbacks.build :name => "Jack", :salary => 95000
142
-
143
- callback_log = ["before_adding<new>", "after_adding<new>"]
144
- assert_equal callback_log, project.developers_log
145
- assert project.save
146
- assert_equal 1, project.developers_with_callbacks.size
147
- assert_equal callback_log, project.developers_log
148
- end
149
-
150
- def test_dont_add_if_before_callback_raises_exception
151
- assert !@david.unchangable_posts.include?(@authorless)
152
- begin
153
- @david.unchangable_posts << @authorless
154
- rescue Exception => e
155
- end
156
- assert @david.post_log.empty?
157
- assert !@david.unchangable_posts.include?(@authorless)
158
- @david.reload
159
- assert !@david.unchangable_posts.include?(@authorless)
160
- end
161
- end