ibm_db 3.0.5-x86-mingw32 → 4.0.0-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 (586) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -0
  3. data/LICENSE +1 -1
  4. data/MANIFEST +14 -14
  5. data/ParameterizedQueries README +6 -6
  6. data/README +208 -225
  7. data/ext/Makefile.nt32 +181 -181
  8. data/ext/Makefile.nt32.191 +212 -212
  9. data/ext/extconf.rb +291 -291
  10. data/ext/ibm_db.c +11887 -11887
  11. data/ext/ruby_ibm_db.h +241 -241
  12. data/ext/ruby_ibm_db_cli.c +866 -866
  13. data/ext/ruby_ibm_db_cli.h +500 -500
  14. data/init.rb +41 -41
  15. data/lib/IBM_DB.rb +27 -27
  16. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3452 -3177
  17. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -2
  18. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  19. data/lib/mswin32/ibm_db.rb +91 -123
  20. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  21. data/test/active_record/connection_adapters/fake_adapter.rb +49 -46
  22. data/test/assets/example.log +1 -1
  23. data/test/assets/test.txt +1 -1
  24. data/test/cases/adapter_test.rb +351 -276
  25. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
  26. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
  27. data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
  28. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
  29. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
  30. data/test/cases/adapters/mysql2/connection_test.rb +210 -0
  31. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
  32. data/test/cases/adapters/mysql2/enum_test.rb +26 -0
  33. data/test/cases/adapters/mysql2/explain_test.rb +21 -0
  34. data/test/cases/adapters/mysql2/json_test.rb +195 -0
  35. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
  36. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  37. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
  38. data/test/cases/adapters/mysql2/schema_test.rb +126 -0
  39. data/test/cases/adapters/mysql2/sp_test.rb +36 -0
  40. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
  41. data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
  42. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
  43. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
  44. data/test/cases/adapters/postgresql/array_test.rb +339 -0
  45. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
  46. data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
  47. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
  48. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
  49. data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
  50. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  51. data/test/cases/adapters/postgresql/collation_test.rb +53 -0
  52. data/test/cases/adapters/postgresql/composite_test.rb +132 -0
  53. data/test/cases/adapters/postgresql/connection_test.rb +257 -0
  54. data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
  55. data/test/cases/adapters/postgresql/domain_test.rb +47 -0
  56. data/test/cases/adapters/postgresql/enum_test.rb +91 -0
  57. data/test/cases/adapters/postgresql/explain_test.rb +20 -0
  58. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
  59. data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
  60. data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
  61. data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
  62. data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
  63. data/test/cases/adapters/postgresql/integer_test.rb +25 -0
  64. data/test/cases/adapters/postgresql/json_test.rb +237 -0
  65. data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
  66. data/test/cases/adapters/postgresql/money_test.rb +96 -0
  67. data/test/cases/adapters/postgresql/network_test.rb +94 -0
  68. data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
  69. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
  70. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  71. data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
  72. data/test/cases/adapters/postgresql/range_test.rb +343 -0
  73. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
  74. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
  75. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
  76. data/test/cases/adapters/postgresql/schema_test.rb +597 -0
  77. data/test/cases/adapters/postgresql/serial_test.rb +154 -0
  78. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
  79. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
  80. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
  81. data/test/cases/adapters/postgresql/utils_test.rb +62 -0
  82. data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
  83. data/test/cases/adapters/postgresql/xml_test.rb +54 -0
  84. data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
  85. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
  86. data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
  87. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
  88. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
  89. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  90. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
  91. data/test/cases/aggregations_test.rb +168 -158
  92. data/test/cases/ar_schema_test.rb +146 -161
  93. data/test/cases/associations/association_scope_test.rb +16 -21
  94. data/test/cases/associations/belongs_to_associations_test.rb +1141 -1029
  95. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
  96. data/test/cases/associations/callbacks_test.rb +190 -192
  97. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  98. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  99. data/test/cases/associations/eager_load_nested_include_test.rb +126 -128
  100. data/test/cases/associations/eager_singularization_test.rb +148 -148
  101. data/test/cases/associations/eager_test.rb +1514 -1429
  102. data/test/cases/associations/extension_test.rb +87 -82
  103. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -972
  104. data/test/cases/associations/has_many_associations_test.rb +2501 -2182
  105. data/test/cases/associations/has_many_through_associations_test.rb +1271 -1204
  106. data/test/cases/associations/has_one_associations_test.rb +707 -610
  107. data/test/cases/associations/has_one_through_associations_test.rb +383 -380
  108. data/test/cases/associations/inner_join_association_test.rb +139 -139
  109. data/test/cases/associations/inverse_associations_test.rb +733 -706
  110. data/test/cases/associations/join_model_test.rb +777 -754
  111. data/test/cases/associations/left_outer_join_association_test.rb +88 -0
  112. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  113. data/test/cases/associations/required_test.rb +102 -82
  114. data/test/cases/associations_test.rb +385 -380
  115. data/test/cases/attribute_decorators_test.rb +125 -125
  116. data/test/cases/attribute_methods/read_test.rb +60 -60
  117. data/test/cases/attribute_methods_test.rb +1009 -952
  118. data/test/cases/attribute_set_test.rb +270 -210
  119. data/test/cases/attribute_test.rb +246 -180
  120. data/test/cases/attributes_test.rb +253 -136
  121. data/test/cases/autosave_association_test.rb +1708 -1595
  122. data/test/cases/base_test.rb +1713 -1664
  123. data/test/cases/batches_test.rb +489 -212
  124. data/test/cases/binary_test.rb +44 -52
  125. data/test/cases/bind_parameter_test.rb +110 -100
  126. data/test/cases/cache_key_test.rb +25 -0
  127. data/test/cases/calculations_test.rb +798 -646
  128. data/test/cases/callbacks_test.rb +636 -543
  129. data/test/cases/clone_test.rb +40 -40
  130. data/test/cases/coders/json_test.rb +15 -0
  131. data/test/cases/coders/yaml_column_test.rb +63 -63
  132. data/test/cases/collection_cache_key_test.rb +115 -0
  133. data/test/cases/column_alias_test.rb +17 -17
  134. data/test/cases/column_definition_test.rb +92 -123
  135. data/test/cases/comment_test.rb +143 -0
  136. data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -54
  137. data/test/cases/connection_adapters/connection_handler_test.rb +160 -53
  138. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  139. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -293
  140. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -65
  141. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  142. data/test/cases/connection_adapters/schema_cache_test.rb +61 -56
  143. data/test/cases/connection_adapters/type_lookup_test.rb +118 -110
  144. data/test/cases/connection_management_test.rb +112 -122
  145. data/test/cases/connection_pool_test.rb +521 -346
  146. data/test/cases/connection_specification/resolver_test.rb +131 -116
  147. data/test/cases/core_test.rb +112 -112
  148. data/test/cases/counter_cache_test.rb +214 -209
  149. data/test/cases/custom_locking_test.rb +17 -17
  150. data/test/cases/database_statements_test.rb +34 -19
  151. data/test/cases/{invalid_date_test.rb → date_test.rb} +44 -32
  152. data/test/cases/date_time_precision_test.rb +106 -0
  153. data/test/cases/date_time_test.rb +61 -61
  154. data/test/cases/defaults_test.rb +218 -223
  155. data/test/cases/dirty_test.rb +763 -785
  156. data/test/cases/disconnected_test.rb +30 -28
  157. data/test/cases/dup_test.rb +157 -157
  158. data/test/cases/enum_test.rb +444 -290
  159. data/test/cases/errors_test.rb +16 -0
  160. data/test/cases/explain_subscriber_test.rb +64 -64
  161. data/test/cases/explain_test.rb +87 -76
  162. data/test/cases/finder_respond_to_test.rb +60 -60
  163. data/test/cases/finder_test.rb +1294 -1169
  164. data/test/cases/fixture_set/file_test.rb +156 -138
  165. data/test/cases/fixtures_test.rb +988 -908
  166. data/test/cases/forbidden_attributes_protection_test.rb +165 -99
  167. data/test/cases/habtm_destroy_order_test.rb +61 -61
  168. data/test/cases/helper.rb +204 -210
  169. data/test/cases/hot_compatibility_test.rb +142 -54
  170. data/test/cases/i18n_test.rb +45 -45
  171. data/test/cases/inheritance_test.rb +606 -375
  172. data/test/cases/integration_test.rb +155 -139
  173. data/test/cases/invalid_connection_test.rb +24 -22
  174. data/test/cases/invertible_migration_test.rb +387 -295
  175. data/test/cases/json_serialization_test.rb +311 -302
  176. data/test/cases/locking_test.rb +493 -477
  177. data/test/cases/log_subscriber_test.rb +225 -136
  178. data/test/cases/migration/change_schema_test.rb +458 -512
  179. data/test/cases/migration/change_table_test.rb +256 -224
  180. data/test/cases/migration/column_attributes_test.rb +176 -192
  181. data/test/cases/migration/column_positioning_test.rb +56 -56
  182. data/test/cases/migration/columns_test.rb +310 -304
  183. data/test/cases/migration/command_recorder_test.rb +350 -305
  184. data/test/cases/migration/compatibility_test.rb +118 -0
  185. data/test/cases/migration/create_join_table_test.rb +157 -148
  186. data/test/cases/migration/foreign_key_test.rb +360 -328
  187. data/test/cases/migration/helper.rb +39 -39
  188. data/test/cases/migration/index_test.rb +218 -216
  189. data/test/cases/migration/logger_test.rb +36 -36
  190. data/test/cases/migration/pending_migrations_test.rb +52 -53
  191. data/test/cases/migration/references_foreign_key_test.rb +216 -169
  192. data/test/cases/migration/references_index_test.rb +101 -101
  193. data/test/cases/migration/references_statements_test.rb +136 -116
  194. data/test/cases/migration/rename_table_test.rb +93 -93
  195. data/test/cases/migration_test.rb +1157 -959
  196. data/test/cases/migrator_test.rb +470 -388
  197. data/test/cases/mixin_test.rb +68 -70
  198. data/test/cases/modules_test.rb +172 -173
  199. data/test/cases/multiparameter_attributes_test.rb +372 -350
  200. data/test/cases/multiple_db_test.rb +122 -115
  201. data/test/cases/nested_attributes_test.rb +1098 -1070
  202. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  203. data/test/cases/persistence_test.rb +1001 -909
  204. data/test/cases/pooled_connections_test.rb +81 -81
  205. data/test/cases/primary_keys_test.rb +376 -237
  206. data/test/cases/query_cache_test.rb +446 -326
  207. data/test/cases/quoting_test.rb +202 -156
  208. data/test/cases/readonly_test.rb +119 -118
  209. data/test/cases/reaper_test.rb +85 -85
  210. data/test/cases/reflection_test.rb +509 -463
  211. data/test/cases/relation/delegation_test.rb +63 -68
  212. data/test/cases/relation/merging_test.rb +157 -161
  213. data/test/cases/relation/mutation_test.rb +183 -165
  214. data/test/cases/relation/or_test.rb +92 -0
  215. data/test/cases/relation/predicate_builder_test.rb +16 -14
  216. data/test/cases/relation/record_fetch_warning_test.rb +40 -0
  217. data/test/cases/relation/where_chain_test.rb +105 -181
  218. data/test/cases/relation/where_clause_test.rb +182 -0
  219. data/test/cases/relation/where_test.rb +322 -300
  220. data/test/cases/relation_test.rb +328 -319
  221. data/test/cases/relations_test.rb +2026 -1815
  222. data/test/cases/reload_models_test.rb +22 -22
  223. data/test/cases/result_test.rb +90 -80
  224. data/test/cases/sanitize_test.rb +176 -83
  225. data/test/cases/schema_dumper_test.rb +457 -463
  226. data/test/cases/schema_loading_test.rb +52 -0
  227. data/test/cases/scoping/default_scoping_test.rb +528 -454
  228. data/test/cases/scoping/named_scoping_test.rb +561 -524
  229. data/test/cases/scoping/relation_scoping_test.rb +400 -357
  230. data/test/cases/secure_token_test.rb +32 -0
  231. data/test/cases/serialization_test.rb +104 -104
  232. data/test/cases/serialized_attribute_test.rb +364 -277
  233. data/test/cases/statement_cache_test.rb +136 -98
  234. data/test/cases/store_test.rb +195 -194
  235. data/test/cases/suppressor_test.rb +63 -0
  236. data/test/cases/tasks/database_tasks_test.rb +462 -398
  237. data/test/cases/tasks/mysql_rake_test.rb +345 -324
  238. data/test/cases/tasks/postgresql_rake_test.rb +304 -250
  239. data/test/cases/tasks/sqlite_rake_test.rb +220 -193
  240. data/test/cases/test_case.rb +131 -123
  241. data/test/cases/test_fixtures_test.rb +36 -0
  242. data/test/cases/time_precision_test.rb +102 -0
  243. data/test/cases/timestamp_test.rb +501 -467
  244. data/test/cases/touch_later_test.rb +121 -0
  245. data/test/cases/transaction_callbacks_test.rb +518 -452
  246. data/test/cases/transaction_isolation_test.rb +106 -106
  247. data/test/cases/transactions_test.rb +834 -817
  248. data/test/cases/type/adapter_specific_registry_test.rb +133 -0
  249. data/test/cases/type/date_time_test.rb +14 -0
  250. data/test/cases/type/integer_test.rb +27 -121
  251. data/test/cases/type/string_test.rb +22 -36
  252. data/test/cases/type/type_map_test.rb +177 -177
  253. data/test/cases/type_test.rb +39 -0
  254. data/test/cases/types_test.rb +24 -141
  255. data/test/cases/unconnected_test.rb +33 -33
  256. data/test/cases/validations/absence_validation_test.rb +73 -0
  257. data/test/cases/validations/association_validation_test.rb +97 -86
  258. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  259. data/test/cases/validations/i18n_validation_test.rb +86 -90
  260. data/test/cases/validations/length_validation_test.rb +79 -47
  261. data/test/cases/validations/presence_validation_test.rb +103 -68
  262. data/test/cases/validations/uniqueness_validation_test.rb +548 -457
  263. data/test/cases/validations_repair_helper.rb +19 -23
  264. data/test/cases/validations_test.rb +194 -165
  265. data/test/cases/view_test.rb +216 -119
  266. data/test/cases/yaml_serialization_test.rb +121 -126
  267. data/test/config.example.yml +97 -0
  268. data/test/config.rb +5 -5
  269. data/test/fixtures/accounts.yml +29 -29
  270. data/test/fixtures/admin/accounts.yml +2 -2
  271. data/test/fixtures/admin/users.yml +10 -10
  272. data/test/fixtures/author_addresses.original +11 -0
  273. data/test/fixtures/author_addresses.yml +17 -17
  274. data/test/fixtures/author_favorites.yml +3 -3
  275. data/test/fixtures/authors.original +17 -0
  276. data/test/fixtures/authors.yml +23 -23
  277. data/test/fixtures/bad_posts.yml +9 -0
  278. data/test/fixtures/binaries.yml +133 -133
  279. data/test/fixtures/books.yml +31 -11
  280. data/test/fixtures/bulbs.yml +5 -5
  281. data/test/fixtures/cars.yml +9 -9
  282. data/test/fixtures/categories.yml +19 -19
  283. data/test/fixtures/categories/special_categories.yml +9 -9
  284. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  285. data/test/fixtures/categories_ordered.yml +7 -7
  286. data/test/fixtures/categories_posts.yml +31 -31
  287. data/test/fixtures/categorizations.yml +23 -23
  288. data/test/fixtures/clubs.yml +8 -8
  289. data/test/fixtures/collections.yml +3 -3
  290. data/test/fixtures/colleges.yml +3 -3
  291. data/test/fixtures/comments.yml +65 -65
  292. data/test/fixtures/companies.yml +67 -67
  293. data/test/fixtures/computers.yml +10 -10
  294. data/test/fixtures/content.yml +3 -0
  295. data/test/fixtures/content_positions.yml +3 -0
  296. data/test/fixtures/courses.yml +8 -8
  297. data/test/fixtures/customers.yml +25 -25
  298. data/test/fixtures/dashboards.yml +6 -6
  299. data/test/fixtures/dead_parrots.yml +5 -0
  300. data/test/fixtures/developers.yml +22 -22
  301. data/test/fixtures/developers_projects.yml +16 -16
  302. data/test/fixtures/dog_lovers.yml +7 -7
  303. data/test/fixtures/dogs.yml +4 -4
  304. data/test/fixtures/doubloons.yml +3 -3
  305. data/test/fixtures/edges.yml +5 -5
  306. data/test/fixtures/entrants.yml +14 -14
  307. data/test/fixtures/essays.yml +6 -6
  308. data/test/fixtures/faces.yml +11 -11
  309. data/test/fixtures/fk_test_has_fk.yml +3 -3
  310. data/test/fixtures/fk_test_has_pk.yml +1 -1
  311. data/test/fixtures/friendships.yml +4 -4
  312. data/test/fixtures/funny_jokes.yml +10 -10
  313. data/test/fixtures/interests.yml +33 -33
  314. data/test/fixtures/items.yml +3 -3
  315. data/test/fixtures/jobs.yml +7 -7
  316. data/test/fixtures/legacy_things.yml +3 -3
  317. data/test/fixtures/live_parrots.yml +4 -0
  318. data/test/fixtures/mateys.yml +4 -4
  319. data/test/fixtures/member_details.yml +8 -8
  320. data/test/fixtures/member_types.yml +6 -6
  321. data/test/fixtures/members.yml +11 -11
  322. data/test/fixtures/memberships.yml +34 -34
  323. data/test/fixtures/men.yml +5 -5
  324. data/test/fixtures/minimalistics.yml +2 -2
  325. data/test/fixtures/minivans.yml +5 -5
  326. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  327. data/test/fixtures/mixins.yml +29 -29
  328. data/test/fixtures/movies.yml +7 -7
  329. data/test/fixtures/naked/yml/accounts.yml +1 -1
  330. data/test/fixtures/naked/yml/companies.yml +1 -1
  331. data/test/fixtures/naked/yml/courses.yml +1 -1
  332. data/test/fixtures/naked/yml/parrots.yml +2 -0
  333. data/test/fixtures/naked/yml/trees.yml +3 -0
  334. data/test/fixtures/nodes.yml +29 -0
  335. data/test/fixtures/organizations.yml +5 -5
  336. data/test/fixtures/other_comments.yml +6 -0
  337. data/test/fixtures/other_dogs.yml +2 -0
  338. data/test/fixtures/other_posts.yml +7 -0
  339. data/test/fixtures/other_topics.yml +42 -42
  340. data/test/fixtures/owners.yml +9 -9
  341. data/test/fixtures/parrots.yml +27 -27
  342. data/test/fixtures/parrots_pirates.yml +7 -7
  343. data/test/fixtures/people.yml +24 -24
  344. data/test/fixtures/peoples_treasures.yml +3 -3
  345. data/test/fixtures/pets.yml +19 -19
  346. data/test/fixtures/pirates.yml +15 -12
  347. data/test/fixtures/posts.yml +80 -80
  348. data/test/fixtures/price_estimates.yml +16 -7
  349. data/test/fixtures/products.yml +4 -4
  350. data/test/fixtures/projects.yml +7 -7
  351. data/test/fixtures/ratings.yml +14 -14
  352. data/test/fixtures/readers.yml +11 -11
  353. data/test/fixtures/references.yml +17 -17
  354. data/test/fixtures/reserved_words/distinct.yml +5 -5
  355. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  356. data/test/fixtures/reserved_words/group.yml +14 -14
  357. data/test/fixtures/reserved_words/select.yml +8 -8
  358. data/test/fixtures/reserved_words/values.yml +7 -7
  359. data/test/fixtures/ships.yml +6 -6
  360. data/test/fixtures/speedometers.yml +8 -8
  361. data/test/fixtures/sponsors.yml +12 -12
  362. data/test/fixtures/string_key_objects.yml +7 -7
  363. data/test/fixtures/subscribers.yml +10 -10
  364. data/test/fixtures/subscriptions.yml +12 -12
  365. data/test/fixtures/taggings.yml +78 -78
  366. data/test/fixtures/tags.yml +11 -11
  367. data/test/fixtures/tasks.yml +7 -7
  368. data/test/fixtures/teapots.yml +3 -3
  369. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  370. data/test/fixtures/to_be_linked/users.yml +10 -10
  371. data/test/fixtures/topics.yml +49 -49
  372. data/test/fixtures/toys.yml +14 -14
  373. data/test/fixtures/traffic_lights.yml +9 -9
  374. data/test/fixtures/treasures.yml +10 -10
  375. data/test/fixtures/trees.yml +3 -0
  376. data/test/fixtures/uuid_children.yml +3 -3
  377. data/test/fixtures/uuid_parents.yml +2 -2
  378. data/test/fixtures/variants.yml +4 -4
  379. data/test/fixtures/vegetables.yml +19 -19
  380. data/test/fixtures/vertices.yml +3 -3
  381. data/test/fixtures/warehouse_things.yml +2 -2
  382. data/test/fixtures/zines.yml +5 -5
  383. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  384. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  385. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  386. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -9
  387. data/test/migrations/missing/1_people_have_last_names.rb +9 -9
  388. data/test/migrations/missing/3_we_need_reminders.rb +12 -12
  389. data/test/migrations/missing/4_innocent_jointable.rb +12 -12
  390. data/test/migrations/rename/1_we_need_things.rb +11 -11
  391. data/test/migrations/rename/2_rename_things.rb +9 -9
  392. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  393. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  394. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  395. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  396. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  397. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  398. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  399. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  400. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  401. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  402. data/test/migrations/valid/2_we_need_reminders.rb +12 -12
  403. data/test/migrations/valid/3_innocent_jointable.rb +12 -12
  404. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  405. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -12
  406. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -12
  407. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  408. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  409. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  410. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  411. data/test/models/admin.rb +5 -5
  412. data/test/models/admin/account.rb +3 -3
  413. data/test/models/admin/randomly_named_c1.rb +6 -2
  414. data/test/models/admin/user.rb +40 -40
  415. data/test/models/aircraft.rb +5 -4
  416. data/test/models/arunit2_model.rb +3 -3
  417. data/test/models/author.rb +209 -212
  418. data/test/models/auto_id.rb +4 -4
  419. data/test/models/autoloadable/extra_firm.rb +2 -2
  420. data/test/models/binary.rb +2 -2
  421. data/test/models/bird.rb +12 -12
  422. data/test/models/book.rb +23 -18
  423. data/test/models/boolean.rb +2 -2
  424. data/test/models/bulb.rb +52 -51
  425. data/test/models/cake_designer.rb +3 -3
  426. data/test/models/car.rb +29 -26
  427. data/test/models/carrier.rb +2 -2
  428. data/test/models/cat.rb +10 -0
  429. data/test/models/categorization.rb +19 -19
  430. data/test/models/category.rb +35 -35
  431. data/test/models/chef.rb +8 -7
  432. data/test/models/citation.rb +3 -3
  433. data/test/models/club.rb +25 -23
  434. data/test/models/college.rb +10 -10
  435. data/test/models/column.rb +3 -3
  436. data/test/models/column_name.rb +3 -3
  437. data/test/models/comment.rb +76 -64
  438. data/test/models/company.rb +230 -228
  439. data/test/models/company_in_module.rb +98 -98
  440. data/test/models/computer.rb +3 -3
  441. data/test/models/contact.rb +41 -41
  442. data/test/models/content.rb +40 -0
  443. data/test/models/contract.rb +20 -20
  444. data/test/models/country.rb +7 -7
  445. data/test/models/course.rb +6 -6
  446. data/test/models/customer.rb +83 -77
  447. data/test/models/customer_carrier.rb +14 -14
  448. data/test/models/dashboard.rb +3 -3
  449. data/test/models/default.rb +2 -2
  450. data/test/models/department.rb +4 -4
  451. data/test/models/developer.rb +274 -255
  452. data/test/models/dog.rb +5 -5
  453. data/test/models/dog_lover.rb +5 -5
  454. data/test/models/doubloon.rb +12 -12
  455. data/test/models/drink_designer.rb +3 -3
  456. data/test/models/edge.rb +5 -5
  457. data/test/models/electron.rb +5 -5
  458. data/test/models/engine.rb +4 -4
  459. data/test/models/entrant.rb +3 -3
  460. data/test/models/essay.rb +5 -5
  461. data/test/models/event.rb +3 -3
  462. data/test/models/eye.rb +37 -37
  463. data/test/models/face.rb +9 -9
  464. data/test/models/friendship.rb +6 -6
  465. data/test/models/guid.rb +2 -2
  466. data/test/models/guitar.rb +4 -0
  467. data/test/models/hotel.rb +11 -9
  468. data/test/models/image.rb +3 -3
  469. data/test/models/interest.rb +5 -5
  470. data/test/models/invoice.rb +4 -4
  471. data/test/models/item.rb +7 -7
  472. data/test/models/job.rb +7 -7
  473. data/test/models/joke.rb +7 -7
  474. data/test/models/keyboard.rb +3 -3
  475. data/test/models/legacy_thing.rb +3 -3
  476. data/test/models/lesson.rb +11 -11
  477. data/test/models/line_item.rb +3 -3
  478. data/test/models/liquid.rb +4 -4
  479. data/test/models/man.rb +11 -11
  480. data/test/models/matey.rb +4 -4
  481. data/test/models/member.rb +42 -41
  482. data/test/models/member_detail.rb +8 -7
  483. data/test/models/member_type.rb +3 -3
  484. data/test/models/membership.rb +35 -35
  485. data/test/models/mentor.rb +3 -0
  486. data/test/models/minimalistic.rb +2 -2
  487. data/test/models/minivan.rb +9 -9
  488. data/test/models/mixed_case_monkey.rb +3 -3
  489. data/test/models/mocktail_designer.rb +2 -0
  490. data/test/models/molecule.rb +6 -6
  491. data/test/models/movie.rb +5 -5
  492. data/test/models/node.rb +5 -0
  493. data/test/models/non_primary_key.rb +2 -0
  494. data/test/models/notification.rb +3 -0
  495. data/test/models/order.rb +4 -4
  496. data/test/models/organization.rb +14 -14
  497. data/test/models/other_dog.rb +5 -0
  498. data/test/models/owner.rb +37 -34
  499. data/test/models/parrot.rb +28 -29
  500. data/test/models/person.rb +142 -143
  501. data/test/models/personal_legacy_thing.rb +4 -4
  502. data/test/models/pet.rb +18 -15
  503. data/test/models/pet_treasure.rb +6 -0
  504. data/test/models/pirate.rb +92 -92
  505. data/test/models/possession.rb +3 -3
  506. data/test/models/post.rb +273 -264
  507. data/test/models/price_estimate.rb +4 -4
  508. data/test/models/professor.rb +5 -5
  509. data/test/models/project.rb +40 -31
  510. data/test/models/publisher.rb +2 -2
  511. data/test/models/publisher/article.rb +4 -4
  512. data/test/models/publisher/magazine.rb +3 -3
  513. data/test/models/randomly_named_c1.rb +1 -1
  514. data/test/models/rating.rb +4 -4
  515. data/test/models/reader.rb +23 -23
  516. data/test/models/recipe.rb +3 -0
  517. data/test/models/record.rb +2 -2
  518. data/test/models/reference.rb +22 -22
  519. data/test/models/reply.rb +61 -61
  520. data/test/models/ship.rb +39 -33
  521. data/test/models/ship_part.rb +8 -8
  522. data/test/models/shop.rb +17 -17
  523. data/test/models/shop_account.rb +6 -6
  524. data/test/models/speedometer.rb +6 -6
  525. data/test/models/sponsor.rb +7 -7
  526. data/test/models/string_key_object.rb +3 -3
  527. data/test/models/student.rb +4 -4
  528. data/test/models/subject.rb +16 -16
  529. data/test/models/subscriber.rb +8 -8
  530. data/test/models/subscription.rb +4 -4
  531. data/test/models/tag.rb +13 -7
  532. data/test/models/tagging.rb +13 -13
  533. data/test/models/task.rb +5 -5
  534. data/test/models/topic.rb +118 -124
  535. data/test/models/toy.rb +6 -6
  536. data/test/models/traffic_light.rb +4 -4
  537. data/test/models/treasure.rb +14 -14
  538. data/test/models/treaty.rb +7 -7
  539. data/test/models/tree.rb +3 -0
  540. data/test/models/tuning_peg.rb +4 -0
  541. data/test/models/tyre.rb +11 -11
  542. data/test/models/user.rb +14 -0
  543. data/test/models/uuid_child.rb +3 -3
  544. data/test/models/uuid_item.rb +6 -0
  545. data/test/models/uuid_parent.rb +3 -3
  546. data/test/models/vegetables.rb +24 -24
  547. data/test/models/vehicle.rb +6 -6
  548. data/test/models/vertex.rb +9 -9
  549. data/test/models/warehouse_thing.rb +5 -5
  550. data/test/models/wheel.rb +3 -3
  551. data/test/models/without_table.rb +3 -3
  552. data/test/models/zine.rb +3 -3
  553. data/test/schema/mysql2_specific_schema.rb +68 -58
  554. data/test/schema/oracle_specific_schema.rb +40 -43
  555. data/test/schema/postgresql_specific_schema.rb +114 -202
  556. data/test/schema/schema.rb +1057 -952
  557. data/test/schema/schema.rb.original +1057 -0
  558. data/test/schema/sqlite_specific_schema.rb +18 -22
  559. data/test/support/config.rb +43 -43
  560. data/test/support/connection.rb +23 -22
  561. data/test/support/connection_helper.rb +14 -14
  562. data/test/support/ddl_helper.rb +8 -8
  563. data/test/support/schema_dumping_helper.rb +20 -20
  564. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  565. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  566. metadata +129 -28
  567. data/lib/mswin32/rb19x/ibm_db.so +0 -0
  568. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  569. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  570. data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
  571. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
  572. data/test/cases/attribute_methods/serialization_test.rb +0 -29
  573. data/test/cases/migration/change_schema_test - Copy.rb +0 -448
  574. data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
  575. data/test/cases/migration/table_and_index_test.rb +0 -24
  576. data/test/cases/relation/where_test2.rb +0 -36
  577. data/test/cases/type/decimal_test.rb +0 -56
  578. data/test/cases/type/unsigned_integer_test.rb +0 -18
  579. data/test/cases/xml_serialization_test.rb +0 -457
  580. data/test/connections/native_ibm_db/connection.rb +0 -44
  581. data/test/fixtures/naked/csv/accounts.csv +0 -1
  582. data/test/schema/i5/ibm_db_specific_schema.rb +0 -137
  583. data/test/schema/ids/ibm_db_specific_schema.rb +0 -140
  584. data/test/schema/luw/ibm_db_specific_schema.rb +0 -137
  585. data/test/schema/mysql_specific_schema.rb +0 -70
  586. data/test/schema/zOS/ibm_db_specific_schema.rb +0 -208
