ibm_db 4.0.0-x86-mingw32 → 5.0.2-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 (570) 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 +3 -0
  9. data/ext/ibm_db.c +11879 -11887
  10. data/ext/mkmf.log +110 -0
  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/ext/unicode_support_version +3 -0
  15. data/init.rb +41 -41
  16. data/lib/IBM_DB.rb +27 -27
  17. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3533 -3452
  18. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -5
  19. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  20. data/lib/mswin32/ibm_db.rb +90 -90
  21. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  22. data/test/active_record/connection_adapters/fake_adapter.rb +49 -49
  23. data/test/assets/example.log +1 -1
  24. data/test/assets/test.txt +1 -1
  25. data/test/cases/adapter_test.rb +351 -351
  26. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -193
  27. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -50
  28. data/test/cases/adapters/mysql2/boolean_test.rb +100 -100
  29. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -63
  30. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -54
  31. data/test/cases/adapters/mysql2/connection_test.rb +210 -210
  32. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -45
  33. data/test/cases/adapters/mysql2/enum_test.rb +26 -26
  34. data/test/cases/adapters/mysql2/explain_test.rb +21 -21
  35. data/test/cases/adapters/mysql2/json_test.rb +195 -195
  36. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -83
  37. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -152
  38. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -59
  39. data/test/cases/adapters/mysql2/schema_test.rb +126 -126
  40. data/test/cases/adapters/mysql2/sp_test.rb +36 -36
  41. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -14
  42. data/test/cases/adapters/mysql2/table_options_test.rb +42 -42
  43. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -66
  44. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -98
  45. data/test/cases/adapters/postgresql/array_test.rb +339 -339
  46. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -82
  47. data/test/cases/adapters/postgresql/bytea_test.rb +134 -134
  48. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -26
  49. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -38
  50. data/test/cases/adapters/postgresql/cidr_test.rb +25 -25
  51. data/test/cases/adapters/postgresql/citext_test.rb +78 -78
  52. data/test/cases/adapters/postgresql/collation_test.rb +53 -53
  53. data/test/cases/adapters/postgresql/composite_test.rb +132 -132
  54. data/test/cases/adapters/postgresql/connection_test.rb +257 -257
  55. data/test/cases/adapters/postgresql/datatype_test.rb +92 -92
  56. data/test/cases/adapters/postgresql/domain_test.rb +47 -47
  57. data/test/cases/adapters/postgresql/enum_test.rb +91 -91
  58. data/test/cases/adapters/postgresql/explain_test.rb +20 -20
  59. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -63
  60. data/test/cases/adapters/postgresql/full_text_test.rb +44 -44
  61. data/test/cases/adapters/postgresql/geometric_test.rb +378 -378
  62. data/test/cases/adapters/postgresql/hstore_test.rb +382 -382
  63. data/test/cases/adapters/postgresql/infinity_test.rb +69 -69
  64. data/test/cases/adapters/postgresql/integer_test.rb +25 -25
  65. data/test/cases/adapters/postgresql/json_test.rb +237 -237
  66. data/test/cases/adapters/postgresql/ltree_test.rb +53 -53
  67. data/test/cases/adapters/postgresql/money_test.rb +96 -96
  68. data/test/cases/adapters/postgresql/network_test.rb +94 -94
  69. data/test/cases/adapters/postgresql/numbers_test.rb +49 -49
  70. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -405
  71. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -22
  72. data/test/cases/adapters/postgresql/quoting_test.rb +44 -44
  73. data/test/cases/adapters/postgresql/range_test.rb +343 -343
  74. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -111
  75. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -34
  76. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -119
  77. data/test/cases/adapters/postgresql/schema_test.rb +597 -597
  78. data/test/cases/adapters/postgresql/serial_test.rb +154 -154
  79. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -41
  80. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -90
  81. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -33
  82. data/test/cases/adapters/postgresql/utils_test.rb +62 -62
  83. data/test/cases/adapters/postgresql/uuid_test.rb +294 -294
  84. data/test/cases/adapters/postgresql/xml_test.rb +54 -54
  85. data/test/cases/adapters/sqlite3/collation_test.rb +53 -53
  86. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -98
  87. data/test/cases/adapters/sqlite3/explain_test.rb +21 -21
  88. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -101
  89. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -441
  90. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -24
  91. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -20
  92. data/test/cases/aggregations_test.rb +168 -168
  93. data/test/cases/ar_schema_test.rb +146 -146
  94. data/test/cases/associations/association_scope_test.rb +16 -16
  95. data/test/cases/associations/belongs_to_associations_test.rb +1141 -1141
  96. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -41
  97. data/test/cases/associations/callbacks_test.rb +190 -190
  98. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  99. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  100. data/test/cases/associations/eager_load_nested_include_test.rb +126 -126
  101. data/test/cases/associations/eager_singularization_test.rb +148 -148
  102. data/test/cases/associations/eager_test.rb +1514 -1514
  103. data/test/cases/associations/extension_test.rb +87 -87
  104. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -1004
  105. data/test/cases/associations/has_many_associations_test.rb +2501 -2501
  106. data/test/cases/associations/has_many_through_associations_test.rb +1271 -1271
  107. data/test/cases/associations/has_one_associations_test.rb +707 -707
  108. data/test/cases/associations/has_one_through_associations_test.rb +383 -383
  109. data/test/cases/associations/inner_join_association_test.rb +139 -139
  110. data/test/cases/associations/inverse_associations_test.rb +733 -733
  111. data/test/cases/associations/join_model_test.rb +777 -777
  112. data/test/cases/associations/left_outer_join_association_test.rb +88 -88
  113. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  114. data/test/cases/associations/required_test.rb +102 -102
  115. data/test/cases/associations_test.rb +385 -385
  116. data/test/cases/attribute_decorators_test.rb +126 -125
  117. data/test/cases/attribute_methods/read_test.rb +60 -60
  118. data/test/cases/attribute_methods_test.rb +1009 -1009
  119. data/test/cases/attribute_set_test.rb +270 -270
  120. data/test/cases/attribute_test.rb +246 -246
  121. data/test/cases/attributes_test.rb +253 -253
  122. data/test/cases/autosave_association_test.rb +1708 -1708
  123. data/test/cases/base_test.rb +1713 -1713
  124. data/test/cases/batches_test.rb +489 -489
  125. data/test/cases/binary_test.rb +44 -44
  126. data/test/cases/bind_parameter_test.rb +110 -110
  127. data/test/cases/cache_key_test.rb +26 -25
  128. data/test/cases/calculations_test.rb +798 -798
  129. data/test/cases/callbacks_test.rb +636 -636
  130. data/test/cases/clone_test.rb +40 -40
  131. data/test/cases/coders/json_test.rb +15 -15
  132. data/test/cases/coders/yaml_column_test.rb +63 -63
  133. data/test/cases/collection_cache_key_test.rb +115 -115
  134. data/test/cases/column_alias_test.rb +17 -17
  135. data/test/cases/column_definition_test.rb +92 -92
  136. data/test/cases/comment_test.rb +145 -143
  137. data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -56
  138. data/test/cases/connection_adapters/connection_handler_test.rb +160 -160
  139. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  140. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -255
  141. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -69
  142. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  143. data/test/cases/connection_adapters/schema_cache_test.rb +61 -61
  144. data/test/cases/connection_adapters/type_lookup_test.rb +118 -118
  145. data/test/cases/connection_management_test.rb +112 -112
  146. data/test/cases/connection_pool_test.rb +521 -521
  147. data/test/cases/connection_specification/resolver_test.rb +131 -131
  148. data/test/cases/core_test.rb +112 -112
  149. data/test/cases/counter_cache_test.rb +214 -214
  150. data/test/cases/custom_locking_test.rb +17 -17
  151. data/test/cases/database_statements_test.rb +34 -34
  152. data/test/cases/date_test.rb +44 -44
  153. data/test/cases/date_time_precision_test.rb +107 -106
  154. data/test/cases/date_time_test.rb +61 -61
  155. data/test/cases/defaults_test.rb +219 -218
  156. data/test/cases/dirty_test.rb +763 -763
  157. data/test/cases/disconnected_test.rb +30 -30
  158. data/test/cases/dup_test.rb +157 -157
  159. data/test/cases/enum_test.rb +444 -444
  160. data/test/cases/errors_test.rb +16 -16
  161. data/test/cases/explain_subscriber_test.rb +64 -64
  162. data/test/cases/explain_test.rb +87 -87
  163. data/test/cases/finder_respond_to_test.rb +60 -60
  164. data/test/cases/finder_test.rb +1294 -1294
  165. data/test/cases/fixture_set/file_test.rb +156 -156
  166. data/test/cases/fixtures_test.rb +988 -988
  167. data/test/cases/forbidden_attributes_protection_test.rb +165 -165
  168. data/test/cases/habtm_destroy_order_test.rb +61 -61
  169. data/test/cases/helper.rb +204 -204
  170. data/test/cases/hot_compatibility_test.rb +142 -142
  171. data/test/cases/i18n_test.rb +45 -45
  172. data/test/cases/inheritance_test.rb +606 -606
  173. data/test/cases/integration_test.rb +155 -155
  174. data/test/cases/invalid_connection_test.rb +24 -24
  175. data/test/cases/invertible_migration_test.rb +387 -387
  176. data/test/cases/json_serialization_test.rb +311 -311
  177. data/test/cases/locking_test.rb +493 -493
  178. data/test/cases/log_subscriber_test.rb +225 -225
  179. data/test/cases/migration/change_schema_test.rb +458 -458
  180. data/test/cases/migration/change_table_test.rb +256 -256
  181. data/test/cases/migration/column_attributes_test.rb +176 -176
  182. data/test/cases/migration/column_positioning_test.rb +56 -56
  183. data/test/cases/migration/columns_test.rb +310 -310
  184. data/test/cases/migration/command_recorder_test.rb +350 -350
  185. data/test/cases/migration/compatibility_test.rb +118 -118
  186. data/test/cases/migration/create_join_table_test.rb +157 -157
  187. data/test/cases/migration/foreign_key_test.rb +362 -360
  188. data/test/cases/migration/helper.rb +39 -39
  189. data/test/cases/migration/index_test.rb +218 -218
  190. data/test/cases/migration/logger_test.rb +36 -36
  191. data/test/cases/migration/pending_migrations_test.rb +52 -52
  192. data/test/cases/migration/references_foreign_key_test.rb +221 -216
  193. data/test/cases/migration/references_index_test.rb +101 -101
  194. data/test/cases/migration/references_statements_test.rb +136 -136
  195. data/test/cases/migration/rename_table_test.rb +93 -93
  196. data/test/cases/migration_test.rb +1157 -1157
  197. data/test/cases/migrator_test.rb +471 -470
  198. data/test/cases/mixin_test.rb +68 -68
  199. data/test/cases/modules_test.rb +172 -172
  200. data/test/cases/multiparameter_attributes_test.rb +372 -372
  201. data/test/cases/multiple_db_test.rb +122 -122
  202. data/test/cases/nested_attributes_test.rb +1098 -1098
  203. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  204. data/test/cases/persistence_test.rb +1001 -1001
  205. data/test/cases/pooled_connections_test.rb +81 -81
  206. data/test/cases/primary_keys_test.rb +376 -376
  207. data/test/cases/query_cache_test.rb +446 -446
  208. data/test/cases/quoting_test.rb +202 -202
  209. data/test/cases/readonly_test.rb +119 -119
  210. data/test/cases/reaper_test.rb +85 -85
  211. data/test/cases/reflection_test.rb +509 -509
  212. data/test/cases/relation/delegation_test.rb +63 -63
  213. data/test/cases/relation/merging_test.rb +157 -157
  214. data/test/cases/relation/mutation_test.rb +183 -183
  215. data/test/cases/relation/or_test.rb +92 -92
  216. data/test/cases/relation/predicate_builder_test.rb +16 -16
  217. data/test/cases/relation/record_fetch_warning_test.rb +40 -40
  218. data/test/cases/relation/where_chain_test.rb +105 -105
  219. data/test/cases/relation/where_clause_test.rb +182 -182
  220. data/test/cases/relation/where_test.rb +322 -322
  221. data/test/cases/relation_test.rb +328 -328
  222. data/test/cases/relations_test.rb +2026 -2026
  223. data/test/cases/reload_models_test.rb +22 -22
  224. data/test/cases/result_test.rb +90 -90
  225. data/test/cases/sanitize_test.rb +176 -176
  226. data/test/cases/schema_dumper_test.rb +457 -457
  227. data/test/cases/schema_loading_test.rb +52 -52
  228. data/test/cases/scoping/default_scoping_test.rb +528 -528
  229. data/test/cases/scoping/named_scoping_test.rb +561 -561
  230. data/test/cases/scoping/relation_scoping_test.rb +400 -400
  231. data/test/cases/secure_token_test.rb +32 -32
  232. data/test/cases/serialization_test.rb +104 -104
  233. data/test/cases/serialized_attribute_test.rb +364 -364
  234. data/test/cases/statement_cache_test.rb +136 -136
  235. data/test/cases/store_test.rb +195 -195
  236. data/test/cases/suppressor_test.rb +63 -63
  237. data/test/cases/tasks/database_tasks_test.rb +462 -462
  238. data/test/cases/tasks/mysql_rake_test.rb +345 -345
  239. data/test/cases/tasks/postgresql_rake_test.rb +304 -304
  240. data/test/cases/tasks/sqlite_rake_test.rb +220 -220
  241. data/test/cases/test_case.rb +131 -131
  242. data/test/cases/test_fixtures_test.rb +36 -36
  243. data/test/cases/time_precision_test.rb +103 -102
  244. data/test/cases/timestamp_test.rb +501 -501
  245. data/test/cases/touch_later_test.rb +121 -121
  246. data/test/cases/transaction_callbacks_test.rb +518 -518
  247. data/test/cases/transaction_isolation_test.rb +106 -106
  248. data/test/cases/transactions_test.rb +835 -834
  249. data/test/cases/type/adapter_specific_registry_test.rb +133 -133
  250. data/test/cases/type/date_time_test.rb +14 -14
  251. data/test/cases/type/integer_test.rb +27 -27
  252. data/test/cases/type/string_test.rb +22 -22
  253. data/test/cases/type/type_map_test.rb +177 -177
  254. data/test/cases/type_test.rb +39 -39
  255. data/test/cases/types_test.rb +24 -24
  256. data/test/cases/unconnected_test.rb +33 -33
  257. data/test/cases/validations/absence_validation_test.rb +73 -73
  258. data/test/cases/validations/association_validation_test.rb +97 -97
  259. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  260. data/test/cases/validations/i18n_validation_test.rb +86 -86
  261. data/test/cases/validations/length_validation_test.rb +79 -79
  262. data/test/cases/validations/presence_validation_test.rb +103 -103
  263. data/test/cases/validations/uniqueness_validation_test.rb +548 -548
  264. data/test/cases/validations_repair_helper.rb +19 -19
  265. data/test/cases/validations_test.rb +194 -194
  266. data/test/cases/view_test.rb +216 -216
  267. data/test/cases/yaml_serialization_test.rb +121 -121
  268. data/test/config.example.yml +97 -97
  269. data/test/config.rb +5 -5
  270. data/test/connections/native_ibm_db/connection.rb +44 -0
  271. data/test/fixtures/accounts.yml +29 -29
  272. data/test/fixtures/admin/accounts.yml +2 -2
  273. data/test/fixtures/admin/users.yml +10 -10
  274. data/test/fixtures/author_addresses.yml +17 -17
  275. data/test/fixtures/author_favorites.yml +3 -3
  276. data/test/fixtures/authors.yml +23 -23
  277. data/test/fixtures/bad_posts.yml +9 -9
  278. data/test/fixtures/binaries.yml +133 -133
  279. data/test/fixtures/books.yml +31 -31
  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 -3
  295. data/test/fixtures/content_positions.yml +3 -3
  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 -5
  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 -4
  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 -2
  333. data/test/fixtures/naked/yml/trees.yml +3 -3
  334. data/test/fixtures/nodes.yml +29 -29
  335. data/test/fixtures/organizations.yml +5 -5
  336. data/test/fixtures/other_comments.yml +6 -6
  337. data/test/fixtures/other_dogs.yml +2 -2
  338. data/test/fixtures/other_posts.yml +7 -7
  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 +12 -15
  347. data/test/fixtures/posts.yml +80 -80
  348. data/test/fixtures/price_estimates.yml +16 -16
  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 -3
  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/user.rb +40 -40
  414. data/test/models/aircraft.rb +5 -5
  415. data/test/models/arunit2_model.rb +3 -3
  416. data/test/models/author.rb +209 -209
  417. data/test/models/auto_id.rb +4 -4
  418. data/test/models/autoloadable/extra_firm.rb +2 -2
  419. data/test/models/binary.rb +2 -2
  420. data/test/models/bird.rb +12 -12
  421. data/test/models/book.rb +23 -23
  422. data/test/models/boolean.rb +2 -2
  423. data/test/models/bulb.rb +52 -52
  424. data/test/models/cake_designer.rb +3 -3
  425. data/test/models/car.rb +29 -29
  426. data/test/models/carrier.rb +2 -2
  427. data/test/models/cat.rb +10 -10
  428. data/test/models/categorization.rb +19 -19
  429. data/test/models/category.rb +35 -35
  430. data/test/models/chef.rb +8 -8
  431. data/test/models/citation.rb +3 -3
  432. data/test/models/club.rb +25 -25
  433. data/test/models/college.rb +10 -10
  434. data/test/models/column.rb +3 -3
  435. data/test/models/column_name.rb +3 -3
  436. data/test/models/comment.rb +76 -76
  437. data/test/models/company.rb +230 -230
  438. data/test/models/company_in_module.rb +98 -98
  439. data/test/models/computer.rb +3 -3
  440. data/test/models/contact.rb +41 -41
  441. data/test/models/content.rb +40 -40
  442. data/test/models/contract.rb +20 -20
  443. data/test/models/country.rb +7 -7
  444. data/test/models/course.rb +6 -6
  445. data/test/models/customer.rb +83 -83
  446. data/test/models/customer_carrier.rb +14 -14
  447. data/test/models/dashboard.rb +3 -3
  448. data/test/models/default.rb +2 -2
  449. data/test/models/department.rb +4 -4
  450. data/test/models/developer.rb +274 -274
  451. data/test/models/dog.rb +5 -5
  452. data/test/models/dog_lover.rb +5 -5
  453. data/test/models/doubloon.rb +12 -12
  454. data/test/models/drink_designer.rb +3 -3
  455. data/test/models/edge.rb +5 -5
  456. data/test/models/electron.rb +5 -5
  457. data/test/models/engine.rb +4 -4
  458. data/test/models/entrant.rb +3 -3
  459. data/test/models/essay.rb +5 -5
  460. data/test/models/event.rb +3 -3
  461. data/test/models/eye.rb +37 -37
  462. data/test/models/face.rb +9 -9
  463. data/test/models/friendship.rb +6 -6
  464. data/test/models/guid.rb +2 -2
  465. data/test/models/guitar.rb +4 -4
  466. data/test/models/hotel.rb +11 -11
  467. data/test/models/image.rb +3 -3
  468. data/test/models/interest.rb +5 -5
  469. data/test/models/invoice.rb +4 -4
  470. data/test/models/item.rb +7 -7
  471. data/test/models/job.rb +7 -7
  472. data/test/models/joke.rb +7 -7
  473. data/test/models/keyboard.rb +3 -3
  474. data/test/models/legacy_thing.rb +3 -3
  475. data/test/models/lesson.rb +11 -11
  476. data/test/models/line_item.rb +3 -3
  477. data/test/models/liquid.rb +4 -4
  478. data/test/models/man.rb +11 -11
  479. data/test/models/matey.rb +4 -4
  480. data/test/models/member.rb +42 -42
  481. data/test/models/member_detail.rb +8 -8
  482. data/test/models/member_type.rb +3 -3
  483. data/test/models/membership.rb +35 -35
  484. data/test/models/mentor.rb +2 -2
  485. data/test/models/minimalistic.rb +2 -2
  486. data/test/models/minivan.rb +9 -9
  487. data/test/models/mixed_case_monkey.rb +3 -3
  488. data/test/models/mocktail_designer.rb +2 -2
  489. data/test/models/molecule.rb +6 -6
  490. data/test/models/movie.rb +5 -5
  491. data/test/models/node.rb +5 -5
  492. data/test/models/non_primary_key.rb +2 -2
  493. data/test/models/notification.rb +3 -3
  494. data/test/models/order.rb +4 -4
  495. data/test/models/organization.rb +14 -14
  496. data/test/models/other_dog.rb +5 -5
  497. data/test/models/owner.rb +37 -37
  498. data/test/models/parrot.rb +28 -28
  499. data/test/models/person.rb +142 -142
  500. data/test/models/personal_legacy_thing.rb +4 -4
  501. data/test/models/pet.rb +18 -18
  502. data/test/models/pet_treasure.rb +6 -6
  503. data/test/models/pirate.rb +92 -92
  504. data/test/models/possession.rb +3 -3
  505. data/test/models/post.rb +273 -273
  506. data/test/models/price_estimate.rb +4 -4
  507. data/test/models/professor.rb +5 -5
  508. data/test/models/project.rb +40 -40
  509. data/test/models/publisher.rb +2 -2
  510. data/test/models/publisher/article.rb +4 -4
  511. data/test/models/publisher/magazine.rb +3 -3
  512. data/test/models/rating.rb +4 -4
  513. data/test/models/reader.rb +23 -23
  514. data/test/models/recipe.rb +3 -3
  515. data/test/models/record.rb +2 -2
  516. data/test/models/reference.rb +22 -22
  517. data/test/models/reply.rb +61 -61
  518. data/test/models/ship.rb +39 -39
  519. data/test/models/ship_part.rb +8 -8
  520. data/test/models/shop.rb +17 -17
  521. data/test/models/shop_account.rb +6 -6
  522. data/test/models/speedometer.rb +6 -6
  523. data/test/models/sponsor.rb +7 -7
  524. data/test/models/string_key_object.rb +3 -3
  525. data/test/models/student.rb +4 -4
  526. data/test/models/subject.rb +16 -16
  527. data/test/models/subscriber.rb +8 -8
  528. data/test/models/subscription.rb +4 -4
  529. data/test/models/tag.rb +13 -13
  530. data/test/models/tagging.rb +13 -13
  531. data/test/models/task.rb +5 -5
  532. data/test/models/topic.rb +118 -118
  533. data/test/models/toy.rb +6 -6
  534. data/test/models/traffic_light.rb +4 -4
  535. data/test/models/treasure.rb +14 -14
  536. data/test/models/treaty.rb +7 -7
  537. data/test/models/tree.rb +3 -3
  538. data/test/models/tuning_peg.rb +4 -4
  539. data/test/models/tyre.rb +11 -11
  540. data/test/models/user.rb +14 -14
  541. data/test/models/uuid_child.rb +3 -3
  542. data/test/models/uuid_item.rb +6 -6
  543. data/test/models/uuid_parent.rb +3 -3
  544. data/test/models/vegetables.rb +24 -24
  545. data/test/models/vehicle.rb +6 -6
  546. data/test/models/vertex.rb +9 -9
  547. data/test/models/warehouse_thing.rb +5 -5
  548. data/test/models/wheel.rb +3 -3
  549. data/test/models/without_table.rb +3 -3
  550. data/test/models/zine.rb +3 -3
  551. data/test/schema/i5/ibm_db_specific_schema.rb +137 -0
  552. data/test/schema/ids/ibm_db_specific_schema.rb +140 -0
  553. data/test/schema/luw/ibm_db_specific_schema.rb +137 -0
  554. data/test/schema/mysql2_specific_schema.rb +68 -68
  555. data/test/schema/oracle_specific_schema.rb +40 -40
  556. data/test/schema/postgresql_specific_schema.rb +114 -114
  557. data/test/schema/schema.rb +1057 -1057
  558. data/test/schema/schema.rb.original +1057 -1057
  559. data/test/schema/sqlite_specific_schema.rb +18 -18
  560. data/test/schema/zOS/ibm_db_specific_schema.rb +208 -0
  561. data/test/support/config.rb +43 -43
  562. data/test/support/connection.rb +23 -23
  563. data/test/support/connection_helper.rb +14 -14
  564. data/test/support/ddl_helper.rb +8 -8
  565. data/test/support/schema_dumping_helper.rb +20 -20
  566. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -22
  567. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -182
  568. metadata +24 -13
  569. data/test/fixtures/author_addresses.original +0 -11
  570. 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