ibm_db 3.0.5-x86-mingw32 → 5.0.5-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES +4 -0
  3. data/LICENSE +1 -1
  4. data/ParameterizedQueries README +6 -6
  5. data/README +38 -55
  6. data/ext/Makefile +269 -0
  7. data/ext/extconf.rb +34 -3
  8. data/ext/gil_release_version +3 -0
  9. data/ext/ibm_db-i386-mingw32.def +2 -0
  10. data/ext/ibm_db.c +100 -108
  11. data/ext/ibm_db.o +0 -0
  12. data/ext/ibm_db.so +0 -0
  13. data/ext/mkmf.log +110 -0
  14. data/ext/ruby_ibm_db_cli.o +0 -0
  15. data/ext/unicode_support_version +3 -0
  16. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +923 -527
  17. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +4 -1
  18. data/lib/mswin32/ibm_db.rb +7 -39
  19. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  20. data/test/active_record/connection_adapters/fake_adapter.rb +8 -5
  21. data/test/cases/adapter_test.rb +133 -58
  22. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
  23. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
  24. data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
  25. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
  26. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
  27. data/test/cases/adapters/mysql2/connection_test.rb +210 -0
  28. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
  29. data/test/cases/adapters/mysql2/enum_test.rb +26 -0
  30. data/test/cases/adapters/mysql2/explain_test.rb +21 -0
  31. data/test/cases/adapters/mysql2/json_test.rb +195 -0
  32. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
  33. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  34. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
  35. data/test/cases/adapters/mysql2/schema_test.rb +126 -0
  36. data/test/cases/adapters/mysql2/sp_test.rb +36 -0
  37. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
  38. data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
  39. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
  40. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
  41. data/test/cases/adapters/postgresql/array_test.rb +339 -0
  42. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
  43. data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
  44. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
  45. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
  46. data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
  47. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  48. data/test/cases/adapters/postgresql/collation_test.rb +53 -0
  49. data/test/cases/adapters/postgresql/composite_test.rb +132 -0
  50. data/test/cases/adapters/postgresql/connection_test.rb +257 -0
  51. data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
  52. data/test/cases/adapters/postgresql/domain_test.rb +47 -0
  53. data/test/cases/adapters/postgresql/enum_test.rb +91 -0
  54. data/test/cases/adapters/postgresql/explain_test.rb +20 -0
  55. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
  56. data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
  57. data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
  58. data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
  59. data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
  60. data/test/cases/adapters/postgresql/integer_test.rb +25 -0
  61. data/test/cases/adapters/postgresql/json_test.rb +237 -0
  62. data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
  63. data/test/cases/adapters/postgresql/money_test.rb +96 -0
  64. data/test/cases/adapters/postgresql/network_test.rb +94 -0
  65. data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
  66. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
  67. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  68. data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
  69. data/test/cases/adapters/postgresql/range_test.rb +343 -0
  70. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
  71. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
  72. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
  73. data/test/cases/adapters/postgresql/schema_test.rb +597 -0
  74. data/test/cases/adapters/postgresql/serial_test.rb +154 -0
  75. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
  76. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
  77. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
  78. data/test/cases/adapters/postgresql/utils_test.rb +62 -0
  79. data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
  80. data/test/cases/adapters/postgresql/xml_test.rb +54 -0
  81. data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
  82. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
  83. data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
  84. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
  85. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
  86. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  87. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
  88. data/test/cases/aggregations_test.rb +11 -1
  89. data/test/cases/ar_schema_test.rb +35 -50
  90. data/test/cases/associations/association_scope_test.rb +1 -6
  91. data/test/cases/associations/belongs_to_associations_test.rb +122 -10
  92. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
  93. data/test/cases/associations/callbacks_test.rb +5 -7
  94. data/test/cases/associations/cascaded_eager_loading_test.rb +1 -1
  95. data/test/cases/associations/eager_load_nested_include_test.rb +1 -3
  96. data/test/cases/associations/eager_test.rb +158 -73
  97. data/test/cases/associations/extension_test.rb +7 -2
  98. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +64 -32
  99. data/test/cases/associations/has_many_associations_test.rb +362 -43
  100. data/test/cases/associations/has_many_through_associations_test.rb +108 -41
  101. data/test/cases/associations/has_one_associations_test.rb +105 -8
  102. data/test/cases/associations/has_one_through_associations_test.rb +6 -3
  103. data/test/cases/associations/inner_join_association_test.rb +3 -3
  104. data/test/cases/associations/inverse_associations_test.rb +38 -11
  105. data/test/cases/associations/join_model_test.rb +59 -36
  106. data/test/cases/associations/left_outer_join_association_test.rb +88 -0
  107. data/test/cases/associations/nested_through_associations_test.rb +2 -2
  108. data/test/cases/associations/required_test.rb +25 -5
  109. data/test/cases/associations_test.rb +39 -34
  110. data/test/cases/attribute_decorators_test.rb +9 -8
  111. data/test/cases/attribute_methods/read_test.rb +5 -5
  112. data/test/cases/attribute_methods_test.rb +97 -40
  113. data/test/cases/attribute_set_test.rb +64 -4
  114. data/test/cases/attribute_test.rb +84 -18
  115. data/test/cases/attributes_test.rb +151 -34
  116. data/test/cases/autosave_association_test.rb +149 -36
  117. data/test/cases/base_test.rb +290 -241
  118. data/test/cases/batches_test.rb +299 -22
  119. data/test/cases/binary_test.rb +2 -10
  120. data/test/cases/bind_parameter_test.rb +76 -66
  121. data/test/cases/cache_key_test.rb +26 -0
  122. data/test/cases/calculations_test.rb +167 -15
  123. data/test/cases/callbacks_test.rb +161 -68
  124. data/test/cases/coders/json_test.rb +15 -0
  125. data/test/cases/collection_cache_key_test.rb +115 -0
  126. data/test/cases/column_definition_test.rb +26 -57
  127. data/test/cases/comment_test.rb +145 -0
  128. data/test/cases/connection_adapters/adapter_leasing_test.rb +5 -3
  129. data/test/cases/connection_adapters/connection_handler_test.rb +128 -21
  130. data/test/cases/connection_adapters/connection_specification_test.rb +1 -1
  131. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +0 -38
  132. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -1
  133. data/test/cases/connection_adapters/schema_cache_test.rb +8 -3
  134. data/test/cases/connection_adapters/type_lookup_test.rb +15 -7
  135. data/test/cases/connection_management_test.rb +46 -56
  136. data/test/cases/connection_pool_test.rb +195 -20
  137. data/test/cases/connection_specification/resolver_test.rb +15 -0
  138. data/test/cases/counter_cache_test.rb +10 -5
  139. data/test/cases/custom_locking_test.rb +1 -1
  140. data/test/cases/database_statements_test.rb +18 -3
  141. data/test/cases/{invalid_date_test.rb → date_test.rb} +13 -1
  142. data/test/cases/date_time_precision_test.rb +107 -0
  143. data/test/cases/defaults_test.rb +85 -89
  144. data/test/cases/dirty_test.rb +30 -52
  145. data/test/cases/disconnected_test.rb +4 -2
  146. data/test/cases/enum_test.rb +178 -24
  147. data/test/cases/errors_test.rb +16 -0
  148. data/test/cases/explain_test.rb +32 -21
  149. data/test/cases/finder_test.rb +273 -148
  150. data/test/cases/fixture_set/file_test.rb +18 -0
  151. data/test/cases/fixtures_test.rb +112 -32
  152. data/test/cases/forbidden_attributes_protection_test.rb +69 -3
  153. data/test/cases/helper.rb +10 -16
  154. data/test/cases/hot_compatibility_test.rb +89 -1
  155. data/test/cases/inheritance_test.rb +284 -53
  156. data/test/cases/integration_test.rb +23 -7
  157. data/test/cases/invalid_connection_test.rb +4 -2
  158. data/test/cases/invertible_migration_test.rb +124 -32
  159. data/test/cases/json_serialization_test.rb +11 -2
  160. data/test/cases/locking_test.rb +22 -6
  161. data/test/cases/log_subscriber_test.rb +106 -17
  162. data/test/cases/migration/change_schema_test.rb +60 -114
  163. data/test/cases/migration/change_table_test.rb +34 -2
  164. data/test/cases/migration/column_attributes_test.rb +7 -23
  165. data/test/cases/migration/column_positioning_test.rb +8 -8
  166. data/test/cases/migration/columns_test.rb +17 -11
  167. data/test/cases/migration/command_recorder_test.rb +47 -2
  168. data/test/cases/migration/compatibility_test.rb +118 -0
  169. data/test/cases/migration/create_join_table_test.rb +21 -12
  170. data/test/cases/migration/foreign_key_test.rb +52 -18
  171. data/test/cases/migration/index_test.rb +14 -12
  172. data/test/cases/migration/logger_test.rb +1 -1
  173. data/test/cases/migration/pending_migrations_test.rb +0 -1
  174. data/test/cases/migration/references_foreign_key_test.rb +59 -7
  175. data/test/cases/migration/references_index_test.rb +4 -4
  176. data/test/cases/migration/references_statements_test.rb +26 -6
  177. data/test/cases/migration/rename_table_test.rb +25 -25
  178. data/test/cases/migration_test.rb +279 -81
  179. data/test/cases/migrator_test.rb +91 -8
  180. data/test/cases/mixin_test.rb +0 -2
  181. data/test/cases/modules_test.rb +3 -4
  182. data/test/cases/multiparameter_attributes_test.rb +24 -2
  183. data/test/cases/multiple_db_test.rb +11 -4
  184. data/test/cases/nested_attributes_test.rb +61 -33
  185. data/test/cases/persistence_test.rb +102 -10
  186. data/test/cases/pooled_connections_test.rb +3 -3
  187. data/test/cases/primary_keys_test.rb +170 -31
  188. data/test/cases/query_cache_test.rb +216 -96
  189. data/test/cases/quoting_test.rb +65 -19
  190. data/test/cases/readonly_test.rb +2 -1
  191. data/test/cases/reflection_test.rb +68 -22
  192. data/test/cases/relation/delegation_test.rb +3 -8
  193. data/test/cases/relation/merging_test.rb +10 -14
  194. data/test/cases/relation/mutation_test.rb +42 -24
  195. data/test/cases/relation/or_test.rb +92 -0
  196. data/test/cases/relation/predicate_builder_test.rb +4 -2
  197. data/test/cases/relation/record_fetch_warning_test.rb +40 -0
  198. data/test/cases/relation/where_chain_test.rb +23 -99
  199. data/test/cases/relation/where_clause_test.rb +182 -0
  200. data/test/cases/relation/where_test.rb +45 -23
  201. data/test/cases/relation_test.rb +67 -58
  202. data/test/cases/relations_test.rb +249 -38
  203. data/test/cases/result_test.rb +10 -0
  204. data/test/cases/sanitize_test.rb +108 -15
  205. data/test/cases/schema_dumper_test.rb +119 -125
  206. data/test/cases/schema_loading_test.rb +52 -0
  207. data/test/cases/scoping/default_scoping_test.rb +113 -39
  208. data/test/cases/scoping/named_scoping_test.rb +46 -9
  209. data/test/cases/scoping/relation_scoping_test.rb +47 -4
  210. data/test/cases/secure_token_test.rb +32 -0
  211. data/test/cases/serialization_test.rb +1 -1
  212. data/test/cases/serialized_attribute_test.rb +93 -6
  213. data/test/cases/statement_cache_test.rb +38 -0
  214. data/test/cases/store_test.rb +2 -1
  215. data/test/cases/suppressor_test.rb +63 -0
  216. data/test/cases/tasks/database_tasks_test.rb +73 -9
  217. data/test/cases/tasks/mysql_rake_test.rb +139 -118
  218. data/test/cases/tasks/postgresql_rake_test.rb +60 -6
  219. data/test/cases/tasks/sqlite_rake_test.rb +30 -3
  220. data/test/cases/test_case.rb +28 -20
  221. data/test/cases/test_fixtures_test.rb +36 -0
  222. data/test/cases/time_precision_test.rb +103 -0
  223. data/test/cases/timestamp_test.rb +44 -10
  224. data/test/cases/touch_later_test.rb +121 -0
  225. data/test/cases/transaction_callbacks_test.rb +128 -62
  226. data/test/cases/transaction_isolation_test.rb +2 -2
  227. data/test/cases/transactions_test.rb +61 -43
  228. data/test/cases/type/adapter_specific_registry_test.rb +133 -0
  229. data/test/cases/type/date_time_test.rb +14 -0
  230. data/test/cases/type/integer_test.rb +2 -96
  231. data/test/cases/type/string_test.rb +0 -14
  232. data/test/cases/type_test.rb +39 -0
  233. data/test/cases/types_test.rb +1 -118
  234. data/test/cases/unconnected_test.rb +1 -1
  235. data/test/cases/validations/absence_validation_test.rb +73 -0
  236. data/test/cases/validations/association_validation_test.rb +13 -2
  237. data/test/cases/validations/i18n_validation_test.rb +6 -10
  238. data/test/cases/validations/length_validation_test.rb +62 -30
  239. data/test/cases/validations/presence_validation_test.rb +36 -1
  240. data/test/cases/validations/uniqueness_validation_test.rb +128 -37
  241. data/test/cases/validations_repair_helper.rb +2 -6
  242. data/test/cases/validations_test.rb +36 -7
  243. data/test/cases/view_test.rb +102 -5
  244. data/test/cases/yaml_serialization_test.rb +21 -26
  245. data/test/config.example.yml +97 -0
  246. data/test/fixtures/bad_posts.yml +9 -0
  247. data/test/fixtures/books.yml +20 -0
  248. data/test/fixtures/content.yml +3 -0
  249. data/test/fixtures/content_positions.yml +3 -0
  250. data/test/fixtures/dead_parrots.yml +5 -0
  251. data/test/fixtures/live_parrots.yml +4 -0
  252. data/test/fixtures/naked/yml/parrots.yml +2 -0
  253. data/test/fixtures/naked/yml/trees.yml +3 -0
  254. data/test/fixtures/nodes.yml +29 -0
  255. data/test/fixtures/other_comments.yml +6 -0
  256. data/test/fixtures/other_dogs.yml +2 -0
  257. data/test/fixtures/other_posts.yml +7 -0
  258. data/test/fixtures/price_estimates.yml +10 -1
  259. data/test/fixtures/trees.yml +3 -0
  260. data/test/migrations/10_urban/9_add_expressions.rb +1 -1
  261. data/test/migrations/decimal/1_give_me_big_numbers.rb +1 -1
  262. data/test/migrations/magic/1_currencies_have_symbols.rb +1 -1
  263. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -2
  264. data/test/migrations/missing/1_people_have_last_names.rb +2 -2
  265. data/test/migrations/missing/3_we_need_reminders.rb +2 -2
  266. data/test/migrations/missing/4_innocent_jointable.rb +2 -2
  267. data/test/migrations/rename/1_we_need_things.rb +2 -2
  268. data/test/migrations/rename/2_rename_things.rb +2 -2
  269. data/test/migrations/to_copy/1_people_have_hobbies.rb +1 -1
  270. data/test/migrations/to_copy/2_people_have_descriptions.rb +1 -1
  271. data/test/migrations/to_copy2/1_create_articles.rb +1 -1
  272. data/test/migrations/to_copy2/2_create_comments.rb +1 -1
  273. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +1 -1
  274. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +1 -1
  275. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +1 -1
  276. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +1 -1
  277. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +1 -1
  278. data/test/migrations/valid/1_valid_people_have_last_names.rb +1 -1
  279. data/test/migrations/valid/2_we_need_reminders.rb +2 -2
  280. data/test/migrations/valid/3_innocent_jointable.rb +2 -2
  281. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +1 -1
  282. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -2
  283. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +2 -2
  284. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +1 -1
  285. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +1 -1
  286. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +1 -1
  287. data/test/migrations/version_check/20131219224947_migration_version_check.rb +1 -1
  288. data/test/models/admin/randomly_named_c1.rb +6 -2
  289. data/test/models/aircraft.rb +1 -0
  290. data/test/models/author.rb +4 -7
  291. data/test/models/bird.rb +1 -1
  292. data/test/models/book.rb +5 -0
  293. data/test/models/bulb.rb +2 -1
  294. data/test/models/car.rb +3 -0
  295. data/test/models/cat.rb +10 -0
  296. data/test/models/chef.rb +1 -0
  297. data/test/models/club.rb +2 -0
  298. data/test/models/comment.rb +17 -5
  299. data/test/models/company.rb +4 -2
  300. data/test/models/company_in_module.rb +1 -1
  301. data/test/models/contact.rb +1 -1
  302. data/test/models/content.rb +40 -0
  303. data/test/models/customer.rb +8 -2
  304. data/test/models/developer.rb +19 -0
  305. data/test/models/face.rb +1 -1
  306. data/test/models/guitar.rb +4 -0
  307. data/test/models/hotel.rb +2 -0
  308. data/test/models/member.rb +1 -0
  309. data/test/models/member_detail.rb +4 -3
  310. data/test/models/mentor.rb +3 -0
  311. data/test/models/mocktail_designer.rb +2 -0
  312. data/test/models/node.rb +5 -0
  313. data/test/models/non_primary_key.rb +2 -0
  314. data/test/models/notification.rb +3 -0
  315. data/test/models/other_dog.rb +5 -0
  316. data/test/models/owner.rb +4 -1
  317. data/test/models/parrot.rb +6 -7
  318. data/test/models/person.rb +0 -1
  319. data/test/models/pet.rb +3 -0
  320. data/test/models/pet_treasure.rb +6 -0
  321. data/test/models/pirate.rb +3 -3
  322. data/test/models/post.rb +18 -9
  323. data/test/models/project.rb +9 -0
  324. data/test/models/randomly_named_c1.rb +1 -1
  325. data/test/models/recipe.rb +3 -0
  326. data/test/models/ship.rb +8 -2
  327. data/test/models/tag.rb +6 -0
  328. data/test/models/topic.rb +2 -8
  329. data/test/models/tree.rb +3 -0
  330. data/test/models/tuning_peg.rb +4 -0
  331. data/test/models/user.rb +14 -0
  332. data/test/models/uuid_item.rb +6 -0
  333. data/test/schema/mysql2_specific_schema.rb +33 -23
  334. data/test/schema/oracle_specific_schema.rb +1 -4
  335. data/test/schema/postgresql_specific_schema.rb +36 -124
  336. data/test/schema/schema.rb +170 -65
  337. data/test/schema/schema.rb.original +1057 -0
  338. data/test/schema/sqlite_specific_schema.rb +1 -5
  339. data/test/support/connection.rb +1 -0
  340. data/test/support/schema_dumping_helper.rb +1 -1
  341. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  342. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  343. metadata +146 -30
  344. data/lib/mswin32/rb19x/ibm_db.so +0 -0
  345. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  346. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  347. data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
  348. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
  349. data/test/cases/attribute_methods/serialization_test.rb +0 -29
  350. data/test/cases/migration/change_schema_test - Copy.rb +0 -448
  351. data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
  352. data/test/cases/migration/table_and_index_test.rb +0 -24
  353. data/test/cases/relation/where_test2.rb +0 -36
  354. data/test/cases/type/decimal_test.rb +0 -56
  355. data/test/cases/type/unsigned_integer_test.rb +0 -18
  356. data/test/cases/xml_serialization_test.rb +0 -457
  357. data/test/fixtures/naked/csv/accounts.csv +0 -1
  358. data/test/schema/mysql_specific_schema.rb +0 -70