@@ -1,19 +1,34 @@
1
- require "cases/helper"
2
-
3
- class DatabaseStatementsTest < ActiveRecord::TestCase
4
- def setup
5
- @connection = ActiveRecord::Base.connection
6
- end
7
-
8
- def test_insert_should_return_the_inserted_id
9
- # Oracle adapter uses prefetched primary key values from sequence and passes them to connection adapter insert method
10
- if current_adapter?(:OracleAdapter)
11
- sequence_name = "accounts_seq"
12
- id_value = @connection.next_sequence_value(sequence_name)
13
- id = @connection.insert("INSERT INTO accounts (id, firm_id,credit_limit) VALUES (accounts_seq.nextval,42,5000)", nil, :id, id_value, sequence_name)
14
- else
15
- id = @connection.insert("INSERT INTO accounts (firm_id,credit_limit) VALUES (42,5000)")
16
- end
17
- assert_not_nil id
18
- end
19
- end
1
+ require "cases/helper"
2
+
3
+ class DatabaseStatementsTest < ActiveRecord::TestCase
4
+ def setup
5
+ @connection = ActiveRecord::Base.connection
6
+ end
7
+
8
+ def test_insert_should_return_the_inserted_id
9
+ assert_not_nil return_the_inserted_id(method: :insert)
10
+ end
11
+
12
+ def test_create_should_return_the_inserted_id
13
+ assert_not_nil return_the_inserted_id(method: :create)
14
+ end
15
+
16
+ def test_insert_update_delete_sql_is_deprecated
17
+ assert_deprecated { @connection.insert_sql("INSERT INTO accounts (firm_id,credit_limit) VALUES (42,5000)") }
18
+ assert_deprecated { @connection.update_sql("UPDATE accounts SET credit_limit = 6000 WHERE firm_id = 42") }
19
+ assert_deprecated { @connection.delete_sql("DELETE FROM accounts WHERE firm_id = 42") }
20
+ end
21
+
22
+ private
23
+
24
+ def return_the_inserted_id(method:)
25
+ # Oracle adapter uses prefetched primary key values from sequence and passes them to connection adapter insert method
26
+ if current_adapter?(:OracleAdapter)
27
+ sequence_name = "accounts_seq"
28
+ id_value = @connection.next_sequence_value(sequence_name)
29
+ @connection.send(method, "INSERT INTO accounts (id, firm_id,credit_limit) VALUES (accounts_seq.nextval,42,5000)", nil, :id, id_value, sequence_name)
30
+ else
31
+ @connection.send(method, "INSERT INTO accounts (firm_id,credit_limit) VALUES (42,5000)")
32
+ end
33
+ end
34
+ end
@@ -1,32 +1,44 @@
1
- require 'cases/helper'
2
- require 'models/topic'
3
-
4
- class InvalidDateTest < ActiveRecord::TestCase
5
- def test_assign_valid_dates
6
- valid_dates = [[2007, 11, 30], [1993, 2, 28], [2008, 2, 29]]
7
-
8
- invalid_dates = [[2007, 11, 31], [1993, 2, 29], [2007, 2, 29]]
9
-
10
- valid_dates.each do |date_src|
11
- topic = Topic.new("last_read(1i)" => date_src[0].to_s, "last_read(2i)" => date_src[1].to_s, "last_read(3i)" => date_src[2].to_s)
12
- # Oracle DATE columns are datetime columns and Oracle adapter returns Time value
13
- if current_adapter?(:OracleAdapter)
14
- assert_equal(topic.last_read.to_date, Date.new(*date_src))
15
- else
16
- assert_equal(topic.last_read, Date.new(*date_src))
17
- end
18
- end
19
-
20
- invalid_dates.each do |date_src|
21
- assert_nothing_raised do
22
- topic = Topic.new({"last_read(1i)" => date_src[0].to_s, "last_read(2i)" => date_src[1].to_s, "last_read(3i)" => date_src[2].to_s})
23
- # Oracle DATE columns are datetime columns and Oracle adapter returns Time value
24
- if current_adapter?(:OracleAdapter)
25
- assert_equal(topic.last_read.to_date, Time.local(*date_src).to_date, "The date should be modified according to the behavior of the Time object")
26
- else
27
- assert_equal(topic.last_read, Time.local(*date_src).to_date, "The date should be modified according to the behavior of the Time object")
28
- end
29
- end
30
- end
31
- end
32
- end
1
+ require 'cases/helper'
2
+ require 'models/topic'
3
+
4
+ class DateTest < ActiveRecord::TestCase
5
+ def test_date_with_time_value
6
+ time_value = Time.new(2016, 05, 11, 19, 0, 0)
7
+ topic = Topic.create(last_read: time_value)
8
+ assert_equal topic, Topic.find_by(last_read: time_value)
9
+ end
10
+
11
+ def test_date_with_string_value
12
+ string_value = '2016-05-11 19:00:00'
13
+ topic = Topic.create(last_read: string_value)
14
+ assert_equal topic, Topic.find_by(last_read: string_value)
15
+ end
16
+
17
+ def test_assign_valid_dates
18
+ valid_dates = [[2007, 11, 30], [1993, 2, 28], [2008, 2, 29]]
19
+
20
+ invalid_dates = [[2007, 11, 31], [1993, 2, 29], [2007, 2, 29]]
21
+
22
+ valid_dates.each do |date_src|
23
+ topic = Topic.new("last_read(1i)" => date_src[0].to_s, "last_read(2i)" => date_src[1].to_s, "last_read(3i)" => date_src[2].to_s)
24
+ # Oracle DATE columns are datetime columns and Oracle adapter returns Time value
25
+ if current_adapter?(:OracleAdapter)
26
+ assert_equal(topic.last_read.to_date, Date.new(*date_src))
27
+ else
28
+ assert_equal(topic.last_read, Date.new(*date_src))
29
+ end
30
+ end
31
+
32
+ invalid_dates.each do |date_src|
33
+ assert_nothing_raised do
34
+ topic = Topic.new({"last_read(1i)" => date_src[0].to_s, "last_read(2i)" => date_src[1].to_s, "last_read(3i)" => date_src[2].to_s})
35
+ # Oracle DATE columns are datetime columns and Oracle adapter returns Time value
36
+ if current_adapter?(:OracleAdapter)
37
+ assert_equal(topic.last_read.to_date, Time.local(*date_src).to_date, "The date should be modified according to the behavior of the Time object")
38
+ else
39
+ assert_equal(topic.last_read, Time.local(*date_src).to_date, "The date should be modified according to the behavior of the Time object")
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,106 @@
1
+ require 'cases/helper'
2
+ require 'support/schema_dumping_helper'
3
+
4
+ if subsecond_precision_supported?
5
+ class DateTimePrecisionTest < ActiveRecord::TestCase
6
+ include SchemaDumpingHelper
7
+ self.use_transactional_tests = false
8
+
9
+ class Foo < ActiveRecord::Base; end
10
+
11
+ setup do
12
+ @connection = ActiveRecord::Base.connection
13
+ Foo.reset_column_information
14
+ end
15
+
16
+ teardown do
17
+ @connection.drop_table :foos, if_exists: true
18
+ end
19
+
20
+ def test_datetime_data_type_with_precision
21
+ @connection.create_table(:foos, force: true)
22
+ @connection.add_column :foos, :created_at, :datetime, precision: 0
23
+ @connection.add_column :foos, :updated_at, :datetime, precision: 5
24
+ assert_equal 0, Foo.columns_hash['created_at'].precision
25
+ assert_equal 5, Foo.columns_hash['updated_at'].precision
26
+ end
27
+
28
+ def test_datetime_precision_is_truncated_on_assignment
29
+ @connection.create_table(:foos, force: true)
30
+ @connection.add_column :foos, :created_at, :datetime, precision: 0
31
+ @connection.add_column :foos, :updated_at, :datetime, precision: 6
32
+
33
+ time = ::Time.now.change(nsec: 123456789)
34
+ foo = Foo.new(created_at: time, updated_at: time)
35
+
36
+ assert_equal 0, foo.created_at.nsec
37
+ assert_equal 123456000, foo.updated_at.nsec
38
+
39
+ foo.save!
40
+ foo.reload
41
+
42
+ assert_equal 0, foo.created_at.nsec
43
+ assert_equal 123456000, foo.updated_at.nsec
44
+ end
45
+
46
+ def test_timestamps_helper_with_custom_precision
47
+ @connection.create_table(:foos, force: true) do |t|
48
+ t.timestamps precision: 4
49
+ end
50
+ assert_equal 4, Foo.columns_hash['created_at'].precision
51
+ assert_equal 4, Foo.columns_hash['updated_at'].precision
52
+ end
53
+
54
+ def test_passing_precision_to_datetime_does_not_set_limit
55
+ @connection.create_table(:foos, force: true) do |t|
56
+ t.timestamps precision: 4
57
+ end
58
+ assert_nil Foo.columns_hash['created_at'].limit
59
+ assert_nil Foo.columns_hash['updated_at'].limit
60
+ end
61
+
62
+ def test_invalid_datetime_precision_raises_error
63
+ assert_raises ActiveRecord::ActiveRecordError do
64
+ @connection.create_table(:foos, force: true) do |t|
65
+ t.timestamps precision: 7
66
+ end
67
+ end
68
+ end
69
+
70
+ def test_formatting_datetime_according_to_precision
71
+ @connection.create_table(:foos, force: true) do |t|
72
+ t.datetime :created_at, precision: 0
73
+ t.datetime :updated_at, precision: 4
74
+ end
75
+ date = ::Time.utc(2014, 8, 17, 12, 30, 0, 999999)
76
+ Foo.create!(created_at: date, updated_at: date)
77
+ assert foo = Foo.find_by(created_at: date)
78
+ assert_equal 1, Foo.where(updated_at: date).count
79
+ assert_equal date.to_s, foo.created_at.to_s
80
+ assert_equal date.to_s, foo.updated_at.to_s
81
+ assert_equal 000000, foo.created_at.usec
82
+ assert_equal 999900, foo.updated_at.usec
83
+ end
84
+
85
+ def test_schema_dump_includes_datetime_precision
86
+ @connection.create_table(:foos, force: true) do |t|
87
+ t.timestamps precision: 6
88
+ end
89
+ output = dump_table_schema("foos")
90
+ assert_match %r{t\.datetime\s+"created_at",\s+precision: 6,\s+null: false$}, output
91
+ assert_match %r{t\.datetime\s+"updated_at",\s+precision: 6,\s+null: false$}, output
92
+ end
93
+
94
+ if current_adapter?(:PostgreSQLAdapter, :SQLServerAdapter)
95
+ def test_datetime_precision_with_zero_should_be_dumped
96
+ @connection.create_table(:foos, force: true) do |t|
97
+ t.timestamps precision: 0
98
+ end
99
+ output = dump_table_schema("foos")
100
+ assert_match %r{t\.datetime\s+"created_at",\s+precision: 0,\s+null: false$}, output
101
+ assert_match %r{t\.datetime\s+"updated_at",\s+precision: 0,\s+null: false$}, output
102
+ end
103
+ end
104
+
105
+ end
106
+ end
@@ -1,61 +1,61 @@
1
- require "cases/helper"
2
- require 'models/topic'
3
- require 'models/task'
4
-
5
- class DateTimeTest < ActiveRecord::TestCase
6
- include InTimeZone
7
-
8
- def test_saves_both_date_and_time
9
- with_env_tz 'America/New_York' do
10
- with_timezone_config default: :utc do
11
- time_values = [1807, 2, 10, 15, 30, 45]
12
- # create DateTime value with local time zone offset
13
- local_offset = Rational(Time.local(*time_values).utc_offset, 86400)
14
- now = DateTime.civil(*(time_values + [local_offset]))
15
-
16
- task = Task.new
17
- task.starting = now
18
- task.save!
19
-
20
- # check against Time.local, since some platforms will return a Time instead of a DateTime
21
- assert_equal Time.local(*time_values), Task.find(task.id).starting
22
- end
23
- end
24
- end
25
-
26
- def test_assign_empty_date_time
27
- task = Task.new
28
- task.starting = ''
29
- task.ending = nil
30
- assert_nil task.starting
31
- assert_nil task.ending
32
- end
33
-
34
- def test_assign_bad_date_time_with_timezone
35
- in_time_zone "Pacific Time (US & Canada)" do
36
- task = Task.new
37
- task.starting = '2014-07-01T24:59:59GMT'
38
- assert_nil task.starting
39
- end
40
- end
41
-
42
- def test_assign_empty_date
43
- topic = Topic.new
44
- topic.last_read = ''
45
- assert_nil topic.last_read
46
- end
47
-
48
- def test_assign_empty_time
49
- topic = Topic.new
50
- topic.bonus_time = ''
51
- assert_nil topic.bonus_time
52
- end
53
-
54
- def test_assign_in_local_timezone
55
- now = DateTime.now
56
- with_timezone_config default: :local do
57
- task = Task.new starting: now
58
- assert_equal now, task.starting
59
- end
60
- end
61
- end
1
+ require "cases/helper"
2
+ require 'models/topic'
3
+ require 'models/task'
4
+
5
+ class DateTimeTest < ActiveRecord::TestCase
6
+ include InTimeZone
7
+
8
+ def test_saves_both_date_and_time
9
+ with_env_tz 'America/New_York' do
10
+ with_timezone_config default: :utc do
11
+ time_values = [1807, 2, 10, 15, 30, 45]
12
+ # create DateTime value with local time zone offset
13
+ local_offset = Rational(Time.local(*time_values).utc_offset, 86400)
14
+ now = DateTime.civil(*(time_values + [local_offset]))
15
+
16
+ task = Task.new
17
+ task.starting = now
18
+ task.save!
19
+
20
+ # check against Time.local, since some platforms will return a Time instead of a DateTime
21
+ assert_equal Time.local(*time_values), Task.find(task.id).starting
22
+ end
23
+ end
24
+ end
25
+
26
+ def test_assign_empty_date_time
27
+ task = Task.new
28
+ task.starting = ''
29
+ task.ending = nil
30
+ assert_nil task.starting
31
+ assert_nil task.ending
32
+ end
33
+
34
+ def test_assign_bad_date_time_with_timezone
35
+ in_time_zone "Pacific Time (US & Canada)" do
36
+ task = Task.new
37
+ task.starting = '2014-07-01T24:59:59GMT'
38
+ assert_nil task.starting
39
+ end
40
+ end
41
+
42
+ def test_assign_empty_date
43
+ topic = Topic.new
44
+ topic.last_read = ''
45
+ assert_nil topic.last_read
46
+ end
47
+
48
+ def test_assign_empty_time
49
+ topic = Topic.new
50
+ topic.bonus_time = ''
51
+ assert_nil topic.bonus_time
52
+ end
53
+
54
+ def test_assign_in_local_timezone
55
+ now = DateTime.now
56
+ with_timezone_config default: :local do
57
+ task = Task.new starting: now
58
+ assert_equal now, task.starting
59
+ end
60
+ end
61
+ end
@@ -1,223 +1,218 @@
1
- require "cases/helper"
2
- require 'models/default'
3
- require 'models/entrant'
4
-
5
- class DefaultTest < ActiveRecord::TestCase
6
- def test_nil_defaults_for_not_null_columns
7
- column_defaults =
8
- if current_adapter?(:MysqlAdapter) && (Mysql.client_version < 50051 || (50100..50122).include?(Mysql.client_version))
9
- { 'id' => nil, 'name' => '', 'course_id' => nil }
10
- else
11
- { 'id' => nil, 'name' => nil, 'course_id' => nil }
12
- end
13
-
14
- column_defaults.each do |name, default|
15
- column = Entrant.columns_hash[name]
16
- assert !column.null, "#{name} column should be NOT NULL"
17
- assert_equal default, column.default, "#{name} column should be DEFAULT #{default.inspect}"
18
- end
19
- end
20
-
21
- if current_adapter?(:PostgreSQLAdapter, :OracleAdapter)
22
- def test_default_integers
23
- default = Default.new
24
- assert_instance_of Fixnum, default.positive_integer
25
- assert_equal 1, default.positive_integer
26
- assert_instance_of Fixnum, default.negative_integer
27
- assert_equal(-1, default.negative_integer)
28
- assert_instance_of BigDecimal, default.decimal_number
29
- assert_equal BigDecimal.new("2.78"), default.decimal_number
30
- end
31
- end
32
-
33
- if current_adapter?(:PostgreSQLAdapter)
34
- def test_multiline_default_text
35
- # older postgres versions represent the default with escapes ("\\012" for a newline)
36
- assert( "--- []\n\n" == Default.columns_hash['multiline_default'].default ||
37
- "--- []\\012\\012" == Default.columns_hash['multiline_default'].default)
38
- end
39
-
40
- def test_default_negative_integer
41
- assert_equal "-1", Default.columns_hash['negative_integer'].default
42
- end
43
- end
44
- end
45
-
46
- class DefaultStringsTest < ActiveRecord::TestCase
47
- class DefaultString < ActiveRecord::Base; end
48
-
49
- setup do
50
- @connection = ActiveRecord::Base.connection
51
- @connection.create_table :default_strings do |t|
52
- t.string :string_col, default: "Smith"
53
- t.string :string_col_with_quotes, default: "O'Connor"
54
- end
55
- DefaultString.reset_column_information
56
- end
57
-
58
- def test_default_strings
59
- assert_equal "Smith", DefaultString.new.string_col
60
- end
61
-
62
- def test_default_strings_containing_single_quotes
63
- assert_equal "O'Connor", DefaultString.new.string_col_with_quotes
64
- end
65
-
66
- teardown do
67
- @connection.drop_table :default_strings
68
- end
69
- end
70
-
71
- if current_adapter?(:MysqlAdapter, :Mysql2Adapter)
72
- class DefaultsTestWithoutTransactionalFixtures < ActiveRecord::TestCase
73
- # ActiveRecord::Base#create! (and #save and other related methods) will
74
- # open a new transaction. When in transactional fixtures mode, this will
75
- # cause Active Record to create a new savepoint. However, since MySQL doesn't
76
- # support DDL transactions, creating a table will result in any created
77
- # savepoints to be automatically released. This in turn causes the savepoint
78
- # release code in AbstractAdapter#transaction to fail.
79
- #
80
- # We don't want that to happen, so we disable transactional fixtures here.
81
- self.use_transactional_fixtures = false
82
-
83
- def using_strict(strict)
84
- connection = ActiveRecord::Base.remove_connection
85
- ActiveRecord::Base.establish_connection connection.merge(strict: strict)
86
- yield
87
- ensure
88
- ActiveRecord::Base.remove_connection
89
- ActiveRecord::Base.establish_connection connection
90
- end
91
-
92
- # MySQL cannot have defaults on text/blob columns. It reports the
93
- # default value as null.
94
- #
95
- # Despite this, in non-strict mode, MySQL will use an empty string
96
- # as the default value of the field, if no other value is
97
- # specified.
98
- #
99
- # Therefore, in non-strict mode, we want column.default to report
100
- # an empty string as its default, to be consistent with that.
101
- #
102
- # In strict mode, column.default should be nil.
103
- def test_mysql_text_not_null_defaults_non_strict
104
- using_strict(false) do
105
- with_text_blob_not_null_table do |klass|
106
- assert_equal '', klass.columns_hash['non_null_blob'].default
107
- assert_equal '', klass.columns_hash['non_null_text'].default
108
-
109
- assert_nil klass.columns_hash['null_blob'].default
110
- assert_nil klass.columns_hash['null_text'].default
111
-
112
- instance = klass.create!
113
-
114
- assert_equal '', instance.non_null_text
115
- assert_equal '', instance.non_null_blob
116
-
117
- assert_nil instance.null_text
118
- assert_nil instance.null_blob
119
- end
120
- end
121
- end
122
-
123
- def test_mysql_text_not_null_defaults_strict
124
- using_strict(true) do
125
- with_text_blob_not_null_table do |klass|
126
- assert_nil klass.columns_hash['non_null_blob'].default
127
- assert_nil klass.columns_hash['non_null_text'].default
128
- assert_nil klass.columns_hash['null_blob'].default
129
- assert_nil klass.columns_hash['null_text'].default
130
-
131
- assert_raises(ActiveRecord::StatementInvalid) { klass.create }
132
- end
133
- end
134
- end
135
-
136
- def with_text_blob_not_null_table
137
- klass = Class.new(ActiveRecord::Base)
138
- klass.table_name = 'test_mysql_text_not_null_defaults'
139
- klass.connection.create_table klass.table_name do |t|
140
- t.column :non_null_text, :text, :null => false
141
- t.column :non_null_blob, :blob, :null => false
142
- t.column :null_text, :text, :null => true
143
- t.column :null_blob, :blob, :null => true
144
- end
145
-
146
- yield klass
147
- ensure
148
- klass.connection.drop_table(klass.table_name) rescue nil
149
- end
150
-
151
- # MySQL uses an implicit default 0 rather than NULL unless in strict mode.
152
- # We use an implicit NULL so schema.rb is compatible with other databases.
153
- def test_mysql_integer_not_null_defaults
154
- klass = Class.new(ActiveRecord::Base)
155
- klass.table_name = 'test_integer_not_null_default_zero'
156
- klass.connection.create_table klass.table_name do |t|
157
- t.column :zero, :integer, :null => false, :default => 0
158
- t.column :omit, :integer, :null => false
159
- end
160
-
161
- assert_equal '0', klass.columns_hash['zero'].default
162
- assert !klass.columns_hash['zero'].null
163
- # 0 in MySQL 4, nil in 5.
164
- assert [0, nil].include?(klass.columns_hash['omit'].default)
165
- assert !klass.columns_hash['omit'].null
166
-
167
- assert_raise(ActiveRecord::StatementInvalid) { klass.create! }
168
-
169
- assert_nothing_raised do
170
- instance = klass.create!(:omit => 1)
171
- assert_equal 0, instance.zero
172
- assert_equal 1, instance.omit
173
- end
174
- ensure
175
- klass.connection.drop_table(klass.table_name) rescue nil
176
- end
177
- end
178
- end
179
-
180
- if current_adapter?(:PostgreSQLAdapter)
181
- class DefaultsUsingMultipleSchemasAndDomainTest < ActiveSupport::TestCase
182
- def setup
183
- @connection = ActiveRecord::Base.connection
184
-
185
- @old_search_path = @connection.schema_search_path
186
- @connection.schema_search_path = "schema_1, pg_catalog"
187
- @connection.create_table "defaults" do |t|
188
- t.text "text_col", :default => "some value"
189
- t.string "string_col", :default => "some value"
190
- end
191
- Default.reset_column_information
192
- end
193
-
194
- def test_text_defaults_in_new_schema_when_overriding_domain
195
- assert_equal "some value", Default.new.text_col, "Default of text column was not correctly parse"
196
- end
197
-
198
- def test_string_defaults_in_new_schema_when_overriding_domain
199
- assert_equal "some value", Default.new.string_col, "Default of string column was not correctly parse"
200
- end
201
-
202
- def test_bpchar_defaults_in_new_schema_when_overriding_domain
203
- @connection.execute "ALTER TABLE defaults ADD bpchar_col bpchar DEFAULT 'some value'"
204
- Default.reset_column_information
205
- assert_equal "some value", Default.new.bpchar_col, "Default of bpchar column was not correctly parse"
206
- end
207
-
208
- def test_text_defaults_after_updating_column_default
209
- @connection.execute "ALTER TABLE defaults ALTER COLUMN text_col SET DEFAULT 'some text'::schema_1.text"
210
- assert_equal "some text", Default.new.text_col, "Default of text column was not correctly parse after updating default using '::text' since postgreSQL will add parens to the default in db"
211
- end
212
-
213
- def test_default_containing_quote_and_colons
214
- @connection.execute "ALTER TABLE defaults ALTER COLUMN string_col SET DEFAULT 'foo''::bar'"
215
- assert_equal "foo'::bar", Default.new.string_col
216
- end
217
-
218
- teardown do
219
- @connection.schema_search_path = @old_search_path
220
- Default.reset_column_information
221
- end
222
- end
223
- end
1
+ require "cases/helper"
2
+ require 'support/schema_dumping_helper'
3
+ require 'models/default'
4
+ require 'models/entrant'
5
+
6
+ class DefaultTest < ActiveRecord::TestCase
7
+ def test_nil_defaults_for_not_null_columns
8
+ %w(id name course_id).each do |name|
9
+ column = Entrant.columns_hash[name]
10
+ assert !column.null, "#{name} column should be NOT NULL"
11
+ assert_not column.default, "#{name} column should be DEFAULT 'nil'"
12
+ end
13
+ end
14
+
15
+ if current_adapter?(:PostgreSQLAdapter)
16
+ def test_multiline_default_text
17
+ record = Default.new
18
+ # older postgres versions represent the default with escapes ("\\012" for a newline)
19
+ assert("--- []\n\n" == record.multiline_default || "--- []\\012\\012" == record.multiline_default)
20
+ end
21
+ end
22
+ end
23
+
24
+ class DefaultNumbersTest < ActiveRecord::TestCase
25
+ class DefaultNumber < ActiveRecord::Base; end
26
+
27
+ setup do
28
+ @connection = ActiveRecord::Base.connection
29
+ @connection.create_table :default_numbers do |t|
30
+ t.integer :positive_integer, default: 7
31
+ t.integer :negative_integer, default: -5
32
+ t.decimal :decimal_number, default: "2.78", precision: 5, scale: 2
33
+ end
34
+ end
35
+
36
+ teardown do
37
+ @connection.drop_table :default_numbers, if_exists: true
38
+ end
39
+
40
+ def test_default_positive_integer
41
+ record = DefaultNumber.new
42
+ assert_equal 7, record.positive_integer
43
+ assert_equal "7", record.positive_integer_before_type_cast
44
+ end
45
+
46
+ def test_default_negative_integer
47
+ record = DefaultNumber.new
48
+ assert_equal (-5), record.negative_integer
49
+ assert_equal "-5", record.negative_integer_before_type_cast
50
+ end
51
+
52
+ def test_default_decimal_number
53
+ record = DefaultNumber.new
54
+ assert_equal BigDecimal.new("2.78"), record.decimal_number
55
+ assert_equal "2.78", record.decimal_number_before_type_cast
56
+ end
57
+ end
58
+
59
+ class DefaultStringsTest < ActiveRecord::TestCase
60
+ class DefaultString < ActiveRecord::Base; end
61
+
62
+ setup do
63
+ @connection = ActiveRecord::Base.connection
64
+ @connection.create_table :default_strings do |t|
65
+ t.string :string_col, default: "Smith"
66
+ t.string :string_col_with_quotes, default: "O'Connor"
67
+ end
68
+ DefaultString.reset_column_information
69
+ end
70
+
71
+ def test_default_strings
72
+ assert_equal "Smith", DefaultString.new.string_col
73
+ end
74
+
75
+ def test_default_strings_containing_single_quotes
76
+ assert_equal "O'Connor", DefaultString.new.string_col_with_quotes
77
+ end
78
+
79
+ teardown do
80
+ @connection.drop_table :default_strings
81
+ end
82
+ end
83
+
84
+ if current_adapter?(:PostgreSQLAdapter)
85
+ class PostgresqlDefaultExpressionTest < ActiveRecord::TestCase
86
+ include SchemaDumpingHelper
87
+
88
+ test "schema dump includes default expression" do
89
+ output = dump_table_schema("defaults")
90
+ assert_match %r/t\.date\s+"modified_date",\s+default: -> { "\('now'::text\)::date" }/, output
91
+ assert_match %r/t\.date\s+"modified_date_function",\s+default: -> { "now\(\)" }/, output
92
+ assert_match %r/t\.datetime\s+"modified_time",\s+default: -> { "now\(\)" }/, output
93
+ assert_match %r/t\.datetime\s+"modified_time_function",\s+default: -> { "now\(\)" }/, output
94
+ end
95
+ end
96
+ end
97
+
98
+ if current_adapter?(:Mysql2Adapter)
99
+ class MysqlDefaultExpressionTest < ActiveRecord::TestCase
100
+ include SchemaDumpingHelper
101
+
102
+ if ActiveRecord::Base.connection.version >= '5.6.0'
103
+ test "schema dump includes default expression" do
104
+ output = dump_table_schema("datetime_defaults")
105
+ assert_match %r/t\.datetime\s+"modified_datetime",\s+default: -> { "CURRENT_TIMESTAMP" }/, output
106
+ end
107
+ end
108
+ end
109
+
110
+ class DefaultsTestWithoutTransactionalFixtures < ActiveRecord::TestCase
111
+ # ActiveRecord::Base#create! (and #save and other related methods) will
112
+ # open a new transaction. When in transactional tests mode, this will
113
+ # cause Active Record to create a new savepoint. However, since MySQL doesn't
114
+ # support DDL transactions, creating a table will result in any created
115
+ # savepoints to be automatically released. This in turn causes the savepoint
116
+ # release code in AbstractAdapter#transaction to fail.
117
+ #
118
+ # We don't want that to happen, so we disable transactional tests here.
119
+ self.use_transactional_tests = false
120
+
121
+ def using_strict(strict)
122
+ connection = ActiveRecord::Base.remove_connection
123
+ ActiveRecord::Base.establish_connection connection.merge(strict: strict)
124
+ yield
125
+ ensure
126
+ ActiveRecord::Base.remove_connection
127
+ ActiveRecord::Base.establish_connection connection
128
+ end
129
+
130
+ # MySQL cannot have defaults on text/blob columns. It reports the
131
+ # default value as null.
132
+ #
133
+ # Despite this, in non-strict mode, MySQL will use an empty string
134
+ # as the default value of the field, if no other value is
135
+ # specified.
136
+ #
137
+ # Therefore, in non-strict mode, we want column.default to report
138
+ # an empty string as its default, to be consistent with that.
139
+ #
140
+ # In strict mode, column.default should be nil.
141
+ def test_mysql_text_not_null_defaults_non_strict
142
+ using_strict(false) do
143
+ with_text_blob_not_null_table do |klass|
144
+ record = klass.new
145
+ assert_equal '', record.non_null_blob
146
+ assert_equal '', record.non_null_text
147
+
148
+ assert_nil record.null_blob
149
+ assert_nil record.null_text
150
+
151
+ record.save!
152
+ record.reload
153
+
154
+ assert_equal '', record.non_null_text
155
+ assert_equal '', record.non_null_blob
156
+
157
+ assert_nil record.null_text
158
+ assert_nil record.null_blob
159
+ end
160
+ end
161
+ end
162
+
163
+ def test_mysql_text_not_null_defaults_strict
164
+ using_strict(true) do
165
+ with_text_blob_not_null_table do |klass|
166
+ record = klass.new
167
+ assert_nil record.non_null_blob
168
+ assert_nil record.non_null_text
169
+ assert_nil record.null_blob
170
+ assert_nil record.null_text
171
+
172
+ assert_raises(ActiveRecord::StatementInvalid) { klass.create }
173
+ end
174
+ end
175
+ end
176
+
177
+ def with_text_blob_not_null_table
178
+ klass = Class.new(ActiveRecord::Base)
179
+ klass.table_name = 'test_mysql_text_not_null_defaults'
180
+ klass.connection.create_table klass.table_name do |t|
181
+ t.column :non_null_text, :text, :null => false
182
+ t.column :non_null_blob, :blob, :null => false
183
+ t.column :null_text, :text, :null => true
184
+ t.column :null_blob, :blob, :null => true
185
+ end
186
+
187
+ yield klass
188
+ ensure
189
+ klass.connection.drop_table(klass.table_name) rescue nil
190
+ end
191
+
192
+ # MySQL uses an implicit default 0 rather than NULL unless in strict mode.
193
+ # We use an implicit NULL so schema.rb is compatible with other databases.
194
+ def test_mysql_integer_not_null_defaults
195
+ klass = Class.new(ActiveRecord::Base)
196
+ klass.table_name = 'test_integer_not_null_default_zero'
197
+ klass.connection.create_table klass.table_name do |t|
198
+ t.column :zero, :integer, :null => false, :default => 0
199
+ t.column :omit, :integer, :null => false
200
+ end
201
+
202
+ assert_equal '0', klass.columns_hash['zero'].default
203
+ assert !klass.columns_hash['zero'].null
204
+ assert_equal nil, klass.columns_hash['omit'].default
205
+ assert !klass.columns_hash['omit'].null
206
+
207
+ assert_raise(ActiveRecord::StatementInvalid) { klass.create! }
208
+
209
+ assert_nothing_raised do
210
+ instance = klass.create!(:omit => 1)
211
+ assert_equal 0, instance.zero
212
+ assert_equal 1, instance.omit
213
+ end
214
+ ensure
215
+ klass.connection.drop_table(klass.table_name) rescue nil
216
+ end
217
+ end
218
+ end