ibm_db 3.0.5-x86-mingw32 → 5.0.5-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 (358) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGES +4 -0
  3. data/LICENSE +1 -1
  4. data/ParameterizedQueries README +6 -6
  5. data/README +38 -55
  6. data/ext/Makefile +269 -0
  7. data/ext/extconf.rb +34 -3
  8. data/ext/gil_release_version +3 -0
  9. data/ext/ibm_db-i386-mingw32.def +2 -0
  10. data/ext/ibm_db.c +100 -108
  11. data/ext/ibm_db.o +0 -0
  12. data/ext/ibm_db.so +0 -0
  13. data/ext/mkmf.log +110 -0
  14. data/ext/ruby_ibm_db_cli.o +0 -0
  15. data/ext/unicode_support_version +3 -0
  16. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +923 -527
  17. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +4 -1
  18. data/lib/mswin32/ibm_db.rb +7 -39
  19. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  20. data/test/active_record/connection_adapters/fake_adapter.rb +8 -5
  21. data/test/cases/adapter_test.rb +133 -58
  22. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
  23. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
  24. data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
  25. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
  26. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
  27. data/test/cases/adapters/mysql2/connection_test.rb +210 -0
  28. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
  29. data/test/cases/adapters/mysql2/enum_test.rb +26 -0
  30. data/test/cases/adapters/mysql2/explain_test.rb +21 -0
  31. data/test/cases/adapters/mysql2/json_test.rb +195 -0
  32. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
  33. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  34. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
  35. data/test/cases/adapters/mysql2/schema_test.rb +126 -0
  36. data/test/cases/adapters/mysql2/sp_test.rb +36 -0
  37. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
  38. data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
  39. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
  40. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
  41. data/test/cases/adapters/postgresql/array_test.rb +339 -0
  42. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
  43. data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
  44. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
  45. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
  46. data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
  47. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  48. data/test/cases/adapters/postgresql/collation_test.rb +53 -0
  49. data/test/cases/adapters/postgresql/composite_test.rb +132 -0
  50. data/test/cases/adapters/postgresql/connection_test.rb +257 -0
  51. data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
  52. data/test/cases/adapters/postgresql/domain_test.rb +47 -0
  53. data/test/cases/adapters/postgresql/enum_test.rb +91 -0
  54. data/test/cases/adapters/postgresql/explain_test.rb +20 -0
  55. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
  56. data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
  57. data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
  58. data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
  59. data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
  60. data/test/cases/adapters/postgresql/integer_test.rb +25 -0
  61. data/test/cases/adapters/postgresql/json_test.rb +237 -0
  62. data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
  63. data/test/cases/adapters/postgresql/money_test.rb +96 -0
  64. data/test/cases/adapters/postgresql/network_test.rb +94 -0
  65. data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
  66. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
  67. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  68. data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
  69. data/test/cases/adapters/postgresql/range_test.rb +343 -0
  70. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
  71. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
  72. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
  73. data/test/cases/adapters/postgresql/schema_test.rb +597 -0
  74. data/test/cases/adapters/postgresql/serial_test.rb +154 -0
  75. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
  76. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
  77. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
  78. data/test/cases/adapters/postgresql/utils_test.rb +62 -0
  79. data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
  80. data/test/cases/adapters/postgresql/xml_test.rb +54 -0
  81. data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
  82. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
  83. data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
  84. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
  85. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
  86. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  87. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
  88. data/test/cases/aggregations_test.rb +11 -1
  89. data/test/cases/ar_schema_test.rb +35 -50
  90. data/test/cases/associations/association_scope_test.rb +1 -6
  91. data/test/cases/associations/belongs_to_associations_test.rb +122 -10
  92. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
  93. data/test/cases/associations/callbacks_test.rb +5 -7
  94. data/test/cases/associations/cascaded_eager_loading_test.rb +1 -1
  95. data/test/cases/associations/eager_load_nested_include_test.rb +1 -3
  96. data/test/cases/associations/eager_test.rb +158 -73
  97. data/test/cases/associations/extension_test.rb +7 -2
  98. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +64 -32
  99. data/test/cases/associations/has_many_associations_test.rb +362 -43
  100. data/test/cases/associations/has_many_through_associations_test.rb +108 -41
  101. data/test/cases/associations/has_one_associations_test.rb +105 -8
  102. data/test/cases/associations/has_one_through_associations_test.rb +6 -3
  103. data/test/cases/associations/inner_join_association_test.rb +3 -3
  104. data/test/cases/associations/inverse_associations_test.rb +38 -11
  105. data/test/cases/associations/join_model_test.rb +59 -36
  106. data/test/cases/associations/left_outer_join_association_test.rb +88 -0
  107. data/test/cases/associations/nested_through_associations_test.rb +2 -2
  108. data/test/cases/associations/required_test.rb +25 -5
  109. data/test/cases/associations_test.rb +39 -34
  110. data/test/cases/attribute_decorators_test.rb +9 -8
  111. data/test/cases/attribute_methods/read_test.rb +5 -5
  112. data/test/cases/attribute_methods_test.rb +97 -40
  113. data/test/cases/attribute_set_test.rb +64 -4
  114. data/test/cases/attribute_test.rb +84 -18
  115. data/test/cases/attributes_test.rb +151 -34
  116. data/test/cases/autosave_association_test.rb +149 -36
  117. data/test/cases/base_test.rb +290 -241
  118. data/test/cases/batches_test.rb +299 -22
  119. data/test/cases/binary_test.rb +2 -10
  120. data/test/cases/bind_parameter_test.rb +76 -66
  121. data/test/cases/cache_key_test.rb +26 -0
  122. data/test/cases/calculations_test.rb +167 -15
  123. data/test/cases/callbacks_test.rb +161 -68
  124. data/test/cases/coders/json_test.rb +15 -0
  125. data/test/cases/collection_cache_key_test.rb +115 -0
  126. data/test/cases/column_definition_test.rb +26 -57
  127. data/test/cases/comment_test.rb +145 -0
  128. data/test/cases/connection_adapters/adapter_leasing_test.rb +5 -3
  129. data/test/cases/connection_adapters/connection_handler_test.rb +128 -21
  130. data/test/cases/connection_adapters/connection_specification_test.rb +1 -1
  131. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +0 -38
  132. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +5 -1
  133. data/test/cases/connection_adapters/schema_cache_test.rb +8 -3
  134. data/test/cases/connection_adapters/type_lookup_test.rb +15 -7
  135. data/test/cases/connection_management_test.rb +46 -56
  136. data/test/cases/connection_pool_test.rb +195 -20
  137. data/test/cases/connection_specification/resolver_test.rb +15 -0
  138. data/test/cases/counter_cache_test.rb +10 -5
  139. data/test/cases/custom_locking_test.rb +1 -1
  140. data/test/cases/database_statements_test.rb +18 -3
  141. data/test/cases/{invalid_date_test.rb → date_test.rb} +13 -1
  142. data/test/cases/date_time_precision_test.rb +107 -0
  143. data/test/cases/defaults_test.rb +85 -89
  144. data/test/cases/dirty_test.rb +30 -52
  145. data/test/cases/disconnected_test.rb +4 -2
  146. data/test/cases/enum_test.rb +178 -24
  147. data/test/cases/errors_test.rb +16 -0
  148. data/test/cases/explain_test.rb +32 -21
  149. data/test/cases/finder_test.rb +273 -148
  150. data/test/cases/fixture_set/file_test.rb +18 -0
  151. data/test/cases/fixtures_test.rb +112 -32
  152. data/test/cases/forbidden_attributes_protection_test.rb +69 -3
  153. data/test/cases/helper.rb +10 -16
  154. data/test/cases/hot_compatibility_test.rb +89 -1
  155. data/test/cases/inheritance_test.rb +284 -53
  156. data/test/cases/integration_test.rb +23 -7
  157. data/test/cases/invalid_connection_test.rb +4 -2
  158. data/test/cases/invertible_migration_test.rb +124 -32
  159. data/test/cases/json_serialization_test.rb +11 -2
  160. data/test/cases/locking_test.rb +22 -6
  161. data/test/cases/log_subscriber_test.rb +106 -17
  162. data/test/cases/migration/change_schema_test.rb +60 -114
  163. data/test/cases/migration/change_table_test.rb +34 -2
  164. data/test/cases/migration/column_attributes_test.rb +7 -23
  165. data/test/cases/migration/column_positioning_test.rb +8 -8
  166. data/test/cases/migration/columns_test.rb +17 -11
  167. data/test/cases/migration/command_recorder_test.rb +47 -2
  168. data/test/cases/migration/compatibility_test.rb +118 -0
  169. data/test/cases/migration/create_join_table_test.rb +21 -12
  170. data/test/cases/migration/foreign_key_test.rb +52 -18
  171. data/test/cases/migration/index_test.rb +14 -12
  172. data/test/cases/migration/logger_test.rb +1 -1
  173. data/test/cases/migration/pending_migrations_test.rb +0 -1
  174. data/test/cases/migration/references_foreign_key_test.rb +59 -7
  175. data/test/cases/migration/references_index_test.rb +4 -4
  176. data/test/cases/migration/references_statements_test.rb +26 -6
  177. data/test/cases/migration/rename_table_test.rb +25 -25
  178. data/test/cases/migration_test.rb +279 -81
  179. data/test/cases/migrator_test.rb +91 -8
  180. data/test/cases/mixin_test.rb +0 -2
  181. data/test/cases/modules_test.rb +3 -4
  182. data/test/cases/multiparameter_attributes_test.rb +24 -2
  183. data/test/cases/multiple_db_test.rb +11 -4
  184. data/test/cases/nested_attributes_test.rb +61 -33
  185. data/test/cases/persistence_test.rb +102 -10
  186. data/test/cases/pooled_connections_test.rb +3 -3
  187. data/test/cases/primary_keys_test.rb +170 -31
  188. data/test/cases/query_cache_test.rb +216 -96
  189. data/test/cases/quoting_test.rb +65 -19
  190. data/test/cases/readonly_test.rb +2 -1
  191. data/test/cases/reflection_test.rb +68 -22
  192. data/test/cases/relation/delegation_test.rb +3 -8
  193. data/test/cases/relation/merging_test.rb +10 -14
  194. data/test/cases/relation/mutation_test.rb +42 -24
  195. data/test/cases/relation/or_test.rb +92 -0
  196. data/test/cases/relation/predicate_builder_test.rb +4 -2
  197. data/test/cases/relation/record_fetch_warning_test.rb +40 -0
  198. data/test/cases/relation/where_chain_test.rb +23 -99
  199. data/test/cases/relation/where_clause_test.rb +182 -0
  200. data/test/cases/relation/where_test.rb +45 -23
  201. data/test/cases/relation_test.rb +67 -58
  202. data/test/cases/relations_test.rb +249 -38
  203. data/test/cases/result_test.rb +10 -0
  204. data/test/cases/sanitize_test.rb +108 -15
  205. data/test/cases/schema_dumper_test.rb +119 -125
  206. data/test/cases/schema_loading_test.rb +52 -0
  207. data/test/cases/scoping/default_scoping_test.rb +113 -39
  208. data/test/cases/scoping/named_scoping_test.rb +46 -9
  209. data/test/cases/scoping/relation_scoping_test.rb +47 -4
  210. data/test/cases/secure_token_test.rb +32 -0
  211. data/test/cases/serialization_test.rb +1 -1
  212. data/test/cases/serialized_attribute_test.rb +93 -6
  213. data/test/cases/statement_cache_test.rb +38 -0
  214. data/test/cases/store_test.rb +2 -1
  215. data/test/cases/suppressor_test.rb +63 -0
  216. data/test/cases/tasks/database_tasks_test.rb +73 -9
  217. data/test/cases/tasks/mysql_rake_test.rb +139 -118
  218. data/test/cases/tasks/postgresql_rake_test.rb +60 -6
  219. data/test/cases/tasks/sqlite_rake_test.rb +30 -3
  220. data/test/cases/test_case.rb +28 -20
  221. data/test/cases/test_fixtures_test.rb +36 -0
  222. data/test/cases/time_precision_test.rb +103 -0
  223. data/test/cases/timestamp_test.rb +44 -10
  224. data/test/cases/touch_later_test.rb +121 -0
  225. data/test/cases/transaction_callbacks_test.rb +128 -62
  226. data/test/cases/transaction_isolation_test.rb +2 -2
  227. data/test/cases/transactions_test.rb +61 -43
  228. data/test/cases/type/adapter_specific_registry_test.rb +133 -0
  229. data/test/cases/type/date_time_test.rb +14 -0
  230. data/test/cases/type/integer_test.rb +2 -96
  231. data/test/cases/type/string_test.rb +0 -14
  232. data/test/cases/type_test.rb +39 -0
  233. data/test/cases/types_test.rb +1 -118
  234. data/test/cases/unconnected_test.rb +1 -1
  235. data/test/cases/validations/absence_validation_test.rb +73 -0
  236. data/test/cases/validations/association_validation_test.rb +13 -2
  237. data/test/cases/validations/i18n_validation_test.rb +6 -10
  238. data/test/cases/validations/length_validation_test.rb +62 -30
  239. data/test/cases/validations/presence_validation_test.rb +36 -1
  240. data/test/cases/validations/uniqueness_validation_test.rb +128 -37
  241. data/test/cases/validations_repair_helper.rb +2 -6
  242. data/test/cases/validations_test.rb +36 -7
  243. data/test/cases/view_test.rb +102 -5
  244. data/test/cases/yaml_serialization_test.rb +21 -26
  245. data/test/config.example.yml +97 -0
  246. data/test/fixtures/bad_posts.yml +9 -0
  247. data/test/fixtures/books.yml +20 -0
  248. data/test/fixtures/content.yml +3 -0
  249. data/test/fixtures/content_positions.yml +3 -0
  250. data/test/fixtures/dead_parrots.yml +5 -0
  251. data/test/fixtures/live_parrots.yml +4 -0
  252. data/test/fixtures/naked/yml/parrots.yml +2 -0
  253. data/test/fixtures/naked/yml/trees.yml +3 -0
  254. data/test/fixtures/nodes.yml +29 -0
  255. data/test/fixtures/other_comments.yml +6 -0
  256. data/test/fixtures/other_dogs.yml +2 -0
  257. data/test/fixtures/other_posts.yml +7 -0
  258. data/test/fixtures/price_estimates.yml +10 -1
  259. data/test/fixtures/trees.yml +3 -0
  260. data/test/migrations/10_urban/9_add_expressions.rb +1 -1
  261. data/test/migrations/decimal/1_give_me_big_numbers.rb +1 -1
  262. data/test/migrations/magic/1_currencies_have_symbols.rb +1 -1
  263. data/test/migrations/missing/1000_people_have_middle_names.rb +2 -2
  264. data/test/migrations/missing/1_people_have_last_names.rb +2 -2
  265. data/test/migrations/missing/3_we_need_reminders.rb +2 -2
  266. data/test/migrations/missing/4_innocent_jointable.rb +2 -2
  267. data/test/migrations/rename/1_we_need_things.rb +2 -2
  268. data/test/migrations/rename/2_rename_things.rb +2 -2
  269. data/test/migrations/to_copy/1_people_have_hobbies.rb +1 -1
  270. data/test/migrations/to_copy/2_people_have_descriptions.rb +1 -1
  271. data/test/migrations/to_copy2/1_create_articles.rb +1 -1
  272. data/test/migrations/to_copy2/2_create_comments.rb +1 -1
  273. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +1 -1
  274. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +1 -1
  275. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +1 -1
  276. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +1 -1
  277. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +1 -1
  278. data/test/migrations/valid/1_valid_people_have_last_names.rb +1 -1
  279. data/test/migrations/valid/2_we_need_reminders.rb +2 -2
  280. data/test/migrations/valid/3_innocent_jointable.rb +2 -2
  281. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +1 -1
  282. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +2 -2
  283. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +2 -2
  284. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +1 -1
  285. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +1 -1
  286. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +1 -1
  287. data/test/migrations/version_check/20131219224947_migration_version_check.rb +1 -1
  288. data/test/models/admin/randomly_named_c1.rb +6 -2
  289. data/test/models/aircraft.rb +1 -0
  290. data/test/models/author.rb +4 -7
  291. data/test/models/bird.rb +1 -1
  292. data/test/models/book.rb +5 -0
  293. data/test/models/bulb.rb +2 -1
  294. data/test/models/car.rb +3 -0
  295. data/test/models/cat.rb +10 -0
  296. data/test/models/chef.rb +1 -0
  297. data/test/models/club.rb +2 -0
  298. data/test/models/comment.rb +17 -5
  299. data/test/models/company.rb +4 -2
  300. data/test/models/company_in_module.rb +1 -1
  301. data/test/models/contact.rb +1 -1
  302. data/test/models/content.rb +40 -0
  303. data/test/models/customer.rb +8 -2
  304. data/test/models/developer.rb +19 -0
  305. data/test/models/face.rb +1 -1
  306. data/test/models/guitar.rb +4 -0
  307. data/test/models/hotel.rb +2 -0
  308. data/test/models/member.rb +1 -0
  309. data/test/models/member_detail.rb +4 -3
  310. data/test/models/mentor.rb +3 -0
  311. data/test/models/mocktail_designer.rb +2 -0
  312. data/test/models/node.rb +5 -0
  313. data/test/models/non_primary_key.rb +2 -0
  314. data/test/models/notification.rb +3 -0
  315. data/test/models/other_dog.rb +5 -0
  316. data/test/models/owner.rb +4 -1
  317. data/test/models/parrot.rb +6 -7
  318. data/test/models/person.rb +0 -1
  319. data/test/models/pet.rb +3 -0
  320. data/test/models/pet_treasure.rb +6 -0
  321. data/test/models/pirate.rb +3 -3
  322. data/test/models/post.rb +18 -9
  323. data/test/models/project.rb +9 -0
  324. data/test/models/randomly_named_c1.rb +1 -1
  325. data/test/models/recipe.rb +3 -0
  326. data/test/models/ship.rb +8 -2
  327. data/test/models/tag.rb +6 -0
  328. data/test/models/topic.rb +2 -8
  329. data/test/models/tree.rb +3 -0
  330. data/test/models/tuning_peg.rb +4 -0
  331. data/test/models/user.rb +14 -0
  332. data/test/models/uuid_item.rb +6 -0
  333. data/test/schema/mysql2_specific_schema.rb +33 -23
  334. data/test/schema/oracle_specific_schema.rb +1 -4
  335. data/test/schema/postgresql_specific_schema.rb +36 -124
  336. data/test/schema/schema.rb +170 -65
  337. data/test/schema/schema.rb.original +1057 -0
  338. data/test/schema/sqlite_specific_schema.rb +1 -5
  339. data/test/support/connection.rb +1 -0
  340. data/test/support/schema_dumping_helper.rb +1 -1
  341. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  342. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  343. metadata +146 -30
  344. data/lib/mswin32/rb19x/ibm_db.so +0 -0
  345. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  346. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  347. data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
  348. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
  349. data/test/cases/attribute_methods/serialization_test.rb +0 -29
  350. data/test/cases/migration/change_schema_test - Copy.rb +0 -448
  351. data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
  352. data/test/cases/migration/table_and_index_test.rb +0 -24
  353. data/test/cases/relation/where_test2.rb +0 -36
  354. data/test/cases/type/decimal_test.rb +0 -56
  355. data/test/cases/type/unsigned_integer_test.rb +0 -18
  356. data/test/cases/xml_serialization_test.rb +0 -457
  357. data/test/fixtures/naked/csv/accounts.csv +0 -1
  358. data/test/schema/mysql_specific_schema.rb +0 -70
