ibm_db 3.0.5-x86-mingw32 → 5.0.5-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 (358) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES +4 -0
  3. data/LICENSE +1 -1
  4. data/ParameterizedQueries README +6 -6
  5. data/README +38 -55
  6. data/ext/Makefile +269 -0
  7. data/ext/extconf.rb +34 -3
  8. data/ext/gil_release_version +3 -0
  9. data/ext/ibm_db-i386-mingw32.def +2 -0
  10. data/ext/ibm_db.c +100 -108
  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_cli.o +0 -0
  15. data/ext/unicode_support_version +3 -0
  16. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +923 -527
  17. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +4 -1
  18. data/lib/mswin32/ibm_db.rb +7 -39
  19. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  20. data/test/active_record/connection_adapters/fake_adapter.rb +8 -5
  21. data/test/cases/adapter_test.rb +133 -58
  22. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
  23. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
  24. data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
  25. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
  26. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
  27. data/test/cases/adapters/mysql2/connection_test.rb +210 -0
  28. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
  29. data/test/cases/adapters/mysql2/enum_test.rb +26 -0
  30. data/test/cases/adapters/mysql2/explain_test.rb +21 -0
  31. data/test/cases/adapters/mysql2/json_test.rb +195 -0
  32. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
  33. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  34. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
  35. data/test/cases/adapters/mysql2/schema_test.rb +126 -0
  36. data/test/cases/adapters/mysql2/sp_test.rb +36 -0
  37. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
  38. data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
  39. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
  40. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
  41. data/test/cases/adapters/postgresql/array_test.rb +339 -0
  42. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
  43. data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
  44. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
  45. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
  46. data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
  47. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  48. data/test/cases/adapters/postgresql/collation_test.rb +53 -0
  49. data/test/cases/adapters/postgresql/composite_test.rb +132 -0
  50. data/test/cases/adapters/postgresql/connection_test.rb +257 -0
  51. data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
  52. data/test/cases/adapters/postgresql/domain_test.rb +47 -0
  53. data/test/cases/adapters/postgresql/enum_test.rb +91 -0
  54. data/test/cases/adapters/postgresql/explain_test.rb +20 -0
  55. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
  56. data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
  57. data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
  58. data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
  59. data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
  60. data/test/cases/adapters/postgresql/integer_test.rb +25 -0
  61. data/test/cases/adapters/postgresql/json_test.rb +237 -0
  62. data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
  63. data/test/cases/adapters/postgresql/money_test.rb +96 -0
  64. data/test/cases/adapters/postgresql/network_test.rb +94 -0
  65. data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
  66. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
  67. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  68. data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
  69. data/test/cases/adapters/postgresql/range_test.rb +343 -0
  70. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
  71. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
  72. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
  73. data/test/cases/adapters/postgresql/schema_test.rb +597 -0
  74. data/test/cases/adapters/postgresql/serial_test.rb +154 -0
  75. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
  76. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
  77. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
  78. data/test/cases/adapters/postgresql/utils_test.rb +62 -0
  79. data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
  80. data/test/cases/adapters/postgresql/xml_test.rb +54 -0
  81. data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
  82. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
  83. data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
  84. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
  85. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
  86. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  87. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
  88. data/test/cases/aggregations_test.rb +11 -1
  89. data/test/cases/ar_schema_test.rb +35 -50
  90. data/test/cases/associations/association_scope_test.rb +1 -6
  91. data/test/cases/associations/belongs_to_associations_test.rb +122 -10
  92. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
  93. data/test/cases/associations/callbacks_test.rb +5 -7
  94. data/test/cases/associations/cascaded_eager_loading_test.rb +1 -1
  95. data/test/cases/associations/eager_load_nested_include_test.rb +1 -3
  96. data/test/cases/associations/eager_test.rb +158 -73
  97. data/test/cases/associations/extension_test.rb +7 -2
  98. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +64 -32
  99. data/test/cases/associations/has_many_associations_test.rb +362 -43
  100. data/test/cases/associations/has_many_through_associations_test.rb +108 -41
  101. data/test/cases/associations/has_one_associations_test.rb +105 -8
  102. data/test/cases/associations/has_one_through_associations_test.rb +6 -3
  103. data/test/cases/associations/inner_join_association_test.rb +3 -3
  104. data/test/cases/associations/inverse_associations_test.rb +38 -11
  105. data/test/cases/associations/join_model_test.rb +59 -36
  106. data/test/cases/associations/left_outer_join_association_test.rb +88 -0
  107. data/test/cases/associations/nested_through_associations_test.rb +2 -2
  108. data/test/cases/associations/required_test.rb +25 -5
  109. data/test/cases/associations_test.rb +39 -34
  110. data/test/cases/attribute_decorators_test.rb +9 -8
  111. data/test/cases/attribute_methods/read_test.rb +5 -5
  112. data/test/cases/attribute_methods_test.rb +97 -40
  113. data/test/cases/attribute_set_test.rb +64 -4
  114. data/test/cases/attribute_test.rb +84 -18
  115. data/test/cases/attributes_test.rb +151 -34
  116. data/test/cases/autosave_association_test.rb +149 -36
  117. data/test/cases/base_test.rb +290 -241
  118. data/test/cases/batches_test.rb +299 -22
  119. data/test/cases/binary_test.rb +2 -10
  120. data/test/cases/bind_parameter_test.rb +76 -66
  121. data/test/cases/cache_key_test.rb +26 -0
  122. data/test/cases/calculations_test.rb +167 -15
  123. data/test/cases/callbacks_test.rb +161 -68
  124. data/test/cases/coders/json_test.rb +15 -0
  125. data/test/cases/collection_cache_key_test.rb +115 -0
  126. data/test/cases/column_definition_test.rb +26 -57
  127. data/test/cases/comment_test.rb +145 -0
  128. data/test/cases/connection_adapters/adapter_leasing_test.rb +5 -3
  129. data/test/cases/connection_adapters/connection_handler_test.rb +128 -21
  130. data/test/cases/connection_adapters/connection_specification_test.rb +1 -1
  131. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +0 -38
  132. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -1
  133. data/test/cases/connection_adapters/schema_cache_test.rb +8 -3
  134. data/test/cases/connection_adapters/type_lookup_test.rb +15 -7
  135. data/test/cases/connection_management_test.rb +46 -56
  136. data/test/cases/connection_pool_test.rb +195 -20
  137. data/test/cases/connection_specification/resolver_test.rb +15 -0
  138. data/test/cases/counter_cache_test.rb +10 -5
  139. data/test/cases/custom_locking_test.rb +1 -1
  140. data/test/cases/database_statements_test.rb +18 -3
  141. data/test/cases/{invalid_date_test.rb → date_test.rb} +13 -1
  142. data/test/cases/date_time_precision_test.rb +107 -0
  143. data/test/cases/defaults_test.rb +85 -89
  144. data/test/cases/dirty_test.rb +30 -52
  145. data/test/cases/disconnected_test.rb +4 -2
  146. data/test/cases/enum_test.rb +178 -24
  147. data/test/cases/errors_test.rb +16 -0
  148. data/test/cases/explain_test.rb +32 -21
  149. data/test/cases/finder_test.rb +273 -148
  150. data/test/cases/fixture_set/file_test.rb +18 -0
  151. data/test/cases/fixtures_test.rb +112 -32
  152. data/test/cases/forbidden_attributes_protection_test.rb +69 -3
  153. data/test/cases/helper.rb +10 -16
  154. data/test/cases/hot_compatibility_test.rb +89 -1
  155. data/test/cases/inheritance_test.rb +284 -53
  156. data/test/cases/integration_test.rb +23 -7
  157. data/test/cases/invalid_connection_test.rb +4 -2
  158. data/test/cases/invertible_migration_test.rb +124 -32
  159. data/test/cases/json_serialization_test.rb +11 -2
  160. data/test/cases/locking_test.rb +22 -6
  161. data/test/cases/log_subscriber_test.rb +106 -17
  162. data/test/cases/migration/change_schema_test.rb +60 -114
  163. data/test/cases/migration/change_table_test.rb +34 -2
  164. data/test/cases/migration/column_attributes_test.rb +7 -23
  165. data/test/cases/migration/column_positioning_test.rb +8 -8
  166. data/test/cases/migration/columns_test.rb +17 -11
  167. data/test/cases/migration/command_recorder_test.rb +47 -2
  168. data/test/cases/migration/compatibility_test.rb +118 -0
  169. data/test/cases/migration/create_join_table_test.rb +21 -12
  170. data/test/cases/migration/foreign_key_test.rb +52 -18
  171. data/test/cases/migration/index_test.rb +14 -12
  172. data/test/cases/migration/logger_test.rb +1 -1
  173. data/test/cases/migration/pending_migrations_test.rb +0 -1
  174. data/test/cases/migration/references_foreign_key_test.rb +59 -7
  175. data/test/cases/migration/references_index_test.rb +4 -4
  176. data/test/cases/migration/references_statements_test.rb +26 -6
  177. data/test/cases/migration/rename_table_test.rb +25 -25
  178. data/test/cases/migration_test.rb +279 -81
  179. data/test/cases/migrator_test.rb +91 -8
  180. data/test/cases/mixin_test.rb +0 -2
  181. data/test/cases/modules_test.rb +3 -4
  182. data/test/cases/multiparameter_attributes_test.rb +24 -2
  183. data/test/cases/multiple_db_test.rb +11 -4
  184. data/test/cases/nested_attributes_test.rb +61 -33
  185. data/test/cases/persistence_test.rb +102 -10
  186. data/test/cases/pooled_connections_test.rb +3 -3
  187. data/test/cases/primary_keys_test.rb +170 -31
  188. data/test/cases/query_cache_test.rb +216 -96
  189. data/test/cases/quoting_test.rb +65 -19
  190. data/test/cases/readonly_test.rb +2 -1
  191. data/test/cases/reflection_test.rb +68 -22
  192. data/test/cases/relation/delegation_test.rb +3 -8
  193. data/test/cases/relation/merging_test.rb +10 -14
  194. data/test/cases/relation/mutation_test.rb +42 -24
  195. data/test/cases/relation/or_test.rb +92 -0
  196. data/test/cases/relation/predicate_builder_test.rb +4 -2
  197. data/test/cases/relation/record_fetch_warning_test.rb +40 -0
  198. data/test/cases/relation/where_chain_test.rb +23 -99
  199. data/test/cases/relation/where_clause_test.rb +182 -0
  200. data/test/cases/relation/where_test.rb +45 -23
  201. data/test/cases/relation_test.rb +67 -58
  202. data/test/cases/relations_test.rb +249 -38
  203. data/test/cases/result_test.rb +10 -0
  204. data/test/cases/sanitize_test.rb +108 -15
  205. data/test/cases/schema_dumper_test.rb +119 -125
  206. data/test/cases/schema_loading_test.rb +52 -0
  207. data/test/cases/scoping/default_scoping_test.rb +113 -39
  208. data/test/cases/scoping/named_scoping_test.rb +46 -9
  209. data/test/cases/scoping/relation_scoping_test.rb +47 -4
  210. data/test/cases/secure_token_test.rb +32 -0
  211. data/test/cases/serialization_test.rb +1 -1
  212. data/test/cases/serialized_attribute_test.rb +93 -6
  213. data/test/cases/statement_cache_test.rb +38 -0
  214. data/test/cases/store_test.rb +2 -1
  215. data/test/cases/suppressor_test.rb +63 -0
  216. data/test/cases/tasks/database_tasks_test.rb +73 -9
  217. data/test/cases/tasks/mysql_rake_test.rb +139 -118
  218. data/test/cases/tasks/postgresql_rake_test.rb +60 -6
  219. data/test/cases/tasks/sqlite_rake_test.rb +30 -3
  220. data/test/cases/test_case.rb +28 -20
  221. data/test/cases/test_fixtures_test.rb +36 -0
  222. data/test/cases/time_precision_test.rb +103 -0
  223. data/test/cases/timestamp_test.rb +44 -10
  224. data/test/cases/touch_later_test.rb +121 -0
  225. data/test/cases/transaction_callbacks_test.rb +128 -62
  226. data/test/cases/transaction_isolation_test.rb +2 -2
  227. data/test/cases/transactions_test.rb +61 -43
  228. data/test/cases/type/adapter_specific_registry_test.rb +133 -0
  229. data/test/cases/type/date_time_test.rb +14 -0
  230. data/test/cases/type/integer_test.rb +2 -96
  231. data/test/cases/type/string_test.rb +0 -14
  232. data/test/cases/type_test.rb +39 -0
  233. data/test/cases/types_test.rb +1 -118
  234. data/test/cases/unconnected_test.rb +1 -1
  235. data/test/cases/validations/absence_validation_test.rb +73 -0
  236. data/test/cases/validations/association_validation_test.rb +13 -2
  237. data/test/cases/validations/i18n_validation_test.rb +6 -10
  238. data/test/cases/validations/length_validation_test.rb +62 -30
  239. data/test/cases/validations/presence_validation_test.rb +36 -1
  240. data/test/cases/validations/uniqueness_validation_test.rb +128 -37
  241. data/test/cases/validations_repair_helper.rb +2 -6
  242. data/test/cases/validations_test.rb +36 -7
  243. data/test/cases/view_test.rb +102 -5
  244. data/test/cases/yaml_serialization_test.rb +21 -26
  245. data/test/config.example.yml +97 -0
  246. data/test/fixtures/bad_posts.yml +9 -0
  247. data/test/fixtures/books.yml +20 -0
  248. data/test/fixtures/content.yml +3 -0
  249. data/test/fixtures/content_positions.yml +3 -0
  250. data/test/fixtures/dead_parrots.yml +5 -0
  251. data/test/fixtures/live_parrots.yml +4 -0
  252. data/test/fixtures/naked/yml/parrots.yml +2 -0
  253. data/test/fixtures/naked/yml/trees.yml +3 -0
  254. data/test/fixtures/nodes.yml +29 -0
  255. data/test/fixtures/other_comments.yml +6 -0
  256. data/test/fixtures/other_dogs.yml +2 -0
  257. data/test/fixtures/other_posts.yml +7 -0
  258. data/test/fixtures/price_estimates.yml +10 -1
  259. data/test/fixtures/trees.yml +3 -0
  260. data/test/migrations/10_urban/9_add_expressions.rb +1 -1
  261. data/test/migrations/decimal/1_give_me_big_numbers.rb +1 -1
  262. data/test/migrations/magic/1_currencies_have_symbols.rb +1 -1
  263. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -2
  264. data/test/migrations/missing/1_people_have_last_names.rb +2 -2
  265. data/test/migrations/missing/3_we_need_reminders.rb +2 -2
  266. data/test/migrations/missing/4_innocent_jointable.rb +2 -2
  267. data/test/migrations/rename/1_we_need_things.rb +2 -2
  268. data/test/migrations/rename/2_rename_things.rb +2 -2
  269. data/test/migrations/to_copy/1_people_have_hobbies.rb +1 -1
  270. data/test/migrations/to_copy/2_people_have_descriptions.rb +1 -1
  271. data/test/migrations/to_copy2/1_create_articles.rb +1 -1
  272. data/test/migrations/to_copy2/2_create_comments.rb +1 -1
  273. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +1 -1
  274. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +1 -1
  275. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +1 -1
  276. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +1 -1
  277. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +1 -1
  278. data/test/migrations/valid/1_valid_people_have_last_names.rb +1 -1
  279. data/test/migrations/valid/2_we_need_reminders.rb +2 -2
  280. data/test/migrations/valid/3_innocent_jointable.rb +2 -2
  281. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +1 -1
  282. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -2
  283. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +2 -2
  284. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +1 -1
  285. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +1 -1
  286. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +1 -1
  287. data/test/migrations/version_check/20131219224947_migration_version_check.rb +1 -1
  288. data/test/models/admin/randomly_named_c1.rb +6 -2
  289. data/test/models/aircraft.rb +1 -0
  290. data/test/models/author.rb +4 -7
  291. data/test/models/bird.rb +1 -1
  292. data/test/models/book.rb +5 -0
  293. data/test/models/bulb.rb +2 -1
  294. data/test/models/car.rb +3 -0
  295. data/test/models/cat.rb +10 -0
  296. data/test/models/chef.rb +1 -0
  297. data/test/models/club.rb +2 -0
  298. data/test/models/comment.rb +17 -5
  299. data/test/models/company.rb +4 -2
  300. data/test/models/company_in_module.rb +1 -1
  301. data/test/models/contact.rb +1 -1
  302. data/test/models/content.rb +40 -0
  303. data/test/models/customer.rb +8 -2
  304. data/test/models/developer.rb +19 -0
  305. data/test/models/face.rb +1 -1
  306. data/test/models/guitar.rb +4 -0
  307. data/test/models/hotel.rb +2 -0
  308. data/test/models/member.rb +1 -0
  309. data/test/models/member_detail.rb +4 -3
  310. data/test/models/mentor.rb +3 -0
  311. data/test/models/mocktail_designer.rb +2 -0
  312. data/test/models/node.rb +5 -0
  313. data/test/models/non_primary_key.rb +2 -0
  314. data/test/models/notification.rb +3 -0
  315. data/test/models/other_dog.rb +5 -0
  316. data/test/models/owner.rb +4 -1
  317. data/test/models/parrot.rb +6 -7
  318. data/test/models/person.rb +0 -1
  319. data/test/models/pet.rb +3 -0
  320. data/test/models/pet_treasure.rb +6 -0
  321. data/test/models/pirate.rb +3 -3
  322. data/test/models/post.rb +18 -9
  323. data/test/models/project.rb +9 -0
  324. data/test/models/randomly_named_c1.rb +1 -1
  325. data/test/models/recipe.rb +3 -0
  326. data/test/models/ship.rb +8 -2
  327. data/test/models/tag.rb +6 -0
  328. data/test/models/topic.rb +2 -8
  329. data/test/models/tree.rb +3 -0
  330. data/test/models/tuning_peg.rb +4 -0
  331. data/test/models/user.rb +14 -0
  332. data/test/models/uuid_item.rb +6 -0
  333. data/test/schema/mysql2_specific_schema.rb +33 -23
  334. data/test/schema/oracle_specific_schema.rb +1 -4
  335. data/test/schema/postgresql_specific_schema.rb +36 -124
  336. data/test/schema/schema.rb +170 -65
  337. data/test/schema/schema.rb.original +1057 -0
  338. data/test/schema/sqlite_specific_schema.rb +1 -5
  339. data/test/support/connection.rb +1 -0
  340. data/test/support/schema_dumping_helper.rb +1 -1
  341. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  342. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  343. metadata +146 -30
  344. data/lib/mswin32/rb19x/ibm_db.so +0 -0
  345. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  346. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  347. data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
  348. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
  349. data/test/cases/attribute_methods/serialization_test.rb +0 -29
  350. data/test/cases/migration/change_schema_test - Copy.rb +0 -448
  351. data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
  352. data/test/cases/migration/table_and_index_test.rb +0 -24
  353. data/test/cases/relation/where_test2.rb +0 -36
  354. data/test/cases/type/decimal_test.rb +0 -56
  355. data/test/cases/type/unsigned_integer_test.rb +0 -18
  356. data/test/cases/xml_serialization_test.rb +0 -457
  357. data/test/fixtures/naked/csv/accounts.csv +0 -1
  358. data/test/schema/mysql_specific_schema.rb +0 -70
