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,173 @@
1
+ require "cases/helper"
2
+ require 'models/company_in_module'
3
+ require 'models/shop'
4
+ require 'models/developer'
5
+ require 'models/computer'
6
+
7
+ class ModulesTest < ActiveRecord::TestCase
8
+ fixtures :accounts, :companies, :projects, :developers, :collections, :products, :variants
9
+
10
+ def setup
11
+ # need to make sure Object::Firm and Object::Client are not defined,
12
+ # so that constantize will not be able to cheat when having to load namespaced classes
13
+ @undefined_consts = {}
14
+
15
+ [:Firm, :Client].each do |const|
16
+ @undefined_consts.merge! const => Object.send(:remove_const, const) if Object.const_defined?(const)
17
+ end
18
+
19
+ ActiveRecord::Base.store_full_sti_class = false
20
+ end
21
+
22
+ teardown do
23
+ # reinstate the constants that we undefined in the setup
24
+ @undefined_consts.each do |constant, value|
25
+ Object.send :const_set, constant, value unless value.nil?
26
+ end
27
+
28
+ ActiveRecord::Base.store_full_sti_class = true
29
+ end
30
+
31
+ def test_module_spanning_associations
32
+ firm = MyApplication::Business::Firm.first
33
+ assert !firm.clients.empty?, "Firm should have clients"
34
+ assert_nil firm.class.table_name.match('::'), "Firm shouldn't have the module appear in its table name"
35
+ end
36
+
37
+ def test_module_spanning_has_and_belongs_to_many_associations
38
+ project = MyApplication::Business::Project.first
39
+ project.developers << MyApplication::Business::Developer.create("name" => "John")
40
+ assert_equal "John", project.developers.last.name
41
+ end
42
+
43
+ def test_associations_spanning_cross_modules
44
+ account = MyApplication::Billing::Account.all.merge!(:order => 'id').first
45
+ assert_kind_of MyApplication::Business::Firm, account.firm
46
+ assert_kind_of MyApplication::Billing::Firm, account.qualified_billing_firm
47
+ assert_kind_of MyApplication::Billing::Firm, account.unqualified_billing_firm
48
+ assert_kind_of MyApplication::Billing::Nested::Firm, account.nested_qualified_billing_firm
49
+ assert_kind_of MyApplication::Billing::Nested::Firm, account.nested_unqualified_billing_firm
50
+ end
51
+
52
+ def test_find_account_and_include_company
53
+ account = MyApplication::Billing::Account.all.merge!(:includes => :firm).find(1)
54
+ assert_kind_of MyApplication::Business::Firm, account.firm
55
+ end
56
+
57
+ def test_table_name
58
+ assert_equal 'accounts', MyApplication::Billing::Account.table_name, 'table_name for ActiveRecord model in module'
59
+ assert_equal 'companies', MyApplication::Business::Client.table_name, 'table_name for ActiveRecord model subclass'
60
+ assert_equal 'company_contacts', MyApplication::Business::Client::Contact.table_name, 'table_name for ActiveRecord model enclosed by another ActiveRecord model'
61
+ end
62
+
63
+ def test_assign_ids
64
+ firm = MyApplication::Business::Firm.first
65
+
66
+ assert_nothing_raised NameError, "Should be able to resolve all class constants via reflection" do
67
+ firm.client_ids = [MyApplication::Business::Client.first.id]
68
+ end
69
+ end
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
73
+ def test_eager_loading_in_modules
74
+ clients = []
75
+
76
+ assert_nothing_raised NameError, "Should be able to resolve all class constants via reflection" do
77
+ clients << MyApplication::Business::Client.references(:accounts).merge!(:includes => {:firm => :account}, :where => 'accounts.id IS NOT NULL').find(3)
78
+ clients << MyApplication::Business::Client.includes(:firm => :account).find(3)
79
+ end
80
+
81
+ clients.each do |client|
82
+ assert_no_queries do
83
+ assert_not_nil(client.firm.account)
84
+ end
85
+ end
86
+ end
87
+
88
+ def test_module_table_name_prefix
89
+ assert_equal 'prefixed_companies', MyApplication::Business::Prefixed::Company.table_name, 'inferred table_name for ActiveRecord model in module with table_name_prefix'
90
+ assert_equal 'prefixed_companies', MyApplication::Business::Prefixed::Nested::Company.table_name, 'table_name for ActiveRecord model in nested module with a parent table_name_prefix'
91
+ assert_equal 'companies', MyApplication::Business::Prefixed::Firm.table_name, 'explicit table_name for ActiveRecord model in module with table_name_prefix should not be prefixed'
92
+ end
93
+
94
+ def test_module_table_name_prefix_with_global_prefix
95
+ classes = [ MyApplication::Business::Company,
96
+ MyApplication::Business::Firm,
97
+ MyApplication::Business::Client,
98
+ MyApplication::Business::Client::Contact,
99
+ MyApplication::Business::Developer,
100
+ MyApplication::Business::Project,
101
+ MyApplication::Business::Prefixed::Company,
102
+ MyApplication::Business::Prefixed::Nested::Company,
103
+ MyApplication::Billing::Account ]
104
+
105
+ ActiveRecord::Base.table_name_prefix = 'global_'
106
+ classes.each(&:reset_table_name)
107
+ assert_equal 'global_companies', MyApplication::Business::Company.table_name, 'inferred table_name for ActiveRecord model in module without table_name_prefix'
108
+ assert_equal 'prefixed_companies', MyApplication::Business::Prefixed::Company.table_name, 'inferred table_name for ActiveRecord model in module with table_name_prefix'
109
+ assert_equal 'prefixed_companies', MyApplication::Business::Prefixed::Nested::Company.table_name, 'table_name for ActiveRecord model in nested module with a parent table_name_prefix'
110
+ assert_equal 'companies', MyApplication::Business::Prefixed::Firm.table_name, 'explicit table_name for ActiveRecord model in module with table_name_prefix should not be prefixed'
111
+ ensure
112
+ ActiveRecord::Base.table_name_prefix = ''
113
+ classes.each(&:reset_table_name)
114
+ end
115
+
116
+ def test_module_table_name_suffix
117
+ assert_equal 'companies_suffixed', MyApplication::Business::Suffixed::Company.table_name, 'inferred table_name for ActiveRecord model in module with table_name_suffix'
118
+ assert_equal 'companies_suffixed', MyApplication::Business::Suffixed::Nested::Company.table_name, 'table_name for ActiveRecord model in nested module with a parent table_name_suffix'
119
+ assert_equal 'companies', MyApplication::Business::Suffixed::Firm.table_name, 'explicit table_name for ActiveRecord model in module with table_name_suffix should not be suffixed'
120
+ end
121
+
122
+ def test_module_table_name_suffix_with_global_suffix
123
+ classes = [ MyApplication::Business::Company,
124
+ MyApplication::Business::Firm,
125
+ MyApplication::Business::Client,
126
+ MyApplication::Business::Client::Contact,
127
+ MyApplication::Business::Developer,
128
+ MyApplication::Business::Project,
129
+ MyApplication::Business::Suffixed::Company,
130
+ MyApplication::Business::Suffixed::Nested::Company,
131
+ MyApplication::Billing::Account ]
132
+
133
+ ActiveRecord::Base.table_name_suffix = '_global'
134
+ classes.each(&:reset_table_name)
135
+ assert_equal 'companies_global', MyApplication::Business::Company.table_name, 'inferred table_name for ActiveRecord model in module without table_name_suffix'
136
+ assert_equal 'companies_suffixed', MyApplication::Business::Suffixed::Company.table_name, 'inferred table_name for ActiveRecord model in module with table_name_suffix'
137
+ assert_equal 'companies_suffixed', MyApplication::Business::Suffixed::Nested::Company.table_name, 'table_name for ActiveRecord model in nested module with a parent table_name_suffix'
138
+ assert_equal 'companies', MyApplication::Business::Suffixed::Firm.table_name, 'explicit table_name for ActiveRecord model in module with table_name_suffix should not be suffixed'
139
+ ensure
140
+ ActiveRecord::Base.table_name_suffix = ''
141
+ classes.each(&:reset_table_name)
142
+ end
143
+
144
+ def test_compute_type_can_infer_class_name_of_sibling_inside_module
145
+ old = ActiveRecord::Base.store_full_sti_class
146
+ ActiveRecord::Base.store_full_sti_class = true
147
+ assert_equal MyApplication::Business::Firm, MyApplication::Business::Client.send(:compute_type, "Firm")
148
+ ensure
149
+ ActiveRecord::Base.store_full_sti_class = old
150
+ end
151
+
152
+ def test_nested_models_should_not_raise_exception_when_using_delete_all_dependency_on_association
153
+ old = ActiveRecord::Base.store_full_sti_class
154
+ ActiveRecord::Base.store_full_sti_class = true
155
+
156
+ collection = Shop::Collection.first
157
+ assert !collection.products.empty?, "Collection should have products"
158
+ assert_nothing_raised { collection.destroy }
159
+ ensure
160
+ ActiveRecord::Base.store_full_sti_class = old
161
+ end
162
+
163
+ def test_nested_models_should_not_raise_exception_when_using_nullify_dependency_on_association
164
+ old = ActiveRecord::Base.store_full_sti_class
165
+ ActiveRecord::Base.store_full_sti_class = true
166
+
167
+ product = Shop::Product.first
168
+ assert !product.variants.empty?, "Product should have variants"
169
+ assert_nothing_raised { product.destroy }
170
+ ensure
171
+ ActiveRecord::Base.store_full_sti_class = old
172
+ end
173
+ end
@@ -0,0 +1,350 @@
1
+ require "cases/helper"
2
+ require 'models/topic'
3
+ require 'models/customer'
4
+
5
+ class MultiParameterAttributeTest < ActiveRecord::TestCase
6
+ fixtures :topics
7
+
8
+ def test_multiparameter_attributes_on_date
9
+ attributes = { "last_read(1i)" => "2004", "last_read(2i)" => "6", "last_read(3i)" => "24" }
10
+ topic = Topic.find(1)
11
+ topic.attributes = attributes
12
+ # note that extra #to_date call allows test to pass for Oracle, which
13
+ # treats dates/times the same
14
+ assert_date_from_db Date.new(2004, 6, 24), topic.last_read.to_date
15
+ end
16
+
17
+ def test_multiparameter_attributes_on_date_with_empty_year
18
+ attributes = { "last_read(1i)" => "", "last_read(2i)" => "6", "last_read(3i)" => "24" }
19
+ topic = Topic.find(1)
20
+ topic.attributes = attributes
21
+ # note that extra #to_date call allows test to pass for Oracle, which
22
+ # treats dates/times the same
23
+ assert_nil topic.last_read
24
+ end
25
+
26
+ def test_multiparameter_attributes_on_date_with_empty_month
27
+ attributes = { "last_read(1i)" => "2004", "last_read(2i)" => "", "last_read(3i)" => "24" }
28
+ topic = Topic.find(1)
29
+ topic.attributes = attributes
30
+ # note that extra #to_date call allows test to pass for Oracle, which
31
+ # treats dates/times the same
32
+ assert_nil topic.last_read
33
+ end
34
+
35
+ def test_multiparameter_attributes_on_date_with_empty_day
36
+ attributes = { "last_read(1i)" => "2004", "last_read(2i)" => "6", "last_read(3i)" => "" }
37
+ topic = Topic.find(1)
38
+ topic.attributes = attributes
39
+ # note that extra #to_date call allows test to pass for Oracle, which
40
+ # treats dates/times the same
41
+ assert_nil topic.last_read
42
+ end
43
+
44
+ def test_multiparameter_attributes_on_date_with_empty_day_and_year
45
+ attributes = { "last_read(1i)" => "", "last_read(2i)" => "6", "last_read(3i)" => "" }
46
+ topic = Topic.find(1)
47
+ topic.attributes = attributes
48
+ # note that extra #to_date call allows test to pass for Oracle, which
49
+ # treats dates/times the same
50
+ assert_nil topic.last_read
51
+ end
52
+
53
+ def test_multiparameter_attributes_on_date_with_empty_day_and_month
54
+ attributes = { "last_read(1i)" => "2004", "last_read(2i)" => "", "last_read(3i)" => "" }
55
+ topic = Topic.find(1)
56
+ topic.attributes = attributes
57
+ # note that extra #to_date call allows test to pass for Oracle, which
58
+ # treats dates/times the same
59
+ assert_nil topic.last_read
60
+ end
61
+
62
+ def test_multiparameter_attributes_on_date_with_empty_year_and_month
63
+ attributes = { "last_read(1i)" => "", "last_read(2i)" => "", "last_read(3i)" => "24" }
64
+ topic = Topic.find(1)
65
+ topic.attributes = attributes
66
+ # note that extra #to_date call allows test to pass for Oracle, which
67
+ # treats dates/times the same
68
+ assert_nil topic.last_read
69
+ end
70
+
71
+ def test_multiparameter_attributes_on_date_with_all_empty
72
+ attributes = { "last_read(1i)" => "", "last_read(2i)" => "", "last_read(3i)" => "" }
73
+ topic = Topic.find(1)
74
+ topic.attributes = attributes
75
+ assert_nil topic.last_read
76
+ end
77
+
78
+ def test_multiparameter_attributes_on_time
79
+ with_timezone_config default: :local do
80
+ attributes = {
81
+ "written_on(1i)" => "2004", "written_on(2i)" => "6", "written_on(3i)" => "24",
82
+ "written_on(4i)" => "16", "written_on(5i)" => "24", "written_on(6i)" => "00"
83
+ }
84
+ topic = Topic.find(1)
85
+ topic.attributes = attributes
86
+ assert_equal Time.local(2004, 6, 24, 16, 24, 0), topic.written_on
87
+ end
88
+ end
89
+
90
+ def test_multiparameter_attributes_on_time_with_no_date
91
+ ex = assert_raise(ActiveRecord::MultiparameterAssignmentErrors) do
92
+ attributes = {
93
+ "written_on(4i)" => "16", "written_on(5i)" => "24", "written_on(6i)" => "00"
94
+ }
95
+ topic = Topic.find(1)
96
+ topic.attributes = attributes
97
+ end
98
+ assert_equal("written_on", ex.errors[0].attribute)
99
+ end
100
+
101
+ def test_multiparameter_attributes_on_time_with_invalid_time_params
102
+ ex = assert_raise(ActiveRecord::MultiparameterAssignmentErrors) do
103
+ attributes = {
104
+ "written_on(1i)" => "2004", "written_on(2i)" => "6", "written_on(3i)" => "24",
105
+ "written_on(4i)" => "2004", "written_on(5i)" => "36", "written_on(6i)" => "64",
106
+ }
107
+ topic = Topic.find(1)
108
+ topic.attributes = attributes
109
+ end
110
+ assert_equal("written_on", ex.errors[0].attribute)
111
+ end
112
+
113
+ def test_multiparameter_attributes_on_time_with_old_date
114
+ attributes = {
115
+ "written_on(1i)" => "1850", "written_on(2i)" => "6", "written_on(3i)" => "24",
116
+ "written_on(4i)" => "16", "written_on(5i)" => "24", "written_on(6i)" => "00"
117
+ }
118
+ topic = Topic.find(1)
119
+ topic.attributes = attributes
120
+ # testing against to_s(:db) representation because either a Time or a DateTime might be returned, depending on platform
121
+ assert_equal "1850-06-24 16:24:00", topic.written_on.to_s(:db)
122
+ end
123
+
124
+ def test_multiparameter_attributes_on_time_will_raise_on_big_time_if_missing_date_parts
125
+ ex = assert_raise(ActiveRecord::MultiparameterAssignmentErrors) do
126
+ attributes = {
127
+ "written_on(4i)" => "16", "written_on(5i)" => "24"
128
+ }
129
+ topic = Topic.find(1)
130
+ topic.attributes = attributes
131
+ end
132
+ assert_equal("written_on", ex.errors[0].attribute)
133
+ end
134
+
135
+ def test_multiparameter_attributes_on_time_with_raise_on_small_time_if_missing_date_parts
136
+ ex = assert_raise(ActiveRecord::MultiparameterAssignmentErrors) do
137
+ attributes = {
138
+ "written_on(4i)" => "16", "written_on(5i)" => "12", "written_on(6i)" => "02"
139
+ }
140
+ topic = Topic.find(1)
141
+ topic.attributes = attributes
142
+ end
143
+ assert_equal("written_on", ex.errors[0].attribute)
144
+ end
145
+
146
+ def test_multiparameter_attributes_on_time_will_ignore_hour_if_missing
147
+ with_timezone_config default: :local do
148
+ attributes = {
149
+ "written_on(1i)" => "2004", "written_on(2i)" => "12", "written_on(3i)" => "12",
150
+ "written_on(5i)" => "12", "written_on(6i)" => "02"
151
+ }
152
+ topic = Topic.find(1)
153
+ topic.attributes = attributes
154
+ assert_equal Time.local(2004, 12, 12, 0, 12, 2), topic.written_on
155
+ end
156
+ end
157
+
158
+ def test_multiparameter_attributes_on_time_will_ignore_hour_if_blank
159
+ attributes = {
160
+ "written_on(1i)" => "", "written_on(2i)" => "", "written_on(3i)" => "",
161
+ "written_on(4i)" => "", "written_on(5i)" => "12", "written_on(6i)" => "02"
162
+ }
163
+ topic = Topic.find(1)
164
+ topic.attributes = attributes
165
+ assert_nil topic.written_on
166
+ end
167
+
168
+ def test_multiparameter_attributes_on_time_will_ignore_date_if_empty
169
+ attributes = {
170
+ "written_on(1i)" => "", "written_on(2i)" => "", "written_on(3i)" => "",
171
+ "written_on(4i)" => "16", "written_on(5i)" => "24"
172
+ }
173
+ topic = Topic.find(1)
174
+ topic.attributes = attributes
175
+ assert_nil topic.written_on
176
+ end
177
+
178
+ def test_multiparameter_attributes_on_time_with_seconds_will_ignore_date_if_empty
179
+ attributes = {
180
+ "written_on(1i)" => "", "written_on(2i)" => "", "written_on(3i)" => "",
181
+ "written_on(4i)" => "16", "written_on(5i)" => "12", "written_on(6i)" => "02"
182
+ }
183
+ topic = Topic.find(1)
184
+ topic.attributes = attributes
185
+ assert_nil topic.written_on
186
+ end
187
+
188
+ def test_multiparameter_attributes_on_time_with_utc
189
+ with_timezone_config default: :utc do
190
+ attributes = {
191
+ "written_on(1i)" => "2004", "written_on(2i)" => "6", "written_on(3i)" => "24",
192
+ "written_on(4i)" => "16", "written_on(5i)" => "24", "written_on(6i)" => "00"
193
+ }
194
+ topic = Topic.find(1)
195
+ topic.attributes = attributes
196
+ assert_equal Time.utc(2004, 6, 24, 16, 24, 0), topic.written_on
197
+ end
198
+ end
199
+
200
+ def test_multiparameter_attributes_on_time_with_time_zone_aware_attributes
201
+ with_timezone_config default: :utc, aware_attributes: true, zone: -28800 do
202
+ attributes = {
203
+ "written_on(1i)" => "2004", "written_on(2i)" => "6", "written_on(3i)" => "24",
204
+ "written_on(4i)" => "16", "written_on(5i)" => "24", "written_on(6i)" => "00"
205
+ }
206
+ topic = Topic.find(1)
207
+ topic.attributes = attributes
208
+ assert_equal Time.utc(2004, 6, 24, 23, 24, 0), topic.written_on
209
+ assert_equal Time.utc(2004, 6, 24, 16, 24, 0), topic.written_on.time
210
+ assert_equal Time.zone, topic.written_on.time_zone
211
+ end
212
+ end
213
+
214
+ def test_multiparameter_attributes_on_time_with_time_zone_aware_attributes_false
215
+ with_timezone_config default: :local, aware_attributes: false, zone: -28800 do
216
+ attributes = {
217
+ "written_on(1i)" => "2004", "written_on(2i)" => "6", "written_on(3i)" => "24",
218
+ "written_on(4i)" => "16", "written_on(5i)" => "24", "written_on(6i)" => "00"
219
+ }
220
+ topic = Topic.find(1)
221
+ topic.attributes = attributes
222
+ assert_equal Time.local(2004, 6, 24, 16, 24, 0), topic.written_on
223
+ assert_equal false, topic.written_on.respond_to?(:time_zone)
224
+ end
225
+ end
226
+
227
+ def test_multiparameter_attributes_on_time_with_skip_time_zone_conversion_for_attributes
228
+ with_timezone_config default: :utc, aware_attributes: true, zone: -28800 do
229
+ Topic.skip_time_zone_conversion_for_attributes = [:written_on]
230
+ attributes = {
231
+ "written_on(1i)" => "2004", "written_on(2i)" => "6", "written_on(3i)" => "24",
232
+ "written_on(4i)" => "16", "written_on(5i)" => "24", "written_on(6i)" => "00"
233
+ }
234
+ topic = Topic.find(1)
235
+ topic.attributes = attributes
236
+ assert_equal Time.utc(2004, 6, 24, 16, 24, 0), topic.written_on
237
+ assert_equal false, topic.written_on.respond_to?(:time_zone)
238
+ end
239
+ ensure
240
+ Topic.skip_time_zone_conversion_for_attributes = []
241
+ end
242
+
243
+ # Oracle does not have a TIME datatype.
244
+ unless current_adapter?(:OracleAdapter)
245
+ def test_multiparameter_attributes_on_time_only_column_with_time_zone_aware_attributes_does_not_do_time_zone_conversion
246
+ with_timezone_config default: :utc, aware_attributes: true, zone: -28800 do
247
+ attributes = {
248
+ "bonus_time(1i)" => "2000", "bonus_time(2i)" => "1", "bonus_time(3i)" => "1",
249
+ "bonus_time(4i)" => "16", "bonus_time(5i)" => "24"
250
+ }
251
+ topic = Topic.find(1)
252
+ topic.attributes = attributes
253
+ assert_equal Time.utc(2000, 1, 1, 16, 24, 0), topic.bonus_time
254
+ assert topic.bonus_time.utc?
255
+ end
256
+ end
257
+ end
258
+
259
+ def test_multiparameter_attributes_on_time_with_empty_seconds
260
+ with_timezone_config default: :local do
261
+ attributes = {
262
+ "written_on(1i)" => "2004", "written_on(2i)" => "6", "written_on(3i)" => "24",
263
+ "written_on(4i)" => "16", "written_on(5i)" => "24", "written_on(6i)" => ""
264
+ }
265
+ topic = Topic.find(1)
266
+ topic.attributes = attributes
267
+ assert_equal Time.local(2004, 6, 24, 16, 24, 0), topic.written_on
268
+ end
269
+ end
270
+
271
+ unless current_adapter? :OracleAdapter
272
+ def test_multiparameter_attributes_setting_time_attribute
273
+ topic = Topic.new( "bonus_time(4i)"=> "01", "bonus_time(5i)" => "05" )
274
+ assert_equal 1, topic.bonus_time.hour
275
+ assert_equal 5, topic.bonus_time.min
276
+ end
277
+ end
278
+
279
+ def test_multiparameter_attributes_setting_date_attribute
280
+ topic = Topic.new( "written_on(1i)" => "1952", "written_on(2i)" => "3", "written_on(3i)" => "11" )
281
+ assert_equal 1952, topic.written_on.year
282
+ assert_equal 3, topic.written_on.month
283
+ assert_equal 11, topic.written_on.day
284
+ end
285
+
286
+ def test_multiparameter_attributes_setting_date_and_time_attribute
287
+ topic = Topic.new(
288
+ "written_on(1i)" => "1952",
289
+ "written_on(2i)" => "3",
290
+ "written_on(3i)" => "11",
291
+ "written_on(4i)" => "13",
292
+ "written_on(5i)" => "55")
293
+ assert_equal 1952, topic.written_on.year
294
+ assert_equal 3, topic.written_on.month
295
+ assert_equal 11, topic.written_on.day
296
+ assert_equal 13, topic.written_on.hour
297
+ assert_equal 55, topic.written_on.min
298
+ end
299
+
300
+ def test_multiparameter_attributes_setting_time_but_not_date_on_date_field
301
+ assert_raise( ActiveRecord::MultiparameterAssignmentErrors ) do
302
+ Topic.new( "written_on(4i)" => "13", "written_on(5i)" => "55" )
303
+ end
304
+ end
305
+
306
+ def test_multiparameter_assignment_of_aggregation
307
+ customer = Customer.new
308
+ address = Address.new("The Street", "The City", "The Country")
309
+ attributes = { "address(1)" => address.street, "address(2)" => address.city, "address(3)" => address.country }
310
+ customer.attributes = attributes
311
+ assert_equal address, customer.address
312
+ end
313
+
314
+ def test_multiparameter_assignment_of_aggregation_out_of_order
315
+ customer = Customer.new
316
+ address = Address.new("The Street", "The City", "The Country")
317
+ attributes = { "address(3)" => address.country, "address(2)" => address.city, "address(1)" => address.street }
318
+ customer.attributes = attributes
319
+ assert_equal address, customer.address
320
+ end
321
+
322
+ def test_multiparameter_assignment_of_aggregation_with_missing_values
323
+ ex = assert_raise(ActiveRecord::MultiparameterAssignmentErrors) do
324
+ customer = Customer.new
325
+ address = Address.new("The Street", "The City", "The Country")
326
+ attributes = { "address(2)" => address.city, "address(3)" => address.country }
327
+ customer.attributes = attributes
328
+ end
329
+ assert_equal("address", ex.errors[0].attribute)
330
+ end
331
+
332
+ def test_multiparameter_assignment_of_aggregation_with_blank_values
333
+ customer = Customer.new
334
+ address = Address.new("The Street", "The City", "The Country")
335
+ attributes = { "address(1)" => "", "address(2)" => address.city, "address(3)" => address.country }
336
+ customer.attributes = attributes
337
+ assert_equal Address.new(nil, "The City", "The Country"), customer.address
338
+ end
339
+
340
+ def test_multiparameter_assignment_of_aggregation_with_large_index
341
+ ex = assert_raise(ActiveRecord::MultiparameterAssignmentErrors) do
342
+ customer = Customer.new
343
+ address = Address.new("The Street", "The City", "The Country")
344
+ attributes = { "address(1)" => "The Street", "address(2)" => address.city, "address(3000)" => address.country }
345
+ customer.attributes = attributes
346
+ end
347
+
348
+ assert_equal("address", ex.errors[0].attribute)
349
+ end
350
+ end