ibm_db 3.0.5-x86-mingw32 → 4.0.0-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 (586) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -0
  3. data/LICENSE +1 -1
  4. data/MANIFEST +14 -14
  5. data/ParameterizedQueries README +6 -6
  6. data/README +208 -225
  7. data/ext/Makefile.nt32 +181 -181
  8. data/ext/Makefile.nt32.191 +212 -212
  9. data/ext/extconf.rb +291 -291
  10. data/ext/ibm_db.c +11887 -11887
  11. data/ext/ruby_ibm_db.h +241 -241
  12. data/ext/ruby_ibm_db_cli.c +866 -866
  13. data/ext/ruby_ibm_db_cli.h +500 -500
  14. data/init.rb +41 -41
  15. data/lib/IBM_DB.rb +27 -27
  16. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3452 -3177
  17. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -2
  18. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  19. data/lib/mswin32/ibm_db.rb +91 -123
  20. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  21. data/test/active_record/connection_adapters/fake_adapter.rb +49 -46
  22. data/test/assets/example.log +1 -1
  23. data/test/assets/test.txt +1 -1
  24. data/test/cases/adapter_test.rb +351 -276
  25. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
  26. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
  27. data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
  28. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
  29. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
  30. data/test/cases/adapters/mysql2/connection_test.rb +210 -0
  31. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
  32. data/test/cases/adapters/mysql2/enum_test.rb +26 -0
  33. data/test/cases/adapters/mysql2/explain_test.rb +21 -0
  34. data/test/cases/adapters/mysql2/json_test.rb +195 -0
  35. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
  36. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  37. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
  38. data/test/cases/adapters/mysql2/schema_test.rb +126 -0
  39. data/test/cases/adapters/mysql2/sp_test.rb +36 -0
  40. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
  41. data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
  42. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
  43. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
  44. data/test/cases/adapters/postgresql/array_test.rb +339 -0
  45. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
  46. data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
  47. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
  48. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
  49. data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
  50. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  51. data/test/cases/adapters/postgresql/collation_test.rb +53 -0
  52. data/test/cases/adapters/postgresql/composite_test.rb +132 -0
  53. data/test/cases/adapters/postgresql/connection_test.rb +257 -0
  54. data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
  55. data/test/cases/adapters/postgresql/domain_test.rb +47 -0
  56. data/test/cases/adapters/postgresql/enum_test.rb +91 -0
  57. data/test/cases/adapters/postgresql/explain_test.rb +20 -0
  58. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
  59. data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
  60. data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
  61. data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
  62. data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
  63. data/test/cases/adapters/postgresql/integer_test.rb +25 -0
  64. data/test/cases/adapters/postgresql/json_test.rb +237 -0
  65. data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
  66. data/test/cases/adapters/postgresql/money_test.rb +96 -0
  67. data/test/cases/adapters/postgresql/network_test.rb +94 -0
  68. data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
  69. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
  70. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  71. data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
  72. data/test/cases/adapters/postgresql/range_test.rb +343 -0
  73. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
  74. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
  75. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
  76. data/test/cases/adapters/postgresql/schema_test.rb +597 -0
  77. data/test/cases/adapters/postgresql/serial_test.rb +154 -0
  78. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
  79. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
  80. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
  81. data/test/cases/adapters/postgresql/utils_test.rb +62 -0
  82. data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
  83. data/test/cases/adapters/postgresql/xml_test.rb +54 -0
  84. data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
  85. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
  86. data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
  87. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
  88. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
  89. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  90. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
  91. data/test/cases/aggregations_test.rb +168 -158
  92. data/test/cases/ar_schema_test.rb +146 -161
  93. data/test/cases/associations/association_scope_test.rb +16 -21
  94. data/test/cases/associations/belongs_to_associations_test.rb +1141 -1029
  95. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
  96. data/test/cases/associations/callbacks_test.rb +190 -192
  97. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  98. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  99. data/test/cases/associations/eager_load_nested_include_test.rb +126 -128
  100. data/test/cases/associations/eager_singularization_test.rb +148 -148
  101. data/test/cases/associations/eager_test.rb +1514 -1429
  102. data/test/cases/associations/extension_test.rb +87 -82
  103. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -972
  104. data/test/cases/associations/has_many_associations_test.rb +2501 -2182
  105. data/test/cases/associations/has_many_through_associations_test.rb +1271 -1204
  106. data/test/cases/associations/has_one_associations_test.rb +707 -610
  107. data/test/cases/associations/has_one_through_associations_test.rb +383 -380
  108. data/test/cases/associations/inner_join_association_test.rb +139 -139
  109. data/test/cases/associations/inverse_associations_test.rb +733 -706
  110. data/test/cases/associations/join_model_test.rb +777 -754
  111. data/test/cases/associations/left_outer_join_association_test.rb +88 -0
  112. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  113. data/test/cases/associations/required_test.rb +102 -82
  114. data/test/cases/associations_test.rb +385 -380
  115. data/test/cases/attribute_decorators_test.rb +125 -125
  116. data/test/cases/attribute_methods/read_test.rb +60 -60
  117. data/test/cases/attribute_methods_test.rb +1009 -952
  118. data/test/cases/attribute_set_test.rb +270 -210
  119. data/test/cases/attribute_test.rb +246 -180
  120. data/test/cases/attributes_test.rb +253 -136
  121. data/test/cases/autosave_association_test.rb +1708 -1595
  122. data/test/cases/base_test.rb +1713 -1664
  123. data/test/cases/batches_test.rb +489 -212
  124. data/test/cases/binary_test.rb +44 -52
  125. data/test/cases/bind_parameter_test.rb +110 -100
  126. data/test/cases/cache_key_test.rb +25 -0
  127. data/test/cases/calculations_test.rb +798 -646
  128. data/test/cases/callbacks_test.rb +636 -543
  129. data/test/cases/clone_test.rb +40 -40
  130. data/test/cases/coders/json_test.rb +15 -0
  131. data/test/cases/coders/yaml_column_test.rb +63 -63
  132. data/test/cases/collection_cache_key_test.rb +115 -0
  133. data/test/cases/column_alias_test.rb +17 -17
  134. data/test/cases/column_definition_test.rb +92 -123
  135. data/test/cases/comment_test.rb +143 -0
  136. data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -54
  137. data/test/cases/connection_adapters/connection_handler_test.rb +160 -53
  138. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  139. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -293
  140. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -65
  141. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  142. data/test/cases/connection_adapters/schema_cache_test.rb +61 -56
  143. data/test/cases/connection_adapters/type_lookup_test.rb +118 -110
  144. data/test/cases/connection_management_test.rb +112 -122
  145. data/test/cases/connection_pool_test.rb +521 -346
  146. data/test/cases/connection_specification/resolver_test.rb +131 -116
  147. data/test/cases/core_test.rb +112 -112
  148. data/test/cases/counter_cache_test.rb +214 -209
  149. data/test/cases/custom_locking_test.rb +17 -17
  150. data/test/cases/database_statements_test.rb +34 -19
  151. data/test/cases/{invalid_date_test.rb → date_test.rb} +44 -32
  152. data/test/cases/date_time_precision_test.rb +106 -0
  153. data/test/cases/date_time_test.rb +61 -61
  154. data/test/cases/defaults_test.rb +218 -223
  155. data/test/cases/dirty_test.rb +763 -785
  156. data/test/cases/disconnected_test.rb +30 -28
  157. data/test/cases/dup_test.rb +157 -157
  158. data/test/cases/enum_test.rb +444 -290
  159. data/test/cases/errors_test.rb +16 -0
  160. data/test/cases/explain_subscriber_test.rb +64 -64
  161. data/test/cases/explain_test.rb +87 -76
  162. data/test/cases/finder_respond_to_test.rb +60 -60
  163. data/test/cases/finder_test.rb +1294 -1169
  164. data/test/cases/fixture_set/file_test.rb +156 -138
  165. data/test/cases/fixtures_test.rb +988 -908
  166. data/test/cases/forbidden_attributes_protection_test.rb +165 -99
  167. data/test/cases/habtm_destroy_order_test.rb +61 -61
  168. data/test/cases/helper.rb +204 -210
  169. data/test/cases/hot_compatibility_test.rb +142 -54
  170. data/test/cases/i18n_test.rb +45 -45
  171. data/test/cases/inheritance_test.rb +606 -375
  172. data/test/cases/integration_test.rb +155 -139
  173. data/test/cases/invalid_connection_test.rb +24 -22
  174. data/test/cases/invertible_migration_test.rb +387 -295
  175. data/test/cases/json_serialization_test.rb +311 -302
  176. data/test/cases/locking_test.rb +493 -477
  177. data/test/cases/log_subscriber_test.rb +225 -136
  178. data/test/cases/migration/change_schema_test.rb +458 -512
  179. data/test/cases/migration/change_table_test.rb +256 -224
  180. data/test/cases/migration/column_attributes_test.rb +176 -192
  181. data/test/cases/migration/column_positioning_test.rb +56 -56
  182. data/test/cases/migration/columns_test.rb +310 -304
  183. data/test/cases/migration/command_recorder_test.rb +350 -305
  184. data/test/cases/migration/compatibility_test.rb +118 -0
  185. data/test/cases/migration/create_join_table_test.rb +157 -148
  186. data/test/cases/migration/foreign_key_test.rb +360 -328
  187. data/test/cases/migration/helper.rb +39 -39
  188. data/test/cases/migration/index_test.rb +218 -216
  189. data/test/cases/migration/logger_test.rb +36 -36
  190. data/test/cases/migration/pending_migrations_test.rb +52 -53
  191. data/test/cases/migration/references_foreign_key_test.rb +216 -169
  192. data/test/cases/migration/references_index_test.rb +101 -101
  193. data/test/cases/migration/references_statements_test.rb +136 -116
  194. data/test/cases/migration/rename_table_test.rb +93 -93
  195. data/test/cases/migration_test.rb +1157 -959
  196. data/test/cases/migrator_test.rb +470 -388
  197. data/test/cases/mixin_test.rb +68 -70
  198. data/test/cases/modules_test.rb +172 -173
  199. data/test/cases/multiparameter_attributes_test.rb +372 -350
  200. data/test/cases/multiple_db_test.rb +122 -115
  201. data/test/cases/nested_attributes_test.rb +1098 -1070
  202. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  203. data/test/cases/persistence_test.rb +1001 -909
  204. data/test/cases/pooled_connections_test.rb +81 -81
  205. data/test/cases/primary_keys_test.rb +376 -237
  206. data/test/cases/query_cache_test.rb +446 -326
  207. data/test/cases/quoting_test.rb +202 -156
  208. data/test/cases/readonly_test.rb +119 -118
  209. data/test/cases/reaper_test.rb +85 -85
  210. data/test/cases/reflection_test.rb +509 -463
  211. data/test/cases/relation/delegation_test.rb +63 -68
  212. data/test/cases/relation/merging_test.rb +157 -161
  213. data/test/cases/relation/mutation_test.rb +183 -165
  214. data/test/cases/relation/or_test.rb +92 -0
  215. data/test/cases/relation/predicate_builder_test.rb +16 -14
  216. data/test/cases/relation/record_fetch_warning_test.rb +40 -0
  217. data/test/cases/relation/where_chain_test.rb +105 -181
  218. data/test/cases/relation/where_clause_test.rb +182 -0
  219. data/test/cases/relation/where_test.rb +322 -300
  220. data/test/cases/relation_test.rb +328 -319
  221. data/test/cases/relations_test.rb +2026 -1815
  222. data/test/cases/reload_models_test.rb +22 -22
  223. data/test/cases/result_test.rb +90 -80
  224. data/test/cases/sanitize_test.rb +176 -83
  225. data/test/cases/schema_dumper_test.rb +457 -463
  226. data/test/cases/schema_loading_test.rb +52 -0
  227. data/test/cases/scoping/default_scoping_test.rb +528 -454
  228. data/test/cases/scoping/named_scoping_test.rb +561 -524
  229. data/test/cases/scoping/relation_scoping_test.rb +400 -357
  230. data/test/cases/secure_token_test.rb +32 -0
  231. data/test/cases/serialization_test.rb +104 -104
  232. data/test/cases/serialized_attribute_test.rb +364 -277
  233. data/test/cases/statement_cache_test.rb +136 -98
  234. data/test/cases/store_test.rb +195 -194
  235. data/test/cases/suppressor_test.rb +63 -0
  236. data/test/cases/tasks/database_tasks_test.rb +462 -398
  237. data/test/cases/tasks/mysql_rake_test.rb +345 -324
  238. data/test/cases/tasks/postgresql_rake_test.rb +304 -250
  239. data/test/cases/tasks/sqlite_rake_test.rb +220 -193
  240. data/test/cases/test_case.rb +131 -123
  241. data/test/cases/test_fixtures_test.rb +36 -0
  242. data/test/cases/time_precision_test.rb +102 -0
  243. data/test/cases/timestamp_test.rb +501 -467
  244. data/test/cases/touch_later_test.rb +121 -0
  245. data/test/cases/transaction_callbacks_test.rb +518 -452
  246. data/test/cases/transaction_isolation_test.rb +106 -106
  247. data/test/cases/transactions_test.rb +834 -817
  248. data/test/cases/type/adapter_specific_registry_test.rb +133 -0
  249. data/test/cases/type/date_time_test.rb +14 -0
  250. data/test/cases/type/integer_test.rb +27 -121
  251. data/test/cases/type/string_test.rb +22 -36
  252. data/test/cases/type/type_map_test.rb +177 -177
  253. data/test/cases/type_test.rb +39 -0
  254. data/test/cases/types_test.rb +24 -141
  255. data/test/cases/unconnected_test.rb +33 -33
  256. data/test/cases/validations/absence_validation_test.rb +73 -0
  257. data/test/cases/validations/association_validation_test.rb +97 -86
  258. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  259. data/test/cases/validations/i18n_validation_test.rb +86 -90
  260. data/test/cases/validations/length_validation_test.rb +79 -47
  261. data/test/cases/validations/presence_validation_test.rb +103 -68
  262. data/test/cases/validations/uniqueness_validation_test.rb +548 -457
  263. data/test/cases/validations_repair_helper.rb +19 -23
  264. data/test/cases/validations_test.rb +194 -165
  265. data/test/cases/view_test.rb +216 -119
  266. data/test/cases/yaml_serialization_test.rb +121 -126
  267. data/test/config.example.yml +97 -0
  268. data/test/config.rb +5 -5
  269. data/test/fixtures/accounts.yml +29 -29
  270. data/test/fixtures/admin/accounts.yml +2 -2
  271. data/test/fixtures/admin/users.yml +10 -10
  272. data/test/fixtures/author_addresses.original +11 -0
  273. data/test/fixtures/author_addresses.yml +17 -17
  274. data/test/fixtures/author_favorites.yml +3 -3
  275. data/test/fixtures/authors.original +17 -0
  276. data/test/fixtures/authors.yml +23 -23
  277. data/test/fixtures/bad_posts.yml +9 -0
  278. data/test/fixtures/binaries.yml +133 -133
  279. data/test/fixtures/books.yml +31 -11
  280. data/test/fixtures/bulbs.yml +5 -5
  281. data/test/fixtures/cars.yml +9 -9
  282. data/test/fixtures/categories.yml +19 -19
  283. data/test/fixtures/categories/special_categories.yml +9 -9
  284. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  285. data/test/fixtures/categories_ordered.yml +7 -7
  286. data/test/fixtures/categories_posts.yml +31 -31
  287. data/test/fixtures/categorizations.yml +23 -23
  288. data/test/fixtures/clubs.yml +8 -8
  289. data/test/fixtures/collections.yml +3 -3
  290. data/test/fixtures/colleges.yml +3 -3
  291. data/test/fixtures/comments.yml +65 -65
  292. data/test/fixtures/companies.yml +67 -67
  293. data/test/fixtures/computers.yml +10 -10
  294. data/test/fixtures/content.yml +3 -0
  295. data/test/fixtures/content_positions.yml +3 -0
  296. data/test/fixtures/courses.yml +8 -8
  297. data/test/fixtures/customers.yml +25 -25
  298. data/test/fixtures/dashboards.yml +6 -6
  299. data/test/fixtures/dead_parrots.yml +5 -0
  300. data/test/fixtures/developers.yml +22 -22
  301. data/test/fixtures/developers_projects.yml +16 -16
  302. data/test/fixtures/dog_lovers.yml +7 -7
  303. data/test/fixtures/dogs.yml +4 -4
  304. data/test/fixtures/doubloons.yml +3 -3
  305. data/test/fixtures/edges.yml +5 -5
  306. data/test/fixtures/entrants.yml +14 -14
  307. data/test/fixtures/essays.yml +6 -6
  308. data/test/fixtures/faces.yml +11 -11
  309. data/test/fixtures/fk_test_has_fk.yml +3 -3
  310. data/test/fixtures/fk_test_has_pk.yml +1 -1
  311. data/test/fixtures/friendships.yml +4 -4
  312. data/test/fixtures/funny_jokes.yml +10 -10
  313. data/test/fixtures/interests.yml +33 -33
  314. data/test/fixtures/items.yml +3 -3
  315. data/test/fixtures/jobs.yml +7 -7
  316. data/test/fixtures/legacy_things.yml +3 -3
  317. data/test/fixtures/live_parrots.yml +4 -0
  318. data/test/fixtures/mateys.yml +4 -4
  319. data/test/fixtures/member_details.yml +8 -8
  320. data/test/fixtures/member_types.yml +6 -6
  321. data/test/fixtures/members.yml +11 -11
  322. data/test/fixtures/memberships.yml +34 -34
  323. data/test/fixtures/men.yml +5 -5
  324. data/test/fixtures/minimalistics.yml +2 -2
  325. data/test/fixtures/minivans.yml +5 -5
  326. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  327. data/test/fixtures/mixins.yml +29 -29
  328. data/test/fixtures/movies.yml +7 -7
  329. data/test/fixtures/naked/yml/accounts.yml +1 -1
  330. data/test/fixtures/naked/yml/companies.yml +1 -1
  331. data/test/fixtures/naked/yml/courses.yml +1 -1
  332. data/test/fixtures/naked/yml/parrots.yml +2 -0
  333. data/test/fixtures/naked/yml/trees.yml +3 -0
  334. data/test/fixtures/nodes.yml +29 -0
  335. data/test/fixtures/organizations.yml +5 -5
  336. data/test/fixtures/other_comments.yml +6 -0
  337. data/test/fixtures/other_dogs.yml +2 -0
  338. data/test/fixtures/other_posts.yml +7 -0
  339. data/test/fixtures/other_topics.yml +42 -42
  340. data/test/fixtures/owners.yml +9 -9
  341. data/test/fixtures/parrots.yml +27 -27
  342. data/test/fixtures/parrots_pirates.yml +7 -7
  343. data/test/fixtures/people.yml +24 -24
  344. data/test/fixtures/peoples_treasures.yml +3 -3
  345. data/test/fixtures/pets.yml +19 -19
  346. data/test/fixtures/pirates.yml +15 -12
  347. data/test/fixtures/posts.yml +80 -80
  348. data/test/fixtures/price_estimates.yml +16 -7
  349. data/test/fixtures/products.yml +4 -4
  350. data/test/fixtures/projects.yml +7 -7
  351. data/test/fixtures/ratings.yml +14 -14
  352. data/test/fixtures/readers.yml +11 -11
  353. data/test/fixtures/references.yml +17 -17
  354. data/test/fixtures/reserved_words/distinct.yml +5 -5
  355. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  356. data/test/fixtures/reserved_words/group.yml +14 -14
  357. data/test/fixtures/reserved_words/select.yml +8 -8
  358. data/test/fixtures/reserved_words/values.yml +7 -7
  359. data/test/fixtures/ships.yml +6 -6
  360. data/test/fixtures/speedometers.yml +8 -8
  361. data/test/fixtures/sponsors.yml +12 -12
  362. data/test/fixtures/string_key_objects.yml +7 -7
  363. data/test/fixtures/subscribers.yml +10 -10
  364. data/test/fixtures/subscriptions.yml +12 -12
  365. data/test/fixtures/taggings.yml +78 -78
  366. data/test/fixtures/tags.yml +11 -11
  367. data/test/fixtures/tasks.yml +7 -7
  368. data/test/fixtures/teapots.yml +3 -3
  369. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  370. data/test/fixtures/to_be_linked/users.yml +10 -10
  371. data/test/fixtures/topics.yml +49 -49
  372. data/test/fixtures/toys.yml +14 -14
  373. data/test/fixtures/traffic_lights.yml +9 -9
  374. data/test/fixtures/treasures.yml +10 -10
  375. data/test/fixtures/trees.yml +3 -0
  376. data/test/fixtures/uuid_children.yml +3 -3
  377. data/test/fixtures/uuid_parents.yml +2 -2
  378. data/test/fixtures/variants.yml +4 -4
  379. data/test/fixtures/vegetables.yml +19 -19
  380. data/test/fixtures/vertices.yml +3 -3
  381. data/test/fixtures/warehouse_things.yml +2 -2
  382. data/test/fixtures/zines.yml +5 -5
  383. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  384. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  385. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  386. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -9
  387. data/test/migrations/missing/1_people_have_last_names.rb +9 -9
  388. data/test/migrations/missing/3_we_need_reminders.rb +12 -12
  389. data/test/migrations/missing/4_innocent_jointable.rb +12 -12
  390. data/test/migrations/rename/1_we_need_things.rb +11 -11
  391. data/test/migrations/rename/2_rename_things.rb +9 -9
  392. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  393. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  394. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  395. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  396. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  397. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  398. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  399. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  400. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  401. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  402. data/test/migrations/valid/2_we_need_reminders.rb +12 -12
  403. data/test/migrations/valid/3_innocent_jointable.rb +12 -12
  404. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  405. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -12
  406. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -12
  407. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  408. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  409. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  410. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  411. data/test/models/admin.rb +5 -5
  412. data/test/models/admin/account.rb +3 -3
  413. data/test/models/admin/randomly_named_c1.rb +6 -2
  414. data/test/models/admin/user.rb +40 -40
  415. data/test/models/aircraft.rb +5 -4
  416. data/test/models/arunit2_model.rb +3 -3
  417. data/test/models/author.rb +209 -212
  418. data/test/models/auto_id.rb +4 -4
  419. data/test/models/autoloadable/extra_firm.rb +2 -2
  420. data/test/models/binary.rb +2 -2
  421. data/test/models/bird.rb +12 -12
  422. data/test/models/book.rb +23 -18
  423. data/test/models/boolean.rb +2 -2
  424. data/test/models/bulb.rb +52 -51
  425. data/test/models/cake_designer.rb +3 -3
  426. data/test/models/car.rb +29 -26
  427. data/test/models/carrier.rb +2 -2
  428. data/test/models/cat.rb +10 -0
  429. data/test/models/categorization.rb +19 -19
  430. data/test/models/category.rb +35 -35
  431. data/test/models/chef.rb +8 -7
  432. data/test/models/citation.rb +3 -3
  433. data/test/models/club.rb +25 -23
  434. data/test/models/college.rb +10 -10
  435. data/test/models/column.rb +3 -3
  436. data/test/models/column_name.rb +3 -3
  437. data/test/models/comment.rb +76 -64
  438. data/test/models/company.rb +230 -228
  439. data/test/models/company_in_module.rb +98 -98
  440. data/test/models/computer.rb +3 -3
  441. data/test/models/contact.rb +41 -41
  442. data/test/models/content.rb +40 -0
  443. data/test/models/contract.rb +20 -20
  444. data/test/models/country.rb +7 -7
  445. data/test/models/course.rb +6 -6
  446. data/test/models/customer.rb +83 -77
  447. data/test/models/customer_carrier.rb +14 -14
  448. data/test/models/dashboard.rb +3 -3
  449. data/test/models/default.rb +2 -2
  450. data/test/models/department.rb +4 -4
  451. data/test/models/developer.rb +274 -255
  452. data/test/models/dog.rb +5 -5
  453. data/test/models/dog_lover.rb +5 -5
  454. data/test/models/doubloon.rb +12 -12
  455. data/test/models/drink_designer.rb +3 -3
  456. data/test/models/edge.rb +5 -5
  457. data/test/models/electron.rb +5 -5
  458. data/test/models/engine.rb +4 -4
  459. data/test/models/entrant.rb +3 -3
  460. data/test/models/essay.rb +5 -5
  461. data/test/models/event.rb +3 -3
  462. data/test/models/eye.rb +37 -37
  463. data/test/models/face.rb +9 -9
  464. data/test/models/friendship.rb +6 -6
  465. data/test/models/guid.rb +2 -2
  466. data/test/models/guitar.rb +4 -0
  467. data/test/models/hotel.rb +11 -9
  468. data/test/models/image.rb +3 -3
  469. data/test/models/interest.rb +5 -5
  470. data/test/models/invoice.rb +4 -4
  471. data/test/models/item.rb +7 -7
  472. data/test/models/job.rb +7 -7
  473. data/test/models/joke.rb +7 -7
  474. data/test/models/keyboard.rb +3 -3
  475. data/test/models/legacy_thing.rb +3 -3
  476. data/test/models/lesson.rb +11 -11
  477. data/test/models/line_item.rb +3 -3
  478. data/test/models/liquid.rb +4 -4
  479. data/test/models/man.rb +11 -11
  480. data/test/models/matey.rb +4 -4
  481. data/test/models/member.rb +42 -41
  482. data/test/models/member_detail.rb +8 -7
  483. data/test/models/member_type.rb +3 -3
  484. data/test/models/membership.rb +35 -35
  485. data/test/models/mentor.rb +3 -0
  486. data/test/models/minimalistic.rb +2 -2
  487. data/test/models/minivan.rb +9 -9
  488. data/test/models/mixed_case_monkey.rb +3 -3
  489. data/test/models/mocktail_designer.rb +2 -0
  490. data/test/models/molecule.rb +6 -6
  491. data/test/models/movie.rb +5 -5
  492. data/test/models/node.rb +5 -0
  493. data/test/models/non_primary_key.rb +2 -0
  494. data/test/models/notification.rb +3 -0
  495. data/test/models/order.rb +4 -4
  496. data/test/models/organization.rb +14 -14
  497. data/test/models/other_dog.rb +5 -0
  498. data/test/models/owner.rb +37 -34
  499. data/test/models/parrot.rb +28 -29
  500. data/test/models/person.rb +142 -143
  501. data/test/models/personal_legacy_thing.rb +4 -4
  502. data/test/models/pet.rb +18 -15
  503. data/test/models/pet_treasure.rb +6 -0
  504. data/test/models/pirate.rb +92 -92
  505. data/test/models/possession.rb +3 -3
  506. data/test/models/post.rb +273 -264
  507. data/test/models/price_estimate.rb +4 -4
  508. data/test/models/professor.rb +5 -5
  509. data/test/models/project.rb +40 -31
  510. data/test/models/publisher.rb +2 -2
  511. data/test/models/publisher/article.rb +4 -4
  512. data/test/models/publisher/magazine.rb +3 -3
  513. data/test/models/randomly_named_c1.rb +1 -1
  514. data/test/models/rating.rb +4 -4
  515. data/test/models/reader.rb +23 -23
  516. data/test/models/recipe.rb +3 -0
  517. data/test/models/record.rb +2 -2
  518. data/test/models/reference.rb +22 -22
  519. data/test/models/reply.rb +61 -61
  520. data/test/models/ship.rb +39 -33
  521. data/test/models/ship_part.rb +8 -8
  522. data/test/models/shop.rb +17 -17
  523. data/test/models/shop_account.rb +6 -6
  524. data/test/models/speedometer.rb +6 -6
  525. data/test/models/sponsor.rb +7 -7
  526. data/test/models/string_key_object.rb +3 -3
  527. data/test/models/student.rb +4 -4
  528. data/test/models/subject.rb +16 -16
  529. data/test/models/subscriber.rb +8 -8
  530. data/test/models/subscription.rb +4 -4
  531. data/test/models/tag.rb +13 -7
  532. data/test/models/tagging.rb +13 -13
  533. data/test/models/task.rb +5 -5
  534. data/test/models/topic.rb +118 -124
  535. data/test/models/toy.rb +6 -6
  536. data/test/models/traffic_light.rb +4 -4
  537. data/test/models/treasure.rb +14 -14
  538. data/test/models/treaty.rb +7 -7
  539. data/test/models/tree.rb +3 -0
  540. data/test/models/tuning_peg.rb +4 -0
  541. data/test/models/tyre.rb +11 -11
  542. data/test/models/user.rb +14 -0
  543. data/test/models/uuid_child.rb +3 -3
  544. data/test/models/uuid_item.rb +6 -0
  545. data/test/models/uuid_parent.rb +3 -3
  546. data/test/models/vegetables.rb +24 -24
  547. data/test/models/vehicle.rb +6 -6
  548. data/test/models/vertex.rb +9 -9
  549. data/test/models/warehouse_thing.rb +5 -5
  550. data/test/models/wheel.rb +3 -3
  551. data/test/models/without_table.rb +3 -3
  552. data/test/models/zine.rb +3 -3
  553. data/test/schema/mysql2_specific_schema.rb +68 -58
  554. data/test/schema/oracle_specific_schema.rb +40 -43
  555. data/test/schema/postgresql_specific_schema.rb +114 -202
  556. data/test/schema/schema.rb +1057 -952
  557. data/test/schema/schema.rb.original +1057 -0
  558. data/test/schema/sqlite_specific_schema.rb +18 -22
  559. data/test/support/config.rb +43 -43
  560. data/test/support/connection.rb +23 -22
  561. data/test/support/connection_helper.rb +14 -14
  562. data/test/support/ddl_helper.rb +8 -8
  563. data/test/support/schema_dumping_helper.rb +20 -20
  564. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  565. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  566. metadata +129 -28
  567. data/lib/mswin32/rb19x/ibm_db.so +0 -0
  568. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  569. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  570. data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
  571. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
  572. data/test/cases/attribute_methods/serialization_test.rb +0 -29
  573. data/test/cases/migration/change_schema_test - Copy.rb +0 -448
  574. data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
  575. data/test/cases/migration/table_and_index_test.rb +0 -24
  576. data/test/cases/relation/where_test2.rb +0 -36
  577. data/test/cases/type/decimal_test.rb +0 -56
  578. data/test/cases/type/unsigned_integer_test.rb +0 -18
  579. data/test/cases/xml_serialization_test.rb +0 -457
  580. data/test/connections/native_ibm_db/connection.rb +0 -44
  581. data/test/fixtures/naked/csv/accounts.csv +0 -1
  582. data/test/schema/i5/ibm_db_specific_schema.rb +0 -137
  583. data/test/schema/ids/ibm_db_specific_schema.rb +0 -140
  584. data/test/schema/luw/ibm_db_specific_schema.rb +0 -137
  585. data/test/schema/mysql_specific_schema.rb +0 -70
  586. data/test/schema/zOS/ibm_db_specific_schema.rb +0 -208
