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,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