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,1273 +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/category'
8
- require 'models/post'
9
- require 'models/author'
10
- require 'models/comment'
11
- require 'models/person'
12
- require 'models/reader'
13
- require 'models/tagging'
14
-
15
- class HasManyAssociationsTest < ActiveRecord::TestCase
16
- fixtures :accounts, :categories, :companies, :developers, :projects,
17
- :developers_projects, :topics, :authors, :comments, :author_addresses,
18
- :people, :posts, :readers, :taggings
19
-
20
- def setup
21
- Client.destroyed_client_ids.clear
22
- end
23
-
24
- def test_create_by
25
- person = Person.create! :first_name => 'tenderlove'
26
- post = Post.find :first
27
-
28
- assert_equal [], person.readers
29
- assert_nil person.readers.find_by_post_id(post.id)
30
-
31
- reader = person.readers.create_by_post_id post.id
32
-
33
- assert_equal 1, person.readers.count
34
- assert_equal 1, person.readers.length
35
- assert_equal post, person.readers.first.post
36
- assert_equal person, person.readers.first.person
37
- end
38
-
39
- def test_create_by_multi
40
- person = Person.create! :first_name => 'tenderlove'
41
- post = Post.find :first
42
-
43
- assert_equal [], person.readers
44
-
45
- reader = person.readers.create_by_post_id_and_skimmer post.id, false
46
-
47
- assert_equal 1, person.readers.count
48
- assert_equal 1, person.readers.length
49
- assert_equal post, person.readers.first.post
50
- assert_equal person, person.readers.first.person
51
- end
52
-
53
- def test_find_or_create_by
54
- person = Person.create! :first_name => 'tenderlove'
55
- post = Post.find :first
56
-
57
- assert_equal [], person.readers
58
- assert_nil person.readers.find_by_post_id(post.id)
59
-
60
- reader = person.readers.find_or_create_by_post_id post.id
61
-
62
- assert_equal 1, person.readers.count
63
- assert_equal 1, person.readers.length
64
- assert_equal post, person.readers.first.post
65
- assert_equal person, person.readers.first.person
66
- end
67
-
68
- def test_find_or_create_by_with_additional_parameters
69
- post = Post.create! :title => 'test_find_or_create_by_with_additional_parameters', :body => 'this is the body'
70
- comment = post.comments.create! :body => 'test comment body', :type => 'test'
71
-
72
- assert_equal comment, post.comments.find_or_create_by_body('test comment body')
73
-
74
- post.comments.find_or_create_by_body(:body => 'other test comment body', :type => 'test')
75
- assert_equal 2, post.comments.count
76
- assert_equal 2, post.comments.length
77
- post.comments.find_or_create_by_body('other other test comment body', :type => 'test')
78
- assert_equal 3, post.comments.count
79
- assert_equal 3, post.comments.length
80
- post.comments.find_or_create_by_body_and_type('3rd test comment body', 'test')
81
- assert_equal 4, post.comments.count
82
- assert_equal 4, post.comments.length
83
- end
84
-
85
- def test_find_or_create_by_with_same_parameters_creates_a_single_record
86
- author = Author.first
87
- assert_difference "Post.count", +1 do
88
- 2.times do
89
- author.posts.find_or_create_by_body_and_title('one', 'two')
90
- end
91
- end
92
- end
93
-
94
- def test_find_or_create_by_with_block
95
- post = Post.create! :title => 'test_find_or_create_by_with_additional_parameters', :body => 'this is the body'
96
- comment = post.comments.find_or_create_by_body('other test comment body') { |comment| comment.type = 'test' }
97
- assert_equal 'test', comment.type
98
- end
99
-
100
- def test_find_or_create
101
- person = Person.create! :first_name => 'tenderlove'
102
- post = Post.find :first
103
-
104
- assert_equal [], person.readers
105
- assert_nil person.readers.find(:first, :conditions => {
106
- :post_id => post.id
107
- })
108
-
109
- reader = person.readers.find_or_create :post_id => post.id
110
-
111
- assert_equal 1, person.readers.count
112
- assert_equal 1, person.readers.length
113
- assert_equal post, person.readers.first.post
114
- assert_equal person, person.readers.first.person
115
- end
116
-
117
-
118
- def force_signal37_to_load_all_clients_of_firm
119
- companies(:first_firm).clients_of_firm.each {|f| }
120
- end
121
-
122
- def test_counting_with_counter_sql
123
- assert_equal 2, Firm.find(:first).clients.count
124
- end
125
-
126
- def test_counting
127
- assert_equal 2, Firm.find(:first).plain_clients.count
128
- end
129
-
130
- def test_counting_with_empty_hash_conditions
131
- assert_equal 2, Firm.find(:first).plain_clients.count(:conditions => {})
132
- end
133
-
134
- def test_counting_with_single_conditions
135
- assert_equal 1, Firm.find(:first).plain_clients.count(:conditions => ['name=?', "Microsoft"])
136
- end
137
-
138
- def test_counting_with_single_hash
139
- assert_equal 1, Firm.find(:first).plain_clients.count(:conditions => {:name => "Microsoft"})
140
- end
141
-
142
- def test_counting_with_column_name_and_hash
143
- assert_equal 2, Firm.find(:first).plain_clients.count(:name)
144
- end
145
-
146
- def test_counting_with_association_limit
147
- firm = companies(:first_firm)
148
- assert_equal firm.limited_clients.length, firm.limited_clients.size
149
- assert_equal firm.limited_clients.length, firm.limited_clients.count
150
- end
151
-
152
- def test_finding
153
- assert_equal 2, Firm.find(:first).clients.length
154
- end
155
-
156
- def test_find_with_blank_conditions
157
- [[], {}, nil, ""].each do |blank|
158
- assert_equal 2, Firm.find(:first).clients.find(:all, :conditions => blank).size
159
- end
160
- end
161
-
162
- def test_find_many_with_merged_options
163
- assert_equal 1, companies(:first_firm).limited_clients.size
164
- assert_equal 1, companies(:first_firm).limited_clients.find(:all).size
165
- assert_equal 2, companies(:first_firm).limited_clients.find(:all, :limit => nil).size
166
- end
167
-
168
- def test_dynamic_find_last_without_specified_order
169
- assert_equal companies(:second_client), companies(:first_firm).unsorted_clients.find_last_by_type('Client')
170
- end
171
-
172
- def test_dynamic_find_should_respect_association_order
173
- assert_equal companies(:second_client), companies(:first_firm).clients_sorted_desc.find(:first, :conditions => "type = 'Client'")
174
- assert_equal companies(:second_client), companies(:first_firm).clients_sorted_desc.find_by_type('Client')
175
- end
176
-
177
- def test_dynamic_find_order_should_override_association_order
178
- assert_equal companies(:first_client), companies(:first_firm).clients_sorted_desc.find(:first, :conditions => "type = 'Client'", :order => 'id')
179
- assert_equal companies(:first_client), companies(:first_firm).clients_sorted_desc.find_by_type('Client', :order => 'id')
180
- end
181
-
182
- def test_dynamic_find_all_should_respect_association_order
183
- assert_equal [companies(:second_client), companies(:first_client)], companies(:first_firm).clients_sorted_desc.find(:all, :conditions => "type = 'Client'")
184
- assert_equal [companies(:second_client), companies(:first_client)], companies(:first_firm).clients_sorted_desc.find_all_by_type('Client')
185
- end
186
-
187
- def test_dynamic_find_all_order_should_override_association_order
188
- assert_equal [companies(:first_client), companies(:second_client)], companies(:first_firm).clients_sorted_desc.find(:all, :conditions => "type = 'Client'", :order => 'id')
189
- assert_equal [companies(:first_client), companies(:second_client)], companies(:first_firm).clients_sorted_desc.find_all_by_type('Client', :order => 'id')
190
- end
191
-
192
- def test_dynamic_find_all_should_respect_association_limit
193
- assert_equal 1, companies(:first_firm).limited_clients.find(:all, :conditions => "type = 'Client'").length
194
- assert_equal 1, companies(:first_firm).limited_clients.find_all_by_type('Client').length
195
- end
196
-
197
- def test_dynamic_find_all_limit_should_override_association_limit
198
- assert_equal 2, companies(:first_firm).limited_clients.find(:all, :conditions => "type = 'Client'", :limit => 9_000).length
199
- assert_equal 2, companies(:first_firm).limited_clients.find_all_by_type('Client', :limit => 9_000).length
200
- end
201
-
202
- def test_dynamic_find_all_should_respect_readonly_access
203
- companies(:first_firm).readonly_clients.find(:all).each { |c| assert_raise(ActiveRecord::ReadOnlyRecord) { c.save! } }
204
- companies(:first_firm).readonly_clients.find(:all).each { |c| assert c.readonly? }
205
- end
206
-
207
- def test_cant_save_has_many_readonly_association
208
- authors(:david).readonly_comments.each { |c| assert_raise(ActiveRecord::ReadOnlyRecord) { c.save! } }
209
- authors(:david).readonly_comments.each { |c| assert c.readonly? }
210
- end
211
-
212
- def test_triple_equality
213
- assert !(Array === Firm.find(:first).clients)
214
- assert Firm.find(:first).clients === Array
215
- end
216
-
217
- def test_finding_default_orders
218
- assert_equal "Summit", Firm.find(:first).clients.first.name
219
- end
220
-
221
- def test_finding_with_different_class_name_and_order
222
- assert_equal "Microsoft", Firm.find(:first).clients_sorted_desc.first.name
223
- end
224
-
225
- def test_finding_with_foreign_key
226
- assert_equal "Microsoft", Firm.find(:first).clients_of_firm.first.name
227
- end
228
-
229
- def test_finding_with_condition
230
- assert_equal "Microsoft", Firm.find(:first).clients_like_ms.first.name
231
- end
232
-
233
- def test_finding_with_condition_hash
234
- assert_equal "Microsoft", Firm.find(:first).clients_like_ms_with_hash_conditions.first.name
235
- end
236
-
237
- def test_finding_using_primary_key
238
- assert_equal "Summit", Firm.find(:first).clients_using_primary_key.first.name
239
- end
240
-
241
- def test_finding_using_sql
242
- firm = Firm.find(:first)
243
- first_client = firm.clients_using_sql.first
244
- assert_not_nil first_client
245
- assert_equal "Microsoft", first_client.name
246
- assert_equal 1, firm.clients_using_sql.size
247
- assert_equal 1, Firm.find(:first).clients_using_sql.size
248
- end
249
-
250
- def test_counting_using_sql
251
- assert_equal 1, Firm.find(:first).clients_using_counter_sql.size
252
- assert Firm.find(:first).clients_using_counter_sql.any?
253
- assert_equal 0, Firm.find(:first).clients_using_zero_counter_sql.size
254
- assert !Firm.find(:first).clients_using_zero_counter_sql.any?
255
- end
256
-
257
- def test_counting_non_existant_items_using_sql
258
- assert_equal 0, Firm.find(:first).no_clients_using_counter_sql.size
259
- end
260
-
261
- def test_belongs_to_sanity
262
- c = Client.new
263
- assert_nil c.firm
264
-
265
- if c.firm
266
- assert false, "belongs_to failed if check"
267
- end
268
-
269
- unless c.firm
270
- else
271
- assert false, "belongs_to failed unless check"
272
- end
273
- end
274
-
275
- def test_find_ids
276
- firm = Firm.find(:first)
277
-
278
- assert_raise(ActiveRecord::RecordNotFound) { firm.clients.find }
279
-
280
- client = firm.clients.find(2)
281
- assert_kind_of Client, client
282
-
283
- client_ary = firm.clients.find([2])
284
- assert_kind_of Array, client_ary
285
- assert_equal client, client_ary.first
286
-
287
- client_ary = firm.clients.find(2, 3)
288
- assert_kind_of Array, client_ary
289
- assert_equal 2, client_ary.size
290
- assert_equal client, client_ary.first
291
-
292
- assert_raise(ActiveRecord::RecordNotFound) { firm.clients.find(2, 99) }
293
- end
294
-
295
- def test_find_string_ids_when_using_finder_sql
296
- firm = Firm.find(:first)
297
-
298
- client = firm.clients_using_finder_sql.find("2")
299
- assert_kind_of Client, client
300
-
301
- client_ary = firm.clients_using_finder_sql.find(["2"])
302
- assert_kind_of Array, client_ary
303
- assert_equal client, client_ary.first
304
-
305
- client_ary = firm.clients_using_finder_sql.find("2", "3")
306
- assert_kind_of Array, client_ary
307
- assert_equal 2, client_ary.size
308
- assert client_ary.include?(client)
309
- end
310
-
311
- def test_find_all
312
- firm = Firm.find(:first)
313
- assert_equal 2, firm.clients.find(:all, :conditions => "#{QUOTED_TYPE} = 'Client'").length
314
- assert_equal 1, firm.clients.find(:all, :conditions => "name = 'Summit'").length
315
- end
316
-
317
- def test_find_each
318
- firm = companies(:first_firm)
319
-
320
- assert ! firm.clients.loaded?
321
-
322
- assert_queries(3) do
323
- firm.clients.find_each(:batch_size => 1) {|c| assert_equal firm.id, c.firm_id }
324
- end
325
-
326
- assert ! firm.clients.loaded?
327
- end
328
-
329
- def test_find_each_with_conditions
330
- firm = companies(:first_firm)
331
-
332
- assert_queries(2) do
333
- firm.clients.find_each(:batch_size => 1, :conditions => {:name => "Microsoft"}) do |c|
334
- assert_equal firm.id, c.firm_id
335
- assert_equal "Microsoft", c.name
336
- end
337
- end
338
-
339
- assert ! firm.clients.loaded?
340
- end
341
-
342
- def test_find_in_batches
343
- firm = companies(:first_firm)
344
-
345
- assert ! firm.clients.loaded?
346
-
347
- assert_queries(2) do
348
- firm.clients.find_in_batches(:batch_size => 2) do |clients|
349
- clients.each {|c| assert_equal firm.id, c.firm_id }
350
- end
351
- end
352
-
353
- assert ! firm.clients.loaded?
354
- end
355
-
356
- def test_find_all_sanitized
357
- firm = Firm.find(:first)
358
- summit = firm.clients.find(:all, :conditions => "name = 'Summit'")
359
- assert_equal summit, firm.clients.find(:all, :conditions => ["name = ?", "Summit"])
360
- assert_equal summit, firm.clients.find(:all, :conditions => ["name = :name", { :name => "Summit" }])
361
- end
362
-
363
- def test_find_first
364
- firm = Firm.find(:first)
365
- client2 = Client.find(2)
366
- assert_equal firm.clients.first, firm.clients.find(:first)
367
- assert_equal client2, firm.clients.find(:first, :conditions => "#{QUOTED_TYPE} = 'Client'")
368
- end
369
-
370
- def test_find_first_sanitized
371
- firm = Firm.find(:first)
372
- client2 = Client.find(2)
373
- assert_equal client2, firm.clients.find(:first, :conditions => ["#{QUOTED_TYPE} = ?", 'Client'])
374
- assert_equal client2, firm.clients.find(:first, :conditions => ["#{QUOTED_TYPE} = :type", { :type => 'Client' }])
375
- end
376
-
377
- def test_find_all_with_include_and_conditions
378
- assert_nothing_raised do
379
- Developer.find(:all, :joins => :audit_logs, :conditions => {'audit_logs.message' => nil, :name => 'Smith'})
380
- end
381
- end
382
-
383
- def test_find_in_collection
384
- assert_equal Client.find(2).name, companies(:first_firm).clients.find(2).name
385
- assert_raise(ActiveRecord::RecordNotFound) { companies(:first_firm).clients.find(6) }
386
- end
387
-
388
- def test_find_grouped
389
- all_clients_of_firm1 = Client.find(:all, :conditions => "firm_id = 1")
390
- grouped_clients_of_firm1 = Client.find(:all, :conditions => "firm_id = 1", :group => "firm_id", :select => 'firm_id, count(id) as clients_count')
391
- assert_equal 2, all_clients_of_firm1.size
392
- assert_equal 1, grouped_clients_of_firm1.size
393
- end
394
-
395
- def test_find_scoped_grouped
396
- assert_equal 1, companies(:first_firm).clients_grouped_by_firm_id.size
397
- assert_equal 1, companies(:first_firm).clients_grouped_by_firm_id.length
398
- assert_equal 2, companies(:first_firm).clients_grouped_by_name.size
399
- assert_equal 2, companies(:first_firm).clients_grouped_by_name.length
400
- end
401
-
402
- def test_find_scoped_grouped_having
403
- assert_equal 1, authors(:david).popular_grouped_posts.length
404
- assert_equal 0, authors(:mary).popular_grouped_posts.length
405
- end
406
-
407
- def test_adding
408
- force_signal37_to_load_all_clients_of_firm
409
- natural = Client.new("name" => "Natural Company")
410
- companies(:first_firm).clients_of_firm << natural
411
- assert_equal 2, companies(:first_firm).clients_of_firm.size # checking via the collection
412
- assert_equal 2, companies(:first_firm).clients_of_firm(true).size # checking using the db
413
- assert_equal natural, companies(:first_firm).clients_of_firm.last
414
- end
415
-
416
- def test_adding_using_create
417
- first_firm = companies(:first_firm)
418
- assert_equal 2, first_firm.plain_clients.size
419
- natural = first_firm.plain_clients.create(:name => "Natural Company")
420
- assert_equal 3, first_firm.plain_clients.length
421
- assert_equal 3, first_firm.plain_clients.size
422
- end
423
-
424
- def test_create_with_bang_on_has_many_when_parent_is_new_raises
425
- assert_raise(ActiveRecord::RecordNotSaved) do
426
- firm = Firm.new
427
- firm.plain_clients.create! :name=>"Whoever"
428
- end
429
- end
430
-
431
- def test_regular_create_on_has_many_when_parent_is_new_raises
432
- assert_raise(ActiveRecord::RecordNotSaved) do
433
- firm = Firm.new
434
- firm.plain_clients.create :name=>"Whoever"
435
- end
436
- end
437
-
438
- def test_create_with_bang_on_has_many_raises_when_record_not_saved
439
- assert_raise(ActiveRecord::RecordInvalid) do
440
- firm = Firm.find(:first)
441
- firm.plain_clients.create!
442
- end
443
- end
444
-
445
- def test_create_with_bang_on_habtm_when_parent_is_new_raises
446
- assert_raise(ActiveRecord::RecordNotSaved) do
447
- Developer.new("name" => "Aredridel").projects.create!
448
- end
449
- end
450
-
451
- def test_adding_a_mismatch_class
452
- assert_raise(ActiveRecord::AssociationTypeMismatch) { companies(:first_firm).clients_of_firm << nil }
453
- assert_raise(ActiveRecord::AssociationTypeMismatch) { companies(:first_firm).clients_of_firm << 1 }
454
- assert_raise(ActiveRecord::AssociationTypeMismatch) { companies(:first_firm).clients_of_firm << Topic.find(1) }
455
- end
456
-
457
- def test_adding_a_collection
458
- force_signal37_to_load_all_clients_of_firm
459
- companies(:first_firm).clients_of_firm.concat([Client.new("name" => "Natural Company"), Client.new("name" => "Apple")])
460
- assert_equal 3, companies(:first_firm).clients_of_firm.size
461
- assert_equal 3, companies(:first_firm).clients_of_firm(true).size
462
- end
463
-
464
- def test_build
465
- company = companies(:first_firm)
466
- new_client = assert_no_queries { company.clients_of_firm.build("name" => "Another Client") }
467
- assert !company.clients_of_firm.loaded?
468
-
469
- assert_equal "Another Client", new_client.name
470
- assert new_client.new_record?
471
- assert_equal new_client, company.clients_of_firm.last
472
- end
473
-
474
- def test_collection_size_after_building
475
- company = companies(:first_firm) # company already has one client
476
- company.clients_of_firm.build("name" => "Another Client")
477
- company.clients_of_firm.build("name" => "Yet Another Client")
478
- assert_equal 3, company.clients_of_firm.size
479
- end
480
-
481
- def test_collection_size_twice_for_regressions
482
- post = posts(:thinking)
483
- assert_equal 0, post.readers.size
484
- # This test needs a post that has no readers, we assert it to ensure it holds,
485
- # but need to reload the post because the very call to #size hides the bug.
486
- post.reload
487
- post.readers.build
488
- size1 = post.readers.size
489
- size2 = post.readers.size
490
- assert_equal size1, size2
491
- end
492
-
493
- def test_build_many
494
- company = companies(:first_firm)
495
- new_clients = assert_no_queries { company.clients_of_firm.build([{"name" => "Another Client"}, {"name" => "Another Client II"}]) }
496
- assert_equal 2, new_clients.size
497
- end
498
-
499
- def test_build_followed_by_save_does_not_load_target
500
- new_client = companies(:first_firm).clients_of_firm.build("name" => "Another Client")
501
- assert companies(:first_firm).save
502
- assert !companies(:first_firm).clients_of_firm.loaded?
503
- end
504
-
505
- def test_build_without_loading_association
506
- first_topic = topics(:first)
507
- Reply.column_names
508
-
509
- assert_equal 1, first_topic.replies.length
510
-
511
- assert_no_queries do
512
- first_topic.replies.build(:title => "Not saved", :content => "Superstars")
513
- assert_equal 2, first_topic.replies.size
514
- end
515
-
516
- assert_equal 2, first_topic.replies.to_ary.size
517
- end
518
-
519
- def test_build_via_block
520
- company = companies(:first_firm)
521
- new_client = assert_no_queries { company.clients_of_firm.build {|client| client.name = "Another Client" } }
522
- assert !company.clients_of_firm.loaded?
523
-
524
- assert_equal "Another Client", new_client.name
525
- assert new_client.new_record?
526
- assert_equal new_client, company.clients_of_firm.last
527
- end
528
-
529
- def test_build_many_via_block
530
- company = companies(:first_firm)
531
- new_clients = assert_no_queries do
532
- company.clients_of_firm.build([{"name" => "Another Client"}, {"name" => "Another Client II"}]) do |client|
533
- client.name = "changed"
534
- end
535
- end
536
-
537
- assert_equal 2, new_clients.size
538
- assert_equal "changed", new_clients.first.name
539
- assert_equal "changed", new_clients.last.name
540
- end
541
-
542
- def test_create_without_loading_association
543
- first_firm = companies(:first_firm)
544
- Firm.column_names
545
- Client.column_names
546
-
547
- assert_equal 1, first_firm.clients_of_firm.size
548
- first_firm.clients_of_firm.reset
549
-
550
- assert_queries(1) do
551
- first_firm.clients_of_firm.create(:name => "Superstars")
552
- end
553
-
554
- assert_equal 2, first_firm.clients_of_firm.size
555
- end
556
-
557
- def test_create
558
- force_signal37_to_load_all_clients_of_firm
559
- new_client = companies(:first_firm).clients_of_firm.create("name" => "Another Client")
560
- assert !new_client.new_record?
561
- assert_equal new_client, companies(:first_firm).clients_of_firm.last
562
- assert_equal new_client, companies(:first_firm).clients_of_firm(true).last
563
- end
564
-
565
- def test_create_many
566
- companies(:first_firm).clients_of_firm.create([{"name" => "Another Client"}, {"name" => "Another Client II"}])
567
- assert_equal 3, companies(:first_firm).clients_of_firm(true).size
568
- end
569
-
570
- def test_create_followed_by_save_does_not_load_target
571
- new_client = companies(:first_firm).clients_of_firm.create("name" => "Another Client")
572
- assert companies(:first_firm).save
573
- assert !companies(:first_firm).clients_of_firm.loaded?
574
- end
575
-
576
- def test_find_or_initialize
577
- the_client = companies(:first_firm).clients.find_or_initialize_by_name("Yet another client")
578
- assert_equal companies(:first_firm).id, the_client.firm_id
579
- assert_equal "Yet another client", the_client.name
580
- assert the_client.new_record?
581
- end
582
-
583
- def test_find_or_create_updates_size
584
- number_of_clients = companies(:first_firm).clients.size
585
- the_client = companies(:first_firm).clients.find_or_create_by_name("Yet another client")
586
- assert_equal number_of_clients + 1, companies(:first_firm, :reload).clients.size
587
- assert_equal the_client, companies(:first_firm).clients.find_or_create_by_name("Yet another client")
588
- assert_equal number_of_clients + 1, companies(:first_firm, :reload).clients.size
589
- end
590
-
591
- def test_deleting
592
- force_signal37_to_load_all_clients_of_firm
593
- companies(:first_firm).clients_of_firm.delete(companies(:first_firm).clients_of_firm.first)
594
- assert_equal 0, companies(:first_firm).clients_of_firm.size
595
- assert_equal 0, companies(:first_firm).clients_of_firm(true).size
596
- end
597
-
598
- def test_deleting_before_save
599
- new_firm = Firm.new("name" => "A New Firm, Inc.")
600
- new_client = new_firm.clients_of_firm.build("name" => "Another Client")
601
- assert_equal 1, new_firm.clients_of_firm.size
602
- new_firm.clients_of_firm.delete(new_client)
603
- assert_equal 0, new_firm.clients_of_firm.size
604
- end
605
-
606
- def test_deleting_updates_counter_cache
607
- topic = Topic.first
608
- assert_equal topic.replies.to_a.size, topic.replies_count
609
-
610
- topic.replies.delete(topic.replies.first)
611
- topic.reload
612
- assert_equal topic.replies.to_a.size, topic.replies_count
613
- end
614
-
615
- def test_deleting_updates_counter_cache_without_dependent_destroy
616
- post = posts(:welcome)
617
-
618
- assert_difference "post.reload.taggings_count", -1 do
619
- post.taggings.delete(post.taggings.first)
620
- end
621
- end
622
-
623
- def test_deleting_a_collection
624
- force_signal37_to_load_all_clients_of_firm
625
- companies(:first_firm).clients_of_firm.create("name" => "Another Client")
626
- assert_equal 2, companies(:first_firm).clients_of_firm.size
627
- companies(:first_firm).clients_of_firm.delete([companies(:first_firm).clients_of_firm[0], companies(:first_firm).clients_of_firm[1]])
628
- assert_equal 0, companies(:first_firm).clients_of_firm.size
629
- assert_equal 0, companies(:first_firm).clients_of_firm(true).size
630
- end
631
-
632
- def test_delete_all
633
- force_signal37_to_load_all_clients_of_firm
634
- companies(:first_firm).clients_of_firm.create("name" => "Another Client")
635
- assert_equal 2, companies(:first_firm).clients_of_firm.size
636
- companies(:first_firm).clients_of_firm.delete_all
637
- assert_equal 0, companies(:first_firm).clients_of_firm.size
638
- assert_equal 0, companies(:first_firm).clients_of_firm(true).size
639
- end
640
-
641
- def test_delete_all_with_not_yet_loaded_association_collection
642
- force_signal37_to_load_all_clients_of_firm
643
- companies(:first_firm).clients_of_firm.create("name" => "Another Client")
644
- assert_equal 2, companies(:first_firm).clients_of_firm.size
645
- companies(:first_firm).clients_of_firm.reset
646
- companies(:first_firm).clients_of_firm.delete_all
647
- assert_equal 0, companies(:first_firm).clients_of_firm.size
648
- assert_equal 0, companies(:first_firm).clients_of_firm(true).size
649
- end
650
-
651
- def test_clearing_an_association_collection
652
- firm = companies(:first_firm)
653
- client_id = firm.clients_of_firm.first.id
654
- assert_equal 1, firm.clients_of_firm.size
655
-
656
- firm.clients_of_firm.clear
657
-
658
- assert_equal 0, firm.clients_of_firm.size
659
- assert_equal 0, firm.clients_of_firm(true).size
660
- assert_equal [], Client.destroyed_client_ids[firm.id]
661
-
662
- # Should not be destroyed since the association is not dependent.
663
- assert_nothing_raised do
664
- assert Client.find(client_id).firm.nil?
665
- end
666
- end
667
-
668
- def test_clearing_updates_counter_cache
669
- topic = Topic.first
670
-
671
- topic.replies.clear
672
- topic.reload
673
- assert_equal 0, topic.replies_count
674
- end
675
-
676
- def test_clearing_a_dependent_association_collection
677
- firm = companies(:first_firm)
678
- client_id = firm.dependent_clients_of_firm.first.id
679
- assert_equal 1, firm.dependent_clients_of_firm.size
680
-
681
- # :dependent means destroy is called on each client
682
- firm.dependent_clients_of_firm.clear
683
-
684
- assert_equal 0, firm.dependent_clients_of_firm.size
685
- assert_equal 0, firm.dependent_clients_of_firm(true).size
686
- assert_equal [client_id], Client.destroyed_client_ids[firm.id]
687
-
688
- # Should be destroyed since the association is dependent.
689
- assert Client.find_by_id(client_id).nil?
690
- end
691
-
692
- def test_clearing_an_exclusively_dependent_association_collection
693
- firm = companies(:first_firm)
694
- client_id = firm.exclusively_dependent_clients_of_firm.first.id
695
- assert_equal 1, firm.exclusively_dependent_clients_of_firm.size
696
-
697
- assert_equal [], Client.destroyed_client_ids[firm.id]
698
-
699
- # :exclusively_dependent means each client is deleted directly from
700
- # the database without looping through them calling destroy.
701
- firm.exclusively_dependent_clients_of_firm.clear
702
-
703
- assert_equal 0, firm.exclusively_dependent_clients_of_firm.size
704
- assert_equal 0, firm.exclusively_dependent_clients_of_firm(true).size
705
- # no destroy-filters should have been called
706
- assert_equal [], Client.destroyed_client_ids[firm.id]
707
-
708
- # Should be destroyed since the association is exclusively dependent.
709
- assert Client.find_by_id(client_id).nil?
710
- end
711
-
712
- def test_dependent_association_respects_optional_conditions_on_delete
713
- firm = companies(:odegy)
714
- Client.create(:client_of => firm.id, :name => "BigShot Inc.")
715
- Client.create(:client_of => firm.id, :name => "SmallTime Inc.")
716
- # only one of two clients is included in the association due to the :conditions key
717
- assert_equal 2, Client.find_all_by_client_of(firm.id).size
718
- assert_equal 1, firm.dependent_conditional_clients_of_firm.size
719
- firm.destroy
720
- # only the correctly associated client should have been deleted
721
- assert_equal 1, Client.find_all_by_client_of(firm.id).size
722
- end
723
-
724
- def test_dependent_association_respects_optional_sanitized_conditions_on_delete
725
- firm = companies(:odegy)
726
- Client.create(:client_of => firm.id, :name => "BigShot Inc.")
727
- Client.create(:client_of => firm.id, :name => "SmallTime Inc.")
728
- # only one of two clients is included in the association due to the :conditions key
729
- assert_equal 2, Client.find_all_by_client_of(firm.id).size
730
- assert_equal 1, firm.dependent_sanitized_conditional_clients_of_firm.size
731
- firm.destroy
732
- # only the correctly associated client should have been deleted
733
- assert_equal 1, Client.find_all_by_client_of(firm.id).size
734
- end
735
-
736
- def test_dependent_association_respects_optional_hash_conditions_on_delete
737
- firm = companies(:odegy)
738
- Client.create(:client_of => firm.id, :name => "BigShot Inc.")
739
- Client.create(:client_of => firm.id, :name => "SmallTime Inc.")
740
- # only one of two clients is included in the association due to the :conditions key
741
- assert_equal 2, Client.find_all_by_client_of(firm.id).size
742
- assert_equal 1, firm.dependent_sanitized_conditional_clients_of_firm.size
743
- firm.destroy
744
- # only the correctly associated client should have been deleted
745
- assert_equal 1, Client.find_all_by_client_of(firm.id).size
746
- end
747
-
748
- def test_delete_all_association_with_primary_key_deletes_correct_records
749
- firm = Firm.find(:first)
750
- # break the vanilla firm_id foreign key
751
- assert_equal 2, firm.clients.count
752
- firm.clients.first.update_attribute(:firm_id, nil)
753
- assert_equal 1, firm.clients(true).count
754
- assert_equal 1, firm.clients_using_primary_key_with_delete_all.count
755
- old_record = firm.clients_using_primary_key_with_delete_all.first
756
- firm = Firm.find(:first)
757
- firm.destroy
758
- assert Client.find_by_id(old_record.id).nil?
759
- end
760
-
761
- def test_creation_respects_hash_condition
762
- ms_client = companies(:first_firm).clients_like_ms_with_hash_conditions.build
763
-
764
- assert ms_client.save
765
- assert_equal 'Microsoft', ms_client.name
766
-
767
- another_ms_client = companies(:first_firm).clients_like_ms_with_hash_conditions.create
768
-
769
- assert !another_ms_client.new_record?
770
- assert_equal 'Microsoft', another_ms_client.name
771
- end
772
-
773
- def test_dependent_delete_and_destroy_with_belongs_to
774
- author_address = author_addresses(:david_address)
775
- assert_equal [], AuthorAddress.destroyed_author_address_ids[authors(:david).id]
776
-
777
- assert_difference "AuthorAddress.count", -2 do
778
- authors(:david).destroy
779
- end
780
-
781
- assert_equal nil, AuthorAddress.find_by_id(authors(:david).author_address_id)
782
- assert_equal nil, AuthorAddress.find_by_id(authors(:david).author_address_extra_id)
783
- end
784
-
785
- def test_invalid_belongs_to_dependent_option_raises_exception
786
- assert_raise ArgumentError do
787
- Author.belongs_to :special_author_address, :dependent => :nullify
788
- end
789
- end
790
-
791
- def test_clearing_without_initial_access
792
- firm = companies(:first_firm)
793
-
794
- firm.clients_of_firm.clear
795
-
796
- assert_equal 0, firm.clients_of_firm.size
797
- assert_equal 0, firm.clients_of_firm(true).size
798
- end
799
-
800
- def test_deleting_a_item_which_is_not_in_the_collection
801
- force_signal37_to_load_all_clients_of_firm
802
- summit = Client.find_by_name('Summit')
803
- companies(:first_firm).clients_of_firm.delete(summit)
804
- assert_equal 1, companies(:first_firm).clients_of_firm.size
805
- assert_equal 1, companies(:first_firm).clients_of_firm(true).size
806
- assert_equal 2, summit.client_of
807
- end
808
-
809
- def test_deleting_type_mismatch
810
- david = Developer.find(1)
811
- david.projects.reload
812
- assert_raise(ActiveRecord::AssociationTypeMismatch) { david.projects.delete(1) }
813
- end
814
-
815
- def test_deleting_self_type_mismatch
816
- david = Developer.find(1)
817
- david.projects.reload
818
- assert_raise(ActiveRecord::AssociationTypeMismatch) { david.projects.delete(Project.find(1).developers) }
819
- end
820
-
821
- def test_destroying
822
- force_signal37_to_load_all_clients_of_firm
823
-
824
- assert_difference "Client.count", -1 do
825
- companies(:first_firm).clients_of_firm.destroy(companies(:first_firm).clients_of_firm.first)
826
- end
827
-
828
- assert_equal 0, companies(:first_firm).reload.clients_of_firm.size
829
- assert_equal 0, companies(:first_firm).clients_of_firm(true).size
830
- end
831
-
832
- def test_destroying_by_fixnum_id
833
- force_signal37_to_load_all_clients_of_firm
834
-
835
- assert_difference "Client.count", -1 do
836
- companies(:first_firm).clients_of_firm.destroy(companies(:first_firm).clients_of_firm.first.id)
837
- end
838
-
839
- assert_equal 0, companies(:first_firm).reload.clients_of_firm.size
840
- assert_equal 0, companies(:first_firm).clients_of_firm(true).size
841
- end
842
-
843
- def test_destroying_by_string_id
844
- force_signal37_to_load_all_clients_of_firm
845
-
846
- assert_difference "Client.count", -1 do
847
- companies(:first_firm).clients_of_firm.destroy(companies(:first_firm).clients_of_firm.first.id.to_s)
848
- end
849
-
850
- assert_equal 0, companies(:first_firm).reload.clients_of_firm.size
851
- assert_equal 0, companies(:first_firm).clients_of_firm(true).size
852
- end
853
-
854
- def test_destroying_a_collection
855
- force_signal37_to_load_all_clients_of_firm
856
- companies(:first_firm).clients_of_firm.create("name" => "Another Client")
857
- assert_equal 2, companies(:first_firm).clients_of_firm.size
858
-
859
- assert_difference "Client.count", -2 do
860
- companies(:first_firm).clients_of_firm.destroy([companies(:first_firm).clients_of_firm[0], companies(:first_firm).clients_of_firm[1]])
861
- end
862
-
863
- assert_equal 0, companies(:first_firm).reload.clients_of_firm.size
864
- assert_equal 0, companies(:first_firm).clients_of_firm(true).size
865
- end
866
-
867
- def test_destroy_all
868
- force_signal37_to_load_all_clients_of_firm
869
- clients = companies(:first_firm).clients_of_firm.to_a
870
- assert !clients.empty?, "37signals has clients after load"
871
- destroyed = companies(:first_firm).clients_of_firm.destroy_all
872
- assert_equal clients.sort_by(&:id), destroyed.sort_by(&:id)
873
- assert destroyed.all? { |client| client.frozen? }, "destroyed clients should be frozen"
874
- assert companies(:first_firm).clients_of_firm.empty?, "37signals has no clients after destroy all"
875
- assert companies(:first_firm).clients_of_firm(true).empty?, "37signals has no clients after destroy all and refresh"
876
- end
877
-
878
- def test_destroy_all_with_creates_and_scope_that_doesnt_match_created_records
879
- company = companies(:first_firm)
880
- unloaded_client_matching_scope = companies(:second_client)
881
- created_client_matching_scope = company.clients_of_firm.create!(:name => "Somesoft")
882
- created_client_not_matching_scope = company.clients_of_firm.create!(:name => "OtherCo")
883
- destroyed = company.clients_of_firm.with_oft_in_name.destroy_all
884
- assert destroyed.include?(unloaded_client_matching_scope), "unloaded clients matching the scope destroy_all on should have been destroyed"
885
- assert destroyed.include?(created_client_matching_scope), "loaded clients matching the scope destroy_all on should have been destroyed"
886
- assert !destroyed.include?(created_client_not_matching_scope), "loaded clients not matching the scope destroy_all on should not have been destroyed"
887
- end
888
-
889
- def test_dependence
890
- firm = companies(:first_firm)
891
- assert_equal 2, firm.clients.size
892
- firm.destroy
893
- assert Client.find(:all, :conditions => "firm_id=#{firm.id}").empty?
894
- end
895
-
896
- def test_dependence_for_associations_with_hash_condition
897
- david = authors(:david)
898
- post = posts(:thinking).id
899
- assert_difference('Post.count', -1) { assert david.destroy }
900
- end
901
-
902
- def test_destroy_dependent_when_deleted_from_association
903
- firm = Firm.find(:first)
904
- assert_equal 2, firm.clients.size
905
-
906
- client = firm.clients.first
907
- firm.clients.delete(client)
908
-
909
- assert_raise(ActiveRecord::RecordNotFound) { Client.find(client.id) }
910
- assert_raise(ActiveRecord::RecordNotFound) { firm.clients.find(client.id) }
911
- assert_equal 1, firm.clients.size
912
- end
913
-
914
- def test_three_levels_of_dependence
915
- topic = Topic.create "title" => "neat and simple"
916
- reply = topic.replies.create "title" => "neat and simple", "content" => "still digging it"
917
- silly_reply = reply.replies.create "title" => "neat and simple", "content" => "ain't complaining"
918
-
919
- assert_nothing_raised { topic.destroy }
920
- end
921
-
922
- uses_transaction :test_dependence_with_transaction_support_on_failure
923
- def test_dependence_with_transaction_support_on_failure
924
- firm = companies(:first_firm)
925
- clients = firm.clients
926
- assert_equal 2, clients.length
927
- clients.last.instance_eval { def before_destroy() raise "Trigger rollback" end }
928
-
929
- firm.destroy rescue "do nothing"
930
-
931
- assert_equal 2, Client.find(:all, :conditions => "firm_id=#{firm.id}").size
932
- end
933
-
934
- def test_dependence_on_account
935
- num_accounts = Account.count
936
- companies(:first_firm).destroy
937
- assert_equal num_accounts - 1, Account.count
938
- end
939
-
940
- def test_depends_and_nullify
941
- num_accounts = Account.count
942
- num_companies = Company.count
943
-
944
- core = companies(:rails_core)
945
- assert_equal accounts(:rails_core_account), core.account
946
- assert_equal companies(:leetsoft, :jadedpixel), core.companies
947
- core.destroy
948
- assert_nil accounts(:rails_core_account).reload.firm_id
949
- assert_nil companies(:leetsoft).reload.client_of
950
- assert_nil companies(:jadedpixel).reload.client_of
951
-
952
-
953
- assert_equal num_accounts, Account.count
954
- end
955
-
956
- def test_included_in_collection
957
- assert companies(:first_firm).clients.include?(Client.find(2))
958
- end
959
-
960
- def test_adding_array_and_collection
961
- assert_nothing_raised { Firm.find(:first).clients + Firm.find(:all).last.clients }
962
- end
963
-
964
- def test_find_all_without_conditions
965
- firm = companies(:first_firm)
966
- assert_equal 2, firm.clients.find(:all).length
967
- end
968
-
969
- def test_replace_with_less
970
- firm = Firm.find(:first)
971
- firm.clients = [companies(:first_client)]
972
- assert firm.save, "Could not save firm"
973
- firm.reload
974
- assert_equal 1, firm.clients.length
975
- end
976
-
977
- def test_replace_with_less_and_dependent_nullify
978
- num_companies = Company.count
979
- companies(:rails_core).companies = []
980
- assert_equal num_companies, Company.count
981
- end
982
-
983
- def test_replace_with_new
984
- firm = Firm.find(:first)
985
- firm.clients = [companies(:second_client), Client.new("name" => "New Client")]
986
- firm.save
987
- firm.reload
988
- assert_equal 2, firm.clients.length
989
- assert !firm.clients.include?(:first_client)
990
- end
991
-
992
- def test_get_ids
993
- assert_equal [companies(:first_client).id, companies(:second_client).id], companies(:first_firm).client_ids
994
- end
995
-
996
- def test_get_ids_for_loaded_associations
997
- company = companies(:first_firm)
998
- company.clients(true)
999
- assert_queries(0) do
1000
- company.client_ids
1001
- company.client_ids
1002
- end
1003
- end
1004
-
1005
- def test_get_ids_for_unloaded_associations_does_not_load_them
1006
- company = companies(:first_firm)
1007
- assert !company.clients.loaded?
1008
- assert_equal [companies(:first_client).id, companies(:second_client).id], company.client_ids
1009
- assert !company.clients.loaded?
1010
- end
1011
-
1012
- def test_get_ids_for_unloaded_finder_sql_associations_loads_them
1013
- company = companies(:first_firm)
1014
- assert !company.clients_using_sql.loaded?
1015
- assert_equal [companies(:second_client).id], company.clients_using_sql_ids
1016
- assert company.clients_using_sql.loaded?
1017
- end
1018
-
1019
- def test_assign_ids_ignoring_blanks
1020
- firm = Firm.create!(:name => 'Apple')
1021
- firm.client_ids = [companies(:first_client).id, nil, companies(:second_client).id, '']
1022
- firm.save!
1023
-
1024
- assert_equal 2, firm.clients(true).size
1025
- assert firm.clients.include?(companies(:second_client))
1026
- end
1027
-
1028
- def test_get_ids_for_through
1029
- assert_equal [comments(:eager_other_comment1).id], authors(:mary).comment_ids
1030
- end
1031
-
1032
- def test_modifying_a_through_a_has_many_should_raise
1033
- [
1034
- lambda { authors(:mary).comment_ids = [comments(:greetings).id, comments(:more_greetings).id] },
1035
- lambda { authors(:mary).comments = [comments(:greetings), comments(:more_greetings)] },
1036
- lambda { authors(:mary).comments << Comment.create!(:body => "Yay", :post_id => 424242) },
1037
- lambda { authors(:mary).comments.delete(authors(:mary).comments.first) },
1038
- ].each {|block| assert_raise(ActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection, &block) }
1039
- end
1040
-
1041
- def test_dynamic_find_should_respect_association_order_for_through
1042
- assert_equal Comment.find(10), authors(:david).comments_desc.find(:first, :conditions => "comments.type = 'SpecialComment'")
1043
- assert_equal Comment.find(10), authors(:david).comments_desc.find_by_type('SpecialComment')
1044
- end
1045
-
1046
- def test_dynamic_find_order_should_override_association_order_for_through
1047
- assert_equal Comment.find(3), authors(:david).comments_desc.find(:first, :conditions => "comments.type = 'SpecialComment'", :order => 'comments.id')
1048
- assert_equal Comment.find(3), authors(:david).comments_desc.find_by_type('SpecialComment', :order => 'comments.id')
1049
- end
1050
-
1051
- def test_dynamic_find_all_should_respect_association_order_for_through
1052
- assert_equal [Comment.find(10), Comment.find(7), Comment.find(6), Comment.find(3)], authors(:david).comments_desc.find(:all, :conditions => "comments.type = 'SpecialComment'")
1053
- assert_equal [Comment.find(10), Comment.find(7), Comment.find(6), Comment.find(3)], authors(:david).comments_desc.find_all_by_type('SpecialComment')
1054
- end
1055
-
1056
- def test_dynamic_find_all_order_should_override_association_order_for_through
1057
- assert_equal [Comment.find(3), Comment.find(6), Comment.find(7), Comment.find(10)], authors(:david).comments_desc.find(:all, :conditions => "comments.type = 'SpecialComment'", :order => 'comments.id')
1058
- assert_equal [Comment.find(3), Comment.find(6), Comment.find(7), Comment.find(10)], authors(:david).comments_desc.find_all_by_type('SpecialComment', :order => 'comments.id')
1059
- end
1060
-
1061
- def test_dynamic_find_all_should_respect_association_limit_for_through
1062
- assert_equal 1, authors(:david).limited_comments.find(:all, :conditions => "comments.type = 'SpecialComment'").length
1063
- assert_equal 1, authors(:david).limited_comments.find_all_by_type('SpecialComment').length
1064
- end
1065
-
1066
- def test_dynamic_find_all_order_should_override_association_limit_for_through
1067
- assert_equal 4, authors(:david).limited_comments.find(:all, :conditions => "comments.type = 'SpecialComment'", :limit => 9_000).length
1068
- assert_equal 4, authors(:david).limited_comments.find_all_by_type('SpecialComment', :limit => 9_000).length
1069
- end
1070
-
1071
- def test_find_all_include_over_the_same_table_for_through
1072
- assert_equal 2, people(:michael).posts.find(:all, :include => :people).length
1073
- end
1074
-
1075
- def test_has_many_through_respects_hash_conditions
1076
- assert_equal authors(:david).hello_posts, authors(:david).hello_posts_with_hash_conditions
1077
- assert_equal authors(:david).hello_post_comments, authors(:david).hello_post_comments_with_hash_conditions
1078
- end
1079
-
1080
- def test_include_uses_array_include_after_loaded
1081
- firm = companies(:first_firm)
1082
- firm.clients.class # force load target
1083
-
1084
- client = firm.clients.first
1085
-
1086
- assert_no_queries do
1087
- assert firm.clients.loaded?
1088
- assert firm.clients.include?(client)
1089
- end
1090
- end
1091
-
1092
- def test_include_checks_if_record_exists_if_target_not_loaded
1093
- firm = companies(:first_firm)
1094
- client = firm.clients.first
1095
-
1096
- firm.reload
1097
- assert ! firm.clients.loaded?
1098
- assert_queries(1) do
1099
- assert firm.clients.include?(client)
1100
- end
1101
- assert ! firm.clients.loaded?
1102
- end
1103
-
1104
- def test_include_loads_collection_if_target_uses_finder_sql
1105
- firm = companies(:first_firm)
1106
- client = firm.clients_using_sql.first
1107
-
1108
- firm.reload
1109
- assert ! firm.clients_using_sql.loaded?
1110
- assert firm.clients_using_sql.include?(client)
1111
- assert firm.clients_using_sql.loaded?
1112
- end
1113
-
1114
-
1115
- def test_include_returns_false_for_non_matching_record_to_verify_scoping
1116
- firm = companies(:first_firm)
1117
- client = Client.create!(:name => 'Not Associated')
1118
-
1119
- assert ! firm.clients.loaded?
1120
- assert ! firm.clients.include?(client)
1121
- end
1122
-
1123
- def test_calling_first_or_last_on_association_should_not_load_association
1124
- firm = companies(:first_firm)
1125
- firm.clients.first
1126
- firm.clients.last
1127
- assert !firm.clients.loaded?
1128
- end
1129
-
1130
- def test_calling_first_or_last_on_loaded_association_should_not_fetch_with_query
1131
- firm = companies(:first_firm)
1132
- firm.clients.class # force load target
1133
- assert firm.clients.loaded?
1134
-
1135
- assert_no_queries do
1136
- firm.clients.first
1137
- assert_equal 2, firm.clients.first(2).size
1138
- firm.clients.last
1139
- assert_equal 2, firm.clients.last(2).size
1140
- end
1141
- end
1142
-
1143
- def test_calling_first_or_last_on_existing_record_with_build_should_load_association
1144
- firm = companies(:first_firm)
1145
- firm.clients.build(:name => 'Foo')
1146
- assert !firm.clients.loaded?
1147
-
1148
- assert_queries 1 do
1149
- firm.clients.first
1150
- firm.clients.last
1151
- end
1152
-
1153
- assert firm.clients.loaded?
1154
- end
1155
-
1156
- def test_calling_first_or_last_on_existing_record_with_create_should_not_load_association
1157
- firm = companies(:first_firm)
1158
- firm.clients.create(:name => 'Foo')
1159
- assert !firm.clients.loaded?
1160
-
1161
- assert_queries 2 do
1162
- firm.clients.first
1163
- firm.clients.last
1164
- end
1165
-
1166
- assert !firm.clients.loaded?
1167
- end
1168
-
1169
- def test_calling_first_or_last_on_new_record_should_not_run_queries
1170
- firm = Firm.new
1171
-
1172
- assert_no_queries do
1173
- firm.clients.first
1174
- firm.clients.last
1175
- end
1176
- end
1177
-
1178
- def test_calling_first_or_last_with_find_options_on_loaded_association_should_fetch_with_query
1179
- firm = companies(:first_firm)
1180
- firm.clients.class # force load target
1181
-
1182
- assert_queries 2 do
1183
- assert firm.clients.loaded?
1184
- firm.clients.first(:order => 'name')
1185
- firm.clients.last(:order => 'name')
1186
- end
1187
- end
1188
-
1189
- def test_calling_first_or_last_with_integer_on_association_should_load_association
1190
- firm = companies(:first_firm)
1191
-
1192
- assert_queries 1 do
1193
- firm.clients.first(2)
1194
- firm.clients.last(2)
1195
- end
1196
-
1197
- assert firm.clients.loaded?
1198
- end
1199
-
1200
- def test_joins_with_namespaced_model_should_use_correct_type
1201
- old = ActiveRecord::Base.store_full_sti_class
1202
- ActiveRecord::Base.store_full_sti_class = true
1203
-
1204
- firm = Namespaced::Firm.create({ :name => 'Some Company' })
1205
- firm.clients.create({ :name => 'Some Client' })
1206
-
1207
- stats = Namespaced::Firm.find(firm.id, {
1208
- :select => "#{Namespaced::Firm.table_name}.id, COUNT(#{Namespaced::Client.table_name}.id) AS num_clients",
1209
- :joins => :clients,
1210
- :group => "#{Namespaced::Firm.table_name}.id"
1211
- })
1212
- assert_equal 1, stats.num_clients.to_i
1213
-
1214
- ensure
1215
- ActiveRecord::Base.store_full_sti_class = old
1216
- end
1217
-
1218
- def test_association_proxy_transaction_method_starts_transaction_in_association_class
1219
- Comment.expects(:transaction)
1220
- Post.find(:first).comments.transaction do
1221
- # nothing
1222
- end
1223
- end
1224
-
1225
- def test_sending_new_to_association_proxy_should_have_same_effect_as_calling_new
1226
- client_association = companies(:first_firm).clients
1227
- assert_equal client_association.new.attributes, client_association.send(:new).attributes
1228
- end
1229
-
1230
- def test_respond_to_private_class_methods
1231
- client_association = companies(:first_firm).clients
1232
- assert !client_association.respond_to?(:private_method)
1233
- assert client_association.respond_to?(:private_method, true)
1234
- end
1235
-
1236
- def test_creating_using_primary_key
1237
- firm = Firm.find(:first)
1238
- client = firm.clients_using_primary_key.create!(:name => 'test')
1239
- assert_equal firm.name, client.firm_name
1240
- end
1241
-
1242
- def test_normal_method_call_in_association_proxy
1243
- assert_equal 'Welcome to the weblog', Comment.all.map { |comment| comment.post }.sort_by(&:id).first.title
1244
- end
1245
-
1246
- def test_instance_eval_in_association_proxy
1247
- assert_equal 'Welcome to the weblog', Comment.all.map { |comment| comment.post }.sort_by(&:id).first.instance_eval{title}
1248
- end
1249
-
1250
- def test_defining_has_many_association_with_delete_all_dependency_lazily_evaluates_target_class
1251
- ActiveRecord::Reflection::AssociationReflection.any_instance.expects(:class_name).never
1252
- class_eval <<-EOF
1253
- class DeleteAllModel < ActiveRecord::Base
1254
- has_many :nonentities, :dependent => :delete_all
1255
- end
1256
- EOF
1257
- end
1258
-
1259
- def test_defining_has_many_association_with_nullify_dependency_lazily_evaluates_target_class
1260
- ActiveRecord::Reflection::AssociationReflection.any_instance.expects(:class_name).never
1261
- class_eval <<-EOF
1262
- class NullifyModel < ActiveRecord::Base
1263
- has_many :nonentities, :dependent => :nullify
1264
- end
1265
- EOF
1266
- end
1267
-
1268
- def test_include_method_in_has_many_association_should_return_true_for_instance_added_with_build
1269
- post = Post.new
1270
- comment = post.comments.build
1271
- assert post.comments.include?(comment)
1272
- end
1273
- end