ibm_db 3.0.4 → 5.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (351) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES +8 -1
  3. data/LICENSE +1 -1
  4. data/ParameterizedQueries README +6 -6
  5. data/README +38 -55
  6. data/ext/Makefile +266 -0
  7. data/ext/extconf.rb +34 -3
  8. data/ext/gil_release_version +3 -0
  9. data/ext/ibm_db.c +106 -111
  10. data/ext/ibm_db.o +0 -0
  11. data/ext/ibm_db.so +0 -0
  12. data/ext/mkmf.log +103 -0
  13. data/ext/ruby_ibm_db_cli.o +0 -0
  14. data/ext/unicode_support_version +3 -0
  15. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +911 -527
  16. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +4 -1
  17. data/test/active_record/connection_adapters/fake_adapter.rb +8 -5
  18. data/test/cases/adapter_test.rb +148 -58
  19. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
  20. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
  21. data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
  22. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
  23. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
  24. data/test/cases/adapters/mysql2/connection_test.rb +210 -0
  25. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
  26. data/test/cases/adapters/mysql2/enum_test.rb +26 -0
  27. data/test/cases/adapters/mysql2/explain_test.rb +21 -0
  28. data/test/cases/adapters/mysql2/json_test.rb +195 -0
  29. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
  30. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  31. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
  32. data/test/cases/adapters/mysql2/schema_test.rb +126 -0
  33. data/test/cases/adapters/mysql2/sp_test.rb +36 -0
  34. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
  35. data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
  36. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
  37. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
  38. data/test/cases/adapters/postgresql/array_test.rb +339 -0
  39. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
  40. data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
  41. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
  42. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
  43. data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
  44. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  45. data/test/cases/adapters/postgresql/collation_test.rb +53 -0
  46. data/test/cases/adapters/postgresql/composite_test.rb +132 -0
  47. data/test/cases/adapters/postgresql/connection_test.rb +257 -0
  48. data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
  49. data/test/cases/adapters/postgresql/domain_test.rb +47 -0
  50. data/test/cases/adapters/postgresql/enum_test.rb +91 -0
  51. data/test/cases/adapters/postgresql/explain_test.rb +20 -0
  52. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
  53. data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
  54. data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
  55. data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
  56. data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
  57. data/test/cases/adapters/postgresql/integer_test.rb +25 -0
  58. data/test/cases/adapters/postgresql/json_test.rb +237 -0
  59. data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
  60. data/test/cases/adapters/postgresql/money_test.rb +96 -0
  61. data/test/cases/adapters/postgresql/network_test.rb +94 -0
  62. data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
  63. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
  64. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  65. data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
  66. data/test/cases/adapters/postgresql/range_test.rb +343 -0
  67. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
  68. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
  69. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
  70. data/test/cases/adapters/postgresql/schema_test.rb +597 -0
  71. data/test/cases/adapters/postgresql/serial_test.rb +154 -0
  72. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
  73. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
  74. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
  75. data/test/cases/adapters/postgresql/utils_test.rb +62 -0
  76. data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
  77. data/test/cases/adapters/postgresql/xml_test.rb +54 -0
  78. data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
  79. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
  80. data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
  81. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
  82. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
  83. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  84. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
  85. data/test/cases/aggregations_test.rb +11 -1
  86. data/test/cases/ar_schema_test.rb +35 -50
  87. data/test/cases/associations/association_scope_test.rb +1 -6
  88. data/test/cases/associations/belongs_to_associations_test.rb +122 -10
  89. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
  90. data/test/cases/associations/callbacks_test.rb +5 -7
  91. data/test/cases/associations/cascaded_eager_loading_test.rb +1 -1
  92. data/test/cases/associations/eager_load_nested_include_test.rb +1 -3
  93. data/test/cases/associations/eager_test.rb +176 -73
  94. data/test/cases/associations/extension_test.rb +7 -2
  95. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +104 -32
  96. data/test/cases/associations/has_many_associations_test.rb +382 -43
  97. data/test/cases/associations/has_many_through_associations_test.rb +108 -41
  98. data/test/cases/associations/has_one_associations_test.rb +105 -8
  99. data/test/cases/associations/has_one_through_associations_test.rb +6 -3
  100. data/test/cases/associations/inner_join_association_test.rb +3 -3
  101. data/test/cases/associations/inverse_associations_test.rb +51 -11
  102. data/test/cases/associations/join_model_test.rb +59 -36
  103. data/test/cases/associations/left_outer_join_association_test.rb +88 -0
  104. data/test/cases/associations/nested_through_associations_test.rb +2 -2
  105. data/test/cases/associations/required_test.rb +25 -5
  106. data/test/cases/associations_test.rb +39 -34
  107. data/test/cases/attribute_decorators_test.rb +9 -8
  108. data/test/cases/attribute_methods/read_test.rb +5 -5
  109. data/test/cases/attribute_methods_test.rb +97 -40
  110. data/test/cases/attribute_set_test.rb +74 -4
  111. data/test/cases/attribute_test.rb +84 -18
  112. data/test/cases/attributes_test.rb +151 -34
  113. data/test/cases/autosave_association_test.rb +149 -36
  114. data/test/cases/base_test.rb +311 -236
  115. data/test/cases/batches_test.rb +299 -22
  116. data/test/cases/binary_test.rb +2 -10
  117. data/test/cases/bind_parameter_test.rb +76 -66
  118. data/test/cases/cache_key_test.rb +26 -0
  119. data/test/cases/calculations_test.rb +167 -15
  120. data/test/cases/callbacks_test.rb +161 -68
  121. data/test/cases/coders/json_test.rb +15 -0
  122. data/test/cases/collection_cache_key_test.rb +115 -0
  123. data/test/cases/column_definition_test.rb +26 -57
  124. data/test/cases/comment_test.rb +145 -0
  125. data/test/cases/connection_adapters/adapter_leasing_test.rb +5 -3
  126. data/test/cases/connection_adapters/connection_handler_test.rb +128 -21
  127. data/test/cases/connection_adapters/connection_specification_test.rb +1 -1
  128. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +0 -38
  129. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -1
  130. data/test/cases/connection_adapters/schema_cache_test.rb +8 -3
  131. data/test/cases/connection_adapters/type_lookup_test.rb +15 -7
  132. data/test/cases/connection_management_test.rb +46 -56
  133. data/test/cases/connection_pool_test.rb +195 -20
  134. data/test/cases/connection_specification/resolver_test.rb +15 -0
  135. data/test/cases/counter_cache_test.rb +10 -5
  136. data/test/cases/custom_locking_test.rb +1 -1
  137. data/test/cases/database_statements_test.rb +18 -3
  138. data/test/cases/{invalid_date_test.rb → date_test.rb} +13 -1
  139. data/test/cases/date_time_precision_test.rb +107 -0
  140. data/test/cases/defaults_test.rb +85 -89
  141. data/test/cases/dirty_test.rb +32 -44
  142. data/test/cases/disconnected_test.rb +4 -2
  143. data/test/cases/enum_test.rb +178 -24
  144. data/test/cases/errors_test.rb +16 -0
  145. data/test/cases/explain_test.rb +32 -21
  146. data/test/cases/finder_test.rb +279 -151
  147. data/test/cases/fixture_set/file_test.rb +18 -0
  148. data/test/cases/fixtures_test.rb +123 -32
  149. data/test/cases/forbidden_attributes_protection_test.rb +69 -3
  150. data/test/cases/helper.rb +10 -16
  151. data/test/cases/hot_compatibility_test.rb +89 -1
  152. data/test/cases/inheritance_test.rb +284 -53
  153. data/test/cases/integration_test.rb +23 -7
  154. data/test/cases/invalid_connection_test.rb +4 -2
  155. data/test/cases/invertible_migration_test.rb +124 -32
  156. data/test/cases/json_serialization_test.rb +11 -2
  157. data/test/cases/locking_test.rb +22 -6
  158. data/test/cases/log_subscriber_test.rb +106 -17
  159. data/test/cases/migration/change_schema_test.rb +118 -132
  160. data/test/cases/migration/change_table_test.rb +34 -2
  161. data/test/cases/migration/column_attributes_test.rb +7 -23
  162. data/test/cases/migration/column_positioning_test.rb +8 -8
  163. data/test/cases/migration/columns_test.rb +17 -11
  164. data/test/cases/migration/command_recorder_test.rb +47 -2
  165. data/test/cases/migration/compatibility_test.rb +118 -0
  166. data/test/cases/migration/create_join_table_test.rb +21 -12
  167. data/test/cases/migration/foreign_key_test.rb +68 -66
  168. data/test/cases/migration/index_test.rb +14 -12
  169. data/test/cases/migration/logger_test.rb +1 -1
  170. data/test/cases/migration/pending_migrations_test.rb +0 -1
  171. data/test/cases/migration/references_foreign_key_test.rb +114 -107
  172. data/test/cases/migration/references_index_test.rb +4 -4
  173. data/test/cases/migration/references_statements_test.rb +26 -6
  174. data/test/cases/migration/rename_table_test.rb +25 -25
  175. data/test/cases/migration_test.rb +279 -81
  176. data/test/cases/migrator_test.rb +91 -8
  177. data/test/cases/mixin_test.rb +0 -2
  178. data/test/cases/modules_test.rb +3 -4
  179. data/test/cases/multiparameter_attributes_test.rb +24 -2
  180. data/test/cases/multiple_db_test.rb +18 -11
  181. data/test/cases/nested_attributes_test.rb +74 -33
  182. data/test/cases/persistence_test.rb +102 -10
  183. data/test/cases/pooled_connections_test.rb +3 -3
  184. data/test/cases/primary_keys_test.rb +170 -31
  185. data/test/cases/query_cache_test.rb +216 -96
  186. data/test/cases/quoting_test.rb +65 -19
  187. data/test/cases/readonly_test.rb +2 -1
  188. data/test/cases/reflection_test.rb +77 -22
  189. data/test/cases/relation/delegation_test.rb +3 -8
  190. data/test/cases/relation/merging_test.rb +10 -14
  191. data/test/cases/relation/mutation_test.rb +42 -24
  192. data/test/cases/relation/or_test.rb +92 -0
  193. data/test/cases/relation/predicate_builder_test.rb +4 -2
  194. data/test/cases/relation/record_fetch_warning_test.rb +40 -0
  195. data/test/cases/relation/where_chain_test.rb +23 -99
  196. data/test/cases/relation/where_clause_test.rb +182 -0
  197. data/test/cases/relation/where_test.rb +45 -23
  198. data/test/cases/relation_test.rb +89 -58
  199. data/test/cases/relations_test.rb +249 -38
  200. data/test/cases/result_test.rb +10 -0
  201. data/test/cases/sanitize_test.rb +108 -15
  202. data/test/cases/schema_dumper_test.rb +119 -125
  203. data/test/cases/schema_loading_test.rb +52 -0
  204. data/test/cases/scoping/default_scoping_test.rb +113 -39
  205. data/test/cases/scoping/named_scoping_test.rb +46 -9
  206. data/test/cases/scoping/relation_scoping_test.rb +47 -4
  207. data/test/cases/secure_token_test.rb +32 -0
  208. data/test/cases/serialization_test.rb +1 -1
  209. data/test/cases/serialized_attribute_test.rb +93 -6
  210. data/test/cases/statement_cache_test.rb +38 -0
  211. data/test/cases/store_test.rb +2 -1
  212. data/test/cases/suppressor_test.rb +63 -0
  213. data/test/cases/tasks/database_tasks_test.rb +74 -8
  214. data/test/cases/tasks/mysql_rake_test.rb +143 -109
  215. data/test/cases/tasks/postgresql_rake_test.rb +71 -12
  216. data/test/cases/tasks/sqlite_rake_test.rb +30 -3
  217. data/test/cases/test_case.rb +28 -20
  218. data/test/cases/test_fixtures_test.rb +36 -0
  219. data/test/cases/time_precision_test.rb +103 -0
  220. data/test/cases/timestamp_test.rb +47 -14
  221. data/test/cases/touch_later_test.rb +121 -0
  222. data/test/cases/transaction_callbacks_test.rb +128 -62
  223. data/test/cases/transaction_isolation_test.rb +2 -2
  224. data/test/cases/transactions_test.rb +61 -43
  225. data/test/cases/type/adapter_specific_registry_test.rb +133 -0
  226. data/test/cases/type/date_time_test.rb +14 -0
  227. data/test/cases/type/integer_test.rb +2 -96
  228. data/test/cases/type/string_test.rb +0 -14
  229. data/test/cases/type_test.rb +39 -0
  230. data/test/cases/types_test.rb +1 -118
  231. data/test/cases/unconnected_test.rb +1 -1
  232. data/test/cases/validations/absence_validation_test.rb +73 -0
  233. data/test/cases/validations/association_validation_test.rb +13 -2
  234. data/test/cases/validations/i18n_validation_test.rb +6 -10
  235. data/test/cases/validations/length_validation_test.rb +62 -30
  236. data/test/cases/validations/presence_validation_test.rb +36 -1
  237. data/test/cases/validations/uniqueness_validation_test.rb +150 -36
  238. data/test/cases/validations_repair_helper.rb +2 -6
  239. data/test/cases/validations_test.rb +36 -7
  240. data/test/cases/view_test.rb +108 -5
  241. data/test/cases/yaml_serialization_test.rb +36 -1
  242. data/test/config.example.yml +97 -0
  243. data/test/fixtures/bad_posts.yml +9 -0
  244. data/test/fixtures/books.yml +20 -0
  245. data/test/fixtures/content.yml +3 -0
  246. data/test/fixtures/content_positions.yml +3 -0
  247. data/test/fixtures/dead_parrots.yml +5 -0
  248. data/test/fixtures/live_parrots.yml +4 -0
  249. data/test/fixtures/naked/yml/parrots.yml +2 -0
  250. data/test/fixtures/naked/yml/trees.yml +3 -0
  251. data/test/fixtures/nodes.yml +29 -0
  252. data/test/fixtures/other_comments.yml +6 -0
  253. data/test/fixtures/other_dogs.yml +2 -0
  254. data/test/fixtures/other_posts.yml +7 -0
  255. data/test/fixtures/price_estimates.yml +10 -1
  256. data/test/fixtures/trees.yml +3 -0
  257. data/test/migrations/10_urban/9_add_expressions.rb +1 -1
  258. data/test/migrations/decimal/1_give_me_big_numbers.rb +1 -1
  259. data/test/migrations/magic/1_currencies_have_symbols.rb +1 -1
  260. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -2
  261. data/test/migrations/missing/1_people_have_last_names.rb +2 -2
  262. data/test/migrations/missing/3_we_need_reminders.rb +2 -2
  263. data/test/migrations/missing/4_innocent_jointable.rb +2 -2
  264. data/test/migrations/rename/1_we_need_things.rb +2 -2
  265. data/test/migrations/rename/2_rename_things.rb +2 -2
  266. data/test/migrations/to_copy/1_people_have_hobbies.rb +1 -1
  267. data/test/migrations/to_copy/2_people_have_descriptions.rb +1 -1
  268. data/test/migrations/to_copy2/1_create_articles.rb +1 -1
  269. data/test/migrations/to_copy2/2_create_comments.rb +1 -1
  270. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +1 -1
  271. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +1 -1
  272. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +1 -1
  273. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +1 -1
  274. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +1 -1
  275. data/test/migrations/valid/1_valid_people_have_last_names.rb +1 -1
  276. data/test/migrations/valid/2_we_need_reminders.rb +2 -2
  277. data/test/migrations/valid/3_innocent_jointable.rb +2 -2
  278. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +1 -1
  279. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -2
  280. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +2 -2
  281. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +1 -1
  282. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +1 -1
  283. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +1 -1
  284. data/test/migrations/version_check/20131219224947_migration_version_check.rb +1 -1
  285. data/test/models/admin/randomly_named_c1.rb +6 -2
  286. data/test/models/aircraft.rb +1 -0
  287. data/test/models/author.rb +4 -7
  288. data/test/models/bird.rb +1 -1
  289. data/test/models/book.rb +5 -0
  290. data/test/models/bulb.rb +2 -1
  291. data/test/models/car.rb +3 -0
  292. data/test/models/cat.rb +10 -0
  293. data/test/models/chef.rb +5 -0
  294. data/test/models/club.rb +2 -0
  295. data/test/models/comment.rb +17 -5
  296. data/test/models/company.rb +7 -2
  297. data/test/models/company_in_module.rb +1 -1
  298. data/test/models/contact.rb +1 -1
  299. data/test/models/content.rb +40 -0
  300. data/test/models/customer.rb +8 -2
  301. data/test/models/developer.rb +22 -0
  302. data/test/models/face.rb +1 -1
  303. data/test/models/guitar.rb +4 -0
  304. data/test/models/hotel.rb +5 -0
  305. data/test/models/member.rb +1 -0
  306. data/test/models/member_detail.rb +4 -3
  307. data/test/models/mentor.rb +3 -0
  308. data/test/models/mocktail_designer.rb +2 -0
  309. data/test/models/node.rb +5 -0
  310. data/test/models/non_primary_key.rb +2 -0
  311. data/test/models/notification.rb +3 -0
  312. data/test/models/other_dog.rb +5 -0
  313. data/test/models/owner.rb +4 -1
  314. data/test/models/parrot.rb +6 -7
  315. data/test/models/person.rb +0 -1
  316. data/test/models/pet.rb +3 -0
  317. data/test/models/pet_treasure.rb +6 -0
  318. data/test/models/pirate.rb +3 -3
  319. data/test/models/post.rb +18 -9
  320. data/test/models/project.rb +11 -0
  321. data/test/models/randomly_named_c1.rb +1 -1
  322. data/test/models/recipe.rb +3 -0
  323. data/test/models/ship.rb +8 -2
  324. data/test/models/tag.rb +6 -0
  325. data/test/models/topic.rb +2 -8
  326. data/test/models/tree.rb +3 -0
  327. data/test/models/tuning_peg.rb +4 -0
  328. data/test/models/user.rb +14 -0
  329. data/test/models/uuid_item.rb +6 -0
  330. data/test/schema/mysql2_specific_schema.rb +33 -23
  331. data/test/schema/oracle_specific_schema.rb +1 -4
  332. data/test/schema/postgresql_specific_schema.rb +36 -124
  333. data/test/schema/schema.rb +183 -64
  334. data/test/schema/schema.rb.original +1057 -0
  335. data/test/schema/sqlite_specific_schema.rb +1 -5
  336. data/test/support/connection.rb +1 -0
  337. data/test/support/schema_dumping_helper.rb +1 -1
  338. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  339. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  340. metadata +145 -26
  341. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
  342. data/test/cases/attribute_methods/serialization_test.rb +0 -29
  343. data/test/cases/migration/change_schema_test - Copy.rb +0 -448
  344. data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
  345. data/test/cases/migration/table_and_index_test.rb +0 -24
  346. data/test/cases/relation/where_test2.rb +0 -36
  347. data/test/cases/type/decimal_test.rb +0 -51
  348. data/test/cases/type/unsigned_integer_test.rb +0 -18
  349. data/test/cases/xml_serialization_test.rb +0 -457
  350. data/test/fixtures/naked/csv/accounts.csv +0 -1
  351. data/test/schema/mysql_specific_schema.rb +0 -70
