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,192 @@
1
+ require "cases/helper"
2
+ require 'models/post'
3
+ require 'models/author'
4
+ require 'models/project'
5
+ require 'models/developer'
6
+ require 'models/computer'
7
+ require 'models/company'
8
+
9
+ class AssociationCallbacksTest < ActiveRecord::TestCase
10
+ fixtures :posts, :authors, :projects, :developers, :author_addresses
11
+
12
+ def setup
13
+ @david = authors(:david)
14
+ @thinking = posts(:thinking)
15
+ @authorless = posts(:authorless)
16
+ assert @david.post_log.empty?
17
+ end
18
+
19
+
20
+ def test_adding_macro_callbacks
21
+ @david.posts_with_callbacks << @thinking
22
+ assert_equal ["before_adding#{@thinking.id}", "after_adding#{@thinking.id}"], @david.post_log
23
+ @david.posts_with_callbacks << @thinking
24
+ assert_equal ["before_adding#{@thinking.id}", "after_adding#{@thinking.id}", "before_adding#{@thinking.id}",
25
+ "after_adding#{@thinking.id}"], @david.post_log
26
+ end
27
+
28
+
29
+ def test_adding_with_proc_callbacks
30
+ @david.posts_with_proc_callbacks << @thinking
31
+ assert_equal ["before_adding#{@thinking.id}", "after_adding#{@thinking.id}"], @david.post_log
32
+ @david.posts_with_proc_callbacks << @thinking
33
+ assert_equal ["before_adding#{@thinking.id}", "after_adding#{@thinking.id}", "before_adding#{@thinking.id}",
34
+ "after_adding#{@thinking.id}"], @david.post_log
35
+ end
36
+
37
+ def test_removing_with_macro_callbacks
38
+ first_post, second_post = @david.posts_with_callbacks[0, 2]
39
+ @david.posts_with_callbacks.delete(first_post)
40
+ assert_equal ["before_removing#{first_post.id}", "after_removing#{first_post.id}"], @david.post_log
41
+ @david.posts_with_callbacks.delete(second_post)
42
+ assert_equal ["before_removing#{first_post.id}", "after_removing#{first_post.id}", "before_removing#{second_post.id}",
43
+ "after_removing#{second_post.id}"], @david.post_log
44
+ end
45
+
46
+ def test_removing_with_proc_callbacks
47
+ first_post, second_post = @david.posts_with_callbacks[0, 2]
48
+ @david.posts_with_proc_callbacks.delete(first_post)
49
+ assert_equal ["before_removing#{first_post.id}", "after_removing#{first_post.id}"], @david.post_log
50
+ @david.posts_with_proc_callbacks.delete(second_post)
51
+ assert_equal ["before_removing#{first_post.id}", "after_removing#{first_post.id}", "before_removing#{second_post.id}",
52
+ "after_removing#{second_post.id}"], @david.post_log
53
+ end
54
+
55
+ def test_multiple_callbacks
56
+ @david.posts_with_multiple_callbacks << @thinking
57
+ assert_equal ["before_adding#{@thinking.id}", "before_adding_proc#{@thinking.id}", "after_adding#{@thinking.id}",
58
+ "after_adding_proc#{@thinking.id}"], @david.post_log
59
+ @david.posts_with_multiple_callbacks << @thinking
60
+ assert_equal ["before_adding#{@thinking.id}", "before_adding_proc#{@thinking.id}", "after_adding#{@thinking.id}",
61
+ "after_adding_proc#{@thinking.id}", "before_adding#{@thinking.id}", "before_adding_proc#{@thinking.id}",
62
+ "after_adding#{@thinking.id}", "after_adding_proc#{@thinking.id}"], @david.post_log
63
+ end
64
+
65
+ def test_has_many_callbacks_with_create
66
+ morten = Author.create :name => "Morten"
67
+ post = morten.posts_with_proc_callbacks.create! :title => "Hello", :body => "How are you doing?"
68
+ assert_equal ["before_adding<new>", "after_adding#{post.id}"], morten.post_log
69
+ end
70
+
71
+ def test_has_many_callbacks_with_create!
72
+ morten = Author.create! :name => "Morten"
73
+ post = morten.posts_with_proc_callbacks.create :title => "Hello", :body => "How are you doing?"
74
+ assert_equal ["before_adding<new>", "after_adding#{post.id}"], morten.post_log
75
+ end
76
+
77
+ def test_has_many_callbacks_for_save_on_parent
78
+ jack = Author.new :name => "Jack"
79
+ jack.posts_with_callbacks.build :title => "Call me back!", :body => "Before you wake up and after you sleep"
80
+
81
+ callback_log = ["before_adding<new>", "after_adding#{jack.posts_with_callbacks.first.id}"]
82
+ assert_equal callback_log, jack.post_log
83
+ assert jack.save
84
+ assert_equal 1, jack.posts_with_callbacks.count
85
+ assert_equal callback_log, jack.post_log
86
+ end
87
+
88
+ def test_has_many_callbacks_for_destroy_on_parent
89
+ firm = Firm.create! :name => "Firm"
90
+ client = firm.clients.create! :name => "Client"
91
+ firm.destroy
92
+
93
+ assert_equal ["before_remove#{client.id}", "after_remove#{client.id}"], firm.log
94
+ end
95
+
96
+ def test_has_and_belongs_to_many_add_callback
97
+ david = developers(:david)
98
+ ar = projects(:active_record)
99
+ assert ar.developers_log.empty?
100
+ ar.developers_with_callbacks << david
101
+ assert_equal ["before_adding#{david.id}", "after_adding#{david.id}"], ar.developers_log
102
+ ar.developers_with_callbacks << david
103
+ assert_equal ["before_adding#{david.id}", "after_adding#{david.id}", "before_adding#{david.id}",
104
+ "after_adding#{david.id}"], ar.developers_log
105
+ end
106
+
107
+ def test_has_and_belongs_to_many_before_add_called_before_save
108
+ dev = nil
109
+ new_dev = nil
110
+ klass = Class.new(Project) do
111
+ def self.name; Project.name; end
112
+ has_and_belongs_to_many :developers_with_callbacks,
113
+ :class_name => "Developer",
114
+ :before_add => lambda { |o,r|
115
+ dev = r
116
+ new_dev = r.new_record?
117
+ }
118
+ end
119
+ rec = klass.create!
120
+ alice = Developer.new(:name => 'alice')
121
+ rec.developers_with_callbacks << alice
122
+ assert_equal alice, dev
123
+ assert_not_nil new_dev
124
+ assert new_dev, "record should not have been saved"
125
+ assert_not alice.new_record?
126
+ end
127
+
128
+ def test_has_and_belongs_to_many_after_add_called_after_save
129
+ ar = projects(:active_record)
130
+ assert ar.developers_log.empty?
131
+ alice = Developer.new(:name => 'alice')
132
+ ar.developers_with_callbacks << alice
133
+ assert_equal"after_adding#{alice.id}", ar.developers_log.last
134
+
135
+ bob = ar.developers_with_callbacks.create(:name => 'bob')
136
+ assert_equal "after_adding#{bob.id}", ar.developers_log.last
137
+
138
+ ar.developers_with_callbacks.build(:name => 'charlie')
139
+ assert_equal "after_adding<new>", ar.developers_log.last
140
+ end
141
+
142
+
143
+ def test_has_and_belongs_to_many_remove_callback
144
+ david = developers(:david)
145
+ jamis = developers(:jamis)
146
+ activerecord = projects(:active_record)
147
+ assert activerecord.developers_log.empty?
148
+ activerecord.developers_with_callbacks.delete(david)
149
+ assert_equal ["before_removing#{david.id}", "after_removing#{david.id}"], activerecord.developers_log
150
+
151
+ activerecord.developers_with_callbacks.delete(jamis)
152
+ assert_equal ["before_removing#{david.id}", "after_removing#{david.id}", "before_removing#{jamis.id}",
153
+ "after_removing#{jamis.id}"], activerecord.developers_log
154
+ end
155
+
156
+ def test_has_and_belongs_to_many_does_not_fire_callbacks_on_clear
157
+ activerecord = projects(:active_record)
158
+ assert activerecord.developers_log.empty?
159
+ if activerecord.developers_with_callbacks.size == 0
160
+ activerecord.developers << developers(:david)
161
+ activerecord.developers << developers(:jamis)
162
+ activerecord.reload
163
+ assert activerecord.developers_with_callbacks.size == 2
164
+ end
165
+ activerecord.developers_with_callbacks.flat_map {|d| ["before_removing#{d.id}","after_removing#{d.id}"]}.sort
166
+ assert activerecord.developers_with_callbacks.clear
167
+ assert_predicate activerecord.developers_log, :empty?
168
+ end
169
+
170
+ def test_has_many_and_belongs_to_many_callbacks_for_save_on_parent
171
+ project = Project.new :name => "Callbacks"
172
+ project.developers_with_callbacks.build :name => "Jack", :salary => 95000
173
+
174
+ callback_log = ["before_adding<new>", "after_adding<new>"]
175
+ assert_equal callback_log, project.developers_log
176
+ assert project.save
177
+ assert_equal 1, project.developers_with_callbacks.size
178
+ assert_equal callback_log, project.developers_log
179
+ end
180
+
181
+ def test_dont_add_if_before_callback_raises_exception
182
+ assert !@david.unchangable_posts.include?(@authorless)
183
+ begin
184
+ @david.unchangable_posts << @authorless
185
+ rescue Exception
186
+ end
187
+ assert @david.post_log.empty?
188
+ assert !@david.unchangable_posts.include?(@authorless)
189
+ @david.reload
190
+ assert !@david.unchangable_posts.include?(@authorless)
191
+ end
192
+ end
@@ -1,181 +1,188 @@
1
- require "cases/helper"
2
- require 'models/post'
3
- require 'models/comment'
4
- require 'models/author'
5
- require 'models/categorization'
6
- require 'models/category'
7
- require 'models/company'
8
- require 'models/topic'
9
- require 'models/reply'
10
- require 'models/person'
11
- require 'models/vertex'
12
- require 'models/edge'
13
-
14
- class CascadedEagerLoadingTest < ActiveRecord::TestCase
15
- fixtures :authors, :mixins, :companies, :posts, :topics, :accounts, :comments,
16
- :categorizations, :people, :categories, :edges, :vertices
17
-
18
- def test_eager_association_loading_with_cascaded_two_levels
19
- authors = Author.find(:all, :include=>{:posts=>:comments}, :order=>"authors.id")
20
- assert_equal 3, authors.size
21
- assert_equal 5, authors[0].posts.size
22
- assert_equal 3, authors[1].posts.size
23
- assert_equal 10, authors[0].posts.collect{|post| post.comments.size }.inject(0){|sum,i| sum+i}
24
- end
25
-
26
- def test_eager_association_loading_with_cascaded_two_levels_and_one_level
27
- authors = Author.find(:all, :include=>[{:posts=>:comments}, :categorizations], :order=>"authors.id")
28
- assert_equal 3, authors.size
29
- assert_equal 5, authors[0].posts.size
30
- assert_equal 3, authors[1].posts.size
31
- assert_equal 10, authors[0].posts.collect{|post| post.comments.size }.inject(0){|sum,i| sum+i}
32
- assert_equal 1, authors[0].categorizations.size
33
- assert_equal 2, authors[1].categorizations.size
34
- end
35
-
36
- def test_eager_association_loading_with_hmt_does_not_table_name_collide_when_joining_associations
37
- assert_nothing_raised do
38
- Author.joins(:posts).eager_load(:comments).where(:posts => {:taggings_count => 1}).all
39
- end
40
- authors = Author.joins(:posts).eager_load(:comments).where(:posts => {:taggings_count => 1}).all
41
- assert_equal 1, assert_no_queries { authors.size }
42
- assert_equal 10, assert_no_queries { authors[0].comments.size }
43
- end
44
-
45
- def test_eager_association_loading_grafts_stashed_associations_to_correct_parent
46
- assert_nothing_raised do
47
- Person.eager_load(:primary_contact => :primary_contact).where('primary_contacts_people_2.first_name = ?', 'Susan').order('people.id').all
48
- end
49
- assert_equal people(:michael), Person.eager_load(:primary_contact => :primary_contact).where('primary_contacts_people_2.first_name = ?', 'Susan').order('people.id').first
50
- end
51
-
52
- def test_cascaded_eager_association_loading_with_join_for_count
53
- categories = Category.joins(:categorizations).includes([{:posts=>:comments}, :authors])
54
-
55
- assert_nothing_raised do
56
- assert_equal 4, categories.count
57
- assert_equal 4, categories.all.count
58
- assert_equal 3, categories.count(:distinct => true)
59
- assert_equal 3, categories.all.uniq.size # Must uniq since instantiating with inner joins will get dupes
60
- end
61
- end
62
-
63
- def test_cascaded_eager_association_loading_with_duplicated_includes
64
- categories = Category.includes(:categorizations).includes(:categorizations => :author).where("categorizations.id is not null")
65
- assert_nothing_raised do
66
- assert_equal 3, categories.count
67
- assert_equal 3, categories.all.size
68
- end
69
- end
70
-
71
- def test_cascaded_eager_association_loading_with_twice_includes_edge_cases
72
- categories = Category.includes(:categorizations => :author).includes(:categorizations => :post).where("posts.id is not null")
73
- assert_nothing_raised do
74
- assert_equal 3, categories.count
75
- assert_equal 3, categories.all.size
76
- end
77
- end
78
-
79
- def test_eager_association_loading_with_join_for_count
80
- authors = Author.joins(:special_posts).includes([:posts, :categorizations])
81
-
82
- assert_nothing_raised { authors.count }
83
- assert_queries(3) { authors.all }
84
- end
85
-
86
- def test_eager_association_loading_with_cascaded_two_levels_with_two_has_many_associations
87
- authors = Author.find(:all, :include=>{:posts=>[:comments, :categorizations]}, :order=>"authors.id")
88
- assert_equal 3, authors.size
89
- assert_equal 5, authors[0].posts.size
90
- assert_equal 3, authors[1].posts.size
91
- assert_equal 10, authors[0].posts.collect{|post| post.comments.size }.inject(0){|sum,i| sum+i}
92
- end
93
-
94
- def test_eager_association_loading_with_cascaded_two_levels_and_self_table_reference
95
- authors = Author.find(:all, :include=>{:posts=>[:comments, :author]}, :order=>"authors.id")
96
- assert_equal 3, authors.size
97
- assert_equal 5, authors[0].posts.size
98
- assert_equal authors(:david).name, authors[0].name
99
- assert_equal [authors(:david).name], authors[0].posts.collect{|post| post.author.name}.uniq
100
- end
101
-
102
- def test_eager_association_loading_with_cascaded_two_levels_with_condition
103
- authors = Author.find(:all, :include=>{:posts=>:comments}, :conditions=>"authors.id=1", :order=>"authors.id")
104
- assert_equal 1, authors.size
105
- assert_equal 5, authors[0].posts.size
106
- end
107
-
108
- def test_eager_association_loading_with_cascaded_three_levels_by_ping_pong
109
- firms = Firm.find(:all, :include=>{:account=>{:firm=>:account}}, :order=>"companies.id")
110
- assert_equal 2, firms.size
111
- assert_equal firms.first.account, firms.first.account.firm.account
112
- assert_equal companies(:first_firm).account, assert_no_queries { firms.first.account.firm.account }
113
- assert_equal companies(:first_firm).account.firm.account, assert_no_queries { firms.first.account.firm.account }
114
- end
115
-
116
- def test_eager_association_loading_with_has_many_sti
117
- topics = Topic.find(:all, :include => :replies, :order => 'topics.id')
118
- first, second, = topics(:first).replies.size, topics(:second).replies.size
119
- assert_no_queries do
120
- assert_equal first, topics[0].replies.size
121
- assert_equal second, topics[1].replies.size
122
- end
123
- end
124
-
125
- def test_eager_association_loading_with_has_many_sti_and_subclasses
126
- silly = SillyReply.new(:title => "gaga", :content => "boo-boo", :parent_id => 1)
127
- silly.parent_id = 1
128
- assert silly.save
129
-
130
- topics = Topic.find(:all, :include => :replies, :order => 'topics.id, replies_topics.id')
131
- assert_no_queries do
132
- assert_equal 2, topics[0].replies.size
133
- assert_equal 0, topics[1].replies.size
134
- end
135
- end
136
-
137
- def test_eager_association_loading_with_belongs_to_sti
138
- replies = Reply.find(:all, :include => :topic, :order => 'topics.id')
139
- assert replies.include?(topics(:second))
140
- assert !replies.include?(topics(:first))
141
- assert_equal topics(:first), assert_no_queries { replies.first.topic }
142
- end
143
-
144
- unless current_adapter?(:IBM_DBAdapter)
145
- def test_eager_association_loading_with_multiple_stis_and_order
146
- author = Author.find(:first, :include => { :posts => [ :special_comments , :very_special_comment ] }, :order => ['authors.name', 'comments.body', 'very_special_comments_posts.body'], :conditions => 'posts.id = 4')
147
- assert_equal authors(:david), author
148
- assert_no_queries do
149
- author.posts.first.special_comments
150
- author.posts.first.very_special_comment
151
- end
152
- end
153
- end
154
-
155
- def test_eager_association_loading_of_stis_with_multiple_references
156
- authors = Author.find(:all, :include => { :posts => { :special_comments => { :post => [ :special_comments, :very_special_comment ] } } }, :order => 'comments.body, very_special_comments_posts.body', :conditions => 'posts.id = 4')
157
- assert_equal [authors(:david)], authors
158
- assert_no_queries do
159
- authors.first.posts.first.special_comments.first.post.special_comments
160
- authors.first.posts.first.special_comments.first.post.very_special_comment
161
- end
162
- end
163
-
164
- def test_eager_association_loading_where_first_level_returns_nil
165
- authors = Author.find(:all, :include => {:post_about_thinking => :comments}, :order => 'authors.id DESC')
166
- assert_equal [authors(:bob), authors(:mary), authors(:david)], authors
167
- assert_no_queries do
168
- authors[2].post_about_thinking.comments.first
169
- end
170
- end
171
-
172
- def test_eager_association_loading_with_recursive_cascading_four_levels_has_many_through
173
- source = Vertex.find(:first, :include=>{:sinks=>{:sinks=>{:sinks=>:sinks}}}, :order => 'vertices.id')
174
- assert_equal vertices(:vertex_4), assert_no_queries { source.sinks.first.sinks.first.sinks.first }
175
- end
176
-
177
- def test_eager_association_loading_with_recursive_cascading_four_levels_has_and_belongs_to_many
178
- sink = Vertex.find(:first, :include=>{:sources=>{:sources=>{:sources=>:sources}}}, :order => 'vertices.id DESC')
179
- assert_equal vertices(:vertex_1), assert_no_queries { sink.sources.first.sources.first.sources.first.sources.first }
180
- end
181
- end
1
+ require "cases/helper"
2
+ require 'models/post'
3
+ require 'models/comment'
4
+ require 'models/author'
5
+ require 'models/categorization'
6
+ require 'models/category'
7
+ require 'models/company'
8
+ require 'models/topic'
9
+ require 'models/reply'
10
+ require 'models/person'
11
+ require 'models/vertex'
12
+ require 'models/edge'
13
+
14
+ class CascadedEagerLoadingTest < ActiveRecord::TestCase
15
+ fixtures :authors, :mixins, :companies, :posts, :topics, :accounts, :comments,
16
+ :categorizations, :people, :categories, :edges, :vertices, :author_addresses
17
+
18
+ def test_eager_association_loading_with_cascaded_two_levels
19
+ authors = Author.all.merge!(:includes=>{:posts=>:comments}, :order=>"authors.id").to_a
20
+ assert_equal 3, authors.size
21
+ assert_equal 5, authors[0].posts.size
22
+ assert_equal 3, authors[1].posts.size
23
+ assert_equal 10, authors[0].posts.collect{|post| post.comments.size }.inject(0){|sum,i| sum+i}
24
+ end
25
+
26
+ def test_eager_association_loading_with_cascaded_two_levels_and_one_level
27
+ authors = Author.all.merge!(:includes=>[{:posts=>:comments}, :categorizations], :order=>"authors.id").to_a
28
+ assert_equal 3, authors.size
29
+ assert_equal 5, authors[0].posts.size
30
+ assert_equal 3, authors[1].posts.size
31
+ assert_equal 10, authors[0].posts.collect{|post| post.comments.size }.inject(0){|sum,i| sum+i}
32
+ assert_equal 1, authors[0].categorizations.size
33
+ assert_equal 2, authors[1].categorizations.size
34
+ end
35
+
36
+ def test_eager_association_loading_with_hmt_does_not_table_name_collide_when_joining_associations
37
+ assert_nothing_raised do
38
+ Author.joins(:posts).eager_load(:comments).where(:posts => {:tags_count => 1}).to_a
39
+ end
40
+ authors = Author.joins(:posts).eager_load(:comments).where(:posts => {:tags_count => 1}).to_a
41
+ assert_equal 1, assert_no_queries { authors.size }
42
+ assert_equal 10, assert_no_queries { authors[0].comments.size }
43
+ end
44
+
45
+ def test_eager_association_loading_grafts_stashed_associations_to_correct_parent
46
+ assert_nothing_raised do
47
+ Person.eager_load(:primary_contact => :primary_contact).where('primary_contacts_people_2.first_name = ?', 'Susan').order('people.id').to_a
48
+ end
49
+ assert_equal people(:michael), Person.eager_load(:primary_contact => :primary_contact).where('primary_contacts_people_2.first_name = ?', 'Susan').order('people.id').first
50
+ end
51
+
52
+ def test_cascaded_eager_association_loading_with_join_for_count
53
+ categories = Category.joins(:categorizations).includes([{:posts=>:comments}, :authors])
54
+
55
+ assert_equal 4, categories.count
56
+ assert_equal 4, categories.to_a.count
57
+ assert_equal 3, categories.distinct.count
58
+ assert_equal 3, categories.to_a.uniq.size # Must uniq since instantiating with inner joins will get dupes
59
+ end
60
+
61
+ def test_cascaded_eager_association_loading_with_duplicated_includes
62
+ categories = Category.includes(:categorizations).includes(:categorizations => :author).where("categorizations.id is not null").references(:categorizations)
63
+ assert_nothing_raised do
64
+ assert_equal 3, categories.count
65
+ assert_equal 3, categories.to_a.size
66
+ end
67
+ end
68
+
69
+ def test_cascaded_eager_association_loading_with_twice_includes_edge_cases
70
+ categories = Category.includes(:categorizations => :author).includes(:categorizations => :post).where("posts.id is not null").references(:posts)
71
+ assert_nothing_raised do
72
+ assert_equal 3, categories.count
73
+ assert_equal 3, categories.to_a.size
74
+ end
75
+ end
76
+
77
+ def test_eager_association_loading_with_join_for_count
78
+ authors = Author.joins(:special_posts).includes([:posts, :categorizations])
79
+
80
+ assert_nothing_raised { authors.count }
81
+ assert_queries(3) { authors.to_a }
82
+ end
83
+
84
+ def test_eager_association_loading_with_cascaded_two_levels_with_two_has_many_associations
85
+ authors = Author.all.merge!(:includes=>{:posts=>[:comments, :categorizations]}, :order=>"authors.id").to_a
86
+ assert_equal 3, authors.size
87
+ assert_equal 5, authors[0].posts.size
88
+ assert_equal 3, authors[1].posts.size
89
+ assert_equal 10, authors[0].posts.collect{|post| post.comments.size }.inject(0){|sum,i| sum+i}
90
+ end
91
+
92
+ def test_eager_association_loading_with_cascaded_two_levels_and_self_table_reference
93
+ authors = Author.all.merge!(:includes=>{:posts=>[:comments, :author]}, :order=>"authors.id").to_a
94
+ assert_equal 3, authors.size
95
+ assert_equal 5, authors[0].posts.size
96
+ assert_equal authors(:david).name, authors[0].name
97
+ assert_equal [authors(:david).name], authors[0].posts.collect{|post| post.author.name}.uniq
98
+ end
99
+
100
+ def test_eager_association_loading_with_cascaded_two_levels_with_condition
101
+ authors = Author.all.merge!(:includes=>{:posts=>:comments}, :where=>"authors.id=1", :order=>"authors.id").to_a
102
+ assert_equal 1, authors.size
103
+ assert_equal 5, authors[0].posts.size
104
+ end
105
+
106
+ def test_eager_association_loading_with_cascaded_three_levels_by_ping_pong
107
+ firms = Firm.all.merge!(:includes=>{:account=>{:firm=>:account}}, :order=>"companies.id").to_a
108
+ assert_equal 2, firms.size
109
+ assert_equal firms.first.account, firms.first.account.firm.account
110
+ assert_equal companies(:first_firm).account, assert_no_queries { firms.first.account.firm.account }
111
+ assert_equal companies(:first_firm).account.firm.account, assert_no_queries { firms.first.account.firm.account }
112
+ end
113
+
114
+ def test_eager_association_loading_with_has_many_sti
115
+ topics = Topic.all.merge!(:includes => :replies, :order => 'topics.id').to_a
116
+ first, second, = topics(:first).replies.size, topics(:second).replies.size
117
+ assert_no_queries do
118
+ assert_equal first, topics[0].replies.size
119
+ assert_equal second, topics[1].replies.size
120
+ end
121
+ end
122
+
123
+ def test_eager_association_loading_with_has_many_sti_and_subclasses
124
+ silly = SillyReply.new(:title => "gaga", :content => "boo-boo", :parent_id => 1)
125
+ silly.parent_id = 1
126
+ assert silly.save
127
+
128
+ topics = Topic.all.merge!(:includes => :replies, :order => ['topics.id', 'replies_topics.id']).to_a
129
+ assert_no_queries do
130
+ assert_equal 2, topics[0].replies.size
131
+ assert_equal 0, topics[1].replies.size
132
+ end
133
+ end
134
+
135
+ def test_eager_association_loading_with_belongs_to_sti
136
+ replies = Reply.all.merge!(:includes => :topic, :order => 'topics.id').to_a
137
+ assert replies.include?(topics(:second))
138
+ assert !replies.include?(topics(:first))
139
+ assert_equal topics(:first), assert_no_queries { replies.first.topic }
140
+ end
141
+
142
+ def test_eager_association_loading_with_multiple_stis_and_order
143
+ author = Author.all.merge!(:includes => { :posts => [ :special_comments , :very_special_comment ] }, :order => ['authors.name', 'comments.body', 'very_special_comments_posts.body'], :where => 'posts.id = 4').first
144
+ assert_equal authors(:david), author
145
+ assert_no_queries do
146
+ author.posts.first.special_comments
147
+ author.posts.first.very_special_comment
148
+ end
149
+ end
150
+
151
+ def test_eager_association_loading_of_stis_with_multiple_references
152
+ authors = Author.all.merge!(:includes => { :posts => { :special_comments => { :post => [ :special_comments, :very_special_comment ] } } }, :order => 'comments.body, very_special_comments_posts.body', :where => 'posts.id = 4').to_a
153
+ assert_equal [authors(:david)], authors
154
+ assert_no_queries do
155
+ authors.first.posts.first.special_comments.first.post.special_comments
156
+ authors.first.posts.first.special_comments.first.post.very_special_comment
157
+ end
158
+ end
159
+
160
+ def test_eager_association_loading_where_first_level_returns_nil
161
+ authors = Author.all.merge!(:includes => {:post_about_thinking => :comments}, :order => 'authors.id DESC').to_a
162
+ assert_equal [authors(:bob), authors(:mary), authors(:david)], authors
163
+ assert_no_queries do
164
+ authors[2].post_about_thinking.comments.first
165
+ end
166
+ end
167
+
168
+ def test_eager_association_loading_with_recursive_cascading_four_levels_has_many_through
169
+ source = Vertex.all.merge!(:includes=>{:sinks=>{:sinks=>{:sinks=>:sinks}}}, :order => 'vertices.id').first
170
+ assert_equal vertices(:vertex_4), assert_no_queries { source.sinks.first.sinks.first.sinks.first }
171
+ end
172
+
173
+ def test_eager_association_loading_with_recursive_cascading_four_levels_has_and_belongs_to_many
174
+ sink = Vertex.all.merge!(:includes=>{:sources=>{:sources=>{:sources=>:sources}}}, :order => 'vertices.id DESC').first
175
+ assert_equal vertices(:vertex_1), assert_no_queries { sink.sources.first.sources.first.sources.first.sources.first }
176
+ end
177
+
178
+ def test_eager_association_loading_with_cascaded_interdependent_one_level_and_two_levels
179
+ authors_relation = Author.all.merge!(includes: [:comments, { posts: :categorizations }], order: "authors.id")
180
+ authors = authors_relation.to_a
181
+ assert_equal 3, authors.size
182
+ assert_equal 10, authors[0].comments.size
183
+ assert_equal 1, authors[1].comments.size
184
+ assert_equal 5, authors[0].posts.size
185
+ assert_equal 3, authors[1].posts.size
186
+ assert_equal 3, authors[0].posts.collect { |post| post.categorizations.size }.inject(0) { |sum, i| sum+i }
187
+ end
188
+ end