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,360 @@
1
+ require 'cases/helper'
2
+ require 'support/ddl_helper'
3
+ require 'support/schema_dumping_helper'
4
+
5
+ if ActiveRecord::Base.connection.supports_foreign_keys?
6
+ module ActiveRecord
7
+ class Migration
8
+ class ForeignKeyTest < ActiveRecord::TestCase
9
+ include DdlHelper
10
+ include SchemaDumpingHelper
11
+
12
+ class Rocket < ActiveRecord::Base
13
+ end
14
+
15
+ class Astronaut < ActiveRecord::Base
16
+ end
17
+
18
+ setup do
19
+ @connection = ActiveRecord::Base.connection
20
+ @connection.create_table "rockets", force: true do |t|
21
+ t.string :name
22
+ end
23
+
24
+ @connection.create_table "astronauts", force: true do |t|
25
+ t.string :name
26
+ t.references :rocket
27
+ end
28
+ end
29
+
30
+
31
+ teardown do
32
+ if defined?(@connection)
33
+ @connection.drop_table "astronauts" if @connection.table_exists? 'astronauts'
34
+ @connection.drop_table "rockets" if @connection.table_exists? 'rockets'
35
+ end
36
+ end
37
+
38
+
39
+ def test_foreign_keys
40
+ foreign_keys = @connection.foreign_keys("fk_test_has_fk")
41
+ assert_equal 1, foreign_keys.size
42
+
43
+ fk = foreign_keys.first
44
+ if current_adapter?(:IBM_DBAdapter)
45
+ assert_equal "fk_test_has_fk".upcase, fk.from_table.upcase
46
+ assert_equal "fk_test_has_pk".upcase, fk.to_table.upcase
47
+ assert_equal "fk_id".upcase, fk.column.upcase
48
+ assert_equal "pk_id".upcase, fk.primary_key.upcase
49
+ assert_equal "fk_name".upcase, fk.name.upcase
50
+ else
51
+ assert_equal "fk_test_has_fk", fk.from_table
52
+ assert_equal "fk_test_has_pk", fk.to_table
53
+ assert_equal "fk_id", fk.column
54
+ assert_equal "pk_id", fk.primary_key
55
+ assert_equal "fk_name", fk.name
56
+ end
57
+ end
58
+
59
+
60
+ def test_add_foreign_key_inferes_column
61
+ @connection.add_foreign_key :astronauts, :rockets
62
+
63
+ foreign_keys = @connection.foreign_keys("astronauts")
64
+ assert_equal 1, foreign_keys.size
65
+
66
+ fk = foreign_keys.first
67
+
68
+ if current_adapter?(:IBM_DBAdapter)
69
+ assert_equal "astronauts".upcase, fk.from_table.upcase
70
+ else
71
+ assert_equal "astronauts", fk.from_table
72
+ end
73
+
74
+ if current_adapter?(:IBM_DBAdapter)
75
+ assert_equal "rockets".upcase, fk.to_table.upcase
76
+ assert_equal "rocket_id".upcase, fk.column.upcase
77
+ assert_equal "id".upcase, fk.primary_key.upcase
78
+ assert_equal("fk_rails_78146ddd2e".upcase, fk.name.upcase)
79
+ else
80
+ assert_equal "rockets", fk.to_table
81
+ assert_equal "rocket_id", fk.column
82
+ assert_equal "id", fk.primary_key
83
+ assert_equal("fk_rails_78146ddd2e", fk.name)
84
+ end
85
+
86
+ end
87
+
88
+
89
+
90
+ def test_add_foreign_key_with_column
91
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id"
92
+
93
+ foreign_keys = @connection.foreign_keys("astronauts")
94
+ assert_equal 1, foreign_keys.size
95
+
96
+ fk = foreign_keys.first
97
+ if current_adapter?(:IBM_DBAdapter)
98
+ assert_equal "astronauts".upcase, fk.from_table.upcase
99
+ assert_equal "rockets".upcase, fk.to_table.upcase
100
+ assert_equal "rocket_id".upcase, fk.column.upcase
101
+ assert_equal "id".upcase, fk.primary_key.upcase
102
+ assert_equal("fk_rails_78146ddd2e".upcase, fk.name.upcase)
103
+ else
104
+ assert_equal "astronauts", fk.from_table
105
+ assert_equal "rockets", fk.to_table
106
+ assert_equal "rocket_id", fk.column
107
+ assert_equal "id", fk.primary_key
108
+ assert_equal("fk_rails_78146ddd2e", fk.name)
109
+ end
110
+
111
+ end
112
+
113
+ def test_add_foreign_key_with_non_standard_primary_key
114
+ if current_adapter?(:IBM_DBAdapter)
115
+ @connection.create_table :space_shuttles, force: true, id: false do |t|
116
+ t.primary_key :pk
117
+ end
118
+ @connection.add_foreign_key(:astronauts, :space_shuttles,
119
+ column: "rocket_id", primary_key: "pk", name: "custom_pk")
120
+ foreign_keys = @connection.foreign_keys("astronauts")
121
+ assert_equal 1, foreign_keys.size
122
+ fk = foreign_keys.first
123
+ assert_equal "astronauts".upcase, fk.from_table.upcase
124
+ assert_equal "space_shuttles".upcase, fk.to_table.upcase
125
+ assert_equal "pk".upcase, fk.primary_key.upcase
126
+ @connection.remove_foreign_key :astronauts, name: "custom_pk"
127
+ else
128
+ with_example_table @connection, "space_shuttles", "pk integer PRIMARY KEY" do
129
+ @connection.add_foreign_key(:astronauts, :space_shuttles,
130
+ column: "rocket_id", primary_key: "pk", name: "custom_pk")
131
+ foreign_keys = @connection.foreign_keys("astronauts")
132
+ assert_equal 1, foreign_keys.size
133
+ fk = foreign_keys.first
134
+ assert_equal "astronauts", fk.from_table
135
+ assert_equal "space_shuttles", fk.to_table
136
+ assert_equal "pk", fk.primary_key
137
+ @connection.remove_foreign_key :astronauts, name: "custom_pk"
138
+ end
139
+ end
140
+ end
141
+
142
+ def test_add_on_delete_restrict_foreign_key
143
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :restrict
144
+
145
+ foreign_keys = @connection.foreign_keys("astronauts")
146
+ assert_equal 1, foreign_keys.size
147
+
148
+ fk = foreign_keys.first
149
+ if current_adapter?(:MysqlAdapter, :Mysql2Adapter)
150
+ # ON DELETE RESTRICT is the default on MySQL
151
+ assert_equal "noaction", fk.on_delete
152
+ elsif current_adapter?(:IBM_DBAdapter)
153
+ assert_equal :noaction, fk.on_delete
154
+ else
155
+ assert_equal :restrict, fk.on_delete
156
+ end
157
+ end
158
+
159
+ def test_add_on_delete_cascade_foreign_key
160
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :cascade
161
+
162
+ foreign_keys = @connection.foreign_keys("astronauts")
163
+ assert_equal 1, foreign_keys.size
164
+
165
+ fk = foreign_keys.first
166
+ if current_adapter?(:IBM_DBAdapter)
167
+ assert_equal :noaction, fk.on_delete
168
+ else
169
+ assert_equal :cascade, fk.on_delete
170
+ end
171
+
172
+ end
173
+
174
+ def test_add_on_delete_nullify_foreign_key
175
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :nullify
176
+
177
+ foreign_keys = @connection.foreign_keys("astronauts")
178
+ assert_equal 1, foreign_keys.size
179
+
180
+ fk = foreign_keys.first
181
+
182
+ if current_adapter?(:IBM_DBAdapter)
183
+ assert_equal :noaction, fk.on_delete
184
+ else
185
+ assert_equal :nullify, fk.on_delete
186
+ end
187
+
188
+ end
189
+
190
+ def test_on_update_and_on_delete_raises_with_invalid_values
191
+ assert_raises ArgumentError do
192
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :invalid
193
+ end
194
+
195
+ assert_raises ArgumentError do
196
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_update: :invalid
197
+ end
198
+ end
199
+
200
+ def test_add_foreign_key_with_on_update
201
+ #@connection.add_foreign_key :astronauts, :rockets, column: "rocket_id" , on_update: :nullify
202
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id"
203
+
204
+ foreign_keys = @connection.foreign_keys("astronauts")
205
+ assert_equal 1, foreign_keys.size
206
+
207
+ fk = foreign_keys.first
208
+ if current_adapter?(:IBM_DBAdapter)
209
+ assert_equal :noaction, fk.on_update
210
+ else
211
+ assert_equal :nullify, fk.on_update
212
+ end
213
+ end
214
+
215
+ def test_remove_foreign_key_inferes_column
216
+ @connection.add_foreign_key :astronauts, :rockets
217
+
218
+ assert_equal 1, @connection.foreign_keys("astronauts").size
219
+ @connection.remove_foreign_key :astronauts, :rockets
220
+ assert_equal [], @connection.foreign_keys("astronauts")
221
+ end
222
+
223
+ def test_remove_foreign_key_by_column
224
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id"
225
+
226
+ assert_equal 1, @connection.foreign_keys("astronauts").size
227
+ @connection.remove_foreign_key :astronauts, column: "rocket_id"
228
+ assert_equal [], @connection.foreign_keys("astronauts")
229
+ end
230
+
231
+ def test_remove_foreign_key_by_symbol_column
232
+ @connection.add_foreign_key :astronauts, :rockets, column: :rocket_id
233
+
234
+ if current_adapter?(:IBM_DBAdapter)
235
+ foreign_keys = @connection.foreign_keys("astronauts")
236
+ assert_equal 1, foreign_keys.size
237
+ @connection.remove_foreign_key "astronauts".upcase, column: "rocket_id".upcase
238
+ else
239
+ assert_equal 1, @connection.foreign_keys("astronauts").size
240
+ @connection.remove_foreign_key :astronauts, column: :rocket_id
241
+ end
242
+
243
+ assert_equal [], @connection.foreign_keys("astronauts")
244
+ end
245
+
246
+ def test_remove_foreign_key_by_name
247
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", name: "fancy_named_fk"
248
+
249
+ assert_equal 1, @connection.foreign_keys("astronauts").size
250
+ @connection.remove_foreign_key :astronauts, name: "fancy_named_fk"
251
+ assert_equal [], @connection.foreign_keys("astronauts")
252
+ end
253
+
254
+ def test_remove_foreign_non_existing_foreign_key_raises
255
+ assert_raises ArgumentError do
256
+ @connection.remove_foreign_key :astronauts, :rockets
257
+ end
258
+ end
259
+
260
+ def test_schema_dumping
261
+ @connection.add_foreign_key :astronauts, :rockets
262
+ output = dump_table_schema "astronauts"
263
+ assert_match %r{\s+add_foreign_key "astronauts", "rockets"$}, output
264
+ end
265
+
266
+ def test_schema_dumping_with_options
267
+ output = dump_table_schema "fk_test_has_fk"
268
+ assert_match %r{\s+add_foreign_key "fk_test_has_fk", "fk_test_has_pk", column: "fk_id", primary_key: "pk_id", name: "fk_name"$}, output
269
+ end
270
+
271
+ def test_schema_dumping_on_delete_and_on_update_options
272
+ if current_adapter?(:IBM_DBAdapter)
273
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :nullify, on_update: :restrict
274
+ else
275
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :nullify, on_update: :cascade
276
+ end
277
+
278
+ output = dump_table_schema "astronauts"
279
+ assert_match %r{\s+add_foreign_key "astronauts",.+on_update: :restrict,.+on_delete: :nullify$}, output
280
+ end
281
+
282
+ class CreateCitiesAndHousesMigration < ActiveRecord::Migration
283
+ def change
284
+ create_table("cities") { |t| }
285
+
286
+ create_table("houses") do |t|
287
+ t.column :city_id, :integer
288
+ end
289
+ add_foreign_key :houses, :cities, column: "city_id"
290
+ end
291
+ end
292
+
293
+ def test_add_foreign_key_is_reversible
294
+ migration = CreateCitiesAndHousesMigration.new
295
+ silence_stream($stdout) { migration.migrate(:up) }
296
+ assert_equal 1, @connection.foreign_keys("houses").size
297
+ ensure
298
+ silence_stream($stdout) { migration.migrate(:down) }
299
+ end
300
+
301
+ class CreateSchoolsAndClassesMigration < ActiveRecord::Migration
302
+ def change
303
+ create_table(:schools)
304
+
305
+ create_table(:classes) do |t|
306
+ t.column :school_id, :integer
307
+ end
308
+ add_foreign_key :classes, :schools
309
+ end
310
+ end
311
+
312
+ def test_add_foreign_key_with_prefix
313
+ ActiveRecord::Base.table_name_prefix = 'p_'
314
+ migration = CreateSchoolsAndClassesMigration.new
315
+ silence_stream($stdout) { migration.migrate(:up) }
316
+ assert_equal 1, @connection.foreign_keys("p_classes").size
317
+ ensure
318
+ silence_stream($stdout) { migration.migrate(:down) }
319
+ ActiveRecord::Base.table_name_prefix = nil
320
+ end
321
+
322
+ def test_add_foreign_key_with_suffix
323
+ ActiveRecord::Base.table_name_suffix = '_s'
324
+ migration = CreateSchoolsAndClassesMigration.new
325
+ silence_stream($stdout) { migration.migrate(:up) }
326
+ assert_equal 1, @connection.foreign_keys("classes_s").size
327
+ ensure
328
+ silence_stream($stdout) { migration.migrate(:down) }
329
+ ActiveRecord::Base.table_name_suffix = nil
330
+ end
331
+
332
+
333
+ end
334
+ end
335
+ end
336
+ else
337
+ module ActiveRecord
338
+ class Migration
339
+ class NoForeignKeySupportTest < ActiveRecord::TestCase
340
+ setup do
341
+ @connection = ActiveRecord::Base.connection
342
+ end
343
+
344
+ def test_add_foreign_key_should_be_noop
345
+ @connection.add_foreign_key :clubs, :categories
346
+ end
347
+
348
+ def test_remove_foreign_key_should_be_noop
349
+ @connection.remove_foreign_key :clubs, :categories
350
+ end
351
+
352
+ def test_foreign_keys_should_raise_not_implemented
353
+ assert_raises NotImplementedError do
354
+ @connection.foreign_keys("clubs")
355
+ end
356
+ end
357
+ end
358
+ end
359
+ end
360
+ end
@@ -0,0 +1,39 @@
1
+ require "cases/helper"
2
+
3
+ module ActiveRecord
4
+ class Migration
5
+ class << self; attr_accessor :message_count; end
6
+ self.message_count = 0
7
+
8
+ module TestHelper
9
+ attr_reader :connection, :table_name
10
+
11
+ CONNECTION_METHODS = %w[add_column remove_column rename_column add_index change_column rename_table column_exists? index_exists? add_reference add_belongs_to remove_reference remove_references remove_belongs_to]
12
+
13
+ class TestModel < ActiveRecord::Base
14
+ self.table_name = :test_models
15
+ end
16
+
17
+ def setup
18
+ super
19
+ @connection = ActiveRecord::Base.connection
20
+ connection.create_table :test_models do |t|
21
+ t.timestamps null: true
22
+ end
23
+
24
+ TestModel.reset_column_information
25
+ end
26
+
27
+ def teardown
28
+ super
29
+ TestModel.reset_table_name
30
+ TestModel.reset_sequence_name
31
+ connection.drop_table :test_models rescue nil
32
+ end
33
+
34
+ private
35
+
36
+ delegate(*CONNECTION_METHODS, to: :connection)
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,216 @@
1
+ require 'cases/helper'
2
+
3
+ module ActiveRecord
4
+ class Migration
5
+ class IndexTest < ActiveRecord::TestCase
6
+ attr_reader :connection, :table_name
7
+
8
+ def setup
9
+ super
10
+ @connection = ActiveRecord::Base.connection
11
+ @table_name = :testings
12
+
13
+ if current_adapter?(:IBM_DBAdapter)
14
+ connection.drop_table :testings rescue nil
15
+ end
16
+
17
+ connection.create_table table_name do |t|
18
+ t.column :foo, :string, :limit => 100
19
+ t.column :bar, :string, :limit => 100
20
+
21
+ t.string :first_name
22
+ t.string :last_name, :limit => 100
23
+ t.string :key, :limit => 100
24
+ t.boolean :administrator
25
+ end
26
+ end
27
+
28
+ teardown do
29
+ connection.drop_table :testings rescue nil
30
+ ActiveRecord::Base.primary_key_prefix_type = nil
31
+ end
32
+
33
+ def test_rename_index
34
+ # keep the names short to make Oracle and similar behave
35
+ connection.add_index(table_name, [:foo], :name => 'old_idx')
36
+ connection.rename_index(table_name, 'old_idx', 'new_idx')
37
+
38
+ # if the adapter doesn't support the indexes call, pick defaults that let the test pass
39
+ assert_not connection.index_name_exists?(table_name, 'old_idx', false)
40
+ assert connection.index_name_exists?(table_name, 'new_idx', true)
41
+ end
42
+
43
+ def test_rename_index_too_long
44
+ too_long_index_name = good_index_name + 'x'
45
+ # keep the names short to make Oracle and similar behave
46
+ connection.add_index(table_name, [:foo], :name => 'old_idx')
47
+ e = assert_raises(ArgumentError) {
48
+ connection.rename_index(table_name, 'old_idx', too_long_index_name)
49
+ }
50
+ assert_match(/too long; the limit is #{connection.allowed_index_name_length} characters/, e.message)
51
+
52
+ # if the adapter doesn't support the indexes call, pick defaults that let the test pass
53
+ assert connection.index_name_exists?(table_name, 'old_idx', false)
54
+ end
55
+
56
+
57
+ def test_double_add_index
58
+ connection.add_index(table_name, [:foo], :name => 'some_idx')
59
+ assert_raises(ArgumentError) {
60
+ connection.add_index(table_name, [:foo], :name => 'some_idx')
61
+ }
62
+ end
63
+
64
+ def test_remove_nonexistent_index
65
+ if current_adapter?(:IBM_DBAdapter)
66
+ assert_raise(ArgumentError) { connection.remove_index(table_name, "no_such_index") }
67
+ else
68
+ assert_raise(ArgumentError) { connection.remove_index(table_name, "no_such_index") }
69
+ end
70
+ end
71
+
72
+ def test_add_index_works_with_long_index_names
73
+ connection.add_index(table_name, "foo", name: good_index_name)
74
+
75
+ assert connection.index_name_exists?(table_name, good_index_name, false)
76
+ connection.remove_index(table_name, name: good_index_name)
77
+ end
78
+
79
+ def test_add_index_does_not_accept_too_long_index_names
80
+ too_long_index_name = good_index_name + 'x'
81
+
82
+ e = assert_raises(ArgumentError) {
83
+ connection.add_index(table_name, "foo", name: too_long_index_name)
84
+ }
85
+ assert_match(/too long; the limit is #{connection.allowed_index_name_length} characters/, e.message)
86
+
87
+ assert_not connection.index_name_exists?(table_name, too_long_index_name, false)
88
+ connection.add_index(table_name, "foo", :name => good_index_name)
89
+ end
90
+
91
+ def test_internal_index_with_name_matching_database_limit
92
+ good_index_name = 'x' * connection.index_name_length
93
+ connection.add_index(table_name, "foo", name: good_index_name, internal: true)
94
+
95
+ assert connection.index_name_exists?(table_name, good_index_name, false)
96
+ connection.remove_index(table_name, name: good_index_name)
97
+ end
98
+
99
+ def test_index_symbol_names
100
+ connection.add_index table_name, :foo, :name => :symbol_index_name
101
+ assert connection.index_exists?(table_name, :foo, :name => :symbol_index_name)
102
+
103
+ connection.remove_index table_name, :name => :symbol_index_name
104
+ assert_not connection.index_exists?(table_name, :foo, :name => :symbol_index_name)
105
+ end
106
+
107
+ def test_index_exists
108
+ connection.add_index :testings, :foo
109
+
110
+ assert connection.index_exists?(:testings, :foo)
111
+ assert !connection.index_exists?(:testings, :bar)
112
+ end
113
+
114
+ def test_index_exists_on_multiple_columns
115
+ connection.add_index :testings, [:foo, :bar]
116
+
117
+ assert connection.index_exists?(:testings, [:foo, :bar])
118
+ end
119
+
120
+ def test_index_exists_with_custom_name_checks_columns
121
+ connection.add_index :testings, [:foo, :bar], name: "my_index"
122
+ assert connection.index_exists?(:testings, [:foo, :bar], name: "my_index")
123
+ assert_not connection.index_exists?(:testings, [:foo], name: "my_index")
124
+ end
125
+
126
+ def test_valid_index_options
127
+ assert_raise ArgumentError do
128
+ connection.add_index :testings, :foo, unqiue: true
129
+ end
130
+ end
131
+
132
+ def test_unique_index_exists
133
+ connection.add_index :testings, :foo, :unique => true
134
+
135
+ assert connection.index_exists?(:testings, :foo, :unique => true)
136
+ end
137
+
138
+ def test_named_index_exists
139
+ connection.add_index :testings, :foo, :name => "custom_index_name"
140
+
141
+ assert connection.index_exists?(:testings, :foo, :name => "custom_index_name")
142
+ end
143
+
144
+ def test_add_index_attribute_length_limit
145
+ connection.add_index :testings, [:foo, :bar], :length => {:foo => 10, :bar => nil}
146
+
147
+ assert connection.index_exists?(:testings, [:foo, :bar])
148
+ end
149
+
150
+ def test_add_index
151
+ connection.add_index("testings", "last_name")
152
+ connection.remove_index("testings", "last_name")
153
+
154
+ connection.add_index("testings", ["last_name", "first_name"])
155
+ connection.remove_index("testings", :column => ["last_name", "first_name"])
156
+
157
+ # Oracle adapter cannot have specified index name larger than 30 characters
158
+ # Oracle adapter is shortening index name when just column list is given
159
+ unless current_adapter?(:OracleAdapter)
160
+ connection.add_index("testings", ["last_name", "first_name"])
161
+ connection.remove_index("testings", :name => :index_testings_on_last_name_and_first_name)
162
+ connection.add_index("testings", ["last_name", "first_name"])
163
+ connection.remove_index("testings", "last_name_and_first_name")
164
+ end
165
+ connection.add_index("testings", ["last_name", "first_name"])
166
+ connection.remove_index("testings", ["last_name", "first_name"])
167
+
168
+ connection.add_index("testings", ["last_name"], :length => 10)
169
+ connection.remove_index("testings", "last_name")
170
+
171
+ connection.add_index("testings", ["last_name"], :length => {:last_name => 10})
172
+ connection.remove_index("testings", ["last_name"])
173
+
174
+ connection.add_index("testings", ["last_name", "first_name"], :length => 10)
175
+ connection.remove_index("testings", ["last_name", "first_name"])
176
+
177
+ connection.add_index("testings", ["last_name", "first_name"], :length => {:last_name => 10, :first_name => 20})
178
+ connection.remove_index("testings", ["last_name", "first_name"])
179
+
180
+ connection.add_index("testings", ["key"], :name => "key_idx", :unique => true)
181
+ connection.remove_index("testings", :name => "key_idx", :unique => true)
182
+
183
+ connection.add_index("testings", %w(last_name first_name administrator), :name => "named_admin")
184
+ connection.remove_index("testings", :name => "named_admin")
185
+
186
+ # Selected adapters support index sort order
187
+ if current_adapter?(:SQLite3Adapter, :MysqlAdapter, :Mysql2Adapter, :PostgreSQLAdapter)
188
+ connection.add_index("testings", ["last_name"], :order => {:last_name => :desc})
189
+ connection.remove_index("testings", ["last_name"])
190
+ connection.add_index("testings", ["last_name", "first_name"], :order => {:last_name => :desc})
191
+ connection.remove_index("testings", ["last_name", "first_name"])
192
+ connection.add_index("testings", ["last_name", "first_name"], :order => {:last_name => :desc, :first_name => :asc})
193
+ connection.remove_index("testings", ["last_name", "first_name"])
194
+ connection.add_index("testings", ["last_name", "first_name"], :order => :desc)
195
+ connection.remove_index("testings", ["last_name", "first_name"])
196
+ end
197
+ end
198
+
199
+ if current_adapter?(:PostgreSQLAdapter)
200
+ def test_add_partial_index
201
+ connection.add_index("testings", "last_name", :where => "first_name = 'john doe'")
202
+ assert connection.index_exists?("testings", "last_name")
203
+
204
+ connection.remove_index("testings", "last_name")
205
+ assert !connection.index_exists?("testings", "last_name")
206
+ end
207
+ end
208
+
209
+ private
210
+ def good_index_name
211
+ 'x' * connection.allowed_index_name_length
212
+ end
213
+
214
+ end
215
+ end
216
+ end