@@ -2,11 +2,11 @@ require "cases/helper"
2
2
  require "cases/migration/helper"
3
3
 
4
4
  class MigratorTest < ActiveRecord::TestCase
5
- self.use_transactional_fixtures = false
5
+ self.use_transactional_tests = false
6
6
 
7
7
  # Use this class to sense if migrations have gone
8
8
  # up or down.
9
- class Sensor < ActiveRecord::Migration
9
+ class Sensor < ActiveRecord::Migration::Current
10
10
  attr_reader :went_up, :went_down
11
11
 
12
12
  def initialize name = self.class.name, version = nil
@@ -123,6 +123,67 @@ class MigratorTest < ActiveRecord::TestCase
123
123
  assert_equal migration_list.last, migrations.first
124
124
  end
125
125
 
126
+ def test_migrations_status
127
+ path = MIGRATIONS_ROOT + "/valid"
128
+
129
+ ActiveRecord::SchemaMigration.create(version: 2)
130
+ ActiveRecord::SchemaMigration.create(version: 10)
131
+
132
+ assert_equal [
133
+ ["down", "001", "Valid people have last names"],
134
+ ["up", "002", "We need reminders"],
135
+ ["down", "003", "Innocent jointable"],
136
+ ["up", "010", "********** NO FILE **********"],
137
+ ], ActiveRecord::Migrator.migrations_status(path)
138
+ end
139
+
140
+ def test_migrations_status_in_subdirectories
141
+ path = MIGRATIONS_ROOT + "/valid_with_subdirectories"
142
+
143
+ ActiveRecord::SchemaMigration.create(version: 2)
144
+ ActiveRecord::SchemaMigration.create(version: 10)
145
+
146
+ assert_equal [
147
+ ["down", "001", "Valid people have last names"],
148
+ ["up", "002", "We need reminders"],
149
+ ["down", "003", "Innocent jointable"],
150
+ ["up", "010", "********** NO FILE **********"],
151
+ ], ActiveRecord::Migrator.migrations_status(path)
152
+ end
153
+
154
+ def test_migrations_status_with_schema_define_in_subdirectories
155
+ path = MIGRATIONS_ROOT + "/valid_with_subdirectories"
156
+ prev_paths = ActiveRecord::Migrator.migrations_paths
157
+ ActiveRecord::Migrator.migrations_paths = path
158
+
159
+ ActiveRecord::Schema.define(version: 3) do
160
+ end
161
+
162
+ assert_equal [
163
+ ["up", "001", "Valid people have last names"],
164
+ ["up", "002", "We need reminders"],
165
+ ["up", "003", "Innocent jointable"],
166
+ ], ActiveRecord::Migrator.migrations_status(path)
167
+ ensure
168
+ ActiveRecord::Migrator.migrations_paths = prev_paths
169
+ end
170
+
171
+ def test_migrations_status_from_two_directories
172
+ paths = [MIGRATIONS_ROOT + "/valid_with_timestamps", MIGRATIONS_ROOT + "/to_copy_with_timestamps"]
173
+
174
+ ActiveRecord::SchemaMigration.create(version: "20100101010101")
175
+ ActiveRecord::SchemaMigration.create(version: "20160528010101")
176
+
177
+ assert_equal [
178
+ ["down", "20090101010101", "People have hobbies"],
179
+ ["down", "20090101010202", "People have descriptions"],
180
+ ["up", "20100101010101", "Valid with timestamps people have last names"],
181
+ ["down", "20100201010101", "Valid with timestamps we need reminders"],
182
+ ["down", "20100301010101", "Valid with timestamps innocent jointable"],
183
+ ["up", "20160528010101", "********** NO FILE **********"],
184
+ ], ActiveRecord::Migrator.migrations_status(paths)
185
+ end
186
+
126
187
  def test_migrator_interleaved_migrations