@@ -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
@@ -7,7 +7,7 @@ require 'models/computer'
7
7
  require 'models/company'
8
8
 
9
9
  class AssociationCallbacksTest < ActiveRecord::TestCase
10
- fixtures :posts, :authors, :projects, :developers, :author_addresses
10
+ fixtures :posts, :authors, :projects, :developers
11
11
 
12
12
  def setup
13
13
  @david = authors(:david)
@@ -15,7 +15,6 @@ class AssociationCallbacksTest < ActiveRecord::TestCase
15
15
  @authorless = posts(:authorless)
16
16
  assert @david.post_log.empty?
17
17
  end
18
-
19
18
 
20
19
  def test_adding_macro_callbacks
21
20
  @david.posts_with_callbacks << @thinking
@@ -25,7 +24,6 @@ class AssociationCallbacksTest < ActiveRecord::TestCase
25
24
  "after_adding#{@thinking.id}"], @david.post_log
26
25
  end
27
26
 
28
-
29
27
  def test_adding_with_proc_callbacks
30
28
  @david.posts_with_proc_callbacks << @thinking
31
29
  assert_equal ["before_adding#{@thinking.id}", "after_adding#{@thinking.id}"], @david.post_log
@@ -179,14 +177,14 @@ class AssociationCallbacksTest < ActiveRecord::TestCase
179
177
  end
