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,119 +0,0 @@
1
- require "cases/helper"
2
- require 'models/topic'
3
- require 'models/reply'
4
- require 'models/subscriber'
5
- require 'models/movie'
6
- require 'models/keyboard'
7
- require 'models/mixed_case_monkey'
8
-
9
- class PrimaryKeysTest < ActiveRecord::TestCase
10
- fixtures :topics, :subscribers, :movies, :mixed_case_monkeys
11
-
12
- def test_integer_key
13
- topic = Topic.find(1)
14
- assert_equal(topics(:first).author_name, topic.author_name)
15
- topic = Topic.find(2)
16
- assert_equal(topics(:second).author_name, topic.author_name)
17
-
18
- topic = Topic.new
19
- topic.title = "New Topic"
20
- assert_equal(nil, topic.id)
21
- assert_nothing_raised { topic.save! }
22
- id = topic.id
23
-
24
- topicReloaded = Topic.find(id)
25
- assert_equal("New Topic", topicReloaded.title)
26
- end
27
-
28
- def test_customized_primary_key_auto_assigns_on_save
29
- Keyboard.delete_all
30
- keyboard = Keyboard.new(:name => 'HHKB')
31
- assert_nothing_raised { keyboard.save! }
32
- assert_equal keyboard.id, Keyboard.find_by_name('HHKB').id
33
- end
34
-
35
- def test_customized_primary_key_can_be_get_before_saving
36
- keyboard = Keyboard.new
37
- assert_nil keyboard.id
38
- assert_nothing_raised { assert_nil keyboard.key_number }
39
- end
40
-
41
- def test_customized_string_primary_key_settable_before_save
42
- subscriber = Subscriber.new
43
- assert_nothing_raised { subscriber.id = 'webster123' }
44
- assert_equal 'webster123', subscriber.id
45
- assert_equal 'webster123', subscriber.nick
46
- end
47
-
48
- def test_string_key
49
- subscriber = Subscriber.find(subscribers(:first).nick)
50
- assert_equal(subscribers(:first).name, subscriber.name)
51
- subscriber = Subscriber.find(subscribers(:second).nick)
52
- assert_equal(subscribers(:second).name, subscriber.name)
53
-
54
- subscriber = Subscriber.new
55
- subscriber.id = "jdoe"
56
- assert_equal("jdoe", subscriber.id)
57
- subscriber.name = "John Doe"
58
- assert_nothing_raised { subscriber.save! }
59
- assert_equal("jdoe", subscriber.id)
60
-
61
- subscriberReloaded = Subscriber.find("jdoe")
62
- assert_equal("John Doe", subscriberReloaded.name)
63
- end
64
-
65
- def test_find_with_more_than_one_string_key
66
- assert_equal 2, Subscriber.find(subscribers(:first).nick, subscribers(:second).nick).length
67
- end
68
-
69
- def test_primary_key_prefix
70
- ActiveRecord::Base.primary_key_prefix_type = :table_name
71
- Topic.reset_primary_key
72
- assert_equal "topicid", Topic.primary_key
73
-
74
- ActiveRecord::Base.primary_key_prefix_type = :table_name_with_underscore
75
- Topic.reset_primary_key
76
- assert_equal "topic_id", Topic.primary_key
77
-
78
- ActiveRecord::Base.primary_key_prefix_type = nil
79
- Topic.reset_primary_key
80
- assert_equal "id", Topic.primary_key
81
- end
82
-
83
- def test_delete_should_quote_pkey
84
- assert_nothing_raised { MixedCaseMonkey.delete(1) }
85
- end
86
- def test_update_counters_should_quote_pkey_and_quote_counter_columns
87
- assert_nothing_raised { MixedCaseMonkey.update_counters(1, :fleaCount => 99) }
88
- end
89
- def test_find_with_one_id_should_quote_pkey
90
- assert_nothing_raised { MixedCaseMonkey.find(1) }
91
- end
92
- def test_find_with_multiple_ids_should_quote_pkey
93
- assert_nothing_raised { MixedCaseMonkey.find([1,2]) }
94
- end
95
- def test_instance_update_should_quote_pkey
96
- assert_nothing_raised { MixedCaseMonkey.find(1).save }
97
- end
98
- def test_instance_destroy_should_quote_pkey
99
- assert_nothing_raised { MixedCaseMonkey.find(1).destroy }
100
- end
101
-
102
- def test_supports_primary_key
103
- assert_nothing_raised NoMethodError do
104
- ActiveRecord::Base.connection.supports_primary_key?
105
- end
106
- end
107
-
108
- def test_primary_key_returns_value_if_it_exists
109
- if ActiveRecord::Base.connection.supports_primary_key?
110
- assert_equal 'id', ActiveRecord::Base.connection.primary_key('developers')
111
- end
112
- end
113
-
114
- def test_primary_key_returns_nil_if_it_does_not_exist
115
- if ActiveRecord::Base.connection.supports_primary_key?
116
- assert_nil ActiveRecord::Base.connection.primary_key('developers_projects')
117
- end
118
- end
119
- end
@@ -1,103 +0,0 @@
1
- require "cases/helper"
2
-
3
- class PooledConnectionsTest < ActiveRecord::TestCase
4
- def setup
5
- super
6
- @connection = ActiveRecord::Base.remove_connection
7
- end
8
-
9
- def teardown
10
- ActiveRecord::Base.clear_all_connections!
11
- ActiveRecord::Base.establish_connection(@connection)
12
- super
13
- end
14
-
15
- def checkout_connections
16
- ActiveRecord::Base.establish_connection(@connection.merge({:pool => 2, :wait_timeout => 0.3}))
17
- @connections = []
18
- @timed_out = 0
19
-
20
- 4.times do
21
- Thread.new do
22
- begin
23
- @connections << ActiveRecord::Base.connection_pool.checkout
24
- rescue ActiveRecord::ConnectionTimeoutError
25
- @timed_out += 1
26
- end
27
- end.join
28
- end
29
- end
30
-
31
- # Will deadlock due to lack of Monitor timeouts in 1.9
32
- if RUBY_VERSION < '1.9'
33
- def test_pooled_connection_checkout
34
- checkout_connections
35
- assert_equal @connections.length, 2
36
- assert_equal @timed_out, 2
37
- end
38
- end
39
-
40
- def checkout_checkin_connections(pool_size, threads)
41
- ActiveRecord::Base.establish_connection(@connection.merge({:pool => pool_size, :wait_timeout => 0.5}))
42
- @connection_count = 0
43
- @timed_out = 0
44
- threads.times do
45
- Thread.new do
46
- begin
47
- conn = ActiveRecord::Base.connection_pool.checkout
48
- sleep 0.1
49
- ActiveRecord::Base.connection_pool.checkin conn
50
- @connection_count += 1
51
- rescue ActiveRecord::ConnectionTimeoutError
52
- @timed_out += 1
53
- end
54
- end.join
55
- end
56
- end
57
-
58
- def test_pooled_connection_checkin_one
59
- checkout_checkin_connections 1, 2
60
- assert_equal 2, @connection_count
61
- assert_equal 0, @timed_out
62
- end
63
-
64
- def test_pooled_connection_checkin_two
65
- checkout_checkin_connections 2, 3
66
- assert_equal 3, @connection_count
67
- assert_equal 0, @timed_out
68
- end
69
-
70
- def test_pooled_connection_checkout_existing_first
71
- ActiveRecord::Base.establish_connection(@connection.merge({:pool => 1}))
72
- conn_pool = ActiveRecord::Base.connection_pool
73
- conn = conn_pool.checkout
74
- conn_pool.checkin(conn)
75
- conn = conn_pool.checkout
76
- assert ActiveRecord::ConnectionAdapters::AbstractAdapter === conn
77
- conn_pool.checkin(conn)
78
- end
79
-
80
- def test_not_connected_defined_connection_returns_false
81
- ActiveRecord::Base.establish_connection(@connection)
82
- assert ! ActiveRecord::Base.connected?
83
- end
84
-
85
- def test_undefined_connection_returns_false
86
- old_handler = ActiveRecord::Base.connection_handler
87
- ActiveRecord::Base.connection_handler = ActiveRecord::ConnectionAdapters::ConnectionHandler.new
88
- assert_equal false, ActiveRecord::Base.connected?
89
- ensure
90
- ActiveRecord::Base.connection_handler = old_handler
91
- end
92
- end unless %w(FrontBase).include? ActiveRecord::Base.connection.adapter_name
93
-
94
- class AllowConcurrencyDeprecatedTest < ActiveRecord::TestCase
95
- def test_allow_concurrency_is_deprecated
96
- assert_deprecated('ActiveRecord::Base.allow_concurrency') do
97
- ActiveRecord::Base.allow_concurrency
98
- end
99
- assert_deprecated('ActiveRecord::Base.allow_concurrency=') do
100
- ActiveRecord::Base.allow_concurrency = true
101
- end
102
- end
103
- end
@@ -1,129 +0,0 @@
1
- require "cases/helper"
2
- require 'models/topic'
3
- require 'models/reply'
4
- require 'models/task'
5
- require 'models/course'
6
- require 'models/category'
7
- require 'models/post'
8
-
9
-
10
- class QueryCacheTest < ActiveRecord::TestCase
11
- fixtures :tasks, :topics, :categories, :posts, :categories_posts
12
-
13
- def test_find_queries
14
- assert_queries(2) { Task.find(1); Task.find(1) }
15
- end
16
-
17
- def test_find_queries_with_cache
18
- Task.cache do
19
- assert_queries(1) { Task.find(1); Task.find(1) }
20
- end
21
- end
22
-
23
- def test_count_queries_with_cache
24
- Task.cache do
25
- assert_queries(1) { Task.count; Task.count }
26
- end
27
- end
28
-
29
- def test_query_cache_dups_results_correctly
30
- Task.cache do
31
- now = Time.now.utc
32
- task = Task.find 1
33
- assert_not_equal now, task.starting
34
- task.starting = now
35
- task.reload
36
- assert_not_equal now, task.starting
37
- end
38
- end
39
-
40
- def test_cache_is_flat
41
- Task.cache do
42
- Topic.columns # don't count this query
43
- assert_queries(1) { Topic.find(1); Topic.find(1); }
44
- end
45
-
46
- ActiveRecord::Base.cache do
47
- assert_queries(1) { Task.find(1); Task.find(1) }
48
- end
49
- end
50
-
51
- def test_cache_does_not_wrap_string_results_in_arrays
52
- require 'sqlite3/version' if current_adapter?(:SQLite3Adapter)
53
-
54
- Task.cache do
55
- if current_adapter?(:SQLite3Adapter) && SQLite3::Version::VERSION > '1.2.5'
56
- assert_instance_of Fixnum, Task.connection.select_value("SELECT count(*) AS count_all FROM tasks")
57
- else
58
- assert_instance_of String, Task.connection.select_value("SELECT count(*) AS count_all FROM tasks")
59
- end
60
- end
61
- end
62
- end
63
-
64
- class QueryCacheExpiryTest < ActiveRecord::TestCase
65
- fixtures :tasks, :posts, :categories, :categories_posts
66
-
67
- def test_find
68
- Task.connection.expects(:clear_query_cache).times(1)
69
-
70
- assert !Task.connection.query_cache_enabled
71
- Task.cache do
72
- assert Task.connection.query_cache_enabled
73
- Task.find(1)
74
-
75
- Task.uncached do
76
- assert !Task.connection.query_cache_enabled
77
- Task.find(1)
78
- end
79
-
80
- assert Task.connection.query_cache_enabled
81
- end
82
- assert !Task.connection.query_cache_enabled
83
- end
84
-
85
- def test_update
86
- Task.connection.expects(:clear_query_cache).times(2)
87
-
88
- Task.cache do
89
- task = Task.find(1)
90
- task.starting = Time.now.utc
91
- task.save!
92
- end
93
- end
94
-
95
- def test_destroy
96
- Task.connection.expects(:clear_query_cache).times(2)
97
-
98
- Task.cache do
99
- Task.find(1).destroy
100
- end
101
- end
102
-
103
- def test_insert
104
- ActiveRecord::Base.connection.expects(:clear_query_cache).times(2)
105
-
106
- Task.cache do
107
- Task.create!
108
- end
109
- end
110
-
111
- def test_cache_is_expired_by_habtm_update
112
- ActiveRecord::Base.connection.expects(:clear_query_cache).times(2)
113
- ActiveRecord::Base.cache do
114
- c = Category.find(:first)
115
- p = Post.find(:first)
116
- p.categories << c
117
- end
118
- end
119
-
120
- def test_cache_is_expired_by_habtm_delete
121
- ActiveRecord::Base.connection.expects(:clear_query_cache).times(2)
122
- ActiveRecord::Base.cache do
123
- c = Category.find(1)
124
- p = Post.find(1)
125
- assert p.categories.any?
126
- p.categories.delete_all
127
- end
128
- end
129
- end
@@ -1,107 +0,0 @@
1
- require "cases/helper"
2
- require 'models/post'
3
- require 'models/comment'
4
- require 'models/developer'
5
- require 'models/project'
6
- require 'models/reader'
7
- require 'models/person'
8
-
9
- # Dummy class methods to test implicit association scoping.
10
- def Comment.foo() find :first end
11
- def Project.foo() find :first end
12
-
13
-
14
- class ReadOnlyTest < ActiveRecord::TestCase
15
- fixtures :posts, :comments, :developers, :projects, :developers_projects
16
-
17
- def test_cant_save_readonly_record
18
- dev = Developer.find(1)
19
- assert !dev.readonly?
20
-
21
- dev.readonly!
22
- assert dev.readonly?
23
-
24
- assert_nothing_raised do
25
- dev.name = 'Luscious forbidden fruit.'
26
- assert !dev.save
27
- dev.name = 'Forbidden.'
28
- end
29
- assert_raise(ActiveRecord::ReadOnlyRecord) { dev.save }
30
- assert_raise(ActiveRecord::ReadOnlyRecord) { dev.save! }
31
- end
32
-
33
-
34
- def test_find_with_readonly_option
35
- Developer.find(:all).each { |d| assert !d.readonly? }
36
- Developer.find(:all, :readonly => false).each { |d| assert !d.readonly? }
37
- Developer.find(:all, :readonly => true).each { |d| assert d.readonly? }
38
- end
39
-
40
-
41
- def test_find_with_joins_option_implies_readonly
42
- # Blank joins don't count.
43
- Developer.find(:all, :joins => ' ').each { |d| assert !d.readonly? }
44
- Developer.find(:all, :joins => ' ', :readonly => false).each { |d| assert !d.readonly? }
45
-
46
- # Others do.
47
- Developer.find(:all, :joins => ', projects').each { |d| assert d.readonly? }
48
- Developer.find(:all, :joins => ', projects', :readonly => false).each { |d| assert !d.readonly? }
49
- end
50
-
51
-
52
- def test_habtm_find_readonly
53
- dev = Developer.find(1)
54
- assert !dev.projects.empty?
55
- assert dev.projects.all?(&:readonly?)
56
- assert dev.projects.find(:all).all?(&:readonly?)
57
- assert dev.projects.find(:all, :readonly => true).all?(&:readonly?)
58
- end
59
-
60
- def test_has_many_find_readonly
61
- post = Post.find(1)
62
- assert !post.comments.empty?
63
- assert !post.comments.any?(&:readonly?)
64
- assert !post.comments.find(:all).any?(&:readonly?)
65
- assert post.comments.find(:all, :readonly => true).all?(&:readonly?)
66
- end
67
-
68
- def test_has_many_with_through_is_not_implicitly_marked_readonly
69
- assert people = Post.find(1).people
70
- assert !people.any?(&:readonly?)
71
- end
72
-
73
- def test_readonly_scoping
74
- Post.with_scope(:find => { :conditions => '1=1' }) do
75
- assert !Post.find(1).readonly?
76
- assert Post.find(1, :readonly => true).readonly?
77
- assert !Post.find(1, :readonly => false).readonly?
78
- end
79
-
80
- Post.with_scope(:find => { :joins => ' ' }) do
81
- assert !Post.find(1).readonly?
82
- assert Post.find(1, :readonly => true).readonly?
83
- assert !Post.find(1, :readonly => false).readonly?
84
- end
85
-
86
- # Oracle barfs on this because the join includes unqualified and
87
- # conflicting column names
88
- unless current_adapter?(:OracleAdapter)
89
- Post.with_scope(:find => { :joins => ', developers' }) do
90
- assert Post.find(1).readonly?
91
- assert Post.find(1, :readonly => true).readonly?
92
- assert !Post.find(1, :readonly => false).readonly?
93
- end
94
- end
95
-
96
- Post.with_scope(:find => { :readonly => true }) do
97
- assert Post.find(1).readonly?
98
- assert Post.find(1, :readonly => true).readonly?
99
- assert !Post.find(1, :readonly => false).readonly?
100
- end
101
- end
102
-
103
- def test_association_collection_method_missing_scoping_not_readonly
104
- assert !Developer.find(1).projects.foo.readonly?
105
- assert !Post.find(1).comments.foo.readonly?
106
- end
107
- end
@@ -1,234 +0,0 @@
1
- require "cases/helper"
2
- require 'models/topic'
3
- require 'models/customer'
4
- require 'models/company'
5
- require 'models/company_in_module'
6
- require 'models/subscriber'
7
- require 'models/ship'
8
- require 'models/pirate'
9
-
10
- class ReflectionTest < ActiveRecord::TestCase
11
- include ActiveRecord::Reflection
12
-
13
- fixtures :topics, :customers, :companies, :subscribers
14
-
15
- def setup
16
- @first = Topic.find(1)
17
- end
18
-
19
- def test_column_null_not_null
20
- subscriber = Subscriber.find(:first)
21
- assert subscriber.column_for_attribute("name").null
22
- assert !subscriber.column_for_attribute("nick").null
23
- end
24
-
25
- def test_read_attribute_names
26
- assert_equal(
27
- %w( id title author_name author_email_address bonus_time written_on last_read content group approved replies_count parent_id parent_title type ).sort,
28
- @first.attribute_names
29
- )
30
- end
31
-
32
- def test_columns
33
- assert_equal 14, Topic.columns.length
34
- end
35
-
36
- def test_columns_are_returned_in_the_order_they_were_declared
37
- column_names = Topic.columns.map { |column| column.name }
38
- assert_equal %w(id title author_name author_email_address written_on bonus_time last_read content approved replies_count parent_id parent_title type group), column_names
39
- end
40
-
41
- def test_content_columns
42
- content_columns = Topic.content_columns
43
- content_column_names = content_columns.map {|column| column.name}
44
- assert_equal 10, content_columns.length
45
- assert_equal %w(title author_name author_email_address written_on bonus_time last_read content group approved parent_title).sort, content_column_names.sort
46
- end
47
-
48
- def test_column_string_type_and_limit
49
- assert_equal :string, @first.column_for_attribute("title").type
50
- assert_equal 255, @first.column_for_attribute("title").limit
51
- end
52
-
53
- def test_column_null_not_null
54
- subscriber = Subscriber.find(:first)
55
- assert subscriber.column_for_attribute("name").null
56
- assert !subscriber.column_for_attribute("nick").null
57
- end
58
-
59
- def test_human_name_for_column
60
- assert_equal "Author name", @first.column_for_attribute("author_name").human_name
61
- end
62
-
63
- def test_integer_columns
64
- assert_equal :integer, @first.column_for_attribute("id").type
65
- end
66
-
67
- def test_reflection_klass_for_nested_class_name
68
- reflection = MacroReflection.new(nil, nil, { :class_name => 'MyApplication::Business::Company' }, nil)
69
- assert_nothing_raised do
70
- assert_equal MyApplication::Business::Company, reflection.klass
71
- end
72
- end
73
-
74
- def test_aggregation_reflection
75
- reflection_for_address = AggregateReflection.new(
76
- :composed_of, :address, { :mapping => [ %w(address_street street), %w(address_city city), %w(address_country country) ] }, Customer
77
- )
78
-
79
- reflection_for_balance = AggregateReflection.new(
80
- :composed_of, :balance, { :class_name => "Money", :mapping => %w(balance amount) }, Customer
81
- )
82
-
83
- reflection_for_gps_location = AggregateReflection.new(
84
- :composed_of, :gps_location, { }, Customer
85
- )
86
-
87
- assert Customer.reflect_on_all_aggregations.include?(reflection_for_gps_location)
88
- assert Customer.reflect_on_all_aggregations.include?(reflection_for_balance)
89
- assert Customer.reflect_on_all_aggregations.include?(reflection_for_address)
90
-
91
- assert_equal reflection_for_address, Customer.reflect_on_aggregation(:address)
92
-
93
- assert_equal Address, Customer.reflect_on_aggregation(:address).klass
94
-
95
- assert_equal Money, Customer.reflect_on_aggregation(:balance).klass
96
- end
97
-
98
- def test_reflect_on_all_autosave_associations
99
- expected = Pirate.reflect_on_all_associations.select { |r| r.options[:autosave] }
100
- received = Pirate.reflect_on_all_autosave_associations
101
-
102
- assert !received.empty?
103
- assert_not_equal Pirate.reflect_on_all_associations.length, received.length
104
- assert_equal expected, received
105
- end
106
-
107
- def test_has_many_reflection
108
- reflection_for_clients = AssociationReflection.new(:has_many, :clients, { :order => "id", :dependent => :destroy }, Firm)
109
-
110
- assert_equal reflection_for_clients, Firm.reflect_on_association(:clients)
111
-
112
- assert_equal Client, Firm.reflect_on_association(:clients).klass
113
- assert_equal 'companies', Firm.reflect_on_association(:clients).table_name
114
-
115
- assert_equal Client, Firm.reflect_on_association(:clients_of_firm).klass
116
- assert_equal 'companies', Firm.reflect_on_association(:clients_of_firm).table_name
117
- end
118
-
119
- def test_has_one_reflection
120
- reflection_for_account = AssociationReflection.new(:has_one, :account, { :foreign_key => "firm_id", :dependent => :destroy }, Firm)
121
- assert_equal reflection_for_account, Firm.reflect_on_association(:account)
122
-
123
- assert_equal Account, Firm.reflect_on_association(:account).klass
124
- assert_equal 'accounts', Firm.reflect_on_association(:account).table_name
125
- end
126
-
127
- def test_belongs_to_inferred_foreign_key_from_assoc_name
128
- Company.belongs_to :foo
129
- assert_equal "foo_id", Company.reflect_on_association(:foo).primary_key_name
130
- Company.belongs_to :bar, :class_name => "Xyzzy"
131
- assert_equal "bar_id", Company.reflect_on_association(:bar).primary_key_name
132
- Company.belongs_to :baz, :class_name => "Xyzzy", :foreign_key => "xyzzy_id"
133
- assert_equal "xyzzy_id", Company.reflect_on_association(:baz).primary_key_name
134
- end
135
-
136
- def test_association_reflection_in_modules
137
- assert_reflection MyApplication::Business::Firm,
138
- :clients_of_firm,
139
- :klass => MyApplication::Business::Client,
140
- :class_name => 'Client',
141
- :table_name => 'companies'
142
-
143
- assert_reflection MyApplication::Billing::Account,
144
- :firm,
145
- :klass => MyApplication::Business::Firm,
146
- :class_name => 'MyApplication::Business::Firm',
147
- :table_name => 'companies'
148
-
149
- assert_reflection MyApplication::Billing::Account,
150
- :qualified_billing_firm,
151
- :klass => MyApplication::Billing::Firm,
152
- :class_name => 'MyApplication::Billing::Firm',
153
- :table_name => 'companies'
154
-
155
- assert_reflection MyApplication::Billing::Account,
156
- :unqualified_billing_firm,
157
- :klass => MyApplication::Billing::Firm,
158
- :class_name => 'Firm',
159
- :table_name => 'companies'
160
-
161
- assert_reflection MyApplication::Billing::Account,
162
- :nested_qualified_billing_firm,
163
- :klass => MyApplication::Billing::Nested::Firm,
164
- :class_name => 'MyApplication::Billing::Nested::Firm',
165
- :table_name => 'companies'
166
-
167
- assert_reflection MyApplication::Billing::Account,
168
- :nested_unqualified_billing_firm,
169
- :klass => MyApplication::Billing::Nested::Firm,
170
- :class_name => 'Nested::Firm',
171
- :table_name => 'companies'
172
- end
173
-
174
- def test_reflection_of_all_associations
175
- # FIXME these assertions bust a lot
176
- assert_equal 36, Firm.reflect_on_all_associations.size
177
- assert_equal 26, Firm.reflect_on_all_associations(:has_many).size
178
- assert_equal 10, Firm.reflect_on_all_associations(:has_one).size
179
- assert_equal 0, Firm.reflect_on_all_associations(:belongs_to).size
180
- end
181
-
182
- def test_reflection_should_not_raise_error_when_compared_to_other_object
183
- assert_nothing_raised { Firm.reflections[:clients] == Object.new }
184
- end
185
-
186
- def test_has_many_through_reflection
187
- assert_kind_of ThroughReflection, Subscriber.reflect_on_association(:books)
188
- end
189
-
190
- def test_collection_association
191
- assert Pirate.reflect_on_association(:birds).collection?
192
- assert Pirate.reflect_on_association(:parrots).collection?
193
-
194
- assert !Pirate.reflect_on_association(:ship).collection?
195
- assert !Ship.reflect_on_association(:pirate).collection?
196
- end
197
-
198
- def test_default_association_validation
199
- assert AssociationReflection.new(:has_many, :clients, {}, Firm).validate?
200
-
201
- assert !AssociationReflection.new(:has_one, :client, {}, Firm).validate?
202
- assert !AssociationReflection.new(:belongs_to, :client, {}, Firm).validate?
203
- assert !AssociationReflection.new(:has_and_belongs_to_many, :clients, {}, Firm).validate?
204
- end
205
-
206
- def test_always_validate_association_if_explicit
207
- assert AssociationReflection.new(:has_one, :client, { :validate => true }, Firm).validate?
208
- assert AssociationReflection.new(:belongs_to, :client, { :validate => true }, Firm).validate?
209
- assert AssociationReflection.new(:has_many, :clients, { :validate => true }, Firm).validate?
210
- assert AssociationReflection.new(:has_and_belongs_to_many, :clients, { :validate => true }, Firm).validate?
211
- end
212
-
213
- def test_validate_association_if_autosave
214
- assert AssociationReflection.new(:has_one, :client, { :autosave => true }, Firm).validate?
215
- assert AssociationReflection.new(:belongs_to, :client, { :autosave => true }, Firm).validate?
216
- assert AssociationReflection.new(:has_many, :clients, { :autosave => true }, Firm).validate?
217
- assert AssociationReflection.new(:has_and_belongs_to_many, :clients, { :autosave => true }, Firm).validate?
218
- end
219
-
220
- def test_never_validate_association_if_explicit
221
- assert !AssociationReflection.new(:has_one, :client, { :autosave => true, :validate => false }, Firm).validate?
222
- assert !AssociationReflection.new(:belongs_to, :client, { :autosave => true, :validate => false }, Firm).validate?
223
- assert !AssociationReflection.new(:has_many, :clients, { :autosave => true, :validate => false }, Firm).validate?
224
- assert !AssociationReflection.new(:has_and_belongs_to_many, :clients, { :autosave => true, :validate => false }, Firm).validate?
225
- end
226
-
227
- private
228
- def assert_reflection(klass, association, options)
229
- assert reflection = klass.reflect_on_association(association)
230
- options.each do |method, value|
231
- assert_equal(value, reflection.send(method))
232
- end
233
- end
234
- end