127
188
  pass_one = [Sensor.new('One', 1)]
128
189
 
@@ -149,7 +210,7 @@ class MigratorTest < ActiveRecord::TestCase
149
210
  def test_up_calls_up
150
211
  migrations = [Sensor.new(nil, 0), Sensor.new(nil, 1), Sensor.new(nil, 2)]
151
212
  ActiveRecord::Migrator.new(:up, migrations).migrate
152
- assert migrations.all? { |m| m.went_up }
213
+ assert migrations.all?(&:went_up)
153
214
  assert migrations.all? { |m| !m.went_down }
154
215
  assert_equal 2, ActiveRecord::Migrator.current_version
155
216
  end
@@ -160,7 +221,7 @@ class MigratorTest < ActiveRecord::TestCase
160
221
  migrations = [Sensor.new(nil, 0), Sensor.new(nil, 1), Sensor.new(nil, 2)]
161
222
  ActiveRecord::Migrator.new(:down, migrations).migrate
162
223
  assert migrations.all? { |m| !m.went_up }
163
- assert migrations.all? { |m| m.went_down }
224
+ assert migrations.all?(&:went_down)
164
225
  assert_equal 0, ActiveRecord::Migrator.current_version
165
226
  end
166
227
 
@@ -237,6 +298,7 @@ class MigratorTest < ActiveRecord::TestCase
237
298
  def test_migrator_verbosity