@@ -6,7 +6,7 @@ require 'models/rating'
6
6
 
7
7
  module ActiveRecord
8
8
  class RelationTest < ActiveRecord::TestCase
9
- fixtures :posts, :comments, :authors, :author_addresses
9
+ fixtures :posts, :comments, :authors
10
10
 
11
11
  class FakeKlass < Struct.new(:table_name, :name)
12
12
  extend ActiveRecord::Delegation::DelegateCache
@@ -20,62 +20,67 @@ module ActiveRecord
20
20
  def self.table_name
21
21
  'fake_table'
22
22
  end
23
+
24
+ def self.sanitize_sql_for_order(sql)
25
+ sql
26
+ end
23
27
  end
24
28
 
25
29
  def test_construction
26
- relation = Relation.new FakeKlass, :b
30
+ relation = Relation.new(FakeKlass, :b, nil)
27
31
  assert_equal FakeKlass, relation.klass
28
32
  assert_equal :b, relation.table
29
33
  assert !relation.loaded, 'relation is not loaded'
30
34
  end
31
35
 
32
36
  def test_responds_to_model_and_returns_klass
33
- relation = Relation.new FakeKlass, :b
37
+ relation = Relation.new(FakeKlass, :b, nil)
34
38
  assert_equal FakeKlass, relation.model
