ibm_db 3.0.4-x86-mingw32 → 5.0.4-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 +8 -1
  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 -3177
  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,212 +1,489 @@
1
- require 'cases/helper'
2
- require 'models/post'
3
- require 'models/subscriber'
4
-
5
- class EachTest < ActiveRecord::TestCase
6
- fixtures :posts, :subscribers
7
-
8
- def setup
9
- @posts = Post.order("id asc")
10
- @total = Post.count
11
- Post.count('id') # preheat arel's table cache
12
- end
13
-
14
- def test_each_should_execute_one_query_per_batch
15
- assert_queries(@total + 1) do
16
- Post.find_each(:batch_size => 1) do |post|
17
- assert_kind_of Post, post
18
- end
19
- end
20
- end
21
-
22
- def test_each_should_not_return_query_chain_and_execute_only_one_query
23
- assert_queries(1) do
24
- result = Post.find_each(:batch_size => 100000){ }
25
- assert_nil result
26
- end
27
- end
28
-
29
- def test_each_should_return_an_enumerator_if_no_block_is_present
30
- assert_queries(1) do
31
- Post.find_each(:batch_size => 100000).with_index do |post, index|
32
- assert_kind_of Post, post
33
- assert_kind_of Integer, index
34
- end
35
- end
36
- end
37
-
38
- if Enumerator.method_defined? :size
39
- def test_each_should_return_a_sized_enumerator
40
- assert_equal 11, Post.find_each(:batch_size => 1).size
41
- assert_equal 5, Post.find_each(:batch_size => 2, :start => 7).size
42
- assert_equal 11, Post.find_each(:batch_size => 10_000).size
43
- end
44
- end
45
-
46
- def test_each_enumerator_should_execute_one_query_per_batch
47
- assert_queries(@total + 1) do
48
- Post.find_each(:batch_size => 1).with_index do |post, index|
49
- assert_kind_of Post, post
50
- assert_kind_of Integer, index
51
- end
52
- end
53
- end
54
-
55
- def test_each_should_raise_if_select_is_set_without_id
56
- assert_raise(RuntimeError) do
57
- Post.select(:title).find_each(batch_size: 1) { |post|
58
- flunk "should not call this block"
59
- }
60
- end
61
- end
62
-
63
- def test_each_should_execute_if_id_is_in_select
64
- assert_queries(6) do
65
- Post.select("id, title, type").find_each(:batch_size => 2) do |post|
66
- assert_kind_of Post, post
67
- end
68
- end
69
- end
70
-
71
- def test_warn_if_limit_scope_is_set
72
- ActiveRecord::Base.logger.expects(:warn)
73
- Post.limit(1).find_each { |post| post }
74
- end
75
-
76
- def test_warn_if_order_scope_is_set
77
- ActiveRecord::Base.logger.expects(:warn)
78
- Post.order("title").find_each { |post| post }
79
- end
80
-
81
- def test_logger_not_required
82
- previous_logger = ActiveRecord::Base.logger
83
- ActiveRecord::Base.logger = nil
84
- assert_nothing_raised do
85
- Post.limit(1).find_each { |post| post }
86
- end
87
- ensure
88
- ActiveRecord::Base.logger = previous_logger
89
- end
90
-
91
- def test_find_in_batches_should_return_batches
92
- assert_queries(@total + 1) do
93
- Post.find_in_batches(:batch_size => 1) do |batch|
94
- assert_kind_of Array, batch
95
- assert_kind_of Post, batch.first
96
- end
97
- end
98
- end
99
-
100
- def test_find_in_batches_should_start_from_the_start_option
101
- assert_queries(@total) do
102
- Post.find_in_batches(:batch_size => 1, :start => 2) do |batch|
103
- assert_kind_of Array, batch
104
- assert_kind_of Post, batch.first
105
- end
106
- end
107
- end
108
-
109
- def test_find_in_batches_shouldnt_execute_query_unless_needed
110
- assert_queries(2) do
111
- Post.find_in_batches(:batch_size => @total) {|batch| assert_kind_of Array, batch }
112
- end
113
-
114
- assert_queries(1) do
115
- Post.find_in_batches(:batch_size => @total + 1) {|batch| assert_kind_of Array, batch }
116
- end
117
- end
118
-
119
- def test_find_in_batches_should_quote_batch_order
120
- c = Post.connection
121
- assert_sql(/ORDER BY #{c.quote_table_name('posts')}.#{c.quote_column_name('id')}/) do
122
- Post.find_in_batches(:batch_size => 1) do |batch|
123
- assert_kind_of Array, batch
124
- assert_kind_of Post, batch.first
125
- end
126
- end
127
- end
128
-
129
- def test_find_in_batches_should_not_use_records_after_yielding_them_in_case_original_array_is_modified
130
- not_a_post = "not a post"
131
- not_a_post.stubs(:id).raises(StandardError, "not_a_post had #id called on it")
132
-
133
- assert_nothing_raised do
134
- Post.find_in_batches(:batch_size => 1) do |batch|
135
- assert_kind_of Array, batch
136
- assert_kind_of Post, batch.first
137
-
138
- batch.map! { not_a_post }
139
- end
140
- end
141
- end
142
-
143
- def test_find_in_batches_should_ignore_the_order_default_scope
144
- # First post is with title scope
145
- first_post = PostWithDefaultScope.first
146
- posts = []
147
- PostWithDefaultScope.find_in_batches do |batch|
148
- posts.concat(batch)
149
- end
150
- # posts.first will be ordered using id only. Title order scope should not apply here
151
- assert_not_equal first_post, posts.first
152
- assert_equal posts(:welcome), posts.first
153
- end
154
-
155
- def test_find_in_batches_should_not_ignore_the_default_scope_if_it_is_other_then_order
156
- special_posts_ids = SpecialPostWithDefaultScope.all.map(&:id).sort
157
- posts = []
158
- SpecialPostWithDefaultScope.find_in_batches do |batch|
159
- posts.concat(batch)
160
- end
161
- assert_equal special_posts_ids, posts.map(&:id)
162
- end
163
-
164
- def test_find_in_batches_should_not_modify_passed_options
165
- assert_nothing_raised do
166
- Post.find_in_batches({ batch_size: 42, start: 1 }.freeze){}
167
- end
168
- end
169
-
170
- def test_find_in_batches_should_use_any_column_as_primary_key
171
- nick_order_subscribers = Subscriber.order('nick asc')
172
- start_nick = nick_order_subscribers.second.nick
173
-
174
- subscribers = []
175
- Subscriber.find_in_batches(:batch_size => 1, :start => start_nick) do |batch|
176
- subscribers.concat(batch)
177
- end
178
-
179
- assert_equal nick_order_subscribers[1..-1].map(&:id), subscribers.map(&:id)
180
- end
181
-
182
- def test_find_in_batches_should_use_any_column_as_primary_key_when_start_is_not_specified
183
- assert_queries(Subscriber.count + 1) do
184
- Subscriber.find_each(:batch_size => 1) do |subscriber|
185
- assert_kind_of Subscriber, subscriber
186
- end
187
- end
188
- end
189
-
190
- def test_find_in_batches_should_return_an_enumerator
191
- enum = nil
192
- assert_queries(0) do
193
- enum = Post.find_in_batches(:batch_size => 1)
194
- end
195
- assert_queries(4) do
196
- enum.first(4) do |batch|
197
- assert_kind_of Array, batch
198
- assert_kind_of Post, batch.first
199
- end
200
- end
201
- end
202
-
203
- if Enumerator.method_defined? :size
204
- def test_find_in_batches_should_return_a_sized_enumerator
205
- assert_equal 11, Post.find_in_batches(:batch_size => 1).size
206
- assert_equal 6, Post.find_in_batches(:batch_size => 2).size
207
- assert_equal 4, Post.find_in_batches(:batch_size => 2, :start => 4).size
208
- assert_equal 4, Post.find_in_batches(:batch_size => 3).size
209
- assert_equal 1, Post.find_in_batches(:batch_size => 10_000).size
210
- end
211
- end
212
- end
1
+ require 'cases/helper'
2
+ require 'models/post'
3
+ require 'models/subscriber'
4
+
5
+ class EachTest < ActiveRecord::TestCase
6
+ fixtures :posts, :subscribers
7
+
8
+ def setup
9
+ @posts = Post.order("id asc")
10
+ @total = Post.count
11
+ Post.count('id') # preheat arel's table cache
12
+ end
13
+
14
+ def test_each_should_execute_one_query_per_batch
15
+ assert_queries(@total + 1) do
16
+ Post.find_each(:batch_size => 1) do |post|
17
+ assert_kind_of Post, post
18
+ end
19
+ end
20
+ end
21
+
22
+ def test_each_should_not_return_query_chain_and_execute_only_one_query
23
+ assert_queries(1) do
24
+ result = Post.find_each(:batch_size => 100000){ }
25
+ assert_nil result
26
+ end
27
+ end
28
+
29
+ def test_each_should_return_an_enumerator_if_no_block_is_present
30
+ assert_queries(1) do
31
+ Post.find_each(:batch_size => 100000).with_index do |post, index|
32
+ assert_kind_of Post, post
33
+ assert_kind_of Integer, index
34
+ end
35
+ end
36
+ end
37
+
38
+ if Enumerator.method_defined? :size
39
+ def test_each_should_return_a_sized_enumerator
40
+ assert_equal 11, Post.find_each(batch_size: 1).size
41
+ assert_equal 5, Post.find_each(batch_size: 2, start: 7).size
42
+ assert_equal 11, Post.find_each(batch_size: 10_000).size
43
+ end
44
+ end
45
+
46
+ def test_each_enumerator_should_execute_one_query_per_batch
47
+ assert_queries(@total + 1) do
48
+ Post.find_each(:batch_size => 1).with_index do |post, index|
49
+ assert_kind_of Post, post
50
+ assert_kind_of Integer, index
51
+ end
52
+ end
53
+ end
54
+
55
+ def test_each_should_raise_if_select_is_set_without_id
56
+ assert_raise(ArgumentError) do
57
+ Post.select(:title).find_each(batch_size: 1) { |post|
58
+ flunk "should not call this block"
59
+ }
60
+ end
61
+ end
62
+
63
+ def test_each_should_execute_if_id_is_in_select
64
+ assert_queries(6) do
65
+ Post.select("id, title, type").find_each(:batch_size => 2) do |post|
66
+ assert_kind_of Post, post
67
+ end
68
+ end
69
+ end
70
+
71
+ def test_warn_if_limit_scope_is_set
72
+ assert_called(ActiveRecord::Base.logger, :warn) do
73
+ Post.limit(1).find_each { |post| post }
74
+ end
75
+ end
76
+
77
+ def test_warn_if_order_scope_is_set
78
+ assert_called(ActiveRecord::Base.logger, :warn) do
79
+ Post.order("title").find_each { |post| post }
80
+ end
81
+ end
82
+
83
+ def test_logger_not_required
84
+ previous_logger = ActiveRecord::Base.logger
85
+ ActiveRecord::Base.logger = nil
86
+ assert_nothing_raised do
87
+ Post.limit(1).find_each { |post| post }
88
+ end
89
+ ensure
90
+ ActiveRecord::Base.logger = previous_logger
91
+ end
92
+
93
+ def test_find_in_batches_should_return_batches
94
+ assert_queries(@total + 1) do
95
+ Post.find_in_batches(:batch_size => 1) do |batch|
96
+ assert_kind_of Array, batch
97
+ assert_kind_of Post, batch.first
98
+ end
99
+ end
100
+ end
101
+
102
+ def test_find_in_batches_should_start_from_the_start_option
103
+ assert_queries(@total) do
104
+ Post.find_in_batches(batch_size: 1, start: 2) do |batch|
105
+ assert_kind_of Array, batch
106
+ assert_kind_of Post, batch.first
107
+ end
108
+ end
109
+ end
110
+
111
+ def test_find_in_batches_should_end_at_the_finish_option
112
+ assert_queries(6) do
113
+ Post.find_in_batches(batch_size: 1, finish: 5) do |batch|
114
+ assert_kind_of Array, batch
115
+ assert_kind_of Post, batch.first
116
+ end
117
+ end
118
+ end
119
+
120
+ def test_find_in_batches_shouldnt_execute_query_unless_needed
121
+ assert_queries(2) do
122
+ Post.find_in_batches(:batch_size => @total) {|batch| assert_kind_of Array, batch }
123
+ end
124
+
125
+ assert_queries(1) do
126
+ Post.find_in_batches(:batch_size => @total + 1) {|batch| assert_kind_of Array, batch }
127
+ end
128
+ end
129
+
130
+ def test_find_in_batches_should_quote_batch_order
131
+ c = Post.connection
132
+ assert_sql(/ORDER BY #{c.quote_table_name('posts')}.#{c.quote_column_name('id')}/) do
133
+ Post.find_in_batches(:batch_size => 1) do |batch|
134
+ assert_kind_of Array, batch
135
+ assert_kind_of Post, batch.first
136
+ end
137
+ end
138
+ end
139
+
140
+ def test_find_in_batches_should_not_use_records_after_yielding_them_in_case_original_array_is_modified
141
+ not_a_post = "not a post"
142
+ def not_a_post.id; end
143
+ not_a_post.stub(:id, ->{ raise StandardError.new("not_a_post had #id called on it") }) do
144
+ assert_nothing_raised do
145
+ Post.find_in_batches(:batch_size => 1) do |batch|
146
+ assert_kind_of Array, batch
147
+ assert_kind_of Post, batch.first
148
+
149
+ batch.map! { not_a_post }
150
+ end
151
+ end
152
+ end
153
+ end
154
+
155
+ def test_find_in_batches_should_ignore_the_order_default_scope
156
+ # First post is with title scope
157
+ first_post = PostWithDefaultScope.first
158
+ posts = []
159
+ PostWithDefaultScope.find_in_batches do |batch|
160
+ posts.concat(batch)
161
+ end
162
+ # posts.first will be ordered using id only. Title order scope should not apply here
163
+ assert_not_equal first_post, posts.first
164
+ assert_equal posts(:welcome).id, posts.first.id
165
+ end
166
+
167
+ def test_find_in_batches_should_error_on_ignore_the_order
168
+ assert_raise(ArgumentError) do
169
+ PostWithDefaultScope.find_in_batches(error_on_ignore: true){}
170
+ end
171
+ end
172
+
173
+ def test_find_in_batches_should_not_error_if_config_overriden
174
+ # Set the config option which will be overriden
175
+ prev = ActiveRecord::Base.error_on_ignored_order_or_limit
176
+ ActiveRecord::Base.error_on_ignored_order_or_limit = true
177
+ assert_nothing_raised do
178
+ PostWithDefaultScope.find_in_batches(error_on_ignore: false){}
179
+ end
180
+ ensure
181
+ # Set back to default
182
+ ActiveRecord::Base.error_on_ignored_order_or_limit = prev
183
+ end
184
+
185
+ def test_find_in_batches_should_error_on_config_specified_to_error
186
+ # Set the config option
187
+ prev = ActiveRecord::Base.error_on_ignored_order_or_limit
188
+ ActiveRecord::Base.error_on_ignored_order_or_limit = true
189
+ assert_raise(ArgumentError) do
190
+ PostWithDefaultScope.find_in_batches(){}
191
+ end
192
+ ensure
193
+ # Set back to default
194
+ ActiveRecord::Base.error_on_ignored_order_or_limit = prev
195
+ end
196
+
197
+ def test_find_in_batches_should_not_error_by_default
198
+ assert_nothing_raised do
199
+ PostWithDefaultScope.find_in_batches(){}
200
+ end
201
+ end
202
+
203
+ def test_find_in_batches_should_not_ignore_the_default_scope_if_it_is_other_then_order
204
+ special_posts_ids = SpecialPostWithDefaultScope.all.map(&:id).sort
205
+ posts = []
206
+ SpecialPostWithDefaultScope.find_in_batches do |batch|
207
+ posts.concat(batch)
208
+ end
209
+ assert_equal special_posts_ids, posts.map(&:id)
210
+ end
211
+
212
+ def test_find_in_batches_should_not_modify_passed_options
213
+ assert_nothing_raised do
214
+ Post.find_in_batches({ batch_size: 42, start: 1 }.freeze){}
215
+ end
216
+ end
217
+
218
+ def test_find_in_batches_should_use_any_column_as_primary_key
219
+ nick_order_subscribers = Subscriber.order('nick asc')
220
+ start_nick = nick_order_subscribers.second.nick
221
+
222
+ subscribers = []
223
+ Subscriber.find_in_batches(batch_size: 1, start: start_nick) do |batch|
224
+ subscribers.concat(batch)
225
+ end
226
+
227
+ assert_equal nick_order_subscribers[1..-1].map(&:id), subscribers.map(&:id)
228
+ end
229
+
230
+ def test_find_in_batches_should_use_any_column_as_primary_key_when_start_is_not_specified
231
+ assert_queries(Subscriber.count + 1) do
232
+ Subscriber.find_in_batches(batch_size: 1) do |batch|
233
+ assert_kind_of Array, batch
234
+ assert_kind_of Subscriber, batch.first
235
+ end
236
+ end
237
+ end
238
+
239
+ def test_find_in_batches_should_return_an_enumerator
240
+ enum = nil
241
+ assert_no_queries do
242
+ enum = Post.find_in_batches(:batch_size => 1)
243
+ end
244
+ assert_queries(4) do
245
+ enum.first(4) do |batch|
246
+ assert_kind_of Array, batch
247
+ assert_kind_of Post, batch.first
248
+ end
249
+ end
250
+ end
251
+
252
+ def test_in_batches_should_not_execute_any_query
253
+ assert_no_queries do
254
+ assert_kind_of ActiveRecord::Batches::BatchEnumerator, Post.in_batches(of: 2)
255
+ end
256
+ end
257
+
258
+ def test_in_batches_should_yield_relation_if_block_given
259
+ assert_queries(6) do
260
+ Post.in_batches(of: 2) do |relation|
261
+ assert_kind_of ActiveRecord::Relation, relation
262
+ end
263
+ end
264
+ end
265
+
266
+ def test_in_batches_should_be_enumerable_if_no_block_given
267
+ assert_queries(6) do
268
+ Post.in_batches(of: 2).each do |relation|
269
+ assert_kind_of ActiveRecord::Relation, relation
270
+ end
271
+ end
272
+ end
273
+
274
+ def test_in_batches_each_record_should_yield_record_if_block_is_given
275
+ assert_queries(6) do
276
+ Post.in_batches(of: 2).each_record do |post|
277
+ assert post.title.present?
278
+ assert_kind_of Post, post
279
+ end
280
+ end
281
+ end
282
+
283
+ def test_in_batches_each_record_should_return_enumerator_if_no_block_given
284
+ assert_queries(6) do
285
+ Post.in_batches(of: 2).each_record.with_index do |post, i|
286
+ assert post.title.present?
287
+ assert_kind_of Post, post
288
+ end
289
+ end
290
+ end
291
+
292
+ def test_in_batches_each_record_should_be_ordered_by_id
293
+ ids = Post.order('id ASC').pluck(:id)
294
+ assert_queries(6) do
295
+ Post.in_batches(of: 2).each_record.with_index do |post, i|
296
+ assert_equal ids[i], post.id
297
+ end
298
+ end
299
+ end
300
+
301
+ def test_in_batches_update_all_affect_all_records
302
+ assert_queries(6 + 6) do # 6 selects, 6 updates
303
+ Post.in_batches(of: 2).update_all(title: "updated-title")
304
+ end
305
+ assert_equal Post.all.pluck(:title), ["updated-title"] * Post.count
306
+ end
307
+
308
+ def test_in_batches_delete_all_should_not_delete_records_in_other_batches
309
+ not_deleted_count = Post.where('id <= 2').count
310
+ Post.where('id > 2').in_batches(of: 2).delete_all
311
+ assert_equal 0, Post.where('id > 2').count
312
+ assert_equal not_deleted_count, Post.count
313
+ end
314
+
315
+ def test_in_batches_should_not_be_loaded
316
+ Post.in_batches(of: 1) do |relation|
317
+ assert_not relation.loaded?
318
+ end
319
+
320
+ Post.in_batches(of: 1, load: false) do |relation|
321
+ assert_not relation.loaded?
322
+ end
323
+ end
324
+
325
+ def test_in_batches_should_be_loaded
326
+ Post.in_batches(of: 1, load: true) do |relation|
327
+ assert relation.loaded?
328
+ end
329
+ end
330
+
331
+ def test_in_batches_if_not_loaded_executes_more_queries
332
+ assert_queries(@total + 1) do
333
+ Post.in_batches(of: 1, load: false) do |relation|
334
+ assert_not relation.loaded?
335
+ end
336
+ end
337
+ end
338
+
339
+ def test_in_batches_should_return_relations
340
+ assert_queries(@total + 1) do
341
+ Post.in_batches(of: 1) do |relation|
342
+ assert_kind_of ActiveRecord::Relation, relation
343
+ end
344
+ end
345
+ end
346
+
347
+ def test_in_batches_should_start_from_the_start_option
348
+ post = Post.order('id ASC').where('id >= ?', 2).first
349
+ assert_queries(2) do
350
+ relation = Post.in_batches(of: 1, start: 2).first
351
+ assert_equal post, relation.first
352
+ end
353
+ end
354
+
355
+ def test_in_batches_should_end_at_the_finish_option
356
+ post = Post.order('id DESC').where('id <= ?', 5).first
357
+ assert_queries(7) do
358
+ relation = Post.in_batches(of: 1, finish: 5, load: true).reverse_each.first
359
+ assert_equal post, relation.last
360
+ end
361
+ end
362
+
363
+ def test_in_batches_shouldnt_execute_query_unless_needed
364
+ assert_queries(2) do
365
+ Post.in_batches(of: @total) { |relation| assert_kind_of ActiveRecord::Relation, relation }
366
+ end
367
+
368
+ assert_queries(1) do
369
+ Post.in_batches(of: @total + 1) { |relation| assert_kind_of ActiveRecord::Relation, relation }
370
+ end
371
+ end
372
+
373
+ def test_in_batches_should_quote_batch_order
374
+ c = Post.connection
375
+ assert_sql(/ORDER BY #{c.quote_table_name('posts')}.#{c.quote_column_name('id')}/) do
376
+ Post.in_batches(of: 1) do |relation|
377
+ assert_kind_of ActiveRecord::Relation, relation
378
+ assert_kind_of Post, relation.first
379
+ end
380
+ end
381
+ end
382
+
383
+ def test_in_batches_should_not_use_records_after_yielding_them_in_case_original_array_is_modified
384
+ not_a_post = "not a post"
385
+ def not_a_post.id
386
+ raise StandardError.new("not_a_post had #id called on it")
387
+ end
388
+
389
+ assert_nothing_raised do
390
+ Post.in_batches(of: 1) do |relation|
391
+ assert_kind_of ActiveRecord::Relation, relation
392
+ assert_kind_of Post, relation.first
393
+
394
+ relation = [not_a_post] * relation.count
395
+ end
396
+ end
397
+ end
398
+
399
+ def test_in_batches_should_not_ignore_default_scope_without_order_statements
400
+ special_posts_ids = SpecialPostWithDefaultScope.all.map(&:id).sort
401
+ posts = []
402
+ SpecialPostWithDefaultScope.in_batches do |relation|
403
+ posts.concat(relation)
404
+ end
405
+ assert_equal special_posts_ids, posts.map(&:id)
406
+ end
407
+
408
+ def test_in_batches_should_not_modify_passed_options
409
+ assert_nothing_raised do
410
+ Post.in_batches({ of: 42, start: 1 }.freeze){}
411
+ end
412
+ end
413
+
414
+ def test_in_batches_should_use_any_column_as_primary_key
415
+ nick_order_subscribers = Subscriber.order('nick asc')
416
+ start_nick = nick_order_subscribers.second.nick
417
+
418
+ subscribers = []
419
+ Subscriber.in_batches(of: 1, start: start_nick) do |relation|
420
+ subscribers.concat(relation)
421
+ end
422
+
423
+ assert_equal nick_order_subscribers[1..-1].map(&:id), subscribers.map(&:id)
424
+ end
425
+
426
+ def test_in_batches_should_use_any_column_as_primary_key_when_start_is_not_specified
427
+ assert_queries(Subscriber.count + 1) do
428
+ Subscriber.in_batches(of: 1, load: true) do |relation|
429
+ assert_kind_of ActiveRecord::Relation, relation
430
+ assert_kind_of Subscriber, relation.first
431
+ end
432
+ end
433
+ end
434
+
435
+ def test_in_batches_should_return_an_enumerator
436
+ enum = nil
437
+ assert_no_queries do
438
+ enum = Post.in_batches(of: 1)
439
+ end
440
+ assert_queries(4) do
441
+ enum.first(4) do |relation|
442
+ assert_kind_of ActiveRecord::Relation, relation
443
+ assert_kind_of Post, relation.first
444
+ end
445
+ end
446
+ end
447
+
448
+ def test_in_batches_relations_should_not_overlap_with_each_other
449
+ seen_posts = []
450
+ Post.in_batches(of: 2, load: true) do |relation|
451
+ relation.to_a.each do |post|
452
+ assert_not seen_posts.include?(post)
453
+ seen_posts << post
454
+ end
455
+ end
456
+ end
457
+
458
+ def test_in_batches_relations_with_condition_should_not_overlap_with_each_other
459
+ seen_posts = []
460
+ author_id = Post.first.author_id
461
+ posts_by_author = Post.where(author_id: author_id)
462
+ Post.in_batches(of: 2) do |batch|
463
+ seen_posts += batch.where(author_id: author_id)
464
+ end
465
+
466
+ assert_equal posts_by_author.pluck(:id).sort, seen_posts.map(&:id).sort
467
+ end
468
+
469
+ def test_in_batches_relations_update_all_should_not_affect_matching_records_in_other_batches
470
+ Post.update_all(author_id: 0)
471
+ person = Post.last
472
+ person.update_attributes(author_id: 1)
473
+
474
+ Post.in_batches(of: 2) do |batch|
475
+ batch.where('author_id >= 1').update_all('author_id = author_id + 1')
476
+ end
477
+ assert_equal 2, person.reload.author_id # incremented only once
478
+ end
479
+
480
+ if Enumerator.method_defined? :size
481
+ def test_find_in_batches_should_return_a_sized_enumerator
482
+ assert_equal 11, Post.find_in_batches(:batch_size => 1).size
483
+ assert_equal 6, Post.find_in_batches(:batch_size => 2).size
484
+ assert_equal 4, Post.find_in_batches(batch_size: 2, start: 4).size
485
+ assert_equal 4, Post.find_in_batches(:batch_size => 3).size
486
+ assert_equal 1, Post.find_in_batches(:batch_size => 10_000).size
487
+ end
488
+ end
489
+ end