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,81 +0,0 @@
1
- require 'cases/helper'
2
- require 'models/post'
3
-
4
- class EachTest < ActiveRecord::TestCase
5
- fixtures :posts
6
-
7
- def setup
8
- @posts = Post.all(:order => "id asc")
9
- @total = Post.count
10
- end
11
-
12
- def test_each_should_excecute_one_query_per_batch
13
- assert_queries(Post.count + 1) do
14
- Post.find_each(:batch_size => 1) do |post|
15
- assert_kind_of Post, post
16
- end
17
- end
18
- end
19
-
20
- def test_each_should_raise_if_the_order_is_set
21
- assert_raise(RuntimeError) do
22
- Post.find_each(:order => "title") { |post| post }
23
- end
24
- end
25
-
26
- def test_each_should_raise_if_the_limit_is_set
27
- assert_raise(RuntimeError) do
28
- Post.find_each(:limit => 1) { |post| post }
29
- end
30
- end
31
-
32
- def test_find_in_batches_should_return_batches
33
- assert_queries(Post.count + 1) do
34
- Post.find_in_batches(:batch_size => 1) do |batch|
35
- assert_kind_of Array, batch
36
- assert_kind_of Post, batch.first
37
- end
38
- end
39
- end
40
-
41
- def test_find_in_batches_should_start_from_the_start_option
42
- assert_queries(Post.count) do
43
- Post.find_in_batches(:batch_size => 1, :start => 2) do |batch|
44
- assert_kind_of Array, batch
45
- assert_kind_of Post, batch.first
46
- end
47
- end
48
- end
49
-
50
- def test_find_in_batches_shouldnt_excute_query_unless_needed
51
- post_count = Post.count
52
-
53
- assert_queries(2) do
54
- Post.find_in_batches(:batch_size => post_count) {|batch| assert_kind_of Array, batch }
55
- end
56
-
57
- assert_queries(1) do
58
- Post.find_in_batches(:batch_size => post_count + 1) {|batch| assert_kind_of Array, batch }
59
- end
60
- end
61
-
62
- def test_find_in_batches_doesnt_clog_conditions
63
- Post.find_in_batches(:conditions => {:id => posts(:welcome).id}) do
64
- assert_nothing_raised { Post.find(posts(:thinking).id) }
65
- end
66
- end
67
-
68
- def test_each_should_raise_if_select_is_set_without_id
69
- assert_raise(RuntimeError) do
70
- Post.find_each(:select => :title, :batch_size => 1) { |post| post }
71
- end
72
- end
73
-
74
- def test_each_should_execute_if_id_is_in_select
75
- assert_queries(4) do
76
- Post.find_each(:select => "id, title, type", :batch_size => 2) do |post|
77
- assert_kind_of Post, post
78
- end
79
- end
80
- end
81
- end
@@ -1,30 +0,0 @@
1
- require "cases/helper"
2
-
3
- # Without using prepared statements, it makes no sense to test
4
- # BLOB data with DB2 or Firebird, because the length of a statement
5
- # is limited to 32KB.
6
- unless current_adapter?(:SybaseAdapter, :DB2Adapter, :FirebirdAdapter)
7
- require 'models/binary'
8
-
9
- class BinaryTest < ActiveRecord::TestCase
10
- FIXTURES = %w(flowers.jpg example.log)
11
-
12
- def test_load_save
13
- Binary.delete_all
14
-
15
- FIXTURES.each do |filename|
16
- data = File.read(ASSETS_ROOT + "/#{filename}")
17
- data.force_encoding('ASCII-8BIT') if data.respond_to?(:force_encoding)
18
- data.freeze
19
-
20
- bin = Binary.new(:data => data)
21
- assert_equal data, bin.data, 'Newly assigned data differs from original'
22
-
23
- bin.save!
24
- assert_equal data, bin.data, 'Data differs from original after save'
25
-
26
- assert_equal data, bin.reload.data, 'Reloaded data differs from original'
27
- end
28
- end
29
- end
30
- end
@@ -1,360 +0,0 @@
1
- require "cases/helper"
2
- require 'models/company'
3
- require 'models/topic'
4
- require 'models/edge'
5
- require 'models/owner'
6
- require 'models/pet'
7
- require 'models/toy'
8
- require 'models/club'
9
- require 'models/organization'
10
-
11
- Company.has_many :accounts
12
-
13
- class NumericData < ActiveRecord::Base
14
- self.table_name = 'numeric_data'
15
- end
16
-
17
- class CalculationsTest < ActiveRecord::TestCase
18
- fixtures :companies, :accounts, :topics, :owners, :pets, :toys
19
-
20
- def test_should_sum_field
21
- assert_equal 318, Account.sum(:credit_limit)
22
- end
23
-
24
- def test_should_average_field
25
- value = Account.average(:credit_limit)
26
- assert_equal 53.0, value
27
- end
28
-
29
- def test_should_return_nil_as_average
30
- assert_nil NumericData.average(:bank_balance)
31
- end
32
-
33
- def test_type_cast_calculated_value_should_convert_db_averages_of_fixnum_class_to_decimal
34
- assert_equal 0, NumericData.send(:type_cast_calculated_value, 0, nil, 'avg')
35
- assert_equal 53.0, NumericData.send(:type_cast_calculated_value, 53, nil, 'avg')
36
- end
37
-
38
- def test_should_get_maximum_of_field
39
- assert_equal 60, Account.maximum(:credit_limit)
40
- end
41
-
42
- def test_should_get_maximum_of_field_with_include
43
- assert_equal 50, Account.maximum(:credit_limit, :include => :firm, :conditions => "companies.name != 'Summit'")
44
- end
45
-
46
- def test_should_get_maximum_of_field_with_scoped_include
47
- Account.with_scope :find => { :include => :firm, :conditions => "companies.name != 'Summit'" } do
48
- assert_equal 50, Account.maximum(:credit_limit)
49
- end
50
- end
51
-
52
- def test_should_get_minimum_of_field
53
- assert_equal 50, Account.minimum(:credit_limit)
54
- end
55
-
56
- def test_should_group_by_field
57
- c = Account.sum(:credit_limit, :group => :firm_id)
58
- [1,6,2].each { |firm_id| assert c.keys.include?(firm_id) }
59
- end
60
-
61
- def test_should_group_by_multiple_fields
62
- c = Account.count(:all, :group => ['firm_id', :credit_limit])
63
- [ [nil, 50], [1, 50], [6, 50], [6, 55], [9, 53], [2, 60] ].each { |firm_and_limit| assert c.keys.include?(firm_and_limit) }
64
- end
65
-
66
- def test_should_group_by_multiple_fields_having_functions
67
- c = Topic.count(:all, :group => [:author_name, 'COALESCE(type, title)'])
68
- assert_equal 1, c[["Nick", "The Third Topic of the day"]]
69
- assert_equal 1, c[["Mary", "Reply"]]
70
- assert_equal 1, c[["David", "The First Topic"]]
71
- assert_equal 1, c[["Carl", "Reply"]]
72
- end
73
-
74
- def test_should_group_by_summed_field
75
- c = Account.sum(:credit_limit, :group => :firm_id)
76
- assert_equal 50, c[1]
77
- assert_equal 105, c[6]
78
- assert_equal 60, c[2]
79
- end
80
-
81
- def test_should_order_by_grouped_field
82
- c = Account.sum(:credit_limit, :group => :firm_id, :order => "firm_id")
83
- assert_equal [1, 2, 6, 9], c.keys.compact
84
- end
85
-
86
- def test_should_order_by_calculation
87
- c = Account.sum(:credit_limit, :group => :firm_id, :order => "sum_credit_limit desc, firm_id")
88
- assert_equal [105, 60, 53, 50, 50], c.keys.collect { |k| c[k] }
89
- assert_equal [6, 2, 9, 1], c.keys.compact
90
- end
91
-
92
- def test_should_limit_calculation
93
- c = Account.sum(:credit_limit, :conditions => "firm_id IS NOT NULL",
94
- :group => :firm_id, :order => "firm_id", :limit => 2)
95
- assert_equal [1, 2], c.keys.compact
96
- end
97
-
98
- def test_should_limit_calculation_with_offset
99
- c = Account.sum(:credit_limit, :conditions => "firm_id IS NOT NULL",
100
- :group => :firm_id, :order => "firm_id", :limit => 2, :offset => 1)
101
- assert_equal [2, 6], c.keys.compact
102
- end
103
-
104
- def test_should_group_by_summed_field_having_condition
105
- c = Account.sum(:credit_limit, :group => :firm_id,
106
- :having => 'sum(credit_limit) > 50')
107
- assert_nil c[1]
108
- assert_equal 105, c[6]
109
- assert_equal 60, c[2]
110
- end
111
-
112
- def test_should_group_by_summed_field_having_sanitized_condition
113
- c = Account.sum(:credit_limit, :group => :firm_id,
114
- :having => ['sum(credit_limit) > ?', 50])
115
- assert_nil c[1]
116
- assert_equal 105, c[6]
117
- assert_equal 60, c[2]
118
- end
119
-
120
- def test_should_group_by_summed_association
121
- c = Account.sum(:credit_limit, :group => :firm)
122
- assert_equal 50, c[companies(:first_firm)]
123
- assert_equal 105, c[companies(:rails_core)]
124
- assert_equal 60, c[companies(:first_client)]
125
- end
126
-
127
- def test_should_sum_field_with_conditions
128
- assert_equal 105, Account.sum(:credit_limit, :conditions => 'firm_id = 6')
129
- end
130
-
131
- def test_should_return_zero_if_sum_conditions_return_nothing
132
- assert_equal 0, Account.sum(:credit_limit, :conditions => '1 = 2')
133
- assert_equal 0, companies(:rails_core).companies.sum(:id, :conditions => '1 = 2')
134
- end
135
-
136
- def test_sum_should_return_valid_values_for_decimals
137
- NumericData.create(:bank_balance => 19.83)
138
- assert_equal 19.83, NumericData.sum(:bank_balance)
139
- end
140
-
141
- def test_should_group_by_summed_field_with_conditions
142
- c = Account.sum(:credit_limit, :conditions => 'firm_id > 1',
143
- :group => :firm_id)
144
- assert_nil c[1]
145
- assert_equal 105, c[6]
146
- assert_equal 60, c[2]
147
- end
148
-
149
- def test_should_group_by_summed_field_with_conditions_and_having
150
- c = Account.sum(:credit_limit, :conditions => 'firm_id > 1',
151
- :group => :firm_id,
152
- :having => 'sum(credit_limit) > 60')
153
- assert_nil c[1]
154
- assert_equal 105, c[6]
155
- assert_nil c[2]
156
- end
157
-
158
- def test_should_group_by_fields_with_table_alias
159
- c = Account.sum(:credit_limit, :group => 'accounts.firm_id')
160
- assert_equal 50, c[1]
161
- assert_equal 105, c[6]
162
- assert_equal 60, c[2]
163
- end
164
-
165
- def test_should_calculate_with_invalid_field
166
- assert_equal 6, Account.calculate(:count, '*')
167
- assert_equal 6, Account.calculate(:count, :all)
168
- end
169
-
170
- def test_should_calculate_grouped_with_invalid_field
171
- c = Account.count(:all, :group => 'accounts.firm_id')
172
- assert_equal 1, c[1]
173
- assert_equal 2, c[6]
174
- assert_equal 1, c[2]
175
- end
176
-
177
- def test_should_calculate_grouped_association_with_invalid_field
178
- c = Account.count(:all, :group => :firm)
179
- assert_equal 1, c[companies(:first_firm)]
180
- assert_equal 2, c[companies(:rails_core)]
181
- assert_equal 1, c[companies(:first_client)]
182
- end
183
-
184
- def test_should_group_by_association_with_non_numeric_foreign_key
185
- ActiveRecord::Base.connection.expects(:select_all).returns([{"count_all" => 1, "firm_id" => "ABC"}])
186
-
187
- firm = mock()
188
- firm.expects(:id).returns("ABC")
189
- firm.expects(:class).returns(Firm)
190
- Company.expects(:find).with(["ABC"]).returns([firm])
191
-
192
- column = mock()
193
- column.expects(:name).at_least_once.returns(:firm_id)
194
- column.expects(:type_cast).with("ABC").returns("ABC")
195
- Account.expects(:columns).at_least_once.returns([column])
196
-
197
- c = Account.count(:all, :group => :firm)
198
- first_key = c.keys.first
199
- assert_equal Firm, first_key.class
200
- assert_equal 1, c[first_key]
201
- end
202
-
203
- def test_should_calculate_grouped_association_with_foreign_key_option
204
- Account.belongs_to :another_firm, :class_name => 'Firm', :foreign_key => 'firm_id'
205
- c = Account.count(:all, :group => :another_firm)
206
- assert_equal 1, c[companies(:first_firm)]
207
- assert_equal 2, c[companies(:rails_core)]
208
- assert_equal 1, c[companies(:first_client)]
209
- end
210
-
211
- def test_should_not_modify_options_when_using_includes
212
- options = {:conditions => 'companies.id > 1', :include => :firm}
213
- options_copy = options.dup
214
-
215
- Account.count(:all, options)
216
- assert_equal options_copy, options
217
- end
218
-
219
- def test_should_calculate_grouped_by_function
220
- c = Company.count(:all, :group => "UPPER(#{QUOTED_TYPE})")
221
- assert_equal 2, c[nil]
222
- assert_equal 1, c['DEPENDENTFIRM']
223
- assert_equal 3, c['CLIENT']
224
- assert_equal 2, c['FIRM']
225
- end
226
-
227
- def test_should_calculate_grouped_by_function_with_table_alias
228
- c = Company.count(:all, :group => "UPPER(companies.#{QUOTED_TYPE})")
229
- assert_equal 2, c[nil]
230
- assert_equal 1, c['DEPENDENTFIRM']
231
- assert_equal 3, c['CLIENT']
232
- assert_equal 2, c['FIRM']
233
- end
234
-
235
- def test_should_not_overshadow_enumerable_sum
236
- assert_equal 6, [1, 2, 3].sum(&:abs)
237
- end
238
-
239
- def test_should_sum_scoped_field
240
- assert_equal 15, companies(:rails_core).companies.sum(:id)
241
- end
242
-
243
- def test_should_sum_scoped_field_with_from
244
- assert_equal Club.count, Organization.clubs.count
245
- end
246
-
247
- def test_should_sum_scoped_field_with_conditions
248
- assert_equal 8, companies(:rails_core).companies.sum(:id, :conditions => 'id > 7')
249
- end
250
-
251
- def test_should_group_by_scoped_field
252
- c = companies(:rails_core).companies.sum(:id, :group => :name)
253
- assert_equal 7, c['Leetsoft']
254
- assert_equal 8, c['Jadedpixel']
255
- end
256
-
257
- def test_should_group_by_summed_field_with_conditions_and_having
258
- c = companies(:rails_core).companies.sum(:id, :group => :name,
259
- :having => 'sum(id) > 7')
260
- assert_nil c['Leetsoft']
261
- assert_equal 8, c['Jadedpixel']
262
- end
263
-
264
- def test_should_reject_invalid_options
265
- assert_nothing_raised do
266
- [:count, :sum].each do |func|
267
- # empty options are valid
268
- Company.send(:validate_calculation_options, func)
269
- # these options are valid for all calculations
270
- [:select, :conditions, :joins, :order, :group, :having, :distinct].each do |opt|
271
- Company.send(:validate_calculation_options, func, opt => true)
272
- end
273
- end
274
-
275
- # :include is only valid on :count
276
- Company.send(:validate_calculation_options, :count, :include => true)
277
- end
278
-
279
- assert_raise(ArgumentError) { Company.send(:validate_calculation_options, :sum, :foo => :bar) }
280
- assert_raise(ArgumentError) { Company.send(:validate_calculation_options, :count, :foo => :bar) }
281
- end
282
-
283
- def test_should_count_selected_field_with_include
284
- assert_equal 6, Account.count(:distinct => true, :include => :firm)
285
- assert_equal 4, Account.count(:distinct => true, :include => :firm, :select => :credit_limit)
286
- end
287
-
288
- def test_should_count_manual_select_with_include
289
- assert_equal 6, Account.count(:select => "DISTINCT accounts.id", :include => :firm)
290
- end
291
-
292
- def test_count_with_column_parameter
293
- assert_equal 5, Account.count(:firm_id)
294
- end
295
-
296
- def test_count_with_column_and_options_parameter
297
- assert_equal 2, Account.count(:firm_id, :conditions => "credit_limit = 50")
298
- end
299
-
300
- def test_count_with_no_parameters_isnt_deprecated
301
- assert_not_deprecated { Account.count }
302
- end
303
-
304
- def test_count_with_too_many_parameters_raises
305
- assert_raise(ArgumentError) { Account.count(1, 2, 3) }
306
- end
307
-
308
- def test_count_with_scoped_has_many_through_association
309
- assert_equal 1, owners(:blackbeard).toys.with_name('Bone').count
310
- end
311
-
312
- def test_should_sum_expression
313
- assert_equal 636, Account.sum("2 * credit_limit").to_i
314
- end
315
-
316
- def test_count_with_from_option
317
- assert_equal Company.count(:all), Company.count(:all, :from => 'companies')
318
- assert_equal Account.count(:all, :conditions => "credit_limit = 50"),
319
- Account.count(:all, :from => 'accounts', :conditions => "credit_limit = 50")
320
- assert_equal Company.count(:type, :conditions => {:type => "Firm"}),
321
- Company.count(:type, :conditions => {:type => "Firm"}, :from => 'companies')
322
- end
323
-
324
- def test_sum_with_from_option
325
- assert_equal Account.sum(:credit_limit), Account.sum(:credit_limit, :from => 'accounts')
326
- assert_equal Account.sum(:credit_limit, :conditions => "credit_limit > 50"),
327
- Account.sum(:credit_limit, :from => 'accounts', :conditions => "credit_limit > 50")
328
- end
329
-
330
- def test_average_with_from_option
331
- assert_equal Account.average(:credit_limit), Account.average(:credit_limit, :from => 'accounts')
332
- assert_equal Account.average(:credit_limit, :conditions => "credit_limit > 50"),
333
- Account.average(:credit_limit, :from => 'accounts', :conditions => "credit_limit > 50")
334
- end
335
-
336
- def test_minimum_with_from_option
337
- assert_equal Account.minimum(:credit_limit), Account.minimum(:credit_limit, :from => 'accounts')
338
- assert_equal Account.minimum(:credit_limit, :conditions => "credit_limit > 50"),
339
- Account.minimum(:credit_limit, :from => 'accounts', :conditions => "credit_limit > 50")
340
- end
341
-
342
- def test_maximum_with_from_option
343
- assert_equal Account.maximum(:credit_limit), Account.maximum(:credit_limit, :from => 'accounts')
344
- assert_equal Account.maximum(:credit_limit, :conditions => "credit_limit > 50"),
345
- Account.maximum(:credit_limit, :from => 'accounts', :conditions => "credit_limit > 50")
346
- end
347
-
348
- def test_from_option_with_specified_index
349
- if Edge.connection.adapter_name == 'MySQL'
350
- assert_equal Edge.count(:all), Edge.count(:all, :from => 'edges USE INDEX(unique_edge_index)')
351
- assert_equal Edge.count(:all, :conditions => 'sink_id < 5'),
352
- Edge.count(:all, :from => 'edges USE INDEX(unique_edge_index)', :conditions => 'sink_id < 5')
353
- end
354
- end
355
-
356
- def test_from_option_with_table_different_than_class
357
- assert_equal Account.count(:all), Company.count(:all, :from => 'accounts')
358
- end
359
-
360
- end
@@ -1,38 +0,0 @@
1
- require "cases/helper"
2
-
3
- class Comment < ActiveRecord::Base
4
- attr_accessor :callers
5
-
6
- before_validation :record_callers
7
-
8
- def after_validation
9
- record_callers
10
- end
11
-
12
- def record_callers
13
- callers << self.class if callers
14
- end
15
- end
16
-
17
- class CommentObserver < ActiveRecord::Observer
18
- attr_accessor :callers
19
-
20
- def after_validation(model)
21
- callers << self.class if callers
22
- end
23
- end
24
-
25
- class CallbacksObserversTest < ActiveRecord::TestCase
26
- def test_model_callbacks_fire_before_observers_are_notified
27
- callers = []
28
-
29
- comment = Comment.new
30
- comment.callers = callers
31
-
32
- CommentObserver.instance.callers = callers
33
-
34
- comment.valid?
35
-
36
- assert_equal [Comment, Comment, CommentObserver], callers, "model callbacks did not fire before observers were notified"
37
- end
38
- end