180
178
 
181
179
  def test_dont_add_if_before_callback_raises_exception
182
- assert !@david.unchangable_posts.include?(@authorless)
180
+ assert !@david.unchangeable_posts.include?(@authorless)
183
181
  begin
184
- @david.unchangable_posts << @authorless
182
+ @david.unchangeable_posts << @authorless
185
183
  rescue Exception
186
184
  end
187
185
  assert @david.post_log.empty?
188
- assert !@david.unchangable_posts.include?(@authorless)
186
+ assert !@david.unchangeable_posts.include?(@authorless)
189
187
  @david.reload
190
- assert !@david.unchangable_posts.include?(@authorless)
188
+ assert !@david.unchangeable_posts.include?(@authorless)
191
189
  end
192
190
  end
@@ -13,7 +13,7 @@ require 'models/edge'
13
13
 
14
14
  class CascadedEagerLoadingTest < ActiveRecord::TestCase
15
15
  fixtures :authors, :mixins, :companies, :posts, :topics, :accounts, :comments,
16
- :categorizations, :people, :categories, :edges, :vertices, :author_addresses
16
+ :categorizations, :people, :categories, :edges, :vertices
17
17
 
18
18
  def test_eager_association_loading_with_cascaded_two_levels
19
19
  authors = Author.all.merge!(:includes=>{:posts=>:comments}, :order=>"authors.id").to_a