@@ -4,7 +4,7 @@ class TestRecord < ActiveRecord::Base
4
4
  end
5
5
 
6
6
  class TestUnconnectedAdapter < ActiveRecord::TestCase
7
- self.use_transactional_fixtures = false
7
+ self.use_transactional_tests = false
8
8
 
9
9
  def setup
10
10
  @underlying = ActiveRecord::Base.connection
@@ -0,0 +1,73 @@
1
+ require "cases/helper"
2
+ require 'models/face'
3
+ require 'models/interest'
4
+ require 'models/man'
5
+ require 'models/topic'
6
+
7
+ class AbsenceValidationTest < ActiveRecord::TestCase
8
+ def test_non_association
9
+ boy_klass = Class.new(Man) do
10
+ def self.name; "Boy" end
11
+ validates_absence_of :name
12
+ end
13
+
14
+ assert boy_klass.new.valid?
15
+ assert_not boy_klass.new(name: "Alex").valid?
16
+ end
17
+
18
+ def test_has_one_marked_for_destruction
19
+ boy_klass = Class.new(Man) do
20
+ def self.name; "Boy" end
21
+ validates_absence_of :face
22
+ end
23
+
24
+ boy = boy_klass.new(face: Face.new)
25
+ assert_not boy.valid?, "should not be valid if has_one association is present"
26
+ assert_equal 1, boy.errors[:face].size, "should only add one error"
27
+
28
+ boy.face.mark_for_destruction
29
+ assert boy.valid?, "should be valid if association is marked for destruction"
30
+ end
31
+
32
+ def test_has_many_marked_for_destruction
33
+ boy_klass = Class.new(Man) do
34
+ def self.name; "Boy" end
35
+ validates_absence_of :interests
36
+ end
37
+ boy = boy_klass.new
38
+ boy.interests << [i1 = Interest.new, i2 = Interest.new]
39
+ assert_not boy.valid?, "should not be valid if has_many association is present"
40
+
41
+ i1.mark_for_destruction
42
+ assert_not boy.valid?, "should not be valid if has_many association is present"
43
+
44
+ i2.mark_for_destruction
45
+ assert boy.valid?
46
+ end
47
+
48
+ def test_does_not_call_to_a_on_associations
49
+ boy_klass = Class.new(Man) do
50
+ def self.name; "Boy" end
51
+ validates_absence_of :face
52
+ end
53
+
54
+ face_with_to_a = Face.new
55
+ def face_with_to_a.to_a; ['(/)', '(\)']; end
56
+
57
+ assert_nothing_raised { boy_klass.new(face: face_with_to_a).valid? }
58
+ end
59
+
60
+ def test_validates_absence_of_virtual_attribute_on_model
61
+ repair_validations(Interest) do
62
+ Interest.send(:attr_accessor, :token)
63
+ Interest.validates_absence_of(:token)
64
+
65
+ interest = Interest.create!(topic: 'Thought Leadering')
66
+ assert interest.valid?
67
+
68
+ interest.token = 'tl'
69
+
70
+ assert interest.invalid?
71
+ end
72
+ end
73
+ end
@@ -45,12 +45,24 @@ class AssociationValidationTest < ActiveRecord::TestCase
45
45
  assert t.valid?
