ibm_db 3.0.3-x86-mingw32 → 5.0.3-x86-mingw32

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