238
299
  _, migrations = sensors(3)
239
300
 
301
+ ActiveRecord::Migration.verbose = true
240
302
  ActiveRecord::Migrator.new(:up, migrations, 1).migrate
241
303
  assert_not_equal 0, ActiveRecord::Migration.message_count
242
304
 
@@ -249,7 +311,6 @@ class MigratorTest < ActiveRecord::TestCase
249
311
  def test_migrator_verbosity_off
250
312
  _, migrations = sensors(3)
251
313
 
252
- ActiveRecord::Migration.message_count = 0
253
314
  ActiveRecord::Migration.verbose = false
254
315
  ActiveRecord::Migrator.new(:up, migrations, 1).migrate
255
316
  assert_equal 0, ActiveRecord::Migration.message_count
@@ -290,6 +351,27 @@ class MigratorTest < ActiveRecord::TestCase
290
351
  assert_equal [[:up, 1], [:up, 2], [:up, 3]], calls
291
352
  end
292
353
 
354
+ def test_migrator_output_when_running_multiple_migrations
355
+ _, migrator = migrator_class(3)
356
+
357
+ result = migrator.migrate("valid")
358
+ assert_equal(3, result.count)
359
+
360
+ # Nothing migrated from duplicate run
361
+ result = migrator.migrate("valid")
362
+ assert_equal(0, result.count)
363
+
364
+ result = migrator.rollback("valid")
365
+ assert_equal(1, result.count)
366
+ end
367
+
368
+ def test_migrator_output_when_running_single_migration
369
+ _, migrator = migrator_class(1)
370
+ result = migrator.run(:up, "valid", 1)
371
+
372
+ assert_equal(1, result.version)
373
+ end
374
+
293
375
  def test_migrator_rollback
