ibm_db 3.0.5-x86-mingw32 → 4.0.0-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 (586) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -0
  3. data/LICENSE +1 -1
  4. data/MANIFEST +14 -14
  5. data/ParameterizedQueries README +6 -6
  6. data/README +208 -225
  7. data/ext/Makefile.nt32 +181 -181
  8. data/ext/Makefile.nt32.191 +212 -212
  9. data/ext/extconf.rb +291 -291
  10. data/ext/ibm_db.c +11887 -11887
  11. data/ext/ruby_ibm_db.h +241 -241
  12. data/ext/ruby_ibm_db_cli.c +866 -866
  13. data/ext/ruby_ibm_db_cli.h +500 -500
  14. data/init.rb +41 -41
  15. data/lib/IBM_DB.rb +27 -27
  16. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3452 -3177
  17. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -2
  18. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  19. data/lib/mswin32/ibm_db.rb +91 -123
  20. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  21. data/test/active_record/connection_adapters/fake_adapter.rb +49 -46
  22. data/test/assets/example.log +1 -1
  23. data/test/assets/test.txt +1 -1
  24. data/test/cases/adapter_test.rb +351 -276
  25. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
  26. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
  27. data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
  28. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
  29. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
  30. data/test/cases/adapters/mysql2/connection_test.rb +210 -0
  31. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
  32. data/test/cases/adapters/mysql2/enum_test.rb +26 -0
  33. data/test/cases/adapters/mysql2/explain_test.rb +21 -0
  34. data/test/cases/adapters/mysql2/json_test.rb +195 -0
  35. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
  36. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  37. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
  38. data/test/cases/adapters/mysql2/schema_test.rb +126 -0
  39. data/test/cases/adapters/mysql2/sp_test.rb +36 -0
  40. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
  41. data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
  42. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
  43. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
  44. data/test/cases/adapters/postgresql/array_test.rb +339 -0
  45. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
  46. data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
  47. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
  48. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
  49. data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
  50. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  51. data/test/cases/adapters/postgresql/collation_test.rb +53 -0
  52. data/test/cases/adapters/postgresql/composite_test.rb +132 -0
  53. data/test/cases/adapters/postgresql/connection_test.rb +257 -0
  54. data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
  55. data/test/cases/adapters/postgresql/domain_test.rb +47 -0
  56. data/test/cases/adapters/postgresql/enum_test.rb +91 -0
  57. data/test/cases/adapters/postgresql/explain_test.rb +20 -0
  58. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
  59. data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
  60. data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
  61. data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
  62. data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
  63. data/test/cases/adapters/postgresql/integer_test.rb +25 -0
  64. data/test/cases/adapters/postgresql/json_test.rb +237 -0
  65. data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
  66. data/test/cases/adapters/postgresql/money_test.rb +96 -0
  67. data/test/cases/adapters/postgresql/network_test.rb +94 -0
  68. data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
  69. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
  70. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  71. data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
  72. data/test/cases/adapters/postgresql/range_test.rb +343 -0
  73. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
  74. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
  75. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
  76. data/test/cases/adapters/postgresql/schema_test.rb +597 -0
  77. data/test/cases/adapters/postgresql/serial_test.rb +154 -0
  78. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
  79. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
  80. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
  81. data/test/cases/adapters/postgresql/utils_test.rb +62 -0
  82. data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
  83. data/test/cases/adapters/postgresql/xml_test.rb +54 -0
  84. data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
  85. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
  86. data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
  87. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
  88. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
  89. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  90. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
  91. data/test/cases/aggregations_test.rb +168 -158
  92. data/test/cases/ar_schema_test.rb +146 -161
  93. data/test/cases/associations/association_scope_test.rb +16 -21
  94. data/test/cases/associations/belongs_to_associations_test.rb +1141 -1029
  95. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
  96. data/test/cases/associations/callbacks_test.rb +190 -192
  97. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  98. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  99. data/test/cases/associations/eager_load_nested_include_test.rb +126 -128
  100. data/test/cases/associations/eager_singularization_test.rb +148 -148
  101. data/test/cases/associations/eager_test.rb +1514 -1429
  102. data/test/cases/associations/extension_test.rb +87 -82
  103. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -972
  104. data/test/cases/associations/has_many_associations_test.rb +2501 -2182
  105. data/test/cases/associations/has_many_through_associations_test.rb +1271 -1204
  106. data/test/cases/associations/has_one_associations_test.rb +707 -610
  107. data/test/cases/associations/has_one_through_associations_test.rb +383 -380
  108. data/test/cases/associations/inner_join_association_test.rb +139 -139
  109. data/test/cases/associations/inverse_associations_test.rb +733 -706
  110. data/test/cases/associations/join_model_test.rb +777 -754
  111. data/test/cases/associations/left_outer_join_association_test.rb +88 -0
  112. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  113. data/test/cases/associations/required_test.rb +102 -82
  114. data/test/cases/associations_test.rb +385 -380
  115. data/test/cases/attribute_decorators_test.rb +125 -125
  116. data/test/cases/attribute_methods/read_test.rb +60 -60
  117. data/test/cases/attribute_methods_test.rb +1009 -952
  118. data/test/cases/attribute_set_test.rb +270 -210
  119. data/test/cases/attribute_test.rb +246 -180
  120. data/test/cases/attributes_test.rb +253 -136
  121. data/test/cases/autosave_association_test.rb +1708 -1595
  122. data/test/cases/base_test.rb +1713 -1664
  123. data/test/cases/batches_test.rb +489 -212
  124. data/test/cases/binary_test.rb +44 -52
  125. data/test/cases/bind_parameter_test.rb +110 -100
  126. data/test/cases/cache_key_test.rb +25 -0
  127. data/test/cases/calculations_test.rb +798 -646
  128. data/test/cases/callbacks_test.rb +636 -543
  129. data/test/cases/clone_test.rb +40 -40
  130. data/test/cases/coders/json_test.rb +15 -0
  131. data/test/cases/coders/yaml_column_test.rb +63 -63
  132. data/test/cases/collection_cache_key_test.rb +115 -0
  133. data/test/cases/column_alias_test.rb +17 -17
  134. data/test/cases/column_definition_test.rb +92 -123
  135. data/test/cases/comment_test.rb +143 -0
  136. data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -54
  137. data/test/cases/connection_adapters/connection_handler_test.rb +160 -53
  138. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  139. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -293
  140. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -65
  141. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  142. data/test/cases/connection_adapters/schema_cache_test.rb +61 -56
  143. data/test/cases/connection_adapters/type_lookup_test.rb +118 -110
  144. data/test/cases/connection_management_test.rb +112 -122
  145. data/test/cases/connection_pool_test.rb +521 -346
  146. data/test/cases/connection_specification/resolver_test.rb +131 -116
  147. data/test/cases/core_test.rb +112 -112
  148. data/test/cases/counter_cache_test.rb +214 -209
  149. data/test/cases/custom_locking_test.rb +17 -17
  150. data/test/cases/database_statements_test.rb +34 -19
  151. data/test/cases/{invalid_date_test.rb → date_test.rb} +44 -32
  152. data/test/cases/date_time_precision_test.rb +106 -0
  153. data/test/cases/date_time_test.rb +61 -61
  154. data/test/cases/defaults_test.rb +218 -223
  155. data/test/cases/dirty_test.rb +763 -785
  156. data/test/cases/disconnected_test.rb +30 -28
  157. data/test/cases/dup_test.rb +157 -157
  158. data/test/cases/enum_test.rb +444 -290
  159. data/test/cases/errors_test.rb +16 -0
  160. data/test/cases/explain_subscriber_test.rb +64 -64
  161. data/test/cases/explain_test.rb +87 -76
  162. data/test/cases/finder_respond_to_test.rb +60 -60
  163. data/test/cases/finder_test.rb +1294 -1169
  164. data/test/cases/fixture_set/file_test.rb +156 -138
  165. data/test/cases/fixtures_test.rb +988 -908
  166. data/test/cases/forbidden_attributes_protection_test.rb +165 -99
  167. data/test/cases/habtm_destroy_order_test.rb +61 -61
  168. data/test/cases/helper.rb +204 -210
  169. data/test/cases/hot_compatibility_test.rb +142 -54
  170. data/test/cases/i18n_test.rb +45 -45
  171. data/test/cases/inheritance_test.rb +606 -375
  172. data/test/cases/integration_test.rb +155 -139
  173. data/test/cases/invalid_connection_test.rb +24 -22
  174. data/test/cases/invertible_migration_test.rb +387 -295
  175. data/test/cases/json_serialization_test.rb +311 -302
  176. data/test/cases/locking_test.rb +493 -477
  177. data/test/cases/log_subscriber_test.rb +225 -136
  178. data/test/cases/migration/change_schema_test.rb +458 -512
  179. data/test/cases/migration/change_table_test.rb +256 -224
  180. data/test/cases/migration/column_attributes_test.rb +176 -192
  181. data/test/cases/migration/column_positioning_test.rb +56 -56
  182. data/test/cases/migration/columns_test.rb +310 -304
  183. data/test/cases/migration/command_recorder_test.rb +350 -305
  184. data/test/cases/migration/compatibility_test.rb +118 -0
  185. data/test/cases/migration/create_join_table_test.rb +157 -148
  186. data/test/cases/migration/foreign_key_test.rb +360 -328
  187. data/test/cases/migration/helper.rb +39 -39
  188. data/test/cases/migration/index_test.rb +218 -216
  189. data/test/cases/migration/logger_test.rb +36 -36
  190. data/test/cases/migration/pending_migrations_test.rb +52 -53
  191. data/test/cases/migration/references_foreign_key_test.rb +216 -169
  192. data/test/cases/migration/references_index_test.rb +101 -101
  193. data/test/cases/migration/references_statements_test.rb +136 -116
  194. data/test/cases/migration/rename_table_test.rb +93 -93
  195. data/test/cases/migration_test.rb +1157 -959
  196. data/test/cases/migrator_test.rb +470 -388
  197. data/test/cases/mixin_test.rb +68 -70
  198. data/test/cases/modules_test.rb +172 -173
  199. data/test/cases/multiparameter_attributes_test.rb +372 -350
  200. data/test/cases/multiple_db_test.rb +122 -115
  201. data/test/cases/nested_attributes_test.rb +1098 -1070
  202. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  203. data/test/cases/persistence_test.rb +1001 -909
  204. data/test/cases/pooled_connections_test.rb +81 -81
  205. data/test/cases/primary_keys_test.rb +376 -237
  206. data/test/cases/query_cache_test.rb +446 -326
  207. data/test/cases/quoting_test.rb +202 -156
  208. data/test/cases/readonly_test.rb +119 -118
  209. data/test/cases/reaper_test.rb +85 -85
  210. data/test/cases/reflection_test.rb +509 -463
  211. data/test/cases/relation/delegation_test.rb +63 -68
  212. data/test/cases/relation/merging_test.rb +157 -161
  213. data/test/cases/relation/mutation_test.rb +183 -165
  214. data/test/cases/relation/or_test.rb +92 -0
  215. data/test/cases/relation/predicate_builder_test.rb +16 -14
  216. data/test/cases/relation/record_fetch_warning_test.rb +40 -0
  217. data/test/cases/relation/where_chain_test.rb +105 -181
  218. data/test/cases/relation/where_clause_test.rb +182 -0
  219. data/test/cases/relation/where_test.rb +322 -300
  220. data/test/cases/relation_test.rb +328 -319
  221. data/test/cases/relations_test.rb +2026 -1815
  222. data/test/cases/reload_models_test.rb +22 -22
  223. data/test/cases/result_test.rb +90 -80
  224. data/test/cases/sanitize_test.rb +176 -83
  225. data/test/cases/schema_dumper_test.rb +457 -463
  226. data/test/cases/schema_loading_test.rb +52 -0
  227. data/test/cases/scoping/default_scoping_test.rb +528 -454
  228. data/test/cases/scoping/named_scoping_test.rb +561 -524
  229. data/test/cases/scoping/relation_scoping_test.rb +400 -357
  230. data/test/cases/secure_token_test.rb +32 -0
  231. data/test/cases/serialization_test.rb +104 -104
  232. data/test/cases/serialized_attribute_test.rb +364 -277
  233. data/test/cases/statement_cache_test.rb +136 -98
  234. data/test/cases/store_test.rb +195 -194
  235. data/test/cases/suppressor_test.rb +63 -0
  236. data/test/cases/tasks/database_tasks_test.rb +462 -398
  237. data/test/cases/tasks/mysql_rake_test.rb +345 -324
  238. data/test/cases/tasks/postgresql_rake_test.rb +304 -250
  239. data/test/cases/tasks/sqlite_rake_test.rb +220 -193
  240. data/test/cases/test_case.rb +131 -123
  241. data/test/cases/test_fixtures_test.rb +36 -0
  242. data/test/cases/time_precision_test.rb +102 -0
  243. data/test/cases/timestamp_test.rb +501 -467
  244. data/test/cases/touch_later_test.rb +121 -0
  245. data/test/cases/transaction_callbacks_test.rb +518 -452
  246. data/test/cases/transaction_isolation_test.rb +106 -106
  247. data/test/cases/transactions_test.rb +834 -817
  248. data/test/cases/type/adapter_specific_registry_test.rb +133 -0
  249. data/test/cases/type/date_time_test.rb +14 -0
  250. data/test/cases/type/integer_test.rb +27 -121
  251. data/test/cases/type/string_test.rb +22 -36
  252. data/test/cases/type/type_map_test.rb +177 -177
  253. data/test/cases/type_test.rb +39 -0
  254. data/test/cases/types_test.rb +24 -141
  255. data/test/cases/unconnected_test.rb +33 -33
  256. data/test/cases/validations/absence_validation_test.rb +73 -0
  257. data/test/cases/validations/association_validation_test.rb +97 -86
  258. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  259. data/test/cases/validations/i18n_validation_test.rb +86 -90
  260. data/test/cases/validations/length_validation_test.rb +79 -47
  261. data/test/cases/validations/presence_validation_test.rb +103 -68
  262. data/test/cases/validations/uniqueness_validation_test.rb +548 -457
  263. data/test/cases/validations_repair_helper.rb +19 -23
  264. data/test/cases/validations_test.rb +194 -165
  265. data/test/cases/view_test.rb +216 -119
  266. data/test/cases/yaml_serialization_test.rb +121 -126
  267. data/test/config.example.yml +97 -0
  268. data/test/config.rb +5 -5
  269. data/test/fixtures/accounts.yml +29 -29
  270. data/test/fixtures/admin/accounts.yml +2 -2
  271. data/test/fixtures/admin/users.yml +10 -10
  272. data/test/fixtures/author_addresses.original +11 -0
  273. data/test/fixtures/author_addresses.yml +17 -17
  274. data/test/fixtures/author_favorites.yml +3 -3
  275. data/test/fixtures/authors.original +17 -0
  276. data/test/fixtures/authors.yml +23 -23
  277. data/test/fixtures/bad_posts.yml +9 -0
  278. data/test/fixtures/binaries.yml +133 -133
  279. data/test/fixtures/books.yml +31 -11
  280. data/test/fixtures/bulbs.yml +5 -5
  281. data/test/fixtures/cars.yml +9 -9
  282. data/test/fixtures/categories.yml +19 -19
  283. data/test/fixtures/categories/special_categories.yml +9 -9
  284. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  285. data/test/fixtures/categories_ordered.yml +7 -7
  286. data/test/fixtures/categories_posts.yml +31 -31
  287. data/test/fixtures/categorizations.yml +23 -23
  288. data/test/fixtures/clubs.yml +8 -8
  289. data/test/fixtures/collections.yml +3 -3
  290. data/test/fixtures/colleges.yml +3 -3
  291. data/test/fixtures/comments.yml +65 -65
  292. data/test/fixtures/companies.yml +67 -67
  293. data/test/fixtures/computers.yml +10 -10
  294. data/test/fixtures/content.yml +3 -0
  295. data/test/fixtures/content_positions.yml +3 -0
  296. data/test/fixtures/courses.yml +8 -8
  297. data/test/fixtures/customers.yml +25 -25
  298. data/test/fixtures/dashboards.yml +6 -6
  299. data/test/fixtures/dead_parrots.yml +5 -0
  300. data/test/fixtures/developers.yml +22 -22
  301. data/test/fixtures/developers_projects.yml +16 -16
  302. data/test/fixtures/dog_lovers.yml +7 -7
  303. data/test/fixtures/dogs.yml +4 -4
  304. data/test/fixtures/doubloons.yml +3 -3
  305. data/test/fixtures/edges.yml +5 -5
  306. data/test/fixtures/entrants.yml +14 -14
  307. data/test/fixtures/essays.yml +6 -6
  308. data/test/fixtures/faces.yml +11 -11
  309. data/test/fixtures/fk_test_has_fk.yml +3 -3
  310. data/test/fixtures/fk_test_has_pk.yml +1 -1
  311. data/test/fixtures/friendships.yml +4 -4
  312. data/test/fixtures/funny_jokes.yml +10 -10
  313. data/test/fixtures/interests.yml +33 -33
  314. data/test/fixtures/items.yml +3 -3
  315. data/test/fixtures/jobs.yml +7 -7
  316. data/test/fixtures/legacy_things.yml +3 -3
  317. data/test/fixtures/live_parrots.yml +4 -0
  318. data/test/fixtures/mateys.yml +4 -4
  319. data/test/fixtures/member_details.yml +8 -8
  320. data/test/fixtures/member_types.yml +6 -6
  321. data/test/fixtures/members.yml +11 -11
  322. data/test/fixtures/memberships.yml +34 -34
  323. data/test/fixtures/men.yml +5 -5
  324. data/test/fixtures/minimalistics.yml +2 -2
  325. data/test/fixtures/minivans.yml +5 -5
  326. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  327. data/test/fixtures/mixins.yml +29 -29
  328. data/test/fixtures/movies.yml +7 -7
  329. data/test/fixtures/naked/yml/accounts.yml +1 -1
  330. data/test/fixtures/naked/yml/companies.yml +1 -1
  331. data/test/fixtures/naked/yml/courses.yml +1 -1
  332. data/test/fixtures/naked/yml/parrots.yml +2 -0
  333. data/test/fixtures/naked/yml/trees.yml +3 -0
  334. data/test/fixtures/nodes.yml +29 -0
  335. data/test/fixtures/organizations.yml +5 -5
  336. data/test/fixtures/other_comments.yml +6 -0
  337. data/test/fixtures/other_dogs.yml +2 -0
  338. data/test/fixtures/other_posts.yml +7 -0
  339. data/test/fixtures/other_topics.yml +42 -42
  340. data/test/fixtures/owners.yml +9 -9
  341. data/test/fixtures/parrots.yml +27 -27
  342. data/test/fixtures/parrots_pirates.yml +7 -7
  343. data/test/fixtures/people.yml +24 -24
  344. data/test/fixtures/peoples_treasures.yml +3 -3
  345. data/test/fixtures/pets.yml +19 -19
  346. data/test/fixtures/pirates.yml +15 -12
  347. data/test/fixtures/posts.yml +80 -80
  348. data/test/fixtures/price_estimates.yml +16 -7
  349. data/test/fixtures/products.yml +4 -4
  350. data/test/fixtures/projects.yml +7 -7
  351. data/test/fixtures/ratings.yml +14 -14
  352. data/test/fixtures/readers.yml +11 -11
  353. data/test/fixtures/references.yml +17 -17
  354. data/test/fixtures/reserved_words/distinct.yml +5 -5
  355. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  356. data/test/fixtures/reserved_words/group.yml +14 -14
  357. data/test/fixtures/reserved_words/select.yml +8 -8
  358. data/test/fixtures/reserved_words/values.yml +7 -7
  359. data/test/fixtures/ships.yml +6 -6
  360. data/test/fixtures/speedometers.yml +8 -8
  361. data/test/fixtures/sponsors.yml +12 -12
  362. data/test/fixtures/string_key_objects.yml +7 -7
  363. data/test/fixtures/subscribers.yml +10 -10
  364. data/test/fixtures/subscriptions.yml +12 -12
  365. data/test/fixtures/taggings.yml +78 -78
  366. data/test/fixtures/tags.yml +11 -11
  367. data/test/fixtures/tasks.yml +7 -7
  368. data/test/fixtures/teapots.yml +3 -3
  369. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  370. data/test/fixtures/to_be_linked/users.yml +10 -10
  371. data/test/fixtures/topics.yml +49 -49
  372. data/test/fixtures/toys.yml +14 -14
  373. data/test/fixtures/traffic_lights.yml +9 -9
  374. data/test/fixtures/treasures.yml +10 -10
  375. data/test/fixtures/trees.yml +3 -0
  376. data/test/fixtures/uuid_children.yml +3 -3
  377. data/test/fixtures/uuid_parents.yml +2 -2
  378. data/test/fixtures/variants.yml +4 -4
  379. data/test/fixtures/vegetables.yml +19 -19
  380. data/test/fixtures/vertices.yml +3 -3
  381. data/test/fixtures/warehouse_things.yml +2 -2
  382. data/test/fixtures/zines.yml +5 -5
  383. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  384. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  385. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  386. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -9
  387. data/test/migrations/missing/1_people_have_last_names.rb +9 -9
  388. data/test/migrations/missing/3_we_need_reminders.rb +12 -12
  389. data/test/migrations/missing/4_innocent_jointable.rb +12 -12
  390. data/test/migrations/rename/1_we_need_things.rb +11 -11
  391. data/test/migrations/rename/2_rename_things.rb +9 -9
  392. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  393. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  394. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  395. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  396. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  397. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  398. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  399. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  400. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  401. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  402. data/test/migrations/valid/2_we_need_reminders.rb +12 -12
  403. data/test/migrations/valid/3_innocent_jointable.rb +12 -12
  404. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  405. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -12
  406. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -12
  407. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  408. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  409. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  410. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  411. data/test/models/admin.rb +5 -5
  412. data/test/models/admin/account.rb +3 -3
  413. data/test/models/admin/randomly_named_c1.rb +6 -2
  414. data/test/models/admin/user.rb +40 -40
  415. data/test/models/aircraft.rb +5 -4
  416. data/test/models/arunit2_model.rb +3 -3
  417. data/test/models/author.rb +209 -212
  418. data/test/models/auto_id.rb +4 -4
  419. data/test/models/autoloadable/extra_firm.rb +2 -2
  420. data/test/models/binary.rb +2 -2
  421. data/test/models/bird.rb +12 -12
  422. data/test/models/book.rb +23 -18
  423. data/test/models/boolean.rb +2 -2
  424. data/test/models/bulb.rb +52 -51
  425. data/test/models/cake_designer.rb +3 -3
  426. data/test/models/car.rb +29 -26
  427. data/test/models/carrier.rb +2 -2
  428. data/test/models/cat.rb +10 -0
  429. data/test/models/categorization.rb +19 -19
  430. data/test/models/category.rb +35 -35
  431. data/test/models/chef.rb +8 -7
  432. data/test/models/citation.rb +3 -3
  433. data/test/models/club.rb +25 -23
  434. data/test/models/college.rb +10 -10
  435. data/test/models/column.rb +3 -3
  436. data/test/models/column_name.rb +3 -3
  437. data/test/models/comment.rb +76 -64
  438. data/test/models/company.rb +230 -228
  439. data/test/models/company_in_module.rb +98 -98
  440. data/test/models/computer.rb +3 -3
  441. data/test/models/contact.rb +41 -41
  442. data/test/models/content.rb +40 -0
  443. data/test/models/contract.rb +20 -20
  444. data/test/models/country.rb +7 -7
  445. data/test/models/course.rb +6 -6
  446. data/test/models/customer.rb +83 -77
  447. data/test/models/customer_carrier.rb +14 -14
  448. data/test/models/dashboard.rb +3 -3
  449. data/test/models/default.rb +2 -2
  450. data/test/models/department.rb +4 -4
  451. data/test/models/developer.rb +274 -255
  452. data/test/models/dog.rb +5 -5
  453. data/test/models/dog_lover.rb +5 -5
  454. data/test/models/doubloon.rb +12 -12
  455. data/test/models/drink_designer.rb +3 -3
  456. data/test/models/edge.rb +5 -5
  457. data/test/models/electron.rb +5 -5
  458. data/test/models/engine.rb +4 -4
  459. data/test/models/entrant.rb +3 -3
  460. data/test/models/essay.rb +5 -5
  461. data/test/models/event.rb +3 -3
  462. data/test/models/eye.rb +37 -37
  463. data/test/models/face.rb +9 -9
  464. data/test/models/friendship.rb +6 -6
  465. data/test/models/guid.rb +2 -2
  466. data/test/models/guitar.rb +4 -0
  467. data/test/models/hotel.rb +11 -9
  468. data/test/models/image.rb +3 -3
  469. data/test/models/interest.rb +5 -5
  470. data/test/models/invoice.rb +4 -4
  471. data/test/models/item.rb +7 -7
  472. data/test/models/job.rb +7 -7
  473. data/test/models/joke.rb +7 -7
  474. data/test/models/keyboard.rb +3 -3
  475. data/test/models/legacy_thing.rb +3 -3
  476. data/test/models/lesson.rb +11 -11
  477. data/test/models/line_item.rb +3 -3
  478. data/test/models/liquid.rb +4 -4
  479. data/test/models/man.rb +11 -11
  480. data/test/models/matey.rb +4 -4
  481. data/test/models/member.rb +42 -41
  482. data/test/models/member_detail.rb +8 -7
  483. data/test/models/member_type.rb +3 -3
  484. data/test/models/membership.rb +35 -35
  485. data/test/models/mentor.rb +3 -0
  486. data/test/models/minimalistic.rb +2 -2
  487. data/test/models/minivan.rb +9 -9
  488. data/test/models/mixed_case_monkey.rb +3 -3
  489. data/test/models/mocktail_designer.rb +2 -0
  490. data/test/models/molecule.rb +6 -6
  491. data/test/models/movie.rb +5 -5
  492. data/test/models/node.rb +5 -0
  493. data/test/models/non_primary_key.rb +2 -0
  494. data/test/models/notification.rb +3 -0
  495. data/test/models/order.rb +4 -4
  496. data/test/models/organization.rb +14 -14
  497. data/test/models/other_dog.rb +5 -0
  498. data/test/models/owner.rb +37 -34
  499. data/test/models/parrot.rb +28 -29
  500. data/test/models/person.rb +142 -143
  501. data/test/models/personal_legacy_thing.rb +4 -4
  502. data/test/models/pet.rb +18 -15
  503. data/test/models/pet_treasure.rb +6 -0
  504. data/test/models/pirate.rb +92 -92
  505. data/test/models/possession.rb +3 -3
  506. data/test/models/post.rb +273 -264
  507. data/test/models/price_estimate.rb +4 -4
  508. data/test/models/professor.rb +5 -5
  509. data/test/models/project.rb +40 -31
  510. data/test/models/publisher.rb +2 -2
  511. data/test/models/publisher/article.rb +4 -4
  512. data/test/models/publisher/magazine.rb +3 -3
  513. data/test/models/randomly_named_c1.rb +1 -1
  514. data/test/models/rating.rb +4 -4
  515. data/test/models/reader.rb +23 -23
  516. data/test/models/recipe.rb +3 -0
  517. data/test/models/record.rb +2 -2
  518. data/test/models/reference.rb +22 -22
  519. data/test/models/reply.rb +61 -61
  520. data/test/models/ship.rb +39 -33
  521. data/test/models/ship_part.rb +8 -8
  522. data/test/models/shop.rb +17 -17
  523. data/test/models/shop_account.rb +6 -6
  524. data/test/models/speedometer.rb +6 -6
  525. data/test/models/sponsor.rb +7 -7
  526. data/test/models/string_key_object.rb +3 -3
  527. data/test/models/student.rb +4 -4
  528. data/test/models/subject.rb +16 -16
  529. data/test/models/subscriber.rb +8 -8
  530. data/test/models/subscription.rb +4 -4
  531. data/test/models/tag.rb +13 -7
  532. data/test/models/tagging.rb +13 -13
  533. data/test/models/task.rb +5 -5
  534. data/test/models/topic.rb +118 -124
  535. data/test/models/toy.rb +6 -6
  536. data/test/models/traffic_light.rb +4 -4
  537. data/test/models/treasure.rb +14 -14
  538. data/test/models/treaty.rb +7 -7
  539. data/test/models/tree.rb +3 -0
  540. data/test/models/tuning_peg.rb +4 -0
  541. data/test/models/tyre.rb +11 -11
  542. data/test/models/user.rb +14 -0
  543. data/test/models/uuid_child.rb +3 -3
  544. data/test/models/uuid_item.rb +6 -0
  545. data/test/models/uuid_parent.rb +3 -3
  546. data/test/models/vegetables.rb +24 -24
  547. data/test/models/vehicle.rb +6 -6
  548. data/test/models/vertex.rb +9 -9
  549. data/test/models/warehouse_thing.rb +5 -5
  550. data/test/models/wheel.rb +3 -3
  551. data/test/models/without_table.rb +3 -3
  552. data/test/models/zine.rb +3 -3
  553. data/test/schema/mysql2_specific_schema.rb +68 -58
  554. data/test/schema/oracle_specific_schema.rb +40 -43
  555. data/test/schema/postgresql_specific_schema.rb +114 -202
  556. data/test/schema/schema.rb +1057 -952
  557. data/test/schema/schema.rb.original +1057 -0
  558. data/test/schema/sqlite_specific_schema.rb +18 -22
  559. data/test/support/config.rb +43 -43
  560. data/test/support/connection.rb +23 -22
  561. data/test/support/connection_helper.rb +14 -14
  562. data/test/support/ddl_helper.rb +8 -8
  563. data/test/support/schema_dumping_helper.rb +20 -20
  564. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  565. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  566. metadata +129 -28
  567. data/lib/mswin32/rb19x/ibm_db.so +0 -0
  568. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  569. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  570. data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
  571. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
  572. data/test/cases/attribute_methods/serialization_test.rb +0 -29
  573. data/test/cases/migration/change_schema_test - Copy.rb +0 -448
  574. data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
  575. data/test/cases/migration/table_and_index_test.rb +0 -24
  576. data/test/cases/relation/where_test2.rb +0 -36
  577. data/test/cases/type/decimal_test.rb +0 -56
  578. data/test/cases/type/unsigned_integer_test.rb +0 -18
  579. data/test/cases/xml_serialization_test.rb +0 -457
  580. data/test/connections/native_ibm_db/connection.rb +0 -44
  581. data/test/fixtures/naked/csv/accounts.csv +0 -1
  582. data/test/schema/i5/ibm_db_specific_schema.rb +0 -137
  583. data/test/schema/ids/ibm_db_specific_schema.rb +0 -140
  584. data/test/schema/luw/ibm_db_specific_schema.rb +0 -137
  585. data/test/schema/mysql_specific_schema.rb +0 -70
  586. data/test/schema/zOS/ibm_db_specific_schema.rb +0 -208
