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