ibm_db 4.0.0-x86-mingw32 → 5.1.0-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (576) hide show
  1. checksums.yaml +5 -5
  2. data/MANIFEST +14 -14
  3. data/README +208 -208
  4. data/ext/Makefile +269 -0
  5. data/ext/Makefile.nt32 +181 -181
  6. data/ext/Makefile.nt32.191 +212 -212
  7. data/ext/extconf.rb +322 -291
  8. data/ext/gil_release_version.h +3 -0
  9. data/ext/ibm_db-i386-mingw32.def +2 -0
  10. data/ext/ibm_db.c +11879 -11887
  11. data/ext/ibm_db.o +0 -0
  12. data/ext/ibm_db.so +0 -0
  13. data/ext/mkmf.log +110 -0
  14. data/ext/ruby_ibm_db.h +241 -241
  15. data/ext/ruby_ibm_db_cli.c +866 -866
  16. data/ext/ruby_ibm_db_cli.h +500 -500
  17. data/ext/ruby_ibm_db_cli.o +0 -0
  18. data/ext/unicode_support_version.h +3 -0
  19. data/init.rb +41 -41
  20. data/lib/IBM_DB.rb +27 -27
  21. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3593 -3452
  22. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -5
  23. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  24. data/lib/mswin32/ibm_db.rb +94 -90
  25. data/lib/mswin32/rb2x/i386/ruby26/ibm_db.so +0 -0
  26. data/lib/mswin32/rb2x/i386/ruby27/ibm_db.so +0 -0
  27. data/test/active_record/connection_adapters/fake_adapter.rb +49 -49
  28. data/test/assets/example.log +1 -1
  29. data/test/assets/test.txt +1 -1
  30. data/test/cases/adapter_test.rb +351 -351
  31. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -193
  32. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -50
  33. data/test/cases/adapters/mysql2/boolean_test.rb +100 -100
  34. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -63
  35. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -54
  36. data/test/cases/adapters/mysql2/connection_test.rb +210 -210
  37. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -45
  38. data/test/cases/adapters/mysql2/enum_test.rb +26 -26
  39. data/test/cases/adapters/mysql2/explain_test.rb +21 -21
  40. data/test/cases/adapters/mysql2/json_test.rb +195 -195
  41. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -83
  42. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -152
  43. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -59
  44. data/test/cases/adapters/mysql2/schema_test.rb +126 -126
  45. data/test/cases/adapters/mysql2/sp_test.rb +36 -36
  46. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -14
  47. data/test/cases/adapters/mysql2/table_options_test.rb +42 -42
  48. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -66
  49. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -98
  50. data/test/cases/adapters/postgresql/array_test.rb +339 -339
  51. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -82
  52. data/test/cases/adapters/postgresql/bytea_test.rb +134 -134
  53. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -26
  54. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -38
  55. data/test/cases/adapters/postgresql/cidr_test.rb +25 -25
  56. data/test/cases/adapters/postgresql/citext_test.rb +78 -78
  57. data/test/cases/adapters/postgresql/collation_test.rb +53 -53
  58. data/test/cases/adapters/postgresql/composite_test.rb +132 -132
  59. data/test/cases/adapters/postgresql/connection_test.rb +257 -257
  60. data/test/cases/adapters/postgresql/datatype_test.rb +92 -92
  61. data/test/cases/adapters/postgresql/domain_test.rb +47 -47
  62. data/test/cases/adapters/postgresql/enum_test.rb +91 -91
  63. data/test/cases/adapters/postgresql/explain_test.rb +20 -20
  64. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -63
  65. data/test/cases/adapters/postgresql/full_text_test.rb +44 -44
  66. data/test/cases/adapters/postgresql/geometric_test.rb +378 -378
  67. data/test/cases/adapters/postgresql/hstore_test.rb +382 -382
  68. data/test/cases/adapters/postgresql/infinity_test.rb +69 -69
  69. data/test/cases/adapters/postgresql/integer_test.rb +25 -25
  70. data/test/cases/adapters/postgresql/json_test.rb +237 -237
  71. data/test/cases/adapters/postgresql/ltree_test.rb +53 -53
  72. data/test/cases/adapters/postgresql/money_test.rb +96 -96
  73. data/test/cases/adapters/postgresql/network_test.rb +94 -94
  74. data/test/cases/adapters/postgresql/numbers_test.rb +49 -49
  75. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -405
  76. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -22
  77. data/test/cases/adapters/postgresql/quoting_test.rb +44 -44
  78. data/test/cases/adapters/postgresql/range_test.rb +343 -343
  79. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -111
  80. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -34
  81. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -119
  82. data/test/cases/adapters/postgresql/schema_test.rb +597 -597
  83. data/test/cases/adapters/postgresql/serial_test.rb +154 -154
  84. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -41
  85. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -90
  86. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -33
  87. data/test/cases/adapters/postgresql/utils_test.rb +62 -62
  88. data/test/cases/adapters/postgresql/uuid_test.rb +294 -294
  89. data/test/cases/adapters/postgresql/xml_test.rb +54 -54
  90. data/test/cases/adapters/sqlite3/collation_test.rb +53 -53
  91. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -98
  92. data/test/cases/adapters/sqlite3/explain_test.rb +21 -21
  93. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -101
  94. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -441
  95. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -24
  96. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -20
  97. data/test/cases/aggregations_test.rb +168 -168
  98. data/test/cases/ar_schema_test.rb +146 -146
  99. data/test/cases/associations/association_scope_test.rb +16 -16
  100. data/test/cases/associations/belongs_to_associations_test.rb +1141 -1141
  101. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -41
  102. data/test/cases/associations/callbacks_test.rb +190 -190
  103. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  104. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  105. data/test/cases/associations/eager_load_nested_include_test.rb +126 -126
  106. data/test/cases/associations/eager_singularization_test.rb +148 -148
  107. data/test/cases/associations/eager_test.rb +1514 -1514
  108. data/test/cases/associations/extension_test.rb +87 -87
  109. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -1004
  110. data/test/cases/associations/has_many_associations_test.rb +2501 -2501
  111. data/test/cases/associations/has_many_through_associations_test.rb +1271 -1271
  112. data/test/cases/associations/has_one_associations_test.rb +707 -707
  113. data/test/cases/associations/has_one_through_associations_test.rb +383 -383
  114. data/test/cases/associations/inner_join_association_test.rb +139 -139
  115. data/test/cases/associations/inverse_associations_test.rb +733 -733
  116. data/test/cases/associations/join_model_test.rb +777 -777
  117. data/test/cases/associations/left_outer_join_association_test.rb +88 -88
  118. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  119. data/test/cases/associations/required_test.rb +102 -102
  120. data/test/cases/associations_test.rb +385 -385
  121. data/test/cases/attribute_decorators_test.rb +126 -125
  122. data/test/cases/attribute_methods/read_test.rb +60 -60
  123. data/test/cases/attribute_methods_test.rb +1009 -1009
  124. data/test/cases/attribute_set_test.rb +270 -270
  125. data/test/cases/attribute_test.rb +246 -246
  126. data/test/cases/attributes_test.rb +253 -253
  127. data/test/cases/autosave_association_test.rb +1708 -1708
  128. data/test/cases/base_test.rb +1713 -1713
  129. data/test/cases/batches_test.rb +489 -489
  130. data/test/cases/binary_test.rb +44 -44
  131. data/test/cases/bind_parameter_test.rb +110 -110
  132. data/test/cases/cache_key_test.rb +26 -25
  133. data/test/cases/calculations_test.rb +798 -798
  134. data/test/cases/callbacks_test.rb +636 -636
  135. data/test/cases/clone_test.rb +40 -40
  136. data/test/cases/coders/json_test.rb +15 -15
  137. data/test/cases/coders/yaml_column_test.rb +63 -63
  138. data/test/cases/collection_cache_key_test.rb +115 -115
  139. data/test/cases/column_alias_test.rb +17 -17
  140. data/test/cases/column_definition_test.rb +92 -92
  141. data/test/cases/comment_test.rb +145 -143
  142. data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -56
  143. data/test/cases/connection_adapters/connection_handler_test.rb +160 -160
  144. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  145. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -255
  146. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -69
  147. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  148. data/test/cases/connection_adapters/schema_cache_test.rb +61 -61
  149. data/test/cases/connection_adapters/type_lookup_test.rb +118 -118
  150. data/test/cases/connection_management_test.rb +112 -112
  151. data/test/cases/connection_pool_test.rb +521 -521
  152. data/test/cases/connection_specification/resolver_test.rb +131 -131
  153. data/test/cases/core_test.rb +112 -112
  154. data/test/cases/counter_cache_test.rb +214 -214
  155. data/test/cases/custom_locking_test.rb +17 -17
  156. data/test/cases/database_statements_test.rb +34 -34
  157. data/test/cases/date_test.rb +44 -44
  158. data/test/cases/date_time_precision_test.rb +107 -106
  159. data/test/cases/date_time_test.rb +61 -61
  160. data/test/cases/defaults_test.rb +219 -218
  161. data/test/cases/dirty_test.rb +763 -763
  162. data/test/cases/disconnected_test.rb +30 -30
  163. data/test/cases/dup_test.rb +157 -157
  164. data/test/cases/enum_test.rb +444 -444
  165. data/test/cases/errors_test.rb +16 -16
  166. data/test/cases/explain_subscriber_test.rb +64 -64
  167. data/test/cases/explain_test.rb +87 -87
  168. data/test/cases/finder_respond_to_test.rb +60 -60
  169. data/test/cases/finder_test.rb +1294 -1294
  170. data/test/cases/fixture_set/file_test.rb +156 -156
  171. data/test/cases/fixtures_test.rb +988 -988
  172. data/test/cases/forbidden_attributes_protection_test.rb +165 -165
  173. data/test/cases/habtm_destroy_order_test.rb +61 -61
  174. data/test/cases/helper.rb +204 -204
  175. data/test/cases/hot_compatibility_test.rb +142 -142
  176. data/test/cases/i18n_test.rb +45 -45
  177. data/test/cases/inheritance_test.rb +606 -606
  178. data/test/cases/integration_test.rb +155 -155
  179. data/test/cases/invalid_connection_test.rb +24 -24
  180. data/test/cases/invertible_migration_test.rb +387 -387
  181. data/test/cases/json_serialization_test.rb +311 -311
  182. data/test/cases/locking_test.rb +493 -493
  183. data/test/cases/log_subscriber_test.rb +225 -225
  184. data/test/cases/migration/change_schema_test.rb +458 -458
  185. data/test/cases/migration/change_table_test.rb +256 -256
  186. data/test/cases/migration/column_attributes_test.rb +176 -176
  187. data/test/cases/migration/column_positioning_test.rb +56 -56
  188. data/test/cases/migration/columns_test.rb +310 -310
  189. data/test/cases/migration/command_recorder_test.rb +350 -350
  190. data/test/cases/migration/compatibility_test.rb +118 -118
  191. data/test/cases/migration/create_join_table_test.rb +157 -157
  192. data/test/cases/migration/foreign_key_test.rb +362 -360
  193. data/test/cases/migration/helper.rb +39 -39
  194. data/test/cases/migration/index_test.rb +218 -218
  195. data/test/cases/migration/logger_test.rb +36 -36
  196. data/test/cases/migration/pending_migrations_test.rb +52 -52
  197. data/test/cases/migration/references_foreign_key_test.rb +221 -216
  198. data/test/cases/migration/references_index_test.rb +101 -101
  199. data/test/cases/migration/references_statements_test.rb +136 -136
  200. data/test/cases/migration/rename_table_test.rb +93 -93
  201. data/test/cases/migration_test.rb +1157 -1157
  202. data/test/cases/migrator_test.rb +471 -470
  203. data/test/cases/mixin_test.rb +68 -68
  204. data/test/cases/modules_test.rb +172 -172
  205. data/test/cases/multiparameter_attributes_test.rb +372 -372
  206. data/test/cases/multiple_db_test.rb +122 -122
  207. data/test/cases/nested_attributes_test.rb +1098 -1098
  208. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  209. data/test/cases/persistence_test.rb +1001 -1001
  210. data/test/cases/pooled_connections_test.rb +81 -81
  211. data/test/cases/primary_keys_test.rb +376 -376
  212. data/test/cases/query_cache_test.rb +446 -446
  213. data/test/cases/quoting_test.rb +202 -202
  214. data/test/cases/readonly_test.rb +119 -119
  215. data/test/cases/reaper_test.rb +85 -85
  216. data/test/cases/reflection_test.rb +509 -509
  217. data/test/cases/relation/delegation_test.rb +63 -63
  218. data/test/cases/relation/merging_test.rb +157 -157
  219. data/test/cases/relation/mutation_test.rb +183 -183
  220. data/test/cases/relation/or_test.rb +92 -92
  221. data/test/cases/relation/predicate_builder_test.rb +16 -16
  222. data/test/cases/relation/record_fetch_warning_test.rb +40 -40
  223. data/test/cases/relation/where_chain_test.rb +105 -105
  224. data/test/cases/relation/where_clause_test.rb +182 -182
  225. data/test/cases/relation/where_test.rb +322 -322
  226. data/test/cases/relation_test.rb +328 -328
  227. data/test/cases/relations_test.rb +2026 -2026
  228. data/test/cases/reload_models_test.rb +22 -22
  229. data/test/cases/result_test.rb +90 -90
  230. data/test/cases/sanitize_test.rb +176 -176
  231. data/test/cases/schema_dumper_test.rb +457 -457
  232. data/test/cases/schema_loading_test.rb +52 -52
  233. data/test/cases/scoping/default_scoping_test.rb +528 -528
  234. data/test/cases/scoping/named_scoping_test.rb +561 -561
  235. data/test/cases/scoping/relation_scoping_test.rb +400 -400
  236. data/test/cases/secure_token_test.rb +32 -32
  237. data/test/cases/serialization_test.rb +104 -104
  238. data/test/cases/serialized_attribute_test.rb +364 -364
  239. data/test/cases/statement_cache_test.rb +136 -136
  240. data/test/cases/store_test.rb +195 -195
  241. data/test/cases/suppressor_test.rb +63 -63
  242. data/test/cases/tasks/database_tasks_test.rb +462 -462
  243. data/test/cases/tasks/mysql_rake_test.rb +345 -345
  244. data/test/cases/tasks/postgresql_rake_test.rb +304 -304
  245. data/test/cases/tasks/sqlite_rake_test.rb +220 -220
  246. data/test/cases/test_case.rb +131 -131
  247. data/test/cases/test_fixtures_test.rb +36 -36
  248. data/test/cases/time_precision_test.rb +103 -102
  249. data/test/cases/timestamp_test.rb +501 -501
  250. data/test/cases/touch_later_test.rb +121 -121
  251. data/test/cases/transaction_callbacks_test.rb +518 -518
  252. data/test/cases/transaction_isolation_test.rb +106 -106
  253. data/test/cases/transactions_test.rb +835 -834
  254. data/test/cases/type/adapter_specific_registry_test.rb +133 -133
  255. data/test/cases/type/date_time_test.rb +14 -14
  256. data/test/cases/type/integer_test.rb +27 -27
  257. data/test/cases/type/string_test.rb +22 -22
  258. data/test/cases/type/type_map_test.rb +177 -177
  259. data/test/cases/type_test.rb +39 -39
  260. data/test/cases/types_test.rb +24 -24
  261. data/test/cases/unconnected_test.rb +33 -33
  262. data/test/cases/validations/absence_validation_test.rb +73 -73
  263. data/test/cases/validations/association_validation_test.rb +97 -97
  264. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  265. data/test/cases/validations/i18n_validation_test.rb +86 -86
  266. data/test/cases/validations/length_validation_test.rb +79 -79
  267. data/test/cases/validations/presence_validation_test.rb +103 -103
  268. data/test/cases/validations/uniqueness_validation_test.rb +548 -548
  269. data/test/cases/validations_repair_helper.rb +19 -19
  270. data/test/cases/validations_test.rb +194 -194
  271. data/test/cases/view_test.rb +216 -216
  272. data/test/cases/yaml_serialization_test.rb +121 -121
  273. data/test/config.example.yml +97 -97
  274. data/test/config.rb +5 -5
  275. data/test/connections/native_ibm_db/connection.rb +44 -0
  276. data/test/fixtures/accounts.yml +29 -29
  277. data/test/fixtures/admin/accounts.yml +2 -2
  278. data/test/fixtures/admin/users.yml +10 -10
  279. data/test/fixtures/author_addresses.yml +17 -17
  280. data/test/fixtures/author_favorites.yml +3 -3
  281. data/test/fixtures/authors.yml +23 -23
  282. data/test/fixtures/bad_posts.yml +9 -9
  283. data/test/fixtures/binaries.yml +133 -133
  284. data/test/fixtures/books.yml +31 -31
  285. data/test/fixtures/bulbs.yml +5 -5
  286. data/test/fixtures/cars.yml +9 -9
  287. data/test/fixtures/categories.yml +19 -19
  288. data/test/fixtures/categories/special_categories.yml +9 -9
  289. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  290. data/test/fixtures/categories_ordered.yml +7 -7
  291. data/test/fixtures/categories_posts.yml +31 -31
  292. data/test/fixtures/categorizations.yml +23 -23
  293. data/test/fixtures/clubs.yml +8 -8
  294. data/test/fixtures/collections.yml +3 -3
  295. data/test/fixtures/colleges.yml +3 -3
  296. data/test/fixtures/comments.yml +65 -65
  297. data/test/fixtures/companies.yml +67 -67
  298. data/test/fixtures/computers.yml +10 -10
  299. data/test/fixtures/content.yml +3 -3
  300. data/test/fixtures/content_positions.yml +3 -3
  301. data/test/fixtures/courses.yml +8 -8
  302. data/test/fixtures/customers.yml +25 -25
  303. data/test/fixtures/dashboards.yml +6 -6
  304. data/test/fixtures/dead_parrots.yml +5 -5
  305. data/test/fixtures/developers.yml +22 -22
  306. data/test/fixtures/developers_projects.yml +16 -16
  307. data/test/fixtures/dog_lovers.yml +7 -7
  308. data/test/fixtures/dogs.yml +4 -4
  309. data/test/fixtures/doubloons.yml +3 -3
  310. data/test/fixtures/edges.yml +5 -5
  311. data/test/fixtures/entrants.yml +14 -14
  312. data/test/fixtures/essays.yml +6 -6
  313. data/test/fixtures/faces.yml +11 -11
  314. data/test/fixtures/fk_test_has_fk.yml +3 -3
  315. data/test/fixtures/fk_test_has_pk.yml +1 -1
  316. data/test/fixtures/friendships.yml +4 -4
  317. data/test/fixtures/funny_jokes.yml +10 -10
  318. data/test/fixtures/interests.yml +33 -33
  319. data/test/fixtures/items.yml +3 -3
  320. data/test/fixtures/jobs.yml +7 -7
  321. data/test/fixtures/legacy_things.yml +3 -3
  322. data/test/fixtures/live_parrots.yml +4 -4
  323. data/test/fixtures/mateys.yml +4 -4
  324. data/test/fixtures/member_details.yml +8 -8
  325. data/test/fixtures/member_types.yml +6 -6
  326. data/test/fixtures/members.yml +11 -11
  327. data/test/fixtures/memberships.yml +34 -34
  328. data/test/fixtures/men.yml +5 -5
  329. data/test/fixtures/minimalistics.yml +2 -2
  330. data/test/fixtures/minivans.yml +5 -5
  331. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  332. data/test/fixtures/mixins.yml +29 -29
  333. data/test/fixtures/movies.yml +7 -7
  334. data/test/fixtures/naked/yml/accounts.yml +1 -1
  335. data/test/fixtures/naked/yml/companies.yml +1 -1
  336. data/test/fixtures/naked/yml/courses.yml +1 -1
  337. data/test/fixtures/naked/yml/parrots.yml +2 -2
  338. data/test/fixtures/naked/yml/trees.yml +3 -3
  339. data/test/fixtures/nodes.yml +29 -29
  340. data/test/fixtures/organizations.yml +5 -5
  341. data/test/fixtures/other_comments.yml +6 -6
  342. data/test/fixtures/other_dogs.yml +2 -2
  343. data/test/fixtures/other_posts.yml +7 -7
  344. data/test/fixtures/other_topics.yml +42 -42
  345. data/test/fixtures/owners.yml +9 -9
  346. data/test/fixtures/parrots.yml +27 -27
  347. data/test/fixtures/parrots_pirates.yml +7 -7
  348. data/test/fixtures/people.yml +24 -24
  349. data/test/fixtures/peoples_treasures.yml +3 -3
  350. data/test/fixtures/pets.yml +19 -19
  351. data/test/fixtures/pirates.yml +12 -15
  352. data/test/fixtures/posts.yml +80 -80
  353. data/test/fixtures/price_estimates.yml +16 -16
  354. data/test/fixtures/products.yml +4 -4
  355. data/test/fixtures/projects.yml +7 -7
  356. data/test/fixtures/ratings.yml +14 -14
  357. data/test/fixtures/readers.yml +11 -11
  358. data/test/fixtures/references.yml +17 -17
  359. data/test/fixtures/reserved_words/distinct.yml +5 -5
  360. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  361. data/test/fixtures/reserved_words/group.yml +14 -14
  362. data/test/fixtures/reserved_words/select.yml +8 -8
  363. data/test/fixtures/reserved_words/values.yml +7 -7
  364. data/test/fixtures/ships.yml +6 -6
  365. data/test/fixtures/speedometers.yml +8 -8
  366. data/test/fixtures/sponsors.yml +12 -12
  367. data/test/fixtures/string_key_objects.yml +7 -7
  368. data/test/fixtures/subscribers.yml +10 -10
  369. data/test/fixtures/subscriptions.yml +12 -12
  370. data/test/fixtures/taggings.yml +78 -78
  371. data/test/fixtures/tags.yml +11 -11
  372. data/test/fixtures/tasks.yml +7 -7
  373. data/test/fixtures/teapots.yml +3 -3
  374. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  375. data/test/fixtures/to_be_linked/users.yml +10 -10
  376. data/test/fixtures/topics.yml +49 -49
  377. data/test/fixtures/toys.yml +14 -14
  378. data/test/fixtures/traffic_lights.yml +9 -9
  379. data/test/fixtures/treasures.yml +10 -10
  380. data/test/fixtures/trees.yml +3 -3
  381. data/test/fixtures/uuid_children.yml +3 -3
  382. data/test/fixtures/uuid_parents.yml +2 -2
  383. data/test/fixtures/variants.yml +4 -4
  384. data/test/fixtures/vegetables.yml +19 -19
  385. data/test/fixtures/vertices.yml +3 -3
  386. data/test/fixtures/warehouse_things.yml +2 -2
  387. data/test/fixtures/zines.yml +5 -5
  388. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  389. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  390. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  391. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -9
  392. data/test/migrations/missing/1_people_have_last_names.rb +9 -9
  393. data/test/migrations/missing/3_we_need_reminders.rb +12 -12
  394. data/test/migrations/missing/4_innocent_jointable.rb +12 -12
  395. data/test/migrations/rename/1_we_need_things.rb +11 -11
  396. data/test/migrations/rename/2_rename_things.rb +9 -9
  397. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  398. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  399. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  400. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  401. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  402. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  403. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  404. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  405. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  406. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  407. data/test/migrations/valid/2_we_need_reminders.rb +12 -12
  408. data/test/migrations/valid/3_innocent_jointable.rb +12 -12
  409. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  410. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -12
  411. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -12
  412. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  413. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  414. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  415. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  416. data/test/models/admin.rb +5 -5
  417. data/test/models/admin/account.rb +3 -3
  418. data/test/models/admin/user.rb +40 -40
  419. data/test/models/aircraft.rb +5 -5
  420. data/test/models/arunit2_model.rb +3 -3
  421. data/test/models/author.rb +209 -209
  422. data/test/models/auto_id.rb +4 -4
  423. data/test/models/autoloadable/extra_firm.rb +2 -2
  424. data/test/models/binary.rb +2 -2
  425. data/test/models/bird.rb +12 -12
  426. data/test/models/book.rb +23 -23
  427. data/test/models/boolean.rb +2 -2
  428. data/test/models/bulb.rb +52 -52
  429. data/test/models/cake_designer.rb +3 -3
  430. data/test/models/car.rb +29 -29
  431. data/test/models/carrier.rb +2 -2
  432. data/test/models/cat.rb +10 -10
  433. data/test/models/categorization.rb +19 -19
  434. data/test/models/category.rb +35 -35
  435. data/test/models/chef.rb +8 -8
  436. data/test/models/citation.rb +3 -3
  437. data/test/models/club.rb +25 -25
  438. data/test/models/college.rb +10 -10
  439. data/test/models/column.rb +3 -3
  440. data/test/models/column_name.rb +3 -3
  441. data/test/models/comment.rb +76 -76
  442. data/test/models/company.rb +230 -230
  443. data/test/models/company_in_module.rb +98 -98
  444. data/test/models/computer.rb +3 -3
  445. data/test/models/contact.rb +41 -41
  446. data/test/models/content.rb +40 -40
  447. data/test/models/contract.rb +20 -20
  448. data/test/models/country.rb +7 -7
  449. data/test/models/course.rb +6 -6
  450. data/test/models/customer.rb +83 -83
  451. data/test/models/customer_carrier.rb +14 -14
  452. data/test/models/dashboard.rb +3 -3
  453. data/test/models/default.rb +2 -2
  454. data/test/models/department.rb +4 -4
  455. data/test/models/developer.rb +274 -274
  456. data/test/models/dog.rb +5 -5
  457. data/test/models/dog_lover.rb +5 -5
  458. data/test/models/doubloon.rb +12 -12
  459. data/test/models/drink_designer.rb +3 -3
  460. data/test/models/edge.rb +5 -5
  461. data/test/models/electron.rb +5 -5
  462. data/test/models/engine.rb +4 -4
  463. data/test/models/entrant.rb +3 -3
  464. data/test/models/essay.rb +5 -5
  465. data/test/models/event.rb +3 -3
  466. data/test/models/eye.rb +37 -37
  467. data/test/models/face.rb +9 -9
  468. data/test/models/friendship.rb +6 -6
  469. data/test/models/guid.rb +2 -2
  470. data/test/models/guitar.rb +4 -4
  471. data/test/models/hotel.rb +11 -11
  472. data/test/models/image.rb +3 -3
  473. data/test/models/interest.rb +5 -5
  474. data/test/models/invoice.rb +4 -4
  475. data/test/models/item.rb +7 -7
  476. data/test/models/job.rb +7 -7
  477. data/test/models/joke.rb +7 -7
  478. data/test/models/keyboard.rb +3 -3
  479. data/test/models/legacy_thing.rb +3 -3
  480. data/test/models/lesson.rb +11 -11
  481. data/test/models/line_item.rb +3 -3
  482. data/test/models/liquid.rb +4 -4
  483. data/test/models/man.rb +11 -11
  484. data/test/models/matey.rb +4 -4
  485. data/test/models/member.rb +42 -42
  486. data/test/models/member_detail.rb +8 -8
  487. data/test/models/member_type.rb +3 -3
  488. data/test/models/membership.rb +35 -35
  489. data/test/models/mentor.rb +2 -2
  490. data/test/models/minimalistic.rb +2 -2
  491. data/test/models/minivan.rb +9 -9
  492. data/test/models/mixed_case_monkey.rb +3 -3
  493. data/test/models/mocktail_designer.rb +2 -2
  494. data/test/models/molecule.rb +6 -6
  495. data/test/models/movie.rb +5 -5
  496. data/test/models/node.rb +5 -5
  497. data/test/models/non_primary_key.rb +2 -2
  498. data/test/models/notification.rb +3 -3
  499. data/test/models/order.rb +4 -4
  500. data/test/models/organization.rb +14 -14
  501. data/test/models/other_dog.rb +5 -5
  502. data/test/models/owner.rb +37 -37
  503. data/test/models/parrot.rb +28 -28
  504. data/test/models/person.rb +142 -142
  505. data/test/models/personal_legacy_thing.rb +4 -4
  506. data/test/models/pet.rb +18 -18
  507. data/test/models/pet_treasure.rb +6 -6
  508. data/test/models/pirate.rb +92 -92
  509. data/test/models/possession.rb +3 -3
  510. data/test/models/post.rb +273 -273
  511. data/test/models/price_estimate.rb +4 -4
  512. data/test/models/professor.rb +5 -5
  513. data/test/models/project.rb +40 -40
  514. data/test/models/publisher.rb +2 -2
  515. data/test/models/publisher/article.rb +4 -4
  516. data/test/models/publisher/magazine.rb +3 -3
  517. data/test/models/rating.rb +4 -4
  518. data/test/models/reader.rb +23 -23
  519. data/test/models/recipe.rb +3 -3
  520. data/test/models/record.rb +2 -2
  521. data/test/models/reference.rb +22 -22
  522. data/test/models/reply.rb +61 -61
  523. data/test/models/ship.rb +39 -39
  524. data/test/models/ship_part.rb +8 -8
  525. data/test/models/shop.rb +17 -17
  526. data/test/models/shop_account.rb +6 -6
  527. data/test/models/speedometer.rb +6 -6
  528. data/test/models/sponsor.rb +7 -7
  529. data/test/models/string_key_object.rb +3 -3
  530. data/test/models/student.rb +4 -4
  531. data/test/models/subject.rb +16 -16
  532. data/test/models/subscriber.rb +8 -8
  533. data/test/models/subscription.rb +4 -4
  534. data/test/models/tag.rb +13 -13
  535. data/test/models/tagging.rb +13 -13
  536. data/test/models/task.rb +5 -5
  537. data/test/models/topic.rb +118 -118
  538. data/test/models/toy.rb +6 -6
  539. data/test/models/traffic_light.rb +4 -4
  540. data/test/models/treasure.rb +14 -14
  541. data/test/models/treaty.rb +7 -7
  542. data/test/models/tree.rb +3 -3
  543. data/test/models/tuning_peg.rb +4 -4
  544. data/test/models/tyre.rb +11 -11
  545. data/test/models/user.rb +14 -14
  546. data/test/models/uuid_child.rb +3 -3
  547. data/test/models/uuid_item.rb +6 -6
  548. data/test/models/uuid_parent.rb +3 -3
  549. data/test/models/vegetables.rb +24 -24
  550. data/test/models/vehicle.rb +6 -6
  551. data/test/models/vertex.rb +9 -9
  552. data/test/models/warehouse_thing.rb +5 -5
  553. data/test/models/wheel.rb +3 -3
  554. data/test/models/without_table.rb +3 -3
  555. data/test/models/zine.rb +3 -3
  556. data/test/schema/i5/ibm_db_specific_schema.rb +137 -0
  557. data/test/schema/ids/ibm_db_specific_schema.rb +140 -0
  558. data/test/schema/luw/ibm_db_specific_schema.rb +137 -0
  559. data/test/schema/mysql2_specific_schema.rb +68 -68
  560. data/test/schema/oracle_specific_schema.rb +40 -40
  561. data/test/schema/postgresql_specific_schema.rb +114 -114
  562. data/test/schema/schema.rb +1057 -1057
  563. data/test/schema/schema.rb.original +1057 -1057
  564. data/test/schema/sqlite_specific_schema.rb +18 -18
  565. data/test/schema/zOS/ibm_db_specific_schema.rb +208 -0
  566. data/test/support/config.rb +43 -43
  567. data/test/support/connection.rb +23 -23
  568. data/test/support/connection_helper.rb +14 -14
  569. data/test/support/ddl_helper.rb +8 -8
  570. data/test/support/schema_dumping_helper.rb +20 -20
  571. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -22
  572. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -182
  573. metadata +30 -14
  574. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  575. data/test/fixtures/author_addresses.original +0 -11
  576. data/test/fixtures/authors.original +0 -17