46
46
  end
47
47
 
48
+ def test_validates_associated_without_marked_for_destruction
49
+ reply = Class.new do
50
+ def valid?
51
+ true
52
+ end
53
+ end
54
+ Topic.validates_associated(:replies)
55
+ t = Topic.new
56
+ t.define_singleton_method(:replies) { [reply.new] }
57
+ assert t.valid?
58
+ end
59
+
48
60
  def test_validates_associated_with_custom_message_using_quotes
49
61
  Reply.validates_associated :topic, :message=> "This string contains 'single' and \"double\" quotes"
50
62
  Topic.validates_presence_of :content
51
63
  r = Reply.create("title" => "A reply", "content" => "with content!")
52
64
  r.topic = Topic.create("title" => "uhohuhoh")
53
- assert !r.valid?
65
+ assert_not_operator r, :valid?
54
66
  assert_equal ["This string contains 'single' and \"double\" quotes"], r.errors[:topic]
55
67
  end
56
68
 
@@ -82,5 +94,4 @@ class AssociationValidationTest < ActiveRecord::TestCase
82
94
  assert interest.valid?, "Expected interest to be valid, but was not. Interest should have a man object associated"
83
95
  end
84
96
  end
85
-
86
97
  end
@@ -47,29 +47,25 @@ class I18nValidationTest < ActiveRecord::TestCase
47
47
  # [ "given on condition", {on: :save}, {}]
