ibm_db 3.0.4 → 3.0.5

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 (459) 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/test/active_record/connection_adapters/fake_adapter.rb +46 -46
  19. data/test/assets/example.log +1 -1
  20. data/test/assets/test.txt +1 -1
  21. data/test/cases/adapter_test.rb +276 -261
  22. data/test/cases/aggregations_test.rb +158 -158
  23. data/test/cases/ar_schema_test.rb +161 -161
  24. data/test/cases/associations/association_scope_test.rb +21 -21
  25. data/test/cases/associations/belongs_to_associations_test.rb +1029 -1029
  26. data/test/cases/associations/callbacks_test.rb +192 -192
  27. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  28. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +26 -26
  29. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  30. data/test/cases/associations/eager_load_nested_include_test.rb +128 -128
  31. data/test/cases/associations/eager_singularization_test.rb +148 -148
  32. data/test/cases/associations/eager_test.rb +1429 -1411
  33. data/test/cases/associations/extension_test.rb +82 -82
  34. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +972 -932
  35. data/test/cases/associations/has_many_associations_test.rb +2182 -2162
  36. data/test/cases/associations/has_many_through_associations_test.rb +1204 -1204
  37. data/test/cases/associations/has_one_associations_test.rb +610 -610
  38. data/test/cases/associations/has_one_through_associations_test.rb +380 -380
  39. data/test/cases/associations/inner_join_association_test.rb +139 -139
  40. data/test/cases/associations/inverse_associations_test.rb +706 -693
  41. data/test/cases/associations/join_model_test.rb +754 -754
  42. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  43. data/test/cases/associations/required_test.rb +82 -82
  44. data/test/cases/associations_test.rb +380 -380
  45. data/test/cases/attribute_decorators_test.rb +125 -125
  46. data/test/cases/attribute_methods/read_test.rb +60 -60
  47. data/test/cases/attribute_methods/serialization_test.rb +29 -29
  48. data/test/cases/attribute_methods_test.rb +952 -952
  49. data/test/cases/attribute_set_test.rb +210 -200
  50. data/test/cases/attribute_test.rb +180 -180
  51. data/test/cases/attributes_test.rb +136 -136
  52. data/test/cases/autosave_association_test.rb +1595 -1595
  53. data/test/cases/base_test.rb +1664 -1638
  54. data/test/cases/batches_test.rb +212 -212
  55. data/test/cases/binary_test.rb +52 -52
  56. data/test/cases/bind_parameter_test.rb +100 -100
  57. data/test/cases/calculations_test.rb +646 -646
  58. data/test/cases/callbacks_test.rb +543 -543
  59. data/test/cases/clone_test.rb +40 -40
  60. data/test/cases/coders/yaml_column_test.rb +63 -63
  61. data/test/cases/column_alias_test.rb +17 -17
  62. data/test/cases/column_definition_test.rb +123 -123
  63. data/test/cases/connection_adapters/adapter_leasing_test.rb +54 -54
  64. data/test/cases/connection_adapters/connection_handler_test.rb +53 -53
  65. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  66. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +293 -293
  67. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +65 -65
  68. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  69. data/test/cases/connection_adapters/schema_cache_test.rb +56 -56
  70. data/test/cases/connection_adapters/type_lookup_test.rb +110 -110
  71. data/test/cases/connection_management_test.rb +122 -122
  72. data/test/cases/connection_pool_test.rb +346 -346
  73. data/test/cases/connection_specification/resolver_test.rb +116 -116
  74. data/test/cases/core_test.rb +112 -112
  75. data/test/cases/counter_cache_test.rb +209 -209
  76. data/test/cases/custom_locking_test.rb +17 -17
  77. data/test/cases/database_statements_test.rb +19 -19
  78. data/test/cases/date_time_test.rb +61 -61
  79. data/test/cases/defaults_test.rb +223 -223
  80. data/test/cases/dirty_test.rb +785 -775
  81. data/test/cases/disconnected_test.rb +28 -28
  82. data/test/cases/dup_test.rb +157 -157
  83. data/test/cases/enum_test.rb +290 -290
  84. data/test/cases/explain_subscriber_test.rb +64 -64
  85. data/test/cases/explain_test.rb +76 -76
  86. data/test/cases/finder_respond_to_test.rb +60 -60
  87. data/test/cases/finder_test.rb +1169 -1166
  88. data/test/cases/fixture_set/file_test.rb +138 -138
  89. data/test/cases/fixtures_test.rb +908 -897
  90. data/test/cases/forbidden_attributes_protection_test.rb +99 -99
  91. data/test/cases/habtm_destroy_order_test.rb +61 -61
  92. data/test/cases/helper.rb +210 -210
  93. data/test/cases/hot_compatibility_test.rb +54 -54
  94. data/test/cases/i18n_test.rb +45 -45
  95. data/test/cases/inheritance_test.rb +375 -375
  96. data/test/cases/integration_test.rb +139 -139
  97. data/test/cases/invalid_connection_test.rb +22 -22
  98. data/test/cases/invalid_date_test.rb +32 -32
  99. data/test/cases/invertible_migration_test.rb +295 -295
  100. data/test/cases/json_serialization_test.rb +302 -302
  101. data/test/cases/locking_test.rb +477 -477
  102. data/test/cases/log_subscriber_test.rb +136 -136
  103. data/test/cases/migration/change_schema_test - Copy.rb +448 -448
  104. data/test/cases/migration/change_schema_test.rb +512 -472
  105. data/test/cases/migration/change_table_test.rb +224 -224
  106. data/test/cases/migration/column_attributes_test.rb +192 -192
  107. data/test/cases/migration/column_positioning_test.rb +56 -56
  108. data/test/cases/migration/columns_test.rb +304 -304
  109. data/test/cases/migration/command_recorder_test.rb +305 -305
  110. data/test/cases/migration/create_join_table_test.rb +148 -148
  111. data/test/cases/migration/foreign_key_test - Changed.rb +325 -325
  112. data/test/cases/migration/foreign_key_test.rb +328 -360
  113. data/test/cases/migration/helper.rb +39 -39
  114. data/test/cases/migration/index_test.rb +216 -216
  115. data/test/cases/migration/logger_test.rb +36 -36
  116. data/test/cases/migration/pending_migrations_test.rb +53 -53
  117. data/test/cases/migration/references_foreign_key_test.rb +169 -214
  118. data/test/cases/migration/references_index_test.rb +101 -101
  119. data/test/cases/migration/references_statements_test.rb +116 -116
  120. data/test/cases/migration/rename_table_test.rb +93 -93
  121. data/test/cases/migration/table_and_index_test.rb +24 -24
  122. data/test/cases/migration_test.rb +959 -959
  123. data/test/cases/migrator_test.rb +388 -388
  124. data/test/cases/mixin_test.rb +70 -70
  125. data/test/cases/modules_test.rb +173 -173
  126. data/test/cases/multiparameter_attributes_test.rb +350 -350
  127. data/test/cases/multiple_db_test.rb +115 -115
  128. data/test/cases/nested_attributes_test.rb +1070 -1057
  129. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  130. data/test/cases/persistence_test.rb +909 -909
  131. data/test/cases/pooled_connections_test.rb +81 -81
  132. data/test/cases/primary_keys_test.rb +237 -237
  133. data/test/cases/query_cache_test.rb +326 -326
  134. data/test/cases/quoting_test.rb +156 -156
  135. data/test/cases/readonly_test.rb +118 -118
  136. data/test/cases/reaper_test.rb +85 -85
  137. data/test/cases/reflection_test.rb +463 -454
  138. data/test/cases/relation/delegation_test.rb +68 -68
  139. data/test/cases/relation/merging_test.rb +161 -161
  140. data/test/cases/relation/mutation_test.rb +165 -165
  141. data/test/cases/relation/predicate_builder_test.rb +14 -14
  142. data/test/cases/relation/where_chain_test.rb +181 -181
  143. data/test/cases/relation/where_test.rb +300 -300
  144. data/test/cases/relation/where_test2.rb +36 -36
  145. data/test/cases/relation_test.rb +319 -297
  146. data/test/cases/relations_test.rb +1815 -1815
  147. data/test/cases/reload_models_test.rb +22 -22
  148. data/test/cases/result_test.rb +80 -80
  149. data/test/cases/sanitize_test.rb +83 -83
  150. data/test/cases/schema_dumper_test.rb +463 -463
  151. data/test/cases/scoping/default_scoping_test.rb +454 -454
  152. data/test/cases/scoping/named_scoping_test.rb +524 -524
  153. data/test/cases/scoping/relation_scoping_test.rb +357 -357
  154. data/test/cases/serialization_test.rb +104 -104
  155. data/test/cases/serialized_attribute_test.rb +277 -277
  156. data/test/cases/statement_cache_test.rb +98 -98
  157. data/test/cases/store_test.rb +194 -194
  158. data/test/cases/tasks/database_tasks_test.rb +398 -396
  159. data/test/cases/tasks/mysql_rake_test.rb +324 -311
  160. data/test/cases/tasks/postgresql_rake_test.rb +250 -245
  161. data/test/cases/tasks/sqlite_rake_test.rb +193 -193
  162. data/test/cases/test_case.rb +123 -123
  163. data/test/cases/timestamp_test.rb +467 -468
  164. data/test/cases/transaction_callbacks_test.rb +452 -452
  165. data/test/cases/transaction_isolation_test.rb +106 -106
  166. data/test/cases/transactions_test.rb +817 -817
  167. data/test/cases/type/decimal_test.rb +56 -51
  168. data/test/cases/type/integer_test.rb +121 -121
  169. data/test/cases/type/string_test.rb +36 -36
  170. data/test/cases/type/type_map_test.rb +177 -177
  171. data/test/cases/type/unsigned_integer_test.rb +18 -18
  172. data/test/cases/types_test.rb +141 -141
  173. data/test/cases/unconnected_test.rb +33 -33
  174. data/test/cases/validations/association_validation_test.rb +86 -86
  175. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  176. data/test/cases/validations/i18n_validation_test.rb +90 -90
  177. data/test/cases/validations/length_validation_test.rb +47 -47
  178. data/test/cases/validations/presence_validation_test.rb +68 -68
  179. data/test/cases/validations/uniqueness_validation_test.rb +457 -434
  180. data/test/cases/validations_repair_helper.rb +23 -23
  181. data/test/cases/validations_test.rb +165 -165
  182. data/test/cases/view_test.rb +119 -113
  183. data/test/cases/xml_serialization_test.rb +457 -457
  184. data/test/cases/yaml_serialization_test.rb +126 -86
  185. data/test/config.rb +5 -5
  186. data/test/config.yml +154 -154
  187. data/test/connections/native_ibm_db/connection.rb +43 -43
  188. data/test/fixtures/accounts.yml +29 -29
  189. data/test/fixtures/admin/accounts.yml +2 -2
  190. data/test/fixtures/admin/randomly_named_a9.yml +7 -7
  191. data/test/fixtures/admin/randomly_named_b0.yml +7 -7
  192. data/test/fixtures/admin/users.yml +10 -10
  193. data/test/fixtures/author_addresses.yml +17 -17
  194. data/test/fixtures/author_favorites.yml +3 -3
  195. data/test/fixtures/authors.yml +23 -23
  196. data/test/fixtures/binaries.yml +133 -133
  197. data/test/fixtures/books.yml +11 -11
  198. data/test/fixtures/bulbs.yml +5 -5
  199. data/test/fixtures/cars.yml +9 -9
  200. data/test/fixtures/categories.yml +19 -19
  201. data/test/fixtures/categories/special_categories.yml +9 -9
  202. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  203. data/test/fixtures/categories_ordered.yml +7 -7
  204. data/test/fixtures/categories_posts.yml +31 -31
  205. data/test/fixtures/categorizations.yml +23 -23
  206. data/test/fixtures/clubs.yml +8 -8
  207. data/test/fixtures/collections.yml +3 -3
  208. data/test/fixtures/colleges.yml +3 -3
  209. data/test/fixtures/comments.yml +65 -65
  210. data/test/fixtures/companies.yml +67 -67
  211. data/test/fixtures/computers.yml +10 -10
  212. data/test/fixtures/courses.yml +8 -8
  213. data/test/fixtures/customers.yml +25 -25
  214. data/test/fixtures/dashboards.yml +6 -6
  215. data/test/fixtures/developers.yml +21 -21
  216. data/test/fixtures/developers_projects.yml +16 -16
  217. data/test/fixtures/dog_lovers.yml +7 -7
  218. data/test/fixtures/dogs.yml +4 -4
  219. data/test/fixtures/doubloons.yml +3 -3
  220. data/test/fixtures/edges.yml +5 -5
  221. data/test/fixtures/entrants.yml +14 -14
  222. data/test/fixtures/essays.yml +6 -6
  223. data/test/fixtures/faces.yml +11 -11
  224. data/test/fixtures/fk_test_has_fk.yml +3 -3
  225. data/test/fixtures/fk_test_has_pk.yml +1 -1
  226. data/test/fixtures/friendships.yml +4 -4
  227. data/test/fixtures/funny_jokes.yml +10 -10
  228. data/test/fixtures/interests.yml +33 -33
  229. data/test/fixtures/items.yml +3 -3
  230. data/test/fixtures/jobs.yml +7 -7
  231. data/test/fixtures/legacy_things.yml +3 -3
  232. data/test/fixtures/mateys.yml +4 -4
  233. data/test/fixtures/member_details.yml +8 -8
  234. data/test/fixtures/member_types.yml +6 -6
  235. data/test/fixtures/members.yml +11 -11
  236. data/test/fixtures/memberships.yml +34 -34
  237. data/test/fixtures/men.yml +5 -5
  238. data/test/fixtures/minimalistics.yml +2 -2
  239. data/test/fixtures/minivans.yml +5 -5
  240. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  241. data/test/fixtures/mixins.yml +29 -29
  242. data/test/fixtures/movies.yml +7 -7
  243. data/test/fixtures/naked/csv/accounts.csv +1 -1
  244. data/test/fixtures/naked/yml/accounts.yml +1 -1
  245. data/test/fixtures/naked/yml/companies.yml +1 -1
  246. data/test/fixtures/naked/yml/courses.yml +1 -1
  247. data/test/fixtures/organizations.yml +5 -5
  248. data/test/fixtures/other_topics.yml +42 -42
  249. data/test/fixtures/owners.yml +9 -9
  250. data/test/fixtures/parrots.yml +27 -27
  251. data/test/fixtures/parrots_pirates.yml +7 -7
  252. data/test/fixtures/people.yml +24 -24
  253. data/test/fixtures/peoples_treasures.yml +3 -3
  254. data/test/fixtures/pets.yml +19 -19
  255. data/test/fixtures/pirates.yml +12 -12
  256. data/test/fixtures/posts.yml +80 -80
  257. data/test/fixtures/price_estimates.yml +7 -7
  258. data/test/fixtures/products.yml +4 -4
  259. data/test/fixtures/projects.yml +7 -7
  260. data/test/fixtures/randomly_named_a9.yml +7 -7
  261. data/test/fixtures/ratings.yml +14 -14
  262. data/test/fixtures/readers.yml +11 -11
  263. data/test/fixtures/references.yml +17 -17
  264. data/test/fixtures/reserved_words/distinct.yml +5 -5
  265. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  266. data/test/fixtures/reserved_words/group.yml +14 -14
  267. data/test/fixtures/reserved_words/select.yml +8 -8
  268. data/test/fixtures/reserved_words/values.yml +7 -7
  269. data/test/fixtures/ships.yml +6 -6
  270. data/test/fixtures/speedometers.yml +8 -8
  271. data/test/fixtures/sponsors.yml +12 -12
  272. data/test/fixtures/string_key_objects.yml +7 -7
  273. data/test/fixtures/subscribers.yml +10 -10
  274. data/test/fixtures/subscriptions.yml +12 -12
  275. data/test/fixtures/taggings.yml +78 -78
  276. data/test/fixtures/tags.yml +11 -11
  277. data/test/fixtures/tasks.yml +7 -7
  278. data/test/fixtures/teapots.yml +3 -3
  279. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  280. data/test/fixtures/to_be_linked/users.yml +10 -10
  281. data/test/fixtures/topics.yml +49 -49
  282. data/test/fixtures/toys.yml +14 -14
  283. data/test/fixtures/traffic_lights.yml +9 -9
  284. data/test/fixtures/treasures.yml +10 -10
  285. data/test/fixtures/uuid_children.yml +3 -3
  286. data/test/fixtures/uuid_parents.yml +2 -2
  287. data/test/fixtures/variants.yml +4 -4
  288. data/test/fixtures/vegetables.yml +19 -19
  289. data/test/fixtures/vertices.yml +3 -3
  290. data/test/fixtures/warehouse_things.yml +2 -2
  291. data/test/fixtures/zines.yml +5 -5
  292. data/test/ibm_db_test.rb +24 -24
  293. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  294. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  295. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  296. data/test/migrations/missing/1000_people_have_middle_names.rb +8 -8
  297. data/test/migrations/missing/1_people_have_last_names.rb +8 -8
  298. data/test/migrations/missing/3_we_need_reminders.rb +11 -11
  299. data/test/migrations/missing/4_innocent_jointable.rb +11 -11
  300. data/test/migrations/rename/1_we_need_things.rb +10 -10
  301. data/test/migrations/rename/2_rename_things.rb +8 -8
  302. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  303. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  304. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  305. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  306. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  307. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  308. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  309. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  310. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  311. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  312. data/test/migrations/valid/2_we_need_reminders.rb +11 -11
  313. data/test/migrations/valid/3_innocent_jointable.rb +11 -11
  314. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  315. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +11 -11
  316. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +11 -11
  317. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  318. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  319. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  320. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  321. data/test/models/admin.rb +4 -4
  322. data/test/models/admin/account.rb +2 -2
  323. data/test/models/admin/randomly_named_c1.rb +3 -3
  324. data/test/models/admin/user.rb +40 -40
  325. data/test/models/aircraft.rb +4 -4
  326. data/test/models/arunit2_model.rb +3 -3
  327. data/test/models/author.rb +212 -212
  328. data/test/models/auto_id.rb +4 -4
  329. data/test/models/autoloadable/extra_firm.rb +2 -2
  330. data/test/models/binary.rb +1 -1
  331. data/test/models/bird.rb +12 -12
  332. data/test/models/book.rb +18 -18
  333. data/test/models/boolean.rb +2 -2
  334. data/test/models/bulb.rb +51 -51
  335. data/test/models/cake_designer.rb +3 -3
  336. data/test/models/car.rb +26 -26
  337. data/test/models/carrier.rb +2 -2
  338. data/test/models/categorization.rb +19 -19
  339. data/test/models/category.rb +35 -35
  340. data/test/models/chef.rb +7 -3
  341. data/test/models/citation.rb +3 -3
  342. data/test/models/club.rb +23 -23
  343. data/test/models/college.rb +10 -10
  344. data/test/models/column.rb +3 -3
  345. data/test/models/column_name.rb +3 -3
  346. data/test/models/comment.rb +64 -64
  347. data/test/models/company.rb +228 -225
  348. data/test/models/company_in_module.rb +98 -98
  349. data/test/models/computer.rb +3 -3
  350. data/test/models/contact.rb +41 -41
  351. data/test/models/contract.rb +20 -20
  352. data/test/models/country.rb +7 -7
  353. data/test/models/course.rb +6 -6
  354. data/test/models/customer.rb +77 -77
  355. data/test/models/customer_carrier.rb +14 -14
  356. data/test/models/dashboard.rb +3 -3
  357. data/test/models/default.rb +2 -2
  358. data/test/models/department.rb +4 -4
  359. data/test/models/developer.rb +255 -252
  360. data/test/models/dog.rb +5 -5
  361. data/test/models/dog_lover.rb +5 -5
  362. data/test/models/doubloon.rb +12 -12
  363. data/test/models/drink_designer.rb +3 -3
  364. data/test/models/edge.rb +5 -5
  365. data/test/models/electron.rb +5 -5
  366. data/test/models/engine.rb +4 -4
  367. data/test/models/entrant.rb +3 -3
  368. data/test/models/essay.rb +5 -5
  369. data/test/models/event.rb +2 -2
  370. data/test/models/eye.rb +37 -37
  371. data/test/models/face.rb +9 -9
  372. data/test/models/friendship.rb +6 -6
  373. data/test/models/guid.rb +1 -1
  374. data/test/models/hotel.rb +9 -6
  375. data/test/models/image.rb +3 -3
  376. data/test/models/interest.rb +5 -5
  377. data/test/models/invoice.rb +4 -4
  378. data/test/models/item.rb +7 -7
  379. data/test/models/job.rb +7 -7
  380. data/test/models/joke.rb +7 -7
  381. data/test/models/keyboard.rb +3 -3
  382. data/test/models/legacy_thing.rb +3 -3
  383. data/test/models/lesson.rb +11 -11
  384. data/test/models/line_item.rb +3 -3
  385. data/test/models/liquid.rb +4 -4
  386. data/test/models/man.rb +11 -11
  387. data/test/models/matey.rb +4 -4
  388. data/test/models/member.rb +41 -41
  389. data/test/models/member_detail.rb +7 -7
  390. data/test/models/member_type.rb +3 -3
  391. data/test/models/membership.rb +35 -35
  392. data/test/models/minimalistic.rb +2 -2
  393. data/test/models/minivan.rb +9 -9
  394. data/test/models/mixed_case_monkey.rb +3 -3
  395. data/test/models/molecule.rb +6 -6
  396. data/test/models/movie.rb +5 -5
  397. data/test/models/order.rb +4 -4
  398. data/test/models/organization.rb +14 -14
  399. data/test/models/owner.rb +34 -34
  400. data/test/models/parrot.rb +29 -29
  401. data/test/models/person.rb +143 -143
  402. data/test/models/personal_legacy_thing.rb +4 -4
  403. data/test/models/pet.rb +15 -15
  404. data/test/models/pirate.rb +92 -92
  405. data/test/models/possession.rb +3 -3
  406. data/test/models/post.rb +264 -264
  407. data/test/models/price_estimate.rb +4 -4
  408. data/test/models/professor.rb +5 -5
  409. data/test/models/project.rb +31 -29
  410. data/test/models/publisher.rb +2 -2
  411. data/test/models/publisher/article.rb +4 -4
  412. data/test/models/publisher/magazine.rb +3 -3
  413. data/test/models/randomly_named_c1.rb +3 -3
  414. data/test/models/rating.rb +4 -4
  415. data/test/models/reader.rb +23 -23
  416. data/test/models/record.rb +2 -2
  417. data/test/models/reference.rb +22 -22
  418. data/test/models/reply.rb +61 -61
  419. data/test/models/ship.rb +33 -33
  420. data/test/models/ship_part.rb +7 -7
  421. data/test/models/shop.rb +17 -17
  422. data/test/models/shop_account.rb +6 -6
  423. data/test/models/speedometer.rb +6 -6
  424. data/test/models/sponsor.rb +7 -7
  425. data/test/models/string_key_object.rb +3 -3
  426. data/test/models/student.rb +4 -4
  427. data/test/models/subject.rb +16 -16
  428. data/test/models/subscriber.rb +8 -8
  429. data/test/models/subscription.rb +4 -4
  430. data/test/models/tag.rb +7 -7
  431. data/test/models/tagging.rb +13 -13
  432. data/test/models/task.rb +5 -5
  433. data/test/models/topic.rb +124 -124
  434. data/test/models/toy.rb +6 -6
  435. data/test/models/traffic_light.rb +4 -4
  436. data/test/models/treasure.rb +14 -14
  437. data/test/models/treaty.rb +7 -7
  438. data/test/models/tyre.rb +11 -11
  439. data/test/models/uuid_child.rb +3 -3
  440. data/test/models/uuid_parent.rb +3 -3
  441. data/test/models/vegetables.rb +24 -24
  442. data/test/models/vehicle.rb +6 -6
  443. data/test/models/vertex.rb +9 -9
  444. data/test/models/warehouse_thing.rb +5 -5
  445. data/test/models/wheel.rb +3 -3
  446. data/test/models/without_table.rb +3 -3
  447. data/test/models/zine.rb +3 -3
  448. data/test/schema/mysql2_specific_schema.rb +58 -58
  449. data/test/schema/mysql_specific_schema.rb +70 -70
  450. data/test/schema/oracle_specific_schema.rb +43 -43
  451. data/test/schema/postgresql_specific_schema.rb +202 -202
  452. data/test/schema/schema.rb +952 -938
  453. data/test/schema/sqlite_specific_schema.rb +21 -21
  454. data/test/support/config.rb +43 -43
  455. data/test/support/connection.rb +22 -22
  456. data/test/support/connection_helper.rb +14 -14
  457. data/test/support/ddl_helper.rb +8 -8
  458. data/test/support/schema_dumping_helper.rb +20 -20
  459. metadata +3 -3
