ibm_db 3.0.5-x86-mingw32 → 4.0.0-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (586) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -0
  3. data/LICENSE +1 -1
  4. data/MANIFEST +14 -14
  5. data/ParameterizedQueries README +6 -6
  6. data/README +208 -225
  7. data/ext/Makefile.nt32 +181 -181
  8. data/ext/Makefile.nt32.191 +212 -212
  9. data/ext/extconf.rb +291 -291
  10. data/ext/ibm_db.c +11887 -11887
  11. data/ext/ruby_ibm_db.h +241 -241
  12. data/ext/ruby_ibm_db_cli.c +866 -866
  13. data/ext/ruby_ibm_db_cli.h +500 -500
  14. data/init.rb +41 -41
  15. data/lib/IBM_DB.rb +27 -27
  16. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3452 -3177
  17. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -2
  18. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  19. data/lib/mswin32/ibm_db.rb +91 -123
  20. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  21. data/test/active_record/connection_adapters/fake_adapter.rb +49 -46
  22. data/test/assets/example.log +1 -1
  23. data/test/assets/test.txt +1 -1
  24. data/test/cases/adapter_test.rb +351 -276
  25. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
  26. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
  27. data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
  28. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
  29. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
  30. data/test/cases/adapters/mysql2/connection_test.rb +210 -0
  31. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
  32. data/test/cases/adapters/mysql2/enum_test.rb +26 -0
  33. data/test/cases/adapters/mysql2/explain_test.rb +21 -0
  34. data/test/cases/adapters/mysql2/json_test.rb +195 -0
  35. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
  36. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  37. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
  38. data/test/cases/adapters/mysql2/schema_test.rb +126 -0
  39. data/test/cases/adapters/mysql2/sp_test.rb +36 -0
  40. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
  41. data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
  42. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
  43. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
  44. data/test/cases/adapters/postgresql/array_test.rb +339 -0
  45. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
  46. data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
  47. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
  48. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
  49. data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
  50. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  51. data/test/cases/adapters/postgresql/collation_test.rb +53 -0
  52. data/test/cases/adapters/postgresql/composite_test.rb +132 -0
  53. data/test/cases/adapters/postgresql/connection_test.rb +257 -0
  54. data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
  55. data/test/cases/adapters/postgresql/domain_test.rb +47 -0
  56. data/test/cases/adapters/postgresql/enum_test.rb +91 -0
  57. data/test/cases/adapters/postgresql/explain_test.rb +20 -0
  58. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
  59. data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
  60. data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
  61. data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
  62. data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
  63. data/test/cases/adapters/postgresql/integer_test.rb +25 -0
  64. data/test/cases/adapters/postgresql/json_test.rb +237 -0
  65. data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
  66. data/test/cases/adapters/postgresql/money_test.rb +96 -0
  67. data/test/cases/adapters/postgresql/network_test.rb +94 -0
  68. data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
  69. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
  70. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  71. data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
  72. data/test/cases/adapters/postgresql/range_test.rb +343 -0
  73. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
  74. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
  75. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
  76. data/test/cases/adapters/postgresql/schema_test.rb +597 -0
  77. data/test/cases/adapters/postgresql/serial_test.rb +154 -0
  78. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
  79. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
  80. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
  81. data/test/cases/adapters/postgresql/utils_test.rb +62 -0
  82. data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
  83. data/test/cases/adapters/postgresql/xml_test.rb +54 -0
  84. data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
  85. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
  86. data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
  87. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
  88. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
  89. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  90. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
  91. data/test/cases/aggregations_test.rb +168 -158
  92. data/test/cases/ar_schema_test.rb +146 -161
  93. data/test/cases/associations/association_scope_test.rb +16 -21
  94. data/test/cases/associations/belongs_to_associations_test.rb +1141 -1029
  95. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
  96. data/test/cases/associations/callbacks_test.rb +190 -192
  97. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  98. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  99. data/test/cases/associations/eager_load_nested_include_test.rb +126 -128
  100. data/test/cases/associations/eager_singularization_test.rb +148 -148
  101. data/test/cases/associations/eager_test.rb +1514 -1429
  102. data/test/cases/associations/extension_test.rb +87 -82
  103. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -972
  104. data/test/cases/associations/has_many_associations_test.rb +2501 -2182
  105. data/test/cases/associations/has_many_through_associations_test.rb +1271 -1204
  106. data/test/cases/associations/has_one_associations_test.rb +707 -610
  107. data/test/cases/associations/has_one_through_associations_test.rb +383 -380
  108. data/test/cases/associations/inner_join_association_test.rb +139 -139
  109. data/test/cases/associations/inverse_associations_test.rb +733 -706
  110. data/test/cases/associations/join_model_test.rb +777 -754
  111. data/test/cases/associations/left_outer_join_association_test.rb +88 -0
  112. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  113. data/test/cases/associations/required_test.rb +102 -82
  114. data/test/cases/associations_test.rb +385 -380
  115. data/test/cases/attribute_decorators_test.rb +125 -125
  116. data/test/cases/attribute_methods/read_test.rb +60 -60
  117. data/test/cases/attribute_methods_test.rb +1009 -952
  118. data/test/cases/attribute_set_test.rb +270 -210
  119. data/test/cases/attribute_test.rb +246 -180
  120. data/test/cases/attributes_test.rb +253 -136
  121. data/test/cases/autosave_association_test.rb +1708 -1595
  122. data/test/cases/base_test.rb +1713 -1664
  123. data/test/cases/batches_test.rb +489 -212
  124. data/test/cases/binary_test.rb +44 -52
  125. data/test/cases/bind_parameter_test.rb +110 -100
  126. data/test/cases/cache_key_test.rb +25 -0
  127. data/test/cases/calculations_test.rb +798 -646
  128. data/test/cases/callbacks_test.rb +636 -543
  129. data/test/cases/clone_test.rb +40 -40
  130. data/test/cases/coders/json_test.rb +15 -0
  131. data/test/cases/coders/yaml_column_test.rb +63 -63
  132. data/test/cases/collection_cache_key_test.rb +115 -0
  133. data/test/cases/column_alias_test.rb +17 -17
  134. data/test/cases/column_definition_test.rb +92 -123
  135. data/test/cases/comment_test.rb +143 -0
  136. data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -54
  137. data/test/cases/connection_adapters/connection_handler_test.rb +160 -53
  138. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  139. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -293
  140. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -65
  141. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  142. data/test/cases/connection_adapters/schema_cache_test.rb +61 -56
  143. data/test/cases/connection_adapters/type_lookup_test.rb +118 -110
  144. data/test/cases/connection_management_test.rb +112 -122
  145. data/test/cases/connection_pool_test.rb +521 -346
  146. data/test/cases/connection_specification/resolver_test.rb +131 -116
  147. data/test/cases/core_test.rb +112 -112
  148. data/test/cases/counter_cache_test.rb +214 -209
  149. data/test/cases/custom_locking_test.rb +17 -17
  150. data/test/cases/database_statements_test.rb +34 -19
  151. data/test/cases/{invalid_date_test.rb → date_test.rb} +44 -32
  152. data/test/cases/date_time_precision_test.rb +106 -0
  153. data/test/cases/date_time_test.rb +61 -61
  154. data/test/cases/defaults_test.rb +218 -223
  155. data/test/cases/dirty_test.rb +763 -785
  156. data/test/cases/disconnected_test.rb +30 -28
  157. data/test/cases/dup_test.rb +157 -157
  158. data/test/cases/enum_test.rb +444 -290
  159. data/test/cases/errors_test.rb +16 -0
  160. data/test/cases/explain_subscriber_test.rb +64 -64
  161. data/test/cases/explain_test.rb +87 -76
  162. data/test/cases/finder_respond_to_test.rb +60 -60
  163. data/test/cases/finder_test.rb +1294 -1169
  164. data/test/cases/fixture_set/file_test.rb +156 -138
  165. data/test/cases/fixtures_test.rb +988 -908
  166. data/test/cases/forbidden_attributes_protection_test.rb +165 -99
  167. data/test/cases/habtm_destroy_order_test.rb +61 -61
  168. data/test/cases/helper.rb +204 -210
  169. data/test/cases/hot_compatibility_test.rb +142 -54
  170. data/test/cases/i18n_test.rb +45 -45
  171. data/test/cases/inheritance_test.rb +606 -375
  172. data/test/cases/integration_test.rb +155 -139
  173. data/test/cases/invalid_connection_test.rb +24 -22
  174. data/test/cases/invertible_migration_test.rb +387 -295
  175. data/test/cases/json_serialization_test.rb +311 -302
  176. data/test/cases/locking_test.rb +493 -477
  177. data/test/cases/log_subscriber_test.rb +225 -136
  178. data/test/cases/migration/change_schema_test.rb +458 -512
  179. data/test/cases/migration/change_table_test.rb +256 -224
  180. data/test/cases/migration/column_attributes_test.rb +176 -192
  181. data/test/cases/migration/column_positioning_test.rb +56 -56
  182. data/test/cases/migration/columns_test.rb +310 -304
  183. data/test/cases/migration/command_recorder_test.rb +350 -305
  184. data/test/cases/migration/compatibility_test.rb +118 -0
  185. data/test/cases/migration/create_join_table_test.rb +157 -148
  186. data/test/cases/migration/foreign_key_test.rb +360 -328
  187. data/test/cases/migration/helper.rb +39 -39
  188. data/test/cases/migration/index_test.rb +218 -216
  189. data/test/cases/migration/logger_test.rb +36 -36
  190. data/test/cases/migration/pending_migrations_test.rb +52 -53
  191. data/test/cases/migration/references_foreign_key_test.rb +216 -169
  192. data/test/cases/migration/references_index_test.rb +101 -101
  193. data/test/cases/migration/references_statements_test.rb +136 -116
  194. data/test/cases/migration/rename_table_test.rb +93 -93
  195. data/test/cases/migration_test.rb +1157 -959
  196. data/test/cases/migrator_test.rb +470 -388
  197. data/test/cases/mixin_test.rb +68 -70
  198. data/test/cases/modules_test.rb +172 -173
  199. data/test/cases/multiparameter_attributes_test.rb +372 -350
  200. data/test/cases/multiple_db_test.rb +122 -115
  201. data/test/cases/nested_attributes_test.rb +1098 -1070
  202. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  203. data/test/cases/persistence_test.rb +1001 -909
  204. data/test/cases/pooled_connections_test.rb +81 -81
  205. data/test/cases/primary_keys_test.rb +376 -237
  206. data/test/cases/query_cache_test.rb +446 -326
  207. data/test/cases/quoting_test.rb +202 -156
  208. data/test/cases/readonly_test.rb +119 -118
  209. data/test/cases/reaper_test.rb +85 -85
  210. data/test/cases/reflection_test.rb +509 -463
  211. data/test/cases/relation/delegation_test.rb +63 -68
  212. data/test/cases/relation/merging_test.rb +157 -161
  213. data/test/cases/relation/mutation_test.rb +183 -165
  214. data/test/cases/relation/or_test.rb +92 -0
  215. data/test/cases/relation/predicate_builder_test.rb +16 -14
  216. data/test/cases/relation/record_fetch_warning_test.rb +40 -0
  217. data/test/cases/relation/where_chain_test.rb +105 -181
  218. data/test/cases/relation/where_clause_test.rb +182 -0
  219. data/test/cases/relation/where_test.rb +322 -300
  220. data/test/cases/relation_test.rb +328 -319
  221. data/test/cases/relations_test.rb +2026 -1815
  222. data/test/cases/reload_models_test.rb +22 -22
  223. data/test/cases/result_test.rb +90 -80
  224. data/test/cases/sanitize_test.rb +176 -83
  225. data/test/cases/schema_dumper_test.rb +457 -463
  226. data/test/cases/schema_loading_test.rb +52 -0
  227. data/test/cases/scoping/default_scoping_test.rb +528 -454
  228. data/test/cases/scoping/named_scoping_test.rb +561 -524
  229. data/test/cases/scoping/relation_scoping_test.rb +400 -357
  230. data/test/cases/secure_token_test.rb +32 -0
  231. data/test/cases/serialization_test.rb +104 -104
  232. data/test/cases/serialized_attribute_test.rb +364 -277
  233. data/test/cases/statement_cache_test.rb +136 -98
  234. data/test/cases/store_test.rb +195 -194
  235. data/test/cases/suppressor_test.rb +63 -0
  236. data/test/cases/tasks/database_tasks_test.rb +462 -398
  237. data/test/cases/tasks/mysql_rake_test.rb +345 -324
  238. data/test/cases/tasks/postgresql_rake_test.rb +304 -250
  239. data/test/cases/tasks/sqlite_rake_test.rb +220 -193
  240. data/test/cases/test_case.rb +131 -123
  241. data/test/cases/test_fixtures_test.rb +36 -0
  242. data/test/cases/time_precision_test.rb +102 -0
  243. data/test/cases/timestamp_test.rb +501 -467
  244. data/test/cases/touch_later_test.rb +121 -0
  245. data/test/cases/transaction_callbacks_test.rb +518 -452
  246. data/test/cases/transaction_isolation_test.rb +106 -106
  247. data/test/cases/transactions_test.rb +834 -817
  248. data/test/cases/type/adapter_specific_registry_test.rb +133 -0
  249. data/test/cases/type/date_time_test.rb +14 -0
  250. data/test/cases/type/integer_test.rb +27 -121
  251. data/test/cases/type/string_test.rb +22 -36
  252. data/test/cases/type/type_map_test.rb +177 -177
  253. data/test/cases/type_test.rb +39 -0
  254. data/test/cases/types_test.rb +24 -141
  255. data/test/cases/unconnected_test.rb +33 -33
  256. data/test/cases/validations/absence_validation_test.rb +73 -0
  257. data/test/cases/validations/association_validation_test.rb +97 -86
  258. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  259. data/test/cases/validations/i18n_validation_test.rb +86 -90
  260. data/test/cases/validations/length_validation_test.rb +79 -47
  261. data/test/cases/validations/presence_validation_test.rb +103 -68
  262. data/test/cases/validations/uniqueness_validation_test.rb +548 -457
  263. data/test/cases/validations_repair_helper.rb +19 -23
  264. data/test/cases/validations_test.rb +194 -165
  265. data/test/cases/view_test.rb +216 -119
  266. data/test/cases/yaml_serialization_test.rb +121 -126
  267. data/test/config.example.yml +97 -0
  268. data/test/config.rb +5 -5
  269. data/test/fixtures/accounts.yml +29 -29
  270. data/test/fixtures/admin/accounts.yml +2 -2
  271. data/test/fixtures/admin/users.yml +10 -10
  272. data/test/fixtures/author_addresses.original +11 -0
  273. data/test/fixtures/author_addresses.yml +17 -17
  274. data/test/fixtures/author_favorites.yml +3 -3
  275. data/test/fixtures/authors.original +17 -0
  276. data/test/fixtures/authors.yml +23 -23
  277. data/test/fixtures/bad_posts.yml +9 -0
  278. data/test/fixtures/binaries.yml +133 -133
  279. data/test/fixtures/books.yml +31 -11
  280. data/test/fixtures/bulbs.yml +5 -5
  281. data/test/fixtures/cars.yml +9 -9
  282. data/test/fixtures/categories.yml +19 -19
  283. data/test/fixtures/categories/special_categories.yml +9 -9
  284. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  285. data/test/fixtures/categories_ordered.yml +7 -7
  286. data/test/fixtures/categories_posts.yml +31 -31
  287. data/test/fixtures/categorizations.yml +23 -23
  288. data/test/fixtures/clubs.yml +8 -8
  289. data/test/fixtures/collections.yml +3 -3
  290. data/test/fixtures/colleges.yml +3 -3
  291. data/test/fixtures/comments.yml +65 -65
  292. data/test/fixtures/companies.yml +67 -67
  293. data/test/fixtures/computers.yml +10 -10
  294. data/test/fixtures/content.yml +3 -0
  295. data/test/fixtures/content_positions.yml +3 -0
  296. data/test/fixtures/courses.yml +8 -8
  297. data/test/fixtures/customers.yml +25 -25
  298. data/test/fixtures/dashboards.yml +6 -6
  299. data/test/fixtures/dead_parrots.yml +5 -0
  300. data/test/fixtures/developers.yml +22 -22
  301. data/test/fixtures/developers_projects.yml +16 -16
  302. data/test/fixtures/dog_lovers.yml +7 -7
  303. data/test/fixtures/dogs.yml +4 -4
  304. data/test/fixtures/doubloons.yml +3 -3
  305. data/test/fixtures/edges.yml +5 -5
  306. data/test/fixtures/entrants.yml +14 -14
  307. data/test/fixtures/essays.yml +6 -6
  308. data/test/fixtures/faces.yml +11 -11
  309. data/test/fixtures/fk_test_has_fk.yml +3 -3
  310. data/test/fixtures/fk_test_has_pk.yml +1 -1
  311. data/test/fixtures/friendships.yml +4 -4
  312. data/test/fixtures/funny_jokes.yml +10 -10
  313. data/test/fixtures/interests.yml +33 -33
  314. data/test/fixtures/items.yml +3 -3
  315. data/test/fixtures/jobs.yml +7 -7
  316. data/test/fixtures/legacy_things.yml +3 -3
  317. data/test/fixtures/live_parrots.yml +4 -0
  318. data/test/fixtures/mateys.yml +4 -4
  319. data/test/fixtures/member_details.yml +8 -8
  320. data/test/fixtures/member_types.yml +6 -6
  321. data/test/fixtures/members.yml +11 -11
  322. data/test/fixtures/memberships.yml +34 -34
  323. data/test/fixtures/men.yml +5 -5
  324. data/test/fixtures/minimalistics.yml +2 -2
  325. data/test/fixtures/minivans.yml +5 -5
  326. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  327. data/test/fixtures/mixins.yml +29 -29
  328. data/test/fixtures/movies.yml +7 -7
  329. data/test/fixtures/naked/yml/accounts.yml +1 -1
  330. data/test/fixtures/naked/yml/companies.yml +1 -1
  331. data/test/fixtures/naked/yml/courses.yml +1 -1
  332. data/test/fixtures/naked/yml/parrots.yml +2 -0
  333. data/test/fixtures/naked/yml/trees.yml +3 -0
  334. data/test/fixtures/nodes.yml +29 -0
  335. data/test/fixtures/organizations.yml +5 -5
  336. data/test/fixtures/other_comments.yml +6 -0
  337. data/test/fixtures/other_dogs.yml +2 -0
  338. data/test/fixtures/other_posts.yml +7 -0
  339. data/test/fixtures/other_topics.yml +42 -42
  340. data/test/fixtures/owners.yml +9 -9
  341. data/test/fixtures/parrots.yml +27 -27
  342. data/test/fixtures/parrots_pirates.yml +7 -7
  343. data/test/fixtures/people.yml +24 -24
  344. data/test/fixtures/peoples_treasures.yml +3 -3
  345. data/test/fixtures/pets.yml +19 -19
  346. data/test/fixtures/pirates.yml +15 -12
  347. data/test/fixtures/posts.yml +80 -80
  348. data/test/fixtures/price_estimates.yml +16 -7
  349. data/test/fixtures/products.yml +4 -4
  350. data/test/fixtures/projects.yml +7 -7
  351. data/test/fixtures/ratings.yml +14 -14
  352. data/test/fixtures/readers.yml +11 -11
  353. data/test/fixtures/references.yml +17 -17
  354. data/test/fixtures/reserved_words/distinct.yml +5 -5
  355. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  356. data/test/fixtures/reserved_words/group.yml +14 -14
  357. data/test/fixtures/reserved_words/select.yml +8 -8
  358. data/test/fixtures/reserved_words/values.yml +7 -7
  359. data/test/fixtures/ships.yml +6 -6
  360. data/test/fixtures/speedometers.yml +8 -8
  361. data/test/fixtures/sponsors.yml +12 -12
  362. data/test/fixtures/string_key_objects.yml +7 -7
  363. data/test/fixtures/subscribers.yml +10 -10
  364. data/test/fixtures/subscriptions.yml +12 -12
  365. data/test/fixtures/taggings.yml +78 -78
  366. data/test/fixtures/tags.yml +11 -11
  367. data/test/fixtures/tasks.yml +7 -7
  368. data/test/fixtures/teapots.yml +3 -3
  369. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  370. data/test/fixtures/to_be_linked/users.yml +10 -10
  371. data/test/fixtures/topics.yml +49 -49
  372. data/test/fixtures/toys.yml +14 -14
  373. data/test/fixtures/traffic_lights.yml +9 -9
  374. data/test/fixtures/treasures.yml +10 -10
  375. data/test/fixtures/trees.yml +3 -0
  376. data/test/fixtures/uuid_children.yml +3 -3
  377. data/test/fixtures/uuid_parents.yml +2 -2
  378. data/test/fixtures/variants.yml +4 -4
  379. data/test/fixtures/vegetables.yml +19 -19
  380. data/test/fixtures/vertices.yml +3 -3
  381. data/test/fixtures/warehouse_things.yml +2 -2
  382. data/test/fixtures/zines.yml +5 -5
  383. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  384. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  385. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  386. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -9
  387. data/test/migrations/missing/1_people_have_last_names.rb +9 -9
  388. data/test/migrations/missing/3_we_need_reminders.rb +12 -12
  389. data/test/migrations/missing/4_innocent_jointable.rb +12 -12
  390. data/test/migrations/rename/1_we_need_things.rb +11 -11
  391. data/test/migrations/rename/2_rename_things.rb +9 -9
  392. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  393. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  394. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  395. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  396. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  397. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  398. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  399. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  400. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  401. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  402. data/test/migrations/valid/2_we_need_reminders.rb +12 -12
  403. data/test/migrations/valid/3_innocent_jointable.rb +12 -12
  404. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  405. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -12
  406. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -12
  407. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  408. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  409. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  410. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  411. data/test/models/admin.rb +5 -5
  412. data/test/models/admin/account.rb +3 -3
  413. data/test/models/admin/randomly_named_c1.rb +6 -2
  414. data/test/models/admin/user.rb +40 -40
  415. data/test/models/aircraft.rb +5 -4
  416. data/test/models/arunit2_model.rb +3 -3
  417. data/test/models/author.rb +209 -212
  418. data/test/models/auto_id.rb +4 -4
  419. data/test/models/autoloadable/extra_firm.rb +2 -2
  420. data/test/models/binary.rb +2 -2
  421. data/test/models/bird.rb +12 -12
  422. data/test/models/book.rb +23 -18
  423. data/test/models/boolean.rb +2 -2
  424. data/test/models/bulb.rb +52 -51
  425. data/test/models/cake_designer.rb +3 -3
  426. data/test/models/car.rb +29 -26
  427. data/test/models/carrier.rb +2 -2
  428. data/test/models/cat.rb +10 -0
  429. data/test/models/categorization.rb +19 -19
  430. data/test/models/category.rb +35 -35
  431. data/test/models/chef.rb +8 -7
  432. data/test/models/citation.rb +3 -3
  433. data/test/models/club.rb +25 -23
  434. data/test/models/college.rb +10 -10
  435. data/test/models/column.rb +3 -3
  436. data/test/models/column_name.rb +3 -3
  437. data/test/models/comment.rb +76 -64
  438. data/test/models/company.rb +230 -228
  439. data/test/models/company_in_module.rb +98 -98
  440. data/test/models/computer.rb +3 -3
  441. data/test/models/contact.rb +41 -41
  442. data/test/models/content.rb +40 -0
  443. data/test/models/contract.rb +20 -20
  444. data/test/models/country.rb +7 -7
  445. data/test/models/course.rb +6 -6
  446. data/test/models/customer.rb +83 -77
  447. data/test/models/customer_carrier.rb +14 -14
  448. data/test/models/dashboard.rb +3 -3
  449. data/test/models/default.rb +2 -2
  450. data/test/models/department.rb +4 -4
  451. data/test/models/developer.rb +274 -255
  452. data/test/models/dog.rb +5 -5
  453. data/test/models/dog_lover.rb +5 -5
  454. data/test/models/doubloon.rb +12 -12
  455. data/test/models/drink_designer.rb +3 -3
  456. data/test/models/edge.rb +5 -5
  457. data/test/models/electron.rb +5 -5
  458. data/test/models/engine.rb +4 -4
  459. data/test/models/entrant.rb +3 -3
  460. data/test/models/essay.rb +5 -5
  461. data/test/models/event.rb +3 -3
  462. data/test/models/eye.rb +37 -37
  463. data/test/models/face.rb +9 -9
  464. data/test/models/friendship.rb +6 -6
  465. data/test/models/guid.rb +2 -2
  466. data/test/models/guitar.rb +4 -0
  467. data/test/models/hotel.rb +11 -9
  468. data/test/models/image.rb +3 -3
  469. data/test/models/interest.rb +5 -5
  470. data/test/models/invoice.rb +4 -4
  471. data/test/models/item.rb +7 -7
  472. data/test/models/job.rb +7 -7
  473. data/test/models/joke.rb +7 -7
  474. data/test/models/keyboard.rb +3 -3
  475. data/test/models/legacy_thing.rb +3 -3
  476. data/test/models/lesson.rb +11 -11
  477. data/test/models/line_item.rb +3 -3
  478. data/test/models/liquid.rb +4 -4
  479. data/test/models/man.rb +11 -11
  480. data/test/models/matey.rb +4 -4
  481. data/test/models/member.rb +42 -41
  482. data/test/models/member_detail.rb +8 -7
  483. data/test/models/member_type.rb +3 -3
  484. data/test/models/membership.rb +35 -35
  485. data/test/models/mentor.rb +3 -0
  486. data/test/models/minimalistic.rb +2 -2
  487. data/test/models/minivan.rb +9 -9
  488. data/test/models/mixed_case_monkey.rb +3 -3
  489. data/test/models/mocktail_designer.rb +2 -0
  490. data/test/models/molecule.rb +6 -6
  491. data/test/models/movie.rb +5 -5
  492. data/test/models/node.rb +5 -0
  493. data/test/models/non_primary_key.rb +2 -0
  494. data/test/models/notification.rb +3 -0
  495. data/test/models/order.rb +4 -4
  496. data/test/models/organization.rb +14 -14
  497. data/test/models/other_dog.rb +5 -0
  498. data/test/models/owner.rb +37 -34
  499. data/test/models/parrot.rb +28 -29
  500. data/test/models/person.rb +142 -143
  501. data/test/models/personal_legacy_thing.rb +4 -4
  502. data/test/models/pet.rb +18 -15
  503. data/test/models/pet_treasure.rb +6 -0
  504. data/test/models/pirate.rb +92 -92
  505. data/test/models/possession.rb +3 -3
  506. data/test/models/post.rb +273 -264
  507. data/test/models/price_estimate.rb +4 -4
  508. data/test/models/professor.rb +5 -5
  509. data/test/models/project.rb +40 -31
  510. data/test/models/publisher.rb +2 -2
  511. data/test/models/publisher/article.rb +4 -4
  512. data/test/models/publisher/magazine.rb +3 -3
  513. data/test/models/randomly_named_c1.rb +1 -1
  514. data/test/models/rating.rb +4 -4
  515. data/test/models/reader.rb +23 -23
  516. data/test/models/recipe.rb +3 -0
  517. data/test/models/record.rb +2 -2
  518. data/test/models/reference.rb +22 -22
  519. data/test/models/reply.rb +61 -61
  520. data/test/models/ship.rb +39 -33
  521. data/test/models/ship_part.rb +8 -8
  522. data/test/models/shop.rb +17 -17
  523. data/test/models/shop_account.rb +6 -6
  524. data/test/models/speedometer.rb +6 -6
  525. data/test/models/sponsor.rb +7 -7
  526. data/test/models/string_key_object.rb +3 -3
  527. data/test/models/student.rb +4 -4
  528. data/test/models/subject.rb +16 -16
  529. data/test/models/subscriber.rb +8 -8
  530. data/test/models/subscription.rb +4 -4
  531. data/test/models/tag.rb +13 -7
  532. data/test/models/tagging.rb +13 -13
  533. data/test/models/task.rb +5 -5
  534. data/test/models/topic.rb +118 -124
  535. data/test/models/toy.rb +6 -6
  536. data/test/models/traffic_light.rb +4 -4
  537. data/test/models/treasure.rb +14 -14
  538. data/test/models/treaty.rb +7 -7
  539. data/test/models/tree.rb +3 -0
  540. data/test/models/tuning_peg.rb +4 -0
  541. data/test/models/tyre.rb +11 -11
  542. data/test/models/user.rb +14 -0
  543. data/test/models/uuid_child.rb +3 -3
  544. data/test/models/uuid_item.rb +6 -0
  545. data/test/models/uuid_parent.rb +3 -3
  546. data/test/models/vegetables.rb +24 -24
  547. data/test/models/vehicle.rb +6 -6
  548. data/test/models/vertex.rb +9 -9
  549. data/test/models/warehouse_thing.rb +5 -5
  550. data/test/models/wheel.rb +3 -3
  551. data/test/models/without_table.rb +3 -3
  552. data/test/models/zine.rb +3 -3
  553. data/test/schema/mysql2_specific_schema.rb +68 -58
  554. data/test/schema/oracle_specific_schema.rb +40 -43
  555. data/test/schema/postgresql_specific_schema.rb +114 -202
  556. data/test/schema/schema.rb +1057 -952
  557. data/test/schema/schema.rb.original +1057 -0
  558. data/test/schema/sqlite_specific_schema.rb +18 -22
  559. data/test/support/config.rb +43 -43
  560. data/test/support/connection.rb +23 -22
  561. data/test/support/connection_helper.rb +14 -14
  562. data/test/support/ddl_helper.rb +8 -8
  563. data/test/support/schema_dumping_helper.rb +20 -20
  564. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  565. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  566. metadata +129 -28
  567. data/lib/mswin32/rb19x/ibm_db.so +0 -0
  568. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  569. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  570. data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
  571. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
  572. data/test/cases/attribute_methods/serialization_test.rb +0 -29
  573. data/test/cases/migration/change_schema_test - Copy.rb +0 -448
  574. data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
  575. data/test/cases/migration/table_and_index_test.rb +0 -24
  576. data/test/cases/relation/where_test2.rb +0 -36
  577. data/test/cases/type/decimal_test.rb +0 -56
  578. data/test/cases/type/unsigned_integer_test.rb +0 -18
  579. data/test/cases/xml_serialization_test.rb +0 -457
  580. data/test/connections/native_ibm_db/connection.rb +0 -44
  581. data/test/fixtures/naked/csv/accounts.csv +0 -1
  582. data/test/schema/i5/ibm_db_specific_schema.rb +0 -137
  583. data/test/schema/ids/ibm_db_specific_schema.rb +0 -140
  584. data/test/schema/luw/ibm_db_specific_schema.rb +0 -137
  585. data/test/schema/mysql_specific_schema.rb +0 -70
  586. data/test/schema/zOS/ibm_db_specific_schema.rb +0 -208