@@ -0,0 +1,41 @@
1
+ require 'cases/helper'
2
+ require 'models/content'
3
+
4
+ class BidirectionalDestroyDependenciesTest < ActiveRecord::TestCase
5
+ fixtures :content, :content_positions
6
+
7
+ def setup
8
+ Content.destroyed_ids.clear
9
+ ContentPosition.destroyed_ids.clear
10
+ end
11
+
12
+ def test_bidirectional_dependence_when_destroying_item_with_belongs_to_association
13
+ content_position = ContentPosition.find(1)
14
+ content = content_position.content
15
+ assert_not_nil content
16
+
17
+ content_position.destroy
18
+
19
+ assert_equal [content_position.id], ContentPosition.destroyed_ids
20
+ assert_equal [content.id], Content.destroyed_ids
21
+ end
22
+
23
+ def test_bidirectional_dependence_when_destroying_item_with_has_one_association
24
+ content = Content.find(1)
25
+ content_position = content.content_position
26
+ assert_not_nil content_position
27
+
28
+ content.destroy
29
+
30
+ assert_equal [content.id], Content.destroyed_ids
31
+ assert_equal [content_position.id], ContentPosition.destroyed_ids
32
+ end
33
+
34
+ def test_bidirectional_dependence_when_destroying_item_with_has_one_association_fails_first_time
35
+ content = ContentWhichRequiresTwoDestroyCalls.find(1)
36
+
37
+ 2.times { content.destroy }
38
+
39
+ assert_equal content.destroyed?, true
40
+ end
41
+ end
@@ -1,192 +1,190 @@
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
+ 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
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
+ def test_adding_macro_callbacks
20
+ @david.posts_with_callbacks << @thinking
21
+ assert_equal ["before_adding#{@thinking.id}", "after_adding#{@thinking.id}"], @david.post_log
22
+ @david.posts_with_callbacks << @thinking
23
+ assert_equal ["before_adding#{@thinking.id}", "after_adding#{@thinking.id}", "before_adding#{@thinking.id}",
24
+ "after_adding#{@thinking.id}"], @david.post_log
25
+ end
26
+
27
+ def test_adding_with_proc_callbacks
28
+ @david.posts_with_proc_callbacks << @thinking
29
+ assert_equal ["before_adding#{@thinking.id}", "after_adding#{@thinking.id}"], @david.post_log
30
+ @david.posts_with_proc_callbacks << @thinking
31
+ assert_equal ["before_adding#{@thinking.id}", "after_adding#{@thinking.id}", "before_adding#{@thinking.id}",
32
+ "after_adding#{@thinking.id}"], @david.post_log
33
+ end
34
+
35
+ def test_removing_with_macro_callbacks
36
+ first_post, second_post = @david.posts_with_callbacks[0, 2]
37
+ @david.posts_with_callbacks.delete(first_post)
38
+ assert_equal ["before_removing#{first_post.id}", "after_removing#{first_post.id}"], @david.post_log
39
+ @david.posts_with_callbacks.delete(second_post)
40
+ assert_equal ["before_removing#{first_post.id}", "after_removing#{first_post.id}", "before_removing#{second_post.id}",
41
+ "after_removing#{second_post.id}"], @david.post_log
42
+ end
43
+
44
+ def test_removing_with_proc_callbacks
45
+ first_post, second_post = @david.posts_with_callbacks[0, 2]
46
+ @david.posts_with_proc_callbacks.delete(first_post)
47
+ assert_equal ["before_removing#{first_post.id}", "after_removing#{first_post.id}"], @david.post_log
48
+ @david.posts_with_proc_callbacks.delete(second_post)
49
+ assert_equal ["before_removing#{first_post.id}", "after_removing#{first_post.id}", "before_removing#{second_post.id}",
50
+ "after_removing#{second_post.id}"], @david.post_log
51
+ end
52
+
53
+ def test_multiple_callbacks
54
+ @david.posts_with_multiple_callbacks << @thinking
55
+ assert_equal ["before_adding#{@thinking.id}", "before_adding_proc#{@thinking.id}", "after_adding#{@thinking.id}",
56
+ "after_adding_proc#{@thinking.id}"], @david.post_log
57
+ @david.posts_with_multiple_callbacks << @thinking
58
+ assert_equal ["before_adding#{@thinking.id}", "before_adding_proc#{@thinking.id}", "after_adding#{@thinking.id}",
59
+ "after_adding_proc#{@thinking.id}", "before_adding#{@thinking.id}", "before_adding_proc#{@thinking.id}",
60
+ "after_adding#{@thinking.id}", "after_adding_proc#{@thinking.id}"], @david.post_log
61
+ end
62
+
63
+ def test_has_many_callbacks_with_create
64
+ morten = Author.create :name => "Morten"
65
+ post = morten.posts_with_proc_callbacks.create! :title => "Hello", :body => "How are you doing?"
66
+ assert_equal ["before_adding<new>", "after_adding#{post.id}"], morten.post_log
67
+ end
68
+
69
+ def test_has_many_callbacks_with_create!
70
+ morten = Author.create! :name => "Morten"
71
+ post = morten.posts_with_proc_callbacks.create :title => "Hello", :body => "How are you doing?"
72
+ assert_equal ["before_adding<new>", "after_adding#{post.id}"], morten.post_log
73
+ end
74
+
75
+ def test_has_many_callbacks_for_save_on_parent
76
+ jack = Author.new :name => "Jack"
77
+ jack.posts_with_callbacks.build :title => "Call me back!", :body => "Before you wake up and after you sleep"
78
+
79
+ callback_log = ["before_adding<new>", "after_adding#{jack.posts_with_callbacks.first.id}"]
80
+ assert_equal callback_log, jack.post_log
81
+ assert jack.save
82
+ assert_equal 1, jack.posts_with_callbacks.count
83
+ assert_equal callback_log, jack.post_log
84
+ end
85
+
86
+ def test_has_many_callbacks_for_destroy_on_parent
87
+ firm = Firm.create! :name => "Firm"
88
+ client = firm.clients.create! :name => "Client"
89
+ firm.destroy
90
+
91
+ assert_equal ["before_remove#{client.id}", "after_remove#{client.id}"], firm.log
92
+ end
93
+
94
+ def test_has_and_belongs_to_many_add_callback
95
+ david = developers(:david)
96
+ ar = projects(:active_record)
97
+ assert ar.developers_log.empty?
98
+ ar.developers_with_callbacks << david
99
+ assert_equal ["before_adding#{david.id}", "after_adding#{david.id}"], ar.developers_log
100
+ ar.developers_with_callbacks << david
101
+ assert_equal ["before_adding#{david.id}", "after_adding#{david.id}", "before_adding#{david.id}",
102
+ "after_adding#{david.id}"], ar.developers_log
103
+ end
104
+
105
+ def test_has_and_belongs_to_many_before_add_called_before_save
106
+ dev = nil
107
+ new_dev = nil
108
+ klass = Class.new(Project) do
109
+ def self.name; Project.name; end
110
+ has_and_belongs_to_many :developers_with_callbacks,
111
+ :class_name => "Developer",
112
+ :before_add => lambda { |o,r|
113
+ dev = r
114
+ new_dev = r.new_record?
115
+ }
116
+ end
117
+ rec = klass.create!
118
+ alice = Developer.new(:name => 'alice')
119
+ rec.developers_with_callbacks << alice
120
+ assert_equal alice, dev
121
+ assert_not_nil new_dev
122
+ assert new_dev, "record should not have been saved"
123
+ assert_not alice.new_record?
124
+ end
125
+
126
+ def test_has_and_belongs_to_many_after_add_called_after_save
127
+ ar = projects(:active_record)
128
+ assert ar.developers_log.empty?
129
+ alice = Developer.new(:name => 'alice')
130
+ ar.developers_with_callbacks << alice
131
+ assert_equal"after_adding#{alice.id}", ar.developers_log.last
132
+
133
+ bob = ar.developers_with_callbacks.create(:name => 'bob')
134
+ assert_equal "after_adding#{bob.id}", ar.developers_log.last
135
+
136
+ ar.developers_with_callbacks.build(:name => 'charlie')
137
+ assert_equal "after_adding<new>", ar.developers_log.last
138
+ end
139
+
140
+
141
+ def test_has_and_belongs_to_many_remove_callback
142
+ david = developers(:david)
143
+ jamis = developers(:jamis)
144
+ activerecord = projects(:active_record)
145
+ assert activerecord.developers_log.empty?
146
+ activerecord.developers_with_callbacks.delete(david)
147
+ assert_equal ["before_removing#{david.id}", "after_removing#{david.id}"], activerecord.developers_log
148
+
149
+ activerecord.developers_with_callbacks.delete(jamis)
150
+ assert_equal ["before_removing#{david.id}", "after_removing#{david.id}", "before_removing#{jamis.id}",
151
+ "after_removing#{jamis.id}"], activerecord.developers_log
152
+ end
153
+
154
+ def test_has_and_belongs_to_many_does_not_fire_callbacks_on_clear
155
+ activerecord = projects(:active_record)
156
+ assert activerecord.developers_log.empty?
157
+ if activerecord.developers_with_callbacks.size == 0
158
+ activerecord.developers << developers(:david)
159
+ activerecord.developers << developers(:jamis)
160
+ activerecord.reload
161
+ assert activerecord.developers_with_callbacks.size == 2
162
+ end
163
+ activerecord.developers_with_callbacks.flat_map {|d| ["before_removing#{d.id}","after_removing#{d.id}"]}.sort
164
+ assert activerecord.developers_with_callbacks.clear
165
+ assert_predicate activerecord.developers_log, :empty?
166
+ end
167
+
168
+ def test_has_many_and_belongs_to_many_callbacks_for_save_on_parent
169
+ project = Project.new :name => "Callbacks"
170
+ project.developers_with_callbacks.build :name => "Jack", :salary => 95000
171
+
172
+ callback_log = ["before_adding<new>", "after_adding<new>"]
173
+ assert_equal callback_log, project.developers_log
174
+ assert project.save
175
+ assert_equal 1, project.developers_with_callbacks.size
176
+ assert_equal callback_log, project.developers_log
177
+ end
178
+
179
+ def test_dont_add_if_before_callback_raises_exception
180
+ assert !@david.unchangeable_posts.include?(@authorless)
181
+ begin
182
+ @david.unchangeable_posts << @authorless
183
+ rescue Exception
184
+ end
185
+ assert @david.post_log.empty?
186
+ assert !@david.unchangeable_posts.include?(@authorless)
187
+ @david.reload
188
+ assert !@david.unchangeable_posts.include?(@authorless)
189
+ end
190
+ end
@@ -1,188 +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, :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
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.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