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
@@ -15,6 +15,7 @@ require 'models/essay'
15
15
  require 'models/owner'
16
16
  require 'models/post'
17
17
  require 'models/comment'
18
+ require 'models/categorization'
18
19
  require 'models/customer'
19
20
  require 'models/carrier'
20
21
  require 'models/shop_account'
@@ -22,7 +23,7 @@ require 'models/customer_carrier'
22
23
 
23
24
  class HasOneThroughAssociationsTest < ActiveRecord::TestCase
24
25
  fixtures :member_types, :members, :clubs, :memberships, :sponsors, :organizations, :minivans,
25
- :dashboards, :speedometers, :authors, :posts, :comments, :categories, :essays, :owners, :author_addresses
26
+ :dashboards, :speedometers, :authors, :posts, :comments, :categories, :essays, :owners
26
27
 
27
28
  def setup
28
29
  @member = members(:groucho)
@@ -248,12 +249,14 @@ class HasOneThroughAssociationsTest < ActiveRecord::TestCase
248
249
  assert_not_nil @member_detail.member_type
249
250
  @member_detail.destroy
250
251
  assert_queries(1) do
251
- assert_not_nil @member_detail.member_type(true)
252
+ @member_detail.association(:member_type).reload
253
+ assert_not_nil @member_detail.member_type
252
254
  end
253
255
 
254
256
  @member_detail.member.destroy
255
257
  assert_queries(1) do
256
- assert_nil @member_detail.member_type(true)
258
+ @member_detail.association(:member_type).reload
259
+ assert_nil @member_detail.member_type
257
260
  end
258
261
  end
259
262
 
@@ -11,7 +11,7 @@ require 'models/tag'
11
11
 
12
12
  class InnerJoinAssociationTest < ActiveRecord::TestCase
13
13
  fixtures :authors, :essays, :posts, :comments, :categories, :categories_posts, :categorizations,
14
- :taggings, :tags, :author_addresses
14
+ :taggings, :tags
15
15
 
16
16
  def test_construct_finder_sql_applies_aliases_tables_on_association_conditions
17
17
  result = Author.joins(:thinking_posts, :welcome_posts).to_a
@@ -54,7 +54,7 @@ class InnerJoinAssociationTest < ActiveRecord::TestCase
54
54
  def test_find_with_implicit_inner_joins_without_select_does_not_imply_readonly
55
55
  authors = Author.joins(:posts)
56
56
  assert_not authors.empty?, "expected authors to be non-empty"
57
- assert authors.none? {|a| a.readonly? }, "expected no authors to be readonly"
57
+ assert authors.none?(&:readonly?), "expected no authors to be readonly"
58
58
  end
59
59
 
60
60
  def test_find_with_implicit_inner_joins_honors_readonly_with_select
@@ -102,7 +102,7 @@ class InnerJoinAssociationTest < ActiveRecord::TestCase
102
102
 
103
103
  def test_find_with_conditions_on_reflection
104
104
  assert !posts(:welcome).comments.empty?
105
- assert Post.joins(:nonexistant_comments).where(:id => posts(:welcome).id).empty? # [sic!]
105
+ assert Post.joins(:nonexistent_comments).where(:id => posts(:welcome).id).empty? # [sic!]
106
106
  end
107
107
 
108
108
  def test_find_with_conditions_on_through_reflection
@@ -83,10 +83,10 @@ class AutomaticInverseFindingTests < ActiveRecord::TestCase
83
83
 
84
84
  assert_equal rating.comment, comment, "The Rating's comment should be the original Comment"
85
85
 
86
- rating.comment.body = "Brogramming is the act of programming, like a bro."
86
+ rating.comment.body = "Fennec foxes are the smallest of the foxes."
87
87
  assert_equal rating.comment.body, comment.body, "Changing the Comment's body on the association should change the original Comment's body"
88
88
 
89
- comment.body = "Broseiden is the king of the sea of bros."
89
+ comment.body = "Kittens are adorable."
90
90
  assert_equal comment.body, rating.comment.body, "Changing the original Comment's body should change the Comment's body on the association"
91
91
  end
92
92
 
@@ -97,10 +97,10 @@ class AutomaticInverseFindingTests < ActiveRecord::TestCase
97
97
 
