ibm_db 3.0.5 → 4.0.0

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 (580) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -0
  3. data/LICENSE +1 -1
  4. data/MANIFEST +14 -14
  5. data/ParameterizedQueries README +6 -6
  6. data/README +208 -225
  7. data/ext/Makefile.nt32 +181 -181
  8. data/ext/Makefile.nt32.191 +212 -212
  9. data/ext/extconf.rb +291 -291
  10. data/ext/ibm_db.c +11887 -11887
  11. data/ext/ruby_ibm_db.h +241 -241
  12. data/ext/ruby_ibm_db_cli.c +866 -866
  13. data/ext/ruby_ibm_db_cli.h +500 -500
  14. data/init.rb +41 -41
  15. data/lib/IBM_DB.rb +27 -27
  16. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3452 -3177
  17. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -2
  18. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  19. data/test/active_record/connection_adapters/fake_adapter.rb +49 -46
  20. data/test/assets/example.log +1 -1
  21. data/test/assets/test.txt +1 -1
  22. data/test/cases/adapter_test.rb +351 -276
  23. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
  24. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
  25. data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
  26. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
  27. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
  28. data/test/cases/adapters/mysql2/connection_test.rb +210 -0
  29. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
  30. data/test/cases/adapters/mysql2/enum_test.rb +26 -0
  31. data/test/cases/adapters/mysql2/explain_test.rb +21 -0
  32. data/test/cases/adapters/mysql2/json_test.rb +195 -0
  33. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
  34. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  35. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
  36. data/test/cases/adapters/mysql2/schema_test.rb +126 -0
  37. data/test/cases/adapters/mysql2/sp_test.rb +36 -0
  38. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
  39. data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
  40. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
  41. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
  42. data/test/cases/adapters/postgresql/array_test.rb +339 -0
  43. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
  44. data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
  45. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
  46. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
  47. data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
  48. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  49. data/test/cases/adapters/postgresql/collation_test.rb +53 -0
  50. data/test/cases/adapters/postgresql/composite_test.rb +132 -0
  51. data/test/cases/adapters/postgresql/connection_test.rb +257 -0
  52. data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
  53. data/test/cases/adapters/postgresql/domain_test.rb +47 -0
  54. data/test/cases/adapters/postgresql/enum_test.rb +91 -0
  55. data/test/cases/adapters/postgresql/explain_test.rb +20 -0
  56. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
  57. data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
  58. data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
  59. data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
  60. data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
  61. data/test/cases/adapters/postgresql/integer_test.rb +25 -0
  62. data/test/cases/adapters/postgresql/json_test.rb +237 -0
  63. data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
  64. data/test/cases/adapters/postgresql/money_test.rb +96 -0
  65. data/test/cases/adapters/postgresql/network_test.rb +94 -0
  66. data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
  67. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
  68. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  69. data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
  70. data/test/cases/adapters/postgresql/range_test.rb +343 -0
  71. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
  72. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
  73. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
  74. data/test/cases/adapters/postgresql/schema_test.rb +597 -0
  75. data/test/cases/adapters/postgresql/serial_test.rb +154 -0
  76. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
  77. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
  78. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
  79. data/test/cases/adapters/postgresql/utils_test.rb +62 -0
  80. data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
  81. data/test/cases/adapters/postgresql/xml_test.rb +54 -0
  82. data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
  83. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
  84. data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
  85. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
  86. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
  87. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  88. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
  89. data/test/cases/aggregations_test.rb +168 -158
  90. data/test/cases/ar_schema_test.rb +146 -161
  91. data/test/cases/associations/association_scope_test.rb +16 -21
  92. data/test/cases/associations/belongs_to_associations_test.rb +1141 -1029
  93. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
  94. data/test/cases/associations/callbacks_test.rb +190 -192
  95. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  96. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  97. data/test/cases/associations/eager_load_nested_include_test.rb +126 -128
  98. data/test/cases/associations/eager_singularization_test.rb +148 -148
  99. data/test/cases/associations/eager_test.rb +1514 -1429
  100. data/test/cases/associations/extension_test.rb +87 -82
  101. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -972
  102. data/test/cases/associations/has_many_associations_test.rb +2501 -2182
  103. data/test/cases/associations/has_many_through_associations_test.rb +1271 -1204
  104. data/test/cases/associations/has_one_associations_test.rb +707 -610
  105. data/test/cases/associations/has_one_through_associations_test.rb +383 -380
  106. data/test/cases/associations/inner_join_association_test.rb +139 -139
  107. data/test/cases/associations/inverse_associations_test.rb +733 -706
  108. data/test/cases/associations/join_model_test.rb +777 -754
  109. data/test/cases/associations/left_outer_join_association_test.rb +88 -0
  110. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  111. data/test/cases/associations/required_test.rb +102 -82
  112. data/test/cases/associations_test.rb +385 -380
  113. data/test/cases/attribute_decorators_test.rb +125 -125
  114. data/test/cases/attribute_methods/read_test.rb +60 -60
  115. data/test/cases/attribute_methods_test.rb +1009 -952
  116. data/test/cases/attribute_set_test.rb +270 -210
  117. data/test/cases/attribute_test.rb +246 -180
  118. data/test/cases/attributes_test.rb +253 -136
  119. data/test/cases/autosave_association_test.rb +1708 -1595
  120. data/test/cases/base_test.rb +1713 -1664
  121. data/test/cases/batches_test.rb +489 -212
  122. data/test/cases/binary_test.rb +44 -52
  123. data/test/cases/bind_parameter_test.rb +110 -100
  124. data/test/cases/cache_key_test.rb +25 -0
  125. data/test/cases/calculations_test.rb +798 -646
  126. data/test/cases/callbacks_test.rb +636 -543
  127. data/test/cases/clone_test.rb +40 -40
  128. data/test/cases/coders/json_test.rb +15 -0
  129. data/test/cases/coders/yaml_column_test.rb +63 -63
  130. data/test/cases/collection_cache_key_test.rb +115 -0
  131. data/test/cases/column_alias_test.rb +17 -17
  132. data/test/cases/column_definition_test.rb +92 -123
  133. data/test/cases/comment_test.rb +143 -0
  134. data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -54
  135. data/test/cases/connection_adapters/connection_handler_test.rb +160 -53
  136. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  137. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -293
  138. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -65
  139. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  140. data/test/cases/connection_adapters/schema_cache_test.rb +61 -56
  141. data/test/cases/connection_adapters/type_lookup_test.rb +118 -110
  142. data/test/cases/connection_management_test.rb +112 -122
  143. data/test/cases/connection_pool_test.rb +521 -346
  144. data/test/cases/connection_specification/resolver_test.rb +131 -116
  145. data/test/cases/core_test.rb +112 -112
  146. data/test/cases/counter_cache_test.rb +214 -209
  147. data/test/cases/custom_locking_test.rb +17 -17
  148. data/test/cases/database_statements_test.rb +34 -19
  149. data/test/cases/{invalid_date_test.rb → date_test.rb} +44 -32
  150. data/test/cases/date_time_precision_test.rb +106 -0
  151. data/test/cases/date_time_test.rb +61 -61
  152. data/test/cases/defaults_test.rb +218 -223
  153. data/test/cases/dirty_test.rb +763 -785
  154. data/test/cases/disconnected_test.rb +30 -28
  155. data/test/cases/dup_test.rb +157 -157
  156. data/test/cases/enum_test.rb +444 -290
  157. data/test/cases/errors_test.rb +16 -0
  158. data/test/cases/explain_subscriber_test.rb +64 -64
  159. data/test/cases/explain_test.rb +87 -76
  160. data/test/cases/finder_respond_to_test.rb +60 -60
  161. data/test/cases/finder_test.rb +1294 -1169
  162. data/test/cases/fixture_set/file_test.rb +156 -138
  163. data/test/cases/fixtures_test.rb +988 -908
  164. data/test/cases/forbidden_attributes_protection_test.rb +165 -99
  165. data/test/cases/habtm_destroy_order_test.rb +61 -61
  166. data/test/cases/helper.rb +204 -210
  167. data/test/cases/hot_compatibility_test.rb +142 -54
  168. data/test/cases/i18n_test.rb +45 -45
  169. data/test/cases/inheritance_test.rb +606 -375
  170. data/test/cases/integration_test.rb +155 -139
  171. data/test/cases/invalid_connection_test.rb +24 -22
  172. data/test/cases/invertible_migration_test.rb +387 -295
  173. data/test/cases/json_serialization_test.rb +311 -302
  174. data/test/cases/locking_test.rb +493 -477
  175. data/test/cases/log_subscriber_test.rb +225 -136
  176. data/test/cases/migration/change_schema_test.rb +458 -512
  177. data/test/cases/migration/change_table_test.rb +256 -224
  178. data/test/cases/migration/column_attributes_test.rb +176 -192
  179. data/test/cases/migration/column_positioning_test.rb +56 -56
  180. data/test/cases/migration/columns_test.rb +310 -304
  181. data/test/cases/migration/command_recorder_test.rb +350 -305
  182. data/test/cases/migration/compatibility_test.rb +118 -0
  183. data/test/cases/migration/create_join_table_test.rb +157 -148
  184. data/test/cases/migration/foreign_key_test.rb +360 -328
  185. data/test/cases/migration/helper.rb +39 -39
  186. data/test/cases/migration/index_test.rb +218 -216
  187. data/test/cases/migration/logger_test.rb +36 -36
  188. data/test/cases/migration/pending_migrations_test.rb +52 -53
  189. data/test/cases/migration/references_foreign_key_test.rb +216 -169
  190. data/test/cases/migration/references_index_test.rb +101 -101
  191. data/test/cases/migration/references_statements_test.rb +136 -116
  192. data/test/cases/migration/rename_table_test.rb +93 -93
  193. data/test/cases/migration_test.rb +1157 -959
  194. data/test/cases/migrator_test.rb +470 -388
  195. data/test/cases/mixin_test.rb +68 -70
  196. data/test/cases/modules_test.rb +172 -173
  197. data/test/cases/multiparameter_attributes_test.rb +372 -350
  198. data/test/cases/multiple_db_test.rb +122 -115
  199. data/test/cases/nested_attributes_test.rb +1098 -1070
  200. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  201. data/test/cases/persistence_test.rb +1001 -909
  202. data/test/cases/pooled_connections_test.rb +81 -81
  203. data/test/cases/primary_keys_test.rb +376 -237
  204. data/test/cases/query_cache_test.rb +446 -326
  205. data/test/cases/quoting_test.rb +202 -156
  206. data/test/cases/readonly_test.rb +119 -118
  207. data/test/cases/reaper_test.rb +85 -85
  208. data/test/cases/reflection_test.rb +509 -463
  209. data/test/cases/relation/delegation_test.rb +63 -68
  210. data/test/cases/relation/merging_test.rb +157 -161
  211. data/test/cases/relation/mutation_test.rb +183 -165
  212. data/test/cases/relation/or_test.rb +92 -0
  213. data/test/cases/relation/predicate_builder_test.rb +16 -14
  214. data/test/cases/relation/record_fetch_warning_test.rb +40 -0
  215. data/test/cases/relation/where_chain_test.rb +105 -181
  216. data/test/cases/relation/where_clause_test.rb +182 -0
  217. data/test/cases/relation/where_test.rb +322 -300
  218. data/test/cases/relation_test.rb +328 -319
  219. data/test/cases/relations_test.rb +2026 -1815
  220. data/test/cases/reload_models_test.rb +22 -22
  221. data/test/cases/result_test.rb +90 -80
  222. data/test/cases/sanitize_test.rb +176 -83
  223. data/test/cases/schema_dumper_test.rb +457 -463
  224. data/test/cases/schema_loading_test.rb +52 -0
  225. data/test/cases/scoping/default_scoping_test.rb +528 -454
  226. data/test/cases/scoping/named_scoping_test.rb +561 -524
  227. data/test/cases/scoping/relation_scoping_test.rb +400 -357
  228. data/test/cases/secure_token_test.rb +32 -0
  229. data/test/cases/serialization_test.rb +104 -104
  230. data/test/cases/serialized_attribute_test.rb +364 -277
  231. data/test/cases/statement_cache_test.rb +136 -98
  232. data/test/cases/store_test.rb +195 -194
  233. data/test/cases/suppressor_test.rb +63 -0
  234. data/test/cases/tasks/database_tasks_test.rb +462 -398
  235. data/test/cases/tasks/mysql_rake_test.rb +345 -324
  236. data/test/cases/tasks/postgresql_rake_test.rb +304 -250
  237. data/test/cases/tasks/sqlite_rake_test.rb +220 -193
  238. data/test/cases/test_case.rb +131 -123
  239. data/test/cases/test_fixtures_test.rb +36 -0
  240. data/test/cases/time_precision_test.rb +102 -0
  241. data/test/cases/timestamp_test.rb +501 -467
  242. data/test/cases/touch_later_test.rb +121 -0
  243. data/test/cases/transaction_callbacks_test.rb +518 -452
  244. data/test/cases/transaction_isolation_test.rb +106 -106
  245. data/test/cases/transactions_test.rb +834 -817
  246. data/test/cases/type/adapter_specific_registry_test.rb +133 -0
  247. data/test/cases/type/date_time_test.rb +14 -0
  248. data/test/cases/type/integer_test.rb +27 -121
  249. data/test/cases/type/string_test.rb +22 -36
  250. data/test/cases/type/type_map_test.rb +177 -177
  251. data/test/cases/type_test.rb +39 -0
  252. data/test/cases/types_test.rb +24 -141
  253. data/test/cases/unconnected_test.rb +33 -33
  254. data/test/cases/validations/absence_validation_test.rb +73 -0
  255. data/test/cases/validations/association_validation_test.rb +97 -86
  256. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  257. data/test/cases/validations/i18n_validation_test.rb +86 -90
  258. data/test/cases/validations/length_validation_test.rb +79 -47
  259. data/test/cases/validations/presence_validation_test.rb +103 -68
  260. data/test/cases/validations/uniqueness_validation_test.rb +548 -457
  261. data/test/cases/validations_repair_helper.rb +19 -23
  262. data/test/cases/validations_test.rb +194 -165
  263. data/test/cases/view_test.rb +216 -119
  264. data/test/cases/yaml_serialization_test.rb +121 -126
  265. data/test/config.example.yml +97 -0
  266. data/test/config.rb +5 -5
  267. data/test/fixtures/accounts.yml +29 -29
  268. data/test/fixtures/admin/accounts.yml +2 -2
  269. data/test/fixtures/admin/users.yml +10 -10
  270. data/test/fixtures/author_addresses.original +11 -0
  271. data/test/fixtures/author_addresses.yml +17 -17
  272. data/test/fixtures/author_favorites.yml +3 -3
  273. data/test/fixtures/authors.original +17 -0
  274. data/test/fixtures/authors.yml +23 -23
  275. data/test/fixtures/bad_posts.yml +9 -0
  276. data/test/fixtures/binaries.yml +133 -133
  277. data/test/fixtures/books.yml +31 -11
  278. data/test/fixtures/bulbs.yml +5 -5
  279. data/test/fixtures/cars.yml +9 -9
  280. data/test/fixtures/categories.yml +19 -19
  281. data/test/fixtures/categories/special_categories.yml +9 -9
  282. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  283. data/test/fixtures/categories_ordered.yml +7 -7
  284. data/test/fixtures/categories_posts.yml +31 -31
  285. data/test/fixtures/categorizations.yml +23 -23
  286. data/test/fixtures/clubs.yml +8 -8
  287. data/test/fixtures/collections.yml +3 -3
  288. data/test/fixtures/colleges.yml +3 -3
  289. data/test/fixtures/comments.yml +65 -65
  290. data/test/fixtures/companies.yml +67 -67
  291. data/test/fixtures/computers.yml +10 -10
  292. data/test/fixtures/content.yml +3 -0
  293. data/test/fixtures/content_positions.yml +3 -0
  294. data/test/fixtures/courses.yml +8 -8
  295. data/test/fixtures/customers.yml +25 -25
  296. data/test/fixtures/dashboards.yml +6 -6
  297. data/test/fixtures/dead_parrots.yml +5 -0
  298. data/test/fixtures/developers.yml +22 -22
  299. data/test/fixtures/developers_projects.yml +16 -16
  300. data/test/fixtures/dog_lovers.yml +7 -7
  301. data/test/fixtures/dogs.yml +4 -4
  302. data/test/fixtures/doubloons.yml +3 -3
  303. data/test/fixtures/edges.yml +5 -5
  304. data/test/fixtures/entrants.yml +14 -14
  305. data/test/fixtures/essays.yml +6 -6
  306. data/test/fixtures/faces.yml +11 -11
  307. data/test/fixtures/fk_test_has_fk.yml +3 -3
  308. data/test/fixtures/fk_test_has_pk.yml +1 -1
  309. data/test/fixtures/friendships.yml +4 -4
  310. data/test/fixtures/funny_jokes.yml +10 -10
  311. data/test/fixtures/interests.yml +33 -33
  312. data/test/fixtures/items.yml +3 -3
  313. data/test/fixtures/jobs.yml +7 -7
  314. data/test/fixtures/legacy_things.yml +3 -3
  315. data/test/fixtures/live_parrots.yml +4 -0
  316. data/test/fixtures/mateys.yml +4 -4
  317. data/test/fixtures/member_details.yml +8 -8
  318. data/test/fixtures/member_types.yml +6 -6
  319. data/test/fixtures/members.yml +11 -11
  320. data/test/fixtures/memberships.yml +34 -34
  321. data/test/fixtures/men.yml +5 -5
  322. data/test/fixtures/minimalistics.yml +2 -2
  323. data/test/fixtures/minivans.yml +5 -5
  324. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  325. data/test/fixtures/mixins.yml +29 -29
  326. data/test/fixtures/movies.yml +7 -7
  327. data/test/fixtures/naked/yml/accounts.yml +1 -1
  328. data/test/fixtures/naked/yml/companies.yml +1 -1
  329. data/test/fixtures/naked/yml/courses.yml +1 -1
  330. data/test/fixtures/naked/yml/parrots.yml +2 -0
  331. data/test/fixtures/naked/yml/trees.yml +3 -0
  332. data/test/fixtures/nodes.yml +29 -0
  333. data/test/fixtures/organizations.yml +5 -5
  334. data/test/fixtures/other_comments.yml +6 -0
  335. data/test/fixtures/other_dogs.yml +2 -0
  336. data/test/fixtures/other_posts.yml +7 -0
  337. data/test/fixtures/other_topics.yml +42 -42
  338. data/test/fixtures/owners.yml +9 -9
  339. data/test/fixtures/parrots.yml +27 -27
  340. data/test/fixtures/parrots_pirates.yml +7 -7
  341. data/test/fixtures/people.yml +24 -24
  342. data/test/fixtures/peoples_treasures.yml +3 -3
  343. data/test/fixtures/pets.yml +19 -19
  344. data/test/fixtures/pirates.yml +15 -12
  345. data/test/fixtures/posts.yml +80 -80
  346. data/test/fixtures/price_estimates.yml +16 -7
  347. data/test/fixtures/products.yml +4 -4
  348. data/test/fixtures/projects.yml +7 -7
  349. data/test/fixtures/ratings.yml +14 -14
  350. data/test/fixtures/readers.yml +11 -11
  351. data/test/fixtures/references.yml +17 -17
  352. data/test/fixtures/reserved_words/distinct.yml +5 -5
  353. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  354. data/test/fixtures/reserved_words/group.yml +14 -14
  355. data/test/fixtures/reserved_words/select.yml +8 -8
  356. data/test/fixtures/reserved_words/values.yml +7 -7
  357. data/test/fixtures/ships.yml +6 -6
  358. data/test/fixtures/speedometers.yml +8 -8
  359. data/test/fixtures/sponsors.yml +12 -12
  360. data/test/fixtures/string_key_objects.yml +7 -7
  361. data/test/fixtures/subscribers.yml +10 -10
  362. data/test/fixtures/subscriptions.yml +12 -12
  363. data/test/fixtures/taggings.yml +78 -78
  364. data/test/fixtures/tags.yml +11 -11
  365. data/test/fixtures/tasks.yml +7 -7
  366. data/test/fixtures/teapots.yml +3 -3
  367. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  368. data/test/fixtures/to_be_linked/users.yml +10 -10
  369. data/test/fixtures/topics.yml +49 -49
  370. data/test/fixtures/toys.yml +14 -14
  371. data/test/fixtures/traffic_lights.yml +9 -9
  372. data/test/fixtures/treasures.yml +10 -10
  373. data/test/fixtures/trees.yml +3 -0
  374. data/test/fixtures/uuid_children.yml +3 -3
  375. data/test/fixtures/uuid_parents.yml +2 -2
  376. data/test/fixtures/variants.yml +4 -4
  377. data/test/fixtures/vegetables.yml +19 -19
  378. data/test/fixtures/vertices.yml +3 -3
  379. data/test/fixtures/warehouse_things.yml +2 -2
  380. data/test/fixtures/zines.yml +5 -5
  381. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  382. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  383. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  384. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -9
  385. data/test/migrations/missing/1_people_have_last_names.rb +9 -9
  386. data/test/migrations/missing/3_we_need_reminders.rb +12 -12
  387. data/test/migrations/missing/4_innocent_jointable.rb +12 -12
  388. data/test/migrations/rename/1_we_need_things.rb +11 -11
  389. data/test/migrations/rename/2_rename_things.rb +9 -9
  390. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  391. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  392. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  393. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  394. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  395. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  396. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  397. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  398. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  399. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  400. data/test/migrations/valid/2_we_need_reminders.rb +12 -12
  401. data/test/migrations/valid/3_innocent_jointable.rb +12 -12
  402. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  403. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -12
  404. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -12
  405. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  406. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  407. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  408. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  409. data/test/models/admin.rb +5 -5
  410. data/test/models/admin/account.rb +3 -3
  411. data/test/models/admin/randomly_named_c1.rb +6 -2
  412. data/test/models/admin/user.rb +40 -40
  413. data/test/models/aircraft.rb +5 -4
  414. data/test/models/arunit2_model.rb +3 -3
  415. data/test/models/author.rb +209 -212
  416. data/test/models/auto_id.rb +4 -4
  417. data/test/models/autoloadable/extra_firm.rb +2 -2
  418. data/test/models/binary.rb +2 -2
  419. data/test/models/bird.rb +12 -12
  420. data/test/models/book.rb +23 -18
  421. data/test/models/boolean.rb +2 -2
  422. data/test/models/bulb.rb +52 -51
  423. data/test/models/cake_designer.rb +3 -3
  424. data/test/models/car.rb +29 -26
  425. data/test/models/carrier.rb +2 -2
  426. data/test/models/cat.rb +10 -0
  427. data/test/models/categorization.rb +19 -19
  428. data/test/models/category.rb +35 -35
  429. data/test/models/chef.rb +8 -7
  430. data/test/models/citation.rb +3 -3
  431. data/test/models/club.rb +25 -23
  432. data/test/models/college.rb +10 -10
  433. data/test/models/column.rb +3 -3
  434. data/test/models/column_name.rb +3 -3
  435. data/test/models/comment.rb +76 -64
  436. data/test/models/company.rb +230 -228
  437. data/test/models/company_in_module.rb +98 -98
  438. data/test/models/computer.rb +3 -3
  439. data/test/models/contact.rb +41 -41
  440. data/test/models/content.rb +40 -0
  441. data/test/models/contract.rb +20 -20
  442. data/test/models/country.rb +7 -7
  443. data/test/models/course.rb +6 -6
  444. data/test/models/customer.rb +83 -77
  445. data/test/models/customer_carrier.rb +14 -14
  446. data/test/models/dashboard.rb +3 -3
  447. data/test/models/default.rb +2 -2
  448. data/test/models/department.rb +4 -4
  449. data/test/models/developer.rb +274 -255
  450. data/test/models/dog.rb +5 -5
  451. data/test/models/dog_lover.rb +5 -5
  452. data/test/models/doubloon.rb +12 -12
  453. data/test/models/drink_designer.rb +3 -3
  454. data/test/models/edge.rb +5 -5
  455. data/test/models/electron.rb +5 -5
  456. data/test/models/engine.rb +4 -4
  457. data/test/models/entrant.rb +3 -3
  458. data/test/models/essay.rb +5 -5
  459. data/test/models/event.rb +3 -3
  460. data/test/models/eye.rb +37 -37
  461. data/test/models/face.rb +9 -9
  462. data/test/models/friendship.rb +6 -6
  463. data/test/models/guid.rb +2 -2
  464. data/test/models/guitar.rb +4 -0
  465. data/test/models/hotel.rb +11 -9
  466. data/test/models/image.rb +3 -3
  467. data/test/models/interest.rb +5 -5
  468. data/test/models/invoice.rb +4 -4
  469. data/test/models/item.rb +7 -7
  470. data/test/models/job.rb +7 -7
  471. data/test/models/joke.rb +7 -7
  472. data/test/models/keyboard.rb +3 -3
  473. data/test/models/legacy_thing.rb +3 -3
  474. data/test/models/lesson.rb +11 -11
  475. data/test/models/line_item.rb +3 -3
  476. data/test/models/liquid.rb +4 -4
  477. data/test/models/man.rb +11 -11
  478. data/test/models/matey.rb +4 -4
  479. data/test/models/member.rb +42 -41
  480. data/test/models/member_detail.rb +8 -7
  481. data/test/models/member_type.rb +3 -3
  482. data/test/models/membership.rb +35 -35
  483. data/test/models/mentor.rb +3 -0
  484. data/test/models/minimalistic.rb +2 -2
  485. data/test/models/minivan.rb +9 -9
  486. data/test/models/mixed_case_monkey.rb +3 -3
  487. data/test/models/mocktail_designer.rb +2 -0
  488. data/test/models/molecule.rb +6 -6
  489. data/test/models/movie.rb +5 -5
  490. data/test/models/node.rb +5 -0
  491. data/test/models/non_primary_key.rb +2 -0
  492. data/test/models/notification.rb +3 -0
  493. data/test/models/order.rb +4 -4
  494. data/test/models/organization.rb +14 -14
  495. data/test/models/other_dog.rb +5 -0
  496. data/test/models/owner.rb +37 -34
  497. data/test/models/parrot.rb +28 -29
  498. data/test/models/person.rb +142 -143
  499. data/test/models/personal_legacy_thing.rb +4 -4
  500. data/test/models/pet.rb +18 -15
  501. data/test/models/pet_treasure.rb +6 -0
  502. data/test/models/pirate.rb +92 -92
  503. data/test/models/possession.rb +3 -3
  504. data/test/models/post.rb +273 -264
  505. data/test/models/price_estimate.rb +4 -4
  506. data/test/models/professor.rb +5 -5
  507. data/test/models/project.rb +40 -31
  508. data/test/models/publisher.rb +2 -2
  509. data/test/models/publisher/article.rb +4 -4
  510. data/test/models/publisher/magazine.rb +3 -3
  511. data/test/models/randomly_named_c1.rb +1 -1
  512. data/test/models/rating.rb +4 -4
  513. data/test/models/reader.rb +23 -23
  514. data/test/models/recipe.rb +3 -0
  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 -33
  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 -7
  530. data/test/models/tagging.rb +13 -13
  531. data/test/models/task.rb +5 -5
  532. data/test/models/topic.rb +118 -124
  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 -0
  538. data/test/models/tuning_peg.rb +4 -0
  539. data/test/models/tyre.rb +11 -11
  540. data/test/models/user.rb +14 -0
  541. data/test/models/uuid_child.rb +3 -3
  542. data/test/models/uuid_item.rb +6 -0
  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/mysql2_specific_schema.rb +68 -58
  552. data/test/schema/oracle_specific_schema.rb +40 -43
  553. data/test/schema/postgresql_specific_schema.rb +114 -202
  554. data/test/schema/schema.rb +1057 -952
  555. data/test/schema/schema.rb.original +1057 -0
  556. data/test/schema/sqlite_specific_schema.rb +18 -22
  557. data/test/support/config.rb +43 -43
  558. data/test/support/connection.rb +23 -22
  559. data/test/support/connection_helper.rb +14 -14
  560. data/test/support/ddl_helper.rb +8 -8
  561. data/test/support/schema_dumping_helper.rb +20 -20
  562. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  563. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  564. metadata +129 -24
  565. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
  566. data/test/cases/attribute_methods/serialization_test.rb +0 -29
  567. data/test/cases/migration/change_schema_test - Copy.rb +0 -448
  568. data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
  569. data/test/cases/migration/table_and_index_test.rb +0 -24
  570. data/test/cases/relation/where_test2.rb +0 -36
  571. data/test/cases/type/decimal_test.rb +0 -56
  572. data/test/cases/type/unsigned_integer_test.rb +0 -18
  573. data/test/cases/xml_serialization_test.rb +0 -457
  574. data/test/connections/native_ibm_db/connection.rb +0 -44
  575. data/test/fixtures/naked/csv/accounts.csv +0 -1
  576. data/test/schema/i5/ibm_db_specific_schema.rb +0 -137
  577. data/test/schema/ids/ibm_db_specific_schema.rb +0 -140
  578. data/test/schema/luw/ibm_db_specific_schema.rb +0 -137
  579. data/test/schema/mysql_specific_schema.rb +0 -70
  580. data/test/schema/zOS/ibm_db_specific_schema.rb +0 -208
