ibm_db 3.0.4-x86-mingw32 → 3.0.5-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (463) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -1
  3. data/LICENSE +1 -1
  4. data/MANIFEST +14 -14
  5. data/README +225 -225
  6. data/ext/Makefile.nt32 +181 -181
  7. data/ext/Makefile.nt32.191 +212 -212
  8. data/ext/extconf.rb +291 -291
  9. data/ext/ibm_db.c +11887 -11884
  10. data/ext/ruby_ibm_db.h +241 -241
  11. data/ext/ruby_ibm_db_cli.c +866 -866
  12. data/ext/ruby_ibm_db_cli.h +500 -500
  13. data/init.rb +41 -41
  14. data/lib/IBM_DB.rb +27 -27
  15. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3177 -3177
  16. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +1 -1
  17. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  18. data/lib/mswin32/ibm_db.rb +122 -122
  19. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  20. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  21. data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
  22. data/test/active_record/connection_adapters/fake_adapter.rb +46 -46
  23. data/test/assets/example.log +1 -1
  24. data/test/assets/test.txt +1 -1
  25. data/test/cases/adapter_test.rb +276 -261
  26. data/test/cases/aggregations_test.rb +158 -158
  27. data/test/cases/ar_schema_test.rb +161 -161
  28. data/test/cases/associations/association_scope_test.rb +21 -21
  29. data/test/cases/associations/belongs_to_associations_test.rb +1029 -1029
  30. data/test/cases/associations/callbacks_test.rb +192 -192
  31. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  32. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +26 -26
  33. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  34. data/test/cases/associations/eager_load_nested_include_test.rb +128 -128
  35. data/test/cases/associations/eager_singularization_test.rb +148 -148
  36. data/test/cases/associations/eager_test.rb +1429 -1411
  37. data/test/cases/associations/extension_test.rb +82 -82
  38. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +972 -932
  39. data/test/cases/associations/has_many_associations_test.rb +2182 -2162
  40. data/test/cases/associations/has_many_through_associations_test.rb +1204 -1204
  41. data/test/cases/associations/has_one_associations_test.rb +610 -610
  42. data/test/cases/associations/has_one_through_associations_test.rb +380 -380
  43. data/test/cases/associations/inner_join_association_test.rb +139 -139
  44. data/test/cases/associations/inverse_associations_test.rb +706 -693
  45. data/test/cases/associations/join_model_test.rb +754 -754
  46. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  47. data/test/cases/associations/required_test.rb +82 -82
  48. data/test/cases/associations_test.rb +380 -380
  49. data/test/cases/attribute_decorators_test.rb +125 -125
  50. data/test/cases/attribute_methods/read_test.rb +60 -60
  51. data/test/cases/attribute_methods/serialization_test.rb +29 -29
  52. data/test/cases/attribute_methods_test.rb +952 -952
  53. data/test/cases/attribute_set_test.rb +210 -200
  54. data/test/cases/attribute_test.rb +180 -180
  55. data/test/cases/attributes_test.rb +136 -136
  56. data/test/cases/autosave_association_test.rb +1595 -1595
  57. data/test/cases/base_test.rb +1664 -1638
  58. data/test/cases/batches_test.rb +212 -212
  59. data/test/cases/binary_test.rb +52 -52
  60. data/test/cases/bind_parameter_test.rb +100 -100
  61. data/test/cases/calculations_test.rb +646 -646
  62. data/test/cases/callbacks_test.rb +543 -543
  63. data/test/cases/clone_test.rb +40 -40
  64. data/test/cases/coders/yaml_column_test.rb +63 -63
  65. data/test/cases/column_alias_test.rb +17 -17
  66. data/test/cases/column_definition_test.rb +123 -123
  67. data/test/cases/connection_adapters/adapter_leasing_test.rb +54 -54
  68. data/test/cases/connection_adapters/connection_handler_test.rb +53 -53
  69. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  70. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +293 -293
  71. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +65 -65
  72. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  73. data/test/cases/connection_adapters/schema_cache_test.rb +56 -56
  74. data/test/cases/connection_adapters/type_lookup_test.rb +110 -110
  75. data/test/cases/connection_management_test.rb +122 -122
  76. data/test/cases/connection_pool_test.rb +346 -346
  77. data/test/cases/connection_specification/resolver_test.rb +116 -116
  78. data/test/cases/core_test.rb +112 -112
  79. data/test/cases/counter_cache_test.rb +209 -209
  80. data/test/cases/custom_locking_test.rb +17 -17
  81. data/test/cases/database_statements_test.rb +19 -19
  82. data/test/cases/date_time_test.rb +61 -61
  83. data/test/cases/defaults_test.rb +223 -223
  84. data/test/cases/dirty_test.rb +785 -775
  85. data/test/cases/disconnected_test.rb +28 -28
  86. data/test/cases/dup_test.rb +157 -157
  87. data/test/cases/enum_test.rb +290 -290
  88. data/test/cases/explain_subscriber_test.rb +64 -64
  89. data/test/cases/explain_test.rb +76 -76
  90. data/test/cases/finder_respond_to_test.rb +60 -60
  91. data/test/cases/finder_test.rb +1169 -1166
  92. data/test/cases/fixture_set/file_test.rb +138 -138
  93. data/test/cases/fixtures_test.rb +908 -897
  94. data/test/cases/forbidden_attributes_protection_test.rb +99 -99
  95. data/test/cases/habtm_destroy_order_test.rb +61 -61
  96. data/test/cases/helper.rb +210 -210
  97. data/test/cases/hot_compatibility_test.rb +54 -54
  98. data/test/cases/i18n_test.rb +45 -45
  99. data/test/cases/inheritance_test.rb +375 -375
  100. data/test/cases/integration_test.rb +139 -139
  101. data/test/cases/invalid_connection_test.rb +22 -22
  102. data/test/cases/invalid_date_test.rb +32 -32
  103. data/test/cases/invertible_migration_test.rb +295 -295
  104. data/test/cases/json_serialization_test.rb +302 -302
  105. data/test/cases/locking_test.rb +477 -477
  106. data/test/cases/log_subscriber_test.rb +136 -136
  107. data/test/cases/migration/change_schema_test - Copy.rb +448 -448
  108. data/test/cases/migration/change_schema_test.rb +512 -472
  109. data/test/cases/migration/change_table_test.rb +224 -224
  110. data/test/cases/migration/column_attributes_test.rb +192 -192
  111. data/test/cases/migration/column_positioning_test.rb +56 -56
  112. data/test/cases/migration/columns_test.rb +304 -304
  113. data/test/cases/migration/command_recorder_test.rb +305 -305
  114. data/test/cases/migration/create_join_table_test.rb +148 -148
  115. data/test/cases/migration/foreign_key_test - Changed.rb +325 -325
  116. data/test/cases/migration/foreign_key_test.rb +328 -360
  117. data/test/cases/migration/helper.rb +39 -39
  118. data/test/cases/migration/index_test.rb +216 -216
  119. data/test/cases/migration/logger_test.rb +36 -36
  120. data/test/cases/migration/pending_migrations_test.rb +53 -53
  121. data/test/cases/migration/references_foreign_key_test.rb +169 -214
  122. data/test/cases/migration/references_index_test.rb +101 -101
  123. data/test/cases/migration/references_statements_test.rb +116 -116
  124. data/test/cases/migration/rename_table_test.rb +93 -93
  125. data/test/cases/migration/table_and_index_test.rb +24 -24
  126. data/test/cases/migration_test.rb +959 -959
  127. data/test/cases/migrator_test.rb +388 -388
  128. data/test/cases/mixin_test.rb +70 -70
  129. data/test/cases/modules_test.rb +173 -173
  130. data/test/cases/multiparameter_attributes_test.rb +350 -350
  131. data/test/cases/multiple_db_test.rb +115 -115
  132. data/test/cases/nested_attributes_test.rb +1070 -1057
  133. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  134. data/test/cases/persistence_test.rb +909 -909
  135. data/test/cases/pooled_connections_test.rb +81 -81
  136. data/test/cases/primary_keys_test.rb +237 -237
  137. data/test/cases/query_cache_test.rb +326 -326
  138. data/test/cases/quoting_test.rb +156 -156
  139. data/test/cases/readonly_test.rb +118 -118
  140. data/test/cases/reaper_test.rb +85 -85
  141. data/test/cases/reflection_test.rb +463 -454
  142. data/test/cases/relation/delegation_test.rb +68 -68
  143. data/test/cases/relation/merging_test.rb +161 -161
  144. data/test/cases/relation/mutation_test.rb +165 -165
  145. data/test/cases/relation/predicate_builder_test.rb +14 -14
  146. data/test/cases/relation/where_chain_test.rb +181 -181
  147. data/test/cases/relation/where_test.rb +300 -300
  148. data/test/cases/relation/where_test2.rb +36 -36
  149. data/test/cases/relation_test.rb +319 -297
  150. data/test/cases/relations_test.rb +1815 -1815
  151. data/test/cases/reload_models_test.rb +22 -22
  152. data/test/cases/result_test.rb +80 -80
  153. data/test/cases/sanitize_test.rb +83 -83
  154. data/test/cases/schema_dumper_test.rb +463 -463
  155. data/test/cases/scoping/default_scoping_test.rb +454 -454
  156. data/test/cases/scoping/named_scoping_test.rb +524 -524
  157. data/test/cases/scoping/relation_scoping_test.rb +357 -357
  158. data/test/cases/serialization_test.rb +104 -104
  159. data/test/cases/serialized_attribute_test.rb +277 -277
  160. data/test/cases/statement_cache_test.rb +98 -98
  161. data/test/cases/store_test.rb +194 -194
  162. data/test/cases/tasks/database_tasks_test.rb +398 -396
  163. data/test/cases/tasks/mysql_rake_test.rb +324 -311
  164. data/test/cases/tasks/postgresql_rake_test.rb +250 -245
  165. data/test/cases/tasks/sqlite_rake_test.rb +193 -193
  166. data/test/cases/test_case.rb +123 -123
  167. data/test/cases/timestamp_test.rb +467 -468
  168. data/test/cases/transaction_callbacks_test.rb +452 -452
  169. data/test/cases/transaction_isolation_test.rb +106 -106
  170. data/test/cases/transactions_test.rb +817 -817
  171. data/test/cases/type/decimal_test.rb +56 -51
  172. data/test/cases/type/integer_test.rb +121 -121
  173. data/test/cases/type/string_test.rb +36 -36
  174. data/test/cases/type/type_map_test.rb +177 -177
  175. data/test/cases/type/unsigned_integer_test.rb +18 -18
  176. data/test/cases/types_test.rb +141 -141
  177. data/test/cases/unconnected_test.rb +33 -33
  178. data/test/cases/validations/association_validation_test.rb +86 -86
  179. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  180. data/test/cases/validations/i18n_validation_test.rb +90 -90
  181. data/test/cases/validations/length_validation_test.rb +47 -47
  182. data/test/cases/validations/presence_validation_test.rb +68 -68
  183. data/test/cases/validations/uniqueness_validation_test.rb +457 -434
  184. data/test/cases/validations_repair_helper.rb +23 -23
  185. data/test/cases/validations_test.rb +165 -165
  186. data/test/cases/view_test.rb +119 -113
  187. data/test/cases/xml_serialization_test.rb +457 -457
  188. data/test/cases/yaml_serialization_test.rb +126 -86
  189. data/test/config.rb +5 -5
  190. data/test/config.yml +154 -154
  191. data/test/connections/native_ibm_db/connection.rb +43 -43
  192. data/test/fixtures/accounts.yml +29 -29
  193. data/test/fixtures/admin/accounts.yml +2 -2
  194. data/test/fixtures/admin/randomly_named_a9.yml +7 -7
  195. data/test/fixtures/admin/randomly_named_b0.yml +7 -7
  196. data/test/fixtures/admin/users.yml +10 -10
  197. data/test/fixtures/author_addresses.yml +17 -17
  198. data/test/fixtures/author_favorites.yml +3 -3
  199. data/test/fixtures/authors.yml +23 -23
  200. data/test/fixtures/binaries.yml +133 -133
  201. data/test/fixtures/books.yml +11 -11
  202. data/test/fixtures/bulbs.yml +5 -5
  203. data/test/fixtures/cars.yml +9 -9
  204. data/test/fixtures/categories.yml +19 -19
  205. data/test/fixtures/categories/special_categories.yml +9 -9
  206. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  207. data/test/fixtures/categories_ordered.yml +7 -7
  208. data/test/fixtures/categories_posts.yml +31 -31
  209. data/test/fixtures/categorizations.yml +23 -23
  210. data/test/fixtures/clubs.yml +8 -8
  211. data/test/fixtures/collections.yml +3 -3
  212. data/test/fixtures/colleges.yml +3 -3
  213. data/test/fixtures/comments.yml +65 -65
  214. data/test/fixtures/companies.yml +67 -67
  215. data/test/fixtures/computers.yml +10 -10
  216. data/test/fixtures/courses.yml +8 -8
  217. data/test/fixtures/customers.yml +25 -25
  218. data/test/fixtures/dashboards.yml +6 -6
  219. data/test/fixtures/developers.yml +21 -21
  220. data/test/fixtures/developers_projects.yml +16 -16
  221. data/test/fixtures/dog_lovers.yml +7 -7
  222. data/test/fixtures/dogs.yml +4 -4
  223. data/test/fixtures/doubloons.yml +3 -3
  224. data/test/fixtures/edges.yml +5 -5
  225. data/test/fixtures/entrants.yml +14 -14
  226. data/test/fixtures/essays.yml +6 -6
  227. data/test/fixtures/faces.yml +11 -11
  228. data/test/fixtures/fk_test_has_fk.yml +3 -3
  229. data/test/fixtures/fk_test_has_pk.yml +1 -1
  230. data/test/fixtures/friendships.yml +4 -4
  231. data/test/fixtures/funny_jokes.yml +10 -10
  232. data/test/fixtures/interests.yml +33 -33
  233. data/test/fixtures/items.yml +3 -3
  234. data/test/fixtures/jobs.yml +7 -7
  235. data/test/fixtures/legacy_things.yml +3 -3
  236. data/test/fixtures/mateys.yml +4 -4
  237. data/test/fixtures/member_details.yml +8 -8
  238. data/test/fixtures/member_types.yml +6 -6
  239. data/test/fixtures/members.yml +11 -11
  240. data/test/fixtures/memberships.yml +34 -34
  241. data/test/fixtures/men.yml +5 -5
  242. data/test/fixtures/minimalistics.yml +2 -2
  243. data/test/fixtures/minivans.yml +5 -5
  244. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  245. data/test/fixtures/mixins.yml +29 -29
  246. data/test/fixtures/movies.yml +7 -7
  247. data/test/fixtures/naked/csv/accounts.csv +1 -1
  248. data/test/fixtures/naked/yml/accounts.yml +1 -1
  249. data/test/fixtures/naked/yml/companies.yml +1 -1
  250. data/test/fixtures/naked/yml/courses.yml +1 -1
  251. data/test/fixtures/organizations.yml +5 -5
  252. data/test/fixtures/other_topics.yml +42 -42
  253. data/test/fixtures/owners.yml +9 -9
  254. data/test/fixtures/parrots.yml +27 -27
  255. data/test/fixtures/parrots_pirates.yml +7 -7
  256. data/test/fixtures/people.yml +24 -24
  257. data/test/fixtures/peoples_treasures.yml +3 -3
  258. data/test/fixtures/pets.yml +19 -19
  259. data/test/fixtures/pirates.yml +12 -12
  260. data/test/fixtures/posts.yml +80 -80
  261. data/test/fixtures/price_estimates.yml +7 -7
  262. data/test/fixtures/products.yml +4 -4
  263. data/test/fixtures/projects.yml +7 -7
  264. data/test/fixtures/randomly_named_a9.yml +7 -7
  265. data/test/fixtures/ratings.yml +14 -14
  266. data/test/fixtures/readers.yml +11 -11
  267. data/test/fixtures/references.yml +17 -17
  268. data/test/fixtures/reserved_words/distinct.yml +5 -5
  269. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  270. data/test/fixtures/reserved_words/group.yml +14 -14
  271. data/test/fixtures/reserved_words/select.yml +8 -8
  272. data/test/fixtures/reserved_words/values.yml +7 -7
  273. data/test/fixtures/ships.yml +6 -6
  274. data/test/fixtures/speedometers.yml +8 -8
  275. data/test/fixtures/sponsors.yml +12 -12
  276. data/test/fixtures/string_key_objects.yml +7 -7
  277. data/test/fixtures/subscribers.yml +10 -10
  278. data/test/fixtures/subscriptions.yml +12 -12
  279. data/test/fixtures/taggings.yml +78 -78
  280. data/test/fixtures/tags.yml +11 -11
  281. data/test/fixtures/tasks.yml +7 -7
  282. data/test/fixtures/teapots.yml +3 -3
  283. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  284. data/test/fixtures/to_be_linked/users.yml +10 -10
  285. data/test/fixtures/topics.yml +49 -49
  286. data/test/fixtures/toys.yml +14 -14
  287. data/test/fixtures/traffic_lights.yml +9 -9
  288. data/test/fixtures/treasures.yml +10 -10
  289. data/test/fixtures/uuid_children.yml +3 -3
  290. data/test/fixtures/uuid_parents.yml +2 -2
  291. data/test/fixtures/variants.yml +4 -4
  292. data/test/fixtures/vegetables.yml +19 -19
  293. data/test/fixtures/vertices.yml +3 -3
  294. data/test/fixtures/warehouse_things.yml +2 -2
  295. data/test/fixtures/zines.yml +5 -5
  296. data/test/ibm_db_test.rb +24 -24
  297. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  298. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  299. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  300. data/test/migrations/missing/1000_people_have_middle_names.rb +8 -8
  301. data/test/migrations/missing/1_people_have_last_names.rb +8 -8
  302. data/test/migrations/missing/3_we_need_reminders.rb +11 -11
  303. data/test/migrations/missing/4_innocent_jointable.rb +11 -11
  304. data/test/migrations/rename/1_we_need_things.rb +10 -10
  305. data/test/migrations/rename/2_rename_things.rb +8 -8
  306. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  307. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  308. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  309. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  310. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  311. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  312. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  313. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  314. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  315. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  316. data/test/migrations/valid/2_we_need_reminders.rb +11 -11
  317. data/test/migrations/valid/3_innocent_jointable.rb +11 -11
  318. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  319. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +11 -11
  320. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +11 -11
  321. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  322. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  323. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  324. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  325. data/test/models/admin.rb +4 -4
  326. data/test/models/admin/account.rb +2 -2
  327. data/test/models/admin/randomly_named_c1.rb +3 -3
  328. data/test/models/admin/user.rb +40 -40
  329. data/test/models/aircraft.rb +4 -4
  330. data/test/models/arunit2_model.rb +3 -3
  331. data/test/models/author.rb +212 -212
  332. data/test/models/auto_id.rb +4 -4
  333. data/test/models/autoloadable/extra_firm.rb +2 -2
  334. data/test/models/binary.rb +1 -1
  335. data/test/models/bird.rb +12 -12
  336. data/test/models/book.rb +18 -18
  337. data/test/models/boolean.rb +2 -2
  338. data/test/models/bulb.rb +51 -51
  339. data/test/models/cake_designer.rb +3 -3
  340. data/test/models/car.rb +26 -26
  341. data/test/models/carrier.rb +2 -2
  342. data/test/models/categorization.rb +19 -19
  343. data/test/models/category.rb +35 -35
  344. data/test/models/chef.rb +7 -3
  345. data/test/models/citation.rb +3 -3
  346. data/test/models/club.rb +23 -23
  347. data/test/models/college.rb +10 -10
  348. data/test/models/column.rb +3 -3
  349. data/test/models/column_name.rb +3 -3
  350. data/test/models/comment.rb +64 -64
  351. data/test/models/company.rb +228 -225
  352. data/test/models/company_in_module.rb +98 -98
  353. data/test/models/computer.rb +3 -3
  354. data/test/models/contact.rb +41 -41
  355. data/test/models/contract.rb +20 -20
  356. data/test/models/country.rb +7 -7
  357. data/test/models/course.rb +6 -6
  358. data/test/models/customer.rb +77 -77
  359. data/test/models/customer_carrier.rb +14 -14
  360. data/test/models/dashboard.rb +3 -3
  361. data/test/models/default.rb +2 -2
  362. data/test/models/department.rb +4 -4
  363. data/test/models/developer.rb +255 -252
  364. data/test/models/dog.rb +5 -5
  365. data/test/models/dog_lover.rb +5 -5
  366. data/test/models/doubloon.rb +12 -12
  367. data/test/models/drink_designer.rb +3 -3
  368. data/test/models/edge.rb +5 -5
  369. data/test/models/electron.rb +5 -5
  370. data/test/models/engine.rb +4 -4
  371. data/test/models/entrant.rb +3 -3
  372. data/test/models/essay.rb +5 -5
  373. data/test/models/event.rb +2 -2
  374. data/test/models/eye.rb +37 -37
  375. data/test/models/face.rb +9 -9
  376. data/test/models/friendship.rb +6 -6
  377. data/test/models/guid.rb +1 -1
  378. data/test/models/hotel.rb +9 -6
  379. data/test/models/image.rb +3 -3
  380. data/test/models/interest.rb +5 -5
  381. data/test/models/invoice.rb +4 -4
  382. data/test/models/item.rb +7 -7
  383. data/test/models/job.rb +7 -7
  384. data/test/models/joke.rb +7 -7
  385. data/test/models/keyboard.rb +3 -3
  386. data/test/models/legacy_thing.rb +3 -3
  387. data/test/models/lesson.rb +11 -11
  388. data/test/models/line_item.rb +3 -3
  389. data/test/models/liquid.rb +4 -4
  390. data/test/models/man.rb +11 -11
  391. data/test/models/matey.rb +4 -4
  392. data/test/models/member.rb +41 -41
  393. data/test/models/member_detail.rb +7 -7
  394. data/test/models/member_type.rb +3 -3
  395. data/test/models/membership.rb +35 -35
  396. data/test/models/minimalistic.rb +2 -2
  397. data/test/models/minivan.rb +9 -9
  398. data/test/models/mixed_case_monkey.rb +3 -3
  399. data/test/models/molecule.rb +6 -6
  400. data/test/models/movie.rb +5 -5
  401. data/test/models/order.rb +4 -4
  402. data/test/models/organization.rb +14 -14
  403. data/test/models/owner.rb +34 -34
  404. data/test/models/parrot.rb +29 -29
  405. data/test/models/person.rb +143 -143
  406. data/test/models/personal_legacy_thing.rb +4 -4
  407. data/test/models/pet.rb +15 -15
  408. data/test/models/pirate.rb +92 -92
  409. data/test/models/possession.rb +3 -3
  410. data/test/models/post.rb +264 -264
  411. data/test/models/price_estimate.rb +4 -4
  412. data/test/models/professor.rb +5 -5
  413. data/test/models/project.rb +31 -29
  414. data/test/models/publisher.rb +2 -2
  415. data/test/models/publisher/article.rb +4 -4
  416. data/test/models/publisher/magazine.rb +3 -3
  417. data/test/models/randomly_named_c1.rb +3 -3
  418. data/test/models/rating.rb +4 -4
  419. data/test/models/reader.rb +23 -23
  420. data/test/models/record.rb +2 -2
  421. data/test/models/reference.rb +22 -22
  422. data/test/models/reply.rb +61 -61
  423. data/test/models/ship.rb +33 -33
  424. data/test/models/ship_part.rb +7 -7
  425. data/test/models/shop.rb +17 -17
  426. data/test/models/shop_account.rb +6 -6
  427. data/test/models/speedometer.rb +6 -6
  428. data/test/models/sponsor.rb +7 -7
  429. data/test/models/string_key_object.rb +3 -3
  430. data/test/models/student.rb +4 -4
  431. data/test/models/subject.rb +16 -16
  432. data/test/models/subscriber.rb +8 -8
  433. data/test/models/subscription.rb +4 -4
  434. data/test/models/tag.rb +7 -7
  435. data/test/models/tagging.rb +13 -13
  436. data/test/models/task.rb +5 -5
  437. data/test/models/topic.rb +124 -124
  438. data/test/models/toy.rb +6 -6
  439. data/test/models/traffic_light.rb +4 -4
  440. data/test/models/treasure.rb +14 -14
  441. data/test/models/treaty.rb +7 -7
  442. data/test/models/tyre.rb +11 -11
  443. data/test/models/uuid_child.rb +3 -3
  444. data/test/models/uuid_parent.rb +3 -3
  445. data/test/models/vegetables.rb +24 -24
  446. data/test/models/vehicle.rb +6 -6
  447. data/test/models/vertex.rb +9 -9
  448. data/test/models/warehouse_thing.rb +5 -5
  449. data/test/models/wheel.rb +3 -3
  450. data/test/models/without_table.rb +3 -3
  451. data/test/models/zine.rb +3 -3
  452. data/test/schema/mysql2_specific_schema.rb +58 -58
  453. data/test/schema/mysql_specific_schema.rb +70 -70
  454. data/test/schema/oracle_specific_schema.rb +43 -43
  455. data/test/schema/postgresql_specific_schema.rb +202 -202
  456. data/test/schema/schema.rb +952 -938
  457. data/test/schema/sqlite_specific_schema.rb +21 -21
  458. data/test/support/config.rb +43 -43
  459. data/test/support/connection.rb +22 -22
  460. data/test/support/connection_helper.rb +14 -14
  461. data/test/support/ddl_helper.rb +8 -8
  462. data/test/support/schema_dumping_helper.rb +20 -20
  463. metadata +2 -2
