ibm_db 4.0.0-x86-mingw32 → 5.1.0-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (576) 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.h +3 -0
  9. data/ext/ibm_db-i386-mingw32.def +2 -0
  10. data/ext/ibm_db.c +11879 -11887
  11. data/ext/ibm_db.o +0 -0
  12. data/ext/ibm_db.so +0 -0
  13. data/ext/mkmf.log +110 -0
  14. data/ext/ruby_ibm_db.h +241 -241
  15. data/ext/ruby_ibm_db_cli.c +866 -866
  16. data/ext/ruby_ibm_db_cli.h +500 -500
  17. data/ext/ruby_ibm_db_cli.o +0 -0
  18. data/ext/unicode_support_version.h +3 -0
  19. data/init.rb +41 -41
  20. data/lib/IBM_DB.rb +27 -27
  21. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3593 -3452
  22. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -5
  23. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  24. data/lib/mswin32/ibm_db.rb +94 -90
  25. data/lib/mswin32/rb2x/i386/ruby26/ibm_db.so +0 -0
  26. data/lib/mswin32/rb2x/i386/ruby27/ibm_db.so +0 -0
  27. data/test/active_record/connection_adapters/fake_adapter.rb +49 -49
  28. data/test/assets/example.log +1 -1
  29. data/test/assets/test.txt +1 -1
  30. data/test/cases/adapter_test.rb +351 -351
  31. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -193
  32. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -50
  33. data/test/cases/adapters/mysql2/boolean_test.rb +100 -100
  34. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -63
  35. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -54
  36. data/test/cases/adapters/mysql2/connection_test.rb +210 -210
  37. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -45
  38. data/test/cases/adapters/mysql2/enum_test.rb +26 -26
  39. data/test/cases/adapters/mysql2/explain_test.rb +21 -21
  40. data/test/cases/adapters/mysql2/json_test.rb +195 -195
  41. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -83
  42. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -152
  43. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -59
  44. data/test/cases/adapters/mysql2/schema_test.rb +126 -126
  45. data/test/cases/adapters/mysql2/sp_test.rb +36 -36
  46. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -14
  47. data/test/cases/adapters/mysql2/table_options_test.rb +42 -42
  48. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -66
  49. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -98
  50. data/test/cases/adapters/postgresql/array_test.rb +339 -339
  51. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -82
  52. data/test/cases/adapters/postgresql/bytea_test.rb +134 -134
  53. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -26
  54. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -38
  55. data/test/cases/adapters/postgresql/cidr_test.rb +25 -25
  56. data/test/cases/adapters/postgresql/citext_test.rb +78 -78
  57. data/test/cases/adapters/postgresql/collation_test.rb +53 -53
  58. data/test/cases/adapters/postgresql/composite_test.rb +132 -132
  59. data/test/cases/adapters/postgresql/connection_test.rb +257 -257
  60. data/test/cases/adapters/postgresql/datatype_test.rb +92 -92
  61. data/test/cases/adapters/postgresql/domain_test.rb +47 -47
  62. data/test/cases/adapters/postgresql/enum_test.rb +91 -91
  63. data/test/cases/adapters/postgresql/explain_test.rb +20 -20
  64. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -63
  65. data/test/cases/adapters/postgresql/full_text_test.rb +44 -44
  66. data/test/cases/adapters/postgresql/geometric_test.rb +378 -378
  67. data/test/cases/adapters/postgresql/hstore_test.rb +382 -382
  68. data/test/cases/adapters/postgresql/infinity_test.rb +69 -69
  69. data/test/cases/adapters/postgresql/integer_test.rb +25 -25
  70. data/test/cases/adapters/postgresql/json_test.rb +237 -237
  71. data/test/cases/adapters/postgresql/ltree_test.rb +53 -53
  72. data/test/cases/adapters/postgresql/money_test.rb +96 -96
  73. data/test/cases/adapters/postgresql/network_test.rb +94 -94
  74. data/test/cases/adapters/postgresql/numbers_test.rb +49 -49
  75. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -405
  76. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -22
  77. data/test/cases/adapters/postgresql/quoting_test.rb +44 -44
  78. data/test/cases/adapters/postgresql/range_test.rb +343 -343
  79. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -111
  80. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -34
  81. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -119
  82. data/test/cases/adapters/postgresql/schema_test.rb +597 -597
  83. data/test/cases/adapters/postgresql/serial_test.rb +154 -154
  84. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -41
  85. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -90
  86. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -33
  87. data/test/cases/adapters/postgresql/utils_test.rb +62 -62
  88. data/test/cases/adapters/postgresql/uuid_test.rb +294 -294
  89. data/test/cases/adapters/postgresql/xml_test.rb +54 -54
  90. data/test/cases/adapters/sqlite3/collation_test.rb +53 -53
  91. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -98
  92. data/test/cases/adapters/sqlite3/explain_test.rb +21 -21
  93. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -101
  94. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -441
  95. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -24
  96. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -20
  97. data/test/cases/aggregations_test.rb +168 -168
  98. data/test/cases/ar_schema_test.rb +146 -146
  99. data/test/cases/associations/association_scope_test.rb +16 -16
  100. data/test/cases/associations/belongs_to_associations_test.rb +1141 -1141
  101. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -41
  102. data/test/cases/associations/callbacks_test.rb +190 -190
  103. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  104. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  105. data/test/cases/associations/eager_load_nested_include_test.rb +126 -126
  106. data/test/cases/associations/eager_singularization_test.rb +148 -148
  107. data/test/cases/associations/eager_test.rb +1514 -1514
  108. data/test/cases/associations/extension_test.rb +87 -87
  109. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -1004
  110. data/test/cases/associations/has_many_associations_test.rb +2501 -2501
  111. data/test/cases/associations/has_many_through_associations_test.rb +1271 -1271
  112. data/test/cases/associations/has_one_associations_test.rb +707 -707
  113. data/test/cases/associations/has_one_through_associations_test.rb +383 -383
  114. data/test/cases/associations/inner_join_association_test.rb +139 -139
  115. data/test/cases/associations/inverse_associations_test.rb +733 -733
  116. data/test/cases/associations/join_model_test.rb +777 -777
  117. data/test/cases/associations/left_outer_join_association_test.rb +88 -88
  118. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  119. data/test/cases/associations/required_test.rb +102 -102
  120. data/test/cases/associations_test.rb +385 -385
  121. data/test/cases/attribute_decorators_test.rb +126 -125
  122. data/test/cases/attribute_methods/read_test.rb +60 -60
  123. data/test/cases/attribute_methods_test.rb +1009 -1009
  124. data/test/cases/attribute_set_test.rb +270 -270
  125. data/test/cases/attribute_test.rb +246 -246
  126. data/test/cases/attributes_test.rb +253 -253
  127. data/test/cases/autosave_association_test.rb +1708 -1708
  128. data/test/cases/base_test.rb +1713 -1713
  129. data/test/cases/batches_test.rb +489 -489
  130. data/test/cases/binary_test.rb +44 -44
  131. data/test/cases/bind_parameter_test.rb +110 -110
  132. data/test/cases/cache_key_test.rb +26 -25
  133. data/test/cases/calculations_test.rb +798 -798
  134. data/test/cases/callbacks_test.rb +636 -636
  135. data/test/cases/clone_test.rb +40 -40
  136. data/test/cases/coders/json_test.rb +15 -15
  137. data/test/cases/coders/yaml_column_test.rb +63 -63
  138. data/test/cases/collection_cache_key_test.rb +115 -115
  139. data/test/cases/column_alias_test.rb +17 -17
  140. data/test/cases/column_definition_test.rb +92 -92
  141. data/test/cases/comment_test.rb +145 -143
  142. data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -56
  143. data/test/cases/connection_adapters/connection_handler_test.rb +160 -160
  144. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  145. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -255
  146. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -69
  147. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  148. data/test/cases/connection_adapters/schema_cache_test.rb +61 -61
  149. data/test/cases/connection_adapters/type_lookup_test.rb +118 -118
  150. data/test/cases/connection_management_test.rb +112 -112
  151. data/test/cases/connection_pool_test.rb +521 -521
  152. data/test/cases/connection_specification/resolver_test.rb +131 -131
  153. data/test/cases/core_test.rb +112 -112
  154. data/test/cases/counter_cache_test.rb +214 -214
  155. data/test/cases/custom_locking_test.rb +17 -17
  156. data/test/cases/database_statements_test.rb +34 -34
  157. data/test/cases/date_test.rb +44 -44
  158. data/test/cases/date_time_precision_test.rb +107 -106
  159. data/test/cases/date_time_test.rb +61 -61
  160. data/test/cases/defaults_test.rb +219 -218
  161. data/test/cases/dirty_test.rb +763 -763
  162. data/test/cases/disconnected_test.rb +30 -30
  163. data/test/cases/dup_test.rb +157 -157
  164. data/test/cases/enum_test.rb +444 -444
  165. data/test/cases/errors_test.rb +16 -16
  166. data/test/cases/explain_subscriber_test.rb +64 -64
  167. data/test/cases/explain_test.rb +87 -87
  168. data/test/cases/finder_respond_to_test.rb +60 -60
  169. data/test/cases/finder_test.rb +1294 -1294
  170. data/test/cases/fixture_set/file_test.rb +156 -156
  171. data/test/cases/fixtures_test.rb +988 -988
  172. data/test/cases/forbidden_attributes_protection_test.rb +165 -165
  173. data/test/cases/habtm_destroy_order_test.rb +61 -61
  174. data/test/cases/helper.rb +204 -204
  175. data/test/cases/hot_compatibility_test.rb +142 -142
  176. data/test/cases/i18n_test.rb +45 -45
  177. data/test/cases/inheritance_test.rb +606 -606
  178. data/test/cases/integration_test.rb +155 -155
  179. data/test/cases/invalid_connection_test.rb +24 -24
  180. data/test/cases/invertible_migration_test.rb +387 -387
  181. data/test/cases/json_serialization_test.rb +311 -311
  182. data/test/cases/locking_test.rb +493 -493
  183. data/test/cases/log_subscriber_test.rb +225 -225
  184. data/test/cases/migration/change_schema_test.rb +458 -458
  185. data/test/cases/migration/change_table_test.rb +256 -256
  186. data/test/cases/migration/column_attributes_test.rb +176 -176
  187. data/test/cases/migration/column_positioning_test.rb +56 -56
  188. data/test/cases/migration/columns_test.rb +310 -310
  189. data/test/cases/migration/command_recorder_test.rb +350 -350
  190. data/test/cases/migration/compatibility_test.rb +118 -118
  191. data/test/cases/migration/create_join_table_test.rb +157 -157
  192. data/test/cases/migration/foreign_key_test.rb +362 -360
  193. data/test/cases/migration/helper.rb +39 -39
  194. data/test/cases/migration/index_test.rb +218 -218
  195. data/test/cases/migration/logger_test.rb +36 -36
  196. data/test/cases/migration/pending_migrations_test.rb +52 -52
  197. data/test/cases/migration/references_foreign_key_test.rb +221 -216
  198. data/test/cases/migration/references_index_test.rb +101 -101
  199. data/test/cases/migration/references_statements_test.rb +136 -136
  200. data/test/cases/migration/rename_table_test.rb +93 -93
  201. data/test/cases/migration_test.rb +1157 -1157
  202. data/test/cases/migrator_test.rb +471 -470
  203. data/test/cases/mixin_test.rb +68 -68
  204. data/test/cases/modules_test.rb +172 -172
  205. data/test/cases/multiparameter_attributes_test.rb +372 -372
  206. data/test/cases/multiple_db_test.rb +122 -122
  207. data/test/cases/nested_attributes_test.rb +1098 -1098
  208. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  209. data/test/cases/persistence_test.rb +1001 -1001
  210. data/test/cases/pooled_connections_test.rb +81 -81
  211. data/test/cases/primary_keys_test.rb +376 -376
  212. data/test/cases/query_cache_test.rb +446 -446
  213. data/test/cases/quoting_test.rb +202 -202
  214. data/test/cases/readonly_test.rb +119 -119
  215. data/test/cases/reaper_test.rb +85 -85
  216. data/test/cases/reflection_test.rb +509 -509
  217. data/test/cases/relation/delegation_test.rb +63 -63
  218. data/test/cases/relation/merging_test.rb +157 -157
  219. data/test/cases/relation/mutation_test.rb +183 -183
  220. data/test/cases/relation/or_test.rb +92 -92
  221. data/test/cases/relation/predicate_builder_test.rb +16 -16
  222. data/test/cases/relation/record_fetch_warning_test.rb +40 -40
  223. data/test/cases/relation/where_chain_test.rb +105 -105
  224. data/test/cases/relation/where_clause_test.rb +182 -182
  225. data/test/cases/relation/where_test.rb +322 -322
  226. data/test/cases/relation_test.rb +328 -328
  227. data/test/cases/relations_test.rb +2026 -2026
  228. data/test/cases/reload_models_test.rb +22 -22
  229. data/test/cases/result_test.rb +90 -90
  230. data/test/cases/sanitize_test.rb +176 -176
  231. data/test/cases/schema_dumper_test.rb +457 -457
  232. data/test/cases/schema_loading_test.rb +52 -52
  233. data/test/cases/scoping/default_scoping_test.rb +528 -528
  234. data/test/cases/scoping/named_scoping_test.rb +561 -561
  235. data/test/cases/scoping/relation_scoping_test.rb +400 -400
  236. data/test/cases/secure_token_test.rb +32 -32
  237. data/test/cases/serialization_test.rb +104 -104
  238. data/test/cases/serialized_attribute_test.rb +364 -364
  239. data/test/cases/statement_cache_test.rb +136 -136
  240. data/test/cases/store_test.rb +195 -195
  241. data/test/cases/suppressor_test.rb +63 -63
  242. data/test/cases/tasks/database_tasks_test.rb +462 -462
  243. data/test/cases/tasks/mysql_rake_test.rb +345 -345
  244. data/test/cases/tasks/postgresql_rake_test.rb +304 -304
  245. data/test/cases/tasks/sqlite_rake_test.rb +220 -220
  246. data/test/cases/test_case.rb +131 -131
  247. data/test/cases/test_fixtures_test.rb +36 -36
  248. data/test/cases/time_precision_test.rb +103 -102
  249. data/test/cases/timestamp_test.rb +501 -501
  250. data/test/cases/touch_later_test.rb +121 -121
  251. data/test/cases/transaction_callbacks_test.rb +518 -518
  252. data/test/cases/transaction_isolation_test.rb +106 -106
  253. data/test/cases/transactions_test.rb +835 -834
  254. data/test/cases/type/adapter_specific_registry_test.rb +133 -133
  255. data/test/cases/type/date_time_test.rb +14 -14
  256. data/test/cases/type/integer_test.rb +27 -27
  257. data/test/cases/type/string_test.rb +22 -22
  258. data/test/cases/type/type_map_test.rb +177 -177
  259. data/test/cases/type_test.rb +39 -39
  260. data/test/cases/types_test.rb +24 -24
  261. data/test/cases/unconnected_test.rb +33 -33
  262. data/test/cases/validations/absence_validation_test.rb +73 -73
  263. data/test/cases/validations/association_validation_test.rb +97 -97
  264. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  265. data/test/cases/validations/i18n_validation_test.rb +86 -86
  266. data/test/cases/validations/length_validation_test.rb +79 -79
  267. data/test/cases/validations/presence_validation_test.rb +103 -103
  268. data/test/cases/validations/uniqueness_validation_test.rb +548 -548
  269. data/test/cases/validations_repair_helper.rb +19 -19
  270. data/test/cases/validations_test.rb +194 -194
  271. data/test/cases/view_test.rb +216 -216
  272. data/test/cases/yaml_serialization_test.rb +121 -121
  273. data/test/config.example.yml +97 -97
  274. data/test/config.rb +5 -5
  275. data/test/connections/native_ibm_db/connection.rb +44 -0
  276. data/test/fixtures/accounts.yml +29 -29
  277. data/test/fixtures/admin/accounts.yml +2 -2
  278. data/test/fixtures/admin/users.yml +10 -10
  279. data/test/fixtures/author_addresses.yml +17 -17
  280. data/test/fixtures/author_favorites.yml +3 -3
  281. data/test/fixtures/authors.yml +23 -23
  282. data/test/fixtures/bad_posts.yml +9 -9
  283. data/test/fixtures/binaries.yml +133 -133
  284. data/test/fixtures/books.yml +31 -31
  285. data/test/fixtures/bulbs.yml +5 -5
  286. data/test/fixtures/cars.yml +9 -9
  287. data/test/fixtures/categories.yml +19 -19
  288. data/test/fixtures/categories/special_categories.yml +9 -9
  289. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  290. data/test/fixtures/categories_ordered.yml +7 -7
  291. data/test/fixtures/categories_posts.yml +31 -31
  292. data/test/fixtures/categorizations.yml +23 -23
  293. data/test/fixtures/clubs.yml +8 -8
  294. data/test/fixtures/collections.yml +3 -3
  295. data/test/fixtures/colleges.yml +3 -3
  296. data/test/fixtures/comments.yml +65 -65
  297. data/test/fixtures/companies.yml +67 -67
  298. data/test/fixtures/computers.yml +10 -10
  299. data/test/fixtures/content.yml +3 -3
  300. data/test/fixtures/content_positions.yml +3 -3
  301. data/test/fixtures/courses.yml +8 -8
  302. data/test/fixtures/customers.yml +25 -25
  303. data/test/fixtures/dashboards.yml +6 -6
  304. data/test/fixtures/dead_parrots.yml +5 -5
  305. data/test/fixtures/developers.yml +22 -22
  306. data/test/fixtures/developers_projects.yml +16 -16
  307. data/test/fixtures/dog_lovers.yml +7 -7
  308. data/test/fixtures/dogs.yml +4 -4
  309. data/test/fixtures/doubloons.yml +3 -3
  310. data/test/fixtures/edges.yml +5 -5
  311. data/test/fixtures/entrants.yml +14 -14
  312. data/test/fixtures/essays.yml +6 -6
  313. data/test/fixtures/faces.yml +11 -11
  314. data/test/fixtures/fk_test_has_fk.yml +3 -3
  315. data/test/fixtures/fk_test_has_pk.yml +1 -1
  316. data/test/fixtures/friendships.yml +4 -4
  317. data/test/fixtures/funny_jokes.yml +10 -10
  318. data/test/fixtures/interests.yml +33 -33
  319. data/test/fixtures/items.yml +3 -3
  320. data/test/fixtures/jobs.yml +7 -7
  321. data/test/fixtures/legacy_things.yml +3 -3
  322. data/test/fixtures/live_parrots.yml +4 -4
  323. data/test/fixtures/mateys.yml +4 -4
  324. data/test/fixtures/member_details.yml +8 -8
  325. data/test/fixtures/member_types.yml +6 -6
  326. data/test/fixtures/members.yml +11 -11
  327. data/test/fixtures/memberships.yml +34 -34
  328. data/test/fixtures/men.yml +5 -5
  329. data/test/fixtures/minimalistics.yml +2 -2
  330. data/test/fixtures/minivans.yml +5 -5
  331. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  332. data/test/fixtures/mixins.yml +29 -29
  333. data/test/fixtures/movies.yml +7 -7
  334. data/test/fixtures/naked/yml/accounts.yml +1 -1
  335. data/test/fixtures/naked/yml/companies.yml +1 -1
  336. data/test/fixtures/naked/yml/courses.yml +1 -1
  337. data/test/fixtures/naked/yml/parrots.yml +2 -2
  338. data/test/fixtures/naked/yml/trees.yml +3 -3
  339. data/test/fixtures/nodes.yml +29 -29
  340. data/test/fixtures/organizations.yml +5 -5
  341. data/test/fixtures/other_comments.yml +6 -6
  342. data/test/fixtures/other_dogs.yml +2 -2
  343. data/test/fixtures/other_posts.yml +7 -7
  344. data/test/fixtures/other_topics.yml +42 -42
  345. data/test/fixtures/owners.yml +9 -9
  346. data/test/fixtures/parrots.yml +27 -27
  347. data/test/fixtures/parrots_pirates.yml +7 -7
  348. data/test/fixtures/people.yml +24 -24
  349. data/test/fixtures/peoples_treasures.yml +3 -3
  350. data/test/fixtures/pets.yml +19 -19
  351. data/test/fixtures/pirates.yml +12 -15
  352. data/test/fixtures/posts.yml +80 -80
  353. data/test/fixtures/price_estimates.yml +16 -16
  354. data/test/fixtures/products.yml +4 -4
  355. data/test/fixtures/projects.yml +7 -7
  356. data/test/fixtures/ratings.yml +14 -14
  357. data/test/fixtures/readers.yml +11 -11
  358. data/test/fixtures/references.yml +17 -17
  359. data/test/fixtures/reserved_words/distinct.yml +5 -5
  360. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  361. data/test/fixtures/reserved_words/group.yml +14 -14
  362. data/test/fixtures/reserved_words/select.yml +8 -8
  363. data/test/fixtures/reserved_words/values.yml +7 -7
  364. data/test/fixtures/ships.yml +6 -6
  365. data/test/fixtures/speedometers.yml +8 -8
  366. data/test/fixtures/sponsors.yml +12 -12
  367. data/test/fixtures/string_key_objects.yml +7 -7
  368. data/test/fixtures/subscribers.yml +10 -10
  369. data/test/fixtures/subscriptions.yml +12 -12
  370. data/test/fixtures/taggings.yml +78 -78
  371. data/test/fixtures/tags.yml +11 -11
  372. data/test/fixtures/tasks.yml +7 -7
  373. data/test/fixtures/teapots.yml +3 -3
  374. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  375. data/test/fixtures/to_be_linked/users.yml +10 -10
  376. data/test/fixtures/topics.yml +49 -49
  377. data/test/fixtures/toys.yml +14 -14
  378. data/test/fixtures/traffic_lights.yml +9 -9
  379. data/test/fixtures/treasures.yml +10 -10
  380. data/test/fixtures/trees.yml +3 -3
  381. data/test/fixtures/uuid_children.yml +3 -3
  382. data/test/fixtures/uuid_parents.yml +2 -2
  383. data/test/fixtures/variants.yml +4 -4
  384. data/test/fixtures/vegetables.yml +19 -19
  385. data/test/fixtures/vertices.yml +3 -3
  386. data/test/fixtures/warehouse_things.yml +2 -2
  387. data/test/fixtures/zines.yml +5 -5
  388. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  389. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  390. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  391. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -9
  392. data/test/migrations/missing/1_people_have_last_names.rb +9 -9
  393. data/test/migrations/missing/3_we_need_reminders.rb +12 -12
  394. data/test/migrations/missing/4_innocent_jointable.rb +12 -12
  395. data/test/migrations/rename/1_we_need_things.rb +11 -11
  396. data/test/migrations/rename/2_rename_things.rb +9 -9
  397. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  398. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  399. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  400. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  401. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  402. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  403. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  404. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  405. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  406. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  407. data/test/migrations/valid/2_we_need_reminders.rb +12 -12
  408. data/test/migrations/valid/3_innocent_jointable.rb +12 -12
  409. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  410. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -12
  411. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -12
  412. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  413. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  414. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  415. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  416. data/test/models/admin.rb +5 -5
  417. data/test/models/admin/account.rb +3 -3
  418. data/test/models/admin/user.rb +40 -40
  419. data/test/models/aircraft.rb +5 -5
  420. data/test/models/arunit2_model.rb +3 -3
  421. data/test/models/author.rb +209 -209
  422. data/test/models/auto_id.rb +4 -4
  423. data/test/models/autoloadable/extra_firm.rb +2 -2
  424. data/test/models/binary.rb +2 -2
  425. data/test/models/bird.rb +12 -12
  426. data/test/models/book.rb +23 -23
  427. data/test/models/boolean.rb +2 -2
  428. data/test/models/bulb.rb +52 -52
  429. data/test/models/cake_designer.rb +3 -3
  430. data/test/models/car.rb +29 -29
  431. data/test/models/carrier.rb +2 -2
  432. data/test/models/cat.rb +10 -10
  433. data/test/models/categorization.rb +19 -19
  434. data/test/models/category.rb +35 -35
  435. data/test/models/chef.rb +8 -8
  436. data/test/models/citation.rb +3 -3
  437. data/test/models/club.rb +25 -25
  438. data/test/models/college.rb +10 -10
  439. data/test/models/column.rb +3 -3
  440. data/test/models/column_name.rb +3 -3
  441. data/test/models/comment.rb +76 -76
  442. data/test/models/company.rb +230 -230
  443. data/test/models/company_in_module.rb +98 -98
  444. data/test/models/computer.rb +3 -3
  445. data/test/models/contact.rb +41 -41
  446. data/test/models/content.rb +40 -40
  447. data/test/models/contract.rb +20 -20
  448. data/test/models/country.rb +7 -7
  449. data/test/models/course.rb +6 -6
  450. data/test/models/customer.rb +83 -83
  451. data/test/models/customer_carrier.rb +14 -14
  452. data/test/models/dashboard.rb +3 -3
  453. data/test/models/default.rb +2 -2
  454. data/test/models/department.rb +4 -4
  455. data/test/models/developer.rb +274 -274
  456. data/test/models/dog.rb +5 -5
  457. data/test/models/dog_lover.rb +5 -5
  458. data/test/models/doubloon.rb +12 -12
  459. data/test/models/drink_designer.rb +3 -3
  460. data/test/models/edge.rb +5 -5
  461. data/test/models/electron.rb +5 -5
  462. data/test/models/engine.rb +4 -4
  463. data/test/models/entrant.rb +3 -3
  464. data/test/models/essay.rb +5 -5
  465. data/test/models/event.rb +3 -3
  466. data/test/models/eye.rb +37 -37
  467. data/test/models/face.rb +9 -9
  468. data/test/models/friendship.rb +6 -6
  469. data/test/models/guid.rb +2 -2
  470. data/test/models/guitar.rb +4 -4
  471. data/test/models/hotel.rb +11 -11
  472. data/test/models/image.rb +3 -3
  473. data/test/models/interest.rb +5 -5
  474. data/test/models/invoice.rb +4 -4
  475. data/test/models/item.rb +7 -7
  476. data/test/models/job.rb +7 -7
  477. data/test/models/joke.rb +7 -7
  478. data/test/models/keyboard.rb +3 -3
  479. data/test/models/legacy_thing.rb +3 -3
  480. data/test/models/lesson.rb +11 -11
  481. data/test/models/line_item.rb +3 -3
  482. data/test/models/liquid.rb +4 -4
  483. data/test/models/man.rb +11 -11
  484. data/test/models/matey.rb +4 -4
  485. data/test/models/member.rb +42 -42
  486. data/test/models/member_detail.rb +8 -8
  487. data/test/models/member_type.rb +3 -3
  488. data/test/models/membership.rb +35 -35
  489. data/test/models/mentor.rb +2 -2
  490. data/test/models/minimalistic.rb +2 -2
  491. data/test/models/minivan.rb +9 -9
  492. data/test/models/mixed_case_monkey.rb +3 -3
  493. data/test/models/mocktail_designer.rb +2 -2
  494. data/test/models/molecule.rb +6 -6
  495. data/test/models/movie.rb +5 -5
  496. data/test/models/node.rb +5 -5
  497. data/test/models/non_primary_key.rb +2 -2
  498. data/test/models/notification.rb +3 -3
  499. data/test/models/order.rb +4 -4
  500. data/test/models/organization.rb +14 -14
  501. data/test/models/other_dog.rb +5 -5
  502. data/test/models/owner.rb +37 -37
  503. data/test/models/parrot.rb +28 -28
  504. data/test/models/person.rb +142 -142
  505. data/test/models/personal_legacy_thing.rb +4 -4
  506. data/test/models/pet.rb +18 -18
  507. data/test/models/pet_treasure.rb +6 -6
  508. data/test/models/pirate.rb +92 -92
  509. data/test/models/possession.rb +3 -3
  510. data/test/models/post.rb +273 -273
  511. data/test/models/price_estimate.rb +4 -4
  512. data/test/models/professor.rb +5 -5
  513. data/test/models/project.rb +40 -40
  514. data/test/models/publisher.rb +2 -2
  515. data/test/models/publisher/article.rb +4 -4
  516. data/test/models/publisher/magazine.rb +3 -3
  517. data/test/models/rating.rb +4 -4
  518. data/test/models/reader.rb +23 -23
  519. data/test/models/recipe.rb +3 -3
  520. data/test/models/record.rb +2 -2
  521. data/test/models/reference.rb +22 -22
  522. data/test/models/reply.rb +61 -61
  523. data/test/models/ship.rb +39 -39
  524. data/test/models/ship_part.rb +8 -8
  525. data/test/models/shop.rb +17 -17
  526. data/test/models/shop_account.rb +6 -6
  527. data/test/models/speedometer.rb +6 -6
  528. data/test/models/sponsor.rb +7 -7
  529. data/test/models/string_key_object.rb +3 -3
  530. data/test/models/student.rb +4 -4
  531. data/test/models/subject.rb +16 -16
  532. data/test/models/subscriber.rb +8 -8
  533. data/test/models/subscription.rb +4 -4
  534. data/test/models/tag.rb +13 -13
  535. data/test/models/tagging.rb +13 -13
  536. data/test/models/task.rb +5 -5
  537. data/test/models/topic.rb +118 -118
  538. data/test/models/toy.rb +6 -6
  539. data/test/models/traffic_light.rb +4 -4
  540. data/test/models/treasure.rb +14 -14
  541. data/test/models/treaty.rb +7 -7
  542. data/test/models/tree.rb +3 -3
  543. data/test/models/tuning_peg.rb +4 -4
  544. data/test/models/tyre.rb +11 -11
  545. data/test/models/user.rb +14 -14
  546. data/test/models/uuid_child.rb +3 -3
  547. data/test/models/uuid_item.rb +6 -6
  548. data/test/models/uuid_parent.rb +3 -3
  549. data/test/models/vegetables.rb +24 -24
  550. data/test/models/vehicle.rb +6 -6
  551. data/test/models/vertex.rb +9 -9
  552. data/test/models/warehouse_thing.rb +5 -5
  553. data/test/models/wheel.rb +3 -3
  554. data/test/models/without_table.rb +3 -3
  555. data/test/models/zine.rb +3 -3
  556. data/test/schema/i5/ibm_db_specific_schema.rb +137 -0
  557. data/test/schema/ids/ibm_db_specific_schema.rb +140 -0
  558. data/test/schema/luw/ibm_db_specific_schema.rb +137 -0
  559. data/test/schema/mysql2_specific_schema.rb +68 -68
  560. data/test/schema/oracle_specific_schema.rb +40 -40
  561. data/test/schema/postgresql_specific_schema.rb +114 -114
  562. data/test/schema/schema.rb +1057 -1057
  563. data/test/schema/schema.rb.original +1057 -1057
  564. data/test/schema/sqlite_specific_schema.rb +18 -18
  565. data/test/schema/zOS/ibm_db_specific_schema.rb +208 -0
  566. data/test/support/config.rb +43 -43
  567. data/test/support/connection.rb +23 -23
  568. data/test/support/connection_helper.rb +14 -14
  569. data/test/support/ddl_helper.rb +8 -8
  570. data/test/support/schema_dumping_helper.rb +20 -20
  571. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -22
  572. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -182
  573. metadata +30 -14
  574. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  575. data/test/fixtures/author_addresses.original +0 -11
  576. data/test/fixtures/authors.original +0 -17