294
376
  _, migrator = migrator_class(3)
295
377
 
@@ -312,10 +394,11 @@ class MigratorTest < ActiveRecord::TestCase
312
394
  def test_migrator_db_has_no_schema_migrations_table
313
395
  _, migrator = migrator_class(3)
314
396
 
315
- ActiveRecord::Base.connection.execute("DROP TABLE schema_migrations")
316
- assert_not ActiveRecord::Base.connection.table_exists?('schema_migrations')
397
+ ActiveRecord::Base.connection.drop_table "schema_migrations"
398
+ #, if_exists: true
399
+ ActiveSupport::Deprecation.silence { assert_not ActiveRecord::Base.connection.table_exists?('schema_migrations') }
317
400
  migrator.migrate("valid", 1)
318
- assert ActiveRecord::Base.connection.table_exists?('schema_migrations')
401
+ ActiveSupport::Deprecation.silence { assert ActiveRecord::Base.connection.table_exists?('schema_migrations') }
319
402
  end
320
403
 
321
404
  def test_migrator_forward
@@ -61,8 +61,6 @@ class TouchTest < ActiveRecord::TestCase
61
61
 
62
62
  # Make sure Mixin.record_timestamps gets reset, even if this test fails,
63
63
  # so that other tests do not fail because Mixin.record_timestamps == false
64
- rescue Exception => e
65
- raise e
66
64
  ensure
67
65
  Mixin.record_timestamps = true
68
66
  end
@@ -63,17 +63,16 @@ class ModulesTest < ActiveRecord::TestCase
63
63
  def test_assign_ids
64
64
  firm = MyApplication::Business::Firm.first
65
65
 
66
- assert_nothing_raised NameError, "Should be able to resolve all class constants via reflection" do
66
+ assert_nothing_raised do
67
67
  firm.client_ids = [MyApplication::Business::Client.first.id]
68
68
  end
69
69
  end
70
70
 
71
- # need to add an eager loading condition to force the eager loading model into
72
- # the old join model, to test that. See http://dev.rubyonrails.org/ticket/9640
71
+ # An eager loading condition to force the eager loading model into the old join model.
73
72
  def test_eager_loading_in_modules
74
73
  clients = []
75
74
 
76
- assert_nothing_raised NameError, "Should be able to resolve all class constants via reflection" do
75
+ assert_nothing_raised do
77
76
  clients << MyApplication::Business::Client.references(:accounts).merge!(:includes => {:firm => :account}, :where => 'accounts.id IS NOT NULL').find(3)
78
77
  clients << MyApplication::Business::Client.includes(:firm => :account).find(3)
79
78
  end
@@ -199,6 +199,7 @@ class MultiParameterAttributeTest < ActiveRecord::TestCase
199
199
 
200
200
  def test_multiparameter_attributes_on_time_with_time_zone_aware_attributes
201
201
  with_timezone_config default: :utc, aware_attributes: true, zone: -28800 do
