ibm_db 3.0.5-x86-mingw32 → 4.0.0-x86-mingw32

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