35
39
  end
36
40
 
37
41
  def test_initialize_single_values
38
- relation = Relation.new FakeKlass, :b
42
+ relation = Relation.new(FakeKlass, :b, nil)
39
43
  (Relation::SINGLE_VALUE_METHODS - [:create_with]).each do |method|
40
44
  assert_nil relation.send("#{method}_value"), method.to_s
41
45
  end
42
- assert_equal({}, relation.create_with_value)
46
+ value = relation.create_with_value
47
+ assert_equal({}, value)
48
+ assert_predicate value, :frozen?
43
49
  end
44
50
 
45
51
  def test_multi_value_initialize
46
- relation = Relation.new FakeKlass, :b
52
+ relation = Relation.new(FakeKlass, :b, nil)
47
53
  Relation::MULTI_VALUE_METHODS.each do |method|
48
- assert_equal [], relation.send("#{method}_values"), method.to_s
54
+ values = relation.send("#{method}_values")
55
+ assert_equal [], values, method.to_s
56
+ assert_predicate values, :frozen?, method.to_s
49
57
  end
50
58
  end
51
59
 
52
60
  def test_extensions
53
- relation = Relation.new FakeKlass, :b
61
+ relation = Relation.new(FakeKlass, :b, nil)
54
62
  assert_equal [], relation.extensions
