ibm_db 3.0.0-x86-mingw32 → 3.0.1-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (465) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -0
  3. data/MANIFEST +14 -14
  4. data/README +225 -225
  5. data/ext/Makefile.nt32 +181 -181
  6. data/ext/Makefile.nt32.191 +212 -212
  7. data/ext/OLD/extconf.rb +264 -0
  8. data/ext/{extconf_MacOS.rb → OLD/extconf_MacOS.rb} +269 -269
  9. data/ext/extconf.rb +291 -264
  10. data/ext/ibm_db.c +2 -2
  11. data/ext/ruby_ibm_db.h +241 -241
  12. data/ext/ruby_ibm_db_cli.h +500 -500
  13. data/init.rb +41 -41
  14. data/lib/IBM_DB.rb +27 -27
  15. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +4 -4
  16. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +1 -1
  17. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  18. data/lib/mswin32/ibm_db.rb +115 -115
  19. data/test/active_record/connection_adapters/fake_adapter.rb +46 -0
  20. data/test/assets/example.log +1 -0
  21. data/test/assets/flowers.jpg +0 -0
  22. data/test/assets/test.txt +1 -0
  23. data/test/cases/adapter_test.rb +261 -207
  24. data/test/cases/aggregations_test.rb +158 -0
  25. data/test/cases/ar_schema_test.rb +161 -0
  26. data/test/cases/associations/association_scope_test.rb +21 -0
  27. data/test/cases/associations/belongs_to_associations_test.rb +1029 -711
  28. data/test/cases/associations/callbacks_test.rb +192 -0
  29. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -181
  30. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +26 -0
  31. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -0
  32. data/test/cases/associations/eager_load_nested_include_test.rb +128 -0
  33. data/test/cases/associations/eager_singularization_test.rb +148 -0
  34. data/test/cases/associations/eager_test.rb +1411 -0
  35. data/test/cases/associations/extension_test.rb +82 -0
  36. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +932 -851
  37. data/test/cases/associations/has_many_associations_test.rb +2162 -0
  38. data/test/cases/associations/has_many_through_associations_test.rb +1204 -0
  39. data/test/cases/associations/has_one_associations_test.rb +610 -0
  40. data/test/cases/associations/has_one_through_associations_test.rb +380 -0
  41. data/test/cases/associations/inner_join_association_test.rb +139 -0
  42. data/test/cases/associations/inverse_associations_test.rb +693 -0
  43. data/test/cases/associations/join_model_test.rb +754 -743
  44. data/test/cases/associations/nested_through_associations_test.rb +579 -0
  45. data/test/cases/associations/required_test.rb +82 -0
  46. data/test/cases/associations_test.rb +380 -0
  47. data/test/cases/attribute_decorators_test.rb +125 -0
  48. data/test/cases/attribute_methods/read_test.rb +60 -0
  49. data/test/cases/attribute_methods/serialization_test.rb +29 -0
  50. data/test/cases/attribute_methods_test.rb +952 -822
  51. data/test/cases/attribute_set_test.rb +200 -0
  52. data/test/cases/attribute_test.rb +180 -0
  53. data/test/cases/attributes_test.rb +136 -0
  54. data/test/cases/autosave_association_test.rb +1595 -0
  55. data/test/cases/base_test.rb +1638 -2133
  56. data/test/cases/batches_test.rb +212 -0
  57. data/test/cases/binary_test.rb +52 -0
  58. data/test/cases/bind_parameter_test.rb +100 -0
  59. data/test/cases/calculations_test.rb +646 -482
  60. data/test/cases/callbacks_test.rb +543 -0
  61. data/test/cases/clone_test.rb +40 -0
  62. data/test/cases/coders/yaml_column_test.rb +63 -0
  63. data/test/cases/column_alias_test.rb +17 -0
  64. data/test/cases/column_definition_test.rb +123 -0
  65. data/test/cases/connection_adapters/adapter_leasing_test.rb +54 -0
  66. data/test/cases/connection_adapters/connection_handler_test.rb +53 -0
  67. data/test/cases/connection_adapters/connection_specification_test.rb +12 -0
  68. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +293 -0
  69. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +65 -0
  70. data/test/cases/connection_adapters/quoting_test.rb +13 -0
  71. data/test/cases/connection_adapters/schema_cache_test.rb +56 -0
  72. data/test/cases/connection_adapters/type_lookup_test.rb +110 -0
  73. data/test/cases/connection_management_test.rb +122 -0
  74. data/test/cases/connection_pool_test.rb +346 -0
  75. data/test/cases/connection_specification/resolver_test.rb +116 -0
  76. data/test/cases/core_test.rb +112 -0
  77. data/test/cases/counter_cache_test.rb +209 -0
  78. data/test/cases/custom_locking_test.rb +17 -0
  79. data/test/cases/database_statements_test.rb +19 -0
  80. data/test/cases/date_time_test.rb +61 -0
  81. data/test/cases/defaults_test.rb +223 -0
  82. data/test/cases/dirty_test.rb +775 -0
  83. data/test/cases/disconnected_test.rb +28 -0
  84. data/test/cases/dup_test.rb +157 -0
  85. data/test/cases/enum_test.rb +290 -0
  86. data/test/cases/explain_subscriber_test.rb +64 -0
  87. data/test/cases/explain_test.rb +76 -0
  88. data/test/cases/finder_respond_to_test.rb +60 -0
  89. data/test/cases/finder_test.rb +1166 -0
  90. data/test/cases/fixture_set/file_test.rb +138 -0
  91. data/test/cases/fixtures_test.rb +897 -0
  92. data/test/cases/forbidden_attributes_protection_test.rb +99 -0
  93. data/test/cases/habtm_destroy_order_test.rb +61 -0
  94. data/test/cases/helper.rb +210 -0
  95. data/test/cases/hot_compatibility_test.rb +54 -0
  96. data/test/cases/i18n_test.rb +45 -0
  97. data/test/cases/inheritance_test.rb +375 -0
  98. data/test/cases/integration_test.rb +139 -0
  99. data/test/cases/invalid_connection_test.rb +22 -0
  100. data/test/cases/invalid_date_test.rb +32 -0
  101. data/test/cases/invertible_migration_test.rb +295 -0
  102. data/test/cases/json_serialization_test.rb +302 -0
  103. data/test/cases/locking_test.rb +477 -0
  104. data/test/cases/log_subscriber_test.rb +136 -0
  105. data/test/cases/migration/change_schema_test - Copy.rb +448 -0
  106. data/test/cases/migration/change_schema_test.rb +472 -0
  107. data/test/cases/migration/change_table_test.rb +224 -0
  108. data/test/cases/migration/column_attributes_test.rb +192 -0
  109. data/test/cases/migration/column_positioning_test.rb +56 -0
  110. data/test/cases/migration/columns_test.rb +304 -0
  111. data/test/cases/migration/command_recorder_test.rb +305 -0
  112. data/test/cases/migration/create_join_table_test.rb +148 -0
  113. data/test/cases/migration/foreign_key_test - Changed.rb +325 -0
  114. data/test/cases/migration/foreign_key_test.rb +360 -0
  115. data/test/cases/migration/helper.rb +39 -0
  116. data/test/cases/migration/index_test.rb +216 -0
  117. data/test/cases/migration/logger_test.rb +36 -0
  118. data/test/cases/migration/pending_migrations_test.rb +53 -0
  119. data/test/cases/migration/references_foreign_key_test.rb +214 -0
  120. data/test/cases/migration/references_index_test.rb +101 -0
  121. data/test/cases/migration/references_statements_test.rb +116 -0
  122. data/test/cases/migration/rename_table_test.rb +93 -0
  123. data/test/cases/migration/table_and_index_test.rb +24 -0
  124. data/test/cases/migration_test.rb +959 -2408
  125. data/test/cases/migrator_test.rb +388 -0
  126. data/test/cases/mixin_test.rb +70 -0
  127. data/test/cases/modules_test.rb +173 -0
  128. data/test/cases/multiparameter_attributes_test.rb +350 -0
  129. data/test/cases/multiple_db_test.rb +115 -0
  130. data/test/cases/nested_attributes_test.rb +1057 -0
  131. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -0
  132. data/test/cases/persistence_test.rb +909 -642
  133. data/test/cases/pooled_connections_test.rb +81 -0
  134. data/test/cases/primary_keys_test.rb +237 -0
  135. data/test/cases/query_cache_test.rb +326 -257
  136. data/test/cases/quoting_test.rb +156 -0
  137. data/test/cases/readonly_test.rb +118 -0
  138. data/test/cases/reaper_test.rb +85 -0
  139. data/test/cases/reflection_test.rb +454 -0
  140. data/test/cases/relation/delegation_test.rb +68 -0
  141. data/test/cases/relation/merging_test.rb +161 -0
  142. data/test/cases/relation/mutation_test.rb +165 -0
  143. data/test/cases/relation/predicate_builder_test.rb +14 -0
  144. data/test/cases/relation/where_chain_test.rb +181 -0
  145. data/test/cases/relation/where_test.rb +300 -0
  146. data/test/cases/relation/where_test2.rb +36 -0
  147. data/test/cases/relation_test.rb +297 -0
  148. data/test/cases/relations_test.rb +1815 -1182
  149. data/test/cases/reload_models_test.rb +22 -0
  150. data/test/cases/result_test.rb +80 -0
  151. data/test/cases/sanitize_test.rb +83 -0
  152. data/test/cases/schema_dumper_test.rb +463 -256
  153. data/test/cases/scoping/default_scoping_test.rb +454 -0
  154. data/test/cases/scoping/named_scoping_test.rb +524 -0
  155. data/test/cases/scoping/relation_scoping_test.rb +357 -0
  156. data/test/cases/serialization_test.rb +104 -0
  157. data/test/cases/serialized_attribute_test.rb +277 -0
  158. data/test/cases/statement_cache_test.rb +98 -0
  159. data/test/cases/store_test.rb +194 -0
  160. data/test/cases/tasks/database_tasks_test.rb +396 -0
  161. data/test/cases/tasks/mysql_rake_test.rb +311 -0
  162. data/test/cases/tasks/postgresql_rake_test.rb +245 -0
  163. data/test/cases/tasks/sqlite_rake_test.rb +193 -0
  164. data/test/cases/test_case.rb +123 -0
  165. data/test/cases/timestamp_test.rb +468 -0
  166. data/test/cases/transaction_callbacks_test.rb +452 -300
  167. data/test/cases/transaction_isolation_test.rb +106 -0
  168. data/test/cases/transactions_test.rb +817 -0
  169. data/test/cases/type/decimal_test.rb +51 -0
  170. data/test/cases/type/integer_test.rb +121 -0
  171. data/test/cases/type/string_test.rb +36 -0
  172. data/test/cases/type/type_map_test.rb +177 -0
  173. data/test/cases/type/unsigned_integer_test.rb +18 -0
  174. data/test/cases/types_test.rb +141 -0
  175. data/test/cases/unconnected_test.rb +33 -0
  176. data/test/cases/validations/association_validation_test.rb +86 -0
  177. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -0
  178. data/test/cases/validations/i18n_validation_test.rb +90 -0
  179. data/test/cases/validations/length_validation_test.rb +47 -0
  180. data/test/cases/validations/presence_validation_test.rb +68 -0
  181. data/test/cases/validations/uniqueness_validation_test.rb +434 -299
  182. data/test/cases/validations_repair_helper.rb +23 -0
  183. data/test/cases/validations_test.rb +165 -0
  184. data/test/cases/view_test.rb +113 -0
  185. data/test/cases/xml_serialization_test.rb +457 -408
  186. data/test/cases/yaml_serialization_test.rb +86 -0
  187. data/test/config.rb +5 -0
  188. data/test/config.yml +154 -154
  189. data/test/connections/native_ibm_db/connection.rb +43 -43
  190. data/test/fixtures/accounts.yml +29 -0
  191. data/test/fixtures/admin/accounts.yml +2 -0
  192. data/test/fixtures/admin/randomly_named_a9.yml +7 -0
  193. data/test/fixtures/admin/randomly_named_b0.yml +7 -0
  194. data/test/fixtures/admin/users.yml +10 -0
  195. data/test/fixtures/all/admin +1 -0
  196. data/test/fixtures/all/developers.yml +0 -0
  197. data/test/fixtures/all/people.yml +0 -0
  198. data/test/fixtures/all/tasks.yml +0 -0
  199. data/test/fixtures/author_addresses.yml +18 -0
  200. data/test/fixtures/author_favorites.yml +4 -0
  201. data/test/fixtures/authors.yml +23 -0
  202. data/test/fixtures/binaries.yml +133 -0
  203. data/test/fixtures/books.yml +11 -0
  204. data/test/fixtures/bulbs.yml +5 -0
  205. data/test/fixtures/cars.yml +9 -0
  206. data/test/fixtures/categories.yml +19 -0
  207. data/test/fixtures/categories/special_categories.yml +9 -0
  208. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
  209. data/test/fixtures/categories_ordered.yml +7 -0
  210. data/test/fixtures/categories_posts.yml +31 -0
  211. data/test/fixtures/categorizations.yml +23 -0
  212. data/test/fixtures/clubs.yml +8 -0
  213. data/test/fixtures/collections.yml +3 -0
  214. data/test/fixtures/colleges.yml +3 -0
  215. data/test/fixtures/comments.yml +65 -0
  216. data/test/fixtures/companies.yml +67 -0
  217. data/test/fixtures/computers.yml +10 -0
  218. data/test/fixtures/courses.yml +8 -0
  219. data/test/fixtures/customers.yml +26 -0
  220. data/test/fixtures/dashboards.yml +6 -0
  221. data/test/fixtures/developers.yml +22 -0
  222. data/test/fixtures/developers_projects.yml +17 -0
  223. data/test/fixtures/dog_lovers.yml +7 -0
  224. data/test/fixtures/dogs.yml +4 -0
  225. data/test/fixtures/doubloons.yml +3 -0
  226. data/test/fixtures/edges.yml +5 -0
  227. data/test/fixtures/entrants.yml +14 -0
  228. data/test/fixtures/essays.yml +6 -0
  229. data/test/fixtures/faces.yml +11 -0
  230. data/test/fixtures/fk_test_has_fk.yml +3 -0
  231. data/test/fixtures/fk_test_has_pk.yml +2 -0
  232. data/test/fixtures/friendships.yml +4 -0
  233. data/test/fixtures/funny_jokes.yml +10 -0
  234. data/test/fixtures/interests.yml +33 -0
  235. data/test/fixtures/items.yml +3 -0
  236. data/test/fixtures/jobs.yml +7 -0
  237. data/test/fixtures/legacy_things.yml +3 -0
  238. data/test/fixtures/mateys.yml +4 -0
  239. data/test/fixtures/member_details.yml +8 -0
  240. data/test/fixtures/member_types.yml +6 -0
  241. data/test/fixtures/members.yml +11 -0
  242. data/test/fixtures/memberships.yml +34 -0
  243. data/test/fixtures/men.yml +5 -0
  244. data/test/fixtures/minimalistics.yml +2 -0
  245. data/test/fixtures/minivans.yml +5 -0
  246. data/test/fixtures/mixed_case_monkeys.yml +6 -0
  247. data/test/fixtures/mixins.yml +29 -0
  248. data/test/fixtures/movies.yml +7 -0
  249. data/test/fixtures/naked/csv/accounts.csv +1 -0
  250. data/test/fixtures/naked/yml/accounts.yml +1 -0
  251. data/test/fixtures/naked/yml/companies.yml +1 -0
  252. data/test/fixtures/naked/yml/courses.yml +1 -0
  253. data/test/fixtures/organizations.yml +5 -0
  254. data/test/fixtures/other_topics.yml +42 -0
  255. data/test/fixtures/owners.yml +9 -0
  256. data/test/fixtures/parrots.yml +27 -0
  257. data/test/fixtures/parrots_pirates.yml +7 -0
  258. data/test/fixtures/people.yml +24 -0
  259. data/test/fixtures/peoples_treasures.yml +3 -0
  260. data/test/fixtures/pets.yml +19 -0
  261. data/test/fixtures/pirates.yml +12 -0
  262. data/test/fixtures/posts.yml +80 -0
  263. data/test/fixtures/price_estimates.yml +7 -0
  264. data/test/fixtures/products.yml +4 -0
  265. data/test/fixtures/projects.yml +7 -0
  266. data/test/fixtures/randomly_named_a9.yml +7 -0
  267. data/test/fixtures/ratings.yml +14 -0
  268. data/test/fixtures/readers.yml +11 -0
  269. data/test/fixtures/references.yml +17 -0
  270. data/test/fixtures/reserved_words/distinct.yml +5 -0
  271. data/test/fixtures/reserved_words/distinct_select.yml +11 -0
  272. data/test/fixtures/reserved_words/group.yml +14 -0
  273. data/test/fixtures/reserved_words/select.yml +8 -0
  274. data/test/fixtures/reserved_words/values.yml +7 -0
  275. data/test/fixtures/ships.yml +6 -0
  276. data/test/fixtures/speedometers.yml +8 -0
  277. data/test/fixtures/sponsors.yml +12 -0
  278. data/test/fixtures/string_key_objects.yml +7 -0
  279. data/test/fixtures/subscribers.yml +11 -0
  280. data/test/fixtures/subscriptions.yml +12 -0
  281. data/test/fixtures/taggings.yml +78 -0
  282. data/test/fixtures/tags.yml +11 -0
  283. data/test/fixtures/tasks.yml +7 -0
  284. data/test/fixtures/teapots.yml +3 -0
  285. data/test/fixtures/to_be_linked/accounts.yml +2 -0
  286. data/test/fixtures/to_be_linked/users.yml +10 -0
  287. data/test/fixtures/topics.yml +49 -0
  288. data/test/fixtures/toys.yml +14 -0
  289. data/test/fixtures/traffic_lights.yml +10 -0
  290. data/test/fixtures/treasures.yml +10 -0
  291. data/test/fixtures/uuid_children.yml +3 -0
  292. data/test/fixtures/uuid_parents.yml +2 -0
  293. data/test/fixtures/variants.yml +4 -0
  294. data/test/fixtures/vegetables.yml +20 -0
  295. data/test/fixtures/vertices.yml +4 -0
  296. data/test/fixtures/warehouse_things.yml +3 -0
  297. data/test/fixtures/zines.yml +5 -0
  298. data/test/ibm_db_test.rb +24 -24
  299. data/test/migrations/10_urban/9_add_expressions.rb +11 -0
  300. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -0
  301. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -0
  302. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -0
  303. data/test/migrations/missing/1_people_have_last_names.rb +9 -0
  304. data/test/migrations/missing/3_we_need_reminders.rb +12 -0
  305. data/test/migrations/missing/4_innocent_jointable.rb +12 -0
  306. data/test/migrations/rename/1_we_need_things.rb +11 -0
  307. data/test/migrations/rename/2_rename_things.rb +9 -0
  308. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -0
  309. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -0
  310. data/test/migrations/to_copy2/1_create_articles.rb +7 -0
  311. data/test/migrations/to_copy2/2_create_comments.rb +7 -0
  312. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -0
  313. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -0
  314. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -0
  315. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -0
  316. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -0
  317. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -0
  318. data/test/migrations/valid/2_we_need_reminders.rb +12 -0
  319. data/test/migrations/valid/3_innocent_jointable.rb +12 -0
  320. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -0
  321. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -0
  322. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -0
  323. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -0
  324. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -0
  325. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -0
  326. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -0
  327. data/test/models/admin.rb +5 -0
  328. data/test/models/admin/account.rb +3 -0
  329. data/test/models/admin/randomly_named_c1.rb +3 -0
  330. data/test/models/admin/user.rb +40 -0
  331. data/test/models/aircraft.rb +4 -0
  332. data/test/models/arunit2_model.rb +3 -0
  333. data/test/models/author.rb +212 -0
  334. data/test/models/auto_id.rb +4 -0
  335. data/test/models/autoloadable/extra_firm.rb +2 -0
  336. data/test/models/binary.rb +2 -0
  337. data/test/models/bird.rb +12 -0
  338. data/test/models/book.rb +18 -0
  339. data/test/models/boolean.rb +2 -0
  340. data/test/models/bulb.rb +51 -0
  341. data/test/models/cake_designer.rb +3 -0
  342. data/test/models/car.rb +26 -0
  343. data/test/models/carrier.rb +2 -0
  344. data/test/models/categorization.rb +19 -0
  345. data/test/models/category.rb +35 -0
  346. data/test/models/chef.rb +3 -0
  347. data/test/models/citation.rb +3 -0
  348. data/test/models/club.rb +23 -0
  349. data/test/models/college.rb +10 -0
  350. data/test/models/column.rb +3 -0
  351. data/test/models/column_name.rb +3 -0
  352. data/test/models/comment.rb +64 -0
  353. data/test/models/company.rb +225 -0
  354. data/test/models/company_in_module.rb +98 -0
  355. data/test/models/computer.rb +3 -0
  356. data/test/models/contact.rb +41 -0
  357. data/test/models/contract.rb +20 -0
  358. data/test/models/country.rb +7 -0
  359. data/test/models/course.rb +6 -0
  360. data/test/models/customer.rb +77 -0
  361. data/test/models/customer_carrier.rb +14 -0
  362. data/test/models/dashboard.rb +3 -0
  363. data/test/models/default.rb +2 -0
  364. data/test/models/department.rb +4 -0
  365. data/test/models/developer.rb +252 -0
  366. data/test/models/dog.rb +5 -0
  367. data/test/models/dog_lover.rb +5 -0
  368. data/test/models/doubloon.rb +12 -0
  369. data/test/models/drink_designer.rb +3 -0
  370. data/test/models/edge.rb +5 -0
  371. data/test/models/electron.rb +5 -0
  372. data/test/models/engine.rb +4 -0
  373. data/test/models/entrant.rb +3 -0
  374. data/test/models/essay.rb +5 -0
  375. data/test/models/event.rb +3 -0
  376. data/test/models/eye.rb +37 -0
  377. data/test/models/face.rb +9 -0
  378. data/test/models/friendship.rb +6 -0
  379. data/test/models/guid.rb +2 -0
  380. data/test/models/hotel.rb +6 -0
  381. data/test/models/image.rb +3 -0
  382. data/test/models/interest.rb +5 -0
  383. data/test/models/invoice.rb +4 -0
  384. data/test/models/item.rb +7 -0
  385. data/test/models/job.rb +7 -0
  386. data/test/models/joke.rb +7 -0
  387. data/test/models/keyboard.rb +3 -0
  388. data/test/models/legacy_thing.rb +3 -0
  389. data/test/models/lesson.rb +11 -0
  390. data/test/models/line_item.rb +3 -0
  391. data/test/models/liquid.rb +4 -0
  392. data/test/models/man.rb +11 -0
  393. data/test/models/matey.rb +4 -0
  394. data/test/models/member.rb +41 -0
  395. data/test/models/member_detail.rb +7 -0
  396. data/test/models/member_type.rb +3 -0
  397. data/test/models/membership.rb +35 -0
  398. data/test/models/minimalistic.rb +2 -0
  399. data/test/models/minivan.rb +9 -0
  400. data/test/models/mixed_case_monkey.rb +3 -0
  401. data/test/models/molecule.rb +6 -0
  402. data/test/models/movie.rb +5 -0
  403. data/test/models/order.rb +4 -0
  404. data/test/models/organization.rb +14 -0
  405. data/test/models/owner.rb +34 -0
  406. data/test/models/parrot.rb +29 -0
  407. data/test/models/person.rb +143 -0
  408. data/test/models/personal_legacy_thing.rb +4 -0
  409. data/test/models/pet.rb +15 -0
  410. data/test/models/pirate.rb +92 -0
  411. data/test/models/possession.rb +3 -0
  412. data/test/models/post.rb +264 -0
  413. data/test/models/price_estimate.rb +4 -0
  414. data/test/models/professor.rb +5 -0
  415. data/test/models/project.rb +29 -0
  416. data/test/models/publisher.rb +2 -0
  417. data/test/models/publisher/article.rb +4 -0
  418. data/test/models/publisher/magazine.rb +3 -0
  419. data/test/models/randomly_named_c1.rb +3 -0
  420. data/test/models/rating.rb +4 -0
  421. data/test/models/reader.rb +23 -0
  422. data/test/models/record.rb +2 -0
  423. data/test/models/reference.rb +22 -0
  424. data/test/models/reply.rb +61 -0
  425. data/test/models/ship.rb +33 -0
  426. data/test/models/ship_part.rb +8 -0
  427. data/test/models/shop.rb +17 -0
  428. data/test/models/shop_account.rb +6 -0
  429. data/test/models/speedometer.rb +6 -0
  430. data/test/models/sponsor.rb +7 -0
  431. data/test/models/string_key_object.rb +3 -0
  432. data/test/models/student.rb +4 -0
  433. data/test/models/subject.rb +16 -0
  434. data/test/models/subscriber.rb +8 -0
  435. data/test/models/subscription.rb +4 -0
  436. data/test/models/tag.rb +7 -0
  437. data/test/models/tagging.rb +13 -0
  438. data/test/models/task.rb +5 -0
  439. data/test/models/topic.rb +124 -0
  440. data/test/models/toy.rb +6 -0
  441. data/test/models/traffic_light.rb +4 -0
  442. data/test/models/treasure.rb +14 -0
  443. data/test/models/treaty.rb +7 -0
  444. data/test/models/tyre.rb +11 -0
  445. data/test/models/uuid_child.rb +3 -0
  446. data/test/models/uuid_parent.rb +3 -0
  447. data/test/models/vegetables.rb +24 -0
  448. data/test/models/vehicle.rb +7 -0
  449. data/test/models/vertex.rb +9 -0
  450. data/test/models/warehouse_thing.rb +5 -5
  451. data/test/models/wheel.rb +3 -0
  452. data/test/models/without_table.rb +3 -0
  453. data/test/models/zine.rb +3 -0
  454. data/test/schema/mysql2_specific_schema.rb +58 -0
  455. data/test/schema/mysql_specific_schema.rb +70 -0
  456. data/test/schema/oracle_specific_schema.rb +43 -0
  457. data/test/schema/postgresql_specific_schema.rb +202 -0
  458. data/test/schema/schema.rb +938 -751
  459. data/test/schema/sqlite_specific_schema.rb +22 -0
  460. data/test/support/config.rb +43 -0
  461. data/test/support/connection.rb +22 -0
  462. data/test/support/connection_helper.rb +14 -0
  463. data/test/support/ddl_helper.rb +8 -0
  464. data/test/support/schema_dumping_helper.rb +20 -0
  465. metadata +444 -18