@@ -70,9 +70,7 @@ class EagerLoadPolyAssocsTest < ActiveRecord::TestCase
70
70
 
71
71
  teardown do
72
72
  [Circle, Square, Triangle, PaintColor, PaintTexture,
73
- ShapeExpression, NonPolyOne, NonPolyTwo].each do |c|
74
- c.delete_all
75
- end
73
+ ShapeExpression, NonPolyOne, NonPolyTwo].each(&:delete_all)
76
74
  end
77
75
 
78
76
  def generate_test_object_graphs
@@ -24,6 +24,8 @@ require 'models/membership'
24
24
  require 'models/club'
25
25
  require 'models/categorization'
26
26
  require 'models/sponsor'
27
+ require 'models/mentor'
28
+ require 'models/contract'
27
29
 
28
30
  class EagerAssociationTest < ActiveRecord::TestCase
29
31
  fixtures :posts, :comments, :authors, :essays, :author_addresses, :categories, :categories_posts,
@@ -66,6 +68,10 @@ class EagerAssociationTest < ActiveRecord::TestCase
66
68
  "expected to find only david's posts"
67
69
  end
68
70
 
71
+ def test_loading_with_scope_including_joins
72
+ assert_equal clubs(:boring_club), Member.preload(:general_club).find(1).general_club
73
+ end
74
+
69
75
  def test_with_ordering
