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,524 +1,524 @@
1
- require "cases/helper"
2
- require 'models/post'
3
- require 'models/topic'
4
- require 'models/comment'
5
- require 'models/reply'
6
- require 'models/author'
7
- require 'models/developer'
8
- require 'models/computer'
9
-
10
- class NamedScopingTest < ActiveRecord::TestCase
11
- fixtures :posts, :authors, :topics, :comments, :author_addresses
12
-
13
- def test_implements_enumerable
14
- assert !Topic.all.empty?
15
-
16
- assert_equal Topic.all.to_a, Topic.base
17
- assert_equal Topic.all.to_a, Topic.base.to_a
18
- assert_equal Topic.first, Topic.base.first
19
- assert_equal Topic.all.to_a, Topic.base.map { |i| i }
20
- end
21
-
22
- def test_found_items_are_cached
23
- all_posts = Topic.base
24
-
25
- assert_queries(1) do
26
- all_posts.collect
27
- all_posts.collect
28
- end
29
- end
30
-
31
- def test_reload_expires_cache_of_found_items
32
- all_posts = Topic.base
33
- all_posts.to_a
34
-
35
- new_post = Topic.create!
36
- assert !all_posts.include?(new_post)
37
- assert all_posts.reload.include?(new_post)
38
- end
39
-
40
- def test_delegates_finds_and_calculations_to_the_base_class
41
- assert !Topic.all.empty?
42
-
43
- assert_equal Topic.all.to_a, Topic.base.to_a
44
- assert_equal Topic.first, Topic.base.first
45
- assert_equal Topic.count, Topic.base.count
46
- assert_equal Topic.average(:replies_count), Topic.base.average(:replies_count)
47
- end
48
-
49
- def test_method_missing_priority_when_delegating
50
- klazz = Class.new(ActiveRecord::Base) do
51
- self.table_name = "topics"
52
- scope :since, Proc.new { where('written_on >= ?', Time.now - 1.day) }
53
- scope :to, Proc.new { where('written_on <= ?', Time.now) }
54
- end
55
- assert_equal klazz.to.since.to_a, klazz.since.to.to_a
56
- end
57
-
58
- def test_scope_should_respond_to_own_methods_and_methods_of_the_proxy
59
- assert Topic.approved.respond_to?(:limit)
60
- assert Topic.approved.respond_to?(:count)
61
- assert Topic.approved.respond_to?(:length)
62
- end
63
-
64
- def test_scopes_with_options_limit_finds_to_those_matching_the_criteria_specified
65
- assert !Topic.all.merge!(:where => {:approved => true}).to_a.empty?
66
-
67
- assert_equal Topic.all.merge!(:where => {:approved => true}).to_a, Topic.approved
68
- assert_equal Topic.where(:approved => true).count, Topic.approved.count
69
- end
70
-
71
- def test_scopes_with_string_name_can_be_composed
72
- # NOTE that scopes defined with a string as a name worked on their own
73
- # but when called on another scope the other scope was completely replaced
74
- assert_equal Topic.replied.approved, Topic.replied.approved_as_string
75
- end
76
-
77
- def test_scopes_are_composable
78
- assert_equal((approved = Topic.all.merge!(:where => {:approved => true}).to_a), Topic.approved)
79
- assert_equal((replied = Topic.all.merge!(:where => 'replies_count > 0').to_a), Topic.replied)
80
- assert !(approved == replied)
81
- assert !(approved & replied).empty?
82
-
83
- assert_equal approved & replied, Topic.approved.replied
84
- end
85
-
86
- def test_procedural_scopes
87
- topics_written_before_the_third = Topic.where('written_on < ?', topics(:third).written_on)
88
- topics_written_before_the_second = Topic.where('written_on < ?', topics(:second).written_on)
89
- assert_not_equal topics_written_before_the_second, topics_written_before_the_third
90
-
91
- assert_equal topics_written_before_the_third, Topic.written_before(topics(:third).written_on)
92
- assert_equal topics_written_before_the_second, Topic.written_before(topics(:second).written_on)
93
- end
94
-
95
- def test_procedural_scopes_returning_nil
96
- all_topics = Topic.all
97
-
98
- assert_equal all_topics, Topic.written_before(nil)
99
- end
100
-
101
- def test_scope_with_object
102
- objects = Topic.with_object
103
- assert_operator objects.length, :>, 0
104
- assert objects.all?(&:approved?), 'all objects should be approved'
105
- end
106
-
107
- def test_has_many_associations_have_access_to_scopes
108
- assert_not_equal Post.containing_the_letter_a, authors(:david).posts
109
- assert !Post.containing_the_letter_a.empty?
110
-
111
- assert_equal authors(:david).posts & Post.containing_the_letter_a, authors(:david).posts.containing_the_letter_a
112
- end
113
-
114
- def test_scope_with_STI
115
- assert_equal 3,Post.containing_the_letter_a.count
116
- assert_equal 1,SpecialPost.containing_the_letter_a.count
117
- end
118
-
119
- def test_has_many_through_associations_have_access_to_scopes
120
- assert_not_equal Comment.containing_the_letter_e, authors(:david).comments
121
- assert !Comment.containing_the_letter_e.empty?
122
-
123
- assert_equal authors(:david).comments & Comment.containing_the_letter_e, authors(:david).comments.containing_the_letter_e
124
- end
125
-
126
- def test_scopes_honor_current_scopes_from_when_defined
127
- assert !Post.ranked_by_comments.limit_by(5).empty?
128
- assert !authors(:david).posts.ranked_by_comments.limit_by(5).empty?
129
- assert_not_equal Post.ranked_by_comments.limit_by(5), authors(:david).posts.ranked_by_comments.limit_by(5)
130
- assert_not_equal Post.top(5), authors(:david).posts.top(5)
131
- # Oracle sometimes sorts differently if WHERE condition is changed
132
- assert_equal authors(:david).posts.ranked_by_comments.limit_by(5).to_a.sort_by(&:id), authors(:david).posts.top(5).to_a.sort_by(&:id)
133
- assert_equal Post.ranked_by_comments.limit_by(5), Post.top(5)
134
- end
135
-
136
- def test_scopes_body_is_a_callable
137
- e = assert_raises ArgumentError do
138
- Class.new(Post).class_eval { scope :containing_the_letter_z, where("body LIKE '%z%'") }
139
- end
140
- assert_equal "The scope body needs to be callable.", e.message
141
- end
142
-
143
- def test_active_records_have_scope_named__all__
144
- assert !Topic.all.empty?
145
-
146
- assert_equal Topic.all.to_a, Topic.base
147
- end
148
-
149
- def test_active_records_have_scope_named__scoped__
150
- scope = Topic.where("content LIKE '%Have%'")
151
- assert !scope.empty?
152
-
153
- assert_equal scope, Topic.all.merge!(where: "content LIKE '%Have%'")
154
- end
155
-
156
- def test_first_and_last_should_allow_integers_for_limit
157
- assert_equal Topic.base.first(2), Topic.base.to_a.first(2)
158
- assert_equal Topic.base.last(2), Topic.base.order("id").to_a.last(2)
159
- end
160
-
161
- def test_first_and_last_should_not_use_query_when_results_are_loaded
162
- topics = Topic.base
163
- topics.reload # force load
164
- assert_no_queries do
165
- topics.first
166
- topics.last
167
- end
168
- end
169
-
170
- def test_empty_should_not_load_results
171
- topics = Topic.base
172
- assert_queries(2) do
173
- topics.empty? # use count query
174
- topics.collect # force load
175
- topics.empty? # use loaded (no query)
176
- end
177
- end
178
-
179
- def test_any_should_not_load_results
180
- topics = Topic.base
181
- assert_queries(2) do
182
- topics.any? # use count query
183
- topics.collect # force load
184
- topics.any? # use loaded (no query)
185
- end
186
- end
187
-
188
- def test_any_should_call_proxy_found_if_using_a_block
189
- topics = Topic.base
190
- assert_queries(1) do
191
- topics.expects(:empty?).never
192
- topics.any? { true }
193
- end
194
- end
195
-
196
- def test_any_should_not_fire_query_if_scope_loaded
197
- topics = Topic.base
198
- topics.collect # force load
199
- assert_no_queries { assert topics.any? }
200
- end
201
-
202
- def test_model_class_should_respond_to_any
203
- assert Topic.any?
204
- Topic.delete_all
205
- assert !Topic.any?
206
- end
207
-
208
- def test_many_should_not_load_results
209
- topics = Topic.base
210
- assert_queries(2) do
211
- topics.many? # use count query
212
- topics.collect # force load
213
- topics.many? # use loaded (no query)
214
- end
215
- end
216
-
217
- def test_many_should_call_proxy_found_if_using_a_block
218
- topics = Topic.base
219
- assert_queries(1) do
220
- topics.expects(:size).never
221
- topics.many? { true }
222
- end
223
- end
224
-
225
- def test_many_should_not_fire_query_if_scope_loaded
226
- topics = Topic.base
227
- topics.collect # force load
228
- assert_no_queries { assert topics.many? }
229
- end
230
-
231
- def test_many_should_return_false_if_none_or_one
232
- topics = Topic.base.where(:id => 0)
233
- assert !topics.many?
234
- topics = Topic.base.where(:id => 1)
235
- assert !topics.many?
236
- end
237
-
238
- def test_many_should_return_true_if_more_than_one
239
- assert Topic.base.many?
240
- end
241
-
242
- def test_model_class_should_respond_to_many
243
- Topic.delete_all
244
- assert !Topic.many?
245
- Topic.create!
246
- assert !Topic.many?
247
- Topic.create!
248
- assert Topic.many?
249
- end
250
-
251
- def test_should_build_on_top_of_scope
252
- topic = Topic.approved.build({})
253
- assert topic.approved
254
- end
255
-
256
- def test_should_build_new_on_top_of_scope
257
- topic = Topic.approved.new
258
- assert topic.approved
259
- end
260
-
261
- def test_should_create_on_top_of_scope
262
- topic = Topic.approved.create({})
263
- assert topic.approved
264
- end
265
-
266
- def test_should_create_with_bang_on_top_of_scope
267
- topic = Topic.approved.create!({})
268
- assert topic.approved
269
- end
270
-
271
- def test_should_build_on_top_of_chained_scopes
272
- topic = Topic.approved.by_lifo.build({})
273
- assert topic.approved
274
- assert_equal 'lifo', topic.author_name
275
- end
276
-
277
- def test_reserved_scope_names
278
- klass = Class.new(ActiveRecord::Base) do
279
- self.table_name = "topics"
280
-
281
- scope :approved, -> { where(approved: true) }
282
-
283
- class << self
284
- public
285
- def pub; end
286
-
287
- private
288
- def pri; end
289
-
290
- protected
291
- def pro; end
292
- end
293
- end
294
-
295
- subklass = Class.new(klass)
296
-
297
- conflicts = [
298
- :create, # public class method on AR::Base
299
- :relation, # private class method on AR::Base
300
- :new, # redefined class method on AR::Base
301
- :all, # a default scope
302
- :public, # some imporant methods on Module and Class
303
- :protected,
304
- :private,
305
- :name,
306
- :parent,
307
- :superclass
308
- ]
309
-
310
- non_conflicts = [
311
- :find_by_title, # dynamic finder method
312
- :approved, # existing scope
313
- :pub, # existing public class method
314
- :pri, # existing private class method
315
- :pro, # existing protected class method
316
- :open, # a ::Kernel method
317
- ]
318
-
319
- conflicts.each do |name|
320
- assert_raises(ArgumentError, "scope `#{name}` should not be allowed") do
321
- klass.class_eval { scope name, ->{ where(approved: true) } }
322
- end
323
-
324
- assert_raises(ArgumentError, "scope `#{name}` should not be allowed") do
325
- subklass.class_eval { scope name, ->{ where(approved: true) } }
326
- end
327
- end
328
-
329
- non_conflicts.each do |name|
330
- assert_nothing_raised do
331
- silence_warnings do
332
- klass.class_eval { scope name, ->{ where(approved: true) } }
333
- end
334
- end
335
-
336
- assert_nothing_raised do
337
- subklass.class_eval { scope name, ->{ where(approved: true) } }
338
- end
339
- end
340
- end
341
-
342
- # Method delegation for scope names which look like /\A[a-zA-Z_]\w*[!?]?\z/
343
- # has been done by evaluating a string with a plain def statement. For scope
344
- # names which contain spaces this approach doesn't work.
345
- def test_spaces_in_scope_names
346
- klass = Class.new(ActiveRecord::Base) do
347
- self.table_name = "topics"
348
- scope :"title containing space", -> { where("title LIKE '% %'") }
349
- scope :approved, -> { where(:approved => true) }
350
- end
351
- assert_equal klass.send(:"title containing space"), klass.where("title LIKE '% %'")
352
- assert_equal klass.approved.send(:"title containing space"), klass.approved.where("title LIKE '% %'")
353
- end
354
-
355
- def test_find_all_should_behave_like_select
356
- assert_equal Topic.base.to_a.select(&:approved), Topic.base.to_a.find_all(&:approved)
357
- end
358
-
359
- def test_rand_should_select_a_random_object_from_proxy
360
- assert_kind_of Topic, Topic.approved.sample
361
- end
362
-
363
- def test_should_use_where_in_query_for_scope
364
- assert_equal Developer.where(name: 'Jamis').to_set, Developer.where(id: Developer.jamises).to_set
365
- end
366
-
367
- def test_size_should_use_count_when_results_are_not_loaded
368
- topics = Topic.base
369
- assert_queries(1) do
370
- assert_sql(/COUNT/i) { topics.size }
371
- end
372
- end
373
-
374
- def test_size_should_use_length_when_results_are_loaded
375
- topics = Topic.base
376
- topics.reload # force load
377
- assert_no_queries do
378
- topics.size # use loaded (no query)
379
- end
380
- end
381
-
382
- def test_should_not_duplicates_where_values
383
- where_values = Topic.where("1=1").scope_with_lambda.where_values
384
- assert_equal ["1=1"], where_values
385
- end
386
-
387
- def test_chaining_with_duplicate_joins
388
- join = "INNER JOIN comments ON comments.post_id = posts.id"
389
- post = Post.find(1)
390
- assert_equal post.comments.size, Post.joins(join).joins(join).where("posts.id = #{post.id}").size
391
- end
392
-
393
- def test_chaining_applies_last_conditions_when_creating
394
- post = Topic.rejected.new
395
- assert !post.approved?
396
-
397
- post = Topic.rejected.approved.new
398
- assert post.approved?
399
-
400
- post = Topic.approved.rejected.new
401
- assert !post.approved?
402
-
403
- post = Topic.approved.rejected.approved.new
404
- assert post.approved?
405
- end
406
-
407
- def test_chaining_combines_conditions_when_searching
408
- # Normal hash conditions
409
- assert_equal Topic.where(approved: false).where(approved: true).to_a, Topic.rejected.approved.to_a
410
- assert_equal Topic.where(approved: true).where(approved: false).to_a, Topic.approved.rejected.to_a
411
-
412
- # Nested hash conditions with same keys
413
- assert_equal [], Post.with_special_comments.with_very_special_comments.to_a
414
-
415
- # Nested hash conditions with different keys
416
- assert_equal [posts(:sti_comments)], Post.with_special_comments.with_post(4).to_a.uniq
417
- end
418
-
419
- def test_scopes_batch_finders
420
- assert_equal 4, Topic.approved.count
421
-
422
- assert_queries(5) do
423
- Topic.approved.find_each(:batch_size => 1) {|t| assert t.approved? }
424
- end
425
-
426
- assert_queries(3) do
427
- Topic.approved.find_in_batches(:batch_size => 2) do |group|
428
- group.each {|t| assert t.approved? }
429
- end
430
- end
431
- end
432
-
433
- def test_table_names_for_chaining_scopes_with_and_without_table_name_included
434
- assert_nothing_raised do
435
- Comment.for_first_post.for_first_author.to_a
436
- end
437
- end
438
-
439
- def test_scopes_on_relations
440
- # Topic.replied
441
- approved_topics = Topic.all.approved.order('id DESC')
442
- assert_equal topics(:fifth), approved_topics.first
443
-
444
- replied_approved_topics = approved_topics.replied
445
- assert_equal topics(:third), replied_approved_topics.first
446
- end
447
-
448
- def test_index_on_scope
449
- approved = Topic.approved.order('id ASC')
450
- assert_equal topics(:second), approved[0]
451
- assert approved.loaded?
452
- end
453
-
454
- def test_nested_scopes_queries_size
455
- assert_queries(1) do
456
- Topic.approved.by_lifo.replied.written_before(Time.now).to_a
457
- end
458
- end
459
-
460
- # Note: these next two are kinda odd because they are essentially just testing that the
461
- # query cache works as it should, but they are here for legacy reasons as they was previously
462
- # a separate cache on association proxies, and these show that that is not necessary.
463
- def test_scopes_are_cached_on_associations
464
- post = posts(:welcome)
465
-
466
- Post.cache do
467
- assert_queries(1) { post.comments.containing_the_letter_e.to_a }
468
- assert_no_queries { post.comments.containing_the_letter_e.to_a }
469
- end
470
- end
471
-
472
- def test_scopes_with_arguments_are_cached_on_associations
473
- post = posts(:welcome)
474
-
475
- Post.cache do
476
- one = assert_queries(1) { post.comments.limit_by(1).to_a }
477
- assert_equal 1, one.size
478
-
479
- two = assert_queries(1) { post.comments.limit_by(2).to_a }
480
- assert_equal 2, two.size
481
-
482
- assert_no_queries { post.comments.limit_by(1).to_a }
483
- assert_no_queries { post.comments.limit_by(2).to_a }
484
- end
485
- end
486
-
487
- def test_scopes_to_get_newest
488
- post = posts(:welcome)
489
- old_last_comment = post.comments.newest
490
- new_comment = post.comments.create(:body => "My new comment")
491
- assert_equal new_comment, post.comments.newest
492
- assert_not_equal old_last_comment, post.comments.newest
493
- end
494
-
495
- def test_scopes_are_reset_on_association_reload
496
- post = posts(:welcome)
497
-
498
- [:destroy_all, :reset, :delete_all].each do |method|
499
- before = post.comments.containing_the_letter_e
500
- post.association(:comments).send(method)
501
- assert before.object_id != post.comments.containing_the_letter_e.object_id, "CollectionAssociation##{method} should reset the named scopes cache"
502
- end
503
- end
504
-
505
- def test_scoped_are_lazy_loaded_if_table_still_does_not_exist
506
- assert_nothing_raised do
507
- require "models/without_table"
508
- end
509
- end
510
-
511
- def test_eager_default_scope_relations_are_remove
512
- klass = Class.new(ActiveRecord::Base)
513
- klass.table_name = 'posts'
514
-
515
- assert_raises(ArgumentError) do
516
- klass.send(:default_scope, klass.where(:id => posts(:welcome).id))
517
- end
518
- end
519
-
520
- def test_subclass_merges_scopes_properly
521
- assert_equal 1, SpecialComment.where(body: 'go crazy').created.count
522
- end
523
-
524
- end
1
+ require "cases/helper"
2
+ require 'models/post'
3
+ require 'models/topic'
4
+ require 'models/comment'
5
+ require 'models/reply'
6
+ require 'models/author'
7
+ require 'models/developer'
8
+ require 'models/computer'
9
+
10
+ class NamedScopingTest < ActiveRecord::TestCase
11
+ fixtures :posts, :authors, :topics, :comments, :author_addresses
12
+
13
+ def test_implements_enumerable
14
+ assert !Topic.all.empty?
15
+
16
+ assert_equal Topic.all.to_a, Topic.base
17
+ assert_equal Topic.all.to_a, Topic.base.to_a
18
+ assert_equal Topic.first, Topic.base.first
19
+ assert_equal Topic.all.to_a, Topic.base.map { |i| i }
20
+ end
21
+
22
+ def test_found_items_are_cached
23
+ all_posts = Topic.base
24
+
25
+ assert_queries(1) do
26
+ all_posts.collect
27
+ all_posts.collect
28
+ end
29
+ end
30
+
31
+ def test_reload_expires_cache_of_found_items
32
+ all_posts = Topic.base
33
+ all_posts.to_a
34
+
35
+ new_post = Topic.create!
36
+ assert !all_posts.include?(new_post)
37
+ assert all_posts.reload.include?(new_post)
38
+ end
39
+
40
+ def test_delegates_finds_and_calculations_to_the_base_class
41
+ assert !Topic.all.empty?
42
+
43
+ assert_equal Topic.all.to_a, Topic.base.to_a
44
+ assert_equal Topic.first, Topic.base.first
45
+ assert_equal Topic.count, Topic.base.count
46
+ assert_equal Topic.average(:replies_count), Topic.base.average(:replies_count)
47
+ end
48
+
49
+ def test_method_missing_priority_when_delegating
50
+ klazz = Class.new(ActiveRecord::Base) do
51
+ self.table_name = "topics"
52
+ scope :since, Proc.new { where('written_on >= ?', Time.now - 1.day) }
53
+ scope :to, Proc.new { where('written_on <= ?', Time.now) }
54
+ end
55
+ assert_equal klazz.to.since.to_a, klazz.since.to.to_a
56
+ end
57
+
58
+ def test_scope_should_respond_to_own_methods_and_methods_of_the_proxy
59
+ assert Topic.approved.respond_to?(:limit)
60
+ assert Topic.approved.respond_to?(:count)
61
+ assert Topic.approved.respond_to?(:length)
62
+ end
63
+
64
+ def test_scopes_with_options_limit_finds_to_those_matching_the_criteria_specified
65
+ assert !Topic.all.merge!(:where => {:approved => true}).to_a.empty?
66
+
67
+ assert_equal Topic.all.merge!(:where => {:approved => true}).to_a, Topic.approved
68
+ assert_equal Topic.where(:approved => true).count, Topic.approved.count
69
+ end
70
+
71
+ def test_scopes_with_string_name_can_be_composed
72
+ # NOTE that scopes defined with a string as a name worked on their own
73
+ # but when called on another scope the other scope was completely replaced
74
+ assert_equal Topic.replied.approved, Topic.replied.approved_as_string
75
+ end
76
+
77
+ def test_scopes_are_composable
78
+ assert_equal((approved = Topic.all.merge!(:where => {:approved => true}).to_a), Topic.approved)
79
+ assert_equal((replied = Topic.all.merge!(:where => 'replies_count > 0').to_a), Topic.replied)
80
+ assert !(approved == replied)
81
+ assert !(approved & replied).empty?
82
+
83
+ assert_equal approved & replied, Topic.approved.replied
84
+ end
85
+
86
+ def test_procedural_scopes
87
+ topics_written_before_the_third = Topic.where('written_on < ?', topics(:third).written_on)
88
+ topics_written_before_the_second = Topic.where('written_on < ?', topics(:second).written_on)
89
+ assert_not_equal topics_written_before_the_second, topics_written_before_the_third
90
+
91
+ assert_equal topics_written_before_the_third, Topic.written_before(topics(:third).written_on)
92
+ assert_equal topics_written_before_the_second, Topic.written_before(topics(:second).written_on)
93
+ end
94
+
95
+ def test_procedural_scopes_returning_nil
96
+ all_topics = Topic.all
97
+
98
+ assert_equal all_topics, Topic.written_before(nil)
99
+ end
100
+
101
+ def test_scope_with_object
102
+ objects = Topic.with_object
103
+ assert_operator objects.length, :>, 0
104
+ assert objects.all?(&:approved?), 'all objects should be approved'
105
+ end
106
+
107
+ def test_has_many_associations_have_access_to_scopes
108
+ assert_not_equal Post.containing_the_letter_a, authors(:david).posts
109
+ assert !Post.containing_the_letter_a.empty?
110
+
111
+ assert_equal authors(:david).posts & Post.containing_the_letter_a, authors(:david).posts.containing_the_letter_a
112
+ end
113
+
114
+ def test_scope_with_STI
115
+ assert_equal 3,Post.containing_the_letter_a.count
116
+ assert_equal 1,SpecialPost.containing_the_letter_a.count
117
+ end
118
+
119
+ def test_has_many_through_associations_have_access_to_scopes
120
+ assert_not_equal Comment.containing_the_letter_e, authors(:david).comments
121
+ assert !Comment.containing_the_letter_e.empty?
122
+
123
+ assert_equal authors(:david).comments & Comment.containing_the_letter_e, authors(:david).comments.containing_the_letter_e
124
+ end
125
+
126
+ def test_scopes_honor_current_scopes_from_when_defined
127
+ assert !Post.ranked_by_comments.limit_by(5).empty?
128
+ assert !authors(:david).posts.ranked_by_comments.limit_by(5).empty?
129
+ assert_not_equal Post.ranked_by_comments.limit_by(5), authors(:david).posts.ranked_by_comments.limit_by(5)
130
+ assert_not_equal Post.top(5), authors(:david).posts.top(5)
131
+ # Oracle sometimes sorts differently if WHERE condition is changed
132
+ assert_equal authors(:david).posts.ranked_by_comments.limit_by(5).to_a.sort_by(&:id), authors(:david).posts.top(5).to_a.sort_by(&:id)
133
+ assert_equal Post.ranked_by_comments.limit_by(5), Post.top(5)
134
+ end
135
+
136
+ def test_scopes_body_is_a_callable
137
+ e = assert_raises ArgumentError do
138
+ Class.new(Post).class_eval { scope :containing_the_letter_z, where("body LIKE '%z%'") }
139
+ end
140
+ assert_equal "The scope body needs to be callable.", e.message
141
+ end
142
+
143
+ def test_active_records_have_scope_named__all__
144
+ assert !Topic.all.empty?
145
+
146
+ assert_equal Topic.all.to_a, Topic.base
147
+ end
148
+
149
+ def test_active_records_have_scope_named__scoped__
150
+ scope = Topic.where("content LIKE '%Have%'")
151
+ assert !scope.empty?
152
+
153
+ assert_equal scope, Topic.all.merge!(where: "content LIKE '%Have%'")
154
+ end
155
+
156
+ def test_first_and_last_should_allow_integers_for_limit
157
+ assert_equal Topic.base.first(2), Topic.base.to_a.first(2)
158
+ assert_equal Topic.base.last(2), Topic.base.order("id").to_a.last(2)
159
+ end
160
+
161
+ def test_first_and_last_should_not_use_query_when_results_are_loaded
162
+ topics = Topic.base
163
+ topics.reload # force load
164
+ assert_no_queries do
165
+ topics.first
166
+ topics.last
167
+ end
168
+ end
169
+
170
+ def test_empty_should_not_load_results
171
+ topics = Topic.base
172
+ assert_queries(2) do
173
+ topics.empty? # use count query
174
+ topics.collect # force load
175
+ topics.empty? # use loaded (no query)
176
+ end
177
+ end
178
+
179
+ def test_any_should_not_load_results
180
+ topics = Topic.base
181
+ assert_queries(2) do
182
+ topics.any? # use count query
183
+ topics.collect # force load
184
+ topics.any? # use loaded (no query)
185
+ end
186
+ end
187
+
188
+ def test_any_should_call_proxy_found_if_using_a_block
189
+ topics = Topic.base
190
+ assert_queries(1) do
191
+ topics.expects(:empty?).never
192
+ topics.any? { true }
193
+ end
194
+ end
195
+
196
+ def test_any_should_not_fire_query_if_scope_loaded
197
+ topics = Topic.base
198
+ topics.collect # force load
199
+ assert_no_queries { assert topics.any? }
200
+ end
201
+
202
+ def test_model_class_should_respond_to_any
203
+ assert Topic.any?
204
+ Topic.delete_all
205
+ assert !Topic.any?
206
+ end
207
+
208
+ def test_many_should_not_load_results
209
+ topics = Topic.base
210
+ assert_queries(2) do
211
+ topics.many? # use count query
212
+ topics.collect # force load
213
+ topics.many? # use loaded (no query)
214
+ end
215
+ end
216
+
217
+ def test_many_should_call_proxy_found_if_using_a_block
218
+ topics = Topic.base
219
+ assert_queries(1) do
220
+ topics.expects(:size).never
221
+ topics.many? { true }
222
+ end
223
+ end
224
+
225
+ def test_many_should_not_fire_query_if_scope_loaded
226
+ topics = Topic.base
227
+ topics.collect # force load
228
+ assert_no_queries { assert topics.many? }
229
+ end
230
+
231
+ def test_many_should_return_false_if_none_or_one
232
+ topics = Topic.base.where(:id => 0)
233
+ assert !topics.many?
234
+ topics = Topic.base.where(:id => 1)
235
+ assert !topics.many?
236
+ end
237
+
238
+ def test_many_should_return_true_if_more_than_one
239
+ assert Topic.base.many?
240
+ end
241
+
242
+ def test_model_class_should_respond_to_many
243
+ Topic.delete_all
244
+ assert !Topic.many?
245
+ Topic.create!
246
+ assert !Topic.many?
247
+ Topic.create!
248
+ assert Topic.many?
249
+ end
250
+
251
+ def test_should_build_on_top_of_scope
252
+ topic = Topic.approved.build({})
253
+ assert topic.approved
254
+ end
255
+
256
+ def test_should_build_new_on_top_of_scope
257
+ topic = Topic.approved.new
258
+ assert topic.approved
259
+ end
260
+
261
+ def test_should_create_on_top_of_scope
262
+ topic = Topic.approved.create({})
263
+ assert topic.approved
264
+ end
265
+
266
+ def test_should_create_with_bang_on_top_of_scope
267
+ topic = Topic.approved.create!({})
268
+ assert topic.approved
269
+ end
270
+
271
+ def test_should_build_on_top_of_chained_scopes
272
+ topic = Topic.approved.by_lifo.build({})
273
+ assert topic.approved
274
+ assert_equal 'lifo', topic.author_name
275
+ end
276
+
277
+ def test_reserved_scope_names
278
+ klass = Class.new(ActiveRecord::Base) do
279
+ self.table_name = "topics"
280
+
281
+ scope :approved, -> { where(approved: true) }
282
+
283
+ class << self
284
+ public
285
+ def pub; end
286
+
287
+ private
288
+ def pri; end
289
+
290
+ protected
291
+ def pro; end
292
+ end
293
+ end
294
+
295
+ subklass = Class.new(klass)
296
+
297
+ conflicts = [
298
+ :create, # public class method on AR::Base
299
+ :relation, # private class method on AR::Base
300
+ :new, # redefined class method on AR::Base
301
+ :all, # a default scope
302
+ :public, # some imporant methods on Module and Class
303
+ :protected,
304
+ :private,
305
+ :name,
306
+ :parent,
307
+ :superclass
308
+ ]
309
+
310
+ non_conflicts = [
311
+ :find_by_title, # dynamic finder method
312
+ :approved, # existing scope
313
+ :pub, # existing public class method
314
+ :pri, # existing private class method
315
+ :pro, # existing protected class method
316
+ :open, # a ::Kernel method
317
+ ]
318
+
319
+ conflicts.each do |name|
320
+ assert_raises(ArgumentError, "scope `#{name}` should not be allowed") do
321
+ klass.class_eval { scope name, ->{ where(approved: true) } }
322
+ end
323
+
324
+ assert_raises(ArgumentError, "scope `#{name}` should not be allowed") do
325
+ subklass.class_eval { scope name, ->{ where(approved: true) } }
326
+ end
327
+ end
328
+
329
+ non_conflicts.each do |name|
330
+ assert_nothing_raised do
331
+ silence_warnings do
332
+ klass.class_eval { scope name, ->{ where(approved: true) } }
333
+ end
334
+ end
335
+
336
+ assert_nothing_raised do
337
+ subklass.class_eval { scope name, ->{ where(approved: true) } }
338
+ end
339
+ end
340
+ end
341
+
342
+ # Method delegation for scope names which look like /\A[a-zA-Z_]\w*[!?]?\z/
343
+ # has been done by evaluating a string with a plain def statement. For scope
344
+ # names which contain spaces this approach doesn't work.
345
+ def test_spaces_in_scope_names
346
+ klass = Class.new(ActiveRecord::Base) do
347
+ self.table_name = "topics"
348
+ scope :"title containing space", -> { where("title LIKE '% %'") }
349
+ scope :approved, -> { where(:approved => true) }
350
+ end
351
+ assert_equal klass.send(:"title containing space"), klass.where("title LIKE '% %'")
352
+ assert_equal klass.approved.send(:"title containing space"), klass.approved.where("title LIKE '% %'")
353
+ end
354
+
355
+ def test_find_all_should_behave_like_select
356
+ assert_equal Topic.base.to_a.select(&:approved), Topic.base.to_a.find_all(&:approved)
357
+ end
358
+
359
+ def test_rand_should_select_a_random_object_from_proxy
360
+ assert_kind_of Topic, Topic.approved.sample
361
+ end
362
+
363
+ def test_should_use_where_in_query_for_scope
364
+ assert_equal Developer.where(name: 'Jamis').to_set, Developer.where(id: Developer.jamises).to_set
365
+ end
366
+
367
+ def test_size_should_use_count_when_results_are_not_loaded
368
+ topics = Topic.base
369
+ assert_queries(1) do
370
+ assert_sql(/COUNT/i) { topics.size }
371
+ end
372
+ end
373
+
374
+ def test_size_should_use_length_when_results_are_loaded
375
+ topics = Topic.base
376
+ topics.reload # force load
377
+ assert_no_queries do
378
+ topics.size # use loaded (no query)
379
+ end
380
+ end
381
+
382
+ def test_should_not_duplicates_where_values
383
+ where_values = Topic.where("1=1").scope_with_lambda.where_values
384
+ assert_equal ["1=1"], where_values
385
+ end
386
+
387
+ def test_chaining_with_duplicate_joins
388
+ join = "INNER JOIN comments ON comments.post_id = posts.id"
389
+ post = Post.find(1)
390
+ assert_equal post.comments.size, Post.joins(join).joins(join).where("posts.id = #{post.id}").size
391
+ end
392
+
393
+ def test_chaining_applies_last_conditions_when_creating
394
+ post = Topic.rejected.new
395
+ assert !post.approved?
396
+
397
+ post = Topic.rejected.approved.new
398
+ assert post.approved?
399
+
400
+ post = Topic.approved.rejected.new
401
+ assert !post.approved?
402
+
403
+ post = Topic.approved.rejected.approved.new
404
+ assert post.approved?
405
+ end
406
+
407
+ def test_chaining_combines_conditions_when_searching
408
+ # Normal hash conditions
409
+ assert_equal Topic.where(approved: false).where(approved: true).to_a, Topic.rejected.approved.to_a
410
+ assert_equal Topic.where(approved: true).where(approved: false).to_a, Topic.approved.rejected.to_a
411
+
412
+ # Nested hash conditions with same keys
413
+ assert_equal [], Post.with_special_comments.with_very_special_comments.to_a
414
+
415
+ # Nested hash conditions with different keys
416
+ assert_equal [posts(:sti_comments)], Post.with_special_comments.with_post(4).to_a.uniq
417
+ end
418
+
419
+ def test_scopes_batch_finders
420
+ assert_equal 4, Topic.approved.count
421
+
422
+ assert_queries(5) do
423
+ Topic.approved.find_each(:batch_size => 1) {|t| assert t.approved? }
424
+ end
425
+
426
+ assert_queries(3) do
427
+ Topic.approved.find_in_batches(:batch_size => 2) do |group|
428
+ group.each {|t| assert t.approved? }
429
+ end
430
+ end
431
+ end
432
+
433
+ def test_table_names_for_chaining_scopes_with_and_without_table_name_included
434
+ assert_nothing_raised do
435
+ Comment.for_first_post.for_first_author.to_a
436
+ end
437
+ end
438
+
439
+ def test_scopes_on_relations
440
+ # Topic.replied
441
+ approved_topics = Topic.all.approved.order('id DESC')
442
+ assert_equal topics(:fifth), approved_topics.first
443
+
444
+ replied_approved_topics = approved_topics.replied
445
+ assert_equal topics(:third), replied_approved_topics.first
446
+ end
447
+
448
+ def test_index_on_scope
449
+ approved = Topic.approved.order('id ASC')
450
+ assert_equal topics(:second), approved[0]
451
+ assert approved.loaded?
452
+ end
453
+
454
+ def test_nested_scopes_queries_size
455
+ assert_queries(1) do
456
+ Topic.approved.by_lifo.replied.written_before(Time.now).to_a
457
+ end
458
+ end
459
+
460
+ # Note: these next two are kinda odd because they are essentially just testing that the
461
+ # query cache works as it should, but they are here for legacy reasons as they was previously
462
+ # a separate cache on association proxies, and these show that that is not necessary.
463
+ def test_scopes_are_cached_on_associations
464
+ post = posts(:welcome)
465
+
466
+ Post.cache do
467
+ assert_queries(1) { post.comments.containing_the_letter_e.to_a }
468
+ assert_no_queries { post.comments.containing_the_letter_e.to_a }
469
+ end
470
+ end
471
+
472
+ def test_scopes_with_arguments_are_cached_on_associations
473
+ post = posts(:welcome)
474
+
475
+ Post.cache do
476
+ one = assert_queries(1) { post.comments.limit_by(1).to_a }
477
+ assert_equal 1, one.size
478
+
479
+ two = assert_queries(1) { post.comments.limit_by(2).to_a }
480
+ assert_equal 2, two.size
481
+
482
+ assert_no_queries { post.comments.limit_by(1).to_a }
483
+ assert_no_queries { post.comments.limit_by(2).to_a }
484
+ end
485
+ end
486
+
487
+ def test_scopes_to_get_newest
488
+ post = posts(:welcome)
489
+ old_last_comment = post.comments.newest
490
+ new_comment = post.comments.create(:body => "My new comment")
491
+ assert_equal new_comment, post.comments.newest
492
+ assert_not_equal old_last_comment, post.comments.newest
493
+ end
494
+
495
+ def test_scopes_are_reset_on_association_reload
496
+ post = posts(:welcome)
497
+
498
+ [:destroy_all, :reset, :delete_all].each do |method|
499
+ before = post.comments.containing_the_letter_e
500
+ post.association(:comments).send(method)
501
+ assert before.object_id != post.comments.containing_the_letter_e.object_id, "CollectionAssociation##{method} should reset the named scopes cache"
502
+ end
503
+ end
504
+
505
+ def test_scoped_are_lazy_loaded_if_table_still_does_not_exist
506
+ assert_nothing_raised do
507
+ require "models/without_table"
508
+ end
509
+ end
510
+
511
+ def test_eager_default_scope_relations_are_remove
512
+ klass = Class.new(ActiveRecord::Base)
513
+ klass.table_name = 'posts'
514
+
515
+ assert_raises(ArgumentError) do
516
+ klass.send(:default_scope, klass.where(:id => posts(:welcome).id))
517
+ end
518
+ end
519
+
520
+ def test_subclass_merges_scopes_properly
521
+ assert_equal 1, SpecialComment.where(body: 'go crazy').created.count
522
+ end
523
+
524
+ end