98
98
  assert_equal rating.comment, comment, "The Rating's comment should be the original Comment"
99
99
 
100
- rating.comment.body = "Brogramming is the act of programming, like a bro."
100
+ rating.comment.body = "Fennec foxes are the smallest of the foxes."
101
101
  assert_equal rating.comment.body, comment.body, "Changing the Comment's body on the association should change the original Comment's body"
102
102
 
103
- comment.body = "Broseiden is the king of the sea of bros."
103
+ comment.body = "Kittens are adorable."
104
104
  assert_equal comment.body, rating.comment.body, "Changing the original Comment's body should change the Comment's body on the association"
105
105
  end
106
106
 
@@ -130,15 +130,15 @@ end
130
130
 
131
131
  class InverseAssociationTests < ActiveRecord::TestCase
132
132
  def test_should_allow_for_inverse_of_options_in_associations
133
- assert_nothing_raised(ArgumentError, 'ActiveRecord should allow the inverse_of options on has_many') do
133
+ assert_nothing_raised do
134
134
  Class.new(ActiveRecord::Base).has_many(:wheels, :inverse_of => :car)
135
135
  end
136
136
 
137
- assert_nothing_raised(ArgumentError, 'ActiveRecord should allow the inverse_of options on has_one') do
137
+ assert_nothing_raised do
138
138
  Class.new(ActiveRecord::Base).has_one(:engine, :inverse_of => :car)
139
139
  end
140
140
 
141
- assert_nothing_raised(ArgumentError, 'ActiveRecord should allow the inverse_of options on belongs_to') do
141
+ assert_nothing_raised do
142
142
  Class.new(ActiveRecord::Base).belongs_to(:car, :inverse_of => :driver)
143
143
  end
144
144
  end
@@ -495,6 +495,33 @@ class InverseHasManyTests < ActiveRecord::TestCase
495
495
 
496
496
  assert !man.persisted?
497
497
  end
498
+
499
+ def test_inverse_instance_should_be_set_before_find_callbacks_are_run
500
+ reset_callbacks(Interest, :find) do
501
+ Interest.after_find { raise unless association(:man).loaded? && man.present? }
502
+
503
+ assert Man.first.interests.reload.any?
504
+ assert Man.includes(:interests).first.interests.any?
505
+ assert Man.joins(:interests).includes(:interests).first.interests.any?
506
+ end
507
+ end
508
+
509
+ def test_inverse_instance_should_be_set_before_initialize_callbacks_are_run
510
+ reset_callbacks(Interest, :initialize) do
511
+ Interest.after_initialize { raise unless association(:man).loaded? && man.present? }
512
+
513
+ assert Man.first.interests.reload.any?
514
+ assert Man.includes(:interests).first.interests.any?
515
+ assert Man.joins(:interests).includes(:interests).first.interests.any?
516
+ end
517
+ end
518
+
519
+ def reset_callbacks(target, type)
520
+ old_callbacks = target.send(:get_callbacks, type).deep_dup
521
+ yield
522
+ ensure
523
+ target.send(:set_callbacks, type, old_callbacks) if old_callbacks
524
+ end
498
525
  end
499
526
 
500
527
  class InverseBelongsToTests < ActiveRecord::TestCase
@@ -666,7 +693,7 @@ class InversePolymorphicBelongsToTests < ActiveRecord::TestCase
666
693
 
667
694
  def test_trying_to_access_inverses_that_dont_exist_shouldnt_raise_an_error
668
695
  # Ideally this would, if only for symmetry's sake with other association types
669
- assert_nothing_raised(ActiveRecord::InverseOfAssociationNotFoundError) { Face.first.horrible_polymorphic_man }
696
+ assert_nothing_raised { Face.first.horrible_polymorphic_man }
670
697
  end
671
698
 
672
699
  def test_trying_to_set_polymorphic_inverses_that_dont_exist_at_all_should_raise_an_error
@@ -676,7 +703,7 @@ class InversePolymorphicBelongsToTests < ActiveRecord::TestCase
676
703
 
677
704
  def test_trying_to_set_polymorphic_inverses_that_dont_exist_on_the_instance_being_set_should_raise_an_error