@@ -1,524 +1,561 @@
1
- require "cases/helper"
2
- require 'models/post'
3
- require 'models/topic'
4
- require 'models/comment'
5
- require 'models/reply'
6
- require 'models/author'
7
- require 'models/developer'
8
- require 'models/computer'
9
-
10
- class NamedScopingTest < ActiveRecord::TestCase
11
- fixtures :posts, :authors, :topics, :comments, :author_addresses
12
-
13
- def test_implements_enumerable
14
- assert !Topic.all.empty?
15
-
16
- assert_equal Topic.all.to_a, Topic.base
17
- assert_equal Topic.all.to_a, Topic.base.to_a
18
- assert_equal Topic.first, Topic.base.first
19
- assert_equal Topic.all.to_a, Topic.base.map { |i| i }
20
- end
21
-
22
- def test_found_items_are_cached
23
- all_posts = Topic.base
24
-
25
- assert_queries(1) do
26
- all_posts.collect
27
- all_posts.collect
28
- end
29
- end
30
-
31
- def test_reload_expires_cache_of_found_items
32
- all_posts = Topic.base
33
- all_posts.to_a
34
-
35
- new_post = Topic.create!
36
- assert !all_posts.include?(new_post)
37
- assert all_posts.reload.include?(new_post)
38
- end
39
-
40
- def test_delegates_finds_and_calculations_to_the_base_class
41
- assert !Topic.all.empty?
42
-
43
- assert_equal Topic.all.to_a, Topic.base.to_a
44
- assert_equal Topic.first, Topic.base.first
45
- assert_equal Topic.count, Topic.base.count
46
- assert_equal Topic.average(:replies_count), Topic.base.average(:replies_count)
47
- end
48
-
49
- def test_method_missing_priority_when_delegating
50
- klazz = Class.new(ActiveRecord::Base) do
51
- self.table_name = "topics"
52
- scope :since, Proc.new { where('written_on >= ?', Time.now - 1.day) }
53
- scope :to, Proc.new { where('written_on <= ?', Time.now) }
54
- end
55
- assert_equal klazz.to.since.to_a, klazz.since.to.to_a
56
- end
57
-
58
- def test_scope_should_respond_to_own_methods_and_methods_of_the_proxy
59
- assert Topic.approved.respond_to?(:limit)
60
- assert Topic.approved.respond_to?(:count)
61
- assert Topic.approved.respond_to?(:length)
62
- end
63
-
64
- def test_scopes_with_options_limit_finds_to_those_matching_the_criteria_specified
65
- assert !Topic.all.merge!(:where => {:approved => true}).to_a.empty?
66
-
67
- assert_equal Topic.all.merge!(:where => {:approved => true}).to_a, Topic.approved
68
- assert_equal Topic.where(:approved => true).count, Topic.approved.count
69
- end
70
-
71
- def test_scopes_with_string_name_can_be_composed
72
- # NOTE that scopes defined with a string as a name worked on their own
73
- # but when called on another scope the other scope was completely replaced
74
- assert_equal Topic.replied.approved, Topic.replied.approved_as_string
75
- end
76
-
77
- def test_scopes_are_composable
78
- assert_equal((approved = Topic.all.merge!(:where => {:approved => true}).to_a), Topic.approved)
79
- assert_equal((replied = Topic.all.merge!(:where => 'replies_count > 0').to_a), Topic.replied)
80
- assert !(approved == replied)
81
- assert !(approved & replied).empty?
82
-
83
- assert_equal approved & replied, Topic.approved.replied
84
- end
85
-
86
- def test_procedural_scopes
87
- topics_written_before_the_third = Topic.where('written_on < ?', topics(:third).written_on)
88
- topics_written_before_the_second = Topic.where('written_on < ?', topics(:second).written_on)
89
- assert_not_equal topics_written_before_the_second, topics_written_before_the_third
90
-
91
- assert_equal topics_written_before_the_third, Topic.written_before(topics(:third).written_on)
92
- assert_equal topics_written_before_the_second, Topic.written_before(topics(:second).written_on)
93
- end
94
-
95
- def test_procedural_scopes_returning_nil
96
- all_topics = Topic.all
97
-
98
- assert_equal all_topics, Topic.written_before(nil)
99
- end
100
-
101
- def test_scope_with_object
102
- objects = Topic.with_object
103
- assert_operator objects.length, :>, 0
104
- assert objects.all?(&:approved?), 'all objects should be approved'
105
- end
106
-
107
- def test_has_many_associations_have_access_to_scopes
108
- assert_not_equal Post.containing_the_letter_a, authors(:david).posts
109
- assert !Post.containing_the_letter_a.empty?
110
-
111
- assert_equal authors(:david).posts & Post.containing_the_letter_a, authors(:david).posts.containing_the_letter_a
112
- end
113
-
114
- def test_scope_with_STI
115
- assert_equal 3,Post.containing_the_letter_a.count
116
- assert_equal 1,SpecialPost.containing_the_letter_a.count
117
- end
118
-
119
- def test_has_many_through_associations_have_access_to_scopes
120
- assert_not_equal Comment.containing_the_letter_e, authors(:david).comments
121
- assert !Comment.containing_the_letter_e.empty?
122
-
123
- assert_equal authors(:david).comments & Comment.containing_the_letter_e, authors(:david).comments.containing_the_letter_e
124
- end
125
-
126
- def test_scopes_honor_current_scopes_from_when_defined
127
- assert !Post.ranked_by_comments.limit_by(5).empty?
128
- assert !authors(:david).posts.ranked_by_comments.limit_by(5).empty?
129
- assert_not_equal Post.ranked_by_comments.limit_by(5), authors(:david).posts.ranked_by_comments.limit_by(5)
130
- assert_not_equal Post.top(5), authors(:david).posts.top(5)
131
- # Oracle sometimes sorts differently if WHERE condition is changed
132
- assert_equal authors(:david).posts.ranked_by_comments.limit_by(5).to_a.sort_by(&:id), authors(:david).posts.top(5).to_a.sort_by(&:id)
133
- assert_equal Post.ranked_by_comments.limit_by(5), Post.top(5)
134
- end
135
-
136
- def test_scopes_body_is_a_callable
137
- e = assert_raises ArgumentError do
138
- Class.new(Post).class_eval { scope :containing_the_letter_z, where("body LIKE '%z%'") }
139
- end
140
- assert_equal "The scope body needs to be callable.", e.message
141
- end
142
-
143
- def test_active_records_have_scope_named__all__
144
- assert !Topic.all.empty?
145
-
146
- assert_equal Topic.all.to_a, Topic.base
147
- end
148
-
149
- def test_active_records_have_scope_named__scoped__
150
- scope = Topic.where("content LIKE '%Have%'")
151
- assert !scope.empty?
152
-
153
- assert_equal scope, Topic.all.merge!(where: "content LIKE '%Have%'")
154
- end
155
-
156
- def test_first_and_last_should_allow_integers_for_limit
157
- assert_equal Topic.base.first(2), Topic.base.to_a.first(2)
158
- assert_equal Topic.base.last(2), Topic.base.order("id").to_a.last(2)
159
- end
160
-
161
- def test_first_and_last_should_not_use_query_when_results_are_loaded
162
- topics = Topic.base
163
- topics.reload # force load
164
- assert_no_queries do
165
- topics.first
166
- topics.last
167
- end
168
- end
169
-
170
- def test_empty_should_not_load_results
171
- topics = Topic.base
172
- assert_queries(2) do
173
- topics.empty? # use count query
174
- topics.collect # force load
175
- topics.empty? # use loaded (no query)
176
- end
177
- end
178
-
179
- def test_any_should_not_load_results
180
- topics = Topic.base
181
- assert_queries(2) do
182
- topics.any? # use count query
183
- topics.collect # force load
184
- topics.any? # use loaded (no query)
185
- end
186
- end
187
-
188
- def test_any_should_call_proxy_found_if_using_a_block
189
- topics = Topic.base
190
- assert_queries(1) do
191
- topics.expects(:empty?).never
192
- topics.any? { true }
193
- end
194
- end
195
-
196
- def test_any_should_not_fire_query_if_scope_loaded
197
- topics = Topic.base
198
- topics.collect # force load
199
- assert_no_queries { assert topics.any? }
200
- end
201
-
202
- def test_model_class_should_respond_to_any
203
- assert Topic.any?
204
- Topic.delete_all
205
- assert !Topic.any?
206
- end
207
-
208
- def test_many_should_not_load_results
209
- topics = Topic.base
210
- assert_queries(2) do
211
- topics.many? # use count query
212
- topics.collect # force load
213
- topics.many? # use loaded (no query)
214
- end
215
- end
216
-
217
- def test_many_should_call_proxy_found_if_using_a_block
218
- topics = Topic.base
219
- assert_queries(1) do
220
- topics.expects(:size).never
221
- topics.many? { true }
222
- end
223
- end
224
-
225
- def test_many_should_not_fire_query_if_scope_loaded
226
- topics = Topic.base
227
- topics.collect # force load
228
- assert_no_queries { assert topics.many? }
229
- end
230
-
231
- def test_many_should_return_false_if_none_or_one
232
- topics = Topic.base.where(:id => 0)
233
- assert !topics.many?
234
- topics = Topic.base.where(:id => 1)
235
- assert !topics.many?
236
- end
237
-
238
- def test_many_should_return_true_if_more_than_one
239
- assert Topic.base.many?
240
- end
241
-
242
- def test_model_class_should_respond_to_many
243
- Topic.delete_all
244
- assert !Topic.many?
245
- Topic.create!
246
- assert !Topic.many?
247
- Topic.create!
248
- assert Topic.many?
249
- end
250
-
251
- def test_should_build_on_top_of_scope
252
- topic = Topic.approved.build({})
253
- assert topic.approved
254
- end
255
-
256
- def test_should_build_new_on_top_of_scope
257
- topic = Topic.approved.new
258
- assert topic.approved
259
- end
260
-
261
- def test_should_create_on_top_of_scope
262
- topic = Topic.approved.create({})
263
- assert topic.approved
264
- end
265
-
266
- def test_should_create_with_bang_on_top_of_scope
267
- topic = Topic.approved.create!({})
268
- assert topic.approved
269
- end
270
-
271
- def test_should_build_on_top_of_chained_scopes
272
- topic = Topic.approved.by_lifo.build({})
273
- assert topic.approved
274
- assert_equal 'lifo', topic.author_name
275
- end
276
-
277
- def test_reserved_scope_names
278
- klass = Class.new(ActiveRecord::Base) do
279
- self.table_name = "topics"
280
-
281
- scope :approved, -> { where(approved: true) }
282
-
283
- class << self
284
- public
285
- def pub; end
286
-
287
- private
288
- def pri; end
289
-
290
- protected
291
- def pro; end
292
- end
293
- end
294
-
295
- subklass = Class.new(klass)
296
-
297
- conflicts = [
298
- :create, # public class method on AR::Base
299
- :relation, # private class method on AR::Base
300
- :new, # redefined class method on AR::Base
301
- :all, # a default scope
302
- :public, # some imporant methods on Module and Class
303
- :protected,
304
- :private,
305
- :name,
306
- :parent,
307
- :superclass
308
- ]
309
-
310
- non_conflicts = [
311
- :find_by_title, # dynamic finder method
312
- :approved, # existing scope
313
- :pub, # existing public class method
314
- :pri, # existing private class method
315
- :pro, # existing protected class method
316
- :open, # a ::Kernel method
317
- ]
318
-
319
- conflicts.each do |name|
320
- assert_raises(ArgumentError, "scope `#{name}` should not be allowed") do
321
- klass.class_eval { scope name, ->{ where(approved: true) } }
322
- end
323
-
324
- assert_raises(ArgumentError, "scope `#{name}` should not be allowed") do
325
- subklass.class_eval { scope name, ->{ where(approved: true) } }
326
- end
327
- end
328
-
329
- non_conflicts.each do |name|
330
- assert_nothing_raised do
331
- silence_warnings do
332
- klass.class_eval { scope name, ->{ where(approved: true) } }
333
- end
334
- end
335
-
336
- assert_nothing_raised do
337
- subklass.class_eval { scope name, ->{ where(approved: true) } }
338
- end
339
- end
340
- end
341
-
342
- # Method delegation for scope names which look like /\A[a-zA-Z_]\w*[!?]?\z/
343
- # has been done by evaluating a string with a plain def statement. For scope
344
- # names which contain spaces this approach doesn't work.
345
- def test_spaces_in_scope_names
346
- klass = Class.new(ActiveRecord::Base) do
347
- self.table_name = "topics"
348
- scope :"title containing space", -> { where("title LIKE '% %'") }
349
- scope :approved, -> { where(:approved => true) }
350
- end
351
- assert_equal klass.send(:"title containing space"), klass.where("title LIKE '% %'")
352
- assert_equal klass.approved.send(:"title containing space"), klass.approved.where("title LIKE '% %'")
353
- end
354
-
355
- def test_find_all_should_behave_like_select
356
- assert_equal Topic.base.to_a.select(&:approved), Topic.base.to_a.find_all(&:approved)
357
- end
358
-
359
- def test_rand_should_select_a_random_object_from_proxy
360
- assert_kind_of Topic, Topic.approved.sample
361
- end
362
-
363
- def test_should_use_where_in_query_for_scope
364
- assert_equal Developer.where(name: 'Jamis').to_set, Developer.where(id: Developer.jamises).to_set
365
- end
366
-
367
- def test_size_should_use_count_when_results_are_not_loaded
368
- topics = Topic.base
369
- assert_queries(1) do
370
- assert_sql(/COUNT/i) { topics.size }
371
- end
372
- end
373
-
374
- def test_size_should_use_length_when_results_are_loaded
375
- topics = Topic.base
376
- topics.reload # force load
377
- assert_no_queries do
378
- topics.size # use loaded (no query)
379
- end
380
- end
381
-
382
- def test_should_not_duplicates_where_values
383
- where_values = Topic.where("1=1").scope_with_lambda.where_values
384
- assert_equal ["1=1"], where_values
385
- end
386
-
387
- def test_chaining_with_duplicate_joins
388
- join = "INNER JOIN comments ON comments.post_id = posts.id"
389
- post = Post.find(1)
390
- assert_equal post.comments.size, Post.joins(join).joins(join).where("posts.id = #{post.id}").size
391
- end
392
-
393
- def test_chaining_applies_last_conditions_when_creating
394
- post = Topic.rejected.new
395
- assert !post.approved?
396
-
397
- post = Topic.rejected.approved.new
398
- assert post.approved?
399
-
400
- post = Topic.approved.rejected.new
401
- assert !post.approved?
402
-
403
- post = Topic.approved.rejected.approved.new
404
- assert post.approved?
405
- end
406
-
407
- def test_chaining_combines_conditions_when_searching
408
- # Normal hash conditions
409
- assert_equal Topic.where(approved: false).where(approved: true).to_a, Topic.rejected.approved.to_a
410
- assert_equal Topic.where(approved: true).where(approved: false).to_a, Topic.approved.rejected.to_a
411
-
412
- # Nested hash conditions with same keys
413
- assert_equal [], Post.with_special_comments.with_very_special_comments.to_a
414
-
415
- # Nested hash conditions with different keys
416
- assert_equal [posts(:sti_comments)], Post.with_special_comments.with_post(4).to_a.uniq
417
- end
418
-
419
- def test_scopes_batch_finders
420
- assert_equal 4, Topic.approved.count
421
-
422
- assert_queries(5) do
423
- Topic.approved.find_each(:batch_size => 1) {|t| assert t.approved? }
424
- end
425
-
426
- assert_queries(3) do
427
- Topic.approved.find_in_batches(:batch_size => 2) do |group|
428
- group.each {|t| assert t.approved? }
429
- end
430
- end
431
- end
432
-
433
- def test_table_names_for_chaining_scopes_with_and_without_table_name_included
434
- assert_nothing_raised do
435
- Comment.for_first_post.for_first_author.to_a
436
- end
437
- end
438
-
439
- def test_scopes_on_relations
440
- # Topic.replied
441
- approved_topics = Topic.all.approved.order('id DESC')
442
- assert_equal topics(:fifth), approved_topics.first
443
-
444
- replied_approved_topics = approved_topics.replied
445
- assert_equal topics(:third), replied_approved_topics.first
446
- end
447
-
448
- def test_index_on_scope
449
- approved = Topic.approved.order('id ASC')
450
- assert_equal topics(:second), approved[0]
451
- assert approved.loaded?
452
- end
453
-
454
- def test_nested_scopes_queries_size
455
- assert_queries(1) do
456
- Topic.approved.by_lifo.replied.written_before(Time.now).to_a
457
- end
458
- end
459
-
460
- # Note: these next two are kinda odd because they are essentially just testing that the
461
- # query cache works as it should, but they are here for legacy reasons as they was previously
462
- # a separate cache on association proxies, and these show that that is not necessary.
463
- def test_scopes_are_cached_on_associations
464
- post = posts(:welcome)
465
-
466
- Post.cache do
467
- assert_queries(1) { post.comments.containing_the_letter_e.to_a }
468
- assert_no_queries { post.comments.containing_the_letter_e.to_a }
469
- end
470
- end
471
-
472
- def test_scopes_with_arguments_are_cached_on_associations
473
- post = posts(:welcome)
474
-
475
- Post.cache do
476
- one = assert_queries(1) { post.comments.limit_by(1).to_a }
477
- assert_equal 1, one.size
478
-
479
- two = assert_queries(1) { post.comments.limit_by(2).to_a }
480
- assert_equal 2, two.size
481
-
482
- assert_no_queries { post.comments.limit_by(1).to_a }
483
- assert_no_queries { post.comments.limit_by(2).to_a }
484
- end
485
- end
486
-
487
- def test_scopes_to_get_newest
488
- post = posts(:welcome)
489
- old_last_comment = post.comments.newest
490
- new_comment = post.comments.create(:body => "My new comment")
491
- assert_equal new_comment, post.comments.newest
492
- assert_not_equal old_last_comment, post.comments.newest
493
- end
494
-
495
- def test_scopes_are_reset_on_association_reload
496
- post = posts(:welcome)
497
-
498
- [:destroy_all, :reset, :delete_all].each do |method|
499
- before = post.comments.containing_the_letter_e
500
- post.association(:comments).send(method)
501
- assert before.object_id != post.comments.containing_the_letter_e.object_id, "CollectionAssociation##{method} should reset the named scopes cache"
502
- end
503
- end
504
-
505
- def test_scoped_are_lazy_loaded_if_table_still_does_not_exist
506
- assert_nothing_raised do
507
- require "models/without_table"
508
- end
509
- end
510
-
511
- def test_eager_default_scope_relations_are_remove
512
- klass = Class.new(ActiveRecord::Base)
513
- klass.table_name = 'posts'
514
-
515
- assert_raises(ArgumentError) do
516
- klass.send(:default_scope, klass.where(:id => posts(:welcome).id))
517
- end
518
- end
519
-
520
- def test_subclass_merges_scopes_properly
521
- assert_equal 1, SpecialComment.where(body: 'go crazy').created.count
522
- end
523
-
524
- end
1
+ require "cases/helper"
2
+ require 'models/post'
3
+ require 'models/topic'
4
+ require 'models/comment'
5
+ require 'models/reply'
6
+ require 'models/author'
7
+ require 'models/developer'
8
+ require 'models/computer'
9
+
10
+ class NamedScopingTest < ActiveRecord::TestCase
11
+ fixtures :posts, :authors, :topics, :comments, :author_addresses
12
+
13
+ def test_implements_enumerable
14
+ assert !Topic.all.empty?
15
+
16
+ assert_equal Topic.all.to_a, Topic.base
17
+ assert_equal Topic.all.to_a, Topic.base.to_a
18
+ assert_equal Topic.first, Topic.base.first
19
+ assert_equal Topic.all.to_a, Topic.base.map { |i| i }
20
+ end
21
+
22
+ def test_found_items_are_cached
23
+ all_posts = Topic.base
24
+
25
+ assert_queries(1) do
26
+ all_posts.collect
27
+ all_posts.collect
28
+ end
29
+ end
30
+
31
+ def test_reload_expires_cache_of_found_items
32
+ all_posts = Topic.base
33
+ all_posts.to_a
34
+
35
+ new_post = Topic.create!
36
+ assert !all_posts.include?(new_post)
37
+ assert all_posts.reload.include?(new_post)
38
+ end
39
+
40
+ def test_delegates_finds_and_calculations_to_the_base_class
41
+ assert !Topic.all.empty?
42
+
43
+ assert_equal Topic.all.to_a, Topic.base.to_a
44
+ assert_equal Topic.first, Topic.base.first
45
+ assert_equal Topic.count, Topic.base.count
46
+ assert_equal Topic.average(:replies_count), Topic.base.average(:replies_count)
47
+ end
48
+
49
+ def test_method_missing_priority_when_delegating
50
+ klazz = Class.new(ActiveRecord::Base) do
51
+ self.table_name = "topics"
52
+ scope :since, Proc.new { where('written_on >= ?', Time.now - 1.day) }
53
+ scope :to, Proc.new { where('written_on <= ?', Time.now) }
54
+ end
55
+ assert_equal klazz.to.since.to_a, klazz.since.to.to_a
56
+ end
57
+
58
+ def test_scope_should_respond_to_own_methods_and_methods_of_the_proxy
59
+ assert Topic.approved.respond_to?(:limit)
60
+ assert Topic.approved.respond_to?(:count)
61
+ assert Topic.approved.respond_to?(:length)
62
+ end
63
+
64
+ def test_scopes_with_options_limit_finds_to_those_matching_the_criteria_specified
65
+ assert !Topic.all.merge!(:where => {:approved => true}).to_a.empty?
66
+
67
+ assert_equal Topic.all.merge!(:where => {:approved => true}).to_a, Topic.approved
68
+ assert_equal Topic.where(:approved => true).count, Topic.approved.count
69
+ end
70
+
71
+ def test_scopes_with_string_name_can_be_composed
72
+ # NOTE that scopes defined with a string as a name worked on their own
73
+ # but when called on another scope the other scope was completely replaced
74
+ assert_equal Topic.replied.approved, Topic.replied.approved_as_string
75
+ end
76
+
77
+ def test_scopes_are_composable
78
+ assert_equal((approved = Topic.all.merge!(:where => {:approved => true}).to_a), Topic.approved)
79
+ assert_equal((replied = Topic.all.merge!(:where => 'replies_count > 0').to_a), Topic.replied)
80
+ assert !(approved == replied)
81
+ assert !(approved & replied).empty?
82
+
83
+ assert_equal approved & replied, Topic.approved.replied
84
+ end
85
+
86
+ def test_procedural_scopes
87
+ topics_written_before_the_third = Topic.where('written_on < ?', topics(:third).written_on)
88
+ topics_written_before_the_second = Topic.where('written_on < ?', topics(:second).written_on)
89
+ assert_not_equal topics_written_before_the_second, topics_written_before_the_third
90
+
91
+ assert_equal topics_written_before_the_third, Topic.written_before(topics(:third).written_on)
92
+ assert_equal topics_written_before_the_second, Topic.written_before(topics(:second).written_on)
93
+ end
94
+
95
+ def test_procedural_scopes_returning_nil
96
+ all_topics = Topic.all
97
+
98
+ assert_equal all_topics, Topic.written_before(nil)
99
+ end
100
+
101
+ def test_scope_with_object
102
+ objects = Topic.with_object
103
+ assert_operator objects.length, :>, 0
104
+ assert objects.all?(&:approved?), 'all objects should be approved'
105
+ end
106
+
107
+ def test_has_many_associations_have_access_to_scopes
108
+ assert_not_equal Post.containing_the_letter_a, authors(:david).posts
109
+ assert !Post.containing_the_letter_a.empty?
110
+
111
+ assert_equal authors(:david).posts & Post.containing_the_letter_a, authors(:david).posts.containing_the_letter_a
112
+ end
113
+
114
+ def test_scope_with_STI
115
+ assert_equal 3,Post.containing_the_letter_a.count
116
+ assert_equal 1,SpecialPost.containing_the_letter_a.count
117
+ end
118
+
119
+ def test_has_many_through_associations_have_access_to_scopes
120
+ assert_not_equal Comment.containing_the_letter_e, authors(:david).comments
121
+ assert !Comment.containing_the_letter_e.empty?
122
+
123
+ assert_equal authors(:david).comments & Comment.containing_the_letter_e, authors(:david).comments.containing_the_letter_e
124
+ end
125
+
126
+ def test_scopes_honor_current_scopes_from_when_defined
127
+ assert !Post.ranked_by_comments.limit_by(5).empty?
128
+ assert !authors(:david).posts.ranked_by_comments.limit_by(5).empty?
129
+ assert_not_equal Post.ranked_by_comments.limit_by(5), authors(:david).posts.ranked_by_comments.limit_by(5)
130
+ assert_not_equal Post.top(5), authors(:david).posts.top(5)
131
+ # Oracle sometimes sorts differently if WHERE condition is changed
132
+ assert_equal authors(:david).posts.ranked_by_comments.limit_by(5).to_a.sort_by(&:id), authors(:david).posts.top(5).to_a.sort_by(&:id)
133
+ assert_equal Post.ranked_by_comments.limit_by(5), Post.top(5)
134
+ end
135
+
136
+ def test_scopes_body_is_a_callable
137
+ e = assert_raises ArgumentError do
138
+ Class.new(Post).class_eval { scope :containing_the_letter_z, where("body LIKE '%z%'") }
139
+ end
140
+ assert_equal "The scope body needs to be callable.", e.message
141
+ end
142
+
143
+ def test_active_records_have_scope_named__all__
144
+ assert !Topic.all.empty?
145
+
146
+ assert_equal Topic.all.to_a, Topic.base
147
+ end
148
+
149
+ def test_active_records_have_scope_named__scoped__
150
+ scope = Topic.where("content LIKE '%Have%'")
151
+ assert !scope.empty?
152
+
153
+ assert_equal scope, Topic.all.merge!(where: "content LIKE '%Have%'")
154
+ end
155
+
156
+ def test_first_and_last_should_allow_integers_for_limit
157
+ assert_equal Topic.base.first(2), Topic.base.to_a.first(2)
158
+ assert_equal Topic.base.last(2), Topic.base.order("id").to_a.last(2)
159
+ end
160
+
161
+ def test_first_and_last_should_not_use_query_when_results_are_loaded
162
+ topics = Topic.base
163
+ topics.reload # force load
164
+ assert_no_queries do
165
+ topics.first
166
+ topics.last
167
+ end
168
+ end
169
+
170
+ def test_empty_should_not_load_results
171
+ topics = Topic.base
172
+ assert_queries(2) do
173
+ topics.empty? # use count query
174
+ topics.collect # force load
175
+ topics.empty? # use loaded (no query)
176
+ end
177
+ end
178
+
179
+ def test_any_should_not_load_results
180
+ topics = Topic.base
181
+ assert_queries(2) do
182
+ topics.any? # use count query
183
+ topics.collect # force load
184
+ topics.any? # use loaded (no query)
185
+ end
186
+ end
187
+
188
+ def test_any_should_call_proxy_found_if_using_a_block
189
+ topics = Topic.base
190
+ assert_queries(1) do
191
+ assert_not_called(topics, :empty?) do
192
+ topics.any? { true }
193
+ end
194
+ end
195
+ end
196
+
197
+ def test_any_should_not_fire_query_if_scope_loaded
198
+ topics = Topic.base
199
+ topics.collect # force load
200
+ assert_no_queries { assert topics.any? }
201
+ end
202
+
203
+ def test_model_class_should_respond_to_any
204
+ assert Topic.any?
205
+ Topic.delete_all
206
+ assert !Topic.any?
207
+ end
208
+
209
+ def test_many_should_not_load_results
210
+ topics = Topic.base
211
+ assert_queries(2) do
212
+ topics.many? # use count query
213
+ topics.collect # force load
214
+ topics.many? # use loaded (no query)
215
+ end
216
+ end
217
+
218
+ def test_many_should_call_proxy_found_if_using_a_block
219
+ topics = Topic.base
220
+ assert_queries(1) do
221
+ assert_not_called(topics, :size) do
222
+ topics.many? { true }
223
+ end
224
+ end
225
+ end
226
+
227
+ def test_many_should_not_fire_query_if_scope_loaded
228
+ topics = Topic.base
229
+ topics.collect # force load
230
+ assert_no_queries { assert topics.many? }
231
+ end
232
+
233
+ def test_many_should_return_false_if_none_or_one
234
+ topics = Topic.base.where(:id => 0)
235
+ assert !topics.many?
236
+ topics = Topic.base.where(:id => 1)
237
+ assert !topics.many?
238
+ end
239
+
240
+ def test_many_should_return_true_if_more_than_one
241
+ assert Topic.base.many?
242
+ end
243
+
244
+ def test_model_class_should_respond_to_many
245
+ Topic.delete_all
246
+ assert !Topic.many?
247
+ Topic.create!
248
+ assert !Topic.many?
249
+ Topic.create!
250
+ assert Topic.many?
251
+ end
252
+
253
+ def test_should_build_on_top_of_scope
254
+ topic = Topic.approved.build({})
255
+ assert topic.approved
256
+ end
257
+
258
+ def test_should_build_new_on_top_of_scope
259
+ topic = Topic.approved.new
260
+ assert topic.approved
261
+ end
262
+
263
+ def test_should_create_on_top_of_scope
264
+ topic = Topic.approved.create({})
265
+ assert topic.approved
266
+ end
267
+
268
+ def test_should_create_with_bang_on_top_of_scope
269
+ topic = Topic.approved.create!({})
270
+ assert topic.approved
271
+ end
272
+
273
+ def test_should_build_on_top_of_chained_scopes
274
+ topic = Topic.approved.by_lifo.build({})
275
+ assert topic.approved
276
+ assert_equal 'lifo', topic.author_name
277
+ end
278
+
279
+ def test_reserved_scope_names
280
+ klass = Class.new(ActiveRecord::Base) do
281
+ self.table_name = "topics"
282
+
283
+ scope :approved, -> { where(approved: true) }
284
+
285
+ class << self
286
+ public
287
+ def pub; end
288
+
289
+ private
290
+ def pri; end
291
+
292
+ protected
293
+ def pro; end
294
+ end
295
+ end
296
+
297
+ subklass = Class.new(klass)
298
+
299
+ conflicts = [
300
+ :create, # public class method on AR::Base
301
+ :relation, # private class method on AR::Base
302
+ :new, # redefined class method on AR::Base
303
+ :all, # a default scope
304
+ :public, # some important methods on Module and Class
305
+ :protected,
306
+ :private,
307
+ :name,
308
+ :parent,
309
+ :superclass
310
+ ]
311
+
312
+ non_conflicts = [
313
+ :find_by_title, # dynamic finder method
314
+ :approved, # existing scope
315
+ :pub, # existing public class method
316
+ :pri, # existing private class method
317
+ :pro, # existing protected class method
318
+ :open, # a ::Kernel method
319
+ ]
320
+
321
+ conflicts.each do |name|
322
+ e = assert_raises(ArgumentError, "scope `#{name}` should not be allowed") do
323
+ klass.class_eval { scope name, ->{ where(approved: true) } }
324
+ end
325
+ assert_match(/You tried to define a scope named \"#{name}\" on the model/, e.message)
326
+
327
+ e = assert_raises(ArgumentError, "scope `#{name}` should not be allowed") do
328
+ subklass.class_eval { scope name, ->{ where(approved: true) } }
329
+ end
330
+ assert_match(/You tried to define a scope named \"#{name}\" on the model/, e.message)
331
+ end
332
+
333
+ non_conflicts.each do |name|
334
+ assert_nothing_raised do
335
+ silence_warnings do
336
+ klass.class_eval { scope name, ->{ where(approved: true) } }
337
+ end
338
+ end
339
+
340
+ assert_nothing_raised do
341
+ subklass.class_eval { scope name, ->{ where(approved: true) } }
342
+ end
343
+ end
344
+ end
345
+
346
+ # Method delegation for scope names which look like /\A[a-zA-Z_]\w*[!?]?\z/
347
+ # has been done by evaluating a string with a plain def statement. For scope
348
+ # names which contain spaces this approach doesn't work.
349
+ def test_spaces_in_scope_names
350
+ klass = Class.new(ActiveRecord::Base) do
351
+ self.table_name = "topics"
352
+ scope :"title containing space", -> { where("title LIKE '% %'") }
353
+ scope :approved, -> { where(:approved => true) }
354
+ end
355
+ assert_equal klass.send(:"title containing space"), klass.where("title LIKE '% %'")
356
+ assert_equal klass.approved.send(:"title containing space"), klass.approved.where("title LIKE '% %'")
357
+ end
358
+
359
+ def test_find_all_should_behave_like_select
360
+ assert_equal Topic.base.to_a.select(&:approved), Topic.base.to_a.find_all(&:approved)
361
+ end
362
+
363
+ def test_rand_should_select_a_random_object_from_proxy
364
+ assert_kind_of Topic, Topic.approved.sample
365
+ end
366
+
367
+ def test_should_use_where_in_query_for_scope
368
+ assert_equal Developer.where(name: 'Jamis').to_set, Developer.where(id: Developer.jamises).to_set
369
+ end
370
+
371
+ def test_size_should_use_count_when_results_are_not_loaded
372
+ topics = Topic.base
373
+ assert_queries(1) do
374
+ assert_sql(/COUNT/i) { topics.size }
375
+ end
376
+ end
377
+
378
+ def test_size_should_use_length_when_results_are_loaded
379
+ topics = Topic.base
380
+ topics.reload # force load
381
+ assert_no_queries do
382
+ topics.size # use loaded (no query)
383
+ end
384
+ end
385
+
386
+ def test_should_not_duplicates_where_values
387
+ relation = Topic.where("1=1")
388
+ assert_equal relation.where_clause, relation.scope_with_lambda.where_clause
389
+ end
390
+
391
+ def test_chaining_with_duplicate_joins
392
+ join = "INNER JOIN comments ON comments.post_id = posts.id"
393
+ post = Post.find(1)
394
+ assert_equal post.comments.size, Post.joins(join).joins(join).where("posts.id = #{post.id}").size
395
+ end
396
+
397
+ def test_chaining_applies_last_conditions_when_creating
398
+ post = Topic.rejected.new
399
+ assert !post.approved?
400
+
401
+ post = Topic.rejected.approved.new
402
+ assert post.approved?
403
+
404
+ post = Topic.approved.rejected.new
405
+ assert !post.approved?
406
+
407
+ post = Topic.approved.rejected.approved.new
408
+ assert post.approved?
409
+ end
410
+
411
+ def test_chaining_combines_conditions_when_searching
412
+ # Normal hash conditions
413
+ assert_equal Topic.where(approved: false).where(approved: true).to_a, Topic.rejected.approved.to_a
414
+ assert_equal Topic.where(approved: true).where(approved: false).to_a, Topic.approved.rejected.to_a
415
+
416
+ # Nested hash conditions with same keys
417
+ assert_equal [], Post.with_special_comments.with_very_special_comments.to_a
418
+
419
+ # Nested hash conditions with different keys
420
+ assert_equal [posts(:sti_comments)], Post.with_special_comments.with_post(4).to_a.uniq
421
+ end
422
+
423
+ def test_scopes_batch_finders
424
+ assert_equal 4, Topic.approved.count
425
+
426
+ assert_queries(5) do
427
+ Topic.approved.find_each(:batch_size => 1) {|t| assert t.approved? }
428
+ end
429
+
430
+ assert_queries(3) do
431
+ Topic.approved.find_in_batches(:batch_size => 2) do |group|
432
+ group.each {|t| assert t.approved? }
433
+ end
434
+ end
435
+ end
436
+
437
+ def test_table_names_for_chaining_scopes_with_and_without_table_name_included
438
+ assert_nothing_raised do
439
+ Comment.for_first_post.for_first_author.to_a
440
+ end
441
+ end
442
+
443
+ def test_scopes_with_reserved_names
444
+ class << Topic
445
+ def public_method; end
446
+ public :public_method
447
+
448
+ def protected_method; end
449
+ protected :protected_method
450
+
451
+ def private_method; end
452
+ private :private_method
453
+ end
454
+
455
+ [:public_method, :protected_method, :private_method].each do |reserved_method|
456
+ assert Topic.respond_to?(reserved_method, true)
457
+ ActiveRecord::Base.logger.expects(:warn)
458
+ silence_warnings { Topic.scope(reserved_method, -> { }) }
459
+ end
460
+ end
461
+
462
+ def test_scopes_on_relations
463
+ # Topic.replied
464
+ approved_topics = Topic.all.approved.order('id DESC')
465
+ assert_equal topics(:fifth), approved_topics.first
466
+
467
+ replied_approved_topics = approved_topics.replied
468
+ assert_equal topics(:third), replied_approved_topics.first
469
+ end
470
+
471
+ def test_index_on_scope
472
+ approved = Topic.approved.order('id ASC')
473
+ assert_equal topics(:second), approved[0]
474
+ assert approved.loaded?
475
+ end
476
+
477
+ def test_nested_scopes_queries_size
478
+ assert_queries(1) do
479
+ Topic.approved.by_lifo.replied.written_before(Time.now).to_a
480
+ end
481
+ end
482
+
483
+ # Note: these next two are kinda odd because they are essentially just testing that the
484
+ # query cache works as it should, but they are here for legacy reasons as they was previously
485
+ # a separate cache on association proxies, and these show that that is not necessary.
486
+ def test_scopes_are_cached_on_associations
487
+ post = posts(:welcome)
488
+
489
+ Post.cache do
490
+ assert_queries(1) { post.comments.containing_the_letter_e.to_a }
491
+ assert_no_queries { post.comments.containing_the_letter_e.to_a }
492
+ end
493
+ end
494
+
495
+ def test_scopes_with_arguments_are_cached_on_associations
496
+ post = posts(:welcome)
497
+
498
+ Post.cache do
499
+ one = assert_queries(1) { post.comments.limit_by(1).to_a }
500
+ assert_equal 1, one.size
501
+
502
+ two = assert_queries(1) { post.comments.limit_by(2).to_a }
503
+ assert_equal 2, two.size
504
+
505
+ assert_no_queries { post.comments.limit_by(1).to_a }
506
+ assert_no_queries { post.comments.limit_by(2).to_a }
507
+ end
508
+ end
509
+
510
+ def test_scopes_to_get_newest
511
+ post = posts(:welcome)
512
+ old_last_comment = post.comments.newest
513
+ new_comment = post.comments.create(:body => "My new comment")
514
+ assert_equal new_comment, post.comments.newest
515
+ assert_not_equal old_last_comment, post.comments.newest
516
+ end
517
+
518
+ def test_scopes_are_reset_on_association_reload
519
+ post = posts(:welcome)
520
+
521
+ [:destroy_all, :reset, :delete_all].each do |method|
522
+ before = post.comments.containing_the_letter_e
523
+ post.association(:comments).send(method)
524
+ assert before.object_id != post.comments.containing_the_letter_e.object_id, "CollectionAssociation##{method} should reset the named scopes cache"
525
+ end
526
+ end
527
+
528
+ def test_scoped_are_lazy_loaded_if_table_still_does_not_exist
529
+ assert_nothing_raised do
530
+ require "models/without_table"
531
+ end
532
+ end
533
+
534
+ def test_eager_default_scope_relations_are_remove
535
+ klass = Class.new(ActiveRecord::Base)
536
+ klass.table_name = 'posts'
537
+
538
+ assert_raises(ArgumentError) do
539
+ klass.send(:default_scope, klass.where(:id => posts(:welcome).id))
540
+ end
541
+ end
542
+
543
+ def test_subclass_merges_scopes_properly
544
+ assert_equal 1, SpecialComment.where(body: 'go crazy').created.count
545
+ end
546
+
547
+ def test_model_class_should_respond_to_none
548
+ assert !Topic.none?
549
+ Topic.delete_all
550
+ assert Topic.none?
551
+ end
552
+
553
+ def test_model_class_should_respond_to_one
554
+ assert !Topic.one?
555
+ Topic.delete_all
556
+ assert !Topic.one?
557
+ Topic.create!
558
+ assert Topic.one?
559
+ end
560
+
561
+ end