ibm_db 3.0.0-x86-mingw32 → 3.0.1-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 (465) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -0
  3. data/MANIFEST +14 -14
  4. data/README +225 -225
  5. data/ext/Makefile.nt32 +181 -181
  6. data/ext/Makefile.nt32.191 +212 -212
  7. data/ext/OLD/extconf.rb +264 -0
  8. data/ext/{extconf_MacOS.rb → OLD/extconf_MacOS.rb} +269 -269
  9. data/ext/extconf.rb +291 -264
  10. data/ext/ibm_db.c +2 -2
  11. data/ext/ruby_ibm_db.h +241 -241
  12. data/ext/ruby_ibm_db_cli.h +500 -500
  13. data/init.rb +41 -41
  14. data/lib/IBM_DB.rb +27 -27
  15. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +4 -4
  16. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +1 -1
  17. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  18. data/lib/mswin32/ibm_db.rb +115 -115
  19. data/test/active_record/connection_adapters/fake_adapter.rb +46 -0
  20. data/test/assets/example.log +1 -0
  21. data/test/assets/flowers.jpg +0 -0
  22. data/test/assets/test.txt +1 -0
  23. data/test/cases/adapter_test.rb +261 -207
  24. data/test/cases/aggregations_test.rb +158 -0
  25. data/test/cases/ar_schema_test.rb +161 -0
  26. data/test/cases/associations/association_scope_test.rb +21 -0
  27. data/test/cases/associations/belongs_to_associations_test.rb +1029 -711
  28. data/test/cases/associations/callbacks_test.rb +192 -0
  29. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -181
  30. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +26 -0
  31. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -0
  32. data/test/cases/associations/eager_load_nested_include_test.rb +128 -0
  33. data/test/cases/associations/eager_singularization_test.rb +148 -0
  34. data/test/cases/associations/eager_test.rb +1411 -0
  35. data/test/cases/associations/extension_test.rb +82 -0
  36. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +932 -851
  37. data/test/cases/associations/has_many_associations_test.rb +2162 -0
  38. data/test/cases/associations/has_many_through_associations_test.rb +1204 -0
  39. data/test/cases/associations/has_one_associations_test.rb +610 -0
  40. data/test/cases/associations/has_one_through_associations_test.rb +380 -0
  41. data/test/cases/associations/inner_join_association_test.rb +139 -0
  42. data/test/cases/associations/inverse_associations_test.rb +693 -0
  43. data/test/cases/associations/join_model_test.rb +754 -743
  44. data/test/cases/associations/nested_through_associations_test.rb +579 -0
  45. data/test/cases/associations/required_test.rb +82 -0
  46. data/test/cases/associations_test.rb +380 -0
  47. data/test/cases/attribute_decorators_test.rb +125 -0
  48. data/test/cases/attribute_methods/read_test.rb +60 -0
  49. data/test/cases/attribute_methods/serialization_test.rb +29 -0
  50. data/test/cases/attribute_methods_test.rb +952 -822
  51. data/test/cases/attribute_set_test.rb +200 -0
  52. data/test/cases/attribute_test.rb +180 -0
  53. data/test/cases/attributes_test.rb +136 -0
  54. data/test/cases/autosave_association_test.rb +1595 -0
  55. data/test/cases/base_test.rb +1638 -2133
  56. data/test/cases/batches_test.rb +212 -0
  57. data/test/cases/binary_test.rb +52 -0
  58. data/test/cases/bind_parameter_test.rb +100 -0
  59. data/test/cases/calculations_test.rb +646 -482
  60. data/test/cases/callbacks_test.rb +543 -0
  61. data/test/cases/clone_test.rb +40 -0
  62. data/test/cases/coders/yaml_column_test.rb +63 -0
  63. data/test/cases/column_alias_test.rb +17 -0
  64. data/test/cases/column_definition_test.rb +123 -0
  65. data/test/cases/connection_adapters/adapter_leasing_test.rb +54 -0
  66. data/test/cases/connection_adapters/connection_handler_test.rb +53 -0
  67. data/test/cases/connection_adapters/connection_specification_test.rb +12 -0
  68. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +293 -0
  69. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +65 -0
  70. data/test/cases/connection_adapters/quoting_test.rb +13 -0
  71. data/test/cases/connection_adapters/schema_cache_test.rb +56 -0
  72. data/test/cases/connection_adapters/type_lookup_test.rb +110 -0
  73. data/test/cases/connection_management_test.rb +122 -0
  74. data/test/cases/connection_pool_test.rb +346 -0
  75. data/test/cases/connection_specification/resolver_test.rb +116 -0
  76. data/test/cases/core_test.rb +112 -0
  77. data/test/cases/counter_cache_test.rb +209 -0
  78. data/test/cases/custom_locking_test.rb +17 -0
  79. data/test/cases/database_statements_test.rb +19 -0
  80. data/test/cases/date_time_test.rb +61 -0
  81. data/test/cases/defaults_test.rb +223 -0
  82. data/test/cases/dirty_test.rb +775 -0
  83. data/test/cases/disconnected_test.rb +28 -0
  84. data/test/cases/dup_test.rb +157 -0
  85. data/test/cases/enum_test.rb +290 -0
  86. data/test/cases/explain_subscriber_test.rb +64 -0
  87. data/test/cases/explain_test.rb +76 -0
  88. data/test/cases/finder_respond_to_test.rb +60 -0
  89. data/test/cases/finder_test.rb +1166 -0
  90. data/test/cases/fixture_set/file_test.rb +138 -0
  91. data/test/cases/fixtures_test.rb +897 -0
  92. data/test/cases/forbidden_attributes_protection_test.rb +99 -0
  93. data/test/cases/habtm_destroy_order_test.rb +61 -0
  94. data/test/cases/helper.rb +210 -0
  95. data/test/cases/hot_compatibility_test.rb +54 -0
  96. data/test/cases/i18n_test.rb +45 -0
  97. data/test/cases/inheritance_test.rb +375 -0
  98. data/test/cases/integration_test.rb +139 -0
  99. data/test/cases/invalid_connection_test.rb +22 -0
  100. data/test/cases/invalid_date_test.rb +32 -0
  101. data/test/cases/invertible_migration_test.rb +295 -0
  102. data/test/cases/json_serialization_test.rb +302 -0
  103. data/test/cases/locking_test.rb +477 -0
  104. data/test/cases/log_subscriber_test.rb +136 -0
  105. data/test/cases/migration/change_schema_test - Copy.rb +448 -0
  106. data/test/cases/migration/change_schema_test.rb +472 -0
  107. data/test/cases/migration/change_table_test.rb +224 -0
  108. data/test/cases/migration/column_attributes_test.rb +192 -0
  109. data/test/cases/migration/column_positioning_test.rb +56 -0
  110. data/test/cases/migration/columns_test.rb +304 -0
  111. data/test/cases/migration/command_recorder_test.rb +305 -0
  112. data/test/cases/migration/create_join_table_test.rb +148 -0
  113. data/test/cases/migration/foreign_key_test - Changed.rb +325 -0
  114. data/test/cases/migration/foreign_key_test.rb +360 -0
  115. data/test/cases/migration/helper.rb +39 -0
  116. data/test/cases/migration/index_test.rb +216 -0
  117. data/test/cases/migration/logger_test.rb +36 -0
  118. data/test/cases/migration/pending_migrations_test.rb +53 -0
  119. data/test/cases/migration/references_foreign_key_test.rb +214 -0
  120. data/test/cases/migration/references_index_test.rb +101 -0
  121. data/test/cases/migration/references_statements_test.rb +116 -0
  122. data/test/cases/migration/rename_table_test.rb +93 -0
  123. data/test/cases/migration/table_and_index_test.rb +24 -0
  124. data/test/cases/migration_test.rb +959 -2408
  125. data/test/cases/migrator_test.rb +388 -0
  126. data/test/cases/mixin_test.rb +70 -0
  127. data/test/cases/modules_test.rb +173 -0
  128. data/test/cases/multiparameter_attributes_test.rb +350 -0
  129. data/test/cases/multiple_db_test.rb +115 -0
  130. data/test/cases/nested_attributes_test.rb +1057 -0
  131. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -0
  132. data/test/cases/persistence_test.rb +909 -642
  133. data/test/cases/pooled_connections_test.rb +81 -0
  134. data/test/cases/primary_keys_test.rb +237 -0
  135. data/test/cases/query_cache_test.rb +326 -257
  136. data/test/cases/quoting_test.rb +156 -0
  137. data/test/cases/readonly_test.rb +118 -0
  138. data/test/cases/reaper_test.rb +85 -0
  139. data/test/cases/reflection_test.rb +454 -0
  140. data/test/cases/relation/delegation_test.rb +68 -0
  141. data/test/cases/relation/merging_test.rb +161 -0
  142. data/test/cases/relation/mutation_test.rb +165 -0
  143. data/test/cases/relation/predicate_builder_test.rb +14 -0
  144. data/test/cases/relation/where_chain_test.rb +181 -0
  145. data/test/cases/relation/where_test.rb +300 -0
  146. data/test/cases/relation/where_test2.rb +36 -0
  147. data/test/cases/relation_test.rb +297 -0
  148. data/test/cases/relations_test.rb +1815 -1182
  149. data/test/cases/reload_models_test.rb +22 -0
  150. data/test/cases/result_test.rb +80 -0
  151. data/test/cases/sanitize_test.rb +83 -0
  152. data/test/cases/schema_dumper_test.rb +463 -256
  153. data/test/cases/scoping/default_scoping_test.rb +454 -0
  154. data/test/cases/scoping/named_scoping_test.rb +524 -0
  155. data/test/cases/scoping/relation_scoping_test.rb +357 -0
  156. data/test/cases/serialization_test.rb +104 -0
  157. data/test/cases/serialized_attribute_test.rb +277 -0
  158. data/test/cases/statement_cache_test.rb +98 -0
  159. data/test/cases/store_test.rb +194 -0
  160. data/test/cases/tasks/database_tasks_test.rb +396 -0
  161. data/test/cases/tasks/mysql_rake_test.rb +311 -0
  162. data/test/cases/tasks/postgresql_rake_test.rb +245 -0
  163. data/test/cases/tasks/sqlite_rake_test.rb +193 -0
  164. data/test/cases/test_case.rb +123 -0
  165. data/test/cases/timestamp_test.rb +468 -0
  166. data/test/cases/transaction_callbacks_test.rb +452 -300
  167. data/test/cases/transaction_isolation_test.rb +106 -0
  168. data/test/cases/transactions_test.rb +817 -0
  169. data/test/cases/type/decimal_test.rb +51 -0
  170. data/test/cases/type/integer_test.rb +121 -0
  171. data/test/cases/type/string_test.rb +36 -0
  172. data/test/cases/type/type_map_test.rb +177 -0
  173. data/test/cases/type/unsigned_integer_test.rb +18 -0
  174. data/test/cases/types_test.rb +141 -0
  175. data/test/cases/unconnected_test.rb +33 -0
  176. data/test/cases/validations/association_validation_test.rb +86 -0
  177. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -0
  178. data/test/cases/validations/i18n_validation_test.rb +90 -0
  179. data/test/cases/validations/length_validation_test.rb +47 -0
  180. data/test/cases/validations/presence_validation_test.rb +68 -0
  181. data/test/cases/validations/uniqueness_validation_test.rb +434 -299
  182. data/test/cases/validations_repair_helper.rb +23 -0
  183. data/test/cases/validations_test.rb +165 -0
  184. data/test/cases/view_test.rb +113 -0
  185. data/test/cases/xml_serialization_test.rb +457 -408
  186. data/test/cases/yaml_serialization_test.rb +86 -0
  187. data/test/config.rb +5 -0
  188. data/test/config.yml +154 -154
  189. data/test/connections/native_ibm_db/connection.rb +43 -43
  190. data/test/fixtures/accounts.yml +29 -0
  191. data/test/fixtures/admin/accounts.yml +2 -0
  192. data/test/fixtures/admin/randomly_named_a9.yml +7 -0
  193. data/test/fixtures/admin/randomly_named_b0.yml +7 -0
  194. data/test/fixtures/admin/users.yml +10 -0
  195. data/test/fixtures/all/admin +1 -0
  196. data/test/fixtures/all/developers.yml +0 -0
  197. data/test/fixtures/all/people.yml +0 -0
  198. data/test/fixtures/all/tasks.yml +0 -0
  199. data/test/fixtures/author_addresses.yml +18 -0
  200. data/test/fixtures/author_favorites.yml +4 -0
  201. data/test/fixtures/authors.yml +23 -0
  202. data/test/fixtures/binaries.yml +133 -0
  203. data/test/fixtures/books.yml +11 -0
  204. data/test/fixtures/bulbs.yml +5 -0
  205. data/test/fixtures/cars.yml +9 -0
  206. data/test/fixtures/categories.yml +19 -0
  207. data/test/fixtures/categories/special_categories.yml +9 -0
  208. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
  209. data/test/fixtures/categories_ordered.yml +7 -0
  210. data/test/fixtures/categories_posts.yml +31 -0
  211. data/test/fixtures/categorizations.yml +23 -0
  212. data/test/fixtures/clubs.yml +8 -0
  213. data/test/fixtures/collections.yml +3 -0
  214. data/test/fixtures/colleges.yml +3 -0
  215. data/test/fixtures/comments.yml +65 -0
  216. data/test/fixtures/companies.yml +67 -0
  217. data/test/fixtures/computers.yml +10 -0
  218. data/test/fixtures/courses.yml +8 -0
  219. data/test/fixtures/customers.yml +26 -0
  220. data/test/fixtures/dashboards.yml +6 -0
  221. data/test/fixtures/developers.yml +22 -0
  222. data/test/fixtures/developers_projects.yml +17 -0
  223. data/test/fixtures/dog_lovers.yml +7 -0
  224. data/test/fixtures/dogs.yml +4 -0
  225. data/test/fixtures/doubloons.yml +3 -0
  226. data/test/fixtures/edges.yml +5 -0
  227. data/test/fixtures/entrants.yml +14 -0
  228. data/test/fixtures/essays.yml +6 -0
  229. data/test/fixtures/faces.yml +11 -0
  230. data/test/fixtures/fk_test_has_fk.yml +3 -0
  231. data/test/fixtures/fk_test_has_pk.yml +2 -0
  232. data/test/fixtures/friendships.yml +4 -0
  233. data/test/fixtures/funny_jokes.yml +10 -0
  234. data/test/fixtures/interests.yml +33 -0
  235. data/test/fixtures/items.yml +3 -0
  236. data/test/fixtures/jobs.yml +7 -0
  237. data/test/fixtures/legacy_things.yml +3 -0
  238. data/test/fixtures/mateys.yml +4 -0
  239. data/test/fixtures/member_details.yml +8 -0
  240. data/test/fixtures/member_types.yml +6 -0
  241. data/test/fixtures/members.yml +11 -0
  242. data/test/fixtures/memberships.yml +34 -0
  243. data/test/fixtures/men.yml +5 -0
  244. data/test/fixtures/minimalistics.yml +2 -0
  245. data/test/fixtures/minivans.yml +5 -0
  246. data/test/fixtures/mixed_case_monkeys.yml +6 -0
  247. data/test/fixtures/mixins.yml +29 -0
  248. data/test/fixtures/movies.yml +7 -0
  249. data/test/fixtures/naked/csv/accounts.csv +1 -0
  250. data/test/fixtures/naked/yml/accounts.yml +1 -0
  251. data/test/fixtures/naked/yml/companies.yml +1 -0
  252. data/test/fixtures/naked/yml/courses.yml +1 -0
  253. data/test/fixtures/organizations.yml +5 -0
  254. data/test/fixtures/other_topics.yml +42 -0
  255. data/test/fixtures/owners.yml +9 -0
  256. data/test/fixtures/parrots.yml +27 -0
  257. data/test/fixtures/parrots_pirates.yml +7 -0
  258. data/test/fixtures/people.yml +24 -0
  259. data/test/fixtures/peoples_treasures.yml +3 -0
  260. data/test/fixtures/pets.yml +19 -0
  261. data/test/fixtures/pirates.yml +12 -0
  262. data/test/fixtures/posts.yml +80 -0
  263. data/test/fixtures/price_estimates.yml +7 -0
  264. data/test/fixtures/products.yml +4 -0
  265. data/test/fixtures/projects.yml +7 -0
  266. data/test/fixtures/randomly_named_a9.yml +7 -0
  267. data/test/fixtures/ratings.yml +14 -0
  268. data/test/fixtures/readers.yml +11 -0
  269. data/test/fixtures/references.yml +17 -0
  270. data/test/fixtures/reserved_words/distinct.yml +5 -0
  271. data/test/fixtures/reserved_words/distinct_select.yml +11 -0
  272. data/test/fixtures/reserved_words/group.yml +14 -0
  273. data/test/fixtures/reserved_words/select.yml +8 -0
  274. data/test/fixtures/reserved_words/values.yml +7 -0
  275. data/test/fixtures/ships.yml +6 -0
  276. data/test/fixtures/speedometers.yml +8 -0
  277. data/test/fixtures/sponsors.yml +12 -0
  278. data/test/fixtures/string_key_objects.yml +7 -0
  279. data/test/fixtures/subscribers.yml +11 -0
  280. data/test/fixtures/subscriptions.yml +12 -0
  281. data/test/fixtures/taggings.yml +78 -0
  282. data/test/fixtures/tags.yml +11 -0
  283. data/test/fixtures/tasks.yml +7 -0
  284. data/test/fixtures/teapots.yml +3 -0
  285. data/test/fixtures/to_be_linked/accounts.yml +2 -0
  286. data/test/fixtures/to_be_linked/users.yml +10 -0
  287. data/test/fixtures/topics.yml +49 -0
  288. data/test/fixtures/toys.yml +14 -0
  289. data/test/fixtures/traffic_lights.yml +10 -0
  290. data/test/fixtures/treasures.yml +10 -0
  291. data/test/fixtures/uuid_children.yml +3 -0
  292. data/test/fixtures/uuid_parents.yml +2 -0
  293. data/test/fixtures/variants.yml +4 -0
  294. data/test/fixtures/vegetables.yml +20 -0
  295. data/test/fixtures/vertices.yml +4 -0
  296. data/test/fixtures/warehouse_things.yml +3 -0
  297. data/test/fixtures/zines.yml +5 -0
  298. data/test/ibm_db_test.rb +24 -24
  299. data/test/migrations/10_urban/9_add_expressions.rb +11 -0
  300. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -0
  301. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -0
  302. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -0
  303. data/test/migrations/missing/1_people_have_last_names.rb +9 -0
  304. data/test/migrations/missing/3_we_need_reminders.rb +12 -0
  305. data/test/migrations/missing/4_innocent_jointable.rb +12 -0
  306. data/test/migrations/rename/1_we_need_things.rb +11 -0
  307. data/test/migrations/rename/2_rename_things.rb +9 -0
  308. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -0
  309. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -0
  310. data/test/migrations/to_copy2/1_create_articles.rb +7 -0
  311. data/test/migrations/to_copy2/2_create_comments.rb +7 -0
  312. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -0
  313. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -0
  314. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -0
  315. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -0
  316. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -0
  317. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -0
  318. data/test/migrations/valid/2_we_need_reminders.rb +12 -0
  319. data/test/migrations/valid/3_innocent_jointable.rb +12 -0
  320. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -0
  321. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -0
  322. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -0
  323. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -0
  324. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -0
  325. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -0
  326. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -0
  327. data/test/models/admin.rb +5 -0
  328. data/test/models/admin/account.rb +3 -0
  329. data/test/models/admin/randomly_named_c1.rb +3 -0
  330. data/test/models/admin/user.rb +40 -0
  331. data/test/models/aircraft.rb +4 -0
  332. data/test/models/arunit2_model.rb +3 -0
  333. data/test/models/author.rb +212 -0
  334. data/test/models/auto_id.rb +4 -0
  335. data/test/models/autoloadable/extra_firm.rb +2 -0
  336. data/test/models/binary.rb +2 -0
  337. data/test/models/bird.rb +12 -0
  338. data/test/models/book.rb +18 -0
  339. data/test/models/boolean.rb +2 -0
  340. data/test/models/bulb.rb +51 -0
  341. data/test/models/cake_designer.rb +3 -0
  342. data/test/models/car.rb +26 -0
  343. data/test/models/carrier.rb +2 -0
  344. data/test/models/categorization.rb +19 -0
  345. data/test/models/category.rb +35 -0
  346. data/test/models/chef.rb +3 -0
  347. data/test/models/citation.rb +3 -0
  348. data/test/models/club.rb +23 -0
  349. data/test/models/college.rb +10 -0
  350. data/test/models/column.rb +3 -0
  351. data/test/models/column_name.rb +3 -0
  352. data/test/models/comment.rb +64 -0
  353. data/test/models/company.rb +225 -0
  354. data/test/models/company_in_module.rb +98 -0
  355. data/test/models/computer.rb +3 -0
  356. data/test/models/contact.rb +41 -0
  357. data/test/models/contract.rb +20 -0
  358. data/test/models/country.rb +7 -0
  359. data/test/models/course.rb +6 -0
  360. data/test/models/customer.rb +77 -0
  361. data/test/models/customer_carrier.rb +14 -0
  362. data/test/models/dashboard.rb +3 -0
  363. data/test/models/default.rb +2 -0
  364. data/test/models/department.rb +4 -0
  365. data/test/models/developer.rb +252 -0
  366. data/test/models/dog.rb +5 -0
  367. data/test/models/dog_lover.rb +5 -0
  368. data/test/models/doubloon.rb +12 -0
  369. data/test/models/drink_designer.rb +3 -0
  370. data/test/models/edge.rb +5 -0
  371. data/test/models/electron.rb +5 -0
  372. data/test/models/engine.rb +4 -0
  373. data/test/models/entrant.rb +3 -0
  374. data/test/models/essay.rb +5 -0
  375. data/test/models/event.rb +3 -0
  376. data/test/models/eye.rb +37 -0
  377. data/test/models/face.rb +9 -0
  378. data/test/models/friendship.rb +6 -0
  379. data/test/models/guid.rb +2 -0
  380. data/test/models/hotel.rb +6 -0
  381. data/test/models/image.rb +3 -0
  382. data/test/models/interest.rb +5 -0
  383. data/test/models/invoice.rb +4 -0
  384. data/test/models/item.rb +7 -0
  385. data/test/models/job.rb +7 -0
  386. data/test/models/joke.rb +7 -0
  387. data/test/models/keyboard.rb +3 -0
  388. data/test/models/legacy_thing.rb +3 -0
  389. data/test/models/lesson.rb +11 -0
  390. data/test/models/line_item.rb +3 -0
  391. data/test/models/liquid.rb +4 -0
  392. data/test/models/man.rb +11 -0
  393. data/test/models/matey.rb +4 -0
  394. data/test/models/member.rb +41 -0
  395. data/test/models/member_detail.rb +7 -0
  396. data/test/models/member_type.rb +3 -0
  397. data/test/models/membership.rb +35 -0
  398. data/test/models/minimalistic.rb +2 -0
  399. data/test/models/minivan.rb +9 -0
  400. data/test/models/mixed_case_monkey.rb +3 -0
  401. data/test/models/molecule.rb +6 -0
  402. data/test/models/movie.rb +5 -0
  403. data/test/models/order.rb +4 -0
  404. data/test/models/organization.rb +14 -0
  405. data/test/models/owner.rb +34 -0
  406. data/test/models/parrot.rb +29 -0
  407. data/test/models/person.rb +143 -0
  408. data/test/models/personal_legacy_thing.rb +4 -0
  409. data/test/models/pet.rb +15 -0
  410. data/test/models/pirate.rb +92 -0
  411. data/test/models/possession.rb +3 -0
  412. data/test/models/post.rb +264 -0
  413. data/test/models/price_estimate.rb +4 -0
  414. data/test/models/professor.rb +5 -0
  415. data/test/models/project.rb +29 -0
  416. data/test/models/publisher.rb +2 -0
  417. data/test/models/publisher/article.rb +4 -0
  418. data/test/models/publisher/magazine.rb +3 -0
  419. data/test/models/randomly_named_c1.rb +3 -0
  420. data/test/models/rating.rb +4 -0
  421. data/test/models/reader.rb +23 -0
  422. data/test/models/record.rb +2 -0
  423. data/test/models/reference.rb +22 -0
  424. data/test/models/reply.rb +61 -0
  425. data/test/models/ship.rb +33 -0
  426. data/test/models/ship_part.rb +8 -0
  427. data/test/models/shop.rb +17 -0
  428. data/test/models/shop_account.rb +6 -0
  429. data/test/models/speedometer.rb +6 -0
  430. data/test/models/sponsor.rb +7 -0
  431. data/test/models/string_key_object.rb +3 -0
  432. data/test/models/student.rb +4 -0
  433. data/test/models/subject.rb +16 -0
  434. data/test/models/subscriber.rb +8 -0
  435. data/test/models/subscription.rb +4 -0
  436. data/test/models/tag.rb +7 -0
  437. data/test/models/tagging.rb +13 -0
  438. data/test/models/task.rb +5 -0
  439. data/test/models/topic.rb +124 -0
  440. data/test/models/toy.rb +6 -0
  441. data/test/models/traffic_light.rb +4 -0
  442. data/test/models/treasure.rb +14 -0
  443. data/test/models/treaty.rb +7 -0
  444. data/test/models/tyre.rb +11 -0
  445. data/test/models/uuid_child.rb +3 -0
  446. data/test/models/uuid_parent.rb +3 -0
  447. data/test/models/vegetables.rb +24 -0
  448. data/test/models/vehicle.rb +7 -0
  449. data/test/models/vertex.rb +9 -0
  450. data/test/models/warehouse_thing.rb +5 -5
  451. data/test/models/wheel.rb +3 -0
  452. data/test/models/without_table.rb +3 -0
  453. data/test/models/zine.rb +3 -0
  454. data/test/schema/mysql2_specific_schema.rb +58 -0
  455. data/test/schema/mysql_specific_schema.rb +70 -0
  456. data/test/schema/oracle_specific_schema.rb +43 -0
  457. data/test/schema/postgresql_specific_schema.rb +202 -0
  458. data/test/schema/schema.rb +938 -751
  459. data/test/schema/sqlite_specific_schema.rb +22 -0
  460. data/test/support/config.rb +43 -0
  461. data/test/support/connection.rb +22 -0
  462. data/test/support/connection_helper.rb +14 -0
  463. data/test/support/ddl_helper.rb +8 -0
  464. data/test/support/schema_dumping_helper.rb +20 -0
  465. metadata +444 -18