48
48
  ]
49
49
 
50
- # validates_uniqueness_of w/ mocha
51
-
52
50
  COMMON_CASES.each do |name, validation_options, generate_message_options|
53
51
  test "validates_uniqueness_of on generated message #{name}" do
54
52
  Topic.validates_uniqueness_of :title, validation_options
55
53
  @topic.title = unique_topic.title
56
- @topic.errors.expects(:generate_message).with(:title, :taken, generate_message_options.merge(:value => 'unique!'))
57
- @topic.valid?
54
+ assert_called_with(@topic.errors, :generate_message, [:title, :taken, generate_message_options.merge(:value => 'unique!')]) do
55
+ @topic.valid?
56
+ end
58
57
  end
59
58
  end
60
59
 
61
- # validates_associated w/ mocha
62
-
63
60
  COMMON_CASES.each do |name, validation_options, generate_message_options|
64
61
  test "validates_associated on generated message #{name}" do
65
62
  Topic.validates_associated :replies, validation_options
66
- replied_topic.errors.expects(:generate_message).with(:replies, :invalid, generate_message_options.merge(:value => replied_topic.replies))
67
- replied_topic.save
63
+ assert_called_with(replied_topic.errors, :generate_message, [:replies, :invalid, generate_message_options.merge(:value => replied_topic.replies)]) do
64
+ replied_topic.save
65
+ end
68
66
  end
