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,52 +1,52 @@
1
- require "cases/helper"
2
-
3
- module SchemaLoadCounter
4
- extend ActiveSupport::Concern
5
-
6
- module ClassMethods
7
- attr_accessor :load_schema_calls
8
-
9
- def load_schema!
10
- self.load_schema_calls ||= 0
11
- self.load_schema_calls +=1
12
- super
13
- end
14
- end
15
- end
16
-
17
- class SchemaLoadingTest < ActiveRecord::TestCase
18
- def test_basic_model_is_loaded_once
19
- klass = define_model
20
- klass.new
21
- assert_equal 1, klass.load_schema_calls
22
- end
23
-
24
- def test_model_with_custom_lock_is_loaded_once
25
- klass = define_model do |c|
26
- c.table_name = :lock_without_defaults_cust
27
- c.locking_column = :custom_lock_version
28
- end
29
- klass.new
30
- assert_equal 1, klass.load_schema_calls
31
- end
32
-
33
- def test_model_with_changed_custom_lock_is_loaded_twice
34
- klass = define_model do |c|
35
- c.table_name = :lock_without_defaults_cust
36
- end
37
- klass.new
38
- klass.locking_column = :custom_lock_version
39
- klass.new
40
- assert_equal 2, klass.load_schema_calls
41
- end
42
-
43
- private
44
-
45
- def define_model
46
- Class.new(ActiveRecord::Base) do
47
- include SchemaLoadCounter
48
- self.table_name = :lock_without_defaults
49
- yield self if block_given?
50
- end
51
- end
52
- end
1
+ require "cases/helper"
2
+
3
+ module SchemaLoadCounter
4
+ extend ActiveSupport::Concern
5
+
6
+ module ClassMethods
7
+ attr_accessor :load_schema_calls
8
+
9
+ def load_schema!
10
+ self.load_schema_calls ||= 0
11
+ self.load_schema_calls +=1
12
+ super
13
+ end
14
+ end
15
+ end
16
+
17
+ class SchemaLoadingTest < ActiveRecord::TestCase
18
+ def test_basic_model_is_loaded_once
19
+ klass = define_model
20
+ klass.new
21
+ assert_equal 1, klass.load_schema_calls
22
+ end
23
+
24
+ def test_model_with_custom_lock_is_loaded_once
25
+ klass = define_model do |c|
26
+ c.table_name = :lock_without_defaults_cust
27
+ c.locking_column = :custom_lock_version
28
+ end
29
+ klass.new
30
+ assert_equal 1, klass.load_schema_calls
31
+ end
32
+
33
+ def test_model_with_changed_custom_lock_is_loaded_twice
34
+ klass = define_model do |c|
35
+ c.table_name = :lock_without_defaults_cust
36
+ end
37
+ klass.new
38
+ klass.locking_column = :custom_lock_version
39
+ klass.new
40
+ assert_equal 2, klass.load_schema_calls
41
+ end
42
+
43
+ private
44
+
45
+ def define_model
46
+ Class.new(ActiveRecord::Base) do
47
+ include SchemaLoadCounter
48
+ self.table_name = :lock_without_defaults
49
+ yield self if block_given?
50
+ end
51
+ end
52
+ end
@@ -1,528 +1,528 @@
1
- require 'cases/helper'
2
- require 'models/post'
3
- require 'models/comment'
4
- require 'models/developer'
5
- require 'models/computer'
6
- require 'models/vehicle'
7
- require 'models/cat'
8
-
9
- class DefaultScopingTest < ActiveRecord::TestCase
10
- fixtures :developers, :posts, :comments
11
-
12
- def test_default_scope
13
- expected = Developer.all.merge!(:order => 'salary DESC').to_a.collect(&:salary)
14
- received = DeveloperOrderedBySalary.all.collect(&:salary)
15
- assert_equal expected, received
16
- end
17
-
18
- def test_default_scope_as_class_method
19
- assert_equal [developers(:david).becomes(ClassMethodDeveloperCalledDavid)], ClassMethodDeveloperCalledDavid.all
20
- end
21
-
22
- def test_default_scope_as_class_method_referencing_scope
23
- assert_equal [developers(:david).becomes(ClassMethodReferencingScopeDeveloperCalledDavid)], ClassMethodReferencingScopeDeveloperCalledDavid.all
24
- end
25
-
26
- def test_default_scope_as_block_referencing_scope
27
- assert_equal [developers(:david).becomes(LazyBlockReferencingScopeDeveloperCalledDavid)], LazyBlockReferencingScopeDeveloperCalledDavid.all
28
- end
29
-
30
- def test_default_scope_with_lambda
31
- assert_equal [developers(:david).becomes(LazyLambdaDeveloperCalledDavid)], LazyLambdaDeveloperCalledDavid.all
32
- end
33
-
34
- def test_default_scope_with_block
35
- assert_equal [developers(:david).becomes(LazyBlockDeveloperCalledDavid)], LazyBlockDeveloperCalledDavid.all
36
- end
37
-
38
- def test_default_scope_with_callable
39
- assert_equal [developers(:david).becomes(CallableDeveloperCalledDavid)], CallableDeveloperCalledDavid.all
40
- end
41
-
42
- def test_default_scope_is_unscoped_on_find
43
- assert_equal 1, DeveloperCalledDavid.count
44
- assert_equal 11, DeveloperCalledDavid.unscoped.count
45
- end
46
-
47
- def test_default_scope_is_unscoped_on_create
48
- assert_nil DeveloperCalledJamis.unscoped.create!.name
49
- end
50
-
51
- def test_default_scope_with_conditions_string
52
- assert_equal Developer.where(name: 'David').map(&:id).sort, DeveloperCalledDavid.all.map(&:id).sort
53
- assert_equal nil, DeveloperCalledDavid.create!.name
54
- end
55
-
56
- def test_default_scope_with_conditions_hash
57
- assert_equal Developer.where(name: 'Jamis').map(&:id).sort, DeveloperCalledJamis.all.map(&:id).sort
58
- assert_equal 'Jamis', DeveloperCalledJamis.create!.name
59
- end
60
-
61
- unless in_memory_db?
62
- def test_default_scoping_with_threads
63
- 2.times do
64
- Thread.new {
65
- assert DeveloperOrderedBySalary.all.to_sql.include?('salary DESC')
66
- DeveloperOrderedBySalary.connection.close
67
- }.join
68
- end
69
- end
70
- end
71
-
72
- def test_default_scope_with_inheritance
73
- wheres = InheritedPoorDeveloperCalledJamis.all.where_values_hash
74
- assert_equal "Jamis", wheres['name']
75
- assert_equal 50000, wheres['salary']
76
- end
77
-
78
- def test_default_scope_with_module_includes
79
- wheres = ModuleIncludedPoorDeveloperCalledJamis.all.where_values_hash
80
- assert_equal "Jamis", wheres['name']
81
- assert_equal 50000, wheres['salary']
82
- end
83
-
84
- def test_default_scope_with_multiple_calls
85
- wheres = MultiplePoorDeveloperCalledJamis.all.where_values_hash
86
- assert_equal "Jamis", wheres['name']
87
- assert_equal 50000, wheres['salary']
88
- end
89
-
90
- def test_scope_overwrites_default
91
- expected = Developer.all.merge!(order: 'salary DESC, name DESC').to_a.collect(&:name)
92
- received = DeveloperOrderedBySalary.by_name.to_a.collect(&:name)
93
- assert_equal expected, received
94
- end
95
-
96
- def test_reorder_overrides_default_scope_order
97
- expected = Developer.order('name DESC').collect(&:name)
98
- received = DeveloperOrderedBySalary.reorder('name DESC').collect(&:name)
99
- assert_equal expected, received
100
- end
101
-
102
- def test_order_after_reorder_combines_orders
103
- expected = Developer.order('name DESC, id DESC').collect { |dev| [dev.name, dev.id] }
104
- received = Developer.order('name ASC').reorder('name DESC').order('id DESC').collect { |dev| [dev.name, dev.id] }
105
- assert_equal expected, received
106
- end
107
-
108
- def test_unscope_overrides_default_scope
109
- expected = Developer.all.collect { |dev| [dev.name, dev.id] }
110
- received = DeveloperCalledJamis.unscope(:where).collect { |dev| [dev.name, dev.id] }
111
- assert_equal expected, received
112
- end
113
-
114
- def test_unscope_after_reordering_and_combining
115
- expected = Developer.order('id DESC, name DESC').collect { |dev| [dev.name, dev.id] }
116
- received = DeveloperOrderedBySalary.reorder('name DESC').unscope(:order).order('id DESC, name DESC').collect { |dev| [dev.name, dev.id] }
117
- assert_equal expected, received
118
-
119
- expected_2 = Developer.all.collect { |dev| [dev.name, dev.id] }
120
- received_2 = Developer.order('id DESC, name DESC').unscope(:order).collect { |dev| [dev.name, dev.id] }
121
- assert_equal expected_2, received_2
122
-
123
- expected_3 = Developer.all.collect { |dev| [dev.name, dev.id] }
124
- received_3 = Developer.reorder('name DESC').unscope(:order).collect { |dev| [dev.name, dev.id] }
125
- assert_equal expected_3, received_3
126
- end
127
-
128
- def test_unscope_with_where_attributes
129
- expected = Developer.order('salary DESC').collect(&:name)
130
- received = DeveloperOrderedBySalary.where(name: 'David').unscope(where: :name).collect(&:name)
131
- assert_equal expected, received
132
-
133
- expected_2 = Developer.order('salary DESC').collect(&:name)
134
- received_2 = DeveloperOrderedBySalary.select("id").where("name" => "Jamis").unscope({:where => :name}, :select).collect(&:name)
135
- assert_equal expected_2, received_2
136
-
137
- expected_3 = Developer.order('salary DESC').collect(&:name)
138
- received_3 = DeveloperOrderedBySalary.select("id").where("name" => "Jamis").unscope(:select, :where).collect(&:name)
139
- assert_equal expected_3, received_3
140
-
141
- expected_4 = Developer.order('salary DESC').collect(&:name)
142
- received_4 = DeveloperOrderedBySalary.where.not("name" => "Jamis").unscope(where: :name).collect(&:name)
143
- assert_equal expected_4, received_4
144
-
145
- expected_5 = Developer.order('salary DESC').collect(&:name)
146
- received_5 = DeveloperOrderedBySalary.where.not("name" => ["Jamis", "David"]).unscope(where: :name).collect(&:name)
147
- assert_equal expected_5, received_5
148
-
149
- expected_6 = Developer.order('salary DESC').collect(&:name)
150
- received_6 = DeveloperOrderedBySalary.where(Developer.arel_table['name'].eq('David')).unscope(where: :name).collect(&:name)
151
- assert_equal expected_6, received_6
152
-
153
- expected_7 = Developer.order('salary DESC').collect(&:name)
154
- received_7 = DeveloperOrderedBySalary.where(Developer.arel_table[:name].eq('David')).unscope(where: :name).collect(&:name)
155
- assert_equal expected_7, received_7
156
- end
157
-
158
- def test_unscope_comparison_where_clauses
159
- # unscoped for WHERE (`developers`.`id` <= 2)
160
- expected = Developer.order('salary DESC').collect(&:name)
161
- received = DeveloperOrderedBySalary.where(id: -Float::INFINITY..2).unscope(where: :id).collect { |dev| dev.name }
162
- assert_equal expected, received
163
-
164
- # unscoped for WHERE (`developers`.`id` < 2)
165
- expected = Developer.order('salary DESC').collect(&:name)
166
- received = DeveloperOrderedBySalary.where(id: -Float::INFINITY...2).unscope(where: :id).collect { |dev| dev.name }
167
- assert_equal expected, received
168
- end
169
-
170
- def test_unscope_multiple_where_clauses
171
- expected = Developer.order('salary DESC').collect(&:name)
172
- received = DeveloperOrderedBySalary.where(name: 'Jamis').where(id: 1).unscope(where: [:name, :id]).collect(&:name)
173
- assert_equal expected, received
174
- end
175
-
176
- def test_unscope_string_where_clauses_involved
177
- dev_relation = Developer.order('salary DESC').where("created_at > ?", 1.year.ago)
178
- expected = dev_relation.collect(&:name)
179
-
180
- dev_ordered_relation = DeveloperOrderedBySalary.where(name: 'Jamis').where("created_at > ?", 1.year.ago)
181
- received = dev_ordered_relation.unscope(where: [:name]).collect(&:name)
182
-
183
- assert_equal expected, received
184
- end
185
-
186
- def test_unscope_with_grouping_attributes
187
- expected = Developer.order('salary DESC').collect(&:name)
188
- received = DeveloperOrderedBySalary.group(:name).unscope(:group).collect(&:name)
189
- assert_equal expected, received
190
-
191
- expected_2 = Developer.order('salary DESC').collect(&:name)
192
- received_2 = DeveloperOrderedBySalary.group("name").unscope(:group).collect(&:name)
193
- assert_equal expected_2, received_2
194
- end
195
-
196
- def test_unscope_with_limit_in_query
197
- expected = Developer.order('salary DESC').collect(&:name)
198
- received = DeveloperOrderedBySalary.limit(1).unscope(:limit).collect(&:name)
199
- assert_equal expected, received
200
- end
201
-
202
- def test_order_to_unscope_reordering
203
- scope = DeveloperOrderedBySalary.order('salary DESC, name ASC').reverse_order.unscope(:order)
204
- assert !(scope.to_sql =~ /order/i)
205
- end
206
-
207
- def test_unscope_reverse_order
208
- expected = Developer.all.collect(&:name)
209
- received = Developer.order('salary DESC').reverse_order.unscope(:order).collect(&:name)
210
- assert_equal expected, received
211
- end
212
-
213
- def test_unscope_select
214
- expected = Developer.order('salary ASC').collect(&:name)
215
- received = Developer.order('salary DESC').reverse_order.select(:name).unscope(:select).collect(&:name)
216
- assert_equal expected, received
217
-
218
- expected_2 = Developer.all.collect(&:id)
219
- received_2 = Developer.select(:name).unscope(:select).collect(&:id)
220
- assert_equal expected_2, received_2
221
- end
222
-
223
- def test_unscope_offset
224
- expected = Developer.all.collect(&:name)
225
- received = Developer.offset(5).unscope(:offset).collect(&:name)
226
- assert_equal expected, received
227
- end
228
-
229
- def test_unscope_joins_and_select_on_developers_projects
230
- expected = Developer.all.collect(&:name)
231
- received = Developer.joins('JOIN developers_projects ON id = developer_id').select(:id).unscope(:joins, :select).collect(&:name)
232
- assert_equal expected, received
233
- end
234
-
235
- def test_unscope_includes
236
- expected = Developer.all.collect(&:name)
237
- received = Developer.includes(:projects).select(:id).unscope(:includes, :select).collect(&:name)
238
- assert_equal expected, received
239
- end
240
-
241
- def test_unscope_having
242
- expected = DeveloperOrderedBySalary.all.collect(&:name)
243
- received = DeveloperOrderedBySalary.having("name IN ('Jamis', 'David')").unscope(:having).collect(&:name)
244
- assert_equal expected, received
245
- end
246
-
247
- def test_unscope_and_scope
248
- developer_klass = Class.new(Developer) do
249
- scope :by_name, -> name { unscope(where: :name).where(name: name) }
250
- end
251
-
252
- expected = developer_klass.where(name: 'Jamis').collect { |dev| [dev.name, dev.id] }
253
- received = developer_klass.where(name: 'David').by_name('Jamis').collect { |dev| [dev.name, dev.id] }
254
- assert_equal expected, received
255
- end
256
-
257
- def test_unscope_errors_with_invalid_value
258
- assert_raises(ArgumentError) do
259
- Developer.includes(:projects).where(name: "Jamis").unscope(:stupidly_incorrect_value)
260
- end
261
-
262
- assert_raises(ArgumentError) do
263
- Developer.all.unscope(:includes, :select, :some_broken_value)
264
- end
265
-
266
- assert_raises(ArgumentError) do
267
- Developer.order('name DESC').reverse_order.unscope(:reverse_order)
268
- end
269
-
270
- assert_raises(ArgumentError) do
271
- Developer.order('name DESC').where(name: "Jamis").unscope()
272
- end
273
- end
274
-
275
- def test_unscope_errors_with_non_where_hash_keys
276
- assert_raises(ArgumentError) do
277
- Developer.where(name: "Jamis").limit(4).unscope(limit: 4)
278
- end
279
-
280
- assert_raises(ArgumentError) do
281
- Developer.where(name: "Jamis").unscope("where" => :name)
282
- end
283
- end
284
-
285
- def test_unscope_errors_with_non_symbol_or_hash_arguments
286
- assert_raises(ArgumentError) do
287
- Developer.where(name: "Jamis").limit(3).unscope("limit")
288
- end
289
-
290
- assert_raises(ArgumentError) do
291
- Developer.select("id").unscope("select")
292
- end
293
-
294
- assert_raises(ArgumentError) do
295
- Developer.select("id").unscope(5)
296
- end
297
- end
298
-
299
- def test_unscope_merging
300
- merged = Developer.where(name: "Jamis").merge(Developer.unscope(:where))
301
- assert merged.where_clause.empty?
302
- assert !merged.where(name: "Jon").where_clause.empty?
303
- end
304
-
305
- def test_order_in_default_scope_should_not_prevail
306
- expected = Developer.all.merge!(order: 'salary desc').to_a.collect(&:salary)
307
- received = DeveloperOrderedBySalary.all.merge!(order: 'salary').to_a.collect(&:salary)
308
- assert_equal expected, received
309
- end
310
-
311
- def test_create_attribute_overwrites_default_scoping
312
- assert_equal 'David', PoorDeveloperCalledJamis.create!(:name => 'David').name
313
- assert_equal 200000, PoorDeveloperCalledJamis.create!(:name => 'David', :salary => 200000).salary
314
- end
315
-
316
- def test_create_attribute_overwrites_default_values
317
- assert_equal nil, PoorDeveloperCalledJamis.create!(:salary => nil).salary
318
- assert_equal 50000, PoorDeveloperCalledJamis.create!(:name => 'David').salary
319
- end
320
-
321
- def test_default_scope_attribute
322
- jamis = PoorDeveloperCalledJamis.new(:name => 'David')
323
- assert_equal 50000, jamis.salary
324
- end
325
-
326
- def test_where_attribute
327
- aaron = PoorDeveloperCalledJamis.where(:salary => 20).new(:name => 'Aaron')
328
- assert_equal 20, aaron.salary
329
- assert_equal 'Aaron', aaron.name
330
- end
331
-
332
- def test_where_attribute_merge
333
- aaron = PoorDeveloperCalledJamis.where(:name => 'foo').new(:name => 'Aaron')
334
- assert_equal 'Aaron', aaron.name
335
- end
336
-
337
- def test_scope_composed_by_limit_and_then_offset_is_equal_to_scope_composed_by_offset_and_then_limit
338
- posts_limit_offset = Post.limit(3).offset(2)
339
- posts_offset_limit = Post.offset(2).limit(3)
340
- assert_equal posts_limit_offset, posts_offset_limit
341
- end
342
-
343
- def test_create_with_merge
344
- aaron = PoorDeveloperCalledJamis.create_with(:name => 'foo', :salary => 20).merge(
345
- PoorDeveloperCalledJamis.create_with(:name => 'Aaron')).new
346
- assert_equal 20, aaron.salary
347
- assert_equal 'Aaron', aaron.name
348
-
349
- aaron = PoorDeveloperCalledJamis.create_with(:name => 'foo', :salary => 20).
350
- create_with(:name => 'Aaron').new
351
- assert_equal 20, aaron.salary
352
- assert_equal 'Aaron', aaron.name
353
- end
354
-
355
- def test_create_with_reset
356
- jamis = PoorDeveloperCalledJamis.create_with(:name => 'Aaron').create_with(nil).new
357
- assert_equal 'Jamis', jamis.name
358
- end
359
-
360
- # FIXME: I don't know if this is *desired* behavior, but it is *today's*
361
- # behavior.
362
- def test_create_with_empty_hash_will_not_reset
363
- jamis = PoorDeveloperCalledJamis.create_with(:name => 'Aaron').create_with({}).new
364
- assert_equal 'Aaron', jamis.name
365
- end
366
-
367
- def test_unscoped_with_named_scope_should_not_have_default_scope
368
- assert_equal [DeveloperCalledJamis.find(developers(:poor_jamis).id)], DeveloperCalledJamis.poor
369
-
370
- assert DeveloperCalledJamis.unscoped.poor.include?(developers(:david).becomes(DeveloperCalledJamis))
371
-
372
- assert_equal 11, DeveloperCalledJamis.unscoped.length
373
- assert_equal 1, DeveloperCalledJamis.poor.length
374
- assert_equal 10, DeveloperCalledJamis.unscoped.poor.length
375
- assert_equal 10, DeveloperCalledJamis.unscoped { DeveloperCalledJamis.poor }.length
376
- end
377
-
378
- def test_default_scope_with_joins
379
- assert_equal Comment.where(post_id: SpecialPostWithDefaultScope.pluck(:id)).count,
380
- Comment.joins(:special_post_with_default_scope).count
381
- assert_equal Comment.where(post_id: Post.pluck(:id)).count,
382
- Comment.joins(:post).count
383
- end
384
-
385
- def test_joins_not_affected_by_scope_other_than_default_or_unscoped
386
- without_scope_on_post = Comment.joins(:post).to_a
387
- with_scope_on_post = nil
388
- Post.where(id: [1, 5, 6]).scoping do
389
- with_scope_on_post = Comment.joins(:post).to_a
390
- end
391
-
392
- assert_equal with_scope_on_post, without_scope_on_post
393
- end
394
-
395
- def test_unscoped_with_joins_should_not_have_default_scope
396
- assert_equal SpecialPostWithDefaultScope.unscoped { Comment.joins(:special_post_with_default_scope).to_a },
397
- Comment.joins(:post).to_a
398
- end
399
-
400
- def test_sti_association_with_unscoped_not_affected_by_default_scope
401
- post = posts(:thinking)
402
- comments = [comments(:does_it_hurt)]
403
-
404
- post.special_comments.update_all(deleted_at: Time.now)
405
-
406
- assert_raises(ActiveRecord::RecordNotFound) { Post.joins(:special_comments).find(post.id) }
407
- assert_equal [], post.special_comments
408
-
409
- SpecialComment.unscoped do
410
- assert_equal post, Post.joins(:special_comments).find(post.id)
411
- assert_equal comments, Post.joins(:special_comments).find(post.id).special_comments
412
- assert_equal comments, Post.eager_load(:special_comments).find(post.id).special_comments
413
- assert_equal comments, Post.includes(:special_comments).find(post.id).special_comments
414
- assert_equal comments, Post.preload(:special_comments).find(post.id).special_comments
415
- end
416
- end
417
-
418
- def test_default_scope_select_ignored_by_aggregations
419
- assert_equal DeveloperWithSelect.all.to_a.count, DeveloperWithSelect.count
420
- end
421
-
422
- def test_default_scope_select_ignored_by_grouped_aggregations
423
- assert_equal Hash[Developer.all.group_by(&:salary).map { |s, d| [s, d.count] }],
424
- DeveloperWithSelect.group(:salary).count
425
- end
426
-
427
- def test_default_scope_order_ignored_by_aggregations
428
- assert_equal DeveloperOrderedBySalary.all.count, DeveloperOrderedBySalary.count
429
- end
430
-
431
- def test_default_scope_find_last
432
- assert DeveloperOrderedBySalary.count > 1, "need more than one row for test"
433
-
434
- lowest_salary_dev = DeveloperOrderedBySalary.find(developers(:poor_jamis).id)
435
- assert_equal lowest_salary_dev, DeveloperOrderedBySalary.last
436
- end
437
-
438
- def test_default_scope_include_with_count
439
- d = DeveloperWithIncludes.create!
440
- d.audit_logs.create! :message => 'foo'
441
-
442
- assert_equal 1, DeveloperWithIncludes.where(:audit_logs => { :message => 'foo' }).count
443
- end
444
-
445
- def test_default_scope_with_references_works_through_collection_association
446
- post = PostWithCommentWithDefaultScopeReferencesAssociation.create!(title: "Hello World", body: "Here we go.")
447
- comment = post.comment_with_default_scope_references_associations.create!(body: "Great post.", developer_id: Developer.first.id)
448
- assert_equal comment, post.comment_with_default_scope_references_associations.to_a.first
449
- end
450
-
451
- def test_default_scope_with_references_works_through_association
452
- post = PostWithCommentWithDefaultScopeReferencesAssociation.create!(title: "Hello World", body: "Here we go.")
453
- comment = post.comment_with_default_scope_references_associations.create!(body: "Great post.", developer_id: Developer.first.id)
454
- assert_equal comment, post.first_comment
455
- end
456
-
457
- def test_default_scope_with_references_works_with_find_by
458
- post = PostWithCommentWithDefaultScopeReferencesAssociation.create!(title: "Hello World", body: "Here we go.")
459
- comment = post.comment_with_default_scope_references_associations.create!(body: "Great post.", developer_id: Developer.first.id)
460
- assert_equal comment, CommentWithDefaultScopeReferencesAssociation.find_by(id: comment.id)
461
- end
462
-
463
- unless in_memory_db?
464
- def test_default_scope_is_threadsafe
465
- threads = []
466
- assert_not_equal 1, ThreadsafeDeveloper.unscoped.count
467
-
468
- threads << Thread.new do
469
- Thread.current[:long_default_scope] = true
470
- assert_equal 1, ThreadsafeDeveloper.all.to_a.count
471
- ThreadsafeDeveloper.connection.close
472
- end
473
- threads << Thread.new do
474
- assert_equal 1, ThreadsafeDeveloper.all.to_a.count
475
- ThreadsafeDeveloper.connection.close
476
- end
477
- threads.each(&:join)
478
- end
479
- end
480
-
481
- test "additional conditions are ANDed with the default scope" do
482
- scope = DeveloperCalledJamis.where(name: "David")
483
- assert_equal 2, scope.where_clause.ast.children.length
484
- assert_equal [], scope.to_a
485
- end
486
-
487
- test "additional conditions in a scope are ANDed with the default scope" do
488
- scope = DeveloperCalledJamis.david
489
- assert_equal 2, scope.where_clause.ast.children.length
490
- assert_equal [], scope.to_a
491
- end
492
-
493
- test "a scope can remove the condition from the default scope" do
494
- scope = DeveloperCalledJamis.david2
495
- assert_equal 1, scope.where_clause.ast.children.length
496
- assert_equal Developer.where(name: "David"), scope
497
- end
498
-
499
- def test_with_abstract_class_where_clause_should_not_be_duplicated
500
- scope = Bus.all
501
- assert_equal scope.where_clause.ast.children.length, 1
502
- end
503
-
504
- def test_sti_conditions_are_not_carried_in_default_scope
505
- ConditionalStiPost.create! body: ''
506
- SubConditionalStiPost.create! body: ''
507
- SubConditionalStiPost.create! title: 'Hello world', body: ''
508
-
509
- assert_equal 2, ConditionalStiPost.count
510
- assert_equal 2, ConditionalStiPost.all.to_a.size
511
- assert_equal 3, ConditionalStiPost.unscope(where: :title).to_a.size
512
-
513
- assert_equal 1, SubConditionalStiPost.count
514
- assert_equal 1, SubConditionalStiPost.all.to_a.size
515
- assert_equal 2, SubConditionalStiPost.unscope(where: :title).to_a.size
516
- end
517
-
518
- def test_with_abstract_class_scope_should_be_executed_in_correct_context
519
- vegetarian_pattern, gender_pattern = if current_adapter?(:Mysql2Adapter)
520
- [/`lions`.`is_vegetarian`/, /`lions`.`gender`/]
521
- else
522
- [/"lions"."is_vegetarian"/, /"lions"."gender"/]
523
- end
524
-
525
- assert_match vegetarian_pattern, Lion.all.to_sql
526
- assert_match gender_pattern, Lion.female.to_sql
527
- end
528
- end
1
+ require 'cases/helper'
2
+ require 'models/post'
3
+ require 'models/comment'
4
+ require 'models/developer'
5
+ require 'models/computer'
6
+ require 'models/vehicle'
7
+ require 'models/cat'
8
+
9
+ class DefaultScopingTest < ActiveRecord::TestCase
10
+ fixtures :developers, :posts, :comments
11
+
12
+ def test_default_scope
13
+ expected = Developer.all.merge!(:order => 'salary DESC').to_a.collect(&:salary)
14
+ received = DeveloperOrderedBySalary.all.collect(&:salary)
15
+ assert_equal expected, received
16
+ end
17
+
18
+ def test_default_scope_as_class_method
19
+ assert_equal [developers(:david).becomes(ClassMethodDeveloperCalledDavid)], ClassMethodDeveloperCalledDavid.all
20
+ end
21
+
22
+ def test_default_scope_as_class_method_referencing_scope
23
+ assert_equal [developers(:david).becomes(ClassMethodReferencingScopeDeveloperCalledDavid)], ClassMethodReferencingScopeDeveloperCalledDavid.all
24
+ end
25
+
26
+ def test_default_scope_as_block_referencing_scope
27
+ assert_equal [developers(:david).becomes(LazyBlockReferencingScopeDeveloperCalledDavid)], LazyBlockReferencingScopeDeveloperCalledDavid.all
28
+ end
29
+
30
+ def test_default_scope_with_lambda
31
+ assert_equal [developers(:david).becomes(LazyLambdaDeveloperCalledDavid)], LazyLambdaDeveloperCalledDavid.all
32
+ end
33
+
34
+ def test_default_scope_with_block
35
+ assert_equal [developers(:david).becomes(LazyBlockDeveloperCalledDavid)], LazyBlockDeveloperCalledDavid.all
36
+ end
37
+
38
+ def test_default_scope_with_callable
39
+ assert_equal [developers(:david).becomes(CallableDeveloperCalledDavid)], CallableDeveloperCalledDavid.all
40
+ end
41
+
42
+ def test_default_scope_is_unscoped_on_find
43
+ assert_equal 1, DeveloperCalledDavid.count
44
+ assert_equal 11, DeveloperCalledDavid.unscoped.count
45
+ end
46
+
47
+ def test_default_scope_is_unscoped_on_create
48
+ assert_nil DeveloperCalledJamis.unscoped.create!.name
49
+ end
50
+
51
+ def test_default_scope_with_conditions_string
52
+ assert_equal Developer.where(name: 'David').map(&:id).sort, DeveloperCalledDavid.all.map(&:id).sort
53
+ assert_equal nil, DeveloperCalledDavid.create!.name
54
+ end
55
+
56
+ def test_default_scope_with_conditions_hash
57
+ assert_equal Developer.where(name: 'Jamis').map(&:id).sort, DeveloperCalledJamis.all.map(&:id).sort
58
+ assert_equal 'Jamis', DeveloperCalledJamis.create!.name
59
+ end
60
+
61
+ unless in_memory_db?
62
+ def test_default_scoping_with_threads
63
+ 2.times do
64
+ Thread.new {
65
+ assert DeveloperOrderedBySalary.all.to_sql.include?('salary DESC')
66
+ DeveloperOrderedBySalary.connection.close
67
+ }.join
68
+ end
69
+ end
70
+ end
71
+
72
+ def test_default_scope_with_inheritance
73
+ wheres = InheritedPoorDeveloperCalledJamis.all.where_values_hash
74
+ assert_equal "Jamis", wheres['name']
75
+ assert_equal 50000, wheres['salary']
76
+ end
77
+
78
+ def test_default_scope_with_module_includes
79
+ wheres = ModuleIncludedPoorDeveloperCalledJamis.all.where_values_hash
80
+ assert_equal "Jamis", wheres['name']
81
+ assert_equal 50000, wheres['salary']
82
+ end
83
+
84
+ def test_default_scope_with_multiple_calls
85
+ wheres = MultiplePoorDeveloperCalledJamis.all.where_values_hash
86
+ assert_equal "Jamis", wheres['name']
87
+ assert_equal 50000, wheres['salary']
88
+ end
89
+
90
+ def test_scope_overwrites_default
91
+ expected = Developer.all.merge!(order: 'salary DESC, name DESC').to_a.collect(&:name)
92
+ received = DeveloperOrderedBySalary.by_name.to_a.collect(&:name)
93
+ assert_equal expected, received
94
+ end
95
+
96
+ def test_reorder_overrides_default_scope_order
97
+ expected = Developer.order('name DESC').collect(&:name)
98
+ received = DeveloperOrderedBySalary.reorder('name DESC').collect(&:name)
99
+ assert_equal expected, received
100
+ end
101
+
102
+ def test_order_after_reorder_combines_orders
103
+ expected = Developer.order('name DESC, id DESC').collect { |dev| [dev.name, dev.id] }
104
+ received = Developer.order('name ASC').reorder('name DESC').order('id DESC').collect { |dev| [dev.name, dev.id] }
105
+ assert_equal expected, received
106
+ end
107
+
108
+ def test_unscope_overrides_default_scope
109
+ expected = Developer.all.collect { |dev| [dev.name, dev.id] }
110
+ received = DeveloperCalledJamis.unscope(:where).collect { |dev| [dev.name, dev.id] }
111
+ assert_equal expected, received
112
+ end
113
+
114
+ def test_unscope_after_reordering_and_combining
115
+ expected = Developer.order('id DESC, name DESC').collect { |dev| [dev.name, dev.id] }
116
+ received = DeveloperOrderedBySalary.reorder('name DESC').unscope(:order).order('id DESC, name DESC').collect { |dev| [dev.name, dev.id] }
117
+ assert_equal expected, received
118
+
119
+ expected_2 = Developer.all.collect { |dev| [dev.name, dev.id] }
120
+ received_2 = Developer.order('id DESC, name DESC').unscope(:order).collect { |dev| [dev.name, dev.id] }
121
+ assert_equal expected_2, received_2
122
+
123
+ expected_3 = Developer.all.collect { |dev| [dev.name, dev.id] }
124
+ received_3 = Developer.reorder('name DESC').unscope(:order).collect { |dev| [dev.name, dev.id] }
125
+ assert_equal expected_3, received_3
126
+ end
127
+
128
+ def test_unscope_with_where_attributes
129
+ expected = Developer.order('salary DESC').collect(&:name)
130
+ received = DeveloperOrderedBySalary.where(name: 'David').unscope(where: :name).collect(&:name)
131
+ assert_equal expected, received
132
+
133
+ expected_2 = Developer.order('salary DESC').collect(&:name)
134
+ received_2 = DeveloperOrderedBySalary.select("id").where("name" => "Jamis").unscope({:where => :name}, :select).collect(&:name)
135
+ assert_equal expected_2, received_2
136
+
137
+ expected_3 = Developer.order('salary DESC').collect(&:name)
138
+ received_3 = DeveloperOrderedBySalary.select("id").where("name" => "Jamis").unscope(:select, :where).collect(&:name)
139
+ assert_equal expected_3, received_3
140
+
141
+ expected_4 = Developer.order('salary DESC').collect(&:name)
142
+ received_4 = DeveloperOrderedBySalary.where.not("name" => "Jamis").unscope(where: :name).collect(&:name)
143
+ assert_equal expected_4, received_4
144
+
145
+ expected_5 = Developer.order('salary DESC').collect(&:name)
146
+ received_5 = DeveloperOrderedBySalary.where.not("name" => ["Jamis", "David"]).unscope(where: :name).collect(&:name)
147
+ assert_equal expected_5, received_5
148
+
149
+ expected_6 = Developer.order('salary DESC').collect(&:name)
150
+ received_6 = DeveloperOrderedBySalary.where(Developer.arel_table['name'].eq('David')).unscope(where: :name).collect(&:name)
151
+ assert_equal expected_6, received_6
152
+
153
+ expected_7 = Developer.order('salary DESC').collect(&:name)
154
+ received_7 = DeveloperOrderedBySalary.where(Developer.arel_table[:name].eq('David')).unscope(where: :name).collect(&:name)
155
+ assert_equal expected_7, received_7
156
+ end
157
+
158
+ def test_unscope_comparison_where_clauses
159
+ # unscoped for WHERE (`developers`.`id` <= 2)
160
+ expected = Developer.order('salary DESC').collect(&:name)
161
+ received = DeveloperOrderedBySalary.where(id: -Float::INFINITY..2).unscope(where: :id).collect { |dev| dev.name }
162
+ assert_equal expected, received
163
+
164
+ # unscoped for WHERE (`developers`.`id` < 2)
165
+ expected = Developer.order('salary DESC').collect(&:name)
166
+ received = DeveloperOrderedBySalary.where(id: -Float::INFINITY...2).unscope(where: :id).collect { |dev| dev.name }
167
+ assert_equal expected, received
168
+ end
169
+
170
+ def test_unscope_multiple_where_clauses
171
+ expected = Developer.order('salary DESC').collect(&:name)
172
+ received = DeveloperOrderedBySalary.where(name: 'Jamis').where(id: 1).unscope(where: [:name, :id]).collect(&:name)
173
+ assert_equal expected, received
174
+ end
175
+
176
+ def test_unscope_string_where_clauses_involved
177
+ dev_relation = Developer.order('salary DESC').where("created_at > ?", 1.year.ago)
178
+ expected = dev_relation.collect(&:name)
179
+
180
+ dev_ordered_relation = DeveloperOrderedBySalary.where(name: 'Jamis').where("created_at > ?", 1.year.ago)
181
+ received = dev_ordered_relation.unscope(where: [:name]).collect(&:name)
182
+
183
+ assert_equal expected, received
184
+ end
185
+
186
+ def test_unscope_with_grouping_attributes
187
+ expected = Developer.order('salary DESC').collect(&:name)
188
+ received = DeveloperOrderedBySalary.group(:name).unscope(:group).collect(&:name)
189
+ assert_equal expected, received
190
+
191
+ expected_2 = Developer.order('salary DESC').collect(&:name)
192
+ received_2 = DeveloperOrderedBySalary.group("name").unscope(:group).collect(&:name)
193
+ assert_equal expected_2, received_2
194
+ end
195
+
196
+ def test_unscope_with_limit_in_query
197
+ expected = Developer.order('salary DESC').collect(&:name)
198
+ received = DeveloperOrderedBySalary.limit(1).unscope(:limit).collect(&:name)
199
+ assert_equal expected, received
200
+ end
201
+
202
+ def test_order_to_unscope_reordering
203
+ scope = DeveloperOrderedBySalary.order('salary DESC, name ASC').reverse_order.unscope(:order)
204
+ assert !(scope.to_sql =~ /order/i)
205
+ end
206
+
207
+ def test_unscope_reverse_order
208
+ expected = Developer.all.collect(&:name)
209
+ received = Developer.order('salary DESC').reverse_order.unscope(:order).collect(&:name)
210
+ assert_equal expected, received
211
+ end
212
+
213
+ def test_unscope_select
214
+ expected = Developer.order('salary ASC').collect(&:name)
215
+ received = Developer.order('salary DESC').reverse_order.select(:name).unscope(:select).collect(&:name)
216
+ assert_equal expected, received
217
+
218
+ expected_2 = Developer.all.collect(&:id)
219
+ received_2 = Developer.select(:name).unscope(:select).collect(&:id)
220
+ assert_equal expected_2, received_2
221
+ end
222
+
223
+ def test_unscope_offset
224
+ expected = Developer.all.collect(&:name)
225
+ received = Developer.offset(5).unscope(:offset).collect(&:name)
226
+ assert_equal expected, received
227
+ end
228
+
229
+ def test_unscope_joins_and_select_on_developers_projects
230
+ expected = Developer.all.collect(&:name)
231
+ received = Developer.joins('JOIN developers_projects ON id = developer_id').select(:id).unscope(:joins, :select).collect(&:name)
232
+ assert_equal expected, received
233
+ end
234
+
235
+ def test_unscope_includes
236
+ expected = Developer.all.collect(&:name)
237
+ received = Developer.includes(:projects).select(:id).unscope(:includes, :select).collect(&:name)
238
+ assert_equal expected, received
239
+ end
240
+
241
+ def test_unscope_having
242
+ expected = DeveloperOrderedBySalary.all.collect(&:name)
243
+ received = DeveloperOrderedBySalary.having("name IN ('Jamis', 'David')").unscope(:having).collect(&:name)
244
+ assert_equal expected, received
245
+ end
246
+
247
+ def test_unscope_and_scope
248
+ developer_klass = Class.new(Developer) do
249
+ scope :by_name, -> name { unscope(where: :name).where(name: name) }
250
+ end
251
+
252
+ expected = developer_klass.where(name: 'Jamis').collect { |dev| [dev.name, dev.id] }
253
+ received = developer_klass.where(name: 'David').by_name('Jamis').collect { |dev| [dev.name, dev.id] }
254
+ assert_equal expected, received
255
+ end
256
+
257
+ def test_unscope_errors_with_invalid_value
258
+ assert_raises(ArgumentError) do
259
+ Developer.includes(:projects).where(name: "Jamis").unscope(:stupidly_incorrect_value)
260
+ end
261
+
262
+ assert_raises(ArgumentError) do
263
+ Developer.all.unscope(:includes, :select, :some_broken_value)
264
+ end
265
+
266
+ assert_raises(ArgumentError) do
267
+ Developer.order('name DESC').reverse_order.unscope(:reverse_order)
268
+ end
269
+
270
+ assert_raises(ArgumentError) do
271
+ Developer.order('name DESC').where(name: "Jamis").unscope()
272
+ end
273
+ end
274
+
275
+ def test_unscope_errors_with_non_where_hash_keys
276
+ assert_raises(ArgumentError) do
277
+ Developer.where(name: "Jamis").limit(4).unscope(limit: 4)
278
+ end
279
+
280
+ assert_raises(ArgumentError) do
281
+ Developer.where(name: "Jamis").unscope("where" => :name)
282
+ end
283
+ end
284
+
285
+ def test_unscope_errors_with_non_symbol_or_hash_arguments
286
+ assert_raises(ArgumentError) do
287
+ Developer.where(name: "Jamis").limit(3).unscope("limit")
288
+ end
289
+
290
+ assert_raises(ArgumentError) do
291
+ Developer.select("id").unscope("select")
292
+ end
293
+
294
+ assert_raises(ArgumentError) do
295
+ Developer.select("id").unscope(5)
296
+ end
297
+ end
298
+
299
+ def test_unscope_merging
300
+ merged = Developer.where(name: "Jamis").merge(Developer.unscope(:where))
301
+ assert merged.where_clause.empty?
302
+ assert !merged.where(name: "Jon").where_clause.empty?
303
+ end
304
+
305
+ def test_order_in_default_scope_should_not_prevail
306
+ expected = Developer.all.merge!(order: 'salary desc').to_a.collect(&:salary)
307
+ received = DeveloperOrderedBySalary.all.merge!(order: 'salary').to_a.collect(&:salary)
308
+ assert_equal expected, received
309
+ end
310
+
311
+ def test_create_attribute_overwrites_default_scoping
312
+ assert_equal 'David', PoorDeveloperCalledJamis.create!(:name => 'David').name
313
+ assert_equal 200000, PoorDeveloperCalledJamis.create!(:name => 'David', :salary => 200000).salary
314
+ end
315
+
316
+ def test_create_attribute_overwrites_default_values
317
+ assert_equal nil, PoorDeveloperCalledJamis.create!(:salary => nil).salary
318
+ assert_equal 50000, PoorDeveloperCalledJamis.create!(:name => 'David').salary
319
+ end
320
+
321
+ def test_default_scope_attribute
322
+ jamis = PoorDeveloperCalledJamis.new(:name => 'David')
323
+ assert_equal 50000, jamis.salary
324
+ end
325
+
326
+ def test_where_attribute
327
+ aaron = PoorDeveloperCalledJamis.where(:salary => 20).new(:name => 'Aaron')
328
+ assert_equal 20, aaron.salary
329
+ assert_equal 'Aaron', aaron.name
330
+ end
331
+
332
+ def test_where_attribute_merge
333
+ aaron = PoorDeveloperCalledJamis.where(:name => 'foo').new(:name => 'Aaron')
334
+ assert_equal 'Aaron', aaron.name
335
+ end
336
+
337
+ def test_scope_composed_by_limit_and_then_offset_is_equal_to_scope_composed_by_offset_and_then_limit
338
+ posts_limit_offset = Post.limit(3).offset(2)
339
+ posts_offset_limit = Post.offset(2).limit(3)
340
+ assert_equal posts_limit_offset, posts_offset_limit
341
+ end
342
+
343
+ def test_create_with_merge
344
+ aaron = PoorDeveloperCalledJamis.create_with(:name => 'foo', :salary => 20).merge(
345
+ PoorDeveloperCalledJamis.create_with(:name => 'Aaron')).new
346
+ assert_equal 20, aaron.salary
347
+ assert_equal 'Aaron', aaron.name
348
+
349
+ aaron = PoorDeveloperCalledJamis.create_with(:name => 'foo', :salary => 20).
350
+ create_with(:name => 'Aaron').new
351
+ assert_equal 20, aaron.salary
352
+ assert_equal 'Aaron', aaron.name
353
+ end
354
+
355
+ def test_create_with_reset
356
+ jamis = PoorDeveloperCalledJamis.create_with(:name => 'Aaron').create_with(nil).new
357
+ assert_equal 'Jamis', jamis.name
358
+ end
359
+
360
+ # FIXME: I don't know if this is *desired* behavior, but it is *today's*
361
+ # behavior.
362
+ def test_create_with_empty_hash_will_not_reset
363
+ jamis = PoorDeveloperCalledJamis.create_with(:name => 'Aaron').create_with({}).new
364
+ assert_equal 'Aaron', jamis.name
365
+ end
366
+
367
+ def test_unscoped_with_named_scope_should_not_have_default_scope
368
+ assert_equal [DeveloperCalledJamis.find(developers(:poor_jamis).id)], DeveloperCalledJamis.poor
369
+
370
+ assert DeveloperCalledJamis.unscoped.poor.include?(developers(:david).becomes(DeveloperCalledJamis))
371
+
372
+ assert_equal 11, DeveloperCalledJamis.unscoped.length
373
+ assert_equal 1, DeveloperCalledJamis.poor.length
374
+ assert_equal 10, DeveloperCalledJamis.unscoped.poor.length
375
+ assert_equal 10, DeveloperCalledJamis.unscoped { DeveloperCalledJamis.poor }.length
376
+ end
377
+
378
+ def test_default_scope_with_joins
379
+ assert_equal Comment.where(post_id: SpecialPostWithDefaultScope.pluck(:id)).count,
380
+ Comment.joins(:special_post_with_default_scope).count
381
+ assert_equal Comment.where(post_id: Post.pluck(:id)).count,
382
+ Comment.joins(:post).count
383
+ end
384
+
385
+ def test_joins_not_affected_by_scope_other_than_default_or_unscoped
386
+ without_scope_on_post = Comment.joins(:post).to_a
387
+ with_scope_on_post = nil
388
+ Post.where(id: [1, 5, 6]).scoping do
389
+ with_scope_on_post = Comment.joins(:post).to_a
390
+ end
391
+
392
+ assert_equal with_scope_on_post, without_scope_on_post
393
+ end
394
+
395
+ def test_unscoped_with_joins_should_not_have_default_scope
396
+ assert_equal SpecialPostWithDefaultScope.unscoped { Comment.joins(:special_post_with_default_scope).to_a },
397
+ Comment.joins(:post).to_a
398
+ end
399
+
400
+ def test_sti_association_with_unscoped_not_affected_by_default_scope
401
+ post = posts(:thinking)
402
+ comments = [comments(:does_it_hurt)]
403
+
404
+ post.special_comments.update_all(deleted_at: Time.now)
405
+
406
+ assert_raises(ActiveRecord::RecordNotFound) { Post.joins(:special_comments).find(post.id) }
407
+ assert_equal [], post.special_comments
408
+
409
+ SpecialComment.unscoped do
410
+ assert_equal post, Post.joins(:special_comments).find(post.id)
411
+ assert_equal comments, Post.joins(:special_comments).find(post.id).special_comments
412
+ assert_equal comments, Post.eager_load(:special_comments).find(post.id).special_comments
413
+ assert_equal comments, Post.includes(:special_comments).find(post.id).special_comments
414
+ assert_equal comments, Post.preload(:special_comments).find(post.id).special_comments
415
+ end
416
+ end
417
+
418
+ def test_default_scope_select_ignored_by_aggregations
419
+ assert_equal DeveloperWithSelect.all.to_a.count, DeveloperWithSelect.count
420
+ end
421
+
422
+ def test_default_scope_select_ignored_by_grouped_aggregations
423
+ assert_equal Hash[Developer.all.group_by(&:salary).map { |s, d| [s, d.count] }],
424
+ DeveloperWithSelect.group(:salary).count
425
+ end
426
+
427
+ def test_default_scope_order_ignored_by_aggregations
428
+ assert_equal DeveloperOrderedBySalary.all.count, DeveloperOrderedBySalary.count
429
+ end
430
+
431
+ def test_default_scope_find_last
432
+ assert DeveloperOrderedBySalary.count > 1, "need more than one row for test"
433
+
434
+ lowest_salary_dev = DeveloperOrderedBySalary.find(developers(:poor_jamis).id)
435
+ assert_equal lowest_salary_dev, DeveloperOrderedBySalary.last
436
+ end
437
+
438
+ def test_default_scope_include_with_count
439
+ d = DeveloperWithIncludes.create!
440
+ d.audit_logs.create! :message => 'foo'
441
+
442
+ assert_equal 1, DeveloperWithIncludes.where(:audit_logs => { :message => 'foo' }).count
443
+ end
444
+
445
+ def test_default_scope_with_references_works_through_collection_association
446
+ post = PostWithCommentWithDefaultScopeReferencesAssociation.create!(title: "Hello World", body: "Here we go.")
447
+ comment = post.comment_with_default_scope_references_associations.create!(body: "Great post.", developer_id: Developer.first.id)
448
+ assert_equal comment, post.comment_with_default_scope_references_associations.to_a.first
449
+ end
450
+
451
+ def test_default_scope_with_references_works_through_association
452
+ post = PostWithCommentWithDefaultScopeReferencesAssociation.create!(title: "Hello World", body: "Here we go.")
453
+ comment = post.comment_with_default_scope_references_associations.create!(body: "Great post.", developer_id: Developer.first.id)
454
+ assert_equal comment, post.first_comment
455
+ end
456
+
457
+ def test_default_scope_with_references_works_with_find_by
458
+ post = PostWithCommentWithDefaultScopeReferencesAssociation.create!(title: "Hello World", body: "Here we go.")
459
+ comment = post.comment_with_default_scope_references_associations.create!(body: "Great post.", developer_id: Developer.first.id)
460
+ assert_equal comment, CommentWithDefaultScopeReferencesAssociation.find_by(id: comment.id)
461
+ end
462
+
463
+ unless in_memory_db?
464
+ def test_default_scope_is_threadsafe
465
+ threads = []
466
+ assert_not_equal 1, ThreadsafeDeveloper.unscoped.count
467
+
468
+ threads << Thread.new do
469
+ Thread.current[:long_default_scope] = true
470
+ assert_equal 1, ThreadsafeDeveloper.all.to_a.count
471
+ ThreadsafeDeveloper.connection.close
472
+ end
473
+ threads << Thread.new do
474
+ assert_equal 1, ThreadsafeDeveloper.all.to_a.count
475
+ ThreadsafeDeveloper.connection.close
476
+ end
477
+ threads.each(&:join)
478
+ end
479
+ end
480
+
481
+ test "additional conditions are ANDed with the default scope" do
482
+ scope = DeveloperCalledJamis.where(name: "David")
483
+ assert_equal 2, scope.where_clause.ast.children.length
484
+ assert_equal [], scope.to_a
485
+ end
486
+
487
+ test "additional conditions in a scope are ANDed with the default scope" do
488
+ scope = DeveloperCalledJamis.david
489
+ assert_equal 2, scope.where_clause.ast.children.length
490
+ assert_equal [], scope.to_a
491
+ end
492
+
493
+ test "a scope can remove the condition from the default scope" do
494
+ scope = DeveloperCalledJamis.david2
495
+ assert_equal 1, scope.where_clause.ast.children.length
496
+ assert_equal Developer.where(name: "David"), scope
497
+ end
498
+
499
+ def test_with_abstract_class_where_clause_should_not_be_duplicated
500
+ scope = Bus.all
501
+ assert_equal scope.where_clause.ast.children.length, 1
502
+ end
503
+
504
+ def test_sti_conditions_are_not_carried_in_default_scope
505
+ ConditionalStiPost.create! body: ''
506
+ SubConditionalStiPost.create! body: ''
507
+ SubConditionalStiPost.create! title: 'Hello world', body: ''
508
+
509
+ assert_equal 2, ConditionalStiPost.count
510
+ assert_equal 2, ConditionalStiPost.all.to_a.size
511
+ assert_equal 3, ConditionalStiPost.unscope(where: :title).to_a.size
512
+
513
+ assert_equal 1, SubConditionalStiPost.count
514
+ assert_equal 1, SubConditionalStiPost.all.to_a.size
515
+ assert_equal 2, SubConditionalStiPost.unscope(where: :title).to_a.size
516
+ end
517
+
518
+ def test_with_abstract_class_scope_should_be_executed_in_correct_context
519
+ vegetarian_pattern, gender_pattern = if current_adapter?(:Mysql2Adapter)
520
+ [/`lions`.`is_vegetarian`/, /`lions`.`gender`/]
521
+ else
522
+ [/"lions"."is_vegetarian"/, /"lions"."gender"/]
523
+ end
524
+
525
+ assert_match vegetarian_pattern, Lion.all.to_sql
526
+ assert_match gender_pattern, Lion.female.to_sql
527
+ end
528
+ end