ibm_db 3.0.0-x86-mingw32 → 3.0.1-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (465) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -0
  3. data/MANIFEST +14 -14
  4. data/README +225 -225
  5. data/ext/Makefile.nt32 +181 -181
  6. data/ext/Makefile.nt32.191 +212 -212
  7. data/ext/OLD/extconf.rb +264 -0
  8. data/ext/{extconf_MacOS.rb → OLD/extconf_MacOS.rb} +269 -269
  9. data/ext/extconf.rb +291 -264
  10. data/ext/ibm_db.c +2 -2
  11. data/ext/ruby_ibm_db.h +241 -241
  12. data/ext/ruby_ibm_db_cli.h +500 -500
  13. data/init.rb +41 -41
  14. data/lib/IBM_DB.rb +27 -27
  15. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +4 -4
  16. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +1 -1
  17. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  18. data/lib/mswin32/ibm_db.rb +115 -115
  19. data/test/active_record/connection_adapters/fake_adapter.rb +46 -0
  20. data/test/assets/example.log +1 -0
  21. data/test/assets/flowers.jpg +0 -0
  22. data/test/assets/test.txt +1 -0
  23. data/test/cases/adapter_test.rb +261 -207
  24. data/test/cases/aggregations_test.rb +158 -0
  25. data/test/cases/ar_schema_test.rb +161 -0
  26. data/test/cases/associations/association_scope_test.rb +21 -0
  27. data/test/cases/associations/belongs_to_associations_test.rb +1029 -711
  28. data/test/cases/associations/callbacks_test.rb +192 -0
  29. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -181
  30. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +26 -0
  31. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -0
  32. data/test/cases/associations/eager_load_nested_include_test.rb +128 -0
  33. data/test/cases/associations/eager_singularization_test.rb +148 -0
  34. data/test/cases/associations/eager_test.rb +1411 -0
  35. data/test/cases/associations/extension_test.rb +82 -0
  36. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +932 -851
  37. data/test/cases/associations/has_many_associations_test.rb +2162 -0
  38. data/test/cases/associations/has_many_through_associations_test.rb +1204 -0
  39. data/test/cases/associations/has_one_associations_test.rb +610 -0
  40. data/test/cases/associations/has_one_through_associations_test.rb +380 -0
  41. data/test/cases/associations/inner_join_association_test.rb +139 -0
  42. data/test/cases/associations/inverse_associations_test.rb +693 -0
  43. data/test/cases/associations/join_model_test.rb +754 -743
  44. data/test/cases/associations/nested_through_associations_test.rb +579 -0
  45. data/test/cases/associations/required_test.rb +82 -0
  46. data/test/cases/associations_test.rb +380 -0
  47. data/test/cases/attribute_decorators_test.rb +125 -0
  48. data/test/cases/attribute_methods/read_test.rb +60 -0
  49. data/test/cases/attribute_methods/serialization_test.rb +29 -0
  50. data/test/cases/attribute_methods_test.rb +952 -822
  51. data/test/cases/attribute_set_test.rb +200 -0
  52. data/test/cases/attribute_test.rb +180 -0
  53. data/test/cases/attributes_test.rb +136 -0
  54. data/test/cases/autosave_association_test.rb +1595 -0
  55. data/test/cases/base_test.rb +1638 -2133
  56. data/test/cases/batches_test.rb +212 -0
  57. data/test/cases/binary_test.rb +52 -0
  58. data/test/cases/bind_parameter_test.rb +100 -0
  59. data/test/cases/calculations_test.rb +646 -482
  60. data/test/cases/callbacks_test.rb +543 -0
  61. data/test/cases/clone_test.rb +40 -0
  62. data/test/cases/coders/yaml_column_test.rb +63 -0
  63. data/test/cases/column_alias_test.rb +17 -0
  64. data/test/cases/column_definition_test.rb +123 -0
  65. data/test/cases/connection_adapters/adapter_leasing_test.rb +54 -0
  66. data/test/cases/connection_adapters/connection_handler_test.rb +53 -0
  67. data/test/cases/connection_adapters/connection_specification_test.rb +12 -0
  68. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +293 -0
  69. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +65 -0
  70. data/test/cases/connection_adapters/quoting_test.rb +13 -0
  71. data/test/cases/connection_adapters/schema_cache_test.rb +56 -0
  72. data/test/cases/connection_adapters/type_lookup_test.rb +110 -0
  73. data/test/cases/connection_management_test.rb +122 -0
  74. data/test/cases/connection_pool_test.rb +346 -0
  75. data/test/cases/connection_specification/resolver_test.rb +116 -0
  76. data/test/cases/core_test.rb +112 -0
  77. data/test/cases/counter_cache_test.rb +209 -0
  78. data/test/cases/custom_locking_test.rb +17 -0
  79. data/test/cases/database_statements_test.rb +19 -0
  80. data/test/cases/date_time_test.rb +61 -0
  81. data/test/cases/defaults_test.rb +223 -0
  82. data/test/cases/dirty_test.rb +775 -0
  83. data/test/cases/disconnected_test.rb +28 -0
  84. data/test/cases/dup_test.rb +157 -0
  85. data/test/cases/enum_test.rb +290 -0
  86. data/test/cases/explain_subscriber_test.rb +64 -0
  87. data/test/cases/explain_test.rb +76 -0
  88. data/test/cases/finder_respond_to_test.rb +60 -0
  89. data/test/cases/finder_test.rb +1166 -0
  90. data/test/cases/fixture_set/file_test.rb +138 -0
  91. data/test/cases/fixtures_test.rb +897 -0
  92. data/test/cases/forbidden_attributes_protection_test.rb +99 -0
  93. data/test/cases/habtm_destroy_order_test.rb +61 -0
  94. data/test/cases/helper.rb +210 -0
  95. data/test/cases/hot_compatibility_test.rb +54 -0
  96. data/test/cases/i18n_test.rb +45 -0
  97. data/test/cases/inheritance_test.rb +375 -0
  98. data/test/cases/integration_test.rb +139 -0
  99. data/test/cases/invalid_connection_test.rb +22 -0
  100. data/test/cases/invalid_date_test.rb +32 -0
  101. data/test/cases/invertible_migration_test.rb +295 -0
  102. data/test/cases/json_serialization_test.rb +302 -0
  103. data/test/cases/locking_test.rb +477 -0
  104. data/test/cases/log_subscriber_test.rb +136 -0
  105. data/test/cases/migration/change_schema_test - Copy.rb +448 -0
  106. data/test/cases/migration/change_schema_test.rb +472 -0
  107. data/test/cases/migration/change_table_test.rb +224 -0
  108. data/test/cases/migration/column_attributes_test.rb +192 -0
  109. data/test/cases/migration/column_positioning_test.rb +56 -0
  110. data/test/cases/migration/columns_test.rb +304 -0
  111. data/test/cases/migration/command_recorder_test.rb +305 -0
  112. data/test/cases/migration/create_join_table_test.rb +148 -0
  113. data/test/cases/migration/foreign_key_test - Changed.rb +325 -0
  114. data/test/cases/migration/foreign_key_test.rb +360 -0
  115. data/test/cases/migration/helper.rb +39 -0
  116. data/test/cases/migration/index_test.rb +216 -0
  117. data/test/cases/migration/logger_test.rb +36 -0
  118. data/test/cases/migration/pending_migrations_test.rb +53 -0
  119. data/test/cases/migration/references_foreign_key_test.rb +214 -0
  120. data/test/cases/migration/references_index_test.rb +101 -0
  121. data/test/cases/migration/references_statements_test.rb +116 -0
  122. data/test/cases/migration/rename_table_test.rb +93 -0
  123. data/test/cases/migration/table_and_index_test.rb +24 -0
  124. data/test/cases/migration_test.rb +959 -2408
  125. data/test/cases/migrator_test.rb +388 -0
  126. data/test/cases/mixin_test.rb +70 -0
  127. data/test/cases/modules_test.rb +173 -0
  128. data/test/cases/multiparameter_attributes_test.rb +350 -0
  129. data/test/cases/multiple_db_test.rb +115 -0
  130. data/test/cases/nested_attributes_test.rb +1057 -0
  131. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -0
  132. data/test/cases/persistence_test.rb +909 -642
  133. data/test/cases/pooled_connections_test.rb +81 -0
  134. data/test/cases/primary_keys_test.rb +237 -0
  135. data/test/cases/query_cache_test.rb +326 -257
  136. data/test/cases/quoting_test.rb +156 -0
  137. data/test/cases/readonly_test.rb +118 -0
  138. data/test/cases/reaper_test.rb +85 -0
  139. data/test/cases/reflection_test.rb +454 -0
  140. data/test/cases/relation/delegation_test.rb +68 -0
  141. data/test/cases/relation/merging_test.rb +161 -0
  142. data/test/cases/relation/mutation_test.rb +165 -0
  143. data/test/cases/relation/predicate_builder_test.rb +14 -0
  144. data/test/cases/relation/where_chain_test.rb +181 -0
  145. data/test/cases/relation/where_test.rb +300 -0
  146. data/test/cases/relation/where_test2.rb +36 -0
  147. data/test/cases/relation_test.rb +297 -0
  148. data/test/cases/relations_test.rb +1815 -1182
  149. data/test/cases/reload_models_test.rb +22 -0
  150. data/test/cases/result_test.rb +80 -0
  151. data/test/cases/sanitize_test.rb +83 -0
  152. data/test/cases/schema_dumper_test.rb +463 -256
  153. data/test/cases/scoping/default_scoping_test.rb +454 -0
  154. data/test/cases/scoping/named_scoping_test.rb +524 -0
  155. data/test/cases/scoping/relation_scoping_test.rb +357 -0
  156. data/test/cases/serialization_test.rb +104 -0
  157. data/test/cases/serialized_attribute_test.rb +277 -0
  158. data/test/cases/statement_cache_test.rb +98 -0
  159. data/test/cases/store_test.rb +194 -0
  160. data/test/cases/tasks/database_tasks_test.rb +396 -0
  161. data/test/cases/tasks/mysql_rake_test.rb +311 -0
  162. data/test/cases/tasks/postgresql_rake_test.rb +245 -0
  163. data/test/cases/tasks/sqlite_rake_test.rb +193 -0
  164. data/test/cases/test_case.rb +123 -0
  165. data/test/cases/timestamp_test.rb +468 -0
  166. data/test/cases/transaction_callbacks_test.rb +452 -300
  167. data/test/cases/transaction_isolation_test.rb +106 -0
  168. data/test/cases/transactions_test.rb +817 -0
  169. data/test/cases/type/decimal_test.rb +51 -0
  170. data/test/cases/type/integer_test.rb +121 -0
  171. data/test/cases/type/string_test.rb +36 -0
  172. data/test/cases/type/type_map_test.rb +177 -0
  173. data/test/cases/type/unsigned_integer_test.rb +18 -0
  174. data/test/cases/types_test.rb +141 -0
  175. data/test/cases/unconnected_test.rb +33 -0
  176. data/test/cases/validations/association_validation_test.rb +86 -0
  177. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -0
  178. data/test/cases/validations/i18n_validation_test.rb +90 -0
  179. data/test/cases/validations/length_validation_test.rb +47 -0
  180. data/test/cases/validations/presence_validation_test.rb +68 -0
  181. data/test/cases/validations/uniqueness_validation_test.rb +434 -299
  182. data/test/cases/validations_repair_helper.rb +23 -0
  183. data/test/cases/validations_test.rb +165 -0
  184. data/test/cases/view_test.rb +113 -0
  185. data/test/cases/xml_serialization_test.rb +457 -408
  186. data/test/cases/yaml_serialization_test.rb +86 -0
  187. data/test/config.rb +5 -0
  188. data/test/config.yml +154 -154
  189. data/test/connections/native_ibm_db/connection.rb +43 -43
  190. data/test/fixtures/accounts.yml +29 -0
  191. data/test/fixtures/admin/accounts.yml +2 -0
  192. data/test/fixtures/admin/randomly_named_a9.yml +7 -0
  193. data/test/fixtures/admin/randomly_named_b0.yml +7 -0
  194. data/test/fixtures/admin/users.yml +10 -0
  195. data/test/fixtures/all/admin +1 -0
  196. data/test/fixtures/all/developers.yml +0 -0
  197. data/test/fixtures/all/people.yml +0 -0
  198. data/test/fixtures/all/tasks.yml +0 -0
  199. data/test/fixtures/author_addresses.yml +18 -0
  200. data/test/fixtures/author_favorites.yml +4 -0
  201. data/test/fixtures/authors.yml +23 -0
  202. data/test/fixtures/binaries.yml +133 -0
  203. data/test/fixtures/books.yml +11 -0
  204. data/test/fixtures/bulbs.yml +5 -0
  205. data/test/fixtures/cars.yml +9 -0
  206. data/test/fixtures/categories.yml +19 -0
  207. data/test/fixtures/categories/special_categories.yml +9 -0
  208. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
  209. data/test/fixtures/categories_ordered.yml +7 -0
  210. data/test/fixtures/categories_posts.yml +31 -0
  211. data/test/fixtures/categorizations.yml +23 -0
  212. data/test/fixtures/clubs.yml +8 -0
  213. data/test/fixtures/collections.yml +3 -0
  214. data/test/fixtures/colleges.yml +3 -0
  215. data/test/fixtures/comments.yml +65 -0
  216. data/test/fixtures/companies.yml +67 -0
  217. data/test/fixtures/computers.yml +10 -0
  218. data/test/fixtures/courses.yml +8 -0
  219. data/test/fixtures/customers.yml +26 -0
  220. data/test/fixtures/dashboards.yml +6 -0
  221. data/test/fixtures/developers.yml +22 -0
  222. data/test/fixtures/developers_projects.yml +17 -0
  223. data/test/fixtures/dog_lovers.yml +7 -0
  224. data/test/fixtures/dogs.yml +4 -0
  225. data/test/fixtures/doubloons.yml +3 -0
  226. data/test/fixtures/edges.yml +5 -0
  227. data/test/fixtures/entrants.yml +14 -0
  228. data/test/fixtures/essays.yml +6 -0
  229. data/test/fixtures/faces.yml +11 -0
  230. data/test/fixtures/fk_test_has_fk.yml +3 -0
  231. data/test/fixtures/fk_test_has_pk.yml +2 -0
  232. data/test/fixtures/friendships.yml +4 -0
  233. data/test/fixtures/funny_jokes.yml +10 -0
  234. data/test/fixtures/interests.yml +33 -0
  235. data/test/fixtures/items.yml +3 -0
  236. data/test/fixtures/jobs.yml +7 -0
  237. data/test/fixtures/legacy_things.yml +3 -0
  238. data/test/fixtures/mateys.yml +4 -0
  239. data/test/fixtures/member_details.yml +8 -0
  240. data/test/fixtures/member_types.yml +6 -0
  241. data/test/fixtures/members.yml +11 -0
  242. data/test/fixtures/memberships.yml +34 -0
  243. data/test/fixtures/men.yml +5 -0
  244. data/test/fixtures/minimalistics.yml +2 -0
  245. data/test/fixtures/minivans.yml +5 -0
  246. data/test/fixtures/mixed_case_monkeys.yml +6 -0
  247. data/test/fixtures/mixins.yml +29 -0
  248. data/test/fixtures/movies.yml +7 -0
  249. data/test/fixtures/naked/csv/accounts.csv +1 -0
  250. data/test/fixtures/naked/yml/accounts.yml +1 -0
  251. data/test/fixtures/naked/yml/companies.yml +1 -0
  252. data/test/fixtures/naked/yml/courses.yml +1 -0
  253. data/test/fixtures/organizations.yml +5 -0
  254. data/test/fixtures/other_topics.yml +42 -0
  255. data/test/fixtures/owners.yml +9 -0
  256. data/test/fixtures/parrots.yml +27 -0
  257. data/test/fixtures/parrots_pirates.yml +7 -0
  258. data/test/fixtures/people.yml +24 -0
  259. data/test/fixtures/peoples_treasures.yml +3 -0
  260. data/test/fixtures/pets.yml +19 -0
  261. data/test/fixtures/pirates.yml +12 -0
  262. data/test/fixtures/posts.yml +80 -0
  263. data/test/fixtures/price_estimates.yml +7 -0
  264. data/test/fixtures/products.yml +4 -0
  265. data/test/fixtures/projects.yml +7 -0
  266. data/test/fixtures/randomly_named_a9.yml +7 -0
  267. data/test/fixtures/ratings.yml +14 -0
  268. data/test/fixtures/readers.yml +11 -0
  269. data/test/fixtures/references.yml +17 -0
  270. data/test/fixtures/reserved_words/distinct.yml +5 -0
  271. data/test/fixtures/reserved_words/distinct_select.yml +11 -0
  272. data/test/fixtures/reserved_words/group.yml +14 -0
  273. data/test/fixtures/reserved_words/select.yml +8 -0
  274. data/test/fixtures/reserved_words/values.yml +7 -0
  275. data/test/fixtures/ships.yml +6 -0
  276. data/test/fixtures/speedometers.yml +8 -0
  277. data/test/fixtures/sponsors.yml +12 -0
  278. data/test/fixtures/string_key_objects.yml +7 -0
  279. data/test/fixtures/subscribers.yml +11 -0
  280. data/test/fixtures/subscriptions.yml +12 -0
  281. data/test/fixtures/taggings.yml +78 -0
  282. data/test/fixtures/tags.yml +11 -0
  283. data/test/fixtures/tasks.yml +7 -0
  284. data/test/fixtures/teapots.yml +3 -0
  285. data/test/fixtures/to_be_linked/accounts.yml +2 -0
  286. data/test/fixtures/to_be_linked/users.yml +10 -0
  287. data/test/fixtures/topics.yml +49 -0
  288. data/test/fixtures/toys.yml +14 -0
  289. data/test/fixtures/traffic_lights.yml +10 -0
  290. data/test/fixtures/treasures.yml +10 -0
  291. data/test/fixtures/uuid_children.yml +3 -0
  292. data/test/fixtures/uuid_parents.yml +2 -0
  293. data/test/fixtures/variants.yml +4 -0
  294. data/test/fixtures/vegetables.yml +20 -0
  295. data/test/fixtures/vertices.yml +4 -0
  296. data/test/fixtures/warehouse_things.yml +3 -0
  297. data/test/fixtures/zines.yml +5 -0
  298. data/test/ibm_db_test.rb +24 -24
  299. data/test/migrations/10_urban/9_add_expressions.rb +11 -0
  300. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -0
  301. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -0
  302. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -0
  303. data/test/migrations/missing/1_people_have_last_names.rb +9 -0
  304. data/test/migrations/missing/3_we_need_reminders.rb +12 -0
  305. data/test/migrations/missing/4_innocent_jointable.rb +12 -0
  306. data/test/migrations/rename/1_we_need_things.rb +11 -0
  307. data/test/migrations/rename/2_rename_things.rb +9 -0
  308. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -0
  309. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -0
  310. data/test/migrations/to_copy2/1_create_articles.rb +7 -0
  311. data/test/migrations/to_copy2/2_create_comments.rb +7 -0
  312. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -0
  313. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -0
  314. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -0
  315. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -0
  316. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -0
  317. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -0
  318. data/test/migrations/valid/2_we_need_reminders.rb +12 -0
  319. data/test/migrations/valid/3_innocent_jointable.rb +12 -0
  320. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -0
  321. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -0
  322. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -0
  323. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -0
  324. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -0
  325. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -0
  326. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -0
  327. data/test/models/admin.rb +5 -0
  328. data/test/models/admin/account.rb +3 -0
  329. data/test/models/admin/randomly_named_c1.rb +3 -0
  330. data/test/models/admin/user.rb +40 -0
  331. data/test/models/aircraft.rb +4 -0
  332. data/test/models/arunit2_model.rb +3 -0
  333. data/test/models/author.rb +212 -0
  334. data/test/models/auto_id.rb +4 -0
  335. data/test/models/autoloadable/extra_firm.rb +2 -0
  336. data/test/models/binary.rb +2 -0
  337. data/test/models/bird.rb +12 -0
  338. data/test/models/book.rb +18 -0
  339. data/test/models/boolean.rb +2 -0
  340. data/test/models/bulb.rb +51 -0
  341. data/test/models/cake_designer.rb +3 -0
  342. data/test/models/car.rb +26 -0
  343. data/test/models/carrier.rb +2 -0
  344. data/test/models/categorization.rb +19 -0
  345. data/test/models/category.rb +35 -0
  346. data/test/models/chef.rb +3 -0
  347. data/test/models/citation.rb +3 -0
  348. data/test/models/club.rb +23 -0
  349. data/test/models/college.rb +10 -0
  350. data/test/models/column.rb +3 -0
  351. data/test/models/column_name.rb +3 -0
  352. data/test/models/comment.rb +64 -0
  353. data/test/models/company.rb +225 -0
  354. data/test/models/company_in_module.rb +98 -0
  355. data/test/models/computer.rb +3 -0
  356. data/test/models/contact.rb +41 -0
  357. data/test/models/contract.rb +20 -0
  358. data/test/models/country.rb +7 -0
  359. data/test/models/course.rb +6 -0
  360. data/test/models/customer.rb +77 -0
  361. data/test/models/customer_carrier.rb +14 -0
  362. data/test/models/dashboard.rb +3 -0
  363. data/test/models/default.rb +2 -0
  364. data/test/models/department.rb +4 -0
  365. data/test/models/developer.rb +252 -0
  366. data/test/models/dog.rb +5 -0
  367. data/test/models/dog_lover.rb +5 -0
  368. data/test/models/doubloon.rb +12 -0
  369. data/test/models/drink_designer.rb +3 -0
  370. data/test/models/edge.rb +5 -0
  371. data/test/models/electron.rb +5 -0
  372. data/test/models/engine.rb +4 -0
  373. data/test/models/entrant.rb +3 -0
  374. data/test/models/essay.rb +5 -0
  375. data/test/models/event.rb +3 -0
  376. data/test/models/eye.rb +37 -0
  377. data/test/models/face.rb +9 -0
  378. data/test/models/friendship.rb +6 -0
  379. data/test/models/guid.rb +2 -0
  380. data/test/models/hotel.rb +6 -0
  381. data/test/models/image.rb +3 -0
  382. data/test/models/interest.rb +5 -0
  383. data/test/models/invoice.rb +4 -0
  384. data/test/models/item.rb +7 -0
  385. data/test/models/job.rb +7 -0
  386. data/test/models/joke.rb +7 -0
  387. data/test/models/keyboard.rb +3 -0
  388. data/test/models/legacy_thing.rb +3 -0
  389. data/test/models/lesson.rb +11 -0
  390. data/test/models/line_item.rb +3 -0
  391. data/test/models/liquid.rb +4 -0
  392. data/test/models/man.rb +11 -0
  393. data/test/models/matey.rb +4 -0
  394. data/test/models/member.rb +41 -0
  395. data/test/models/member_detail.rb +7 -0
  396. data/test/models/member_type.rb +3 -0
  397. data/test/models/membership.rb +35 -0
  398. data/test/models/minimalistic.rb +2 -0
  399. data/test/models/minivan.rb +9 -0
  400. data/test/models/mixed_case_monkey.rb +3 -0
  401. data/test/models/molecule.rb +6 -0
  402. data/test/models/movie.rb +5 -0
  403. data/test/models/order.rb +4 -0
  404. data/test/models/organization.rb +14 -0
  405. data/test/models/owner.rb +34 -0
  406. data/test/models/parrot.rb +29 -0
  407. data/test/models/person.rb +143 -0
  408. data/test/models/personal_legacy_thing.rb +4 -0
  409. data/test/models/pet.rb +15 -0
  410. data/test/models/pirate.rb +92 -0
  411. data/test/models/possession.rb +3 -0
  412. data/test/models/post.rb +264 -0
  413. data/test/models/price_estimate.rb +4 -0
  414. data/test/models/professor.rb +5 -0
  415. data/test/models/project.rb +29 -0
  416. data/test/models/publisher.rb +2 -0
  417. data/test/models/publisher/article.rb +4 -0
  418. data/test/models/publisher/magazine.rb +3 -0
  419. data/test/models/randomly_named_c1.rb +3 -0
  420. data/test/models/rating.rb +4 -0
  421. data/test/models/reader.rb +23 -0
  422. data/test/models/record.rb +2 -0
  423. data/test/models/reference.rb +22 -0
  424. data/test/models/reply.rb +61 -0
  425. data/test/models/ship.rb +33 -0
  426. data/test/models/ship_part.rb +8 -0
  427. data/test/models/shop.rb +17 -0
  428. data/test/models/shop_account.rb +6 -0
  429. data/test/models/speedometer.rb +6 -0
  430. data/test/models/sponsor.rb +7 -0
  431. data/test/models/string_key_object.rb +3 -0
  432. data/test/models/student.rb +4 -0
  433. data/test/models/subject.rb +16 -0
  434. data/test/models/subscriber.rb +8 -0
  435. data/test/models/subscription.rb +4 -0
  436. data/test/models/tag.rb +7 -0
  437. data/test/models/tagging.rb +13 -0
  438. data/test/models/task.rb +5 -0
  439. data/test/models/topic.rb +124 -0
  440. data/test/models/toy.rb +6 -0
  441. data/test/models/traffic_light.rb +4 -0
  442. data/test/models/treasure.rb +14 -0
  443. data/test/models/treaty.rb +7 -0
  444. data/test/models/tyre.rb +11 -0
  445. data/test/models/uuid_child.rb +3 -0
  446. data/test/models/uuid_parent.rb +3 -0
  447. data/test/models/vegetables.rb +24 -0
  448. data/test/models/vehicle.rb +7 -0
  449. data/test/models/vertex.rb +9 -0
  450. data/test/models/warehouse_thing.rb +5 -5
  451. data/test/models/wheel.rb +3 -0
  452. data/test/models/without_table.rb +3 -0
  453. data/test/models/zine.rb +3 -0
  454. data/test/schema/mysql2_specific_schema.rb +58 -0
  455. data/test/schema/mysql_specific_schema.rb +70 -0
  456. data/test/schema/oracle_specific_schema.rb +43 -0
  457. data/test/schema/postgresql_specific_schema.rb +202 -0
  458. data/test/schema/schema.rb +938 -751
  459. data/test/schema/sqlite_specific_schema.rb +22 -0
  460. data/test/support/config.rb +43 -0
  461. data/test/support/connection.rb +22 -0
  462. data/test/support/connection_helper.rb +14 -0
  463. data/test/support/ddl_helper.rb +8 -0
  464. data/test/support/schema_dumping_helper.rb +20 -0
  465. metadata +444 -18
