ibm_db 3.0.5 → 4.0.0

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 (580) 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/test/active_record/connection_adapters/fake_adapter.rb +49 -46
  20. data/test/assets/example.log +1 -1
  21. data/test/assets/test.txt +1 -1
  22. data/test/cases/adapter_test.rb +351 -276
  23. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
  24. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
  25. data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
  26. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
  27. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
  28. data/test/cases/adapters/mysql2/connection_test.rb +210 -0
  29. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
  30. data/test/cases/adapters/mysql2/enum_test.rb +26 -0
  31. data/test/cases/adapters/mysql2/explain_test.rb +21 -0
  32. data/test/cases/adapters/mysql2/json_test.rb +195 -0
  33. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
  34. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  35. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
  36. data/test/cases/adapters/mysql2/schema_test.rb +126 -0
  37. data/test/cases/adapters/mysql2/sp_test.rb +36 -0
  38. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
  39. data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
  40. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
  41. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
  42. data/test/cases/adapters/postgresql/array_test.rb +339 -0
  43. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
  44. data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
  45. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
  46. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
  47. data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
  48. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  49. data/test/cases/adapters/postgresql/collation_test.rb +53 -0
  50. data/test/cases/adapters/postgresql/composite_test.rb +132 -0
  51. data/test/cases/adapters/postgresql/connection_test.rb +257 -0
  52. data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
  53. data/test/cases/adapters/postgresql/domain_test.rb +47 -0
  54. data/test/cases/adapters/postgresql/enum_test.rb +91 -0
  55. data/test/cases/adapters/postgresql/explain_test.rb +20 -0
  56. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
  57. data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
  58. data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
  59. data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
  60. data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
  61. data/test/cases/adapters/postgresql/integer_test.rb +25 -0
  62. data/test/cases/adapters/postgresql/json_test.rb +237 -0
  63. data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
  64. data/test/cases/adapters/postgresql/money_test.rb +96 -0
  65. data/test/cases/adapters/postgresql/network_test.rb +94 -0
  66. data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
  67. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
  68. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  69. data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
  70. data/test/cases/adapters/postgresql/range_test.rb +343 -0
  71. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
  72. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
  73. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
  74. data/test/cases/adapters/postgresql/schema_test.rb +597 -0
  75. data/test/cases/adapters/postgresql/serial_test.rb +154 -0
  76. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
  77. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
  78. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
  79. data/test/cases/adapters/postgresql/utils_test.rb +62 -0
  80. data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
  81. data/test/cases/adapters/postgresql/xml_test.rb +54 -0
  82. data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
  83. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
  84. data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
  85. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
  86. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
  87. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  88. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
  89. data/test/cases/aggregations_test.rb +168 -158
  90. data/test/cases/ar_schema_test.rb +146 -161
  91. data/test/cases/associations/association_scope_test.rb +16 -21
  92. data/test/cases/associations/belongs_to_associations_test.rb +1141 -1029
  93. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
  94. data/test/cases/associations/callbacks_test.rb +190 -192
  95. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  96. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  97. data/test/cases/associations/eager_load_nested_include_test.rb +126 -128
  98. data/test/cases/associations/eager_singularization_test.rb +148 -148
  99. data/test/cases/associations/eager_test.rb +1514 -1429
  100. data/test/cases/associations/extension_test.rb +87 -82
  101. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -972
  102. data/test/cases/associations/has_many_associations_test.rb +2501 -2182
  103. data/test/cases/associations/has_many_through_associations_test.rb +1271 -1204
  104. data/test/cases/associations/has_one_associations_test.rb +707 -610
  105. data/test/cases/associations/has_one_through_associations_test.rb +383 -380
  106. data/test/cases/associations/inner_join_association_test.rb +139 -139
  107. data/test/cases/associations/inverse_associations_test.rb +733 -706
  108. data/test/cases/associations/join_model_test.rb +777 -754
  109. data/test/cases/associations/left_outer_join_association_test.rb +88 -0
  110. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  111. data/test/cases/associations/required_test.rb +102 -82
  112. data/test/cases/associations_test.rb +385 -380
  113. data/test/cases/attribute_decorators_test.rb +125 -125
  114. data/test/cases/attribute_methods/read_test.rb +60 -60
  115. data/test/cases/attribute_methods_test.rb +1009 -952
  116. data/test/cases/attribute_set_test.rb +270 -210
  117. data/test/cases/attribute_test.rb +246 -180
  118. data/test/cases/attributes_test.rb +253 -136
  119. data/test/cases/autosave_association_test.rb +1708 -1595
  120. data/test/cases/base_test.rb +1713 -1664
  121. data/test/cases/batches_test.rb +489 -212
  122. data/test/cases/binary_test.rb +44 -52
  123. data/test/cases/bind_parameter_test.rb +110 -100
  124. data/test/cases/cache_key_test.rb +25 -0
  125. data/test/cases/calculations_test.rb +798 -646
  126. data/test/cases/callbacks_test.rb +636 -543
  127. data/test/cases/clone_test.rb +40 -40
  128. data/test/cases/coders/json_test.rb +15 -0
  129. data/test/cases/coders/yaml_column_test.rb +63 -63
  130. data/test/cases/collection_cache_key_test.rb +115 -0
  131. data/test/cases/column_alias_test.rb +17 -17
  132. data/test/cases/column_definition_test.rb +92 -123
  133. data/test/cases/comment_test.rb +143 -0
  134. data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -54
  135. data/test/cases/connection_adapters/connection_handler_test.rb +160 -53
  136. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  137. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -293
  138. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -65
  139. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  140. data/test/cases/connection_adapters/schema_cache_test.rb +61 -56
  141. data/test/cases/connection_adapters/type_lookup_test.rb +118 -110
  142. data/test/cases/connection_management_test.rb +112 -122
  143. data/test/cases/connection_pool_test.rb +521 -346
  144. data/test/cases/connection_specification/resolver_test.rb +131 -116
  145. data/test/cases/core_test.rb +112 -112
  146. data/test/cases/counter_cache_test.rb +214 -209
  147. data/test/cases/custom_locking_test.rb +17 -17
  148. data/test/cases/database_statements_test.rb +34 -19
  149. data/test/cases/{invalid_date_test.rb → date_test.rb} +44 -32
  150. data/test/cases/date_time_precision_test.rb +106 -0
  151. data/test/cases/date_time_test.rb +61 -61
  152. data/test/cases/defaults_test.rb +218 -223
  153. data/test/cases/dirty_test.rb +763 -785
  154. data/test/cases/disconnected_test.rb +30 -28
  155. data/test/cases/dup_test.rb +157 -157
  156. data/test/cases/enum_test.rb +444 -290
  157. data/test/cases/errors_test.rb +16 -0
  158. data/test/cases/explain_subscriber_test.rb +64 -64
  159. data/test/cases/explain_test.rb +87 -76
  160. data/test/cases/finder_respond_to_test.rb +60 -60
  161. data/test/cases/finder_test.rb +1294 -1169
  162. data/test/cases/fixture_set/file_test.rb +156 -138
  163. data/test/cases/fixtures_test.rb +988 -908
  164. data/test/cases/forbidden_attributes_protection_test.rb +165 -99
  165. data/test/cases/habtm_destroy_order_test.rb +61 -61
  166. data/test/cases/helper.rb +204 -210
  167. data/test/cases/hot_compatibility_test.rb +142 -54
  168. data/test/cases/i18n_test.rb +45 -45
  169. data/test/cases/inheritance_test.rb +606 -375
  170. data/test/cases/integration_test.rb +155 -139
  171. data/test/cases/invalid_connection_test.rb +24 -22
  172. data/test/cases/invertible_migration_test.rb +387 -295
  173. data/test/cases/json_serialization_test.rb +311 -302
  174. data/test/cases/locking_test.rb +493 -477
  175. data/test/cases/log_subscriber_test.rb +225 -136
  176. data/test/cases/migration/change_schema_test.rb +458 -512
  177. data/test/cases/migration/change_table_test.rb +256 -224
  178. data/test/cases/migration/column_attributes_test.rb +176 -192
  179. data/test/cases/migration/column_positioning_test.rb +56 -56
  180. data/test/cases/migration/columns_test.rb +310 -304
  181. data/test/cases/migration/command_recorder_test.rb +350 -305
  182. data/test/cases/migration/compatibility_test.rb +118 -0
  183. data/test/cases/migration/create_join_table_test.rb +157 -148
  184. data/test/cases/migration/foreign_key_test.rb +360 -328
  185. data/test/cases/migration/helper.rb +39 -39
  186. data/test/cases/migration/index_test.rb +218 -216
  187. data/test/cases/migration/logger_test.rb +36 -36
  188. data/test/cases/migration/pending_migrations_test.rb +52 -53
  189. data/test/cases/migration/references_foreign_key_test.rb +216 -169
  190. data/test/cases/migration/references_index_test.rb +101 -101
  191. data/test/cases/migration/references_statements_test.rb +136 -116
  192. data/test/cases/migration/rename_table_test.rb +93 -93
  193. data/test/cases/migration_test.rb +1157 -959
  194. data/test/cases/migrator_test.rb +470 -388
  195. data/test/cases/mixin_test.rb +68 -70
  196. data/test/cases/modules_test.rb +172 -173
  197. data/test/cases/multiparameter_attributes_test.rb +372 -350
  198. data/test/cases/multiple_db_test.rb +122 -115
  199. data/test/cases/nested_attributes_test.rb +1098 -1070
  200. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  201. data/test/cases/persistence_test.rb +1001 -909
  202. data/test/cases/pooled_connections_test.rb +81 -81
  203. data/test/cases/primary_keys_test.rb +376 -237
  204. data/test/cases/query_cache_test.rb +446 -326
  205. data/test/cases/quoting_test.rb +202 -156
  206. data/test/cases/readonly_test.rb +119 -118
  207. data/test/cases/reaper_test.rb +85 -85
  208. data/test/cases/reflection_test.rb +509 -463
  209. data/test/cases/relation/delegation_test.rb +63 -68
  210. data/test/cases/relation/merging_test.rb +157 -161
  211. data/test/cases/relation/mutation_test.rb +183 -165
  212. data/test/cases/relation/or_test.rb +92 -0
  213. data/test/cases/relation/predicate_builder_test.rb +16 -14
  214. data/test/cases/relation/record_fetch_warning_test.rb +40 -0
  215. data/test/cases/relation/where_chain_test.rb +105 -181
  216. data/test/cases/relation/where_clause_test.rb +182 -0
  217. data/test/cases/relation/where_test.rb +322 -300
  218. data/test/cases/relation_test.rb +328 -319
  219. data/test/cases/relations_test.rb +2026 -1815
  220. data/test/cases/reload_models_test.rb +22 -22
  221. data/test/cases/result_test.rb +90 -80
  222. data/test/cases/sanitize_test.rb +176 -83
  223. data/test/cases/schema_dumper_test.rb +457 -463
  224. data/test/cases/schema_loading_test.rb +52 -0
  225. data/test/cases/scoping/default_scoping_test.rb +528 -454
  226. data/test/cases/scoping/named_scoping_test.rb +561 -524
  227. data/test/cases/scoping/relation_scoping_test.rb +400 -357
  228. data/test/cases/secure_token_test.rb +32 -0
  229. data/test/cases/serialization_test.rb +104 -104
  230. data/test/cases/serialized_attribute_test.rb +364 -277
  231. data/test/cases/statement_cache_test.rb +136 -98
  232. data/test/cases/store_test.rb +195 -194
  233. data/test/cases/suppressor_test.rb +63 -0
  234. data/test/cases/tasks/database_tasks_test.rb +462 -398
  235. data/test/cases/tasks/mysql_rake_test.rb +345 -324
  236. data/test/cases/tasks/postgresql_rake_test.rb +304 -250
  237. data/test/cases/tasks/sqlite_rake_test.rb +220 -193
  238. data/test/cases/test_case.rb +131 -123
  239. data/test/cases/test_fixtures_test.rb +36 -0
  240. data/test/cases/time_precision_test.rb +102 -0
  241. data/test/cases/timestamp_test.rb +501 -467
  242. data/test/cases/touch_later_test.rb +121 -0
  243. data/test/cases/transaction_callbacks_test.rb +518 -452
  244. data/test/cases/transaction_isolation_test.rb +106 -106
  245. data/test/cases/transactions_test.rb +834 -817
  246. data/test/cases/type/adapter_specific_registry_test.rb +133 -0
  247. data/test/cases/type/date_time_test.rb +14 -0
  248. data/test/cases/type/integer_test.rb +27 -121
  249. data/test/cases/type/string_test.rb +22 -36
  250. data/test/cases/type/type_map_test.rb +177 -177
  251. data/test/cases/type_test.rb +39 -0
  252. data/test/cases/types_test.rb +24 -141
  253. data/test/cases/unconnected_test.rb +33 -33
  254. data/test/cases/validations/absence_validation_test.rb +73 -0
  255. data/test/cases/validations/association_validation_test.rb +97 -86
  256. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  257. data/test/cases/validations/i18n_validation_test.rb +86 -90
  258. data/test/cases/validations/length_validation_test.rb +79 -47
  259. data/test/cases/validations/presence_validation_test.rb +103 -68
  260. data/test/cases/validations/uniqueness_validation_test.rb +548 -457
  261. data/test/cases/validations_repair_helper.rb +19 -23
  262. data/test/cases/validations_test.rb +194 -165
  263. data/test/cases/view_test.rb +216 -119
  264. data/test/cases/yaml_serialization_test.rb +121 -126
  265. data/test/config.example.yml +97 -0
  266. data/test/config.rb +5 -5
  267. data/test/fixtures/accounts.yml +29 -29
  268. data/test/fixtures/admin/accounts.yml +2 -2
  269. data/test/fixtures/admin/users.yml +10 -10
  270. data/test/fixtures/author_addresses.original +11 -0
  271. data/test/fixtures/author_addresses.yml +17 -17
  272. data/test/fixtures/author_favorites.yml +3 -3
  273. data/test/fixtures/authors.original +17 -0
  274. data/test/fixtures/authors.yml +23 -23
  275. data/test/fixtures/bad_posts.yml +9 -0
  276. data/test/fixtures/binaries.yml +133 -133
  277. data/test/fixtures/books.yml +31 -11
  278. data/test/fixtures/bulbs.yml +5 -5
  279. data/test/fixtures/cars.yml +9 -9
  280. data/test/fixtures/categories.yml +19 -19
  281. data/test/fixtures/categories/special_categories.yml +9 -9
  282. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  283. data/test/fixtures/categories_ordered.yml +7 -7
  284. data/test/fixtures/categories_posts.yml +31 -31
  285. data/test/fixtures/categorizations.yml +23 -23
  286. data/test/fixtures/clubs.yml +8 -8
  287. data/test/fixtures/collections.yml +3 -3
  288. data/test/fixtures/colleges.yml +3 -3
  289. data/test/fixtures/comments.yml +65 -65
  290. data/test/fixtures/companies.yml +67 -67
  291. data/test/fixtures/computers.yml +10 -10
  292. data/test/fixtures/content.yml +3 -0
  293. data/test/fixtures/content_positions.yml +3 -0
  294. data/test/fixtures/courses.yml +8 -8
  295. data/test/fixtures/customers.yml +25 -25
  296. data/test/fixtures/dashboards.yml +6 -6
  297. data/test/fixtures/dead_parrots.yml +5 -0
  298. data/test/fixtures/developers.yml +22 -22
  299. data/test/fixtures/developers_projects.yml +16 -16
  300. data/test/fixtures/dog_lovers.yml +7 -7
  301. data/test/fixtures/dogs.yml +4 -4
  302. data/test/fixtures/doubloons.yml +3 -3
  303. data/test/fixtures/edges.yml +5 -5
  304. data/test/fixtures/entrants.yml +14 -14
  305. data/test/fixtures/essays.yml +6 -6
  306. data/test/fixtures/faces.yml +11 -11
  307. data/test/fixtures/fk_test_has_fk.yml +3 -3
  308. data/test/fixtures/fk_test_has_pk.yml +1 -1
  309. data/test/fixtures/friendships.yml +4 -4
  310. data/test/fixtures/funny_jokes.yml +10 -10
  311. data/test/fixtures/interests.yml +33 -33
  312. data/test/fixtures/items.yml +3 -3
  313. data/test/fixtures/jobs.yml +7 -7
  314. data/test/fixtures/legacy_things.yml +3 -3
  315. data/test/fixtures/live_parrots.yml +4 -0
  316. data/test/fixtures/mateys.yml +4 -4
  317. data/test/fixtures/member_details.yml +8 -8
  318. data/test/fixtures/member_types.yml +6 -6
  319. data/test/fixtures/members.yml +11 -11
  320. data/test/fixtures/memberships.yml +34 -34
  321. data/test/fixtures/men.yml +5 -5
  322. data/test/fixtures/minimalistics.yml +2 -2
  323. data/test/fixtures/minivans.yml +5 -5
  324. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  325. data/test/fixtures/mixins.yml +29 -29
  326. data/test/fixtures/movies.yml +7 -7
  327. data/test/fixtures/naked/yml/accounts.yml +1 -1
  328. data/test/fixtures/naked/yml/companies.yml +1 -1
  329. data/test/fixtures/naked/yml/courses.yml +1 -1
  330. data/test/fixtures/naked/yml/parrots.yml +2 -0
  331. data/test/fixtures/naked/yml/trees.yml +3 -0
  332. data/test/fixtures/nodes.yml +29 -0
  333. data/test/fixtures/organizations.yml +5 -5
  334. data/test/fixtures/other_comments.yml +6 -0
  335. data/test/fixtures/other_dogs.yml +2 -0
  336. data/test/fixtures/other_posts.yml +7 -0
  337. data/test/fixtures/other_topics.yml +42 -42
  338. data/test/fixtures/owners.yml +9 -9
  339. data/test/fixtures/parrots.yml +27 -27
  340. data/test/fixtures/parrots_pirates.yml +7 -7
  341. data/test/fixtures/people.yml +24 -24
  342. data/test/fixtures/peoples_treasures.yml +3 -3
  343. data/test/fixtures/pets.yml +19 -19
  344. data/test/fixtures/pirates.yml +15 -12
  345. data/test/fixtures/posts.yml +80 -80
  346. data/test/fixtures/price_estimates.yml +16 -7
  347. data/test/fixtures/products.yml +4 -4
  348. data/test/fixtures/projects.yml +7 -7
  349. data/test/fixtures/ratings.yml +14 -14
  350. data/test/fixtures/readers.yml +11 -11
  351. data/test/fixtures/references.yml +17 -17
  352. data/test/fixtures/reserved_words/distinct.yml +5 -5
  353. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  354. data/test/fixtures/reserved_words/group.yml +14 -14
  355. data/test/fixtures/reserved_words/select.yml +8 -8
  356. data/test/fixtures/reserved_words/values.yml +7 -7
  357. data/test/fixtures/ships.yml +6 -6
  358. data/test/fixtures/speedometers.yml +8 -8
  359. data/test/fixtures/sponsors.yml +12 -12
  360. data/test/fixtures/string_key_objects.yml +7 -7
  361. data/test/fixtures/subscribers.yml +10 -10
  362. data/test/fixtures/subscriptions.yml +12 -12
  363. data/test/fixtures/taggings.yml +78 -78
  364. data/test/fixtures/tags.yml +11 -11
  365. data/test/fixtures/tasks.yml +7 -7
  366. data/test/fixtures/teapots.yml +3 -3
  367. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  368. data/test/fixtures/to_be_linked/users.yml +10 -10
  369. data/test/fixtures/topics.yml +49 -49
  370. data/test/fixtures/toys.yml +14 -14
  371. data/test/fixtures/traffic_lights.yml +9 -9
  372. data/test/fixtures/treasures.yml +10 -10
  373. data/test/fixtures/trees.yml +3 -0
  374. data/test/fixtures/uuid_children.yml +3 -3
  375. data/test/fixtures/uuid_parents.yml +2 -2
  376. data/test/fixtures/variants.yml +4 -4
  377. data/test/fixtures/vegetables.yml +19 -19
  378. data/test/fixtures/vertices.yml +3 -3
  379. data/test/fixtures/warehouse_things.yml +2 -2
  380. data/test/fixtures/zines.yml +5 -5
  381. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  382. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  383. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  384. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -9
  385. data/test/migrations/missing/1_people_have_last_names.rb +9 -9
  386. data/test/migrations/missing/3_we_need_reminders.rb +12 -12
  387. data/test/migrations/missing/4_innocent_jointable.rb +12 -12
  388. data/test/migrations/rename/1_we_need_things.rb +11 -11
  389. data/test/migrations/rename/2_rename_things.rb +9 -9
  390. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  391. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  392. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  393. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  394. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  395. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  396. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  397. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  398. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  399. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  400. data/test/migrations/valid/2_we_need_reminders.rb +12 -12
  401. data/test/migrations/valid/3_innocent_jointable.rb +12 -12
  402. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  403. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -12
  404. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -12
  405. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  406. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  407. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  408. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  409. data/test/models/admin.rb +5 -5
  410. data/test/models/admin/account.rb +3 -3
  411. data/test/models/admin/randomly_named_c1.rb +6 -2
  412. data/test/models/admin/user.rb +40 -40
  413. data/test/models/aircraft.rb +5 -4
  414. data/test/models/arunit2_model.rb +3 -3
  415. data/test/models/author.rb +209 -212
  416. data/test/models/auto_id.rb +4 -4
  417. data/test/models/autoloadable/extra_firm.rb +2 -2
  418. data/test/models/binary.rb +2 -2
  419. data/test/models/bird.rb +12 -12
  420. data/test/models/book.rb +23 -18
  421. data/test/models/boolean.rb +2 -2
  422. data/test/models/bulb.rb +52 -51
  423. data/test/models/cake_designer.rb +3 -3
  424. data/test/models/car.rb +29 -26
  425. data/test/models/carrier.rb +2 -2
  426. data/test/models/cat.rb +10 -0
  427. data/test/models/categorization.rb +19 -19
  428. data/test/models/category.rb +35 -35
  429. data/test/models/chef.rb +8 -7
  430. data/test/models/citation.rb +3 -3
  431. data/test/models/club.rb +25 -23
  432. data/test/models/college.rb +10 -10
  433. data/test/models/column.rb +3 -3
  434. data/test/models/column_name.rb +3 -3
  435. data/test/models/comment.rb +76 -64
  436. data/test/models/company.rb +230 -228
  437. data/test/models/company_in_module.rb +98 -98
  438. data/test/models/computer.rb +3 -3
  439. data/test/models/contact.rb +41 -41
  440. data/test/models/content.rb +40 -0
  441. data/test/models/contract.rb +20 -20
  442. data/test/models/country.rb +7 -7
  443. data/test/models/course.rb +6 -6
  444. data/test/models/customer.rb +83 -77
  445. data/test/models/customer_carrier.rb +14 -14
  446. data/test/models/dashboard.rb +3 -3
  447. data/test/models/default.rb +2 -2
  448. data/test/models/department.rb +4 -4
  449. data/test/models/developer.rb +274 -255
  450. data/test/models/dog.rb +5 -5
  451. data/test/models/dog_lover.rb +5 -5
  452. data/test/models/doubloon.rb +12 -12
  453. data/test/models/drink_designer.rb +3 -3
  454. data/test/models/edge.rb +5 -5
  455. data/test/models/electron.rb +5 -5
  456. data/test/models/engine.rb +4 -4
  457. data/test/models/entrant.rb +3 -3
  458. data/test/models/essay.rb +5 -5
  459. data/test/models/event.rb +3 -3
  460. data/test/models/eye.rb +37 -37
  461. data/test/models/face.rb +9 -9
  462. data/test/models/friendship.rb +6 -6
  463. data/test/models/guid.rb +2 -2
  464. data/test/models/guitar.rb +4 -0
  465. data/test/models/hotel.rb +11 -9
  466. data/test/models/image.rb +3 -3
  467. data/test/models/interest.rb +5 -5
  468. data/test/models/invoice.rb +4 -4
  469. data/test/models/item.rb +7 -7
  470. data/test/models/job.rb +7 -7
  471. data/test/models/joke.rb +7 -7
  472. data/test/models/keyboard.rb +3 -3
  473. data/test/models/legacy_thing.rb +3 -3
  474. data/test/models/lesson.rb +11 -11
  475. data/test/models/line_item.rb +3 -3
  476. data/test/models/liquid.rb +4 -4
  477. data/test/models/man.rb +11 -11
  478. data/test/models/matey.rb +4 -4
  479. data/test/models/member.rb +42 -41
  480. data/test/models/member_detail.rb +8 -7
  481. data/test/models/member_type.rb +3 -3
  482. data/test/models/membership.rb +35 -35
  483. data/test/models/mentor.rb +3 -0
  484. data/test/models/minimalistic.rb +2 -2
  485. data/test/models/minivan.rb +9 -9
  486. data/test/models/mixed_case_monkey.rb +3 -3
  487. data/test/models/mocktail_designer.rb +2 -0
  488. data/test/models/molecule.rb +6 -6
  489. data/test/models/movie.rb +5 -5
  490. data/test/models/node.rb +5 -0
  491. data/test/models/non_primary_key.rb +2 -0
  492. data/test/models/notification.rb +3 -0
  493. data/test/models/order.rb +4 -4
  494. data/test/models/organization.rb +14 -14
  495. data/test/models/other_dog.rb +5 -0
  496. data/test/models/owner.rb +37 -34
  497. data/test/models/parrot.rb +28 -29
  498. data/test/models/person.rb +142 -143
  499. data/test/models/personal_legacy_thing.rb +4 -4
  500. data/test/models/pet.rb +18 -15
  501. data/test/models/pet_treasure.rb +6 -0
  502. data/test/models/pirate.rb +92 -92
  503. data/test/models/possession.rb +3 -3
  504. data/test/models/post.rb +273 -264
  505. data/test/models/price_estimate.rb +4 -4
  506. data/test/models/professor.rb +5 -5
  507. data/test/models/project.rb +40 -31
  508. data/test/models/publisher.rb +2 -2
  509. data/test/models/publisher/article.rb +4 -4
  510. data/test/models/publisher/magazine.rb +3 -3
  511. data/test/models/randomly_named_c1.rb +1 -1
  512. data/test/models/rating.rb +4 -4
  513. data/test/models/reader.rb +23 -23
  514. data/test/models/recipe.rb +3 -0
  515. data/test/models/record.rb +2 -2
  516. data/test/models/reference.rb +22 -22
  517. data/test/models/reply.rb +61 -61
  518. data/test/models/ship.rb +39 -33
  519. data/test/models/ship_part.rb +8 -8
  520. data/test/models/shop.rb +17 -17
  521. data/test/models/shop_account.rb +6 -6
  522. data/test/models/speedometer.rb +6 -6
  523. data/test/models/sponsor.rb +7 -7
  524. data/test/models/string_key_object.rb +3 -3
  525. data/test/models/student.rb +4 -4
  526. data/test/models/subject.rb +16 -16
  527. data/test/models/subscriber.rb +8 -8
  528. data/test/models/subscription.rb +4 -4
  529. data/test/models/tag.rb +13 -7
  530. data/test/models/tagging.rb +13 -13
  531. data/test/models/task.rb +5 -5
  532. data/test/models/topic.rb +118 -124
  533. data/test/models/toy.rb +6 -6
  534. data/test/models/traffic_light.rb +4 -4
  535. data/test/models/treasure.rb +14 -14
  536. data/test/models/treaty.rb +7 -7
  537. data/test/models/tree.rb +3 -0
  538. data/test/models/tuning_peg.rb +4 -0
  539. data/test/models/tyre.rb +11 -11
  540. data/test/models/user.rb +14 -0
  541. data/test/models/uuid_child.rb +3 -3
  542. data/test/models/uuid_item.rb +6 -0
  543. data/test/models/uuid_parent.rb +3 -3
  544. data/test/models/vegetables.rb +24 -24
  545. data/test/models/vehicle.rb +6 -6
  546. data/test/models/vertex.rb +9 -9
  547. data/test/models/warehouse_thing.rb +5 -5
  548. data/test/models/wheel.rb +3 -3
  549. data/test/models/without_table.rb +3 -3
  550. data/test/models/zine.rb +3 -3
  551. data/test/schema/mysql2_specific_schema.rb +68 -58
  552. data/test/schema/oracle_specific_schema.rb +40 -43
  553. data/test/schema/postgresql_specific_schema.rb +114 -202
  554. data/test/schema/schema.rb +1057 -952
  555. data/test/schema/schema.rb.original +1057 -0
  556. data/test/schema/sqlite_specific_schema.rb +18 -22
  557. data/test/support/config.rb +43 -43
  558. data/test/support/connection.rb +23 -22
  559. data/test/support/connection_helper.rb +14 -14
  560. data/test/support/ddl_helper.rb +8 -8
  561. data/test/support/schema_dumping_helper.rb +20 -20
  562. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  563. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  564. metadata +129 -24
  565. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
  566. data/test/cases/attribute_methods/serialization_test.rb +0 -29
  567. data/test/cases/migration/change_schema_test - Copy.rb +0 -448
  568. data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
  569. data/test/cases/migration/table_and_index_test.rb +0 -24
  570. data/test/cases/relation/where_test2.rb +0 -36
  571. data/test/cases/type/decimal_test.rb +0 -56
  572. data/test/cases/type/unsigned_integer_test.rb +0 -18
  573. data/test/cases/xml_serialization_test.rb +0 -457
  574. data/test/connections/native_ibm_db/connection.rb +0 -44
  575. data/test/fixtures/naked/csv/accounts.csv +0 -1
  576. data/test/schema/i5/ibm_db_specific_schema.rb +0 -137
  577. data/test/schema/ids/ibm_db_specific_schema.rb +0 -140
  578. data/test/schema/luw/ibm_db_specific_schema.rb +0 -137
  579. data/test/schema/mysql_specific_schema.rb +0 -70
  580. 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