69
67
  end
70
68
 
71
- # validates_associated w/o mocha
72
-
73
69
  def test_validates_associated_finds_custom_model_key_translation
74
70
  I18n.backend.store_translations 'en', :activerecord => {:errors => {:models => {:topic => {:attributes => {:replies => {:invalid => 'custom message'}}}}}}
75
71
  I18n.backend.store_translations 'en', :activerecord => {:errors => {:messages => {:invalid => 'global message'}}}
@@ -1,47 +1,79 @@
1
- # -*- coding: utf-8 -*-
2
1
  require "cases/helper"
3
2
  require 'models/owner'
4
3
  require 'models/pet'
4
+ require 'models/person'
5
5
 
6
6
  class LengthValidationTest < ActiveRecord::TestCase
7
7
  fixtures :owners
8
- repair_validations(Owner)
9
8
 
10
- def test_validates_size_of_association
11
- repair_validations Owner do
12
- assert_nothing_raised { Owner.validates_size_of :pets, :minimum => 1 }
13
- o = Owner.new('name' => 'nopets')
14
- assert !o.save
15
- assert o.errors[:pets].any?
16
- o.pets.build('name' => 'apet')
17
- assert o.valid?
9
+ setup do
10
+ @owner = Class.new(Owner) do
11
+ def self.name; 'Owner'; end
18
12
  end