@@ -1,636 +1,636 @@
1
- require "cases/helper"
2
- require 'models/developer'
3
- require 'models/computer'
4
-
5
- class CallbackDeveloper < ActiveRecord::Base
6
- self.table_name = 'developers'
7
-
8
- class << self
9
- def callback_string(callback_method)
10
- "history << [#{callback_method.to_sym.inspect}, :string]"
11
- end
12
-
13
- def callback_proc(callback_method)
14
- Proc.new { |model| model.history << [callback_method, :proc] }
15
- end
16
-
17
- def define_callback_method(callback_method)
18
- define_method(callback_method) do
19
- self.history << [callback_method, :method]
20
- end
21
- send(callback_method, :"#{callback_method}")
22
- end
23
-
24
- def callback_object(callback_method)
25
- klass = Class.new
26
- klass.send(:define_method, callback_method) do |model|
27
- model.history << [callback_method, :object]
28
- end
29
- klass.new
30
- end
31
- end
32
-
33
- ActiveRecord::Callbacks::CALLBACKS.each do |callback_method|
34
- next if callback_method.to_s =~ /^around_/
35
- define_callback_method(callback_method)
36
- ActiveSupport::Deprecation.silence { send(callback_method, callback_string(callback_method)) }
37
- send(callback_method, callback_proc(callback_method))
38
- send(callback_method, callback_object(callback_method))
39
- send(callback_method) { |model| model.history << [callback_method, :block] }
40
- end
41
-
42
- def history
43
- @history ||= []
44
- end
45
- end
46
-
47
- class CallbackDeveloperWithFalseValidation < CallbackDeveloper
48
- before_validation proc { |model| model.history << [:before_validation, :returning_false]; false }
49
- before_validation proc { |model| model.history << [:before_validation, :should_never_get_here] }
50
- end
51
-
52
- class CallbackDeveloperWithHaltedValidation < CallbackDeveloper
53
- before_validation proc { |model| model.history << [:before_validation, :throwing_abort]; throw(:abort) }
54
- before_validation proc { |model| model.history << [:before_validation, :should_never_get_here] }
55
- end
56
-
57
- class ParentDeveloper < ActiveRecord::Base
58
- self.table_name = 'developers'
59
- attr_accessor :after_save_called
60
- before_validation {|record| record.after_save_called = true}
61
- end
62
-
63
- class ChildDeveloper < ParentDeveloper
64
-
65
- end
66
-
67
- class ImmutableDeveloper < ActiveRecord::Base
68
- self.table_name = 'developers'
69
-
70
- validates_inclusion_of :salary, :in => 50000..200000
71
-
72
- before_save :cancel
73
- before_destroy :cancel
74
-
75
- private
76
- def cancel
77
- false
78
- end
79
- end
80
-
81
- class DeveloperWithCanceledCallbacks < ActiveRecord::Base
82
- self.table_name = 'developers'
83
-
84
- validates_inclusion_of :salary, in: 50000..200000
85
-
86
- before_save :cancel
87
- before_destroy :cancel
88
-
89
- private
90
- def cancel
91
- throw(:abort)
92
- end
93
- end
94
-
95
- class OnCallbacksDeveloper < ActiveRecord::Base
96
- self.table_name = 'developers'
97
-
98
- before_validation { history << :before_validation }
99
- before_validation(:on => :create){ history << :before_validation_on_create }
100
- before_validation(:on => :update){ history << :before_validation_on_update }
101
-
102
- validate do
103
- history << :validate
104
- end
105
-
106
- after_validation { history << :after_validation }
107
- after_validation(:on => :create){ history << :after_validation_on_create }
108
- after_validation(:on => :update){ history << :after_validation_on_update }
109
-
110
- def history
111
- @history ||= []
112
- end
113
- end
114
-
115
- class ContextualCallbacksDeveloper < ActiveRecord::Base
116
- self.table_name = 'developers'
117
-
118
- before_validation { history << :before_validation }
119
- before_validation :before_validation_on_create_and_update, :on => [ :create, :update ]
120
-
121
- validate do
122
- history << :validate
123
- end
124
-
125
- after_validation { history << :after_validation }
126
- after_validation :after_validation_on_create_and_update, :on => [ :create, :update ]
127
-
128
- def before_validation_on_create_and_update
129
- history << "before_validation_on_#{self.validation_context}".to_sym
130
- end
131
-
132
- def after_validation_on_create_and_update
133
- history << "after_validation_on_#{self.validation_context}".to_sym
134
- end
135
-
136
- def history
137
- @history ||= []
138
- end
139
- end
140
-
141
- class CallbackCancellationDeveloper < ActiveRecord::Base
142
- self.table_name = 'developers'
143
-
144
- attr_reader :after_save_called, :after_create_called, :after_update_called, :after_destroy_called
145
- attr_accessor :cancel_before_save, :cancel_before_create, :cancel_before_update, :cancel_before_destroy
146
-
147
- before_save {defined?(@cancel_before_save) ? !@cancel_before_save : false}
148
- before_create { !@cancel_before_create }
149
- before_update { !@cancel_before_update }
150
- before_destroy { !@cancel_before_destroy }
151
-
152
- after_save { @after_save_called = true }
153
- after_update { @after_update_called = true }
154
- after_create { @after_create_called = true }
155
- after_destroy { @after_destroy_called = true }
156
- end
157
-
158
- class CallbackHaltedDeveloper < ActiveRecord::Base
159
- self.table_name = 'developers'
160
-
161
- attr_reader :after_save_called, :after_create_called, :after_update_called, :after_destroy_called
162
- attr_accessor :cancel_before_save, :cancel_before_create, :cancel_before_update, :cancel_before_destroy
163
-
164
- before_save { throw(:abort) if defined?(@cancel_before_save) }
165
- before_create { throw(:abort) if @cancel_before_create }
166
- before_update { throw(:abort) if @cancel_before_update }
167
- before_destroy { throw(:abort) if @cancel_before_destroy }
168
-
169
- after_save { @after_save_called = true }
170
- after_update { @after_update_called = true }
171
- after_create { @after_create_called = true }
172
- after_destroy { @after_destroy_called = true }
173
- end
174
-
175
- class CallbacksTest < ActiveRecord::TestCase
176
- fixtures :developers
177
-
178
- def test_initialize
179
- david = CallbackDeveloper.new
180
- assert_equal [
181
- [ :after_initialize, :method ],
182
- [ :after_initialize, :string ],
183
- [ :after_initialize, :proc ],
184
- [ :after_initialize, :object ],
185
- [ :after_initialize, :block ],
186
- ], david.history
187
- end
188
-
189
- def test_find
190
- david = CallbackDeveloper.find(1)
191
- assert_equal [
192
- [ :after_find, :method ],
193
- [ :after_find, :string ],
194
- [ :after_find, :proc ],
195
- [ :after_find, :object ],
196
- [ :after_find, :block ],
197
- [ :after_initialize, :method ],
198
- [ :after_initialize, :string ],
199
- [ :after_initialize, :proc ],
200
- [ :after_initialize, :object ],
201
- [ :after_initialize, :block ],
202
- ], david.history
203
- end
204
-
205
- def test_new_valid?
206
- david = CallbackDeveloper.new
207
- david.valid?
208
- assert_equal [
209
- [ :after_initialize, :method ],
210
- [ :after_initialize, :string ],
211
- [ :after_initialize, :proc ],
212
- [ :after_initialize, :object ],
213
- [ :after_initialize, :block ],
214
- [ :before_validation, :method ],
215
- [ :before_validation, :string ],
216
- [ :before_validation, :proc ],
217
- [ :before_validation, :object ],
218
- [ :before_validation, :block ],
219
- [ :after_validation, :method ],
220
- [ :after_validation, :string ],
221
- [ :after_validation, :proc ],
222
- [ :after_validation, :object ],
223
- [ :after_validation, :block ],
224
- ], david.history
225
- end
226
-
227
- def test_existing_valid?
228
- david = CallbackDeveloper.find(1)
229
- david.valid?
230
- assert_equal [
231
- [ :after_find, :method ],
232
- [ :after_find, :string ],
233
- [ :after_find, :proc ],
234
- [ :after_find, :object ],
235
- [ :after_find, :block ],
236
- [ :after_initialize, :method ],
237
- [ :after_initialize, :string ],
238
- [ :after_initialize, :proc ],
239
- [ :after_initialize, :object ],
240
- [ :after_initialize, :block ],
241
- [ :before_validation, :method ],
242
- [ :before_validation, :string ],
243
- [ :before_validation, :proc ],
244
- [ :before_validation, :object ],
245
- [ :before_validation, :block ],
246
- [ :after_validation, :method ],
247
- [ :after_validation, :string ],
248
- [ :after_validation, :proc ],
249
- [ :after_validation, :object ],
250
- [ :after_validation, :block ],
251
- ], david.history
252
- end
253
-
254
- def test_create
255
- david = CallbackDeveloper.create('name' => 'David', 'salary' => 1000000)
256
- assert_equal [
257
- [ :after_initialize, :method ],
258
- [ :after_initialize, :string ],
259
- [ :after_initialize, :proc ],
260
- [ :after_initialize, :object ],
261
- [ :after_initialize, :block ],
262
- [ :before_validation, :method ],
263
- [ :before_validation, :string ],
264
- [ :before_validation, :proc ],
265
- [ :before_validation, :object ],
266
- [ :before_validation, :block ],
267
- [ :after_validation, :method ],
268
- [ :after_validation, :string ],
269
- [ :after_validation, :proc ],
270
- [ :after_validation, :object ],
271
- [ :after_validation, :block ],
272
- [ :before_save, :method ],
273
- [ :before_save, :string ],
274
- [ :before_save, :proc ],
275
- [ :before_save, :object ],
276
- [ :before_save, :block ],
277
- [ :before_create, :method ],
278
- [ :before_create, :string ],
279
- [ :before_create, :proc ],
280
- [ :before_create, :object ],
281
- [ :before_create, :block ],
282
- [ :after_create, :method ],
283
- [ :after_create, :string ],
284
- [ :after_create, :proc ],
285
- [ :after_create, :object ],
286
- [ :after_create, :block ],
287
- [ :after_save, :method ],
288
- [ :after_save, :string ],
289
- [ :after_save, :proc ],
290
- [ :after_save, :object ],
291
- [ :after_save, :block ],
292
- [ :after_commit, :block ],
293
- [ :after_commit, :object ],
294
- [ :after_commit, :proc ],
295
- [ :after_commit, :string ],
296
- [ :after_commit, :method ]
297
- ], david.history
298
- end
299
-
300
- def test_validate_on_create
301
- david = OnCallbacksDeveloper.create('name' => 'David', 'salary' => 1000000)
302
- assert_equal [
303
- :before_validation,
304
- :before_validation_on_create,
305
- :validate,
306
- :after_validation,
307
- :after_validation_on_create
308
- ], david.history
309
- end
310
-
311
- def test_validate_on_contextual_create
312
- david = ContextualCallbacksDeveloper.create('name' => 'David', 'salary' => 1000000)
313
- assert_equal [
314
- :before_validation,
315
- :before_validation_on_create,
316
- :validate,
317
- :after_validation,
318
- :after_validation_on_create
319
- ], david.history
320
- end
321
-
322
- def test_update
323
- david = CallbackDeveloper.find(1)
324
- david.save
325
- assert_equal [
326
- [ :after_find, :method ],
327
- [ :after_find, :string ],
328
- [ :after_find, :proc ],
329
- [ :after_find, :object ],
330
- [ :after_find, :block ],
331
- [ :after_initialize, :method ],
332
- [ :after_initialize, :string ],
333
- [ :after_initialize, :proc ],
334
- [ :after_initialize, :object ],
335
- [ :after_initialize, :block ],
336
- [ :before_validation, :method ],
337
- [ :before_validation, :string ],
338
- [ :before_validation, :proc ],
339
- [ :before_validation, :object ],
340
- [ :before_validation, :block ],
341
- [ :after_validation, :method ],
342
- [ :after_validation, :string ],
343
- [ :after_validation, :proc ],
344
- [ :after_validation, :object ],
345
- [ :after_validation, :block ],
346
- [ :before_save, :method ],
347
- [ :before_save, :string ],
348
- [ :before_save, :proc ],
349
- [ :before_save, :object ],
350
- [ :before_save, :block ],
351
- [ :before_update, :method ],
352
- [ :before_update, :string ],
353
- [ :before_update, :proc ],
354
- [ :before_update, :object ],
355
- [ :before_update, :block ],
356
- [ :after_update, :method ],
357
- [ :after_update, :string ],
358
- [ :after_update, :proc ],
359
- [ :after_update, :object ],
360
- [ :after_update, :block ],
361
- [ :after_save, :method ],
362
- [ :after_save, :string ],
363
- [ :after_save, :proc ],
364
- [ :after_save, :object ],
365
- [ :after_save, :block ],
366
- [ :after_commit, :block ],
367
- [ :after_commit, :object ],
368
- [ :after_commit, :proc ],
369
- [ :after_commit, :string ],
370
- [ :after_commit, :method ]
371
- ], david.history
372
- end
373
-
374
- def test_validate_on_update
375
- david = OnCallbacksDeveloper.find(1)
376
- david.save
377
- assert_equal [
378
- :before_validation,
379
- :before_validation_on_update,
380
- :validate,
381
- :after_validation,
382
- :after_validation_on_update
383
- ], david.history
384
- end
385
-
386
- def test_validate_on_contextual_update
387
- david = ContextualCallbacksDeveloper.find(1)
388
- david.save
389
- assert_equal [
390
- :before_validation,
391
- :before_validation_on_update,
392
- :validate,
393
- :after_validation,
394
- :after_validation_on_update
395
- ], david.history
396
- end
397
-
398
- def test_destroy
399
- david = CallbackDeveloper.find(1)
400
- david.destroy
401
- assert_equal [
402
- [ :after_find, :method ],
403
- [ :after_find, :string ],
404
- [ :after_find, :proc ],
405
- [ :after_find, :object ],
406
- [ :after_find, :block ],
407
- [ :after_initialize, :method ],
408
- [ :after_initialize, :string ],
409
- [ :after_initialize, :proc ],
410
- [ :after_initialize, :object ],
411
- [ :after_initialize, :block ],
412
- [ :before_destroy, :method ],
413
- [ :before_destroy, :string ],
414
- [ :before_destroy, :proc ],
415
- [ :before_destroy, :object ],
416
- [ :before_destroy, :block ],
417
- [ :after_destroy, :method ],
418
- [ :after_destroy, :string ],
419
- [ :after_destroy, :proc ],
420
- [ :after_destroy, :object ],
421
- [ :after_destroy, :block ],
422
- [ :after_commit, :block ],
423
- [ :after_commit, :object ],
424
- [ :after_commit, :proc ],
425
- [ :after_commit, :string ],
426
- [ :after_commit, :method ]
427
- ], david.history
428
- end
429
-
430
- def test_delete
431
- david = CallbackDeveloper.find(1)
432
- CallbackDeveloper.delete(david.id)
433
- assert_equal [
434
- [ :after_find, :method ],
435
- [ :after_find, :string ],
436
- [ :after_find, :proc ],
437
- [ :after_find, :object ],
438
- [ :after_find, :block ],
439
- [ :after_initialize, :method ],
440
- [ :after_initialize, :string ],
441
- [ :after_initialize, :proc ],
442
- [ :after_initialize, :object ],
443
- [ :after_initialize, :block ],
444
- ], david.history
445
- end
446
-
447
- def test_deprecated_before_save_returning_false
448
- david = ImmutableDeveloper.find(1)
449
- assert_deprecated do
450
- assert david.valid?
451
- assert !david.save
452
- exc = assert_raise(ActiveRecord::RecordNotSaved) { david.save! }
453
- assert_equal exc.record, david
454
- assert_equal "Failed to save the record", exc.message
455
- end
456
-
457
- david = ImmutableDeveloper.find(1)
458
- david.salary = 10_000_000
459
- assert !david.valid?
460
- assert !david.save
461
- assert_raise(ActiveRecord::RecordInvalid) { david.save! }
462
-
463
- someone = CallbackCancellationDeveloper.find(1)
464
- someone.cancel_before_save = true
465
- assert_deprecated do
466
- assert someone.valid?
467
- assert !someone.save
468
- end
469
- assert_save_callbacks_not_called(someone)
470
- end
471
-
472
- def test_deprecated_before_create_returning_false
473
- someone = CallbackCancellationDeveloper.new
474
- someone.cancel_before_create = true
475
- assert_deprecated do
476
- assert someone.valid?
477
- assert !someone.save
478
- end
479
- assert_save_callbacks_not_called(someone)
480
- end
481
-
482
- def test_deprecated_before_update_returning_false
483
- someone = CallbackCancellationDeveloper.find(1)
484
- someone.cancel_before_update = true
485
- assert_deprecated do
486
- assert someone.valid?
487
- assert !someone.save
488
- end
489
- assert_save_callbacks_not_called(someone)
490
- end
491
-
492
- def test_deprecated_before_destroy_returning_false
493
- david = ImmutableDeveloper.find(1)
494
- assert_deprecated do
495
- assert !david.destroy
496
- exc = assert_raise(ActiveRecord::RecordNotDestroyed) { david.destroy! }
497
- assert_equal exc.record, david
498
- assert_equal "Failed to destroy the record", exc.message
499
- end
500
- assert_not_nil ImmutableDeveloper.find_by_id(1)
501
-
502
- someone = CallbackCancellationDeveloper.find(1)
503
- someone.cancel_before_destroy = true
504
- assert_deprecated do
505
- assert !someone.destroy
506
- assert_raise(ActiveRecord::RecordNotDestroyed) { someone.destroy! }
507
- end
508
- assert !someone.after_destroy_called
509
- end
510
-
511
- def assert_save_callbacks_not_called(someone)
512
- assert !someone.after_save_called
513
- assert !someone.after_create_called
514
- assert !someone.after_update_called
515
- end
516
- private :assert_save_callbacks_not_called
517
-
518
- def test_before_create_throwing_abort
519
- someone = CallbackHaltedDeveloper.new
520
- someone.cancel_before_create = true
521
- assert someone.valid?
522
- assert !someone.save
523
- assert_save_callbacks_not_called(someone)
524
- end
525
-
526
- def test_before_save_throwing_abort
527
- david = DeveloperWithCanceledCallbacks.find(1)
528
- assert david.valid?
529
- assert !david.save
530
- exc = assert_raise(ActiveRecord::RecordNotSaved) { david.save! }
531
- assert_equal exc.record, david
532
-
533
- david = DeveloperWithCanceledCallbacks.find(1)
534
- david.salary = 10_000_000
535
- assert !david.valid?
536
- assert !david.save
537
- assert_raise(ActiveRecord::RecordInvalid) { david.save! }
538
-
539
- someone = CallbackHaltedDeveloper.find(1)
540
- someone.cancel_before_save = true
541
- assert someone.valid?
542
- assert !someone.save
543
- assert_save_callbacks_not_called(someone)
544
- end
545
-
546
- def test_before_update_throwing_abort
547
- someone = CallbackHaltedDeveloper.find(1)
548
- someone.cancel_before_update = true
549
- assert someone.valid?
550
- assert !someone.save
551
- assert_save_callbacks_not_called(someone)
552
- end
553
-
554
- def test_before_destroy_throwing_abort
555
- david = DeveloperWithCanceledCallbacks.find(1)
556
- assert !david.destroy
557
- exc = assert_raise(ActiveRecord::RecordNotDestroyed) { david.destroy! }
558
- assert_equal exc.record, david
559
- assert_not_nil ImmutableDeveloper.find_by_id(1)
560
-
561
- someone = CallbackHaltedDeveloper.find(1)
562
- someone.cancel_before_destroy = true
563
- assert !someone.destroy
564
- assert_raise(ActiveRecord::RecordNotDestroyed) { someone.destroy! }
565
- assert !someone.after_destroy_called
566
- end
567
-
568
- def test_callback_returning_false
569
- david = CallbackDeveloperWithFalseValidation.find(1)
570
- assert_deprecated { david.save }
571
- assert_equal [
572
- [ :after_find, :method ],
573
- [ :after_find, :string ],
574
- [ :after_find, :proc ],
575
- [ :after_find, :object ],
576
- [ :after_find, :block ],
577
- [ :after_initialize, :method ],
578
- [ :after_initialize, :string ],
579
- [ :after_initialize, :proc ],
580
- [ :after_initialize, :object ],
581
- [ :after_initialize, :block ],
582
- [ :before_validation, :method ],
583
- [ :before_validation, :string ],
584
- [ :before_validation, :proc ],
585
- [ :before_validation, :object ],
586
- [ :before_validation, :block ],
587
- [ :before_validation, :returning_false ],
588
- [ :after_rollback, :block ],
589
- [ :after_rollback, :object ],
590
- [ :after_rollback, :proc ],
591
- [ :after_rollback, :string ],
592
- [ :after_rollback, :method ],
593
- ], david.history
594
- end
595
-
596
- def test_callback_throwing_abort
597
- david = CallbackDeveloperWithHaltedValidation.find(1)
598
- david.save
599
- assert_equal [
600
- [ :after_find, :method ],
601
- [ :after_find, :string ],
602
- [ :after_find, :proc ],
603
- [ :after_find, :object ],
604
- [ :after_find, :block ],
605
- [ :after_initialize, :method ],
606
- [ :after_initialize, :string ],
607
- [ :after_initialize, :proc ],
608
- [ :after_initialize, :object ],
609
- [ :after_initialize, :block ],
610
- [ :before_validation, :method ],
611
- [ :before_validation, :string ],
612
- [ :before_validation, :proc ],
613
- [ :before_validation, :object ],
614
- [ :before_validation, :block ],
615
- [ :before_validation, :throwing_abort ],
616
- [ :after_rollback, :block ],
617
- [ :after_rollback, :object ],
618
- [ :after_rollback, :proc ],
619
- [ :after_rollback, :string ],
620
- [ :after_rollback, :method ],
621
- ], david.history
622
- end
623
-
624
- def test_inheritance_of_callbacks
625
- parent = ParentDeveloper.new
626
- assert !parent.after_save_called
627
- parent.save
628
- assert parent.after_save_called
629
-
630
- child = ChildDeveloper.new
631
- assert !child.after_save_called
632
- child.save
633
- assert child.after_save_called
634
- end
635
-
636
- end
1
+ require "cases/helper"
2
+ require 'models/developer'
3
+ require 'models/computer'
4
+
5
+ class CallbackDeveloper < ActiveRecord::Base
6
+ self.table_name = 'developers'
7
+
8
+ class << self
9
+ def callback_string(callback_method)
10
+ "history << [#{callback_method.to_sym.inspect}, :string]"
11
+ end
12
+
13
+ def callback_proc(callback_method)
14
+ Proc.new { |model| model.history << [callback_method, :proc] }
15
+ end
16
+
17
+ def define_callback_method(callback_method)
18
+ define_method(callback_method) do
19
+ self.history << [callback_method, :method]
20
+ end
21
+ send(callback_method, :"#{callback_method}")
22
+ end
23
+
24
+ def callback_object(callback_method)
25
+ klass = Class.new
26
+ klass.send(:define_method, callback_method) do |model|
27
+ model.history << [callback_method, :object]
28
+ end
29
+ klass.new
30
+ end
31
+ end
32
+
33
+ ActiveRecord::Callbacks::CALLBACKS.each do |callback_method|
34
+ next if callback_method.to_s =~ /^around_/
35
+ define_callback_method(callback_method)
36
+ ActiveSupport::Deprecation.silence { send(callback_method, callback_string(callback_method)) }
37
+ send(callback_method, callback_proc(callback_method))
38
+ send(callback_method, callback_object(callback_method))
39
+ send(callback_method) { |model| model.history << [callback_method, :block] }
40
+ end
41
+
42
+ def history
43
+ @history ||= []
44
+ end
45
+ end
46
+
47
+ class CallbackDeveloperWithFalseValidation < CallbackDeveloper
48
+ before_validation proc { |model| model.history << [:before_validation, :returning_false]; false }
49
+ before_validation proc { |model| model.history << [:before_validation, :should_never_get_here] }
50
+ end
51
+
52
+ class CallbackDeveloperWithHaltedValidation < CallbackDeveloper
53
+ before_validation proc { |model| model.history << [:before_validation, :throwing_abort]; throw(:abort) }
54
+ before_validation proc { |model| model.history << [:before_validation, :should_never_get_here] }
55
+ end
56
+
57
+ class ParentDeveloper < ActiveRecord::Base
58
+ self.table_name = 'developers'
59
+ attr_accessor :after_save_called
60
+ before_validation {|record| record.after_save_called = true}
61
+ end
62
+
63
+ class ChildDeveloper < ParentDeveloper
64
+
65
+ end
66
+
67
+ class ImmutableDeveloper < ActiveRecord::Base
68
+ self.table_name = 'developers'
69
+
70
+ validates_inclusion_of :salary, :in => 50000..200000
71
+
72
+ before_save :cancel
73
+ before_destroy :cancel
74
+
75
+ private
76
+ def cancel
77
+ false
78
+ end
79
+ end
80
+
81
+ class DeveloperWithCanceledCallbacks < ActiveRecord::Base
82
+ self.table_name = 'developers'
83
+
84
+ validates_inclusion_of :salary, in: 50000..200000
85
+
86
+ before_save :cancel
87
+ before_destroy :cancel
88
+
89
+ private
90
+ def cancel
91
+ throw(:abort)
92
+ end
93
+ end
94
+
95
+ class OnCallbacksDeveloper < ActiveRecord::Base
96
+ self.table_name = 'developers'
97
+
98
+ before_validation { history << :before_validation }
99
+ before_validation(:on => :create){ history << :before_validation_on_create }
100
+ before_validation(:on => :update){ history << :before_validation_on_update }
101
+
102
+ validate do
103
+ history << :validate
104
+ end
105
+
106
+ after_validation { history << :after_validation }
107
+ after_validation(:on => :create){ history << :after_validation_on_create }
108
+ after_validation(:on => :update){ history << :after_validation_on_update }
109
+
110
+ def history
111
+ @history ||= []
112
+ end
113
+ end
114
+
115
+ class ContextualCallbacksDeveloper < ActiveRecord::Base
116
+ self.table_name = 'developers'
117
+
118
+ before_validation { history << :before_validation }
119
+ before_validation :before_validation_on_create_and_update, :on => [ :create, :update ]
120
+
121
+ validate do
122
+ history << :validate
123
+ end
124
+
125
+ after_validation { history << :after_validation }
126
+ after_validation :after_validation_on_create_and_update, :on => [ :create, :update ]
127
+
128
+ def before_validation_on_create_and_update
129
+ history << "before_validation_on_#{self.validation_context}".to_sym
130
+ end
131
+
132
+ def after_validation_on_create_and_update
133
+ history << "after_validation_on_#{self.validation_context}".to_sym
134
+ end
135
+
136
+ def history
137
+ @history ||= []
138
+ end
139
+ end
140
+
141
+ class CallbackCancellationDeveloper < ActiveRecord::Base
142
+ self.table_name = 'developers'
143
+
144
+ attr_reader :after_save_called, :after_create_called, :after_update_called, :after_destroy_called
145
+ attr_accessor :cancel_before_save, :cancel_before_create, :cancel_before_update, :cancel_before_destroy
146
+
147
+ before_save {defined?(@cancel_before_save) ? !@cancel_before_save : false}
148
+ before_create { !@cancel_before_create }
149
+ before_update { !@cancel_before_update }
150
+ before_destroy { !@cancel_before_destroy }
151
+
152
+ after_save { @after_save_called = true }
153
+ after_update { @after_update_called = true }
154
+ after_create { @after_create_called = true }
155
+ after_destroy { @after_destroy_called = true }
156
+ end
157
+
158
+ class CallbackHaltedDeveloper < ActiveRecord::Base
159
+ self.table_name = 'developers'
160
+
161
+ attr_reader :after_save_called, :after_create_called, :after_update_called, :after_destroy_called
162
+ attr_accessor :cancel_before_save, :cancel_before_create, :cancel_before_update, :cancel_before_destroy
163
+
164
+ before_save { throw(:abort) if defined?(@cancel_before_save) }
165
+ before_create { throw(:abort) if @cancel_before_create }
166
+ before_update { throw(:abort) if @cancel_before_update }
167
+ before_destroy { throw(:abort) if @cancel_before_destroy }
168
+
169
+ after_save { @after_save_called = true }
170
+ after_update { @after_update_called = true }
171
+ after_create { @after_create_called = true }
172
+ after_destroy { @after_destroy_called = true }
173
+ end
174
+
175
+ class CallbacksTest < ActiveRecord::TestCase
176
+ fixtures :developers
177
+
178
+ def test_initialize
179
+ david = CallbackDeveloper.new
180
+ assert_equal [
181
+ [ :after_initialize, :method ],
182
+ [ :after_initialize, :string ],
183
+ [ :after_initialize, :proc ],
184
+ [ :after_initialize, :object ],
185
+ [ :after_initialize, :block ],
186
+ ], david.history
187
+ end
188
+
189
+ def test_find
190
+ david = CallbackDeveloper.find(1)
191
+ assert_equal [
192
+ [ :after_find, :method ],
193
+ [ :after_find, :string ],
194
+ [ :after_find, :proc ],
195
+ [ :after_find, :object ],
196
+ [ :after_find, :block ],
197
+ [ :after_initialize, :method ],
198
+ [ :after_initialize, :string ],
199
+ [ :after_initialize, :proc ],
200
+ [ :after_initialize, :object ],
201
+ [ :after_initialize, :block ],
202
+ ], david.history
203
+ end
204
+
205
+ def test_new_valid?
206
+ david = CallbackDeveloper.new
207
+ david.valid?
208
+ assert_equal [
209
+ [ :after_initialize, :method ],
210
+ [ :after_initialize, :string ],
211
+ [ :after_initialize, :proc ],
212
+ [ :after_initialize, :object ],
213
+ [ :after_initialize, :block ],
214
+ [ :before_validation, :method ],
215
+ [ :before_validation, :string ],
216
+ [ :before_validation, :proc ],
217
+ [ :before_validation, :object ],
218
+ [ :before_validation, :block ],
219
+ [ :after_validation, :method ],
220
+ [ :after_validation, :string ],
221
+ [ :after_validation, :proc ],
222
+ [ :after_validation, :object ],
223
+ [ :after_validation, :block ],
224
+ ], david.history
225
+ end
226
+
227
+ def test_existing_valid?
228
+ david = CallbackDeveloper.find(1)
229
+ david.valid?
230
+ assert_equal [
231
+ [ :after_find, :method ],
232
+ [ :after_find, :string ],
233
+ [ :after_find, :proc ],
234
+ [ :after_find, :object ],
235
+ [ :after_find, :block ],
236
+ [ :after_initialize, :method ],
237
+ [ :after_initialize, :string ],
238
+ [ :after_initialize, :proc ],
239
+ [ :after_initialize, :object ],
240
+ [ :after_initialize, :block ],
241
+ [ :before_validation, :method ],
242
+ [ :before_validation, :string ],
243
+ [ :before_validation, :proc ],
244
+ [ :before_validation, :object ],
245
+ [ :before_validation, :block ],
246
+ [ :after_validation, :method ],
247
+ [ :after_validation, :string ],
248
+ [ :after_validation, :proc ],
249
+ [ :after_validation, :object ],
250
+ [ :after_validation, :block ],
251
+ ], david.history
252
+ end
253
+
254
+ def test_create
255
+ david = CallbackDeveloper.create('name' => 'David', 'salary' => 1000000)
256
+ assert_equal [
257
+ [ :after_initialize, :method ],
258
+ [ :after_initialize, :string ],
259
+ [ :after_initialize, :proc ],
260
+ [ :after_initialize, :object ],
261
+ [ :after_initialize, :block ],
262
+ [ :before_validation, :method ],
263
+ [ :before_validation, :string ],
264
+ [ :before_validation, :proc ],
265
+ [ :before_validation, :object ],
266
+ [ :before_validation, :block ],
267
+ [ :after_validation, :method ],
268
+ [ :after_validation, :string ],
269
+ [ :after_validation, :proc ],
270
+ [ :after_validation, :object ],
271
+ [ :after_validation, :block ],
272
+ [ :before_save, :method ],
273
+ [ :before_save, :string ],
274
+ [ :before_save, :proc ],
275
+ [ :before_save, :object ],
276
+ [ :before_save, :block ],
277
+ [ :before_create, :method ],
278
+ [ :before_create, :string ],
279
+ [ :before_create, :proc ],
280
+ [ :before_create, :object ],
281
+ [ :before_create, :block ],
282
+ [ :after_create, :method ],
283
+ [ :after_create, :string ],
284
+ [ :after_create, :proc ],
285
+ [ :after_create, :object ],
286
+ [ :after_create, :block ],
287
+ [ :after_save, :method ],
288
+ [ :after_save, :string ],
289
+ [ :after_save, :proc ],
290
+ [ :after_save, :object ],
291
+ [ :after_save, :block ],
292
+ [ :after_commit, :block ],
293
+ [ :after_commit, :object ],
294
+ [ :after_commit, :proc ],
295
+ [ :after_commit, :string ],
296
+ [ :after_commit, :method ]
297
+ ], david.history
298
+ end
299
+
300
+ def test_validate_on_create
301
+ david = OnCallbacksDeveloper.create('name' => 'David', 'salary' => 1000000)
302
+ assert_equal [
303
+ :before_validation,
304
+ :before_validation_on_create,
305
+ :validate,
306
+ :after_validation,
307
+ :after_validation_on_create
308
+ ], david.history
309
+ end
310
+
311
+ def test_validate_on_contextual_create
312
+ david = ContextualCallbacksDeveloper.create('name' => 'David', 'salary' => 1000000)
313
+ assert_equal [
314
+ :before_validation,
315
+ :before_validation_on_create,
316
+ :validate,
317
+ :after_validation,
318
+ :after_validation_on_create
319
+ ], david.history
320
+ end
321
+
322
+ def test_update
323
+ david = CallbackDeveloper.find(1)
324
+ david.save
325
+ assert_equal [
326
+ [ :after_find, :method ],
327
+ [ :after_find, :string ],
328
+ [ :after_find, :proc ],
329
+ [ :after_find, :object ],
330
+ [ :after_find, :block ],
331
+ [ :after_initialize, :method ],
332
+ [ :after_initialize, :string ],
333
+ [ :after_initialize, :proc ],
334
+ [ :after_initialize, :object ],
335
+ [ :after_initialize, :block ],
336
+ [ :before_validation, :method ],
337
+ [ :before_validation, :string ],
338
+ [ :before_validation, :proc ],
339
+ [ :before_validation, :object ],
340
+ [ :before_validation, :block ],
341
+ [ :after_validation, :method ],
342
+ [ :after_validation, :string ],
343
+ [ :after_validation, :proc ],
344
+ [ :after_validation, :object ],
345
+ [ :after_validation, :block ],
346
+ [ :before_save, :method ],
347
+ [ :before_save, :string ],
348
+ [ :before_save, :proc ],
349
+ [ :before_save, :object ],
350
+ [ :before_save, :block ],
351
+ [ :before_update, :method ],
352
+ [ :before_update, :string ],
353
+ [ :before_update, :proc ],
354
+ [ :before_update, :object ],
355
+ [ :before_update, :block ],
356
+ [ :after_update, :method ],
357
+ [ :after_update, :string ],
358
+ [ :after_update, :proc ],
359
+ [ :after_update, :object ],
360
+ [ :after_update, :block ],
361
+ [ :after_save, :method ],
362
+ [ :after_save, :string ],
363
+ [ :after_save, :proc ],
364
+ [ :after_save, :object ],
365
+ [ :after_save, :block ],
366
+ [ :after_commit, :block ],
367
+ [ :after_commit, :object ],
368
+ [ :after_commit, :proc ],
369
+ [ :after_commit, :string ],
370
+ [ :after_commit, :method ]
371
+ ], david.history
372
+ end
373
+
374
+ def test_validate_on_update
375
+ david = OnCallbacksDeveloper.find(1)
376
+ david.save
377
+ assert_equal [
378
+ :before_validation,
379
+ :before_validation_on_update,
380
+ :validate,
381
+ :after_validation,
382
+ :after_validation_on_update
383
+ ], david.history
384
+ end
385
+
386
+ def test_validate_on_contextual_update
387
+ david = ContextualCallbacksDeveloper.find(1)
388
+ david.save
389
+ assert_equal [
390
+ :before_validation,
391
+ :before_validation_on_update,
392
+ :validate,
393
+ :after_validation,
394
+ :after_validation_on_update
395
+ ], david.history
396
+ end
397
+
398
+ def test_destroy
399
+ david = CallbackDeveloper.find(1)
400
+ david.destroy
401
+ assert_equal [
402
+ [ :after_find, :method ],
403
+ [ :after_find, :string ],
404
+ [ :after_find, :proc ],
405
+ [ :after_find, :object ],
406
+ [ :after_find, :block ],
407
+ [ :after_initialize, :method ],
408
+ [ :after_initialize, :string ],
409
+ [ :after_initialize, :proc ],
410
+ [ :after_initialize, :object ],
411
+ [ :after_initialize, :block ],
412
+ [ :before_destroy, :method ],
413
+ [ :before_destroy, :string ],
414
+ [ :before_destroy, :proc ],
415
+ [ :before_destroy, :object ],
416
+ [ :before_destroy, :block ],
417
+ [ :after_destroy, :method ],
418
+ [ :after_destroy, :string ],
419
+ [ :after_destroy, :proc ],
420
+ [ :after_destroy, :object ],
421
+ [ :after_destroy, :block ],
422
+ [ :after_commit, :block ],
423
+ [ :after_commit, :object ],
424
+ [ :after_commit, :proc ],
425
+ [ :after_commit, :string ],
426
+ [ :after_commit, :method ]
427
+ ], david.history
428
+ end
429
+
430
+ def test_delete
431
+ david = CallbackDeveloper.find(1)
432
+ CallbackDeveloper.delete(david.id)
433
+ assert_equal [
434
+ [ :after_find, :method ],
435
+ [ :after_find, :string ],
436
+ [ :after_find, :proc ],
437
+ [ :after_find, :object ],
438
+ [ :after_find, :block ],
439
+ [ :after_initialize, :method ],
440
+ [ :after_initialize, :string ],
441
+ [ :after_initialize, :proc ],
442
+ [ :after_initialize, :object ],
443
+ [ :after_initialize, :block ],
444
+ ], david.history
445
+ end
446
+
447
+ def test_deprecated_before_save_returning_false
448
+ david = ImmutableDeveloper.find(1)
449
+ assert_deprecated do
450
+ assert david.valid?
451
+ assert !david.save
452
+ exc = assert_raise(ActiveRecord::RecordNotSaved) { david.save! }
453
+ assert_equal exc.record, david
454
+ assert_equal "Failed to save the record", exc.message
455
+ end
456
+
457
+ david = ImmutableDeveloper.find(1)
458
+ david.salary = 10_000_000
459
+ assert !david.valid?
460
+ assert !david.save
461
+ assert_raise(ActiveRecord::RecordInvalid) { david.save! }
462
+
463
+ someone = CallbackCancellationDeveloper.find(1)
464
+ someone.cancel_before_save = true
465
+ assert_deprecated do
466
+ assert someone.valid?
467
+ assert !someone.save
468
+ end
469
+ assert_save_callbacks_not_called(someone)
470
+ end
471
+
472
+ def test_deprecated_before_create_returning_false
473
+ someone = CallbackCancellationDeveloper.new
474
+ someone.cancel_before_create = true
475
+ assert_deprecated do
476
+ assert someone.valid?
477
+ assert !someone.save
478
+ end
479
+ assert_save_callbacks_not_called(someone)
480
+ end
481
+
482
+ def test_deprecated_before_update_returning_false
483
+ someone = CallbackCancellationDeveloper.find(1)
484
+ someone.cancel_before_update = true
485
+ assert_deprecated do
486
+ assert someone.valid?
487
+ assert !someone.save
488
+ end
489
+ assert_save_callbacks_not_called(someone)
490
+ end
491
+
492
+ def test_deprecated_before_destroy_returning_false
493
+ david = ImmutableDeveloper.find(1)
494
+ assert_deprecated do
495
+ assert !david.destroy
496
+ exc = assert_raise(ActiveRecord::RecordNotDestroyed) { david.destroy! }
497
+ assert_equal exc.record, david
498
+ assert_equal "Failed to destroy the record", exc.message
499
+ end
500
+ assert_not_nil ImmutableDeveloper.find_by_id(1)
501
+
502
+ someone = CallbackCancellationDeveloper.find(1)
503
+ someone.cancel_before_destroy = true
504
+ assert_deprecated do
505
+ assert !someone.destroy
506
+ assert_raise(ActiveRecord::RecordNotDestroyed) { someone.destroy! }
507
+ end
508
+ assert !someone.after_destroy_called
509
+ end
510
+
511
+ def assert_save_callbacks_not_called(someone)
512
+ assert !someone.after_save_called
513
+ assert !someone.after_create_called
514
+ assert !someone.after_update_called
515
+ end
516
+ private :assert_save_callbacks_not_called
517
+
518
+ def test_before_create_throwing_abort
519
+ someone = CallbackHaltedDeveloper.new
520
+ someone.cancel_before_create = true
521
+ assert someone.valid?
522
+ assert !someone.save
523
+ assert_save_callbacks_not_called(someone)
524
+ end
525
+
526
+ def test_before_save_throwing_abort
527
+ david = DeveloperWithCanceledCallbacks.find(1)
528
+ assert david.valid?
529
+ assert !david.save
530
+ exc = assert_raise(ActiveRecord::RecordNotSaved) { david.save! }
531
+ assert_equal exc.record, david
532
+
533
+ david = DeveloperWithCanceledCallbacks.find(1)
534
+ david.salary = 10_000_000
535
+ assert !david.valid?
536
+ assert !david.save
537
+ assert_raise(ActiveRecord::RecordInvalid) { david.save! }
538
+
539
+ someone = CallbackHaltedDeveloper.find(1)
540
+ someone.cancel_before_save = true
541
+ assert someone.valid?
542
+ assert !someone.save
543
+ assert_save_callbacks_not_called(someone)
544
+ end
545
+
546
+ def test_before_update_throwing_abort
547
+ someone = CallbackHaltedDeveloper.find(1)
548
+ someone.cancel_before_update = true
549
+ assert someone.valid?
550
+ assert !someone.save
551
+ assert_save_callbacks_not_called(someone)
552
+ end
553
+
554
+ def test_before_destroy_throwing_abort
555
+ david = DeveloperWithCanceledCallbacks.find(1)
556
+ assert !david.destroy
557
+ exc = assert_raise(ActiveRecord::RecordNotDestroyed) { david.destroy! }
558
+ assert_equal exc.record, david
559
+ assert_not_nil ImmutableDeveloper.find_by_id(1)
560
+
561
+ someone = CallbackHaltedDeveloper.find(1)
562
+ someone.cancel_before_destroy = true
563
+ assert !someone.destroy
564
+ assert_raise(ActiveRecord::RecordNotDestroyed) { someone.destroy! }
565
+ assert !someone.after_destroy_called
566
+ end
567
+
568
+ def test_callback_returning_false
569
+ david = CallbackDeveloperWithFalseValidation.find(1)
570
+ assert_deprecated { david.save }
571
+ assert_equal [
572
+ [ :after_find, :method ],
573
+ [ :after_find, :string ],
574
+ [ :after_find, :proc ],
575
+ [ :after_find, :object ],
576
+ [ :after_find, :block ],
577
+ [ :after_initialize, :method ],
578
+ [ :after_initialize, :string ],
579
+ [ :after_initialize, :proc ],
580
+ [ :after_initialize, :object ],
581
+ [ :after_initialize, :block ],
582
+ [ :before_validation, :method ],
583
+ [ :before_validation, :string ],
584
+ [ :before_validation, :proc ],
585
+ [ :before_validation, :object ],
586
+ [ :before_validation, :block ],
587
+ [ :before_validation, :returning_false ],
588
+ [ :after_rollback, :block ],
589
+ [ :after_rollback, :object ],
590
+ [ :after_rollback, :proc ],
591
+ [ :after_rollback, :string ],
592
+ [ :after_rollback, :method ],
593
+ ], david.history
594
+ end
595
+
596
+ def test_callback_throwing_abort
597
+ david = CallbackDeveloperWithHaltedValidation.find(1)
598
+ david.save
599
+ assert_equal [
600
+ [ :after_find, :method ],
601
+ [ :after_find, :string ],
602
+ [ :after_find, :proc ],
603
+ [ :after_find, :object ],
604
+ [ :after_find, :block ],
605
+ [ :after_initialize, :method ],
606
+ [ :after_initialize, :string ],
607
+ [ :after_initialize, :proc ],
608
+ [ :after_initialize, :object ],
609
+ [ :after_initialize, :block ],
610
+ [ :before_validation, :method ],
611
+ [ :before_validation, :string ],
612
+ [ :before_validation, :proc ],
613
+ [ :before_validation, :object ],
614
+ [ :before_validation, :block ],
615
+ [ :before_validation, :throwing_abort ],
616
+ [ :after_rollback, :block ],
617
+ [ :after_rollback, :object ],
618
+ [ :after_rollback, :proc ],
619
+ [ :after_rollback, :string ],
620
+ [ :after_rollback, :method ],
621
+ ], david.history
622
+ end
623
+
624
+ def test_inheritance_of_callbacks
625
+ parent = ParentDeveloper.new
626
+ assert !parent.after_save_called
627
+ parent.save
628
+ assert parent.after_save_called
629
+
630
+ child = ChildDeveloper.new
631
+ assert !child.after_save_called
632
+ child.save
633
+ assert child.after_save_called
634
+ end
635
+
636
+ end