ibm_db 3.0.5-x86-mingw32 → 4.0.0-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 (586) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -0
  3. data/LICENSE +1 -1
  4. data/MANIFEST +14 -14
  5. data/ParameterizedQueries README +6 -6
  6. data/README +208 -225
  7. data/ext/Makefile.nt32 +181 -181
  8. data/ext/Makefile.nt32.191 +212 -212
  9. data/ext/extconf.rb +291 -291
  10. data/ext/ibm_db.c +11887 -11887
  11. data/ext/ruby_ibm_db.h +241 -241
  12. data/ext/ruby_ibm_db_cli.c +866 -866
  13. data/ext/ruby_ibm_db_cli.h +500 -500
  14. data/init.rb +41 -41
  15. data/lib/IBM_DB.rb +27 -27
  16. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3452 -3177
  17. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -2
  18. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  19. data/lib/mswin32/ibm_db.rb +91 -123
  20. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  21. data/test/active_record/connection_adapters/fake_adapter.rb +49 -46
  22. data/test/assets/example.log +1 -1
  23. data/test/assets/test.txt +1 -1
  24. data/test/cases/adapter_test.rb +351 -276
  25. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
  26. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
  27. data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
  28. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
  29. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
  30. data/test/cases/adapters/mysql2/connection_test.rb +210 -0
  31. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
  32. data/test/cases/adapters/mysql2/enum_test.rb +26 -0
  33. data/test/cases/adapters/mysql2/explain_test.rb +21 -0
  34. data/test/cases/adapters/mysql2/json_test.rb +195 -0
  35. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
  36. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  37. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
  38. data/test/cases/adapters/mysql2/schema_test.rb +126 -0
  39. data/test/cases/adapters/mysql2/sp_test.rb +36 -0
  40. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
  41. data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
  42. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
  43. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
  44. data/test/cases/adapters/postgresql/array_test.rb +339 -0
  45. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
  46. data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
  47. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
  48. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
  49. data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
  50. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  51. data/test/cases/adapters/postgresql/collation_test.rb +53 -0
  52. data/test/cases/adapters/postgresql/composite_test.rb +132 -0
  53. data/test/cases/adapters/postgresql/connection_test.rb +257 -0
  54. data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
  55. data/test/cases/adapters/postgresql/domain_test.rb +47 -0
  56. data/test/cases/adapters/postgresql/enum_test.rb +91 -0
  57. data/test/cases/adapters/postgresql/explain_test.rb +20 -0
  58. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
  59. data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
  60. data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
  61. data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
  62. data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
  63. data/test/cases/adapters/postgresql/integer_test.rb +25 -0
  64. data/test/cases/adapters/postgresql/json_test.rb +237 -0
  65. data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
  66. data/test/cases/adapters/postgresql/money_test.rb +96 -0
  67. data/test/cases/adapters/postgresql/network_test.rb +94 -0
  68. data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
  69. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
  70. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  71. data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
  72. data/test/cases/adapters/postgresql/range_test.rb +343 -0
  73. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
  74. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
  75. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
  76. data/test/cases/adapters/postgresql/schema_test.rb +597 -0
  77. data/test/cases/adapters/postgresql/serial_test.rb +154 -0
  78. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
  79. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
  80. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
  81. data/test/cases/adapters/postgresql/utils_test.rb +62 -0
  82. data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
  83. data/test/cases/adapters/postgresql/xml_test.rb +54 -0
  84. data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
  85. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
  86. data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
  87. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
  88. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
  89. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  90. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
  91. data/test/cases/aggregations_test.rb +168 -158
  92. data/test/cases/ar_schema_test.rb +146 -161
  93. data/test/cases/associations/association_scope_test.rb +16 -21
  94. data/test/cases/associations/belongs_to_associations_test.rb +1141 -1029
  95. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
  96. data/test/cases/associations/callbacks_test.rb +190 -192
  97. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  98. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  99. data/test/cases/associations/eager_load_nested_include_test.rb +126 -128
  100. data/test/cases/associations/eager_singularization_test.rb +148 -148
  101. data/test/cases/associations/eager_test.rb +1514 -1429
  102. data/test/cases/associations/extension_test.rb +87 -82
  103. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -972
  104. data/test/cases/associations/has_many_associations_test.rb +2501 -2182
  105. data/test/cases/associations/has_many_through_associations_test.rb +1271 -1204
  106. data/test/cases/associations/has_one_associations_test.rb +707 -610
  107. data/test/cases/associations/has_one_through_associations_test.rb +383 -380
  108. data/test/cases/associations/inner_join_association_test.rb +139 -139
  109. data/test/cases/associations/inverse_associations_test.rb +733 -706
  110. data/test/cases/associations/join_model_test.rb +777 -754
  111. data/test/cases/associations/left_outer_join_association_test.rb +88 -0
  112. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  113. data/test/cases/associations/required_test.rb +102 -82
  114. data/test/cases/associations_test.rb +385 -380
  115. data/test/cases/attribute_decorators_test.rb +125 -125
  116. data/test/cases/attribute_methods/read_test.rb +60 -60
  117. data/test/cases/attribute_methods_test.rb +1009 -952
  118. data/test/cases/attribute_set_test.rb +270 -210
  119. data/test/cases/attribute_test.rb +246 -180
  120. data/test/cases/attributes_test.rb +253 -136
  121. data/test/cases/autosave_association_test.rb +1708 -1595
  122. data/test/cases/base_test.rb +1713 -1664
  123. data/test/cases/batches_test.rb +489 -212
  124. data/test/cases/binary_test.rb +44 -52
  125. data/test/cases/bind_parameter_test.rb +110 -100
  126. data/test/cases/cache_key_test.rb +25 -0
  127. data/test/cases/calculations_test.rb +798 -646
  128. data/test/cases/callbacks_test.rb +636 -543
  129. data/test/cases/clone_test.rb +40 -40
  130. data/test/cases/coders/json_test.rb +15 -0
  131. data/test/cases/coders/yaml_column_test.rb +63 -63
  132. data/test/cases/collection_cache_key_test.rb +115 -0
  133. data/test/cases/column_alias_test.rb +17 -17
  134. data/test/cases/column_definition_test.rb +92 -123
  135. data/test/cases/comment_test.rb +143 -0
  136. data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -54
  137. data/test/cases/connection_adapters/connection_handler_test.rb +160 -53
  138. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  139. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -293
  140. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -65
  141. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  142. data/test/cases/connection_adapters/schema_cache_test.rb +61 -56
  143. data/test/cases/connection_adapters/type_lookup_test.rb +118 -110
  144. data/test/cases/connection_management_test.rb +112 -122
  145. data/test/cases/connection_pool_test.rb +521 -346
  146. data/test/cases/connection_specification/resolver_test.rb +131 -116
  147. data/test/cases/core_test.rb +112 -112
  148. data/test/cases/counter_cache_test.rb +214 -209
  149. data/test/cases/custom_locking_test.rb +17 -17
  150. data/test/cases/database_statements_test.rb +34 -19
  151. data/test/cases/{invalid_date_test.rb → date_test.rb} +44 -32
  152. data/test/cases/date_time_precision_test.rb +106 -0
  153. data/test/cases/date_time_test.rb +61 -61
  154. data/test/cases/defaults_test.rb +218 -223
  155. data/test/cases/dirty_test.rb +763 -785
  156. data/test/cases/disconnected_test.rb +30 -28
  157. data/test/cases/dup_test.rb +157 -157
  158. data/test/cases/enum_test.rb +444 -290
  159. data/test/cases/errors_test.rb +16 -0
  160. data/test/cases/explain_subscriber_test.rb +64 -64
  161. data/test/cases/explain_test.rb +87 -76
  162. data/test/cases/finder_respond_to_test.rb +60 -60
  163. data/test/cases/finder_test.rb +1294 -1169
  164. data/test/cases/fixture_set/file_test.rb +156 -138
  165. data/test/cases/fixtures_test.rb +988 -908
  166. data/test/cases/forbidden_attributes_protection_test.rb +165 -99
  167. data/test/cases/habtm_destroy_order_test.rb +61 -61
  168. data/test/cases/helper.rb +204 -210
  169. data/test/cases/hot_compatibility_test.rb +142 -54
  170. data/test/cases/i18n_test.rb +45 -45
  171. data/test/cases/inheritance_test.rb +606 -375
  172. data/test/cases/integration_test.rb +155 -139
  173. data/test/cases/invalid_connection_test.rb +24 -22
  174. data/test/cases/invertible_migration_test.rb +387 -295
  175. data/test/cases/json_serialization_test.rb +311 -302
  176. data/test/cases/locking_test.rb +493 -477
  177. data/test/cases/log_subscriber_test.rb +225 -136
  178. data/test/cases/migration/change_schema_test.rb +458 -512
  179. data/test/cases/migration/change_table_test.rb +256 -224
  180. data/test/cases/migration/column_attributes_test.rb +176 -192
  181. data/test/cases/migration/column_positioning_test.rb +56 -56
  182. data/test/cases/migration/columns_test.rb +310 -304
  183. data/test/cases/migration/command_recorder_test.rb +350 -305
  184. data/test/cases/migration/compatibility_test.rb +118 -0
  185. data/test/cases/migration/create_join_table_test.rb +157 -148
  186. data/test/cases/migration/foreign_key_test.rb +360 -328
  187. data/test/cases/migration/helper.rb +39 -39
  188. data/test/cases/migration/index_test.rb +218 -216
  189. data/test/cases/migration/logger_test.rb +36 -36
  190. data/test/cases/migration/pending_migrations_test.rb +52 -53
  191. data/test/cases/migration/references_foreign_key_test.rb +216 -169
  192. data/test/cases/migration/references_index_test.rb +101 -101
  193. data/test/cases/migration/references_statements_test.rb +136 -116
  194. data/test/cases/migration/rename_table_test.rb +93 -93
  195. data/test/cases/migration_test.rb +1157 -959
  196. data/test/cases/migrator_test.rb +470 -388
  197. data/test/cases/mixin_test.rb +68 -70
  198. data/test/cases/modules_test.rb +172 -173
  199. data/test/cases/multiparameter_attributes_test.rb +372 -350
  200. data/test/cases/multiple_db_test.rb +122 -115
  201. data/test/cases/nested_attributes_test.rb +1098 -1070
  202. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  203. data/test/cases/persistence_test.rb +1001 -909
  204. data/test/cases/pooled_connections_test.rb +81 -81
  205. data/test/cases/primary_keys_test.rb +376 -237
  206. data/test/cases/query_cache_test.rb +446 -326
  207. data/test/cases/quoting_test.rb +202 -156
  208. data/test/cases/readonly_test.rb +119 -118
  209. data/test/cases/reaper_test.rb +85 -85
  210. data/test/cases/reflection_test.rb +509 -463
  211. data/test/cases/relation/delegation_test.rb +63 -68
  212. data/test/cases/relation/merging_test.rb +157 -161
  213. data/test/cases/relation/mutation_test.rb +183 -165
  214. data/test/cases/relation/or_test.rb +92 -0
  215. data/test/cases/relation/predicate_builder_test.rb +16 -14
  216. data/test/cases/relation/record_fetch_warning_test.rb +40 -0
  217. data/test/cases/relation/where_chain_test.rb +105 -181
  218. data/test/cases/relation/where_clause_test.rb +182 -0
  219. data/test/cases/relation/where_test.rb +322 -300
  220. data/test/cases/relation_test.rb +328 -319
  221. data/test/cases/relations_test.rb +2026 -1815
  222. data/test/cases/reload_models_test.rb +22 -22
  223. data/test/cases/result_test.rb +90 -80
  224. data/test/cases/sanitize_test.rb +176 -83
  225. data/test/cases/schema_dumper_test.rb +457 -463
  226. data/test/cases/schema_loading_test.rb +52 -0
  227. data/test/cases/scoping/default_scoping_test.rb +528 -454
  228. data/test/cases/scoping/named_scoping_test.rb +561 -524
  229. data/test/cases/scoping/relation_scoping_test.rb +400 -357
  230. data/test/cases/secure_token_test.rb +32 -0
  231. data/test/cases/serialization_test.rb +104 -104
  232. data/test/cases/serialized_attribute_test.rb +364 -277
  233. data/test/cases/statement_cache_test.rb +136 -98
  234. data/test/cases/store_test.rb +195 -194
  235. data/test/cases/suppressor_test.rb +63 -0
  236. data/test/cases/tasks/database_tasks_test.rb +462 -398
  237. data/test/cases/tasks/mysql_rake_test.rb +345 -324
  238. data/test/cases/tasks/postgresql_rake_test.rb +304 -250
  239. data/test/cases/tasks/sqlite_rake_test.rb +220 -193
  240. data/test/cases/test_case.rb +131 -123
  241. data/test/cases/test_fixtures_test.rb +36 -0
  242. data/test/cases/time_precision_test.rb +102 -0
  243. data/test/cases/timestamp_test.rb +501 -467
  244. data/test/cases/touch_later_test.rb +121 -0
  245. data/test/cases/transaction_callbacks_test.rb +518 -452
  246. data/test/cases/transaction_isolation_test.rb +106 -106
  247. data/test/cases/transactions_test.rb +834 -817
  248. data/test/cases/type/adapter_specific_registry_test.rb +133 -0
  249. data/test/cases/type/date_time_test.rb +14 -0
  250. data/test/cases/type/integer_test.rb +27 -121
  251. data/test/cases/type/string_test.rb +22 -36
  252. data/test/cases/type/type_map_test.rb +177 -177
  253. data/test/cases/type_test.rb +39 -0
  254. data/test/cases/types_test.rb +24 -141
  255. data/test/cases/unconnected_test.rb +33 -33
  256. data/test/cases/validations/absence_validation_test.rb +73 -0
  257. data/test/cases/validations/association_validation_test.rb +97 -86
  258. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  259. data/test/cases/validations/i18n_validation_test.rb +86 -90
  260. data/test/cases/validations/length_validation_test.rb +79 -47
  261. data/test/cases/validations/presence_validation_test.rb +103 -68
  262. data/test/cases/validations/uniqueness_validation_test.rb +548 -457
  263. data/test/cases/validations_repair_helper.rb +19 -23
  264. data/test/cases/validations_test.rb +194 -165
  265. data/test/cases/view_test.rb +216 -119
  266. data/test/cases/yaml_serialization_test.rb +121 -126
  267. data/test/config.example.yml +97 -0
  268. data/test/config.rb +5 -5
  269. data/test/fixtures/accounts.yml +29 -29
  270. data/test/fixtures/admin/accounts.yml +2 -2
  271. data/test/fixtures/admin/users.yml +10 -10
  272. data/test/fixtures/author_addresses.original +11 -0
  273. data/test/fixtures/author_addresses.yml +17 -17
  274. data/test/fixtures/author_favorites.yml +3 -3
  275. data/test/fixtures/authors.original +17 -0
  276. data/test/fixtures/authors.yml +23 -23
  277. data/test/fixtures/bad_posts.yml +9 -0
  278. data/test/fixtures/binaries.yml +133 -133
  279. data/test/fixtures/books.yml +31 -11
  280. data/test/fixtures/bulbs.yml +5 -5
  281. data/test/fixtures/cars.yml +9 -9
  282. data/test/fixtures/categories.yml +19 -19
  283. data/test/fixtures/categories/special_categories.yml +9 -9
  284. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  285. data/test/fixtures/categories_ordered.yml +7 -7
  286. data/test/fixtures/categories_posts.yml +31 -31
  287. data/test/fixtures/categorizations.yml +23 -23
  288. data/test/fixtures/clubs.yml +8 -8
  289. data/test/fixtures/collections.yml +3 -3
  290. data/test/fixtures/colleges.yml +3 -3
  291. data/test/fixtures/comments.yml +65 -65
  292. data/test/fixtures/companies.yml +67 -67
  293. data/test/fixtures/computers.yml +10 -10
  294. data/test/fixtures/content.yml +3 -0
  295. data/test/fixtures/content_positions.yml +3 -0
  296. data/test/fixtures/courses.yml +8 -8
  297. data/test/fixtures/customers.yml +25 -25
  298. data/test/fixtures/dashboards.yml +6 -6
  299. data/test/fixtures/dead_parrots.yml +5 -0
  300. data/test/fixtures/developers.yml +22 -22
  301. data/test/fixtures/developers_projects.yml +16 -16
  302. data/test/fixtures/dog_lovers.yml +7 -7
  303. data/test/fixtures/dogs.yml +4 -4
  304. data/test/fixtures/doubloons.yml +3 -3
  305. data/test/fixtures/edges.yml +5 -5
  306. data/test/fixtures/entrants.yml +14 -14
  307. data/test/fixtures/essays.yml +6 -6
  308. data/test/fixtures/faces.yml +11 -11
  309. data/test/fixtures/fk_test_has_fk.yml +3 -3
  310. data/test/fixtures/fk_test_has_pk.yml +1 -1
  311. data/test/fixtures/friendships.yml +4 -4
  312. data/test/fixtures/funny_jokes.yml +10 -10
  313. data/test/fixtures/interests.yml +33 -33
  314. data/test/fixtures/items.yml +3 -3
  315. data/test/fixtures/jobs.yml +7 -7
  316. data/test/fixtures/legacy_things.yml +3 -3
  317. data/test/fixtures/live_parrots.yml +4 -0
  318. data/test/fixtures/mateys.yml +4 -4
  319. data/test/fixtures/member_details.yml +8 -8
  320. data/test/fixtures/member_types.yml +6 -6
  321. data/test/fixtures/members.yml +11 -11
  322. data/test/fixtures/memberships.yml +34 -34
  323. data/test/fixtures/men.yml +5 -5
  324. data/test/fixtures/minimalistics.yml +2 -2
  325. data/test/fixtures/minivans.yml +5 -5
  326. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  327. data/test/fixtures/mixins.yml +29 -29
  328. data/test/fixtures/movies.yml +7 -7
  329. data/test/fixtures/naked/yml/accounts.yml +1 -1
  330. data/test/fixtures/naked/yml/companies.yml +1 -1
  331. data/test/fixtures/naked/yml/courses.yml +1 -1
  332. data/test/fixtures/naked/yml/parrots.yml +2 -0
  333. data/test/fixtures/naked/yml/trees.yml +3 -0
  334. data/test/fixtures/nodes.yml +29 -0
  335. data/test/fixtures/organizations.yml +5 -5
  336. data/test/fixtures/other_comments.yml +6 -0
  337. data/test/fixtures/other_dogs.yml +2 -0
  338. data/test/fixtures/other_posts.yml +7 -0
  339. data/test/fixtures/other_topics.yml +42 -42
  340. data/test/fixtures/owners.yml +9 -9
  341. data/test/fixtures/parrots.yml +27 -27
  342. data/test/fixtures/parrots_pirates.yml +7 -7
  343. data/test/fixtures/people.yml +24 -24
  344. data/test/fixtures/peoples_treasures.yml +3 -3
  345. data/test/fixtures/pets.yml +19 -19
  346. data/test/fixtures/pirates.yml +15 -12
  347. data/test/fixtures/posts.yml +80 -80
  348. data/test/fixtures/price_estimates.yml +16 -7
  349. data/test/fixtures/products.yml +4 -4
  350. data/test/fixtures/projects.yml +7 -7
  351. data/test/fixtures/ratings.yml +14 -14
  352. data/test/fixtures/readers.yml +11 -11
  353. data/test/fixtures/references.yml +17 -17
  354. data/test/fixtures/reserved_words/distinct.yml +5 -5
  355. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  356. data/test/fixtures/reserved_words/group.yml +14 -14
  357. data/test/fixtures/reserved_words/select.yml +8 -8
  358. data/test/fixtures/reserved_words/values.yml +7 -7
  359. data/test/fixtures/ships.yml +6 -6
  360. data/test/fixtures/speedometers.yml +8 -8
  361. data/test/fixtures/sponsors.yml +12 -12
  362. data/test/fixtures/string_key_objects.yml +7 -7
  363. data/test/fixtures/subscribers.yml +10 -10
  364. data/test/fixtures/subscriptions.yml +12 -12
  365. data/test/fixtures/taggings.yml +78 -78
  366. data/test/fixtures/tags.yml +11 -11
  367. data/test/fixtures/tasks.yml +7 -7
  368. data/test/fixtures/teapots.yml +3 -3
  369. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  370. data/test/fixtures/to_be_linked/users.yml +10 -10
  371. data/test/fixtures/topics.yml +49 -49
  372. data/test/fixtures/toys.yml +14 -14
  373. data/test/fixtures/traffic_lights.yml +9 -9
  374. data/test/fixtures/treasures.yml +10 -10
  375. data/test/fixtures/trees.yml +3 -0
  376. data/test/fixtures/uuid_children.yml +3 -3
  377. data/test/fixtures/uuid_parents.yml +2 -2
  378. data/test/fixtures/variants.yml +4 -4
  379. data/test/fixtures/vegetables.yml +19 -19
  380. data/test/fixtures/vertices.yml +3 -3
  381. data/test/fixtures/warehouse_things.yml +2 -2
  382. data/test/fixtures/zines.yml +5 -5
  383. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  384. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  385. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  386. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -9
  387. data/test/migrations/missing/1_people_have_last_names.rb +9 -9
  388. data/test/migrations/missing/3_we_need_reminders.rb +12 -12
  389. data/test/migrations/missing/4_innocent_jointable.rb +12 -12
  390. data/test/migrations/rename/1_we_need_things.rb +11 -11
  391. data/test/migrations/rename/2_rename_things.rb +9 -9
  392. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  393. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  394. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  395. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  396. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  397. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  398. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  399. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  400. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  401. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  402. data/test/migrations/valid/2_we_need_reminders.rb +12 -12
  403. data/test/migrations/valid/3_innocent_jointable.rb +12 -12
  404. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  405. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -12
  406. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -12
  407. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  408. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  409. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  410. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  411. data/test/models/admin.rb +5 -5
  412. data/test/models/admin/account.rb +3 -3
  413. data/test/models/admin/randomly_named_c1.rb +6 -2
  414. data/test/models/admin/user.rb +40 -40
  415. data/test/models/aircraft.rb +5 -4
  416. data/test/models/arunit2_model.rb +3 -3
  417. data/test/models/author.rb +209 -212
  418. data/test/models/auto_id.rb +4 -4
  419. data/test/models/autoloadable/extra_firm.rb +2 -2
  420. data/test/models/binary.rb +2 -2
  421. data/test/models/bird.rb +12 -12
  422. data/test/models/book.rb +23 -18
  423. data/test/models/boolean.rb +2 -2
  424. data/test/models/bulb.rb +52 -51
  425. data/test/models/cake_designer.rb +3 -3
  426. data/test/models/car.rb +29 -26
  427. data/test/models/carrier.rb +2 -2
  428. data/test/models/cat.rb +10 -0
  429. data/test/models/categorization.rb +19 -19
  430. data/test/models/category.rb +35 -35
  431. data/test/models/chef.rb +8 -7
  432. data/test/models/citation.rb +3 -3
  433. data/test/models/club.rb +25 -23
  434. data/test/models/college.rb +10 -10
  435. data/test/models/column.rb +3 -3
  436. data/test/models/column_name.rb +3 -3
  437. data/test/models/comment.rb +76 -64
  438. data/test/models/company.rb +230 -228
  439. data/test/models/company_in_module.rb +98 -98
  440. data/test/models/computer.rb +3 -3
  441. data/test/models/contact.rb +41 -41
  442. data/test/models/content.rb +40 -0
  443. data/test/models/contract.rb +20 -20
  444. data/test/models/country.rb +7 -7
  445. data/test/models/course.rb +6 -6
  446. data/test/models/customer.rb +83 -77
  447. data/test/models/customer_carrier.rb +14 -14
  448. data/test/models/dashboard.rb +3 -3
  449. data/test/models/default.rb +2 -2
  450. data/test/models/department.rb +4 -4
  451. data/test/models/developer.rb +274 -255
  452. data/test/models/dog.rb +5 -5
  453. data/test/models/dog_lover.rb +5 -5
  454. data/test/models/doubloon.rb +12 -12
  455. data/test/models/drink_designer.rb +3 -3
  456. data/test/models/edge.rb +5 -5
  457. data/test/models/electron.rb +5 -5
  458. data/test/models/engine.rb +4 -4
  459. data/test/models/entrant.rb +3 -3
  460. data/test/models/essay.rb +5 -5
  461. data/test/models/event.rb +3 -3
  462. data/test/models/eye.rb +37 -37
  463. data/test/models/face.rb +9 -9
  464. data/test/models/friendship.rb +6 -6
  465. data/test/models/guid.rb +2 -2
  466. data/test/models/guitar.rb +4 -0
  467. data/test/models/hotel.rb +11 -9
  468. data/test/models/image.rb +3 -3
  469. data/test/models/interest.rb +5 -5
  470. data/test/models/invoice.rb +4 -4
  471. data/test/models/item.rb +7 -7
  472. data/test/models/job.rb +7 -7
  473. data/test/models/joke.rb +7 -7
  474. data/test/models/keyboard.rb +3 -3
  475. data/test/models/legacy_thing.rb +3 -3
  476. data/test/models/lesson.rb +11 -11
  477. data/test/models/line_item.rb +3 -3
  478. data/test/models/liquid.rb +4 -4
  479. data/test/models/man.rb +11 -11
  480. data/test/models/matey.rb +4 -4
  481. data/test/models/member.rb +42 -41
  482. data/test/models/member_detail.rb +8 -7
  483. data/test/models/member_type.rb +3 -3
  484. data/test/models/membership.rb +35 -35
  485. data/test/models/mentor.rb +3 -0
  486. data/test/models/minimalistic.rb +2 -2
  487. data/test/models/minivan.rb +9 -9
  488. data/test/models/mixed_case_monkey.rb +3 -3
  489. data/test/models/mocktail_designer.rb +2 -0
  490. data/test/models/molecule.rb +6 -6
  491. data/test/models/movie.rb +5 -5
  492. data/test/models/node.rb +5 -0
  493. data/test/models/non_primary_key.rb +2 -0
  494. data/test/models/notification.rb +3 -0
  495. data/test/models/order.rb +4 -4
  496. data/test/models/organization.rb +14 -14
  497. data/test/models/other_dog.rb +5 -0
  498. data/test/models/owner.rb +37 -34
  499. data/test/models/parrot.rb +28 -29
  500. data/test/models/person.rb +142 -143
  501. data/test/models/personal_legacy_thing.rb +4 -4
  502. data/test/models/pet.rb +18 -15
  503. data/test/models/pet_treasure.rb +6 -0
  504. data/test/models/pirate.rb +92 -92
  505. data/test/models/possession.rb +3 -3
  506. data/test/models/post.rb +273 -264
  507. data/test/models/price_estimate.rb +4 -4
  508. data/test/models/professor.rb +5 -5
  509. data/test/models/project.rb +40 -31
  510. data/test/models/publisher.rb +2 -2
  511. data/test/models/publisher/article.rb +4 -4
  512. data/test/models/publisher/magazine.rb +3 -3
  513. data/test/models/randomly_named_c1.rb +1 -1
  514. data/test/models/rating.rb +4 -4
  515. data/test/models/reader.rb +23 -23
  516. data/test/models/recipe.rb +3 -0
  517. data/test/models/record.rb +2 -2
  518. data/test/models/reference.rb +22 -22
  519. data/test/models/reply.rb +61 -61
  520. data/test/models/ship.rb +39 -33
  521. data/test/models/ship_part.rb +8 -8
  522. data/test/models/shop.rb +17 -17
  523. data/test/models/shop_account.rb +6 -6
  524. data/test/models/speedometer.rb +6 -6
  525. data/test/models/sponsor.rb +7 -7
  526. data/test/models/string_key_object.rb +3 -3
  527. data/test/models/student.rb +4 -4
  528. data/test/models/subject.rb +16 -16
  529. data/test/models/subscriber.rb +8 -8
  530. data/test/models/subscription.rb +4 -4
  531. data/test/models/tag.rb +13 -7
  532. data/test/models/tagging.rb +13 -13
  533. data/test/models/task.rb +5 -5
  534. data/test/models/topic.rb +118 -124
  535. data/test/models/toy.rb +6 -6
  536. data/test/models/traffic_light.rb +4 -4
  537. data/test/models/treasure.rb +14 -14
  538. data/test/models/treaty.rb +7 -7
  539. data/test/models/tree.rb +3 -0
  540. data/test/models/tuning_peg.rb +4 -0
  541. data/test/models/tyre.rb +11 -11
  542. data/test/models/user.rb +14 -0
  543. data/test/models/uuid_child.rb +3 -3
  544. data/test/models/uuid_item.rb +6 -0
  545. data/test/models/uuid_parent.rb +3 -3
  546. data/test/models/vegetables.rb +24 -24
  547. data/test/models/vehicle.rb +6 -6
  548. data/test/models/vertex.rb +9 -9
  549. data/test/models/warehouse_thing.rb +5 -5
  550. data/test/models/wheel.rb +3 -3
  551. data/test/models/without_table.rb +3 -3
  552. data/test/models/zine.rb +3 -3
  553. data/test/schema/mysql2_specific_schema.rb +68 -58
  554. data/test/schema/oracle_specific_schema.rb +40 -43
  555. data/test/schema/postgresql_specific_schema.rb +114 -202
  556. data/test/schema/schema.rb +1057 -952
  557. data/test/schema/schema.rb.original +1057 -0
  558. data/test/schema/sqlite_specific_schema.rb +18 -22
  559. data/test/support/config.rb +43 -43
  560. data/test/support/connection.rb +23 -22
  561. data/test/support/connection_helper.rb +14 -14
  562. data/test/support/ddl_helper.rb +8 -8
  563. data/test/support/schema_dumping_helper.rb +20 -20
  564. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  565. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  566. metadata +129 -28
  567. data/lib/mswin32/rb19x/ibm_db.so +0 -0
  568. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  569. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  570. data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
  571. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
  572. data/test/cases/attribute_methods/serialization_test.rb +0 -29
  573. data/test/cases/migration/change_schema_test - Copy.rb +0 -448
  574. data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
  575. data/test/cases/migration/table_and_index_test.rb +0 -24
  576. data/test/cases/relation/where_test2.rb +0 -36
  577. data/test/cases/type/decimal_test.rb +0 -56
  578. data/test/cases/type/unsigned_integer_test.rb +0 -18
  579. data/test/cases/xml_serialization_test.rb +0 -457
  580. data/test/connections/native_ibm_db/connection.rb +0 -44
  581. data/test/fixtures/naked/csv/accounts.csv +0 -1
  582. data/test/schema/i5/ibm_db_specific_schema.rb +0 -137
  583. data/test/schema/ids/ibm_db_specific_schema.rb +0 -140
  584. data/test/schema/luw/ibm_db_specific_schema.rb +0 -137
  585. data/test/schema/mysql_specific_schema.rb +0 -70
  586. data/test/schema/zOS/ibm_db_specific_schema.rb +0 -208