@@ -0,0 +1,610 @@
1
+ require "cases/helper"
2
+ require 'models/developer'
3
+ require 'models/computer'
4
+ require 'models/project'
5
+ require 'models/company'
6
+ require 'models/ship'
7
+ require 'models/pirate'
8
+ require 'models/car'
9
+ require 'models/bulb'
10
+ require 'models/author'
11
+ require 'models/image'
12
+ require 'models/post'
13
+
14
+ class HasOneAssociationsTest < ActiveRecord::TestCase
15
+ self.use_transactional_fixtures = false unless supports_savepoints?
16
+ fixtures :accounts, :companies, :developers, :projects, :developers_projects, :ships, :pirates
17
+
18
+ def setup
19
+ Account.destroyed_account_ids.clear
20
+ end
21
+
22
+ def test_has_one
23
+ assert_equal companies(:first_firm).account, Account.find(1)
24
+ assert_equal Account.find(1).credit_limit, companies(:first_firm).account.credit_limit
25
+ end
26
+
27
+ def test_has_one_does_not_use_order_by
28
+ ActiveRecord::SQLCounter.clear_log
29
+ companies(:first_firm).account
30
+ ensure
31
+ assert ActiveRecord::SQLCounter.log_all.all? { |sql| /order by/i !~ sql }, 'ORDER BY was used in the query'
32
+ end
33
+
34
+ def test_has_one_cache_nils
35
+ firm = companies(:another_firm)
36
+ assert_queries(1) { assert_nil firm.account }
37
+ assert_queries(0) { assert_nil firm.account }
38
+
39
+ firms = Firm.all.merge!(:includes => :account).to_a
40
+ assert_queries(0) { firms.each(&:account) }
41
+ end
42
+
43
+ def test_with_select
44
+ assert_equal Firm.find(1).account_with_select.attributes.size, 2
45
+ assert_equal Firm.all.merge!(:includes => :account_with_select).find(1).account_with_select.attributes.size, 2
46
+ end
47
+
48
+ def test_finding_using_primary_key
49
+ firm = companies(:first_firm)
50
+ assert_equal Account.find_by_firm_id(firm.id), firm.account
51
+ firm.firm_id = companies(:rails_core).id
52
+ assert_equal accounts(:rails_core_account), firm.account_using_primary_key
53
+ end
54
+
55
+ def test_update_with_foreign_and_primary_keys
56
+ firm = companies(:first_firm)
57
+ account = firm.account_using_foreign_and_primary_keys
58
+ assert_equal Account.find_by_firm_name(firm.name), account
59
+ firm.save
60
+ firm.reload
61
+ assert_equal account, firm.account_using_foreign_and_primary_keys
62
+ end
63
+
64
+ def test_can_marshal_has_one_association_with_nil_target
65
+ firm = Firm.new
66
+ assert_nothing_raised do
67
+ assert_equal firm.attributes, Marshal.load(Marshal.dump(firm)).attributes
68
+ end
69
+
70
+ firm.account
71
+ assert_nothing_raised do
72
+ assert_equal firm.attributes, Marshal.load(Marshal.dump(firm)).attributes
73
+ end
74
+ end
75
+
76
+ def test_proxy_assignment
77
+ company = companies(:first_firm)
78
+ assert_nothing_raised { company.account = company.account }
79
+ end
80
+
81
+ def test_type_mismatch
82
+ assert_raise(ActiveRecord::AssociationTypeMismatch) { companies(:first_firm).account = 1 }
83
+ assert_raise(ActiveRecord::AssociationTypeMismatch) { companies(:first_firm).account = Project.find(1) }
84
+ end
85
+
86
+ def test_natural_assignment
87
+ apple = Firm.create("name" => "Apple")
88
+ citibank = Account.create("credit_limit" => 10)
89
+ apple.account = citibank
90
+ assert_equal apple.id, citibank.firm_id
91
+ end
92
+
93
+ def test_natural_assignment_to_nil
94
+ old_account_id = companies(:first_firm).account.id
95
+ companies(:first_firm).account = nil
96
+ companies(:first_firm).save
97
+ assert_nil companies(:first_firm).account
98
+ # account is dependent, therefore is destroyed when reference to owner is lost
99
+ assert_raise(ActiveRecord::RecordNotFound) { Account.find(old_account_id) }
100
+ end
101
+
102
+ def test_nullification_on_association_change
103
+ firm = companies(:rails_core)
104
+ old_account_id = firm.account.id
105
+ firm.account = Account.new(:credit_limit => 5)
106
+ # account is dependent with nullify, therefore its firm_id should be nil
107
+ assert_nil Account.find(old_account_id).firm_id
108
+ end
109
+
110
+ def test_natural_assignment_to_nil_after_destroy
111
+ firm = companies(:rails_core)
112
+ old_account_id = firm.account.id
113
+ firm.account.destroy
114
+ firm.account = nil
115
+ assert_nil companies(:rails_core).account
116
+ assert_raise(ActiveRecord::RecordNotFound) { Account.find(old_account_id) }
117
+ end
118
+
119
+ def test_association_change_calls_delete
120
+ companies(:first_firm).deletable_account = Account.new(:credit_limit => 5)
121
+ assert_equal [], Account.destroyed_account_ids[companies(:first_firm).id]
122
+ end
123
+
124
+ def test_association_change_calls_destroy
125
+ companies(:first_firm).account = Account.new(:credit_limit => 5)
126
+ assert_equal [companies(:first_firm).id], Account.destroyed_account_ids[companies(:first_firm).id]
127
+ end
128
+
129
+ def test_natural_assignment_to_already_associated_record
130
+ company = companies(:first_firm)
131
+ account = accounts(:signals37)
132
+ assert_equal company.account, account
133
+ company.account = account
134
+ company.reload
135
+ account.reload
136
+ assert_equal company.account, account
137
+ end
138
+
139
+ def test_dependence
140
+ num_accounts = Account.count
141
+
142
+ firm = Firm.find(1)
143
+ assert_not_nil firm.account
144
+ account_id = firm.account.id
145
+ assert_equal [], Account.destroyed_account_ids[firm.id]
146
+
147
+ firm.destroy
148
+ assert_equal num_accounts - 1, Account.count
149
+ assert_equal [account_id], Account.destroyed_account_ids[firm.id]
150
+ end
151
+
152
+ def test_exclusive_dependence
153
+ num_accounts = Account.count
154
+
155
+ firm = ExclusivelyDependentFirm.find(9)
156
+ assert_not_nil firm.account
157
+ assert_equal [], Account.destroyed_account_ids[firm.id]
158
+
159
+ firm.destroy
160
+ assert_equal num_accounts - 1, Account.count
161
+ assert_equal [], Account.destroyed_account_ids[firm.id]
162
+ end
163
+
164
+ def test_dependence_with_nil_associate
165
+ firm = DependentFirm.new(:name => 'nullify')
166
+ firm.save!
167
+ assert_nothing_raised { firm.destroy }
168
+ end
169
+
170
+ def test_restrict_with_exception
171
+ firm = RestrictedWithExceptionFirm.create!(:name => 'restrict')
172
+ firm.create_account(:credit_limit => 10)
173
+
174
+ assert_not_nil firm.account
175
+
176
+ assert_raise(ActiveRecord::DeleteRestrictionError) { firm.destroy }
177
+ assert RestrictedWithExceptionFirm.exists?(:name => 'restrict')
178
+ assert firm.account.present?
179
+ end
180
+
181
+ def test_restrict_with_error
182
+ firm = RestrictedWithErrorFirm.create!(:name => 'restrict')
183
+ firm.create_account(:credit_limit => 10)
184
+
185
+ assert_not_nil firm.account
186
+
187
+ firm.destroy
188
+
189
+ assert !firm.errors.empty?
190
+ assert_equal "Cannot delete record because a dependent account exists", firm.errors[:base].first
191
+ assert RestrictedWithErrorFirm.exists?(:name => 'restrict')
192
+ assert firm.account.present?
193
+ end
194
+
195
+ def test_successful_build_association
196
+ firm = Firm.new("name" => "GlobalMegaCorp")
197
+ firm.save
198
+
199
+ account = firm.build_account("credit_limit" => 1000)
200
+ assert account.save
201
+ assert_equal account, firm.account
202
+ end
203
+
204
+ def test_build_association_dont_create_transaction
205
+ assert_no_queries(ignore_none: false) {
206
+ Firm.new.build_account
207
+ }
208
+ end
209
+
210
+ def test_building_the_associated_object_with_implicit_sti_base_class
211
+ firm = DependentFirm.new
212
+ company = firm.build_company
213
+ assert_kind_of Company, company, "Expected #{company.class} to be a Company"
214
+ end
215
+
216
+ def test_building_the_associated_object_with_explicit_sti_base_class
217
+ firm = DependentFirm.new
218
+ company = firm.build_company(:type => "Company")
219
+ assert_kind_of Company, company, "Expected #{company.class} to be a Company"
220
+ end
221
+
222
+ def test_building_the_associated_object_with_sti_subclass
223
+ firm = DependentFirm.new
224
+ company = firm.build_company(:type => "Client")
225
+ assert_kind_of Client, company, "Expected #{company.class} to be a Client"
226
+ end
227
+
228
+ def test_building_the_associated_object_with_an_invalid_type
229
+ firm = DependentFirm.new
230
+ assert_raise(ActiveRecord::SubclassNotFound) { firm.build_company(:type => "Invalid") }
231
+ end
232
+
233
+ def test_building_the_associated_object_with_an_unrelated_type
234
+ firm = DependentFirm.new
235
+ assert_raise(ActiveRecord::SubclassNotFound) { firm.build_company(:type => "Account") }
236
+ end
237
+
238
+ def test_build_and_create_should_not_happen_within_scope
239
+ pirate = pirates(:blackbeard)
240
+ scoped_count = pirate.association(:foo_bulb).scope.where_values.count
241
+
242
+ bulb = pirate.build_foo_bulb
243
+ assert_not_equal scoped_count, bulb.scope_after_initialize.where_values.count
244
+
245
+ bulb = pirate.create_foo_bulb
246
+ assert_not_equal scoped_count, bulb.scope_after_initialize.where_values.count
247
+
248
+ bulb = pirate.create_foo_bulb!
249
+ assert_not_equal scoped_count, bulb.scope_after_initialize.where_values.count
250
+ end
251
+
252
+ def test_create_association
253
+ firm = Firm.create(:name => "GlobalMegaCorp")
254
+ account = firm.create_account(:credit_limit => 1000)
255
+ assert_equal account, firm.reload.account
256
+ end
257
+
258
+ def test_create_association_with_bang
259
+ firm = Firm.create(:name => "GlobalMegaCorp")
260
+ account = firm.create_account!(:credit_limit => 1000)
261
+ assert_equal account, firm.reload.account
262
+ end
263
+
264
+ def test_create_association_with_bang_failing
265
+ firm = Firm.create(:name => "GlobalMegaCorp")
266
+ assert_raise ActiveRecord::RecordInvalid do
267
+ firm.create_account!
268
+ end
269
+ account = firm.account
270
+ assert_not_nil account
271
+ account.credit_limit = 5
272
+ account.save
273
+ assert_equal account, firm.reload.account
274
+ end
275
+
276
+ def test_create_with_inexistent_foreign_key_failing
277
+ firm = Firm.create(name: 'GlobalMegaCorp')
278
+
279
+ assert_raises(ActiveRecord::UnknownAttributeError) do
280
+ firm.create_account_with_inexistent_foreign_key
281
+ end
282
+ end
283
+
284
+ def test_build
285
+ firm = Firm.new("name" => "GlobalMegaCorp")
286
+ firm.save
287
+
288
+ firm.account = account = Account.new("credit_limit" => 1000)
289
+ assert_equal account, firm.account
290
+ assert account.save
291
+ assert_equal account, firm.account
292
+ end
293
+
294
+ def test_create
295
+ firm = Firm.new("name" => "GlobalMegaCorp")
296
+ firm.save
297
+ firm.account = account = Account.create("credit_limit" => 1000)
298
+ assert_equal account, firm.account
299
+ end
300
+
301
+ def test_create_before_save
302
+ firm = Firm.new("name" => "GlobalMegaCorp")
303
+ firm.account = account = Account.create("credit_limit" => 1000)
304
+ assert_equal account, firm.account
305
+ end
306
+
307
+ def test_dependence_with_missing_association
308
+ Account.destroy_all
309
+ firm = Firm.find(1)
310
+ assert_nil firm.account
311
+ firm.destroy
312
+ end
313
+
314
+ def test_dependence_with_missing_association_and_nullify
315
+ Account.destroy_all
316
+ firm = DependentFirm.first
317
+ assert_nil firm.account
318
+ firm.destroy
319
+ end
320
+
321
+ def test_finding_with_interpolated_condition
322
+ firm = Firm.first
323
+ superior = firm.clients.create(:name => 'SuperiorCo')
324
+ superior.rating = 10
325
+ superior.save
326
+ assert_equal 10, firm.clients_with_interpolated_conditions.first.rating
327
+ end
328
+
329
+ def test_assignment_before_child_saved
330
+ firm = Firm.find(1)
331
+ firm.account = a = Account.new("credit_limit" => 1000)
332
+ assert a.persisted?
333
+ assert_equal a, firm.account
334
+ assert_equal a, firm.account
335
+ assert_equal a, firm.account(true)
336
+ end
337
+
338
+ def test_save_still_works_after_accessing_nil_has_one
339
+ jp = Company.new :name => 'Jaded Pixel'
340
+ jp.dummy_account.nil?
341
+
342
+ assert_nothing_raised do
343
+ jp.save!
344
+ end
345
+ end
346
+
347
+ def test_cant_save_readonly_association
348
+ assert_raise(ActiveRecord::ReadOnlyRecord) { companies(:first_firm).readonly_account.save! }
349
+ assert companies(:first_firm).readonly_account.readonly?
350
+ end
351
+
352
+ def test_has_one_proxy_should_not_respond_to_private_methods
353
+ assert_raise(NoMethodError) { accounts(:signals37).private_method }
354
+ assert_raise(NoMethodError) { companies(:first_firm).account.private_method }
355
+ end
356
+
357
+ def test_has_one_proxy_should_respond_to_private_methods_via_send
358
+ accounts(:signals37).send(:private_method)
359
+ companies(:first_firm).account.send(:private_method)
360
+ end
361
+
362
+ def test_save_of_record_with_loaded_has_one
363
+ @firm = companies(:first_firm)
364
+ assert_not_nil @firm.account
365
+
366
+ assert_nothing_raised do
367
+ Firm.find(@firm.id).save!
368
+ Firm.all.merge!(:includes => :account).find(@firm.id).save!
369
+ end
370
+
371
+ @firm.account.destroy
372
+
373
+ assert_nothing_raised do
374
+ Firm.find(@firm.id).save!
375
+ Firm.all.merge!(:includes => :account).find(@firm.id).save!
376
+ end
377
+ end
378
+
379
+ def test_build_respects_hash_condition
380
+ account = companies(:first_firm).build_account_limit_500_with_hash_conditions
381
+ assert account.save
382
+ assert_equal 500, account.credit_limit
383
+ end
384
+
385
+ def test_create_respects_hash_condition
386
+ account = companies(:first_firm).create_account_limit_500_with_hash_conditions
387
+ assert account.persisted?
388
+ assert_equal 500, account.credit_limit
389
+ end
390
+
391
+ def test_attributes_are_being_set_when_initialized_from_has_one_association_with_where_clause
392
+ new_account = companies(:first_firm).build_account(:firm_name => 'Account')
393
+ assert_equal new_account.firm_name, "Account"
394
+ end
395
+
396
+ def test_creation_failure_without_dependent_option
397
+ pirate = pirates(:blackbeard)
398
+ orig_ship = pirate.ship
399
+
400
+ assert_equal ships(:black_pearl), orig_ship
401
+ new_ship = pirate.create_ship
402
+ assert_not_equal ships(:black_pearl), new_ship
403
+ assert_equal new_ship, pirate.ship
404
+ assert new_ship.new_record?
405
+ assert_nil orig_ship.pirate_id
406
+ assert !orig_ship.changed? # check it was saved
407
+ end
408
+
409
+ def test_creation_failure_with_dependent_option
410
+ pirate = pirates(:blackbeard).becomes(DestructivePirate)
411
+ orig_ship = pirate.dependent_ship
412
+
413
+ new_ship = pirate.create_dependent_ship
414
+ assert new_ship.new_record?
415
+ assert orig_ship.destroyed?
416
+ end
417
+
418
+ def test_creation_failure_due_to_new_record_should_raise_error
419
+ pirate = pirates(:redbeard)
420
+ new_ship = Ship.new
421
+
422
+ error = assert_raise(ActiveRecord::RecordNotSaved) do
423
+ pirate.ship = new_ship
424
+ end
425
+
426
+ assert_equal "Failed to save the new associated ship.", error.message
427
+ assert_nil pirate.ship
428
+ assert_nil new_ship.pirate_id
429
+ end
430
+
431
+ def test_replacement_failure_due_to_existing_record_should_raise_error
432
+ pirate = pirates(:blackbeard)
433
+ pirate.ship.name = nil
434
+
435
+ assert !pirate.ship.valid?
436
+ error = assert_raise(ActiveRecord::RecordNotSaved) do
437
+ pirate.ship = ships(:interceptor)
438
+ end
439
+
440
+ assert_equal ships(:black_pearl), pirate.ship
441
+ assert_equal pirate.id, pirate.ship.pirate_id
442
+ assert_equal "Failed to remove the existing associated ship. " +
443
+ "The record failed to save after its foreign key was set to nil.", error.message
444
+ end
445
+
446
+ def test_replacement_failure_due_to_new_record_should_raise_error
447
+ pirate = pirates(:blackbeard)
448
+ new_ship = Ship.new
449
+
450
+ error = assert_raise(ActiveRecord::RecordNotSaved) do
451
+ pirate.ship = new_ship
452
+ end
453
+
454
+ assert_equal "Failed to save the new associated ship.", error.message
455
+ assert_equal ships(:black_pearl), pirate.ship
456
+ assert_equal pirate.id, pirate.ship.pirate_id
457
+ assert_equal pirate.id, ships(:black_pearl).reload.pirate_id
458
+ assert_nil new_ship.pirate_id
459
+ end
460
+
461
+ def test_association_keys_bypass_attribute_protection
462
+ car = Car.create(:name => 'honda')
463
+
464
+ bulb = car.build_bulb
465
+ assert_equal car.id, bulb.car_id
466
+
467
+ bulb = car.build_bulb :car_id => car.id + 1
468
+ assert_equal car.id, bulb.car_id
469
+
470
+ bulb = car.create_bulb
471
+ assert_equal car.id, bulb.car_id
472
+
473
+ bulb = car.create_bulb :car_id => car.id + 1
474
+ assert_equal car.id, bulb.car_id
475
+ end
476
+
477
+ def test_association_protect_foreign_key
478
+ pirate = Pirate.create!(:catchphrase => "Don' botharrr talkin' like one, savvy?")
479
+
480
+ ship = pirate.build_ship
481
+ assert_equal pirate.id, ship.pirate_id
482
+
483
+ ship = pirate.build_ship :pirate_id => pirate.id + 1
484
+ assert_equal pirate.id, ship.pirate_id
485
+
486
+ ship = pirate.create_ship
487
+ assert_equal pirate.id, ship.pirate_id
488
+
489
+ ship = pirate.create_ship :pirate_id => pirate.id + 1
490
+ assert_equal pirate.id, ship.pirate_id
491
+ end
492
+
493
+ def test_build_with_block
494
+ car = Car.create(:name => 'honda')
495
+
496
+ bulb = car.build_bulb{ |b| b.color = 'Red' }
497
+ assert_equal 'RED!', bulb.color
498
+ end
499
+
500
+ def test_create_with_block
501
+ car = Car.create(:name => 'honda')
502
+
503
+ bulb = car.create_bulb{ |b| b.color = 'Red' }
504
+ assert_equal 'RED!', bulb.color
505
+ end
506
+
507
+ def test_create_bang_with_block
508
+ car = Car.create(:name => 'honda')
509
+
510
+ bulb = car.create_bulb!{ |b| b.color = 'Red' }
511
+ assert_equal 'RED!', bulb.color
512
+ end
513
+
514
+ def test_association_attributes_are_available_to_after_initialize
515
+ car = Car.create(:name => 'honda')
516
+ bulb = car.create_bulb
517
+
518
+ assert_equal car.id, bulb.attributes_after_initialize['car_id']
519
+ end
520
+
521
+ def test_has_one_transaction
522
+ company = companies(:first_firm)
523
+ account = Account.find(1)
524
+
525
+ company.account # force loading
526
+ assert_no_queries { company.account = account }
527
+
528
+ company.account = nil
529
+ assert_no_queries { company.account = nil }
530
+ account = Account.find(2)
531
+ assert_queries { company.account = account }
532
+
533
+ assert_no_queries { Firm.new.account = account }
534
+ end
535
+
536
+ def test_has_one_assignment_dont_trigger_save_on_change_of_same_object
537
+ pirate = Pirate.create!(catchphrase: "Don' botharrr talkin' like one, savvy?")
538
+ ship = pirate.build_ship(name: 'old name')
539
+ ship.save!
540
+
541
+ ship.name = 'new name'
542
+ assert ship.changed?
543
+ assert_queries(1) do
544
+ # One query for updating name, not triggering query for updating pirate_id
545
+ pirate.ship = ship
546
+ end
547
+
548
+ assert_equal 'new name', pirate.ship.reload.name
549
+ end
550
+
551
+ def test_has_one_assignment_triggers_save_on_change_on_replacing_object
552
+ pirate = Pirate.create!(catchphrase: "Don' botharrr talkin' like one, savvy?")
553
+ ship = pirate.build_ship(name: 'old name')
554
+ ship.save!
555
+
556
+ new_ship = Ship.create(name: 'new name')
557
+ assert_queries(2) do
558
+ # One query for updating name and second query for updating pirate_id
559
+ pirate.ship = new_ship
560
+ end
561
+
562
+ assert_equal 'new name', pirate.ship.reload.name
563
+ end
564
+
565
+ def test_has_one_autosave_with_primary_key_manually_set
566
+ post = Post.create(id: 1234, title: "Some title", body: 'Some content')
567
+ author = Author.new(id: 33, name: 'Hank Moody')
568
+
569
+ author.post = post
570
+ author.save
571
+ author.reload
572
+
573
+ assert_not_nil author.post
574
+ assert_equal author.post, post
575
+ end
576
+
577
+ def test_has_one_loading_for_new_record
578
+ Post.create!(author_id: 42, title: 'foo', body: 'bar')
579
+ author = Author.new(id: 42)
580
+ assert author.post
581
+ end
582
+
583
+ def test_has_one_relationship_cannot_have_a_counter_cache
584
+ assert_raise(ArgumentError) do
585
+ Class.new(ActiveRecord::Base) do
586
+ has_one :thing, counter_cache: true
587
+ end
588
+ end
589
+ end
590
+
591
+ def test_with_polymorphic_has_one_with_custom_columns_name
592
+ post = Post.create! :title => 'foo', :body => 'bar'
593
+ image = Image.create!
594
+
595
+ post.main_image = image
596
+ post.reload
597
+
598
+ assert_equal image, post.main_image
599
+ end
600
+
601
+ test 'dangerous association name raises ArgumentError' do
602
+ [:errors, 'errors', :save, 'save'].each do |name|
603
+ assert_raises(ArgumentError, "Association #{name} should not be allowed") do
604
+ Class.new(ActiveRecord::Base) do
605
+ has_one name
606
+ end
607
+ end
608
+ end
609
+ end
610
+ end