55
63
  end
56
64
 
57
65
  def test_empty_where_values_hash
58
- relation = Relation.new FakeKlass, :b
59
- assert_equal({}, relation.where_values_hash)
60
-
61
- relation.where! :hello
66
+ relation = Relation.new(FakeKlass, :b, nil)
62
67
  assert_equal({}, relation.where_values_hash)
63
68
  end
64
69
 
65
70
  def test_has_values
66
- relation = Relation.new Post, Post.arel_table
71
+ relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
67
72
  relation.where! relation.table[:id].eq(10)
68
73
  assert_equal({:id => 10}, relation.where_values_hash)
69
74
  end
70
75
 
71
76
  def test_values_wrong_table
72
- relation = Relation.new Post, Post.arel_table
77
+ relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
73
78
  relation.where! Comment.arel_table[:id].eq(10)
74
79
  assert_equal({}, relation.where_values_hash)
75
80
  end
76
81
 
77
82
  def test_tree_is_not_traversed
78
- relation = Relation.new Post, Post.arel_table
83
+ relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
79
84
  left = relation.table[:id].eq(10)
80
85
  right = relation.table[:id].eq(10)
81
86
  combine = left.and right
@@ -84,24 +89,24 @@ module ActiveRecord
84
89
  end
85
90
 
86
91
  def test_table_name_delegates_to_klass
87
- relation = Relation.new FakeKlass.new('posts'), :b
92
+ relation = Relation.new(FakeKlass.new('posts'), :b, Post.predicate_builder)
88
93
  assert_equal 'posts', relation.table_name
89
94
  end
90
95
 
91
96
  def test_scope_for_create
92
- relation = Relation.new FakeKlass, :b
97
+ relation = Relation.new(FakeKlass, :b, nil)
93
98
  assert_equal({}, relation.scope_for_create)
94
99
  end
95
100
 
96
101
  def test_create_with_value
97
- relation = Relation.new Post, Post.arel_table
102
+ relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
98
103
  hash = { :hello => 'world' }
99
104
  relation.create_with_value = hash
100
105
  assert_equal hash, relation.scope_for_create
101
106
  end
102
107
 
103
108
  def test_create_with_value_with_wheres
104
- relation = Relation.new Post, Post.arel_table
109
+ relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
105
110
  relation.where! relation.table[:id].eq(10)
106
111
  relation.create_with_value = {:hello => 'world'}
107
112
  assert_equal({:hello => 'world', :id => 10}, relation.scope_for_create)
@@ -109,7 +114,7 @@ module ActiveRecord
109
114
 
110
115
  # FIXME: is this really wanted or expected behavior?
111
116
  def test_scope_for_create_is_cached
112
- relation = Relation.new Post, Post.arel_table
117
+ relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
113
118
  assert_equal({}, relation.scope_for_create)
114
119
 
115
120
  relation.where! relation.table[:id].eq(10)
@@ -126,62 +131,72 @@ module ActiveRecord
126
131
  end
127
132
 
128
133
  def test_empty_eager_loading?
129
- relation = Relation.new FakeKlass, :b
134
+ relation = Relation.new(FakeKlass, :b, nil)
130
135
  assert !relation.eager_loading?
131
136
  end
132
137
 
133
138
  def test_eager_load_values
134
- relation = Relation.new FakeKlass, :b
139
+ relation = Relation.new(FakeKlass, :b, nil)
135
140
  relation.eager_load! :b
136
141
  assert relation.eager_loading?
137
142
  end
138
143
 
139
144
  def test_references_values
140
- relation = Relation.new FakeKlass, :b
145
+ relation = Relation.new(FakeKlass, :b, nil)
141
146
  assert_equal [], relation.references_values
142
147
  relation = relation.references(:foo).references(:omg, :lol)
143
148
  assert_equal ['foo', 'omg', 'lol'], relation.references_values
144
149
  end
145
150
 
146
151
  def test_references_values_dont_duplicate
147
- relation = Relation.new FakeKlass, :b
152
+ relation = Relation.new(FakeKlass, :b, nil)
148
153
  relation = relation.references(:foo).references(:foo)
149
154
  assert_equal ['foo'], relation.references_values
150
155
  end
151
156
 
152
157
  test 'merging a hash into a relation' do
153
- relation = Relation.new FakeKlass, :b
154
- relation = relation.merge where: :lol, readonly: true
158
+ relation = Relation.new(Post, Post.arel_table, Post.predicate_builder)
159
+ relation = relation.merge where: {name: :lol}, readonly: true
155
160
 
156
- assert_equal [:lol], relation.where_values
161
+ assert_equal({"name"=>:lol}, relation.where_clause.to_h)
157
162
  assert_equal true, relation.readonly_value
158
163
  end
159
164
 
160
165
  test 'merging an empty hash into a relation' do
161
- assert_equal [], Relation.new(FakeKlass, :b).merge({}).where_values
166
+ assert_equal Relation::WhereClause.empty, Relation.new(FakeKlass, :b, nil).merge({}).where_clause
162
167
  end
163
168
 
164
169
  test 'merging a hash with unknown keys raises' do
165
170
  assert_raises(ArgumentError) { Relation::HashMerger.new(nil, omg: 'lol') }
166
171
  end
167
172
 
173
+ test 'merging nil or false raises' do
174
+ relation = Relation.new(FakeKlass, :b, nil)
175
+
176
+ e = assert_raises(ArgumentError) do
177
+ relation = relation.merge nil
178
+ end
179
+
180
+ assert_equal 'invalid argument: nil.', e.message
181
+
182
+ e = assert_raises(ArgumentError) do
183
+ relation = relation.merge false
184
+ end
185
+
186
+ assert_equal 'invalid argument: false.', e.message
187
+ end
188
+
168
189
  test '#values returns a dup of the values' do
