ibm_db 3.0.4-x86-mingw32 → 3.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 (463) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -1
  3. data/LICENSE +1 -1
  4. data/MANIFEST +14 -14
  5. data/README +225 -225
  6. data/ext/Makefile.nt32 +181 -181
  7. data/ext/Makefile.nt32.191 +212 -212
  8. data/ext/extconf.rb +291 -291
  9. data/ext/ibm_db.c +11887 -11884
  10. data/ext/ruby_ibm_db.h +241 -241
  11. data/ext/ruby_ibm_db_cli.c +866 -866
  12. data/ext/ruby_ibm_db_cli.h +500 -500
  13. data/init.rb +41 -41
  14. data/lib/IBM_DB.rb +27 -27
  15. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3177 -3177
  16. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +1 -1
  17. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  18. data/lib/mswin32/ibm_db.rb +122 -122
  19. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  20. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  21. data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
  22. data/test/active_record/connection_adapters/fake_adapter.rb +46 -46
  23. data/test/assets/example.log +1 -1
  24. data/test/assets/test.txt +1 -1
  25. data/test/cases/adapter_test.rb +276 -261
  26. data/test/cases/aggregations_test.rb +158 -158
  27. data/test/cases/ar_schema_test.rb +161 -161
  28. data/test/cases/associations/association_scope_test.rb +21 -21
  29. data/test/cases/associations/belongs_to_associations_test.rb +1029 -1029
  30. data/test/cases/associations/callbacks_test.rb +192 -192
  31. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  32. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +26 -26
  33. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  34. data/test/cases/associations/eager_load_nested_include_test.rb +128 -128
  35. data/test/cases/associations/eager_singularization_test.rb +148 -148
  36. data/test/cases/associations/eager_test.rb +1429 -1411
  37. data/test/cases/associations/extension_test.rb +82 -82
  38. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +972 -932
  39. data/test/cases/associations/has_many_associations_test.rb +2182 -2162
  40. data/test/cases/associations/has_many_through_associations_test.rb +1204 -1204
  41. data/test/cases/associations/has_one_associations_test.rb +610 -610
  42. data/test/cases/associations/has_one_through_associations_test.rb +380 -380
  43. data/test/cases/associations/inner_join_association_test.rb +139 -139
  44. data/test/cases/associations/inverse_associations_test.rb +706 -693
  45. data/test/cases/associations/join_model_test.rb +754 -754
  46. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  47. data/test/cases/associations/required_test.rb +82 -82
  48. data/test/cases/associations_test.rb +380 -380
  49. data/test/cases/attribute_decorators_test.rb +125 -125
  50. data/test/cases/attribute_methods/read_test.rb +60 -60
  51. data/test/cases/attribute_methods/serialization_test.rb +29 -29
  52. data/test/cases/attribute_methods_test.rb +952 -952
  53. data/test/cases/attribute_set_test.rb +210 -200
  54. data/test/cases/attribute_test.rb +180 -180
  55. data/test/cases/attributes_test.rb +136 -136
  56. data/test/cases/autosave_association_test.rb +1595 -1595
  57. data/test/cases/base_test.rb +1664 -1638
  58. data/test/cases/batches_test.rb +212 -212
  59. data/test/cases/binary_test.rb +52 -52
  60. data/test/cases/bind_parameter_test.rb +100 -100
  61. data/test/cases/calculations_test.rb +646 -646
  62. data/test/cases/callbacks_test.rb +543 -543
  63. data/test/cases/clone_test.rb +40 -40
  64. data/test/cases/coders/yaml_column_test.rb +63 -63
  65. data/test/cases/column_alias_test.rb +17 -17
  66. data/test/cases/column_definition_test.rb +123 -123
  67. data/test/cases/connection_adapters/adapter_leasing_test.rb +54 -54
  68. data/test/cases/connection_adapters/connection_handler_test.rb +53 -53
  69. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  70. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +293 -293
  71. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +65 -65
  72. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  73. data/test/cases/connection_adapters/schema_cache_test.rb +56 -56
  74. data/test/cases/connection_adapters/type_lookup_test.rb +110 -110
  75. data/test/cases/connection_management_test.rb +122 -122
  76. data/test/cases/connection_pool_test.rb +346 -346
  77. data/test/cases/connection_specification/resolver_test.rb +116 -116
  78. data/test/cases/core_test.rb +112 -112
  79. data/test/cases/counter_cache_test.rb +209 -209
  80. data/test/cases/custom_locking_test.rb +17 -17
  81. data/test/cases/database_statements_test.rb +19 -19
  82. data/test/cases/date_time_test.rb +61 -61
  83. data/test/cases/defaults_test.rb +223 -223
  84. data/test/cases/dirty_test.rb +785 -775
  85. data/test/cases/disconnected_test.rb +28 -28
  86. data/test/cases/dup_test.rb +157 -157
  87. data/test/cases/enum_test.rb +290 -290
  88. data/test/cases/explain_subscriber_test.rb +64 -64
  89. data/test/cases/explain_test.rb +76 -76
  90. data/test/cases/finder_respond_to_test.rb +60 -60
  91. data/test/cases/finder_test.rb +1169 -1166
  92. data/test/cases/fixture_set/file_test.rb +138 -138
  93. data/test/cases/fixtures_test.rb +908 -897
  94. data/test/cases/forbidden_attributes_protection_test.rb +99 -99
  95. data/test/cases/habtm_destroy_order_test.rb +61 -61
  96. data/test/cases/helper.rb +210 -210
  97. data/test/cases/hot_compatibility_test.rb +54 -54
  98. data/test/cases/i18n_test.rb +45 -45
  99. data/test/cases/inheritance_test.rb +375 -375
  100. data/test/cases/integration_test.rb +139 -139
  101. data/test/cases/invalid_connection_test.rb +22 -22
  102. data/test/cases/invalid_date_test.rb +32 -32
  103. data/test/cases/invertible_migration_test.rb +295 -295
  104. data/test/cases/json_serialization_test.rb +302 -302
  105. data/test/cases/locking_test.rb +477 -477
  106. data/test/cases/log_subscriber_test.rb +136 -136
  107. data/test/cases/migration/change_schema_test - Copy.rb +448 -448
  108. data/test/cases/migration/change_schema_test.rb +512 -472
  109. data/test/cases/migration/change_table_test.rb +224 -224
  110. data/test/cases/migration/column_attributes_test.rb +192 -192
  111. data/test/cases/migration/column_positioning_test.rb +56 -56
  112. data/test/cases/migration/columns_test.rb +304 -304
  113. data/test/cases/migration/command_recorder_test.rb +305 -305
  114. data/test/cases/migration/create_join_table_test.rb +148 -148
  115. data/test/cases/migration/foreign_key_test - Changed.rb +325 -325
  116. data/test/cases/migration/foreign_key_test.rb +328 -360
  117. data/test/cases/migration/helper.rb +39 -39
  118. data/test/cases/migration/index_test.rb +216 -216
  119. data/test/cases/migration/logger_test.rb +36 -36
  120. data/test/cases/migration/pending_migrations_test.rb +53 -53
  121. data/test/cases/migration/references_foreign_key_test.rb +169 -214
  122. data/test/cases/migration/references_index_test.rb +101 -101
  123. data/test/cases/migration/references_statements_test.rb +116 -116
  124. data/test/cases/migration/rename_table_test.rb +93 -93
  125. data/test/cases/migration/table_and_index_test.rb +24 -24
  126. data/test/cases/migration_test.rb +959 -959
  127. data/test/cases/migrator_test.rb +388 -388
  128. data/test/cases/mixin_test.rb +70 -70
  129. data/test/cases/modules_test.rb +173 -173
  130. data/test/cases/multiparameter_attributes_test.rb +350 -350
  131. data/test/cases/multiple_db_test.rb +115 -115
  132. data/test/cases/nested_attributes_test.rb +1070 -1057
  133. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  134. data/test/cases/persistence_test.rb +909 -909
  135. data/test/cases/pooled_connections_test.rb +81 -81
  136. data/test/cases/primary_keys_test.rb +237 -237
  137. data/test/cases/query_cache_test.rb +326 -326
  138. data/test/cases/quoting_test.rb +156 -156
  139. data/test/cases/readonly_test.rb +118 -118
  140. data/test/cases/reaper_test.rb +85 -85
  141. data/test/cases/reflection_test.rb +463 -454
  142. data/test/cases/relation/delegation_test.rb +68 -68
  143. data/test/cases/relation/merging_test.rb +161 -161
  144. data/test/cases/relation/mutation_test.rb +165 -165
  145. data/test/cases/relation/predicate_builder_test.rb +14 -14
  146. data/test/cases/relation/where_chain_test.rb +181 -181
  147. data/test/cases/relation/where_test.rb +300 -300
  148. data/test/cases/relation/where_test2.rb +36 -36
  149. data/test/cases/relation_test.rb +319 -297
  150. data/test/cases/relations_test.rb +1815 -1815
  151. data/test/cases/reload_models_test.rb +22 -22
  152. data/test/cases/result_test.rb +80 -80
  153. data/test/cases/sanitize_test.rb +83 -83
  154. data/test/cases/schema_dumper_test.rb +463 -463
  155. data/test/cases/scoping/default_scoping_test.rb +454 -454
  156. data/test/cases/scoping/named_scoping_test.rb +524 -524
  157. data/test/cases/scoping/relation_scoping_test.rb +357 -357
  158. data/test/cases/serialization_test.rb +104 -104
  159. data/test/cases/serialized_attribute_test.rb +277 -277
  160. data/test/cases/statement_cache_test.rb +98 -98
  161. data/test/cases/store_test.rb +194 -194
  162. data/test/cases/tasks/database_tasks_test.rb +398 -396
  163. data/test/cases/tasks/mysql_rake_test.rb +324 -311
  164. data/test/cases/tasks/postgresql_rake_test.rb +250 -245
  165. data/test/cases/tasks/sqlite_rake_test.rb +193 -193
  166. data/test/cases/test_case.rb +123 -123
  167. data/test/cases/timestamp_test.rb +467 -468
  168. data/test/cases/transaction_callbacks_test.rb +452 -452
  169. data/test/cases/transaction_isolation_test.rb +106 -106
  170. data/test/cases/transactions_test.rb +817 -817
  171. data/test/cases/type/decimal_test.rb +56 -51
  172. data/test/cases/type/integer_test.rb +121 -121
  173. data/test/cases/type/string_test.rb +36 -36
  174. data/test/cases/type/type_map_test.rb +177 -177
  175. data/test/cases/type/unsigned_integer_test.rb +18 -18
  176. data/test/cases/types_test.rb +141 -141
  177. data/test/cases/unconnected_test.rb +33 -33
  178. data/test/cases/validations/association_validation_test.rb +86 -86
  179. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  180. data/test/cases/validations/i18n_validation_test.rb +90 -90
  181. data/test/cases/validations/length_validation_test.rb +47 -47
  182. data/test/cases/validations/presence_validation_test.rb +68 -68
  183. data/test/cases/validations/uniqueness_validation_test.rb +457 -434
  184. data/test/cases/validations_repair_helper.rb +23 -23
  185. data/test/cases/validations_test.rb +165 -165
  186. data/test/cases/view_test.rb +119 -113
  187. data/test/cases/xml_serialization_test.rb +457 -457
  188. data/test/cases/yaml_serialization_test.rb +126 -86
  189. data/test/config.rb +5 -5
  190. data/test/config.yml +154 -154
  191. data/test/connections/native_ibm_db/connection.rb +43 -43
  192. data/test/fixtures/accounts.yml +29 -29
  193. data/test/fixtures/admin/accounts.yml +2 -2
  194. data/test/fixtures/admin/randomly_named_a9.yml +7 -7
  195. data/test/fixtures/admin/randomly_named_b0.yml +7 -7
  196. data/test/fixtures/admin/users.yml +10 -10
  197. data/test/fixtures/author_addresses.yml +17 -17
  198. data/test/fixtures/author_favorites.yml +3 -3
  199. data/test/fixtures/authors.yml +23 -23
  200. data/test/fixtures/binaries.yml +133 -133
  201. data/test/fixtures/books.yml +11 -11
  202. data/test/fixtures/bulbs.yml +5 -5
  203. data/test/fixtures/cars.yml +9 -9
  204. data/test/fixtures/categories.yml +19 -19
  205. data/test/fixtures/categories/special_categories.yml +9 -9
  206. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  207. data/test/fixtures/categories_ordered.yml +7 -7
  208. data/test/fixtures/categories_posts.yml +31 -31
  209. data/test/fixtures/categorizations.yml +23 -23
  210. data/test/fixtures/clubs.yml +8 -8
  211. data/test/fixtures/collections.yml +3 -3
  212. data/test/fixtures/colleges.yml +3 -3
  213. data/test/fixtures/comments.yml +65 -65
  214. data/test/fixtures/companies.yml +67 -67
  215. data/test/fixtures/computers.yml +10 -10
  216. data/test/fixtures/courses.yml +8 -8
  217. data/test/fixtures/customers.yml +25 -25
  218. data/test/fixtures/dashboards.yml +6 -6
  219. data/test/fixtures/developers.yml +21 -21
  220. data/test/fixtures/developers_projects.yml +16 -16
  221. data/test/fixtures/dog_lovers.yml +7 -7
  222. data/test/fixtures/dogs.yml +4 -4
  223. data/test/fixtures/doubloons.yml +3 -3
  224. data/test/fixtures/edges.yml +5 -5
  225. data/test/fixtures/entrants.yml +14 -14
  226. data/test/fixtures/essays.yml +6 -6
  227. data/test/fixtures/faces.yml +11 -11
  228. data/test/fixtures/fk_test_has_fk.yml +3 -3
  229. data/test/fixtures/fk_test_has_pk.yml +1 -1
  230. data/test/fixtures/friendships.yml +4 -4
  231. data/test/fixtures/funny_jokes.yml +10 -10
  232. data/test/fixtures/interests.yml +33 -33
  233. data/test/fixtures/items.yml +3 -3
  234. data/test/fixtures/jobs.yml +7 -7
  235. data/test/fixtures/legacy_things.yml +3 -3
  236. data/test/fixtures/mateys.yml +4 -4
  237. data/test/fixtures/member_details.yml +8 -8
  238. data/test/fixtures/member_types.yml +6 -6
  239. data/test/fixtures/members.yml +11 -11
  240. data/test/fixtures/memberships.yml +34 -34
  241. data/test/fixtures/men.yml +5 -5
  242. data/test/fixtures/minimalistics.yml +2 -2
  243. data/test/fixtures/minivans.yml +5 -5
  244. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  245. data/test/fixtures/mixins.yml +29 -29
  246. data/test/fixtures/movies.yml +7 -7
  247. data/test/fixtures/naked/csv/accounts.csv +1 -1
  248. data/test/fixtures/naked/yml/accounts.yml +1 -1
  249. data/test/fixtures/naked/yml/companies.yml +1 -1
  250. data/test/fixtures/naked/yml/courses.yml +1 -1
  251. data/test/fixtures/organizations.yml +5 -5
  252. data/test/fixtures/other_topics.yml +42 -42
  253. data/test/fixtures/owners.yml +9 -9
  254. data/test/fixtures/parrots.yml +27 -27
  255. data/test/fixtures/parrots_pirates.yml +7 -7
  256. data/test/fixtures/people.yml +24 -24
  257. data/test/fixtures/peoples_treasures.yml +3 -3
  258. data/test/fixtures/pets.yml +19 -19
  259. data/test/fixtures/pirates.yml +12 -12
  260. data/test/fixtures/posts.yml +80 -80
  261. data/test/fixtures/price_estimates.yml +7 -7
  262. data/test/fixtures/products.yml +4 -4
  263. data/test/fixtures/projects.yml +7 -7
  264. data/test/fixtures/randomly_named_a9.yml +7 -7
  265. data/test/fixtures/ratings.yml +14 -14
  266. data/test/fixtures/readers.yml +11 -11
  267. data/test/fixtures/references.yml +17 -17
  268. data/test/fixtures/reserved_words/distinct.yml +5 -5
  269. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  270. data/test/fixtures/reserved_words/group.yml +14 -14
  271. data/test/fixtures/reserved_words/select.yml +8 -8
  272. data/test/fixtures/reserved_words/values.yml +7 -7
  273. data/test/fixtures/ships.yml +6 -6
  274. data/test/fixtures/speedometers.yml +8 -8
  275. data/test/fixtures/sponsors.yml +12 -12
  276. data/test/fixtures/string_key_objects.yml +7 -7
  277. data/test/fixtures/subscribers.yml +10 -10
  278. data/test/fixtures/subscriptions.yml +12 -12
  279. data/test/fixtures/taggings.yml +78 -78
  280. data/test/fixtures/tags.yml +11 -11
  281. data/test/fixtures/tasks.yml +7 -7
  282. data/test/fixtures/teapots.yml +3 -3
  283. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  284. data/test/fixtures/to_be_linked/users.yml +10 -10
  285. data/test/fixtures/topics.yml +49 -49
  286. data/test/fixtures/toys.yml +14 -14
  287. data/test/fixtures/traffic_lights.yml +9 -9
  288. data/test/fixtures/treasures.yml +10 -10
  289. data/test/fixtures/uuid_children.yml +3 -3
  290. data/test/fixtures/uuid_parents.yml +2 -2
  291. data/test/fixtures/variants.yml +4 -4
  292. data/test/fixtures/vegetables.yml +19 -19
  293. data/test/fixtures/vertices.yml +3 -3
  294. data/test/fixtures/warehouse_things.yml +2 -2
  295. data/test/fixtures/zines.yml +5 -5
  296. data/test/ibm_db_test.rb +24 -24
  297. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  298. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  299. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  300. data/test/migrations/missing/1000_people_have_middle_names.rb +8 -8
  301. data/test/migrations/missing/1_people_have_last_names.rb +8 -8
  302. data/test/migrations/missing/3_we_need_reminders.rb +11 -11
  303. data/test/migrations/missing/4_innocent_jointable.rb +11 -11
  304. data/test/migrations/rename/1_we_need_things.rb +10 -10
  305. data/test/migrations/rename/2_rename_things.rb +8 -8
  306. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  307. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  308. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  309. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  310. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  311. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  312. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  313. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  314. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  315. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  316. data/test/migrations/valid/2_we_need_reminders.rb +11 -11
  317. data/test/migrations/valid/3_innocent_jointable.rb +11 -11
  318. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  319. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +11 -11
  320. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +11 -11
  321. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  322. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  323. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  324. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  325. data/test/models/admin.rb +4 -4
  326. data/test/models/admin/account.rb +2 -2
  327. data/test/models/admin/randomly_named_c1.rb +3 -3
  328. data/test/models/admin/user.rb +40 -40
  329. data/test/models/aircraft.rb +4 -4
  330. data/test/models/arunit2_model.rb +3 -3
  331. data/test/models/author.rb +212 -212
  332. data/test/models/auto_id.rb +4 -4
  333. data/test/models/autoloadable/extra_firm.rb +2 -2
  334. data/test/models/binary.rb +1 -1
  335. data/test/models/bird.rb +12 -12
  336. data/test/models/book.rb +18 -18
  337. data/test/models/boolean.rb +2 -2
  338. data/test/models/bulb.rb +51 -51
  339. data/test/models/cake_designer.rb +3 -3
  340. data/test/models/car.rb +26 -26
  341. data/test/models/carrier.rb +2 -2
  342. data/test/models/categorization.rb +19 -19
  343. data/test/models/category.rb +35 -35
  344. data/test/models/chef.rb +7 -3
  345. data/test/models/citation.rb +3 -3
  346. data/test/models/club.rb +23 -23
  347. data/test/models/college.rb +10 -10
  348. data/test/models/column.rb +3 -3
  349. data/test/models/column_name.rb +3 -3
  350. data/test/models/comment.rb +64 -64
  351. data/test/models/company.rb +228 -225
  352. data/test/models/company_in_module.rb +98 -98
  353. data/test/models/computer.rb +3 -3
  354. data/test/models/contact.rb +41 -41
  355. data/test/models/contract.rb +20 -20
  356. data/test/models/country.rb +7 -7
  357. data/test/models/course.rb +6 -6
  358. data/test/models/customer.rb +77 -77
  359. data/test/models/customer_carrier.rb +14 -14
  360. data/test/models/dashboard.rb +3 -3
  361. data/test/models/default.rb +2 -2
  362. data/test/models/department.rb +4 -4
  363. data/test/models/developer.rb +255 -252
  364. data/test/models/dog.rb +5 -5
  365. data/test/models/dog_lover.rb +5 -5
  366. data/test/models/doubloon.rb +12 -12
  367. data/test/models/drink_designer.rb +3 -3
  368. data/test/models/edge.rb +5 -5
  369. data/test/models/electron.rb +5 -5
  370. data/test/models/engine.rb +4 -4
  371. data/test/models/entrant.rb +3 -3
  372. data/test/models/essay.rb +5 -5
  373. data/test/models/event.rb +2 -2
  374. data/test/models/eye.rb +37 -37
  375. data/test/models/face.rb +9 -9
  376. data/test/models/friendship.rb +6 -6
  377. data/test/models/guid.rb +1 -1
  378. data/test/models/hotel.rb +9 -6
  379. data/test/models/image.rb +3 -3
  380. data/test/models/interest.rb +5 -5
  381. data/test/models/invoice.rb +4 -4
  382. data/test/models/item.rb +7 -7
  383. data/test/models/job.rb +7 -7
  384. data/test/models/joke.rb +7 -7
  385. data/test/models/keyboard.rb +3 -3
  386. data/test/models/legacy_thing.rb +3 -3
  387. data/test/models/lesson.rb +11 -11
  388. data/test/models/line_item.rb +3 -3
  389. data/test/models/liquid.rb +4 -4
  390. data/test/models/man.rb +11 -11
  391. data/test/models/matey.rb +4 -4
  392. data/test/models/member.rb +41 -41
  393. data/test/models/member_detail.rb +7 -7
  394. data/test/models/member_type.rb +3 -3
  395. data/test/models/membership.rb +35 -35
  396. data/test/models/minimalistic.rb +2 -2
  397. data/test/models/minivan.rb +9 -9
  398. data/test/models/mixed_case_monkey.rb +3 -3
  399. data/test/models/molecule.rb +6 -6
  400. data/test/models/movie.rb +5 -5
  401. data/test/models/order.rb +4 -4
  402. data/test/models/organization.rb +14 -14
  403. data/test/models/owner.rb +34 -34
  404. data/test/models/parrot.rb +29 -29
  405. data/test/models/person.rb +143 -143
  406. data/test/models/personal_legacy_thing.rb +4 -4
  407. data/test/models/pet.rb +15 -15
  408. data/test/models/pirate.rb +92 -92
  409. data/test/models/possession.rb +3 -3
  410. data/test/models/post.rb +264 -264
  411. data/test/models/price_estimate.rb +4 -4
  412. data/test/models/professor.rb +5 -5
  413. data/test/models/project.rb +31 -29
  414. data/test/models/publisher.rb +2 -2
  415. data/test/models/publisher/article.rb +4 -4
  416. data/test/models/publisher/magazine.rb +3 -3
  417. data/test/models/randomly_named_c1.rb +3 -3
  418. data/test/models/rating.rb +4 -4
  419. data/test/models/reader.rb +23 -23
  420. data/test/models/record.rb +2 -2
  421. data/test/models/reference.rb +22 -22
  422. data/test/models/reply.rb +61 -61
  423. data/test/models/ship.rb +33 -33
  424. data/test/models/ship_part.rb +7 -7
  425. data/test/models/shop.rb +17 -17
  426. data/test/models/shop_account.rb +6 -6
  427. data/test/models/speedometer.rb +6 -6
  428. data/test/models/sponsor.rb +7 -7
  429. data/test/models/string_key_object.rb +3 -3
  430. data/test/models/student.rb +4 -4
  431. data/test/models/subject.rb +16 -16
  432. data/test/models/subscriber.rb +8 -8
  433. data/test/models/subscription.rb +4 -4
  434. data/test/models/tag.rb +7 -7
  435. data/test/models/tagging.rb +13 -13
  436. data/test/models/task.rb +5 -5
  437. data/test/models/topic.rb +124 -124
  438. data/test/models/toy.rb +6 -6
  439. data/test/models/traffic_light.rb +4 -4
  440. data/test/models/treasure.rb +14 -14
  441. data/test/models/treaty.rb +7 -7
  442. data/test/models/tyre.rb +11 -11
  443. data/test/models/uuid_child.rb +3 -3
  444. data/test/models/uuid_parent.rb +3 -3
  445. data/test/models/vegetables.rb +24 -24
  446. data/test/models/vehicle.rb +6 -6
  447. data/test/models/vertex.rb +9 -9
  448. data/test/models/warehouse_thing.rb +5 -5
  449. data/test/models/wheel.rb +3 -3
  450. data/test/models/without_table.rb +3 -3
  451. data/test/models/zine.rb +3 -3
  452. data/test/schema/mysql2_specific_schema.rb +58 -58
  453. data/test/schema/mysql_specific_schema.rb +70 -70
  454. data/test/schema/oracle_specific_schema.rb +43 -43
  455. data/test/schema/postgresql_specific_schema.rb +202 -202
  456. data/test/schema/schema.rb +952 -938
  457. data/test/schema/sqlite_specific_schema.rb +21 -21
  458. data/test/support/config.rb +43 -43
  459. data/test/support/connection.rb +22 -22
  460. data/test/support/connection_helper.rb +14 -14
  461. data/test/support/ddl_helper.rb +8 -8
  462. data/test/support/schema_dumping_helper.rb +20 -20
  463. metadata +2 -2
