ibm_db 3.0.4-x86-mingw32 → 3.0.5-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (463) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -1
  3. data/LICENSE +1 -1
  4. data/MANIFEST +14 -14
  5. data/README +225 -225
  6. data/ext/Makefile.nt32 +181 -181
  7. data/ext/Makefile.nt32.191 +212 -212
  8. data/ext/extconf.rb +291 -291
  9. data/ext/ibm_db.c +11887 -11884
  10. data/ext/ruby_ibm_db.h +241 -241
  11. data/ext/ruby_ibm_db_cli.c +866 -866
  12. data/ext/ruby_ibm_db_cli.h +500 -500
  13. data/init.rb +41 -41
  14. data/lib/IBM_DB.rb +27 -27
  15. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3177 -3177
  16. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +1 -1
  17. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  18. data/lib/mswin32/ibm_db.rb +122 -122
  19. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  20. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  21. data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
  22. data/test/active_record/connection_adapters/fake_adapter.rb +46 -46
  23. data/test/assets/example.log +1 -1
  24. data/test/assets/test.txt +1 -1
  25. data/test/cases/adapter_test.rb +276 -261
  26. data/test/cases/aggregations_test.rb +158 -158
  27. data/test/cases/ar_schema_test.rb +161 -161
  28. data/test/cases/associations/association_scope_test.rb +21 -21
  29. data/test/cases/associations/belongs_to_associations_test.rb +1029 -1029
  30. data/test/cases/associations/callbacks_test.rb +192 -192
  31. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  32. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +26 -26
  33. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  34. data/test/cases/associations/eager_load_nested_include_test.rb +128 -128
  35. data/test/cases/associations/eager_singularization_test.rb +148 -148
  36. data/test/cases/associations/eager_test.rb +1429 -1411
  37. data/test/cases/associations/extension_test.rb +82 -82
  38. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +972 -932
  39. data/test/cases/associations/has_many_associations_test.rb +2182 -2162
  40. data/test/cases/associations/has_many_through_associations_test.rb +1204 -1204
  41. data/test/cases/associations/has_one_associations_test.rb +610 -610
  42. data/test/cases/associations/has_one_through_associations_test.rb +380 -380
  43. data/test/cases/associations/inner_join_association_test.rb +139 -139
  44. data/test/cases/associations/inverse_associations_test.rb +706 -693
  45. data/test/cases/associations/join_model_test.rb +754 -754
  46. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  47. data/test/cases/associations/required_test.rb +82 -82
  48. data/test/cases/associations_test.rb +380 -380
  49. data/test/cases/attribute_decorators_test.rb +125 -125
  50. data/test/cases/attribute_methods/read_test.rb +60 -60
  51. data/test/cases/attribute_methods/serialization_test.rb +29 -29
  52. data/test/cases/attribute_methods_test.rb +952 -952
  53. data/test/cases/attribute_set_test.rb +210 -200
  54. data/test/cases/attribute_test.rb +180 -180
  55. data/test/cases/attributes_test.rb +136 -136
  56. data/test/cases/autosave_association_test.rb +1595 -1595
  57. data/test/cases/base_test.rb +1664 -1638
  58. data/test/cases/batches_test.rb +212 -212
  59. data/test/cases/binary_test.rb +52 -52
  60. data/test/cases/bind_parameter_test.rb +100 -100
  61. data/test/cases/calculations_test.rb +646 -646
  62. data/test/cases/callbacks_test.rb +543 -543
  63. data/test/cases/clone_test.rb +40 -40
  64. data/test/cases/coders/yaml_column_test.rb +63 -63
  65. data/test/cases/column_alias_test.rb +17 -17
  66. data/test/cases/column_definition_test.rb +123 -123
  67. data/test/cases/connection_adapters/adapter_leasing_test.rb +54 -54
  68. data/test/cases/connection_adapters/connection_handler_test.rb +53 -53
  69. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  70. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +293 -293
  71. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +65 -65
  72. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  73. data/test/cases/connection_adapters/schema_cache_test.rb +56 -56
  74. data/test/cases/connection_adapters/type_lookup_test.rb +110 -110
  75. data/test/cases/connection_management_test.rb +122 -122
  76. data/test/cases/connection_pool_test.rb +346 -346
  77. data/test/cases/connection_specification/resolver_test.rb +116 -116
  78. data/test/cases/core_test.rb +112 -112
  79. data/test/cases/counter_cache_test.rb +209 -209
  80. data/test/cases/custom_locking_test.rb +17 -17
  81. data/test/cases/database_statements_test.rb +19 -19
  82. data/test/cases/date_time_test.rb +61 -61
  83. data/test/cases/defaults_test.rb +223 -223
  84. data/test/cases/dirty_test.rb +785 -775
  85. data/test/cases/disconnected_test.rb +28 -28
  86. data/test/cases/dup_test.rb +157 -157
  87. data/test/cases/enum_test.rb +290 -290
  88. data/test/cases/explain_subscriber_test.rb +64 -64
  89. data/test/cases/explain_test.rb +76 -76
  90. data/test/cases/finder_respond_to_test.rb +60 -60
  91. data/test/cases/finder_test.rb +1169 -1166
  92. data/test/cases/fixture_set/file_test.rb +138 -138
  93. data/test/cases/fixtures_test.rb +908 -897
  94. data/test/cases/forbidden_attributes_protection_test.rb +99 -99
  95. data/test/cases/habtm_destroy_order_test.rb +61 -61
  96. data/test/cases/helper.rb +210 -210
  97. data/test/cases/hot_compatibility_test.rb +54 -54
  98. data/test/cases/i18n_test.rb +45 -45
  99. data/test/cases/inheritance_test.rb +375 -375
  100. data/test/cases/integration_test.rb +139 -139
  101. data/test/cases/invalid_connection_test.rb +22 -22
  102. data/test/cases/invalid_date_test.rb +32 -32
  103. data/test/cases/invertible_migration_test.rb +295 -295
  104. data/test/cases/json_serialization_test.rb +302 -302
  105. data/test/cases/locking_test.rb +477 -477
  106. data/test/cases/log_subscriber_test.rb +136 -136
  107. data/test/cases/migration/change_schema_test - Copy.rb +448 -448
  108. data/test/cases/migration/change_schema_test.rb +512 -472
  109. data/test/cases/migration/change_table_test.rb +224 -224
  110. data/test/cases/migration/column_attributes_test.rb +192 -192
  111. data/test/cases/migration/column_positioning_test.rb +56 -56
  112. data/test/cases/migration/columns_test.rb +304 -304
  113. data/test/cases/migration/command_recorder_test.rb +305 -305
  114. data/test/cases/migration/create_join_table_test.rb +148 -148
  115. data/test/cases/migration/foreign_key_test - Changed.rb +325 -325
  116. data/test/cases/migration/foreign_key_test.rb +328 -360
  117. data/test/cases/migration/helper.rb +39 -39
  118. data/test/cases/migration/index_test.rb +216 -216
  119. data/test/cases/migration/logger_test.rb +36 -36
  120. data/test/cases/migration/pending_migrations_test.rb +53 -53
  121. data/test/cases/migration/references_foreign_key_test.rb +169 -214
  122. data/test/cases/migration/references_index_test.rb +101 -101
  123. data/test/cases/migration/references_statements_test.rb +116 -116
  124. data/test/cases/migration/rename_table_test.rb +93 -93
  125. data/test/cases/migration/table_and_index_test.rb +24 -24
  126. data/test/cases/migration_test.rb +959 -959
  127. data/test/cases/migrator_test.rb +388 -388
  128. data/test/cases/mixin_test.rb +70 -70
  129. data/test/cases/modules_test.rb +173 -173
  130. data/test/cases/multiparameter_attributes_test.rb +350 -350
  131. data/test/cases/multiple_db_test.rb +115 -115
  132. data/test/cases/nested_attributes_test.rb +1070 -1057
  133. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  134. data/test/cases/persistence_test.rb +909 -909
  135. data/test/cases/pooled_connections_test.rb +81 -81
  136. data/test/cases/primary_keys_test.rb +237 -237
  137. data/test/cases/query_cache_test.rb +326 -326
  138. data/test/cases/quoting_test.rb +156 -156
  139. data/test/cases/readonly_test.rb +118 -118
  140. data/test/cases/reaper_test.rb +85 -85
  141. data/test/cases/reflection_test.rb +463 -454
  142. data/test/cases/relation/delegation_test.rb +68 -68
  143. data/test/cases/relation/merging_test.rb +161 -161
  144. data/test/cases/relation/mutation_test.rb +165 -165
  145. data/test/cases/relation/predicate_builder_test.rb +14 -14
  146. data/test/cases/relation/where_chain_test.rb +181 -181
  147. data/test/cases/relation/where_test.rb +300 -300
  148. data/test/cases/relation/where_test2.rb +36 -36
  149. data/test/cases/relation_test.rb +319 -297
  150. data/test/cases/relations_test.rb +1815 -1815
  151. data/test/cases/reload_models_test.rb +22 -22
  152. data/test/cases/result_test.rb +80 -80
  153. data/test/cases/sanitize_test.rb +83 -83
  154. data/test/cases/schema_dumper_test.rb +463 -463
  155. data/test/cases/scoping/default_scoping_test.rb +454 -454
  156. data/test/cases/scoping/named_scoping_test.rb +524 -524
  157. data/test/cases/scoping/relation_scoping_test.rb +357 -357
  158. data/test/cases/serialization_test.rb +104 -104
  159. data/test/cases/serialized_attribute_test.rb +277 -277
  160. data/test/cases/statement_cache_test.rb +98 -98
  161. data/test/cases/store_test.rb +194 -194
  162. data/test/cases/tasks/database_tasks_test.rb +398 -396
  163. data/test/cases/tasks/mysql_rake_test.rb +324 -311
  164. data/test/cases/tasks/postgresql_rake_test.rb +250 -245
  165. data/test/cases/tasks/sqlite_rake_test.rb +193 -193
  166. data/test/cases/test_case.rb +123 -123
  167. data/test/cases/timestamp_test.rb +467 -468
  168. data/test/cases/transaction_callbacks_test.rb +452 -452
  169. data/test/cases/transaction_isolation_test.rb +106 -106
  170. data/test/cases/transactions_test.rb +817 -817
  171. data/test/cases/type/decimal_test.rb +56 -51
  172. data/test/cases/type/integer_test.rb +121 -121
  173. data/test/cases/type/string_test.rb +36 -36
  174. data/test/cases/type/type_map_test.rb +177 -177
  175. data/test/cases/type/unsigned_integer_test.rb +18 -18
  176. data/test/cases/types_test.rb +141 -141
  177. data/test/cases/unconnected_test.rb +33 -33
  178. data/test/cases/validations/association_validation_test.rb +86 -86
  179. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  180. data/test/cases/validations/i18n_validation_test.rb +90 -90
  181. data/test/cases/validations/length_validation_test.rb +47 -47
  182. data/test/cases/validations/presence_validation_test.rb +68 -68
  183. data/test/cases/validations/uniqueness_validation_test.rb +457 -434
  184. data/test/cases/validations_repair_helper.rb +23 -23
  185. data/test/cases/validations_test.rb +165 -165
  186. data/test/cases/view_test.rb +119 -113
  187. data/test/cases/xml_serialization_test.rb +457 -457
  188. data/test/cases/yaml_serialization_test.rb +126 -86
  189. data/test/config.rb +5 -5
  190. data/test/config.yml +154 -154
  191. data/test/connections/native_ibm_db/connection.rb +43 -43
  192. data/test/fixtures/accounts.yml +29 -29
  193. data/test/fixtures/admin/accounts.yml +2 -2
  194. data/test/fixtures/admin/randomly_named_a9.yml +7 -7
  195. data/test/fixtures/admin/randomly_named_b0.yml +7 -7
  196. data/test/fixtures/admin/users.yml +10 -10
  197. data/test/fixtures/author_addresses.yml +17 -17
  198. data/test/fixtures/author_favorites.yml +3 -3
  199. data/test/fixtures/authors.yml +23 -23
  200. data/test/fixtures/binaries.yml +133 -133
  201. data/test/fixtures/books.yml +11 -11
  202. data/test/fixtures/bulbs.yml +5 -5
  203. data/test/fixtures/cars.yml +9 -9
  204. data/test/fixtures/categories.yml +19 -19
  205. data/test/fixtures/categories/special_categories.yml +9 -9
  206. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  207. data/test/fixtures/categories_ordered.yml +7 -7
  208. data/test/fixtures/categories_posts.yml +31 -31
  209. data/test/fixtures/categorizations.yml +23 -23
  210. data/test/fixtures/clubs.yml +8 -8
  211. data/test/fixtures/collections.yml +3 -3
  212. data/test/fixtures/colleges.yml +3 -3
  213. data/test/fixtures/comments.yml +65 -65
  214. data/test/fixtures/companies.yml +67 -67
  215. data/test/fixtures/computers.yml +10 -10
  216. data/test/fixtures/courses.yml +8 -8
  217. data/test/fixtures/customers.yml +25 -25
  218. data/test/fixtures/dashboards.yml +6 -6
  219. data/test/fixtures/developers.yml +21 -21
  220. data/test/fixtures/developers_projects.yml +16 -16
  221. data/test/fixtures/dog_lovers.yml +7 -7
  222. data/test/fixtures/dogs.yml +4 -4
  223. data/test/fixtures/doubloons.yml +3 -3
  224. data/test/fixtures/edges.yml +5 -5
  225. data/test/fixtures/entrants.yml +14 -14
  226. data/test/fixtures/essays.yml +6 -6
  227. data/test/fixtures/faces.yml +11 -11
  228. data/test/fixtures/fk_test_has_fk.yml +3 -3
  229. data/test/fixtures/fk_test_has_pk.yml +1 -1
  230. data/test/fixtures/friendships.yml +4 -4
  231. data/test/fixtures/funny_jokes.yml +10 -10
  232. data/test/fixtures/interests.yml +33 -33
  233. data/test/fixtures/items.yml +3 -3
  234. data/test/fixtures/jobs.yml +7 -7
  235. data/test/fixtures/legacy_things.yml +3 -3
  236. data/test/fixtures/mateys.yml +4 -4
  237. data/test/fixtures/member_details.yml +8 -8
  238. data/test/fixtures/member_types.yml +6 -6
  239. data/test/fixtures/members.yml +11 -11
  240. data/test/fixtures/memberships.yml +34 -34
  241. data/test/fixtures/men.yml +5 -5
  242. data/test/fixtures/minimalistics.yml +2 -2
  243. data/test/fixtures/minivans.yml +5 -5
  244. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  245. data/test/fixtures/mixins.yml +29 -29
  246. data/test/fixtures/movies.yml +7 -7
  247. data/test/fixtures/naked/csv/accounts.csv +1 -1
  248. data/test/fixtures/naked/yml/accounts.yml +1 -1
  249. data/test/fixtures/naked/yml/companies.yml +1 -1
  250. data/test/fixtures/naked/yml/courses.yml +1 -1
  251. data/test/fixtures/organizations.yml +5 -5
  252. data/test/fixtures/other_topics.yml +42 -42
  253. data/test/fixtures/owners.yml +9 -9
  254. data/test/fixtures/parrots.yml +27 -27
  255. data/test/fixtures/parrots_pirates.yml +7 -7
  256. data/test/fixtures/people.yml +24 -24
  257. data/test/fixtures/peoples_treasures.yml +3 -3
  258. data/test/fixtures/pets.yml +19 -19
  259. data/test/fixtures/pirates.yml +12 -12
  260. data/test/fixtures/posts.yml +80 -80
  261. data/test/fixtures/price_estimates.yml +7 -7
  262. data/test/fixtures/products.yml +4 -4
  263. data/test/fixtures/projects.yml +7 -7
  264. data/test/fixtures/randomly_named_a9.yml +7 -7
  265. data/test/fixtures/ratings.yml +14 -14
  266. data/test/fixtures/readers.yml +11 -11
  267. data/test/fixtures/references.yml +17 -17
  268. data/test/fixtures/reserved_words/distinct.yml +5 -5
  269. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  270. data/test/fixtures/reserved_words/group.yml +14 -14
  271. data/test/fixtures/reserved_words/select.yml +8 -8
  272. data/test/fixtures/reserved_words/values.yml +7 -7
  273. data/test/fixtures/ships.yml +6 -6
  274. data/test/fixtures/speedometers.yml +8 -8
  275. data/test/fixtures/sponsors.yml +12 -12
  276. data/test/fixtures/string_key_objects.yml +7 -7
  277. data/test/fixtures/subscribers.yml +10 -10
  278. data/test/fixtures/subscriptions.yml +12 -12
  279. data/test/fixtures/taggings.yml +78 -78
  280. data/test/fixtures/tags.yml +11 -11
  281. data/test/fixtures/tasks.yml +7 -7
  282. data/test/fixtures/teapots.yml +3 -3
  283. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  284. data/test/fixtures/to_be_linked/users.yml +10 -10
  285. data/test/fixtures/topics.yml +49 -49
  286. data/test/fixtures/toys.yml +14 -14
  287. data/test/fixtures/traffic_lights.yml +9 -9
  288. data/test/fixtures/treasures.yml +10 -10
  289. data/test/fixtures/uuid_children.yml +3 -3
  290. data/test/fixtures/uuid_parents.yml +2 -2
  291. data/test/fixtures/variants.yml +4 -4
  292. data/test/fixtures/vegetables.yml +19 -19
  293. data/test/fixtures/vertices.yml +3 -3
  294. data/test/fixtures/warehouse_things.yml +2 -2
  295. data/test/fixtures/zines.yml +5 -5
  296. data/test/ibm_db_test.rb +24 -24
  297. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  298. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  299. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  300. data/test/migrations/missing/1000_people_have_middle_names.rb +8 -8
  301. data/test/migrations/missing/1_people_have_last_names.rb +8 -8
  302. data/test/migrations/missing/3_we_need_reminders.rb +11 -11
  303. data/test/migrations/missing/4_innocent_jointable.rb +11 -11
  304. data/test/migrations/rename/1_we_need_things.rb +10 -10
  305. data/test/migrations/rename/2_rename_things.rb +8 -8
  306. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  307. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  308. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  309. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  310. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  311. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  312. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  313. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  314. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  315. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  316. data/test/migrations/valid/2_we_need_reminders.rb +11 -11
  317. data/test/migrations/valid/3_innocent_jointable.rb +11 -11
  318. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  319. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +11 -11
  320. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +11 -11
  321. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  322. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  323. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  324. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  325. data/test/models/admin.rb +4 -4
  326. data/test/models/admin/account.rb +2 -2
  327. data/test/models/admin/randomly_named_c1.rb +3 -3
  328. data/test/models/admin/user.rb +40 -40
  329. data/test/models/aircraft.rb +4 -4
  330. data/test/models/arunit2_model.rb +3 -3
  331. data/test/models/author.rb +212 -212
  332. data/test/models/auto_id.rb +4 -4
  333. data/test/models/autoloadable/extra_firm.rb +2 -2
  334. data/test/models/binary.rb +1 -1
  335. data/test/models/bird.rb +12 -12
  336. data/test/models/book.rb +18 -18
  337. data/test/models/boolean.rb +2 -2
  338. data/test/models/bulb.rb +51 -51
  339. data/test/models/cake_designer.rb +3 -3
  340. data/test/models/car.rb +26 -26
  341. data/test/models/carrier.rb +2 -2
  342. data/test/models/categorization.rb +19 -19
  343. data/test/models/category.rb +35 -35
  344. data/test/models/chef.rb +7 -3
  345. data/test/models/citation.rb +3 -3
  346. data/test/models/club.rb +23 -23
  347. data/test/models/college.rb +10 -10
  348. data/test/models/column.rb +3 -3
  349. data/test/models/column_name.rb +3 -3
  350. data/test/models/comment.rb +64 -64
  351. data/test/models/company.rb +228 -225
  352. data/test/models/company_in_module.rb +98 -98
  353. data/test/models/computer.rb +3 -3
  354. data/test/models/contact.rb +41 -41
  355. data/test/models/contract.rb +20 -20
  356. data/test/models/country.rb +7 -7
  357. data/test/models/course.rb +6 -6
  358. data/test/models/customer.rb +77 -77
  359. data/test/models/customer_carrier.rb +14 -14
  360. data/test/models/dashboard.rb +3 -3
  361. data/test/models/default.rb +2 -2
  362. data/test/models/department.rb +4 -4
  363. data/test/models/developer.rb +255 -252
  364. data/test/models/dog.rb +5 -5
  365. data/test/models/dog_lover.rb +5 -5
  366. data/test/models/doubloon.rb +12 -12
  367. data/test/models/drink_designer.rb +3 -3
  368. data/test/models/edge.rb +5 -5
  369. data/test/models/electron.rb +5 -5
  370. data/test/models/engine.rb +4 -4
  371. data/test/models/entrant.rb +3 -3
  372. data/test/models/essay.rb +5 -5
  373. data/test/models/event.rb +2 -2
  374. data/test/models/eye.rb +37 -37
  375. data/test/models/face.rb +9 -9
  376. data/test/models/friendship.rb +6 -6
  377. data/test/models/guid.rb +1 -1
  378. data/test/models/hotel.rb +9 -6
  379. data/test/models/image.rb +3 -3
  380. data/test/models/interest.rb +5 -5
  381. data/test/models/invoice.rb +4 -4
  382. data/test/models/item.rb +7 -7
  383. data/test/models/job.rb +7 -7
  384. data/test/models/joke.rb +7 -7
  385. data/test/models/keyboard.rb +3 -3
  386. data/test/models/legacy_thing.rb +3 -3
  387. data/test/models/lesson.rb +11 -11
  388. data/test/models/line_item.rb +3 -3
  389. data/test/models/liquid.rb +4 -4
  390. data/test/models/man.rb +11 -11
  391. data/test/models/matey.rb +4 -4
  392. data/test/models/member.rb +41 -41
  393. data/test/models/member_detail.rb +7 -7
  394. data/test/models/member_type.rb +3 -3
  395. data/test/models/membership.rb +35 -35
  396. data/test/models/minimalistic.rb +2 -2
  397. data/test/models/minivan.rb +9 -9
  398. data/test/models/mixed_case_monkey.rb +3 -3
  399. data/test/models/molecule.rb +6 -6
  400. data/test/models/movie.rb +5 -5
  401. data/test/models/order.rb +4 -4
  402. data/test/models/organization.rb +14 -14
  403. data/test/models/owner.rb +34 -34
  404. data/test/models/parrot.rb +29 -29
  405. data/test/models/person.rb +143 -143
  406. data/test/models/personal_legacy_thing.rb +4 -4
  407. data/test/models/pet.rb +15 -15
  408. data/test/models/pirate.rb +92 -92
  409. data/test/models/possession.rb +3 -3
  410. data/test/models/post.rb +264 -264
  411. data/test/models/price_estimate.rb +4 -4
  412. data/test/models/professor.rb +5 -5
  413. data/test/models/project.rb +31 -29
  414. data/test/models/publisher.rb +2 -2
  415. data/test/models/publisher/article.rb +4 -4
  416. data/test/models/publisher/magazine.rb +3 -3
  417. data/test/models/randomly_named_c1.rb +3 -3
  418. data/test/models/rating.rb +4 -4
  419. data/test/models/reader.rb +23 -23
  420. data/test/models/record.rb +2 -2
  421. data/test/models/reference.rb +22 -22
  422. data/test/models/reply.rb +61 -61
  423. data/test/models/ship.rb +33 -33
  424. data/test/models/ship_part.rb +7 -7
  425. data/test/models/shop.rb +17 -17
  426. data/test/models/shop_account.rb +6 -6
  427. data/test/models/speedometer.rb +6 -6
  428. data/test/models/sponsor.rb +7 -7
  429. data/test/models/string_key_object.rb +3 -3
  430. data/test/models/student.rb +4 -4
  431. data/test/models/subject.rb +16 -16
  432. data/test/models/subscriber.rb +8 -8
  433. data/test/models/subscription.rb +4 -4
  434. data/test/models/tag.rb +7 -7
  435. data/test/models/tagging.rb +13 -13
  436. data/test/models/task.rb +5 -5
  437. data/test/models/topic.rb +124 -124
  438. data/test/models/toy.rb +6 -6
  439. data/test/models/traffic_light.rb +4 -4
  440. data/test/models/treasure.rb +14 -14
  441. data/test/models/treaty.rb +7 -7
  442. data/test/models/tyre.rb +11 -11
  443. data/test/models/uuid_child.rb +3 -3
  444. data/test/models/uuid_parent.rb +3 -3
  445. data/test/models/vegetables.rb +24 -24
  446. data/test/models/vehicle.rb +6 -6
  447. data/test/models/vertex.rb +9 -9
  448. data/test/models/warehouse_thing.rb +5 -5
  449. data/test/models/wheel.rb +3 -3
  450. data/test/models/without_table.rb +3 -3
  451. data/test/models/zine.rb +3 -3
  452. data/test/schema/mysql2_specific_schema.rb +58 -58
  453. data/test/schema/mysql_specific_schema.rb +70 -70
  454. data/test/schema/oracle_specific_schema.rb +43 -43
  455. data/test/schema/postgresql_specific_schema.rb +202 -202
  456. data/test/schema/schema.rb +952 -938
  457. data/test/schema/sqlite_specific_schema.rb +21 -21
  458. data/test/support/config.rb +43 -43
  459. data/test/support/connection.rb +22 -22
  460. data/test/support/connection_helper.rb +14 -14
  461. data/test/support/ddl_helper.rb +8 -8
  462. data/test/support/schema_dumping_helper.rb +20 -20
  463. metadata +2 -2