70
76
  list = Post.all.merge!(:includes => :comments, :order => "posts.id DESC").to_a
71
77
  [:other_by_mary, :other_by_bob, :misc_by_mary, :misc_by_bob, :eager_other,
@@ -108,53 +114,57 @@ class EagerAssociationTest < ActiveRecord::TestCase
108
114
  end
109
115
 
110
116
  def test_preloading_has_many_in_multiple_queries_with_more_ids_than_database_can_handle
111
- Comment.connection.expects(:in_clause_length).at_least_once.returns(5)
112
- posts = Post.all.merge!(:includes=>:comments).to_a
113
- assert_equal 11, posts.size
117
+ assert_called(Comment.connection, :in_clause_length, returns: 5) do
118
+ posts = Post.all.merge!(:includes=>:comments).to_a
119
+ assert_equal 11, posts.size
120
+ end
114
121
  end
115
122
 
116
123
  def test_preloading_has_many_in_one_queries_when_database_has_no_limit_on_ids_it_can_handle
117
- Comment.connection.expects(:in_clause_length).at_least_once.returns(nil)
118
- posts = Post.all.merge!(:includes=>:comments).to_a
119
- assert_equal 11, posts.size
124
+ assert_called(Comment.connection, :in_clause_length, returns: nil) do
125
+ posts = Post.all.merge!(:includes=>:comments).to_a
126
+ assert_equal 11, posts.size
127
+ end
120
128
  end
121
129
 
122
130
  def test_preloading_habtm_in_multiple_queries_with_more_ids_than_database_can_handle
123
- Comment.connection.expects(:in_clause_length).at_least_once.returns(5)
124
- posts = Post.all.merge!(:includes=>:categories).to_a
125
- assert_equal 11, posts.size
131
+ assert_called(Comment.connection, :in_clause_length, times: 2, returns: 5) do
132
+ posts = Post.all.merge!(:includes=>:categories).to_a
133
+ assert_equal 11, posts.size
134
+ end
126
135
  end
127
136
 
128
137
  def test_preloading_habtm_in_one_queries_when_database_has_no_limit_on_ids_it_can_handle
129
- Comment.connection.expects(:in_clause_length).at_least_once.returns(nil)
130
- posts = Post.all.merge!(:includes=>:categories).to_a
131
- assert_equal 11, posts.size
138
+ assert_called(Comment.connection, :in_clause_length, times: 2, returns: nil) do
139
+ posts = Post.all.merge!(:includes=>:categories).to_a
140
+ assert_equal 11, posts.size
141
+ end
132
142
  end
133
143
 
134
144
  def test_load_associated_records_in_one_query_when_adapter_has_no_limit
135
- Comment.connection.expects(:in_clause_length).at_least_once.returns(nil)
136
-
137
- post = posts(:welcome)
138
- assert_queries(2) do
139
- Post.includes(:comments).where(:id => post.id).to_a
145
+ assert_called(Comment.connection, :in_clause_length, returns: nil) do
146
+ post = posts(:welcome)
147
+ assert_queries(2) do
148
+ Post.includes(:comments).where(:id => post.id).to_a
149
+ end
140
150
  end
141
151
  end
142
152
 
143
153
  def test_load_associated_records_in_several_queries_when_many_ids_passed
144
- Comment.connection.expects(:in_clause_length).at_least_once.returns(1)
145
-
146
- post1, post2 = posts(:welcome), posts(:thinking)
147
- assert_queries(3) do
148
- Post.includes(:comments).where(:id => [post1.id, post2.id]).to_a
154
+ assert_called(Comment.connection, :in_clause_length, returns: 1) do
155
+ post1, post2 = posts(:welcome), posts(:thinking)
156
+ assert_queries(3) do
157
+ Post.includes(:comments).where(:id => [post1.id, post2.id]).to_a
158
+ end
149
159
  end
150
160
  end
151
161
 
152
162
  def test_load_associated_records_in_one_query_when_a_few_ids_passed
153
- Comment.connection.expects(:in_clause_length).at_least_once.returns(3)
154
-
155
- post = posts(:welcome)
156
- assert_queries(2) do
157
- Post.includes(:comments).where(:id => post.id).to_a
163
+ assert_called(Comment.connection, :in_clause_length, returns: 3) do
164
+ post = posts(:welcome)
165
+ assert_queries(2) do
166
+ Post.includes(:comments).where(:id => post.id).to_a
167
+ end
158
168
  end
159
169
  end
160
170
 
@@ -346,31 +356,31 @@ class EagerAssociationTest < ActiveRecord::TestCase
346
356
  def test_eager_association_loading_with_belongs_to_and_limit
347
357
  comments = Comment.all.merge!(:includes => :post, :limit => 5, :order => 'comments.id').to_a
348
358
  assert_equal 5, comments.length
349
- assert_equal [1,2,3,5,6], comments.collect { |c| c.id }
359
+ assert_equal [1,2,3,5,6], comments.collect(&:id)
350
360
  end
351
361
 
352
362
  def test_eager_association_loading_with_belongs_to_and_limit_and_conditions
353
363
  comments = Comment.all.merge!(:includes => :post, :where => 'post_id = 4', :limit => 3, :order => 'comments.id').to_a
354
364
  assert_equal 3, comments.length
355
- assert_equal [5,6,7], comments.collect { |c| c.id }
365
+ assert_equal [5,6,7], comments.collect(&:id)
356
366
  end
357
367
 
358
368
  def test_eager_association_loading_with_belongs_to_and_limit_and_offset
359
369
  comments = Comment.all.merge!(:includes => :post, :limit => 3, :offset => 2, :order => 'comments.id').to_a
360
370
  assert_equal 3, comments.length
361
- assert_equal [3,5,6], comments.collect { |c| c.id }
371
+ assert_equal [3,5,6], comments.collect(&:id)
362
372
  end
363
373
 
364
374
  def test_eager_association_loading_with_belongs_to_and_limit_and_offset_and_conditions
365
375
  comments = Comment.all.merge!(:includes => :post, :where => 'post_id = 4', :limit => 3, :offset => 1, :order => 'comments.id').to_a
366
376
  assert_equal 3, comments.length
367
- assert_equal [6,7,8], comments.collect { |c| c.id }
377
+ assert_equal [6,7,8], comments.collect(&:id)
368
378
  end
369
379
 
370
380
  def test_eager_association_loading_with_belongs_to_and_limit_and_offset_and_conditions_array
371
381
  comments = Comment.all.merge!(:includes => :post, :where => ['post_id = ?',4], :limit => 3, :offset => 1, :order => 'comments.id').to_a
372
382
  assert_equal 3, comments.length
373
- assert_equal [6,7,8], comments.collect { |c| c.id }
383
+ assert_equal [6,7,8], comments.collect(&:id)
374
384
  end
375
385
 
376
386
  def test_eager_association_loading_with_belongs_to_and_conditions_string_with_unquoted_table_name
@@ -385,7 +395,7 @@ class EagerAssociationTest < ActiveRecord::TestCase
385
395
  comments = Comment.all.merge!(:includes => :post, :where => {:posts => {:id => 4}}, :limit => 3, :order => 'comments.id').to_a
386
396
  end
387
397
  assert_equal 3, comments.length
388
- assert_equal [5,6,7], comments.collect { |c| c.id }
398
+ assert_equal [5,6,7], comments.collect(&:id)
389
399
  assert_no_queries do
390
400
  comments.first.post
391
401
  end
@@ -414,13 +424,13 @@ class EagerAssociationTest < ActiveRecord::TestCase
414
424
  def test_eager_association_loading_with_belongs_to_and_limit_and_multiple_associations
415
425
  posts = Post.all.merge!(:includes => [:author, :very_special_comment], :limit => 1, :order => 'posts.id').to_a
416
426
  assert_equal 1, posts.length
417
- assert_equal [1], posts.collect { |p| p.id }
427
+ assert_equal [1], posts.collect(&:id)
418
428
  end
419
429
 
420
430
  def test_eager_association_loading_with_belongs_to_and_limit_and_offset_and_multiple_associations
421
431
  posts = Post.all.merge!(:includes => [:author, :very_special_comment], :limit => 1, :offset => 1, :order => 'posts.id').to_a
422
432
  assert_equal 1, posts.length
423
- assert_equal [2], posts.collect { |p| p.id }
433
+ assert_equal [2], posts.collect(&:id)
424
434
  end
425
435
 
426
436
  def test_eager_association_loading_with_belongs_to_inferred_foreign_key_from_association_name
@@ -511,8 +521,8 @@ class EagerAssociationTest < ActiveRecord::TestCase
511
521
  end
512
522
 
513
523
  def test_eager_with_has_many_through_an_sti_join_model_with_conditions_on_both
514
- author = Author.all.merge!(:includes => :special_nonexistant_post_comments, :order => 'authors.id').first
515
- assert_equal [], author.special_nonexistant_post_comments
524
+ author = Author.all.merge!(:includes => :special_nonexistent_post_comments, :order => 'authors.id').first
525
+ assert_equal [], author.special_nonexistent_post_comments
516
526
  end
517
527
 
518
528
  def test_eager_with_has_many_through_join_model_with_conditions
@@ -553,13 +563,13 @@ class EagerAssociationTest < ActiveRecord::TestCase
553
563
  def test_eager_with_has_many_and_limit_and_conditions
554
564
  posts = Post.all.merge!(:includes => [ :author, :comments ], :limit => 2, :where => "posts.body = 'hello'", :order => "posts.id").to_a
555
565
  assert_equal 2, posts.size
556
- assert_equal [4,5], posts.collect { |p| p.id }
566
+ assert_equal [4,5], posts.collect(&:id)
557
567
  end
558
568
 
559
569
  def test_eager_with_has_many_and_limit_and_conditions_array
560
570
  posts = Post.all.merge!(:includes => [ :author, :comments ], :limit => 2, :where => [ "posts.body = ?", 'hello' ], :order => "posts.id").to_a
561
571
  assert_equal 2, posts.size
562
- assert_equal [4,5], posts.collect { |p| p.id }
572
+ assert_equal [4,5], posts.collect(&:id)
563
573
  end
564
574
 
565
575
  def test_eager_with_has_many_and_limit_and_conditions_array_on_the_eagers
@@ -743,6 +753,38 @@ class EagerAssociationTest < ActiveRecord::TestCase
743
753
  }
