ibm_db 4.0.0-x86-mingw32 → 5.1.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 (576) hide show
  1. checksums.yaml +5 -5
  2. data/MANIFEST +14 -14
  3. data/README +208 -208
  4. data/ext/Makefile +269 -0
  5. data/ext/Makefile.nt32 +181 -181
  6. data/ext/Makefile.nt32.191 +212 -212
  7. data/ext/extconf.rb +322 -291
  8. data/ext/gil_release_version.h +3 -0
  9. data/ext/ibm_db-i386-mingw32.def +2 -0
  10. data/ext/ibm_db.c +11879 -11887
  11. data/ext/ibm_db.o +0 -0
  12. data/ext/ibm_db.so +0 -0
  13. data/ext/mkmf.log +110 -0
  14. data/ext/ruby_ibm_db.h +241 -241
  15. data/ext/ruby_ibm_db_cli.c +866 -866
  16. data/ext/ruby_ibm_db_cli.h +500 -500
  17. data/ext/ruby_ibm_db_cli.o +0 -0
  18. data/ext/unicode_support_version.h +3 -0
  19. data/init.rb +41 -41
  20. data/lib/IBM_DB.rb +27 -27
  21. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3593 -3452
  22. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -5
  23. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  24. data/lib/mswin32/ibm_db.rb +94 -90
  25. data/lib/mswin32/rb2x/i386/ruby26/ibm_db.so +0 -0
  26. data/lib/mswin32/rb2x/i386/ruby27/ibm_db.so +0 -0
  27. data/test/active_record/connection_adapters/fake_adapter.rb +49 -49
  28. data/test/assets/example.log +1 -1
  29. data/test/assets/test.txt +1 -1
  30. data/test/cases/adapter_test.rb +351 -351
  31. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -193
  32. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -50
  33. data/test/cases/adapters/mysql2/boolean_test.rb +100 -100
  34. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -63
  35. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -54
  36. data/test/cases/adapters/mysql2/connection_test.rb +210 -210
  37. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -45
  38. data/test/cases/adapters/mysql2/enum_test.rb +26 -26
  39. data/test/cases/adapters/mysql2/explain_test.rb +21 -21
  40. data/test/cases/adapters/mysql2/json_test.rb +195 -195
  41. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -83
  42. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -152
  43. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -59
  44. data/test/cases/adapters/mysql2/schema_test.rb +126 -126
  45. data/test/cases/adapters/mysql2/sp_test.rb +36 -36
  46. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -14
  47. data/test/cases/adapters/mysql2/table_options_test.rb +42 -42
  48. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -66
  49. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -98
  50. data/test/cases/adapters/postgresql/array_test.rb +339 -339
  51. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -82
  52. data/test/cases/adapters/postgresql/bytea_test.rb +134 -134
  53. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -26
  54. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -38
  55. data/test/cases/adapters/postgresql/cidr_test.rb +25 -25
  56. data/test/cases/adapters/postgresql/citext_test.rb +78 -78
  57. data/test/cases/adapters/postgresql/collation_test.rb +53 -53
  58. data/test/cases/adapters/postgresql/composite_test.rb +132 -132
  59. data/test/cases/adapters/postgresql/connection_test.rb +257 -257
  60. data/test/cases/adapters/postgresql/datatype_test.rb +92 -92
  61. data/test/cases/adapters/postgresql/domain_test.rb +47 -47
  62. data/test/cases/adapters/postgresql/enum_test.rb +91 -91
  63. data/test/cases/adapters/postgresql/explain_test.rb +20 -20
  64. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -63
  65. data/test/cases/adapters/postgresql/full_text_test.rb +44 -44
  66. data/test/cases/adapters/postgresql/geometric_test.rb +378 -378
  67. data/test/cases/adapters/postgresql/hstore_test.rb +382 -382
  68. data/test/cases/adapters/postgresql/infinity_test.rb +69 -69
  69. data/test/cases/adapters/postgresql/integer_test.rb +25 -25
  70. data/test/cases/adapters/postgresql/json_test.rb +237 -237
  71. data/test/cases/adapters/postgresql/ltree_test.rb +53 -53
  72. data/test/cases/adapters/postgresql/money_test.rb +96 -96
  73. data/test/cases/adapters/postgresql/network_test.rb +94 -94
  74. data/test/cases/adapters/postgresql/numbers_test.rb +49 -49
  75. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -405
  76. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -22
  77. data/test/cases/adapters/postgresql/quoting_test.rb +44 -44
  78. data/test/cases/adapters/postgresql/range_test.rb +343 -343
  79. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -111
  80. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -34
  81. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -119
  82. data/test/cases/adapters/postgresql/schema_test.rb +597 -597
  83. data/test/cases/adapters/postgresql/serial_test.rb +154 -154
  84. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -41
  85. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -90
  86. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -33
  87. data/test/cases/adapters/postgresql/utils_test.rb +62 -62
  88. data/test/cases/adapters/postgresql/uuid_test.rb +294 -294
  89. data/test/cases/adapters/postgresql/xml_test.rb +54 -54
  90. data/test/cases/adapters/sqlite3/collation_test.rb +53 -53
  91. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -98
  92. data/test/cases/adapters/sqlite3/explain_test.rb +21 -21
  93. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -101
  94. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -441
  95. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -24
  96. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -20
  97. data/test/cases/aggregations_test.rb +168 -168
  98. data/test/cases/ar_schema_test.rb +146 -146
  99. data/test/cases/associations/association_scope_test.rb +16 -16
  100. data/test/cases/associations/belongs_to_associations_test.rb +1141 -1141
  101. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -41
  102. data/test/cases/associations/callbacks_test.rb +190 -190
  103. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  104. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  105. data/test/cases/associations/eager_load_nested_include_test.rb +126 -126
  106. data/test/cases/associations/eager_singularization_test.rb +148 -148
  107. data/test/cases/associations/eager_test.rb +1514 -1514
  108. data/test/cases/associations/extension_test.rb +87 -87
  109. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -1004
  110. data/test/cases/associations/has_many_associations_test.rb +2501 -2501
  111. data/test/cases/associations/has_many_through_associations_test.rb +1271 -1271
  112. data/test/cases/associations/has_one_associations_test.rb +707 -707
  113. data/test/cases/associations/has_one_through_associations_test.rb +383 -383
  114. data/test/cases/associations/inner_join_association_test.rb +139 -139
  115. data/test/cases/associations/inverse_associations_test.rb +733 -733
  116. data/test/cases/associations/join_model_test.rb +777 -777
  117. data/test/cases/associations/left_outer_join_association_test.rb +88 -88
  118. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  119. data/test/cases/associations/required_test.rb +102 -102
  120. data/test/cases/associations_test.rb +385 -385
  121. data/test/cases/attribute_decorators_test.rb +126 -125
  122. data/test/cases/attribute_methods/read_test.rb +60 -60
  123. data/test/cases/attribute_methods_test.rb +1009 -1009
  124. data/test/cases/attribute_set_test.rb +270 -270
  125. data/test/cases/attribute_test.rb +246 -246
  126. data/test/cases/attributes_test.rb +253 -253
  127. data/test/cases/autosave_association_test.rb +1708 -1708
  128. data/test/cases/base_test.rb +1713 -1713
  129. data/test/cases/batches_test.rb +489 -489
  130. data/test/cases/binary_test.rb +44 -44
  131. data/test/cases/bind_parameter_test.rb +110 -110
  132. data/test/cases/cache_key_test.rb +26 -25
  133. data/test/cases/calculations_test.rb +798 -798
  134. data/test/cases/callbacks_test.rb +636 -636
  135. data/test/cases/clone_test.rb +40 -40
  136. data/test/cases/coders/json_test.rb +15 -15
  137. data/test/cases/coders/yaml_column_test.rb +63 -63
  138. data/test/cases/collection_cache_key_test.rb +115 -115
  139. data/test/cases/column_alias_test.rb +17 -17
  140. data/test/cases/column_definition_test.rb +92 -92
  141. data/test/cases/comment_test.rb +145 -143
  142. data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -56
  143. data/test/cases/connection_adapters/connection_handler_test.rb +160 -160
  144. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  145. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -255
  146. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -69
  147. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  148. data/test/cases/connection_adapters/schema_cache_test.rb +61 -61
  149. data/test/cases/connection_adapters/type_lookup_test.rb +118 -118
  150. data/test/cases/connection_management_test.rb +112 -112
  151. data/test/cases/connection_pool_test.rb +521 -521
  152. data/test/cases/connection_specification/resolver_test.rb +131 -131
  153. data/test/cases/core_test.rb +112 -112
  154. data/test/cases/counter_cache_test.rb +214 -214
  155. data/test/cases/custom_locking_test.rb +17 -17
  156. data/test/cases/database_statements_test.rb +34 -34
  157. data/test/cases/date_test.rb +44 -44
  158. data/test/cases/date_time_precision_test.rb +107 -106
  159. data/test/cases/date_time_test.rb +61 -61
  160. data/test/cases/defaults_test.rb +219 -218
  161. data/test/cases/dirty_test.rb +763 -763
  162. data/test/cases/disconnected_test.rb +30 -30
  163. data/test/cases/dup_test.rb +157 -157
  164. data/test/cases/enum_test.rb +444 -444
  165. data/test/cases/errors_test.rb +16 -16
  166. data/test/cases/explain_subscriber_test.rb +64 -64
  167. data/test/cases/explain_test.rb +87 -87
  168. data/test/cases/finder_respond_to_test.rb +60 -60
  169. data/test/cases/finder_test.rb +1294 -1294
  170. data/test/cases/fixture_set/file_test.rb +156 -156
  171. data/test/cases/fixtures_test.rb +988 -988
  172. data/test/cases/forbidden_attributes_protection_test.rb +165 -165
  173. data/test/cases/habtm_destroy_order_test.rb +61 -61
  174. data/test/cases/helper.rb +204 -204
  175. data/test/cases/hot_compatibility_test.rb +142 -142
  176. data/test/cases/i18n_test.rb +45 -45
  177. data/test/cases/inheritance_test.rb +606 -606
  178. data/test/cases/integration_test.rb +155 -155
  179. data/test/cases/invalid_connection_test.rb +24 -24
  180. data/test/cases/invertible_migration_test.rb +387 -387
  181. data/test/cases/json_serialization_test.rb +311 -311
  182. data/test/cases/locking_test.rb +493 -493
  183. data/test/cases/log_subscriber_test.rb +225 -225
  184. data/test/cases/migration/change_schema_test.rb +458 -458
  185. data/test/cases/migration/change_table_test.rb +256 -256
  186. data/test/cases/migration/column_attributes_test.rb +176 -176
  187. data/test/cases/migration/column_positioning_test.rb +56 -56
  188. data/test/cases/migration/columns_test.rb +310 -310
  189. data/test/cases/migration/command_recorder_test.rb +350 -350
  190. data/test/cases/migration/compatibility_test.rb +118 -118
  191. data/test/cases/migration/create_join_table_test.rb +157 -157
  192. data/test/cases/migration/foreign_key_test.rb +362 -360
  193. data/test/cases/migration/helper.rb +39 -39
  194. data/test/cases/migration/index_test.rb +218 -218
  195. data/test/cases/migration/logger_test.rb +36 -36
  196. data/test/cases/migration/pending_migrations_test.rb +52 -52
  197. data/test/cases/migration/references_foreign_key_test.rb +221 -216
  198. data/test/cases/migration/references_index_test.rb +101 -101
  199. data/test/cases/migration/references_statements_test.rb +136 -136
  200. data/test/cases/migration/rename_table_test.rb +93 -93
  201. data/test/cases/migration_test.rb +1157 -1157
  202. data/test/cases/migrator_test.rb +471 -470
  203. data/test/cases/mixin_test.rb +68 -68
  204. data/test/cases/modules_test.rb +172 -172
  205. data/test/cases/multiparameter_attributes_test.rb +372 -372
  206. data/test/cases/multiple_db_test.rb +122 -122
  207. data/test/cases/nested_attributes_test.rb +1098 -1098
  208. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  209. data/test/cases/persistence_test.rb +1001 -1001
  210. data/test/cases/pooled_connections_test.rb +81 -81
  211. data/test/cases/primary_keys_test.rb +376 -376
  212. data/test/cases/query_cache_test.rb +446 -446
  213. data/test/cases/quoting_test.rb +202 -202
  214. data/test/cases/readonly_test.rb +119 -119
  215. data/test/cases/reaper_test.rb +85 -85
  216. data/test/cases/reflection_test.rb +509 -509
  217. data/test/cases/relation/delegation_test.rb +63 -63
  218. data/test/cases/relation/merging_test.rb +157 -157
  219. data/test/cases/relation/mutation_test.rb +183 -183
  220. data/test/cases/relation/or_test.rb +92 -92
  221. data/test/cases/relation/predicate_builder_test.rb +16 -16
  222. data/test/cases/relation/record_fetch_warning_test.rb +40 -40
  223. data/test/cases/relation/where_chain_test.rb +105 -105
  224. data/test/cases/relation/where_clause_test.rb +182 -182
  225. data/test/cases/relation/where_test.rb +322 -322
  226. data/test/cases/relation_test.rb +328 -328
  227. data/test/cases/relations_test.rb +2026 -2026
  228. data/test/cases/reload_models_test.rb +22 -22
  229. data/test/cases/result_test.rb +90 -90
  230. data/test/cases/sanitize_test.rb +176 -176
  231. data/test/cases/schema_dumper_test.rb +457 -457
  232. data/test/cases/schema_loading_test.rb +52 -52
  233. data/test/cases/scoping/default_scoping_test.rb +528 -528
  234. data/test/cases/scoping/named_scoping_test.rb +561 -561
  235. data/test/cases/scoping/relation_scoping_test.rb +400 -400
  236. data/test/cases/secure_token_test.rb +32 -32
  237. data/test/cases/serialization_test.rb +104 -104
  238. data/test/cases/serialized_attribute_test.rb +364 -364
  239. data/test/cases/statement_cache_test.rb +136 -136
  240. data/test/cases/store_test.rb +195 -195
  241. data/test/cases/suppressor_test.rb +63 -63
  242. data/test/cases/tasks/database_tasks_test.rb +462 -462
  243. data/test/cases/tasks/mysql_rake_test.rb +345 -345
  244. data/test/cases/tasks/postgresql_rake_test.rb +304 -304
  245. data/test/cases/tasks/sqlite_rake_test.rb +220 -220
  246. data/test/cases/test_case.rb +131 -131
  247. data/test/cases/test_fixtures_test.rb +36 -36
  248. data/test/cases/time_precision_test.rb +103 -102
  249. data/test/cases/timestamp_test.rb +501 -501
  250. data/test/cases/touch_later_test.rb +121 -121
  251. data/test/cases/transaction_callbacks_test.rb +518 -518
  252. data/test/cases/transaction_isolation_test.rb +106 -106
  253. data/test/cases/transactions_test.rb +835 -834
  254. data/test/cases/type/adapter_specific_registry_test.rb +133 -133
  255. data/test/cases/type/date_time_test.rb +14 -14
  256. data/test/cases/type/integer_test.rb +27 -27
  257. data/test/cases/type/string_test.rb +22 -22
  258. data/test/cases/type/type_map_test.rb +177 -177
  259. data/test/cases/type_test.rb +39 -39
  260. data/test/cases/types_test.rb +24 -24
  261. data/test/cases/unconnected_test.rb +33 -33
  262. data/test/cases/validations/absence_validation_test.rb +73 -73
  263. data/test/cases/validations/association_validation_test.rb +97 -97
  264. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  265. data/test/cases/validations/i18n_validation_test.rb +86 -86
  266. data/test/cases/validations/length_validation_test.rb +79 -79
  267. data/test/cases/validations/presence_validation_test.rb +103 -103
  268. data/test/cases/validations/uniqueness_validation_test.rb +548 -548
  269. data/test/cases/validations_repair_helper.rb +19 -19
  270. data/test/cases/validations_test.rb +194 -194
  271. data/test/cases/view_test.rb +216 -216
  272. data/test/cases/yaml_serialization_test.rb +121 -121
  273. data/test/config.example.yml +97 -97
  274. data/test/config.rb +5 -5
  275. data/test/connections/native_ibm_db/connection.rb +44 -0
  276. data/test/fixtures/accounts.yml +29 -29
  277. data/test/fixtures/admin/accounts.yml +2 -2
  278. data/test/fixtures/admin/users.yml +10 -10
  279. data/test/fixtures/author_addresses.yml +17 -17
  280. data/test/fixtures/author_favorites.yml +3 -3
  281. data/test/fixtures/authors.yml +23 -23
  282. data/test/fixtures/bad_posts.yml +9 -9
  283. data/test/fixtures/binaries.yml +133 -133
  284. data/test/fixtures/books.yml +31 -31
  285. data/test/fixtures/bulbs.yml +5 -5
  286. data/test/fixtures/cars.yml +9 -9
  287. data/test/fixtures/categories.yml +19 -19
  288. data/test/fixtures/categories/special_categories.yml +9 -9
  289. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  290. data/test/fixtures/categories_ordered.yml +7 -7
  291. data/test/fixtures/categories_posts.yml +31 -31
  292. data/test/fixtures/categorizations.yml +23 -23
  293. data/test/fixtures/clubs.yml +8 -8
  294. data/test/fixtures/collections.yml +3 -3
  295. data/test/fixtures/colleges.yml +3 -3
  296. data/test/fixtures/comments.yml +65 -65
  297. data/test/fixtures/companies.yml +67 -67
  298. data/test/fixtures/computers.yml +10 -10
  299. data/test/fixtures/content.yml +3 -3
  300. data/test/fixtures/content_positions.yml +3 -3
  301. data/test/fixtures/courses.yml +8 -8
  302. data/test/fixtures/customers.yml +25 -25
  303. data/test/fixtures/dashboards.yml +6 -6
  304. data/test/fixtures/dead_parrots.yml +5 -5
  305. data/test/fixtures/developers.yml +22 -22
  306. data/test/fixtures/developers_projects.yml +16 -16
  307. data/test/fixtures/dog_lovers.yml +7 -7
  308. data/test/fixtures/dogs.yml +4 -4
  309. data/test/fixtures/doubloons.yml +3 -3
  310. data/test/fixtures/edges.yml +5 -5
  311. data/test/fixtures/entrants.yml +14 -14
  312. data/test/fixtures/essays.yml +6 -6
  313. data/test/fixtures/faces.yml +11 -11
  314. data/test/fixtures/fk_test_has_fk.yml +3 -3
  315. data/test/fixtures/fk_test_has_pk.yml +1 -1
  316. data/test/fixtures/friendships.yml +4 -4
  317. data/test/fixtures/funny_jokes.yml +10 -10
  318. data/test/fixtures/interests.yml +33 -33
  319. data/test/fixtures/items.yml +3 -3
  320. data/test/fixtures/jobs.yml +7 -7
  321. data/test/fixtures/legacy_things.yml +3 -3
  322. data/test/fixtures/live_parrots.yml +4 -4
  323. data/test/fixtures/mateys.yml +4 -4
  324. data/test/fixtures/member_details.yml +8 -8
  325. data/test/fixtures/member_types.yml +6 -6
  326. data/test/fixtures/members.yml +11 -11
  327. data/test/fixtures/memberships.yml +34 -34
  328. data/test/fixtures/men.yml +5 -5
  329. data/test/fixtures/minimalistics.yml +2 -2
  330. data/test/fixtures/minivans.yml +5 -5
  331. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  332. data/test/fixtures/mixins.yml +29 -29
  333. data/test/fixtures/movies.yml +7 -7
  334. data/test/fixtures/naked/yml/accounts.yml +1 -1
  335. data/test/fixtures/naked/yml/companies.yml +1 -1
  336. data/test/fixtures/naked/yml/courses.yml +1 -1
  337. data/test/fixtures/naked/yml/parrots.yml +2 -2
  338. data/test/fixtures/naked/yml/trees.yml +3 -3
  339. data/test/fixtures/nodes.yml +29 -29
  340. data/test/fixtures/organizations.yml +5 -5
  341. data/test/fixtures/other_comments.yml +6 -6
  342. data/test/fixtures/other_dogs.yml +2 -2
  343. data/test/fixtures/other_posts.yml +7 -7
  344. data/test/fixtures/other_topics.yml +42 -42
  345. data/test/fixtures/owners.yml +9 -9
  346. data/test/fixtures/parrots.yml +27 -27
  347. data/test/fixtures/parrots_pirates.yml +7 -7
  348. data/test/fixtures/people.yml +24 -24
  349. data/test/fixtures/peoples_treasures.yml +3 -3
  350. data/test/fixtures/pets.yml +19 -19
  351. data/test/fixtures/pirates.yml +12 -15
  352. data/test/fixtures/posts.yml +80 -80
  353. data/test/fixtures/price_estimates.yml +16 -16
  354. data/test/fixtures/products.yml +4 -4
  355. data/test/fixtures/projects.yml +7 -7
  356. data/test/fixtures/ratings.yml +14 -14
  357. data/test/fixtures/readers.yml +11 -11
  358. data/test/fixtures/references.yml +17 -17
  359. data/test/fixtures/reserved_words/distinct.yml +5 -5
  360. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  361. data/test/fixtures/reserved_words/group.yml +14 -14
  362. data/test/fixtures/reserved_words/select.yml +8 -8
  363. data/test/fixtures/reserved_words/values.yml +7 -7
  364. data/test/fixtures/ships.yml +6 -6
  365. data/test/fixtures/speedometers.yml +8 -8
  366. data/test/fixtures/sponsors.yml +12 -12
  367. data/test/fixtures/string_key_objects.yml +7 -7
  368. data/test/fixtures/subscribers.yml +10 -10
  369. data/test/fixtures/subscriptions.yml +12 -12
  370. data/test/fixtures/taggings.yml +78 -78
  371. data/test/fixtures/tags.yml +11 -11
  372. data/test/fixtures/tasks.yml +7 -7
  373. data/test/fixtures/teapots.yml +3 -3
  374. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  375. data/test/fixtures/to_be_linked/users.yml +10 -10
  376. data/test/fixtures/topics.yml +49 -49
  377. data/test/fixtures/toys.yml +14 -14
  378. data/test/fixtures/traffic_lights.yml +9 -9
  379. data/test/fixtures/treasures.yml +10 -10
  380. data/test/fixtures/trees.yml +3 -3
  381. data/test/fixtures/uuid_children.yml +3 -3
  382. data/test/fixtures/uuid_parents.yml +2 -2
  383. data/test/fixtures/variants.yml +4 -4
  384. data/test/fixtures/vegetables.yml +19 -19
  385. data/test/fixtures/vertices.yml +3 -3
  386. data/test/fixtures/warehouse_things.yml +2 -2
  387. data/test/fixtures/zines.yml +5 -5
  388. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  389. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  390. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  391. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -9
  392. data/test/migrations/missing/1_people_have_last_names.rb +9 -9
  393. data/test/migrations/missing/3_we_need_reminders.rb +12 -12
  394. data/test/migrations/missing/4_innocent_jointable.rb +12 -12
  395. data/test/migrations/rename/1_we_need_things.rb +11 -11
  396. data/test/migrations/rename/2_rename_things.rb +9 -9
  397. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  398. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  399. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  400. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  401. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  402. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  403. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  404. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  405. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  406. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  407. data/test/migrations/valid/2_we_need_reminders.rb +12 -12
  408. data/test/migrations/valid/3_innocent_jointable.rb +12 -12
  409. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  410. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -12
  411. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -12
  412. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  413. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  414. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  415. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  416. data/test/models/admin.rb +5 -5
  417. data/test/models/admin/account.rb +3 -3
  418. data/test/models/admin/user.rb +40 -40
  419. data/test/models/aircraft.rb +5 -5
  420. data/test/models/arunit2_model.rb +3 -3
  421. data/test/models/author.rb +209 -209
  422. data/test/models/auto_id.rb +4 -4
  423. data/test/models/autoloadable/extra_firm.rb +2 -2
  424. data/test/models/binary.rb +2 -2
  425. data/test/models/bird.rb +12 -12
  426. data/test/models/book.rb +23 -23
  427. data/test/models/boolean.rb +2 -2
  428. data/test/models/bulb.rb +52 -52
  429. data/test/models/cake_designer.rb +3 -3
  430. data/test/models/car.rb +29 -29
  431. data/test/models/carrier.rb +2 -2
  432. data/test/models/cat.rb +10 -10
  433. data/test/models/categorization.rb +19 -19
  434. data/test/models/category.rb +35 -35
  435. data/test/models/chef.rb +8 -8
  436. data/test/models/citation.rb +3 -3
  437. data/test/models/club.rb +25 -25
  438. data/test/models/college.rb +10 -10
  439. data/test/models/column.rb +3 -3
  440. data/test/models/column_name.rb +3 -3
  441. data/test/models/comment.rb +76 -76
  442. data/test/models/company.rb +230 -230
  443. data/test/models/company_in_module.rb +98 -98
  444. data/test/models/computer.rb +3 -3
  445. data/test/models/contact.rb +41 -41
  446. data/test/models/content.rb +40 -40
  447. data/test/models/contract.rb +20 -20
  448. data/test/models/country.rb +7 -7
  449. data/test/models/course.rb +6 -6
  450. data/test/models/customer.rb +83 -83
  451. data/test/models/customer_carrier.rb +14 -14
  452. data/test/models/dashboard.rb +3 -3
  453. data/test/models/default.rb +2 -2
  454. data/test/models/department.rb +4 -4
  455. data/test/models/developer.rb +274 -274
  456. data/test/models/dog.rb +5 -5
  457. data/test/models/dog_lover.rb +5 -5
  458. data/test/models/doubloon.rb +12 -12
  459. data/test/models/drink_designer.rb +3 -3
  460. data/test/models/edge.rb +5 -5
  461. data/test/models/electron.rb +5 -5
  462. data/test/models/engine.rb +4 -4
  463. data/test/models/entrant.rb +3 -3
  464. data/test/models/essay.rb +5 -5
  465. data/test/models/event.rb +3 -3
  466. data/test/models/eye.rb +37 -37
  467. data/test/models/face.rb +9 -9
  468. data/test/models/friendship.rb +6 -6
  469. data/test/models/guid.rb +2 -2
  470. data/test/models/guitar.rb +4 -4
  471. data/test/models/hotel.rb +11 -11
  472. data/test/models/image.rb +3 -3
  473. data/test/models/interest.rb +5 -5
  474. data/test/models/invoice.rb +4 -4
  475. data/test/models/item.rb +7 -7
  476. data/test/models/job.rb +7 -7
  477. data/test/models/joke.rb +7 -7
  478. data/test/models/keyboard.rb +3 -3
  479. data/test/models/legacy_thing.rb +3 -3
  480. data/test/models/lesson.rb +11 -11
  481. data/test/models/line_item.rb +3 -3
  482. data/test/models/liquid.rb +4 -4
  483. data/test/models/man.rb +11 -11
  484. data/test/models/matey.rb +4 -4
  485. data/test/models/member.rb +42 -42
  486. data/test/models/member_detail.rb +8 -8
  487. data/test/models/member_type.rb +3 -3
  488. data/test/models/membership.rb +35 -35
  489. data/test/models/mentor.rb +2 -2
  490. data/test/models/minimalistic.rb +2 -2
  491. data/test/models/minivan.rb +9 -9
  492. data/test/models/mixed_case_monkey.rb +3 -3
  493. data/test/models/mocktail_designer.rb +2 -2
  494. data/test/models/molecule.rb +6 -6
  495. data/test/models/movie.rb +5 -5
  496. data/test/models/node.rb +5 -5
  497. data/test/models/non_primary_key.rb +2 -2
  498. data/test/models/notification.rb +3 -3
  499. data/test/models/order.rb +4 -4
  500. data/test/models/organization.rb +14 -14
  501. data/test/models/other_dog.rb +5 -5
  502. data/test/models/owner.rb +37 -37
  503. data/test/models/parrot.rb +28 -28
  504. data/test/models/person.rb +142 -142
  505. data/test/models/personal_legacy_thing.rb +4 -4
  506. data/test/models/pet.rb +18 -18
  507. data/test/models/pet_treasure.rb +6 -6
  508. data/test/models/pirate.rb +92 -92
  509. data/test/models/possession.rb +3 -3
  510. data/test/models/post.rb +273 -273
  511. data/test/models/price_estimate.rb +4 -4
  512. data/test/models/professor.rb +5 -5
  513. data/test/models/project.rb +40 -40
  514. data/test/models/publisher.rb +2 -2
  515. data/test/models/publisher/article.rb +4 -4
  516. data/test/models/publisher/magazine.rb +3 -3
  517. data/test/models/rating.rb +4 -4
  518. data/test/models/reader.rb +23 -23
  519. data/test/models/recipe.rb +3 -3
  520. data/test/models/record.rb +2 -2
  521. data/test/models/reference.rb +22 -22
  522. data/test/models/reply.rb +61 -61
  523. data/test/models/ship.rb +39 -39
  524. data/test/models/ship_part.rb +8 -8
  525. data/test/models/shop.rb +17 -17
  526. data/test/models/shop_account.rb +6 -6
  527. data/test/models/speedometer.rb +6 -6
  528. data/test/models/sponsor.rb +7 -7
  529. data/test/models/string_key_object.rb +3 -3
  530. data/test/models/student.rb +4 -4
  531. data/test/models/subject.rb +16 -16
  532. data/test/models/subscriber.rb +8 -8
  533. data/test/models/subscription.rb +4 -4
  534. data/test/models/tag.rb +13 -13
  535. data/test/models/tagging.rb +13 -13
  536. data/test/models/task.rb +5 -5
  537. data/test/models/topic.rb +118 -118
  538. data/test/models/toy.rb +6 -6
  539. data/test/models/traffic_light.rb +4 -4
  540. data/test/models/treasure.rb +14 -14
  541. data/test/models/treaty.rb +7 -7
  542. data/test/models/tree.rb +3 -3
  543. data/test/models/tuning_peg.rb +4 -4
  544. data/test/models/tyre.rb +11 -11
  545. data/test/models/user.rb +14 -14
  546. data/test/models/uuid_child.rb +3 -3
  547. data/test/models/uuid_item.rb +6 -6
  548. data/test/models/uuid_parent.rb +3 -3
  549. data/test/models/vegetables.rb +24 -24
  550. data/test/models/vehicle.rb +6 -6
  551. data/test/models/vertex.rb +9 -9
  552. data/test/models/warehouse_thing.rb +5 -5
  553. data/test/models/wheel.rb +3 -3
  554. data/test/models/without_table.rb +3 -3
  555. data/test/models/zine.rb +3 -3
  556. data/test/schema/i5/ibm_db_specific_schema.rb +137 -0
  557. data/test/schema/ids/ibm_db_specific_schema.rb +140 -0
  558. data/test/schema/luw/ibm_db_specific_schema.rb +137 -0
  559. data/test/schema/mysql2_specific_schema.rb +68 -68
  560. data/test/schema/oracle_specific_schema.rb +40 -40
  561. data/test/schema/postgresql_specific_schema.rb +114 -114
  562. data/test/schema/schema.rb +1057 -1057
  563. data/test/schema/schema.rb.original +1057 -1057
  564. data/test/schema/sqlite_specific_schema.rb +18 -18
  565. data/test/schema/zOS/ibm_db_specific_schema.rb +208 -0
  566. data/test/support/config.rb +43 -43
  567. data/test/support/connection.rb +23 -23
  568. data/test/support/connection_helper.rb +14 -14
  569. data/test/support/ddl_helper.rb +8 -8
  570. data/test/support/schema_dumping_helper.rb +20 -20
  571. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -22
  572. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -182
  573. metadata +30 -14
  574. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  575. data/test/fixtures/author_addresses.original +0 -11
  576. data/test/fixtures/authors.original +0 -17
@@ -1,561 +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
- 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
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