@@ -0,0 +1,22 @@
1
+ require "cases/helper"
2
+
3
+ class TestAdapterWithInvalidConnection < ActiveRecord::TestCase
4
+ self.use_transactional_fixtures = false
5
+
6
+ class Bird < ActiveRecord::Base
7
+ end
8
+
9
+ def setup
10
+ # Can't just use current adapter; sqlite3 will create a database
11
+ # file on the fly.
12
+ Bird.establish_connection adapter: 'mysql', database: 'i_do_not_exist'
13
+ end
14
+
15
+ teardown do
16
+ Bird.remove_connection
17
+ end
18
+
19
+ test "inspect on Model class does not raise" do
20
+ assert_equal "#{Bird.name} (call '#{Bird.name}.connection' to establish a connection)", Bird.inspect
21
+ end
22
+ end
@@ -0,0 +1,32 @@
1
+ require 'cases/helper'
2
+ require 'models/topic'
3
+
4
+ class InvalidDateTest < ActiveRecord::TestCase
5
+ def test_assign_valid_dates
6
+ valid_dates = [[2007, 11, 30], [1993, 2, 28], [2008, 2, 29]]
7
+
8
+ invalid_dates = [[2007, 11, 31], [1993, 2, 29], [2007, 2, 29]]
9
+
10
+ valid_dates.each do |date_src|
11
+ topic = Topic.new("last_read(1i)" => date_src[0].to_s, "last_read(2i)" => date_src[1].to_s, "last_read(3i)" => date_src[2].to_s)
12
+ # Oracle DATE columns are datetime columns and Oracle adapter returns Time value
13
+ if current_adapter?(:OracleAdapter)
14
+ assert_equal(topic.last_read.to_date, Date.new(*date_src))
15
+ else
16
+ assert_equal(topic.last_read, Date.new(*date_src))
17
+ end
18
+ end
19
+
20
+ invalid_dates.each do |date_src|
21
+ assert_nothing_raised do
22
+ topic = Topic.new({"last_read(1i)" => date_src[0].to_s, "last_read(2i)" => date_src[1].to_s, "last_read(3i)" => date_src[2].to_s})
23
+ # Oracle DATE columns are datetime columns and Oracle adapter returns Time value
24
+ if current_adapter?(:OracleAdapter)
25
+ assert_equal(topic.last_read.to_date, Time.local(*date_src).to_date, "The date should be modified according to the behavior of the Time object")
26
+ else
27
+ assert_equal(topic.last_read, Time.local(*date_src).to_date, "The date should be modified according to the behavior of the Time object")
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,295 @@
1
+ require "cases/helper"
2
+
3
+ module ActiveRecord
4
+ class InvertibleMigrationTest < ActiveRecord::TestCase
5
+ class SilentMigration < ActiveRecord::Migration
6
+ def write(text = '')
7
+ # sssshhhhh!!
8
+ end
9
+ end
10
+
11
+ class InvertibleMigration < SilentMigration
12
+ def change
13
+ create_table("horses") do |t|
14
+ t.column :content, :text
15
+ t.column :remind_at, :datetime
16
+ end
17
+ end
18
+ end
19
+
20
+ class InvertibleRevertMigration < SilentMigration
21
+ def change
22
+ revert do
23
+ create_table("horses") do |t|
24
+ t.column :content, :text
25
+ t.column :remind_at, :datetime
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ class InvertibleByPartsMigration < SilentMigration
32
+ attr_writer :test
33
+ def change
34
+ create_table("new_horses") do |t|
35
+ t.column :breed, :string
36
+ end
37
+ reversible do |dir|
38
+ @test.yield :both
39
+ dir.up { @test.yield :up }
40
+ dir.down { @test.yield :down }
41
+ end
42
+ revert do
43
+ create_table("horses") do |t|
44
+ t.column :content, :text
45
+ t.column :remind_at, :datetime
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ class NonInvertibleMigration < SilentMigration
52
+ def change
53
+ create_table("horses") do |t|
54
+ t.column :content, :text
55
+ t.column :remind_at, :datetime
56
+ end
57
+ remove_column "horses", :content
58
+ end
59
+ end
60
+
61
+ class RemoveIndexMigration1 < SilentMigration
62
+ def self.up
63
+ create_table("horses") do |t|
64
+ t.column :name, :string
65
+ t.column :color, :string
66
+ t.index [:name, :color]
67
+ end
68
+ end
69
+ end
70
+
71
+ class RemoveIndexMigration2 < SilentMigration
72
+ def change
73
+ change_table("horses") do |t|
74
+ t.remove_index [:name, :color]
75
+ end
76
+ end
77
+ end
78
+
79
+ class LegacyMigration < ActiveRecord::Migration
80
+ def self.up
81
+ create_table("horses") do |t|
82
+ t.column :content, :text
83
+ t.column :remind_at, :datetime
84
+ end
85
+ end
86
+
87
+ def self.down
88
+ drop_table("horses")
89
+ end
90
+ end
91
+
92
+ class RevertWholeMigration < SilentMigration
93
+ def initialize(name = self.class.name, version = nil, migration)
94
+ @migration = migration
95
+ super(name, version)
96
+ end
97
+
98
+ def change
99
+ revert @migration
100
+ end
101
+ end
102
+
103
+ class NestedRevertWholeMigration < RevertWholeMigration
104
+ def change
105
+ revert { super }
106
+ end
107
+ end
108
+
109
+ class RevertNamedIndexMigration1 < SilentMigration
110
+ def change
111
+ create_table("horses") do |t|
112
+ t.column :content, :string
113
+ t.column :remind_at, :datetime
114
+ end
115
+ add_index :horses, :content
116
+ end
117
+ end
118
+
119
+ class RevertNamedIndexMigration2 < SilentMigration
120
+ def change
121
+ add_index :horses, :content, name: "horses_index_named"
122
+ end
123
+ end
124
+
125
+ setup do
126
+ @verbose_was, ActiveRecord::Migration.verbose = ActiveRecord::Migration.verbose, false
127
+ end
128
+
129
+ teardown do
130
+ %w[horses new_horses].each do |table|
131
+ if ActiveRecord::Base.connection.table_exists?(table)
132
+ ActiveRecord::Base.connection.drop_table(table)
133
+ end
134
+ end
135
+ ActiveRecord::Migration.verbose = @verbose_was
136
+ end
137
+
138
+ def test_no_reverse
139
+ migration = NonInvertibleMigration.new
140
+ migration.migrate(:up)
141
+ assert_raises(IrreversibleMigration) do
142
+ migration.migrate(:down)
143
+ end
144
+ end
145
+
146
+ def test_exception_on_removing_index_without_column_option
147
+ RemoveIndexMigration1.new.migrate(:up)
148
+ migration = RemoveIndexMigration2.new
149
+ migration.migrate(:up)
150
+
151
+ assert_raises(IrreversibleMigration) do
152
+ migration.migrate(:down)
153
+ end
154
+ end
155
+
156
+ def test_migrate_up
157
+ migration = InvertibleMigration.new
158
+ migration.migrate(:up)
159
+ assert migration.connection.table_exists?("horses"), "horses should exist"
160
+ end
161
+
162
+ def test_migrate_down
163
+ migration = InvertibleMigration.new
164
+ migration.migrate :up
165
+ migration.migrate :down
166
+ assert !migration.connection.table_exists?("horses")
167
+ end
168
+
169
+ def test_migrate_revert
170
+ migration = InvertibleMigration.new
171
+ revert = InvertibleRevertMigration.new
172
+ migration.migrate :up
173
+ revert.migrate :up
174
+ assert !migration.connection.table_exists?("horses")
175
+ revert.migrate :down
176
+ assert migration.connection.table_exists?("horses")
177
+ migration.migrate :down
178
+ assert !migration.connection.table_exists?("horses")
179
+ end
180
+
181
+ def test_migrate_revert_by_part
182
+ InvertibleMigration.new.migrate :up
183
+ received = []
184
+ migration = InvertibleByPartsMigration.new
185
+ migration.test = ->(dir){
186
+ assert migration.connection.table_exists?("horses")
187
+ assert migration.connection.table_exists?("new_horses")
188
+ received << dir
189
+ }
190
+ migration.migrate :up
191
+ assert_equal [:both, :up], received
192
+ assert !migration.connection.table_exists?("horses")
193
+ assert migration.connection.table_exists?("new_horses")
194
+ migration.migrate :down
195
+ assert_equal [:both, :up, :both, :down], received
196
+ assert migration.connection.table_exists?("horses")
197
+ assert !migration.connection.table_exists?("new_horses")
198
+ end
199
+
200
+ def test_migrate_revert_whole_migration
201
+ migration = InvertibleMigration.new
202
+ [LegacyMigration, InvertibleMigration].each do |klass|
203
+ revert = RevertWholeMigration.new(klass)
204
+ migration.migrate :up
205
+ revert.migrate :up
206
+ assert !migration.connection.table_exists?("horses")
207
+ revert.migrate :down
208
+ assert migration.connection.table_exists?("horses")
209
+ migration.migrate :down
210
+ assert !migration.connection.table_exists?("horses")
211
+ end
212
+ end
213
+
214
+ def test_migrate_nested_revert_whole_migration
215
+ revert = NestedRevertWholeMigration.new(InvertibleRevertMigration)
216
+ revert.migrate :down
217
+ assert revert.connection.table_exists?("horses")
218
+ revert.migrate :up
219
+ assert !revert.connection.table_exists?("horses")
220
+ end
221
+
222
+ def test_revert_order
223
+ block = Proc.new{|t| t.string :name }
224
+ recorder = ActiveRecord::Migration::CommandRecorder.new(ActiveRecord::Base.connection)
225
+ recorder.instance_eval do
226
+ create_table("apples", &block)
227
+ revert do
228
+ create_table("bananas", &block)
229
+ revert do
230
+ create_table("clementines")
231
+ create_table("dates")
232
+ end
233
+ create_table("elderberries")
234
+ end
235
+ revert do
236
+ create_table("figs")
237
+ create_table("grapes")
238
+ end
239
+ end
240
+ assert_equal [[:create_table, ["apples"], block], [:drop_table, ["elderberries"], nil],
241
+ [:create_table, ["clementines"], nil], [:create_table, ["dates"], nil],
242
+ [:drop_table, ["bananas"], block], [:drop_table, ["grapes"], nil],
243
+ [:drop_table, ["figs"], nil]], recorder.commands
244
+ end
245
+
246
+ def test_legacy_up
247
+ LegacyMigration.migrate :up
248
+ assert ActiveRecord::Base.connection.table_exists?("horses"), "horses should exist"
249
+ end
250
+
251
+ def test_legacy_down
252
+ LegacyMigration.migrate :up
253
+ LegacyMigration.migrate :down
254
+ assert !ActiveRecord::Base.connection.table_exists?("horses"), "horses should not exist"
255
+ end
256
+
257
+ def test_up
258
+ LegacyMigration.up
259
+ assert ActiveRecord::Base.connection.table_exists?("horses"), "horses should exist"
260
+ end
261
+
262
+ def test_down
263
+ LegacyMigration.up
264
+ LegacyMigration.down
265
+ assert !ActiveRecord::Base.connection.table_exists?("horses"), "horses should not exist"
266
+ end
267
+
268
+ def test_migrate_down_with_table_name_prefix
269
+ ActiveRecord::Base.table_name_prefix = 'p_'
270
+ ActiveRecord::Base.table_name_suffix = '_s'
271
+ migration = InvertibleMigration.new
272
+ migration.migrate(:up)
273
+ assert_nothing_raised { migration.migrate(:down) }
274
+ assert !ActiveRecord::Base.connection.table_exists?("p_horses_s"), "p_horses_s should not exist"
275
+ ensure
276
+ ActiveRecord::Base.table_name_prefix = ActiveRecord::Base.table_name_suffix = ''
277
+ end
278
+
279
+ # MySQL 5.7 and Oracle do not allow to create duplicate indexes on the same columns
280
+ unless current_adapter?(:MysqlAdapter, :Mysql2Adapter, :OracleAdapter)
281
+ def test_migrate_revert_add_index_with_name
282
+ RevertNamedIndexMigration1.new.migrate(:up)
283
+ RevertNamedIndexMigration2.new.migrate(:up)
284
+ RevertNamedIndexMigration2.new.migrate(:down)
285
+
286
+ connection = ActiveRecord::Base.connection
287
+ assert connection.index_exists?(:horses, :content),
288
+ "index on content should exist"
289
+ assert !connection.index_exists?(:horses, :content, name: "horses_index_named"),
290
+ "horses_index_named index should not exist"
291
+ end
292
+ end
293
+
294
+ end
295
+ end
@@ -0,0 +1,302 @@
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