744
754
  end
745
755
 
756
+ def test_eager_has_many_through_with_order
757
+ tag = OrderedTag.create(name: 'Foo')
758
+ post1 = Post.create!(title: 'Beaches', body: "I like beaches!")
759
+ post2 = Post.create!(title: 'Pools', body: "I like pools!")
760
+
761
+ Tagging.create!(taggable_type: 'Post', taggable_id: post1.id, tag: tag)
762
+ Tagging.create!(taggable_type: 'Post', taggable_id: post2.id, tag: tag)
763
+
764
+ tag_with_includes = OrderedTag.includes(:tagged_posts).find(tag.id)
765
+ assert_equal(tag_with_includes.taggings.map(&:taggable).map(&:title), tag_with_includes.tagged_posts.map(&:title))
766
+ end
767
+
768
+ def test_eager_has_many_through_multiple_with_order
769
+ tag1 = OrderedTag.create!(name: 'Bar')
770
+ tag2 = OrderedTag.create!(name: 'Foo')
771
+
772
+ post1 = Post.create!(title: 'Beaches', body: "I like beaches!")
773
+ post2 = Post.create!(title: 'Pools', body: "I like pools!")
774
+
775
+ Tagging.create!(taggable: post1, tag: tag1)
776
+ Tagging.create!(taggable: post2, tag: tag1)
777
+ Tagging.create!(taggable: post2, tag: tag2)
778
+ Tagging.create!(taggable: post1, tag: tag2)
779
+
780
+ tags_with_includes = OrderedTag.where(id: [tag1, tag2].map(&:id)).includes(:tagged_posts).order(:id).to_a
781
+ tag1_with_includes = tags_with_includes.first
782
+ tag2_with_includes = tags_with_includes.last
783
+
784
+ assert_equal([post2, post1].map(&:title), tag1_with_includes.tagged_posts.map(&:title))
785
+ assert_equal([post1, post2].map(&:title), tag2_with_includes.tagged_posts.map(&:title))
786
+ end
787
+
746
788
  def test_eager_with_default_scope