@@ -1,182 +1,182 @@
1
- require "cases/helper"
2
-
3
- class ActiveRecord::Relation
4
- class WhereClauseTest < ActiveRecord::TestCase
5
- test "+ combines two where clauses" do
6
- first_clause = WhereClause.new([table["id"].eq(bind_param)], [["id", 1]])
7
- second_clause = WhereClause.new([table["name"].eq(bind_param)], [["name", "Sean"]])
8
- combined = WhereClause.new(
9
- [table["id"].eq(bind_param), table["name"].eq(bind_param)],
10
- [["id", 1], ["name", "Sean"]],
11
- )
12
-
13
- assert_equal combined, first_clause + second_clause
14
- end
15
-
16
- test "+ is associative, but not commutative" do
17
- a = WhereClause.new(["a"], ["bind a"])
18
- b = WhereClause.new(["b"], ["bind b"])
19
- c = WhereClause.new(["c"], ["bind c"])
20
-
21
- assert_equal a + (b + c), (a + b) + c
22
- assert_not_equal a + b, b + a
23
- end
24
-
25
- test "an empty where clause is the identity value for +" do
26
- clause = WhereClause.new([table["id"].eq(bind_param)], [["id", 1]])
27
-
28
- assert_equal clause, clause + WhereClause.empty
29
- end
30
-
31
- test "merge combines two where clauses" do
32
- a = WhereClause.new([table["id"].eq(1)], [])
33
- b = WhereClause.new([table["name"].eq("Sean")], [])
34
- expected = WhereClause.new([table["id"].eq(1), table["name"].eq("Sean")], [])
35
-
36
- assert_equal expected, a.merge(b)
37
- end
38
-
39
- test "merge keeps the right side, when two equality clauses reference the same column" do
40
- a = WhereClause.new([table["id"].eq(1), table["name"].eq("Sean")], [])
41
- b = WhereClause.new([table["name"].eq("Jim")], [])
42
- expected = WhereClause.new([table["id"].eq(1), table["name"].eq("Jim")], [])
43
-
44
- assert_equal expected, a.merge(b)
45
- end
46
-
47
- test "merge removes bind parameters matching overlapping equality clauses" do
48
- a = WhereClause.new(
49
- [table["id"].eq(bind_param), table["name"].eq(bind_param)],
50
- [attribute("id", 1), attribute("name", "Sean")],
51
- )
52
- b = WhereClause.new(
53
- [table["name"].eq(bind_param)],
54
- [attribute("name", "Jim")]
55
- )
56
- expected = WhereClause.new(
57
- [table["id"].eq(bind_param), table["name"].eq(bind_param)],
58
- [attribute("id", 1), attribute("name", "Jim")],
59
- )
60
-
61
- assert_equal expected, a.merge(b)
62
- end
63
-
64
- test "merge allows for columns with the same name from different tables" do
65
- skip "This is not possible as of 4.2, and the binds do not yet contain sufficient information for this to happen"
66
- # We might be able to change the implementation to remove conflicts by index, rather than column name
67
- end
68
-
69
- test "a clause knows if it is empty" do
70
- assert WhereClause.empty.empty?
71
- assert_not WhereClause.new(["anything"], []).empty?
72
- end
73
-
74
- test "invert cannot handle nil" do
75
- where_clause = WhereClause.new([nil], [])
76
-
77
- assert_raises ArgumentError do
78
- where_clause.invert
79
- end
80
- end
81
-
82
- test "invert replaces each part of the predicate with its inverse" do
83
- random_object = Object.new
84
- original = WhereClause.new([
85
- table["id"].in([1, 2, 3]),
86
- table["id"].eq(1),
87
- "sql literal",
88
- random_object
89
- ], [])
90
- expected = WhereClause.new([
91
- table["id"].not_in([1, 2, 3]),
92
- table["id"].not_eq(1),
93
- Arel::Nodes::Not.new(Arel::Nodes::SqlLiteral.new("sql literal")),
94
- Arel::Nodes::Not.new(random_object)
95
- ], [])
96
-
97
- assert_equal expected, original.invert
98
- end
99
-
100
- test "accept removes binary predicates referencing a given column" do
101
- where_clause = WhereClause.new([
102
- table["id"].in([1, 2, 3]),
103
- table["name"].eq(bind_param),
104
- table["age"].gteq(bind_param),
105
- ], [
106
- attribute("name", "Sean"),
107
- attribute("age", 30),
108
- ])
109
- expected = WhereClause.new([table["age"].gteq(bind_param)], [attribute("age", 30)])
110
-
111
- assert_equal expected, where_clause.except("id", "name")
112
- end
113
-
114
- test "ast groups its predicates with AND" do
115
- predicates = [
116
- table["id"].in([1, 2, 3]),
117
- table["name"].eq(bind_param),
118
- ]
119
- where_clause = WhereClause.new(predicates, [])
120
- expected = Arel::Nodes::And.new(predicates)
121
-
122
- assert_equal expected, where_clause.ast
123
- end
124
-
125
- test "ast wraps any SQL literals in parenthesis" do
126
- random_object = Object.new
127
- where_clause = WhereClause.new([
128
- table["id"].in([1, 2, 3]),
129
- "foo = bar",
130
- random_object,
131
- ], [])
132
- expected = Arel::Nodes::And.new([
133
- table["id"].in([1, 2, 3]),
134
- Arel::Nodes::Grouping.new(Arel.sql("foo = bar")),
135
- Arel::Nodes::Grouping.new(random_object),
136
- ])
137
-
138
- assert_equal expected, where_clause.ast
139
- end
140
-
141
- test "ast removes any empty strings" do
142
- where_clause = WhereClause.new([table["id"].in([1, 2, 3])], [])
143
- where_clause_with_empty = WhereClause.new([table["id"].in([1, 2, 3]), ''], [])
144
-
145
- assert_equal where_clause.ast, where_clause_with_empty.ast
146
- end
147
-
148
- test "or joins the two clauses using OR" do
149
- where_clause = WhereClause.new([table["id"].eq(bind_param)], [attribute("id", 1)])
150
- other_clause = WhereClause.new([table["name"].eq(bind_param)], [attribute("name", "Sean")])
151
- expected_ast =
152
- Arel::Nodes::Grouping.new(
153
- Arel::Nodes::Or.new(table["id"].eq(bind_param), table["name"].eq(bind_param))
154
- )
155
- expected_binds = where_clause.binds + other_clause.binds
156
-
157
- assert_equal expected_ast.to_sql, where_clause.or(other_clause).ast.to_sql
158
- assert_equal expected_binds, where_clause.or(other_clause).binds
159
- end
160
-
161
- test "or returns an empty where clause when either side is empty" do
162
- where_clause = WhereClause.new([table["id"].eq(bind_param)], [attribute("id", 1)])
163
-
164
- assert_equal WhereClause.empty, where_clause.or(WhereClause.empty)
165
- assert_equal WhereClause.empty, WhereClause.empty.or(where_clause)
166
- end
167
-
168
- private
169
-
170
- def table
171
- Arel::Table.new("table")
172
- end
173
-
174
- def bind_param
175
- Arel::Nodes::BindParam.new
176
- end
177
-
178
- def attribute(name, value)
179
- ActiveRecord::Attribute.with_cast_value(name, value, ActiveRecord::Type::Value.new)
180
- end
181
- end
182
- end
1
+ require "cases/helper"
2
+
3
+ class ActiveRecord::Relation
4
+ class WhereClauseTest < ActiveRecord::TestCase
5
+ test "+ combines two where clauses" do
6
+ first_clause = WhereClause.new([table["id"].eq(bind_param)], [["id", 1]])
7
+ second_clause = WhereClause.new([table["name"].eq(bind_param)], [["name", "Sean"]])
8
+ combined = WhereClause.new(
9
+ [table["id"].eq(bind_param), table["name"].eq(bind_param)],
10
+ [["id", 1], ["name", "Sean"]],
11
+ )
12
+
13
+ assert_equal combined, first_clause + second_clause
14
+ end
15
+
16
+ test "+ is associative, but not commutative" do
17
+ a = WhereClause.new(["a"], ["bind a"])
18
+ b = WhereClause.new(["b"], ["bind b"])
19
+ c = WhereClause.new(["c"], ["bind c"])
20
+
21
+ assert_equal a + (b + c), (a + b) + c
22
+ assert_not_equal a + b, b + a
23
+ end
24
+
25
+ test "an empty where clause is the identity value for +" do
26
+ clause = WhereClause.new([table["id"].eq(bind_param)], [["id", 1]])
27
+
28
+ assert_equal clause, clause + WhereClause.empty
29
+ end
30
+
31
+ test "merge combines two where clauses" do
32
+ a = WhereClause.new([table["id"].eq(1)], [])
33
+ b = WhereClause.new([table["name"].eq("Sean")], [])
34
+ expected = WhereClause.new([table["id"].eq(1), table["name"].eq("Sean")], [])
35
+
36
+ assert_equal expected, a.merge(b)
37
+ end
38
+
39
+ test "merge keeps the right side, when two equality clauses reference the same column" do
40
+ a = WhereClause.new([table["id"].eq(1), table["name"].eq("Sean")], [])
41
+ b = WhereClause.new([table["name"].eq("Jim")], [])
42
+ expected = WhereClause.new([table["id"].eq(1), table["name"].eq("Jim")], [])
43
+
44
+ assert_equal expected, a.merge(b)
45
+ end
46
+
47
+ test "merge removes bind parameters matching overlapping equality clauses" do
48
+ a = WhereClause.new(
49
+ [table["id"].eq(bind_param), table["name"].eq(bind_param)],
50
+ [attribute("id", 1), attribute("name", "Sean")],
51
+ )
52
+ b = WhereClause.new(
53
+ [table["name"].eq(bind_param)],
54
+ [attribute("name", "Jim")]
55
+ )
56
+ expected = WhereClause.new(
57
+ [table["id"].eq(bind_param), table["name"].eq(bind_param)],
58
+ [attribute("id", 1), attribute("name", "Jim")],
59
+ )
60
+
61
+ assert_equal expected, a.merge(b)
62
+ end
63
+
64
+ test "merge allows for columns with the same name from different tables" do
65
+ skip "This is not possible as of 4.2, and the binds do not yet contain sufficient information for this to happen"
66
+ # We might be able to change the implementation to remove conflicts by index, rather than column name
67
+ end
68
+
69
+ test "a clause knows if it is empty" do
70
+ assert WhereClause.empty.empty?
71
+ assert_not WhereClause.new(["anything"], []).empty?
72
+ end
73
+
74
+ test "invert cannot handle nil" do
75
+ where_clause = WhereClause.new([nil], [])
76
+
77
+ assert_raises ArgumentError do
78
+ where_clause.invert
79
+ end
80
+ end
81
+
82
+ test "invert replaces each part of the predicate with its inverse" do
83
+ random_object = Object.new
84
+ original = WhereClause.new([
85
+ table["id"].in([1, 2, 3]),
86
+ table["id"].eq(1),
87
+ "sql literal",
88
+ random_object
89
+ ], [])
90
+ expected = WhereClause.new([
91
+ table["id"].not_in([1, 2, 3]),
92
+ table["id"].not_eq(1),
93
+ Arel::Nodes::Not.new(Arel::Nodes::SqlLiteral.new("sql literal")),
94
+ Arel::Nodes::Not.new(random_object)
95
+ ], [])
96
+
97
+ assert_equal expected, original.invert
98
+ end
99
+
100
+ test "accept removes binary predicates referencing a given column" do
101
+ where_clause = WhereClause.new([
102
+ table["id"].in([1, 2, 3]),
103
+ table["name"].eq(bind_param),
104
+ table["age"].gteq(bind_param),
105
+ ], [
106
+ attribute("name", "Sean"),
107
+ attribute("age", 30),
108
+ ])
109
+ expected = WhereClause.new([table["age"].gteq(bind_param)], [attribute("age", 30)])
110
+
111
+ assert_equal expected, where_clause.except("id", "name")
112
+ end
113
+
114
+ test "ast groups its predicates with AND" do
115
+ predicates = [
116
+ table["id"].in([1, 2, 3]),
117
+ table["name"].eq(bind_param),
118
+ ]
119
+ where_clause = WhereClause.new(predicates, [])
120
+ expected = Arel::Nodes::And.new(predicates)
121
+
122
+ assert_equal expected, where_clause.ast
123
+ end
124
+
125
+ test "ast wraps any SQL literals in parenthesis" do
126
+ random_object = Object.new
127
+ where_clause = WhereClause.new([
128
+ table["id"].in([1, 2, 3]),
129
+ "foo = bar",
130
+ random_object,
131
+ ], [])
132
+ expected = Arel::Nodes::And.new([
133
+ table["id"].in([1, 2, 3]),
134
+ Arel::Nodes::Grouping.new(Arel.sql("foo = bar")),
135
+ Arel::Nodes::Grouping.new(random_object),
136
+ ])
137
+
138
+ assert_equal expected, where_clause.ast
139
+ end
140
+
141
+ test "ast removes any empty strings" do
142
+ where_clause = WhereClause.new([table["id"].in([1, 2, 3])], [])
143
+ where_clause_with_empty = WhereClause.new([table["id"].in([1, 2, 3]), ''], [])
144
+
145
+ assert_equal where_clause.ast, where_clause_with_empty.ast
146
+ end
147
+
148
+ test "or joins the two clauses using OR" do
149
+ where_clause = WhereClause.new([table["id"].eq(bind_param)], [attribute("id", 1)])
150
+ other_clause = WhereClause.new([table["name"].eq(bind_param)], [attribute("name", "Sean")])
151
+ expected_ast =
152
+ Arel::Nodes::Grouping.new(
153
+ Arel::Nodes::Or.new(table["id"].eq(bind_param), table["name"].eq(bind_param))
154
+ )
155
+ expected_binds = where_clause.binds + other_clause.binds
156
+
157
+ assert_equal expected_ast.to_sql, where_clause.or(other_clause).ast.to_sql
158
+ assert_equal expected_binds, where_clause.or(other_clause).binds
159
+ end
160
+
161
+ test "or returns an empty where clause when either side is empty" do
162
+ where_clause = WhereClause.new([table["id"].eq(bind_param)], [attribute("id", 1)])
163
+
164
+ assert_equal WhereClause.empty, where_clause.or(WhereClause.empty)
165
+ assert_equal WhereClause.empty, WhereClause.empty.or(where_clause)
166
+ end
167
+
168
+ private
169
+
170
+ def table
171
+ Arel::Table.new("table")
172
+ end
173
+
174
+ def bind_param
175
+ Arel::Nodes::BindParam.new
176
+ end
177
+
178
+ def attribute(name, value)
179
+ ActiveRecord::Attribute.with_cast_value(name, value, ActiveRecord::Type::Value.new)
180
+ end
181
+ end
182
+ end
@@ -1,322 +1,322 @@
1
- require "cases/helper"
2
- require "models/author"
3
- require "models/binary"
4
- require "models/cake_designer"
5
- require "models/car"
6
- require "models/chef"
7
- require "models/comment"
8
- require "models/edge"
9
- require "models/essay"
10
- require "models/post"
11
- require "models/price_estimate"
12
- require "models/topic"
13
- require "models/treasure"
14
- require "models/vertex"
15
-
16
- module ActiveRecord
17
- class WhereTest < ActiveRecord::TestCase
18
- fixtures :posts, :edges, :authors, :binaries, :essays, :cars, :treasures, :price_estimates
19
-
20
- def test_where_copies_bind_params
21
- author = authors(:david)
22
- posts = author.posts.where('posts.id != 1')
23
- joined = Post.where(id: posts)
24
-
25
- assert_operator joined.length, :>, 0
26
-
27
- joined.each { |post|
28
- assert_equal author, post.author
29
- assert_not_equal 1, post.id
30
- }
31
- end
32
-
33
- def test_where_copies_bind_params_in_the_right_order
34
- author = authors(:david)
35
- posts = author.posts.where.not(id: 1)
36
- joined = Post.where(id: posts, title: posts.first.title)
37
-
38
- assert_equal joined, [posts.first]
39
- end
40
-
41
- def test_where_copies_arel_bind_params
42
- chef = Chef.create!
43
- CakeDesigner.create!(chef: chef)
44
-
45
- cake_designers = CakeDesigner.joins(:chef).where(chefs: { id: chef.id })
46
- chefs = Chef.where(employable: cake_designers)
47
-
48
- assert_equal [chef], chefs.to_a
49
- end
50
-
51
- def test_rewhere_on_root
52
- assert_equal posts(:welcome), Post.rewhere(title: 'Welcome to the weblog').first
53
- end
54
-
55
- def test_belongs_to_shallow_where
56
- author = Author.new
57
- author.id = 1
58
-
59
- assert_equal Post.where(author_id: 1).to_sql, Post.where(author: author).to_sql
60
- end
61
-
62
- def test_belongs_to_nil_where
63
- assert_equal Post.where(author_id: nil).to_sql, Post.where(author: nil).to_sql
64
- end
65
-
66
- def test_belongs_to_array_value_where
67
- assert_equal Post.where(author_id: [1,2]).to_sql, Post.where(author: [1,2]).to_sql
68
- end
69
-
70
- def test_belongs_to_nested_relation_where
71
- expected = Post.where(author_id: Author.where(id: [1,2])).to_sql
72
- actual = Post.where(author: Author.where(id: [1,2])).to_sql
73
-
74
- assert_equal expected, actual
75
- end
76
-
77
- def test_belongs_to_nested_where
78
- parent = Comment.new
79
- parent.id = 1
80
-
81
- expected = Post.where(comments: { parent_id: 1 }).joins(:comments)
82
- actual = Post.where(comments: { parent: parent }).joins(:comments)
83
-
84
- assert_equal expected.to_sql, actual.to_sql
85
- end
86
-
87
- def test_belongs_to_nested_where_with_relation
88
- author = authors(:david)
89
-
90
- expected = Author.where(id: author ).joins(:posts)
91
- actual = Author.where(posts: { author_id: Author.where(id: author.id) }).joins(:posts)
92
-
93
- assert_equal expected.to_a, actual.to_a
94
- end
95
-
96
- def test_polymorphic_shallow_where
97
- treasure = Treasure.new
98
- treasure.id = 1
99
-
100
- expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: 1)
101
- actual = PriceEstimate.where(estimate_of: treasure)
102
-
103
- assert_equal expected.to_sql, actual.to_sql
104
- end
105
-
106
- def test_polymorphic_nested_array_where
107
- treasure = Treasure.new
108
- treasure.id = 1
109
- hidden = HiddenTreasure.new
110
- hidden.id = 2
111
-
112
- expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: [treasure, hidden])
113
- actual = PriceEstimate.where(estimate_of: [treasure, hidden])
114
-
115
- assert_equal expected.to_sql, actual.to_sql
116
- end
117
-
118
- def test_polymorphic_array_where_multiple_types
119
- treasure_1 = treasures(:diamond)
120
- treasure_2 = treasures(:sapphire)
121
- car = cars(:honda)
122
-
123
- expected = [price_estimates(:diamond), price_estimates(:sapphire_1), price_estimates(:sapphire_2), price_estimates(:honda)].sort
124
- actual = PriceEstimate.where(estimate_of: [treasure_1, treasure_2, car]).to_a.sort
125
-
126
- assert_equal expected, actual
127
- end
128
-
129
- def test_polymorphic_nested_relation_where
130
- expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: Treasure.where(id: [1,2]))
131
- actual = PriceEstimate.where(estimate_of: Treasure.where(id: [1,2]))
132
-
133
- assert_equal expected.to_sql, actual.to_sql
134
- end
135
-
136
- def test_polymorphic_sti_shallow_where
137
- treasure = HiddenTreasure.new
138
- treasure.id = 1
139
-
140
- expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: 1)
141
- actual = PriceEstimate.where(estimate_of: treasure)
142
-
143
- assert_equal expected.to_sql, actual.to_sql
144
- end
145
-
146
- def test_polymorphic_nested_where
147
- thing = Post.new
148
- thing.id = 1
149
-
150
- expected = Treasure.where(price_estimates: { thing_type: 'Post', thing_id: 1 }).joins(:price_estimates)
151
- actual = Treasure.where(price_estimates: { thing: thing }).joins(:price_estimates)
152
-
153
- assert_equal expected.to_sql, actual.to_sql
154
- end
155
-
156
- def test_polymorphic_sti_nested_where
157
- treasure = HiddenTreasure.new
158
- treasure.id = 1
159
-
160
- expected = Treasure.where(price_estimates: { estimate_of_type: 'Treasure', estimate_of_id: 1 }).joins(:price_estimates)
161
- actual = Treasure.where(price_estimates: { estimate_of: treasure }).joins(:price_estimates)
162
-
163
- assert_equal expected.to_sql, actual.to_sql
164
- end
165
-
166
- def test_decorated_polymorphic_where
167
- treasure_decorator = Struct.new(:model) do
168
- def self.method_missing(method, *args, &block)
169
- Treasure.send(method, *args, &block)
170
- end
171
-
172
- def is_a?(klass)
173
- model.is_a?(klass)
174
- end
175
-
176
- def method_missing(method, *args, &block)
177
- model.send(method, *args, &block)
178
- end
179
- end
180
-
181
- treasure = Treasure.new
182
- treasure.id = 1
183
- decorated_treasure = treasure_decorator.new(treasure)
184
-
185
- expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: 1)
186
- actual = PriceEstimate.where(estimate_of: decorated_treasure)
187
-
188
- assert_equal expected.to_sql, actual.to_sql
189
- end
190
-
191
- def test_aliased_attribute
192
- expected = Topic.where(heading: 'The First Topic')
193
- actual = Topic.where(title: 'The First Topic')
194
-
195
- assert_equal expected.to_sql, actual.to_sql
196
- end
197
-
198
- def test_where_error
199
- assert_raises(ActiveRecord::StatementInvalid) do
200
- Post.where(:id => { 'posts.author_id' => 10 }).first
201
- end
202
- end
203
-
204
- def test_where_with_table_name
205
- post = Post.first
206
- assert_equal post, Post.where(:posts => { 'id' => post.id }).first
207
- end
208
-
209
- def test_where_with_table_name_and_empty_hash
210
- assert_equal 0, Post.where(:posts => {}).count
211
- end
212
-
213
- def test_where_with_table_name_and_empty_array
214
- assert_equal 0, Post.where(:id => []).count
215
- end
216
-
217
- def test_where_with_empty_hash_and_no_foreign_key
218
- assert_equal 0, Edge.where(:sink => {}).count
219
- end
220
-
221
- def test_where_with_blank_conditions
222
- [[], {}, nil, ""].each do |blank|
223
- assert_equal 4, Edge.where(blank).order("sink_id").to_a.size
224
- end
225
- end
226
-
227
- def test_where_with_integer_for_string_column
228
- count = Post.where(:title => 0).count
229
- assert_equal 0, count
230
- end
231
-
232
- def test_where_with_float_for_string_column
233
- count = Post.where(:title => 0.0).count
234
- assert_equal 0, count
235
- end
236
-
237
- def test_where_with_boolean_for_string_column
238
- count = Post.where(:title => false).count
239
- assert_equal 0, count
240
- end
241
-
242
- def test_where_with_decimal_for_string_column
243
- count = Post.where(:title => BigDecimal.new(0)).count
244
- assert_equal 0, count
245
- end
246
-
247
- def test_where_with_duration_for_string_column
248
- count = Post.where(:title => 0.seconds).count
249
- assert_equal 0, count
250
- end
251
-
252
- def test_where_with_integer_for_binary_column
253
- count = Binary.where(:data => 0).count
254
- assert_equal 0, count
255
- end
256
-
257
- def test_where_on_association_with_custom_primary_key
258
- author = authors(:david)
259
- essay = Essay.where(writer: author).first
260
-
261
- assert_equal essays(:david_modest_proposal), essay
262
- end
263
-
264
- def test_where_on_association_with_custom_primary_key_with_relation
265
- author = authors(:david)
266
- essay = Essay.where(writer: Author.where(id: author.id)).first
267
-
268
- assert_equal essays(:david_modest_proposal), essay
269
- end
270
-
271
- def test_where_on_association_with_relation_performs_subselect_not_two_queries
272
- author = authors(:david)
273
-
274
- assert_queries(1) do
275
- Essay.where(writer: Author.where(id: author.id)).to_a
276
- end
277
- end
278
-
279
- def test_where_on_association_with_custom_primary_key_with_array_of_base
280
- author = authors(:david)
281
- essay = Essay.where(writer: [author]).first
282
-
283
- assert_equal essays(:david_modest_proposal), essay
284
- end
285
-
286
- def test_where_on_association_with_custom_primary_key_with_array_of_ids
287
- essay = Essay.where(writer: ["David"]).first
288
-
289
- assert_equal essays(:david_modest_proposal), essay
290
- end
291
-
292
- def test_where_with_strong_parameters
293
- protected_params = Class.new do
294
- attr_reader :permitted
295
- alias :permitted? :permitted
296
-
297
- def initialize(parameters)
298
- @parameters = parameters
299
- @permitted = false
300
- end
301
-
302
- def to_h
303
- @parameters
304
- end
305
-
306
- def permit!
307
- @permitted = true
308
- self
309
- end
310
- end
311
-
312
- author = authors(:david)
313
- params = protected_params.new(name: author.name)
314
- assert_raises(ActiveModel::ForbiddenAttributesError) { Author.where(params) }
315
- assert_equal author, Author.where(params.permit!).first
316
- end
317
-
318
- def test_where_with_unsupported_arguments
319
- assert_raises(ArgumentError) { Author.where(42) }
320
- end
321
- end
322
- end
1
+ require "cases/helper"
2
+ require "models/author"
3
+ require "models/binary"
4
+ require "models/cake_designer"
5
+ require "models/car"
6
+ require "models/chef"
7
+ require "models/comment"
8
+ require "models/edge"
9
+ require "models/essay"
10
+ require "models/post"
11
+ require "models/price_estimate"
12
+ require "models/topic"
13
+ require "models/treasure"
14
+ require "models/vertex"
15
+
16
+ module ActiveRecord
17
+ class WhereTest < ActiveRecord::TestCase
18
+ fixtures :posts, :edges, :authors, :binaries, :essays, :cars, :treasures, :price_estimates
19
+
20
+ def test_where_copies_bind_params
21
+ author = authors(:david)
22
+ posts = author.posts.where('posts.id != 1')
23
+ joined = Post.where(id: posts)
24
+
25
+ assert_operator joined.length, :>, 0
26
+
27
+ joined.each { |post|
28
+ assert_equal author, post.author
29
+ assert_not_equal 1, post.id
30
+ }
31
+ end
32
+
33
+ def test_where_copies_bind_params_in_the_right_order
34
+ author = authors(:david)
35
+ posts = author.posts.where.not(id: 1)
36
+ joined = Post.where(id: posts, title: posts.first.title)
37
+
38
+ assert_equal joined, [posts.first]
39
+ end
40
+
41
+ def test_where_copies_arel_bind_params
42
+ chef = Chef.create!
43
+ CakeDesigner.create!(chef: chef)
44
+
45
+ cake_designers = CakeDesigner.joins(:chef).where(chefs: { id: chef.id })
46
+ chefs = Chef.where(employable: cake_designers)
47
+
48
+ assert_equal [chef], chefs.to_a
49
+ end
50
+
51
+ def test_rewhere_on_root
52
+ assert_equal posts(:welcome), Post.rewhere(title: 'Welcome to the weblog').first
53
+ end
54
+
55
+ def test_belongs_to_shallow_where
56
+ author = Author.new
57
+ author.id = 1
58
+
59
+ assert_equal Post.where(author_id: 1).to_sql, Post.where(author: author).to_sql
60
+ end
61
+
62
+ def test_belongs_to_nil_where
63
+ assert_equal Post.where(author_id: nil).to_sql, Post.where(author: nil).to_sql
64
+ end
65
+
66
+ def test_belongs_to_array_value_where
67
+ assert_equal Post.where(author_id: [1,2]).to_sql, Post.where(author: [1,2]).to_sql
68
+ end
69
+
70
+ def test_belongs_to_nested_relation_where
71
+ expected = Post.where(author_id: Author.where(id: [1,2])).to_sql
72
+ actual = Post.where(author: Author.where(id: [1,2])).to_sql
73
+
74
+ assert_equal expected, actual
75
+ end
76
+
77
+ def test_belongs_to_nested_where
78
+ parent = Comment.new
79
+ parent.id = 1
80
+
81
+ expected = Post.where(comments: { parent_id: 1 }).joins(:comments)
82
+ actual = Post.where(comments: { parent: parent }).joins(:comments)
83
+
84
+ assert_equal expected.to_sql, actual.to_sql
85
+ end
86
+
87
+ def test_belongs_to_nested_where_with_relation
88
+ author = authors(:david)
89
+
90
+ expected = Author.where(id: author ).joins(:posts)
91
+ actual = Author.where(posts: { author_id: Author.where(id: author.id) }).joins(:posts)
92
+
93
+ assert_equal expected.to_a, actual.to_a
94
+ end
95
+
96
+ def test_polymorphic_shallow_where
97
+ treasure = Treasure.new
98
+ treasure.id = 1
99
+
100
+ expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: 1)
101
+ actual = PriceEstimate.where(estimate_of: treasure)
102
+
103
+ assert_equal expected.to_sql, actual.to_sql
104
+ end
105
+
106
+ def test_polymorphic_nested_array_where
107
+ treasure = Treasure.new
108
+ treasure.id = 1
109
+ hidden = HiddenTreasure.new
110
+ hidden.id = 2
111
+
112
+ expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: [treasure, hidden])
113
+ actual = PriceEstimate.where(estimate_of: [treasure, hidden])
114
+
115
+ assert_equal expected.to_sql, actual.to_sql
116
+ end
117
+
118
+ def test_polymorphic_array_where_multiple_types
119
+ treasure_1 = treasures(:diamond)
120
+ treasure_2 = treasures(:sapphire)
121
+ car = cars(:honda)
122
+
123
+ expected = [price_estimates(:diamond), price_estimates(:sapphire_1), price_estimates(:sapphire_2), price_estimates(:honda)].sort
124
+ actual = PriceEstimate.where(estimate_of: [treasure_1, treasure_2, car]).to_a.sort
125
+
126
+ assert_equal expected, actual
127
+ end
128
+
129
+ def test_polymorphic_nested_relation_where
130
+ expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: Treasure.where(id: [1,2]))
131
+ actual = PriceEstimate.where(estimate_of: Treasure.where(id: [1,2]))
132
+
133
+ assert_equal expected.to_sql, actual.to_sql
134
+ end
135
+
136
+ def test_polymorphic_sti_shallow_where
137
+ treasure = HiddenTreasure.new
138
+ treasure.id = 1
139
+
140
+ expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: 1)
141
+ actual = PriceEstimate.where(estimate_of: treasure)
142
+
143
+ assert_equal expected.to_sql, actual.to_sql
144
+ end
145
+
146
+ def test_polymorphic_nested_where
147
+ thing = Post.new
148
+ thing.id = 1
149
+
150
+ expected = Treasure.where(price_estimates: { thing_type: 'Post', thing_id: 1 }).joins(:price_estimates)
151
+ actual = Treasure.where(price_estimates: { thing: thing }).joins(:price_estimates)
152
+
153
+ assert_equal expected.to_sql, actual.to_sql
154
+ end
155
+
156
+ def test_polymorphic_sti_nested_where
157
+ treasure = HiddenTreasure.new
158
+ treasure.id = 1
159
+
160
+ expected = Treasure.where(price_estimates: { estimate_of_type: 'Treasure', estimate_of_id: 1 }).joins(:price_estimates)
161
+ actual = Treasure.where(price_estimates: { estimate_of: treasure }).joins(:price_estimates)
162
+
163
+ assert_equal expected.to_sql, actual.to_sql
164
+ end
165
+
166
+ def test_decorated_polymorphic_where
167
+ treasure_decorator = Struct.new(:model) do
168
+ def self.method_missing(method, *args, &block)
169
+ Treasure.send(method, *args, &block)
170
+ end
171
+
172
+ def is_a?(klass)
173
+ model.is_a?(klass)
174
+ end
175
+
176
+ def method_missing(method, *args, &block)
177
+ model.send(method, *args, &block)
178
+ end
179
+ end
180
+
181
+ treasure = Treasure.new
182
+ treasure.id = 1
183
+ decorated_treasure = treasure_decorator.new(treasure)
184
+
185
+ expected = PriceEstimate.where(estimate_of_type: 'Treasure', estimate_of_id: 1)
186
+ actual = PriceEstimate.where(estimate_of: decorated_treasure)
187
+
188
+ assert_equal expected.to_sql, actual.to_sql
189
+ end
190
+
191
+ def test_aliased_attribute
192
+ expected = Topic.where(heading: 'The First Topic')
193
+ actual = Topic.where(title: 'The First Topic')
194
+
195
+ assert_equal expected.to_sql, actual.to_sql
196
+ end
197
+
198
+ def test_where_error
199
+ assert_raises(ActiveRecord::StatementInvalid) do
200
+ Post.where(:id => { 'posts.author_id' => 10 }).first
201
+ end
202
+ end
203
+
204
+ def test_where_with_table_name
205
+ post = Post.first
206
+ assert_equal post, Post.where(:posts => { 'id' => post.id }).first
207
+ end
208
+
209
+ def test_where_with_table_name_and_empty_hash
210
+ assert_equal 0, Post.where(:posts => {}).count
211
+ end
212
+
213
+ def test_where_with_table_name_and_empty_array
214
+ assert_equal 0, Post.where(:id => []).count
215
+ end
216
+
217
+ def test_where_with_empty_hash_and_no_foreign_key
218
+ assert_equal 0, Edge.where(:sink => {}).count
219
+ end
220
+
221
+ def test_where_with_blank_conditions
222
+ [[], {}, nil, ""].each do |blank|
223
+ assert_equal 4, Edge.where(blank).order("sink_id").to_a.size
224
+ end
225
+ end
226
+
227
+ def test_where_with_integer_for_string_column
228
+ count = Post.where(:title => 0).count
229
+ assert_equal 0, count
230
+ end
231
+
232
+ def test_where_with_float_for_string_column
233
+ count = Post.where(:title => 0.0).count
234
+ assert_equal 0, count
235
+ end
236
+
237
+ def test_where_with_boolean_for_string_column
238
+ count = Post.where(:title => false).count
239
+ assert_equal 0, count
240
+ end
241
+
242
+ def test_where_with_decimal_for_string_column
243
+ count = Post.where(:title => BigDecimal.new(0)).count
244
+ assert_equal 0, count
245
+ end
246
+
247
+ def test_where_with_duration_for_string_column
248
+ count = Post.where(:title => 0.seconds).count
249
+ assert_equal 0, count
250
+ end
251
+
252
+ def test_where_with_integer_for_binary_column
253
+ count = Binary.where(:data => 0).count
254
+ assert_equal 0, count
255
+ end
256
+
257
+ def test_where_on_association_with_custom_primary_key
258
+ author = authors(:david)
259
+ essay = Essay.where(writer: author).first
260
+
261
+ assert_equal essays(:david_modest_proposal), essay
262
+ end
263
+
264
+ def test_where_on_association_with_custom_primary_key_with_relation
265
+ author = authors(:david)
266
+ essay = Essay.where(writer: Author.where(id: author.id)).first
267
+
268
+ assert_equal essays(:david_modest_proposal), essay
269
+ end
270
+
271
+ def test_where_on_association_with_relation_performs_subselect_not_two_queries
272
+ author = authors(:david)
273
+
274
+ assert_queries(1) do
275
+ Essay.where(writer: Author.where(id: author.id)).to_a
276
+ end
277
+ end
278
+
279
+ def test_where_on_association_with_custom_primary_key_with_array_of_base
280
+ author = authors(:david)
281
+ essay = Essay.where(writer: [author]).first
282
+
283
+ assert_equal essays(:david_modest_proposal), essay
284
+ end
285
+
286
+ def test_where_on_association_with_custom_primary_key_with_array_of_ids
287
+ essay = Essay.where(writer: ["David"]).first
288
+
289
+ assert_equal essays(:david_modest_proposal), essay
290
+ end
291
+
292
+ def test_where_with_strong_parameters
293
+ protected_params = Class.new do
294
+ attr_reader :permitted
295
+ alias :permitted? :permitted
296
+
297
+ def initialize(parameters)
298
+ @parameters = parameters
299
+ @permitted = false
300
+ end
301
+
302
+ def to_h
303
+ @parameters
304
+ end
305
+
306
+ def permit!
307
+ @permitted = true
308
+ self
309
+ end
310
+ end
311
+
312
+ author = authors(:david)
313
+ params = protected_params.new(name: author.name)
314
+ assert_raises(ActiveModel::ForbiddenAttributesError) { Author.where(params) }
315
+ assert_equal author, Author.where(params.permit!).first
316
+ end
317
+
318
+ def test_where_with_unsupported_arguments
319
+ assert_raises(ArgumentError) { Author.where(42) }
320
+ end
321
+ end
322
+ end