202
+ Topic.reset_column_information
202
203
  attributes = {
203
204
  "written_on(1i)" => "2004", "written_on(2i)" => "6", "written_on(3i)" => "24",
204
205
  "written_on(4i)" => "16", "written_on(5i)" => "24", "written_on(6i)" => "00"
@@ -209,6 +210,22 @@ class MultiParameterAttributeTest < ActiveRecord::TestCase
209
210
  assert_equal Time.utc(2004, 6, 24, 16, 24, 0), topic.written_on.time
210
211
  assert_equal Time.zone, topic.written_on.time_zone
211
212
  end
213
+ ensure
214
+ Topic.reset_column_information
215
+ end
216
+
217
+ def test_multiparameter_attributes_on_time_with_time_zone_aware_attributes_and_invalid_time_params
218
+ with_timezone_config aware_attributes: true do
219
+ Topic.reset_column_information
220
+ attributes = {
221
+ "written_on(1i)" => "2004", "written_on(2i)" => "", "written_on(3i)" => ""
222
+ }
223
+ topic = Topic.find(1)
224
+ topic.attributes = attributes
225
+ assert_nil topic.written_on
226
+ end
227
+ ensure
228
+ Topic.reset_column_information
212
229
  end
213
230
 
214
231
  def test_multiparameter_attributes_on_time_with_time_zone_aware_attributes_false
@@ -227,6 +244,7 @@ class MultiParameterAttributeTest < ActiveRecord::TestCase
227
244
  def test_multiparameter_attributes_on_time_with_skip_time_zone_conversion_for_attributes
228
245
  with_timezone_config default: :utc, aware_attributes: true, zone: -28800 do
229
246
  Topic.skip_time_zone_conversion_for_attributes = [:written_on]
247
+ Topic.reset_column_information
230
248
  attributes = {
231
249
  "written_on(1i)" => "2004", "written_on(2i)" => "6", "written_on(3i)" => "24",
232
250
  "written_on(4i)" => "16", "written_on(5i)" => "24", "written_on(6i)" => "00"
@@ -238,21 +256,25 @@ class MultiParameterAttributeTest < ActiveRecord::TestCase
238
256
  end
239
257
  ensure
240
258
  Topic.skip_time_zone_conversion_for_attributes = []
259
+ Topic.reset_column_information
241
260
  end
242
261
 
243
262
  # Oracle does not have a TIME datatype.
244
263
  unless current_adapter?(:OracleAdapter)
245
264
  def test_multiparameter_attributes_on_time_only_column_with_time_zone_aware_attributes_does_not_do_time_zone_conversion
246
265
  with_timezone_config default: :utc, aware_attributes: true, zone: -28800 do
266
+ Topic.reset_column_information
247
267
  attributes = {
248
268
  "bonus_time(1i)" => "2000", "bonus_time(2i)" => "1", "bonus_time(3i)" => "1",
249
269
  "bonus_time(4i)" => "16", "bonus_time(5i)" => "24"
250
270
  }
251
271
  topic = Topic.find(1)
252
272
  topic.attributes = attributes
253
- assert_equal Time.utc(2000, 1, 1, 16, 24, 0), topic.bonus_time
254
- assert topic.bonus_time.utc?
273
+ assert_equal Time.zone.local(2000, 1, 1, 16, 24, 0), topic.bonus_time
274
+ assert_not topic.bonus_time.utc?
255
275
  end
276
+ ensure
277
+ Topic.reset_column_information
256
278
  end
257
279
  end
258
280
 
@@ -4,7 +4,7 @@ require 'models/bird'
4
4
  require 'models/course'
5
5
 
6
6
  class MultipleDbTest < ActiveRecord::TestCase
7
- self.use_transactional_fixtures = false
7
+ self.use_transactional_tests = false
8
8
 
9
9
  def setup
10
10
  @courses = create_fixtures("courses") { Course.retrieve_connection }
@@ -24,6 +24,13 @@ class MultipleDbTest < ActiveRecord::TestCase
24
24
  assert_equal(ActiveRecord::Base.connection, Entrant.connection)
25
25
  end
26
26
 
27
+ def test_swapping_the_connection
28
+ old_spec_name, Course.connection_specification_name = Course.connection_specification_name, "primary"
29
+ assert_equal(Entrant.connection, Course.connection)
30
+ ensure
31
+ Course.connection_specification_name = old_spec_name
32
+ end
33
+
27
34
  def test_find
28
35
  c1 = Course.find(1)
29
36
  assert_equal "Ruby Development", c1.name
@@ -89,22 +96,22 @@ class MultipleDbTest < ActiveRecord::TestCase
89
96
  end
90
97
 
91
98
  def test_connection
92
- assert_equal Entrant.arel_engine.connection, Bird.arel_engine.connection
93
- assert_not_equal Entrant.arel_engine.connection, Course.arel_engine.connection
94
- end
95
-
96
- def test_count_on_custom_connection
97
- ActiveRecord::Base.remove_connection
98
- assert_equal 1, College.count
99
- ensure
100
- ActiveRecord::Base.establish_connection :arunit
99
+ assert_equal Entrant.arel_engine.connection.object_id, Bird.arel_engine.connection.object_id
100
+ assert_not_equal Entrant.arel_engine.connection.object_id, Course.arel_engine.connection.object_id
101
101
  end
102
102
 
103
103
  unless in_memory_db?
104
+ def test_count_on_custom_connection
105
+ ActiveRecord::Base.remove_connection
106
+ assert_equal 1, College.count
107
+ ensure
108
+ ActiveRecord::Base.establish_connection :arunit
109
+ end
110
+
104
111
  def test_associations_should_work_when_model_has_no_connection
105
112
  begin
106
113
  ActiveRecord::Base.remove_connection
107
- assert_nothing_raised ActiveRecord::ConnectionNotEstablished do
114
+ assert_nothing_raised do
108
115
  College.first.courses.first
109
116
  end
110
117
  ensure
@@ -13,7 +13,7 @@ require 'active_support/hash_with_indifferent_access'
13
13
 
14
14
  class TestNestedAttributesInGeneral < ActiveRecord::TestCase
15
15
  teardown do
16
- Pirate.accepts_nested_attributes_for :ship, :allow_destroy => true, :reject_if => proc { |attributes| attributes.empty? }
16
+ Pirate.accepts_nested_attributes_for :ship, :allow_destroy => true, :reject_if => proc(&:empty?)
17
17
  end
18
18
 
19
19
  def test_base_should_have_an_empty_nested_attributes_options
@@ -61,6 +61,13 @@ class TestNestedAttributesInGeneral < ActiveRecord::TestCase
61
61
  assert_equal "No association found for name `honesty'. Has it been defined yet?", exception.message
62
62
  end
63
63
 
64
+ def test_should_raise_an_UnknownAttributeError_for_non_existing_nested_attributes
65
+ exception = assert_raise ActiveModel::UnknownAttributeError do
66
+ Pirate.new(:ship_attributes => { :sail => true })
67
+ end
68
+ assert_equal "unknown attribute 'sail' for Ship.", exception.message
69
+ end
70
+
64
71
  def test_should_disable_allow_destroy_by_default
65
72
  Pirate.accepts_nested_attributes_for :ship
66
73
 
@@ -69,7 +76,7 @@ class TestNestedAttributesInGeneral < ActiveRecord::TestCase
69
76
 
70
77
  pirate.update(ship_attributes: { '_destroy' => true, :id => ship.id })
71
78
 
72
- assert_nothing_raised(ActiveRecord::RecordNotFound) { pirate.ship.reload }
79
+ assert_nothing_raised { pirate.ship.reload }
73
80
  end
74
81
 
75
82
  def test_a_model_should_respond_to_underscore_destroy_and_return_if_it_is_marked_for_destruction
@@ -146,6 +153,19 @@ class TestNestedAttributesInGeneral < ActiveRecord::TestCase
146
153
  assert man.reload.interests.empty?
147
154
  end
148
155
 
156
+ def test_reject_if_is_not_short_circuited_if_allow_destroy_is_false
157
+ Pirate.accepts_nested_attributes_for :ship, reject_if: ->(a) { a[:name] == "The Golden Hind" }, allow_destroy: false
158
+
159
+ pirate = Pirate.create!(catchphrase: "Stop wastin' me time", ship_attributes: { name: "White Pearl", _destroy: "1" })
160
+ assert_equal "White Pearl", pirate.reload.ship.name
161
+
162
+ pirate.update!(ship_attributes: { id: pirate.ship.id, name: "The Golden Hind", _destroy: "1" })
163
+ assert_equal "White Pearl", pirate.reload.ship.name
164
+
165
+ pirate.update!(ship_attributes: { id: pirate.ship.id, name: "Black Pearl", _destroy: "1" })
166
+ assert_equal "Black Pearl", pirate.reload.ship.name
167
+ end
168
+
149
169
  def test_has_many_association_updating_a_single_record
150
170
  Man.accepts_nested_attributes_for(:interests)
151
171
  man = Man.create(name: 'John')
@@ -160,7 +180,7 @@ class TestNestedAttributesInGeneral < ActiveRecord::TestCase
160
180
 
161
181
  pirate = Pirate.new(:catchphrase => "Stop wastin' me time")
162
182
  pirate.ship_attributes = { :id => "" }
163
- assert_nothing_raised(ActiveRecord::RecordNotFound) { pirate.save! }
183
+ assert_nothing_raised { pirate.save! }
164
184
  end
165
185
 
166
186
  def test_first_and_array_index_zero_methods_return_the_same_value_when_nested_attributes_are_set_to_update_existing_record
@@ -273,10 +293,11 @@ class TestNestedAttributesOnAHasOneAssociation < ActiveRecord::TestCase
273
293
  end
274
294
 
275
295
  def test_should_modify_an_existing_record_if_there_is_a_matching_composite_id
276
- @ship.stubs(:id).returns('ABC1X')
277
- @pirate.ship_attributes = { :id => @ship.id, :name => 'Davy Jones Gold Dagger' }
296
+ @ship.stub(:id, 'ABC1X') do
297
+ @pirate.ship_attributes = { :id => @ship.id, :name => 'Davy Jones Gold Dagger' }
278
298
 
279
- assert_equal 'Davy Jones Gold Dagger', @pirate.ship.name
299
+ assert_equal 'Davy Jones Gold Dagger', @pirate.ship.name
300
+ end
280
301
  end
281
302
 
282
303
  def test_should_destroy_an_existing_record_if_there_is_a_matching_id_and_destroy_is_truthy
@@ -300,13 +321,13 @@ class TestNestedAttributesOnAHasOneAssociation < ActiveRecord::TestCase
300
321
  end
301
322
 
302
323
  def test_should_not_destroy_an_existing_record_if_allow_destroy_is_false
303
- Pirate.accepts_nested_attributes_for :ship, :allow_destroy => false, :reject_if => proc { |attributes| attributes.empty? }
324
+ Pirate.accepts_nested_attributes_for :ship, :allow_destroy => false, :reject_if => proc(&:empty?)
304
325
 
305
326
  @pirate.update(ship_attributes: { id: @pirate.ship.id, _destroy: '1' })
306
327
 
307
328
  assert_equal @ship, @pirate.reload.ship
308
329
 
309
- Pirate.accepts_nested_attributes_for :ship, :allow_destroy => true, :reject_if => proc { |attributes| attributes.empty? }
330
+ Pirate.accepts_nested_attributes_for :ship, :allow_destroy => true, :reject_if => proc(&:empty?)
310
331
  end
311
332
 
312
333
  def test_should_also_work_with_a_HashWithIndifferentAccess
@@ -457,10 +478,11 @@ class TestNestedAttributesOnABelongsToAssociation < ActiveRecord::TestCase
457
478
  end
458
479
 
459
480
  def test_should_modify_an_existing_record_if_there_is_a_matching_composite_id
460
- @pirate.stubs(:id).returns('ABC1X')
461
- @ship.pirate_attributes = { :id => @pirate.id, :catchphrase => 'Arr' }
481
+ @pirate.stub(:id, 'ABC1X') do
482
+ @ship.pirate_attributes = { :id => @pirate.id, :catchphrase => 'Arr' }
462
483
 
463
- assert_equal 'Arr', @ship.pirate.catchphrase
484
+ assert_equal 'Arr', @ship.pirate.catchphrase
485
+ end
464
486
  end
465
487
 
466
488
  def test_should_destroy_an_existing_record_if_there_is_a_matching_id_and_destroy_is_truthy
@@ -489,17 +511,17 @@ class TestNestedAttributesOnABelongsToAssociation < ActiveRecord::TestCase
489
511
  def test_should_not_destroy_an_existing_record_if_destroy_is_not_truthy
490
512
  [nil, '0', 0, 'false', false].each do |not_truth|
491
513
  @ship.update(pirate_attributes: { id: @ship.pirate.id, _destroy: not_truth })
492
- assert_nothing_raised(ActiveRecord::RecordNotFound) { @ship.pirate.reload }
514
+ assert_nothing_raised { @ship.pirate.reload }
493
515
  end
494
516
  end
495
517
 
496
518
  def test_should_not_destroy_an_existing_record_if_allow_destroy_is_false
497
- Ship.accepts_nested_attributes_for :pirate, :allow_destroy => false, :reject_if => proc { |attributes| attributes.empty? }
519
+ Ship.accepts_nested_attributes_for :pirate, :allow_destroy => false, :reject_if => proc(&:empty?)
498
520
 
499
521
  @ship.update(pirate_attributes: { id: @ship.pirate.id, _destroy: '1' })
500
- assert_nothing_raised(ActiveRecord::RecordNotFound) { @ship.pirate.reload }
522
+ assert_nothing_raised { @ship.pirate.reload }
501
523
  ensure
502
- Ship.accepts_nested_attributes_for :pirate, :allow_destroy => true, :reject_if => proc { |attributes| attributes.empty? }
524
+ Ship.accepts_nested_attributes_for :pirate, :allow_destroy => true, :reject_if => proc(&:empty?)
503
525
  end
504
526
 
505
527
  def test_should_work_with_update_as_well
@@ -514,7 +536,7 @@ class TestNestedAttributesOnABelongsToAssociation < ActiveRecord::TestCase
514
536
  pirate = @ship.pirate
515
537
 
516
538
  @ship.attributes = { :pirate_attributes => { :id => pirate.id, '_destroy' => true } }
517
- assert_nothing_raised(ActiveRecord::RecordNotFound) { Pirate.find(pirate.id) }
539
+ assert_nothing_raised { Pirate.find(pirate.id) }
518
540
  @ship.save
519
541
  assert_raise(ActiveRecord::RecordNotFound) { Pirate.find(pirate.id) }
520
542
  end
@@ -567,6 +589,13 @@ module NestedAttributesOnACollectionAssociationTests
567
589
  assert_respond_to @pirate, association_setter
568
590
  end
569
591
 
592
+ def test_should_raise_an_UnknownAttributeError_for_non_existing_nested_attributes_for_has_many
593
+ exception = assert_raise ActiveModel::UnknownAttributeError do
594
+ @pirate.parrots_attributes = [{ peg_leg: true }]
595
+ end
596
+ assert_equal "unknown attribute 'peg_leg' for Parrot.", exception.message
597
+ end
598
+
570
599
  def test_should_save_only_one_association_on_create
571
600
  pirate = Pirate.create!({
572
601
  :catchphrase => 'Arr',
@@ -638,17 +667,19 @@ module NestedAttributesOnACollectionAssociationTests
638
667
  end
639
668
 
640
669
  def test_should_take_a_hash_with_composite_id_keys_and_assign_the_attributes_to_the_associated_models
641
- @child_1.stubs(:id).returns('ABC1X')
642
- @child_2.stubs(:id).returns('ABC2X')
643
-
644
- @pirate.attributes = {
645
- association_getter => [
646
- { :id => @child_1.id, :name => 'Grace OMalley' },
647
- { :id => @child_2.id, :name => 'Privateers Greed' }
648
- ]
649
- }
670
+ @child_1.stub(:id, 'ABC1X') do
671
+ @child_2.stub(:id, 'ABC2X') do
672
+
673
+ @pirate.attributes = {
674
+ association_getter => [
675
+ { :id => @child_1.id, :name => 'Grace OMalley' },
676
+ { :id => @child_2.id, :name => 'Privateers Greed' }
677
+ ]
678
+ }
650
679
 
651
- assert_equal ['Grace OMalley', 'Privateers Greed'], [@child_1.name, @child_2.name]
680
+ assert_equal ['Grace OMalley', 'Privateers Greed'], [@child_1.name, @child_2.name]
681
+ end
682
+ end
652
683
  end
653
684
 
654
685
  def test_should_raise_RecordNotFound_if_an_id_is_given_but_doesnt_return_a_record
@@ -658,6 +689,16 @@ module NestedAttributesOnACollectionAssociationTests
658
689
  assert_equal "Couldn't find #{@child_1.class.name} with ID=1234567890 for Pirate with ID=#{@pirate.id}", exception.message
659
690
  end
660
691
 
692
+ def test_should_raise_RecordNotFound_if_an_id_belonging_to_a_different_record_is_given
693
+ other_pirate = Pirate.create! catchphrase: 'Ahoy!'
694
+ other_child = other_pirate.send(@association_name).create! name: 'Buccaneers Servant'
695
+
696
+ exception = assert_raise ActiveRecord::RecordNotFound do
697
+ @pirate.attributes = { association_getter => [{ id: other_child.id }] }
698
+ end
699
+ assert_equal "Couldn't find #{@child_1.class.name} with ID=#{other_child.id} for Pirate with ID=#{@pirate.id}", exception.message
700
+ end
701
+
661
702
  def test_should_automatically_build_new_associated_models_for_each_entry_in_a_hash_where_the_id_is_missing
662
703
  @pirate.send(@association_name).destroy_all
663
704
  @pirate.reload.attributes = {
@@ -672,7 +713,7 @@ module NestedAttributesOnACollectionAssociationTests
672
713
  end
673
714
 
674
715
  def test_should_not_assign_destroy_key_to_a_record
675
- assert_nothing_raised ActiveRecord::UnknownAttributeError do
716
+ assert_nothing_raised do
676
717
  @pirate.send(association_setter, { 'foo' => { '_destroy' => '0' }})
677
718
  end
678
719
  end
@@ -707,8 +748,8 @@ module NestedAttributesOnACollectionAssociationTests
707
748
  end
708
749
 
709
750
  def test_should_raise_an_argument_error_if_something_else_than_a_hash_is_passed
710
- assert_nothing_raised(ArgumentError) { @pirate.send(association_setter, {}) }
711
- assert_nothing_raised(ArgumentError) { @pirate.send(association_setter, Hash.new) }
751
+ assert_nothing_raised { @pirate.send(association_setter, {}) }
752
+ assert_nothing_raised { @pirate.send(association_setter, Hash.new) }
712
753
 
713
754
  exception = assert_raise ArgumentError do
714
755
  @pirate.send(association_setter, "foo")
@@ -783,7 +824,7 @@ module NestedAttributesOnACollectionAssociationTests
783
824
 
784
825
  def test_can_use_symbols_as_object_identifier
785
826
  @pirate.attributes = { :parrots_attributes => { :foo => { :name => 'Lovely Day' }, :bar => { :name => 'Blown Away' } } }
786
- assert_nothing_raised(NoMethodError) { @pirate.save! }
827
+ assert_nothing_raised { @pirate.save! }
787
828
  end
788
829
 
789
830
  def test_numeric_column_changes_from_zero_to_no_empty_string
@@ -855,7 +896,7 @@ end
855
896
 
856
897
  module NestedAttributesLimitTests
857
898
  def teardown
858
- Pirate.accepts_nested_attributes_for :parrots, :allow_destroy => true, :reject_if => proc { |attributes| attributes.empty? }
899
+ Pirate.accepts_nested_attributes_for :parrots, :allow_destroy => true, :reject_if => proc(&:empty?)
859
900
  end
860
901
 
861
902
  def test_limit_with_less_records
@@ -943,7 +984,7 @@ class TestNestedAttributesWithNonStandardPrimaryKeys < ActiveRecord::TestCase
943
984
  end
944
985
 
945
986
  class TestHasOneAutosaveAssociationWhichItselfHasAutosaveAssociations < ActiveRecord::TestCase
946
- self.use_transactional_fixtures = false unless supports_savepoints?
987
+ self.use_transactional_tests = false unless supports_savepoints?
947
988
 
948
989
  def setup
949
990
  @pirate = Pirate.create!(:catchphrase => "My baby takes tha mornin' train!")
@@ -983,7 +1024,7 @@ class TestHasOneAutosaveAssociationWhichItselfHasAutosaveAssociations < ActiveRe
983
1024
  end
984
1025
 
985
1026
  class TestHasManyAutosaveAssociationWhichItselfHasAutosaveAssociations < ActiveRecord::TestCase
986
- self.use_transactional_fixtures = false unless supports_savepoints?
1027
+ self.use_transactional_tests = false unless supports_savepoints?
987
1028
 
988
1029
  def setup
989
1030
  @ship = Ship.create!(:name => "The good ship Dollypop")