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,81 @@
1
+ require "cases/helper"
2
+ require "models/project"
3
+ require "timeout"
4
+
5
+ class PooledConnectionsTest < ActiveRecord::TestCase
6
+ self.use_transactional_fixtures = false
7
+
8
+ def setup
9
+ @per_test_teardown = []
10
+ @connection = ActiveRecord::Base.remove_connection
11
+ end
12
+
13
+ teardown do
14
+ ActiveRecord::Base.clear_all_connections!
15
+ ActiveRecord::Base.establish_connection(@connection)
16
+ @per_test_teardown.each {|td| td.call }
17
+ end
18
+
19
+ # Will deadlock due to lack of Monitor timeouts in 1.9
20
+ def checkout_checkin_connections(pool_size, threads)
21
+ ActiveRecord::Base.establish_connection(@connection.merge({:pool => pool_size, :checkout_timeout => 0.5}))
22
+ @connection_count = 0
23
+ @timed_out = 0
24
+ threads.times do
25
+ Thread.new do
26
+ begin
27
+ conn = ActiveRecord::Base.connection_pool.checkout
28
+ sleep 0.1
29
+ ActiveRecord::Base.connection_pool.checkin conn
30
+ @connection_count += 1
31
+ rescue ActiveRecord::ConnectionTimeoutError
32
+ @timed_out += 1
33
+ end
34
+ end.join
35
+ end
36
+ end
37
+
38
+ def checkout_checkin_connections_loop(pool_size, loops)
39
+ ActiveRecord::Base.establish_connection(@connection.merge({:pool => pool_size, :checkout_timeout => 0.5}))
40
+ @connection_count = 0
41
+ @timed_out = 0
42
+ loops.times do
43
+ begin
44
+ conn = ActiveRecord::Base.connection_pool.checkout
45
+ ActiveRecord::Base.connection_pool.checkin conn
46
+ @connection_count += 1
47
+ ActiveRecord::Base.connection.tables
48
+ rescue ActiveRecord::ConnectionTimeoutError
49
+ @timed_out += 1
50
+ end
51
+ end
52
+ end
53
+
54
+ def test_pooled_connection_checkin_one
55
+ checkout_checkin_connections 1, 2
56
+ assert_equal 2, @connection_count
57
+ assert_equal 0, @timed_out
58
+ assert_equal 1, ActiveRecord::Base.connection_pool.connections.size
59
+ end
60
+
61
+ def test_pooled_connection_checkin_two
62
+ checkout_checkin_connections_loop 2, 3
63
+ assert_equal 3, @connection_count
64
+ assert_equal 0, @timed_out
65
+ assert_equal 2, ActiveRecord::Base.connection_pool.connections.size
66
+ end
67
+
68
+ def test_pooled_connection_remove
69
+ ActiveRecord::Base.establish_connection(@connection.merge({:pool => 2, :checkout_timeout => 0.5}))
70
+ old_connection = ActiveRecord::Base.connection
71
+ extra_connection = ActiveRecord::Base.connection_pool.checkout
72
+ ActiveRecord::Base.connection_pool.remove(extra_connection)
73
+ assert_equal ActiveRecord::Base.connection, old_connection
74
+ end
75
+
76
+ private
77
+
78
+ def add_record(name)
79
+ ActiveRecord::Base.connection_pool.with_connection { Project.create! :name => name }
80
+ end
81
+ end unless in_memory_db?
@@ -0,0 +1,237 @@
1
+ require "cases/helper"
2
+ require 'models/topic'
3
+ require 'models/reply'
4
+ require 'models/subscriber'
5
+ require 'models/movie'
6
+ require 'models/keyboard'
7
+ require 'models/mixed_case_monkey'
8
+ require 'models/dashboard'
9
+
10
+ class PrimaryKeysTest < ActiveRecord::TestCase
11
+ fixtures :topics, :subscribers, :movies, :mixed_case_monkeys
12
+
13
+ def test_to_key_with_default_primary_key
14
+ topic = Topic.new
15
+ assert_nil topic.to_key
16
+ topic = Topic.find(1)
17
+ assert_equal [1], topic.to_key
18
+ end
19
+
20
+ def test_to_key_with_customized_primary_key
21
+ keyboard = Keyboard.new
22
+ assert_nil keyboard.to_key
23
+ keyboard.save
24
+ assert_equal keyboard.to_key, [keyboard.id]
25
+ end
26
+
27
+ def test_read_attribute_with_custom_primary_key
28
+ keyboard = Keyboard.create!
29
+ assert_equal keyboard.key_number, keyboard.read_attribute(:id)
30
+ end
31
+
32
+ def test_to_key_with_primary_key_after_destroy
33
+ topic = Topic.find(1)
34
+ topic.destroy
35
+ assert_equal [1], topic.to_key
36
+ end
37
+
38
+ def test_integer_key
39
+ topic = Topic.find(1)
40
+ assert_equal(topics(:first).author_name, topic.author_name)
41
+ topic = Topic.find(2)
42
+ assert_equal(topics(:second).author_name, topic.author_name)
43
+
44
+ topic = Topic.new
45
+ topic.title = "New Topic"
46
+ assert_nil topic.id
47
+ assert_nothing_raised { topic.save! }
48
+ id = topic.id
49
+
50
+ topicReloaded = Topic.find(id)
51
+ assert_equal("New Topic", topicReloaded.title)
52
+ end
53
+
54
+ def test_customized_primary_key_auto_assigns_on_save
55
+ Keyboard.delete_all
56
+ keyboard = Keyboard.new(:name => 'HHKB')
57
+ assert_nothing_raised { keyboard.save! }
58
+ assert_equal keyboard.id, Keyboard.find_by_name('HHKB').id
59
+ end
60
+
61
+ def test_customized_primary_key_can_be_get_before_saving
62
+ keyboard = Keyboard.new
63
+ assert_nil keyboard.id
64
+ assert_nothing_raised { assert_nil keyboard.key_number }
65
+ end
66
+
67
+ def test_customized_string_primary_key_settable_before_save
68
+ subscriber = Subscriber.new
69
+ assert_nothing_raised { subscriber.id = 'webster123' }
70
+ assert_equal 'webster123', subscriber.id
71
+ assert_equal 'webster123', subscriber.nick
72
+ end
73
+
74
+ def test_string_key
75
+ subscriber = Subscriber.find(subscribers(:first).nick)
76
+ assert_equal(subscribers(:first).name, subscriber.name)
77
+ subscriber = Subscriber.find(subscribers(:second).nick)
78
+ assert_equal(subscribers(:second).name, subscriber.name)
79
+
80
+ subscriber = Subscriber.new
81
+ subscriber.id = "jdoe"
82
+ assert_equal("jdoe", subscriber.id)
83
+ subscriber.name = "John Doe"
84
+ assert_nothing_raised { subscriber.save! }
85
+ assert_equal("jdoe", subscriber.id)
86
+
87
+ subscriberReloaded = Subscriber.find("jdoe")
88
+ assert_equal("John Doe", subscriberReloaded.name)
89
+ end
90
+
91
+ def test_find_with_more_than_one_string_key
92
+ assert_equal 2, Subscriber.find(subscribers(:first).nick, subscribers(:second).nick).length
93
+ end
94
+
95
+ def test_primary_key_prefix
96
+ old_primary_key_prefix_type = ActiveRecord::Base.primary_key_prefix_type
97
+ ActiveRecord::Base.primary_key_prefix_type = :table_name
98
+ Topic.reset_primary_key
99
+ assert_equal "topicid", Topic.primary_key
100
+
101
+ ActiveRecord::Base.primary_key_prefix_type = :table_name_with_underscore
102
+ Topic.reset_primary_key
103
+ assert_equal "topic_id", Topic.primary_key
104
+
105
+ ActiveRecord::Base.primary_key_prefix_type = nil
106
+ Topic.reset_primary_key
107
+ assert_equal "id", Topic.primary_key
108
+ ensure
109
+ ActiveRecord::Base.primary_key_prefix_type = old_primary_key_prefix_type
110
+ end
111
+
112
+ def test_delete_should_quote_pkey
113
+ assert_nothing_raised { MixedCaseMonkey.delete(1) }
114
+ end
115
+ def test_update_counters_should_quote_pkey_and_quote_counter_columns
116
+ assert_nothing_raised { MixedCaseMonkey.update_counters(1, :fleacount => 99) }
117
+ end
118
+ def test_find_with_one_id_should_quote_pkey
119
+ assert_nothing_raised { MixedCaseMonkey.find(1) }
120
+ end
121
+ def test_find_with_multiple_ids_should_quote_pkey
122
+ assert_nothing_raised { MixedCaseMonkey.find([1,2]) }
123
+ end
124
+ def test_instance_update_should_quote_pkey
125
+ assert_nothing_raised { MixedCaseMonkey.find(1).save }
126
+ end
127
+ def test_instance_destroy_should_quote_pkey
128
+ assert_nothing_raised { MixedCaseMonkey.find(1).destroy }
129
+ end
130
+
131
+ def test_supports_primary_key
132
+ assert_nothing_raised NoMethodError do
133
+ ActiveRecord::Base.connection.supports_primary_key?
134
+ end
135
+ end
136
+
137
+ def test_primary_key_returns_value_if_it_exists
138
+ klass = Class.new(ActiveRecord::Base) do
139
+ self.table_name = 'developers'
140
+ end
141
+
142
+ if ActiveRecord::Base.connection.supports_primary_key?
143
+ assert_equal 'id', klass.primary_key
144
+ end
145
+ end
146
+
147
+ def test_primary_key_returns_nil_if_it_does_not_exist
148
+ klass = Class.new(ActiveRecord::Base) do
149
+ self.table_name = 'developers_projects'
150
+ end
151
+
152
+ if ActiveRecord::Base.connection.supports_primary_key?
153
+ assert_nil klass.primary_key
154
+ end
155
+ end
156
+
157
+ def test_quoted_primary_key_after_set_primary_key
158
+ k = Class.new( ActiveRecord::Base )
159
+ assert_equal k.connection.quote_column_name("id"), k.quoted_primary_key
160
+ k.primary_key = "foo"
161
+ assert_equal k.connection.quote_column_name("foo"), k.quoted_primary_key
162
+ end
163
+
164
+ def test_auto_detect_primary_key_from_schema
165
+ MixedCaseMonkey.reset_primary_key
166
+ #assert_equal "monkeyID", MixedCaseMonkey.primary_key
167
+ assert_equal "monkeyid", MixedCaseMonkey.primary_key
168
+ end
169
+
170
+ def test_primary_key_update_with_custom_key_name
171
+ dashboard = Dashboard.create!(dashboard_id: '1')
172
+ dashboard.id = '2'
173
+ dashboard.save!
174
+
175
+ dashboard = Dashboard.first
176
+ assert_equal '2', dashboard.id
177
+ end
178
+ end
179
+
180
+ class PrimaryKeyWithNoConnectionTest < ActiveRecord::TestCase
181
+ self.use_transactional_fixtures = false
182
+
183
+ unless in_memory_db?
184
+ def test_set_primary_key_with_no_connection
185
+ connection = ActiveRecord::Base.remove_connection
186
+
187
+ model = Class.new(ActiveRecord::Base)
188
+ model.primary_key = 'foo'
189
+
190
+ assert_equal 'foo', model.primary_key
191
+
192
+ ActiveRecord::Base.establish_connection(connection)
193
+
194
+ assert_equal 'foo', model.primary_key
195
+ end
196
+ end
197
+ end
198
+
199
+ if current_adapter?(:MysqlAdapter, :Mysql2Adapter)
200
+ class PrimaryKeyWithAnsiQuotesTest < ActiveRecord::TestCase
201
+ self.use_transactional_fixtures = false
202
+
203
+ def test_primary_key_method_with_ansi_quotes
204
+ con = ActiveRecord::Base.connection
205
+ con.execute("SET SESSION sql_mode='ANSI_QUOTES'")
206
+ assert_equal "id", con.primary_key("topics")
207
+ ensure
208
+ con.reconnect!
209
+ end
210
+ end
211
+ end
212
+
213
+ if current_adapter?(:PostgreSQLAdapter)
214
+ class PrimaryKeyBigSerialTest < ActiveRecord::TestCase
215
+ self.use_transactional_fixtures = false
216
+
217
+ class Widget < ActiveRecord::Base
218
+ end
219
+
220
+ setup do
221
+ @connection = ActiveRecord::Base.connection
222
+ @connection.create_table(:widgets, id: :bigserial) { |t| }
223
+ end
224
+
225
+ teardown do
226
+ @connection.drop_table :widgets
227
+ end
228
+
229
+ def test_bigserial_primary_key
230
+ assert_equal "id", Widget.primary_key
231
+ assert_equal :integer, Widget.columns_hash[Widget.primary_key].type
232
+
233
+ widget = Widget.create!
234
+ assert_not_nil widget.id
235
+ end
236
+ end
237
+ end
@@ -1,257 +1,326 @@
1
- require "cases/helper"
2
- require 'models/topic'
3
- require 'models/task'
4
- require 'models/category'
5
- require 'models/post'
6
-
7
-
8
- class QueryCacheTest < ActiveRecord::TestCase
9
- fixtures :tasks, :topics, :categories, :posts, :categories_posts
10
-
11
- def setup
12
- Task.connection.clear_query_cache
13
- ActiveRecord::Base.connection.disable_query_cache!
14
- end
15
-
16
- def test_exceptional_middleware_clears_and_disables_cache_on_error
17
- assert !ActiveRecord::Base.connection.query_cache_enabled, 'cache off'
18
-
19
- mw = ActiveRecord::QueryCache.new lambda { |env|
20
- Task.find 1
21
- Task.find 1
22
- assert_equal 1, ActiveRecord::Base.connection.query_cache.length
23
- raise "lol borked"
24
- }
25
- assert_raises(RuntimeError) { mw.call({}) }
26
-
27
- assert_equal 0, ActiveRecord::Base.connection.query_cache.length
28
- assert !ActiveRecord::Base.connection.query_cache_enabled, 'cache off'
29
- end
30
-
31
- def test_exceptional_middleware_leaves_enabled_cache_alone
32
- ActiveRecord::Base.connection.enable_query_cache!
33
-
34
- mw = ActiveRecord::QueryCache.new lambda { |env|
35
- raise "lol borked"
36
- }
37
- assert_raises(RuntimeError) { mw.call({}) }
38
-
39
- assert ActiveRecord::Base.connection.query_cache_enabled, 'cache on'
40
- end
41
-
42
- def test_middleware_delegates
43
- called = false
44
- mw = ActiveRecord::QueryCache.new lambda { |env|
45
- called = true
46
- }
47
- mw.call({})
48
- assert called, 'middleware should delegate'
49
- end
50
-
51
- def test_middleware_caches
52
- mw = ActiveRecord::QueryCache.new lambda { |env|
53
- Task.find 1
54
- Task.find 1
55
- assert_equal 1, ActiveRecord::Base.connection.query_cache.length
56
- }
57
- mw.call({})
58
- end
59
-
60
- def test_cache_enabled_during_call
61
- assert !ActiveRecord::Base.connection.query_cache_enabled, 'cache off'
62
-
63
- mw = ActiveRecord::QueryCache.new lambda { |env|
64
- assert ActiveRecord::Base.connection.query_cache_enabled, 'cache on'
65
- }
66
- mw.call({})
67
- end
68
-
69
- def test_cache_on_during_body_write
70
- streaming = Class.new do
71
- def each
72
- yield ActiveRecord::Base.connection.query_cache_enabled
73
- end
74
- end
75
-
76
- mw = ActiveRecord::QueryCache.new lambda { |env|
77
- [200, {}, streaming.new]
78
- }
79
- body = mw.call({}).last
80
- body.each { |x| assert x, 'cache should be on' }
81
- body.close
82
- assert !ActiveRecord::Base.connection.query_cache_enabled, 'cache disabled'
83
- end
84
-
85
- def test_cache_off_after_close
86
- mw = ActiveRecord::QueryCache.new lambda { |env| }
87
- body = mw.call({}).last
88
-
89
- assert ActiveRecord::Base.connection.query_cache_enabled, 'cache enabled'
90
- body.close
91
- assert !ActiveRecord::Base.connection.query_cache_enabled, 'cache disabled'
92
- end
93
-
94
- def test_cache_clear_after_close
95
- mw = ActiveRecord::QueryCache.new lambda { |env|
96
- Post.find(:first)
97
- }
98
- body = mw.call({}).last
99
-
100
- assert !ActiveRecord::Base.connection.query_cache.empty?, 'cache not empty'
101
- body.close
102
- assert ActiveRecord::Base.connection.query_cache.empty?, 'cache should be empty'
103
- end
104
-
105
- def test_find_queries
106
- assert_queries(ActiveRecord::IdentityMap.enabled? ? 1 : 2) { Task.find(1); Task.find(1) }
107
- end
108
-
109
- def test_find_queries_with_cache
110
- Task.cache do
111
- assert_queries(1) { Task.find(1); Task.find(1) }
112
- end
113
- end
114
-
115
- def test_find_queries_with_cache_multi_record
116
- Task.cache do
117
- assert_queries(2) { Task.find(1); Task.find(1); Task.find(2) }
118
- end
119
- end
120
-
121
- def test_count_queries_with_cache
122
- Task.cache do
123
- assert_queries(1) { Task.count; Task.count }
124
- end
125
- end
126
-
127
- def test_query_cache_dups_results_correctly
128
- Task.cache do
129
- now = Time.now.utc
130
- task = Task.find 1
131
- assert_not_equal now, task.starting
132
- task.starting = now
133
- task.reload
134
- assert_not_equal now, task.starting
135
- end
136
- end
137
-
138
- def test_cache_is_flat
139
- Task.cache do
140
- Topic.columns # don't count this query
141
- assert_queries(1) { Topic.find(1); Topic.find(1); }
142
- end
143
-
144
- ActiveRecord::Base.cache do
145
- assert_queries(1) { Task.find(1); Task.find(1) }
146
- end
147
- end
148
-
149
- def test_cache_does_not_wrap_string_results_in_arrays
150
- if current_adapter?(:SQLite3Adapter)
151
- require 'sqlite3/version'
152
- sqlite3_version = RUBY_PLATFORM =~ /java/ ? Jdbc::SQLite3::VERSION : SQLite3::VERSION
153
- end
154
-
155
- Task.cache do
156
- # Oracle adapter returns count() as Fixnum or Float
157
- if current_adapter?(:OracleAdapter,:IBM_DBAdapter)
158
- assert_kind_of Numeric, Task.connection.select_value("SELECT count(*) AS count_all FROM tasks")
159
- elsif current_adapter?(:SQLite3Adapter) && sqlite3_version > '1.2.5' || current_adapter?(:Mysql2Adapter) || current_adapter?(:MysqlAdapter)
160
- # Future versions of the sqlite3 adapter will return numeric
161
- assert_instance_of Fixnum,
162
- Task.connection.select_value("SELECT count(*) AS count_all FROM tasks")
163
- else
164
- assert_instance_of String, Task.connection.select_value("SELECT count(*) AS count_all FROM tasks")
165
- end
166
- end
167
- end
168
- end
169
-
170
- class QueryCacheExpiryTest < ActiveRecord::TestCase
171
- fixtures :tasks, :posts, :categories, :categories_posts
172
-
173
- def test_cache_gets_cleared_after_migration
174
- # warm the cache
175
- Post.find(1)
176
-
177
- # change the column definition
178
- Post.connection.change_column :posts, :title, :string, :limit => 80
179
- assert_nothing_raised { Post.find(1) }
180
-
181
- # restore the old definition
182
- Post.connection.change_column :posts, :title, :string
183
- end
184
-
185
- def test_find
186
- Task.connection.expects(:clear_query_cache).times(1)
187
-
188
- assert !Task.connection.query_cache_enabled
189
- Task.cache do
190
- assert Task.connection.query_cache_enabled
191
- Task.find(1)
192
-
193
- Task.uncached do
194
- assert !Task.connection.query_cache_enabled
195
- Task.find(1)
196
- end
197
-
198
- assert Task.connection.query_cache_enabled
199
- end
200
- assert !Task.connection.query_cache_enabled
201
- end
202
-
203
- def test_update
204
- Task.connection.expects(:clear_query_cache).times(2)
205
-
206
- Task.cache do
207
- task = Task.find(1)
208
- task.starting = Time.now.utc
209
- task.save!
210
- end
211
- end
212
-
213
- def test_destroy
214
- Task.connection.expects(:clear_query_cache).times(2)
215
-
216
- Task.cache do
217
- Task.find(1).destroy
218
- end
219
- end
220
-
221
- def test_insert
222
- ActiveRecord::Base.connection.expects(:clear_query_cache).times(2)
223
-
224
- Task.cache do
225
- Task.create!
226
- end
227
- end
228
-
229
- def test_cache_is_expired_by_habtm_update
230
- ActiveRecord::Base.connection.expects(:clear_query_cache).times(2)
231
- ActiveRecord::Base.cache do
232
- c = Category.find(:first)
233
- p = Post.find(:first)
234
- p.categories << c
235
- end
236
- end
237
-
238
- def test_cache_is_expired_by_habtm_delete
239
- ActiveRecord::Base.connection.expects(:clear_query_cache).times(2)
240
- ActiveRecord::Base.cache do
241
- p = Post.find(1)
242
- assert p.categories.any?
243
- p.categories.delete_all
244
- end
245
- end
246
- end
247
-
248
- class QueryCacheBodyProxyTest < ActiveRecord::TestCase
249
-
250
- test "is polite to it's body and responds to it" do
251
- body = Class.new(String) { def to_path; "/path"; end }.new
252
- proxy = ActiveRecord::QueryCache::BodyProxy.new(nil, body, ActiveRecord::Base.connection_id)
253
- assert proxy.respond_to?(:to_path)
254
- assert_equal proxy.to_path, "/path"
255
- end
256
-
257
- end
1
+ require "cases/helper"
2
+ require 'models/topic'
3
+ require 'models/task'
4
+ require 'models/category'
5
+ require 'models/post'
6
+ require 'rack'
7
+
8
+ class QueryCacheTest < ActiveRecord::TestCase
9
+ fixtures :tasks, :topics, :categories, :posts, :categories_posts
10
+
11
+ teardown do
12
+ Task.connection.clear_query_cache
13
+ ActiveRecord::Base.connection.disable_query_cache!
14
+ end
15
+
16
+ def test_exceptional_middleware_clears_and_disables_cache_on_error
17
+ assert !ActiveRecord::Base.connection.query_cache_enabled, 'cache off'
18
+
19
+ mw = ActiveRecord::QueryCache.new lambda { |env|
20
+ Task.find 1
21
+ Task.find 1
22
+ assert_equal 1, ActiveRecord::Base.connection.query_cache.length
23
+ raise "lol borked"
24
+ }
25
+ assert_raises(RuntimeError) { mw.call({}) }
26
+
27
+ assert_equal 0, ActiveRecord::Base.connection.query_cache.length
28
+ assert !ActiveRecord::Base.connection.query_cache_enabled, 'cache off'
29
+ end
30
+
31
+ def test_exceptional_middleware_leaves_enabled_cache_alone
32
+ ActiveRecord::Base.connection.enable_query_cache!
33
+
34
+ mw = ActiveRecord::QueryCache.new lambda { |env|
35
+ raise "lol borked"
36
+ }
37
+ assert_raises(RuntimeError) { mw.call({}) }
38
+
39
+ assert ActiveRecord::Base.connection.query_cache_enabled, 'cache on'
40
+ end
41
+
42
+ def test_exceptional_middleware_assigns_original_connection_id_on_error
43
+ connection_id = ActiveRecord::Base.connection_id
44
+
45
+ mw = ActiveRecord::QueryCache.new lambda { |env|
46
+ ActiveRecord::Base.connection_id = self.object_id
47
+ raise "lol borked"
48
+ }
49
+ assert_raises(RuntimeError) { mw.call({}) }
50
+
51
+ assert_equal connection_id, ActiveRecord::Base.connection_id
52
+ end
53
+
54
+ def test_middleware_delegates
55
+ called = false
56
+ mw = ActiveRecord::QueryCache.new lambda { |env|
57
+ called = true
58
+ [200, {}, nil]
59
+ }
60
+ mw.call({})
61
+ assert called, 'middleware should delegate'
62
+ end
63
+
64
+ def test_middleware_caches
65
+ mw = ActiveRecord::QueryCache.new lambda { |env|
66
+ Task.find 1
67
+ Task.find 1
68
+ assert_equal 1, ActiveRecord::Base.connection.query_cache.length
69
+ [200, {}, nil]
70
+ }
71
+ mw.call({})
72
+ end
73
+
74
+ def test_cache_enabled_during_call
75
+ assert !ActiveRecord::Base.connection.query_cache_enabled, 'cache off'
76
+
77
+ mw = ActiveRecord::QueryCache.new lambda { |env|
78
+ assert ActiveRecord::Base.connection.query_cache_enabled, 'cache on'
79
+ [200, {}, nil]
80
+ }
81
+ mw.call({})
82
+ end
83
+
84
+ def test_cache_on_during_body_write
85
+ streaming = Class.new do
86
+ def each
87
+ yield ActiveRecord::Base.connection.query_cache_enabled
88
+ end
89
+ end
90
+
91
+ mw = ActiveRecord::QueryCache.new lambda { |env|
92
+ [200, {}, streaming.new]
93
+ }
94
+ body = mw.call({}).last
95
+ body.each { |x| assert x, 'cache should be on' }
96
+ body.close
97
+ assert !ActiveRecord::Base.connection.query_cache_enabled, 'cache disabled'
98
+ end
99
+
100
+ def test_cache_off_after_close
101
+ mw = ActiveRecord::QueryCache.new lambda { |env| [200, {}, nil] }
102
+ body = mw.call({}).last
103
+
104
+ assert ActiveRecord::Base.connection.query_cache_enabled, 'cache enabled'
105
+ body.close
106
+ assert !ActiveRecord::Base.connection.query_cache_enabled, 'cache disabled'
107
+ end
108
+
109
+ def test_cache_clear_after_close
110
+ mw = ActiveRecord::QueryCache.new lambda { |env|
111
+ Post.first
112
+ [200, {}, nil]
113
+ }
114
+ body = mw.call({}).last
115
+
116
+ assert !ActiveRecord::Base.connection.query_cache.empty?, 'cache not empty'
117
+ body.close
118
+ assert ActiveRecord::Base.connection.query_cache.empty?, 'cache should be empty'
119
+ end
120
+
121
+ def test_cache_passing_a_relation
122
+ post = Post.first
123
+ Post.cache do
124
+ query = post.categories.select(:post_id)
125
+ assert Post.connection.select_all(query).is_a?(ActiveRecord::Result)
126
+ end
127
+ end
128
+
129
+ def test_find_queries
130
+ assert_queries(2) { Task.find(1); Task.find(1) }
131
+ end
132
+
133
+ def test_find_queries_with_cache
134
+ Task.cache do
135
+ assert_queries(1) { Task.find(1); Task.find(1) }
136
+ end
137
+ end
138
+
139
+ def test_find_queries_with_cache_multi_record
140
+ Task.cache do
141
+ assert_queries(2) { Task.find(1); Task.find(1); Task.find(2) }
142
+ end
143
+ end
144
+
145
+ def test_find_queries_with_multi_cache_blocks
146
+ Task.cache do
147
+ Task.cache do
148
+ assert_queries(2) { Task.find(1); Task.find(2) }
149
+ end
150
+ assert_queries(0) { Task.find(1); Task.find(1); Task.find(2) }
151
+ end
152
+ end
153
+
154
+ def test_count_queries_with_cache
155
+ Task.cache do
156
+ assert_queries(1) { Task.count; Task.count }
157
+ end
158
+ end
159
+
160
+ def test_query_cache_dups_results_correctly
161
+ Task.cache do
162
+ now = Time.now.utc
163
+ task = Task.find 1
164
+ assert_not_equal now, task.starting
165
+ task.starting = now
166
+ task.reload
167
+ assert_not_equal now, task.starting
168
+ end
169
+ end
170
+
171
+ def test_cache_is_flat
172
+ Task.cache do
173
+ Topic.columns # don't count this query
174
+ assert_queries(1) { Topic.find(1); Topic.find(1); }
175
+ end
176
+
177
+ ActiveRecord::Base.cache do
178
+ assert_queries(1) { Task.find(1); Task.find(1) }
179
+ end
180
+ end
181
+
182
+ def test_cache_does_not_wrap_string_results_in_arrays
183
+ Task.cache do
184
+ # Oracle adapter returns count() as Fixnum or Float
185
+ if current_adapter?(:OracleAdapter)
186
+ assert_kind_of Numeric, Task.connection.select_value("SELECT count(*) AS count_all FROM tasks")
187
+ elsif current_adapter?(:SQLite3Adapter, :Mysql2Adapter)
188
+ # Future versions of the sqlite3 adapter will return numeric
189
+ assert_instance_of Fixnum,
190
+ Task.connection.select_value("SELECT count(*) AS count_all FROM tasks")
191
+ else
192
+ if current_adapter?(:DB2Adapter)
193
+ assert_instance_of String, Task.connection.select_value("SELECT count(*) AS count_all FROM tasks")
194
+ else
195
+ assert_instance_of Fixnum, Task.connection.select_value("SELECT count(*) AS count_all FROM tasks")
196
+ end
197
+ end
198
+ end
199
+ end
200
+
201
+ def test_cache_is_ignored_for_locked_relations
202
+ task = Task.find 1
203
+
204
+ Task.cache do
205
+ assert_queries(2) { task.lock!; task.lock! }
206
+ end
207
+ end
208
+
209
+ def test_cache_is_available_when_connection_is_connected
210
+ conf = ActiveRecord::Base.configurations
211
+
212
+ ActiveRecord::Base.configurations = {}
213
+ Task.cache do
214
+ assert_queries(1) { Task.find(1); Task.find(1) }
215
+ end
216
+ ensure
217
+ ActiveRecord::Base.configurations = conf
218
+ end
219
+
220
+ def test_query_cache_doesnt_leak_cached_results_of_rolled_back_queries
221
+ ActiveRecord::Base.connection.enable_query_cache!
222
+ post = Post.first
223
+
224
+ Post.transaction do
225
+ post.update_attributes(title: 'rollback')
226
+ assert_equal 1, Post.where(title: 'rollback').to_a.count
227
+ raise ActiveRecord::Rollback
228
+ end
229
+
230
+ assert_equal 0, Post.where(title: 'rollback').to_a.count
231
+
232
+ ActiveRecord::Base.connection.uncached do
233
+ assert_equal 0, Post.where(title: 'rollback').to_a.count
234
+ end
235
+
236
+ begin
237
+ Post.transaction do
238
+ post.update_attributes(title: 'rollback')
239
+ assert_equal 1, Post.where(title: 'rollback').to_a.count
240
+ raise 'broken'
241
+ end
242
+ rescue Exception
243
+ end
244
+
245
+ assert_equal 0, Post.where(title: 'rollback').to_a.count
246
+
247
+ ActiveRecord::Base.connection.uncached do
248
+ assert_equal 0, Post.where(title: 'rollback').to_a.count
249
+ end
250
+ end
251
+ end
252
+
253
+ class QueryCacheExpiryTest < ActiveRecord::TestCase
254
+ fixtures :tasks, :posts, :categories, :categories_posts
255
+
256
+ def test_cache_gets_cleared_after_migration
257
+ # warm the cache
258
+ Post.find(1)
259
+
260
+ # change the column definition
261
+ Post.connection.change_column :posts, :title, :string, limit: 80
262
+ assert_nothing_raised { Post.find(1) }
263
+
264
+ # restore the old definition
265
+ Post.connection.change_column :posts, :title, :string
266
+ end
267
+
268
+ def test_find
269
+ Task.connection.expects(:clear_query_cache).times(1)
270
+
271
+ assert !Task.connection.query_cache_enabled
272
+ Task.cache do
273
+ assert Task.connection.query_cache_enabled
274
+ Task.find(1)
275
+
276
+ Task.uncached do
277
+ assert !Task.connection.query_cache_enabled
278
+ Task.find(1)
279
+ end
280
+
281
+ assert Task.connection.query_cache_enabled
282
+ end
283
+ assert !Task.connection.query_cache_enabled
284
+ end
285
+
286
+ def test_update
287
+ Task.connection.expects(:clear_query_cache).times(2)
288
+ Task.cache do
289
+ task = Task.find(1)
290
+ task.starting = Time.now.utc
291
+ task.save!
292
+ end
293
+ end
294
+
295
+ def test_destroy
296
+ Task.connection.expects(:clear_query_cache).times(2)
297
+ Task.cache do
298
+ Task.find(1).destroy
299
+ end
300
+ end
301
+
302
+ def test_insert
303
+ ActiveRecord::Base.connection.expects(:clear_query_cache).times(2)
304
+ Task.cache do
305
+ Task.create!
306
+ end
307
+ end
308
+
309
+ def test_cache_is_expired_by_habtm_update
310
+ ActiveRecord::Base.connection.expects(:clear_query_cache).times(2)
311
+ ActiveRecord::Base.cache do
312
+ c = Category.first
313
+ p = Post.first
314
+ p.categories << c
315
+ end
316
+ end
317
+
318
+ def test_cache_is_expired_by_habtm_delete
319
+ ActiveRecord::Base.connection.expects(:clear_query_cache).times(2)
320
+ ActiveRecord::Base.cache do
321
+ p = Post.find(1)
322
+ assert p.categories.any?
323
+ p.categories.delete_all
324
+ end
325
+ end
326
+ end