678
705
  # passes because Man does have the correct inverse_of
679
- assert_nothing_raised(ActiveRecord::InverseOfAssociationNotFoundError) { Face.first.polymorphic_man = Man.first }
706
+ assert_nothing_raised { Face.first.polymorphic_man = Man.first }
680
707
  # fails because Interest does have the correct inverse_of
681
708
  assert_raise(ActiveRecord::InverseOfAssociationNotFoundError) { Face.first.polymorphic_man = Interest.first }
682
709
  end
@@ -688,7 +715,7 @@ class InverseMultipleHasManyInversesForSameModel < ActiveRecord::TestCase
688
715
  fixtures :men, :interests, :zines
689
716
 
690
717
  def test_that_we_can_load_associations_that_have_the_same_reciprocal_name_from_different_models
691
- assert_nothing_raised(ActiveRecord::AssociationTypeMismatch) do
718
+ assert_nothing_raised do
692
719
  i = Interest.first
693
720
  i.zine
694
721
  i.man
@@ -696,7 +723,7 @@ class InverseMultipleHasManyInversesForSameModel < ActiveRecord::TestCase
696
723
  end
697
724
 
698
725
  def test_that_we_can_create_associations_that_have_the_same_reciprocal_name_from_different_models
699
- assert_nothing_raised(ActiveRecord::AssociationTypeMismatch) do
726
+ assert_nothing_raised do
700
727
  i = Interest.first
701
728
  i.build_zine(:title => 'Get Some in Winter! 2008')
702
729
  i.build_man(:name => 'Gordon')
@@ -17,9 +17,9 @@ require 'models/engine'
17
17
  require 'models/car'
18
18
 
19
19
  class AssociationsJoinModelTest < ActiveRecord::TestCase
20
- self.use_transactional_fixtures = false unless supports_savepoints?
20
+ self.use_transactional_tests = false unless supports_savepoints?
21
21
 
22
- fixtures :posts, :authors, :categories, :categorizations, :comments, :tags, :taggings, :author_favorites, :vertices, :items, :books, :author_addresses,
22
+ fixtures :posts, :authors, :categories, :categorizations, :comments, :tags, :taggings, :author_favorites, :vertices, :items, :books,
23
23
  # Reload edges table from fixtures as otherwise repeated test was failing
24
24
  :edges
25
25
 
@@ -35,12 +35,12 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
35
35
  assert categories(:sti_test).authors.include?(authors(:mary))
36
36
  end
37
37
 
38
- def test_has_many_uniq_through_join_model
38
+ def test_has_many_distinct_through_join_model
39
39
  assert_equal 2, authors(:mary).categorized_posts.size
40
40
  assert_equal 1, authors(:mary).unique_categorized_posts.size
41
41
  end
42
42
 
43
- def test_has_many_uniq_through_count
43
+ def test_has_many_distinct_through_count
44
44
  author = authors(:mary)
45
45
  assert !authors(:mary).unique_categorized_posts.loaded?
46
46
  assert_queries(1) { assert_equal 1, author.unique_categorized_posts.count }
@@ -49,7 +49,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
49
49
  assert !authors(:mary).unique_categorized_posts.loaded?
50
50
  end
51
51
 
52
- def test_has_many_uniq_through_find
52
+ def test_has_many_distinct_through_find
53
53
  assert_equal 1, authors(:mary).unique_categorized_posts.to_a.size
54
54
  end
55
55
 
@@ -88,7 +88,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
88
88
 
89
89
  def test_polymorphic_has_many_going_through_join_model_with_custom_select_and_joins
90
90
  assert_equal tags(:general), tag = posts(:welcome).tags.add_joins_and_select.first
91
- assert_nothing_raised(NoMethodError) { tag.author_id }
91
+ assert_nothing_raised { tag.author_id }
92
92
  end
93
93
 
94
94
  def test_polymorphic_has_many_going_through_join_model_with_custom_foreign_key
@@ -213,7 +213,8 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
213
213
  old_count = Tagging.count
214
214
  post.destroy
215
215
  assert_equal old_count-1, Tagging.count
216
- assert_nil posts(:welcome).tagging(true)
216
+ posts(:welcome).association(:tagging).reload
217
+ assert_nil posts(:welcome).tagging
217
218
  end
