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,827 +0,0 @@
1
- require "cases/helper"
2
- require 'models/developer'
3
- require 'models/project'
4
- require 'models/company'
5
- require 'models/topic'
6
- require 'models/reply'
7
- require 'models/computer'
8
- require 'models/customer'
9
- require 'models/order'
10
- require 'models/categorization'
11
- require 'models/category'
12
- require 'models/post'
13
- require 'models/author'
14
- require 'models/comment'
15
- require 'models/tag'
16
- require 'models/tagging'
17
- require 'models/person'
18
- require 'models/reader'
19
- require 'models/parrot'
20
- require 'models/pirate'
21
- require 'models/treasure'
22
- require 'models/price_estimate'
23
- require 'models/club'
24
- require 'models/member'
25
- require 'models/membership'
26
- require 'models/sponsor'
27
-
28
- class ProjectWithAfterCreateHook < ActiveRecord::Base
29
- set_table_name 'projects'
30
- has_and_belongs_to_many :developers,
31
- :class_name => "DeveloperForProjectWithAfterCreateHook",
32
- :join_table => "developers_projects",
33
- :foreign_key => "project_id",
34
- :association_foreign_key => "developer_id"
35
-
36
- after_create :add_david
37
-
38
- def add_david
39
- david = DeveloperForProjectWithAfterCreateHook.find_by_name('David')
40
- david.projects << self
41
- end
42
- end
43
-
44
- class DeveloperForProjectWithAfterCreateHook < ActiveRecord::Base
45
- set_table_name 'developers'
46
- has_and_belongs_to_many :projects,
47
- :class_name => "ProjectWithAfterCreateHook",
48
- :join_table => "developers_projects",
49
- :association_foreign_key => "project_id",
50
- :foreign_key => "developer_id"
51
- end
52
-
53
- class ProjectWithSymbolsForKeys < ActiveRecord::Base
54
- set_table_name 'projects'
55
- has_and_belongs_to_many :developers,
56
- :class_name => "DeveloperWithSymbolsForKeys",
57
- :join_table => :developers_projects,
58
- :foreign_key => :project_id,
59
- :association_foreign_key => "developer_id"
60
- end
61
-
62
- class DeveloperWithSymbolsForKeys < ActiveRecord::Base
63
- set_table_name 'developers'
64
- has_and_belongs_to_many :projects,
65
- :class_name => "ProjectWithSymbolsForKeys",
66
- :join_table => :developers_projects,
67
- :association_foreign_key => :project_id,
68
- :foreign_key => "developer_id"
69
- end
70
-
71
- class DeveloperWithCounterSQL < ActiveRecord::Base
72
- set_table_name 'developers'
73
- has_and_belongs_to_many :projects,
74
- :class_name => "DeveloperWithCounterSQL",
75
- :join_table => "developers_projects",
76
- :association_foreign_key => "project_id",
77
- :foreign_key => "developer_id",
78
- :counter_sql => 'SELECT COUNT(*) AS count_all FROM projects INNER JOIN developers_projects ON projects.id = developers_projects.project_id WHERE developers_projects.developer_id =#{id}'
79
- end
80
-
81
- class HasAndBelongsToManyAssociationsTest < ActiveRecord::TestCase
82
- fixtures :accounts, :companies, :categories, :posts, :categories_posts, :developers, :projects, :developers_projects,
83
- :parrots, :pirates, :treasures, :price_estimates, :tags, :taggings
84
-
85
- def test_has_and_belongs_to_many
86
- david = Developer.find(1)
87
-
88
- assert !david.projects.empty?
89
- assert_equal 2, david.projects.size
90
-
91
- active_record = Project.find(1)
92
- assert !active_record.developers.empty?
93
- assert_equal 3, active_record.developers.size
94
- assert active_record.developers.include?(david)
95
- end
96
-
97
- def test_triple_equality
98
- assert !(Array === Developer.find(1).projects)
99
- assert Developer.find(1).projects === Array
100
- end
101
-
102
- def test_adding_single
103
- jamis = Developer.find(2)
104
- jamis.projects.reload # causing the collection to load
105
- action_controller = Project.find(2)
106
- assert_equal 1, jamis.projects.size
107
- assert_equal 1, action_controller.developers.size
108
-
109
- jamis.projects << action_controller
110
-
111
- assert_equal 2, jamis.projects.size
112
- assert_equal 2, jamis.projects(true).size
113
- assert_equal 2, action_controller.developers(true).size
114
- end
115
-
116
- def test_adding_type_mismatch
117
- jamis = Developer.find(2)
118
- assert_raise(ActiveRecord::AssociationTypeMismatch) { jamis.projects << nil }
119
- assert_raise(ActiveRecord::AssociationTypeMismatch) { jamis.projects << 1 }
120
- end
121
-
122
- def test_adding_from_the_project
123
- jamis = Developer.find(2)
124
- action_controller = Project.find(2)
125
- action_controller.developers.reload
126
- assert_equal 1, jamis.projects.size
127
- assert_equal 1, action_controller.developers.size
128
-
129
- action_controller.developers << jamis
130
-
131
- assert_equal 2, jamis.projects(true).size
132
- assert_equal 2, action_controller.developers.size
133
- assert_equal 2, action_controller.developers(true).size
134
- end
135
-
136
- def test_adding_from_the_project_fixed_timestamp
137
- jamis = Developer.find(2)
138
- action_controller = Project.find(2)
139
- action_controller.developers.reload
140
- assert_equal 1, jamis.projects.size
141
- assert_equal 1, action_controller.developers.size
142
- updated_at = jamis.updated_at
143
-
144
- action_controller.developers << jamis
145
-
146
- assert_equal updated_at, jamis.updated_at
147
- assert_equal 2, jamis.projects(true).size
148
- assert_equal 2, action_controller.developers.size
149
- assert_equal 2, action_controller.developers(true).size
150
- end
151
-
152
- def test_adding_multiple
153
- aredridel = Developer.new("name" => "Aredridel")
154
- aredridel.save
155
- aredridel.projects.reload
156
- aredridel.projects.push(Project.find(1), Project.find(2))
157
- assert_equal 2, aredridel.projects.size
158
- assert_equal 2, aredridel.projects(true).size
159
- end
160
-
161
- def test_adding_a_collection
162
- aredridel = Developer.new("name" => "Aredridel")
163
- aredridel.save
164
- aredridel.projects.reload
165
- aredridel.projects.concat([Project.find(1), Project.find(2)])
166
- assert_equal 2, aredridel.projects.size
167
- assert_equal 2, aredridel.projects(true).size
168
- end
169
-
170
- def test_adding_uses_default_values_on_join_table
171
- ac = projects(:action_controller)
172
- assert !developers(:jamis).projects.include?(ac)
173
- developers(:jamis).projects << ac
174
-
175
- assert developers(:jamis, :reload).projects.include?(ac)
176
- project = developers(:jamis).projects.detect { |p| p == ac }
177
- assert_equal 1, project.access_level.to_i
178
- end
179
-
180
- def test_habtm_attribute_access_and_respond_to
181
- project = developers(:jamis).projects[0]
182
- assert project.has_attribute?("name")
183
- assert project.has_attribute?("joined_on")
184
- assert project.has_attribute?("access_level")
185
- assert project.respond_to?("name")
186
- assert project.respond_to?("name=")
187
- assert project.respond_to?("name?")
188
- assert project.respond_to?("joined_on")
189
- # given that the 'join attribute' won't be persisted, I don't
190
- # think we should define the mutators
191
- #assert project.respond_to?("joined_on=")
192
- assert project.respond_to?("joined_on?")
193
- assert project.respond_to?("access_level")
194
- #assert project.respond_to?("access_level=")
195
- assert project.respond_to?("access_level?")
196
- end
197
-
198
- def test_habtm_adding_before_save
199
- no_of_devels = Developer.count
200
- no_of_projects = Project.count
201
- aredridel = Developer.new("name" => "Aredridel")
202
- aredridel.projects.concat([Project.find(1), p = Project.new("name" => "Projekt")])
203
- assert aredridel.new_record?
204
- assert p.new_record?
205
- assert aredridel.save
206
- assert !aredridel.new_record?
207
- assert_equal no_of_devels+1, Developer.count
208
- assert_equal no_of_projects+1, Project.count
209
- assert_equal 2, aredridel.projects.size
210
- assert_equal 2, aredridel.projects(true).size
211
- end
212
-
213
- def test_habtm_saving_multiple_relationships
214
- new_project = Project.new("name" => "Grimetime")
215
- amount_of_developers = 4
216
- developers = (0...amount_of_developers).collect {|i| Developer.create(:name => "JME #{i}") }.reverse
217
-
218
- new_project.developer_ids = [developers[0].id, developers[1].id]
219
- new_project.developers_with_callback_ids = [developers[2].id, developers[3].id]
220
- assert new_project.save
221
-
222
- new_project.reload
223
- assert_equal amount_of_developers, new_project.developers.size
224
- assert_equal developers, new_project.developers
225
- end
226
-
227
- def test_habtm_unique_order_preserved
228
- assert_equal developers(:poor_jamis, :jamis, :david), projects(:active_record).non_unique_developers
229
- assert_equal developers(:poor_jamis, :jamis, :david), projects(:active_record).developers
230
- end
231
-
232
- def test_build
233
- devel = Developer.find(1)
234
- proj = assert_no_queries { devel.projects.build("name" => "Projekt") }
235
- assert !devel.projects.loaded?
236
-
237
- assert_equal devel.projects.last, proj
238
- assert devel.projects.loaded?
239
-
240
- assert proj.new_record?
241
- devel.save
242
- assert !proj.new_record?
243
- assert_equal devel.projects.last, proj
244
- assert_equal Developer.find(1).projects.sort_by(&:id).last, proj # prove join table is updated
245
- end
246
-
247
- def test_build_by_new_record
248
- devel = Developer.new(:name => "Marcel", :salary => 75000)
249
- proj1 = devel.projects.build(:name => "Make bed")
250
- proj2 = devel.projects.build(:name => "Lie in it")
251
- assert_equal devel.projects.last, proj2
252
- assert proj2.new_record?
253
- devel.save
254
- assert !devel.new_record?
255
- assert !proj2.new_record?
256
- assert_equal devel.projects.last, proj2
257
- assert_equal Developer.find_by_name("Marcel").projects.last, proj2 # prove join table is updated
258
- end
259
-
260
- def test_create
261
- devel = Developer.find(1)
262
- proj = devel.projects.create("name" => "Projekt")
263
- assert !devel.projects.loaded?
264
-
265
- assert_equal devel.projects.last, proj
266
- assert !devel.projects.loaded?
267
-
268
- assert !proj.new_record?
269
- assert_equal Developer.find(1).projects.sort_by(&:id).last, proj # prove join table is updated
270
- end
271
-
272
- def test_create_by_new_record
273
- devel = Developer.new(:name => "Marcel", :salary => 75000)
274
- proj1 = devel.projects.build(:name => "Make bed")
275
- proj2 = devel.projects.build(:name => "Lie in it")
276
- assert_equal devel.projects.last, proj2
277
- assert proj2.new_record?
278
- devel.save
279
- assert !devel.new_record?
280
- assert !proj2.new_record?
281
- assert_equal devel.projects.last, proj2
282
- assert_equal Developer.find_by_name("Marcel").projects.last, proj2 # prove join table is updated
283
- end
284
-
285
- def test_creation_respects_hash_condition
286
- post = categories(:general).post_with_conditions.build(:body => '')
287
-
288
- assert post.save
289
- assert_equal 'Yet Another Testing Title', post.title
290
-
291
- another_post = categories(:general).post_with_conditions.create(:body => '')
292
-
293
- assert !another_post.new_record?
294
- assert_equal 'Yet Another Testing Title', another_post.title
295
- end
296
-
297
- def test_uniq_after_the_fact
298
- dev = developers(:jamis)
299
- dev.projects << projects(:active_record)
300
- dev.projects << projects(:active_record)
301
-
302
- assert_equal 3, dev.projects.size
303
- assert_equal 1, dev.projects.uniq.size
304
- end
305
-
306
- def test_uniq_before_the_fact
307
- projects(:active_record).developers << developers(:jamis)
308
- projects(:active_record).developers << developers(:david)
309
- assert_equal 3, projects(:active_record, :reload).developers.size
310
- end
311
-
312
- def test_uniq_option_prevents_duplicate_push
313
- project = projects(:active_record)
314
- project.developers << developers(:jamis)
315
- project.developers << developers(:david)
316
- assert_equal 3, project.developers.size
317
-
318
- project.developers << developers(:david)
319
- project.developers << developers(:jamis)
320
- assert_equal 3, project.developers.size
321
- end
322
-
323
- def test_deleting
324
- david = Developer.find(1)
325
- active_record = Project.find(1)
326
- david.projects.reload
327
- assert_equal 2, david.projects.size
328
- assert_equal 3, active_record.developers.size
329
-
330
- david.projects.delete(active_record)
331
-
332
- assert_equal 1, david.projects.size
333
- assert_equal 1, david.projects(true).size
334
- assert_equal 2, active_record.developers(true).size
335
- end
336
-
337
- def test_deleting_array
338
- david = Developer.find(1)
339
- david.projects.reload
340
- david.projects.delete(Project.find(:all))
341
- assert_equal 0, david.projects.size
342
- assert_equal 0, david.projects(true).size
343
- end
344
-
345
- def test_deleting_with_sql
346
- david = Developer.find(1)
347
- active_record = Project.find(1)
348
- active_record.developers.reload
349
- assert_equal 3, active_record.developers_by_sql.size
350
-
351
- active_record.developers_by_sql.delete(david)
352
- assert_equal 2, active_record.developers_by_sql(true).size
353
- end
354
-
355
- def test_deleting_array_with_sql
356
- active_record = Project.find(1)
357
- active_record.developers.reload
358
- assert_equal 3, active_record.developers_by_sql.size
359
-
360
- active_record.developers_by_sql.delete(Developer.find(:all))
361
- assert_equal 0, active_record.developers_by_sql(true).size
362
- end
363
-
364
- def test_deleting_all
365
- david = Developer.find(1)
366
- david.projects.reload
367
- david.projects.clear
368
- assert_equal 0, david.projects.size
369
- assert_equal 0, david.projects(true).size
370
- end
371
-
372
- def test_removing_associations_on_destroy
373
- david = DeveloperWithBeforeDestroyRaise.find(1)
374
- assert !david.projects.empty?
375
- assert_nothing_raised { david.destroy }
376
- assert david.projects.empty?
377
- assert DeveloperWithBeforeDestroyRaise.connection.select_all("SELECT * FROM developers_projects WHERE developer_id = 1").empty?
378
- end
379
-
380
- def test_additional_columns_from_join_table
381
- assert_date_from_db Date.new(2004, 10, 10), Developer.find(1).projects.first.joined_on.to_date
382
- end
383
-
384
- def test_destroying
385
- david = Developer.find(1)
386
- active_record = Project.find(1)
387
- david.projects.reload
388
- assert_equal 2, david.projects.size
389
- assert_equal 3, active_record.developers.size
390
-
391
- assert_difference "Project.count", -1 do
392
- david.projects.destroy(active_record)
393
- end
394
-
395
- assert_equal 1, david.reload.projects.size
396
- assert_equal 1, david.projects(true).size
397
- end
398
-
399
- def test_destroying_array
400
- david = Developer.find(1)
401
- david.projects.reload
402
-
403
- assert_difference "Project.count", -Project.count do
404
- david.projects.destroy(Project.find(:all))
405
- end
406
-
407
- assert_equal 0, david.reload.projects.size
408
- assert_equal 0, david.projects(true).size
409
- end
410
-
411
- def test_destroy_all
412
- david = Developer.find(1)
413
- david.projects.reload
414
- assert !david.projects.empty?
415
- david.projects.destroy_all
416
- assert david.projects.empty?
417
- assert david.projects(true).empty?
418
- end
419
-
420
- def test_deprecated_push_with_attributes_was_removed
421
- jamis = developers(:jamis)
422
- assert_raise(NoMethodError) do
423
- jamis.projects.push_with_attributes(projects(:action_controller), :joined_on => Date.today)
424
- end
425
- end
426
-
427
- def test_associations_with_conditions
428
- assert_equal 3, projects(:active_record).developers.size
429
- assert_equal 1, projects(:active_record).developers_named_david.size
430
- assert_equal 1, projects(:active_record).developers_named_david_with_hash_conditions.size
431
-
432
- assert_equal developers(:david), projects(:active_record).developers_named_david.find(developers(:david).id)
433
- assert_equal developers(:david), projects(:active_record).developers_named_david_with_hash_conditions.find(developers(:david).id)
434
- assert_equal developers(:david), projects(:active_record).salaried_developers.find(developers(:david).id)
435
-
436
- projects(:active_record).developers_named_david.clear
437
- assert_equal 2, projects(:active_record, :reload).developers.size
438
- end
439
-
440
- def test_find_in_association
441
- # Using sql
442
- assert_equal developers(:david), projects(:active_record).developers.find(developers(:david).id), "SQL find"
443
-
444
- # Using ruby
445
- active_record = projects(:active_record)
446
- active_record.developers.reload
447
- assert_equal developers(:david), active_record.developers.find(developers(:david).id), "Ruby find"
448
- end
449
-
450
- def test_include_uses_array_include_after_loaded
451
- project = projects(:active_record)
452
- project.developers.class # force load target
453
-
454
- developer = project.developers.first
455
-
456
- assert_no_queries do
457
- assert project.developers.loaded?
458
- assert project.developers.include?(developer)
459
- end
460
- end
461
-
462
- def test_include_checks_if_record_exists_if_target_not_loaded
463
- project = projects(:active_record)
464
- developer = project.developers.first
465
-
466
- project.reload
467
- assert ! project.developers.loaded?
468
- assert_queries(1) do
469
- assert project.developers.include?(developer)
470
- end
471
- assert ! project.developers.loaded?
472
- end
473
-
474
- def test_include_returns_false_for_non_matching_record_to_verify_scoping
475
- project = projects(:active_record)
476
- developer = Developer.create :name => "Bryan", :salary => 50_000
477
-
478
- assert ! project.developers.loaded?
479
- assert ! project.developers.include?(developer)
480
- end
481
-
482
- def test_find_in_association_with_custom_finder_sql
483
- assert_equal developers(:david), projects(:active_record).developers_with_finder_sql.find(developers(:david).id), "SQL find"
484
-
485
- active_record = projects(:active_record)
486
- active_record.developers_with_finder_sql.reload
487
- assert_equal developers(:david), active_record.developers_with_finder_sql.find(developers(:david).id), "Ruby find"
488
- end
489
-
490
- def test_find_in_association_with_custom_finder_sql_and_multiple_interpolations
491
- # interpolate once:
492
- assert_equal [developers(:david), developers(:jamis), developers(:poor_jamis)], projects(:active_record).developers_with_finder_sql, "first interpolation"
493
- # interpolate again, for a different project id
494
- assert_equal [developers(:david)], projects(:action_controller).developers_with_finder_sql, "second interpolation"
495
- end
496
-
497
- def test_find_in_association_with_custom_finder_sql_and_string_id
498
- assert_equal developers(:david), projects(:active_record).developers_with_finder_sql.find(developers(:david).id.to_s), "SQL find"
499
- end
500
-
501
- def test_find_with_merged_options
502
- assert_equal 1, projects(:active_record).limited_developers.size
503
- assert_equal 1, projects(:active_record).limited_developers.find(:all).size
504
- assert_equal 3, projects(:active_record).limited_developers.find(:all, :limit => nil).size
505
- end
506
-
507
- def test_dynamic_find_should_respect_association_order
508
- # Developers are ordered 'name DESC, id DESC'
509
- low_id_jamis = developers(:jamis)
510
- middle_id_jamis = developers(:poor_jamis)
511
- high_id_jamis = projects(:active_record).developers.create(:name => 'Jamis')
512
-
513
- assert_equal high_id_jamis, projects(:active_record).developers.find(:first, :conditions => "name = 'Jamis'")
514
- assert_equal high_id_jamis, projects(:active_record).developers.find_by_name('Jamis')
515
- end
516
-
517
- def test_dynamic_find_order_should_override_association_order
518
- # Developers are ordered 'name DESC, id DESC'
519
- low_id_jamis = developers(:jamis)
520
- middle_id_jamis = developers(:poor_jamis)
521
- high_id_jamis = projects(:active_record).developers.create(:name => 'Jamis')
522
-
523
- assert_equal low_id_jamis, projects(:active_record).developers.find(:first, :conditions => "name = 'Jamis'", :order => 'id')
524
- assert_equal low_id_jamis, projects(:active_record).developers.find_by_name('Jamis', :order => 'id')
525
- end
526
-
527
- def test_dynamic_find_all_should_respect_association_order
528
- # Developers are ordered 'name DESC, id DESC'
529
- low_id_jamis = developers(:jamis)
530
- middle_id_jamis = developers(:poor_jamis)
531
- high_id_jamis = projects(:active_record).developers.create(:name => 'Jamis')
532
-
533
- assert_equal [high_id_jamis, middle_id_jamis, low_id_jamis], projects(:active_record).developers.find(:all, :conditions => "name = 'Jamis'")
534
- assert_equal [high_id_jamis, middle_id_jamis, low_id_jamis], projects(:active_record).developers.find_all_by_name('Jamis')
535
- end
536
-
537
- def test_dynamic_find_all_order_should_override_association_order
538
- # Developers are ordered 'name DESC, id DESC'
539
- low_id_jamis = developers(:jamis)
540
- middle_id_jamis = developers(:poor_jamis)
541
- high_id_jamis = projects(:active_record).developers.create(:name => 'Jamis')
542
-
543
- assert_equal [low_id_jamis, middle_id_jamis, high_id_jamis], projects(:active_record).developers.find(:all, :conditions => "name = 'Jamis'", :order => 'id')
544
- assert_equal [low_id_jamis, middle_id_jamis, high_id_jamis], projects(:active_record).developers.find_all_by_name('Jamis', :order => 'id')
545
- end
546
-
547
- def test_dynamic_find_all_should_respect_association_limit
548
- assert_equal 1, projects(:active_record).limited_developers.find(:all, :conditions => "name = 'Jamis'").length
549
- assert_equal 1, projects(:active_record).limited_developers.find_all_by_name('Jamis').length
550
- end
551
-
552
- def test_dynamic_find_all_order_should_override_association_limit
553
- assert_equal 2, projects(:active_record).limited_developers.find(:all, :conditions => "name = 'Jamis'", :limit => 9_000).length
554
- assert_equal 2, projects(:active_record).limited_developers.find_all_by_name('Jamis', :limit => 9_000).length
555
- end
556
-
557
- def test_dynamic_find_all_should_respect_readonly_access
558
- projects(:active_record).readonly_developers.each { |d| assert_raise(ActiveRecord::ReadOnlyRecord) { d.save! } if d.valid?}
559
- projects(:active_record).readonly_developers.each { |d| d.readonly? }
560
- end
561
-
562
- def test_new_with_values_in_collection
563
- jamis = DeveloperForProjectWithAfterCreateHook.find_by_name('Jamis')
564
- david = DeveloperForProjectWithAfterCreateHook.find_by_name('David')
565
- project = ProjectWithAfterCreateHook.new(:name => "Cooking with Bertie")
566
- project.developers << jamis
567
- project.save!
568
- project.reload
569
-
570
- assert project.developers.include?(jamis)
571
- assert project.developers.include?(david)
572
- end
573
-
574
- def test_find_in_association_with_options
575
- developers = projects(:active_record).developers.find(:all)
576
- assert_equal 3, developers.size
577
-
578
- assert_equal developers(:poor_jamis), projects(:active_record).developers.find(:first, :conditions => "salary < 10000")
579
- assert_equal developers(:jamis), projects(:active_record).developers.find(:first, :order => "salary DESC")
580
- end
581
-
582
- def test_replace_with_less
583
- david = developers(:david)
584
- david.projects = [projects(:action_controller)]
585
- assert david.save
586
- assert_equal 1, david.projects.length
587
- end
588
-
589
- def test_replace_with_new
590
- david = developers(:david)
591
- david.projects = [projects(:action_controller), Project.new("name" => "ActionWebSearch")]
592
- david.save
593
- assert_equal 2, david.projects.length
594
- assert !david.projects.include?(projects(:active_record))
595
- end
596
-
597
- def test_replace_on_new_object
598
- new_developer = Developer.new("name" => "Matz")
599
- new_developer.projects = [projects(:action_controller), Project.new("name" => "ActionWebSearch")]
600
- new_developer.save
601
- assert_equal 2, new_developer.projects.length
602
- end
603
-
604
- def test_consider_type
605
- developer = Developer.find(:first)
606
- special_project = SpecialProject.create("name" => "Special Project")
607
-
608
- other_project = developer.projects.first
609
- developer.special_projects << special_project
610
- developer.reload
611
-
612
- assert developer.projects.include?(special_project)
613
- assert developer.special_projects.include?(special_project)
614
- assert !developer.special_projects.include?(other_project)
615
- end
616
-
617
- def test_update_attributes_after_push_without_duplicate_join_table_rows
618
- developer = Developer.new("name" => "Kano")
619
- project = SpecialProject.create("name" => "Special Project")
620
- assert developer.save
621
- developer.projects << project
622
- developer.update_attribute("name", "Bruza")
623
- assert_equal 1, Developer.connection.select_value(<<-end_sql).to_i
624
- SELECT count(*) FROM developers_projects
625
- WHERE project_id = #{project.id}
626
- AND developer_id = #{developer.id}
627
- end_sql
628
- end
629
-
630
- def test_updating_attributes_on_non_rich_associations
631
- welcome = categories(:technology).posts.first
632
- welcome.title = "Something else"
633
- assert welcome.save!
634
- end
635
-
636
- def test_habtm_respects_select
637
- categories(:technology).select_testing_posts(true).each do |o|
638
- assert_respond_to o, :correctness_marker
639
- end
640
- assert_respond_to categories(:technology).select_testing_posts.find(:first), :correctness_marker
641
- end
642
-
643
- def test_updating_attributes_on_rich_associations
644
- david = projects(:action_controller).developers.first
645
- david.name = "DHH"
646
- assert_raise(ActiveRecord::ReadOnlyRecord) { david.save! }
647
- end
648
-
649
- def test_updating_attributes_on_rich_associations_with_limited_find_from_reflection
650
- david = projects(:action_controller).selected_developers.first
651
- david.name = "DHH"
652
- assert_nothing_raised { david.save! }
653
- end
654
-
655
-
656
- def test_updating_attributes_on_rich_associations_with_limited_find
657
- david = projects(:action_controller).developers.find(:all, :select => "developers.*").first
658
- david.name = "DHH"
659
- assert david.save!
660
- end
661
-
662
- def test_join_table_alias
663
- assert_equal 3, Developer.find(:all, :include => {:projects => :developers}, :conditions => 'developers_projects_join.joined_on IS NOT NULL').size
664
- end
665
-
666
- def test_join_with_group
667
- group = Developer.columns.inject([]) do |g, c|
668
- g << "developers.#{c.name}"
669
- g << "developers_projects_2.#{c.name}"
670
- end
671
- Project.columns.each { |c| group << "projects.#{c.name}" }
672
-
673
- assert_equal 3, Developer.find(:all, :include => {:projects => :developers}, :conditions => 'developers_projects_join.joined_on IS NOT NULL', :group => group.join(",")).size
674
- end
675
-
676
- def test_find_grouped
677
- all_posts_from_category1 = Post.find(:all, :conditions => "category_id = 1", :joins => :categories)
678
- grouped_posts_of_category1 = Post.find(:all, :conditions => "category_id = 1", :group => "author_id", :select => 'count(posts.id) as posts_count', :joins => :categories)
679
- assert_equal 4, all_posts_from_category1.size
680
- assert_equal 1, grouped_posts_of_category1.size
681
- end
682
-
683
- def test_find_scoped_grouped
684
- assert_equal 4, categories(:general).posts_gruoped_by_title.size
685
- assert_equal 1, categories(:technology).posts_gruoped_by_title.size
686
- end
687
-
688
- def test_find_scoped_grouped_having
689
- assert_equal 2, projects(:active_record).well_payed_salary_groups.size
690
- assert projects(:active_record).well_payed_salary_groups.all? { |g| g.salary > 10000 }
691
- end
692
-
693
- def test_get_ids
694
- assert_equal projects(:active_record, :action_controller).map(&:id).sort, developers(:david).project_ids.sort
695
- assert_equal [projects(:active_record).id], developers(:jamis).project_ids
696
- end
697
-
698
- def test_get_ids_for_loaded_associations
699
- developer = developers(:david)
700
- developer.projects(true)
701
- assert_queries(0) do
702
- developer.project_ids
703
- developer.project_ids
704
- end
705
- end
706
-
707
- def test_get_ids_for_unloaded_associations_does_not_load_them
708
- developer = developers(:david)
709
- assert !developer.projects.loaded?
710
- assert_equal projects(:active_record, :action_controller).map(&:id).sort, developer.project_ids.sort
711
- assert !developer.projects.loaded?
712
- end
713
-
714
- def test_assign_ids
715
- developer = Developer.new("name" => "Joe")
716
- developer.project_ids = projects(:active_record, :action_controller).map(&:id)
717
- developer.save
718
- developer.reload
719
- assert_equal 2, developer.projects.length
720
- assert_equal [projects(:active_record), projects(:action_controller)].map(&:id).sort, developer.project_ids.sort
721
- end
722
-
723
- def test_assign_ids_ignoring_blanks
724
- developer = Developer.new("name" => "Joe")
725
- developer.project_ids = [projects(:active_record).id, nil, projects(:action_controller).id, '']
726
- developer.save
727
- developer.reload
728
- assert_equal 2, developer.projects.length
729
- assert_equal [projects(:active_record), projects(:action_controller)].map(&:id).sort, developer.project_ids.sort
730
- end
731
-
732
- def test_select_limited_ids_list
733
- # Set timestamps
734
- Developer.transaction do
735
- Developer.find(:all, :order => 'id').each_with_index do |record, i|
736
- record.update_attributes(:created_at => 5.years.ago + (i * 5.minutes))
737
- end
738
- end
739
-
740
- join_base = ActiveRecord::Associations::ClassMethods::JoinDependency::JoinBase.new(Project)
741
- join_dep = ActiveRecord::Associations::ClassMethods::JoinDependency.new(join_base, :developers, nil)
742
- projects = Project.send(:select_limited_ids_list, {:order => 'developers.created_at'}, join_dep)
743
- assert !projects.include?("'"), projects
744
- assert_equal %w(1 2), projects.scan(/\d/).sort
745
- end
746
-
747
- def test_scoped_find_on_through_association_doesnt_return_read_only_records
748
- tag = Post.find(1).tags.find_by_name("General")
749
-
750
- assert_nothing_raised do
751
- tag.save!
752
- end
753
- end
754
-
755
- def test_has_many_through_polymorphic_has_manys_works
756
- assert_equal [10, 20].to_set, pirates(:redbeard).treasure_estimates.map(&:price).to_set
757
- end
758
-
759
- def test_symbols_as_keys
760
- developer = DeveloperWithSymbolsForKeys.new(:name => 'David')
761
- project = ProjectWithSymbolsForKeys.new(:name => 'Rails Testing')
762
- project.developers << developer
763
- project.save!
764
-
765
- assert_equal 1, project.developers.size
766
- assert_equal 1, developer.projects.size
767
- assert_equal developer, project.developers.find(:first)
768
- assert_equal project, developer.projects.find(:first)
769
- end
770
-
771
- def test_self_referential_habtm_without_foreign_key_set_should_raise_exception
772
- assert_raise(ActiveRecord::HasAndBelongsToManyAssociationForeignKeyNeeded) {
773
- Member.class_eval do
774
- has_and_belongs_to_many :friends, :class_name => "Member", :join_table => "member_friends"
775
- end
776
- }
777
- end
778
-
779
- def test_dynamic_find_should_respect_association_include
780
- # SQL error in sort clause if :include is not included
781
- # due to Unknown column 'authors.id'
782
- assert Category.find(1).posts_with_authors_sorted_by_author_id.find_by_title('Welcome to the weblog')
783
- end
784
-
785
- def test_counting_on_habtm_association_and_not_array
786
- david = Developer.find(1)
787
- # Extra parameter just to make sure we aren't falling back to
788
- # Array#count in Ruby >=1.8.7, which would raise an ArgumentError
789
- assert_nothing_raised { david.projects.count(:all, :conditions => '1=1') }
790
- end
791
-
792
- def test_count
793
- david = Developer.find(1)
794
- assert_equal 2, david.projects.count
795
- end
796
-
797
- def test_count_with_counter_sql
798
- developer = DeveloperWithCounterSQL.create(:name => 'tekin')
799
- developer.project_ids = [projects(:active_record).id]
800
- developer.save
801
- developer.reload
802
- assert_equal 1, developer.projects.count
803
- end
804
-
805
- def test_association_proxy_transaction_method_starts_transaction_in_association_class
806
- Post.expects(:transaction)
807
- Category.find(:first).posts.transaction do
808
- # nothing
809
- end
810
- end
811
-
812
- def test_caching_of_columns
813
- david = Developer.find(1)
814
- # clear cache possibly created by other tests
815
- david.projects.reset_column_information
816
- assert_queries(0) { david.projects.columns; david.projects.columns }
817
- # and again to verify that reset_column_information clears the cache correctly
818
- david.projects.reset_column_information
819
- assert_queries(0) { david.projects.columns; david.projects.columns }
820
- end
821
-
822
- def test_include_method_in_has_and_belongs_to_many_association_should_return_true_for_instance_added_with_build
823
- project = Project.new
824
- developer = project.developers.build
825
- assert project.developers.include?(developer)
826
- end
827
- end