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,704 +0,0 @@
1
- require "cases/helper"
2
- require 'models/post'
3
- require 'models/author'
4
- require 'models/developer'
5
- require 'models/project'
6
- require 'models/comment'
7
- require 'models/category'
8
-
9
- class MethodScopingTest < ActiveRecord::TestCase
10
- fixtures :authors, :developers, :projects, :comments, :posts, :developers_projects
11
-
12
- def test_set_conditions
13
- Developer.with_scope(:find => { :conditions => 'just a test...' }) do
14
- assert_equal 'just a test...', Developer.send(:current_scoped_methods)[:find][:conditions]
15
- end
16
- end
17
-
18
- def test_scoped_find
19
- Developer.with_scope(:find => { :conditions => "name = 'David'" }) do
20
- assert_nothing_raised { Developer.find(1) }
21
- end
22
- end
23
-
24
- def test_scoped_find_first
25
- Developer.with_scope(:find => { :conditions => "salary = 100000" }) do
26
- assert_equal Developer.find(10), Developer.find(:first, :order => 'name')
27
- end
28
- end
29
-
30
- def test_scoped_find_last
31
- highest_salary = Developer.find(:first, :order => "salary DESC")
32
-
33
- Developer.with_scope(:find => { :order => "salary" }) do
34
- assert_equal highest_salary, Developer.last
35
- end
36
- end
37
-
38
- def test_scoped_find_last_preserves_scope
39
- lowest_salary = Developer.find(:first, :order => "salary ASC")
40
- highest_salary = Developer.find(:first, :order => "salary DESC")
41
-
42
- Developer.with_scope(:find => { :order => "salary" }) do
43
- assert_equal highest_salary, Developer.last
44
- assert_equal lowest_salary, Developer.first
45
- end
46
- end
47
-
48
- def test_scoped_find_combines_conditions
49
- Developer.with_scope(:find => { :conditions => "salary = 9000" }) do
50
- assert_equal developers(:poor_jamis), Developer.find(:first, :conditions => "name = 'Jamis'")
51
- end
52
- end
53
-
54
- def test_scoped_find_sanitizes_conditions
55
- Developer.with_scope(:find => { :conditions => ['salary = ?', 9000] }) do
56
- assert_equal developers(:poor_jamis), Developer.find(:first)
57
- end
58
- end
59
-
60
- def test_scoped_find_combines_and_sanitizes_conditions
61
- Developer.with_scope(:find => { :conditions => ['salary = ?', 9000] }) do
62
- assert_equal developers(:poor_jamis), Developer.find(:first, :conditions => ['name = ?', 'Jamis'])
63
- end
64
- end
65
-
66
- def test_scoped_find_all
67
- Developer.with_scope(:find => { :conditions => "name = 'David'" }) do
68
- assert_equal [developers(:david)], Developer.find(:all)
69
- end
70
- end
71
-
72
- def test_scoped_find_select
73
- Developer.with_scope(:find => { :select => "id, name" }) do
74
- developer = Developer.find(:first, :conditions => "name = 'David'")
75
- assert_equal "David", developer.name
76
- assert !developer.has_attribute?(:salary)
77
- end
78
- end
79
-
80
- def test_options_select_replaces_scope_select
81
- Developer.with_scope(:find => { :select => "id, name" }) do
82
- developer = Developer.find(:first, :select => 'id, salary', :conditions => "name = 'David'")
83
- assert_equal 80000, developer.salary
84
- assert !developer.has_attribute?(:name)
85
- end
86
- end
87
-
88
- def test_scoped_count
89
- Developer.with_scope(:find => { :conditions => "name = 'David'" }) do
90
- assert_equal 1, Developer.count
91
- end
92
-
93
- Developer.with_scope(:find => { :conditions => 'salary = 100000' }) do
94
- assert_equal 8, Developer.count
95
- assert_equal 1, Developer.count(:conditions => "name LIKE 'fixture_1%'")
96
- end
97
- end
98
-
99
- def test_scoped_find_include
100
- # with the include, will retrieve only developers for the given project
101
- scoped_developers = Developer.with_scope(:find => { :include => :projects }) do
102
- Developer.find(:all, :conditions => 'projects.id = 2')
103
- end
104
- assert scoped_developers.include?(developers(:david))
105
- assert !scoped_developers.include?(developers(:jamis))
106
- assert_equal 1, scoped_developers.size
107
- end
108
-
109
- def test_scoped_find_joins
110
- scoped_developers = Developer.with_scope(:find => { :joins => 'JOIN developers_projects ON id = developer_id' } ) do
111
- Developer.find(:all, :conditions => 'developers_projects.project_id = 2')
112
- end
113
- assert scoped_developers.include?(developers(:david))
114
- assert !scoped_developers.include?(developers(:jamis))
115
- assert_equal 1, scoped_developers.size
116
- assert_equal developers(:david).attributes, scoped_developers.first.attributes
117
- end
118
-
119
- def test_scoped_find_using_new_style_joins
120
- scoped_developers = Developer.with_scope(:find => { :joins => :projects }) do
121
- Developer.find(:all, :conditions => 'projects.id = 2')
122
- end
123
- assert scoped_developers.include?(developers(:david))
124
- assert !scoped_developers.include?(developers(:jamis))
125
- assert_equal 1, scoped_developers.size
126
- assert_equal developers(:david).attributes, scoped_developers.first.attributes
127
- end
128
-
129
- def test_scoped_find_merges_old_style_joins
130
- scoped_authors = Author.with_scope(:find => { :joins => 'INNER JOIN posts ON authors.id = posts.author_id ' }) do
131
- Author.find(:all, :select => 'DISTINCT authors.*', :joins => 'INNER JOIN comments ON posts.id = comments.post_id', :conditions => 'comments.id = 1')
132
- end
133
- assert scoped_authors.include?(authors(:david))
134
- assert !scoped_authors.include?(authors(:mary))
135
- assert_equal 1, scoped_authors.size
136
- assert_equal authors(:david).attributes, scoped_authors.first.attributes
137
- end
138
-
139
- def test_scoped_find_merges_new_style_joins
140
- scoped_authors = Author.with_scope(:find => { :joins => :posts }) do
141
- Author.find(:all, :select => 'DISTINCT authors.*', :joins => :comments, :conditions => 'comments.id = 1')
142
- end
143
- assert scoped_authors.include?(authors(:david))
144
- assert !scoped_authors.include?(authors(:mary))
145
- assert_equal 1, scoped_authors.size
146
- assert_equal authors(:david).attributes, scoped_authors.first.attributes
147
- end
148
-
149
- def test_scoped_find_merges_new_and_old_style_joins
150
- scoped_authors = Author.with_scope(:find => { :joins => :posts }) do
151
- Author.find(:all, :select => 'DISTINCT authors.*', :joins => 'JOIN comments ON posts.id = comments.post_id', :conditions => 'comments.id = 1')
152
- end
153
- assert scoped_authors.include?(authors(:david))
154
- assert !scoped_authors.include?(authors(:mary))
155
- assert_equal 1, scoped_authors.size
156
- assert_equal authors(:david).attributes, scoped_authors.first.attributes
157
- end
158
-
159
- def test_scoped_find_merges_string_array_style_and_string_style_joins
160
- scoped_authors = Author.with_scope(:find => { :joins => ["INNER JOIN posts ON posts.author_id = authors.id"]}) do
161
- Author.find(:all, :select => 'DISTINCT authors.*', :joins => 'INNER JOIN comments ON posts.id = comments.post_id', :conditions => 'comments.id = 1')
162
- end
163
- assert scoped_authors.include?(authors(:david))
164
- assert !scoped_authors.include?(authors(:mary))
165
- assert_equal 1, scoped_authors.size
166
- assert_equal authors(:david).attributes, scoped_authors.first.attributes
167
- end
168
-
169
- def test_scoped_find_merges_string_array_style_and_hash_style_joins
170
- scoped_authors = Author.with_scope(:find => { :joins => :posts}) do
171
- Author.find(:all, :select => 'DISTINCT authors.*', :joins => ['INNER JOIN comments ON posts.id = comments.post_id'], :conditions => 'comments.id = 1')
172
- end
173
- assert scoped_authors.include?(authors(:david))
174
- assert !scoped_authors.include?(authors(:mary))
175
- assert_equal 1, scoped_authors.size
176
- assert_equal authors(:david).attributes, scoped_authors.first.attributes
177
- end
178
-
179
- def test_scoped_find_merges_joins_and_eliminates_duplicate_string_joins
180
- scoped_authors = Author.with_scope(:find => { :joins => 'INNER JOIN posts ON posts.author_id = authors.id'}) do
181
- Author.find(:all, :select => 'DISTINCT authors.*', :joins => ["INNER JOIN posts ON posts.author_id = authors.id", "INNER JOIN comments ON posts.id = comments.post_id"], :conditions => 'comments.id = 1')
182
- end
183
- assert scoped_authors.include?(authors(:david))
184
- assert !scoped_authors.include?(authors(:mary))
185
- assert_equal 1, scoped_authors.size
186
- assert_equal authors(:david).attributes, scoped_authors.first.attributes
187
- end
188
-
189
- def test_scoped_find_strips_spaces_from_string_joins_and_eliminates_duplicate_string_joins
190
- scoped_authors = Author.with_scope(:find => { :joins => ' INNER JOIN posts ON posts.author_id = authors.id '}) do
191
- Author.find(:all, :select => 'DISTINCT authors.*', :joins => ['INNER JOIN posts ON posts.author_id = authors.id'], :conditions => 'posts.id = 1')
192
- end
193
- assert scoped_authors.include?(authors(:david))
194
- assert !scoped_authors.include?(authors(:mary))
195
- assert_equal 1, scoped_authors.size
196
- assert_equal authors(:david).attributes, scoped_authors.first.attributes
197
- end
198
-
199
- def test_scoped_count_include
200
- # with the include, will retrieve only developers for the given project
201
- Developer.with_scope(:find => { :include => :projects }) do
202
- assert_equal 1, Developer.count(:conditions => 'projects.id = 2')
203
- end
204
- end
205
-
206
- def test_scoped_create
207
- new_comment = nil
208
-
209
- VerySpecialComment.with_scope(:create => { :post_id => 1 }) do
210
- assert_equal({ :post_id => 1 }, VerySpecialComment.send(:current_scoped_methods)[:create])
211
- new_comment = VerySpecialComment.create :body => "Wonderful world"
212
- end
213
-
214
- assert Post.find(1).comments.include?(new_comment)
215
- end
216
-
217
- def test_immutable_scope
218
- options = { :conditions => "name = 'David'" }
219
- Developer.with_scope(:find => options) do
220
- assert_equal %w(David), Developer.find(:all).map { |d| d.name }
221
- options[:conditions] = "name != 'David'"
222
- assert_equal %w(David), Developer.find(:all).map { |d| d.name }
223
- end
224
-
225
- scope = { :find => { :conditions => "name = 'David'" }}
226
- Developer.with_scope(scope) do
227
- assert_equal %w(David), Developer.find(:all).map { |d| d.name }
228
- scope[:find][:conditions] = "name != 'David'"
229
- assert_equal %w(David), Developer.find(:all).map { |d| d.name }
230
- end
231
- end
232
-
233
- def test_scoped_with_duck_typing
234
- scoping = Struct.new(:method_scoping).new(:find => { :conditions => ["name = ?", 'David'] })
235
- Developer.with_scope(scoping) do
236
- assert_equal %w(David), Developer.find(:all).map { |d| d.name }
237
- end
238
- end
239
-
240
- def test_ensure_that_method_scoping_is_correctly_restored
241
- scoped_methods = Developer.instance_eval('current_scoped_methods')
242
-
243
- begin
244
- Developer.with_scope(:find => { :conditions => "name = 'Jamis'" }) do
245
- raise "an exception"
246
- end
247
- rescue
248
- end
249
- assert_equal scoped_methods, Developer.instance_eval('current_scoped_methods')
250
- end
251
- end
252
-
253
- class NestedScopingTest < ActiveRecord::TestCase
254
- fixtures :authors, :developers, :projects, :comments, :posts
255
-
256
- def test_merge_options
257
- Developer.with_scope(:find => { :conditions => 'salary = 80000' }) do
258
- Developer.with_scope(:find => { :limit => 10 }) do
259
- merged_option = Developer.instance_eval('current_scoped_methods')[:find]
260
- assert_equal({ :conditions => 'salary = 80000', :limit => 10 }, merged_option)
261
- end
262
- end
263
- end
264
-
265
- def test_merge_inner_scope_has_priority
266
- Developer.with_scope(:find => { :limit => 5 }) do
267
- Developer.with_scope(:find => { :limit => 10 }) do
268
- merged_option = Developer.instance_eval('current_scoped_methods')[:find]
269
- assert_equal({ :limit => 10 }, merged_option)
270
- end
271
- end
272
- end
273
-
274
- def test_replace_options
275
- Developer.with_scope(:find => { :conditions => "name = 'David'" }) do
276
- Developer.with_exclusive_scope(:find => { :conditions => "name = 'Jamis'" }) do
277
- assert_equal({:find => { :conditions => "name = 'Jamis'" }}, Developer.instance_eval('current_scoped_methods'))
278
- assert_equal({:find => { :conditions => "name = 'Jamis'" }}, Developer.send(:scoped_methods)[-1])
279
- end
280
- end
281
- end
282
-
283
- def test_append_conditions
284
- Developer.with_scope(:find => { :conditions => "name = 'David'" }) do
285
- Developer.with_scope(:find => { :conditions => 'salary = 80000' }) do
286
- appended_condition = Developer.instance_eval('current_scoped_methods')[:find][:conditions]
287
- assert_equal("(name = 'David') AND (salary = 80000)", appended_condition)
288
- assert_equal(1, Developer.count)
289
- end
290
- Developer.with_scope(:find => { :conditions => "name = 'Maiha'" }) do
291
- assert_equal(0, Developer.count)
292
- end
293
- end
294
- end
295
-
296
- def test_merge_and_append_options
297
- Developer.with_scope(:find => { :conditions => 'salary = 80000', :limit => 10 }) do
298
- Developer.with_scope(:find => { :conditions => "name = 'David'" }) do
299
- merged_option = Developer.instance_eval('current_scoped_methods')[:find]
300
- assert_equal({ :conditions => "(salary = 80000) AND (name = 'David')", :limit => 10 }, merged_option)
301
- end
302
- end
303
- end
304
-
305
- def test_nested_scoped_find
306
- Developer.with_scope(:find => { :conditions => "name = 'Jamis'" }) do
307
- Developer.with_exclusive_scope(:find => { :conditions => "name = 'David'" }) do
308
- assert_nothing_raised { Developer.find(1) }
309
- assert_equal('David', Developer.find(:first).name)
310
- end
311
- assert_equal('Jamis', Developer.find(:first).name)
312
- end
313
- end
314
-
315
- def test_nested_scoped_find_include
316
- Developer.with_scope(:find => { :include => :projects }) do
317
- Developer.with_scope(:find => { :conditions => "projects.id = 2" }) do
318
- assert_nothing_raised { Developer.find(1) }
319
- assert_equal('David', Developer.find(:first).name)
320
- end
321
- end
322
- end
323
-
324
- def test_nested_scoped_find_merged_include
325
- # :include's remain unique and don't "double up" when merging
326
- Developer.with_scope(:find => { :include => :projects, :conditions => "projects.id = 2" }) do
327
- Developer.with_scope(:find => { :include => :projects }) do
328
- assert_equal 1, Developer.instance_eval('current_scoped_methods')[:find][:include].length
329
- assert_equal('David', Developer.find(:first).name)
330
- end
331
- end
332
-
333
- # the nested scope doesn't remove the first :include
334
- Developer.with_scope(:find => { :include => :projects, :conditions => "projects.id = 2" }) do
335
- Developer.with_scope(:find => { :include => [] }) do
336
- assert_equal 1, Developer.instance_eval('current_scoped_methods')[:find][:include].length
337
- assert_equal('David', Developer.find(:first).name)
338
- end
339
- end
340
-
341
- # mixing array and symbol include's will merge correctly
342
- Developer.with_scope(:find => { :include => [:projects], :conditions => "projects.id = 2" }) do
343
- Developer.with_scope(:find => { :include => :projects }) do
344
- assert_equal 1, Developer.instance_eval('current_scoped_methods')[:find][:include].length
345
- assert_equal('David', Developer.find(:first).name)
346
- end
347
- end
348
- end
349
-
350
- def test_nested_scoped_find_replace_include
351
- Developer.with_scope(:find => { :include => :projects }) do
352
- Developer.with_exclusive_scope(:find => { :include => [] }) do
353
- assert_equal 0, Developer.instance_eval('current_scoped_methods')[:find][:include].length
354
- end
355
- end
356
- end
357
-
358
- def test_three_level_nested_exclusive_scoped_find
359
- Developer.with_scope(:find => { :conditions => "name = 'Jamis'" }) do
360
- assert_equal('Jamis', Developer.find(:first).name)
361
-
362
- Developer.with_exclusive_scope(:find => { :conditions => "name = 'David'" }) do
363
- assert_equal('David', Developer.find(:first).name)
364
-
365
- Developer.with_exclusive_scope(:find => { :conditions => "name = 'Maiha'" }) do
366
- assert_equal(nil, Developer.find(:first))
367
- end
368
-
369
- # ensure that scoping is restored
370
- assert_equal('David', Developer.find(:first).name)
371
- end
372
-
373
- # ensure that scoping is restored
374
- assert_equal('Jamis', Developer.find(:first).name)
375
- end
376
- end
377
-
378
- def test_merged_scoped_find
379
- poor_jamis = developers(:poor_jamis)
380
- Developer.with_scope(:find => { :conditions => "salary < 100000" }) do
381
- Developer.with_scope(:find => { :offset => 1, :order => 'id asc' }) do
382
- assert_sql /ORDER BY id asc / do
383
- assert_equal(poor_jamis, Developer.find(:first, :order => 'id asc'))
384
- end
385
- end
386
- end
387
- end
388
-
389
- def test_merged_scoped_find_sanitizes_conditions
390
- Developer.with_scope(:find => { :conditions => ["name = ?", 'David'] }) do
391
- Developer.with_scope(:find => { :conditions => ['salary = ?', 9000] }) do
392
- assert_raise(ActiveRecord::RecordNotFound) { developers(:poor_jamis) }
393
- end
394
- end
395
- end
396
-
397
- def test_nested_scoped_find_combines_and_sanitizes_conditions
398
- Developer.with_scope(:find => { :conditions => ["name = ?", 'David'] }) do
399
- Developer.with_exclusive_scope(:find => { :conditions => ['salary = ?', 9000] }) do
400
- assert_equal developers(:poor_jamis), Developer.find(:first)
401
- assert_equal developers(:poor_jamis), Developer.find(:first, :conditions => ['name = ?', 'Jamis'])
402
- end
403
- end
404
- end
405
-
406
- def test_merged_scoped_find_combines_and_sanitizes_conditions
407
- Developer.with_scope(:find => { :conditions => ["name = ?", 'David'] }) do
408
- Developer.with_scope(:find => { :conditions => ['salary > ?', 9000] }) do
409
- assert_equal %w(David), Developer.find(:all).map { |d| d.name }
410
- end
411
- end
412
- end
413
-
414
- def test_nested_scoped_create
415
- comment = nil
416
- Comment.with_scope(:create => { :post_id => 1}) do
417
- Comment.with_scope(:create => { :post_id => 2}) do
418
- assert_equal({ :post_id => 2 }, Comment.send(:current_scoped_methods)[:create])
419
- comment = Comment.create :body => "Hey guys, nested scopes are broken. Please fix!"
420
- end
421
- end
422
- assert_equal 2, comment.post_id
423
- end
424
-
425
- def test_nested_exclusive_scope_for_create
426
- comment = nil
427
- Comment.with_scope(:create => { :body => "Hey guys, nested scopes are broken. Please fix!" }) do
428
- Comment.with_exclusive_scope(:create => { :post_id => 1 }) do
429
- assert_equal({ :post_id => 1 }, Comment.send(:current_scoped_methods)[:create])
430
- comment = Comment.create :body => "Hey guys"
431
- end
432
- end
433
- assert_equal 1, comment.post_id
434
- assert_equal 'Hey guys', comment.body
435
- end
436
-
437
- def test_merged_scoped_find_on_blank_conditions
438
- [nil, " ", [], {}].each do |blank|
439
- Developer.with_scope(:find => {:conditions => blank}) do
440
- Developer.with_scope(:find => {:conditions => blank}) do
441
- assert_nothing_raised { Developer.find(:first) }
442
- end
443
- end
444
- end
445
- end
446
-
447
- def test_merged_scoped_find_on_blank_bind_conditions
448
- [ [""], ["",{}] ].each do |blank|
449
- Developer.with_scope(:find => {:conditions => blank}) do
450
- Developer.with_scope(:find => {:conditions => blank}) do
451
- assert_nothing_raised { Developer.find(:first) }
452
- end
453
- end
454
- end
455
- end
456
-
457
- def test_immutable_nested_scope
458
- options1 = { :conditions => "name = 'Jamis'" }
459
- options2 = { :conditions => "name = 'David'" }
460
- Developer.with_scope(:find => options1) do
461
- Developer.with_exclusive_scope(:find => options2) do
462
- assert_equal %w(David), Developer.find(:all).map { |d| d.name }
463
- options1[:conditions] = options2[:conditions] = nil
464
- assert_equal %w(David), Developer.find(:all).map { |d| d.name }
465
- end
466
- end
467
- end
468
-
469
- def test_immutable_merged_scope
470
- options1 = { :conditions => "name = 'Jamis'" }
471
- options2 = { :conditions => "salary > 10000" }
472
- Developer.with_scope(:find => options1) do
473
- Developer.with_scope(:find => options2) do
474
- assert_equal %w(Jamis), Developer.find(:all).map { |d| d.name }
475
- options1[:conditions] = options2[:conditions] = nil
476
- assert_equal %w(Jamis), Developer.find(:all).map { |d| d.name }
477
- end
478
- end
479
- end
480
-
481
- def test_ensure_that_method_scoping_is_correctly_restored
482
- Developer.with_scope(:find => { :conditions => "name = 'David'" }) do
483
- scoped_methods = Developer.instance_eval('current_scoped_methods')
484
- begin
485
- Developer.with_scope(:find => { :conditions => "name = 'Maiha'" }) do
486
- raise "an exception"
487
- end
488
- rescue
489
- end
490
- assert_equal scoped_methods, Developer.instance_eval('current_scoped_methods')
491
- end
492
- end
493
-
494
- def test_nested_scoped_find_merges_old_style_joins
495
- scoped_authors = Author.with_scope(:find => { :joins => 'INNER JOIN posts ON authors.id = posts.author_id' }) do
496
- Author.with_scope(:find => { :joins => 'INNER JOIN comments ON posts.id = comments.post_id' }) do
497
- Author.find(:all, :select => 'DISTINCT authors.*', :conditions => 'comments.id = 1')
498
- end
499
- end
500
- assert scoped_authors.include?(authors(:david))
501
- assert !scoped_authors.include?(authors(:mary))
502
- assert_equal 1, scoped_authors.size
503
- assert_equal authors(:david).attributes, scoped_authors.first.attributes
504
- end
505
-
506
- def test_nested_scoped_find_merges_new_style_joins
507
- scoped_authors = Author.with_scope(:find => { :joins => :posts }) do
508
- Author.with_scope(:find => { :joins => :comments }) do
509
- Author.find(:all, :select => 'DISTINCT authors.*', :conditions => 'comments.id = 1')
510
- end
511
- end
512
- assert scoped_authors.include?(authors(:david))
513
- assert !scoped_authors.include?(authors(:mary))
514
- assert_equal 1, scoped_authors.size
515
- assert_equal authors(:david).attributes, scoped_authors.first.attributes
516
- end
517
-
518
- def test_nested_scoped_find_merges_new_and_old_style_joins
519
- scoped_authors = Author.with_scope(:find => { :joins => :posts }) do
520
- Author.with_scope(:find => { :joins => 'INNER JOIN comments ON posts.id = comments.post_id' }) do
521
- Author.find(:all, :select => 'DISTINCT authors.*', :joins => '', :conditions => 'comments.id = 1')
522
- end
523
- end
524
- assert scoped_authors.include?(authors(:david))
525
- assert !scoped_authors.include?(authors(:mary))
526
- assert_equal 1, scoped_authors.size
527
- assert_equal authors(:david).attributes, scoped_authors.first.attributes
528
- end
529
- end
530
-
531
- class HasManyScopingTest< ActiveRecord::TestCase
532
- fixtures :comments, :posts
533
-
534
- def setup
535
- @welcome = Post.find(1)
536
- end
537
-
538
- def test_forwarding_of_static_methods
539
- assert_equal 'a comment...', Comment.what_are_you
540
- assert_equal 'a comment...', @welcome.comments.what_are_you
541
- end
542
-
543
- def test_forwarding_to_scoped
544
- assert_equal 4, Comment.search_by_type('Comment').size
545
- assert_equal 2, @welcome.comments.search_by_type('Comment').size
546
- end
547
-
548
- def test_forwarding_to_dynamic_finders
549
- assert_equal 4, Comment.find_all_by_type('Comment').size
550
- assert_equal 2, @welcome.comments.find_all_by_type('Comment').size
551
- end
552
-
553
- def test_nested_scope
554
- Comment.with_scope(:find => { :conditions => '1=1' }) do
555
- assert_equal 'a comment...', @welcome.comments.what_are_you
556
- end
557
- end
558
- end
559
-
560
- class HasAndBelongsToManyScopingTest< ActiveRecord::TestCase
561
- fixtures :posts, :categories, :categories_posts
562
-
563
- def setup
564
- @welcome = Post.find(1)
565
- end
566
-
567
- def test_forwarding_of_static_methods
568
- assert_equal 'a category...', Category.what_are_you
569
- assert_equal 'a category...', @welcome.categories.what_are_you
570
- end
571
-
572
- def test_forwarding_to_dynamic_finders
573
- assert_equal 4, Category.find_all_by_type('SpecialCategory').size
574
- assert_equal 0, @welcome.categories.find_all_by_type('SpecialCategory').size
575
- assert_equal 2, @welcome.categories.find_all_by_type('Category').size
576
- end
577
-
578
- def test_nested_scope
579
- Category.with_scope(:find => { :conditions => '1=1' }) do
580
- assert_equal 'a comment...', @welcome.comments.what_are_you
581
- end
582
- end
583
- end
584
-
585
- class DefaultScopingTest < ActiveRecord::TestCase
586
- fixtures :developers
587
-
588
- def test_default_scope
589
- expected = Developer.find(:all, :order => 'salary DESC').collect { |dev| dev.salary }
590
- received = DeveloperOrderedBySalary.find(:all).collect { |dev| dev.salary }
591
- assert_equal expected, received
592
- end
593
-
594
- def test_default_scope_with_conditions_string
595
- assert_equal Developer.find_all_by_name('David').map(&:id).sort, DeveloperCalledDavid.all.map(&:id).sort
596
- assert_equal nil, DeveloperCalledDavid.create!.name
597
- end
598
-
599
- def test_default_scope_with_conditions_hash
600
- assert_equal Developer.find_all_by_name('Jamis').map(&:id).sort, DeveloperCalledJamis.all.map(&:id).sort
601
- assert_equal 'Jamis', DeveloperCalledJamis.create!.name
602
- end
603
-
604
- def test_default_scoping_with_threads
605
- scope = [{ :create => {}, :find => { :order => 'salary DESC' } }]
606
-
607
- 2.times do
608
- Thread.new { assert_equal scope, DeveloperOrderedBySalary.send(:scoped_methods) }.join
609
- end
610
- end
611
-
612
- def test_default_scoping_with_inheritance
613
- scope = [{ :create => {}, :find => { :order => 'salary DESC' } }]
614
-
615
- # Inherit a class having a default scope and define a new default scope
616
- klass = Class.new(DeveloperOrderedBySalary)
617
- klass.send :default_scope, {}
618
-
619
- # Scopes added on children should append to parent scope
620
- expected_klass_scope = [{ :create => {}, :find => { :order => 'salary DESC' }}, { :create => {}, :find => {} }]
621
- assert_equal expected_klass_scope, klass.send(:scoped_methods)
622
-
623
- # Parent should still have the original scope
624
- assert_equal scope, DeveloperOrderedBySalary.send(:scoped_methods)
625
- end
626
-
627
- def test_method_scope
628
- expected = Developer.find(:all, :order => 'name DESC').collect { |dev| dev.salary }
629
- received = DeveloperOrderedBySalary.all_ordered_by_name.collect { |dev| dev.salary }
630
- assert_equal expected, received
631
- end
632
-
633
- def test_nested_scope
634
- expected = Developer.find(:all, :order => 'name DESC').collect { |dev| dev.salary }
635
- received = DeveloperOrderedBySalary.with_scope(:find => { :order => 'name DESC'}) do
636
- DeveloperOrderedBySalary.find(:all).collect { |dev| dev.salary }
637
- end
638
- assert_equal expected, received
639
- end
640
-
641
- def test_named_scope_overwrites_default
642
- expected = Developer.find(:all, :order => 'name DESC').collect { |dev| dev.name }
643
- received = DeveloperOrderedBySalary.by_name.find(:all).collect { |dev| dev.name }
644
- assert_equal expected, received
645
- end
646
-
647
- def test_nested_exclusive_scope
648
- expected = Developer.find(:all, :limit => 100).collect { |dev| dev.salary }
649
- received = DeveloperOrderedBySalary.with_exclusive_scope(:find => { :limit => 100 }) do
650
- DeveloperOrderedBySalary.find(:all).collect { |dev| dev.salary }
651
- end
652
- assert_equal expected, received
653
- end
654
-
655
- def test_overwriting_default_scope
656
- expected = Developer.find(:all, :order => 'salary').collect { |dev| dev.salary }
657
- received = DeveloperOrderedBySalary.find(:all, :order => 'salary').collect { |dev| dev.salary }
658
- assert_equal expected, received
659
- end
660
- end
661
-
662
- =begin
663
- # We disabled the scoping for has_one and belongs_to as we can't think of a proper use case
664
-
665
- class BelongsToScopingTest< ActiveRecord::TestCase
666
- fixtures :comments, :posts
667
-
668
- def setup
669
- @greetings = Comment.find(1)
670
- end
671
-
672
- def test_forwarding_of_static_method
673
- assert_equal 'a post...', Post.what_are_you
674
- assert_equal 'a post...', @greetings.post.what_are_you
675
- end
676
-
677
- def test_forwarding_to_dynamic_finders
678
- assert_equal 4, Post.find_all_by_type('Post').size
679
- assert_equal 1, @greetings.post.find_all_by_type('Post').size
680
- end
681
-
682
- end
683
-
684
- class HasOneScopingTest< ActiveRecord::TestCase
685
- fixtures :comments, :posts
686
-
687
- def setup
688
- @sti_comments = Post.find(4)
689
- end
690
-
691
- def test_forwarding_of_static_methods
692
- assert_equal 'a comment...', Comment.what_are_you
693
- assert_equal 'a very special comment...', @sti_comments.very_special_comment.what_are_you
694
- end
695
-
696
- def test_forwarding_to_dynamic_finders
697
- assert_equal 1, Comment.find_all_by_type('VerySpecialComment').size
698
- assert_equal 1, @sti_comments.very_special_comment.find_all_by_type('VerySpecialComment').size
699
- assert_equal 0, @sti_comments.very_special_comment.find_all_by_type('Comment').size
700
- end
701
-
702
- end
703
-
704
- =end