19
13
  end
20
14
 
15
+
16
+ def test_validates_size_of_association
17
+ assert_nothing_raised { @owner.validates_size_of :pets, minimum: 1 }
18
+ o = @owner.new('name' => 'nopets')
19
+ assert !o.save
20
+ assert o.errors[:pets].any?
21
+ o.pets.build('name' => 'apet')
22
+ assert o.valid?
23
+ end
24
+
21
25
  def test_validates_size_of_association_using_within
22
- repair_validations Owner do
23
- assert_nothing_raised { Owner.validates_size_of :pets, :within => 1..2 }
24
- o = Owner.new('name' => 'nopets')
25
- assert !o.save
26
- assert o.errors[:pets].any?
27
-
28
- o.pets.build('name' => 'apet')
29
- assert o.valid?
30
-
31
- 2.times { o.pets.build('name' => 'apet') }
32
- assert !o.save
33
- assert o.errors[:pets].any?
34
- end
26
+ assert_nothing_raised { @owner.validates_size_of :pets, within: 1..2 }
27
+ o = @owner.new('name' => 'nopets')
28
+ assert !o.save
29
+ assert o.errors[:pets].any?
30
+
31
+ o.pets.build('name' => 'apet')
32
+ assert o.valid?
33
+
34
+ 2.times { o.pets.build('name' => 'apet') }
35
+ assert !o.save
36
+ assert o.errors[:pets].any?
35
37
  end
36
38
 
37
39
  def test_validates_size_of_association_utf8
38
- repair_validations Owner do
39
- assert_nothing_raised { Owner.validates_size_of :pets, :minimum => 1 }
40
- o = Owner.new('name' => 'あいうえおかきくけこ')
41
- assert !o.save
42
- assert o.errors[:pets].any?
43
- o.pets.build('name' => 'あいうえおかきくけこ')
44
- assert o.valid?
40
+ @owner.validates_size_of :pets, minimum: 1
41
+ o = @owner.new('name' => 'あいうえおかきくけこ')
42
+ assert !o.save
43
+ assert o.errors[:pets].any?
44
+ o.pets.build('name' => 'あいうえおかきくけこ')
45
+ assert o.valid?
46
+ end
47
+
48
+ def test_validates_size_of_respects_records_marked_for_destruction
49
+ @owner.validates_size_of :pets, minimum: 1
50
+ owner = @owner.new
51
+ assert_not owner.save
52
+ assert owner.errors[:pets].any?
53
+ pet = owner.pets.build
54
+ assert owner.valid?
55
+ assert owner.save
56
+
57
+ pet_count = Pet.count
58
+ assert_not owner.update_attributes pets_attributes: [ {_destroy: 1, id: pet.id} ]
59
+ assert_not owner.valid?
60
+ assert owner.errors[:pets].any?
61
+ assert_equal pet_count, Pet.count
62
+ end
63
+
64
+ def test_validates_length_of_virtual_attribute_on_model
65
+ repair_validations(Pet) do
66
+ Pet.send(:attr_accessor, :nickname)
67
+ Pet.validates_length_of(:name, minimum: 1)
68
+ Pet.validates_length_of(:nickname, minimum: 1)
69
+
70
+ pet = Pet.create!(name: 'Fancy Pants', nickname: 'Fancy')
71
+
72
+ assert pet.valid?
73
+
74
+ pet.nickname = ''
75
+
76
+ assert pet.invalid?
45
77
  end
46
78
  end
47
79
  end
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  require "cases/helper"
3
2
  require 'models/man'
4
3
  require 'models/face'
@@ -65,4 +64,40 @@ class PresenceValidationTest < ActiveRecord::TestCase
65
64
 
66
65
  assert_nothing_raised { s.valid? }
67
66
  end