@@ -0,0 +1,118 @@
1
+ require 'cases/helper'
2
+
3
+ module ActiveRecord
4
+ class Migration
5
+ class CompatibilityTest < ActiveRecord::TestCase
6
+ attr_reader :connection
7
+ self.use_transactional_tests = false
8
+
9
+ def setup
10
+ super
11
+ @connection = ActiveRecord::Base.connection
12
+ @verbose_was = ActiveRecord::Migration.verbose
13
+ ActiveRecord::Migration.verbose = false
14
+
15
+ connection.create_table :testings do |t|
16
+ t.column :foo, :string, :limit => 100
17
+ t.column :bar, :string, :limit => 100
18
+ end
19
+ end
20
+
21
+ teardown do
22
+ connection.drop_table :testings rescue nil
23
+ ActiveRecord::Migration.verbose = @verbose_was
24
+ ActiveRecord::SchemaMigration.delete_all rescue nil
25
+ end
26
+
27
+ def test_migration_doesnt_remove_named_index
28
+ connection.add_index :testings, :foo, :name => "custom_index_name"
29
+
30
+ migration = Class.new(ActiveRecord::Migration[4.2]) {
31
+ def version; 101 end
32
+ def migrate(x)
33
+ remove_index :testings, :foo
34
+ end
35
+ }.new
36
+
37
+ assert connection.index_exists?(:testings, :foo, name: "custom_index_name")
38
+ assert_raise(StandardError) { ActiveRecord::Migrator.new(:up, [migration]).migrate }
39
+ assert connection.index_exists?(:testings, :foo, name: "custom_index_name")
40
+ end
41
+
42
+ def test_migration_does_remove_unnamed_index
43
+ connection.add_index :testings, :bar
44
+
45
+ migration = Class.new(ActiveRecord::Migration[4.2]) {
46
+ def version; 101 end
47
+ def migrate(x)
48
+ remove_index :testings, :bar
49
+ end
50
+ }.new
51
+
52
+ assert connection.index_exists?(:testings, :bar)
53
+ ActiveRecord::Migrator.new(:up, [migration]).migrate
54
+ assert_not connection.index_exists?(:testings, :bar)
55
+ end
56
+
57
+ def test_references_does_not_add_index_by_default
58
+ migration = Class.new(ActiveRecord::Migration) {
59
+ def migrate(x)
60
+ create_table :more_testings do |t|
61
+ t.references :foo
62
+ t.belongs_to :bar, index: false
63
+ end
64
+ end
65
+ }.new
66
+
67
+ ActiveRecord::Migrator.new(:up, [migration]).migrate
68
+
69
+ assert_not connection.index_exists?(:more_testings, :foo_id)
70
+ assert_not connection.index_exists?(:more_testings, :bar_id)
71
+ ensure
72
+ connection.drop_table :more_testings rescue nil
73
+ end
74
+
75
+ def test_timestamps_have_null_constraints_if_not_present_in_migration_of_create_table
76
+ migration = Class.new(ActiveRecord::Migration) {
77
+ def migrate(x)
78
+ create_table :more_testings do |t|
79
+ t.timestamps
80
+ end
81
+ end
82
+ }.new
83
+
84
+ ActiveRecord::Migrator.new(:up, [migration]).migrate
85
+
86
+ assert connection.columns(:more_testings).find { |c| c.name == 'created_at' }.null
87
+ assert connection.columns(:more_testings).find { |c| c.name == 'updated_at' }.null
88
+ ensure
89
+ connection.drop_table :more_testings rescue nil
90
+ end
91
+
92
+ def test_timestamps_have_null_constraints_if_not_present_in_migration_for_adding_timestamps_to_existing_table
93
+ migration = Class.new(ActiveRecord::Migration) {
94
+ def migrate(x)
95
+ add_timestamps :testings
96
+ end
97
+ }.new
98
+
99
+ ActiveRecord::Migrator.new(:up, [migration]).migrate
100
+
101
+ assert connection.columns(:testings).find { |c| c.name == 'created_at' }.null
102
+ assert connection.columns(:testings).find { |c| c.name == 'updated_at' }.null
103
+ end
104
+
105
+ def test_legacy_migrations_get_deprecation_warning_when_run
106
+ migration = Class.new(ActiveRecord::Migration) {
107
+ def up
108
+ add_column :testings, :baz, :string
109
+ end
110
+ }
111
+
112
+ assert_deprecated do
113
+ migration.migrate :up
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
@@ -1,148 +1,157 @@
1
- require 'cases/helper'
2
-
3
- module ActiveRecord
4
- class Migration
5
- class CreateJoinTableTest < ActiveRecord::TestCase
6
- attr_reader :connection
7
-
8
- def setup
9
- super
10
- @connection = ActiveRecord::Base.connection
11
- end
12
-
13
- teardown do
14
- %w(artists_musics musics_videos catalog).each do |table_name|
15
- connection.drop_table table_name if connection.tables.include?(table_name)
16
- end
17
- end
18
-
19
- def test_create_join_table
20
- connection.create_join_table :artists, :musics
21
-
22
- assert_equal %w(artist_id music_id), connection.columns(:artists_musics).map(&:name).sort
23
- end
24
-
25
- def test_create_join_table_set_not_null_by_default
26
- connection.create_join_table :artists, :musics
27
-
28
- assert_equal [false, false], connection.columns(:artists_musics).map(&:null)
29
- end
30
-
31
- def test_create_join_table_with_strings
32
- connection.create_join_table 'artists', 'musics'
33
-
34
- assert_equal %w(artist_id music_id), connection.columns(:artists_musics).map(&:name).sort
35
- end
36
-
37
- def test_create_join_table_with_symbol_and_string
38
- connection.create_join_table :artists, 'musics'
39
-
40
- assert_equal %w(artist_id music_id), connection.columns(:artists_musics).map(&:name).sort
41
- end
42
-
43
- def test_create_join_table_with_the_proper_order
44
- connection.create_join_table :videos, :musics
45
-
46
- assert_equal %w(music_id video_id), connection.columns(:musics_videos).map(&:name).sort
47
- end
48
-
49
- def test_create_join_table_with_the_table_name
50
- connection.create_join_table :artists, :musics, table_name: :catalog
51
-
52
- assert_equal %w(artist_id music_id), connection.columns(:catalog).map(&:name).sort
53
- end
54
-
55
- def test_create_join_table_with_the_table_name_as_string
56
- connection.create_join_table :artists, :musics, table_name: 'catalog'
57
-
58
- assert_equal %w(artist_id music_id), connection.columns(:catalog).map(&:name).sort
59
- end
60
-
61
- def test_create_join_table_with_column_options
62
- connection.create_join_table :artists, :musics, column_options: {null: true}
63
-
64
- assert_equal [true, true], connection.columns(:artists_musics).map(&:null)
65
- end
66
-
67
- def test_create_join_table_without_indexes
68
- connection.create_join_table :artists, :musics
69
-
70
- assert connection.indexes(:artists_musics).blank?
71
- end
72
-
73
- def test_create_join_table_with_index
74
- connection.create_join_table :artists, :musics do |t|
75
- t.index [:artist_id, :music_id]
76
- end
77
-
78
- assert_equal [%w(artist_id music_id)], connection.indexes(:artists_musics).map(&:columns)
79
- end
80
-
81
- def test_drop_join_table
82
- connection.create_join_table :artists, :musics
83
- connection.drop_join_table :artists, :musics
84
-
85
- assert !connection.tables.include?('artists_musics')
86
- end
87
-
88
- def test_drop_join_table_with_strings
89
- connection.create_join_table :artists, :musics
90
- connection.drop_join_table 'artists', 'musics'
91
-
92
- assert !connection.tables.include?('artists_musics')
93
- end
94
-
95
- def test_drop_join_table_with_the_proper_order
96
- connection.create_join_table :videos, :musics
97
- connection.drop_join_table :videos, :musics
98
-
99
- assert !connection.tables.include?('musics_videos')
100
- end
101
-
102
- def test_drop_join_table_with_the_table_name
103
- connection.create_join_table :artists, :musics, table_name: :catalog
104
- connection.drop_join_table :artists, :musics, table_name: :catalog
105
-
106
- assert !connection.tables.include?('catalog')
107
- end
108
-
109
- def test_drop_join_table_with_the_table_name_as_string
110
- connection.create_join_table :artists, :musics, table_name: 'catalog'
111
- connection.drop_join_table :artists, :musics, table_name: 'catalog'
112
-
113
- assert !connection.tables.include?('catalog')
114
- end
115
-
116
- def test_drop_join_table_with_column_options
117
- connection.create_join_table :artists, :musics, column_options: {null: true}
118
- connection.drop_join_table :artists, :musics, column_options: {null: true}
119
-
120
- assert !connection.tables.include?('artists_musics')
121
- end
122
-
123
- def test_create_and_drop_join_table_with_common_prefix
124
- with_table_cleanup do
125
- connection.create_join_table 'audio_artists', 'audio_musics'
126
- assert_includes connection.tables, 'audio_artists_musics'
127
-
128
- connection.drop_join_table 'audio_artists', 'audio_musics'
129
- assert !connection.tables.include?('audio_artists_musics'), "Should have dropped join table, but didn't"
130
- end
131
- end
132
-
133
- private
134
-
135
- def with_table_cleanup
136
- tables_before = connection.tables
137
-
138
- yield
139
- ensure
140
- tables_after = connection.tables - tables_before
141
-
142
- tables_after.each do |table|
143
- connection.execute "DROP TABLE #{table}"
144
- end
145
- end
146
- end
147
- end
148
- end
1
+ require 'cases/helper'
2
+
3
+ module ActiveRecord
4
+ class Migration
5
+ class CreateJoinTableTest < ActiveRecord::TestCase
6
+ attr_reader :connection
7
+
8
+ def setup
9
+ super
10
+ @connection = ActiveRecord::Base.connection
11
+ end
12
+
13
+ teardown do
14
+ %w(artists_musics musics_videos catalog).each do |table_name|
15
+ ActiveSupport::Deprecation.silence do
16
+ connection.drop_table table_name if connection.table_exists?(table_name)
17
+ end
18
+ end
19
+ end
20
+
21
+ def test_create_join_table
22
+ connection.create_join_table :artists, :musics
23
+
24
+ assert_equal %w(artist_id music_id), connection.columns(:artists_musics).map(&:name).sort
25
+ end
26
+
27
+ def test_create_join_table_set_not_null_by_default
28
+ connection.create_join_table :artists, :musics
29
+
30
+ assert_equal [false, false], connection.columns(:artists_musics).map(&:null)
31
+ end
32
+
33
+ def test_create_join_table_with_strings
34
+ connection.create_join_table 'artists', 'musics'
35
+
36
+ assert_equal %w(artist_id music_id), connection.columns(:artists_musics).map(&:name).sort
37
+ end
38
+
39
+ def test_create_join_table_with_symbol_and_string
40
+ connection.create_join_table :artists, 'musics'
41
+
42
+ assert_equal %w(artist_id music_id), connection.columns(:artists_musics).map(&:name).sort
43
+ end
44
+
45
+ def test_create_join_table_with_the_proper_order
46
+ connection.create_join_table :videos, :musics
47
+
48
+ assert_equal %w(music_id video_id), connection.columns(:musics_videos).map(&:name).sort
49
+ end
50
+
51
+ def test_create_join_table_with_the_table_name
52
+ connection.create_join_table :artists, :musics, table_name: :catalog
53
+
54
+ assert_equal %w(artist_id music_id), connection.columns(:catalog).map(&:name).sort
55
+ end
56
+
57
+ def test_create_join_table_with_the_table_name_as_string
58
+ connection.create_join_table :artists, :musics, table_name: 'catalog'
59
+
60
+ assert_equal %w(artist_id music_id), connection.columns(:catalog).map(&:name).sort
61
+ end
62
+
63
+ def test_create_join_table_with_column_options
64
+ connection.create_join_table :artists, :musics, column_options: {null: true}
65
+
66
+ assert_equal [true, true], connection.columns(:artists_musics).map(&:null)
67
+ end
68
+
69
+ def test_create_join_table_without_indexes
70
+ connection.create_join_table :artists, :musics
71
+
72
+ assert connection.indexes(:artists_musics).blank?
73
+ end
74
+
75
+ def test_create_join_table_with_index
76
+ connection.create_join_table :artists, :musics do |t|
77
+ t.index [:artist_id, :music_id]
78
+ end
79
+
80
+ assert_equal [%w(artist_id music_id)], connection.indexes(:artists_musics).map(&:columns)
81
+ end
82
+
83
+ def test_drop_join_table
84
+ connection.create_join_table :artists, :musics
85
+ connection.drop_join_table :artists, :musics
86
+
87
+ ActiveSupport::Deprecation.silence { assert !connection.table_exists?('artists_musics') }
88
+ end
89
+
90
+ def test_drop_join_table_with_strings
91
+ connection.create_join_table :artists, :musics
92
+ connection.drop_join_table 'artists', 'musics'
93
+
94
+ ActiveSupport::Deprecation.silence { assert !connection.table_exists?('artists_musics') }
95
+ end
96
+
97
+ def test_drop_join_table_with_the_proper_order
98
+ connection.create_join_table :videos, :musics
99
+ connection.drop_join_table :videos, :musics
100
+
101
+ ActiveSupport::Deprecation.silence { assert !connection.table_exists?('musics_videos') }
102
+ end
103
+
104
+ def test_drop_join_table_with_the_table_name
105
+ connection.create_join_table :artists, :musics, table_name: :catalog
106
+ connection.drop_join_table :artists, :musics, table_name: :catalog
107
+
108
+ ActiveSupport::Deprecation.silence { assert !connection.table_exists?('catalog') }
109
+ end
110
+
111
+ def test_drop_join_table_with_the_table_name_as_string
112
+ connection.create_join_table :artists, :musics, table_name: 'catalog'
113
+ connection.drop_join_table :artists, :musics, table_name: 'catalog'
114
+
115
+ ActiveSupport::Deprecation.silence { assert !connection.table_exists?('catalog') }
116
+ end
117
+
118
+ def test_drop_join_table_with_column_options
119
+ connection.create_join_table :artists, :musics, column_options: {null: true}
120
+ connection.drop_join_table :artists, :musics, column_options: {null: true}
121
+
122
+ ActiveSupport::Deprecation.silence { assert !connection.table_exists?('artists_musics') }
123
+ end
124
+
125
+ def test_create_and_drop_join_table_with_common_prefix
126
+ with_table_cleanup do
127
+ connection.create_join_table 'audio_artists', 'audio_musics'
128
+ ActiveSupport::Deprecation.silence { assert connection.table_exists?('audio_artists_musics') }
129
+
130
+ connection.drop_join_table 'audio_artists', 'audio_musics'
131
+ ActiveSupport::Deprecation.silence { assert !connection.table_exists?('audio_artists_musics'), "Should have dropped join table, but didn't" }
132
+ end
133
+ end
134
+
135
+ if current_adapter?(:PostgreSQLAdapter)
136
+ def test_create_join_table_with_uuid
137
+ connection.create_join_table :artists, :musics, column_options: { type: :uuid }
138
+ assert_equal [:uuid, :uuid], connection.columns(:artists_musics).map(&:type)
139
+ end
140
+ end
141
+
142
+ private
143
+
144
+ def with_table_cleanup
145
+ tables_before = connection.data_sources
146
+
147
+ yield
148
+ ensure
149
+ tables_after = connection.data_sources - tables_before
150
+
151
+ tables_after.each do |table|
152
+ connection.drop_table table
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
@@ -1,328 +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
- teardown do
31
- if defined?(@connection)
32
- @connection.drop_table "astronauts" if @connection.table_exists? 'astronauts'
33
- @connection.drop_table "rockets" if @connection.table_exists? 'rockets'
34
- end
35
- end
36
-
37
- def test_foreign_keys
38
- foreign_keys = @connection.foreign_keys("fk_test_has_fk")
39
- assert_equal 1, foreign_keys.size
40
-
41
- fk = foreign_keys.first
42
- if current_adapter?(:IBM_DBAdapter)
43
- assert_equal "fk_test_has_fk".upcase, fk.from_table.upcase
44
- assert_equal "fk_test_has_pk".upcase, fk.to_table.upcase
45
- assert_equal "fk_id".upcase, fk.column.upcase
46
- assert_equal "pk_id".upcase, fk.primary_key.upcase
47
- assert_equal "fk_name".upcase, fk.name.upcase
48
- else
49
- assert_equal "fk_test_has_fk", fk.from_table
50
- assert_equal "fk_test_has_pk", fk.to_table
51
- assert_equal "fk_id", fk.column
52
- assert_equal "pk_id", fk.primary_key
53
- assert_equal "fk_name", fk.name
54
- end
55
- end
56
-
57
- def test_add_foreign_key_inferes_column
58
- @connection.add_foreign_key :astronauts, :rockets
59
-
60
- foreign_keys = @connection.foreign_keys("astronauts")
61
- assert_equal 1, foreign_keys.size
62
-
63
- fk = foreign_keys.first
64
-
65
- if current_adapter?(:IBM_DBAdapter)
66
- assert_equal "astronauts".upcase, fk.from_table.upcase
67
- else
68
- assert_equal "astronauts", fk.from_table
69
- end
70
-
71
- if current_adapter?(:IBM_DBAdapter)
72
- assert_equal "rockets".upcase, fk.to_table.upcase
73
- assert_equal "rocket_id".upcase, fk.column.upcase
74
- assert_equal "id".upcase, fk.primary_key.upcase
75
- assert_equal("fk_rails_78146ddd2e".upcase, fk.name.upcase)
76
- else
77
- assert_equal "rockets", fk.to_table
78
- assert_equal "rocket_id", fk.column
79
- assert_equal "id", fk.primary_key
80
- assert_equal("fk_rails_78146ddd2e", fk.name)
81
- end
82
-
83
- end
84
-
85
- def test_add_foreign_key_with_column
86
- @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id"
87
-
88
- foreign_keys = @connection.foreign_keys("astronauts")
89
- assert_equal 1, foreign_keys.size
90
-
91
- fk = foreign_keys.first
92
- if current_adapter?(:IBM_DBAdapter)
93
- assert_equal "astronauts".upcase, fk.from_table.upcase
94
- assert_equal "rockets".upcase, fk.to_table.upcase
95
- assert_equal "rocket_id".upcase, fk.column.upcase
96
- assert_equal "id".upcase, fk.primary_key.upcase
97
- assert_equal("fk_rails_78146ddd2e".upcase, fk.name.upcase)
98
- else
99
- assert_equal "astronauts", fk.from_table
100
- assert_equal "rockets", fk.to_table
101
- assert_equal "rocket_id", fk.column
102
- assert_equal "id", fk.primary_key
103
- assert_equal("fk_rails_78146ddd2e", fk.name)
104
- end
105
-
106
- end
107
-
108
- def test_add_foreign_key_with_non_standard_primary_key
109
- if current_adapter?(:IBM_DBAdapter)
110
- @connection.create_table :space_shuttles, force: true, id: false do |t|
111
- t.primary_key :pk
112
- end
113
- @connection.add_foreign_key(:astronauts, :space_shuttles,
114
- column: "rocket_id", primary_key: "pk", name: "custom_pk")
115
- foreign_keys = @connection.foreign_keys("astronauts")
116
- assert_equal 1, foreign_keys.size
117
- fk = foreign_keys.first
118
- assert_equal "astronauts".upcase, fk.from_table.upcase
119
- assert_equal "space_shuttles".upcase, fk.to_table.upcase
120
- assert_equal "pk".upcase, fk.primary_key.upcase
121
- @connection.remove_foreign_key :astronauts, name: "custom_pk"
122
- else
123
- with_example_table @connection, "space_shuttles", "pk integer PRIMARY KEY" do
124
- @connection.add_foreign_key(:astronauts, :space_shuttles,
125
- column: "rocket_id", primary_key: "pk", name: "custom_pk")
126
- foreign_keys = @connection.foreign_keys("astronauts")
127
- assert_equal 1, foreign_keys.size
128
- fk = foreign_keys.first
129
- assert_equal "astronauts", fk.from_table
130
- assert_equal "space_shuttles", fk.to_table
131
- assert_equal "pk", fk.primary_key
132
- @connection.remove_foreign_key :astronauts, name: "custom_pk"
133
- end
134
- end
135
- end
136
-
137
- def test_add_on_delete_restrict_foreign_key
138
- @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :restrict
139
-
140
- foreign_keys = @connection.foreign_keys("astronauts")
141
- assert_equal 1, foreign_keys.size
142
-
143
- fk = foreign_keys.first
144
- if current_adapter?(:MysqlAdapter, :Mysql2Adapter)
145
- # ON DELETE RESTRICT is the default on MySQL
146
- assert_equal nil, fk.on_delete
147
- else
148
- assert_equal :restrict, fk.on_delete
149
- end
150
- end
151
-
152
- def test_add_on_delete_cascade_foreign_key
153
- @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :cascade
154
-
155
- foreign_keys = @connection.foreign_keys("astronauts")
156
- assert_equal 1, foreign_keys.size
157
-
158
- fk = foreign_keys.first
159
- assert_equal :cascade, fk.on_delete
160
- end
161
-
162
- def test_add_on_delete_nullify_foreign_key
163
- @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :nullify
164
-
165
- foreign_keys = @connection.foreign_keys("astronauts")
166
- assert_equal 1, foreign_keys.size
167
-
168
- fk = foreign_keys.first
169
- assert_equal :nullify, fk.on_delete
170
- end
171
-
172
- def test_on_update_and_on_delete_raises_with_invalid_values
173
- assert_raises ArgumentError do
174
- @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :invalid
175
- end
176
-
177
- assert_raises ArgumentError do
178
- @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_update: :invalid
179
- end
180
- end
181
-
182
- def test_add_foreign_key_with_on_update
183
- #@connection.add_foreign_key :astronauts, :rockets, column: "rocket_id" , on_update: :nullify
184
- @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id"
185
-
186
- foreign_keys = @connection.foreign_keys("astronauts")
187
- assert_equal 1, foreign_keys.size
188
-
189
- fk = foreign_keys.first
190
- assert_equal :noaction, fk.on_update
191
- #assert_equal nil, fk.on_update
192
- end
193
-
194
- def test_remove_foreign_key_inferes_column
195
- @connection.add_foreign_key :astronauts, :rockets
196
-
197
- assert_equal 1, @connection.foreign_keys("astronauts").size
198
- @connection.remove_foreign_key :astronauts, :rockets
199
- assert_equal [], @connection.foreign_keys("astronauts")
200
- end
201
-
202
- def test_remove_foreign_key_by_column
203
- @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id"
204
-
205
- assert_equal 1, @connection.foreign_keys("astronauts").size
206
- @connection.remove_foreign_key :astronauts, column: "rocket_id"
207
- assert_equal [], @connection.foreign_keys("astronauts")
208
- end
209
-
210
- def test_remove_foreign_key_by_symbol_column
211
- @connection.add_foreign_key :astronauts, :rockets, column: :rocket_id
212
-
213
- assert_equal 1, @connection.foreign_keys("astronauts").size
214
- @connection.remove_foreign_key :astronauts, column: :rocket_id
215
- assert_equal [], @connection.foreign_keys("astronauts")
216
- end
217
-
218
- def test_remove_foreign_key_by_name
219
- @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", name: "fancy_named_fk"
220
-
221
- assert_equal 1, @connection.foreign_keys("astronauts").size
222
- @connection.remove_foreign_key :astronauts, name: "fancy_named_fk"
223
- assert_equal [], @connection.foreign_keys("astronauts")
224
- end
225
-
226
- def test_remove_foreign_non_existing_foreign_key_raises
227
- assert_raises ArgumentError do
228
- @connection.remove_foreign_key :astronauts, :rockets
229
- end
230
- end
231
-
232
- def test_schema_dumping
233
- @connection.add_foreign_key :astronauts, :rockets
234
- output = dump_table_schema "astronauts"
235
- assert_match %r{\s+add_foreign_key "ASTRONAUTS", "ROCKETS"$}, output
236
- end
237
-
238
- def test_schema_dumping_with_options
239
- output = dump_table_schema "fk_test_has_fk"
240
- 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
241
- end
242
-
243
- def test_schema_dumping_on_delete_and_on_update_options
244
- #@connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :nullify, on_update: :cascade
245
- @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :cascade, on_update: :restrict
246
-
247
- output = dump_table_schema "astronauts"
248
- #assert_match %r{\s+add_foreign_key "astronauts",.+on_update: :cascade,.+on_delete: :nullify$}, output
249
- assert_match %r{\s+add_foreign_key "ASTRONAUTS",.+on_update: :restrict,.+on_delete: :cascade$}, output
250
- end
251
-
252
- class CreateCitiesAndHousesMigration < ActiveRecord::Migration
253
- def change
254
- create_table("cities") { |t| }
255
-
256
- create_table("houses") do |t|
257
- t.column :city_id, :integer
258
- end
259
- add_foreign_key :houses, :cities, column: "city_id"
260
- end
261
- end
262
-
263
- def test_add_foreign_key_is_reversible
264
- migration = CreateCitiesAndHousesMigration.new
265
- silence_stream($stdout) { migration.migrate(:up) }
266
- assert_equal 1, @connection.foreign_keys("houses").size
267
- ensure
268
- silence_stream($stdout) { migration.migrate(:down) }
269
- end
270
-
271
- class CreateSchoolsAndClassesMigration < ActiveRecord::Migration
272
- def change
273
- create_table(:schools)
274
-
275
- create_table(:classes) do |t|
276
- t.column :school_id, :integer
277
- end
278
- add_foreign_key :classes, :schools
279
- end
280
- end
281
-
282
- def test_add_foreign_key_with_prefix
283
- ActiveRecord::Base.table_name_prefix = 'p_'
284
- migration = CreateSchoolsAndClassesMigration.new
285
- silence_stream($stdout) { migration.migrate(:up) }
286
- assert_equal 1, @connection.foreign_keys("p_classes").size
287
- ensure
288
- silence_stream($stdout) { migration.migrate(:down) }
289
- ActiveRecord::Base.table_name_prefix = nil
290
- end
291
-
292
- def test_add_foreign_key_with_suffix
293
- ActiveRecord::Base.table_name_suffix = '_s'
294
- migration = CreateSchoolsAndClassesMigration.new
295
- silence_stream($stdout) { migration.migrate(:up) }
296
- assert_equal 1, @connection.foreign_keys("classes_s").size
297
- ensure
298
- silence_stream($stdout) { migration.migrate(:down) }
299
- ActiveRecord::Base.table_name_suffix = nil
300
- end
301
- end
302
- end
303
- end
304
- else
305
- module ActiveRecord
306
- class Migration
307
- class NoForeignKeySupportTest < ActiveRecord::TestCase
308
- setup do
309
- @connection = ActiveRecord::Base.connection
310
- end
311
-
312
- def test_add_foreign_key_should_be_noop
313
- @connection.add_foreign_key :clubs, :categories
314
- end
315
-
316
- def test_remove_foreign_key_should_be_noop
317
- @connection.remove_foreign_key :clubs, :categories
318
- end
319
-
320
- def test_foreign_keys_should_raise_not_implemented
321
- assert_raises NotImplementedError do
322
- @connection.foreign_keys("clubs")
323
- end
324
- end
325
- end
326
- end
327
- end
328
- end
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
+ include ActiveSupport::Testing::Stream
12
+
13
+ class Rocket < ActiveRecord::Base
14
+ end
15
+
16
+ class Astronaut < ActiveRecord::Base
17
+ end
18
+
19
+ setup do
20
+ @connection = ActiveRecord::Base.connection
21
+ @connection.create_table "rockets", force: true do |t|
22
+ t.string :name
23
+ end
24
+
25
+ @connection.create_table "astronauts", force: true do |t|
26
+ t.string :name
27
+ t.references :rocket
28
+ end
29
+ end
30
+
31
+ teardown do
32
+ if defined?(@connection)
33
+ @connection.drop_table "astronauts", if_exists: true
34
+ @connection.drop_table "rockets", if_exists: true
35
+ end
36
+ end
37
+
38
+ def test_foreign_keys
39
+ foreign_keys = @connection.foreign_keys("fk_test_has_fk")
40
+ assert_equal 1, foreign_keys.size
41
+
42
+ fk = foreign_keys.first
43
+ if current_adapter?(:IBM_DBAdapter)
44
+ assert_equal "fk_test_has_fk".upcase, fk.from_table.upcase
45
+ assert_equal "fk_test_has_pk".upcase, fk.to_table.upcase
46
+ assert_equal "fk_id".upcase, fk.column.upcase
47
+ assert_equal "pk_id".upcase, fk.primary_key.upcase
48
+ assert_equal "fk_name".upcase, fk.name.upcase
49
+ else
50
+ assert_equal "fk_test_has_fk", fk.from_table
51
+ assert_equal "fk_test_has_pk", fk.to_table
52
+ assert_equal "fk_id", fk.column
53
+ assert_equal "pk_id", fk.primary_key
54
+ assert_equal "fk_name", fk.name
55
+ end
56
+ end
57
+
58
+ def test_add_foreign_key_inferes_column
59
+ @connection.add_foreign_key :astronauts, :rockets
60
+
61
+ foreign_keys = @connection.foreign_keys("astronauts")
62
+ assert_equal 1, foreign_keys.size
63
+
64
+ fk = foreign_keys.first
65
+
66
+ if current_adapter?(:IBM_DBAdapter)
67
+ assert_equal "astronauts".upcase, fk.from_table.upcase
68
+ else
69
+ assert_equal "astronauts", fk.from_table
70
+ end
71
+
72
+ if current_adapter?(:IBM_DBAdapter)
73
+ assert_equal "rockets".upcase, fk.to_table.upcase
74
+ assert_equal "rocket_id".upcase, fk.column.upcase
75
+ assert_equal "id".upcase, fk.primary_key.upcase
76
+ assert_equal("fk_rails_78146ddd2e".upcase, fk.name.upcase)
77
+ else
78
+ assert_equal "rockets", fk.to_table
79
+ assert_equal "rocket_id", fk.column
80
+ assert_equal "id", fk.primary_key
81
+ assert_equal("fk_rails_78146ddd2e", fk.name)
82
+ end
83
+
84
+ end
85
+
86
+ def test_add_foreign_key_with_column
87
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id"
88
+
89
+ foreign_keys = @connection.foreign_keys("astronauts")
90
+ assert_equal 1, foreign_keys.size
91
+
92
+ fk = foreign_keys.first
93
+ if current_adapter?(:IBM_DBAdapter)
94
+ assert_equal "astronauts".upcase, fk.from_table.upcase
95
+ assert_equal "rockets".upcase, fk.to_table.upcase
96
+ assert_equal "rocket_id".upcase, fk.column.upcase
97
+ assert_equal "id".upcase, fk.primary_key.upcase
98
+ assert_equal("fk_rails_78146ddd2e".upcase, fk.name.upcase)
99
+ else
100
+ assert_equal "astronauts", fk.from_table
101
+ assert_equal "rockets", fk.to_table
102
+ assert_equal "rocket_id", fk.column
103
+ assert_equal "id", fk.primary_key
104
+ assert_equal("fk_rails_78146ddd2e", fk.name)
105
+ end
106
+
107
+ end
108
+
109
+ def test_add_foreign_key_with_non_standard_primary_key
110
+ if current_adapter?(:IBM_DBAdapter)
111
+ @connection.create_table :space_shuttles, force: true, id: false do |t|
112
+ t.primary_key :pk
113
+ end
114
+ @connection.add_foreign_key(:astronauts, :space_shuttles,
115
+ column: "rocket_id", primary_key: "pk", name: "custom_pk")
116
+ foreign_keys = @connection.foreign_keys("astronauts")
117
+ assert_equal 1, foreign_keys.size
118
+ fk = foreign_keys.first
119
+ assert_equal "astronauts".upcase, fk.from_table.upcase
120
+ assert_equal "space_shuttles".upcase, fk.to_table.upcase
121
+ assert_equal "pk".upcase, fk.primary_key.upcase
122
+ @connection.remove_foreign_key :astronauts, name: "custom_pk"
123
+ else
124
+ with_example_table @connection, "space_shuttles", "pk integer PRIMARY KEY" do
125
+ @connection.add_foreign_key(:astronauts, :space_shuttles,
126
+ column: "rocket_id", primary_key: "pk", name: "custom_pk")
127
+ foreign_keys = @connection.foreign_keys("astronauts")
128
+ assert_equal 1, foreign_keys.size
129
+ fk = foreign_keys.first
130
+ assert_equal "astronauts", fk.from_table
131
+ assert_equal "space_shuttles", fk.to_table
132
+ assert_equal "pk", fk.primary_key
133
+ @connection.remove_foreign_key :astronauts, name: "custom_pk"
134
+ end
135
+ end
136
+ end
137
+
138
+ def test_add_on_delete_restrict_foreign_key
139
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :restrict
140
+
141
+ foreign_keys = @connection.foreign_keys("astronauts")
142
+ assert_equal 1, foreign_keys.size
143
+
144
+ fk = foreign_keys.first
145
+ if current_adapter?(:Mysql2Adapter)
146
+ # ON DELETE RESTRICT is the default on MySQL
147
+ assert_equal nil, fk.on_delete
148
+ else
149
+ assert_equal :restrict, fk.on_delete
150
+ end
151
+ end
152
+
153
+ def test_add_on_delete_cascade_foreign_key
154
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :cascade
155
+
156
+ foreign_keys = @connection.foreign_keys("astronauts")
157
+ assert_equal 1, foreign_keys.size
158
+
159
+ fk = foreign_keys.first
160
+ assert_equal :cascade, fk.on_delete
161
+ end
162
+
163
+ def test_add_on_delete_nullify_foreign_key
164
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :nullify
165
+
166
+ foreign_keys = @connection.foreign_keys("astronauts")
167
+ assert_equal 1, foreign_keys.size
168
+
169
+ fk = foreign_keys.first
170
+ assert_equal :nullify, fk.on_delete
171
+ end
172
+
173
+ def test_on_update_and_on_delete_raises_with_invalid_values
174
+ assert_raises ArgumentError do
175
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :invalid
176
+ end
177
+
178
+ assert_raises ArgumentError do
179
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_update: :invalid
180
+ end
181
+ end
182
+
183
+ def test_add_foreign_key_with_on_update
184
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_update: :nullify
185
+
186
+ foreign_keys = @connection.foreign_keys("astronauts")
187
+ assert_equal 1, foreign_keys.size
188
+
189
+ fk = foreign_keys.first
190
+ assert_equal :nullify, fk.on_update
191
+ end
192
+
193
+ def test_foreign_key_exists
194
+ @connection.add_foreign_key :astronauts, :rockets
195
+
196
+ assert @connection.foreign_key_exists?(:astronauts, :rockets)
197
+ assert_not @connection.foreign_key_exists?(:astronauts, :stars)
198
+ end
199
+
200
+ def test_foreign_key_exists_by_column
201
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id"
202
+
203
+ assert @connection.foreign_key_exists?(:astronauts, column: "rocket_id")
204
+ assert_not @connection.foreign_key_exists?(:astronauts, column: "star_id")
205
+ end
206
+
207
+ def test_foreign_key_exists_by_name
208
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", name: "fancy_named_fk"
209
+
210
+ assert @connection.foreign_key_exists?(:astronauts, name: "fancy_named_fk")
211
+ assert_not @connection.foreign_key_exists?(:astronauts, name: "other_fancy_named_fk")
212
+ end
213
+
214
+ def test_remove_foreign_key_inferes_column
215
+ @connection.add_foreign_key :astronauts, :rockets
216
+
217
+ assert_equal 1, @connection.foreign_keys("astronauts").size
218
+ @connection.remove_foreign_key :astronauts, :rockets
219
+ assert_equal [], @connection.foreign_keys("astronauts")
220
+ end
221
+
222
+ def test_remove_foreign_key_by_column
223
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id"
224
+
225
+ assert_equal 1, @connection.foreign_keys("astronauts").size
226
+ @connection.remove_foreign_key :astronauts, column: "rocket_id"
227
+ assert_equal [], @connection.foreign_keys("astronauts")
228
+ end
229
+
230
+ def test_remove_foreign_key_by_symbol_column
231
+ @connection.add_foreign_key :astronauts, :rockets, column: :rocket_id
232
+
233
+ assert_equal 1, @connection.foreign_keys("astronauts").size
234
+ @connection.remove_foreign_key :astronauts, column: :rocket_id
235
+ assert_equal [], @connection.foreign_keys("astronauts")
236
+ end
237
+
238
+ def test_remove_foreign_key_by_name
239
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", name: "fancy_named_fk"
240
+
241
+ assert_equal 1, @connection.foreign_keys("astronauts").size
242
+ @connection.remove_foreign_key :astronauts, name: "fancy_named_fk"
243
+ assert_equal [], @connection.foreign_keys("astronauts")
244
+ end
245
+
246
+ def test_remove_foreign_non_existing_foreign_key_raises
247
+ assert_raises ArgumentError do
248
+ @connection.remove_foreign_key :astronauts, :rockets
249
+ end
250
+ end
251
+
252
+ def test_schema_dumping
253
+ @connection.add_foreign_key :astronauts, :rockets
254
+ output = dump_table_schema "astronauts"
255
+ assert_match %r{\s+add_foreign_key "astronauts", "rockets"$}, output
256
+ end
257
+
258
+ def test_schema_dumping_with_options
259
+ output = dump_table_schema "fk_test_has_fk"
260
+ 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
261
+ end
262
+
263
+ def test_schema_dumping_on_delete_and_on_update_options
264
+ @connection.add_foreign_key :astronauts, :rockets, column: "rocket_id", on_delete: :nullify, on_update: :cascade
265
+
266
+ output = dump_table_schema "astronauts"
267
+ assert_match %r{\s+add_foreign_key "astronauts",.+on_update: :cascade,.+on_delete: :nullify$}, output
268
+ end
269
+
270
+ class CreateCitiesAndHousesMigration < ActiveRecord::Migration::Current
271
+ def change
272
+ create_table("cities") { |t| }
273
+
274
+ create_table("houses") do |t|
275
+ t.column :city_id, :integer
276
+ end
277
+ add_foreign_key :houses, :cities, column: "city_id"
278
+
279
+ # remove and re-add to test that schema is updated and not accidently cached
280
+ remove_foreign_key :houses, :cities
281
+ add_foreign_key :houses, :cities, column: "city_id", on_delete: :cascade
282
+ end
283
+ end
284
+
285
+ def test_add_foreign_key_is_reversible
286
+ migration = CreateCitiesAndHousesMigration.new
287
+ silence_stream($stdout) { migration.migrate(:up) }
288
+ assert_equal 1, @connection.foreign_keys("houses").size
289
+ ensure
290
+ silence_stream($stdout) { migration.migrate(:down) }
291
+ end
292
+
293
+ def test_foreign_key_constraint_is_not_cached_incorrectly
294
+ migration = CreateCitiesAndHousesMigration.new
295
+ silence_stream($stdout) { migration.migrate(:up) }
296
+ output = dump_table_schema "houses"
297
+ assert_match %r{\s+add_foreign_key "houses",.+on_delete: :cascade$}, output
298
+ ensure
299
+ silence_stream($stdout) { migration.migrate(:down) }
300
+ end
301
+
302
+ class CreateSchoolsAndClassesMigration < ActiveRecord::Migration::Current
303
+ def change
304
+ create_table(:schools)
305
+
306
+ create_table(:classes) do |t|
307
+ t.column :school_id, :integer
308
+ end
309
+ add_foreign_key :classes, :schools
310
+ end
311
+ end
312
+
313
+ def test_add_foreign_key_with_prefix
314
+ ActiveRecord::Base.table_name_prefix = 'p_'
315
+ migration = CreateSchoolsAndClassesMigration.new
316
+ silence_stream($stdout) { migration.migrate(:up) }
317
+ assert_equal 1, @connection.foreign_keys("p_classes").size
318
+ ensure
319
+ silence_stream($stdout) { migration.migrate(:down) }
320
+ ActiveRecord::Base.table_name_prefix = nil
321
+ end
322
+
323
+ def test_add_foreign_key_with_suffix
324
+ ActiveRecord::Base.table_name_suffix = '_s'
325
+ migration = CreateSchoolsAndClassesMigration.new
326
+ silence_stream($stdout) { migration.migrate(:up) }
327
+ assert_equal 1, @connection.foreign_keys("classes_s").size
328
+ ensure
329
+ silence_stream($stdout) { migration.migrate(:down) }
330
+ ActiveRecord::Base.table_name_suffix = nil
331
+ end
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