218
219
 
219
220
  def test_delete_polymorphic_has_one_with_nullify
@@ -224,7 +225,8 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
224
225
  old_count = Tagging.count
225
226
  post.destroy
226
227
  assert_equal old_count, Tagging.count
227
- assert_nil posts(:welcome).tagging(true)
228
+ posts(:welcome).association(:tagging).reload
229
+ assert_nil posts(:welcome).tagging
228
230
  end
229
231
 
230
232
  def test_has_many_with_piggyback
@@ -361,6 +363,13 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
361
363
  assert_equal posts(:welcome, :thinking).sort_by(&:id), tags(:general).tagged_posts.sort_by(&:id)
362
364
  end
363
365
 
366
+ def test_has_many_polymorphic_associations_merges_through_scope
367
+ Tag.has_many :null_taggings, -> { none }, class_name: :Tagging
368
+ Tag.has_many :null_tagged_posts, :through => :null_taggings, :source => 'taggable', :source_type => 'Post'
369
+ assert_equal [], tags(:general).null_tagged_posts
370
+ refute_equal [], tags(:general).tagged_posts
371
+ end
372
+
364
373
  def test_eager_has_many_polymorphic_with_source_type
365
374
  tag_with_include = Tag.all.merge!(:includes => :tagged_posts).find(tags(:general).id)
366
375
  desired = posts(:welcome, :thinking)
@@ -393,32 +402,29 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
393
402
  end
394
403
 
395
404
  def test_has_many_through_polymorphic_has_one
396
- assert_equal Tagging.find(1,2).sort_by { |t| t.id }, authors(:david).taggings_2
405
+ assert_equal Tagging.find(1,2).sort_by(&:id), authors(:david).taggings_2
397
406
  end
398
407
 
399
408
  def test_has_many_through_polymorphic_has_many
400
- assert_equal taggings(:welcome_general, :thinking_general), authors(:david).taggings.distinct.sort_by { |t| t.id }
409
+ assert_equal taggings(:welcome_general, :thinking_general), authors(:david).taggings.distinct.sort_by(&:id)
401
410
  end
402
411
 
403
412
  def test_include_has_many_through_polymorphic_has_many
404
413
  author = Author.includes(:taggings).find authors(:david).id
405
414
  expected_taggings = taggings(:welcome_general, :thinking_general)
406
415
  assert_no_queries do
407
- assert_equal expected_taggings, author.taggings.distinct.sort_by { |t| t.id }
416
+ assert_equal expected_taggings, author.taggings.distinct.sort_by(&:id)
408
417
  end
409
418
  end
410
419
 
411
- unless current_adapter?(:IBM_DBAdapter)
412
- # DB2 throws SQL0214N
413
- def test_eager_load_has_many_through_has_many
414
- author = Author.all.merge!(:where => ['name = ?', 'David'], :includes => :comments, :order => 'comments.id').first
415
- SpecialComment.new; VerySpecialComment.new
416
- assert_no_queries do
417
- assert_equal [1,2,3,5,6,7,8,9,10,12], author.comments.collect(&:id)
418
- end
420
+ def test_eager_load_has_many_through_has_many
421
+ author = Author.all.merge!(:where => ['name = ?', 'David'], :includes => :comments, :order => 'comments.id').first
422
+ SpecialComment.new; VerySpecialComment.new
423
+ assert_no_queries do
424
+ assert_equal [1,2,3,5,6,7,8,9,10,12], author.comments.collect(&:id)
419
425
  end
420
426
  end
421
-
427
+
422
428
  def test_eager_load_has_many_through_has_many_with_conditions
423
429
  post = Post.all.merge!(:includes => :invalid_tags).first
424
430
  assert_no_queries do
@@ -447,7 +453,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
447
453
  def test_has_many_through_uses_conditions_specified_on_the_has_many_association
448
454
  author = Author.first
449
455
  assert author.comments.present?
450
- assert author.nonexistant_comments.blank?
456
+ assert author.nonexistent_comments.blank?
451
457
  end
452
458
 
453
459
  def test_has_many_through_uses_correct_attributes