169
- relation = Relation.new(FakeKlass, :b).where! :foo
190
+ relation = Relation.new(Post, Post.arel_table, Post.predicate_builder).where!(name: :foo)
170
191
  values = relation.values
171
192
 
172
193
  values[:where] = nil
173
- assert_not_nil relation.where_values
194
+ assert_not_nil relation.where_clause
174
195
  end
175
196
 
176
197
  test 'relations can be created with a values hash' do
177
- relation = Relation.new(FakeKlass, :b, where: [:foo])
178
- assert_equal [:foo], relation.where_values
179
- end
180
-
181
- test 'merging a single where value' do
182
- relation = Relation.new(FakeKlass, :b)
183
- relation.merge!(where: :foo)
184
- assert_equal [:foo], relation.where_values
198
+ relation = Relation.new(FakeKlass, :b, nil, select: [:foo])
199
+ assert_equal [:foo], relation.select_values
185
200
  end
186
201
 
187
202
  test 'merging a hash interpolates conditions' do
@@ -192,13 +207,13 @@ module ActiveRecord
192
207
  end
193
208
  end
194
209
 
195
- relation = Relation.new(klass, :b)
210
+ relation = Relation.new(klass, :b, nil)
196
211
  relation.merge!(where: ['foo = ?', 'bar'])
197
- assert_equal ['foo = bar'], relation.where_values
212
+ assert_equal Relation::WhereClause.new(['foo = bar'], []), relation.where_clause
198
213
  end
199
214
 
200
215
  def test_merging_readonly_false
201
- relation = Relation.new FakeKlass, :b
216
+ relation = Relation.new(FakeKlass, :b, nil)
202
217
  readonly_false_relation = relation.readonly(false)
203
218
  # test merging in both directions
204
219
  assert_equal false, relation.merge(readonly_false_relation).readonly_value
@@ -208,13 +223,7 @@ module ActiveRecord
208
223
  def test_relation_merging_with_merged_joins_as_symbols
209
224
  special_comments_with_ratings = SpecialComment.joins(:ratings)
210
225
  posts_with_special_comments_with_ratings = Post.group("posts.id").joins(:special_comments).merge(special_comments_with_ratings)
211
- assert_equal 3, authors(:david).posts.merge(posts_with_special_comments_with_ratings).count.length
212
- end
213
-
214
- def test_conflicting_bind_values
215
- assert_nothing_raised do
216
- CommentWithConflictingDefaultScope.joins(:post_with_conflicting_default_scope).delete_all
217
- end
226
+ assert_equal({ 2=>1, 4=>3, 5=>1 }, authors(:david).posts.merge(posts_with_special_comments_with_ratings).count)
218
227
  end
219
228
 
220
229
  def test_relation_merging_with_joins_as_join_dependency_pick_proper_parent
@@ -227,6 +236,13 @@ module ActiveRecord
227
236
  assert_equal 3, relation.where(id: post.id).pluck(:id).size
228
237
  end
229
238
 
239
+ def test_merge_raises_with_invalid_argument
240
+ assert_raises ArgumentError do
241
+ relation = Relation.new(FakeKlass, :b, nil)
242
+ relation.merge(true)
243
+ end
244
+ end
245
+
230
246
  def test_respond_to_for_non_selected_element
231
247
  post = Post.select(:title).first
232
248
  assert_equal false, post.respond_to?(:body), "post should not respond_to?(:body) since invoking it raises exception"
@@ -257,14 +273,7 @@ module ActiveRecord
257
273
  join_string = "LEFT OUTER JOIN #{Rating.quoted_table_name} ON #{SpecialComment.quoted_table_name}.id = #{Rating.quoted_table_name}.comment_id"
258
274
  special_comments_with_ratings = SpecialComment.joins join_string
259
275
  posts_with_special_comments_with_ratings = Post.group("posts.id").joins(:special_comments).merge(special_comments_with_ratings)
260
- assert_equal 3, authors(:david).posts.merge(posts_with_special_comments_with_ratings).count.length
261
- end
262
-
263
- def test_merge_raises_with_invalid_argument
264
- assert_raises ArgumentError do
265
- relation = Relation.new(FakeKlass, :b)
266
- relation.merge(true)
267
- end
276
+ assert_equal({ 2=>1, 4=>3, 5=>1 }, authors(:david).posts.merge(posts_with_special_comments_with_ratings).count)
268
277
  end
269
278
 
270
279
  class EnsureRoundTripTypeCasting < ActiveRecord::Type::Value
@@ -272,12 +281,12 @@ module ActiveRecord
272
281
  :string
273
282
  end
274
283
 
275
- def type_cast_from_database(value)
284
+ def deserialize(value)
276
285
  raise value unless value == "type cast for database"
277
286
  "type cast from database"
278
287
  end
279
288
 
280
- def type_cast_for_database(value)
289
+ def serialize(value)
281
290
  raise value unless value == "value from user"
282
291
  "type cast for database"
283
292
  end
@@ -18,10 +18,17 @@ require 'models/minivan'
18
18
  require 'models/aircraft'
19
19
  require "models/possession"
20
20
  require "models/reader"
21
+ require "models/categorization"
22
+ require "models/edge"
21
23
 
22
24
  class RelationTest < ActiveRecord::TestCase
23
25
  fixtures :authors, :topics, :entrants, :developers, :companies, :developers_projects, :accounts, :categories, :categorizations, :posts, :comments,
24
- :tags, :taggings, :cars, :minivans, :author_addresses
26
+ :tags, :taggings, :cars, :minivans
27
+
28
+ class TopicWithCallbacks < ActiveRecord::Base
29
+ self.table_name = :topics
30
+ before_update { |topic| topic.author_name = 'David' if topic.author_name.blank? }
31
+ end
25
32
 
26
33
  def test_do_not_double_quote_string_id
27
34
  van = Minivan.last
@@ -35,15 +42,6 @@ class RelationTest < ActiveRecord::TestCase
35
42
  assert_equal van, Minivan.where(:minivan_id => [van]).to_a.first
36
43
  end
37
44
 
38
- def test_bind_values
39
- relation = Post.all
40
- assert_equal [], relation.bind_values
41
-
42
- relation2 = relation.bind 'foo'
43
- assert_equal %w{ foo }, relation2.bind_values
44
- assert_equal [], relation.bind_values
45
- end
46
-
47
45
  def test_two_scopes_with_includes_should_not_drop_any_include
48
46
  # heat habtm cache
49
47
  car = Car.incl_engines.incl_tyres.first
@@ -114,15 +112,38 @@ class RelationTest < ActiveRecord::TestCase
114
112
 
115
113
  def test_loaded_first
116
114
  topics = Topic.all.order('id ASC')
115
+ topics.to_a # force load
117
116
 