@@ -1,454 +1,454 @@
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
-
8
- class DefaultScopingTest < ActiveRecord::TestCase
9
- fixtures :developers, :posts, :comments
10
-
11
- def test_default_scope
12
- expected = Developer.all.merge!(:order => 'salary DESC').to_a.collect { |dev| dev.salary }
13
- received = DeveloperOrderedBySalary.all.collect { |dev| dev.salary }
14
- assert_equal expected, received
15
- end
16
-
17
- def test_default_scope_as_class_method
18
- assert_equal [developers(:david).becomes(ClassMethodDeveloperCalledDavid)], ClassMethodDeveloperCalledDavid.all
19
- end
20
-
21
- def test_default_scope_as_class_method_referencing_scope
22
- assert_equal [developers(:david).becomes(ClassMethodReferencingScopeDeveloperCalledDavid)], ClassMethodReferencingScopeDeveloperCalledDavid.all
23
- end
24
-
25
- def test_default_scope_as_block_referencing_scope
26
- assert_equal [developers(:david).becomes(LazyBlockReferencingScopeDeveloperCalledDavid)], LazyBlockReferencingScopeDeveloperCalledDavid.all
27
- end
28
-
29
- def test_default_scope_with_lambda
30
- assert_equal [developers(:david).becomes(LazyLambdaDeveloperCalledDavid)], LazyLambdaDeveloperCalledDavid.all
31
- end
32
-
33
- def test_default_scope_with_block
34
- assert_equal [developers(:david).becomes(LazyBlockDeveloperCalledDavid)], LazyBlockDeveloperCalledDavid.all
35
- end
36
-
37
- def test_default_scope_with_callable
38
- assert_equal [developers(:david).becomes(CallableDeveloperCalledDavid)], CallableDeveloperCalledDavid.all
39
- end
40
-
41
- def test_default_scope_is_unscoped_on_find
42
- assert_equal 1, DeveloperCalledDavid.count
43
- assert_equal 11, DeveloperCalledDavid.unscoped.count
44
- end
45
-
46
- def test_default_scope_is_unscoped_on_create
47
- assert_nil DeveloperCalledJamis.unscoped.create!.name
48
- end
49
-
50
- def test_default_scope_with_conditions_string
51
- assert_equal Developer.where(name: 'David').map(&:id).sort, DeveloperCalledDavid.all.map(&:id).sort
52
- assert_equal nil, DeveloperCalledDavid.create!.name
53
- end
54
-
55
- def test_default_scope_with_conditions_hash
56
- assert_equal Developer.where(name: 'Jamis').map(&:id).sort, DeveloperCalledJamis.all.map(&:id).sort
57
- assert_equal 'Jamis', DeveloperCalledJamis.create!.name
58
- end
59
-
60
- unless in_memory_db?
61
- def test_default_scoping_with_threads
62
- 2.times do
63
- Thread.new {
64
- assert DeveloperOrderedBySalary.all.to_sql.include?('salary DESC')
65
- DeveloperOrderedBySalary.connection.close
66
- }.join
67
- end
68
- end
69
- end
70
-
71
- def test_default_scope_with_inheritance
72
- wheres = InheritedPoorDeveloperCalledJamis.all.where_values_hash
73
- assert_equal "Jamis", wheres['name']
74
- assert_equal 50000, wheres['salary']
75
- end
76
-
77
- def test_default_scope_with_module_includes
78
- wheres = ModuleIncludedPoorDeveloperCalledJamis.all.where_values_hash
79
- assert_equal "Jamis", wheres['name']
80
- assert_equal 50000, wheres['salary']
81
- end
82
-
83
- def test_default_scope_with_multiple_calls
84
- wheres = MultiplePoorDeveloperCalledJamis.all.where_values_hash
85
- assert_equal "Jamis", wheres['name']
86
- assert_equal 50000, wheres['salary']
87
- end
88
-
89
- def test_scope_overwrites_default
90
- expected = Developer.all.merge!(order: 'salary DESC, name DESC').to_a.collect { |dev| dev.name }
91
- received = DeveloperOrderedBySalary.by_name.to_a.collect { |dev| dev.name }
92
- assert_equal expected, received
93
- end
94
-
95
- def test_reorder_overrides_default_scope_order
96
- expected = Developer.order('name DESC').collect { |dev| dev.name }
97
- received = DeveloperOrderedBySalary.reorder('name DESC').collect { |dev| dev.name }
98
- assert_equal expected, received
99
- end
100
-
101
- def test_order_after_reorder_combines_orders
102
- expected = Developer.order('name DESC, id DESC').collect { |dev| [dev.name, dev.id] }
103
- received = Developer.order('name ASC').reorder('name DESC').order('id DESC').collect { |dev| [dev.name, dev.id] }
104
- assert_equal expected, received
105
- end
106
-
107
- def test_unscope_overrides_default_scope
108
- expected = Developer.all.collect { |dev| [dev.name, dev.id] }
109
- received = DeveloperCalledJamis.unscope(:where).collect { |dev| [dev.name, dev.id] }
110
- assert_equal expected, received
111
- end
112
-
113
- def test_unscope_after_reordering_and_combining
114
- expected = Developer.order('id DESC, name DESC').collect { |dev| [dev.name, dev.id] }
115
- received = DeveloperOrderedBySalary.reorder('name DESC').unscope(:order).order('id DESC, name DESC').collect { |dev| [dev.name, dev.id] }
116
- assert_equal expected, received
117
-
118
- expected_2 = Developer.all.collect { |dev| [dev.name, dev.id] }
119
- received_2 = Developer.order('id DESC, name DESC').unscope(:order).collect { |dev| [dev.name, dev.id] }
120
- assert_equal expected_2, received_2
121
-
122
- expected_3 = Developer.all.collect { |dev| [dev.name, dev.id] }
123
- received_3 = Developer.reorder('name DESC').unscope(:order).collect { |dev| [dev.name, dev.id] }
124
- assert_equal expected_3, received_3
125
- end
126
-
127
- def test_unscope_with_where_attributes
128
- expected = Developer.order('salary DESC').collect(&:name)
129
- received = DeveloperOrderedBySalary.where(name: 'David').unscope(where: :name).collect(&:name)
130
- assert_equal expected, received
131
-
132
- expected_2 = Developer.order('salary DESC').collect(&:name)
133
- received_2 = DeveloperOrderedBySalary.select("id").where("name" => "Jamis").unscope({:where => :name}, :select).collect(&:name)
134
- assert_equal expected_2, received_2
135
-
136
- expected_3 = Developer.order('salary DESC').collect(&:name)
137
- received_3 = DeveloperOrderedBySalary.select("id").where("name" => "Jamis").unscope(:select, :where).collect(&:name)
138
- assert_equal expected_3, received_3
139
-
140
- expected_4 = Developer.order('salary DESC').collect(&:name)
141
- received_4 = DeveloperOrderedBySalary.where.not("name" => "Jamis").unscope(where: :name).collect(&:name)
142
- assert_equal expected_4, received_4
143
-
144
- expected_5 = Developer.order('salary DESC').collect(&:name)
145
- received_5 = DeveloperOrderedBySalary.where.not("name" => ["Jamis", "David"]).unscope(where: :name).collect(&:name)
146
- assert_equal expected_5, received_5
147
- end
148
-
149
- def test_unscope_comparison_where_clauses
150
- # unscoped for WHERE (`developers`.`id` <= 2)
151
- expected = Developer.order('salary DESC').collect(&:name)
152
- received = DeveloperOrderedBySalary.where(id: -Float::INFINITY..2).unscope(where: :id).collect { |dev| dev.name }
153
- assert_equal expected, received
154
-
155
- # unscoped for WHERE (`developers`.`id` < 2)
156
- expected = Developer.order('salary DESC').collect(&:name)
157
- received = DeveloperOrderedBySalary.where(id: -Float::INFINITY...2).unscope(where: :id).collect { |dev| dev.name }
158
- assert_equal expected, received
159
- end
160
-
161
- def test_unscope_multiple_where_clauses
162
- expected = Developer.order('salary DESC').collect { |dev| dev.name }
163
- received = DeveloperOrderedBySalary.where(name: 'Jamis').where(id: 1).unscope(where: [:name, :id]).collect { |dev| dev.name }
164
- assert_equal expected, received
165
- end
166
-
167
- def test_unscope_string_where_clauses_involved
168
- dev_relation = Developer.order('salary DESC').where("created_at > ?", 1.year.ago)
169
- expected = dev_relation.collect { |dev| dev.name }
170
-
171
- dev_ordered_relation = DeveloperOrderedBySalary.where(name: 'Jamis').where("created_at > ?", 1.year.ago)
172
- received = dev_ordered_relation.unscope(where: [:name]).collect { |dev| dev.name }
173
-
174
- assert_equal expected, received
175
- end
176
-
177
- def test_unscope_with_grouping_attributes
178
- expected = Developer.order('salary DESC').collect { |dev| dev.name }
179
- received = DeveloperOrderedBySalary.group(:name).unscope(:group).collect { |dev| dev.name }
180
- assert_equal expected, received
181
-
182
- expected_2 = Developer.order('salary DESC').collect { |dev| dev.name }
183
- received_2 = DeveloperOrderedBySalary.group("name").unscope(:group).collect { |dev| dev.name }
184
- assert_equal expected_2, received_2
185
- end
186
-
187
- def test_unscope_with_limit_in_query
188
- expected = Developer.order('salary DESC').collect { |dev| dev.name }
189
- received = DeveloperOrderedBySalary.limit(1).unscope(:limit).collect { |dev| dev.name }
190
- assert_equal expected, received
191
- end
192
-
193
- def test_order_to_unscope_reordering
194
- scope = DeveloperOrderedBySalary.order('salary DESC, name ASC').reverse_order.unscope(:order)
195
- assert !(scope.to_sql =~ /order/i)
196
- end
197
-
198
- def test_unscope_reverse_order
199
- expected = Developer.all.collect { |dev| dev.name }
200
- received = Developer.order('salary DESC').reverse_order.unscope(:order).collect { |dev| dev.name }
201
- assert_equal expected, received
202
- end
203
-
204
- def test_unscope_select
205
- expected = Developer.order('salary ASC').collect { |dev| dev.name }
206
- received = Developer.order('salary DESC').reverse_order.select(:name).unscope(:select).collect { |dev| dev.name }
207
- assert_equal expected, received
208
-
209
- expected_2 = Developer.all.collect { |dev| dev.id }
210
- received_2 = Developer.select(:name).unscope(:select).collect { |dev| dev.id }
211
- assert_equal expected_2, received_2
212
- end
213
-
214
- def test_unscope_offset
215
- expected = Developer.all.collect { |dev| dev.name }
216
- received = Developer.offset(5).unscope(:offset).collect { |dev| dev.name }
217
- assert_equal expected, received
218
- end
219
-
220
- def test_unscope_joins_and_select_on_developers_projects
221
- expected = Developer.all.collect { |dev| dev.name }
222
- received = Developer.joins('JOIN developers_projects ON id = developer_id').select(:id).unscope(:joins, :select).collect { |dev| dev.name }
223
- assert_equal expected, received
224
- end
225
-
226
- def test_unscope_includes
227
- expected = Developer.all.collect { |dev| dev.name }
228
- received = Developer.includes(:projects).select(:id).unscope(:includes, :select).collect { |dev| dev.name }
229
- assert_equal expected, received
230
- end
231
-
232
- def test_unscope_having
233
- expected = DeveloperOrderedBySalary.all.collect { |dev| dev.name }
234
- received = DeveloperOrderedBySalary.having("name IN ('Jamis', 'David')").unscope(:having).collect { |dev| dev.name }
235
- assert_equal expected, received
236
- end
237
-
238
- def test_unscope_and_scope
239
- developer_klass = Class.new(Developer) do
240
- scope :by_name, -> name { unscope(where: :name).where(name: name) }
241
- end
242
-
243
- expected = developer_klass.where(name: 'Jamis').collect { |dev| [dev.name, dev.id] }
244
- received = developer_klass.where(name: 'David').by_name('Jamis').collect { |dev| [dev.name, dev.id] }
245
- assert_equal expected, received
246
- end
247
-
248
- def test_unscope_errors_with_invalid_value
249
- assert_raises(ArgumentError) do
250
- Developer.includes(:projects).where(name: "Jamis").unscope(:stupidly_incorrect_value)
251
- end
252
-
253
- assert_raises(ArgumentError) do
254
- Developer.all.unscope(:includes, :select, :some_broken_value)
255
- end
256
-
257
- assert_raises(ArgumentError) do
258
- Developer.order('name DESC').reverse_order.unscope(:reverse_order)
259
- end
260
-
261
- assert_raises(ArgumentError) do
262
- Developer.order('name DESC').where(name: "Jamis").unscope()
263
- end
264
- end
265
-
266
- def test_unscope_errors_with_non_where_hash_keys
267
- assert_raises(ArgumentError) do
268
- Developer.where(name: "Jamis").limit(4).unscope(limit: 4)
269
- end
270
-
271
- assert_raises(ArgumentError) do
272
- Developer.where(name: "Jamis").unscope("where" => :name)
273
- end
274
- end
275
-
276
- def test_unscope_errors_with_non_symbol_or_hash_arguments
277
- assert_raises(ArgumentError) do
278
- Developer.where(name: "Jamis").limit(3).unscope("limit")
279
- end
280
-
281
- assert_raises(ArgumentError) do
282
- Developer.select("id").unscope("select")
283
- end
284
-
285
- assert_raises(ArgumentError) do
286
- Developer.select("id").unscope(5)
287
- end
288
- end
289
-
290
- def test_unscope_merging
291
- merged = Developer.where(name: "Jamis").merge(Developer.unscope(:where))
292
- assert merged.where_values.empty?
293
- assert !merged.where(name: "Jon").where_values.empty?
294
- end
295
-
296
- def test_order_in_default_scope_should_not_prevail
297
- expected = Developer.all.merge!(order: 'salary desc').to_a.collect { |dev| dev.salary }
298
- received = DeveloperOrderedBySalary.all.merge!(order: 'salary').to_a.collect { |dev| dev.salary }
299
- assert_equal expected, received
300
- end
301
-
302
- def test_create_attribute_overwrites_default_scoping
303
- assert_equal 'David', PoorDeveloperCalledJamis.create!(:name => 'David').name
304
- assert_equal 200000, PoorDeveloperCalledJamis.create!(:name => 'David', :salary => 200000).salary
305
- end
306
-
307
- def test_create_attribute_overwrites_default_values
308
- assert_equal nil, PoorDeveloperCalledJamis.create!(:salary => nil).salary
309
- assert_equal 50000, PoorDeveloperCalledJamis.create!(:name => 'David').salary
310
- end
311
-
312
- def test_default_scope_attribute
313
- jamis = PoorDeveloperCalledJamis.new(:name => 'David')
314
- assert_equal 50000, jamis.salary
315
- end
316
-
317
- def test_where_attribute
318
- aaron = PoorDeveloperCalledJamis.where(:salary => 20).new(:name => 'Aaron')
319
- assert_equal 20, aaron.salary
320
- assert_equal 'Aaron', aaron.name
321
- end
322
-
323
- def test_where_attribute_merge
324
- aaron = PoorDeveloperCalledJamis.where(:name => 'foo').new(:name => 'Aaron')
325
- assert_equal 'Aaron', aaron.name
326
- end
327
-
328
- def test_scope_composed_by_limit_and_then_offset_is_equal_to_scope_composed_by_offset_and_then_limit
329
- posts_limit_offset = Post.limit(3).offset(2)
330
- posts_offset_limit = Post.offset(2).limit(3)
331
- assert_equal posts_limit_offset, posts_offset_limit
332
- end
333
-
334
- def test_create_with_merge
335
- aaron = PoorDeveloperCalledJamis.create_with(:name => 'foo', :salary => 20).merge(
336
- PoorDeveloperCalledJamis.create_with(:name => 'Aaron')).new
337
- assert_equal 20, aaron.salary
338
- assert_equal 'Aaron', aaron.name
339
-
340
- aaron = PoorDeveloperCalledJamis.create_with(:name => 'foo', :salary => 20).
341
- create_with(:name => 'Aaron').new
342
- assert_equal 20, aaron.salary
343
- assert_equal 'Aaron', aaron.name
344
- end
345
-
346
- def test_create_with_reset
347
- jamis = PoorDeveloperCalledJamis.create_with(:name => 'Aaron').create_with(nil).new
348
- assert_equal 'Jamis', jamis.name
349
- end
350
-
351
- # FIXME: I don't know if this is *desired* behavior, but it is *today's*
352
- # behavior.
353
- def test_create_with_empty_hash_will_not_reset
354
- jamis = PoorDeveloperCalledJamis.create_with(:name => 'Aaron').create_with({}).new
355
- assert_equal 'Aaron', jamis.name
356
- end
357
-
358
- def test_unscoped_with_named_scope_should_not_have_default_scope
359
- assert_equal [DeveloperCalledJamis.find(developers(:poor_jamis).id)], DeveloperCalledJamis.poor
360
-
361
- assert DeveloperCalledJamis.unscoped.poor.include?(developers(:david).becomes(DeveloperCalledJamis))
362
-
363
- assert_equal 11, DeveloperCalledJamis.unscoped.length
364
- assert_equal 1, DeveloperCalledJamis.poor.length
365
- assert_equal 10, DeveloperCalledJamis.unscoped.poor.length
366
- assert_equal 10, DeveloperCalledJamis.unscoped { DeveloperCalledJamis.poor }.length
367
- end
368
-
369
- def test_default_scope_select_ignored_by_aggregations
370
- assert_equal DeveloperWithSelect.all.to_a.count, DeveloperWithSelect.count
371
- end
372
-
373
- def test_default_scope_select_ignored_by_grouped_aggregations
374
- assert_equal Hash[Developer.all.group_by(&:salary).map { |s, d| [s, d.count] }],
375
- DeveloperWithSelect.group(:salary).count
376
- end
377
-
378
- def test_default_scope_order_ignored_by_aggregations
379
- assert_equal DeveloperOrderedBySalary.all.count, DeveloperOrderedBySalary.count
380
- end
381
-
382
- def test_default_scope_find_last
383
- assert DeveloperOrderedBySalary.count > 1, "need more than one row for test"
384
-
385
- lowest_salary_dev = DeveloperOrderedBySalary.find(developers(:poor_jamis).id)
386
- assert_equal lowest_salary_dev, DeveloperOrderedBySalary.last
387
- end
388
-
389
- def test_default_scope_include_with_count
390
- d = DeveloperWithIncludes.create!
391
- d.audit_logs.create! :message => 'foo'
392
-
393
- assert_equal 1, DeveloperWithIncludes.where(:audit_logs => { :message => 'foo' }).count
394
- end
395
-
396
- def test_default_scope_with_references_works_through_collection_association
397
- post = PostWithCommentWithDefaultScopeReferencesAssociation.create!(title: "Hello World", body: "Here we go.")
398
- comment = post.comment_with_default_scope_references_associations.create!(body: "Great post.", developer_id: Developer.first.id)
399
- assert_equal comment, post.comment_with_default_scope_references_associations.to_a.first
400
- end
401
-
402
- def test_default_scope_with_references_works_through_association
403
- post = PostWithCommentWithDefaultScopeReferencesAssociation.create!(title: "Hello World", body: "Here we go.")
404
- comment = post.comment_with_default_scope_references_associations.create!(body: "Great post.", developer_id: Developer.first.id)
405
- assert_equal comment, post.first_comment
406
- end
407
-
408
- def test_default_scope_with_references_works_with_find_by
409
- post = PostWithCommentWithDefaultScopeReferencesAssociation.create!(title: "Hello World", body: "Here we go.")
410
- comment = post.comment_with_default_scope_references_associations.create!(body: "Great post.", developer_id: Developer.first.id)
411
- assert_equal comment, CommentWithDefaultScopeReferencesAssociation.find_by(id: comment.id)
412
- end
413
-
414
- unless in_memory_db?
415
- def test_default_scope_is_threadsafe
416
- threads = []
417
- assert_not_equal 1, ThreadsafeDeveloper.unscoped.count
418
-
419
- threads << Thread.new do
420
- Thread.current[:long_default_scope] = true
421
- assert_equal 1, ThreadsafeDeveloper.all.to_a.count
422
- ThreadsafeDeveloper.connection.close
423
- end
424
- threads << Thread.new do
425
- assert_equal 1, ThreadsafeDeveloper.all.to_a.count
426
- ThreadsafeDeveloper.connection.close
427
- end
428
- threads.each(&:join)
429
- end
430
- end
431
-
432
- test "additional conditions are ANDed with the default scope" do
433
- scope = DeveloperCalledJamis.where(name: "David")
434
- assert_equal 2, scope.where_values.length
435
- assert_equal [], scope.to_a
436
- end
437
-
438
- test "additional conditions in a scope are ANDed with the default scope" do
439
- scope = DeveloperCalledJamis.david
440
- assert_equal 2, scope.where_values.length
441
- assert_equal [], scope.to_a
442
- end
443
-
444
- test "a scope can remove the condition from the default scope" do
445
- scope = DeveloperCalledJamis.david2
446
- assert_equal 1, scope.where_values.length
447
- assert_equal Developer.where(name: "David").map(&:id), scope.map(&:id)
448
- end
449
-
450
- def test_with_abstract_class_where_clause_should_not_be_duplicated
451
- scope = Bus.all
452
- assert_equal scope.where_values.length, 1
453
- end
454
- 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
+
8
+ class DefaultScopingTest < ActiveRecord::TestCase
9
+ fixtures :developers, :posts, :comments
10
+
11
+ def test_default_scope
12
+ expected = Developer.all.merge!(:order => 'salary DESC').to_a.collect { |dev| dev.salary }
13
+ received = DeveloperOrderedBySalary.all.collect { |dev| dev.salary }
14
+ assert_equal expected, received
15
+ end
16
+
17
+ def test_default_scope_as_class_method
18
+ assert_equal [developers(:david).becomes(ClassMethodDeveloperCalledDavid)], ClassMethodDeveloperCalledDavid.all
19
+ end
20
+
21
+ def test_default_scope_as_class_method_referencing_scope
22
+ assert_equal [developers(:david).becomes(ClassMethodReferencingScopeDeveloperCalledDavid)], ClassMethodReferencingScopeDeveloperCalledDavid.all
23
+ end
24
+
25
+ def test_default_scope_as_block_referencing_scope
26
+ assert_equal [developers(:david).becomes(LazyBlockReferencingScopeDeveloperCalledDavid)], LazyBlockReferencingScopeDeveloperCalledDavid.all
27
+ end
28
+
29
+ def test_default_scope_with_lambda
30
+ assert_equal [developers(:david).becomes(LazyLambdaDeveloperCalledDavid)], LazyLambdaDeveloperCalledDavid.all
31
+ end
32
+
33
+ def test_default_scope_with_block
34
+ assert_equal [developers(:david).becomes(LazyBlockDeveloperCalledDavid)], LazyBlockDeveloperCalledDavid.all
35
+ end
36
+
37
+ def test_default_scope_with_callable
38
+ assert_equal [developers(:david).becomes(CallableDeveloperCalledDavid)], CallableDeveloperCalledDavid.all
39
+ end
40
+
41
+ def test_default_scope_is_unscoped_on_find
42
+ assert_equal 1, DeveloperCalledDavid.count
43
+ assert_equal 11, DeveloperCalledDavid.unscoped.count
44
+ end
45
+
46
+ def test_default_scope_is_unscoped_on_create
47
+ assert_nil DeveloperCalledJamis.unscoped.create!.name
48
+ end
49
+
50
+ def test_default_scope_with_conditions_string
51
+ assert_equal Developer.where(name: 'David').map(&:id).sort, DeveloperCalledDavid.all.map(&:id).sort
52
+ assert_equal nil, DeveloperCalledDavid.create!.name
53
+ end
54
+
55
+ def test_default_scope_with_conditions_hash
56
+ assert_equal Developer.where(name: 'Jamis').map(&:id).sort, DeveloperCalledJamis.all.map(&:id).sort
57
+ assert_equal 'Jamis', DeveloperCalledJamis.create!.name
58
+ end
59
+
60
+ unless in_memory_db?
61
+ def test_default_scoping_with_threads
62
+ 2.times do
63
+ Thread.new {
64
+ assert DeveloperOrderedBySalary.all.to_sql.include?('salary DESC')
65
+ DeveloperOrderedBySalary.connection.close
66
+ }.join
67
+ end
68
+ end
69
+ end
70
+
71
+ def test_default_scope_with_inheritance
72
+ wheres = InheritedPoorDeveloperCalledJamis.all.where_values_hash
73
+ assert_equal "Jamis", wheres['name']
74
+ assert_equal 50000, wheres['salary']
75
+ end
76
+
77
+ def test_default_scope_with_module_includes
78
+ wheres = ModuleIncludedPoorDeveloperCalledJamis.all.where_values_hash
79
+ assert_equal "Jamis", wheres['name']
80
+ assert_equal 50000, wheres['salary']
81
+ end
82
+
83
+ def test_default_scope_with_multiple_calls
84
+ wheres = MultiplePoorDeveloperCalledJamis.all.where_values_hash
85
+ assert_equal "Jamis", wheres['name']
86
+ assert_equal 50000, wheres['salary']
87
+ end
88
+
89
+ def test_scope_overwrites_default
90
+ expected = Developer.all.merge!(order: 'salary DESC, name DESC').to_a.collect { |dev| dev.name }
91
+ received = DeveloperOrderedBySalary.by_name.to_a.collect { |dev| dev.name }
92
+ assert_equal expected, received
93
+ end
94
+
95
+ def test_reorder_overrides_default_scope_order
96
+ expected = Developer.order('name DESC').collect { |dev| dev.name }
97
+ received = DeveloperOrderedBySalary.reorder('name DESC').collect { |dev| dev.name }
98
+ assert_equal expected, received
99
+ end
100
+
101
+ def test_order_after_reorder_combines_orders
102
+ expected = Developer.order('name DESC, id DESC').collect { |dev| [dev.name, dev.id] }
103
+ received = Developer.order('name ASC').reorder('name DESC').order('id DESC').collect { |dev| [dev.name, dev.id] }
104
+ assert_equal expected, received
105
+ end
106
+
107
+ def test_unscope_overrides_default_scope
108
+ expected = Developer.all.collect { |dev| [dev.name, dev.id] }
109
+ received = DeveloperCalledJamis.unscope(:where).collect { |dev| [dev.name, dev.id] }
110
+ assert_equal expected, received
111
+ end
112
+
113
+ def test_unscope_after_reordering_and_combining
114
+ expected = Developer.order('id DESC, name DESC').collect { |dev| [dev.name, dev.id] }
115
+ received = DeveloperOrderedBySalary.reorder('name DESC').unscope(:order).order('id DESC, name DESC').collect { |dev| [dev.name, dev.id] }
116
+ assert_equal expected, received
117
+
118
+ expected_2 = Developer.all.collect { |dev| [dev.name, dev.id] }
119
+ received_2 = Developer.order('id DESC, name DESC').unscope(:order).collect { |dev| [dev.name, dev.id] }
120
+ assert_equal expected_2, received_2
121
+
122
+ expected_3 = Developer.all.collect { |dev| [dev.name, dev.id] }
123
+ received_3 = Developer.reorder('name DESC').unscope(:order).collect { |dev| [dev.name, dev.id] }
124
+ assert_equal expected_3, received_3
125
+ end
126
+
127
+ def test_unscope_with_where_attributes
128
+ expected = Developer.order('salary DESC').collect(&:name)
129
+ received = DeveloperOrderedBySalary.where(name: 'David').unscope(where: :name).collect(&:name)
130
+ assert_equal expected, received
131
+
132
+ expected_2 = Developer.order('salary DESC').collect(&:name)
133
+ received_2 = DeveloperOrderedBySalary.select("id").where("name" => "Jamis").unscope({:where => :name}, :select).collect(&:name)
134
+ assert_equal expected_2, received_2
135
+
136
+ expected_3 = Developer.order('salary DESC').collect(&:name)
137
+ received_3 = DeveloperOrderedBySalary.select("id").where("name" => "Jamis").unscope(:select, :where).collect(&:name)
138
+ assert_equal expected_3, received_3
139
+
140
+ expected_4 = Developer.order('salary DESC').collect(&:name)
141
+ received_4 = DeveloperOrderedBySalary.where.not("name" => "Jamis").unscope(where: :name).collect(&:name)
142
+ assert_equal expected_4, received_4
143
+
144
+ expected_5 = Developer.order('salary DESC').collect(&:name)
145
+ received_5 = DeveloperOrderedBySalary.where.not("name" => ["Jamis", "David"]).unscope(where: :name).collect(&:name)
146
+ assert_equal expected_5, received_5
147
+ end
148
+
149
+ def test_unscope_comparison_where_clauses
150
+ # unscoped for WHERE (`developers`.`id` <= 2)
151
+ expected = Developer.order('salary DESC').collect(&:name)
152
+ received = DeveloperOrderedBySalary.where(id: -Float::INFINITY..2).unscope(where: :id).collect { |dev| dev.name }
153
+ assert_equal expected, received
154
+
155
+ # unscoped for WHERE (`developers`.`id` < 2)
156
+ expected = Developer.order('salary DESC').collect(&:name)
157
+ received = DeveloperOrderedBySalary.where(id: -Float::INFINITY...2).unscope(where: :id).collect { |dev| dev.name }
158
+ assert_equal expected, received
159
+ end
160
+
161
+ def test_unscope_multiple_where_clauses
162
+ expected = Developer.order('salary DESC').collect { |dev| dev.name }
163
+ received = DeveloperOrderedBySalary.where(name: 'Jamis').where(id: 1).unscope(where: [:name, :id]).collect { |dev| dev.name }
164
+ assert_equal expected, received
165
+ end
166
+
167
+ def test_unscope_string_where_clauses_involved
168
+ dev_relation = Developer.order('salary DESC').where("created_at > ?", 1.year.ago)
169
+ expected = dev_relation.collect { |dev| dev.name }
170
+
171
+ dev_ordered_relation = DeveloperOrderedBySalary.where(name: 'Jamis').where("created_at > ?", 1.year.ago)
172
+ received = dev_ordered_relation.unscope(where: [:name]).collect { |dev| dev.name }
173
+
174
+ assert_equal expected, received
175
+ end
176
+
177
+ def test_unscope_with_grouping_attributes
178
+ expected = Developer.order('salary DESC').collect { |dev| dev.name }
179
+ received = DeveloperOrderedBySalary.group(:name).unscope(:group).collect { |dev| dev.name }
180
+ assert_equal expected, received
181
+
182
+ expected_2 = Developer.order('salary DESC').collect { |dev| dev.name }
183
+ received_2 = DeveloperOrderedBySalary.group("name").unscope(:group).collect { |dev| dev.name }
184
+ assert_equal expected_2, received_2
185
+ end
186
+
187
+ def test_unscope_with_limit_in_query
188
+ expected = Developer.order('salary DESC').collect { |dev| dev.name }
189
+ received = DeveloperOrderedBySalary.limit(1).unscope(:limit).collect { |dev| dev.name }
190
+ assert_equal expected, received
191
+ end
192
+
193
+ def test_order_to_unscope_reordering
194
+ scope = DeveloperOrderedBySalary.order('salary DESC, name ASC').reverse_order.unscope(:order)
195
+ assert !(scope.to_sql =~ /order/i)
196
+ end
197
+
198
+ def test_unscope_reverse_order
199
+ expected = Developer.all.collect { |dev| dev.name }
200
+ received = Developer.order('salary DESC').reverse_order.unscope(:order).collect { |dev| dev.name }
201
+ assert_equal expected, received
202
+ end
203
+
204
+ def test_unscope_select
205
+ expected = Developer.order('salary ASC').collect { |dev| dev.name }
206
+ received = Developer.order('salary DESC').reverse_order.select(:name).unscope(:select).collect { |dev| dev.name }
207
+ assert_equal expected, received
208
+
209
+ expected_2 = Developer.all.collect { |dev| dev.id }
210
+ received_2 = Developer.select(:name).unscope(:select).collect { |dev| dev.id }
211
+ assert_equal expected_2, received_2
212
+ end
213
+
214
+ def test_unscope_offset
215
+ expected = Developer.all.collect { |dev| dev.name }
216
+ received = Developer.offset(5).unscope(:offset).collect { |dev| dev.name }
217
+ assert_equal expected, received
218
+ end
219
+
220
+ def test_unscope_joins_and_select_on_developers_projects
221
+ expected = Developer.all.collect { |dev| dev.name }
222
+ received = Developer.joins('JOIN developers_projects ON id = developer_id').select(:id).unscope(:joins, :select).collect { |dev| dev.name }
223
+ assert_equal expected, received
224
+ end
225
+
226
+ def test_unscope_includes
227
+ expected = Developer.all.collect { |dev| dev.name }
228
+ received = Developer.includes(:projects).select(:id).unscope(:includes, :select).collect { |dev| dev.name }
229
+ assert_equal expected, received
230
+ end
231
+
232
+ def test_unscope_having
233
+ expected = DeveloperOrderedBySalary.all.collect { |dev| dev.name }
234
+ received = DeveloperOrderedBySalary.having("name IN ('Jamis', 'David')").unscope(:having).collect { |dev| dev.name }
235
+ assert_equal expected, received
236
+ end
237
+
238
+ def test_unscope_and_scope
239
+ developer_klass = Class.new(Developer) do
240
+ scope :by_name, -> name { unscope(where: :name).where(name: name) }
241
+ end
242
+
243
+ expected = developer_klass.where(name: 'Jamis').collect { |dev| [dev.name, dev.id] }
244
+ received = developer_klass.where(name: 'David').by_name('Jamis').collect { |dev| [dev.name, dev.id] }
245
+ assert_equal expected, received
246
+ end
247
+
248
+ def test_unscope_errors_with_invalid_value
249
+ assert_raises(ArgumentError) do
250
+ Developer.includes(:projects).where(name: "Jamis").unscope(:stupidly_incorrect_value)
251
+ end
252
+
253
+ assert_raises(ArgumentError) do
254
+ Developer.all.unscope(:includes, :select, :some_broken_value)
255
+ end
256
+
257
+ assert_raises(ArgumentError) do
258
+ Developer.order('name DESC').reverse_order.unscope(:reverse_order)
259
+ end
260
+
261
+ assert_raises(ArgumentError) do
262
+ Developer.order('name DESC').where(name: "Jamis").unscope()
263
+ end
264
+ end
265
+
266
+ def test_unscope_errors_with_non_where_hash_keys
267
+ assert_raises(ArgumentError) do
268
+ Developer.where(name: "Jamis").limit(4).unscope(limit: 4)
269
+ end
270
+
271
+ assert_raises(ArgumentError) do
272
+ Developer.where(name: "Jamis").unscope("where" => :name)
273
+ end
274
+ end
275
+
276
+ def test_unscope_errors_with_non_symbol_or_hash_arguments
277
+ assert_raises(ArgumentError) do
278
+ Developer.where(name: "Jamis").limit(3).unscope("limit")
279
+ end
280
+
281
+ assert_raises(ArgumentError) do
282
+ Developer.select("id").unscope("select")
283
+ end
284
+
285
+ assert_raises(ArgumentError) do
286
+ Developer.select("id").unscope(5)
287
+ end
288
+ end
289
+
290
+ def test_unscope_merging
291
+ merged = Developer.where(name: "Jamis").merge(Developer.unscope(:where))
292
+ assert merged.where_values.empty?
293
+ assert !merged.where(name: "Jon").where_values.empty?
294
+ end
295
+
296
+ def test_order_in_default_scope_should_not_prevail
297
+ expected = Developer.all.merge!(order: 'salary desc').to_a.collect { |dev| dev.salary }
298
+ received = DeveloperOrderedBySalary.all.merge!(order: 'salary').to_a.collect { |dev| dev.salary }
299
+ assert_equal expected, received
300
+ end
301
+
302
+ def test_create_attribute_overwrites_default_scoping
303
+ assert_equal 'David', PoorDeveloperCalledJamis.create!(:name => 'David').name
304
+ assert_equal 200000, PoorDeveloperCalledJamis.create!(:name => 'David', :salary => 200000).salary
305
+ end
306
+
307
+ def test_create_attribute_overwrites_default_values
308
+ assert_equal nil, PoorDeveloperCalledJamis.create!(:salary => nil).salary
309
+ assert_equal 50000, PoorDeveloperCalledJamis.create!(:name => 'David').salary
310
+ end
311
+
312
+ def test_default_scope_attribute
313
+ jamis = PoorDeveloperCalledJamis.new(:name => 'David')
314
+ assert_equal 50000, jamis.salary
315
+ end
316
+
317
+ def test_where_attribute
318
+ aaron = PoorDeveloperCalledJamis.where(:salary => 20).new(:name => 'Aaron')
319
+ assert_equal 20, aaron.salary
320
+ assert_equal 'Aaron', aaron.name
321
+ end
322
+
323
+ def test_where_attribute_merge
324
+ aaron = PoorDeveloperCalledJamis.where(:name => 'foo').new(:name => 'Aaron')
325
+ assert_equal 'Aaron', aaron.name
326
+ end
327
+
328
+ def test_scope_composed_by_limit_and_then_offset_is_equal_to_scope_composed_by_offset_and_then_limit
329
+ posts_limit_offset = Post.limit(3).offset(2)
330
+ posts_offset_limit = Post.offset(2).limit(3)
331
+ assert_equal posts_limit_offset, posts_offset_limit
332
+ end
333
+
334
+ def test_create_with_merge
335
+ aaron = PoorDeveloperCalledJamis.create_with(:name => 'foo', :salary => 20).merge(
336
+ PoorDeveloperCalledJamis.create_with(:name => 'Aaron')).new
337
+ assert_equal 20, aaron.salary
338
+ assert_equal 'Aaron', aaron.name
339
+
340
+ aaron = PoorDeveloperCalledJamis.create_with(:name => 'foo', :salary => 20).
341
+ create_with(:name => 'Aaron').new
342
+ assert_equal 20, aaron.salary
343
+ assert_equal 'Aaron', aaron.name
344
+ end
345
+
346
+ def test_create_with_reset
347
+ jamis = PoorDeveloperCalledJamis.create_with(:name => 'Aaron').create_with(nil).new
348
+ assert_equal 'Jamis', jamis.name
349
+ end
350
+
351
+ # FIXME: I don't know if this is *desired* behavior, but it is *today's*
352
+ # behavior.
353
+ def test_create_with_empty_hash_will_not_reset
354
+ jamis = PoorDeveloperCalledJamis.create_with(:name => 'Aaron').create_with({}).new
355
+ assert_equal 'Aaron', jamis.name
356
+ end
357
+
358
+ def test_unscoped_with_named_scope_should_not_have_default_scope
359
+ assert_equal [DeveloperCalledJamis.find(developers(:poor_jamis).id)], DeveloperCalledJamis.poor
360
+
361
+ assert DeveloperCalledJamis.unscoped.poor.include?(developers(:david).becomes(DeveloperCalledJamis))
362
+
363
+ assert_equal 11, DeveloperCalledJamis.unscoped.length
364
+ assert_equal 1, DeveloperCalledJamis.poor.length
365
+ assert_equal 10, DeveloperCalledJamis.unscoped.poor.length
366
+ assert_equal 10, DeveloperCalledJamis.unscoped { DeveloperCalledJamis.poor }.length
367
+ end
368
+
369
+ def test_default_scope_select_ignored_by_aggregations
370
+ assert_equal DeveloperWithSelect.all.to_a.count, DeveloperWithSelect.count
371
+ end
372
+
373
+ def test_default_scope_select_ignored_by_grouped_aggregations
374
+ assert_equal Hash[Developer.all.group_by(&:salary).map { |s, d| [s, d.count] }],
375
+ DeveloperWithSelect.group(:salary).count
376
+ end
377
+
378
+ def test_default_scope_order_ignored_by_aggregations
379
+ assert_equal DeveloperOrderedBySalary.all.count, DeveloperOrderedBySalary.count
380
+ end
381
+
382
+ def test_default_scope_find_last
383
+ assert DeveloperOrderedBySalary.count > 1, "need more than one row for test"
384
+
385
+ lowest_salary_dev = DeveloperOrderedBySalary.find(developers(:poor_jamis).id)
386
+ assert_equal lowest_salary_dev, DeveloperOrderedBySalary.last
387
+ end
388
+
389
+ def test_default_scope_include_with_count
390
+ d = DeveloperWithIncludes.create!
391
+ d.audit_logs.create! :message => 'foo'
392
+
393
+ assert_equal 1, DeveloperWithIncludes.where(:audit_logs => { :message => 'foo' }).count
394
+ end
395
+
396
+ def test_default_scope_with_references_works_through_collection_association
397
+ post = PostWithCommentWithDefaultScopeReferencesAssociation.create!(title: "Hello World", body: "Here we go.")
398
+ comment = post.comment_with_default_scope_references_associations.create!(body: "Great post.", developer_id: Developer.first.id)
399
+ assert_equal comment, post.comment_with_default_scope_references_associations.to_a.first
400
+ end
401
+
402
+ def test_default_scope_with_references_works_through_association
403
+ post = PostWithCommentWithDefaultScopeReferencesAssociation.create!(title: "Hello World", body: "Here we go.")
404
+ comment = post.comment_with_default_scope_references_associations.create!(body: "Great post.", developer_id: Developer.first.id)
405
+ assert_equal comment, post.first_comment
406
+ end
407
+
408
+ def test_default_scope_with_references_works_with_find_by
409
+ post = PostWithCommentWithDefaultScopeReferencesAssociation.create!(title: "Hello World", body: "Here we go.")
410
+ comment = post.comment_with_default_scope_references_associations.create!(body: "Great post.", developer_id: Developer.first.id)
411
+ assert_equal comment, CommentWithDefaultScopeReferencesAssociation.find_by(id: comment.id)
412
+ end
413
+
414
+ unless in_memory_db?
415
+ def test_default_scope_is_threadsafe
416
+ threads = []
417
+ assert_not_equal 1, ThreadsafeDeveloper.unscoped.count
418
+
419
+ threads << Thread.new do
420
+ Thread.current[:long_default_scope] = true
421
+ assert_equal 1, ThreadsafeDeveloper.all.to_a.count
422
+ ThreadsafeDeveloper.connection.close
423
+ end
424
+ threads << Thread.new do
425
+ assert_equal 1, ThreadsafeDeveloper.all.to_a.count
426
+ ThreadsafeDeveloper.connection.close
427
+ end
428
+ threads.each(&:join)
429
+ end
430
+ end
431
+
432
+ test "additional conditions are ANDed with the default scope" do
433
+ scope = DeveloperCalledJamis.where(name: "David")
434
+ assert_equal 2, scope.where_values.length
435
+ assert_equal [], scope.to_a
436
+ end
437
+
438
+ test "additional conditions in a scope are ANDed with the default scope" do
439
+ scope = DeveloperCalledJamis.david
440
+ assert_equal 2, scope.where_values.length
441
+ assert_equal [], scope.to_a
442
+ end
443
+
444
+ test "a scope can remove the condition from the default scope" do
445
+ scope = DeveloperCalledJamis.david2
446
+ assert_equal 1, scope.where_values.length
447
+ assert_equal Developer.where(name: "David").map(&:id), scope.map(&:id)
448
+ end
449
+
450
+ def test_with_abstract_class_where_clause_should_not_be_duplicated
451
+ scope = Bus.all
452
+ assert_equal scope.where_values.length, 1
453
+ end
454
+ end