@@ -1,104 +1,104 @@
1
- require "cases/helper"
2
- require 'models/contact'
3
- require 'models/topic'
4
- require 'models/book'
5
- require 'models/author'
6
- require 'models/post'
7
-
8
- class SerializationTest < ActiveRecord::TestCase
9
- fixtures :books
10
-
11
- FORMATS = [ :xml, :json ]
12
-
13
- def setup
14
- @contact_attributes = {
15
- :name => 'aaron stack',
16
- :age => 25,
17
- :avatar => 'binarydata',
18
- :created_at => Time.utc(2006, 8, 1),
19
- :awesome => false,
20
- :preferences => { :gem => '<strong>ruby</strong>' },
21
- :alternative_id => nil,
22
- :id => nil
23
- }
24
- end
25
-
26
- def test_include_root_in_json_is_false_by_default
27
- assert_equal false, ActiveRecord::Base.include_root_in_json, "include_root_in_json should be false by default but was not"
28
- end
29
-
30
- def test_serialize_should_be_reversible
31
- FORMATS.each do |format|
32
- @serialized = Contact.new.send("to_#{format}")
33
- contact = Contact.new.send("from_#{format}", @serialized)
34
-
35
- assert_equal @contact_attributes.keys.collect(&:to_s).sort, contact.attributes.keys.collect(&:to_s).sort, "For #{format}"
36
- end
37
- end
38
-
39
- def test_serialize_should_allow_attribute_only_filtering
40
- FORMATS.each do |format|
41
- @serialized = Contact.new(@contact_attributes).send("to_#{format}", :only => [ :age, :name ])
42
- contact = Contact.new.send("from_#{format}", @serialized)
43
- assert_equal @contact_attributes[:name], contact.name, "For #{format}"
44
- assert_nil contact.avatar, "For #{format}"
45
- end
46
- end
47
-
48
- def test_serialize_should_allow_attribute_except_filtering
49
- FORMATS.each do |format|
50
- @serialized = Contact.new(@contact_attributes).send("to_#{format}", :except => [ :age, :name ])
51
- contact = Contact.new.send("from_#{format}", @serialized)
52
- assert_nil contact.name, "For #{format}"
53
- assert_nil contact.age, "For #{format}"
54
- assert_equal @contact_attributes[:awesome], contact.awesome, "For #{format}"
55
- end
56
- end
57
-
58
- def test_include_root_in_json_allows_inheritance
59
- original_root_in_json = ActiveRecord::Base.include_root_in_json
60
- ActiveRecord::Base.include_root_in_json = true
61
-
62
- klazz = Class.new(ActiveRecord::Base)
63
- klazz.table_name = 'topics'
64
- assert klazz.include_root_in_json
65
-
66
- klazz.include_root_in_json = false
67
- assert ActiveRecord::Base.include_root_in_json
68
- assert !klazz.include_root_in_json
69
- assert !klazz.new.include_root_in_json
70
- ensure
71
- ActiveRecord::Base.include_root_in_json = original_root_in_json
72
- end
73
-
74
- def test_read_attribute_for_serialization_with_format_without_method_missing
75
- klazz = Class.new(ActiveRecord::Base)
76
- klazz.table_name = 'books'
77
-
78
- book = klazz.new
79
- assert_nil book.read_attribute_for_serialization(:format)
80
- end
81
-
82
- def test_read_attribute_for_serialization_with_format_after_init
83
- klazz = Class.new(ActiveRecord::Base)
84
- klazz.table_name = 'books'
85
-
86
- book = klazz.new(format: 'paperback')
87
- assert_equal 'paperback', book.read_attribute_for_serialization(:format)
88
- end
89
-
90
- def test_read_attribute_for_serialization_with_format_after_find
91
- klazz = Class.new(ActiveRecord::Base)
92
- klazz.table_name = 'books'
93
-
94
- book = klazz.find(books(:awdr).id)
95
- assert_equal 'paperback', book.read_attribute_for_serialization(:format)
96
- end
97
-
98
- def test_find_records_by_serialized_attributes_through_join
99
- author = Author.create!(name: "David")
100
- author.serialized_posts.create!(title: "Hello")
101
-
102
- assert_equal 1, Author.joins(:serialized_posts).where(name: "David", serialized_posts: { title: "Hello" }).length
103
- end
104
- end
1
+ require "cases/helper"
2
+ require 'models/contact'
3
+ require 'models/topic'
4
+ require 'models/book'
5
+ require 'models/author'
6
+ require 'models/post'
7
+
8
+ class SerializationTest < ActiveRecord::TestCase
9
+ fixtures :books
10
+
11
+ FORMATS = [ :xml, :json ]
12
+
13
+ def setup
14
+ @contact_attributes = {
15
+ :name => 'aaron stack',
16
+ :age => 25,
17
+ :avatar => 'binarydata',
18
+ :created_at => Time.utc(2006, 8, 1),
19
+ :awesome => false,
20
+ :preferences => { :gem => '<strong>ruby</strong>' },
21
+ :alternative_id => nil,
22
+ :id => nil
23
+ }
24
+ end
25
+
26
+ def test_include_root_in_json_is_false_by_default
27
+ assert_equal false, ActiveRecord::Base.include_root_in_json, "include_root_in_json should be false by default but was not"
28
+ end
29
+
30
+ def test_serialize_should_be_reversible
31
+ FORMATS.each do |format|
32
+ @serialized = Contact.new.send("to_#{format}")
33
+ contact = Contact.new.send("from_#{format}", @serialized)
34
+
35
+ assert_equal @contact_attributes.keys.collect(&:to_s).sort, contact.attributes.keys.collect(&:to_s).sort, "For #{format}"
36
+ end
37
+ end
38
+
39
+ def test_serialize_should_allow_attribute_only_filtering
40
+ FORMATS.each do |format|
41
+ @serialized = Contact.new(@contact_attributes).send("to_#{format}", :only => [ :age, :name ])
42
+ contact = Contact.new.send("from_#{format}", @serialized)
43
+ assert_equal @contact_attributes[:name], contact.name, "For #{format}"
44
+ assert_nil contact.avatar, "For #{format}"
45
+ end
46
+ end
47
+
48
+ def test_serialize_should_allow_attribute_except_filtering
49
+ FORMATS.each do |format|
50
+ @serialized = Contact.new(@contact_attributes).send("to_#{format}", :except => [ :age, :name ])
51
+ contact = Contact.new.send("from_#{format}", @serialized)
52
+ assert_nil contact.name, "For #{format}"
53
+ assert_nil contact.age, "For #{format}"
54
+ assert_equal @contact_attributes[:awesome], contact.awesome, "For #{format}"
55
+ end
56
+ end
57
+
58
+ def test_include_root_in_json_allows_inheritance
59
+ original_root_in_json = ActiveRecord::Base.include_root_in_json
60
+ ActiveRecord::Base.include_root_in_json = true
61
+
62
+ klazz = Class.new(ActiveRecord::Base)
63
+ klazz.table_name = 'topics'
64
+ assert klazz.include_root_in_json
65
+
66
+ klazz.include_root_in_json = false
67
+ assert ActiveRecord::Base.include_root_in_json
68
+ assert !klazz.include_root_in_json
69
+ assert !klazz.new.include_root_in_json
70
+ ensure
71
+ ActiveRecord::Base.include_root_in_json = original_root_in_json
72
+ end
73
+
74
+ def test_read_attribute_for_serialization_with_format_without_method_missing
75
+ klazz = Class.new(ActiveRecord::Base)
76
+ klazz.table_name = 'books'
77
+
78
+ book = klazz.new
79
+ assert_nil book.read_attribute_for_serialization(:format)
80
+ end
81
+
82
+ def test_read_attribute_for_serialization_with_format_after_init
83
+ klazz = Class.new(ActiveRecord::Base)
84
+ klazz.table_name = 'books'
85
+
86
+ book = klazz.new(format: 'paperback')
87
+ assert_equal 'paperback', book.read_attribute_for_serialization(:format)
88
+ end
89
+
90
+ def test_read_attribute_for_serialization_with_format_after_find
91
+ klazz = Class.new(ActiveRecord::Base)
92
+ klazz.table_name = 'books'
93
+
94
+ book = klazz.find(books(:awdr).id)
95
+ assert_equal 'paperback', book.read_attribute_for_serialization(:format)
96
+ end
97
+
98
+ def test_find_records_by_serialized_attributes_through_join
99
+ author = Author.create!(name: "David")
100
+ author.serialized_posts.create!(title: "Hello")
101
+
102
+ assert_equal 1, Author.joins(:serialized_posts).where(name: "David", serialized_posts: { title: "Hello" }).length
103
+ end
104
+ end
@@ -1,277 +1,277 @@
1
- require 'cases/helper'
2
- require 'models/topic'
3
- require 'models/reply'
4
- require 'models/person'
5
- require 'models/traffic_light'
6
- require 'models/post'
7
- require 'bcrypt'
8
-
9
- class SerializedAttributeTest < ActiveRecord::TestCase
10
- fixtures :topics, :posts
11
-
12
- MyObject = Struct.new :attribute1, :attribute2
13
-
14
- teardown do
15
- Topic.serialize("content")
16
- end
17
-
18
- def test_serialize_does_not_eagerly_load_columns
19
- Topic.reset_column_information
20
- assert_no_queries do
21
- Topic.serialize(:content)
22
- end
23
- end
24
-
25
- def test_list_of_serialized_attributes
26
- assert_deprecated do
27
- assert_equal %w(content), Topic.serialized_attributes.keys
28
- end
29
- end
30
-
31
- def test_serialized_attribute
32
- Topic.serialize("content", MyObject)
33
-
34
- myobj = MyObject.new('value1', 'value2')
35
- topic = Topic.create("content" => myobj)
36
- assert_equal(myobj, topic.content)
37
-
38
- topic.reload
39
- assert_equal(myobj, topic.content)
40
- end
41
-
42
- def test_serialized_attribute_in_base_class
43
- Topic.serialize("content", Hash)
44
-
45
- hash = { 'content1' => 'value1', 'content2' => 'value2' }
46
- important_topic = ImportantTopic.create("content" => hash)
47
- assert_equal(hash, important_topic.content)
48
-
49
- important_topic.reload
50
- assert_equal(hash, important_topic.content)
51
- end
52
-
53
- def test_serialized_attributes_from_database_on_subclass
54
- Topic.serialize :content, Hash
55
-
56
- t = Reply.new(content: { foo: :bar })
57
- assert_equal({ foo: :bar }, t.content)
58
- t.save!
59
- t = Reply.last
60
- assert_equal({ foo: :bar }, t.content)
61
- end
62
-
63
- def test_serialized_attribute_calling_dup_method
64
- Topic.serialize :content, JSON
65
-
66
- orig = Topic.new(content: { foo: :bar })
67
- clone = orig.dup
68
- assert_equal(orig.content, clone.content)
69
- end
70
-
71
- def test_serialized_json_attribute_returns_unserialized_value
72
- Topic.serialize :content, JSON
73
- my_post = posts(:welcome)
74
-
75
- t = Topic.new(content: my_post)
76
- t.save!
77
- t.reload
78
-
79
- assert_instance_of(Hash, t.content)
80
- assert_equal(my_post.id, t.content["id"])
81
- assert_equal(my_post.title, t.content["title"])
82
- end
83
-
84
- def test_json_read_legacy_null
85
- Topic.serialize :content, JSON
86
-
87
- # Force a row to have a JSON "null" instead of a database NULL (this is how
88
- # null values are saved on 4.1 and before)
89
- id = Topic.connection.insert "INSERT INTO topics (content) VALUES('null')"
90
- t = Topic.find(id)
91
-
92
- assert_nil t.content
93
- end
94
-
95
- def test_json_read_db_null
96
- Topic.serialize :content, JSON
97
-
98
- # Force a row to have a database NULL instead of a JSON "null"
99
- id = Topic.connection.insert "INSERT INTO topics (content) VALUES(NULL)"
100
- t = Topic.find(id)
101
-
102
- assert_nil t.content
103
- end
104
-
105
- def test_serialized_attribute_declared_in_subclass
106
- hash = { 'important1' => 'value1', 'important2' => 'value2' }
107
- important_topic = ImportantTopic.create("important" => hash)
108
- assert_equal(hash, important_topic.important)
109
-
110
- important_topic.reload
111
- assert_equal(hash, important_topic.important)
112
- assert_equal(hash, important_topic.read_attribute(:important))
113
- end
114
-
115
- def test_serialized_time_attribute
116
- myobj = Time.local(2008,1,1,1,0)
117
- topic = Topic.create("content" => myobj).reload
118
- assert_equal(myobj, topic.content)
119
- end
120
-
121
- def test_serialized_string_attribute
122
- myobj = "Yes"
123
- topic = Topic.create("content" => myobj).reload
124
- assert_equal(myobj, topic.content)
125
- end
126
-
127
- def test_nil_serialized_attribute_without_class_constraint
128
- topic = Topic.new
129
- assert_nil topic.content
130
- end
131
-
132
- def test_nil_not_serialized_without_class_constraint
133
- assert Topic.new(:content => nil).save
134
- assert_equal 1, Topic.where(:content => nil).count
135
- end
136
-
137
- def test_nil_not_serialized_with_class_constraint
138
- Topic.serialize :content, Hash
139
- assert Topic.new(:content => nil).save
140
- assert_equal 1, Topic.where(:content => nil).count
141
- end
142
-
143
- def test_serialized_attribute_should_raise_exception_on_assignment_with_wrong_type
144
- Topic.serialize(:content, Hash)
145
- assert_raise(ActiveRecord::SerializationTypeMismatch) do
146
- Topic.new(content: 'string')
147
- end
148
- end
149
-
150
- def test_should_raise_exception_on_serialized_attribute_with_type_mismatch
151
- myobj = MyObject.new('value1', 'value2')
152
- topic = Topic.new(:content => myobj)
153
- assert topic.save
154
- Topic.serialize(:content, Hash)
155
- assert_raise(ActiveRecord::SerializationTypeMismatch) { Topic.find(topic.id).content }
156
- end
157
-
158
- def test_serialized_attribute_with_class_constraint
159
- settings = { "color" => "blue" }
160
- Topic.serialize(:content, Hash)
161
- topic = Topic.new(:content => settings)
162
- assert topic.save
163
- assert_equal(settings, Topic.find(topic.id).content)
164
- end
165
-
166
- def test_serialized_default_class
167
- Topic.serialize(:content, Hash)
168
- topic = Topic.new
169
- assert_equal Hash, topic.content.class
170
- assert_equal Hash, topic.read_attribute(:content).class
171
- topic.content["beer"] = "MadridRb"
172
- assert topic.save
173
- topic.reload
174
- assert_equal Hash, topic.content.class
175
- assert_equal "MadridRb", topic.content["beer"]
176
- end
177
-
178
- def test_serialized_no_default_class_for_object
179
- topic = Topic.new
180
- assert_nil topic.content
181
- end
182
-
183
- def test_serialized_boolean_value_true
184
- topic = Topic.new(:content => true)
185
- assert topic.save
186
- topic = topic.reload
187
- assert_equal topic.content, true
188
- end
189
-
190
- def test_serialized_boolean_value_false
191
- topic = Topic.new(:content => false)
192
- assert topic.save
193
- topic = topic.reload
194
- assert_equal topic.content, false
195
- end
196
-
197
- def test_serialize_with_coder
198
- some_class = Struct.new(:foo) do
199
- def self.dump(value)
200
- value.foo
201
- end
202
-
203
- def self.load(value)
204
- new(value)
205
- end
206
- end
207
-
208
- Topic.serialize(:content, some_class)
209
- topic = Topic.new(:content => some_class.new('my value'))
210
- topic.save!
211
- topic.reload
212
- assert_kind_of some_class, topic.content
213
- assert_equal topic.content, some_class.new('my value')
214
- end
215
-
216
- def test_serialize_attribute_via_select_method_when_time_zone_available
217
- with_timezone_config aware_attributes: true do
218
- Topic.serialize(:content, MyObject)
219
-
220
- myobj = MyObject.new('value1', 'value2')
221
- topic = Topic.create(content: myobj)
222
-
223
- assert_equal(myobj, Topic.select(:content).find(topic.id).content)
224
- assert_raise(ActiveModel::MissingAttributeError) { Topic.select(:id).find(topic.id).content }
225
- end
226
- end
227
-
228
- def test_serialize_attribute_can_be_serialized_in_an_integer_column
229
- insures = ['life']
230
- person = SerializedPerson.new(first_name: 'David', insures: insures)
231
- assert person.save
232
- person = person.reload
233
- assert_equal(insures, person.insures)
234
- end
235
-
236
- def test_regression_serialized_default_on_text_column_with_null_false
237
- light = TrafficLight.new
238
- assert_equal [], light.state
239
- assert_equal [], light.long_state
240
- end
241
-
242
- def test_serialized_column_should_unserialize_after_update_column
243
- t = Topic.create(content: "first")
244
- assert_equal("first", t.content)
245
-
246
- t.update_column(:content, ["second"])
247
- assert_equal(["second"], t.content)
248
- assert_equal(["second"], t.reload.content)
249
- end
250
-
251
- def test_serialized_column_should_unserialize_after_update_attribute
252
- t = Topic.create(content: "first")
253
- assert_equal("first", t.content)
254
-
255
- t.update_attribute(:content, "second")
256
- assert_equal("second", t.content)
257
- assert_equal("second", t.reload.content)
258
- end
259
-
260
- def test_nil_is_not_changed_when_serialized_with_a_class
261
- Topic.serialize(:content, Array)
262
-
263
- topic = Topic.new(content: nil)
264
-
265
- assert_not topic.content_changed?
266
- end
267
-
268
- def test_newly_emptied_serialized_hash_is_changed
269
- Topic.serialize(:content, Hash)
270
- topic = Topic.create(content: { "things" => "stuff" })
271
- topic.content.delete("things")
272
- topic.save!
273
- topic.reload
274
-
275
- assert_equal({}, topic.content)
276
- end
277
- end
1
+ require 'cases/helper'
2
+ require 'models/topic'
3
+ require 'models/reply'
4
+ require 'models/person'
5
+ require 'models/traffic_light'
6
+ require 'models/post'
7
+ require 'bcrypt'
8
+
9
+ class SerializedAttributeTest < ActiveRecord::TestCase
10
+ fixtures :topics, :posts
11
+
12
+ MyObject = Struct.new :attribute1, :attribute2
13
+
14
+ teardown do
15
+ Topic.serialize("content")
16
+ end
17
+
18
+ def test_serialize_does_not_eagerly_load_columns
19
+ Topic.reset_column_information
20
+ assert_no_queries do
21
+ Topic.serialize(:content)
22
+ end
23
+ end
24
+
25
+ def test_list_of_serialized_attributes
26
+ assert_deprecated do
27
+ assert_equal %w(content), Topic.serialized_attributes.keys
28
+ end
29
+ end
30
+
31
+ def test_serialized_attribute
32
+ Topic.serialize("content", MyObject)
33
+
34
+ myobj = MyObject.new('value1', 'value2')
35
+ topic = Topic.create("content" => myobj)
36
+ assert_equal(myobj, topic.content)
37
+
38
+ topic.reload
39
+ assert_equal(myobj, topic.content)
40
+ end
41
+
42
+ def test_serialized_attribute_in_base_class
43
+ Topic.serialize("content", Hash)
44
+
45
+ hash = { 'content1' => 'value1', 'content2' => 'value2' }
46
+ important_topic = ImportantTopic.create("content" => hash)
47
+ assert_equal(hash, important_topic.content)
48
+
49
+ important_topic.reload
50
+ assert_equal(hash, important_topic.content)
51
+ end
52
+
53
+ def test_serialized_attributes_from_database_on_subclass
54
+ Topic.serialize :content, Hash
55
+
56
+ t = Reply.new(content: { foo: :bar })
57
+ assert_equal({ foo: :bar }, t.content)
58
+ t.save!
59
+ t = Reply.last
60
+ assert_equal({ foo: :bar }, t.content)
61
+ end
62
+
63
+ def test_serialized_attribute_calling_dup_method
64
+ Topic.serialize :content, JSON
65
+
66
+ orig = Topic.new(content: { foo: :bar })
67
+ clone = orig.dup
68
+ assert_equal(orig.content, clone.content)
69
+ end
70
+
71
+ def test_serialized_json_attribute_returns_unserialized_value
72
+ Topic.serialize :content, JSON
73
+ my_post = posts(:welcome)
74
+
75
+ t = Topic.new(content: my_post)
76
+ t.save!
77
+ t.reload
78
+
79
+ assert_instance_of(Hash, t.content)
80
+ assert_equal(my_post.id, t.content["id"])
81
+ assert_equal(my_post.title, t.content["title"])
82
+ end
83
+
84
+ def test_json_read_legacy_null
85
+ Topic.serialize :content, JSON
86
+
87
+ # Force a row to have a JSON "null" instead of a database NULL (this is how
88
+ # null values are saved on 4.1 and before)
89
+ id = Topic.connection.insert "INSERT INTO topics (content) VALUES('null')"
90
+ t = Topic.find(id)
91
+
92
+ assert_nil t.content
93
+ end
94
+
95
+ def test_json_read_db_null
96
+ Topic.serialize :content, JSON
97
+
98
+ # Force a row to have a database NULL instead of a JSON "null"
99
+ id = Topic.connection.insert "INSERT INTO topics (content) VALUES(NULL)"
100
+ t = Topic.find(id)
101
+
102
+ assert_nil t.content
103
+ end
104
+
105
+ def test_serialized_attribute_declared_in_subclass
106
+ hash = { 'important1' => 'value1', 'important2' => 'value2' }
107
+ important_topic = ImportantTopic.create("important" => hash)
108
+ assert_equal(hash, important_topic.important)
109
+
110
+ important_topic.reload
111
+ assert_equal(hash, important_topic.important)
112
+ assert_equal(hash, important_topic.read_attribute(:important))
113
+ end
114
+
115
+ def test_serialized_time_attribute
116
+ myobj = Time.local(2008,1,1,1,0)
117
+ topic = Topic.create("content" => myobj).reload
118
+ assert_equal(myobj, topic.content)
119
+ end
120
+
121
+ def test_serialized_string_attribute
122
+ myobj = "Yes"
123
+ topic = Topic.create("content" => myobj).reload
124
+ assert_equal(myobj, topic.content)
125
+ end
126
+
127
+ def test_nil_serialized_attribute_without_class_constraint
128
+ topic = Topic.new
129
+ assert_nil topic.content
130
+ end
131
+
132
+ def test_nil_not_serialized_without_class_constraint
133
+ assert Topic.new(:content => nil).save
134
+ assert_equal 1, Topic.where(:content => nil).count
135
+ end
136
+
137
+ def test_nil_not_serialized_with_class_constraint
138
+ Topic.serialize :content, Hash
139
+ assert Topic.new(:content => nil).save
140
+ assert_equal 1, Topic.where(:content => nil).count
141
+ end
142
+
143
+ def test_serialized_attribute_should_raise_exception_on_assignment_with_wrong_type
144
+ Topic.serialize(:content, Hash)
145
+ assert_raise(ActiveRecord::SerializationTypeMismatch) do
146
+ Topic.new(content: 'string')
147
+ end
148
+ end
149
+
150
+ def test_should_raise_exception_on_serialized_attribute_with_type_mismatch
151
+ myobj = MyObject.new('value1', 'value2')
152
+ topic = Topic.new(:content => myobj)
153
+ assert topic.save
154
+ Topic.serialize(:content, Hash)
155
+ assert_raise(ActiveRecord::SerializationTypeMismatch) { Topic.find(topic.id).content }
156
+ end
157
+
158
+ def test_serialized_attribute_with_class_constraint
159
+ settings = { "color" => "blue" }
160
+ Topic.serialize(:content, Hash)
161
+ topic = Topic.new(:content => settings)
162
+ assert topic.save
163
+ assert_equal(settings, Topic.find(topic.id).content)
164
+ end
165
+
166
+ def test_serialized_default_class
167
+ Topic.serialize(:content, Hash)
168
+ topic = Topic.new
169
+ assert_equal Hash, topic.content.class
170
+ assert_equal Hash, topic.read_attribute(:content).class
171
+ topic.content["beer"] = "MadridRb"
172
+ assert topic.save
173
+ topic.reload
174
+ assert_equal Hash, topic.content.class
175
+ assert_equal "MadridRb", topic.content["beer"]
176
+ end
177
+
178
+ def test_serialized_no_default_class_for_object
179
+ topic = Topic.new
180
+ assert_nil topic.content
181
+ end
182
+
183
+ def test_serialized_boolean_value_true
184
+ topic = Topic.new(:content => true)
185
+ assert topic.save
186
+ topic = topic.reload
187
+ assert_equal topic.content, true
188
+ end
189
+
190
+ def test_serialized_boolean_value_false
191
+ topic = Topic.new(:content => false)
192
+ assert topic.save
193
+ topic = topic.reload
194
+ assert_equal topic.content, false
195
+ end
196
+
197
+ def test_serialize_with_coder
198
+ some_class = Struct.new(:foo) do
199
+ def self.dump(value)
200
+ value.foo
201
+ end
202
+
203
+ def self.load(value)
204
+ new(value)
205
+ end
206
+ end
207
+
208
+ Topic.serialize(:content, some_class)
209
+ topic = Topic.new(:content => some_class.new('my value'))
210
+ topic.save!
211
+ topic.reload
212
+ assert_kind_of some_class, topic.content
213
+ assert_equal topic.content, some_class.new('my value')
214
+ end
215
+
216
+ def test_serialize_attribute_via_select_method_when_time_zone_available
217
+ with_timezone_config aware_attributes: true do
218
+ Topic.serialize(:content, MyObject)
219
+
220
+ myobj = MyObject.new('value1', 'value2')
221
+ topic = Topic.create(content: myobj)
222
+
223
+ assert_equal(myobj, Topic.select(:content).find(topic.id).content)
224
+ assert_raise(ActiveModel::MissingAttributeError) { Topic.select(:id).find(topic.id).content }
225
+ end
226
+ end
227
+
228
+ def test_serialize_attribute_can_be_serialized_in_an_integer_column
229
+ insures = ['life']
230
+ person = SerializedPerson.new(first_name: 'David', insures: insures)
231
+ assert person.save
232
+ person = person.reload
233
+ assert_equal(insures, person.insures)
234
+ end
235
+
236
+ def test_regression_serialized_default_on_text_column_with_null_false
237
+ light = TrafficLight.new
238
+ assert_equal [], light.state
239
+ assert_equal [], light.long_state
240
+ end
241
+
242
+ def test_serialized_column_should_unserialize_after_update_column
243
+ t = Topic.create(content: "first")
244
+ assert_equal("first", t.content)
245
+
246
+ t.update_column(:content, ["second"])
247
+ assert_equal(["second"], t.content)
248
+ assert_equal(["second"], t.reload.content)
249
+ end
250
+
251
+ def test_serialized_column_should_unserialize_after_update_attribute
252
+ t = Topic.create(content: "first")
253
+ assert_equal("first", t.content)
254
+
255
+ t.update_attribute(:content, "second")
256
+ assert_equal("second", t.content)
257
+ assert_equal("second", t.reload.content)
258
+ end
259
+
260
+ def test_nil_is_not_changed_when_serialized_with_a_class
261
+ Topic.serialize(:content, Array)
262
+
263
+ topic = Topic.new(content: nil)
264
+
265
+ assert_not topic.content_changed?
266
+ end
267
+
268
+ def test_newly_emptied_serialized_hash_is_changed
269
+ Topic.serialize(:content, Hash)
270
+ topic = Topic.create(content: { "things" => "stuff" })
271
+ topic.content.delete("things")
272
+ topic.save!
273
+ topic.reload
274
+
275
+ assert_equal({}, topic.content)
276
+ end
277
+ end