118
- assert_queries(1) do
119
- topics.to_a # force load
120
- 2.times { assert_equal "The First Topic", topics.first.title }
117
+ assert_no_queries do
118
+ assert_equal "The First Topic", topics.first.title
121
119
  end
122
120
 
123
121
  assert topics.loaded?
124
122
  end
125
123
 
124
+ def test_loaded_first_with_limit
125
+ topics = Topic.all.order('id ASC')
126
+ topics.to_a # force load
127
+
128
+ assert_no_queries do
129
+ assert_equal ["The First Topic",
130
+ "The Second Topic of the day"], topics.first(2).map(&:title)
131
+ end
132
+
133
+ assert topics.loaded?
134
+ end
135
+
136
+ def test_first_get_more_than_available
137
+ topics = Topic.all.order('id ASC')
138
+ unloaded_first = topics.first(10)
139
+ topics.to_a # force load
140
+
141
+ assert_no_queries do
142
+ loaded_first = topics.first(10)
143
+ assert_equal unloaded_first, loaded_first
144
+ end
145
+ end
146
+
126
147
  def test_reload
127
148
  topics = Topic.all
128
149
 
@@ -203,6 +224,48 @@ class RelationTest < ActiveRecord::TestCase
203
224
  assert_equal topics(:fifth).title, topics.first.title
204
225
  end
205
226
 
227
+ def test_reverse_order_with_function
228
+ topics = Topic.order("length(title)").reverse_order
229
+ assert_equal topics(:second).title, topics.first.title
230
+ end
231
+
232
+ def test_reverse_order_with_function_other_predicates
233
+ topics = Topic.order("author_name, length(title), id").reverse_order
234
+ assert_equal topics(:second).title, topics.first.title
235
+ topics = Topic.order("length(author_name), id, length(title)").reverse_order
236
+ assert_equal topics(:fifth).title, topics.first.title
237
+ end
238
+
239
+ def test_reverse_order_with_multiargument_function
240
+ assert_raises(ActiveRecord::IrreversibleOrderError) do
241
+ Topic.order("concat(author_name, title)").reverse_order
242
+ end
243
+ assert_raises(ActiveRecord::IrreversibleOrderError) do
244
+ Topic.order("concat(lower(author_name), title)").reverse_order
245
+ end
246
+ assert_raises(ActiveRecord::IrreversibleOrderError) do
247
+ Topic.order("concat(author_name, lower(title))").reverse_order
248
+ end
249
+ assert_raises(ActiveRecord::IrreversibleOrderError) do
250
+ Topic.order("concat(lower(author_name), title, length(title)").reverse_order
251
+ end
252
+ end
253
+
254
+ def test_reverse_order_with_nulls_first_or_last
255
+ assert_raises(ActiveRecord::IrreversibleOrderError) do
256
+ Topic.order("title NULLS FIRST").reverse_order
257
+ end
258
+ assert_raises(ActiveRecord::IrreversibleOrderError) do
259
+ Topic.order("title nulls last").reverse_order
260
+ end
261
+ end
262
+
263
+ def test_default_reverse_order_on_table_without_primary_key
264
+ assert_raises(ActiveRecord::IrreversibleOrderError) do
265
+ Edge.all.reverse_order
266
+ end
267
+ end
268
+
206
269
  def test_order_with_hash_and_symbol_generates_the_same_sql
207
270
  assert_equal Topic.order(:id).to_sql, Topic.order(:id => :asc).to_sql
208
271
  end
@@ -261,7 +324,7 @@ class RelationTest < ActiveRecord::TestCase
261
324
 
262
325
  def test_finding_with_reorder
263
326
  topics = Topic.order('author_name').order('title').reorder('id').to_a
264
- topics_titles = topics.map{ |t| t.title }
327
+ topics_titles = topics.map(&:title)
265
328
  assert_equal ['The First Topic', 'The Second Topic of the day', 'The Third Topic of the day', 'The Fourth Topic of the day', 'The Fifth Topic of the day'], topics_titles
266
329
  end
267
330
 
@@ -301,6 +364,17 @@ class RelationTest < ActiveRecord::TestCase
301
364
  assert_equal 3, tags.length
302
365
  end
303
366
 
367
+ def test_finding_with_sanitized_order
368
+ query = Tag.order(["field(id, ?)", [1,3,2]]).to_sql
369
+ assert_match(/field\(id, 1,3,2\)/, query)
370
+
371
+ query = Tag.order(["field(id, ?)", []]).to_sql
372
+ assert_match(/field\(id, NULL\)/, query)
373
+
374
+ query = Tag.order(["field(id, ?)", nil]).to_sql
375
+ assert_match(/field\(id, NULL\)/, query)
376
+ end
377
+
304
378
  def test_finding_with_order_limit_and_offset
305
379
  entrants = Entrant.order("id ASC").limit(2).offset(1)
306
380
 
@@ -357,7 +431,9 @@ class RelationTest < ActiveRecord::TestCase
357
431
  assert_equal 0, Developer.none.size
358
432
  assert_equal 0, Developer.none.count
359
433
  assert_equal true, Developer.none.empty?
434
+ assert_equal true, Developer.none.none?
360
435
  assert_equal false, Developer.none.any?
436
+ assert_equal false, Developer.none.one?
361
437
  assert_equal false, Developer.none.many?
362
438
  end
363
439
  end
@@ -365,7 +441,7 @@ class RelationTest < ActiveRecord::TestCase
365
441
  def test_null_relation_calculations_methods
366
442
  assert_no_queries(ignore_none: false) do
367
443
  assert_equal 0, Developer.none.count
368
- assert_equal 0, Developer.none.calculate(:count, nil, {})
444
+ assert_equal 0, Developer.none.calculate(:count, nil)
369
445
  assert_equal nil, Developer.none.calculate(:average, 'salary')
370
446
  end
371
447
  end
@@ -453,7 +529,7 @@ class RelationTest < ActiveRecord::TestCase
453
529
  where('project_id=1').to_a
454
530
 
455
531
  assert_equal 3, developers_on_project_one.length
456
- developer_names = developers_on_project_one.map { |d| d.name }
532
+ developer_names = developers_on_project_one.map(&:name)
457
533
  assert developer_names.include?('David')
458
534
  assert developer_names.include?('Jamis')
459
535
  end
@@ -709,8 +785,8 @@ class RelationTest < ActiveRecord::TestCase
709
785
  expected_taggings = taggings(:welcome_general, :thinking_general)
710
786
 
711
787
  assert_no_queries do
712
- assert_equal expected_taggings, author.taggings.distinct.sort_by { |t| t.id }
713
- assert_equal expected_taggings, author.taggings.uniq.sort_by { |t| t.id }
788
+ assert_equal expected_taggings, author.taggings.distinct.sort_by(&:id)
789
+ assert_equal expected_taggings, author.taggings.uniq.sort_by(&:id)
714
790
  end
715
791
 
716
792
  authors = Author.all
