ibm_db 3.0.0-x86-mingw32 → 3.0.1-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 (465) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -0
  3. data/MANIFEST +14 -14
  4. data/README +225 -225
  5. data/ext/Makefile.nt32 +181 -181
  6. data/ext/Makefile.nt32.191 +212 -212
  7. data/ext/OLD/extconf.rb +264 -0
  8. data/ext/{extconf_MacOS.rb → OLD/extconf_MacOS.rb} +269 -269
  9. data/ext/extconf.rb +291 -264
  10. data/ext/ibm_db.c +2 -2
  11. data/ext/ruby_ibm_db.h +241 -241
  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 +4 -4
  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 +115 -115
  19. data/test/active_record/connection_adapters/fake_adapter.rb +46 -0
  20. data/test/assets/example.log +1 -0
  21. data/test/assets/flowers.jpg +0 -0
  22. data/test/assets/test.txt +1 -0
  23. data/test/cases/adapter_test.rb +261 -207
  24. data/test/cases/aggregations_test.rb +158 -0
  25. data/test/cases/ar_schema_test.rb +161 -0
  26. data/test/cases/associations/association_scope_test.rb +21 -0
  27. data/test/cases/associations/belongs_to_associations_test.rb +1029 -711
  28. data/test/cases/associations/callbacks_test.rb +192 -0
  29. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -181
  30. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +26 -0
  31. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -0
  32. data/test/cases/associations/eager_load_nested_include_test.rb +128 -0
  33. data/test/cases/associations/eager_singularization_test.rb +148 -0
  34. data/test/cases/associations/eager_test.rb +1411 -0
  35. data/test/cases/associations/extension_test.rb +82 -0
  36. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +932 -851
  37. data/test/cases/associations/has_many_associations_test.rb +2162 -0
  38. data/test/cases/associations/has_many_through_associations_test.rb +1204 -0
  39. data/test/cases/associations/has_one_associations_test.rb +610 -0
  40. data/test/cases/associations/has_one_through_associations_test.rb +380 -0
  41. data/test/cases/associations/inner_join_association_test.rb +139 -0
  42. data/test/cases/associations/inverse_associations_test.rb +693 -0
  43. data/test/cases/associations/join_model_test.rb +754 -743
  44. data/test/cases/associations/nested_through_associations_test.rb +579 -0
  45. data/test/cases/associations/required_test.rb +82 -0
  46. data/test/cases/associations_test.rb +380 -0
  47. data/test/cases/attribute_decorators_test.rb +125 -0
  48. data/test/cases/attribute_methods/read_test.rb +60 -0
  49. data/test/cases/attribute_methods/serialization_test.rb +29 -0
  50. data/test/cases/attribute_methods_test.rb +952 -822
  51. data/test/cases/attribute_set_test.rb +200 -0
  52. data/test/cases/attribute_test.rb +180 -0
  53. data/test/cases/attributes_test.rb +136 -0
  54. data/test/cases/autosave_association_test.rb +1595 -0
  55. data/test/cases/base_test.rb +1638 -2133
  56. data/test/cases/batches_test.rb +212 -0
  57. data/test/cases/binary_test.rb +52 -0
  58. data/test/cases/bind_parameter_test.rb +100 -0
  59. data/test/cases/calculations_test.rb +646 -482
  60. data/test/cases/callbacks_test.rb +543 -0
  61. data/test/cases/clone_test.rb +40 -0
  62. data/test/cases/coders/yaml_column_test.rb +63 -0
  63. data/test/cases/column_alias_test.rb +17 -0
  64. data/test/cases/column_definition_test.rb +123 -0
  65. data/test/cases/connection_adapters/adapter_leasing_test.rb +54 -0
  66. data/test/cases/connection_adapters/connection_handler_test.rb +53 -0
  67. data/test/cases/connection_adapters/connection_specification_test.rb +12 -0
  68. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +293 -0
  69. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +65 -0
  70. data/test/cases/connection_adapters/quoting_test.rb +13 -0
  71. data/test/cases/connection_adapters/schema_cache_test.rb +56 -0
  72. data/test/cases/connection_adapters/type_lookup_test.rb +110 -0
  73. data/test/cases/connection_management_test.rb +122 -0
  74. data/test/cases/connection_pool_test.rb +346 -0
  75. data/test/cases/connection_specification/resolver_test.rb +116 -0
  76. data/test/cases/core_test.rb +112 -0
  77. data/test/cases/counter_cache_test.rb +209 -0
  78. data/test/cases/custom_locking_test.rb +17 -0
  79. data/test/cases/database_statements_test.rb +19 -0
  80. data/test/cases/date_time_test.rb +61 -0
  81. data/test/cases/defaults_test.rb +223 -0
  82. data/test/cases/dirty_test.rb +775 -0
  83. data/test/cases/disconnected_test.rb +28 -0
  84. data/test/cases/dup_test.rb +157 -0
  85. data/test/cases/enum_test.rb +290 -0
  86. data/test/cases/explain_subscriber_test.rb +64 -0
  87. data/test/cases/explain_test.rb +76 -0
  88. data/test/cases/finder_respond_to_test.rb +60 -0
  89. data/test/cases/finder_test.rb +1166 -0
  90. data/test/cases/fixture_set/file_test.rb +138 -0
  91. data/test/cases/fixtures_test.rb +897 -0
  92. data/test/cases/forbidden_attributes_protection_test.rb +99 -0
  93. data/test/cases/habtm_destroy_order_test.rb +61 -0
  94. data/test/cases/helper.rb +210 -0
  95. data/test/cases/hot_compatibility_test.rb +54 -0
  96. data/test/cases/i18n_test.rb +45 -0
  97. data/test/cases/inheritance_test.rb +375 -0
  98. data/test/cases/integration_test.rb +139 -0
  99. data/test/cases/invalid_connection_test.rb +22 -0
  100. data/test/cases/invalid_date_test.rb +32 -0
  101. data/test/cases/invertible_migration_test.rb +295 -0
  102. data/test/cases/json_serialization_test.rb +302 -0
  103. data/test/cases/locking_test.rb +477 -0
  104. data/test/cases/log_subscriber_test.rb +136 -0
  105. data/test/cases/migration/change_schema_test - Copy.rb +448 -0
  106. data/test/cases/migration/change_schema_test.rb +472 -0
  107. data/test/cases/migration/change_table_test.rb +224 -0
  108. data/test/cases/migration/column_attributes_test.rb +192 -0
  109. data/test/cases/migration/column_positioning_test.rb +56 -0
  110. data/test/cases/migration/columns_test.rb +304 -0
  111. data/test/cases/migration/command_recorder_test.rb +305 -0
  112. data/test/cases/migration/create_join_table_test.rb +148 -0
  113. data/test/cases/migration/foreign_key_test - Changed.rb +325 -0
  114. data/test/cases/migration/foreign_key_test.rb +360 -0
  115. data/test/cases/migration/helper.rb +39 -0
  116. data/test/cases/migration/index_test.rb +216 -0
  117. data/test/cases/migration/logger_test.rb +36 -0
  118. data/test/cases/migration/pending_migrations_test.rb +53 -0
  119. data/test/cases/migration/references_foreign_key_test.rb +214 -0
  120. data/test/cases/migration/references_index_test.rb +101 -0
  121. data/test/cases/migration/references_statements_test.rb +116 -0
  122. data/test/cases/migration/rename_table_test.rb +93 -0
  123. data/test/cases/migration/table_and_index_test.rb +24 -0
  124. data/test/cases/migration_test.rb +959 -2408
  125. data/test/cases/migrator_test.rb +388 -0
  126. data/test/cases/mixin_test.rb +70 -0
  127. data/test/cases/modules_test.rb +173 -0
  128. data/test/cases/multiparameter_attributes_test.rb +350 -0
  129. data/test/cases/multiple_db_test.rb +115 -0
  130. data/test/cases/nested_attributes_test.rb +1057 -0
  131. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -0
  132. data/test/cases/persistence_test.rb +909 -642
  133. data/test/cases/pooled_connections_test.rb +81 -0
  134. data/test/cases/primary_keys_test.rb +237 -0
  135. data/test/cases/query_cache_test.rb +326 -257
  136. data/test/cases/quoting_test.rb +156 -0
  137. data/test/cases/readonly_test.rb +118 -0
  138. data/test/cases/reaper_test.rb +85 -0
  139. data/test/cases/reflection_test.rb +454 -0
  140. data/test/cases/relation/delegation_test.rb +68 -0
  141. data/test/cases/relation/merging_test.rb +161 -0
  142. data/test/cases/relation/mutation_test.rb +165 -0
  143. data/test/cases/relation/predicate_builder_test.rb +14 -0
  144. data/test/cases/relation/where_chain_test.rb +181 -0
  145. data/test/cases/relation/where_test.rb +300 -0
  146. data/test/cases/relation/where_test2.rb +36 -0
  147. data/test/cases/relation_test.rb +297 -0
  148. data/test/cases/relations_test.rb +1815 -1182
  149. data/test/cases/reload_models_test.rb +22 -0
  150. data/test/cases/result_test.rb +80 -0
  151. data/test/cases/sanitize_test.rb +83 -0
  152. data/test/cases/schema_dumper_test.rb +463 -256
  153. data/test/cases/scoping/default_scoping_test.rb +454 -0
  154. data/test/cases/scoping/named_scoping_test.rb +524 -0
  155. data/test/cases/scoping/relation_scoping_test.rb +357 -0
  156. data/test/cases/serialization_test.rb +104 -0
  157. data/test/cases/serialized_attribute_test.rb +277 -0
  158. data/test/cases/statement_cache_test.rb +98 -0
  159. data/test/cases/store_test.rb +194 -0
  160. data/test/cases/tasks/database_tasks_test.rb +396 -0
  161. data/test/cases/tasks/mysql_rake_test.rb +311 -0
  162. data/test/cases/tasks/postgresql_rake_test.rb +245 -0
  163. data/test/cases/tasks/sqlite_rake_test.rb +193 -0
  164. data/test/cases/test_case.rb +123 -0
  165. data/test/cases/timestamp_test.rb +468 -0
  166. data/test/cases/transaction_callbacks_test.rb +452 -300
  167. data/test/cases/transaction_isolation_test.rb +106 -0
  168. data/test/cases/transactions_test.rb +817 -0
  169. data/test/cases/type/decimal_test.rb +51 -0
  170. data/test/cases/type/integer_test.rb +121 -0
  171. data/test/cases/type/string_test.rb +36 -0
  172. data/test/cases/type/type_map_test.rb +177 -0
  173. data/test/cases/type/unsigned_integer_test.rb +18 -0
  174. data/test/cases/types_test.rb +141 -0
  175. data/test/cases/unconnected_test.rb +33 -0
  176. data/test/cases/validations/association_validation_test.rb +86 -0
  177. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -0
  178. data/test/cases/validations/i18n_validation_test.rb +90 -0
  179. data/test/cases/validations/length_validation_test.rb +47 -0
  180. data/test/cases/validations/presence_validation_test.rb +68 -0
  181. data/test/cases/validations/uniqueness_validation_test.rb +434 -299
  182. data/test/cases/validations_repair_helper.rb +23 -0
  183. data/test/cases/validations_test.rb +165 -0
  184. data/test/cases/view_test.rb +113 -0
  185. data/test/cases/xml_serialization_test.rb +457 -408
  186. data/test/cases/yaml_serialization_test.rb +86 -0
  187. data/test/config.rb +5 -0
  188. data/test/config.yml +154 -154
  189. data/test/connections/native_ibm_db/connection.rb +43 -43
  190. data/test/fixtures/accounts.yml +29 -0
  191. data/test/fixtures/admin/accounts.yml +2 -0
  192. data/test/fixtures/admin/randomly_named_a9.yml +7 -0
  193. data/test/fixtures/admin/randomly_named_b0.yml +7 -0
  194. data/test/fixtures/admin/users.yml +10 -0
  195. data/test/fixtures/all/admin +1 -0
  196. data/test/fixtures/all/developers.yml +0 -0
  197. data/test/fixtures/all/people.yml +0 -0
  198. data/test/fixtures/all/tasks.yml +0 -0
  199. data/test/fixtures/author_addresses.yml +18 -0
  200. data/test/fixtures/author_favorites.yml +4 -0
  201. data/test/fixtures/authors.yml +23 -0
  202. data/test/fixtures/binaries.yml +133 -0
  203. data/test/fixtures/books.yml +11 -0
  204. data/test/fixtures/bulbs.yml +5 -0
  205. data/test/fixtures/cars.yml +9 -0
  206. data/test/fixtures/categories.yml +19 -0
  207. data/test/fixtures/categories/special_categories.yml +9 -0
  208. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
  209. data/test/fixtures/categories_ordered.yml +7 -0
  210. data/test/fixtures/categories_posts.yml +31 -0
  211. data/test/fixtures/categorizations.yml +23 -0
  212. data/test/fixtures/clubs.yml +8 -0
  213. data/test/fixtures/collections.yml +3 -0
  214. data/test/fixtures/colleges.yml +3 -0
  215. data/test/fixtures/comments.yml +65 -0
  216. data/test/fixtures/companies.yml +67 -0
  217. data/test/fixtures/computers.yml +10 -0
  218. data/test/fixtures/courses.yml +8 -0
  219. data/test/fixtures/customers.yml +26 -0
  220. data/test/fixtures/dashboards.yml +6 -0
  221. data/test/fixtures/developers.yml +22 -0
  222. data/test/fixtures/developers_projects.yml +17 -0
  223. data/test/fixtures/dog_lovers.yml +7 -0
  224. data/test/fixtures/dogs.yml +4 -0
  225. data/test/fixtures/doubloons.yml +3 -0
  226. data/test/fixtures/edges.yml +5 -0
  227. data/test/fixtures/entrants.yml +14 -0
  228. data/test/fixtures/essays.yml +6 -0
  229. data/test/fixtures/faces.yml +11 -0
  230. data/test/fixtures/fk_test_has_fk.yml +3 -0
  231. data/test/fixtures/fk_test_has_pk.yml +2 -0
  232. data/test/fixtures/friendships.yml +4 -0
  233. data/test/fixtures/funny_jokes.yml +10 -0
  234. data/test/fixtures/interests.yml +33 -0
  235. data/test/fixtures/items.yml +3 -0
  236. data/test/fixtures/jobs.yml +7 -0
  237. data/test/fixtures/legacy_things.yml +3 -0
  238. data/test/fixtures/mateys.yml +4 -0
  239. data/test/fixtures/member_details.yml +8 -0
  240. data/test/fixtures/member_types.yml +6 -0
  241. data/test/fixtures/members.yml +11 -0
  242. data/test/fixtures/memberships.yml +34 -0
  243. data/test/fixtures/men.yml +5 -0
  244. data/test/fixtures/minimalistics.yml +2 -0
  245. data/test/fixtures/minivans.yml +5 -0
  246. data/test/fixtures/mixed_case_monkeys.yml +6 -0
  247. data/test/fixtures/mixins.yml +29 -0
  248. data/test/fixtures/movies.yml +7 -0
  249. data/test/fixtures/naked/csv/accounts.csv +1 -0
  250. data/test/fixtures/naked/yml/accounts.yml +1 -0
  251. data/test/fixtures/naked/yml/companies.yml +1 -0
  252. data/test/fixtures/naked/yml/courses.yml +1 -0
  253. data/test/fixtures/organizations.yml +5 -0
  254. data/test/fixtures/other_topics.yml +42 -0
  255. data/test/fixtures/owners.yml +9 -0
  256. data/test/fixtures/parrots.yml +27 -0
  257. data/test/fixtures/parrots_pirates.yml +7 -0
  258. data/test/fixtures/people.yml +24 -0
  259. data/test/fixtures/peoples_treasures.yml +3 -0
  260. data/test/fixtures/pets.yml +19 -0
  261. data/test/fixtures/pirates.yml +12 -0
  262. data/test/fixtures/posts.yml +80 -0
  263. data/test/fixtures/price_estimates.yml +7 -0
  264. data/test/fixtures/products.yml +4 -0
  265. data/test/fixtures/projects.yml +7 -0
  266. data/test/fixtures/randomly_named_a9.yml +7 -0
  267. data/test/fixtures/ratings.yml +14 -0
  268. data/test/fixtures/readers.yml +11 -0
  269. data/test/fixtures/references.yml +17 -0
  270. data/test/fixtures/reserved_words/distinct.yml +5 -0
  271. data/test/fixtures/reserved_words/distinct_select.yml +11 -0
  272. data/test/fixtures/reserved_words/group.yml +14 -0
  273. data/test/fixtures/reserved_words/select.yml +8 -0
  274. data/test/fixtures/reserved_words/values.yml +7 -0
  275. data/test/fixtures/ships.yml +6 -0
  276. data/test/fixtures/speedometers.yml +8 -0
  277. data/test/fixtures/sponsors.yml +12 -0
  278. data/test/fixtures/string_key_objects.yml +7 -0
  279. data/test/fixtures/subscribers.yml +11 -0
  280. data/test/fixtures/subscriptions.yml +12 -0
  281. data/test/fixtures/taggings.yml +78 -0
  282. data/test/fixtures/tags.yml +11 -0
  283. data/test/fixtures/tasks.yml +7 -0
  284. data/test/fixtures/teapots.yml +3 -0
  285. data/test/fixtures/to_be_linked/accounts.yml +2 -0
  286. data/test/fixtures/to_be_linked/users.yml +10 -0
  287. data/test/fixtures/topics.yml +49 -0
  288. data/test/fixtures/toys.yml +14 -0
  289. data/test/fixtures/traffic_lights.yml +10 -0
  290. data/test/fixtures/treasures.yml +10 -0
  291. data/test/fixtures/uuid_children.yml +3 -0
  292. data/test/fixtures/uuid_parents.yml +2 -0
  293. data/test/fixtures/variants.yml +4 -0
  294. data/test/fixtures/vegetables.yml +20 -0
  295. data/test/fixtures/vertices.yml +4 -0
  296. data/test/fixtures/warehouse_things.yml +3 -0
  297. data/test/fixtures/zines.yml +5 -0
  298. data/test/ibm_db_test.rb +24 -24
  299. data/test/migrations/10_urban/9_add_expressions.rb +11 -0
  300. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -0
  301. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -0
  302. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -0
  303. data/test/migrations/missing/1_people_have_last_names.rb +9 -0
  304. data/test/migrations/missing/3_we_need_reminders.rb +12 -0
  305. data/test/migrations/missing/4_innocent_jointable.rb +12 -0
  306. data/test/migrations/rename/1_we_need_things.rb +11 -0
  307. data/test/migrations/rename/2_rename_things.rb +9 -0
  308. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -0
  309. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -0
  310. data/test/migrations/to_copy2/1_create_articles.rb +7 -0
  311. data/test/migrations/to_copy2/2_create_comments.rb +7 -0
  312. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -0
  313. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -0
  314. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -0
  315. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -0
  316. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -0
  317. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -0
  318. data/test/migrations/valid/2_we_need_reminders.rb +12 -0
  319. data/test/migrations/valid/3_innocent_jointable.rb +12 -0
  320. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -0
  321. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -0
  322. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -0
  323. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -0
  324. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -0
  325. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -0
  326. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -0
  327. data/test/models/admin.rb +5 -0
  328. data/test/models/admin/account.rb +3 -0
  329. data/test/models/admin/randomly_named_c1.rb +3 -0
  330. data/test/models/admin/user.rb +40 -0
  331. data/test/models/aircraft.rb +4 -0
  332. data/test/models/arunit2_model.rb +3 -0
  333. data/test/models/author.rb +212 -0
  334. data/test/models/auto_id.rb +4 -0
  335. data/test/models/autoloadable/extra_firm.rb +2 -0
  336. data/test/models/binary.rb +2 -0
  337. data/test/models/bird.rb +12 -0
  338. data/test/models/book.rb +18 -0
  339. data/test/models/boolean.rb +2 -0
  340. data/test/models/bulb.rb +51 -0
  341. data/test/models/cake_designer.rb +3 -0
  342. data/test/models/car.rb +26 -0
  343. data/test/models/carrier.rb +2 -0
  344. data/test/models/categorization.rb +19 -0
  345. data/test/models/category.rb +35 -0
  346. data/test/models/chef.rb +3 -0
  347. data/test/models/citation.rb +3 -0
  348. data/test/models/club.rb +23 -0
  349. data/test/models/college.rb +10 -0
  350. data/test/models/column.rb +3 -0
  351. data/test/models/column_name.rb +3 -0
  352. data/test/models/comment.rb +64 -0
  353. data/test/models/company.rb +225 -0
  354. data/test/models/company_in_module.rb +98 -0
  355. data/test/models/computer.rb +3 -0
  356. data/test/models/contact.rb +41 -0
  357. data/test/models/contract.rb +20 -0
  358. data/test/models/country.rb +7 -0
  359. data/test/models/course.rb +6 -0
  360. data/test/models/customer.rb +77 -0
  361. data/test/models/customer_carrier.rb +14 -0
  362. data/test/models/dashboard.rb +3 -0
  363. data/test/models/default.rb +2 -0
  364. data/test/models/department.rb +4 -0
  365. data/test/models/developer.rb +252 -0
  366. data/test/models/dog.rb +5 -0
  367. data/test/models/dog_lover.rb +5 -0
  368. data/test/models/doubloon.rb +12 -0
  369. data/test/models/drink_designer.rb +3 -0
  370. data/test/models/edge.rb +5 -0
  371. data/test/models/electron.rb +5 -0
  372. data/test/models/engine.rb +4 -0
  373. data/test/models/entrant.rb +3 -0
  374. data/test/models/essay.rb +5 -0
  375. data/test/models/event.rb +3 -0
  376. data/test/models/eye.rb +37 -0
  377. data/test/models/face.rb +9 -0
  378. data/test/models/friendship.rb +6 -0
  379. data/test/models/guid.rb +2 -0
  380. data/test/models/hotel.rb +6 -0
  381. data/test/models/image.rb +3 -0
  382. data/test/models/interest.rb +5 -0
  383. data/test/models/invoice.rb +4 -0
  384. data/test/models/item.rb +7 -0
  385. data/test/models/job.rb +7 -0
  386. data/test/models/joke.rb +7 -0
  387. data/test/models/keyboard.rb +3 -0
  388. data/test/models/legacy_thing.rb +3 -0
  389. data/test/models/lesson.rb +11 -0
  390. data/test/models/line_item.rb +3 -0
  391. data/test/models/liquid.rb +4 -0
  392. data/test/models/man.rb +11 -0
  393. data/test/models/matey.rb +4 -0
  394. data/test/models/member.rb +41 -0
  395. data/test/models/member_detail.rb +7 -0
  396. data/test/models/member_type.rb +3 -0
  397. data/test/models/membership.rb +35 -0
  398. data/test/models/minimalistic.rb +2 -0
  399. data/test/models/minivan.rb +9 -0
  400. data/test/models/mixed_case_monkey.rb +3 -0
  401. data/test/models/molecule.rb +6 -0
  402. data/test/models/movie.rb +5 -0
  403. data/test/models/order.rb +4 -0
  404. data/test/models/organization.rb +14 -0
  405. data/test/models/owner.rb +34 -0
  406. data/test/models/parrot.rb +29 -0
  407. data/test/models/person.rb +143 -0
  408. data/test/models/personal_legacy_thing.rb +4 -0
  409. data/test/models/pet.rb +15 -0
  410. data/test/models/pirate.rb +92 -0
  411. data/test/models/possession.rb +3 -0
  412. data/test/models/post.rb +264 -0
  413. data/test/models/price_estimate.rb +4 -0
  414. data/test/models/professor.rb +5 -0
  415. data/test/models/project.rb +29 -0
  416. data/test/models/publisher.rb +2 -0
  417. data/test/models/publisher/article.rb +4 -0
  418. data/test/models/publisher/magazine.rb +3 -0
  419. data/test/models/randomly_named_c1.rb +3 -0
  420. data/test/models/rating.rb +4 -0
  421. data/test/models/reader.rb +23 -0
  422. data/test/models/record.rb +2 -0
  423. data/test/models/reference.rb +22 -0
  424. data/test/models/reply.rb +61 -0
  425. data/test/models/ship.rb +33 -0
  426. data/test/models/ship_part.rb +8 -0
  427. data/test/models/shop.rb +17 -0
  428. data/test/models/shop_account.rb +6 -0
  429. data/test/models/speedometer.rb +6 -0
  430. data/test/models/sponsor.rb +7 -0
  431. data/test/models/string_key_object.rb +3 -0
  432. data/test/models/student.rb +4 -0
  433. data/test/models/subject.rb +16 -0
  434. data/test/models/subscriber.rb +8 -0
  435. data/test/models/subscription.rb +4 -0
  436. data/test/models/tag.rb +7 -0
  437. data/test/models/tagging.rb +13 -0
  438. data/test/models/task.rb +5 -0
  439. data/test/models/topic.rb +124 -0
  440. data/test/models/toy.rb +6 -0
  441. data/test/models/traffic_light.rb +4 -0
  442. data/test/models/treasure.rb +14 -0
  443. data/test/models/treaty.rb +7 -0
  444. data/test/models/tyre.rb +11 -0
  445. data/test/models/uuid_child.rb +3 -0
  446. data/test/models/uuid_parent.rb +3 -0
  447. data/test/models/vegetables.rb +24 -0
  448. data/test/models/vehicle.rb +7 -0
  449. data/test/models/vertex.rb +9 -0
  450. data/test/models/warehouse_thing.rb +5 -5
  451. data/test/models/wheel.rb +3 -0
  452. data/test/models/without_table.rb +3 -0
  453. data/test/models/zine.rb +3 -0
  454. data/test/schema/mysql2_specific_schema.rb +58 -0
  455. data/test/schema/mysql_specific_schema.rb +70 -0
  456. data/test/schema/oracle_specific_schema.rb +43 -0
  457. data/test/schema/postgresql_specific_schema.rb +202 -0
  458. data/test/schema/schema.rb +938 -751
  459. data/test/schema/sqlite_specific_schema.rb +22 -0
  460. data/test/support/config.rb +43 -0
  461. data/test/support/connection.rb +22 -0
  462. data/test/support/connection_helper.rb +14 -0
  463. data/test/support/ddl_helper.rb +8 -0
  464. data/test/support/schema_dumping_helper.rb +20 -0
  465. metadata +444 -18
@@ -0,0 +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