ibm_db 3.0.4-x86-mingw32 → 3.0.5-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 (463) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -1
  3. data/LICENSE +1 -1
  4. data/MANIFEST +14 -14
  5. data/README +225 -225
  6. data/ext/Makefile.nt32 +181 -181
  7. data/ext/Makefile.nt32.191 +212 -212
  8. data/ext/extconf.rb +291 -291
  9. data/ext/ibm_db.c +11887 -11884
  10. data/ext/ruby_ibm_db.h +241 -241
  11. data/ext/ruby_ibm_db_cli.c +866 -866
  12. data/ext/ruby_ibm_db_cli.h +500 -500
  13. data/init.rb +41 -41
  14. data/lib/IBM_DB.rb +27 -27
  15. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3177 -3177
  16. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +1 -1
  17. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  18. data/lib/mswin32/ibm_db.rb +122 -122
  19. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  20. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  21. data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
  22. data/test/active_record/connection_adapters/fake_adapter.rb +46 -46
  23. data/test/assets/example.log +1 -1
  24. data/test/assets/test.txt +1 -1
  25. data/test/cases/adapter_test.rb +276 -261
  26. data/test/cases/aggregations_test.rb +158 -158
  27. data/test/cases/ar_schema_test.rb +161 -161
  28. data/test/cases/associations/association_scope_test.rb +21 -21
  29. data/test/cases/associations/belongs_to_associations_test.rb +1029 -1029
  30. data/test/cases/associations/callbacks_test.rb +192 -192
  31. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  32. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +26 -26
  33. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  34. data/test/cases/associations/eager_load_nested_include_test.rb +128 -128
  35. data/test/cases/associations/eager_singularization_test.rb +148 -148
  36. data/test/cases/associations/eager_test.rb +1429 -1411
  37. data/test/cases/associations/extension_test.rb +82 -82
  38. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +972 -932
  39. data/test/cases/associations/has_many_associations_test.rb +2182 -2162
  40. data/test/cases/associations/has_many_through_associations_test.rb +1204 -1204
  41. data/test/cases/associations/has_one_associations_test.rb +610 -610
  42. data/test/cases/associations/has_one_through_associations_test.rb +380 -380
  43. data/test/cases/associations/inner_join_association_test.rb +139 -139
  44. data/test/cases/associations/inverse_associations_test.rb +706 -693
  45. data/test/cases/associations/join_model_test.rb +754 -754
  46. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  47. data/test/cases/associations/required_test.rb +82 -82
  48. data/test/cases/associations_test.rb +380 -380
  49. data/test/cases/attribute_decorators_test.rb +125 -125
  50. data/test/cases/attribute_methods/read_test.rb +60 -60
  51. data/test/cases/attribute_methods/serialization_test.rb +29 -29
  52. data/test/cases/attribute_methods_test.rb +952 -952
  53. data/test/cases/attribute_set_test.rb +210 -200
  54. data/test/cases/attribute_test.rb +180 -180
  55. data/test/cases/attributes_test.rb +136 -136
  56. data/test/cases/autosave_association_test.rb +1595 -1595
  57. data/test/cases/base_test.rb +1664 -1638
  58. data/test/cases/batches_test.rb +212 -212
  59. data/test/cases/binary_test.rb +52 -52
  60. data/test/cases/bind_parameter_test.rb +100 -100
  61. data/test/cases/calculations_test.rb +646 -646
  62. data/test/cases/callbacks_test.rb +543 -543
  63. data/test/cases/clone_test.rb +40 -40
  64. data/test/cases/coders/yaml_column_test.rb +63 -63
  65. data/test/cases/column_alias_test.rb +17 -17
  66. data/test/cases/column_definition_test.rb +123 -123
  67. data/test/cases/connection_adapters/adapter_leasing_test.rb +54 -54
  68. data/test/cases/connection_adapters/connection_handler_test.rb +53 -53
  69. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  70. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +293 -293
  71. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +65 -65
  72. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  73. data/test/cases/connection_adapters/schema_cache_test.rb +56 -56
  74. data/test/cases/connection_adapters/type_lookup_test.rb +110 -110
  75. data/test/cases/connection_management_test.rb +122 -122
  76. data/test/cases/connection_pool_test.rb +346 -346
  77. data/test/cases/connection_specification/resolver_test.rb +116 -116
  78. data/test/cases/core_test.rb +112 -112
  79. data/test/cases/counter_cache_test.rb +209 -209
  80. data/test/cases/custom_locking_test.rb +17 -17
  81. data/test/cases/database_statements_test.rb +19 -19
  82. data/test/cases/date_time_test.rb +61 -61
  83. data/test/cases/defaults_test.rb +223 -223
  84. data/test/cases/dirty_test.rb +785 -775
  85. data/test/cases/disconnected_test.rb +28 -28
  86. data/test/cases/dup_test.rb +157 -157
  87. data/test/cases/enum_test.rb +290 -290
  88. data/test/cases/explain_subscriber_test.rb +64 -64
  89. data/test/cases/explain_test.rb +76 -76
  90. data/test/cases/finder_respond_to_test.rb +60 -60
  91. data/test/cases/finder_test.rb +1169 -1166
  92. data/test/cases/fixture_set/file_test.rb +138 -138
  93. data/test/cases/fixtures_test.rb +908 -897
  94. data/test/cases/forbidden_attributes_protection_test.rb +99 -99
  95. data/test/cases/habtm_destroy_order_test.rb +61 -61
  96. data/test/cases/helper.rb +210 -210
  97. data/test/cases/hot_compatibility_test.rb +54 -54
  98. data/test/cases/i18n_test.rb +45 -45
  99. data/test/cases/inheritance_test.rb +375 -375
  100. data/test/cases/integration_test.rb +139 -139
  101. data/test/cases/invalid_connection_test.rb +22 -22
  102. data/test/cases/invalid_date_test.rb +32 -32
  103. data/test/cases/invertible_migration_test.rb +295 -295
  104. data/test/cases/json_serialization_test.rb +302 -302
  105. data/test/cases/locking_test.rb +477 -477
  106. data/test/cases/log_subscriber_test.rb +136 -136
  107. data/test/cases/migration/change_schema_test - Copy.rb +448 -448
  108. data/test/cases/migration/change_schema_test.rb +512 -472
  109. data/test/cases/migration/change_table_test.rb +224 -224
  110. data/test/cases/migration/column_attributes_test.rb +192 -192
  111. data/test/cases/migration/column_positioning_test.rb +56 -56
  112. data/test/cases/migration/columns_test.rb +304 -304
  113. data/test/cases/migration/command_recorder_test.rb +305 -305
  114. data/test/cases/migration/create_join_table_test.rb +148 -148
  115. data/test/cases/migration/foreign_key_test - Changed.rb +325 -325
  116. data/test/cases/migration/foreign_key_test.rb +328 -360
  117. data/test/cases/migration/helper.rb +39 -39
  118. data/test/cases/migration/index_test.rb +216 -216
  119. data/test/cases/migration/logger_test.rb +36 -36
  120. data/test/cases/migration/pending_migrations_test.rb +53 -53
  121. data/test/cases/migration/references_foreign_key_test.rb +169 -214
  122. data/test/cases/migration/references_index_test.rb +101 -101
  123. data/test/cases/migration/references_statements_test.rb +116 -116
  124. data/test/cases/migration/rename_table_test.rb +93 -93
  125. data/test/cases/migration/table_and_index_test.rb +24 -24
  126. data/test/cases/migration_test.rb +959 -959
  127. data/test/cases/migrator_test.rb +388 -388
  128. data/test/cases/mixin_test.rb +70 -70
  129. data/test/cases/modules_test.rb +173 -173
  130. data/test/cases/multiparameter_attributes_test.rb +350 -350
  131. data/test/cases/multiple_db_test.rb +115 -115
  132. data/test/cases/nested_attributes_test.rb +1070 -1057
  133. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  134. data/test/cases/persistence_test.rb +909 -909
  135. data/test/cases/pooled_connections_test.rb +81 -81
  136. data/test/cases/primary_keys_test.rb +237 -237
  137. data/test/cases/query_cache_test.rb +326 -326
  138. data/test/cases/quoting_test.rb +156 -156
  139. data/test/cases/readonly_test.rb +118 -118
  140. data/test/cases/reaper_test.rb +85 -85
  141. data/test/cases/reflection_test.rb +463 -454
  142. data/test/cases/relation/delegation_test.rb +68 -68
  143. data/test/cases/relation/merging_test.rb +161 -161
  144. data/test/cases/relation/mutation_test.rb +165 -165
  145. data/test/cases/relation/predicate_builder_test.rb +14 -14
  146. data/test/cases/relation/where_chain_test.rb +181 -181
  147. data/test/cases/relation/where_test.rb +300 -300
  148. data/test/cases/relation/where_test2.rb +36 -36
  149. data/test/cases/relation_test.rb +319 -297
  150. data/test/cases/relations_test.rb +1815 -1815
  151. data/test/cases/reload_models_test.rb +22 -22
  152. data/test/cases/result_test.rb +80 -80
  153. data/test/cases/sanitize_test.rb +83 -83
  154. data/test/cases/schema_dumper_test.rb +463 -463
  155. data/test/cases/scoping/default_scoping_test.rb +454 -454
  156. data/test/cases/scoping/named_scoping_test.rb +524 -524
  157. data/test/cases/scoping/relation_scoping_test.rb +357 -357
  158. data/test/cases/serialization_test.rb +104 -104
  159. data/test/cases/serialized_attribute_test.rb +277 -277
  160. data/test/cases/statement_cache_test.rb +98 -98
  161. data/test/cases/store_test.rb +194 -194
  162. data/test/cases/tasks/database_tasks_test.rb +398 -396
  163. data/test/cases/tasks/mysql_rake_test.rb +324 -311
  164. data/test/cases/tasks/postgresql_rake_test.rb +250 -245
  165. data/test/cases/tasks/sqlite_rake_test.rb +193 -193
  166. data/test/cases/test_case.rb +123 -123
  167. data/test/cases/timestamp_test.rb +467 -468
  168. data/test/cases/transaction_callbacks_test.rb +452 -452
  169. data/test/cases/transaction_isolation_test.rb +106 -106
  170. data/test/cases/transactions_test.rb +817 -817
  171. data/test/cases/type/decimal_test.rb +56 -51
  172. data/test/cases/type/integer_test.rb +121 -121
  173. data/test/cases/type/string_test.rb +36 -36
  174. data/test/cases/type/type_map_test.rb +177 -177
  175. data/test/cases/type/unsigned_integer_test.rb +18 -18
  176. data/test/cases/types_test.rb +141 -141
  177. data/test/cases/unconnected_test.rb +33 -33
  178. data/test/cases/validations/association_validation_test.rb +86 -86
  179. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  180. data/test/cases/validations/i18n_validation_test.rb +90 -90
  181. data/test/cases/validations/length_validation_test.rb +47 -47
  182. data/test/cases/validations/presence_validation_test.rb +68 -68
  183. data/test/cases/validations/uniqueness_validation_test.rb +457 -434
  184. data/test/cases/validations_repair_helper.rb +23 -23
  185. data/test/cases/validations_test.rb +165 -165
  186. data/test/cases/view_test.rb +119 -113
  187. data/test/cases/xml_serialization_test.rb +457 -457
  188. data/test/cases/yaml_serialization_test.rb +126 -86
  189. data/test/config.rb +5 -5
  190. data/test/config.yml +154 -154
  191. data/test/connections/native_ibm_db/connection.rb +43 -43
  192. data/test/fixtures/accounts.yml +29 -29
  193. data/test/fixtures/admin/accounts.yml +2 -2
  194. data/test/fixtures/admin/randomly_named_a9.yml +7 -7
  195. data/test/fixtures/admin/randomly_named_b0.yml +7 -7
  196. data/test/fixtures/admin/users.yml +10 -10
  197. data/test/fixtures/author_addresses.yml +17 -17
  198. data/test/fixtures/author_favorites.yml +3 -3
  199. data/test/fixtures/authors.yml +23 -23
  200. data/test/fixtures/binaries.yml +133 -133
  201. data/test/fixtures/books.yml +11 -11
  202. data/test/fixtures/bulbs.yml +5 -5
  203. data/test/fixtures/cars.yml +9 -9
  204. data/test/fixtures/categories.yml +19 -19
  205. data/test/fixtures/categories/special_categories.yml +9 -9
  206. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  207. data/test/fixtures/categories_ordered.yml +7 -7
  208. data/test/fixtures/categories_posts.yml +31 -31
  209. data/test/fixtures/categorizations.yml +23 -23
  210. data/test/fixtures/clubs.yml +8 -8
  211. data/test/fixtures/collections.yml +3 -3
  212. data/test/fixtures/colleges.yml +3 -3
  213. data/test/fixtures/comments.yml +65 -65
  214. data/test/fixtures/companies.yml +67 -67
  215. data/test/fixtures/computers.yml +10 -10
  216. data/test/fixtures/courses.yml +8 -8
  217. data/test/fixtures/customers.yml +25 -25
  218. data/test/fixtures/dashboards.yml +6 -6
  219. data/test/fixtures/developers.yml +21 -21
  220. data/test/fixtures/developers_projects.yml +16 -16
  221. data/test/fixtures/dog_lovers.yml +7 -7
  222. data/test/fixtures/dogs.yml +4 -4
  223. data/test/fixtures/doubloons.yml +3 -3
  224. data/test/fixtures/edges.yml +5 -5
  225. data/test/fixtures/entrants.yml +14 -14
  226. data/test/fixtures/essays.yml +6 -6
  227. data/test/fixtures/faces.yml +11 -11
  228. data/test/fixtures/fk_test_has_fk.yml +3 -3
  229. data/test/fixtures/fk_test_has_pk.yml +1 -1
  230. data/test/fixtures/friendships.yml +4 -4
  231. data/test/fixtures/funny_jokes.yml +10 -10
  232. data/test/fixtures/interests.yml +33 -33
  233. data/test/fixtures/items.yml +3 -3
  234. data/test/fixtures/jobs.yml +7 -7
  235. data/test/fixtures/legacy_things.yml +3 -3
  236. data/test/fixtures/mateys.yml +4 -4
  237. data/test/fixtures/member_details.yml +8 -8
  238. data/test/fixtures/member_types.yml +6 -6
  239. data/test/fixtures/members.yml +11 -11
  240. data/test/fixtures/memberships.yml +34 -34
  241. data/test/fixtures/men.yml +5 -5
  242. data/test/fixtures/minimalistics.yml +2 -2
  243. data/test/fixtures/minivans.yml +5 -5
  244. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  245. data/test/fixtures/mixins.yml +29 -29
  246. data/test/fixtures/movies.yml +7 -7
  247. data/test/fixtures/naked/csv/accounts.csv +1 -1
  248. data/test/fixtures/naked/yml/accounts.yml +1 -1
  249. data/test/fixtures/naked/yml/companies.yml +1 -1
  250. data/test/fixtures/naked/yml/courses.yml +1 -1
  251. data/test/fixtures/organizations.yml +5 -5
  252. data/test/fixtures/other_topics.yml +42 -42
  253. data/test/fixtures/owners.yml +9 -9
  254. data/test/fixtures/parrots.yml +27 -27
  255. data/test/fixtures/parrots_pirates.yml +7 -7
  256. data/test/fixtures/people.yml +24 -24
  257. data/test/fixtures/peoples_treasures.yml +3 -3
  258. data/test/fixtures/pets.yml +19 -19
  259. data/test/fixtures/pirates.yml +12 -12
  260. data/test/fixtures/posts.yml +80 -80
  261. data/test/fixtures/price_estimates.yml +7 -7
  262. data/test/fixtures/products.yml +4 -4
  263. data/test/fixtures/projects.yml +7 -7
  264. data/test/fixtures/randomly_named_a9.yml +7 -7
  265. data/test/fixtures/ratings.yml +14 -14
  266. data/test/fixtures/readers.yml +11 -11
  267. data/test/fixtures/references.yml +17 -17
  268. data/test/fixtures/reserved_words/distinct.yml +5 -5
  269. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  270. data/test/fixtures/reserved_words/group.yml +14 -14
  271. data/test/fixtures/reserved_words/select.yml +8 -8
  272. data/test/fixtures/reserved_words/values.yml +7 -7
  273. data/test/fixtures/ships.yml +6 -6
  274. data/test/fixtures/speedometers.yml +8 -8
  275. data/test/fixtures/sponsors.yml +12 -12
  276. data/test/fixtures/string_key_objects.yml +7 -7
  277. data/test/fixtures/subscribers.yml +10 -10
  278. data/test/fixtures/subscriptions.yml +12 -12
  279. data/test/fixtures/taggings.yml +78 -78
  280. data/test/fixtures/tags.yml +11 -11
  281. data/test/fixtures/tasks.yml +7 -7
  282. data/test/fixtures/teapots.yml +3 -3
  283. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  284. data/test/fixtures/to_be_linked/users.yml +10 -10
  285. data/test/fixtures/topics.yml +49 -49
  286. data/test/fixtures/toys.yml +14 -14
  287. data/test/fixtures/traffic_lights.yml +9 -9
  288. data/test/fixtures/treasures.yml +10 -10
  289. data/test/fixtures/uuid_children.yml +3 -3
  290. data/test/fixtures/uuid_parents.yml +2 -2
  291. data/test/fixtures/variants.yml +4 -4
  292. data/test/fixtures/vegetables.yml +19 -19
  293. data/test/fixtures/vertices.yml +3 -3
  294. data/test/fixtures/warehouse_things.yml +2 -2
  295. data/test/fixtures/zines.yml +5 -5
  296. data/test/ibm_db_test.rb +24 -24
  297. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  298. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  299. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  300. data/test/migrations/missing/1000_people_have_middle_names.rb +8 -8
  301. data/test/migrations/missing/1_people_have_last_names.rb +8 -8
  302. data/test/migrations/missing/3_we_need_reminders.rb +11 -11
  303. data/test/migrations/missing/4_innocent_jointable.rb +11 -11
  304. data/test/migrations/rename/1_we_need_things.rb +10 -10
  305. data/test/migrations/rename/2_rename_things.rb +8 -8
  306. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  307. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  308. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  309. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  310. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  311. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  312. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  313. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  314. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  315. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  316. data/test/migrations/valid/2_we_need_reminders.rb +11 -11
  317. data/test/migrations/valid/3_innocent_jointable.rb +11 -11
  318. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  319. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +11 -11
  320. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +11 -11
  321. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  322. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  323. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  324. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  325. data/test/models/admin.rb +4 -4
  326. data/test/models/admin/account.rb +2 -2
  327. data/test/models/admin/randomly_named_c1.rb +3 -3
  328. data/test/models/admin/user.rb +40 -40
  329. data/test/models/aircraft.rb +4 -4
  330. data/test/models/arunit2_model.rb +3 -3
  331. data/test/models/author.rb +212 -212
  332. data/test/models/auto_id.rb +4 -4
  333. data/test/models/autoloadable/extra_firm.rb +2 -2
  334. data/test/models/binary.rb +1 -1
  335. data/test/models/bird.rb +12 -12
  336. data/test/models/book.rb +18 -18
  337. data/test/models/boolean.rb +2 -2
  338. data/test/models/bulb.rb +51 -51
  339. data/test/models/cake_designer.rb +3 -3
  340. data/test/models/car.rb +26 -26
  341. data/test/models/carrier.rb +2 -2
  342. data/test/models/categorization.rb +19 -19
  343. data/test/models/category.rb +35 -35
  344. data/test/models/chef.rb +7 -3
  345. data/test/models/citation.rb +3 -3
  346. data/test/models/club.rb +23 -23
  347. data/test/models/college.rb +10 -10
  348. data/test/models/column.rb +3 -3
  349. data/test/models/column_name.rb +3 -3
  350. data/test/models/comment.rb +64 -64
  351. data/test/models/company.rb +228 -225
  352. data/test/models/company_in_module.rb +98 -98
  353. data/test/models/computer.rb +3 -3
  354. data/test/models/contact.rb +41 -41
  355. data/test/models/contract.rb +20 -20
  356. data/test/models/country.rb +7 -7
  357. data/test/models/course.rb +6 -6
  358. data/test/models/customer.rb +77 -77
  359. data/test/models/customer_carrier.rb +14 -14
  360. data/test/models/dashboard.rb +3 -3
  361. data/test/models/default.rb +2 -2
  362. data/test/models/department.rb +4 -4
  363. data/test/models/developer.rb +255 -252
  364. data/test/models/dog.rb +5 -5
  365. data/test/models/dog_lover.rb +5 -5
  366. data/test/models/doubloon.rb +12 -12
  367. data/test/models/drink_designer.rb +3 -3
  368. data/test/models/edge.rb +5 -5
  369. data/test/models/electron.rb +5 -5
  370. data/test/models/engine.rb +4 -4
  371. data/test/models/entrant.rb +3 -3
  372. data/test/models/essay.rb +5 -5
  373. data/test/models/event.rb +2 -2
  374. data/test/models/eye.rb +37 -37
  375. data/test/models/face.rb +9 -9
  376. data/test/models/friendship.rb +6 -6
  377. data/test/models/guid.rb +1 -1
  378. data/test/models/hotel.rb +9 -6
  379. data/test/models/image.rb +3 -3
  380. data/test/models/interest.rb +5 -5
  381. data/test/models/invoice.rb +4 -4
  382. data/test/models/item.rb +7 -7
  383. data/test/models/job.rb +7 -7
  384. data/test/models/joke.rb +7 -7
  385. data/test/models/keyboard.rb +3 -3
  386. data/test/models/legacy_thing.rb +3 -3
  387. data/test/models/lesson.rb +11 -11
  388. data/test/models/line_item.rb +3 -3
  389. data/test/models/liquid.rb +4 -4
  390. data/test/models/man.rb +11 -11
  391. data/test/models/matey.rb +4 -4
  392. data/test/models/member.rb +41 -41
  393. data/test/models/member_detail.rb +7 -7
  394. data/test/models/member_type.rb +3 -3
  395. data/test/models/membership.rb +35 -35
  396. data/test/models/minimalistic.rb +2 -2
  397. data/test/models/minivan.rb +9 -9
  398. data/test/models/mixed_case_monkey.rb +3 -3
  399. data/test/models/molecule.rb +6 -6
  400. data/test/models/movie.rb +5 -5
  401. data/test/models/order.rb +4 -4
  402. data/test/models/organization.rb +14 -14
  403. data/test/models/owner.rb +34 -34
  404. data/test/models/parrot.rb +29 -29
  405. data/test/models/person.rb +143 -143
  406. data/test/models/personal_legacy_thing.rb +4 -4
  407. data/test/models/pet.rb +15 -15
  408. data/test/models/pirate.rb +92 -92
  409. data/test/models/possession.rb +3 -3
  410. data/test/models/post.rb +264 -264
  411. data/test/models/price_estimate.rb +4 -4
  412. data/test/models/professor.rb +5 -5
  413. data/test/models/project.rb +31 -29
  414. data/test/models/publisher.rb +2 -2
  415. data/test/models/publisher/article.rb +4 -4
  416. data/test/models/publisher/magazine.rb +3 -3
  417. data/test/models/randomly_named_c1.rb +3 -3
  418. data/test/models/rating.rb +4 -4
  419. data/test/models/reader.rb +23 -23
  420. data/test/models/record.rb +2 -2
  421. data/test/models/reference.rb +22 -22
  422. data/test/models/reply.rb +61 -61
  423. data/test/models/ship.rb +33 -33
  424. data/test/models/ship_part.rb +7 -7
  425. data/test/models/shop.rb +17 -17
  426. data/test/models/shop_account.rb +6 -6
  427. data/test/models/speedometer.rb +6 -6
  428. data/test/models/sponsor.rb +7 -7
  429. data/test/models/string_key_object.rb +3 -3
  430. data/test/models/student.rb +4 -4
  431. data/test/models/subject.rb +16 -16
  432. data/test/models/subscriber.rb +8 -8
  433. data/test/models/subscription.rb +4 -4
  434. data/test/models/tag.rb +7 -7
  435. data/test/models/tagging.rb +13 -13
  436. data/test/models/task.rb +5 -5
  437. data/test/models/topic.rb +124 -124
  438. data/test/models/toy.rb +6 -6
  439. data/test/models/traffic_light.rb +4 -4
  440. data/test/models/treasure.rb +14 -14
  441. data/test/models/treaty.rb +7 -7
  442. data/test/models/tyre.rb +11 -11
  443. data/test/models/uuid_child.rb +3 -3
  444. data/test/models/uuid_parent.rb +3 -3
  445. data/test/models/vegetables.rb +24 -24
  446. data/test/models/vehicle.rb +6 -6
  447. data/test/models/vertex.rb +9 -9
  448. data/test/models/warehouse_thing.rb +5 -5
  449. data/test/models/wheel.rb +3 -3
  450. data/test/models/without_table.rb +3 -3
  451. data/test/models/zine.rb +3 -3
  452. data/test/schema/mysql2_specific_schema.rb +58 -58
  453. data/test/schema/mysql_specific_schema.rb +70 -70
  454. data/test/schema/oracle_specific_schema.rb +43 -43
  455. data/test/schema/postgresql_specific_schema.rb +202 -202
  456. data/test/schema/schema.rb +952 -938
  457. data/test/schema/sqlite_specific_schema.rb +21 -21
  458. data/test/support/config.rb +43 -43
  459. data/test/support/connection.rb +22 -22
  460. data/test/support/connection_helper.rb +14 -14
  461. data/test/support/ddl_helper.rb +8 -8
  462. data/test/support/schema_dumping_helper.rb +20 -20
  463. metadata +2 -2