@@ -464,7 +470,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
464
470
  assert saved_post.tags.include?(new_tag)
465
471
 
466
472
  assert new_tag.persisted?
467
- assert saved_post.reload.tags(true).include?(new_tag)
473
+ assert saved_post.reload.tags.reload.include?(new_tag)
468
474
 
469
475
 
470
476
  new_post = Post.new(:title => "Association replacement works!", :body => "You best believe it.")
@@ -477,7 +483,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
477
483
 
478
484
  new_post.save!
479
485
  assert new_post.persisted?
480
- assert new_post.reload.tags(true).include?(saved_tag)
486
+ assert new_post.reload.tags.reload.include?(saved_tag)
481
487
 
482
488
  assert !posts(:thinking).tags.build.persisted?
483
489
  assert !posts(:thinking).tags.new.persisted?
@@ -493,7 +499,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
493
499
  assert_nil( wrong = post_thinking.taggings.detect { |t| t.class != Tagging },
494
500
  message = "Expected a Tagging in taggings collection, got #{wrong.class}.")
495
501
  assert_equal(count + 1, post_thinking.reload.tags.size)
496
- assert_equal(count + 1, post_thinking.tags(true).size)
502
+ assert_equal(count + 1, post_thinking.tags.reload.size)
497
503
 
498
504
  assert_kind_of Tag, post_thinking.tags.create!(:name => 'foo')