@@ -1,302 +1,311 @@
1
- require "cases/helper"
2
- require 'models/contact'
3
- require 'models/post'
4
- require 'models/author'
5
- require 'models/tagging'
6
- require 'models/tag'
7
- require 'models/comment'
8
-
9
- module JsonSerializationHelpers
10
-
11
- private
12
-
13
- def set_include_root_in_json(value)
14
- original_root_in_json = ActiveRecord::Base.include_root_in_json
15
- ActiveRecord::Base.include_root_in_json = value
16
- yield
17
- ensure
18
- ActiveRecord::Base.include_root_in_json = original_root_in_json
19
- end
20
- end
21
-
22
- class JsonSerializationTest < ActiveRecord::TestCase
23
- include JsonSerializationHelpers
24
- fixtures :authors, :author_addresses
25
-
26
- class NamespacedContact < Contact
27
- column :name, :string
28
- end
29
-
30
- def setup
31
- @contact = Contact.new(
32
- :name => 'Konata Izumi',
33
- :age => 16,
34
- :avatar => 'binarydata',
35
- :created_at => Time.utc(2006, 8, 1),
36
- :awesome => true,
37
- :preferences => { :shows => 'anime' }
38
- )
39
- end
40
-
41
- def test_should_demodulize_root_in_json
42
- set_include_root_in_json(true) do
43
- @contact = NamespacedContact.new name: 'whatever'
44
- json = @contact.to_json
45
- assert_match %r{^\{"namespaced_contact":\{}, json
46
- end
47
- end
48
-
49
- def test_should_include_root_in_json
50
- set_include_root_in_json(true) do
51
- json = @contact.to_json
52
-
53
- assert_match %r{^\{"contact":\{}, json
54
- assert_match %r{"name":"Konata Izumi"}, json
55
- assert_match %r{"age":16}, json
56
- assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
57
- assert_match %r{"awesome":true}, json
58
- assert_match %r{"preferences":\{"shows":"anime"\}}, json
59
- end
60
- end
61
-
62
- def test_should_encode_all_encodable_attributes
63
- json = @contact.to_json
64
-
65
- assert_match %r{"name":"Konata Izumi"}, json
66
- assert_match %r{"age":16}, json
67
- assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
68
- assert_match %r{"awesome":true}, json
69
- assert_match %r{"preferences":\{"shows":"anime"\}}, json
70
- end
71
-
72
- def test_should_allow_attribute_filtering_with_only
73
- json = @contact.to_json(:only => [:name, :age])
74
-
75
- assert_match %r{"name":"Konata Izumi"}, json
76
- assert_match %r{"age":16}, json
77
- assert_no_match %r{"awesome":true}, json
78
- assert !json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
79
- assert_no_match %r{"preferences":\{"shows":"anime"\}}, json
80
- end
81
-
82
- def test_should_allow_attribute_filtering_with_except
83
- json = @contact.to_json(:except => [:name, :age])
84
-
85
- assert_no_match %r{"name":"Konata Izumi"}, json
86
- assert_no_match %r{"age":16}, json
87
- assert_match %r{"awesome":true}, json
88
- assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
89
- assert_match %r{"preferences":\{"shows":"anime"\}}, json
90
- end
91
-
92
- def test_methods_are_called_on_object
93
- # Define methods on fixture.
94
- def @contact.label; "Has cheezburger"; end
95
- def @contact.favorite_quote; "Constraints are liberating"; end
96
-
97
- # Single method.
98
- assert_match %r{"label":"Has cheezburger"}, @contact.to_json(:only => :name, :methods => :label)
99
-
100
- # Both methods.
101
- methods_json = @contact.to_json(:only => :name, :methods => [:label, :favorite_quote])
102
- assert_match %r{"label":"Has cheezburger"}, methods_json
103
- assert_match %r{"favorite_quote":"Constraints are liberating"}, methods_json
104
- end
105
-
106
- def test_uses_serializable_hash_with_only_option
107
- def @contact.serializable_hash(options=nil)
108
- super(only: %w(name))
109
- end
110
-
111
- json = @contact.to_json
112
- assert_match %r{"name":"Konata Izumi"}, json
113
- assert_no_match %r{awesome}, json
114
- assert_no_match %r{age}, json
115
- end
116
-
117
- def test_uses_serializable_hash_with_except_option
118
- def @contact.serializable_hash(options=nil)
119
- super(except: %w(age))
120
- end
121
-
122
- json = @contact.to_json
123
- assert_match %r{"name":"Konata Izumi"}, json
124
- assert_match %r{"awesome":true}, json
125
- assert_no_match %r{age}, json
126
- end
127
-
128
- def test_does_not_include_inheritance_column_from_sti
129
- @contact = ContactSti.new(@contact.attributes)
130
- assert_equal 'ContactSti', @contact.type
131
-
132
- json = @contact.to_json
133
- assert_match %r{"name":"Konata Izumi"}, json
134
- assert_no_match %r{type}, json
135
- assert_no_match %r{ContactSti}, json
136
- end
137
-
138
- def test_serializable_hash_with_default_except_option_and_excluding_inheritance_column_from_sti
139
- @contact = ContactSti.new(@contact.attributes)
140
- assert_equal 'ContactSti', @contact.type
141
-
142
- def @contact.serializable_hash(options={})
143
- super({ except: %w(age) }.merge!(options))
144
- end
145
-
146
- json = @contact.to_json
147
- assert_match %r{"name":"Konata Izumi"}, json
148
- assert_no_match %r{age}, json
149
- assert_no_match %r{type}, json
150
- assert_no_match %r{ContactSti}, json
151
- end
152
-
153
- def test_serializable_hash_should_not_modify_options_in_argument
154
- options = { :only => :name }
155
- @contact.serializable_hash(options)
156
-
157
- assert_nil options[:except]
158
- end
159
- end
160
-
161
- class DatabaseConnectedJsonEncodingTest < ActiveRecord::TestCase
162
- fixtures :authors, :posts, :comments, :tags, :taggings
163
-
164
- include JsonSerializationHelpers
165
-
166
- def setup
167
- @david = authors(:david)
168
- @mary = authors(:mary)
169
- end
170
-
171
- def test_includes_uses_association_name
172
- json = @david.to_json(:include => :posts)
173
-
174
- assert_match %r{"posts":\[}, json
175
-
176
- assert_match %r{"id":1}, json
177
- assert_match %r{"name":"David"}, json
178
-
179
- assert_match %r{"author_id":1}, json
180
- assert_match %r{"title":"Welcome to the weblog"}, json
181
- assert_match %r{"body":"Such a lovely day"}, json
182
-
183
- assert_match %r{"title":"So I was thinking"}, json
184
- assert_match %r{"body":"Like I hopefully always am"}, json
185
- end
186
-
187
- def test_includes_uses_association_name_and_applies_attribute_filters
188
- json = @david.to_json(:include => { :posts => { :only => :title } })
189
-
190
- assert_match %r{"name":"David"}, json
191
- assert_match %r{"posts":\[}, json
192
-
193
- assert_match %r{"title":"Welcome to the weblog"}, json
194
- assert_no_match %r{"body":"Such a lovely day"}, json
195
-
196
- assert_match %r{"title":"So I was thinking"}, json
197
- assert_no_match %r{"body":"Like I hopefully always am"}, json
198
- end
199
-
200
- def test_includes_fetches_second_level_associations
201
- json = @david.to_json(:include => { :posts => { :include => { :comments => { :only => :body } } } })
202
-
203
- assert_match %r{"name":"David"}, json
204
- assert_match %r{"posts":\[}, json
205
-
206
- assert_match %r{"comments":\[}, json
207
- assert_match %r{\{"body":"Thank you again for the welcome"\}}, json
208
- assert_match %r{\{"body":"Don't think too hard"\}}, json
209
- assert_no_match %r{"post_id":}, json
210
- end
211
-
212
- def test_includes_fetches_nth_level_associations
213
- json = @david.to_json(
214
- :include => {
215
- :posts => {
216
- :include => {
217
- :taggings => {
218
- :include => {
219
- :tag => { :only => :name }
220
- }
221
- }
222
- }
223
- }
224
- })
225
-
226
- assert_match %r{"name":"David"}, json
227
- assert_match %r{"posts":\[}, json
228
-
229
- assert_match %r{"taggings":\[}, json
230
- assert_match %r{"tag":\{"name":"General"\}}, json
231
- end
232
-
233
- def test_includes_doesnt_merge_opts_from_base
234
- json = @david.to_json(
235
- :only => :id,
236
- :include => :posts
237
- )
238
-
239
- assert_match %{"title":"Welcome to the weblog"}, json
240
- end
241
-
242
- def test_should_not_call_methods_on_associations_that_dont_respond
243
- def @david.favorite_quote; "Constraints are liberating"; end
244
- json = @david.to_json(:include => :posts, :methods => :favorite_quote)
245
-
246
- assert !@david.posts.first.respond_to?(:favorite_quote)
247
- assert_match %r{"favorite_quote":"Constraints are liberating"}, json
248
- assert_equal %r{"favorite_quote":}.match(json).size, 1
249
- end
250
-
251
- def test_should_allow_only_option_for_list_of_authors
252
- set_include_root_in_json(false) do
253
- authors = [@david, @mary]
254
- assert_equal %([{"name":"David"},{"name":"Mary"}]), ActiveSupport::JSON.encode(authors, only: :name)
255
- end
256
- end
257
-
258
- def test_should_allow_except_option_for_list_of_authors
259
- set_include_root_in_json(false) do
260
- authors = [@david, @mary]
261
- encoded = ActiveSupport::JSON.encode(authors, except: [
262
- :name, :author_address_id, :author_address_extra_id,
263
- :organization_id, :owned_essay_id
264
- ])
265
- assert_equal %([{"id":1},{"id":2}]), encoded
266
- end
267
- end
268
-
269
- def test_should_allow_includes_for_list_of_authors
270
- authors = [@david, @mary]
271
- json = ActiveSupport::JSON.encode(authors,
272
- :only => :name,
273
- :include => {
274
- :posts => { :only => :id }
275
- }
276
- )
277
-
278
- ['"name":"David"', '"posts":[', '{"id":1}', '{"id":2}', '{"id":4}',
279
- '{"id":5}', '{"id":6}', '"name":"Mary"', '"posts":[', '{"id":7}', '{"id":9}'].each do |fragment|
280
- assert json.include?(fragment), json
281
- end
282
- end
283
-
284
- def test_should_allow_options_for_hash_of_authors
285
- set_include_root_in_json(true) do
286
- authors_hash = {
287
- 1 => @david,
288
- 2 => @mary
289
- }
290
- assert_equal %({"1":{"author":{"name":"David"}}}), ActiveSupport::JSON.encode(authors_hash, only: [1, :name])
291
- end
292
- end
293
-
294
- def test_should_be_able_to_encode_relation
295
- set_include_root_in_json(true) do
296
- authors_relation = Author.where(id: [@david.id, @mary.id])
297
-
298
- json = ActiveSupport::JSON.encode authors_relation, only: :name
299
- assert_equal '[{"author":{"name":"David"}},{"author":{"name":"Mary"}}]', json
300
- end
301
- end
302
- end
1
+ require "cases/helper"
2
+ require 'models/contact'
3
+ require 'models/post'
4
+ require 'models/author'
5
+ require 'models/tagging'
6
+ require 'models/tag'
7
+ require 'models/comment'
8
+
9
+ module JsonSerializationHelpers
10
+ private
11
+
12
+ def set_include_root_in_json(value)
13
+ original_root_in_json = ActiveRecord::Base.include_root_in_json
14
+ ActiveRecord::Base.include_root_in_json = value
15
+ yield
16
+ ensure
17
+ ActiveRecord::Base.include_root_in_json = original_root_in_json
18
+ end
19
+ end
20
+
21
+ class JsonSerializationTest < ActiveRecord::TestCase
22
+ include JsonSerializationHelpers
23
+
24
+ class NamespacedContact < Contact
25
+ column :name, :string
26
+ end
27
+
28
+ def setup
29
+ @contact = Contact.new(
30
+ :name => 'Konata Izumi',
31
+ :age => 16,
32
+ :avatar => 'binarydata',
33
+ :created_at => Time.utc(2006, 8, 1),
34
+ :awesome => true,
35
+ :preferences => { :shows => 'anime' }
36
+ )
37
+ end
38
+
39
+ def test_should_demodulize_root_in_json
40
+ set_include_root_in_json(true) do
41
+ @contact = NamespacedContact.new name: 'whatever'
42
+ json = @contact.to_json
43
+ assert_match %r{^\{"namespaced_contact":\{}, json
44
+ end
45
+ end
46
+
47
+ def test_should_include_root_in_json
48
+ set_include_root_in_json(true) do
49
+ json = @contact.to_json
50
+
51
+ assert_match %r{^\{"contact":\{}, json
52
+ assert_match %r{"name":"Konata Izumi"}, json
53
+ assert_match %r{"age":16}, json
54
+ assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
55
+ assert_match %r{"awesome":true}, json
56
+ assert_match %r{"preferences":\{"shows":"anime"\}}, json
57
+ end
58
+ end
59
+
60
+ def test_should_encode_all_encodable_attributes
61
+ json = @contact.to_json
62
+
63
+ assert_match %r{"name":"Konata Izumi"}, json
64
+ assert_match %r{"age":16}, json
65
+ assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
66
+ assert_match %r{"awesome":true}, json
67
+ assert_match %r{"preferences":\{"shows":"anime"\}}, json
68
+ end
69
+
70
+ def test_should_allow_attribute_filtering_with_only
71
+ json = @contact.to_json(:only => [:name, :age])
72
+
73
+ assert_match %r{"name":"Konata Izumi"}, json
74
+ assert_match %r{"age":16}, json
75
+ assert_no_match %r{"awesome":true}, json
76
+ assert !json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
77
+ assert_no_match %r{"preferences":\{"shows":"anime"\}}, json
78
+ end
79
+
80
+ def test_should_allow_attribute_filtering_with_except
81
+ json = @contact.to_json(:except => [:name, :age])
82
+
83
+ assert_no_match %r{"name":"Konata Izumi"}, json
84
+ assert_no_match %r{"age":16}, json
85
+ assert_match %r{"awesome":true}, json
86
+ assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
87
+ assert_match %r{"preferences":\{"shows":"anime"\}}, json
88
+ end
89
+
90
+ def test_methods_are_called_on_object
91
+ # Define methods on fixture.
92
+ def @contact.label; "Has cheezburger"; end
93
+ def @contact.favorite_quote; "Constraints are liberating"; end
94
+
95
+ # Single method.
96
+ assert_match %r{"label":"Has cheezburger"}, @contact.to_json(:only => :name, :methods => :label)
97
+
98
+ # Both methods.
99
+ methods_json = @contact.to_json(:only => :name, :methods => [:label, :favorite_quote])
100
+ assert_match %r{"label":"Has cheezburger"}, methods_json
101
+ assert_match %r{"favorite_quote":"Constraints are liberating"}, methods_json
102
+ end
103
+
104
+ def test_uses_serializable_hash_with_frozen_hash
105
+ def @contact.serializable_hash(options = nil)
106
+ super({ only: %w(name) }.freeze)
107
+ end
108
+
109
+ json = @contact.to_json
110
+ assert_match %r{"name":"Konata Izumi"}, json
111
+ assert_no_match %r{awesome}, json
112
+ assert_no_match %r{age}, json
113
+ end
114
+
115
+ def test_uses_serializable_hash_with_only_option
116
+ def @contact.serializable_hash(options=nil)
117
+ super(only: %w(name))
118
+ end
119
+
120
+ json = @contact.to_json
121
+ assert_match %r{"name":"Konata Izumi"}, json
122
+ assert_no_match %r{awesome}, json
123
+ assert_no_match %r{age}, json
124
+ end
125
+
126
+ def test_uses_serializable_hash_with_except_option
127
+ def @contact.serializable_hash(options=nil)
128
+ super(except: %w(age))
129
+ end
130
+
131
+ json = @contact.to_json
132
+ assert_match %r{"name":"Konata Izumi"}, json
133
+ assert_match %r{"awesome":true}, json
134
+ assert_no_match %r{age}, json
135
+ end
136
+
137
+ def test_does_not_include_inheritance_column_from_sti
138
+ @contact = ContactSti.new(@contact.attributes)
139
+ assert_equal 'ContactSti', @contact.type
140
+
141
+ json = @contact.to_json
142
+ assert_match %r{"name":"Konata Izumi"}, json
143
+ assert_no_match %r{type}, json
144
+ assert_no_match %r{ContactSti}, json
145
+ end
146
+
147
+ def test_serializable_hash_with_default_except_option_and_excluding_inheritance_column_from_sti
148
+ @contact = ContactSti.new(@contact.attributes)
149
+ assert_equal 'ContactSti', @contact.type
150
+
151
+ def @contact.serializable_hash(options={})
152
+ super({ except: %w(age) }.merge!(options))
153
+ end
154
+
155
+ json = @contact.to_json
156
+ assert_match %r{"name":"Konata Izumi"}, json
157
+ assert_no_match %r{age}, json
158
+ assert_no_match %r{type}, json
159
+ assert_no_match %r{ContactSti}, json
160
+ end
161
+
162
+ def test_serializable_hash_should_not_modify_options_in_argument
163
+ options = { :only => :name }
164
+ @contact.serializable_hash(options)
165
+
166
+ assert_nil options[:except]
167
+ end
168
+ end
169
+
170
+ class DatabaseConnectedJsonEncodingTest < ActiveRecord::TestCase
171
+ fixtures :authors, :posts, :comments, :tags, :taggings
172
+
173
+ include JsonSerializationHelpers
174
+
175
+ def setup
176
+ @david = authors(:david)
177
+ @mary = authors(:mary)
178
+ end
179
+
180
+ def test_includes_uses_association_name
181
+ json = @david.to_json(:include => :posts)
182
+
183
+ assert_match %r{"posts":\[}, json
184
+
185
+ assert_match %r{"id":1}, json
186
+ assert_match %r{"name":"David"}, json
187
+
188
+ assert_match %r{"author_id":1}, json
189
+ assert_match %r{"title":"Welcome to the weblog"}, json
190
+ assert_match %r{"body":"Such a lovely day"}, json
191
+
192
+ assert_match %r{"title":"So I was thinking"}, json
193
+ assert_match %r{"body":"Like I hopefully always am"}, json
194
+ end
195
+
196
+ def test_includes_uses_association_name_and_applies_attribute_filters
197
+ json = @david.to_json(:include => { :posts => { :only => :title } })
198
+
199
+ assert_match %r{"name":"David"}, json
200
+ assert_match %r{"posts":\[}, json
201
+
202
+ assert_match %r{"title":"Welcome to the weblog"}, json
203
+ assert_no_match %r{"body":"Such a lovely day"}, json
204
+
205
+ assert_match %r{"title":"So I was thinking"}, json
206
+ assert_no_match %r{"body":"Like I hopefully always am"}, json
207
+ end
208
+
209
+ def test_includes_fetches_second_level_associations
210
+ json = @david.to_json(:include => { :posts => { :include => { :comments => { :only => :body } } } })
211
+
212
+ assert_match %r{"name":"David"}, json
213
+ assert_match %r{"posts":\[}, json
214
+
215
+ assert_match %r{"comments":\[}, json
216
+ assert_match %r{\{"body":"Thank you again for the welcome"\}}, json
217
+ assert_match %r{\{"body":"Don't think too hard"\}}, json
218
+ assert_no_match %r{"post_id":}, json
219
+ end
220
+
221
+ def test_includes_fetches_nth_level_associations
222
+ json = @david.to_json(
223
+ :include => {
224
+ :posts => {
225
+ :include => {
226
+ :taggings => {
227
+ :include => {
228
+ :tag => { :only => :name }
229
+ }
230
+ }
231
+ }
232
+ }
233
+ })
234
+
235
+ assert_match %r{"name":"David"}, json
236
+ assert_match %r{"posts":\[}, json
237
+
238
+ assert_match %r{"taggings":\[}, json
239
+ assert_match %r{"tag":\{"name":"General"\}}, json
240
+ end
241
+
242
+ def test_includes_doesnt_merge_opts_from_base
243
+ json = @david.to_json(
244
+ :only => :id,
245
+ :include => :posts
246
+ )
247
+
248
+ assert_match %{"title":"Welcome to the weblog"}, json
249
+ end
250
+
251
+ def test_should_not_call_methods_on_associations_that_dont_respond
252
+ def @david.favorite_quote; "Constraints are liberating"; end
253
+ json = @david.to_json(:include => :posts, :methods => :favorite_quote)
254
+
255
+ assert !@david.posts.first.respond_to?(:favorite_quote)
256
+ assert_match %r{"favorite_quote":"Constraints are liberating"}, json
257
+ assert_equal %r{"favorite_quote":}.match(json).size, 1
258
+ end
259
+
260
+ def test_should_allow_only_option_for_list_of_authors
261
+ set_include_root_in_json(false) do
262
+ authors = [@david, @mary]
263
+ assert_equal %([{"name":"David"},{"name":"Mary"}]), ActiveSupport::JSON.encode(authors, only: :name)
264
+ end
265
+ end
266
+
267
+ def test_should_allow_except_option_for_list_of_authors
268
+ set_include_root_in_json(false) do
269
+ authors = [@david, @mary]
270
+ encoded = ActiveSupport::JSON.encode(authors, except: [
271
+ :name, :author_address_id, :author_address_extra_id,
272
+ :organization_id, :owned_essay_id
273
+ ])
274
+ assert_equal %([{"id":1},{"id":2}]), encoded
275
+ end
276
+ end
277
+
278
+ def test_should_allow_includes_for_list_of_authors
279
+ authors = [@david, @mary]
280
+ json = ActiveSupport::JSON.encode(authors,
281
+ :only => :name,
282
+ :include => {
283
+ :posts => { :only => :id }
284
+ }
285
+ )
286
+
287
+ ['"name":"David"', '"posts":[', '{"id":1}', '{"id":2}', '{"id":4}',
288
+ '{"id":5}', '{"id":6}', '"name":"Mary"', '"posts":[', '{"id":7}', '{"id":9}'].each do |fragment|
289
+ assert json.include?(fragment), json
290
+ end
291
+ end
292
+
293
+ def test_should_allow_options_for_hash_of_authors
294
+ set_include_root_in_json(true) do
295
+ authors_hash = {
296
+ 1 => @david,
297
+ 2 => @mary
298
+ }
299
+ assert_equal %({"1":{"author":{"name":"David"}}}), ActiveSupport::JSON.encode(authors_hash, only: [1, :name])
300
+ end
301
+ end
302
+
303
+ def test_should_be_able_to_encode_relation
304
+ set_include_root_in_json(true) do
305
+ authors_relation = Author.where(id: [@david.id, @mary.id])
306
+
307
+ json = ActiveSupport::JSON.encode authors_relation, only: :name
308
+ assert_equal '[{"author":{"name":"David"}},{"author":{"name":"Mary"}}]', json
309
+ end
310
+ end
311
+ end