747
789
  developer = EagerDeveloperWithDefaultScope.where(:name => 'David').first
748
790
  projects = Project.order(:id).to_a
@@ -759,6 +801,23 @@ class EagerAssociationTest < ActiveRecord::TestCase
759
801
  end
760
802
  end
761
803
 
804
+ def test_eager_with_default_scope_as_class_method_using_find_method
805
+ david = developers(:david)
806
+ developer = EagerDeveloperWithClassMethodDefaultScope.find(david.id)
807
+ projects = Project.order(:id).to_a
808
+ assert_no_queries do
809
+ assert_equal(projects, developer.projects)
810
+ end
811
+ end
812
+
813
+ def test_eager_with_default_scope_as_class_method_using_find_by_method
814
+ developer = EagerDeveloperWithClassMethodDefaultScope.find_by(name: 'David')
815
+ projects = Project.order(:id).to_a
816
+ assert_no_queries do
817
+ assert_equal(projects, developer.projects)
818
+ end
819
+ end
820
+
762
821
  def test_eager_with_default_scope_as_lambda
763
822
  developer = EagerDeveloperWithLambdaDefaultScope.where(:name => 'David').first
764
823
  projects = Project.order(:id).to_a
@@ -868,18 +927,6 @@ class EagerAssociationTest < ActiveRecord::TestCase
868
927
  )
869
928
  end
870
929
 
871
- def test_preload_with_interpolation
872
- assert_deprecated do
873
- post = Post.includes(:comments_with_interpolated_conditions).find(posts(:welcome).id)
874
- assert_equal [comments(:greetings)], post.comments_with_interpolated_conditions
875
- end
876
-
877
- assert_deprecated do
878
- post = Post.joins(:comments_with_interpolated_conditions).find(posts(:welcome).id)
879
- assert_equal [comments(:greetings)], post.comments_with_interpolated_conditions
880
- end
881
- end
882
-
883
930
  def test_polymorphic_type_condition
884
931
  post = Post.all.merge!(:includes => :taggings).find(posts(:thinking).id)
885
932
  assert post.taggings.include?(taggings(:thinking_general))
@@ -1199,7 +1246,7 @@ class EagerAssociationTest < ActiveRecord::TestCase
1199
1246
  assert_no_queries { assert client.accounts.empty? }
1200
1247
  end
1201
1248
 
1202
- def test_preloading_has_many_through_with_uniq
1249
+ def test_preloading_has_many_through_with_distinct
1203
1250
  mary = Author.includes(:unique_categorized_posts).where(:id => authors(:mary).id).first
1204
1251
  assert_equal 1, mary.unique_categorized_posts.length
1205
1252
  assert_equal 1, mary.unique_categorized_post_ids.length
@@ -1242,17 +1289,11 @@ class EagerAssociationTest < ActiveRecord::TestCase
1242
1289
  end
1243
1290
 
1244
1291
  def test_join_eager_with_empty_order_should_generate_valid_sql
1245
- assert_nothing_raised(ActiveRecord::StatementInvalid) do
1292
+ assert_nothing_raised do
1246
1293
  Post.includes(:comments).order("").where(:comments => {:body => "Thank you for the welcome"}).first
1247
1294
  end
1248
1295
  end
1249
1296
 
1250
- def test_join_eager_with_nil_order_should_generate_valid_sql
1251
- assert_nothing_raised(ActiveRecord::StatementInvalid) do
1252
- Post.includes(:comments).order(nil).where(:comments => {:body => "Thank you for the welcome"}).first
1253
- end
1254
- end
1255
-
1256
1297
  def test_deep_including_through_habtm
1257
1298
  # warm up habtm cache
1258
1299
  posts = Post.all.merge!(:includes => {:categories => :categorizations}, :order => "posts.id").to_a
@@ -1264,6 +1305,16 @@ class EagerAssociationTest < ActiveRecord::TestCase
1264
1305
  assert_no_queries { assert_equal 2, posts[1].categories[0].categorizations.length }
1265
1306
  end