@@ -769,7 +845,9 @@ class RelationTest < ActiveRecord::TestCase
769
845
 
770
846
  def test_find_by_classname
771
847
  Author.create!(:name => Mary.name)
772
- assert_equal 1, Author.where(:name => Mary).size
848
+ assert_deprecated do
849
+ assert_equal 1, Author.where(:name => Mary).size
850
+ end
773
851
  end
774
852
 
775
853
  def test_find_by_id_with_list_of_ar
@@ -913,6 +991,12 @@ class RelationTest < ActiveRecord::TestCase
913
991
  assert authors.exists?(authors(:david).id)
914
992
  end
915
993
 
994
+ def test_any_with_scope_on_hash_includes
995
+ post = authors(:david).posts.first
996
+ categories = Categorization.includes(author: :posts).where(posts: { id: post.id })
997
+ assert categories.exists?
998
+ end
999
+
916
1000
  def test_last
917
1001
  authors = Author.all
918
1002
  assert_equal authors(:bob), authors.last
@@ -931,6 +1015,12 @@ class RelationTest < ActiveRecord::TestCase
931
1015
  assert davids.loaded?
932
1016
  end
933
1017
 
1018
+ def test_destroy_all_with_conditions_is_deprecated
1019
+ assert_deprecated do
1020
+ assert_difference('Author.count', -1) { Author.destroy_all(name: 'David') }
1021
+ end
1022
+ end
1023
+
934
1024
  def test_delete_all
935
1025
  davids = Author.where(:name => 'David')
936
1026
 
@@ -938,6 +1028,12 @@ class RelationTest < ActiveRecord::TestCase
938
1028
  assert ! davids.loaded?
939
1029
  end
940
1030
 
1031
+ def test_delete_all_with_conditions_is_deprecated
1032
+ assert_deprecated do
1033
+ assert_difference('Author.count', -1) { Author.delete_all(name: 'David') }
1034
+ end
1035
+ end
1036
+
941
1037
  def test_delete_all_loaded
942
1038
  davids = Author.where(:name => 'David')
943
1039
 
@@ -953,7 +1049,7 @@ class RelationTest < ActiveRecord::TestCase
953
1049
 
954
1050
  def test_delete_all_with_unpermitted_relation_raises_error
955
1051
  assert_raises(ActiveRecord::ActiveRecordError) { Author.limit(10).delete_all }
956
- assert_raises(ActiveRecord::ActiveRecordError) { Author.uniq.delete_all }
1052
+ assert_raises(ActiveRecord::ActiveRecordError) { Author.distinct.delete_all }
957
1053
  assert_raises(ActiveRecord::ActiveRecordError) { Author.group(:name).delete_all }
958
1054
  assert_raises(ActiveRecord::ActiveRecordError) { Author.having('SUM(id) < 3').delete_all }
959
1055
  assert_raises(ActiveRecord::ActiveRecordError) { Author.offset(10).delete_all }
@@ -1160,6 +1256,48 @@ class RelationTest < ActiveRecord::TestCase
1160
1256
  assert ! posts.limit(1).many?
1161
1257
  end
1162
1258
 
1259
+ def test_none?
1260
+ posts = Post.all
1261
+ assert_queries(1) do
1262
+ assert ! posts.none? # Uses COUNT()
1263
+ end
1264
+
1265
+ assert ! posts.loaded?
1266
+
1267
+ assert_queries(1) do
1268
+ assert posts.none? {|p| p.id < 0 }
1269
+ assert ! posts.none? {|p| p.id == 1 }
1270
+ end
1271
+
1272
+ assert posts.loaded?
1273
+ end
1274
+
1275
+ def test_one
1276
+ posts = Post.all
1277
+ assert_queries(1) do
1278
+ assert ! posts.one? # Uses COUNT()
1279
+ end
1280
+
1281
+ assert ! posts.loaded?
1282
+
1283
+ assert_queries(1) do
1284
+ assert ! posts.one? {|p| p.id < 3 }
1285
+ assert posts.one? {|p| p.id == 1 }
1286
+ end
1287
+
1288
+ assert posts.loaded?
1289
+ end
1290
+
1291
+ def test_to_a_should_dup_target
1292
+ posts = Post.all
1293
+
1294
+ original_size = posts.size
1295
+ removed = posts.to_a.pop
1296
+
1297
+ assert_equal original_size, posts.size
1298
+ assert_includes posts.to_a, removed
1299
+ end
1300
+
1163
1301
  def test_build
1164
1302
  posts = Post.all
1165
1303
 
@@ -1438,12 +1576,6 @@ class RelationTest < ActiveRecord::TestCase
1438
1576
  assert_equal "id", Post.all.primary_key
1439
1577
  end
1440
1578
 
1441
- def test_disable_implicit_join_references_is_deprecated
1442
- assert_deprecated do
1443
- ActiveRecord::Base.disable_implicit_join_references = true
1444
- end
1445
- end
1446
-
1447
1579
  def test_ordering_with_extra_spaces
1448
1580
  assert_equal authors(:david), Author.order('id DESC , name DESC').last
1449
1581
  end
@@ -1472,8 +1604,6 @@ class RelationTest < ActiveRecord::TestCase
1472
1604
  assert_equal posts(:welcome), comments(:more_greetings).post
1473
1605
  end
1474
1606
 
1475
- unless current_adapter?(:IBM_DBAdapter)
1476
- #IBM_DB does not support offset on subselect of the update statement
1477
1607
  def test_update_all_with_joins_and_offset
1478
1608
  all_comments = Comment.joins(:post).where('posts.id' => posts(:welcome).id)
1479
1609
  count = all_comments.count
@@ -1491,7 +1621,26 @@ unless current_adapter?(:IBM_DBAdapter)
1491
1621
  assert_equal posts(:thinking), comments(:more_greetings).post
1492
1622
  assert_equal posts(:welcome), comments(:greetings).post
1493
1623
  end
1494
- end
1624
+
1625
+ def test_update_on_relation
1626
+ topic1 = TopicWithCallbacks.create! title: 'arel', author_name: nil
1627
+ topic2 = TopicWithCallbacks.create! title: 'activerecord', author_name: nil
1628
+ topics = TopicWithCallbacks.where(id: [topic1.id, topic2.id])
1629
+ topics.update(title: 'adequaterecord')
1630
+
1631
+ assert_equal 'adequaterecord', topic1.reload.title
1632
+ assert_equal 'adequaterecord', topic2.reload.title
1633
+ # Testing that the before_update callbacks have run
1634
+ assert_equal 'David', topic1.reload.author_name
1635
+ assert_equal 'David', topic2.reload.author_name
1636
+ end
1637
+
1638
+ def test_update_on_relation_passing_active_record_object_is_deprecated
1639
+ topic = Topic.create!(title: 'Foo', author_name: nil)
1640
+ assert_deprecated(/update/) do
1641
+ Topic.where(id: topic.id).update(topic, title: 'Bar')
1642
+ end
1643
+ end
1495
1644
 
1496
1645
  def test_distinct