@@ -1,85 +1,85 @@
1
- require "cases/helper"
2
-
3
- module ActiveRecord
4
- module ConnectionAdapters
5
- class ReaperTest < ActiveRecord::TestCase
6
- attr_reader :pool
7
-
8
- def setup
9
- super
10
- @pool = ConnectionPool.new ActiveRecord::Base.connection_pool.spec
11
- end
12
-
13
- teardown do
14
- @pool.connections.each(&:close)
15
- end
16
-
17
- class FakePool
18
- attr_reader :reaped
19
-
20
- def initialize
21
- @reaped = false
22
- end
23
-
24
- def reap
25
- @reaped = true
26
- end
27
- end
28
-
29
- # A reaper with nil time should never reap connections
30
- def test_nil_time
31
- fp = FakePool.new
32
- assert !fp.reaped
33
- reaper = ConnectionPool::Reaper.new(fp, nil)
34
- reaper.run
35
- assert !fp.reaped
36
- end
37
-
38
- def test_some_time
39
- fp = FakePool.new
40
- assert !fp.reaped
41
-
42
- reaper = ConnectionPool::Reaper.new(fp, 0.0001)
43
- reaper.run
44
- until fp.reaped
45
- Thread.pass
46
- end
47
- assert fp.reaped
48
- end
49
-
50
- def test_pool_has_reaper
51
- assert pool.reaper
52
- end
53
-
54
- def test_reaping_frequency_configuration
55
- spec = ActiveRecord::Base.connection_pool.spec.dup
56
- spec.config[:reaping_frequency] = 100
57
- pool = ConnectionPool.new spec
58
- assert_equal 100, pool.reaper.frequency
59
- end
60
-
61
- def test_connection_pool_starts_reaper
62
- spec = ActiveRecord::Base.connection_pool.spec.dup
63
- spec.config[:reaping_frequency] = '0.0001'
64
-
65
- pool = ConnectionPool.new spec
66
-
67
- conn = nil
68
- child = Thread.new do
69
- conn = pool.checkout
70
- Thread.stop
71
- end
72
- Thread.pass while conn.nil?
73
-
74
- assert conn.in_use?
75
-
76
- child.terminate
77
-
78
- while conn.in_use?
79
- Thread.pass
80
- end
81
- assert !conn.in_use?
82
- end
83
- end
84
- end
85
- end
1
+ require "cases/helper"
2
+
3
+ module ActiveRecord
4
+ module ConnectionAdapters
5
+ class ReaperTest < ActiveRecord::TestCase
6
+ attr_reader :pool
7
+
8
+ def setup
9
+ super
10
+ @pool = ConnectionPool.new ActiveRecord::Base.connection_pool.spec
11
+ end
12
+
13
+ teardown do
14
+ @pool.connections.each(&:close)
15
+ end
16
+
17
+ class FakePool
18
+ attr_reader :reaped
19
+
20
+ def initialize
21
+ @reaped = false
22
+ end
23
+
24
+ def reap
25
+ @reaped = true
26
+ end
27
+ end
28
+
29
+ # A reaper with nil time should never reap connections
30
+ def test_nil_time
31
+ fp = FakePool.new
32
+ assert !fp.reaped
33
+ reaper = ConnectionPool::Reaper.new(fp, nil)
34
+ reaper.run
35
+ assert !fp.reaped
36
+ end
37
+
38
+ def test_some_time
39
+ fp = FakePool.new
40
+ assert !fp.reaped
41
+
42
+ reaper = ConnectionPool::Reaper.new(fp, 0.0001)
43
+ reaper.run
44
+ until fp.reaped
45
+ Thread.pass
46
+ end
47
+ assert fp.reaped
48
+ end
49
+
50
+ def test_pool_has_reaper
51
+ assert pool.reaper
52
+ end
53
+
54
+ def test_reaping_frequency_configuration
55
+ spec = ActiveRecord::Base.connection_pool.spec.dup
56
+ spec.config[:reaping_frequency] = 100
57
+ pool = ConnectionPool.new spec
58
+ assert_equal 100, pool.reaper.frequency
59
+ end
60
+
61
+ def test_connection_pool_starts_reaper
62
+ spec = ActiveRecord::Base.connection_pool.spec.dup
63
+ spec.config[:reaping_frequency] = '0.0001'
64
+
65
+ pool = ConnectionPool.new spec
66
+
67
+ conn = nil
68
+ child = Thread.new do
69
+ conn = pool.checkout
70
+ Thread.stop
71
+ end
72
+ Thread.pass while conn.nil?
73
+
74
+ assert conn.in_use?
75
+
76
+ child.terminate
77
+
78
+ while conn.in_use?
79
+ Thread.pass
80
+ end
81
+ assert !conn.in_use?
82
+ end
83
+ end
84
+ end
85
+ end
@@ -1,454 +1,463 @@
1
- require "cases/helper"
2
- require 'models/topic'
3
- require 'models/customer'
4
- require 'models/company'
5
- require 'models/company_in_module'
6
- require 'models/ship'
7
- require 'models/pirate'
8
- require 'models/price_estimate'
9
- require 'models/essay'
10
- require 'models/author'
11
- require 'models/organization'
12
- require 'models/post'
13
- require 'models/tagging'
14
- require 'models/category'
15
- require 'models/book'
16
- require 'models/subscriber'
17
- require 'models/subscription'
18
- require 'models/tag'
19
- require 'models/sponsor'
20
- require 'models/edge'
21
- require 'models/hotel'
22
- require 'models/chef'
23
- require 'models/department'
24
- require 'models/cake_designer'
25
- require 'models/drink_designer'
26
-
27
- class ReflectionTest < ActiveRecord::TestCase
28
- include ActiveRecord::Reflection
29
-
30
- fixtures :topics, :customers, :companies, :subscribers, :price_estimates
31
-
32
- def setup
33
- @first = Topic.find(1)
34
- end
35
-
36
- def test_human_name
37
- assert_equal "Price estimate", PriceEstimate.model_name.human
38
- assert_equal "Subscriber", Subscriber.model_name.human
39
- end
40
-
41
- def test_read_attribute_names
42
- assert_equal(
43
- %w( id title author_name author_email_address bonus_time written_on last_read content important group approved replies_count unique_replies_count parent_id parent_title type created_at updated_at ).sort,
44
- @first.attribute_names.sort
45
- )
46
- end
47
-
48
- def test_columns
49
- assert_equal 18, Topic.columns.length
50
- end
51
-
52
- def test_columns_are_returned_in_the_order_they_were_declared
53
- column_names = Topic.columns.map { |column| column.name }
54
- assert_equal %w(id title author_name author_email_address written_on bonus_time last_read content important approved replies_count unique_replies_count parent_id parent_title type group created_at updated_at), column_names
55
- end
56
-
57
- def test_content_columns
58
- content_columns = Topic.content_columns
59
- content_column_names = content_columns.map {|column| column.name}
60
- assert_equal 13, content_columns.length
61
- assert_equal %w(title author_name author_email_address written_on bonus_time last_read content important group approved parent_title created_at updated_at).sort, content_column_names.sort
62
- end
63
-
64
- def test_column_string_type_and_limit
65
- assert_equal :string, @first.column_for_attribute("title").type
66
- assert_equal 250, @first.column_for_attribute("title").limit
67
- end
68
-
69
- def test_column_null_not_null
70
- subscriber = Subscriber.first
71
- assert subscriber.column_for_attribute("name").null
72
- assert !subscriber.column_for_attribute("nick").null
73
- end
74
-
75
- def test_human_name_for_column
76
- assert_equal "Author name", @first.column_for_attribute("author_name").human_name
77
- end
78
-
79
- def test_integer_columns
80
- assert_equal :integer, @first.column_for_attribute("id").type
81
- end
82
-
83
- def test_non_existent_columns_return_nil
84
- assert_deprecated do
85
- assert_nil @first.column_for_attribute("attribute_that_doesnt_exist")
86
- end
87
- end
88
-
89
- def test_reflection_klass_for_nested_class_name
90
- reflection = ActiveRecord::Reflection.create(:has_many, nil, nil, { :class_name => 'MyApplication::Business::Company' }, ActiveRecord::Base)
91
- assert_nothing_raised do
92
- assert_equal MyApplication::Business::Company, reflection.klass
93
- end
94
- end
95
-
96
- def test_irregular_reflection_class_name
97
- ActiveSupport::Inflector.inflections do |inflect|
98
- inflect.irregular 'plural_irregular', 'plurales_irregulares'
99
- end
100
- reflection = ActiveRecord::Reflection.create(:has_many, 'plurales_irregulares', nil, {}, ActiveRecord::Base)
101
- assert_equal 'PluralIrregular', reflection.class_name
102
- end
103
-
104
- def test_aggregation_reflection
105
- reflection_for_address = AggregateReflection.new(
106
- :address, nil, { :mapping => [ %w(address_street street), %w(address_city city), %w(address_country country) ] }, Customer
107
- )
108
-
109
- reflection_for_balance = AggregateReflection.new(
110
- :balance, nil, { :class_name => "Money", :mapping => %w(balance amount) }, Customer
111
- )
112
-
113
- reflection_for_gps_location = AggregateReflection.new(
114
- :gps_location, nil, { }, Customer
115
- )
116
-
117
- assert Customer.reflect_on_all_aggregations.include?(reflection_for_gps_location)
118
- assert Customer.reflect_on_all_aggregations.include?(reflection_for_balance)
119
- assert Customer.reflect_on_all_aggregations.include?(reflection_for_address)
120
-
121
- assert_equal reflection_for_address, Customer.reflect_on_aggregation(:address)
122
-
123
- assert_equal Address, Customer.reflect_on_aggregation(:address).klass
124
-
125
- assert_equal Money, Customer.reflect_on_aggregation(:balance).klass
126
- end
127
-
128
- def test_reflect_on_all_autosave_associations
129
- expected = Pirate.reflect_on_all_associations.select { |r| r.options[:autosave] }
130
- received = Pirate.reflect_on_all_autosave_associations
131
-
132
- assert !received.empty?
133
- assert_not_equal Pirate.reflect_on_all_associations.length, received.length
134
- assert_equal expected, received
135
- end
136
-
137
- def test_has_many_reflection
138
- reflection_for_clients = ActiveRecord::Reflection.create(:has_many, :clients, nil, { :order => "id", :dependent => :destroy }, Firm)
139
-
140
- assert_equal reflection_for_clients, Firm.reflect_on_association(:clients)
141
-
142
- assert_equal Client, Firm.reflect_on_association(:clients).klass
143
- assert_equal 'companies', Firm.reflect_on_association(:clients).table_name
144
-
145
- assert_equal Client, Firm.reflect_on_association(:clients_of_firm).klass
146
- assert_equal 'companies', Firm.reflect_on_association(:clients_of_firm).table_name
147
- end
148
-
149
- def test_has_one_reflection
150
- reflection_for_account = ActiveRecord::Reflection.create(:has_one, :account, nil, { :foreign_key => "firm_id", :dependent => :destroy }, Firm)
151
- assert_equal reflection_for_account, Firm.reflect_on_association(:account)
152
-
153
- assert_equal Account, Firm.reflect_on_association(:account).klass
154
- assert_equal 'accounts', Firm.reflect_on_association(:account).table_name
155
- end
156
-
157
- def test_belongs_to_inferred_foreign_key_from_assoc_name
158
- Company.belongs_to :foo
159
- assert_equal "foo_id", Company.reflect_on_association(:foo).foreign_key
160
- Company.belongs_to :bar, :class_name => "Xyzzy"
161
- assert_equal "bar_id", Company.reflect_on_association(:bar).foreign_key
162
- Company.belongs_to :baz, :class_name => "Xyzzy", :foreign_key => "xyzzy_id"
163
- assert_equal "xyzzy_id", Company.reflect_on_association(:baz).foreign_key
164
- end
165
-
166
- def test_association_reflection_in_modules
167
- ActiveRecord::Base.store_full_sti_class = false
168
-
169
- assert_reflection MyApplication::Business::Firm,
170
- :clients_of_firm,
171
- :klass => MyApplication::Business::Client,
172
- :class_name => 'Client',
173
- :table_name => 'companies'
174
-
175
- assert_reflection MyApplication::Billing::Account,
176
- :firm,
177
- :klass => MyApplication::Business::Firm,
178
- :class_name => 'MyApplication::Business::Firm',
179
- :table_name => 'companies'
180
-
181
- assert_reflection MyApplication::Billing::Account,
182
- :qualified_billing_firm,
183
- :klass => MyApplication::Billing::Firm,
184
- :class_name => 'MyApplication::Billing::Firm',
185
- :table_name => 'companies'
186
-
187
- assert_reflection MyApplication::Billing::Account,
188
- :unqualified_billing_firm,
189
- :klass => MyApplication::Billing::Firm,
190
- :class_name => 'Firm',
191
- :table_name => 'companies'
192
-
193
- assert_reflection MyApplication::Billing::Account,
194
- :nested_qualified_billing_firm,
195
- :klass => MyApplication::Billing::Nested::Firm,
196
- :class_name => 'MyApplication::Billing::Nested::Firm',
197
- :table_name => 'companies'
198
-
199
- assert_reflection MyApplication::Billing::Account,
200
- :nested_unqualified_billing_firm,
201
- :klass => MyApplication::Billing::Nested::Firm,
202
- :class_name => 'Nested::Firm',
203
- :table_name => 'companies'
204
- ensure
205
- ActiveRecord::Base.store_full_sti_class = true
206
- end
207
-
208
- def test_reflection_should_not_raise_error_when_compared_to_other_object
209
- assert_not_equal Object.new, Firm._reflections['clients']
210
- end
211
-
212
- def test_reflections_should_return_keys_as_strings
213
- assert Category.reflections.keys.all? { |key| key.is_a? String }, "Model.reflections is expected to return string for keys"
214
- end
215
-
216
- def test_has_and_belongs_to_many_reflection
217
- assert_equal :has_and_belongs_to_many, Category.reflections['posts'].macro
218
- assert_equal :posts, Category.reflect_on_all_associations(:has_and_belongs_to_many).first.name
219
- end
220
-
221
- def test_has_many_through_reflection
222
- assert_kind_of ThroughReflection, Subscriber.reflect_on_association(:books)
223
- end
224
-
225
- def test_chain
226
- expected = [
227
- Organization.reflect_on_association(:author_essay_categories),
228
- Author.reflect_on_association(:essays),
229
- Organization.reflect_on_association(:authors)
230
- ]
231
- actual = Organization.reflect_on_association(:author_essay_categories).chain
232
-
233
- assert_equal expected, actual
234
- end
235
-
236
- def test_scope_chain
237
- expected = [
238
- [Tagging.reflect_on_association(:tag).scope, Post.reflect_on_association(:first_blue_tags).scope],
239
- [Post.reflect_on_association(:first_taggings).scope],
240
- [Author.reflect_on_association(:misc_posts).scope]
241
- ]
242
- actual = Author.reflect_on_association(:misc_post_first_blue_tags).scope_chain
243
- assert_equal expected, actual
244
-
245
- expected = [
246
- [
247
- Tagging.reflect_on_association(:blue_tag).scope,
248
- Post.reflect_on_association(:first_blue_tags_2).scope,
249
- Author.reflect_on_association(:misc_post_first_blue_tags_2).scope
250
- ],
251
- [],
252
- []
253
- ]
254
- actual = Author.reflect_on_association(:misc_post_first_blue_tags_2).scope_chain
255
- assert_equal expected, actual
256
- end
257
-
258
- def test_scope_chain_does_not_interfere_with_hmt_with_polymorphic_case
259
- @hotel = Hotel.create!
260
- @department = @hotel.departments.create!
261
- @department.chefs.create!(employable: CakeDesigner.create!)
262
- @department.chefs.create!(employable: DrinkDesigner.create!)
263
-
264
- assert_equal 1, @hotel.cake_designers.size
265
- assert_equal 1, @hotel.drink_designers.size
266
- assert_equal 2, @hotel.chefs.size
267
- end
268
-
269
- def test_nested?
270
- assert !Author.reflect_on_association(:comments).nested?
271
- assert Author.reflect_on_association(:tags).nested?
272
-
273
- # Only goes :through once, but the through_reflection is a has_and_belongs_to_many, so this is
274
- # a nested through association
275
- assert Category.reflect_on_association(:post_comments).nested?
276
- end
277
-
278
- def test_association_primary_key
279
- # Normal association
280
- assert_equal "id", Author.reflect_on_association(:posts).association_primary_key.to_s
281
- assert_equal "name", Author.reflect_on_association(:essay).association_primary_key.to_s
282
- assert_equal "name", Essay.reflect_on_association(:writer).association_primary_key.to_s
283
-
284
- # Through association (uses the :primary_key option from the source reflection)
285
- assert_equal "nick", Author.reflect_on_association(:subscribers).association_primary_key.to_s
286
- assert_equal "name", Author.reflect_on_association(:essay_category).association_primary_key.to_s
287
- assert_equal "custom_primary_key", Author.reflect_on_association(:tags_with_primary_key).association_primary_key.to_s # nested
288
- end
289
-
290
- def test_association_primary_key_raises_when_missing_primary_key
291
- reflection = ActiveRecord::Reflection.create(:has_many, :edge, nil, {}, Author)
292
- assert_raises(ActiveRecord::UnknownPrimaryKey) { reflection.association_primary_key }
293
-
294
- through = Class.new(ActiveRecord::Reflection::ThroughReflection) {
295
- define_method(:source_reflection) { reflection }
296
- }.new(reflection)
297
- assert_raises(ActiveRecord::UnknownPrimaryKey) { through.association_primary_key }
298
- end
299
-
300
- def test_active_record_primary_key
301
- assert_equal "nick", Subscriber.reflect_on_association(:subscriptions).active_record_primary_key.to_s
302
- assert_equal "name", Author.reflect_on_association(:essay).active_record_primary_key.to_s
303
- end
304
-
305
- def test_active_record_primary_key_raises_when_missing_primary_key
306
- reflection = ActiveRecord::Reflection.create(:has_many, :author, nil, {}, Edge)
307
- assert_raises(ActiveRecord::UnknownPrimaryKey) { reflection.active_record_primary_key }
308
- end
309
-
310
- def test_foreign_type
311
- assert_equal "sponsorable_type", Sponsor.reflect_on_association(:sponsorable).foreign_type.to_s
312
- assert_equal "sponsorable_type", Sponsor.reflect_on_association(:thing).foreign_type.to_s
313
- end
314
-
315
- def test_collection_association
316
- assert Pirate.reflect_on_association(:birds).collection?
317
- assert Pirate.reflect_on_association(:parrots).collection?
318
-
319
- assert !Pirate.reflect_on_association(:ship).collection?
320
- assert !Ship.reflect_on_association(:pirate).collection?
321
- end
322
-
323
- def test_default_association_validation
324
- assert ActiveRecord::Reflection.create(:has_many, :clients, nil, {}, Firm).validate?
325
-
326
- assert !ActiveRecord::Reflection.create(:has_one, :client, nil, {}, Firm).validate?
327
- assert !ActiveRecord::Reflection.create(:belongs_to, :client, nil, {}, Firm).validate?
328
- end
329
-
330
- def test_always_validate_association_if_explicit
331
- assert ActiveRecord::Reflection.create(:has_one, :client, nil, { :validate => true }, Firm).validate?
332
- assert ActiveRecord::Reflection.create(:belongs_to, :client, nil, { :validate => true }, Firm).validate?
333
- assert ActiveRecord::Reflection.create(:has_many, :clients, nil, { :validate => true }, Firm).validate?
334
- end
335
-
336
- def test_validate_association_if_autosave
337
- assert ActiveRecord::Reflection.create(:has_one, :client, nil, { :autosave => true }, Firm).validate?
338
- assert ActiveRecord::Reflection.create(:belongs_to, :client, nil, { :autosave => true }, Firm).validate?
339
- assert ActiveRecord::Reflection.create(:has_many, :clients, nil, { :autosave => true }, Firm).validate?
340
- end
341
-
342
- def test_never_validate_association_if_explicit
343
- assert !ActiveRecord::Reflection.create(:has_one, :client, nil, { :autosave => true, :validate => false }, Firm).validate?
344
- assert !ActiveRecord::Reflection.create(:belongs_to, :client, nil, { :autosave => true, :validate => false }, Firm).validate?
345
- assert !ActiveRecord::Reflection.create(:has_many, :clients, nil, { :autosave => true, :validate => false }, Firm).validate?
346
- end
347
-
348
- def test_foreign_key
349
- assert_equal "author_id", Author.reflect_on_association(:posts).foreign_key.to_s
350
- assert_equal "category_id", Post.reflect_on_association(:categorizations).foreign_key.to_s
351
- end
352
-
353
- def test_through_reflection_scope_chain_does_not_modify_other_reflections
354
- orig_conds = Post.reflect_on_association(:first_blue_tags_2).scope_chain.inspect
355
- Author.reflect_on_association(:misc_post_first_blue_tags_2).scope_chain
356
- assert_equal orig_conds, Post.reflect_on_association(:first_blue_tags_2).scope_chain.inspect
357
- end
358
-
359
- def test_symbol_for_class_name
360
- assert_equal Client, Firm.reflect_on_association(:unsorted_clients_with_symbol).klass
361
- end
362
-
363
- def test_join_table
364
- category = Struct.new(:table_name, :pluralize_table_names).new('categories', true)
365
- product = Struct.new(:table_name, :pluralize_table_names).new('products', true)
366
-
367
- reflection = ActiveRecord::Reflection.create(:has_many, :categories, nil, {}, product)
368
- reflection.stubs(:klass).returns(category)
369
- assert_equal 'categories_products', reflection.join_table
370
-
371
- reflection = ActiveRecord::Reflection.create(:has_many, :products, nil, {}, category)
372
- reflection.stubs(:klass).returns(product)
373
- assert_equal 'categories_products', reflection.join_table
374
- end
375
-
376
- def test_join_table_with_common_prefix
377
- category = Struct.new(:table_name, :pluralize_table_names).new('catalog_categories', true)
378
- product = Struct.new(:table_name, :pluralize_table_names).new('catalog_products', true)
379
-
380
- reflection = ActiveRecord::Reflection.create(:has_many, :categories, nil, {}, product)
381
- reflection.stubs(:klass).returns(category)
382
- assert_equal 'catalog_categories_products', reflection.join_table
383
-
384
- reflection = ActiveRecord::Reflection.create(:has_many, :products, nil, {}, category)
385
- reflection.stubs(:klass).returns(product)
386
- assert_equal 'catalog_categories_products', reflection.join_table
387
- end
388
-
389
- def test_join_table_with_different_prefix
390
- category = Struct.new(:table_name, :pluralize_table_names).new('catalog_categories', true)
391
- page = Struct.new(:table_name, :pluralize_table_names).new('content_pages', true)
392
-
393
- reflection = ActiveRecord::Reflection.create(:has_many, :categories, nil, {}, page)
394
- reflection.stubs(:klass).returns(category)
395
- assert_equal 'catalog_categories_content_pages', reflection.join_table
396
-
397
- reflection = ActiveRecord::Reflection.create(:has_many, :pages, nil, {}, category)
398
- reflection.stubs(:klass).returns(page)
399
- assert_equal 'catalog_categories_content_pages', reflection.join_table
400
- end
401
-
402
- def test_join_table_can_be_overridden
403
- category = Struct.new(:table_name, :pluralize_table_names).new('categories', true)
404
- product = Struct.new(:table_name, :pluralize_table_names).new('products', true)
405
-
406
- reflection = ActiveRecord::Reflection.create(:has_many, :categories, nil, { :join_table => 'product_categories' }, product)
407
- reflection.stubs(:klass).returns(category)
408
- assert_equal 'product_categories', reflection.join_table
409
-
410
- reflection = ActiveRecord::Reflection.create(:has_many, :products, nil, { :join_table => 'product_categories' }, category)
411
- reflection.stubs(:klass).returns(product)
412
- assert_equal 'product_categories', reflection.join_table
413
- end
414
-
415
- def test_includes_accepts_symbols
416
- hotel = Hotel.create!
417
- department = hotel.departments.create!
418
- department.chefs.create!
419
-
420
- assert_nothing_raised do
421
- assert_equal department.chefs, Hotel.includes([departments: :chefs]).first.chefs
422
- end
423
- end
424
-
425
- def test_includes_accepts_strings
426
- hotel = Hotel.create!
427
- department = hotel.departments.create!
428
- department.chefs.create!
429
-
430
- assert_nothing_raised do
431
- assert_equal department.chefs, Hotel.includes(['departments' => 'chefs']).first.chefs
432
- end
433
- end
434
-
435
- def test_reflect_on_association_accepts_symbols
436
- assert_nothing_raised do
437
- assert_equal Hotel.reflect_on_association(:departments).name, :departments
438
- end
439
- end
440
-
441
- def test_reflect_on_association_accepts_strings
442
- assert_nothing_raised do
443
- assert_equal Hotel.reflect_on_association("departments").name, :departments
444
- end
445
- end
446
-
447
- private
448
- def assert_reflection(klass, association, options)
449
- assert reflection = klass.reflect_on_association(association)
450
- options.each do |method, value|
451
- assert_equal(value, reflection.send(method))
452
- end
453
- end
454
- end
1
+ require "cases/helper"
2
+ require 'models/topic'
3
+ require 'models/customer'
4
+ require 'models/company'
5
+ require 'models/company_in_module'
6
+ require 'models/ship'
7
+ require 'models/pirate'
8
+ require 'models/price_estimate'
9
+ require 'models/essay'
10
+ require 'models/author'
11
+ require 'models/organization'
12
+ require 'models/post'
13
+ require 'models/tagging'
14
+ require 'models/category'
15
+ require 'models/book'
16
+ require 'models/subscriber'
17
+ require 'models/subscription'
18
+ require 'models/tag'
19
+ require 'models/sponsor'
20
+ require 'models/edge'
21
+ require 'models/hotel'
22
+ require 'models/chef'
23
+ require 'models/department'
24
+ require 'models/cake_designer'
25
+ require 'models/drink_designer'
26
+ require 'models/mocktail_designer'
27
+
28
+ class ReflectionTest < ActiveRecord::TestCase
29
+ include ActiveRecord::Reflection
30
+
31
+ fixtures :topics, :customers, :companies, :subscribers, :price_estimates
32
+
33
+ def setup
34
+ @first = Topic.find(1)
35
+ end
36
+
37
+ def test_human_name
38
+ assert_equal "Price estimate", PriceEstimate.model_name.human
39
+ assert_equal "Subscriber", Subscriber.model_name.human
40
+ end
41
+
42
+ def test_read_attribute_names
43
+ assert_equal(
44
+ %w( id title author_name author_email_address bonus_time written_on last_read content important group approved replies_count unique_replies_count parent_id parent_title type created_at updated_at ).sort,
45
+ @first.attribute_names.sort
46
+ )
47
+ end
48
+
49
+ def test_columns
50
+ assert_equal 18, Topic.columns.length
51
+ end
52
+
53
+ def test_columns_are_returned_in_the_order_they_were_declared
54
+ column_names = Topic.columns.map { |column| column.name }
55
+ assert_equal %w(id title author_name author_email_address written_on bonus_time last_read content important approved replies_count unique_replies_count parent_id parent_title type group created_at updated_at), column_names
56
+ end
57
+
58
+ def test_content_columns
59
+ content_columns = Topic.content_columns
60
+ content_column_names = content_columns.map {|column| column.name}
61
+ assert_equal 13, content_columns.length
62
+ assert_equal %w(title author_name author_email_address written_on bonus_time last_read content important group approved parent_title created_at updated_at).sort, content_column_names.sort
63
+ end
64
+
65
+ def test_column_string_type_and_limit
66
+ assert_equal :string, @first.column_for_attribute("title").type
67
+ assert_equal 250, @first.column_for_attribute("title").limit
68
+ end
69
+
70
+ def test_column_null_not_null
71
+ subscriber = Subscriber.first
72
+ assert subscriber.column_for_attribute("name").null
73
+ assert !subscriber.column_for_attribute("nick").null
74
+ end
75
+
76
+ def test_human_name_for_column
77
+ assert_equal "Author name", @first.column_for_attribute("author_name").human_name
78
+ end
79
+
80
+ def test_integer_columns
81
+ assert_equal :integer, @first.column_for_attribute("id").type
82
+ end
83
+
84
+ def test_non_existent_columns_return_nil
85
+ assert_deprecated do
86
+ assert_nil @first.column_for_attribute("attribute_that_doesnt_exist")
87
+ end
88
+ end
89
+
90
+ def test_reflection_klass_for_nested_class_name
91
+ reflection = ActiveRecord::Reflection.create(:has_many, nil, nil, { :class_name => 'MyApplication::Business::Company' }, ActiveRecord::Base)
92
+ assert_nothing_raised do
93
+ assert_equal MyApplication::Business::Company, reflection.klass
94
+ end
95
+ end
96
+
97
+ def test_irregular_reflection_class_name
98
+ ActiveSupport::Inflector.inflections do |inflect|
99
+ inflect.irregular 'plural_irregular', 'plurales_irregulares'
100
+ end
101
+ reflection = ActiveRecord::Reflection.create(:has_many, 'plurales_irregulares', nil, {}, ActiveRecord::Base)
102
+ assert_equal 'PluralIrregular', reflection.class_name
103
+ end
104
+
105
+ def test_aggregation_reflection
106
+ reflection_for_address = AggregateReflection.new(
107
+ :address, nil, { :mapping => [ %w(address_street street), %w(address_city city), %w(address_country country) ] }, Customer
108
+ )
109
+
110
+ reflection_for_balance = AggregateReflection.new(
111
+ :balance, nil, { :class_name => "Money", :mapping => %w(balance amount) }, Customer
112
+ )
113
+
114
+ reflection_for_gps_location = AggregateReflection.new(
115
+ :gps_location, nil, { }, Customer
116
+ )
117
+
118
+ assert Customer.reflect_on_all_aggregations.include?(reflection_for_gps_location)
119
+ assert Customer.reflect_on_all_aggregations.include?(reflection_for_balance)
120
+ assert Customer.reflect_on_all_aggregations.include?(reflection_for_address)
121
+
122
+ assert_equal reflection_for_address, Customer.reflect_on_aggregation(:address)
123
+
124
+ assert_equal Address, Customer.reflect_on_aggregation(:address).klass
125
+
126
+ assert_equal Money, Customer.reflect_on_aggregation(:balance).klass
127
+ end
128
+
129
+ def test_reflect_on_all_autosave_associations
130
+ expected = Pirate.reflect_on_all_associations.select { |r| r.options[:autosave] }
131
+ received = Pirate.reflect_on_all_autosave_associations
132
+
133
+ assert !received.empty?
134
+ assert_not_equal Pirate.reflect_on_all_associations.length, received.length
135
+ assert_equal expected, received
136
+ end
137
+
138
+ def test_has_many_reflection
139
+ reflection_for_clients = ActiveRecord::Reflection.create(:has_many, :clients, nil, { :order => "id", :dependent => :destroy }, Firm)
140
+
141
+ assert_equal reflection_for_clients, Firm.reflect_on_association(:clients)
142
+
143
+ assert_equal Client, Firm.reflect_on_association(:clients).klass
144
+ assert_equal 'companies', Firm.reflect_on_association(:clients).table_name
145
+
146
+ assert_equal Client, Firm.reflect_on_association(:clients_of_firm).klass
147
+ assert_equal 'companies', Firm.reflect_on_association(:clients_of_firm).table_name
148
+ end
149
+
150
+ def test_has_one_reflection
151
+ reflection_for_account = ActiveRecord::Reflection.create(:has_one, :account, nil, { :foreign_key => "firm_id", :dependent => :destroy }, Firm)
152
+ assert_equal reflection_for_account, Firm.reflect_on_association(:account)
153
+
154
+ assert_equal Account, Firm.reflect_on_association(:account).klass
155
+ assert_equal 'accounts', Firm.reflect_on_association(:account).table_name
156
+ end
157
+
158
+ def test_belongs_to_inferred_foreign_key_from_assoc_name
159
+ Company.belongs_to :foo
160
+ assert_equal "foo_id", Company.reflect_on_association(:foo).foreign_key
161
+ Company.belongs_to :bar, :class_name => "Xyzzy"
162
+ assert_equal "bar_id", Company.reflect_on_association(:bar).foreign_key
163
+ Company.belongs_to :baz, :class_name => "Xyzzy", :foreign_key => "xyzzy_id"
164
+ assert_equal "xyzzy_id", Company.reflect_on_association(:baz).foreign_key
165
+ end
166
+
167
+ def test_association_reflection_in_modules
168
+ ActiveRecord::Base.store_full_sti_class = false
169
+
170
+ assert_reflection MyApplication::Business::Firm,
171
+ :clients_of_firm,
172
+ :klass => MyApplication::Business::Client,
173
+ :class_name => 'Client',
174
+ :table_name => 'companies'
175
+
176
+ assert_reflection MyApplication::Billing::Account,
177
+ :firm,
178
+ :klass => MyApplication::Business::Firm,
179
+ :class_name => 'MyApplication::Business::Firm',
180
+ :table_name => 'companies'
181
+
182
+ assert_reflection MyApplication::Billing::Account,
183
+ :qualified_billing_firm,
184
+ :klass => MyApplication::Billing::Firm,
185
+ :class_name => 'MyApplication::Billing::Firm',
186
+ :table_name => 'companies'
187
+
188
+ assert_reflection MyApplication::Billing::Account,
189
+ :unqualified_billing_firm,
190
+ :klass => MyApplication::Billing::Firm,
191
+ :class_name => 'Firm',
192
+ :table_name => 'companies'
193
+
194
+ assert_reflection MyApplication::Billing::Account,
195
+ :nested_qualified_billing_firm,
196
+ :klass => MyApplication::Billing::Nested::Firm,
197
+ :class_name => 'MyApplication::Billing::Nested::Firm',
198
+ :table_name => 'companies'
199
+
200
+ assert_reflection MyApplication::Billing::Account,
201
+ :nested_unqualified_billing_firm,
202
+ :klass => MyApplication::Billing::Nested::Firm,
203
+ :class_name => 'Nested::Firm',
204
+ :table_name => 'companies'
205
+ ensure
206
+ ActiveRecord::Base.store_full_sti_class = true
207
+ end
208
+
209
+ def test_reflection_should_not_raise_error_when_compared_to_other_object
210
+ assert_not_equal Object.new, Firm._reflections['clients']
211
+ end
212
+
213
+ def test_reflections_should_return_keys_as_strings
214
+ assert Category.reflections.keys.all? { |key| key.is_a? String }, "Model.reflections is expected to return string for keys"
215
+ end
216
+
217
+ def test_has_and_belongs_to_many_reflection
218
+ assert_equal :has_and_belongs_to_many, Category.reflections['posts'].macro
219
+ assert_equal :posts, Category.reflect_on_all_associations(:has_and_belongs_to_many).first.name
220
+ end
221
+
222
+ def test_has_many_through_reflection
223
+ assert_kind_of ThroughReflection, Subscriber.reflect_on_association(:books)
224
+ end
225
+
226
+ def test_chain
227
+ expected = [
228
+ Organization.reflect_on_association(:author_essay_categories),
229
+ Author.reflect_on_association(:essays),
230
+ Organization.reflect_on_association(:authors)
231
+ ]
232
+ actual = Organization.reflect_on_association(:author_essay_categories).chain
233
+
234
+ assert_equal expected, actual
235
+ end
236
+
237
+ def test_scope_chain
238
+ expected = [
239
+ [Tagging.reflect_on_association(:tag).scope, Post.reflect_on_association(:first_blue_tags).scope],
240
+ [Post.reflect_on_association(:first_taggings).scope],
241
+ [Author.reflect_on_association(:misc_posts).scope]
242
+ ]
243
+ actual = Author.reflect_on_association(:misc_post_first_blue_tags).scope_chain
244
+ assert_equal expected, actual
245
+
246
+ expected = [
247
+ [
248
+ Tagging.reflect_on_association(:blue_tag).scope,
249
+ Post.reflect_on_association(:first_blue_tags_2).scope,
250
+ Author.reflect_on_association(:misc_post_first_blue_tags_2).scope
251
+ ],
252
+ [],
253
+ []
254
+ ]
255
+ actual = Author.reflect_on_association(:misc_post_first_blue_tags_2).scope_chain
256
+ assert_equal expected, actual
257
+ end
258
+
259
+ def test_scope_chain_does_not_interfere_with_hmt_with_polymorphic_case
260
+ @hotel = Hotel.create!
261
+ @department = @hotel.departments.create!
262
+ @department.chefs.create!(employable: CakeDesigner.create!)
263
+ @department.chefs.create!(employable: DrinkDesigner.create!)
264
+
265
+ assert_equal 1, @hotel.cake_designers.size
266
+ assert_equal 1, @hotel.drink_designers.size
267
+ assert_equal 2, @hotel.chefs.size
268
+ end
269
+
270
+ def test_scope_chain_does_not_interfere_with_hmt_with_polymorphic_case_and_sti
271
+ @hotel = Hotel.create!
272
+ @hotel.mocktail_designers << MocktailDesigner.create!
273
+
274
+ assert_equal 1, @hotel.mocktail_designers.size
275
+ assert_equal 1, @hotel.chef_lists.size
276
+ end
277
+
278
+ def test_nested?
279
+ assert !Author.reflect_on_association(:comments).nested?
280
+ assert Author.reflect_on_association(:tags).nested?
281
+
282
+ # Only goes :through once, but the through_reflection is a has_and_belongs_to_many, so this is
283
+ # a nested through association
284
+ assert Category.reflect_on_association(:post_comments).nested?
285
+ end
286
+
287
+ def test_association_primary_key
288
+ # Normal association
289
+ assert_equal "id", Author.reflect_on_association(:posts).association_primary_key.to_s
290
+ assert_equal "name", Author.reflect_on_association(:essay).association_primary_key.to_s
291
+ assert_equal "name", Essay.reflect_on_association(:writer).association_primary_key.to_s
292
+
293
+ # Through association (uses the :primary_key option from the source reflection)
294
+ assert_equal "nick", Author.reflect_on_association(:subscribers).association_primary_key.to_s
295
+ assert_equal "name", Author.reflect_on_association(:essay_category).association_primary_key.to_s
296
+ assert_equal "custom_primary_key", Author.reflect_on_association(:tags_with_primary_key).association_primary_key.to_s # nested
297
+ end
298
+
299
+ def test_association_primary_key_raises_when_missing_primary_key
300
+ reflection = ActiveRecord::Reflection.create(:has_many, :edge, nil, {}, Author)
301
+ assert_raises(ActiveRecord::UnknownPrimaryKey) { reflection.association_primary_key }
302
+
303
+ through = Class.new(ActiveRecord::Reflection::ThroughReflection) {
304
+ define_method(:source_reflection) { reflection }
305
+ }.new(reflection)
306
+ assert_raises(ActiveRecord::UnknownPrimaryKey) { through.association_primary_key }
307
+ end
308
+
309
+ def test_active_record_primary_key
310
+ assert_equal "nick", Subscriber.reflect_on_association(:subscriptions).active_record_primary_key.to_s
311
+ assert_equal "name", Author.reflect_on_association(:essay).active_record_primary_key.to_s
312
+ end
313
+
314
+ def test_active_record_primary_key_raises_when_missing_primary_key
315
+ reflection = ActiveRecord::Reflection.create(:has_many, :author, nil, {}, Edge)
316
+ assert_raises(ActiveRecord::UnknownPrimaryKey) { reflection.active_record_primary_key }
317
+ end
318
+
319
+ def test_foreign_type
320
+ assert_equal "sponsorable_type", Sponsor.reflect_on_association(:sponsorable).foreign_type.to_s
321
+ assert_equal "sponsorable_type", Sponsor.reflect_on_association(:thing).foreign_type.to_s
322
+ end
323
+
324
+ def test_collection_association
325
+ assert Pirate.reflect_on_association(:birds).collection?
326
+ assert Pirate.reflect_on_association(:parrots).collection?
327
+
328
+ assert !Pirate.reflect_on_association(:ship).collection?
329
+ assert !Ship.reflect_on_association(:pirate).collection?
330
+ end
331
+
332
+ def test_default_association_validation
333
+ assert ActiveRecord::Reflection.create(:has_many, :clients, nil, {}, Firm).validate?
334
+
335
+ assert !ActiveRecord::Reflection.create(:has_one, :client, nil, {}, Firm).validate?
336
+ assert !ActiveRecord::Reflection.create(:belongs_to, :client, nil, {}, Firm).validate?
337
+ end
338
+
339
+ def test_always_validate_association_if_explicit
340
+ assert ActiveRecord::Reflection.create(:has_one, :client, nil, { :validate => true }, Firm).validate?
341
+ assert ActiveRecord::Reflection.create(:belongs_to, :client, nil, { :validate => true }, Firm).validate?
342
+ assert ActiveRecord::Reflection.create(:has_many, :clients, nil, { :validate => true }, Firm).validate?
343
+ end
344
+
345
+ def test_validate_association_if_autosave
346
+ assert ActiveRecord::Reflection.create(:has_one, :client, nil, { :autosave => true }, Firm).validate?
347
+ assert ActiveRecord::Reflection.create(:belongs_to, :client, nil, { :autosave => true }, Firm).validate?
348
+ assert ActiveRecord::Reflection.create(:has_many, :clients, nil, { :autosave => true }, Firm).validate?
349
+ end
350
+
351
+ def test_never_validate_association_if_explicit
352
+ assert !ActiveRecord::Reflection.create(:has_one, :client, nil, { :autosave => true, :validate => false }, Firm).validate?
353
+ assert !ActiveRecord::Reflection.create(:belongs_to, :client, nil, { :autosave => true, :validate => false }, Firm).validate?
354
+ assert !ActiveRecord::Reflection.create(:has_many, :clients, nil, { :autosave => true, :validate => false }, Firm).validate?
355
+ end
356
+
357
+ def test_foreign_key
358
+ assert_equal "author_id", Author.reflect_on_association(:posts).foreign_key.to_s
359
+ assert_equal "category_id", Post.reflect_on_association(:categorizations).foreign_key.to_s
360
+ end
361
+
362
+ def test_through_reflection_scope_chain_does_not_modify_other_reflections
363
+ orig_conds = Post.reflect_on_association(:first_blue_tags_2).scope_chain.inspect
364
+ Author.reflect_on_association(:misc_post_first_blue_tags_2).scope_chain
365
+ assert_equal orig_conds, Post.reflect_on_association(:first_blue_tags_2).scope_chain.inspect
366
+ end
367
+
368
+ def test_symbol_for_class_name
369
+ assert_equal Client, Firm.reflect_on_association(:unsorted_clients_with_symbol).klass
370
+ end
371
+
372
+ def test_join_table
373
+ category = Struct.new(:table_name, :pluralize_table_names).new('categories', true)
374
+ product = Struct.new(:table_name, :pluralize_table_names).new('products', true)
375
+
376
+ reflection = ActiveRecord::Reflection.create(:has_many, :categories, nil, {}, product)
377
+ reflection.stubs(:klass).returns(category)
378
+ assert_equal 'categories_products', reflection.join_table
379
+
380
+ reflection = ActiveRecord::Reflection.create(:has_many, :products, nil, {}, category)
381
+ reflection.stubs(:klass).returns(product)
382
+ assert_equal 'categories_products', reflection.join_table
383
+ end
384
+
385
+ def test_join_table_with_common_prefix
386
+ category = Struct.new(:table_name, :pluralize_table_names).new('catalog_categories', true)
387
+ product = Struct.new(:table_name, :pluralize_table_names).new('catalog_products', true)
388
+
389
+ reflection = ActiveRecord::Reflection.create(:has_many, :categories, nil, {}, product)
390
+ reflection.stubs(:klass).returns(category)
391
+ assert_equal 'catalog_categories_products', reflection.join_table
392
+
393
+ reflection = ActiveRecord::Reflection.create(:has_many, :products, nil, {}, category)
394
+ reflection.stubs(:klass).returns(product)
395
+ assert_equal 'catalog_categories_products', reflection.join_table
396
+ end
397
+
398
+ def test_join_table_with_different_prefix
399
+ category = Struct.new(:table_name, :pluralize_table_names).new('catalog_categories', true)
400
+ page = Struct.new(:table_name, :pluralize_table_names).new('content_pages', true)
401
+
402
+ reflection = ActiveRecord::Reflection.create(:has_many, :categories, nil, {}, page)
403
+ reflection.stubs(:klass).returns(category)
404
+ assert_equal 'catalog_categories_content_pages', reflection.join_table
405
+
406
+ reflection = ActiveRecord::Reflection.create(:has_many, :pages, nil, {}, category)
407
+ reflection.stubs(:klass).returns(page)
408
+ assert_equal 'catalog_categories_content_pages', reflection.join_table
409
+ end
410
+
411
+ def test_join_table_can_be_overridden
412
+ category = Struct.new(:table_name, :pluralize_table_names).new('categories', true)
413
+ product = Struct.new(:table_name, :pluralize_table_names).new('products', true)
414
+
415
+ reflection = ActiveRecord::Reflection.create(:has_many, :categories, nil, { :join_table => 'product_categories' }, product)
416
+ reflection.stubs(:klass).returns(category)
417
+ assert_equal 'product_categories', reflection.join_table
418
+
419
+ reflection = ActiveRecord::Reflection.create(:has_many, :products, nil, { :join_table => 'product_categories' }, category)
420
+ reflection.stubs(:klass).returns(product)
421
+ assert_equal 'product_categories', reflection.join_table
422
+ end
423
+
424
+ def test_includes_accepts_symbols
425
+ hotel = Hotel.create!
426
+ department = hotel.departments.create!
427
+ department.chefs.create!
428
+
429
+ assert_nothing_raised do
430
+ assert_equal department.chefs, Hotel.includes([departments: :chefs]).first.chefs
431
+ end
432
+ end
433
+
434
+ def test_includes_accepts_strings
435
+ hotel = Hotel.create!
436
+ department = hotel.departments.create!
437
+ department.chefs.create!
438
+
439
+ assert_nothing_raised do
440
+ assert_equal department.chefs, Hotel.includes(['departments' => 'chefs']).first.chefs
441
+ end
442
+ end
443
+
444
+ def test_reflect_on_association_accepts_symbols
445
+ assert_nothing_raised do
446
+ assert_equal Hotel.reflect_on_association(:departments).name, :departments
447
+ end
448
+ end
449
+
450
+ def test_reflect_on_association_accepts_strings
451
+ assert_nothing_raised do
452
+ assert_equal Hotel.reflect_on_association("departments").name, :departments
453
+ end
454
+ end
455
+
456
+ private
457
+ def assert_reflection(klass, association, options)
458
+ assert reflection = klass.reflect_on_association(association)
459
+ options.each do |method, value|
460
+ assert_equal(value, reflection.send(method))
461
+ end
462
+ end
463
+ end