@@ -1,99 +1,165 @@
1
- require 'cases/helper'
2
- require 'active_support/core_ext/hash/indifferent_access'
3
- require 'models/person'
4
- require 'models/company'
5
-
6
- class ProtectedParams < ActiveSupport::HashWithIndifferentAccess
7
- attr_accessor :permitted
8
- alias :permitted? :permitted
9
-
10
- def initialize(attributes)
11
- super(attributes)
12
- @permitted = false
13
- end
14
-
15
- def permit!
16
- @permitted = true
17
- self
18
- end
19
-
20
- def dup
21
- super.tap do |duplicate|
22
- duplicate.instance_variable_set :@permitted, @permitted
23
- end
24
- end
25
- end
26
-
27
- class ForbiddenAttributesProtectionTest < ActiveRecord::TestCase
28
- def test_forbidden_attributes_cannot_be_used_for_mass_assignment
29
- params = ProtectedParams.new(first_name: 'Guille', gender: 'm')
30
- assert_raises(ActiveModel::ForbiddenAttributesError) do
31
- Person.new(params)
32
- end
33
- end
34
-
35
- def test_permitted_attributes_can_be_used_for_mass_assignment
36
- params = ProtectedParams.new(first_name: 'Guille', gender: 'm')
37
- params.permit!
38
- person = Person.new(params)
39
-
40
- assert_equal 'Guille', person.first_name
41
- assert_equal 'm', person.gender
42
- end
43
-
44
- def test_forbidden_attributes_cannot_be_used_for_sti_inheritance_column
45
- params = ProtectedParams.new(type: 'Client')
46
- assert_raises(ActiveModel::ForbiddenAttributesError) do
47
- Company.new(params)
48
- end
49
- end
50
-
51
- def test_permitted_attributes_can_be_used_for_sti_inheritance_column
52
- params = ProtectedParams.new(type: 'Client')
53
- params.permit!
54
- person = Company.new(params)
55
- assert_equal person.class, Client
56
- end
57
-
58
- def test_regular_hash_should_still_be_used_for_mass_assignment
59
- person = Person.new(first_name: 'Guille', gender: 'm')
60
-
61
- assert_equal 'Guille', person.first_name
62
- assert_equal 'm', person.gender
63
- end
64
-
65
- def test_blank_attributes_should_not_raise
66
- person = Person.new
67
- assert_nil person.assign_attributes(ProtectedParams.new({}))
68
- end
69
-
70
- def test_create_with_checks_permitted
71
- params = ProtectedParams.new(first_name: 'Guille', gender: 'm')
72
-
73
- assert_raises(ActiveModel::ForbiddenAttributesError) do
74
- Person.create_with(params).create!
75
- end
76
- end
77
-
78
- def test_create_with_works_with_params_values
79
- params = ProtectedParams.new(first_name: 'Guille')
80
-
81
- person = Person.create_with(first_name: params[:first_name]).create!
82
- assert_equal 'Guille', person.first_name
83
- end
84
-
85
- def test_where_checks_permitted
86
- params = ProtectedParams.new(first_name: 'Guille', gender: 'm')
87
-
88
- assert_raises(ActiveModel::ForbiddenAttributesError) do
89
- Person.where(params).create!
90
- end
91
- end
92
-
93
- def test_where_works_with_params_values
94
- params = ProtectedParams.new(first_name: 'Guille')
95
-
96
- person = Person.where(first_name: params[:first_name]).create!
97
- assert_equal 'Guille', person.first_name
98
- end
99
- end
1
+ require 'cases/helper'
2
+ require 'active_support/core_ext/hash/indifferent_access'
3
+
4
+ require 'models/company'
5
+ require 'models/person'
6
+ require 'models/ship'
7
+ require 'models/ship_part'
8
+ require 'models/treasure'
9
+
10
+ class ProtectedParams
11
+ attr_accessor :permitted
12
+ alias :permitted? :permitted
13
+
14
+ delegate :keys, :key?, :has_key?, :empty?, to: :@parameters
15
+
16
+ def initialize(attributes)
17
+ @parameters = attributes.with_indifferent_access
18
+ @permitted = false
19
+ end
20
+
21
+ def permit!
22
+ @permitted = true
23
+ self
24
+ end
25
+
26
+ def [](key)
27
+ @parameters[key]
28
+ end
29
+
30
+ def to_h
31
+ @parameters
32
+ end
33
+
34
+ def stringify_keys
35
+ dup
36
+ end
37
+
38
+ def dup
39
+ super.tap do |duplicate|
40
+ duplicate.instance_variable_set :@permitted, @permitted
41
+ end
42
+ end
43
+ end
44
+
45
+ class ForbiddenAttributesProtectionTest < ActiveRecord::TestCase
46
+ def test_forbidden_attributes_cannot_be_used_for_mass_assignment
47
+ params = ProtectedParams.new(first_name: 'Guille', gender: 'm')
48
+ assert_raises(ActiveModel::ForbiddenAttributesError) do
49
+ Person.new(params)
50
+ end
51
+ end
52
+
53
+ def test_permitted_attributes_can_be_used_for_mass_assignment
54
+ params = ProtectedParams.new(first_name: 'Guille', gender: 'm')
55
+ params.permit!
56
+ person = Person.new(params)
57
+
58
+ assert_equal 'Guille', person.first_name
59
+ assert_equal 'm', person.gender
60
+ end
61
+
62
+ def test_forbidden_attributes_cannot_be_used_for_sti_inheritance_column
63
+ params = ProtectedParams.new(type: 'Client')
64
+ assert_raises(ActiveModel::ForbiddenAttributesError) do
65
+ Company.new(params)
66
+ end
67
+ end
68
+
69
+ def test_permitted_attributes_can_be_used_for_sti_inheritance_column
70
+ params = ProtectedParams.new(type: 'Client')
71
+ params.permit!
72
+ person = Company.new(params)
73
+ assert_equal person.class, Client
74
+ end
75
+
76
+ def test_regular_hash_should_still_be_used_for_mass_assignment
77
+ person = Person.new(first_name: 'Guille', gender: 'm')
78
+
79
+ assert_equal 'Guille', person.first_name
80
+ assert_equal 'm', person.gender
81
+ end
82
+
83
+ def test_blank_attributes_should_not_raise
84
+ person = Person.new
85
+ assert_nil person.assign_attributes(ProtectedParams.new({}))
86
+ end
87
+
88
+ def test_create_with_checks_permitted
89
+ params = ProtectedParams.new(first_name: 'Guille', gender: 'm')
90
+
91
+ assert_raises(ActiveModel::ForbiddenAttributesError) do
92
+ Person.create_with(params).create!
93
+ end
94
+ end
95
+
96
+ def test_create_with_works_with_permitted_params
97
+ params = ProtectedParams.new(first_name: 'Guille').permit!
98
+
99
+ person = Person.create_with(params).create!
100
+ assert_equal 'Guille', person.first_name
101
+ end
102
+
103
+ def test_create_with_works_with_params_values
104
+ params = ProtectedParams.new(first_name: 'Guille')
105
+
106
+ person = Person.create_with(first_name: params[:first_name]).create!
107
+ assert_equal 'Guille', person.first_name
108
+ end
109
+
110
+ def test_where_checks_permitted
111
+ params = ProtectedParams.new(first_name: 'Guille', gender: 'm')
112
+
113
+ assert_raises(ActiveModel::ForbiddenAttributesError) do
114
+ Person.where(params).create!
115
+ end
116
+ end
117
+
118
+ def test_where_works_with_permitted_params
119
+ params = ProtectedParams.new(first_name: 'Guille').permit!
120
+
121
+ person = Person.where(params).create!
122
+ assert_equal 'Guille', person.first_name
123
+ end
124
+
125
+ def test_where_works_with_params_values
126
+ params = ProtectedParams.new(first_name: 'Guille')
127
+
128
+ person = Person.where(first_name: params[:first_name]).create!
129
+ assert_equal 'Guille', person.first_name
130
+ end
131
+
132
+ def test_where_not_checks_permitted
133
+ params = ProtectedParams.new(first_name: 'Guille', gender: 'm')
134
+
135
+ assert_raises(ActiveModel::ForbiddenAttributesError) do
136
+ Person.where().not(params)
137
+ end
138
+ end
139
+
140
+ def test_where_not_works_with_permitted_params
141
+ params = ProtectedParams.new(first_name: 'Guille').permit!
142
+ Person.create!(params)
143
+ assert_empty Person.where.not(params).select {|p| p.first_name == 'Guille' }
144
+ end
145
+
146
+ def test_strong_params_style_objects_work_with_singular_associations
147
+ params = ProtectedParams.new( name: "Stern", ship_attributes: ProtectedParams.new(name: "The Black Rock").permit!).permit!
148
+ part = ShipPart.new(params)
149
+
150
+ assert_equal "Stern", part.name
151
+ assert_equal "The Black Rock", part.ship.name
152
+ end
153
+
154
+ def test_strong_params_style_objects_work_with_collection_associations
155
+ params = ProtectedParams.new(
156
+ trinkets_attributes: ProtectedParams.new(
157
+ "0" => ProtectedParams.new(name: "Necklace").permit!,
158
+ "1" => ProtectedParams.new(name: "Spoon").permit! ) ).permit!
159
+ part = ShipPart.new(params)
160
+
161
+ assert_equal "Necklace", part.trinkets[0].name
162
+ assert_equal "Spoon", part.trinkets[1].name
163
+ end
164
+
165
+ end
@@ -1,61 +1,61 @@
1
- require "cases/helper"
2
- require "models/lesson"
3
- require "models/student"
4
-
5
- class HabtmDestroyOrderTest < ActiveRecord::TestCase
6
- test "may not delete a lesson with students" do
7
- sicp = Lesson.new(:name => "SICP")
8
- ben = Student.new(:name => "Ben Bitdiddle")
9
- sicp.students << ben
10
- sicp.save!
11
- assert_raises LessonError do
12
- assert_no_difference('Lesson.count') do
13
- sicp.destroy
14
- end
15
- end
16
- assert !sicp.destroyed?
17
- end
18
-
19
- test 'should not raise error if have foreign key in the join table' do
20
- student = Student.new(:name => "Ben Bitdiddle")
21
- lesson = Lesson.new(:name => "SICP")
22
- lesson.students << student
23
- lesson.save!
24
- assert_nothing_raised do
25
- student.destroy
26
- end
27
- end
28
-
29
- test "not destroying a student with lessons leaves student<=>lesson association intact" do
30
- # test a normal before_destroy doesn't destroy the habtm joins
31
- begin
32
- sicp = Lesson.new(:name => "SICP")
33
- ben = Student.new(:name => "Ben Bitdiddle")
34
- # add a before destroy to student
35
- Student.class_eval do
36
- before_destroy do
37
- raise ActiveRecord::Rollback unless lessons.empty?
38
- end
39
- end
40
- ben.lessons << sicp
41
- ben.save!
42
- ben.destroy
43
- assert !ben.reload.lessons.empty?
44
- ensure
45
- # get rid of it so Student is still like it was
46
- Student.reset_callbacks(:destroy)
47
- end
48
- end
49
-
50
- test "not destroying a lesson with students leaves student<=>lesson association intact" do
51
- # test a more aggressive before_destroy doesn't destroy the habtm joins and still throws the exception
52
- sicp = Lesson.new(:name => "SICP")
53
- ben = Student.new(:name => "Ben Bitdiddle")
54
- sicp.students << ben
55
- sicp.save!
56
- assert_raises LessonError do
57
- sicp.destroy
58
- end
59
- assert !sicp.reload.students.empty?
60
- end
61
- end
1
+ require "cases/helper"
2
+ require "models/lesson"
3
+ require "models/student"
4
+
5
+ class HabtmDestroyOrderTest < ActiveRecord::TestCase
6
+ test "may not delete a lesson with students" do
7
+ sicp = Lesson.new(:name => "SICP")
8
+ ben = Student.new(:name => "Ben Bitdiddle")
9
+ sicp.students << ben
10
+ sicp.save!
11
+ assert_raises LessonError do
12
+ assert_no_difference('Lesson.count') do
13
+ sicp.destroy
14
+ end
15
+ end
16
+ assert !sicp.destroyed?
17
+ end
18
+
19
+ test 'should not raise error if have foreign key in the join table' do
20
+ student = Student.new(:name => "Ben Bitdiddle")
21
+ lesson = Lesson.new(:name => "SICP")
22
+ lesson.students << student
23
+ lesson.save!
24
+ assert_nothing_raised do
25
+ student.destroy
26
+ end
27
+ end
28
+
29
+ test "not destroying a student with lessons leaves student<=>lesson association intact" do
30
+ # test a normal before_destroy doesn't destroy the habtm joins
31
+ begin
32
+ sicp = Lesson.new(:name => "SICP")
33
+ ben = Student.new(:name => "Ben Bitdiddle")
34
+ # add a before destroy to student
35
+ Student.class_eval do
36
+ before_destroy do
37
+ raise ActiveRecord::Rollback unless lessons.empty?
38
+ end
39
+ end
40
+ ben.lessons << sicp
41
+ ben.save!
42
+ ben.destroy
43
+ assert !ben.reload.lessons.empty?
44
+ ensure
45
+ # get rid of it so Student is still like it was
46
+ Student.reset_callbacks(:destroy)
47
+ end
48
+ end
49
+
50
+ test "not destroying a lesson with students leaves student<=>lesson association intact" do
51
+ # test a more aggressive before_destroy doesn't destroy the habtm joins and still throws the exception
52
+ sicp = Lesson.new(:name => "SICP")
53
+ ben = Student.new(:name => "Ben Bitdiddle")
54
+ sicp.students << ben
55
+ sicp.save!
56
+ assert_raises LessonError do
57
+ sicp.destroy
58
+ end
59
+ assert !sicp.reload.students.empty?
60
+ end
61
+ end
@@ -1,210 +1,204 @@
1
- require File.expand_path('../../../../load_paths', __FILE__)
2
-
3
- require 'config'
4
-
5
- require 'active_support/testing/autorun'
6
- require 'stringio'
7
-
8
- require 'active_record'
9
- require 'cases/test_case'
10
- require 'active_support/dependencies'
11
- require 'active_support/logger'
12
- require 'active_support/core_ext/string/strip'
13
-
14
- require 'support/config'
15
- require 'support/connection'
16
-
17
- # TODO: Move all these random hacks into the ARTest namespace and into the support/ dir
18
-
19
- Thread.abort_on_exception = true
20
-
21
- # Show backtraces for deprecated behavior for quicker cleanup.
22
- ActiveSupport::Deprecation.debug = true
23
-
24
- # Disable available locale checks to avoid warnings running the test suite.
25
- I18n.enforce_available_locales = false
26
-
27
- # Enable raise errors in after_commit and after_rollback.
28
- ActiveRecord::Base.raise_in_transactional_callbacks = true
29
-
30
- # Connect to the database
31
- ARTest.connect
32
-
33
- # Quote "type" if it's a reserved word for the current connection.
34
- QUOTED_TYPE = ActiveRecord::Base.connection.quote_column_name('type')
35
-
36
- def current_adapter?(*types)
37
- types.any? do |type|
38
- ActiveRecord::ConnectionAdapters.const_defined?(type) &&
39
- ActiveRecord::Base.connection.is_a?(ActiveRecord::ConnectionAdapters.const_get(type))
40
- end
41
- end
42
-
43
- def in_memory_db?
44
- current_adapter?(:SQLite3Adapter) &&
45
- ActiveRecord::Base.connection_pool.spec.config[:database] == ":memory:"
46
- end
47
-
48
- def mysql_56?
49
- current_adapter?(:Mysql2Adapter) &&
50
- ActiveRecord::Base.connection.send(:version).join(".") >= "5.6.0"
51
- end
52
-
53
- def mysql_enforcing_gtid_consistency?
54
- current_adapter?(:MysqlAdapter, :Mysql2Adapter) && 'ON' == ActiveRecord::Base.connection.show_variable('enforce_gtid_consistency')
55
- end
56
-
57
- def supports_savepoints?
58
- ActiveRecord::Base.connection.supports_savepoints?
59
- end
60
-
61
- def with_env_tz(new_tz = 'US/Eastern')
62
- old_tz, ENV['TZ'] = ENV['TZ'], new_tz
63
- yield
64
- ensure
65
- old_tz ? ENV['TZ'] = old_tz : ENV.delete('TZ')
66
- end
67
-
68
- def with_timezone_config(cfg)
69
- verify_default_timezone_config
70
-
71
- old_default_zone = ActiveRecord::Base.default_timezone
72
- old_awareness = ActiveRecord::Base.time_zone_aware_attributes
73
- old_zone = Time.zone
74
-
75
- if cfg.has_key?(:default)
76
- ActiveRecord::Base.default_timezone = cfg[:default]
77
- end
78
- if cfg.has_key?(:aware_attributes)
79
- ActiveRecord::Base.time_zone_aware_attributes = cfg[:aware_attributes]
80
- end
81
- if cfg.has_key?(:zone)
82
- Time.zone = cfg[:zone]
83
- end
84
- yield
85
- ensure
86
- ActiveRecord::Base.default_timezone = old_default_zone
87
- ActiveRecord::Base.time_zone_aware_attributes = old_awareness
88
- Time.zone = old_zone
89
- end
90
-
91
- # This method makes sure that tests don't leak global state related to time zones.
92
- EXPECTED_ZONE = nil
93
- EXPECTED_DEFAULT_TIMEZONE = :utc
94
- EXPECTED_TIME_ZONE_AWARE_ATTRIBUTES = false
95
- def verify_default_timezone_config
96
- if Time.zone != EXPECTED_ZONE
97
- $stderr.puts <<-MSG
98
- \n#{self}
99
- Global state `Time.zone` was leaked.
100
- Expected: #{EXPECTED_ZONE}
101
- Got: #{Time.zone}
102
- MSG
103
- end
104
- if ActiveRecord::Base.default_timezone != EXPECTED_DEFAULT_TIMEZONE
105
- $stderr.puts <<-MSG
106
- \n#{self}
107
- Global state `ActiveRecord::Base.default_timezone` was leaked.
108
- Expected: #{EXPECTED_DEFAULT_TIMEZONE}
109
- Got: #{ActiveRecord::Base.default_timezone}
110
- MSG
111
- end
112
- if ActiveRecord::Base.time_zone_aware_attributes != EXPECTED_TIME_ZONE_AWARE_ATTRIBUTES
113
- $stderr.puts <<-MSG
114
- \n#{self}
115
- Global state `ActiveRecord::Base.time_zone_aware_attributes` was leaked.
116
- Expected: #{EXPECTED_TIME_ZONE_AWARE_ATTRIBUTES}
117
- Got: #{ActiveRecord::Base.time_zone_aware_attributes}
118
- MSG
119
- end
120
- end
121
-
122
- def enable_extension!(extension, connection)
123
- return false unless connection.supports_extensions?
124
- return connection.reconnect! if connection.extension_enabled?(extension)
125
-
126
- connection.enable_extension extension
127
- connection.commit_db_transaction
128
- connection.reconnect!
129
- end
130
-
131
- def disable_extension!(extension, connection)
132
- return false unless connection.supports_extensions?
133
- return true unless connection.extension_enabled?(extension)
134
-
135
- connection.disable_extension extension
136
- connection.reconnect!
137
- end
138
-
139
- require "cases/validations_repair_helper"
140
- class ActiveSupport::TestCase
141
- include ActiveRecord::TestFixtures
142
- include ActiveRecord::ValidationsRepairHelper
143
-
144
- self.fixture_path = FIXTURES_ROOT
145
- self.use_instantiated_fixtures = false
146
- self.use_transactional_fixtures = true
147
-
148
- def create_fixtures(*fixture_set_names, &block)
149
- ActiveRecord::FixtureSet.create_fixtures(ActiveSupport::TestCase.fixture_path, fixture_set_names, fixture_class_names, &block)
150
- end
151
- end
152
-
153
- def load_schema
154
- # silence verbose schema loading
155
- original_stdout = $stdout
156
- $stdout = StringIO.new
157
-
158
- adapter_name = ActiveRecord::Base.connection.adapter_name.downcase
159
- adapter_specific_schema_file = SCHEMA_ROOT + "/#{adapter_name}_specific_schema.rb"
160
-
161
- load SCHEMA_ROOT + "/schema.rb"
162
-
163
- if File.exist?(adapter_specific_schema_file)
164
- load adapter_specific_schema_file
165
- end
166
- ensure
167
- $stdout = original_stdout
168
- end
169
-
170
- load_schema
171
-
172
- class SQLSubscriber
173
- attr_reader :logged
174
- attr_reader :payloads
175
-
176
- def initialize
177
- @logged = []
178
- @payloads = []
179
- end
180
-
181
- def start(name, id, payload)
182
- @payloads << payload
183
- @logged << [payload[:sql].squish, payload[:name], payload[:binds]]
184
- end
185
-
186
- def finish(name, id, payload); end
187
- end
188
-
189
- module InTimeZone
190
- private
191
-
192
- def in_time_zone(zone)
193
- old_zone = Time.zone
194
- old_tz = ActiveRecord::Base.time_zone_aware_attributes
195
-
196
- Time.zone = zone ? ActiveSupport::TimeZone[zone] : nil
197
- ActiveRecord::Base.time_zone_aware_attributes = !zone.nil?
198
- yield
199
- ensure
200
- Time.zone = old_zone
201
- ActiveRecord::Base.time_zone_aware_attributes = old_tz
202
- end
203
- end
204
-
205
- require 'mocha/setup' # FIXME: stop using mocha
206
-
207
- # FIXME: we have tests that depend on run order, we should fix that and
208
- # remove this method call.
209
- require 'active_support/test_case'
210
- ActiveSupport::TestCase.test_order = :sorted
1
+ require 'config'
2
+
3
+ require 'active_support/testing/autorun'
4
+ require 'active_support/testing/method_call_assertions'
5
+ require 'stringio'
6
+
7
+ require 'active_record'
8
+ require 'cases/test_case'
9
+ require 'active_support/dependencies'
10
+ require 'active_support/logger'
11
+ require 'active_support/core_ext/string/strip'
12
+
13
+ require 'support/config'
14
+ require 'support/connection'
15
+
16
+ # TODO: Move all these random hacks into the ARTest namespace and into the support/ dir
17
+
18
+ Thread.abort_on_exception = true
19
+
20
+ # Show backtraces for deprecated behavior for quicker cleanup.
21
+ ActiveSupport::Deprecation.debug = true
22
+
23
+ # Disable available locale checks to avoid warnings running the test suite.
24
+ I18n.enforce_available_locales = false
25
+
26
+ # Connect to the database
27
+ ARTest.connect
28
+
29
+ # Quote "type" if it's a reserved word for the current connection.
30
+ QUOTED_TYPE = ActiveRecord::Base.connection.quote_column_name('type')
31
+
32
+ # FIXME: Remove this when the deprecation cycle on TZ aware types by default ends.
33
+ ActiveRecord::Base.time_zone_aware_types << :time
34
+
35
+ def current_adapter?(*types)
36
+ types.any? do |type|
37
+ ActiveRecord::ConnectionAdapters.const_defined?(type) &&
38
+ ActiveRecord::Base.connection.is_a?(ActiveRecord::ConnectionAdapters.const_get(type))
39
+ end
40
+ end
41
+
42
+ def in_memory_db?
43
+ current_adapter?(:SQLite3Adapter) &&
44
+ ActiveRecord::Base.connection_pool.spec.config[:database] == ":memory:"
45
+ end
46
+
47
+ def subsecond_precision_supported?
48
+ ActiveRecord::Base.connection.supports_datetime_with_precision?
49
+ end
50
+
51
+ def mysql_enforcing_gtid_consistency?
52
+ current_adapter?(:Mysql2Adapter) && 'ON' == ActiveRecord::Base.connection.show_variable('enforce_gtid_consistency')
53
+ end
54
+
55
+ def supports_savepoints?
56
+ ActiveRecord::Base.connection.supports_savepoints?
57
+ end
58
+
59
+ def with_env_tz(new_tz = 'US/Eastern')
60
+ old_tz, ENV['TZ'] = ENV['TZ'], new_tz
61
+ yield
62
+ ensure
63
+ old_tz ? ENV['TZ'] = old_tz : ENV.delete('TZ')
64
+ end
65
+
66
+ def with_timezone_config(cfg)
67
+ verify_default_timezone_config
68
+
69
+ old_default_zone = ActiveRecord::Base.default_timezone
70
+ old_awareness = ActiveRecord::Base.time_zone_aware_attributes
71
+ old_zone = Time.zone
72
+
73
+ if cfg.has_key?(:default)
74
+ ActiveRecord::Base.default_timezone = cfg[:default]
75
+ end
76
+ if cfg.has_key?(:aware_attributes)
77
+ ActiveRecord::Base.time_zone_aware_attributes = cfg[:aware_attributes]
78
+ end
79
+ if cfg.has_key?(:zone)
80
+ Time.zone = cfg[:zone]
81
+ end
82
+ yield
83
+ ensure
84
+ ActiveRecord::Base.default_timezone = old_default_zone
85
+ ActiveRecord::Base.time_zone_aware_attributes = old_awareness
86
+ Time.zone = old_zone
87
+ end
88
+
89
+ # This method makes sure that tests don't leak global state related to time zones.
90
+ EXPECTED_ZONE = nil
91
+ EXPECTED_DEFAULT_TIMEZONE = :utc
92
+ EXPECTED_TIME_ZONE_AWARE_ATTRIBUTES = false
93
+ def verify_default_timezone_config
94
+ if Time.zone != EXPECTED_ZONE
95
+ $stderr.puts <<-MSG
96
+ \n#{self}
97
+ Global state `Time.zone` was leaked.
98
+ Expected: #{EXPECTED_ZONE}
99
+ Got: #{Time.zone}
100
+ MSG
101
+ end
102
+ if ActiveRecord::Base.default_timezone != EXPECTED_DEFAULT_TIMEZONE
103
+ $stderr.puts <<-MSG
104
+ \n#{self}
105
+ Global state `ActiveRecord::Base.default_timezone` was leaked.
106
+ Expected: #{EXPECTED_DEFAULT_TIMEZONE}
107
+ Got: #{ActiveRecord::Base.default_timezone}
108
+ MSG
109
+ end
110
+ if ActiveRecord::Base.time_zone_aware_attributes != EXPECTED_TIME_ZONE_AWARE_ATTRIBUTES
111
+ $stderr.puts <<-MSG
112
+ \n#{self}
113
+ Global state `ActiveRecord::Base.time_zone_aware_attributes` was leaked.
114
+ Expected: #{EXPECTED_TIME_ZONE_AWARE_ATTRIBUTES}
115
+ Got: #{ActiveRecord::Base.time_zone_aware_attributes}
116
+ MSG
117
+ end
118
+ end
119
+
120
+ def enable_extension!(extension, connection)
121
+ return false unless connection.supports_extensions?
122
+ return connection.reconnect! if connection.extension_enabled?(extension)
123
+
124
+ connection.enable_extension extension
125
+ connection.commit_db_transaction if connection.transaction_open?
126
+ connection.reconnect!
127
+ end
128
+
129
+ def disable_extension!(extension, connection)
130
+ return false unless connection.supports_extensions?
131
+ return true unless connection.extension_enabled?(extension)
132
+
133
+ connection.disable_extension extension
134
+ connection.reconnect!
135
+ end
136
+
137
+ require "cases/validations_repair_helper"
138
+ class ActiveSupport::TestCase
139
+ include ActiveRecord::TestFixtures
140
+ include ActiveRecord::ValidationsRepairHelper
141
+ include ActiveSupport::Testing::MethodCallAssertions
142
+
143
+ self.fixture_path = FIXTURES_ROOT
144
+ self.use_instantiated_fixtures = false
145
+ self.use_transactional_tests = true
146
+
147
+ def create_fixtures(*fixture_set_names, &block)
148
+ ActiveRecord::FixtureSet.create_fixtures(ActiveSupport::TestCase.fixture_path, fixture_set_names, fixture_class_names, &block)
149
+ end
150
+ end
151
+
152
+ def load_schema
153
+ # silence verbose schema loading
154
+ original_stdout = $stdout
155
+ $stdout = StringIO.new
156
+
157
+ adapter_name = ActiveRecord::Base.connection.adapter_name.downcase
158
+ adapter_specific_schema_file = SCHEMA_ROOT + "/#{adapter_name}_specific_schema.rb"
159
+
160
+ load SCHEMA_ROOT + "/schema.rb"
161
+
162
+ if File.exist?(adapter_specific_schema_file)
163
+ load adapter_specific_schema_file
164
+ end
165
+ ensure
166
+ $stdout = original_stdout
167
+ end
168
+
169
+ load_schema
170
+
171
+ class SQLSubscriber
172
+ attr_reader :logged
173
+ attr_reader :payloads
174
+
175
+ def initialize
176
+ @logged = []
177
+ @payloads = []
178
+ end
179
+
180
+ def start(name, id, payload)
181
+ @payloads << payload
182
+ @logged << [payload[:sql].squish, payload[:name], payload[:binds]]
183
+ end
184
+
185
+ def finish(name, id, payload); end
186
+ end
187
+
188
+ module InTimeZone
189
+ private
190
+
191
+ def in_time_zone(zone)
192
+ old_zone = Time.zone
193
+ old_tz = ActiveRecord::Base.time_zone_aware_attributes
194
+
195
+ Time.zone = zone ? ActiveSupport::TimeZone[zone] : nil
196
+ ActiveRecord::Base.time_zone_aware_attributes = !zone.nil?
197
+ yield
198
+ ensure
199
+ Time.zone = old_zone
200
+ ActiveRecord::Base.time_zone_aware_attributes = old_tz
201
+ end
202
+ end
203
+
204
+ require 'mocha/setup' # FIXME: stop using mocha