ibm_db 4.0.0-x86-mingw32 → 5.0.2-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 (570) hide show
  1. checksums.yaml +5 -5
  2. data/MANIFEST +14 -14
  3. data/README +208 -208
  4. data/ext/Makefile +269 -0
  5. data/ext/Makefile.nt32 +181 -181
  6. data/ext/Makefile.nt32.191 +212 -212
  7. data/ext/extconf.rb +322 -291
  8. data/ext/gil_release_version +3 -0
  9. data/ext/ibm_db.c +11879 -11887
  10. data/ext/mkmf.log +110 -0
  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/ext/unicode_support_version +3 -0
  15. data/init.rb +41 -41
  16. data/lib/IBM_DB.rb +27 -27
  17. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3533 -3452
  18. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -5
  19. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  20. data/lib/mswin32/ibm_db.rb +90 -90
  21. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  22. data/test/active_record/connection_adapters/fake_adapter.rb +49 -49
  23. data/test/assets/example.log +1 -1
  24. data/test/assets/test.txt +1 -1
  25. data/test/cases/adapter_test.rb +351 -351
  26. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -193
  27. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -50
  28. data/test/cases/adapters/mysql2/boolean_test.rb +100 -100
  29. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -63
  30. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -54
  31. data/test/cases/adapters/mysql2/connection_test.rb +210 -210
  32. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -45
  33. data/test/cases/adapters/mysql2/enum_test.rb +26 -26
  34. data/test/cases/adapters/mysql2/explain_test.rb +21 -21
  35. data/test/cases/adapters/mysql2/json_test.rb +195 -195
  36. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -83
  37. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -152
  38. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -59
  39. data/test/cases/adapters/mysql2/schema_test.rb +126 -126
  40. data/test/cases/adapters/mysql2/sp_test.rb +36 -36
  41. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -14
  42. data/test/cases/adapters/mysql2/table_options_test.rb +42 -42
  43. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -66
  44. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -98
  45. data/test/cases/adapters/postgresql/array_test.rb +339 -339
  46. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -82
  47. data/test/cases/adapters/postgresql/bytea_test.rb +134 -134
  48. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -26
  49. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -38
  50. data/test/cases/adapters/postgresql/cidr_test.rb +25 -25
  51. data/test/cases/adapters/postgresql/citext_test.rb +78 -78
  52. data/test/cases/adapters/postgresql/collation_test.rb +53 -53
  53. data/test/cases/adapters/postgresql/composite_test.rb +132 -132
  54. data/test/cases/adapters/postgresql/connection_test.rb +257 -257
  55. data/test/cases/adapters/postgresql/datatype_test.rb +92 -92
  56. data/test/cases/adapters/postgresql/domain_test.rb +47 -47
  57. data/test/cases/adapters/postgresql/enum_test.rb +91 -91
  58. data/test/cases/adapters/postgresql/explain_test.rb +20 -20
  59. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -63
  60. data/test/cases/adapters/postgresql/full_text_test.rb +44 -44
  61. data/test/cases/adapters/postgresql/geometric_test.rb +378 -378
  62. data/test/cases/adapters/postgresql/hstore_test.rb +382 -382
  63. data/test/cases/adapters/postgresql/infinity_test.rb +69 -69
  64. data/test/cases/adapters/postgresql/integer_test.rb +25 -25
  65. data/test/cases/adapters/postgresql/json_test.rb +237 -237
  66. data/test/cases/adapters/postgresql/ltree_test.rb +53 -53
  67. data/test/cases/adapters/postgresql/money_test.rb +96 -96
  68. data/test/cases/adapters/postgresql/network_test.rb +94 -94
  69. data/test/cases/adapters/postgresql/numbers_test.rb +49 -49
  70. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -405
  71. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -22
  72. data/test/cases/adapters/postgresql/quoting_test.rb +44 -44
  73. data/test/cases/adapters/postgresql/range_test.rb +343 -343
  74. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -111
  75. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -34
  76. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -119
  77. data/test/cases/adapters/postgresql/schema_test.rb +597 -597
  78. data/test/cases/adapters/postgresql/serial_test.rb +154 -154
  79. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -41
  80. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -90
  81. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -33
  82. data/test/cases/adapters/postgresql/utils_test.rb +62 -62
  83. data/test/cases/adapters/postgresql/uuid_test.rb +294 -294
  84. data/test/cases/adapters/postgresql/xml_test.rb +54 -54
  85. data/test/cases/adapters/sqlite3/collation_test.rb +53 -53
  86. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -98
  87. data/test/cases/adapters/sqlite3/explain_test.rb +21 -21
  88. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -101
  89. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -441
  90. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -24
  91. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -20
  92. data/test/cases/aggregations_test.rb +168 -168
  93. data/test/cases/ar_schema_test.rb +146 -146
  94. data/test/cases/associations/association_scope_test.rb +16 -16
  95. data/test/cases/associations/belongs_to_associations_test.rb +1141 -1141
  96. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -41
  97. data/test/cases/associations/callbacks_test.rb +190 -190
  98. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  99. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  100. data/test/cases/associations/eager_load_nested_include_test.rb +126 -126
  101. data/test/cases/associations/eager_singularization_test.rb +148 -148
  102. data/test/cases/associations/eager_test.rb +1514 -1514
  103. data/test/cases/associations/extension_test.rb +87 -87
  104. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -1004
  105. data/test/cases/associations/has_many_associations_test.rb +2501 -2501
  106. data/test/cases/associations/has_many_through_associations_test.rb +1271 -1271
  107. data/test/cases/associations/has_one_associations_test.rb +707 -707
  108. data/test/cases/associations/has_one_through_associations_test.rb +383 -383
  109. data/test/cases/associations/inner_join_association_test.rb +139 -139
  110. data/test/cases/associations/inverse_associations_test.rb +733 -733
  111. data/test/cases/associations/join_model_test.rb +777 -777
  112. data/test/cases/associations/left_outer_join_association_test.rb +88 -88
  113. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  114. data/test/cases/associations/required_test.rb +102 -102
  115. data/test/cases/associations_test.rb +385 -385
  116. data/test/cases/attribute_decorators_test.rb +126 -125
  117. data/test/cases/attribute_methods/read_test.rb +60 -60
  118. data/test/cases/attribute_methods_test.rb +1009 -1009
  119. data/test/cases/attribute_set_test.rb +270 -270
  120. data/test/cases/attribute_test.rb +246 -246
  121. data/test/cases/attributes_test.rb +253 -253
  122. data/test/cases/autosave_association_test.rb +1708 -1708
  123. data/test/cases/base_test.rb +1713 -1713
  124. data/test/cases/batches_test.rb +489 -489
  125. data/test/cases/binary_test.rb +44 -44
  126. data/test/cases/bind_parameter_test.rb +110 -110
  127. data/test/cases/cache_key_test.rb +26 -25
  128. data/test/cases/calculations_test.rb +798 -798
  129. data/test/cases/callbacks_test.rb +636 -636
  130. data/test/cases/clone_test.rb +40 -40
  131. data/test/cases/coders/json_test.rb +15 -15
  132. data/test/cases/coders/yaml_column_test.rb +63 -63
  133. data/test/cases/collection_cache_key_test.rb +115 -115
  134. data/test/cases/column_alias_test.rb +17 -17
  135. data/test/cases/column_definition_test.rb +92 -92
  136. data/test/cases/comment_test.rb +145 -143
  137. data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -56
  138. data/test/cases/connection_adapters/connection_handler_test.rb +160 -160
  139. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  140. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -255
  141. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -69
  142. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  143. data/test/cases/connection_adapters/schema_cache_test.rb +61 -61
  144. data/test/cases/connection_adapters/type_lookup_test.rb +118 -118
  145. data/test/cases/connection_management_test.rb +112 -112
  146. data/test/cases/connection_pool_test.rb +521 -521
  147. data/test/cases/connection_specification/resolver_test.rb +131 -131
  148. data/test/cases/core_test.rb +112 -112
  149. data/test/cases/counter_cache_test.rb +214 -214
  150. data/test/cases/custom_locking_test.rb +17 -17
  151. data/test/cases/database_statements_test.rb +34 -34
  152. data/test/cases/date_test.rb +44 -44
  153. data/test/cases/date_time_precision_test.rb +107 -106
  154. data/test/cases/date_time_test.rb +61 -61
  155. data/test/cases/defaults_test.rb +219 -218
  156. data/test/cases/dirty_test.rb +763 -763
  157. data/test/cases/disconnected_test.rb +30 -30
  158. data/test/cases/dup_test.rb +157 -157
  159. data/test/cases/enum_test.rb +444 -444
  160. data/test/cases/errors_test.rb +16 -16
  161. data/test/cases/explain_subscriber_test.rb +64 -64
  162. data/test/cases/explain_test.rb +87 -87
  163. data/test/cases/finder_respond_to_test.rb +60 -60
  164. data/test/cases/finder_test.rb +1294 -1294
  165. data/test/cases/fixture_set/file_test.rb +156 -156
  166. data/test/cases/fixtures_test.rb +988 -988
  167. data/test/cases/forbidden_attributes_protection_test.rb +165 -165
  168. data/test/cases/habtm_destroy_order_test.rb +61 -61
  169. data/test/cases/helper.rb +204 -204
  170. data/test/cases/hot_compatibility_test.rb +142 -142
  171. data/test/cases/i18n_test.rb +45 -45
  172. data/test/cases/inheritance_test.rb +606 -606
  173. data/test/cases/integration_test.rb +155 -155
  174. data/test/cases/invalid_connection_test.rb +24 -24
  175. data/test/cases/invertible_migration_test.rb +387 -387
  176. data/test/cases/json_serialization_test.rb +311 -311
  177. data/test/cases/locking_test.rb +493 -493
  178. data/test/cases/log_subscriber_test.rb +225 -225
  179. data/test/cases/migration/change_schema_test.rb +458 -458
  180. data/test/cases/migration/change_table_test.rb +256 -256
  181. data/test/cases/migration/column_attributes_test.rb +176 -176
  182. data/test/cases/migration/column_positioning_test.rb +56 -56
  183. data/test/cases/migration/columns_test.rb +310 -310
  184. data/test/cases/migration/command_recorder_test.rb +350 -350
  185. data/test/cases/migration/compatibility_test.rb +118 -118
  186. data/test/cases/migration/create_join_table_test.rb +157 -157
  187. data/test/cases/migration/foreign_key_test.rb +362 -360
  188. data/test/cases/migration/helper.rb +39 -39
  189. data/test/cases/migration/index_test.rb +218 -218
  190. data/test/cases/migration/logger_test.rb +36 -36
  191. data/test/cases/migration/pending_migrations_test.rb +52 -52
  192. data/test/cases/migration/references_foreign_key_test.rb +221 -216
  193. data/test/cases/migration/references_index_test.rb +101 -101
  194. data/test/cases/migration/references_statements_test.rb +136 -136
  195. data/test/cases/migration/rename_table_test.rb +93 -93
  196. data/test/cases/migration_test.rb +1157 -1157
  197. data/test/cases/migrator_test.rb +471 -470
  198. data/test/cases/mixin_test.rb +68 -68
  199. data/test/cases/modules_test.rb +172 -172
  200. data/test/cases/multiparameter_attributes_test.rb +372 -372
  201. data/test/cases/multiple_db_test.rb +122 -122
  202. data/test/cases/nested_attributes_test.rb +1098 -1098
  203. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  204. data/test/cases/persistence_test.rb +1001 -1001
  205. data/test/cases/pooled_connections_test.rb +81 -81
  206. data/test/cases/primary_keys_test.rb +376 -376
  207. data/test/cases/query_cache_test.rb +446 -446
  208. data/test/cases/quoting_test.rb +202 -202
  209. data/test/cases/readonly_test.rb +119 -119
  210. data/test/cases/reaper_test.rb +85 -85
  211. data/test/cases/reflection_test.rb +509 -509
  212. data/test/cases/relation/delegation_test.rb +63 -63
  213. data/test/cases/relation/merging_test.rb +157 -157
  214. data/test/cases/relation/mutation_test.rb +183 -183
  215. data/test/cases/relation/or_test.rb +92 -92
  216. data/test/cases/relation/predicate_builder_test.rb +16 -16
  217. data/test/cases/relation/record_fetch_warning_test.rb +40 -40
  218. data/test/cases/relation/where_chain_test.rb +105 -105
  219. data/test/cases/relation/where_clause_test.rb +182 -182
  220. data/test/cases/relation/where_test.rb +322 -322
  221. data/test/cases/relation_test.rb +328 -328
  222. data/test/cases/relations_test.rb +2026 -2026
  223. data/test/cases/reload_models_test.rb +22 -22
  224. data/test/cases/result_test.rb +90 -90
  225. data/test/cases/sanitize_test.rb +176 -176
  226. data/test/cases/schema_dumper_test.rb +457 -457
  227. data/test/cases/schema_loading_test.rb +52 -52
  228. data/test/cases/scoping/default_scoping_test.rb +528 -528
  229. data/test/cases/scoping/named_scoping_test.rb +561 -561
  230. data/test/cases/scoping/relation_scoping_test.rb +400 -400
  231. data/test/cases/secure_token_test.rb +32 -32
  232. data/test/cases/serialization_test.rb +104 -104
  233. data/test/cases/serialized_attribute_test.rb +364 -364
  234. data/test/cases/statement_cache_test.rb +136 -136
  235. data/test/cases/store_test.rb +195 -195
  236. data/test/cases/suppressor_test.rb +63 -63
  237. data/test/cases/tasks/database_tasks_test.rb +462 -462
  238. data/test/cases/tasks/mysql_rake_test.rb +345 -345
  239. data/test/cases/tasks/postgresql_rake_test.rb +304 -304
  240. data/test/cases/tasks/sqlite_rake_test.rb +220 -220
  241. data/test/cases/test_case.rb +131 -131
  242. data/test/cases/test_fixtures_test.rb +36 -36
  243. data/test/cases/time_precision_test.rb +103 -102
  244. data/test/cases/timestamp_test.rb +501 -501
  245. data/test/cases/touch_later_test.rb +121 -121
  246. data/test/cases/transaction_callbacks_test.rb +518 -518
  247. data/test/cases/transaction_isolation_test.rb +106 -106
  248. data/test/cases/transactions_test.rb +835 -834
  249. data/test/cases/type/adapter_specific_registry_test.rb +133 -133
  250. data/test/cases/type/date_time_test.rb +14 -14
  251. data/test/cases/type/integer_test.rb +27 -27
  252. data/test/cases/type/string_test.rb +22 -22
  253. data/test/cases/type/type_map_test.rb +177 -177
  254. data/test/cases/type_test.rb +39 -39
  255. data/test/cases/types_test.rb +24 -24
  256. data/test/cases/unconnected_test.rb +33 -33
  257. data/test/cases/validations/absence_validation_test.rb +73 -73
  258. data/test/cases/validations/association_validation_test.rb +97 -97
  259. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  260. data/test/cases/validations/i18n_validation_test.rb +86 -86
  261. data/test/cases/validations/length_validation_test.rb +79 -79
  262. data/test/cases/validations/presence_validation_test.rb +103 -103
  263. data/test/cases/validations/uniqueness_validation_test.rb +548 -548
  264. data/test/cases/validations_repair_helper.rb +19 -19
  265. data/test/cases/validations_test.rb +194 -194
  266. data/test/cases/view_test.rb +216 -216
  267. data/test/cases/yaml_serialization_test.rb +121 -121
  268. data/test/config.example.yml +97 -97
  269. data/test/config.rb +5 -5
  270. data/test/connections/native_ibm_db/connection.rb +44 -0
  271. data/test/fixtures/accounts.yml +29 -29
  272. data/test/fixtures/admin/accounts.yml +2 -2
  273. data/test/fixtures/admin/users.yml +10 -10
  274. data/test/fixtures/author_addresses.yml +17 -17
  275. data/test/fixtures/author_favorites.yml +3 -3
  276. data/test/fixtures/authors.yml +23 -23
  277. data/test/fixtures/bad_posts.yml +9 -9
  278. data/test/fixtures/binaries.yml +133 -133
  279. data/test/fixtures/books.yml +31 -31
  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 -3
  295. data/test/fixtures/content_positions.yml +3 -3
  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 -5
  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 -4
  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 -2
  333. data/test/fixtures/naked/yml/trees.yml +3 -3
  334. data/test/fixtures/nodes.yml +29 -29
  335. data/test/fixtures/organizations.yml +5 -5
  336. data/test/fixtures/other_comments.yml +6 -6
  337. data/test/fixtures/other_dogs.yml +2 -2
  338. data/test/fixtures/other_posts.yml +7 -7
  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 +12 -15
  347. data/test/fixtures/posts.yml +80 -80
  348. data/test/fixtures/price_estimates.yml +16 -16
  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 -3
  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/user.rb +40 -40
  414. data/test/models/aircraft.rb +5 -5
  415. data/test/models/arunit2_model.rb +3 -3
  416. data/test/models/author.rb +209 -209
  417. data/test/models/auto_id.rb +4 -4
  418. data/test/models/autoloadable/extra_firm.rb +2 -2
  419. data/test/models/binary.rb +2 -2
  420. data/test/models/bird.rb +12 -12
  421. data/test/models/book.rb +23 -23
  422. data/test/models/boolean.rb +2 -2
  423. data/test/models/bulb.rb +52 -52
  424. data/test/models/cake_designer.rb +3 -3
  425. data/test/models/car.rb +29 -29
  426. data/test/models/carrier.rb +2 -2
  427. data/test/models/cat.rb +10 -10
  428. data/test/models/categorization.rb +19 -19
  429. data/test/models/category.rb +35 -35
  430. data/test/models/chef.rb +8 -8
  431. data/test/models/citation.rb +3 -3
  432. data/test/models/club.rb +25 -25
  433. data/test/models/college.rb +10 -10
  434. data/test/models/column.rb +3 -3
  435. data/test/models/column_name.rb +3 -3
  436. data/test/models/comment.rb +76 -76
  437. data/test/models/company.rb +230 -230
  438. data/test/models/company_in_module.rb +98 -98
  439. data/test/models/computer.rb +3 -3
  440. data/test/models/contact.rb +41 -41
  441. data/test/models/content.rb +40 -40
  442. data/test/models/contract.rb +20 -20
  443. data/test/models/country.rb +7 -7
  444. data/test/models/course.rb +6 -6
  445. data/test/models/customer.rb +83 -83
  446. data/test/models/customer_carrier.rb +14 -14
  447. data/test/models/dashboard.rb +3 -3
  448. data/test/models/default.rb +2 -2
  449. data/test/models/department.rb +4 -4
  450. data/test/models/developer.rb +274 -274
  451. data/test/models/dog.rb +5 -5
  452. data/test/models/dog_lover.rb +5 -5
  453. data/test/models/doubloon.rb +12 -12
  454. data/test/models/drink_designer.rb +3 -3
  455. data/test/models/edge.rb +5 -5
  456. data/test/models/electron.rb +5 -5
  457. data/test/models/engine.rb +4 -4
  458. data/test/models/entrant.rb +3 -3
  459. data/test/models/essay.rb +5 -5
  460. data/test/models/event.rb +3 -3
  461. data/test/models/eye.rb +37 -37
  462. data/test/models/face.rb +9 -9
  463. data/test/models/friendship.rb +6 -6
  464. data/test/models/guid.rb +2 -2
  465. data/test/models/guitar.rb +4 -4
  466. data/test/models/hotel.rb +11 -11
  467. data/test/models/image.rb +3 -3
  468. data/test/models/interest.rb +5 -5
  469. data/test/models/invoice.rb +4 -4
  470. data/test/models/item.rb +7 -7
  471. data/test/models/job.rb +7 -7
  472. data/test/models/joke.rb +7 -7
  473. data/test/models/keyboard.rb +3 -3
  474. data/test/models/legacy_thing.rb +3 -3
  475. data/test/models/lesson.rb +11 -11
  476. data/test/models/line_item.rb +3 -3
  477. data/test/models/liquid.rb +4 -4
  478. data/test/models/man.rb +11 -11
  479. data/test/models/matey.rb +4 -4
  480. data/test/models/member.rb +42 -42
  481. data/test/models/member_detail.rb +8 -8
  482. data/test/models/member_type.rb +3 -3
  483. data/test/models/membership.rb +35 -35
  484. data/test/models/mentor.rb +2 -2
  485. data/test/models/minimalistic.rb +2 -2
  486. data/test/models/minivan.rb +9 -9
  487. data/test/models/mixed_case_monkey.rb +3 -3
  488. data/test/models/mocktail_designer.rb +2 -2
  489. data/test/models/molecule.rb +6 -6
  490. data/test/models/movie.rb +5 -5
  491. data/test/models/node.rb +5 -5
  492. data/test/models/non_primary_key.rb +2 -2
  493. data/test/models/notification.rb +3 -3
  494. data/test/models/order.rb +4 -4
  495. data/test/models/organization.rb +14 -14
  496. data/test/models/other_dog.rb +5 -5
  497. data/test/models/owner.rb +37 -37
  498. data/test/models/parrot.rb +28 -28
  499. data/test/models/person.rb +142 -142
  500. data/test/models/personal_legacy_thing.rb +4 -4
  501. data/test/models/pet.rb +18 -18
  502. data/test/models/pet_treasure.rb +6 -6
  503. data/test/models/pirate.rb +92 -92
  504. data/test/models/possession.rb +3 -3
  505. data/test/models/post.rb +273 -273
  506. data/test/models/price_estimate.rb +4 -4
  507. data/test/models/professor.rb +5 -5
  508. data/test/models/project.rb +40 -40
  509. data/test/models/publisher.rb +2 -2
  510. data/test/models/publisher/article.rb +4 -4
  511. data/test/models/publisher/magazine.rb +3 -3
  512. data/test/models/rating.rb +4 -4
  513. data/test/models/reader.rb +23 -23
  514. data/test/models/recipe.rb +3 -3
  515. data/test/models/record.rb +2 -2
  516. data/test/models/reference.rb +22 -22
  517. data/test/models/reply.rb +61 -61
  518. data/test/models/ship.rb +39 -39
  519. data/test/models/ship_part.rb +8 -8
  520. data/test/models/shop.rb +17 -17
  521. data/test/models/shop_account.rb +6 -6
  522. data/test/models/speedometer.rb +6 -6
  523. data/test/models/sponsor.rb +7 -7
  524. data/test/models/string_key_object.rb +3 -3
  525. data/test/models/student.rb +4 -4
  526. data/test/models/subject.rb +16 -16
  527. data/test/models/subscriber.rb +8 -8
  528. data/test/models/subscription.rb +4 -4
  529. data/test/models/tag.rb +13 -13
  530. data/test/models/tagging.rb +13 -13
  531. data/test/models/task.rb +5 -5
  532. data/test/models/topic.rb +118 -118
  533. data/test/models/toy.rb +6 -6
  534. data/test/models/traffic_light.rb +4 -4
  535. data/test/models/treasure.rb +14 -14
  536. data/test/models/treaty.rb +7 -7
  537. data/test/models/tree.rb +3 -3
  538. data/test/models/tuning_peg.rb +4 -4
  539. data/test/models/tyre.rb +11 -11
  540. data/test/models/user.rb +14 -14
  541. data/test/models/uuid_child.rb +3 -3
  542. data/test/models/uuid_item.rb +6 -6
  543. data/test/models/uuid_parent.rb +3 -3
  544. data/test/models/vegetables.rb +24 -24
  545. data/test/models/vehicle.rb +6 -6
  546. data/test/models/vertex.rb +9 -9
  547. data/test/models/warehouse_thing.rb +5 -5
  548. data/test/models/wheel.rb +3 -3
  549. data/test/models/without_table.rb +3 -3
  550. data/test/models/zine.rb +3 -3
  551. data/test/schema/i5/ibm_db_specific_schema.rb +137 -0
  552. data/test/schema/ids/ibm_db_specific_schema.rb +140 -0
  553. data/test/schema/luw/ibm_db_specific_schema.rb +137 -0
  554. data/test/schema/mysql2_specific_schema.rb +68 -68
  555. data/test/schema/oracle_specific_schema.rb +40 -40
  556. data/test/schema/postgresql_specific_schema.rb +114 -114
  557. data/test/schema/schema.rb +1057 -1057
  558. data/test/schema/schema.rb.original +1057 -1057
  559. data/test/schema/sqlite_specific_schema.rb +18 -18
  560. data/test/schema/zOS/ibm_db_specific_schema.rb +208 -0
  561. data/test/support/config.rb +43 -43
  562. data/test/support/connection.rb +23 -23
  563. data/test/support/connection_helper.rb +14 -14
  564. data/test/support/ddl_helper.rb +8 -8
  565. data/test/support/schema_dumping_helper.rb +20 -20
  566. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -22
  567. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -182
  568. metadata +24 -13
  569. data/test/fixtures/author_addresses.original +0 -11
  570. data/test/fixtures/authors.original +0 -17
@@ -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
- 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
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