67
+
68
+ def test_validates_presence_of_virtual_attribute_on_model
69
+ repair_validations(Interest) do
70
+ Interest.send(:attr_accessor, :abbreviation)
71
+ Interest.validates_presence_of(:topic)
72
+ Interest.validates_presence_of(:abbreviation)
73
+
74
+ interest = Interest.create!(topic: 'Thought Leadering', abbreviation: 'tl')
75
+ assert interest.valid?
76
+
77
+ interest.abbreviation = ''
78
+
79
+ assert interest.invalid?
80
+ end
81
+ end
82
+
83
+ def test_validations_run_on_persisted_record
84
+ repair_validations(Interest) do
85
+ interest = Interest.new
86
+ interest.save!
87
+ assert_predicate interest, :valid?
88
+
89
+ Interest.validates_presence_of(:topic)
90
+
91
+ assert_not_predicate interest, :valid?
92
+ end
93
+ end
94
+
95
+ def test_validates_presence_with_on_context
96
+ repair_validations(Interest) do
97
+ Interest.validates_presence_of(:topic, on: :required_name)
98
+ interest = Interest.new
99
+ interest.save!
100
+ assert_not interest.valid?(:required_name)
101
+ end
102
+ end
68
103
  end
@@ -1,11 +1,14 @@
1
- # encoding: utf-8
2
1
  require "cases/helper"
3
- require 'models/topic'
4
- require 'models/reply'
5
- require 'models/warehouse_thing'
6
- require 'models/guid'
7
- require 'models/event'
8
- require 'models/dashboard'
2
+ require "models/topic"
3
+ require "models/reply"
4
+ require "models/warehouse_thing"
5
+ require "models/guid"
6
+ require "models/event"
7
+ require "models/dashboard"
8
+ require "models/uuid_item"
9
+ require "models/author"
10
+ require "models/person"
11
+ require "models/essay"
9
12
 
10
13
  class Wizard < ActiveRecord::Base
11
14
  self.abstract_class = true
@@ -31,11 +34,6 @@ class ReplyWithTitleObject < Reply
31
34
  def title; ReplyTitle.new; end
32
35
  end
33
36
 
34
- class Employee < ActiveRecord::Base
35
- self.table_name = 'postgresql_arrays'
36
- validates_uniqueness_of :nicknames
37
- end
38
-
39
37
  class TopicWithUniqEvent < Topic
40
38
  belongs_to :event, foreign_key: :parent_id
41
39
  validates :event, uniqueness: true
@@ -54,6 +52,18 @@ class BigIntReverseTest < ActiveRecord::Base
54
52
  validates :engines_count, uniqueness: true
55
53
  end
56
54
 
55
+ class CoolTopic < Topic
56
+ validates_uniqueness_of :id
57
+ end
58
+
59
+ class TopicWithAfterCreate < Topic
60
+ after_create :set_author
61
+
62
+ def set_author
63
+ update_attributes!(:author_name => "#{title} #{id}")
64
+ end
65
+ end
66
+
57
67
  class UniquenessValidationTest < ActiveRecord::TestCase
58
68
  INT_MAX_VALUE = 2147483647
59
69
 
@@ -156,6 +166,19 @@ class UniquenessValidationTest < ActiveRecord::TestCase
156
166
  assert !r2.valid?, "Saving r2 first time"
157
167
  end
158
168
 
169
+ def test_validate_uniqueness_with_polymorphic_object_scope
170
+ Essay.validates_uniqueness_of(:name, scope: :writer)
171
+
172
+ a = Author.create(name: "Sergey")
173
+ p = Person.create(first_name: "Sergey")
174
+
175
+ e1 = a.essays.create(name: "Essay")
176
+ assert e1.valid?, "Saving e1"
177
+
178
+ e2 = p.essays.create(name: "Essay")
179
+ assert e2.valid?, "Saving e2"
180
+ end
181
+
159
182
  def test_validate_uniqueness_with_composed_attribute_scope
160
183
  r1 = ReplyWithTitleObject.create "title" => "r1", "content" => "hello world"
161
184
  assert r1.valid?, "Saving r1"
@@ -342,22 +365,41 @@ class UniquenessValidationTest < ActiveRecord::TestCase
342
365
  end
343
366
 
344
367
  def test_validate_uniqueness_with_limit
345
- # Event.title is limited to 5 characters
346
- e1 = Event.create(:title => "abcde")
347
- assert e1.valid?, "Could not create an event with a unique, 5 character title"
348
- e2 = Event.create(:title => "abcdefgh")
349
- assert !e2.valid?, "Created an event whose title, with limit taken into account, is not unique"
368
+ if current_adapter?(:SQLite3Adapter)
369
+ # Event.title has limit 5, but SQLite doesn't truncate.
370
+ e1 = Event.create(title: "abcdefgh")
371
+ assert e1.valid?, "Could not create an event with a unique 8 characters title"
372
+
373
+ e2 = Event.create(title: "abcdefgh")
374
+ assert_not e2.valid?, "Created an event whose title is not unique"
375
+ elsif current_adapter?(:Mysql2Adapter, :PostgreSQLAdapter, :OracleAdapter, :SQLServerAdapter)
376
+ assert_raise(ActiveRecord::ValueTooLong) do
377
+ Event.create(title: "abcdefgh")
378
+ end
379
+ else
380
+ assert_raise(ActiveRecord::StatementInvalid) do
381
+ Event.create(title: "abcdefgh")
382
+ end
383
+ end
350
384
  end
351
385
 
352
386
  def test_validate_uniqueness_with_limit_and_utf8
