ibm_db 3.0.4-x86-mingw32 → 5.0.4-x86-mingw32

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