1266
1307
 
1308
+ def test_eager_load_multiple_associations_with_references
1309
+ mentor = Mentor.create!(name: "Barış Can DAYLIK")
1310
+ developer = Developer.create!(name: "Mehmet Emin İNAÇ", mentor: mentor)
1311
+ Contract.create!(developer: developer)
1312
+ project = Project.create!(name: "VNGRS", mentor: mentor)
1313
+ project.developers << developer
1314
+ projects = Project.references(:mentors).includes(mentor: { developers: :contracts }, developers: :contracts)
1315
+ assert_equal projects.last.mentor.developers.first.contracts, projects.last.developers.last.contracts
1316
+ end
1317
+
1267
1318
  test "scoping with a circular preload" do
1268
1319
  assert_equal Comment.find(1), Comment.preload(:post => :comments).scoping { Comment.find(1) }
1269
1320
  end
@@ -1357,35 +1408,42 @@ class EagerAssociationTest < ActiveRecord::TestCase
1357
1408
  assert_equal pets(:parrot), Owner.including_last_pet.first.last_pet
1358
1409
  end
1359
1410
 
1360
- test "include instance dependent associations is deprecated" do
1411
+ test "preloading and eager loading of instance dependent associations is not supported" do
1361
1412
  message = "association scope 'posts_with_signature' is"
1362
- assert_deprecated message do
1363
- begin
1364
- Author.includes(:posts_with_signature).to_a
1365
- rescue NoMethodError
1366
- # it's expected that preloading of this association fails
1367
- end
1413
+ error = assert_raises(ArgumentError) do
1414
+ Author.includes(:posts_with_signature).to_a
1368
1415
  end
1416
+ assert_match message, error.message
1369
1417
 
1370
- assert_deprecated message do
1371
- Author.preload(:posts_with_signature).to_a rescue NoMethodError
1418
+ error = assert_raises(ArgumentError) do
1419
+ Author.preload(:posts_with_signature).to_a
1372
1420
  end
1421
+ assert_match message, error.message
1373
1422
 
1374
- assert_deprecated message do
1423
+ error = assert_raises(ArgumentError) do
1375
1424
  Author.eager_load(:posts_with_signature).to_a
1376
1425
  end
1426
+ assert_match message, error.message
1427
+ end
1428
+
1429
+ test "preload with invalid argument" do
1430
+ exception = assert_raises(ArgumentError) do
1431
+ Author.preload(10).to_a
1432
+ end
1433
+ assert_equal('10 was not recognized for preload', exception.message)
1377
1434
  end
1378
1435
 
1379
1436
  test "associations with extensions are not instance dependent" do
1380
- assert_not_deprecated do
1437
+ assert_nothing_raised do
1381
1438
  Author.includes(:posts_with_extension).to_a
1382
1439
  end
1383
1440
  end
1384
1441
 
1385
- test "including associations with extensions and an instance dependent scope is deprecated" do
1386
- assert_deprecated do
1442
+ test "including associations with extensions and an instance dependent scope is not supported" do
1443
+ e = assert_raises(ArgumentError) do
1387
1444
  Author.includes(:posts_with_extension_and_instance).to_a
1388
1445
  end
1446
+ assert_match(/Preloading instance dependent scopes is not supported/, e.message)
1389
1447
  end
1390
1448
 
1391
1449
  test "preloading readonly association" do
@@ -1402,8 +1460,25 @@ class EagerAssociationTest < ActiveRecord::TestCase
1402
1460
  assert david.readonly_comments.first.readonly?
1403
1461
  end
1404
1462
 
1463
+ test "eager-loading non-readonly association" do
1464
+ # has_one
1465
+ firm = Firm.where(id: "1").eager_load(:account).first!
1466
+ assert_not firm.account.readonly?
1467
+
1468
+ # has_and_belongs_to_many
1469
+ project = Project.where(id: "2").eager_load(:developers).first!
1470
+ assert_not project.developers.first.readonly?
1471
+
1472
+ # has_many :through
1473
+ david = Author.where(id: "1").eager_load(:comments).first!
1474
+ assert_not david.comments.first.readonly?
1475
+
1476
+ # belongs_to
1477
+ post = Post.where(id: "1").eager_load(:author).first!
1478
+ assert_not post.author.readonly?
1479
+ end
1480
+
1405
1481
  test "eager-loading readonly association" do
1406
- skip "eager_load does not yet preserve readonly associations"
1407
1482
  # has-one
1408
1483
  firm = Firm.where(id: "1").eager_load(:readonly_account).first!
1409
1484
  assert firm.readonly_account.readonly?
@@ -1415,6 +1490,10 @@ class EagerAssociationTest < ActiveRecord::TestCase
1415
1490
  # has-many :through
1416
1491
  david = Author.where(id: "1").eager_load(:readonly_comments).first!
1417
1492
  assert david.readonly_comments.first.readonly?
1493
+
1494
+ # belongs_to
1495
+ post = Post.where(id: "1").eager_load(:readonly_author).first!
1496
+ assert post.readonly_author.readonly?
1418
1497
  end
1419
1498
 
1420
1499
  test "preloading a polymorphic association with references to the associated table" do
@@ -1426,4 +1505,10 @@ class EagerAssociationTest < ActiveRecord::TestCase
1426
1505
  post = Post.eager_load(:tags).where('tags.name = ?', 'General').first
1427
1506
  assert_equal posts(:welcome), post
1428
1507
  end
1508
+
1509
+ # CollectionProxy#reader is expensive, so the preloader avoids calling it.
1510
+ test "preloading has_many_through association avoids calling association.reader" do
1511
+ ActiveRecord::Associations::HasManyAssociation.any_instance.expects(:reader).never
1512
+ Author.preload(:readonly_comments).first!
1513
+ end
1429
1514
  end