@@ -1,136 +1,136 @@
1
- require "cases/helper"
2
- require "models/binary"
3
- require "models/developer"
4
- require "models/post"
5
- require "active_support/log_subscriber/test_helper"
6
-
7
- class LogSubscriberTest < ActiveRecord::TestCase
8
- include ActiveSupport::LogSubscriber::TestHelper
9
- include ActiveSupport::Logger::Severity
10
-
11
- class TestDebugLogSubscriber < ActiveRecord::LogSubscriber
12
- attr_reader :debugs
13
-
14
- def initialize
15
- @debugs = []
16
- super
17
- end
18
-
19
- def debug message
20
- @debugs << message
21
- end
22
- end
23
-
24
- fixtures :posts
25
-
26
- def setup
27
- @old_logger = ActiveRecord::Base.logger
28
- Developer.primary_key
29
- super
30
- ActiveRecord::LogSubscriber.attach_to(:active_record)
31
- end
32
-
33
- def teardown
34
- super
35
- ActiveRecord::LogSubscriber.log_subscribers.pop
36
- ActiveRecord::Base.logger = @old_logger
37
- end
38
-
39
- def set_logger(logger)
40
- ActiveRecord::Base.logger = logger
41
- end
42
-
43
- def test_schema_statements_are_ignored
44
- event = Struct.new(:duration, :payload)
45
-
46
- logger = TestDebugLogSubscriber.new
47
- assert_equal 0, logger.debugs.length
48
-
49
- logger.sql(event.new(0, sql: 'hi mom!'))
50
- assert_equal 1, logger.debugs.length
51
-
52
- logger.sql(event.new(0, sql: 'hi mom!', name: 'foo'))
53
- assert_equal 2, logger.debugs.length
54
-
55
- logger.sql(event.new(0, sql: 'hi mom!', name: 'SCHEMA'))
56
- assert_equal 2, logger.debugs.length
57
- end
58
-
59
- def test_sql_statements_are_not_squeezed
60
- event = Struct.new(:duration, :payload)
61
- logger = TestDebugLogSubscriber.new
62
- logger.sql(event.new(0, sql: 'ruby rails'))
63
- assert_match(/ruby rails/, logger.debugs.first)
64
- end
65
-
66
- def test_ignore_binds_payload_with_nil_column
67
- event = Struct.new(:duration, :payload)
68
-
69
- logger = TestDebugLogSubscriber.new
70
- logger.sql(event.new(0, sql: 'hi mom!', binds: [[nil, 1]]))
71
- assert_equal 1, logger.debugs.length
72
- end
73
-
74
- def test_basic_query_logging
75
- Developer.all.load
76
- wait
77
- assert_equal 1, @logger.logged(:debug).size
78
- assert_match(/Developer Load/, @logger.logged(:debug).last)
79
- assert_match(/SELECT .*?FROM .?developers.?/i, @logger.logged(:debug).last)
80
- end
81
-
82
- def test_exists_query_logging
83
- Developer.exists? 1
84
- wait
85
- assert_equal 1, @logger.logged(:debug).size
86
- assert_match(/Developer Exists/, @logger.logged(:debug).last)
87
- assert_match(/SELECT .*?FROM .?developers.?/i, @logger.logged(:debug).last)
88
- end
89
-
90
- def test_cached_queries
91
- ActiveRecord::Base.cache do
92
- Developer.all.load
93
- Developer.all.load
94
- end
95
- wait
96
- assert_equal 2, @logger.logged(:debug).size
97
- assert_match(/CACHE/, @logger.logged(:debug).last)
98
- assert_match(/SELECT .*?FROM .?developers.?/i, @logger.logged(:debug).last)
99
- end
100
-
101
- def test_basic_query_doesnt_log_when_level_is_not_debug
102
- @logger.level = INFO
103
- Developer.all.load
104
- wait
105
- assert_equal 0, @logger.logged(:debug).size
106
- end
107
-
108
- def test_cached_queries_doesnt_log_when_level_is_not_debug
109
- @logger.level = INFO
110
- ActiveRecord::Base.cache do
111
- Developer.all.load
112
- Developer.all.load
113
- end
114
- wait
115
- assert_equal 0, @logger.logged(:debug).size
116
- end
117
-
118
- def test_initializes_runtime
119
- Thread.new { assert_equal 0, ActiveRecord::LogSubscriber.runtime }.join
120
- end
121
-
122
- unless current_adapter?(:Mysql2Adapter)
123
- def test_binary_data_is_not_logged
124
- Binary.create(data: 'some binary data')
125
- wait
126
- assert_match(/<16 bytes of binary data>/, @logger.logged(:debug).join)
127
- end
128
-
129
- def test_nil_binary_data_is_logged
130
- binary = Binary.create(data: "")
131
- binary.update_attributes(data: nil)
132
- wait
133
- assert_match(/<NULL binary data>/, @logger.logged(:debug).join)
134
- end
135
- end
136
- end
1
+ require "cases/helper"
2
+ require "models/binary"
3
+ require "models/developer"
4
+ require "models/post"
5
+ require "active_support/log_subscriber/test_helper"
6
+
7
+ class LogSubscriberTest < ActiveRecord::TestCase
8
+ include ActiveSupport::LogSubscriber::TestHelper
9
+ include ActiveSupport::Logger::Severity
10
+
11
+ class TestDebugLogSubscriber < ActiveRecord::LogSubscriber
12
+ attr_reader :debugs
13
+
14
+ def initialize
15
+ @debugs = []
16
+ super
17
+ end
18
+
19
+ def debug message
20
+ @debugs << message
21
+ end
22
+ end
23
+
24
+ fixtures :posts
25
+
26
+ def setup
27
+ @old_logger = ActiveRecord::Base.logger
28
+ Developer.primary_key
29
+ super
30
+ ActiveRecord::LogSubscriber.attach_to(:active_record)
31
+ end
32
+
33
+ def teardown
34
+ super
35
+ ActiveRecord::LogSubscriber.log_subscribers.pop
36
+ ActiveRecord::Base.logger = @old_logger
37
+ end
38
+
39
+ def set_logger(logger)
40
+ ActiveRecord::Base.logger = logger
41
+ end
42
+
43
+ def test_schema_statements_are_ignored
44
+ event = Struct.new(:duration, :payload)
45
+
46
+ logger = TestDebugLogSubscriber.new
47
+ assert_equal 0, logger.debugs.length
48
+
49
+ logger.sql(event.new(0, sql: 'hi mom!'))
50
+ assert_equal 1, logger.debugs.length
51
+
52
+ logger.sql(event.new(0, sql: 'hi mom!', name: 'foo'))
53
+ assert_equal 2, logger.debugs.length
54
+
55
+ logger.sql(event.new(0, sql: 'hi mom!', name: 'SCHEMA'))
56
+ assert_equal 2, logger.debugs.length
57
+ end
58
+
59
+ def test_sql_statements_are_not_squeezed
60
+ event = Struct.new(:duration, :payload)
61
+ logger = TestDebugLogSubscriber.new
62
+ logger.sql(event.new(0, sql: 'ruby rails'))
63
+ assert_match(/ruby rails/, logger.debugs.first)
64
+ end
65
+
66
+ def test_ignore_binds_payload_with_nil_column
67
+ event = Struct.new(:duration, :payload)
68
+
69
+ logger = TestDebugLogSubscriber.new
70
+ logger.sql(event.new(0, sql: 'hi mom!', binds: [[nil, 1]]))
71
+ assert_equal 1, logger.debugs.length
72
+ end
73
+
74
+ def test_basic_query_logging
75
+ Developer.all.load
76
+ wait
77
+ assert_equal 1, @logger.logged(:debug).size
78
+ assert_match(/Developer Load/, @logger.logged(:debug).last)
79
+ assert_match(/SELECT .*?FROM .?developers.?/i, @logger.logged(:debug).last)
80
+ end
81
+
82
+ def test_exists_query_logging
83
+ Developer.exists? 1
84
+ wait
85
+ assert_equal 1, @logger.logged(:debug).size
86
+ assert_match(/Developer Exists/, @logger.logged(:debug).last)
87
+ assert_match(/SELECT .*?FROM .?developers.?/i, @logger.logged(:debug).last)
88
+ end
89
+
90
+ def test_cached_queries
91
+ ActiveRecord::Base.cache do
92
+ Developer.all.load
93
+ Developer.all.load
94
+ end
95
+ wait
96
+ assert_equal 2, @logger.logged(:debug).size
97
+ assert_match(/CACHE/, @logger.logged(:debug).last)
98
+ assert_match(/SELECT .*?FROM .?developers.?/i, @logger.logged(:debug).last)
99
+ end
100
+
101
+ def test_basic_query_doesnt_log_when_level_is_not_debug
102
+ @logger.level = INFO
103
+ Developer.all.load
104
+ wait
105
+ assert_equal 0, @logger.logged(:debug).size
106
+ end
107
+
108
+ def test_cached_queries_doesnt_log_when_level_is_not_debug
109
+ @logger.level = INFO
110
+ ActiveRecord::Base.cache do
111
+ Developer.all.load
112
+ Developer.all.load
113
+ end
114
+ wait
115
+ assert_equal 0, @logger.logged(:debug).size
116
+ end
117
+
118
+ def test_initializes_runtime
119
+ Thread.new { assert_equal 0, ActiveRecord::LogSubscriber.runtime }.join
120
+ end
121
+
122
+ unless current_adapter?(:Mysql2Adapter)
123
+ def test_binary_data_is_not_logged
124
+ Binary.create(data: 'some binary data')
125
+ wait
126
+ assert_match(/<16 bytes of binary data>/, @logger.logged(:debug).join)
127
+ end
128
+
129
+ def test_nil_binary_data_is_logged
130
+ binary = Binary.create(data: "")
131
+ binary.update_attributes(data: nil)
132
+ wait
133
+ assert_match(/<NULL binary data>/, @logger.logged(:debug).join)
134
+ end
135
+ end
136
+ end
@@ -1,448 +1,448 @@
1
- require 'cases/helper'
2
-
3
- module ActiveRecord
4
- class Migration
5
- class ChangeSchemaTest < ActiveRecord::TestCase
6
- attr_reader :connection, :table_name
7
-
8
- def setup
9
- super
10
- @connection = ActiveRecord::Base.connection
11
- @table_name = :testings
12
- end
13
-
14
- teardown do
15
- connection.drop_table :testings rescue nil
16
- ActiveRecord::Base.primary_key_prefix_type = nil
17
- ActiveRecord::Base.clear_cache!
18
- end
19
-
20
- def test_create_table_without_id
21
- testing_table_with_only_foo_attribute do
22
- assert_equal connection.columns(:testings).size, 1
23
- end
24
- end
25
-
26
- unless current_adapter?(:IBM_DBAdapter)
27
- # For DB2: Cannot add a primary key to a table with some rows already in it as it violates the unique constraint
28
- # Secondly GENERATED BY DEFAULT AS IDENTITY cannot be applied in a alter table command.
29
- # as this will be wrong sql syntax for DB
30
- def test_add_column_with_primary_key_attribute
31
- testing_table_with_only_foo_attribute do
32
- connection.add_column :testings, :id, :primary_key
33
- assert_equal connection.columns(:testings).size, 2
34
- end
35
- end
36
- end
37
-
38
- def test_create_table_adds_id
39
- connection.create_table :testings do |t|
40
- t.column :foo, :string
41
- end
42
-
43
- assert_equal %w(id foo), connection.columns(:testings).map(&:name)
44
- end
45
-
46
- def test_create_table_with_not_null_column
47
- connection.create_table :testings do |t|
48
- t.column :foo, :string, :null => false
49
- end
50
-
51
- assert_raises(ActiveRecord::StatementInvalid) do
52
- connection.execute "insert into testings (foo) values (NULL)"
53
- end
54
- end
55
-
56
- def test_create_table_with_defaults
57
- # MySQL doesn't allow defaults on TEXT or BLOB columns.
58
- mysql = current_adapter?(:MysqlAdapter, :Mysql2Adapter)
59
-
60
- connection.create_table :testings do |t|
61
- t.column :one, :string, :default => "hello"
62
- t.column :two, :boolean, :default => true
63
- t.column :three, :boolean, :default => false
64
- t.column :four, :integer, :default => 1
65
- t.column :five, :text, :default => "hello" unless mysql
66
- end
67
-
68
- columns = connection.columns(:testings)
69
- one = columns.detect { |c| c.name == "one" }
70
- two = columns.detect { |c| c.name == "two" }
71
- three = columns.detect { |c| c.name == "three" }
72
- four = columns.detect { |c| c.name == "four" }
73
- five = columns.detect { |c| c.name == "five" } unless mysql
74
-
75
- assert_equal "hello", one.default
76
- assert_equal true, two.type_cast_from_database(two.default)
77
- assert_equal false, three.type_cast_from_database(three.default)
78
- assert_equal '1', four.default
79
- assert_equal "hello", five.default unless mysql
80
- end
81
-
82
- if current_adapter?(:PostgreSQLAdapter)
83
- def test_add_column_with_array
84
- connection.create_table :testings
85
- connection.add_column :testings, :foo, :string, :array => true
86
-
87
- columns = connection.columns(:testings)
88
- array_column = columns.detect { |c| c.name == "foo" }
89
-
90
- assert array_column.array
91
- end
92
-
93
- def test_create_table_with_array_column
94
- connection.create_table :testings do |t|
95
- t.string :foo, :array => true
96
- end
97
-
98
- columns = connection.columns(:testings)
99
- array_column = columns.detect { |c| c.name == "foo" }
100
-
101
- assert array_column.array
102
- end
103
- end
104
-
105
- def test_create_table_with_bigint
106
- connection.create_table :testings do |t|
107
- t.bigint :eight_int
108
- end
109
- columns = connection.columns(:testings)
110
- eight = columns.detect { |c| c.name == "eight_int" }
111
-
112
- if current_adapter?(:OracleAdapter)
113
- assert_equal 'NUMBER(19)', eight.sql_type
114
- elsif current_adapter?(:SQLite3Adapter)
115
- assert_equal 'bigint', eight.sql_type
116
- else
117
- assert_equal :integer, eight.type
118
- assert_equal 8, eight.limit
119
- end
120
- ensure
121
- connection.drop_table :testings
122
- end
123
-
124
- def test_create_table_with_limits
125
- connection.create_table :testings do |t|
126
- t.column :foo, :string, :limit => 255
127
-
128
- t.column :default_int, :integer
129
-
130
- t.column :one_int, :integer, :limit => 1
131
- t.column :four_int, :integer, :limit => 4
132
- t.column :eight_int, :integer, :limit => 8
133
- end
134
-
135
- columns = connection.columns(:testings)
136
- foo = columns.detect { |c| c.name == "foo" }
137
- assert_equal 255, foo.limit
138
-
139
- default = columns.detect { |c| c.name == "default_int" }
140
- one = columns.detect { |c| c.name == "one_int" }
141
- four = columns.detect { |c| c.name == "four_int" }
142
- eight = columns.detect { |c| c.name == "eight_int" }
143
-
144
- if current_adapter?(:PostgreSQLAdapter)
145
- assert_equal 'integer', default.sql_type
146
- assert_equal 'smallint', one.sql_type
147
- assert_equal 'integer', four.sql_type
148
- assert_equal 'bigint', eight.sql_type
149
- elsif current_adapter?(:MysqlAdapter, :Mysql2Adapter)
150
- assert_match 'int(11)', default.sql_type
151
- assert_match 'tinyint', one.sql_type
152
- assert_match 'int', four.sql_type
153
- assert_match 'bigint', eight.sql_type
154
- elsif current_adapter?(:OracleAdapter)
155
- assert_equal 'NUMBER(38)', default.sql_type
156
- assert_equal 'NUMBER(1)', one.sql_type
157
- assert_equal 'NUMBER(4)', four.sql_type
158
- assert_equal 'NUMBER(8)', eight.sql_type
159
- end
160
- end
161
-
162
- def test_create_table_with_primary_key_prefix_as_table_name_with_underscore
163
- ActiveRecord::Base.primary_key_prefix_type = :table_name_with_underscore
164
-
165
- connection.create_table :testings do |t|
166
- t.column :foo, :string
167
- end
168
-
169
- assert_equal %w(testing_id foo), connection.columns(:testings).map(&:name)
170
- end
171
-
172
- def test_create_table_with_primary_key_prefix_as_table_name
173
- ActiveRecord::Base.primary_key_prefix_type = :table_name
174
-
175
- connection.create_table :testings do |t|
176
- t.column :foo, :string
177
- end
178
-
179
- assert_equal %w(testingid foo), connection.columns(:testings).map(&:name)
180
- end
181
-
182
- def test_create_table_raises_when_redefining_primary_key_column
183
- error = assert_raise(ArgumentError) do
184
- connection.create_table :testings do |t|
185
- t.column :id, :string
186
- end
187
- end
188
-
189
- assert_equal "you can't redefine the primary key column 'id'. To define a custom primary key, pass { id: false } to create_table.", error.message
190
- end
191
-
192
- def test_create_table_raises_when_redefining_custom_primary_key_column
193
- error = assert_raise(ArgumentError) do
194
- connection.create_table :testings, primary_key: :testing_id do |t|
195
- t.column :testing_id, :string
196
- end
197
- end
198
-
199
- assert_equal "you can't redefine the primary key column 'testing_id'. To define a custom primary key, pass { id: false } to create_table.", error.message
200
- end
201
-
202
- def test_create_table_with_timestamps_should_create_datetime_columns
203
- # FIXME: Remove the silence when we change the default `null` behavior
204
- ActiveSupport::Deprecation.silence do
205
- connection.create_table table_name do |t|
206
- t.timestamps
207
- end
208
- end
209
- created_columns = connection.columns(table_name)
210
-
211
- created_at_column = created_columns.detect {|c| c.name == 'created_at' }
212
- updated_at_column = created_columns.detect {|c| c.name == 'updated_at' }
213
-
214
- assert created_at_column.null
215
- assert updated_at_column.null
216
- end
217
-
218
- def test_create_table_with_timestamps_should_create_datetime_columns_with_options
219
- connection.create_table table_name do |t|
220
- t.timestamps :null => false
221
- end
222
- created_columns = connection.columns(table_name)
223
-
224
- created_at_column = created_columns.detect {|c| c.name == 'created_at' }
225
- updated_at_column = created_columns.detect {|c| c.name == 'updated_at' }
226
-
227
- assert !created_at_column.null
228
- assert !updated_at_column.null
229
- end
230
-
231
- def test_create_table_without_a_block
232
- connection.create_table table_name
233
- end
234
-
235
- # Sybase, and SQLite3 will not allow you to add a NOT NULL
236
- # column to a table without a default value.
237
- unless current_adapter?(:SybaseAdapter, :SQLite3Adapter, :IBM_DBAdapter)
238
- def test_add_column_not_null_without_default
239
- connection.create_table :testings do |t|
240
- t.column :foo, :string
241
- end
242
- connection.add_column :testings, :bar, :string, :null => false
243
-
244
- assert_raise(ActiveRecord::StatementInvalid) do
245
- connection.execute "insert into testings (foo, bar) values ('hello', NULL)"
246
- end
247
- end
248
- end
249
-
250
- def test_add_column_not_null_with_default
251
- connection.create_table :testings do |t|
252
- t.column :foo, :string
253
- end
254
-
255
- con = connection
256
- connection.enable_identity_insert("testings", true) if current_adapter?(:SybaseAdapter)
257
- connection.execute "insert into testings (#{con.quote_column_name('id')}, #{con.quote_column_name('foo')}) values (1, 'hello')"
258
- connection.enable_identity_insert("testings", false) if current_adapter?(:SybaseAdapter)
259
- assert_nothing_raised {connection.add_column :testings, :bar, :string, :null => false, :default => "default" }
260
-
261
- assert_raises(ActiveRecord::StatementInvalid) do
262
- unless current_adapter?(:OpenBaseAdapter)
263
- connection.execute "insert into testings (#{con.quote_column_name('id')}, #{con.quote_column_name('foo')}, #{con.quote_column_name('bar')}) values (2, 'hello', NULL)"
264
- else
265
- connection.insert("INSERT INTO testings (#{con.quote_column_name('id')}, #{con.quote_column_name('foo')}, #{con.quote_column_name('bar')}) VALUES (2, 'hello', NULL)",
266
- "Testing Insert","id",2)
267
- end
268
- end
269
- end
270
-
271
- def test_change_column_quotes_column_names
272
- connection.create_table :testings do |t|
273
- unless current_adapter?(:IBM_DBAdapter)
274
- t.column :select, :string
275
- else
276
- # If no limit specified by default column of length 255 is created, which later cannot be scaled down to 10
277
- t.column :select, :string, :limit => 5
278
- end
279
- end
280
-
281
- connection.change_column :testings, :select, :string, :limit => 10
282
-
283
- # Oracle needs primary key value from sequence
284
- if current_adapter?(:OracleAdapter)
285
- connection.execute "insert into testings (id, #{connection.quote_column_name('select')}) values (testings_seq.nextval, '7 chars')"
286
- else
287
- connection.execute "insert into testings (#{connection.quote_column_name('select')}) values ('7 chars')"
288
- end
289
- end
290
-
291
- def test_keeping_default_and_notnull_constraints_on_change
292
- connection.create_table :testings do |t|
293
- t.column :title, :string
294
- end
295
- person_klass = Class.new(ActiveRecord::Base)
296
- person_klass.table_name = 'testings'
297
-
298
- person_klass.connection.add_column "testings", "wealth", :integer, :null => false, :default => 99
299
- person_klass.reset_column_information
300
- assert_equal 99, person_klass.columns_hash["wealth"].default
301
- assert_equal false, person_klass.columns_hash["wealth"].null
302
- # Oracle needs primary key value from sequence
303
- if current_adapter?(:OracleAdapter)
304
- assert_nothing_raised {person_klass.connection.execute("insert into testings (id, title) values (testings_seq.nextval, 'tester')")}
305
- else
306
- assert_nothing_raised {person_klass.connection.execute("insert into testings (title) values ('tester')")}
307
- end
308
-
309
- # change column default to see that column doesn't lose its not null definition
310
- person_klass.connection.change_column_default "testings", "wealth", 100
311
- person_klass.reset_column_information
312
- assert_equal 100, person_klass.columns_hash["wealth"].default
313
- assert_equal false, person_klass.columns_hash["wealth"].null
314
-
315
- if (!current_adapter?(:IBM_DBAdapter))
316
- # rename column to see that column doesn't lose its not null and/or default definition
317
- person_klass.connection.rename_column "testings", "wealth", "money"
318
- person_klass.reset_column_information
319
- assert_nil person_klass.columns_hash["wealth"]
320
- assert_equal 100, person_klass.columns_hash["money"].default
321
- assert_equal false, person_klass.columns_hash["money"].null
322
- end
323
-
324
- # change column
325
- unless current_adapter?(:IBM_DBAdapter)
326
- person_klass.connection.change_column "testings", "money", :integer, :null => false, :default => 1000
327
- person_klass.reset_column_information
328
- assert_equal 1000, person_klass.columns_hash["money"].default
329
- assert_equal false, person_klass.columns_hash["money"].null
330
- else
331
- person_klass.connection.change_column "testings", "wealth", :decimal, :precision => 15, :scale => 1,:null => false, :default => 1000
332
- person_klass.reset_column_information
333
- assert_equal 1000, person_klass.columns_hash["wealth"].default
334
- assert_equal false, person_klass.columns_hash["wealth"].null
335
- end
336
-
337
- # change column, make it nullable and clear default
338
- unless current_adapter?(:IBM_DBAdapter)
339
- person_klass.connection.change_column "testings", "money", :integer, :null => true, :default => nil
340
- person_klass.reset_column_information
341
- assert_nil person_klass.columns_hash["money"].default
342
- assert_equal true, person_klass.columns_hash["money"].null
343
- else
344
- person_klass.connection.change_column "testings", "wealth", :decimal, :precision => 20, :scale => 2, :null => true, :default => nil
345
- person_klass.reset_column_information
346
- assert_nil person_klass.columns_hash["wealth"].default
347
- assert_equal true, person_klass.columns_hash["wealth"].null
348
- end
349
-
350
- # change_column_null, make it not nullable and set null values to a default value
351
- unless current_adapter?(:IBM_DBAdapter)
352
- person_klass.connection.execute('UPDATE testings SET money = NULL')
353
- person_klass.connection.change_column_null "testings", "money", false, 2000
354
- person_klass.reset_column_information
355
- assert_nil person_klass.columns_hash["money"].default
356
- assert_equal false, person_klass.columns_hash["money"].null
357
- assert_equal [2000], Person.connection.select_values("SELECT money FROM testings").map { |s| s.to_i }.sort
358
- else
359
- # Trying to set the value of the column wealth to NULL and
360
- # in the next statement a not null constraint is being applied which is wrong
361
- #person_klass.connection.execute('UPDATE testings SET money = NULL')
362
- person_klass.connection.change_column_null "testings", "wealth", false, 2000
363
- person_klass.reset_column_information
364
- #assert_nil person_klass.columns_hash["wealth"].default #Setting default to 2000 and expecting nil is nor correct
365
- assert_not_nil person_klass.columns_hash["wealth"].default
366
- assert_equal false, person_klass.columns_hash["wealth"].null
367
- #Changing default does not change the already inserted value. Hence expecting 2000 is wrong.
368
- assert_equal [99], Person.connection.select_values("SELECT wealth FROM testings").map { |s| s.to_i }.sort
369
- end
370
- end
371
-
372
- def test_change_column_null
373
- testing_table_with_only_foo_attribute do
374
- notnull_migration = Class.new(ActiveRecord::Migration) do
375
- def change
376
- change_column_null :testings, :foo, false
377
- end
378
- end
379
- notnull_migration.new.suppress_messages do
380
- notnull_migration.migrate(:up)
381
- assert_equal false, connection.columns(:testings).find{ |c| c.name == "foo"}.null
382
- notnull_migration.migrate(:down)
383
- assert connection.columns(:testings).find{ |c| c.name == "foo"}.null
384
- end
385
- end
386
- end
387
-
388
- def test_column_exists
389
- connection.create_table :testings do |t|
390
- t.column :foo, :string
391
- end
392
-
393
- assert connection.column_exists?(:testings, :foo)
394
- assert_not connection.column_exists?(:testings, :bar)
395
- end
396
-
397
- def test_column_exists_with_type
398
- connection.create_table :testings do |t|
399
- t.column :foo, :string
400
- t.column :bar, :decimal, :precision => 8, :scale => 2
401
- end
402
-
403
- assert connection.column_exists?(:testings, :foo, :string)
404
- assert_not connection.column_exists?(:testings, :foo, :integer)
405
-
406
- assert connection.column_exists?(:testings, :bar, :decimal)
407
- assert_not connection.column_exists?(:testings, :bar, :integer)
408
- end
409
-
410
- def test_column_exists_with_definition
411
- connection.create_table :testings do |t|
412
- t.column :foo, :string, limit: 100
413
- t.column :bar, :decimal, precision: 8, scale: 2
414
- t.column :taggable_id, :integer, null: false
415
- t.column :taggable_type, :string, default: 'Photo'
416
- end
417
-
418
- assert connection.column_exists?(:testings, :foo, :string, limit: 100)
419
- assert_not connection.column_exists?(:testings, :foo, :string, limit: nil)
420
- assert connection.column_exists?(:testings, :bar, :decimal, precision: 8, scale: 2)
421
- assert_not connection.column_exists?(:testings, :bar, :decimal, precision: nil, scale: nil)
422
- assert connection.column_exists?(:testings, :taggable_id, :integer, null: false)
423
- assert_not connection.column_exists?(:testings, :taggable_id, :integer, null: true)
424
- assert connection.column_exists?(:testings, :taggable_type, :string, default: 'Photo')
425
- assert_not connection.column_exists?(:testings, :taggable_type, :string, default: nil)
426
- end
427
-
428
- def test_column_exists_on_table_with_no_options_parameter_supplied
429
- connection.create_table :testings do |t|
430
- t.string :foo
431
- end
432
- connection.change_table :testings do |t|
433
- assert t.column_exists?(:foo)
434
- assert !(t.column_exists?(:bar))
435
- end
436
- end
437
-
438
- private
439
- def testing_table_with_only_foo_attribute
440
- connection.create_table :testings, :id => false do |t|
441
- t.column :foo, :string
442
- end
443
-
444
- yield
445
- end
446
- end
447
- end
448
- end
1
+ require 'cases/helper'
2
+
3
+ module ActiveRecord
4
+ class Migration
5
+ class ChangeSchemaTest < ActiveRecord::TestCase
6
+ attr_reader :connection, :table_name
7
+
8
+ def setup
9
+ super
10
+ @connection = ActiveRecord::Base.connection
11
+ @table_name = :testings
12
+ end
13
+
14
+ teardown do
15
+ connection.drop_table :testings rescue nil
16
+ ActiveRecord::Base.primary_key_prefix_type = nil
17
+ ActiveRecord::Base.clear_cache!
18
+ end
19
+
20
+ def test_create_table_without_id
21
+ testing_table_with_only_foo_attribute do
22
+ assert_equal connection.columns(:testings).size, 1
23
+ end
24
+ end
25
+
26
+ unless current_adapter?(:IBM_DBAdapter)
27
+ # For DB2: Cannot add a primary key to a table with some rows already in it as it violates the unique constraint
28
+ # Secondly GENERATED BY DEFAULT AS IDENTITY cannot be applied in a alter table command.
29
+ # as this will be wrong sql syntax for DB
30
+ def test_add_column_with_primary_key_attribute
31
+ testing_table_with_only_foo_attribute do
32
+ connection.add_column :testings, :id, :primary_key
33
+ assert_equal connection.columns(:testings).size, 2
34
+ end
35
+ end
36
+ end
37
+
38
+ def test_create_table_adds_id
39
+ connection.create_table :testings do |t|
40
+ t.column :foo, :string
41
+ end
42
+
43
+ assert_equal %w(id foo), connection.columns(:testings).map(&:name)
44
+ end
45
+
46
+ def test_create_table_with_not_null_column
47
+ connection.create_table :testings do |t|
48
+ t.column :foo, :string, :null => false
49
+ end
50
+
51
+ assert_raises(ActiveRecord::StatementInvalid) do
52
+ connection.execute "insert into testings (foo) values (NULL)"
53
+ end
54
+ end
55
+
56
+ def test_create_table_with_defaults
57
+ # MySQL doesn't allow defaults on TEXT or BLOB columns.
58
+ mysql = current_adapter?(:MysqlAdapter, :Mysql2Adapter)
59
+
60
+ connection.create_table :testings do |t|
61
+ t.column :one, :string, :default => "hello"
62
+ t.column :two, :boolean, :default => true
63
+ t.column :three, :boolean, :default => false
64
+ t.column :four, :integer, :default => 1
65
+ t.column :five, :text, :default => "hello" unless mysql
66
+ end
67
+
68
+ columns = connection.columns(:testings)
69
+ one = columns.detect { |c| c.name == "one" }
70
+ two = columns.detect { |c| c.name == "two" }
71
+ three = columns.detect { |c| c.name == "three" }
72
+ four = columns.detect { |c| c.name == "four" }
73
+ five = columns.detect { |c| c.name == "five" } unless mysql
74
+
75
+ assert_equal "hello", one.default
76
+ assert_equal true, two.type_cast_from_database(two.default)
77
+ assert_equal false, three.type_cast_from_database(three.default)
78
+ assert_equal '1', four.default
79
+ assert_equal "hello", five.default unless mysql
80
+ end
81
+
82
+ if current_adapter?(:PostgreSQLAdapter)
83
+ def test_add_column_with_array
84
+ connection.create_table :testings
85
+ connection.add_column :testings, :foo, :string, :array => true
86
+
87
+ columns = connection.columns(:testings)
88
+ array_column = columns.detect { |c| c.name == "foo" }
89
+
90
+ assert array_column.array
91
+ end
92
+
93
+ def test_create_table_with_array_column
94
+ connection.create_table :testings do |t|
95
+ t.string :foo, :array => true
96
+ end
97
+
98
+ columns = connection.columns(:testings)
99
+ array_column = columns.detect { |c| c.name == "foo" }
100
+
101
+ assert array_column.array
102
+ end
103
+ end
104
+
105
+ def test_create_table_with_bigint
106
+ connection.create_table :testings do |t|
107
+ t.bigint :eight_int
108
+ end
109
+ columns = connection.columns(:testings)
110
+ eight = columns.detect { |c| c.name == "eight_int" }
111
+
112
+ if current_adapter?(:OracleAdapter)
113
+ assert_equal 'NUMBER(19)', eight.sql_type
114
+ elsif current_adapter?(:SQLite3Adapter)
115
+ assert_equal 'bigint', eight.sql_type
116
+ else
117
+ assert_equal :integer, eight.type
118
+ assert_equal 8, eight.limit
119
+ end
120
+ ensure
121
+ connection.drop_table :testings
122
+ end
123
+
124
+ def test_create_table_with_limits
125
+ connection.create_table :testings do |t|
126
+ t.column :foo, :string, :limit => 255
127
+
128
+ t.column :default_int, :integer
129
+
130
+ t.column :one_int, :integer, :limit => 1
131
+ t.column :four_int, :integer, :limit => 4
132
+ t.column :eight_int, :integer, :limit => 8
133
+ end
134
+
135
+ columns = connection.columns(:testings)
136
+ foo = columns.detect { |c| c.name == "foo" }
137
+ assert_equal 255, foo.limit
138
+
139
+ default = columns.detect { |c| c.name == "default_int" }
140
+ one = columns.detect { |c| c.name == "one_int" }
141
+ four = columns.detect { |c| c.name == "four_int" }
142
+ eight = columns.detect { |c| c.name == "eight_int" }
143
+
144
+ if current_adapter?(:PostgreSQLAdapter)
145
+ assert_equal 'integer', default.sql_type
146
+ assert_equal 'smallint', one.sql_type
147
+ assert_equal 'integer', four.sql_type
148
+ assert_equal 'bigint', eight.sql_type
149
+ elsif current_adapter?(:MysqlAdapter, :Mysql2Adapter)
150
+ assert_match 'int(11)', default.sql_type
151
+ assert_match 'tinyint', one.sql_type
152
+ assert_match 'int', four.sql_type
153
+ assert_match 'bigint', eight.sql_type
154
+ elsif current_adapter?(:OracleAdapter)
155
+ assert_equal 'NUMBER(38)', default.sql_type
156
+ assert_equal 'NUMBER(1)', one.sql_type
157
+ assert_equal 'NUMBER(4)', four.sql_type
158
+ assert_equal 'NUMBER(8)', eight.sql_type
159
+ end
160
+ end
161
+
162
+ def test_create_table_with_primary_key_prefix_as_table_name_with_underscore
163
+ ActiveRecord::Base.primary_key_prefix_type = :table_name_with_underscore
164
+
165
+ connection.create_table :testings do |t|
166
+ t.column :foo, :string
167
+ end
168
+
169
+ assert_equal %w(testing_id foo), connection.columns(:testings).map(&:name)
170
+ end
171
+
172
+ def test_create_table_with_primary_key_prefix_as_table_name
173
+ ActiveRecord::Base.primary_key_prefix_type = :table_name
174
+
175
+ connection.create_table :testings do |t|
176
+ t.column :foo, :string
177
+ end
178
+
179
+ assert_equal %w(testingid foo), connection.columns(:testings).map(&:name)
180
+ end
181
+
182
+ def test_create_table_raises_when_redefining_primary_key_column
183
+ error = assert_raise(ArgumentError) do
184
+ connection.create_table :testings do |t|
185
+ t.column :id, :string
186
+ end
187
+ end
188
+
189
+ assert_equal "you can't redefine the primary key column 'id'. To define a custom primary key, pass { id: false } to create_table.", error.message
190
+ end
191
+
192
+ def test_create_table_raises_when_redefining_custom_primary_key_column
193
+ error = assert_raise(ArgumentError) do
194
+ connection.create_table :testings, primary_key: :testing_id do |t|
195
+ t.column :testing_id, :string
196
+ end
197
+ end
198
+
199
+ assert_equal "you can't redefine the primary key column 'testing_id'. To define a custom primary key, pass { id: false } to create_table.", error.message
200
+ end
201
+
202
+ def test_create_table_with_timestamps_should_create_datetime_columns
203
+ # FIXME: Remove the silence when we change the default `null` behavior
204
+ ActiveSupport::Deprecation.silence do
205
+ connection.create_table table_name do |t|
206
+ t.timestamps
207
+ end
208
+ end
209
+ created_columns = connection.columns(table_name)
210
+
211
+ created_at_column = created_columns.detect {|c| c.name == 'created_at' }
212
+ updated_at_column = created_columns.detect {|c| c.name == 'updated_at' }
213
+
214
+ assert created_at_column.null
215
+ assert updated_at_column.null
216
+ end
217
+
218
+ def test_create_table_with_timestamps_should_create_datetime_columns_with_options
219
+ connection.create_table table_name do |t|
220
+ t.timestamps :null => false
221
+ end
222
+ created_columns = connection.columns(table_name)
223
+
224
+ created_at_column = created_columns.detect {|c| c.name == 'created_at' }
225
+ updated_at_column = created_columns.detect {|c| c.name == 'updated_at' }
226
+
227
+ assert !created_at_column.null
228
+ assert !updated_at_column.null
229
+ end
230
+
231
+ def test_create_table_without_a_block
232
+ connection.create_table table_name
233
+ end
234
+
235
+ # Sybase, and SQLite3 will not allow you to add a NOT NULL
236
+ # column to a table without a default value.
237
+ unless current_adapter?(:SybaseAdapter, :SQLite3Adapter, :IBM_DBAdapter)
238
+ def test_add_column_not_null_without_default
239
+ connection.create_table :testings do |t|
240
+ t.column :foo, :string
241
+ end
242
+ connection.add_column :testings, :bar, :string, :null => false
243
+
244
+ assert_raise(ActiveRecord::StatementInvalid) do
245
+ connection.execute "insert into testings (foo, bar) values ('hello', NULL)"
246
+ end
247
+ end
248
+ end
249
+
250
+ def test_add_column_not_null_with_default
251
+ connection.create_table :testings do |t|
252
+ t.column :foo, :string
253
+ end
254
+
255
+ con = connection
256
+ connection.enable_identity_insert("testings", true) if current_adapter?(:SybaseAdapter)
257
+ connection.execute "insert into testings (#{con.quote_column_name('id')}, #{con.quote_column_name('foo')}) values (1, 'hello')"
258
+ connection.enable_identity_insert("testings", false) if current_adapter?(:SybaseAdapter)
259
+ assert_nothing_raised {connection.add_column :testings, :bar, :string, :null => false, :default => "default" }
260
+
261
+ assert_raises(ActiveRecord::StatementInvalid) do
262
+ unless current_adapter?(:OpenBaseAdapter)
263
+ connection.execute "insert into testings (#{con.quote_column_name('id')}, #{con.quote_column_name('foo')}, #{con.quote_column_name('bar')}) values (2, 'hello', NULL)"
264
+ else
265
+ connection.insert("INSERT INTO testings (#{con.quote_column_name('id')}, #{con.quote_column_name('foo')}, #{con.quote_column_name('bar')}) VALUES (2, 'hello', NULL)",
266
+ "Testing Insert","id",2)
267
+ end
268
+ end
269
+ end
270
+
271
+ def test_change_column_quotes_column_names
272
+ connection.create_table :testings do |t|
273
+ unless current_adapter?(:IBM_DBAdapter)
274
+ t.column :select, :string
275
+ else
276
+ # If no limit specified by default column of length 255 is created, which later cannot be scaled down to 10
277
+ t.column :select, :string, :limit => 5
278
+ end
279
+ end
280
+
281
+ connection.change_column :testings, :select, :string, :limit => 10
282
+
283
+ # Oracle needs primary key value from sequence
284
+ if current_adapter?(:OracleAdapter)
285
+ connection.execute "insert into testings (id, #{connection.quote_column_name('select')}) values (testings_seq.nextval, '7 chars')"
286
+ else
287
+ connection.execute "insert into testings (#{connection.quote_column_name('select')}) values ('7 chars')"
288
+ end
289
+ end
290
+
291
+ def test_keeping_default_and_notnull_constraints_on_change
292
+ connection.create_table :testings do |t|
293
+ t.column :title, :string
294
+ end
295
+ person_klass = Class.new(ActiveRecord::Base)
296
+ person_klass.table_name = 'testings'
297
+
298
+ person_klass.connection.add_column "testings", "wealth", :integer, :null => false, :default => 99
299
+ person_klass.reset_column_information
300
+ assert_equal 99, person_klass.columns_hash["wealth"].default
301
+ assert_equal false, person_klass.columns_hash["wealth"].null
302
+ # Oracle needs primary key value from sequence
303
+ if current_adapter?(:OracleAdapter)
304
+ assert_nothing_raised {person_klass.connection.execute("insert into testings (id, title) values (testings_seq.nextval, 'tester')")}
305
+ else
306
+ assert_nothing_raised {person_klass.connection.execute("insert into testings (title) values ('tester')")}
307
+ end
308
+
309
+ # change column default to see that column doesn't lose its not null definition
310
+ person_klass.connection.change_column_default "testings", "wealth", 100
311
+ person_klass.reset_column_information
312
+ assert_equal 100, person_klass.columns_hash["wealth"].default
313
+ assert_equal false, person_klass.columns_hash["wealth"].null
314
+
315
+ if (!current_adapter?(:IBM_DBAdapter))
316
+ # rename column to see that column doesn't lose its not null and/or default definition
317
+ person_klass.connection.rename_column "testings", "wealth", "money"
318
+ person_klass.reset_column_information
319
+ assert_nil person_klass.columns_hash["wealth"]
320
+ assert_equal 100, person_klass.columns_hash["money"].default
321
+ assert_equal false, person_klass.columns_hash["money"].null
322
+ end
323
+
324
+ # change column
325
+ unless current_adapter?(:IBM_DBAdapter)
326
+ person_klass.connection.change_column "testings", "money", :integer, :null => false, :default => 1000
327
+ person_klass.reset_column_information
328
+ assert_equal 1000, person_klass.columns_hash["money"].default
329
+ assert_equal false, person_klass.columns_hash["money"].null
330
+ else
331
+ person_klass.connection.change_column "testings", "wealth", :decimal, :precision => 15, :scale => 1,:null => false, :default => 1000
332
+ person_klass.reset_column_information
333
+ assert_equal 1000, person_klass.columns_hash["wealth"].default
334
+ assert_equal false, person_klass.columns_hash["wealth"].null
335
+ end
336
+
337
+ # change column, make it nullable and clear default
338
+ unless current_adapter?(:IBM_DBAdapter)
339
+ person_klass.connection.change_column "testings", "money", :integer, :null => true, :default => nil
340
+ person_klass.reset_column_information
341
+ assert_nil person_klass.columns_hash["money"].default
342
+ assert_equal true, person_klass.columns_hash["money"].null
343
+ else
344
+ person_klass.connection.change_column "testings", "wealth", :decimal, :precision => 20, :scale => 2, :null => true, :default => nil
345
+ person_klass.reset_column_information
346
+ assert_nil person_klass.columns_hash["wealth"].default
347
+ assert_equal true, person_klass.columns_hash["wealth"].null
348
+ end
349
+
350
+ # change_column_null, make it not nullable and set null values to a default value
351
+ unless current_adapter?(:IBM_DBAdapter)
352
+ person_klass.connection.execute('UPDATE testings SET money = NULL')
353
+ person_klass.connection.change_column_null "testings", "money", false, 2000
354
+ person_klass.reset_column_information
355
+ assert_nil person_klass.columns_hash["money"].default
356
+ assert_equal false, person_klass.columns_hash["money"].null
357
+ assert_equal [2000], Person.connection.select_values("SELECT money FROM testings").map { |s| s.to_i }.sort
358
+ else
359
+ # Trying to set the value of the column wealth to NULL and
360
+ # in the next statement a not null constraint is being applied which is wrong
361
+ #person_klass.connection.execute('UPDATE testings SET money = NULL')
362
+ person_klass.connection.change_column_null "testings", "wealth", false, 2000
363
+ person_klass.reset_column_information
364
+ #assert_nil person_klass.columns_hash["wealth"].default #Setting default to 2000 and expecting nil is nor correct
365
+ assert_not_nil person_klass.columns_hash["wealth"].default
366
+ assert_equal false, person_klass.columns_hash["wealth"].null
367
+ #Changing default does not change the already inserted value. Hence expecting 2000 is wrong.
368
+ assert_equal [99], Person.connection.select_values("SELECT wealth FROM testings").map { |s| s.to_i }.sort
369
+ end
370
+ end
371
+
372
+ def test_change_column_null
373
+ testing_table_with_only_foo_attribute do
374
+ notnull_migration = Class.new(ActiveRecord::Migration) do
375
+ def change
376
+ change_column_null :testings, :foo, false
377
+ end
378
+ end
379
+ notnull_migration.new.suppress_messages do
380
+ notnull_migration.migrate(:up)
381
+ assert_equal false, connection.columns(:testings).find{ |c| c.name == "foo"}.null
382
+ notnull_migration.migrate(:down)
383
+ assert connection.columns(:testings).find{ |c| c.name == "foo"}.null
384
+ end
385
+ end
386
+ end
387
+
388
+ def test_column_exists
389
+ connection.create_table :testings do |t|
390
+ t.column :foo, :string
391
+ end
392
+
393
+ assert connection.column_exists?(:testings, :foo)
394
+ assert_not connection.column_exists?(:testings, :bar)
395
+ end
396
+
397
+ def test_column_exists_with_type
398
+ connection.create_table :testings do |t|
399
+ t.column :foo, :string
400
+ t.column :bar, :decimal, :precision => 8, :scale => 2
401
+ end
402
+
403
+ assert connection.column_exists?(:testings, :foo, :string)
404
+ assert_not connection.column_exists?(:testings, :foo, :integer)
405
+
406
+ assert connection.column_exists?(:testings, :bar, :decimal)
407
+ assert_not connection.column_exists?(:testings, :bar, :integer)
408
+ end
409
+
410
+ def test_column_exists_with_definition
411
+ connection.create_table :testings do |t|
412
+ t.column :foo, :string, limit: 100
413
+ t.column :bar, :decimal, precision: 8, scale: 2
414
+ t.column :taggable_id, :integer, null: false
415
+ t.column :taggable_type, :string, default: 'Photo'
416
+ end
417
+
418
+ assert connection.column_exists?(:testings, :foo, :string, limit: 100)
419
+ assert_not connection.column_exists?(:testings, :foo, :string, limit: nil)
420
+ assert connection.column_exists?(:testings, :bar, :decimal, precision: 8, scale: 2)
421
+ assert_not connection.column_exists?(:testings, :bar, :decimal, precision: nil, scale: nil)
422
+ assert connection.column_exists?(:testings, :taggable_id, :integer, null: false)
423
+ assert_not connection.column_exists?(:testings, :taggable_id, :integer, null: true)
424
+ assert connection.column_exists?(:testings, :taggable_type, :string, default: 'Photo')
425
+ assert_not connection.column_exists?(:testings, :taggable_type, :string, default: nil)
426
+ end
427
+
428
+ def test_column_exists_on_table_with_no_options_parameter_supplied
429
+ connection.create_table :testings do |t|
430
+ t.string :foo
431
+ end
432
+ connection.change_table :testings do |t|
433
+ assert t.column_exists?(:foo)
434
+ assert !(t.column_exists?(:bar))
435
+ end
436
+ end
437
+
438
+ private
439
+ def testing_table_with_only_foo_attribute
440
+ connection.create_table :testings, :id => false do |t|
441
+ t.column :foo, :string
442
+ end
443
+
444
+ yield
445
+ end
446
+ end
447
+ end
448
+ end