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,24 +1,24 @@
1
- require "cases/helper"
2
-
3
- module ActiveRecord
4
- class Migration
5
- class TableAndIndexTest < ActiveRecord::TestCase
6
- def test_add_schema_info_respects_prefix_and_suffix
7
- conn = ActiveRecord::Base.connection
8
-
9
- conn.drop_table(ActiveRecord::Migrator.schema_migrations_table_name) if conn.table_exists?(ActiveRecord::Migrator.schema_migrations_table_name)
10
- # Use shorter prefix and suffix as in Oracle database identifier cannot be larger than 30 characters
11
- ActiveRecord::Base.table_name_prefix = 'p_'
12
- ActiveRecord::Base.table_name_suffix = '_s'
13
- conn.drop_table(ActiveRecord::Migrator.schema_migrations_table_name) if conn.table_exists?(ActiveRecord::Migrator.schema_migrations_table_name)
14
-
15
- conn.initialize_schema_migrations_table
16
-
17
- assert_equal "p_unique_schema_migrations_s", conn.indexes(ActiveRecord::Migrator.schema_migrations_table_name)[0][:name]
18
- ensure
19
- ActiveRecord::Base.table_name_prefix = ""
20
- ActiveRecord::Base.table_name_suffix = ""
21
- end
22
- end
23
- end
24
- end
1
+ require "cases/helper"
2
+
3
+ module ActiveRecord
4
+ class Migration
5
+ class TableAndIndexTest < ActiveRecord::TestCase
6
+ def test_add_schema_info_respects_prefix_and_suffix
7
+ conn = ActiveRecord::Base.connection
8
+
9
+ conn.drop_table(ActiveRecord::Migrator.schema_migrations_table_name) if conn.table_exists?(ActiveRecord::Migrator.schema_migrations_table_name)
10
+ # Use shorter prefix and suffix as in Oracle database identifier cannot be larger than 30 characters
11
+ ActiveRecord::Base.table_name_prefix = 'p_'
12
+ ActiveRecord::Base.table_name_suffix = '_s'
13
+ conn.drop_table(ActiveRecord::Migrator.schema_migrations_table_name) if conn.table_exists?(ActiveRecord::Migrator.schema_migrations_table_name)
14
+
15
+ conn.initialize_schema_migrations_table
16
+
17
+ assert_equal "p_unique_schema_migrations_s", conn.indexes(ActiveRecord::Migrator.schema_migrations_table_name)[0][:name]
18
+ ensure
19
+ ActiveRecord::Base.table_name_prefix = ""
20
+ ActiveRecord::Base.table_name_suffix = ""
21
+ end
22
+ end
23
+ end
24
+ end
@@ -1,959 +1,959 @@
1
- require "cases/helper"
2
- require "cases/migration/helper"
3
- require 'bigdecimal/util'
4
-
5
- require 'models/person'
6
- require 'models/topic'
7
- require 'models/developer'
8
- require 'models/computer'
9
-
10
- require MIGRATIONS_ROOT + "/valid/2_we_need_reminders"
11
- require MIGRATIONS_ROOT + "/rename/1_we_need_things"
12
- require MIGRATIONS_ROOT + "/rename/2_rename_things"
13
- require MIGRATIONS_ROOT + "/decimal/1_give_me_big_numbers"
14
-
15
- class BigNumber < ActiveRecord::Base
16
- unless current_adapter?(:PostgreSQLAdapter, :SQLite3Adapter)
17
- attribute :value_of_e, Type::Integer.new
18
- end
19
- attribute :my_house_population, Type::Integer.new
20
- end
21
-
22
- class Reminder < ActiveRecord::Base; end
23
-
24
- class Thing < ActiveRecord::Base; end
25
-
26
- class MigrationTest < ActiveRecord::TestCase
27
- self.use_transactional_fixtures = false
28
-
29
- fixtures :people
30
-
31
- if (current_adapter?(:IBM_DBAdapter))
32
- #Rename is supported only for server zOS 9 , DB2 COBRA and Informix
33
- server_type = ActiveRecord::Base.connection.servertype.class.name
34
- @ibm_db_rename_supported = server_type.include?('::IBM_DB2_LUW_COBRA') ||
35
- server_type.class.name.include?('::IBM_IDS') ||
36
- (server_type.include?('IBM_DB2_ZOS') && !server_type.include?('IBM_DB2_ZOS_8'))
37
- end
38
-
39
- def setup
40
- super
41
- %w(reminders people_reminders prefix_reminders_suffix p_things_s).each do |table|
42
- Reminder.connection.drop_table(table) rescue nil
43
- end
44
- Reminder.reset_column_information
45
- @verbose_was, ActiveRecord::Migration.verbose = ActiveRecord::Migration.verbose, false
46
- ActiveRecord::Base.connection.schema_cache.clear!
47
- end
48
-
49
- teardown do
50
- ActiveRecord::Base.table_name_prefix = ""
51
- ActiveRecord::Base.table_name_suffix = ""
52
-
53
- ActiveRecord::Base.connection.initialize_schema_migrations_table
54
- ActiveRecord::Base.connection.execute "DELETE FROM #{ActiveRecord::Migrator.schema_migrations_table_name}"
55
-
56
- %w(things awesome_things prefix_things_suffix p_awesome_things_s ).each do |table|
57
- Thing.connection.drop_table(table) rescue nil
58
- end
59
- Thing.reset_column_information
60
-
61
- %w(reminders people_reminders prefix_reminders_suffix).each do |table|
62
- Reminder.connection.drop_table(table) rescue nil
63
- end
64
- Reminder.reset_table_name
65
- Reminder.reset_column_information
66
-
67
- %w(last_name key bio age height wealth birthday favorite_day
68
- moment_of_truth male administrator funny).each do |column|
69
- Person.connection.remove_column('people', column) rescue nil
70
- end
71
- Person.connection.remove_column("people", "first_name") rescue nil
72
- Person.connection.remove_column("people", "middle_name") rescue nil
73
- Person.connection.add_column("people", "first_name", :string)
74
- Person.reset_column_information
75
-
76
- ActiveRecord::Migration.verbose = @verbose_was
77
- end
78
-
79
- def test_migrator_versions
80
- migrations_path = MIGRATIONS_ROOT + "/valid"
81
- old_path = ActiveRecord::Migrator.migrations_paths
82
- ActiveRecord::Migrator.migrations_paths = migrations_path
83
-
84
- ActiveRecord::Migrator.up(migrations_path)
85
- assert_equal 3, ActiveRecord::Migrator.current_version
86
- assert_equal 3, ActiveRecord::Migrator.last_version
87
- assert_equal false, ActiveRecord::Migrator.needs_migration?
88
-
89
- ActiveRecord::Migrator.down(MIGRATIONS_ROOT + "/valid")
90
- assert_equal 0, ActiveRecord::Migrator.current_version
91
- assert_equal 3, ActiveRecord::Migrator.last_version
92
- assert_equal true, ActiveRecord::Migrator.needs_migration?
93
-
94
- ActiveRecord::SchemaMigration.create!(:version => ActiveRecord::Migrator.last_version)
95
- assert_equal true, ActiveRecord::Migrator.needs_migration?
96
- ensure
97
- ActiveRecord::Migrator.migrations_paths = old_path
98
- end
99
-
100
- def test_migration_detection_without_schema_migration_table
101
- ActiveRecord::Base.connection.drop_table('schema_migrations') if ActiveRecord::Base.connection.table_exists?('schema_migrations')
102
-
103
- migrations_path = MIGRATIONS_ROOT + "/valid"
104
- old_path = ActiveRecord::Migrator.migrations_paths
105
- ActiveRecord::Migrator.migrations_paths = migrations_path
106
-
107
- assert_equal true, ActiveRecord::Migrator.needs_migration?
108
- ensure
109
- ActiveRecord::Migrator.migrations_paths = old_path
110
- end
111
-
112
- def test_any_migrations
113
- old_path = ActiveRecord::Migrator.migrations_paths
114
- ActiveRecord::Migrator.migrations_paths = MIGRATIONS_ROOT + "/valid"
115
-
116
- assert ActiveRecord::Migrator.any_migrations?
117
-
118
- ActiveRecord::Migrator.migrations_paths = MIGRATIONS_ROOT + "/empty"
119
-
120
- assert_not ActiveRecord::Migrator.any_migrations?
121
- ensure
122
- ActiveRecord::Migrator.migrations_paths = old_path
123
- end
124
-
125
- def test_migration_version
126
- ActiveRecord::Migrator.run(:up, MIGRATIONS_ROOT + "/version_check", 20131219224947)
127
- end
128
-
129
- def test_create_table_with_force_true_does_not_drop_nonexisting_table
130
- if Person.connection.table_exists?(:testings2)
131
- Person.connection.drop_table :testings2
132
- end
133
-
134
- # using a copy as we need the drop_table method to
135
- # continue to work for the ensure block of the test
136
- temp_conn = Person.connection.dup
137
-
138
- assert_not_equal temp_conn, Person.connection
139
-
140
- temp_conn.create_table :testings2, :force => true do |t|
141
- t.column :foo, :string
142
- end
143
- ensure
144
- Person.connection.drop_table :testings2 rescue nil
145
- end
146
-
147
- def connection
148
- ActiveRecord::Base.connection
149
- end
150
-
151
- def test_migration_instance_has_connection
152
- migration = Class.new(ActiveRecord::Migration).new
153
- assert_equal connection, migration.connection
154
- end
155
-
156
- def test_method_missing_delegates_to_connection
157
- migration = Class.new(ActiveRecord::Migration) {
158
- def connection
159
- Class.new {
160
- def create_table; "hi mom!"; end
161
- }.new
162
- end
163
- }.new
164
-
165
- assert_equal "hi mom!", migration.method_missing(:create_table)
166
- end
167
-
168
- def test_add_table_with_decimals
169
- Person.connection.drop_table :big_numbers rescue nil
170
-
171
- assert !BigNumber.table_exists?
172
- GiveMeBigNumbers.up
173
-
174
- assert BigNumber.create(
175
- :bank_balance => 1586.43,
176
- :big_bank_balance => BigDecimal("1000234000567.95"),
177
- :world_population => 6000000000,
178
- :my_house_population => 3,
179
- :value_of_e => BigDecimal("2.7182818284590452353602875")
180
- )
181
-
182
- b = BigNumber.first
183
- assert_not_nil b
184
-
185
- assert_not_nil b.bank_balance
186
- assert_not_nil b.big_bank_balance
187
- assert_not_nil b.world_population
188
- assert_not_nil b.my_house_population
189
- assert_not_nil b.value_of_e
190
-
191
- # TODO: set world_population >= 2**62 to cover 64-bit platforms and test
192
- # is_a?(Bignum)
193
- unless current_adapter?(:IBM_DBAdapter)
194
- assert_kind_of Integer, b.world_population
195
- else
196
- assert_kind_of BigDecimal, b.world_population
197
- end
198
- assert_equal 6000000000, b.world_population
199
- unless current_adapter?(:IBM_DBAdapter)
200
- assert_kind_of Fixnum, b.my_house_population
201
- else
202
- assert_kind_of BigDecimal, b.my_house_population
203
- end
204
- assert_equal 3, b.my_house_population
205
- assert_kind_of BigDecimal, b.bank_balance
206
- assert_equal BigDecimal("1586.43"), b.bank_balance
207
- assert_kind_of BigDecimal, b.big_bank_balance
208
- assert_equal BigDecimal("1000234000567.95"), b.big_bank_balance
209
-
210
- # This one is fun. The 'value_of_e' field is defined as 'DECIMAL' with
211
- # precision/scale explicitly left out. By the SQL standard, numbers
212
- # assigned to this field should be truncated but that's seldom respected.
213
- if current_adapter?(:PostgreSQLAdapter)
214
- # - PostgreSQL changes the SQL spec on columns declared simply as
215
- # "decimal" to something more useful: instead of being given a scale
216
- # of 0, they take on the compile-time limit for precision and scale,
217
- # so the following should succeed unless you have used really wacky
218
- # compilation options
219
- # - SQLite2 has the default behavior of preserving all data sent in,
220
- # so this happens there too
221
- assert_kind_of BigDecimal, b.value_of_e
222
- assert_equal BigDecimal("2.7182818284590452353602875"), b.value_of_e
223
- elsif current_adapter?(:SQLite3Adapter)
224
- # - SQLite3 stores a float, in violation of SQL
225
- assert_kind_of BigDecimal, b.value_of_e
226
- assert_in_delta BigDecimal("2.71828182845905"), b.value_of_e, 0.00000000000001
227
- else
228
- # - SQL standard is an integer
229
- unless current_adapter?(:IBM_DBAdapter)
230
- assert_kind_of Fixnum, b.value_of_e
231
- else
232
- assert_kind_of BigDecimal, b.value_of_e
233
- end
234
- assert_equal 2, b.value_of_e
235
- end
236
-
237
- GiveMeBigNumbers.down
238
- assert_raise(ActiveRecord::StatementInvalid) { BigNumber.first }
239
- end
240
-
241
- def test_filtering_migrations
242
- assert_no_column Person, :last_name
243
- assert !Reminder.table_exists?
244
-
245
- name_filter = lambda { |migration| migration.name == "ValidPeopleHaveLastNames" }
246
- ActiveRecord::Migrator.up(MIGRATIONS_ROOT + "/valid", &name_filter)
247
-
248
- assert_column Person, :last_name
249
- assert_raise(ActiveRecord::StatementInvalid) { Reminder.first }
250
-
251
- ActiveRecord::Migrator.down(MIGRATIONS_ROOT + "/valid", &name_filter)
252
-
253
- assert_no_column Person, :last_name
254
- assert_raise(ActiveRecord::StatementInvalid) { Reminder.first }
255
- end
256
-
257
- class MockMigration < ActiveRecord::Migration
258
- attr_reader :went_up, :went_down
259
- def initialize
260
- @went_up = false
261
- @went_down = false
262
- end
263
-
264
- def up
265
- @went_up = true
266
- super
267
- end
268
-
269
- def down
270
- @went_down = true
271
- super
272
- end
273
- end
274
-
275
- def test_instance_based_migration_up
276
- migration = MockMigration.new
277
- assert !migration.went_up, 'have not gone up'
278
- assert !migration.went_down, 'have not gone down'
279
-
280
- migration.migrate :up
281
- assert migration.went_up, 'have gone up'
282
- assert !migration.went_down, 'have not gone down'
283
- end
284
-
285
- def test_instance_based_migration_down
286
- migration = MockMigration.new
287
- assert !migration.went_up, 'have not gone up'
288
- assert !migration.went_down, 'have not gone down'
289
-
290
- migration.migrate :down
291
- assert !migration.went_up, 'have gone up'
292
- assert migration.went_down, 'have not gone down'
293
- end
294
-
295
- if ActiveRecord::Base.connection.supports_ddl_transactions?
296
- def test_migrator_one_up_with_exception_and_rollback
297
- assert_no_column Person, :last_name
298
-
299
- migration = Class.new(ActiveRecord::Migration) {
300
- def version; 100 end
301
- def migrate(x)
302
- add_column "people", "last_name", :string
303
- raise 'Something broke'
304
- end
305
- }.new
306
-
307
- migrator = ActiveRecord::Migrator.new(:up, [migration], 100)
308
-
309
- e = assert_raise(StandardError) { migrator.migrate }
310
-
311
- assert_equal "An error has occurred, this and all later migrations canceled:\n\nSomething broke", e.message
312
-
313
- assert_no_column Person, :last_name,
314
- "On error, the Migrator should revert schema changes but it did not."
315
- end
316
-
317
- def test_migrator_one_up_with_exception_and_rollback_using_run
318
- assert_no_column Person, :last_name
319
-
320
- migration = Class.new(ActiveRecord::Migration) {
321
- def version; 100 end
322
- def migrate(x)
323
- add_column "people", "last_name", :string
324
- raise 'Something broke'
325
- end
326
- }.new
327
-
328
- migrator = ActiveRecord::Migrator.new(:up, [migration], 100)
329
-
330
- e = assert_raise(StandardError) { migrator.run }
331
-
332
- assert_equal "An error has occurred, this migration was canceled:\n\nSomething broke", e.message
333
-
334
- assert_no_column Person, :last_name,
335
- "On error, the Migrator should revert schema changes but it did not."
336
- end
337
-
338
- def test_migration_without_transaction
339
- assert_no_column Person, :last_name
340
-
341
- migration = Class.new(ActiveRecord::Migration) {
342
- self.disable_ddl_transaction!
343
-
344
- def version; 101 end
345
- def migrate(x)
346
- add_column "people", "last_name", :string
347
- raise 'Something broke'
348
- end
349
- }.new
350
-
351
- migrator = ActiveRecord::Migrator.new(:up, [migration], 101)
352
- e = assert_raise(StandardError) { migrator.migrate }
353
- assert_equal "An error has occurred, all later migrations canceled:\n\nSomething broke", e.message
354
-
355
- assert_column Person, :last_name,
356
- "without ddl transactions, the Migrator should not rollback on error but it did."
357
- ensure
358
- Person.reset_column_information
359
- if Person.column_names.include?('last_name')
360
- Person.connection.remove_column('people', 'last_name')
361
- end
362
- end
363
- end
364
-
365
- def test_schema_migrations_table_name
366
- original_schema_migrations_table_name = ActiveRecord::Migrator.schema_migrations_table_name
367
-
368
- assert_equal "schema_migrations", ActiveRecord::Migrator.schema_migrations_table_name
369
- ActiveRecord::Base.table_name_prefix = "prefix_"
370
- ActiveRecord::Base.table_name_suffix = "_suffix"
371
- Reminder.reset_table_name
372
- assert_equal "prefix_schema_migrations_suffix", ActiveRecord::Migrator.schema_migrations_table_name
373
- ActiveRecord::Base.schema_migrations_table_name = "changed"
374
- Reminder.reset_table_name
375
- assert_equal "prefix_changed_suffix", ActiveRecord::Migrator.schema_migrations_table_name
376
- ActiveRecord::Base.table_name_prefix = ""
377
- ActiveRecord::Base.table_name_suffix = ""
378
- Reminder.reset_table_name
379
- assert_equal "changed", ActiveRecord::Migrator.schema_migrations_table_name
380
- ensure
381
- ActiveRecord::Base.schema_migrations_table_name = original_schema_migrations_table_name
382
- Reminder.reset_table_name
383
- end
384
-
385
- def test_proper_table_name_on_migration
386
- reminder_class = new_isolated_reminder_class
387
- migration = ActiveRecord::Migration.new
388
- assert_equal "table", migration.proper_table_name('table')
389
- assert_equal "table", migration.proper_table_name(:table)
390
- assert_equal "reminders", migration.proper_table_name(reminder_class)
391
- reminder_class.reset_table_name
392
- assert_equal reminder_class.table_name, migration.proper_table_name(reminder_class)
393
-
394
- # Use the model's own prefix/suffix if a model is given
395
- ActiveRecord::Base.table_name_prefix = "ARprefix_"
396
- ActiveRecord::Base.table_name_suffix = "_ARsuffix"
397
- reminder_class.table_name_prefix = 'prefix_'
398
- reminder_class.table_name_suffix = '_suffix'
399
- reminder_class.reset_table_name
400
- assert_equal "prefix_reminders_suffix", migration.proper_table_name(reminder_class)
401
- reminder_class.table_name_prefix = ''
402
- reminder_class.table_name_suffix = ''
403
- reminder_class.reset_table_name
404
-
405
- # Use AR::Base's prefix/suffix if string or symbol is given
406
- ActiveRecord::Base.table_name_prefix = "prefix_"
407
- ActiveRecord::Base.table_name_suffix = "_suffix"
408
- reminder_class.reset_table_name
409
- assert_equal "prefix_table_suffix", migration.proper_table_name('table', migration.table_name_options)
410
- assert_equal "prefix_table_suffix", migration.proper_table_name(:table, migration.table_name_options)
411
- end
412
-
413
- def test_rename_table_with_prefix_and_suffix
414
- assert !Thing.table_exists?
415
- ActiveRecord::Base.table_name_prefix = 'p_'
416
- ActiveRecord::Base.table_name_suffix = '_s'
417
- Thing.reset_table_name
418
- Thing.reset_sequence_name
419
- WeNeedThings.up
420
-
421
- assert Thing.create("content" => "hello world")
422
- assert_equal "hello world", Thing.first.content
423
-
424
- RenameThings.up
425
- Thing.table_name = "p_awesome_things_s"
426
-
427
- assert_equal "hello world", Thing.first.content
428
- ensure
429
- Thing.reset_table_name
430
- Thing.reset_sequence_name
431
- end
432
-
433
- def test_add_drop_table_with_prefix_and_suffix
434
- assert !Reminder.table_exists?
435
- ActiveRecord::Base.table_name_prefix = 'prefix_'
436
- ActiveRecord::Base.table_name_suffix = '_suffix'
437
- Reminder.reset_table_name
438
- Reminder.reset_sequence_name
439
- WeNeedReminders.up
440
- assert Reminder.create("content" => "hello world", "remind_at" => Time.now)
441
- assert_equal "hello world", Reminder.first.content
442
-
443
- WeNeedReminders.down
444
- assert_raise(ActiveRecord::StatementInvalid) { Reminder.first }
445
- ensure
446
- Reminder.reset_sequence_name
447
- end
448
-
449
- def test_create_table_with_binary_column
450
- Person.connection.drop_table :binary_testings rescue nil
451
-
452
- assert_nothing_raised {
453
- Person.connection.create_table :binary_testings do |t|
454
- t.column "data", :binary, :null => false
455
- end
456
- }
457
-
458
- columns = Person.connection.columns(:binary_testings)
459
- data_column = columns.detect { |c| c.name == "data" }
460
-
461
- assert_nil data_column.default
462
-
463
- Person.connection.drop_table :binary_testings rescue nil
464
- end
465
-
466
- unless mysql_enforcing_gtid_consistency?
467
- def test_create_table_with_query
468
- Person.connection.drop_table :table_from_query_testings rescue nil
469
- Person.connection.create_table(:person, force: true)
470
-
471
- Person.connection.create_table :table_from_query_testings, as: "SELECT id FROM person"
472
-
473
- columns = Person.connection.columns(:table_from_query_testings)
474
- assert_equal 1, columns.length
475
- assert_equal "id", columns.first.name
476
-
477
- Person.connection.drop_table :table_from_query_testings rescue nil
478
- end
479
-
480
- def test_create_table_with_query_from_relation
481
- Person.connection.drop_table :table_from_query_testings rescue nil
482
- Person.connection.create_table(:person, force: true)
483
-
484
- Person.connection.create_table :table_from_query_testings, as: Person.select(:id)
485
-
486
- columns = Person.connection.columns(:table_from_query_testings)
487
- assert_equal 1, columns.length
488
- assert_equal "id", columns.first.name
489
-
490
- Person.connection.drop_table :table_from_query_testings rescue nil
491
- end
492
- end
493
-
494
- if current_adapter? :OracleAdapter
495
- def test_create_table_with_custom_sequence_name
496
- # table name is 29 chars, the standard sequence name will
497
- # be 33 chars and should be shortened
498
- assert_nothing_raised do
499
- begin
500
- Person.connection.create_table :table_with_name_thats_just_ok do |t|
501
- t.column :foo, :string, :null => false
502
- end
503
- ensure
504
- Person.connection.drop_table :table_with_name_thats_just_ok rescue nil
505
- end
506
- end
507
-
508
- # should be all good w/ a custom sequence name
509
- assert_nothing_raised do
510
- begin
511
- Person.connection.create_table :table_with_name_thats_just_ok,
512
- :sequence_name => 'suitably_short_seq' do |t|
513
- t.column :foo, :string, :null => false
514
- end
515
-
516
- Person.connection.execute("select suitably_short_seq.nextval from dual")
517
-
518
- ensure
519
- Person.connection.drop_table :table_with_name_thats_just_ok,
520
- :sequence_name => 'suitably_short_seq' rescue nil
521
- end
522
- end
523
-
524
- # confirm the custom sequence got dropped
525
- assert_raise(ActiveRecord::StatementInvalid) do
526
- Person.connection.execute("select suitably_short_seq.nextval from dual")
527
- end
528
- end
529
- end
530
-
531
- if current_adapter?(:MysqlAdapter, :Mysql2Adapter, :PostgreSQLAdapter)
532
- def test_out_of_range_limit_should_raise
533
- Person.connection.drop_table :test_limits rescue nil
534
- assert_raise(ActiveRecord::ActiveRecordError, "integer limit didn't raise") do
535
- Person.connection.create_table :test_integer_limits, :force => true do |t|
536
- t.column :bigone, :integer, :limit => 10
537
- end
538
- end
539
-
540
- unless current_adapter?(:PostgreSQLAdapter)
541
- assert_raise(ActiveRecord::ActiveRecordError, "text limit didn't raise") do
542
- Person.connection.create_table :test_text_limits, :force => true do |t|
543
- t.column :bigtext, :text, :limit => 0xfffffffff
544
- end
545
- end
546
- end
547
-
548
- Person.connection.drop_table :test_limits rescue nil
549
- end
550
- end
551
-
552
- protected
553
- # This is needed to isolate class_attribute assignments like `table_name_prefix`
554
- # for each test case.
555
- def new_isolated_reminder_class
556
- Class.new(Reminder) {
557
- def self.name; "Reminder"; end
558
- def self.base_class; self; end
559
- }
560
- end
561
- end
562
-
563
- class ReservedWordsMigrationTest < ActiveRecord::TestCase
564
- def test_drop_index_from_table_named_values
565
- connection = Person.connection
566
- connection.create_table :values, :force => true do |t|
567
- t.integer :value
568
- end
569
-
570
- assert_nothing_raised do
571
- connection.add_index :values, :value
572
- connection.remove_index :values, :column => :value
573
- end
574
-
575
- connection.drop_table :values rescue nil
576
- end
577
- end
578
-
579
- class ExplicitlyNamedIndexMigrationTest < ActiveRecord::TestCase
580
- def test_drop_index_by_name
581
- connection = Person.connection
582
- connection.create_table :values, force: true do |t|
583
- t.integer :value
584
- end
585
-
586
- assert_nothing_raised ArgumentError do
587
- connection.add_index :values, :value, name: 'a_different_name'
588
- connection.remove_index :values, column: :value, name: 'a_different_name'
589
- end
590
-
591
- connection.drop_table :values rescue nil
592
- end
593
- end
594
-
595
- if ActiveRecord::Base.connection.supports_bulk_alter?
596
- class BulkAlterTableMigrationsTest < ActiveRecord::TestCase
597
- def setup
598
- @connection = Person.connection
599
- @connection.create_table(:delete_me, :force => true) {|t| }
600
- Person.reset_column_information
601
- Person.reset_sequence_name
602
- end
603
-
604
- teardown do
605
- Person.connection.drop_table(:delete_me) rescue nil
606
- end
607
-
608
- def test_adding_multiple_columns
609
- assert_queries(1) do
610
- with_bulk_change_table do |t|
611
- t.column :name, :string
612
- t.string :qualification, :experience
613
- t.integer :age, :default => 0
614
- t.date :birthdate
615
- t.timestamps null: true
616
- end
617
- end
618
-
619
- assert_equal 8, columns.size
620
- [:name, :qualification, :experience].each {|s| assert_equal :string, column(s).type }
621
- assert_equal '0', column(:age).default
622
- end
623
-
624
- def test_removing_columns
625
- with_bulk_change_table do |t|
626
- t.string :qualification, :experience
627
- end
628
-
629
- [:qualification, :experience].each {|c| assert column(c) }
630
-
631
- assert_queries(1) do
632
- with_bulk_change_table do |t|
633
- t.remove :qualification, :experience
634
- t.string :qualification_experience
635
- end
636
- end
637
-
638
- [:qualification, :experience].each {|c| assert ! column(c) }
639
- assert column(:qualification_experience)
640
- end
641
-
642
- def test_adding_indexes
643
- with_bulk_change_table do |t|
644
- t.string :username
645
- t.string :name
646
- t.integer :age
647
- end
648
-
649
- # Adding an index fires a query every time to check if an index already exists or not
650
- assert_queries(3) do
651
- with_bulk_change_table do |t|
652
- t.index :username, :unique => true, :name => :awesome_username_index
653
- t.index [:name, :age]
654
- end
655
- end
656
-
657
- assert_equal 2, indexes.size
658
-
659
- name_age_index = index(:index_delete_me_on_name_and_age)
660
- assert_equal ['name', 'age'].sort, name_age_index.columns.sort
661
- assert ! name_age_index.unique
662
-
663
- assert index(:awesome_username_index).unique
664
- end
665
-
666
- def test_removing_index
667
- with_bulk_change_table do |t|
668
- t.string :name
669
- t.index :name
670
- end
671
-
672
- assert index(:index_delete_me_on_name)
673
-
674
- assert_queries(3) do
675
- with_bulk_change_table do |t|
676
- t.remove_index :name
677
- t.index :name, :name => :new_name_index, :unique => true
678
- end
679
- end
680
-
681
- assert ! index(:index_delete_me_on_name)
682
-
683
- new_name_index = index(:new_name_index)
684
- assert new_name_index.unique
685
- end
686
-
687
- def test_changing_columns
688
- with_bulk_change_table do |t|
689
- t.string :name
690
- t.date :birthdate
691
- end
692
-
693
- assert ! column(:name).default
694
- assert_equal :date, column(:birthdate).type
695
-
696
- # One query for columns (delete_me table)
697
- # One query for primary key (delete_me table)
698
- # One query to do the bulk change
699
- assert_queries(3, :ignore_none => true) do
700
- with_bulk_change_table do |t|
701
- t.change :name, :string, :default => 'NONAME'
702
- t.change :birthdate, :datetime
703
- end
704
- end
705
-
706
- assert_equal 'NONAME', column(:name).default
707
- assert_equal :datetime, column(:birthdate).type
708
- end
709
-
710
- protected
711
-
712
- def with_bulk_change_table
713
- # Reset columns/indexes cache as we're changing the table
714
- @columns = @indexes = nil
715
-
716
- Person.connection.change_table(:delete_me, :bulk => true) do |t|
717
- yield t
718
- end
719
- end
720
-
721
- def column(name)
722
- columns.detect {|c| c.name == name.to_s }
723
- end
724
-
725
- def columns
726
- @columns ||= Person.connection.columns('delete_me')
727
- end
728
-
729
- def index(name)
730
- indexes.detect {|i| i.name == name.to_s }
731
- end
732
-
733
- def indexes
734
- @indexes ||= Person.connection.indexes('delete_me')
735
- end
736
- end # AlterTableMigrationsTest
737
-
738
- end
739
-
740
- class CopyMigrationsTest < ActiveRecord::TestCase
741
- def setup
742
- end
743
-
744
- def clear
745
- ActiveRecord::Base.timestamped_migrations = true
746
- to_delete = Dir[@migrations_path + "/*.rb"] - @existing_migrations
747
- File.delete(*to_delete)
748
- end
749
-
750
- def test_copying_migrations_without_timestamps
751
- ActiveRecord::Base.timestamped_migrations = false
752
- @migrations_path = MIGRATIONS_ROOT + "/valid"
753
- @existing_migrations = Dir[@migrations_path + "/*.rb"]
754
-
755
- copied = ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/to_copy"})
756
- assert File.exist?(@migrations_path + "/4_people_have_hobbies.bukkits.rb")
757
- assert File.exist?(@migrations_path + "/5_people_have_descriptions.bukkits.rb")
758
- assert_equal [@migrations_path + "/4_people_have_hobbies.bukkits.rb", @migrations_path + "/5_people_have_descriptions.bukkits.rb"], copied.map(&:filename)
759
-
760
- expected = "# This migration comes from bukkits (originally 1)"
761
- assert_equal expected, IO.readlines(@migrations_path + "/4_people_have_hobbies.bukkits.rb")[0].chomp
762
-
763
- files_count = Dir[@migrations_path + "/*.rb"].length
764
- copied = ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/to_copy"})
765
- assert_equal files_count, Dir[@migrations_path + "/*.rb"].length
766
- assert copied.empty?
767
- ensure
768
- clear
769
- end
770
-
771
- def test_copying_migrations_without_timestamps_from_2_sources
772
- ActiveRecord::Base.timestamped_migrations = false
773
- @migrations_path = MIGRATIONS_ROOT + "/valid"
774
- @existing_migrations = Dir[@migrations_path + "/*.rb"]
775
-
776
- sources = {}
777
- sources[:bukkits] = MIGRATIONS_ROOT + "/to_copy"
778
- sources[:omg] = MIGRATIONS_ROOT + "/to_copy2"
779
- ActiveRecord::Migration.copy(@migrations_path, sources)
780
- assert File.exist?(@migrations_path + "/4_people_have_hobbies.bukkits.rb")
781
- assert File.exist?(@migrations_path + "/5_people_have_descriptions.bukkits.rb")
782
- assert File.exist?(@migrations_path + "/6_create_articles.omg.rb")
783
- assert File.exist?(@migrations_path + "/7_create_comments.omg.rb")
784
-
785
- files_count = Dir[@migrations_path + "/*.rb"].length
786
- ActiveRecord::Migration.copy(@migrations_path, sources)
787
- assert_equal files_count, Dir[@migrations_path + "/*.rb"].length
788
- ensure
789
- clear
790
- end
791
-
792
- def test_copying_migrations_with_timestamps
793
- @migrations_path = MIGRATIONS_ROOT + "/valid_with_timestamps"
794
- @existing_migrations = Dir[@migrations_path + "/*.rb"]
795
-
796
- travel_to(Time.utc(2010, 7, 26, 10, 10, 10)) do
797
- copied = ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/to_copy_with_timestamps"})
798
- assert File.exist?(@migrations_path + "/20100726101010_people_have_hobbies.bukkits.rb")
799
- assert File.exist?(@migrations_path + "/20100726101011_people_have_descriptions.bukkits.rb")
800
- expected = [@migrations_path + "/20100726101010_people_have_hobbies.bukkits.rb",
801
- @migrations_path + "/20100726101011_people_have_descriptions.bukkits.rb"]
802
- assert_equal expected, copied.map(&:filename)
803
-
804
- files_count = Dir[@migrations_path + "/*.rb"].length
805
- copied = ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/to_copy_with_timestamps"})
806
- assert_equal files_count, Dir[@migrations_path + "/*.rb"].length
807
- assert copied.empty?
808
- end
809
- ensure
810
- clear
811
- end
812
-
813
- def test_copying_migrations_with_timestamps_from_2_sources
814
- @migrations_path = MIGRATIONS_ROOT + "/valid_with_timestamps"
815
- @existing_migrations = Dir[@migrations_path + "/*.rb"]
816
-
817
- sources = {}
818
- sources[:bukkits] = MIGRATIONS_ROOT + "/to_copy_with_timestamps"
819
- sources[:omg] = MIGRATIONS_ROOT + "/to_copy_with_timestamps2"
820
-
821
- travel_to(Time.utc(2010, 7, 26, 10, 10, 10)) do
822
- copied = ActiveRecord::Migration.copy(@migrations_path, sources)
823
- assert File.exist?(@migrations_path + "/20100726101010_people_have_hobbies.bukkits.rb")
824
- assert File.exist?(@migrations_path + "/20100726101011_people_have_descriptions.bukkits.rb")
825
- assert File.exist?(@migrations_path + "/20100726101012_create_articles.omg.rb")
826
- assert File.exist?(@migrations_path + "/20100726101013_create_comments.omg.rb")
827
- assert_equal 4, copied.length
828
-
829
- files_count = Dir[@migrations_path + "/*.rb"].length
830
- ActiveRecord::Migration.copy(@migrations_path, sources)
831
- assert_equal files_count, Dir[@migrations_path + "/*.rb"].length
832
- end
833
- ensure
834
- clear
835
- end
836
-
837
- def test_copying_migrations_with_timestamps_to_destination_with_timestamps_in_future
838
- @migrations_path = MIGRATIONS_ROOT + "/valid_with_timestamps"
839
- @existing_migrations = Dir[@migrations_path + "/*.rb"]
840
-
841
- travel_to(Time.utc(2010, 2, 20, 10, 10, 10)) do
842
- ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/to_copy_with_timestamps"})
843
- assert File.exist?(@migrations_path + "/20100301010102_people_have_hobbies.bukkits.rb")
844
- assert File.exist?(@migrations_path + "/20100301010103_people_have_descriptions.bukkits.rb")
845
-
846
- files_count = Dir[@migrations_path + "/*.rb"].length
847
- copied = ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/to_copy_with_timestamps"})
848
- assert_equal files_count, Dir[@migrations_path + "/*.rb"].length
849
- assert copied.empty?
850
- end
851
- ensure
852
- clear
853
- end
854
-
855
- def test_copying_migrations_preserving_magic_comments
856
- ActiveRecord::Base.timestamped_migrations = false
857
- @migrations_path = MIGRATIONS_ROOT + "/valid"
858
- @existing_migrations = Dir[@migrations_path + "/*.rb"]
859
-
860
- copied = ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/magic"})
861
- assert File.exist?(@migrations_path + "/4_currencies_have_symbols.bukkits.rb")
862
- assert_equal [@migrations_path + "/4_currencies_have_symbols.bukkits.rb"], copied.map(&:filename)
863
-
864
- expected = "# coding: ISO-8859-15\n# This migration comes from bukkits (originally 1)"
865
- assert_equal expected, IO.readlines(@migrations_path + "/4_currencies_have_symbols.bukkits.rb")[0..1].join.chomp
866
-
867
- files_count = Dir[@migrations_path + "/*.rb"].length
868
- copied = ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/magic"})
869
- assert_equal files_count, Dir[@migrations_path + "/*.rb"].length
870
- assert copied.empty?
871
- ensure
872
- clear
873
- end
874
-
875
- def test_skipping_migrations
876
- @migrations_path = MIGRATIONS_ROOT + "/valid_with_timestamps"
877
- @existing_migrations = Dir[@migrations_path + "/*.rb"]
878
-
879
- sources = {}
880
- sources[:bukkits] = MIGRATIONS_ROOT + "/to_copy_with_timestamps"
881
- sources[:omg] = MIGRATIONS_ROOT + "/to_copy_with_name_collision"
882
-
883
- skipped = []
884
- on_skip = Proc.new { |name, migration| skipped << "#{name} #{migration.name}" }
885
- copied = ActiveRecord::Migration.copy(@migrations_path, sources, :on_skip => on_skip)
886
- assert_equal 2, copied.length
887
-
888
- assert_equal 1, skipped.length
889
- assert_equal ["omg PeopleHaveHobbies"], skipped
890
- ensure
891
- clear
892
- end
893
-
894
- def test_skip_is_not_called_if_migrations_are_from_the_same_plugin
895
- @migrations_path = MIGRATIONS_ROOT + "/valid_with_timestamps"
896
- @existing_migrations = Dir[@migrations_path + "/*.rb"]
897
-
898
- sources = {}
899
- sources[:bukkits] = MIGRATIONS_ROOT + "/to_copy_with_timestamps"
900
-
901
- skipped = []
902
- on_skip = Proc.new { |name, migration| skipped << "#{name} #{migration.name}" }
903
- copied = ActiveRecord::Migration.copy(@migrations_path, sources, :on_skip => on_skip)
904
- ActiveRecord::Migration.copy(@migrations_path, sources, :on_skip => on_skip)
905
-
906
- assert_equal 2, copied.length
907
- assert_equal 0, skipped.length
908
- ensure
909
- clear
910
- end
911
-
912
- def test_copying_migrations_to_non_existing_directory
913
- @migrations_path = MIGRATIONS_ROOT + "/non_existing"
914
- @existing_migrations = []
915
-
916
- travel_to(Time.utc(2010, 7, 26, 10, 10, 10)) do
917
- copied = ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/to_copy_with_timestamps"})
918
- assert File.exist?(@migrations_path + "/20100726101010_people_have_hobbies.bukkits.rb")
919
- assert File.exist?(@migrations_path + "/20100726101011_people_have_descriptions.bukkits.rb")
920
- assert_equal 2, copied.length
921
- end
922
- ensure
923
- clear
924
- Dir.delete(@migrations_path)
925
- end
926
-
927
- def test_copying_migrations_to_empty_directory
928
- @migrations_path = MIGRATIONS_ROOT + "/empty"
929
- @existing_migrations = []
930
-
931
- travel_to(Time.utc(2010, 7, 26, 10, 10, 10)) do
932
- copied = ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/to_copy_with_timestamps"})
933
- assert File.exist?(@migrations_path + "/20100726101010_people_have_hobbies.bukkits.rb")
934
- assert File.exist?(@migrations_path + "/20100726101011_people_have_descriptions.bukkits.rb")
935
- assert_equal 2, copied.length
936
- end
937
- ensure
938
- clear
939
- end
940
-
941
- def test_check_pending_with_stdlib_logger
942
- old, ActiveRecord::Base.logger = ActiveRecord::Base.logger, ::Logger.new($stdout)
943
- quietly do
944
- assert_nothing_raised { ActiveRecord::Migration::CheckPending.new(Proc.new {}).call({}) }
945
- end
946
- ensure
947
- ActiveRecord::Base.logger = old
948
- end
949
-
950
- private
951
-
952
- def quietly
953
- silence_stream(STDOUT) do
954
- silence_stream(STDERR) do
955
- yield
956
- end
957
- end
958
- end
959
- end
1
+ require "cases/helper"
2
+ require "cases/migration/helper"
3
+ require 'bigdecimal/util'
4
+
5
+ require 'models/person'
6
+ require 'models/topic'
7
+ require 'models/developer'
8
+ require 'models/computer'
9
+
10
+ require MIGRATIONS_ROOT + "/valid/2_we_need_reminders"
11
+ require MIGRATIONS_ROOT + "/rename/1_we_need_things"
12
+ require MIGRATIONS_ROOT + "/rename/2_rename_things"
13
+ require MIGRATIONS_ROOT + "/decimal/1_give_me_big_numbers"
14
+
15
+ class BigNumber < ActiveRecord::Base
16
+ unless current_adapter?(:PostgreSQLAdapter, :SQLite3Adapter)
17
+ attribute :value_of_e, Type::Integer.new
18
+ end
19
+ attribute :my_house_population, Type::Integer.new
20
+ end
21
+
22
+ class Reminder < ActiveRecord::Base; end
23
+
24
+ class Thing < ActiveRecord::Base; end
25
+
26
+ class MigrationTest < ActiveRecord::TestCase
27
+ self.use_transactional_fixtures = false
28
+
29
+ fixtures :people
30
+
31
+ if (current_adapter?(:IBM_DBAdapter))
32
+ #Rename is supported only for server zOS 9 , DB2 COBRA and Informix
33
+ server_type = ActiveRecord::Base.connection.servertype.class.name
34
+ @ibm_db_rename_supported = server_type.include?('::IBM_DB2_LUW_COBRA') ||
35
+ server_type.class.name.include?('::IBM_IDS') ||
36
+ (server_type.include?('IBM_DB2_ZOS') && !server_type.include?('IBM_DB2_ZOS_8'))
37
+ end
38
+
39
+ def setup
40
+ super
41
+ %w(reminders people_reminders prefix_reminders_suffix p_things_s).each do |table|
42
+ Reminder.connection.drop_table(table) rescue nil
43
+ end
44
+ Reminder.reset_column_information
45
+ @verbose_was, ActiveRecord::Migration.verbose = ActiveRecord::Migration.verbose, false
46
+ ActiveRecord::Base.connection.schema_cache.clear!
47
+ end
48
+
49
+ teardown do
50
+ ActiveRecord::Base.table_name_prefix = ""
51
+ ActiveRecord::Base.table_name_suffix = ""
52
+
53
+ ActiveRecord::Base.connection.initialize_schema_migrations_table
54
+ ActiveRecord::Base.connection.execute "DELETE FROM #{ActiveRecord::Migrator.schema_migrations_table_name}"
55
+
56
+ %w(things awesome_things prefix_things_suffix p_awesome_things_s ).each do |table|
57
+ Thing.connection.drop_table(table) rescue nil
58
+ end
59
+ Thing.reset_column_information
60
+
61
+ %w(reminders people_reminders prefix_reminders_suffix).each do |table|
62
+ Reminder.connection.drop_table(table) rescue nil
63
+ end
64
+ Reminder.reset_table_name
65
+ Reminder.reset_column_information
66
+
67
+ %w(last_name key bio age height wealth birthday favorite_day
68
+ moment_of_truth male administrator funny).each do |column|
69
+ Person.connection.remove_column('people', column) rescue nil
70
+ end
71
+ Person.connection.remove_column("people", "first_name") rescue nil
72
+ Person.connection.remove_column("people", "middle_name") rescue nil
73
+ Person.connection.add_column("people", "first_name", :string)
74
+ Person.reset_column_information
75
+
76
+ ActiveRecord::Migration.verbose = @verbose_was
77
+ end
78
+
79
+ def test_migrator_versions
80
+ migrations_path = MIGRATIONS_ROOT + "/valid"
81
+ old_path = ActiveRecord::Migrator.migrations_paths
82
+ ActiveRecord::Migrator.migrations_paths = migrations_path
83
+
84
+ ActiveRecord::Migrator.up(migrations_path)
85
+ assert_equal 3, ActiveRecord::Migrator.current_version
86
+ assert_equal 3, ActiveRecord::Migrator.last_version
87
+ assert_equal false, ActiveRecord::Migrator.needs_migration?
88
+
89
+ ActiveRecord::Migrator.down(MIGRATIONS_ROOT + "/valid")
90
+ assert_equal 0, ActiveRecord::Migrator.current_version
91
+ assert_equal 3, ActiveRecord::Migrator.last_version
92
+ assert_equal true, ActiveRecord::Migrator.needs_migration?
93
+
94
+ ActiveRecord::SchemaMigration.create!(:version => ActiveRecord::Migrator.last_version)
95
+ assert_equal true, ActiveRecord::Migrator.needs_migration?
96
+ ensure
97
+ ActiveRecord::Migrator.migrations_paths = old_path
98
+ end
99
+
100
+ def test_migration_detection_without_schema_migration_table
101
+ ActiveRecord::Base.connection.drop_table('schema_migrations') if ActiveRecord::Base.connection.table_exists?('schema_migrations')
102
+
103
+ migrations_path = MIGRATIONS_ROOT + "/valid"
104
+ old_path = ActiveRecord::Migrator.migrations_paths
105
+ ActiveRecord::Migrator.migrations_paths = migrations_path
106
+
107
+ assert_equal true, ActiveRecord::Migrator.needs_migration?
108
+ ensure
109
+ ActiveRecord::Migrator.migrations_paths = old_path
110
+ end
111
+
112
+ def test_any_migrations
113
+ old_path = ActiveRecord::Migrator.migrations_paths
114
+ ActiveRecord::Migrator.migrations_paths = MIGRATIONS_ROOT + "/valid"
115
+
116
+ assert ActiveRecord::Migrator.any_migrations?
117
+
118
+ ActiveRecord::Migrator.migrations_paths = MIGRATIONS_ROOT + "/empty"
119
+
120
+ assert_not ActiveRecord::Migrator.any_migrations?
121
+ ensure
122
+ ActiveRecord::Migrator.migrations_paths = old_path
123
+ end
124
+
125
+ def test_migration_version
126
+ ActiveRecord::Migrator.run(:up, MIGRATIONS_ROOT + "/version_check", 20131219224947)
127
+ end
128
+
129
+ def test_create_table_with_force_true_does_not_drop_nonexisting_table
130
+ if Person.connection.table_exists?(:testings2)
131
+ Person.connection.drop_table :testings2
132
+ end
133
+
134
+ # using a copy as we need the drop_table method to
135
+ # continue to work for the ensure block of the test
136
+ temp_conn = Person.connection.dup
137
+
138
+ assert_not_equal temp_conn, Person.connection
139
+
140
+ temp_conn.create_table :testings2, :force => true do |t|
141
+ t.column :foo, :string
142
+ end
143
+ ensure
144
+ Person.connection.drop_table :testings2 rescue nil
145
+ end
146
+
147
+ def connection
148
+ ActiveRecord::Base.connection
149
+ end
150
+
151
+ def test_migration_instance_has_connection
152
+ migration = Class.new(ActiveRecord::Migration).new
153
+ assert_equal connection, migration.connection
154
+ end
155
+
156
+ def test_method_missing_delegates_to_connection
157
+ migration = Class.new(ActiveRecord::Migration) {
158
+ def connection
159
+ Class.new {
160
+ def create_table; "hi mom!"; end
161
+ }.new
162
+ end
163
+ }.new
164
+
165
+ assert_equal "hi mom!", migration.method_missing(:create_table)
166
+ end
167
+
168
+ def test_add_table_with_decimals
169
+ Person.connection.drop_table :big_numbers rescue nil
170
+
171
+ assert !BigNumber.table_exists?
172
+ GiveMeBigNumbers.up
173
+
174
+ assert BigNumber.create(
175
+ :bank_balance => 1586.43,
176
+ :big_bank_balance => BigDecimal("1000234000567.95"),
177
+ :world_population => 6000000000,
178
+ :my_house_population => 3,
179
+ :value_of_e => BigDecimal("2.7182818284590452353602875")
180
+ )
181
+
182
+ b = BigNumber.first
183
+ assert_not_nil b
184
+
185
+ assert_not_nil b.bank_balance
186
+ assert_not_nil b.big_bank_balance
187
+ assert_not_nil b.world_population
188
+ assert_not_nil b.my_house_population
189
+ assert_not_nil b.value_of_e
190
+
191
+ # TODO: set world_population >= 2**62 to cover 64-bit platforms and test
192
+ # is_a?(Bignum)
193
+ unless current_adapter?(:IBM_DBAdapter)
194
+ assert_kind_of Integer, b.world_population
195
+ else
196
+ assert_kind_of BigDecimal, b.world_population
197
+ end
198
+ assert_equal 6000000000, b.world_population
199
+ unless current_adapter?(:IBM_DBAdapter)
200
+ assert_kind_of Fixnum, b.my_house_population
201
+ else
202
+ assert_kind_of BigDecimal, b.my_house_population
203
+ end
204
+ assert_equal 3, b.my_house_population
205
+ assert_kind_of BigDecimal, b.bank_balance
206
+ assert_equal BigDecimal("1586.43"), b.bank_balance
207
+ assert_kind_of BigDecimal, b.big_bank_balance
208
+ assert_equal BigDecimal("1000234000567.95"), b.big_bank_balance
209
+
210
+ # This one is fun. The 'value_of_e' field is defined as 'DECIMAL' with
211
+ # precision/scale explicitly left out. By the SQL standard, numbers
212
+ # assigned to this field should be truncated but that's seldom respected.
213
+ if current_adapter?(:PostgreSQLAdapter)
214
+ # - PostgreSQL changes the SQL spec on columns declared simply as
215
+ # "decimal" to something more useful: instead of being given a scale
216
+ # of 0, they take on the compile-time limit for precision and scale,
217
+ # so the following should succeed unless you have used really wacky
218
+ # compilation options
219
+ # - SQLite2 has the default behavior of preserving all data sent in,
220
+ # so this happens there too
221
+ assert_kind_of BigDecimal, b.value_of_e
222
+ assert_equal BigDecimal("2.7182818284590452353602875"), b.value_of_e
223
+ elsif current_adapter?(:SQLite3Adapter)
224
+ # - SQLite3 stores a float, in violation of SQL
225
+ assert_kind_of BigDecimal, b.value_of_e
226
+ assert_in_delta BigDecimal("2.71828182845905"), b.value_of_e, 0.00000000000001
227
+ else
228
+ # - SQL standard is an integer
229
+ unless current_adapter?(:IBM_DBAdapter)
230
+ assert_kind_of Fixnum, b.value_of_e
231
+ else
232
+ assert_kind_of BigDecimal, b.value_of_e
233
+ end
234
+ assert_equal 2, b.value_of_e
235
+ end
236
+
237
+ GiveMeBigNumbers.down
238
+ assert_raise(ActiveRecord::StatementInvalid) { BigNumber.first }
239
+ end
240
+
241
+ def test_filtering_migrations
242
+ assert_no_column Person, :last_name
243
+ assert !Reminder.table_exists?
244
+
245
+ name_filter = lambda { |migration| migration.name == "ValidPeopleHaveLastNames" }
246
+ ActiveRecord::Migrator.up(MIGRATIONS_ROOT + "/valid", &name_filter)
247
+
248
+ assert_column Person, :last_name
249
+ assert_raise(ActiveRecord::StatementInvalid) { Reminder.first }
250
+
251
+ ActiveRecord::Migrator.down(MIGRATIONS_ROOT + "/valid", &name_filter)
252
+
253
+ assert_no_column Person, :last_name
254
+ assert_raise(ActiveRecord::StatementInvalid) { Reminder.first }
255
+ end
256
+
257
+ class MockMigration < ActiveRecord::Migration
258
+ attr_reader :went_up, :went_down
259
+ def initialize
260
+ @went_up = false
261
+ @went_down = false
262
+ end
263
+
264
+ def up
265
+ @went_up = true
266
+ super
267
+ end
268
+
269
+ def down
270
+ @went_down = true
271
+ super
272
+ end
273
+ end
274
+
275
+ def test_instance_based_migration_up
276
+ migration = MockMigration.new
277
+ assert !migration.went_up, 'have not gone up'
278
+ assert !migration.went_down, 'have not gone down'
279
+
280
+ migration.migrate :up
281
+ assert migration.went_up, 'have gone up'
282
+ assert !migration.went_down, 'have not gone down'
283
+ end
284
+
285
+ def test_instance_based_migration_down
286
+ migration = MockMigration.new
287
+ assert !migration.went_up, 'have not gone up'
288
+ assert !migration.went_down, 'have not gone down'
289
+
290
+ migration.migrate :down
291
+ assert !migration.went_up, 'have gone up'
292
+ assert migration.went_down, 'have not gone down'
293
+ end
294
+
295
+ if ActiveRecord::Base.connection.supports_ddl_transactions?
296
+ def test_migrator_one_up_with_exception_and_rollback
297
+ assert_no_column Person, :last_name
298
+
299
+ migration = Class.new(ActiveRecord::Migration) {
300
+ def version; 100 end
301
+ def migrate(x)
302
+ add_column "people", "last_name", :string
303
+ raise 'Something broke'
304
+ end
305
+ }.new
306
+
307
+ migrator = ActiveRecord::Migrator.new(:up, [migration], 100)
308
+
309
+ e = assert_raise(StandardError) { migrator.migrate }
310
+
311
+ assert_equal "An error has occurred, this and all later migrations canceled:\n\nSomething broke", e.message
312
+
313
+ assert_no_column Person, :last_name,
314
+ "On error, the Migrator should revert schema changes but it did not."
315
+ end
316
+
317
+ def test_migrator_one_up_with_exception_and_rollback_using_run
318
+ assert_no_column Person, :last_name
319
+
320
+ migration = Class.new(ActiveRecord::Migration) {
321
+ def version; 100 end
322
+ def migrate(x)
323
+ add_column "people", "last_name", :string
324
+ raise 'Something broke'
325
+ end
326
+ }.new
327
+
328
+ migrator = ActiveRecord::Migrator.new(:up, [migration], 100)
329
+
330
+ e = assert_raise(StandardError) { migrator.run }
331
+
332
+ assert_equal "An error has occurred, this migration was canceled:\n\nSomething broke", e.message
333
+
334
+ assert_no_column Person, :last_name,
335
+ "On error, the Migrator should revert schema changes but it did not."
336
+ end
337
+
338
+ def test_migration_without_transaction
339
+ assert_no_column Person, :last_name
340
+
341
+ migration = Class.new(ActiveRecord::Migration) {
342
+ self.disable_ddl_transaction!
343
+
344
+ def version; 101 end
345
+ def migrate(x)
346
+ add_column "people", "last_name", :string
347
+ raise 'Something broke'
348
+ end
349
+ }.new
350
+
351
+ migrator = ActiveRecord::Migrator.new(:up, [migration], 101)
352
+ e = assert_raise(StandardError) { migrator.migrate }
353
+ assert_equal "An error has occurred, all later migrations canceled:\n\nSomething broke", e.message
354
+
355
+ assert_column Person, :last_name,
356
+ "without ddl transactions, the Migrator should not rollback on error but it did."
357
+ ensure
358
+ Person.reset_column_information
359
+ if Person.column_names.include?('last_name')
360
+ Person.connection.remove_column('people', 'last_name')
361
+ end
362
+ end
363
+ end
364
+
365
+ def test_schema_migrations_table_name
366
+ original_schema_migrations_table_name = ActiveRecord::Migrator.schema_migrations_table_name
367
+
368
+ assert_equal "schema_migrations", ActiveRecord::Migrator.schema_migrations_table_name
369
+ ActiveRecord::Base.table_name_prefix = "prefix_"
370
+ ActiveRecord::Base.table_name_suffix = "_suffix"
371
+ Reminder.reset_table_name
372
+ assert_equal "prefix_schema_migrations_suffix", ActiveRecord::Migrator.schema_migrations_table_name
373
+ ActiveRecord::Base.schema_migrations_table_name = "changed"
374
+ Reminder.reset_table_name
375
+ assert_equal "prefix_changed_suffix", ActiveRecord::Migrator.schema_migrations_table_name
376
+ ActiveRecord::Base.table_name_prefix = ""
377
+ ActiveRecord::Base.table_name_suffix = ""
378
+ Reminder.reset_table_name
379
+ assert_equal "changed", ActiveRecord::Migrator.schema_migrations_table_name
380
+ ensure
381
+ ActiveRecord::Base.schema_migrations_table_name = original_schema_migrations_table_name
382
+ Reminder.reset_table_name
383
+ end
384
+
385
+ def test_proper_table_name_on_migration
386
+ reminder_class = new_isolated_reminder_class
387
+ migration = ActiveRecord::Migration.new
388
+ assert_equal "table", migration.proper_table_name('table')
389
+ assert_equal "table", migration.proper_table_name(:table)
390
+ assert_equal "reminders", migration.proper_table_name(reminder_class)
391
+ reminder_class.reset_table_name
392
+ assert_equal reminder_class.table_name, migration.proper_table_name(reminder_class)
393
+
394
+ # Use the model's own prefix/suffix if a model is given
395
+ ActiveRecord::Base.table_name_prefix = "ARprefix_"
396
+ ActiveRecord::Base.table_name_suffix = "_ARsuffix"
397
+ reminder_class.table_name_prefix = 'prefix_'
398
+ reminder_class.table_name_suffix = '_suffix'
399
+ reminder_class.reset_table_name
400
+ assert_equal "prefix_reminders_suffix", migration.proper_table_name(reminder_class)
401
+ reminder_class.table_name_prefix = ''
402
+ reminder_class.table_name_suffix = ''
403
+ reminder_class.reset_table_name
404
+
405
+ # Use AR::Base's prefix/suffix if string or symbol is given
406
+ ActiveRecord::Base.table_name_prefix = "prefix_"
407
+ ActiveRecord::Base.table_name_suffix = "_suffix"
408
+ reminder_class.reset_table_name
409
+ assert_equal "prefix_table_suffix", migration.proper_table_name('table', migration.table_name_options)
410
+ assert_equal "prefix_table_suffix", migration.proper_table_name(:table, migration.table_name_options)
411
+ end
412
+
413
+ def test_rename_table_with_prefix_and_suffix
414
+ assert !Thing.table_exists?
415
+ ActiveRecord::Base.table_name_prefix = 'p_'
416
+ ActiveRecord::Base.table_name_suffix = '_s'
417
+ Thing.reset_table_name
418
+ Thing.reset_sequence_name
419
+ WeNeedThings.up
420
+
421
+ assert Thing.create("content" => "hello world")
422
+ assert_equal "hello world", Thing.first.content
423
+
424
+ RenameThings.up
425
+ Thing.table_name = "p_awesome_things_s"
426
+
427
+ assert_equal "hello world", Thing.first.content
428
+ ensure
429
+ Thing.reset_table_name
430
+ Thing.reset_sequence_name
431
+ end
432
+
433
+ def test_add_drop_table_with_prefix_and_suffix
434
+ assert !Reminder.table_exists?
435
+ ActiveRecord::Base.table_name_prefix = 'prefix_'
436
+ ActiveRecord::Base.table_name_suffix = '_suffix'
437
+ Reminder.reset_table_name
438
+ Reminder.reset_sequence_name
439
+ WeNeedReminders.up
440
+ assert Reminder.create("content" => "hello world", "remind_at" => Time.now)
441
+ assert_equal "hello world", Reminder.first.content
442
+
443
+ WeNeedReminders.down
444
+ assert_raise(ActiveRecord::StatementInvalid) { Reminder.first }
445
+ ensure
446
+ Reminder.reset_sequence_name
447
+ end
448
+
449
+ def test_create_table_with_binary_column
450
+ Person.connection.drop_table :binary_testings rescue nil
451
+
452
+ assert_nothing_raised {
453
+ Person.connection.create_table :binary_testings do |t|
454
+ t.column "data", :binary, :null => false
455
+ end
456
+ }
457
+
458
+ columns = Person.connection.columns(:binary_testings)
459
+ data_column = columns.detect { |c| c.name == "data" }
460
+
461
+ assert_nil data_column.default
462
+
463
+ Person.connection.drop_table :binary_testings rescue nil
464
+ end
465
+
466
+ unless mysql_enforcing_gtid_consistency?
467
+ def test_create_table_with_query
468
+ Person.connection.drop_table :table_from_query_testings rescue nil
469
+ Person.connection.create_table(:person, force: true)
470
+
471
+ Person.connection.create_table :table_from_query_testings, as: "SELECT id FROM person"
472
+
473
+ columns = Person.connection.columns(:table_from_query_testings)
474
+ assert_equal 1, columns.length
475
+ assert_equal "id", columns.first.name
476
+
477
+ Person.connection.drop_table :table_from_query_testings rescue nil
478
+ end
479
+
480
+ def test_create_table_with_query_from_relation
481
+ Person.connection.drop_table :table_from_query_testings rescue nil
482
+ Person.connection.create_table(:person, force: true)
483
+
484
+ Person.connection.create_table :table_from_query_testings, as: Person.select(:id)
485
+
486
+ columns = Person.connection.columns(:table_from_query_testings)
487
+ assert_equal 1, columns.length
488
+ assert_equal "id", columns.first.name
489
+
490
+ Person.connection.drop_table :table_from_query_testings rescue nil
491
+ end
492
+ end
493
+
494
+ if current_adapter? :OracleAdapter
495
+ def test_create_table_with_custom_sequence_name
496
+ # table name is 29 chars, the standard sequence name will
497
+ # be 33 chars and should be shortened
498
+ assert_nothing_raised do
499
+ begin
500
+ Person.connection.create_table :table_with_name_thats_just_ok do |t|
501
+ t.column :foo, :string, :null => false
502
+ end
503
+ ensure
504
+ Person.connection.drop_table :table_with_name_thats_just_ok rescue nil
505
+ end
506
+ end
507
+
508
+ # should be all good w/ a custom sequence name
509
+ assert_nothing_raised do
510
+ begin
511
+ Person.connection.create_table :table_with_name_thats_just_ok,
512
+ :sequence_name => 'suitably_short_seq' do |t|
513
+ t.column :foo, :string, :null => false
514
+ end
515
+
516
+ Person.connection.execute("select suitably_short_seq.nextval from dual")
517
+
518
+ ensure
519
+ Person.connection.drop_table :table_with_name_thats_just_ok,
520
+ :sequence_name => 'suitably_short_seq' rescue nil
521
+ end
522
+ end
523
+
524
+ # confirm the custom sequence got dropped
525
+ assert_raise(ActiveRecord::StatementInvalid) do
526
+ Person.connection.execute("select suitably_short_seq.nextval from dual")
527
+ end
528
+ end
529
+ end
530
+
531
+ if current_adapter?(:MysqlAdapter, :Mysql2Adapter, :PostgreSQLAdapter)
532
+ def test_out_of_range_limit_should_raise
533
+ Person.connection.drop_table :test_limits rescue nil
534
+ assert_raise(ActiveRecord::ActiveRecordError, "integer limit didn't raise") do
535
+ Person.connection.create_table :test_integer_limits, :force => true do |t|
536
+ t.column :bigone, :integer, :limit => 10
537
+ end
538
+ end
539
+
540
+ unless current_adapter?(:PostgreSQLAdapter)
541
+ assert_raise(ActiveRecord::ActiveRecordError, "text limit didn't raise") do
542
+ Person.connection.create_table :test_text_limits, :force => true do |t|
543
+ t.column :bigtext, :text, :limit => 0xfffffffff
544
+ end
545
+ end
546
+ end
547
+
548
+ Person.connection.drop_table :test_limits rescue nil
549
+ end
550
+ end
551
+
552
+ protected
553
+ # This is needed to isolate class_attribute assignments like `table_name_prefix`
554
+ # for each test case.
555
+ def new_isolated_reminder_class
556
+ Class.new(Reminder) {
557
+ def self.name; "Reminder"; end
558
+ def self.base_class; self; end
559
+ }
560
+ end
561
+ end
562
+
563
+ class ReservedWordsMigrationTest < ActiveRecord::TestCase
564
+ def test_drop_index_from_table_named_values
565
+ connection = Person.connection
566
+ connection.create_table :values, :force => true do |t|
567
+ t.integer :value
568
+ end
569
+
570
+ assert_nothing_raised do
571
+ connection.add_index :values, :value
572
+ connection.remove_index :values, :column => :value
573
+ end
574
+
575
+ connection.drop_table :values rescue nil
576
+ end
577
+ end
578
+
579
+ class ExplicitlyNamedIndexMigrationTest < ActiveRecord::TestCase
580
+ def test_drop_index_by_name
581
+ connection = Person.connection
582
+ connection.create_table :values, force: true do |t|
583
+ t.integer :value
584
+ end
585
+
586
+ assert_nothing_raised ArgumentError do
587
+ connection.add_index :values, :value, name: 'a_different_name'
588
+ connection.remove_index :values, column: :value, name: 'a_different_name'
589
+ end
590
+
591
+ connection.drop_table :values rescue nil
592
+ end
593
+ end
594
+
595
+ if ActiveRecord::Base.connection.supports_bulk_alter?
596
+ class BulkAlterTableMigrationsTest < ActiveRecord::TestCase
597
+ def setup
598
+ @connection = Person.connection
599
+ @connection.create_table(:delete_me, :force => true) {|t| }
600
+ Person.reset_column_information
601
+ Person.reset_sequence_name
602
+ end
603
+
604
+ teardown do
605
+ Person.connection.drop_table(:delete_me) rescue nil
606
+ end
607
+
608
+ def test_adding_multiple_columns
609
+ assert_queries(1) do
610
+ with_bulk_change_table do |t|
611
+ t.column :name, :string
612
+ t.string :qualification, :experience
613
+ t.integer :age, :default => 0
614
+ t.date :birthdate
615
+ t.timestamps null: true
616
+ end
617
+ end
618
+
619
+ assert_equal 8, columns.size
620
+ [:name, :qualification, :experience].each {|s| assert_equal :string, column(s).type }
621
+ assert_equal '0', column(:age).default
622
+ end
623
+
624
+ def test_removing_columns
625
+ with_bulk_change_table do |t|
626
+ t.string :qualification, :experience
627
+ end
628
+
629
+ [:qualification, :experience].each {|c| assert column(c) }
630
+
631
+ assert_queries(1) do
632
+ with_bulk_change_table do |t|
633
+ t.remove :qualification, :experience
634
+ t.string :qualification_experience
635
+ end
636
+ end
637
+
638
+ [:qualification, :experience].each {|c| assert ! column(c) }
639
+ assert column(:qualification_experience)
640
+ end
641
+
642
+ def test_adding_indexes
643
+ with_bulk_change_table do |t|
644
+ t.string :username
645
+ t.string :name
646
+ t.integer :age
647
+ end
648
+
649
+ # Adding an index fires a query every time to check if an index already exists or not
650
+ assert_queries(3) do
651
+ with_bulk_change_table do |t|
652
+ t.index :username, :unique => true, :name => :awesome_username_index
653
+ t.index [:name, :age]
654
+ end
655
+ end
656
+
657
+ assert_equal 2, indexes.size
658
+
659
+ name_age_index = index(:index_delete_me_on_name_and_age)
660
+ assert_equal ['name', 'age'].sort, name_age_index.columns.sort
661
+ assert ! name_age_index.unique
662
+
663
+ assert index(:awesome_username_index).unique
664
+ end
665
+
666
+ def test_removing_index
667
+ with_bulk_change_table do |t|
668
+ t.string :name
669
+ t.index :name
670
+ end
671
+
672
+ assert index(:index_delete_me_on_name)
673
+
674
+ assert_queries(3) do
675
+ with_bulk_change_table do |t|
676
+ t.remove_index :name
677
+ t.index :name, :name => :new_name_index, :unique => true
678
+ end
679
+ end
680
+
681
+ assert ! index(:index_delete_me_on_name)
682
+
683
+ new_name_index = index(:new_name_index)
684
+ assert new_name_index.unique
685
+ end
686
+
687
+ def test_changing_columns
688
+ with_bulk_change_table do |t|
689
+ t.string :name
690
+ t.date :birthdate
691
+ end
692
+
693
+ assert ! column(:name).default
694
+ assert_equal :date, column(:birthdate).type
695
+
696
+ # One query for columns (delete_me table)
697
+ # One query for primary key (delete_me table)
698
+ # One query to do the bulk change
699
+ assert_queries(3, :ignore_none => true) do
700
+ with_bulk_change_table do |t|
701
+ t.change :name, :string, :default => 'NONAME'
702
+ t.change :birthdate, :datetime
703
+ end
704
+ end
705
+
706
+ assert_equal 'NONAME', column(:name).default
707
+ assert_equal :datetime, column(:birthdate).type
708
+ end
709
+
710
+ protected
711
+
712
+ def with_bulk_change_table
713
+ # Reset columns/indexes cache as we're changing the table
714
+ @columns = @indexes = nil
715
+
716
+ Person.connection.change_table(:delete_me, :bulk => true) do |t|
717
+ yield t
718
+ end
719
+ end
720
+
721
+ def column(name)
722
+ columns.detect {|c| c.name == name.to_s }
723
+ end
724
+
725
+ def columns
726
+ @columns ||= Person.connection.columns('delete_me')
727
+ end
728
+
729
+ def index(name)
730
+ indexes.detect {|i| i.name == name.to_s }
731
+ end
732
+
733
+ def indexes
734
+ @indexes ||= Person.connection.indexes('delete_me')
735
+ end
736
+ end # AlterTableMigrationsTest
737
+
738
+ end
739
+
740
+ class CopyMigrationsTest < ActiveRecord::TestCase
741
+ def setup
742
+ end
743
+
744
+ def clear
745
+ ActiveRecord::Base.timestamped_migrations = true
746
+ to_delete = Dir[@migrations_path + "/*.rb"] - @existing_migrations
747
+ File.delete(*to_delete)
748
+ end
749
+
750
+ def test_copying_migrations_without_timestamps
751
+ ActiveRecord::Base.timestamped_migrations = false
752
+ @migrations_path = MIGRATIONS_ROOT + "/valid"
753
+ @existing_migrations = Dir[@migrations_path + "/*.rb"]
754
+
755
+ copied = ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/to_copy"})
756
+ assert File.exist?(@migrations_path + "/4_people_have_hobbies.bukkits.rb")
757
+ assert File.exist?(@migrations_path + "/5_people_have_descriptions.bukkits.rb")
758
+ assert_equal [@migrations_path + "/4_people_have_hobbies.bukkits.rb", @migrations_path + "/5_people_have_descriptions.bukkits.rb"], copied.map(&:filename)
759
+
760
+ expected = "# This migration comes from bukkits (originally 1)"
761
+ assert_equal expected, IO.readlines(@migrations_path + "/4_people_have_hobbies.bukkits.rb")[0].chomp
762
+
763
+ files_count = Dir[@migrations_path + "/*.rb"].length
764
+ copied = ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/to_copy"})
765
+ assert_equal files_count, Dir[@migrations_path + "/*.rb"].length
766
+ assert copied.empty?
767
+ ensure
768
+ clear
769
+ end
770
+
771
+ def test_copying_migrations_without_timestamps_from_2_sources
772
+ ActiveRecord::Base.timestamped_migrations = false
773
+ @migrations_path = MIGRATIONS_ROOT + "/valid"
774
+ @existing_migrations = Dir[@migrations_path + "/*.rb"]
775
+
776
+ sources = {}
777
+ sources[:bukkits] = MIGRATIONS_ROOT + "/to_copy"
778
+ sources[:omg] = MIGRATIONS_ROOT + "/to_copy2"
779
+ ActiveRecord::Migration.copy(@migrations_path, sources)
780
+ assert File.exist?(@migrations_path + "/4_people_have_hobbies.bukkits.rb")
781
+ assert File.exist?(@migrations_path + "/5_people_have_descriptions.bukkits.rb")
782
+ assert File.exist?(@migrations_path + "/6_create_articles.omg.rb")
783
+ assert File.exist?(@migrations_path + "/7_create_comments.omg.rb")
784
+
785
+ files_count = Dir[@migrations_path + "/*.rb"].length
786
+ ActiveRecord::Migration.copy(@migrations_path, sources)
787
+ assert_equal files_count, Dir[@migrations_path + "/*.rb"].length
788
+ ensure
789
+ clear
790
+ end
791
+
792
+ def test_copying_migrations_with_timestamps
793
+ @migrations_path = MIGRATIONS_ROOT + "/valid_with_timestamps"
794
+ @existing_migrations = Dir[@migrations_path + "/*.rb"]
795
+
796
+ travel_to(Time.utc(2010, 7, 26, 10, 10, 10)) do
797
+ copied = ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/to_copy_with_timestamps"})
798
+ assert File.exist?(@migrations_path + "/20100726101010_people_have_hobbies.bukkits.rb")
799
+ assert File.exist?(@migrations_path + "/20100726101011_people_have_descriptions.bukkits.rb")
800
+ expected = [@migrations_path + "/20100726101010_people_have_hobbies.bukkits.rb",
801
+ @migrations_path + "/20100726101011_people_have_descriptions.bukkits.rb"]
802
+ assert_equal expected, copied.map(&:filename)
803
+
804
+ files_count = Dir[@migrations_path + "/*.rb"].length
805
+ copied = ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/to_copy_with_timestamps"})
806
+ assert_equal files_count, Dir[@migrations_path + "/*.rb"].length
807
+ assert copied.empty?
808
+ end
809
+ ensure
810
+ clear
811
+ end
812
+
813
+ def test_copying_migrations_with_timestamps_from_2_sources
814
+ @migrations_path = MIGRATIONS_ROOT + "/valid_with_timestamps"
815
+ @existing_migrations = Dir[@migrations_path + "/*.rb"]
816
+
817
+ sources = {}
818
+ sources[:bukkits] = MIGRATIONS_ROOT + "/to_copy_with_timestamps"
819
+ sources[:omg] = MIGRATIONS_ROOT + "/to_copy_with_timestamps2"
820
+
821
+ travel_to(Time.utc(2010, 7, 26, 10, 10, 10)) do
822
+ copied = ActiveRecord::Migration.copy(@migrations_path, sources)
823
+ assert File.exist?(@migrations_path + "/20100726101010_people_have_hobbies.bukkits.rb")
824
+ assert File.exist?(@migrations_path + "/20100726101011_people_have_descriptions.bukkits.rb")
825
+ assert File.exist?(@migrations_path + "/20100726101012_create_articles.omg.rb")
826
+ assert File.exist?(@migrations_path + "/20100726101013_create_comments.omg.rb")
827
+ assert_equal 4, copied.length
828
+
829
+ files_count = Dir[@migrations_path + "/*.rb"].length
830
+ ActiveRecord::Migration.copy(@migrations_path, sources)
831
+ assert_equal files_count, Dir[@migrations_path + "/*.rb"].length
832
+ end
833
+ ensure
834
+ clear
835
+ end
836
+
837
+ def test_copying_migrations_with_timestamps_to_destination_with_timestamps_in_future
838
+ @migrations_path = MIGRATIONS_ROOT + "/valid_with_timestamps"
839
+ @existing_migrations = Dir[@migrations_path + "/*.rb"]
840
+
841
+ travel_to(Time.utc(2010, 2, 20, 10, 10, 10)) do
842
+ ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/to_copy_with_timestamps"})
843
+ assert File.exist?(@migrations_path + "/20100301010102_people_have_hobbies.bukkits.rb")
844
+ assert File.exist?(@migrations_path + "/20100301010103_people_have_descriptions.bukkits.rb")
845
+
846
+ files_count = Dir[@migrations_path + "/*.rb"].length
847
+ copied = ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/to_copy_with_timestamps"})
848
+ assert_equal files_count, Dir[@migrations_path + "/*.rb"].length
849
+ assert copied.empty?
850
+ end
851
+ ensure
852
+ clear
853
+ end
854
+
855
+ def test_copying_migrations_preserving_magic_comments
856
+ ActiveRecord::Base.timestamped_migrations = false
857
+ @migrations_path = MIGRATIONS_ROOT + "/valid"
858
+ @existing_migrations = Dir[@migrations_path + "/*.rb"]
859
+
860
+ copied = ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/magic"})
861
+ assert File.exist?(@migrations_path + "/4_currencies_have_symbols.bukkits.rb")
862
+ assert_equal [@migrations_path + "/4_currencies_have_symbols.bukkits.rb"], copied.map(&:filename)
863
+
864
+ expected = "# coding: ISO-8859-15\n# This migration comes from bukkits (originally 1)"
865
+ assert_equal expected, IO.readlines(@migrations_path + "/4_currencies_have_symbols.bukkits.rb")[0..1].join.chomp
866
+
867
+ files_count = Dir[@migrations_path + "/*.rb"].length
868
+ copied = ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/magic"})
869
+ assert_equal files_count, Dir[@migrations_path + "/*.rb"].length
870
+ assert copied.empty?
871
+ ensure
872
+ clear
873
+ end
874
+
875
+ def test_skipping_migrations
876
+ @migrations_path = MIGRATIONS_ROOT + "/valid_with_timestamps"
877
+ @existing_migrations = Dir[@migrations_path + "/*.rb"]
878
+
879
+ sources = {}
880
+ sources[:bukkits] = MIGRATIONS_ROOT + "/to_copy_with_timestamps"
881
+ sources[:omg] = MIGRATIONS_ROOT + "/to_copy_with_name_collision"
882
+
883
+ skipped = []
884
+ on_skip = Proc.new { |name, migration| skipped << "#{name} #{migration.name}" }
885
+ copied = ActiveRecord::Migration.copy(@migrations_path, sources, :on_skip => on_skip)
886
+ assert_equal 2, copied.length
887
+
888
+ assert_equal 1, skipped.length
889
+ assert_equal ["omg PeopleHaveHobbies"], skipped
890
+ ensure
891
+ clear
892
+ end
893
+
894
+ def test_skip_is_not_called_if_migrations_are_from_the_same_plugin
895
+ @migrations_path = MIGRATIONS_ROOT + "/valid_with_timestamps"
896
+ @existing_migrations = Dir[@migrations_path + "/*.rb"]
897
+
898
+ sources = {}
899
+ sources[:bukkits] = MIGRATIONS_ROOT + "/to_copy_with_timestamps"
900
+
901
+ skipped = []
902
+ on_skip = Proc.new { |name, migration| skipped << "#{name} #{migration.name}" }
903
+ copied = ActiveRecord::Migration.copy(@migrations_path, sources, :on_skip => on_skip)
904
+ ActiveRecord::Migration.copy(@migrations_path, sources, :on_skip => on_skip)
905
+
906
+ assert_equal 2, copied.length
907
+ assert_equal 0, skipped.length
908
+ ensure
909
+ clear
910
+ end
911
+
912
+ def test_copying_migrations_to_non_existing_directory
913
+ @migrations_path = MIGRATIONS_ROOT + "/non_existing"
914
+ @existing_migrations = []
915
+
916
+ travel_to(Time.utc(2010, 7, 26, 10, 10, 10)) do
917
+ copied = ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/to_copy_with_timestamps"})
918
+ assert File.exist?(@migrations_path + "/20100726101010_people_have_hobbies.bukkits.rb")
919
+ assert File.exist?(@migrations_path + "/20100726101011_people_have_descriptions.bukkits.rb")
920
+ assert_equal 2, copied.length
921
+ end
922
+ ensure
923
+ clear
924
+ Dir.delete(@migrations_path)
925
+ end
926
+
927
+ def test_copying_migrations_to_empty_directory
928
+ @migrations_path = MIGRATIONS_ROOT + "/empty"
929
+ @existing_migrations = []
930
+
931
+ travel_to(Time.utc(2010, 7, 26, 10, 10, 10)) do
932
+ copied = ActiveRecord::Migration.copy(@migrations_path, {:bukkits => MIGRATIONS_ROOT + "/to_copy_with_timestamps"})
933
+ assert File.exist?(@migrations_path + "/20100726101010_people_have_hobbies.bukkits.rb")
934
+ assert File.exist?(@migrations_path + "/20100726101011_people_have_descriptions.bukkits.rb")
935
+ assert_equal 2, copied.length
936
+ end
937
+ ensure
938
+ clear
939
+ end
940
+
941
+ def test_check_pending_with_stdlib_logger
942
+ old, ActiveRecord::Base.logger = ActiveRecord::Base.logger, ::Logger.new($stdout)
943
+ quietly do
944
+ assert_nothing_raised { ActiveRecord::Migration::CheckPending.new(Proc.new {}).call({}) }
945
+ end
946
+ ensure
947
+ ActiveRecord::Base.logger = old
948
+ end
949
+
950
+ private
951
+
952
+ def quietly
953
+ silence_stream(STDOUT) do
954
+ silence_stream(STDERR) do
955
+ yield
956
+ end
957
+ end
958
+ end
959
+ end