1497
1646
  tag1 = Tag.create(:name => 'Foo')
@@ -1502,22 +1651,42 @@ end
1502
1651
  assert_equal ['Foo', 'Foo'], query.map(&:name)
1503
1652
  assert_sql(/DISTINCT/) do
1504
1653
  assert_equal ['Foo'], query.distinct.map(&:name)
1505
- assert_equal ['Foo'], query.uniq.map(&:name)
1654
+ assert_deprecated { assert_equal ['Foo'], query.uniq.map(&:name) }
1506
1655
  end
1507
1656
  assert_sql(/DISTINCT/) do
1508
1657
  assert_equal ['Foo'], query.distinct(true).map(&:name)
1509
- assert_equal ['Foo'], query.uniq(true).map(&:name)
1658
+ assert_deprecated { assert_equal ['Foo'], query.uniq(true).map(&:name) }
1510
1659
  end
1511
1660
  assert_equal ['Foo', 'Foo'], query.distinct(true).distinct(false).map(&:name)
1512
- assert_equal ['Foo', 'Foo'], query.uniq(true).uniq(false).map(&:name)
1661
+
1662
+ assert_deprecated do
1663
+ assert_equal ['Foo', 'Foo'], query.uniq(true).uniq(false).map(&:name)
1664
+ end
1513
1665
  end
1514
1666
 
1515
1667
  def test_doesnt_add_having_values_if_options_are_blank
1516
1668
  scope = Post.having('')
1517
- assert_equal [], scope.having_values
1669
+ assert scope.having_clause.empty?
1518
1670
 
1519
1671
  scope = Post.having([])
1520
- assert_equal [], scope.having_values
1672
+ assert scope.having_clause.empty?
1673
+ end
1674
+
1675
+ def test_having_with_binds_for_both_where_and_having
1676
+ post = Post.first
1677
+ having_then_where = Post.having(id: post.id).where(title: post.title).group(:id)
1678
+ where_then_having = Post.where(title: post.title).having(id: post.id).group(:id)
1679
+
1680
+ assert_equal [post], having_then_where
1681
+ assert_equal [post], where_then_having
1682
+ end
1683
+
1684
+ def test_multiple_where_and_having_clauses
1685
+ post = Post.first
1686
+ having_then_where = Post.having(id: post.id).where(title: post.title)
1687
+ .having(id: post.id).where(title: post.title).group(:id)
1688
+
1689
+ assert_equal [post], having_then_where
1521
1690
  end
1522
1691
 
1523
1692
  def test_grouping_by_column_with_reserved_name
@@ -1649,6 +1818,10 @@ end
1649
1818
  assert_sql(/^((?!ORDER).)*$/) { Post.all.find_by(author_id: 2) }
1650
1819
  end
1651
1820
 
1821
+ test "find_by requires at least one argument" do
1822
+ assert_raises(ArgumentError) { Post.all.find_by }
1823
+ end
1824
+
1652
1825
  test "find_by! with hash conditions returns the first matching record" do
1653
1826
  assert_equal posts(:eager_other), Post.order(:id).find_by!(author_id: 2)
1654
1827
  end
@@ -1671,6 +1844,10 @@ end
1671
1844
  end
1672
1845
  end
1673
1846
 
1847
+ test "find_by! requires at least one argument" do
1848
+ assert_raises(ArgumentError) { Post.all.find_by! }
1849
+ end
1850
+
1674
1851
  test "loaded relations cannot be mutated by multi value methods" do
1675
1852
  relation = Post.all
1676
1853
  relation.to_a
@@ -1707,6 +1884,14 @@ end
1707
1884
  end
1708
1885
  end
1709
1886
 
1887
+ test "relations with cached arel can't be mutated [internal API]" do
1888
+ relation = Post.all
1889
+ relation.count
1890
+
1891
+ assert_raises(ActiveRecord::ImmutableRelation) { relation.limit!(5) }
1892
+ assert_raises(ActiveRecord::ImmutableRelation) { relation.where!("1 = 2") }
1893
+ end
1894
+
1710
1895
  test "relations show the records in #inspect" do
1711
1896
  relation = Post.limit(2)
1712
1897
  assert_equal "#<ActiveRecord::Relation [#{Post.limit(2).map(&:inspect).join(', ')}]>", relation.inspect
@@ -1731,7 +1916,9 @@ end
1731
1916
  test 'using a custom table affects the wheres' do
1732
1917
  table_alias = Post.arel_table.alias('omg_posts')
1733
1918
 
1734
- relation = ActiveRecord::Relation.new Post, table_alias
1919
+ table_metadata = ActiveRecord::TableMetadata.new(Post, table_alias)
1920
+ predicate_builder = ActiveRecord::PredicateBuilder.new(table_metadata)
1921
+ relation = ActiveRecord::Relation.new(Post, table_alias, predicate_builder)
1735
1922
  relation.where!(:foo => "bar")
1736
1923
 
1737
1924
  node = relation.arel.constraints.first.grep(Arel::Attributes::Attribute).first
@@ -1790,14 +1977,13 @@ end
1790
1977
  end
1791
1978
 
1792
1979
  def test_merging_keeps_lhs_bind_parameters
1793
- column = Post.columns_hash['id']
1794
- binds = [[column, 20]]
1980
+ binds = [ActiveRecord::Relation::QueryAttribute.new("id", 20, Post.type_for_attribute("id"))]
1795
1981
 
1796
1982
  right = Post.where(id: 20)
1797
1983
  left = Post.where(id: 10)
1798
1984
 
1799
1985
  merged = left.merge(right)
1800
- assert_equal binds, merged.bind_values
1986
+ assert_equal binds, merged.bound_attributes
1801
1987
  end
1802
1988
 
1803
1989
  def test_merging_reorders_bind_params
@@ -1812,4 +1998,29 @@ end
1812
1998
  def test_relation_join_method
1813
1999
  assert_equal 'Thank you for the welcome,Thank you again for the welcome', Post.first.comments.join(",")
1814
2000
  end
2001
+
2002
+ def test_connection_adapters_can_reorder_binds
2003
+ posts = Post.limit(1).offset(2)
2004
+
2005
+ stubbed_connection = Post.connection.dup
2006
+ def stubbed_connection.combine_bind_parameters(**kwargs)
2007
+ offset = kwargs[:offset]
2008
+ kwargs[:offset] = kwargs[:limit]
2009
+ kwargs[:limit] = offset
2010
+ super(**kwargs)
2011
+ end
2012
+
2013
+ posts.define_singleton_method(:connection) do
2014
+ stubbed_connection
2015
+ end
2016
+
2017
+ assert_equal 2, posts.to_a.length
2018
+ end
2019
+
2020
+ def test_update_all_can_receive_active_record_objects
2021
+ assert_deprecated do
2022
+ Comment.update_all(post_id: Post.first)
2023
+ assert(Comment.all.all? { |c| c.post_id == Post.first.id })
2024
+ end
2025
+ end
1815
2026
  end