@@ -1,468 +1,467 @@
1
- require 'cases/helper'
2
- require 'support/ddl_helper'
3
- require 'models/developer'
4
- require 'models/computer'
5
- require 'models/owner'
6
- require 'models/pet'
7
- require 'models/toy'
8
- require 'models/car'
9
- require 'models/task'
10
-
11
- class TimestampTest < ActiveRecord::TestCase
12
- fixtures :developers, :owners, :pets, :toys, :cars, :tasks
13
-
14
- def setup
15
- @developer = Developer.first
16
- @owner = Owner.first
17
- @developer.update_columns(updated_at: Time.now.prev_month)
18
- @previously_updated_at = @developer.updated_at
19
- end
20
-
21
- def test_saving_a_changed_record_updates_its_timestamp
22
- @developer.name = "Jack Bauer"
23
- @developer.save!
24
-
25
- assert_not_equal @previously_updated_at, @developer.updated_at
26
- end
27
-
28
- def test_saving_a_unchanged_record_doesnt_update_its_timestamp
29
- @developer.save!
30
-
31
- assert_equal @previously_updated_at, @developer.updated_at
32
- end
33
-
34
- def test_touching_a_record_updates_its_timestamp
35
- previous_salary = @developer.salary
36
- @developer.salary = previous_salary + 10000
37
- @developer.touch
38
-
39
- assert_not_equal @previously_updated_at, @developer.updated_at
40
- assert_equal previous_salary + 10000, @developer.salary
41
- assert @developer.salary_changed?, 'developer salary should have changed'
42
- assert @developer.changed?, 'developer should be marked as changed'
43
- @developer.reload
44
- assert_equal previous_salary, @developer.salary
45
- end
46
-
47
- def test_touching_a_record_with_default_scope_that_excludes_it_updates_its_timestamp
48
- developer = @developer.becomes(DeveloperCalledJamis)
49
-
50
- developer.touch
51
- assert_not_equal @previously_updated_at, developer.updated_at
52
- developer.reload
53
- assert_not_equal @previously_updated_at, developer.updated_at
54
- end
55
-
56
- def test_saving_when_record_timestamps_is_false_doesnt_update_its_timestamp
57
- Developer.record_timestamps = false
58
- @developer.name = "John Smith"
59
- @developer.save!
60
-
61
- assert_equal @previously_updated_at, @developer.updated_at
62
- ensure
63
- Developer.record_timestamps = true
64
- end
65
-
66
- def test_saving_when_instance_record_timestamps_is_false_doesnt_update_its_timestamp
67
- @developer.record_timestamps = false
68
- assert Developer.record_timestamps
69
-
70
- @developer.name = "John Smith"
71
- @developer.save!
72
-
73
- assert_equal @previously_updated_at, @developer.updated_at
74
- end
75
-
76
- def test_touching_an_attribute_updates_timestamp
77
- previously_created_at = @developer.created_at
78
- @developer.touch(:created_at)
79
-
80
- assert !@developer.created_at_changed? , 'created_at should not be changed'
81
- assert !@developer.changed?, 'record should not be changed'
82
- assert_not_equal previously_created_at, @developer.created_at
83
- assert_not_equal @previously_updated_at, @developer.updated_at
84
- end
85
-
86
- def test_touching_an_attribute_updates_it
87
- task = Task.first
88
- previous_value = task.ending
89
- task.touch(:ending)
90
- assert_not_equal previous_value, task.ending
91
- assert_in_delta Time.now, task.ending, 1
92
- end
93
-
94
- def test_touching_many_attributes_updates_them
95
- task = Task.first
96
- previous_starting = task.starting
97
- previous_ending = task.ending
98
- task.touch(:starting, :ending)
99
-
100
- assert_not_equal previous_starting, task.starting
101
- assert_not_equal previous_ending, task.ending
102
- assert_in_delta Time.now, task.starting, 1
103
- assert_in_delta Time.now, task.ending, 1
104
- end
105
-
106
- def test_touching_a_record_without_timestamps_is_unexceptional
107
- assert_nothing_raised { Car.first.touch }
108
- end
109
-
110
- def test_touching_a_no_touching_object
111
- Developer.no_touching do
112
- assert @developer.no_touching?
113
- assert !@owner.no_touching?
114
- @developer.touch
115
- end
116
-
117
- assert !@developer.no_touching?
118
- assert !@owner.no_touching?
119
- assert_equal @previously_updated_at, @developer.updated_at
120
- end
121
-
122
- def test_touching_related_objects
123
- @owner = Owner.first
124
- @previously_updated_at = @owner.updated_at
125
-
126
- Owner.no_touching do
127
- @owner.pets.first.touch
128
- end
129
-
130
- assert_equal @previously_updated_at, @owner.updated_at
131
- end
132
-
133
- def test_global_no_touching
134
- ActiveRecord::Base.no_touching do
135
- assert @developer.no_touching?
136
- assert @owner.no_touching?
137
- @developer.touch
138
- end
139
-
140
- assert !@developer.no_touching?
141
- assert !@owner.no_touching?
142
- assert_equal @previously_updated_at, @developer.updated_at
143
- end
144
-
145
- def test_no_touching_threadsafe
146
- Thread.new do
147
- Developer.no_touching do
148
- assert @developer.no_touching?
149
-
150
- sleep(1)
151
- end
152
- end
153
-
154
- assert !@developer.no_touching?
155
- end
156
-
157
- def test_no_touching_with_callbacks
158
- klass = Class.new(ActiveRecord::Base) do
159
- self.table_name = "developers"
160
-
161
- attr_accessor :after_touch_called
162
-
163
- after_touch do |user|
164
- user.after_touch_called = true
165
- end
166
- end
167
-
168
- developer = klass.first
169
-
170
- klass.no_touching do
171
- developer.touch
172
- assert_not developer.after_touch_called
173
- end
174
- end
175
-
176
- def test_saving_a_record_with_a_belongs_to_that_specifies_touching_the_parent_should_update_the_parent_updated_at
177
- pet = Pet.first
178
- owner = pet.owner
179
- previously_owner_updated_at = owner.updated_at
180
-
181
- pet.name = "Fluffy the Third"
182
- pet.save
183
-
184
- assert_not_equal previously_owner_updated_at, pet.owner.updated_at
185
- end
186
-
187
- def test_destroying_a_record_with_a_belongs_to_that_specifies_touching_the_parent_should_update_the_parent_updated_at
188
- pet = Pet.first
189
- owner = pet.owner
190
- previously_owner_updated_at = owner.updated_at
191
-
192
- pet.destroy
193
-
194
- assert_not_equal previously_owner_updated_at, pet.owner.updated_at
195
- end
196
-
197
- def test_saving_a_new_record_belonging_to_invalid_parent_with_touch_should_not_raise_exception
198
- klass = Class.new(Owner) do
199
- def self.name; 'Owner'; end
200
- validate { errors.add(:base, :invalid) }
201
- end
202
-
203
- pet = Pet.new(owner: klass.new)
204
- pet.save!
205
-
206
- assert pet.owner.new_record?
207
- end
208
-
209
- def test_saving_a_record_with_a_belongs_to_that_specifies_touching_a_specific_attribute_the_parent_should_update_that_attribute
210
- klass = Class.new(ActiveRecord::Base) do
211
- def self.name; 'Pet'; end
212
- belongs_to :owner, :touch => :happy_at
213
- end
214
-
215
- pet = klass.first
216
- owner = pet.owner
217
- previously_owner_happy_at = owner.happy_at
218
-
219
- pet.name = "Fluffy the Third"
220
- pet.save
221
-
222
- assert_not_equal previously_owner_happy_at, pet.owner.happy_at
223
- end
224
-
225
- def test_touching_a_record_with_a_belongs_to_that_uses_a_counter_cache_should_update_the_parent
226
- klass = Class.new(ActiveRecord::Base) do
227
- def self.name; 'Pet'; end
228
- belongs_to :owner, :counter_cache => :use_count, :touch => true
229
- end
230
-
231
- pet = klass.first
232
- owner = pet.owner
233
- owner.update_columns(happy_at: 3.days.ago)
234
- previously_owner_updated_at = owner.updated_at
235
-
236
- pet.name = "I'm a parrot"
237
- pet.save
238
-
239
- assert_not_equal previously_owner_updated_at, pet.owner.updated_at
240
- end
241
-
242
- def test_touching_a_record_touches_parent_record_and_grandparent_record
243
- klass = Class.new(ActiveRecord::Base) do
244
- def self.name; 'Toy'; end
245
- belongs_to :pet, :touch => true
246
- end
247
-
248
- toy = klass.first
249
- pet = toy.pet
250
- owner = pet.owner
251
- time = 3.days.ago
252
-
253
- owner.update_columns(updated_at: time)
254
- toy.touch
255
- owner.reload
256
-
257
- assert_not_equal time, owner.updated_at
258
- end
259
-
260
- def test_touching_a_record_touches_polymorphic_record
261
- klass = Class.new(ActiveRecord::Base) do
262
- def self.name; 'Toy'; end
263
- end
264
-
265
- wheel_klass = Class.new(ActiveRecord::Base) do
266
- def self.name; 'Wheel'; end
267
- belongs_to :wheelable, :polymorphic => true, :touch => true
268
- end
269
-
270
- toy = klass.first
271
- time = 3.days.ago
272
- toy.update_columns(updated_at: time)
273
-
274
- wheel = wheel_klass.new
275
- wheel.wheelable = toy
276
- wheel.save
277
- wheel.touch
278
-
279
- assert_not_equal time, toy.updated_at
280
- end
281
-
282
- def test_changing_parent_of_a_record_touches_both_new_and_old_parent_record
283
- klass = Class.new(ActiveRecord::Base) do
284
- def self.name; 'Toy'; end
285
- belongs_to :pet, touch: true
286
- end
287
-
288
- toy1 = klass.find(1)
289
- old_pet = toy1.pet
290
-
291
- toy2 = klass.find(2)
292
- new_pet = toy2.pet
293
- time = 3.days.ago.at_beginning_of_hour
294
-
295
- old_pet.update_columns(updated_at: time)
296
- new_pet.update_columns(updated_at: time)
297
-
298
- toy1.pet = new_pet
299
- toy1.save!
300
-
301
- old_pet.reload
302
- new_pet.reload
303
-
304
- assert_not_equal time, new_pet.updated_at
305
- assert_not_equal time, old_pet.updated_at
306
- end
307
-
308
- def test_changing_parent_of_a_record_touches_both_new_and_old_polymorphic_parent_record_changes_within_same_class
309
- car_class = Class.new(ActiveRecord::Base) do
310
- def self.name; 'Car'; end
311
- end
312
-
313
- wheel_class = Class.new(ActiveRecord::Base) do
314
- def self.name; 'Wheel'; end
315
- belongs_to :wheelable, :polymorphic => true, :touch => true
316
- end
317
-
318
- car1 = car_class.find(1)
319
- car2 = car_class.find(2)
320
-
321
- wheel = wheel_class.create!(wheelable: car1)
322
-
323
- time = 3.days.ago.at_beginning_of_hour
324
-
325
- car1.update_columns(updated_at: time)
326
- car2.update_columns(updated_at: time)
327
-
328
- wheel.wheelable = car2
329
- wheel.save!
330
-
331
- assert_not_equal time, car1.reload.updated_at
332
- assert_not_equal time, car2.reload.updated_at
333
- end
334
-
335
- def test_changing_parent_of_a_record_touches_both_new_and_old_polymorphic_parent_record_changes_with_other_class
336
- car_class = Class.new(ActiveRecord::Base) do
337
- def self.name; 'Car'; end
338
- end
339
-
340
- toy_class = Class.new(ActiveRecord::Base) do
341
- def self.name; 'Toy'; end
342
- end
343
-
344
- wheel_class = Class.new(ActiveRecord::Base) do
345
- def self.name; 'Wheel'; end
346
- belongs_to :wheelable, :polymorphic => true, :touch => true
347
- end
348
-
349
- car = car_class.find(1)
350
- toy = toy_class.find(3)
351
-
352
- wheel = wheel_class.create!(wheelable: car)
353
-
354
- time = 3.days.ago.at_beginning_of_hour
355
-
356
- car.update_columns(updated_at: time)
357
- toy.update_columns(updated_at: time)
358
-
359
- wheel.wheelable = toy
360
- wheel.save!
361
-
362
- assert_not_equal time, car.reload.updated_at
363
- assert_not_equal time, toy.reload.updated_at
364
- end
365
-
366
- def test_clearing_association_touches_the_old_record
367
- klass = Class.new(ActiveRecord::Base) do
368
- def self.name; 'Toy'; end
369
- belongs_to :pet, touch: true
370
- end
371
-
372
- toy = klass.find(1)
373
- pet = toy.pet
374
- time = 3.days.ago.at_beginning_of_hour
375
-
376
- pet.update_columns(updated_at: time)
377
-
378
- toy.pet = nil
379
- toy.save!
380
-
381
- pet.reload
382
-
383
- assert_not_equal time, pet.updated_at
384
- end
385
-
386
- def test_timestamp_column_values_are_present_in_the_callbacks
387
- klass = Class.new(ActiveRecord::Base) do
388
- self.table_name = 'people'
389
-
390
- before_create do
391
- self.born_at = self.created_at
392
- end
393
- end
394
-
395
- person = klass.create first_name: 'David'
396
- assert_not_equal person.born_at, nil
397
- end
398
-
399
- def test_timestamp_attributes_for_create
400
- toy = Toy.first
401
- assert_equal [:created_at, :created_on], toy.send(:timestamp_attributes_for_create)
402
- end
403
-
404
- def test_timestamp_attributes_for_update
405
- toy = Toy.first
406
- assert_equal [:updated_at, :updated_on], toy.send(:timestamp_attributes_for_update)
407
- end
408
-
409
- def test_all_timestamp_attributes
410
- toy = Toy.first
411
- assert_equal [:created_at, :created_on, :updated_at, :updated_on], toy.send(:all_timestamp_attributes)
412
- end
413
-
414
- def test_timestamp_attributes_for_create_in_model
415
- toy = Toy.first
416
- assert_equal [:created_at], toy.send(:timestamp_attributes_for_create_in_model)
417
- end
418
-
419
- def test_timestamp_attributes_for_update_in_model
420
- toy = Toy.first
421
- assert_equal [:updated_at], toy.send(:timestamp_attributes_for_update_in_model)
422
- end
423
-
424
- def test_all_timestamp_attributes_in_model
425
- toy = Toy.first
426
- assert_equal [:created_at, :updated_at], toy.send(:all_timestamp_attributes_in_model)
427
- end
428
-
429
- def test_index_is_created_for_both_timestamps
430
- ActiveRecord::Base.connection.create_table(:foos, force: true) do |t|
431
- t.timestamps(:foos, null: true, index: true)
432
- end
433
-
434
- indexes = ActiveRecord::Base.connection.indexes('foos')
435
- assert_equal ['created_at', 'updated_at'], indexes.flat_map(&:columns).sort
436
- #ensure
437
- # ActiveRecord::Base.connection.drop_table(:foos)
438
- end
439
- end
440
-
441
-
442
- class TimestampsWithoutTransactionTest < ActiveRecord::TestCase
443
- include DdlHelper
444
- self.use_transactional_fixtures = false
445
-
446
- class TimestampAttributePost < ActiveRecord::Base
447
- attr_accessor :created_at, :updated_at
448
- end
449
-
450
- def test_do_not_write_timestamps_on_save_if_they_are_not_attributes
451
- if current_adapter?(:IBM_DBAdapter)
452
- ActiveRecord::Base.connection.create_table :timestamp_attribute_posts, force: true, id: false do |t|
453
- t.primary_key :id
454
- end
455
- post = TimestampAttributePost.new(id: 1)
456
- post.save! # should not try to assign and persist created_at, updated_at
457
- assert_nil post.created_at
458
- assert_nil post.updated_at
459
- else
460
- with_example_table ActiveRecord::Base.connection, "timestamp_attribute_posts", "id integer primary key" do
461
- post = TimestampAttributePost.new(id: 1)
462
- post.save! # should not try to assign and persist created_at, updated_at
463
- assert_nil post.created_at
464
- assert_nil post.updated_at
465
- end
466
- end
467
- end
468
- end
1
+ require 'cases/helper'
2
+ require 'support/ddl_helper'
3
+ require 'models/developer'
4
+ require 'models/computer'
5
+ require 'models/owner'
6
+ require 'models/pet'
7
+ require 'models/toy'
8
+ require 'models/car'
9
+ require 'models/task'
10
+
11
+ class TimestampTest < ActiveRecord::TestCase
12
+ fixtures :developers, :owners, :pets, :toys, :cars, :tasks
13
+
14
+ def setup
15
+ @developer = Developer.first
16
+ @owner = Owner.first
17
+ @developer.update_columns(updated_at: Time.now.prev_month)
18
+ @previously_updated_at = @developer.updated_at
19
+ end
20
+
21
+ def test_saving_a_changed_record_updates_its_timestamp
22
+ @developer.name = "Jack Bauer"
23
+ @developer.save!
24
+
25
+ assert_not_equal @previously_updated_at, @developer.updated_at
26
+ end
27
+
28
+ def test_saving_a_unchanged_record_doesnt_update_its_timestamp
29
+ @developer.save!
30
+
31
+ assert_equal @previously_updated_at, @developer.updated_at
32
+ end
33
+
34
+ def test_touching_a_record_updates_its_timestamp
35
+ previous_salary = @developer.salary
36
+ @developer.salary = previous_salary + 10000
37
+ @developer.touch
38
+
39
+ assert_not_equal @previously_updated_at, @developer.updated_at
40
+ assert_equal previous_salary + 10000, @developer.salary
41
+ assert @developer.salary_changed?, 'developer salary should have changed'
42
+ assert @developer.changed?, 'developer should be marked as changed'
43
+ @developer.reload
44
+ assert_equal previous_salary, @developer.salary
45
+ end
46
+
47
+ def test_touching_a_record_with_default_scope_that_excludes_it_updates_its_timestamp
48
+ developer = @developer.becomes(DeveloperCalledJamis)
49
+
50
+ developer.touch
51
+ assert_not_equal @previously_updated_at, developer.updated_at
52
+ developer.reload
53
+ assert_not_equal @previously_updated_at, developer.updated_at
54
+ end
55
+
56
+ def test_saving_when_record_timestamps_is_false_doesnt_update_its_timestamp
57
+ Developer.record_timestamps = false
58
+ @developer.name = "John Smith"
59
+ @developer.save!
60
+
61
+ assert_equal @previously_updated_at, @developer.updated_at
62
+ ensure
63
+ Developer.record_timestamps = true
64
+ end
65
+
66
+ def test_saving_when_instance_record_timestamps_is_false_doesnt_update_its_timestamp
67
+ @developer.record_timestamps = false
68
+ assert Developer.record_timestamps
69
+
70
+ @developer.name = "John Smith"
71
+ @developer.save!
72
+
73
+ assert_equal @previously_updated_at, @developer.updated_at
74
+ end
75
+
76
+ def test_touching_an_attribute_updates_timestamp
77
+ previously_created_at = @developer.created_at
78
+ @developer.touch(:created_at)
79
+
80
+ assert !@developer.created_at_changed? , 'created_at should not be changed'
81
+ assert !@developer.changed?, 'record should not be changed'
82
+ assert_not_equal previously_created_at, @developer.created_at
83
+ assert_not_equal @previously_updated_at, @developer.updated_at
84
+ end
85
+
86
+ def test_touching_an_attribute_updates_it
87
+ task = Task.first
88
+ previous_value = task.ending
89
+ task.touch(:ending)
90
+ assert_not_equal previous_value, task.ending
91
+ assert_in_delta Time.now, task.ending, 1
92
+ end
93
+
94
+ def test_touching_many_attributes_updates_them
95
+ task = Task.first
96
+ previous_starting = task.starting
97
+ previous_ending = task.ending
98
+ task.touch(:starting, :ending)
99
+
100
+ assert_not_equal previous_starting, task.starting
101
+ assert_not_equal previous_ending, task.ending
102
+ assert_in_delta Time.now, task.starting, 1
103
+ assert_in_delta Time.now, task.ending, 1
104
+ end
105
+
106
+ def test_touching_a_record_without_timestamps_is_unexceptional
107
+ assert_nothing_raised { Car.first.touch }
108
+ end
109
+
110
+ def test_touching_a_no_touching_object
111
+ Developer.no_touching do
112
+ assert @developer.no_touching?
113
+ assert !@owner.no_touching?
114
+ @developer.touch
115
+ end
116
+
117
+ assert !@developer.no_touching?
118
+ assert !@owner.no_touching?
119
+ assert_equal @previously_updated_at, @developer.updated_at
120
+ end
121
+
122
+ def test_touching_related_objects
123
+ @owner = Owner.first
124
+ @previously_updated_at = @owner.updated_at
125
+
126
+ Owner.no_touching do
127
+ @owner.pets.first.touch
128
+ end
129
+
130
+ assert_equal @previously_updated_at, @owner.updated_at
131
+ end
132
+
133
+ def test_global_no_touching
134
+ ActiveRecord::Base.no_touching do
135
+ assert @developer.no_touching?
136
+ assert @owner.no_touching?
137
+ @developer.touch
138
+ end
139
+
140
+ assert !@developer.no_touching?
141
+ assert !@owner.no_touching?
142
+ assert_equal @previously_updated_at, @developer.updated_at
143
+ end
144
+
145
+ def test_no_touching_threadsafe
146
+ Thread.new do
147
+ Developer.no_touching do
148
+ assert @developer.no_touching?
149
+
150
+ sleep(1)
151
+ end
152
+ end
153
+
154
+ assert !@developer.no_touching?
155
+ end
156
+
157
+ def test_no_touching_with_callbacks
158
+ klass = Class.new(ActiveRecord::Base) do
159
+ self.table_name = "developers"
160
+
161
+ attr_accessor :after_touch_called
162
+
163
+ after_touch do |user|
164
+ user.after_touch_called = true
165
+ end
166
+ end
167
+
168
+ developer = klass.first
169
+
170
+ klass.no_touching do
171
+ developer.touch
172
+ assert_not developer.after_touch_called
173
+ end
174
+ end
175
+
176
+ def test_saving_a_record_with_a_belongs_to_that_specifies_touching_the_parent_should_update_the_parent_updated_at
177
+ pet = Pet.first
178
+ owner = pet.owner
179
+ previously_owner_updated_at = owner.updated_at
180
+
181
+ pet.name = "Fluffy the Third"
182
+ pet.save
183
+
184
+ assert_not_equal previously_owner_updated_at, pet.owner.updated_at
185
+ end
186
+
187
+ def test_destroying_a_record_with_a_belongs_to_that_specifies_touching_the_parent_should_update_the_parent_updated_at
188
+ pet = Pet.first
189
+ owner = pet.owner
190
+ previously_owner_updated_at = owner.updated_at
191
+
192
+ pet.destroy
193
+
194
+ assert_not_equal previously_owner_updated_at, pet.owner.updated_at
195
+ end
196
+
197
+ def test_saving_a_new_record_belonging_to_invalid_parent_with_touch_should_not_raise_exception
198
+ klass = Class.new(Owner) do
199
+ def self.name; 'Owner'; end
200
+ validate { errors.add(:base, :invalid) }
201
+ end
202
+
203
+ pet = Pet.new(owner: klass.new)
204
+ pet.save!
205
+
206
+ assert pet.owner.new_record?
207
+ end
208
+
209
+ def test_saving_a_record_with_a_belongs_to_that_specifies_touching_a_specific_attribute_the_parent_should_update_that_attribute
210
+ klass = Class.new(ActiveRecord::Base) do
211
+ def self.name; 'Pet'; end
212
+ belongs_to :owner, :touch => :happy_at
213
+ end
214
+
215
+ pet = klass.first
216
+ owner = pet.owner
217
+ previously_owner_happy_at = owner.happy_at
218
+
219
+ pet.name = "Fluffy the Third"
220
+ pet.save
221
+
222
+ assert_not_equal previously_owner_happy_at, pet.owner.happy_at
223
+ end
224
+
225
+ def test_touching_a_record_with_a_belongs_to_that_uses_a_counter_cache_should_update_the_parent
226
+ klass = Class.new(ActiveRecord::Base) do
227
+ def self.name; 'Pet'; end
228
+ belongs_to :owner, :counter_cache => :use_count, :touch => true
229
+ end
230
+
231
+ pet = klass.first
232
+ owner = pet.owner
233
+ owner.update_columns(happy_at: 3.days.ago)
234
+ previously_owner_updated_at = owner.updated_at
235
+
236
+ pet.name = "I'm a parrot"
237
+ pet.save
238
+
239
+ assert_not_equal previously_owner_updated_at, pet.owner.updated_at
240
+ end
241
+
242
+ def test_touching_a_record_touches_parent_record_and_grandparent_record
243
+ klass = Class.new(ActiveRecord::Base) do
244
+ def self.name; 'Toy'; end
245
+ belongs_to :pet, :touch => true
246
+ end
247
+
248
+ toy = klass.first
249
+ pet = toy.pet
250
+ owner = pet.owner
251
+ time = 3.days.ago
252
+
253
+ owner.update_columns(updated_at: time)
254
+ toy.touch
255
+ owner.reload
256
+
257
+ assert_not_equal time, owner.updated_at
258
+ end
259
+
260
+ def test_touching_a_record_touches_polymorphic_record
261
+ klass = Class.new(ActiveRecord::Base) do
262
+ def self.name; 'Toy'; end
263
+ end
264
+
265
+ wheel_klass = Class.new(ActiveRecord::Base) do
266
+ def self.name; 'Wheel'; end
267
+ belongs_to :wheelable, :polymorphic => true, :touch => true
268
+ end
269
+
270
+ toy = klass.first
271
+ time = 3.days.ago
272
+ toy.update_columns(updated_at: time)
273
+
274
+ wheel = wheel_klass.new
275
+ wheel.wheelable = toy
276
+ wheel.save
277
+ wheel.touch
278
+
279
+ assert_not_equal time, toy.updated_at
280
+ end
281
+
282
+ def test_changing_parent_of_a_record_touches_both_new_and_old_parent_record
283
+ klass = Class.new(ActiveRecord::Base) do
284
+ def self.name; 'Toy'; end
285
+ belongs_to :pet, touch: true
286
+ end
287
+
288
+ toy1 = klass.find(1)
289
+ old_pet = toy1.pet
290
+
291
+ toy2 = klass.find(2)
292
+ new_pet = toy2.pet
293
+ time = 3.days.ago.at_beginning_of_hour
294
+
295
+ old_pet.update_columns(updated_at: time)
296
+ new_pet.update_columns(updated_at: time)
297
+
298
+ toy1.pet = new_pet
299
+ toy1.save!
300
+
301
+ old_pet.reload
302
+ new_pet.reload
303
+
304
+ assert_not_equal time, new_pet.updated_at
305
+ assert_not_equal time, old_pet.updated_at
306
+ end
307
+
308
+ def test_changing_parent_of_a_record_touches_both_new_and_old_polymorphic_parent_record_changes_within_same_class
309
+ car_class = Class.new(ActiveRecord::Base) do
310
+ def self.name; 'Car'; end
311
+ end
312
+
313
+ wheel_class = Class.new(ActiveRecord::Base) do
314
+ def self.name; 'Wheel'; end
315
+ belongs_to :wheelable, :polymorphic => true, :touch => true
316
+ end
317
+
318
+ car1 = car_class.find(1)
319
+ car2 = car_class.find(2)
320
+
321
+ wheel = wheel_class.create!(wheelable: car1)
322
+
323
+ time = 3.days.ago.at_beginning_of_hour
324
+
325
+ car1.update_columns(updated_at: time)
326
+ car2.update_columns(updated_at: time)
327
+
328
+ wheel.wheelable = car2
329
+ wheel.save!
330
+
331
+ assert_not_equal time, car1.reload.updated_at
332
+ assert_not_equal time, car2.reload.updated_at
333
+ end
334
+
335
+ def test_changing_parent_of_a_record_touches_both_new_and_old_polymorphic_parent_record_changes_with_other_class
336
+ car_class = Class.new(ActiveRecord::Base) do
337
+ def self.name; 'Car'; end
338
+ end
339
+
340
+ toy_class = Class.new(ActiveRecord::Base) do
341
+ def self.name; 'Toy'; end
342
+ end
343
+
344
+ wheel_class = Class.new(ActiveRecord::Base) do
345
+ def self.name; 'Wheel'; end
346
+ belongs_to :wheelable, :polymorphic => true, :touch => true
347
+ end
348
+
349
+ car = car_class.find(1)
350
+ toy = toy_class.find(3)
351
+
352
+ wheel = wheel_class.create!(wheelable: car)
353
+
354
+ time = 3.days.ago.at_beginning_of_hour
355
+
356
+ car.update_columns(updated_at: time)
357
+ toy.update_columns(updated_at: time)
358
+
359
+ wheel.wheelable = toy
360
+ wheel.save!
361
+
362
+ assert_not_equal time, car.reload.updated_at
363
+ assert_not_equal time, toy.reload.updated_at
364
+ end
365
+
366
+ def test_clearing_association_touches_the_old_record
367
+ klass = Class.new(ActiveRecord::Base) do
368
+ def self.name; 'Toy'; end
369
+ belongs_to :pet, touch: true
370
+ end
371
+
372
+ toy = klass.find(1)
373
+ pet = toy.pet
374
+ time = 3.days.ago.at_beginning_of_hour
375
+
376
+ pet.update_columns(updated_at: time)
377
+
378
+ toy.pet = nil
379
+ toy.save!
380
+
381
+ pet.reload
382
+
383
+ assert_not_equal time, pet.updated_at
384
+ end
385
+
386
+ def test_timestamp_column_values_are_present_in_the_callbacks
387
+ klass = Class.new(ActiveRecord::Base) do
388
+ self.table_name = 'people'
389
+
390
+ before_create do
391
+ self.born_at = self.created_at
392
+ end
393
+ end
394
+
395
+ person = klass.create first_name: 'David'
396
+ assert_not_equal person.born_at, nil
397
+ end
398
+
399
+ def test_timestamp_attributes_for_create
400
+ toy = Toy.first
401
+ assert_equal [:created_at, :created_on], toy.send(:timestamp_attributes_for_create)
402
+ end
403
+
404
+ def test_timestamp_attributes_for_update
405
+ toy = Toy.first
406
+ assert_equal [:updated_at, :updated_on], toy.send(:timestamp_attributes_for_update)
407
+ end
408
+
409
+ def test_all_timestamp_attributes
410
+ toy = Toy.first
411
+ assert_equal [:created_at, :created_on, :updated_at, :updated_on], toy.send(:all_timestamp_attributes)
412
+ end
413
+
414
+ def test_timestamp_attributes_for_create_in_model
415
+ toy = Toy.first
416
+ assert_equal [:created_at], toy.send(:timestamp_attributes_for_create_in_model)
417
+ end
418
+
419
+ def test_timestamp_attributes_for_update_in_model
420
+ toy = Toy.first
421
+ assert_equal [:updated_at], toy.send(:timestamp_attributes_for_update_in_model)
422
+ end
423
+
424
+ def test_all_timestamp_attributes_in_model
425
+ toy = Toy.first
426
+ assert_equal [:created_at, :updated_at], toy.send(:all_timestamp_attributes_in_model)
427
+ end
428
+
429
+ def test_index_is_created_for_both_timestamps
430
+ ActiveRecord::Base.connection.create_table(:foos, force: true) do |t|
431
+ t.timestamps(:foos, null: true, index: true)
432
+ end
433
+
434
+ indexes = ActiveRecord::Base.connection.indexes('foos')
435
+ assert_equal ['created_at', 'updated_at'], indexes.flat_map(&:columns).sort
436
+ ensure
437
+ ActiveRecord::Base.connection.drop_table(:foos)
438
+ end
439
+ end
440
+
441
+ class TimestampsWithoutTransactionTest < ActiveRecord::TestCase
442
+ include DdlHelper
443
+ self.use_transactional_fixtures = false
444
+
445
+ class TimestampAttributePost < ActiveRecord::Base
446
+ attr_accessor :created_at, :updated_at
447
+ end
448
+
449
+ def test_do_not_write_timestamps_on_save_if_they_are_not_attributes
450
+ if current_adapter?(:IBM_DBAdapter)
451
+ ActiveRecord::Base.connection.create_table :timestamp_attribute_posts, force: true, id: false do |t|
452
+ t.primary_key :id
453
+ end
454
+ post = TimestampAttributePost.new(id: 1)
455
+ post.save! # should not try to assign and persist created_at, updated_at
456
+ assert_nil post.created_at
457
+ assert_nil post.updated_at
458
+ else
459
+ with_example_table ActiveRecord::Base.connection, "timestamp_attribute_posts", "id integer primary key" do
460
+ post = TimestampAttributePost.new(id: 1)
461
+ post.save! # should not try to assign and persist created_at, updated_at
462
+ assert_nil post.created_at
463
+ assert_nil post.updated_at
464
+ end
465
+ end
466
+ end
467
+ end