499
505
  assert_nil( wrong = post_thinking.tags.detect { |t| t.class != Tag },
@@ -501,7 +507,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
501
507
  assert_nil( wrong = post_thinking.taggings.detect { |t| t.class != Tagging },
502
508
  message = "Expected a Tagging in taggings collection, got #{wrong.class}.")
503
509
  assert_equal(count + 2, post_thinking.reload.tags.size)
504
- assert_equal(count + 2, post_thinking.tags(true).size)
510
+ assert_equal(count + 2, post_thinking.tags.reload.size)
505
511
 
506
512
  assert_nothing_raised { post_thinking.tags.concat(Tag.create!(:name => 'abc'), Tag.create!(:name => 'def')) }
507
513
  assert_nil( wrong = post_thinking.tags.detect { |t| t.class != Tag },
@@ -509,7 +515,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
509
515
  assert_nil( wrong = post_thinking.taggings.detect { |t| t.class != Tagging },
510
516
  message = "Expected a Tagging in taggings collection, got #{wrong.class}.")
511
517
  assert_equal(count + 4, post_thinking.reload.tags.size)
512
- assert_equal(count + 4, post_thinking.tags(true).size)
518
+ assert_equal(count + 4, post_thinking.tags.reload.size)
513
519
 
514
520
  # Raises if the wrong reflection name is used to set the Edge belongs_to
515
521
  assert_nothing_raised { vertices(:vertex_1).sinks << vertices(:vertex_5) }
@@ -547,11 +553,11 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
547
553
  book = Book.create!(:name => 'Getting Real')
548
554
  book_awdr = books(:awdr)
549
555
  book_awdr.references << book
550
- assert_equal(count + 1, book_awdr.references(true).size)
556
+ assert_equal(count + 1, book_awdr.references.reload.size)
551
557
 
552
558
  assert_nothing_raised { book_awdr.references.delete(book) }
553
559
  assert_equal(count, book_awdr.references.size)
554
- assert_equal(count, book_awdr.references(true).size)
560
+ assert_equal(count, book_awdr.references.reload.size)
555
561
  assert_equal(references_before.sort, book_awdr.references.sort)
556
562
  end
557
563
 
@@ -561,14 +567,14 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
561
567
  tag = Tag.create!(:name => 'doomed')
562
568
  post_thinking = posts(:thinking)
563
569
  post_thinking.tags << tag
564
- assert_equal(count + 1, post_thinking.taggings(true).size)
565
- assert_equal(count + 1, post_thinking.reload.tags(true).size)
570
+ assert_equal(count + 1, post_thinking.taggings.reload.size)
571
+ assert_equal(count + 1, post_thinking.reload.tags.reload.size)
566
572
  assert_not_equal(tags_before, post_thinking.tags.sort)
567
573
 
568
574
  assert_nothing_raised { post_thinking.tags.delete(tag) }
569
575
  assert_equal(count, post_thinking.tags.size)
570
- assert_equal(count, post_thinking.tags(true).size)
571
- assert_equal(count, post_thinking.taggings(true).size)
576
+ assert_equal(count, post_thinking.tags.reload.size)
577
+ assert_equal(count, post_thinking.taggings.reload.size)
572
578
  assert_equal(tags_before, post_thinking.tags.sort)
573
579
  end
574
580
 
@@ -580,11 +586,11 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
580
586
  quaked = Tag.create!(:name => 'quaked')
581
587
  post_thinking = posts(:thinking)
582
588
  post_thinking.tags << doomed << doomed2
583
- assert_equal(count + 2, post_thinking.reload.tags(true).size)
589
+ assert_equal(count + 2, post_thinking.reload.tags.reload.size)
584
590
 
585
591
  assert_nothing_raised { post_thinking.tags.delete(doomed, doomed2, quaked) }
586
592
  assert_equal(count, post_thinking.tags.size)
587
- assert_equal(count, post_thinking.tags(true).size)
593
+ assert_equal(count, post_thinking.tags.reload.size)
588
594
  assert_equal(tags_before, post_thinking.tags.sort)
589
595
  end
590
596
 
@@ -592,7 +598,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
592
598
  assert_raise(ActiveRecord::AssociationTypeMismatch) { posts(:thinking).tags.delete(Object.new) }
593
599
  end
594
600
 
595
- def test_deleting_by_fixnum_id_from_has_many_through
601
+ def test_deleting_by_integer_id_from_has_many_through
596
602
  post = posts(:thinking)
597
603
 
598
604
  assert_difference 'post.tags.count', -1 do
@@ -628,7 +634,7 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
628
634
  assert_equal [comments(:does_it_hurt)], authors(:david).special_post_comments
629
635
  end
630
636
 
631
- def test_uniq_has_many_through_should_retain_order
637
+ def test_distinct_has_many_through_should_retain_order
632
638
  comment_ids = authors(:david).comments.map(&:id)
633
639
  assert_equal comment_ids.sort, authors(:david).ordered_uniq_comments.map(&:id)
634
640
  assert_equal comment_ids.sort.reverse, authors(:david).ordered_uniq_comments_desc.map(&:id)
@@ -741,6 +747,23 @@ class AssociationsJoinModelTest < ActiveRecord::TestCase
741
747
  assert_equal aircraft.engines, [engine]
742
748
  end
743
749
 
750
+ def test_proper_error_message_for_eager_load_and_includes_association_errors
751
+ includes_error = assert_raises(ActiveRecord::ConfigurationError) {
752
+ Post.includes(:nonexistent_relation).where(nonexistent_relation: {name: 'Rochester'}).find(1)
753
+ }
754
+ assert_equal("Can't join 'Post' to association named 'nonexistent_relation'; perhaps you misspelled it?", includes_error.message)
755
+
756
+ eager_load_error = assert_raises(ActiveRecord::ConfigurationError) {
757
+ Post.eager_load(:nonexistent_relation).where(nonexistent_relation: {name: 'Rochester'}).find(1)
758
+ }
759
+ assert_equal("Can't join 'Post' to association named 'nonexistent_relation'; perhaps you misspelled it?", eager_load_error.message)
760
+
761
+ includes_and_eager_load_error = assert_raises(ActiveRecord::ConfigurationError) {
762
+ Post.eager_load(:nonexistent_relation).includes(:nonexistent_relation).where(nonexistent_relation: {name: 'Rochester'}).find(1)
763
+ }
764
+ assert_equal("Can't join 'Post' to association named 'nonexistent_relation'; perhaps you misspelled it?", includes_and_eager_load_error.message)
765
+ end
766
+
744
767
  private
745
768
  # create dynamic Post models to allow different dependency options
746
769
  def find_post_with_dependency(post_id, association, association_name, dependency)
@@ -0,0 +1,88 @@
1
+ require "cases/helper"
2
+ require 'models/post'
3
+ require 'models/comment'
4
+ require 'models/author'
5
+ require 'models/essay'
6
+ require 'models/categorization'
7
+ require 'models/person'
8
+
9
+ class LeftOuterJoinAssociationTest < ActiveRecord::TestCase
10
+ fixtures :authors, :essays, :posts, :comments, :categorizations, :people
11
+
12
+ def test_construct_finder_sql_applies_aliases_tables_on_association_conditions
13
+ result = Author.left_outer_joins(:thinking_posts, :welcome_posts).to_a
14
+ assert_equal authors(:david), result.first
15
+ end
16
+
17
+ def test_construct_finder_sql_does_not_table_name_collide_on_duplicate_associations
18
+ assert_nothing_raised do
19
+ queries = capture_sql do
20
+ Person.left_outer_joins(:agents => {:agents => :agents})
21
+ .left_outer_joins(:agents => {:agents => {:primary_contact => :agents}}).to_a
22
+ end
23
+ assert queries.any? { |sql| /agents_people_4/i =~ sql }
24
+ end
25
+ end
26
+
27
+ def test_left_outer_joins_count_is_same_as_size_of_loaded_results
28
+ assert_equal 17, Post.left_outer_joins(:comments).to_a.size
29
+ assert_equal 17, Post.left_outer_joins(:comments).count
30
+ end
31
+
32
+ def test_left_joins_aliases_left_outer_joins
33
+ assert_equal Post.left_outer_joins(:comments).to_sql, Post.left_joins(:comments).to_sql
34
+ end
35
+
36
+ def test_left_outer_joins_return_has_value_for_every_comment
37
+ all_post_ids = Post.pluck(:id)
38
+ assert_equal all_post_ids, all_post_ids & Post.left_outer_joins(:comments).pluck(:id)
39
+ end
40
+
41
+ def test_left_outer_joins_actually_does_a_left_outer_join
42
+ queries = capture_sql { Author.left_outer_joins(:posts).to_a }
43
+ assert queries.any? { |sql| /LEFT OUTER JOIN/i =~ sql }
44
+ end
45
+
46
+ def test_construct_finder_sql_ignores_empty_left_outer_joins_hash
47
+ queries = capture_sql { Author.left_outer_joins({}).to_a }
48
+ assert queries.none? { |sql| /LEFT OUTER JOIN/i =~ sql }
49
+ end
50
+
51
+ def test_construct_finder_sql_ignores_empty_left_outer_joins_array
52
+ queries = capture_sql { Author.left_outer_joins([]).to_a }
53
+ assert queries.none? { |sql| /LEFT OUTER JOIN/i =~ sql }
54
+ end
55
+
56
+ def test_left_outer_joins_forbids_to_use_string_as_argument
57
+ assert_raise(ArgumentError){ Author.left_outer_joins('LEFT OUTER JOIN "posts" ON "posts"."user_id" = "users"."id"').to_a }
58
+ end
59
+
60
+ def test_join_conditions_added_to_join_clause
61
+ queries = capture_sql { Author.left_outer_joins(:essays).to_a }
62
+ assert queries.any? { |sql| /writer_type.*?=.*?(Author|\?|\$1)/i =~ sql }
63
+ assert queries.none? { |sql| /WHERE/i =~ sql }
64
+ end
65
+
66
+ def test_find_with_sti_join
67
+ scope = Post.left_outer_joins(:special_comments).where(:id => posts(:sti_comments).id)
68
+
69
+ # The join should match SpecialComment and its subclasses only
70
+ assert scope.where("comments.type" => "Comment").empty?
71
+ assert !scope.where("comments.type" => "SpecialComment").empty?
72
+ assert !scope.where("comments.type" => "SubSpecialComment").empty?
73
+ end
74
+
75
+ def test_does_not_override_select
76
+ authors = Author.select("authors.name, #{%{(authors.author_address_id || ' ' || authors.author_address_extra_id) as addr_id}}").left_outer_joins(:posts)
77
+ assert authors.any?
78
+ assert authors.first.respond_to?(:addr_id)
79
+ end
80
+
81
+ test "the default scope of the target is applied when joining associations" do
82
+ author = Author.create! name: "Jon"
83
+ author.categorizations.create!
84
+ author.categorizations.create! special: true
85
+
86
+ assert_equal [author], Author.where(id: author).left_outer_joins(:special_categorizations)
87
+ end
88
+ end