353
- unless current_adapter?(:IBM_DBAdapter)
354
- # Limit for the varchar field is number of bytes and not characters for DB2. Hence the below test cases is expected to fail.
355
- # Event.title is limited to 5 characters
356
- e1 = Event.create(:title => "一二三四五")
357
- assert e1.valid?, "Could not create an event with a unique, 5 character title"
358
- e2 = Event.create(:title => "一二三四五六七八")
359
- assert !e2.valid?, "Created an event whose title, with limit taken into account, is not unique"
360
- end
387
+ if current_adapter?(:SQLite3Adapter)
388
+ # Event.title has limit 5, but does SQLite doesn't truncate.
389
+ e1 = Event.create(title: "一二三四五六七八")
390
+ assert e1.valid?, "Could not create an event with a unique 8 characters title"
391
+
392
+ e2 = Event.create(title: "一二三四五六七八")
393
+ assert_not e2.valid?, "Created an event whose title is not unique"
394
+ elsif current_adapter?(:Mysql2Adapter, :PostgreSQLAdapter, :OracleAdapter, :SQLServerAdapter)
395
+ assert_raise(ActiveRecord::ValueTooLong) do
396
+ Event.create(title: "一二三四五六七八")
397
+ end
398
+ else
399
+ assert_raise(ActiveRecord::StatementInvalid) do
400
+ Event.create(title: "一二三四五六七八")
401
+ end
402
+ end
361
403
  end
362
404
 
363
405
  def test_validate_straight_inheritance_uniqueness
@@ -407,18 +449,6 @@ class UniquenessValidationTest < ActiveRecord::TestCase
407
449
  }
408
450
  end
409
451
 
410
- if current_adapter? :PostgreSQLAdapter
411
- def test_validate_uniqueness_with_array_column
412
- e1 = Employee.create("nicknames" => ["john", "johnny"], "commission_by_quarter" => [1000, 1200])
413
- assert e1.persisted?, "Saving e1"
414
-
415
- e2 = Employee.create("nicknames" => ["john", "johnny"], "commission_by_quarter" => [2200])
416
- assert !e2.persisted?, "e2 shouldn't be valid"
417
- assert e2.errors[:nicknames].any?, "Should have errors for nicknames"
418
- assert_equal ["has already been taken"], e2.errors[:nicknames], "Should have uniqueness message for nicknames"
419
- end
420
- end
421
-
422
452
  def test_validate_uniqueness_on_existing_relation
423
453
  event = Event.create
424
454
  assert TopicWithUniqEvent.create(event: event).valid?
@@ -433,6 +463,25 @@ class UniquenessValidationTest < ActiveRecord::TestCase
433
463
  assert topic.valid?
434
464
  end
435
465
 
466
+ def test_validate_uniqueness_of_custom_primary_key
467
+ klass = Class.new(ActiveRecord::Base) do
468
+ self.table_name = "keyboards"
469
+ self.primary_key = :key_number
470
+
471
+ validates_uniqueness_of :key_number
472
+
473
+ def self.name
474
+ "Keyboard"
475
+ end
476
+ end
477
+
478
+ klass.create!(key_number: 10)
479
+ key2 = klass.create!(key_number: 11)
480
+
481
+ key2.key_number = 10
482
+ assert_not key2.valid?
483
+ end
484
+
436
485
  def test_validate_uniqueness_without_primary_key
437
486
  klass = Class.new(ActiveRecord::Base) do
438
487
  self.table_name = "dashboards"
@@ -454,4 +503,46 @@ class UniquenessValidationTest < ActiveRecord::TestCase
454
503
  assert_match(/\AUnknown primary key for table dashboards in model/, e.message)
455
504
  assert_match(/Can not validate uniqueness for persisted record without primary key.\z/, e.message)
456
505
  end
506
+
507
+ def test_validate_uniqueness_ignores_itself_when_primary_key_changed
508
+ Topic.validates_uniqueness_of(:title)
509
+
510
+ t = Topic.new("title" => "This is a unique title")
511
+ assert t.save, "Should save t as unique"
512
+
513
+ t.id += 1
514
+ assert t.valid?, "Should be valid"
515
+ assert t.save, "Should still save t as unique"
516
+ end
517
+
518
+ def test_validate_uniqueness_with_after_create_performing_save
519
+ TopicWithAfterCreate.validates_uniqueness_of(:title)
520
+ topic = TopicWithAfterCreate.create!(:title => "Title1")
521
+ assert topic.author_name.start_with?("Title1")
522
+
523
+ topic2 = TopicWithAfterCreate.new(:title => "Title1")
524
+ refute topic2.valid?
525
+ assert_equal(["has already been taken"], topic2.errors[:title])
526
+ end
527
+
528
+ def test_validate_uniqueness_uuid
529
+ skip unless current_adapter?(:PostgreSQLAdapter)
530
+ item = UuidItem.create!(uuid: SecureRandom.uuid, title: 'item1')
531
+ item.update(title: 'item1-title2')
532
+ assert_empty item.errors
533
+
534
+ item2 = UuidValidatingItem.create!(uuid: SecureRandom.uuid, title: 'item2')
535
+ item2.update(title: 'item2-title2')
536
+ assert_empty item2.errors
537
+ end
538
+
539
+ def test_validate_uniqueness_regular_id
540
+ item = CoolTopic.create!(title: 'MyItem')
541
+ assert_empty item.errors
542
+
543
+ item2 = CoolTopic.new(id: item.id, title: 'MyItem2')
544
+ refute item2.valid?
545
+
546
+ assert_equal(["has already been taken"], item2.errors[:id])
547
+ end
457
548
  end