activerecord 2.3.18 → 3.0.0.beta

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 (378) hide show
  1. data/CHANGELOG +105 -34
  2. data/examples/performance.rb +3 -39
  3. data/examples/simple.rb +14 -0
  4. data/lib/active_record.rb +81 -47
  5. data/lib/active_record/aggregations.rb +1 -3
  6. data/lib/active_record/association_preload.rb +39 -54
  7. data/lib/active_record/associations.rb +262 -419
  8. data/lib/active_record/associations/association_collection.rb +85 -100
  9. data/lib/active_record/associations/association_proxy.rb +20 -18
  10. data/lib/active_record/associations/belongs_to_association.rb +8 -8
  11. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +13 -35
  12. data/lib/active_record/associations/has_many_association.rb +11 -19
  13. data/lib/active_record/associations/has_many_through_association.rb +30 -183
  14. data/lib/active_record/associations/has_one_association.rb +10 -10
  15. data/lib/active_record/associations/has_one_through_association.rb +13 -11
  16. data/lib/active_record/associations/through_association_scope.rb +153 -0
  17. data/lib/active_record/attribute_methods.rb +17 -370
  18. data/lib/active_record/attribute_methods/before_type_cast.rb +33 -0
  19. data/lib/active_record/attribute_methods/dirty.rb +87 -0
  20. data/lib/active_record/attribute_methods/primary_key.rb +44 -0
  21. data/lib/active_record/attribute_methods/query.rb +37 -0
  22. data/lib/active_record/attribute_methods/read.rb +116 -0
  23. data/lib/active_record/attribute_methods/time_zone_conversion.rb +60 -0
  24. data/lib/active_record/attribute_methods/write.rb +37 -0
  25. data/lib/active_record/autosave_association.rb +20 -41
  26. data/lib/active_record/base.rb +357 -1180
  27. data/lib/active_record/batches.rb +10 -16
  28. data/lib/active_record/callbacks.rb +66 -126
  29. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +17 -13
  30. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +5 -25
  31. data/lib/active_record/connection_adapters/abstract/database_statements.rb +4 -43
  32. data/lib/active_record/connection_adapters/abstract/query_cache.rb +3 -2
  33. data/lib/active_record/connection_adapters/abstract/quoting.rb +15 -4
  34. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +1 -1
  35. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +18 -72
  36. data/lib/active_record/connection_adapters/abstract_adapter.rb +16 -49
  37. data/lib/active_record/connection_adapters/mysql_adapter.rb +15 -27
  38. data/lib/active_record/connection_adapters/postgresql_adapter.rb +84 -46
  39. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +9 -3
  40. data/lib/active_record/connection_adapters/sqlite_adapter.rb +34 -65
  41. data/lib/active_record/fixtures.rb +21 -25
  42. data/lib/active_record/locale/en.yml +9 -27
  43. data/lib/active_record/locking/optimistic.rb +16 -48
  44. data/lib/active_record/migration.rb +59 -46
  45. data/lib/active_record/named_scope.rb +85 -92
  46. data/lib/active_record/nested_attributes.rb +18 -24
  47. data/lib/active_record/observer.rb +18 -94
  48. data/lib/active_record/railtie.rb +83 -0
  49. data/lib/active_record/railties/controller_runtime.rb +38 -0
  50. data/lib/active_record/railties/databases.rake +477 -0
  51. data/lib/active_record/railties/subscriber.rb +27 -0
  52. data/lib/active_record/reflection.rb +2 -15
  53. data/lib/active_record/relation.rb +339 -0
  54. data/lib/active_record/relation/calculations.rb +259 -0
  55. data/lib/active_record/relation/finder_methods.rb +315 -0
  56. data/lib/active_record/relation/predicate_builder.rb +46 -0
  57. data/lib/active_record/relation/query_methods.rb +218 -0
  58. data/lib/active_record/relation/spawn_methods.rb +102 -0
  59. data/lib/active_record/schema_dumper.rb +10 -6
  60. data/lib/active_record/serialization.rb +31 -74
  61. data/lib/active_record/serializers/xml_serializer.rb +33 -121
  62. data/lib/active_record/session_store.rb +1 -9
  63. data/lib/active_record/test_case.rb +1 -3
  64. data/lib/active_record/timestamp.rb +7 -5
  65. data/lib/active_record/transactions.rb +9 -9
  66. data/lib/active_record/validations.rb +51 -1100
  67. data/lib/active_record/validations/associated.rb +47 -0
  68. data/lib/active_record/validations/uniqueness.rb +181 -0
  69. data/lib/active_record/version.rb +3 -3
  70. data/lib/generators/active_record.rb +30 -0
  71. data/lib/generators/active_record/migration/migration_generator.rb +25 -0
  72. data/lib/generators/active_record/migration/templates/migration.rb +11 -0
  73. data/lib/generators/active_record/model/model_generator.rb +33 -0
  74. data/lib/generators/active_record/model/templates/migration.rb +16 -0
  75. data/lib/generators/active_record/model/templates/model.rb +5 -0
  76. data/lib/generators/active_record/observer/observer_generator.rb +15 -0
  77. data/lib/generators/active_record/observer/templates/observer.rb +2 -0
  78. data/lib/generators/active_record/session_migration/session_migration_generator.rb +24 -0
  79. data/lib/generators/active_record/session_migration/templates/migration.rb +16 -0
  80. metadata +67 -325
  81. data/RUNNING_UNIT_TESTS +0 -36
  82. data/Rakefile +0 -268
  83. data/install.rb +0 -30
  84. data/lib/active_record/calculations.rb +0 -321
  85. data/lib/active_record/connection_adapters/abstract/database_limits.rb +0 -57
  86. data/lib/active_record/dirty.rb +0 -183
  87. data/lib/active_record/serializers/json_serializer.rb +0 -91
  88. data/lib/activerecord.rb +0 -2
  89. data/test/assets/example.log +0 -1
  90. data/test/assets/flowers.jpg +0 -0
  91. data/test/cases/aaa_create_tables_test.rb +0 -24
  92. data/test/cases/active_schema_test_mysql.rb +0 -122
  93. data/test/cases/active_schema_test_postgresql.rb +0 -24
  94. data/test/cases/adapter_test.rb +0 -144
  95. data/test/cases/aggregations_test.rb +0 -167
  96. data/test/cases/ar_schema_test.rb +0 -32
  97. data/test/cases/associations/belongs_to_associations_test.rb +0 -438
  98. data/test/cases/associations/callbacks_test.rb +0 -161
  99. data/test/cases/associations/cascaded_eager_loading_test.rb +0 -131
  100. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +0 -36
  101. data/test/cases/associations/eager_load_nested_include_test.rb +0 -131
  102. data/test/cases/associations/eager_load_nested_polymorphic_include.rb +0 -19
  103. data/test/cases/associations/eager_singularization_test.rb +0 -145
  104. data/test/cases/associations/eager_test.rb +0 -852
  105. data/test/cases/associations/extension_test.rb +0 -62
  106. data/test/cases/associations/habtm_join_table_test.rb +0 -56
  107. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +0 -827
  108. data/test/cases/associations/has_many_associations_test.rb +0 -1273
  109. data/test/cases/associations/has_many_through_associations_test.rb +0 -360
  110. data/test/cases/associations/has_one_associations_test.rb +0 -330
  111. data/test/cases/associations/has_one_through_associations_test.rb +0 -209
  112. data/test/cases/associations/inner_join_association_test.rb +0 -93
  113. data/test/cases/associations/inverse_associations_test.rb +0 -566
  114. data/test/cases/associations/join_model_test.rb +0 -712
  115. data/test/cases/associations_test.rb +0 -282
  116. data/test/cases/attribute_methods_test.rb +0 -305
  117. data/test/cases/autosave_association_test.rb +0 -1218
  118. data/test/cases/base_test.rb +0 -2166
  119. data/test/cases/batches_test.rb +0 -81
  120. data/test/cases/binary_test.rb +0 -30
  121. data/test/cases/calculations_test.rb +0 -360
  122. data/test/cases/callbacks_observers_test.rb +0 -38
  123. data/test/cases/callbacks_test.rb +0 -438
  124. data/test/cases/class_inheritable_attributes_test.rb +0 -32
  125. data/test/cases/column_alias_test.rb +0 -17
  126. data/test/cases/column_definition_test.rb +0 -70
  127. data/test/cases/connection_pool_test.rb +0 -25
  128. data/test/cases/connection_test_firebird.rb +0 -8
  129. data/test/cases/connection_test_mysql.rb +0 -65
  130. data/test/cases/copy_table_test_sqlite.rb +0 -80
  131. data/test/cases/counter_cache_test.rb +0 -84
  132. data/test/cases/database_statements_test.rb +0 -12
  133. data/test/cases/datatype_test_postgresql.rb +0 -204
  134. data/test/cases/date_time_test.rb +0 -37
  135. data/test/cases/default_test_firebird.rb +0 -16
  136. data/test/cases/defaults_test.rb +0 -111
  137. data/test/cases/deprecated_finder_test.rb +0 -30
  138. data/test/cases/dirty_test.rb +0 -316
  139. data/test/cases/finder_respond_to_test.rb +0 -76
  140. data/test/cases/finder_test.rb +0 -1098
  141. data/test/cases/fixtures_test.rb +0 -661
  142. data/test/cases/helper.rb +0 -68
  143. data/test/cases/i18n_test.rb +0 -46
  144. data/test/cases/inheritance_test.rb +0 -262
  145. data/test/cases/invalid_date_test.rb +0 -24
  146. data/test/cases/json_serialization_test.rb +0 -219
  147. data/test/cases/lifecycle_test.rb +0 -193
  148. data/test/cases/locking_test.rb +0 -350
  149. data/test/cases/method_scoping_test.rb +0 -704
  150. data/test/cases/migration_test.rb +0 -1649
  151. data/test/cases/migration_test_firebird.rb +0 -124
  152. data/test/cases/mixin_test.rb +0 -96
  153. data/test/cases/modules_test.rb +0 -109
  154. data/test/cases/multiple_db_test.rb +0 -85
  155. data/test/cases/named_scope_test.rb +0 -372
  156. data/test/cases/nested_attributes_test.rb +0 -840
  157. data/test/cases/pk_test.rb +0 -119
  158. data/test/cases/pooled_connections_test.rb +0 -103
  159. data/test/cases/query_cache_test.rb +0 -129
  160. data/test/cases/readonly_test.rb +0 -107
  161. data/test/cases/reflection_test.rb +0 -234
  162. data/test/cases/reload_models_test.rb +0 -22
  163. data/test/cases/repair_helper.rb +0 -50
  164. data/test/cases/reserved_word_test_mysql.rb +0 -176
  165. data/test/cases/sanitize_test.rb +0 -25
  166. data/test/cases/schema_authorization_test_postgresql.rb +0 -75
  167. data/test/cases/schema_dumper_test.rb +0 -211
  168. data/test/cases/schema_test_postgresql.rb +0 -178
  169. data/test/cases/serialization_test.rb +0 -47
  170. data/test/cases/sp_test_mysql.rb +0 -16
  171. data/test/cases/synonym_test_oracle.rb +0 -17
  172. data/test/cases/timestamp_test.rb +0 -75
  173. data/test/cases/transactions_test.rb +0 -543
  174. data/test/cases/unconnected_test.rb +0 -32
  175. data/test/cases/validations_i18n_test.rb +0 -925
  176. data/test/cases/validations_test.rb +0 -1684
  177. data/test/cases/xml_serialization_test.rb +0 -240
  178. data/test/cases/yaml_serialization_test.rb +0 -11
  179. data/test/config.rb +0 -5
  180. data/test/connections/jdbc_jdbcderby/connection.rb +0 -18
  181. data/test/connections/jdbc_jdbch2/connection.rb +0 -18
  182. data/test/connections/jdbc_jdbchsqldb/connection.rb +0 -18
  183. data/test/connections/jdbc_jdbcmysql/connection.rb +0 -26
  184. data/test/connections/jdbc_jdbcpostgresql/connection.rb +0 -26
  185. data/test/connections/jdbc_jdbcsqlite3/connection.rb +0 -25
  186. data/test/connections/native_db2/connection.rb +0 -25
  187. data/test/connections/native_firebird/connection.rb +0 -26
  188. data/test/connections/native_frontbase/connection.rb +0 -27
  189. data/test/connections/native_mysql/connection.rb +0 -25
  190. data/test/connections/native_openbase/connection.rb +0 -21
  191. data/test/connections/native_oracle/connection.rb +0 -27
  192. data/test/connections/native_postgresql/connection.rb +0 -21
  193. data/test/connections/native_sqlite/connection.rb +0 -25
  194. data/test/connections/native_sqlite3/connection.rb +0 -25
  195. data/test/connections/native_sqlite3/in_memory_connection.rb +0 -18
  196. data/test/connections/native_sybase/connection.rb +0 -23
  197. data/test/fixtures/accounts.yml +0 -29
  198. data/test/fixtures/all/developers.yml +0 -0
  199. data/test/fixtures/all/people.csv +0 -0
  200. data/test/fixtures/all/tasks.yml +0 -0
  201. data/test/fixtures/author_addresses.yml +0 -5
  202. data/test/fixtures/author_favorites.yml +0 -4
  203. data/test/fixtures/authors.yml +0 -9
  204. data/test/fixtures/binaries.yml +0 -132
  205. data/test/fixtures/books.yml +0 -7
  206. data/test/fixtures/categories.yml +0 -14
  207. data/test/fixtures/categories/special_categories.yml +0 -9
  208. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +0 -4
  209. data/test/fixtures/categories_ordered.yml +0 -7
  210. data/test/fixtures/categories_posts.yml +0 -23
  211. data/test/fixtures/categorizations.yml +0 -17
  212. data/test/fixtures/clubs.yml +0 -6
  213. data/test/fixtures/comments.yml +0 -59
  214. data/test/fixtures/companies.yml +0 -56
  215. data/test/fixtures/computers.yml +0 -4
  216. data/test/fixtures/courses.yml +0 -7
  217. data/test/fixtures/customers.yml +0 -26
  218. data/test/fixtures/developers.yml +0 -21
  219. data/test/fixtures/developers_projects.yml +0 -17
  220. data/test/fixtures/edges.yml +0 -6
  221. data/test/fixtures/entrants.yml +0 -14
  222. data/test/fixtures/faces.yml +0 -11
  223. data/test/fixtures/fk_test_has_fk.yml +0 -3
  224. data/test/fixtures/fk_test_has_pk.yml +0 -2
  225. data/test/fixtures/funny_jokes.yml +0 -10
  226. data/test/fixtures/interests.yml +0 -33
  227. data/test/fixtures/items.yml +0 -4
  228. data/test/fixtures/jobs.yml +0 -7
  229. data/test/fixtures/legacy_things.yml +0 -3
  230. data/test/fixtures/mateys.yml +0 -4
  231. data/test/fixtures/member_types.yml +0 -6
  232. data/test/fixtures/members.yml +0 -6
  233. data/test/fixtures/memberships.yml +0 -20
  234. data/test/fixtures/men.yml +0 -5
  235. data/test/fixtures/minimalistics.yml +0 -2
  236. data/test/fixtures/mixed_case_monkeys.yml +0 -6
  237. data/test/fixtures/mixins.yml +0 -29
  238. data/test/fixtures/movies.yml +0 -7
  239. data/test/fixtures/naked/csv/accounts.csv +0 -1
  240. data/test/fixtures/naked/yml/accounts.yml +0 -1
  241. data/test/fixtures/naked/yml/companies.yml +0 -1
  242. data/test/fixtures/naked/yml/courses.yml +0 -1
  243. data/test/fixtures/organizations.yml +0 -5
  244. data/test/fixtures/owners.yml +0 -7
  245. data/test/fixtures/parrots.yml +0 -27
  246. data/test/fixtures/parrots_pirates.yml +0 -7
  247. data/test/fixtures/people.yml +0 -15
  248. data/test/fixtures/pets.yml +0 -14
  249. data/test/fixtures/pirates.yml +0 -9
  250. data/test/fixtures/polymorphic_designs.yml +0 -19
  251. data/test/fixtures/polymorphic_prices.yml +0 -19
  252. data/test/fixtures/posts.yml +0 -52
  253. data/test/fixtures/price_estimates.yml +0 -7
  254. data/test/fixtures/projects.yml +0 -7
  255. data/test/fixtures/readers.yml +0 -9
  256. data/test/fixtures/references.yml +0 -17
  257. data/test/fixtures/reserved_words/distinct.yml +0 -5
  258. data/test/fixtures/reserved_words/distincts_selects.yml +0 -11
  259. data/test/fixtures/reserved_words/group.yml +0 -14
  260. data/test/fixtures/reserved_words/select.yml +0 -8
  261. data/test/fixtures/reserved_words/values.yml +0 -7
  262. data/test/fixtures/ships.yml +0 -5
  263. data/test/fixtures/sponsors.yml +0 -9
  264. data/test/fixtures/subscribers.yml +0 -7
  265. data/test/fixtures/subscriptions.yml +0 -12
  266. data/test/fixtures/taggings.yml +0 -28
  267. data/test/fixtures/tags.yml +0 -7
  268. data/test/fixtures/tasks.yml +0 -7
  269. data/test/fixtures/tees.yml +0 -4
  270. data/test/fixtures/ties.yml +0 -4
  271. data/test/fixtures/topics.yml +0 -42
  272. data/test/fixtures/toys.yml +0 -4
  273. data/test/fixtures/treasures.yml +0 -10
  274. data/test/fixtures/vertices.yml +0 -4
  275. data/test/fixtures/warehouse-things.yml +0 -3
  276. data/test/fixtures/zines.yml +0 -5
  277. data/test/migrations/broken/100_migration_that_raises_exception.rb +0 -10
  278. data/test/migrations/decimal/1_give_me_big_numbers.rb +0 -15
  279. data/test/migrations/duplicate/1_people_have_last_names.rb +0 -9
  280. data/test/migrations/duplicate/2_we_need_reminders.rb +0 -12
  281. data/test/migrations/duplicate/3_foo.rb +0 -7
  282. data/test/migrations/duplicate/3_innocent_jointable.rb +0 -12
  283. data/test/migrations/duplicate_names/20080507052938_chunky.rb +0 -7
  284. data/test/migrations/duplicate_names/20080507053028_chunky.rb +0 -7
  285. data/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +0 -12
  286. data/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +0 -9
  287. data/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +0 -12
  288. data/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +0 -9
  289. data/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +0 -8
  290. data/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +0 -12
  291. data/test/migrations/missing/1000_people_have_middle_names.rb +0 -9
  292. data/test/migrations/missing/1_people_have_last_names.rb +0 -9
  293. data/test/migrations/missing/3_we_need_reminders.rb +0 -12
  294. data/test/migrations/missing/4_innocent_jointable.rb +0 -12
  295. data/test/migrations/valid/1_people_have_last_names.rb +0 -9
  296. data/test/migrations/valid/2_we_need_reminders.rb +0 -12
  297. data/test/migrations/valid/3_innocent_jointable.rb +0 -12
  298. data/test/models/author.rb +0 -151
  299. data/test/models/auto_id.rb +0 -4
  300. data/test/models/binary.rb +0 -2
  301. data/test/models/bird.rb +0 -9
  302. data/test/models/book.rb +0 -4
  303. data/test/models/categorization.rb +0 -5
  304. data/test/models/category.rb +0 -34
  305. data/test/models/citation.rb +0 -6
  306. data/test/models/club.rb +0 -13
  307. data/test/models/column_name.rb +0 -3
  308. data/test/models/comment.rb +0 -29
  309. data/test/models/company.rb +0 -173
  310. data/test/models/company_in_module.rb +0 -78
  311. data/test/models/computer.rb +0 -3
  312. data/test/models/contact.rb +0 -16
  313. data/test/models/contract.rb +0 -5
  314. data/test/models/course.rb +0 -3
  315. data/test/models/customer.rb +0 -73
  316. data/test/models/default.rb +0 -2
  317. data/test/models/developer.rb +0 -101
  318. data/test/models/edge.rb +0 -5
  319. data/test/models/entrant.rb +0 -3
  320. data/test/models/essay.rb +0 -3
  321. data/test/models/event.rb +0 -3
  322. data/test/models/event_author.rb +0 -8
  323. data/test/models/face.rb +0 -7
  324. data/test/models/guid.rb +0 -2
  325. data/test/models/interest.rb +0 -5
  326. data/test/models/invoice.rb +0 -4
  327. data/test/models/item.rb +0 -7
  328. data/test/models/job.rb +0 -5
  329. data/test/models/joke.rb +0 -3
  330. data/test/models/keyboard.rb +0 -3
  331. data/test/models/legacy_thing.rb +0 -3
  332. data/test/models/line_item.rb +0 -3
  333. data/test/models/man.rb +0 -9
  334. data/test/models/matey.rb +0 -4
  335. data/test/models/member.rb +0 -12
  336. data/test/models/member_detail.rb +0 -5
  337. data/test/models/member_type.rb +0 -3
  338. data/test/models/membership.rb +0 -9
  339. data/test/models/minimalistic.rb +0 -2
  340. data/test/models/mixed_case_monkey.rb +0 -3
  341. data/test/models/movie.rb +0 -5
  342. data/test/models/order.rb +0 -4
  343. data/test/models/organization.rb +0 -6
  344. data/test/models/owner.rb +0 -5
  345. data/test/models/parrot.rb +0 -22
  346. data/test/models/person.rb +0 -16
  347. data/test/models/pet.rb +0 -5
  348. data/test/models/pirate.rb +0 -80
  349. data/test/models/polymorphic_design.rb +0 -3
  350. data/test/models/polymorphic_price.rb +0 -3
  351. data/test/models/post.rb +0 -102
  352. data/test/models/price_estimate.rb +0 -3
  353. data/test/models/project.rb +0 -30
  354. data/test/models/reader.rb +0 -4
  355. data/test/models/reference.rb +0 -4
  356. data/test/models/reply.rb +0 -46
  357. data/test/models/ship.rb +0 -19
  358. data/test/models/ship_part.rb +0 -7
  359. data/test/models/sponsor.rb +0 -4
  360. data/test/models/subject.rb +0 -4
  361. data/test/models/subscriber.rb +0 -8
  362. data/test/models/subscription.rb +0 -4
  363. data/test/models/tag.rb +0 -7
  364. data/test/models/tagging.rb +0 -10
  365. data/test/models/task.rb +0 -3
  366. data/test/models/tee.rb +0 -4
  367. data/test/models/tie.rb +0 -4
  368. data/test/models/topic.rb +0 -80
  369. data/test/models/toy.rb +0 -6
  370. data/test/models/treasure.rb +0 -8
  371. data/test/models/vertex.rb +0 -9
  372. data/test/models/warehouse_thing.rb +0 -5
  373. data/test/models/zine.rb +0 -3
  374. data/test/schema/mysql_specific_schema.rb +0 -31
  375. data/test/schema/postgresql_specific_schema.rb +0 -114
  376. data/test/schema/schema.rb +0 -550
  377. data/test/schema/schema2.rb +0 -6
  378. 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