@@ -0,0 +1,304 @@
1
+ require "cases/migration/helper"
2
+
3
+ module ActiveRecord
4
+ class Migration
5
+ class ColumnsTest < ActiveRecord::TestCase
6
+ include ActiveRecord::Migration::TestHelper
7
+
8
+ self.use_transactional_fixtures = false
9
+
10
+ if(!current_adapter?(:IBM_DBAdapter) )
11
+ #|| @ibm_db_rename_supported)
12
+ # FIXME: this is more of an integration test with AR::Base and the
13
+ # schema modifications. Maybe we should move this?
14
+ def test_add_rename
15
+ add_column "test_models", "girlfriend", :string
16
+ TestModel.reset_column_information
17
+
18
+ TestModel.create :girlfriend => 'bobette'
19
+
20
+ rename_column "test_models", "girlfriend", "exgirlfriend"
21
+
22
+ TestModel.reset_column_information
23
+ bob = TestModel.first
24
+
25
+ assert_equal "bobette", bob.exgirlfriend
26
+ end
27
+
28
+ # FIXME: another integration test. We should decouple this from the
29
+ # AR::Base implementation.
30
+ def test_rename_column_using_symbol_arguments
31
+ add_column :test_models, :first_name, :string
32
+
33
+ TestModel.create :first_name => 'foo'
34
+
35
+ rename_column :test_models, :first_name, :nick_name
36
+ TestModel.reset_column_information
37
+ assert TestModel.column_names.include?("nick_name")
38
+ assert_equal ['foo'], TestModel.all.map(&:nick_name)
39
+ end
40
+
41
+ # FIXME: another integration test. We should decouple this from the
42
+ # AR::Base implementation.
43
+ def test_rename_column
44
+ add_column "test_models", "first_name", "string"
45
+
46
+ TestModel.create :first_name => 'foo'
47
+
48
+ rename_column "test_models", "first_name", "nick_name"
49
+ TestModel.reset_column_information
50
+ assert TestModel.column_names.include?("nick_name")
51
+ assert_equal ['foo'], TestModel.all.map(&:nick_name)
52
+ end
53
+
54
+ def test_rename_column_preserves_default_value_not_null
55
+ add_column 'test_models', 'salary', :integer, :default => 70000
56
+
57
+ default_before = connection.columns("test_models").find { |c| c.name == "salary" }.default
58
+ assert_equal '70000', default_before
59
+
60
+ rename_column "test_models", "salary", "annual_salary"
61
+
62
+ assert TestModel.column_names.include?("annual_salary")
63
+ default_after = connection.columns("test_models").find { |c| c.name == "annual_salary" }.default
64
+ assert_equal '70000', default_after
65
+ end
66
+
67
+ if current_adapter?(:MysqlAdapter, :Mysql2Adapter)
68
+ def test_mysql_rename_column_preserves_auto_increment
69
+ rename_column "test_models", "id", "id_test"
70
+ assert_equal "auto_increment", connection.columns("test_models").find { |c| c.name == "id_test" }.extra
71
+ TestModel.reset_column_information
72
+ ensure
73
+ rename_column "test_models", "id_test", "id"
74
+ end
75
+ end
76
+
77
+ def test_rename_nonexistent_column
78
+ exception = if current_adapter?(:PostgreSQLAdapter, :OracleAdapter)
79
+ ActiveRecord::StatementInvalid
80
+ else
81
+ ActiveRecord::ActiveRecordError
82
+ end
83
+ assert_raise(exception) do
84
+ rename_column "test_models", "nonexistent", "should_fail"
85
+ end
86
+ end
87
+
88
+ def test_rename_column_with_sql_reserved_word
89
+ add_column 'test_models', 'first_name', :string
90
+ rename_column "test_models", "first_name", "group"
91
+
92
+ assert TestModel.column_names.include?("group")
93
+ end
94
+
95
+ def test_rename_column_with_an_index
96
+ add_column "test_models", :hat_name, :string
97
+ add_index :test_models, :hat_name
98
+
99
+ assert_equal 1, connection.indexes('test_models').size
100
+ rename_column "test_models", "hat_name", "name"
101
+
102
+ assert_equal ['index_test_models_on_name'], connection.indexes('test_models').map(&:name)
103
+ end
104
+
105
+ def test_rename_column_with_multi_column_index
106
+ add_column "test_models", :hat_size, :integer
107
+ add_column "test_models", :hat_style, :string, limit: 100
108
+ add_index "test_models", ["hat_style", "hat_size"], unique: true
109
+
110
+ rename_column "test_models", "hat_size", 'size'
111
+ if current_adapter? :OracleAdapter
112
+ assert_equal ['i_test_models_hat_style_size'], connection.indexes('test_models').map(&:name)
113
+ else
114
+ assert_equal ['index_test_models_on_hat_style_and_size'], connection.indexes('test_models').map(&:name)
115
+ end
116
+
117
+ rename_column "test_models", "hat_style", 'style'
118
+ if current_adapter? :OracleAdapter
119
+ assert_equal ['i_test_models_style_size'], connection.indexes('test_models').map(&:name)
120
+ else
121
+ assert_equal ['index_test_models_on_style_and_size'], connection.indexes('test_models').map(&:name)
122
+ end
123
+ end
124
+
125
+ def test_rename_column_does_not_rename_custom_named_index
126
+ add_column "test_models", :hat_name, :string
127
+ add_index :test_models, :hat_name, :name => 'idx_hat_name'
128
+
129
+ assert_equal 1, connection.indexes('test_models').size
130
+ rename_column "test_models", "hat_name", "name"
131
+ assert_equal ['idx_hat_name'], connection.indexes('test_models').map(&:name)
132
+ end
133
+ end
134
+
135
+ def test_remove_column_with_index
136
+ add_column "test_models", :hat_name, :string
137
+ add_index :test_models, :hat_name
138
+
139
+ assert_equal 1, connection.indexes('test_models').size
140
+ remove_column("test_models", "hat_name")
141
+ assert_equal 0, connection.indexes('test_models').size
142
+ end
143
+
144
+ def test_remove_column_with_multi_column_index
145
+ add_column "test_models", :hat_size, :integer
146
+ add_column "test_models", :hat_style, :string, :limit => 100
147
+ add_index "test_models", ["hat_style", "hat_size"], :unique => true
148
+
149
+ assert_equal 1, connection.indexes('test_models').size
150
+ remove_column("test_models", "hat_size")
151
+
152
+ # Every database and/or database adapter has their own behavior
153
+ # if it drops the multi-column index when any of the indexed columns dropped by remove_column.
154
+ if current_adapter?(:PostgreSQLAdapter, :OracleAdapter)
155
+ assert_equal [], connection.indexes('test_models').map(&:name)
156
+ else
157
+ assert_equal ['index_test_models_on_hat_style_and_hat_size'], connection.indexes('test_models').map(&:name)
158
+ end
159
+ end
160
+
161
+ def test_change_type_of_not_null_column
162
+ change_column "test_models", "updated_at", :datetime, :null => false
163
+ change_column "test_models", "updated_at", :datetime, :null => false
164
+
165
+ TestModel.reset_column_information
166
+ assert_equal false, TestModel.columns_hash['updated_at'].null
167
+ ensure
168
+ change_column "test_models", "updated_at", :datetime, :null => true
169
+ end
170
+
171
+ def test_change_column_nullability
172
+ add_column "test_models", "funny", :boolean
173
+ assert TestModel.columns_hash["funny"].null, "Column 'funny' must initially allow nulls"
174
+
175
+ change_column "test_models", "funny", :boolean, :null => false, :default => true
176
+
177
+ TestModel.reset_column_information
178
+ assert_not TestModel.columns_hash["funny"].null, "Column 'funny' must *not* allow nulls at this point"
179
+
180
+ change_column "test_models", "funny", :boolean, :null => true
181
+ TestModel.reset_column_information
182
+ assert TestModel.columns_hash["funny"].null, "Column 'funny' must allow nulls again at this point"
183
+ end
184
+
185
+ unless current_adapter?(:IBM_DBAdapter)
186
+ def test_change_column
187
+ add_column 'test_models', 'age', :integer
188
+ add_column 'test_models', 'approved', :boolean, :default => true
189
+
190
+ old_columns = connection.columns(TestModel.table_name)
191
+
192
+ assert old_columns.find { |c| c.name == 'age' && c.type == :integer }
193
+
194
+ change_column "test_models", "age", :string
195
+
196
+ new_columns = connection.columns(TestModel.table_name)
197
+
198
+ assert_not new_columns.find { |c| c.name == 'age' and c.type == :integer }
199
+ assert new_columns.find { |c| c.name == 'age' and c.type == :string }
200
+
201
+ old_columns = connection.columns(TestModel.table_name)
202
+ assert old_columns.find { |c|
203
+ default = c.type_cast_from_database(c.default)
204
+ c.name == 'approved' && c.type == :boolean && default == true
205
+ }
206
+
207
+ change_column :test_models, :approved, :boolean, :default => false
208
+ new_columns = connection.columns(TestModel.table_name)
209
+
210
+ assert_not new_columns.find { |c|
211
+ default = c.type_cast_from_database(c.default)
212
+ c.name == 'approved' and c.type == :boolean and default == true
213
+ }
214
+ assert new_columns.find { |c|
215
+ default = c.type_cast_from_database(c.default)
216
+ c.name == 'approved' and c.type == :boolean and default == false
217
+ }
218
+ change_column :test_models, :approved, :boolean, :default => true
219
+ end
220
+ end
221
+
222
+ def test_change_column_with_nil_default
223
+ add_column "test_models", "contributor", :boolean, :default => true
224
+ assert TestModel.new.contributor?
225
+
226
+ change_column "test_models", "contributor", :boolean, :default => nil
227
+ TestModel.reset_column_information
228
+ assert_not TestModel.new.contributor?
229
+ assert_nil TestModel.new.contributor
230
+ end
231
+
232
+ def test_change_column_with_new_default
233
+ add_column "test_models", "administrator", :boolean, :default => true
234
+ assert TestModel.new.administrator?
235
+
236
+ change_column "test_models", "administrator", :boolean, :default => false
237
+ TestModel.reset_column_information
238
+ assert_not TestModel.new.administrator?
239
+ end
240
+
241
+ def test_change_column_with_custom_index_name
242
+ add_column "test_models", "category", :string
243
+ add_index :test_models, :category, name: 'test_models_categories_idx'
244
+
245
+ assert_equal ['test_models_categories_idx'], connection.indexes('test_models').map(&:name)
246
+ change_column "test_models", "category", :string, null: false, default: 'article'
247
+
248
+ assert_equal ['test_models_categories_idx'], connection.indexes('test_models').map(&:name)
249
+ end
250
+
251
+ def test_change_column_with_long_index_name
252
+ table_name_prefix = 'test_models_'
253
+ long_index_name = table_name_prefix + ('x' * (connection.allowed_index_name_length - table_name_prefix.length))
254
+ add_column "test_models", "category", :string
255
+ add_index :test_models, :category, name: long_index_name
256
+
257
+ change_column "test_models", "category", :string, null: false, default: 'article'
258
+
259
+ assert_equal [long_index_name], connection.indexes('test_models').map(&:name)
260
+ end
261
+
262
+ def test_change_column_default
263
+ add_column "test_models", "first_name", :string
264
+ connection.change_column_default "test_models", "first_name", "Tester"
265
+
266
+ assert_equal "Tester", TestModel.new.first_name
267
+ end
268
+
269
+ def test_change_column_default_to_null
270
+ add_column "test_models", "first_name", :string
271
+ connection.change_column_default "test_models", "first_name", nil
272
+ assert_nil TestModel.new.first_name
273
+ end
274
+
275
+ def test_remove_column_no_second_parameter_raises_exception
276
+ assert_raise(ArgumentError) { connection.remove_column("funny") }
277
+ end
278
+
279
+ def test_removing_and_renaming_column_preserves_custom_primary_key
280
+ connection.create_table "my_table", primary_key: "my_table_id", force: true do |t|
281
+ t.integer "col_one"
282
+ t.string "col_two", limit: 128, null: false
283
+ end
284
+
285
+ remove_column("my_table", "col_two")
286
+ rename_column("my_table", "col_one", "col_three")
287
+
288
+ assert_equal 'my_table_id', connection.primary_key('my_table')
289
+ ensure
290
+ connection.drop_table(:my_table) rescue nil
291
+ end
292
+
293
+ def test_column_with_index
294
+ connection.create_table "my_table", force: true do |t|
295
+ t.string :item_number, index: true
296
+ end
297
+
298
+ assert connection.index_exists?("my_table", :item_number, name: :index_my_table_on_item_number)
299
+ ensure
300
+ connection.drop_table(:my_table) rescue nil
301
+ end
302
+ end
303
+ end
304
+ end
@@ -0,0 +1,305 @@
1
+ require "cases/helper"
2
+
3
+ module ActiveRecord
4
+ class Migration
5
+ class CommandRecorderTest < ActiveRecord::TestCase
6
+ def setup
7
+ connection = ActiveRecord::Base.connection
8
+ @recorder = CommandRecorder.new(connection)
9
+ end
10
+
11
+ def test_respond_to_delegates
12
+ recorder = CommandRecorder.new(Class.new {
13
+ def america; end
14
+ }.new)
15
+ assert recorder.respond_to?(:america)
16
+ end
17
+
18
+ def test_send_calls_super
19
+ assert_raises(NoMethodError) do
20
+ @recorder.send(:non_existing_method, :horses)
21
+ end
22
+ end
23
+
24
+ def test_send_delegates_to_record
25
+ recorder = CommandRecorder.new(Class.new {
26
+ def create_table(name); end
27
+ }.new)
28
+ assert recorder.respond_to?(:create_table), 'respond_to? create_table'
29
+ recorder.send(:create_table, :horses)
30
+ assert_equal [[:create_table, [:horses], nil]], recorder.commands
31
+ end
32
+
33
+ def test_unknown_commands_delegate
34
+ recorder = CommandRecorder.new(stub(:foo => 'bar'))
35
+ assert_equal 'bar', recorder.foo
36
+ end
37
+
38
+ def test_inverse_of_raise_exception_on_unknown_commands
39
+ assert_raises(ActiveRecord::IrreversibleMigration) do
40
+ @recorder.inverse_of :execute, ['some sql']
41
+ end
42
+ end
43
+
44
+ def test_irreversible_commands_raise_exception
45
+ assert_raises(ActiveRecord::IrreversibleMigration) do
46
+ @recorder.revert{ @recorder.execute 'some sql' }
47
+ end
48
+ end
49
+
50
+ def test_record
51
+ @recorder.record :create_table, [:system_settings]
52
+ assert_equal 1, @recorder.commands.length
53
+ end
54
+
55
+ def test_inverted_commands_are_reversed
56
+ @recorder.revert do
57
+ @recorder.record :create_table, [:hello]
58
+ @recorder.record :create_table, [:world]
59
+ end
60
+ tables = @recorder.commands.map{|_cmd, args, _block| args}
61
+ assert_equal [[:world], [:hello]], tables
62
+ end
63
+
64
+ def test_revert_order
65
+ block = Proc.new{|t| t.string :name }
66
+ @recorder.instance_eval do
67
+ create_table("apples", &block)
68
+ revert do
69
+ create_table("bananas", &block)
70
+ revert do
71
+ create_table("clementines", &block)
72
+ create_table("dates")
73
+ end
74
+ create_table("elderberries")
75
+ end
76
+ revert do
77
+ create_table("figs", &block)
78
+ create_table("grapes")
79
+ end
80
+ end
81
+ assert_equal [[:create_table, ["apples"], block], [:drop_table, ["elderberries"], nil],
82
+ [:create_table, ["clementines"], block], [:create_table, ["dates"], nil],
83
+ [:drop_table, ["bananas"], block], [:drop_table, ["grapes"], nil],
84
+ [:drop_table, ["figs"], block]], @recorder.commands
85
+ end
86
+
87
+ def test_invert_change_table
88
+ @recorder.revert do
89
+ @recorder.change_table :fruits do |t|
90
+ t.string :name
91
+ t.rename :kind, :cultivar
92
+ end
93
+ end
94
+ assert_equal [
95
+ [:rename_column, [:fruits, :cultivar, :kind]],
96
+ [:remove_column, [:fruits, :name, :string, {}], nil],
97
+ ], @recorder.commands
98
+
99
+ assert_raises(ActiveRecord::IrreversibleMigration) do
100
+ @recorder.revert do
101
+ @recorder.change_table :fruits do |t|
102
+ t.remove :kind
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ def test_invert_create_table
109
+ @recorder.revert do
110
+ @recorder.record :create_table, [:system_settings]
111
+ end
112
+ drop_table = @recorder.commands.first
113
+ assert_equal [:drop_table, [:system_settings], nil], drop_table
114
+ end
115
+
116
+ def test_invert_create_table_with_options_and_block
117
+ block = Proc.new{}
118
+ drop_table = @recorder.inverse_of :create_table, [:people_reminders, id: false], &block
119
+ assert_equal [:drop_table, [:people_reminders, id: false], block], drop_table
120
+ end
121
+
122
+ def test_invert_drop_table
123
+ block = Proc.new{}
124
+ create_table = @recorder.inverse_of :drop_table, [:people_reminders, id: false], &block
125
+ assert_equal [:create_table, [:people_reminders, id: false], block], create_table
126
+ end
127
+
128
+ def test_invert_drop_table_without_a_block_nor_option
129
+ assert_raises(ActiveRecord::IrreversibleMigration) do
130
+ @recorder.inverse_of :drop_table, [:people_reminders]
131
+ end
132
+ end
133
+
134
+ def test_invert_create_join_table
135
+ drop_join_table = @recorder.inverse_of :create_join_table, [:musics, :artists]
136
+ assert_equal [:drop_join_table, [:musics, :artists], nil], drop_join_table
137
+ end
138
+
139
+ def test_invert_create_join_table_with_table_name
140
+ drop_join_table = @recorder.inverse_of :create_join_table, [:musics, :artists, table_name: :catalog]
141
+ assert_equal [:drop_join_table, [:musics, :artists, table_name: :catalog], nil], drop_join_table
142
+ end
143
+
144
+ def test_invert_drop_join_table
145
+ block = Proc.new{}
146
+ create_join_table = @recorder.inverse_of :drop_join_table, [:musics, :artists, table_name: :catalog], &block
147
+ assert_equal [:create_join_table, [:musics, :artists, table_name: :catalog], block], create_join_table
148
+ end
149
+
150
+ def test_invert_rename_table
151
+ rename = @recorder.inverse_of :rename_table, [:old, :new]
152
+ assert_equal [:rename_table, [:new, :old]], rename
153
+ end
154
+
155
+ def test_invert_add_column
156
+ remove = @recorder.inverse_of :add_column, [:table, :column, :type, {}]
157
+ assert_equal [:remove_column, [:table, :column, :type, {}], nil], remove
158
+ end
159
+
160
+ def test_invert_change_column
161
+ assert_raises(ActiveRecord::IrreversibleMigration) do
162
+ @recorder.inverse_of :change_column, [:table, :column, :type, {}]
163
+ end
164
+ end
165
+
166
+ def test_invert_change_column_default
167
+ assert_raises(ActiveRecord::IrreversibleMigration) do
168
+ @recorder.inverse_of :change_column_default, [:table, :column, 'default_value']
169
+ end
170
+ end
171
+
172
+ def test_invert_change_column_null
173
+ add = @recorder.inverse_of :change_column_null, [:table, :column, true]
174
+ assert_equal [:change_column_null, [:table, :column, false]], add
175
+ end
176
+
177
+ def test_invert_remove_column
178
+ add = @recorder.inverse_of :remove_column, [:table, :column, :type, {}]
179
+ assert_equal [:add_column, [:table, :column, :type, {}], nil], add
180
+ end
181
+
182
+ def test_invert_remove_column_without_type
183
+ assert_raises(ActiveRecord::IrreversibleMigration) do
184
+ @recorder.inverse_of :remove_column, [:table, :column]
185
+ end
186
+ end
187
+
188
+ def test_invert_rename_column
189
+ rename = @recorder.inverse_of :rename_column, [:table, :old, :new]
190
+ assert_equal [:rename_column, [:table, :new, :old]], rename
191
+ end
192
+
193
+ def test_invert_add_index
194
+ remove = @recorder.inverse_of :add_index, [:table, [:one, :two]]
195
+ assert_equal [:remove_index, [:table, {column: [:one, :two]}]], remove
196
+ end
197
+
198
+ def test_invert_add_index_with_name
199
+ remove = @recorder.inverse_of :add_index, [:table, [:one, :two], name: "new_index"]
200
+ assert_equal [:remove_index, [:table, {name: "new_index"}]], remove
201
+ end
202
+
203
+ def test_invert_add_index_with_no_options
204
+ remove = @recorder.inverse_of :add_index, [:table, [:one, :two]]
205
+ assert_equal [:remove_index, [:table, {column: [:one, :two]}]], remove
206
+ end
207
+
208
+ def test_invert_remove_index
209
+ add = @recorder.inverse_of :remove_index, [:table, {column: [:one, :two], options: true}]
210
+ assert_equal [:add_index, [:table, [:one, :two], options: true]], add
211
+ end
212
+
213
+ def test_invert_remove_index_with_name
214
+ add = @recorder.inverse_of :remove_index, [:table, {column: [:one, :two], name: "new_index"}]
215
+ assert_equal [:add_index, [:table, [:one, :two], name: "new_index"]], add
216
+ end
217
+
218
+ def test_invert_remove_index_with_no_special_options
219
+ add = @recorder.inverse_of :remove_index, [:table, {column: [:one, :two]}]
220
+ assert_equal [:add_index, [:table, [:one, :two], {}]], add
221
+ end
222
+
223
+ def test_invert_remove_index_with_no_column
224
+ assert_raises(ActiveRecord::IrreversibleMigration) do
225
+ @recorder.inverse_of :remove_index, [:table, name: "new_index"]
226
+ end
227
+ end
228
+
229
+ def test_invert_rename_index
230
+ rename = @recorder.inverse_of :rename_index, [:table, :old, :new]
231
+ assert_equal [:rename_index, [:table, :new, :old]], rename
232
+ end
233
+
234
+ def test_invert_add_timestamps
235
+ remove = @recorder.inverse_of :add_timestamps, [:table]
236
+ assert_equal [:remove_timestamps, [:table], nil], remove
237
+ end
238
+
239
+ def test_invert_remove_timestamps
240
+ add = @recorder.inverse_of :remove_timestamps, [:table, { null: true }]
241
+ assert_equal [:add_timestamps, [:table, {null: true }], nil], add
242
+ end
243
+
244
+ def test_invert_add_reference
245
+ remove = @recorder.inverse_of :add_reference, [:table, :taggable, { polymorphic: true }]
246
+ assert_equal [:remove_reference, [:table, :taggable, { polymorphic: true }], nil], remove
247
+ end
248
+
249
+ def test_invert_add_belongs_to_alias
250
+ remove = @recorder.inverse_of :add_belongs_to, [:table, :user]
251
+ assert_equal [:remove_reference, [:table, :user], nil], remove
252
+ end
253
+
254
+ def test_invert_remove_reference
255
+ add = @recorder.inverse_of :remove_reference, [:table, :taggable, { polymorphic: true }]
256
+ assert_equal [:add_reference, [:table, :taggable, { polymorphic: true }], nil], add
257
+ end
258
+
259
+ def test_invert_remove_reference_with_index_and_foreign_key
260
+ add = @recorder.inverse_of :remove_reference, [:table, :taggable, { index: true, foreign_key: true }]
261
+ assert_equal [:add_reference, [:table, :taggable, { index: true, foreign_key: true }], nil], add
262
+ end
263
+
264
+ def test_invert_remove_belongs_to_alias
265
+ add = @recorder.inverse_of :remove_belongs_to, [:table, :user]
266
+ assert_equal [:add_reference, [:table, :user], nil], add
267
+ end
268
+
269
+ def test_invert_enable_extension
270
+ disable = @recorder.inverse_of :enable_extension, ['uuid-ossp']
271
+ assert_equal [:disable_extension, ['uuid-ossp'], nil], disable
272
+ end
273
+
274
+ def test_invert_disable_extension
275
+ enable = @recorder.inverse_of :disable_extension, ['uuid-ossp']
276
+ assert_equal [:enable_extension, ['uuid-ossp'], nil], enable
277
+ end
278
+
279
+ def test_invert_add_foreign_key
280
+ enable = @recorder.inverse_of :add_foreign_key, [:dogs, :people]
281
+ assert_equal [:remove_foreign_key, [:dogs, :people]], enable
282
+ end
283
+
284
+ def test_invert_add_foreign_key_with_column
285
+ enable = @recorder.inverse_of :add_foreign_key, [:dogs, :people, column: "owner_id"]
286
+ assert_equal [:remove_foreign_key, [:dogs, column: "owner_id"]], enable
287
+ end
288
+
289
+ def test_invert_add_foreign_key_with_column_and_name
290
+ enable = @recorder.inverse_of :add_foreign_key, [:dogs, :people, column: "owner_id", name: "fk"]
291
+ assert_equal [:remove_foreign_key, [:dogs, name: "fk"]], enable
292
+ end
293
+
294
+ def test_remove_foreign_key_is_irreversible
295
+ assert_raises ActiveRecord::IrreversibleMigration do
296
+ @recorder.inverse_of :remove_foreign_key, [:dogs, column: "owner_id"]
297
+ end
298
+
299
+ assert_raises ActiveRecord::IrreversibleMigration do
300
+ @recorder.inverse_of :remove_foreign_key, [:dogs, name: "fk"]
301
+ end
302
+ end
303
+ end
304
+ end
305
+ end