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,54 +1,54 @@
1
- require 'cases/helper'
2
-
3
- class HotCompatibilityTest < ActiveRecord::TestCase
4
- self.use_transactional_fixtures = false
5
-
6
- setup do
7
- @klass = Class.new(ActiveRecord::Base) do
8
- connection.create_table :hot_compatibilities, force: true do |t|
9
- t.string :foo
10
- t.string :bar
11
- end
12
-
13
- def self.name; 'HotCompatibility'; end
14
- end
15
- end
16
-
17
- teardown do
18
- ActiveRecord::Base.connection.drop_table :hot_compatibilities
19
- end
20
-
21
- test "insert after remove_column" do
22
- # warm cache
23
- @klass.create!
24
-
25
- # we have 3 columns
26
- assert_equal 3, @klass.columns.length
27
-
28
- # remove one of them
29
- @klass.connection.remove_column :hot_compatibilities, :bar
30
-
31
- # we still have 3 columns in the cache
32
- assert_equal 3, @klass.columns.length
33
-
34
- # but we can successfully create a record so long as we don't
35
- # reference the removed column
36
- record = @klass.create! foo: 'foo'
37
- record.reload
38
- assert_equal 'foo', record.foo
39
- end
40
-
41
- test "update after remove_column" do
42
- record = @klass.create! foo: 'foo'
43
- assert_equal 3, @klass.columns.length
44
- @klass.connection.remove_column :hot_compatibilities, :bar
45
- assert_equal 3, @klass.columns.length
46
-
47
- record.reload
48
- assert_equal 'foo', record.foo
49
- record.foo = 'bar'
50
- record.save!
51
- record.reload
52
- assert_equal 'bar', record.foo
53
- end
54
- end
1
+ require 'cases/helper'
2
+
3
+ class HotCompatibilityTest < ActiveRecord::TestCase
4
+ self.use_transactional_fixtures = false
5
+
6
+ setup do
7
+ @klass = Class.new(ActiveRecord::Base) do
8
+ connection.create_table :hot_compatibilities, force: true do |t|
9
+ t.string :foo
10
+ t.string :bar
11
+ end
12
+
13
+ def self.name; 'HotCompatibility'; end
14
+ end
15
+ end
16
+
17
+ teardown do
18
+ ActiveRecord::Base.connection.drop_table :hot_compatibilities
19
+ end
20
+
21
+ test "insert after remove_column" do
22
+ # warm cache
23
+ @klass.create!
24
+
25
+ # we have 3 columns
26
+ assert_equal 3, @klass.columns.length
27
+
28
+ # remove one of them
29
+ @klass.connection.remove_column :hot_compatibilities, :bar
30
+
31
+ # we still have 3 columns in the cache
32
+ assert_equal 3, @klass.columns.length
33
+
34
+ # but we can successfully create a record so long as we don't
35
+ # reference the removed column
36
+ record = @klass.create! foo: 'foo'
37
+ record.reload
38
+ assert_equal 'foo', record.foo
39
+ end
40
+
41
+ test "update after remove_column" do
42
+ record = @klass.create! foo: 'foo'
43
+ assert_equal 3, @klass.columns.length
44
+ @klass.connection.remove_column :hot_compatibilities, :bar
45
+ assert_equal 3, @klass.columns.length
46
+
47
+ record.reload
48
+ assert_equal 'foo', record.foo
49
+ record.foo = 'bar'
50
+ record.save!
51
+ record.reload
52
+ assert_equal 'bar', record.foo
53
+ end
54
+ end
@@ -1,45 +1,45 @@
1
- require "cases/helper"
2
- require 'models/topic'
3
- require 'models/reply'
4
-
5
- class ActiveRecordI18nTests < ActiveRecord::TestCase
6
-
7
- def setup
8
- I18n.backend = I18n::Backend::Simple.new
9
- end
10
-
11
- def test_translated_model_attributes
12
- I18n.backend.store_translations 'en', :activerecord => {:attributes => {:topic => {:title => 'topic title attribute'} } }
13
- assert_equal 'topic title attribute', Topic.human_attribute_name('title')
14
- end
15
-
16
- def test_translated_model_attributes_with_symbols
17
- I18n.backend.store_translations 'en', :activerecord => {:attributes => {:topic => {:title => 'topic title attribute'} } }
18
- assert_equal 'topic title attribute', Topic.human_attribute_name(:title)
19
- end
20
-
21
- def test_translated_model_attributes_with_sti
22
- I18n.backend.store_translations 'en', :activerecord => {:attributes => {:reply => {:title => 'reply title attribute'} } }
23
- assert_equal 'reply title attribute', Reply.human_attribute_name('title')
24
- end
25
-
26
- def test_translated_model_attributes_with_sti_fallback
27
- I18n.backend.store_translations 'en', :activerecord => {:attributes => {:topic => {:title => 'topic title attribute'} } }
28
- assert_equal 'topic title attribute', Reply.human_attribute_name('title')
29
- end
30
-
31
- def test_translated_model_names
32
- I18n.backend.store_translations 'en', :activerecord => {:models => {:topic => 'topic model'} }
33
- assert_equal 'topic model', Topic.model_name.human
34
- end
35
-
36
- def test_translated_model_names_with_sti
37
- I18n.backend.store_translations 'en', :activerecord => {:models => {:reply => 'reply model'} }
38
- assert_equal 'reply model', Reply.model_name.human
39
- end
40
-
41
- def test_translated_model_names_with_sti_fallback
42
- I18n.backend.store_translations 'en', :activerecord => {:models => {:topic => 'topic model'} }
43
- assert_equal 'topic model', Reply.model_name.human
44
- end
45
- end
1
+ require "cases/helper"
2
+ require 'models/topic'
3
+ require 'models/reply'
4
+
5
+ class ActiveRecordI18nTests < ActiveRecord::TestCase
6
+
7
+ def setup
8
+ I18n.backend = I18n::Backend::Simple.new
9
+ end
10
+
11
+ def test_translated_model_attributes
12
+ I18n.backend.store_translations 'en', :activerecord => {:attributes => {:topic => {:title => 'topic title attribute'} } }
13
+ assert_equal 'topic title attribute', Topic.human_attribute_name('title')
14
+ end
15
+
16
+ def test_translated_model_attributes_with_symbols
17
+ I18n.backend.store_translations 'en', :activerecord => {:attributes => {:topic => {:title => 'topic title attribute'} } }
18
+ assert_equal 'topic title attribute', Topic.human_attribute_name(:title)
19
+ end
20
+
21
+ def test_translated_model_attributes_with_sti
22
+ I18n.backend.store_translations 'en', :activerecord => {:attributes => {:reply => {:title => 'reply title attribute'} } }
23
+ assert_equal 'reply title attribute', Reply.human_attribute_name('title')
24
+ end
25
+
26
+ def test_translated_model_attributes_with_sti_fallback
27
+ I18n.backend.store_translations 'en', :activerecord => {:attributes => {:topic => {:title => 'topic title attribute'} } }
28
+ assert_equal 'topic title attribute', Reply.human_attribute_name('title')
29
+ end
30
+
31
+ def test_translated_model_names
32
+ I18n.backend.store_translations 'en', :activerecord => {:models => {:topic => 'topic model'} }
33
+ assert_equal 'topic model', Topic.model_name.human
34
+ end
35
+
36
+ def test_translated_model_names_with_sti
37
+ I18n.backend.store_translations 'en', :activerecord => {:models => {:reply => 'reply model'} }
38
+ assert_equal 'reply model', Reply.model_name.human
39
+ end
40
+
41
+ def test_translated_model_names_with_sti_fallback
42
+ I18n.backend.store_translations 'en', :activerecord => {:models => {:topic => 'topic model'} }
43
+ assert_equal 'topic model', Reply.model_name.human
44
+ end
45
+ end
@@ -1,375 +1,375 @@
1
- require 'cases/helper'
2
- require 'models/company'
3
- require 'models/person'
4
- require 'models/post'
5
- require 'models/project'
6
- require 'models/subscriber'
7
- require 'models/vegetables'
8
- require 'models/shop'
9
-
10
- class InheritanceTest < ActiveRecord::TestCase
11
- fixtures :companies, :projects, :subscribers, :accounts, :vegetables
12
-
13
- def test_class_with_store_full_sti_class_returns_full_name
14
- old = ActiveRecord::Base.store_full_sti_class
15
- ActiveRecord::Base.store_full_sti_class = true
16
- assert_equal 'Namespaced::Company', Namespaced::Company.sti_name
17
- ensure
18
- ActiveRecord::Base.store_full_sti_class = old
19
- end
20
-
21
- def test_class_with_blank_sti_name
22
- company = Company.first
23
- company = company.dup
24
- company.extend(Module.new {
25
- def _read_attribute(name)
26
- return ' ' if name == 'type'
27
- super
28
- end
29
- })
30
- company.save!
31
- company = Company.all.to_a.find { |x| x.id == company.id }
32
- assert_equal ' ', company.type
33
- end
34
-
35
- def test_class_without_store_full_sti_class_returns_demodulized_name
36
- old = ActiveRecord::Base.store_full_sti_class
37
- ActiveRecord::Base.store_full_sti_class = false
38
- assert_equal 'Company', Namespaced::Company.sti_name
39
- ensure
40
- ActiveRecord::Base.store_full_sti_class = old
41
- end
42
-
43
- def test_should_store_demodulized_class_name_with_store_full_sti_class_option_disabled
44
- old = ActiveRecord::Base.store_full_sti_class
45
- ActiveRecord::Base.store_full_sti_class = false
46
- item = Namespaced::Company.new
47
- assert_equal 'Company', item[:type]
48
- ensure
49
- ActiveRecord::Base.store_full_sti_class = old
50
- end
51
-
52
- def test_should_store_full_class_name_with_store_full_sti_class_option_enabled
53
- old = ActiveRecord::Base.store_full_sti_class
54
- ActiveRecord::Base.store_full_sti_class = true
55
- item = Namespaced::Company.new
56
- assert_equal 'Namespaced::Company', item[:type]
57
- ensure
58
- ActiveRecord::Base.store_full_sti_class = old
59
- end
60
-
61
- def test_different_namespace_subclass_should_load_correctly_with_store_full_sti_class_option
62
- old = ActiveRecord::Base.store_full_sti_class
63
- ActiveRecord::Base.store_full_sti_class = true
64
- item = Namespaced::Company.create :name => "Wolverine 2"
65
- assert_not_nil Company.find(item.id)
66
- assert_not_nil Namespaced::Company.find(item.id)
67
- ensure
68
- ActiveRecord::Base.store_full_sti_class = old
69
- end
70
-
71
- def test_company_descends_from_active_record
72
- assert !ActiveRecord::Base.descends_from_active_record?
73
- assert AbstractCompany.descends_from_active_record?, 'AbstractCompany should descend from ActiveRecord::Base'
74
- assert Company.descends_from_active_record?, 'Company should descend from ActiveRecord::Base'
75
- assert !Class.new(Company).descends_from_active_record?, 'Company subclass should not descend from ActiveRecord::Base'
76
- end
77
-
78
- def test_inheritance_base_class
79
- assert_equal Post, Post.base_class
80
- assert_equal Post, SpecialPost.base_class
81
- assert_equal Post, StiPost.base_class
82
- assert_equal SubStiPost, SubStiPost.base_class
83
- end
84
-
85
- def test_abstract_inheritance_base_class
86
- assert_equal LoosePerson, LoosePerson.base_class
87
- assert_equal LooseDescendant, LooseDescendant.base_class
88
- assert_equal TightPerson, TightPerson.base_class
89
- assert_equal TightPerson, TightDescendant.base_class
90
- end
91
-
92
- def test_base_class_activerecord_error
93
- klass = Class.new { include ActiveRecord::Inheritance }
94
- assert_raise(ActiveRecord::ActiveRecordError) { klass.base_class }
95
- end
96
-
97
- def test_a_bad_type_column
98
- Company.connection.insert "INSERT INTO companies (id, #{QUOTED_TYPE}, name) VALUES(100, 'bad_class!', 'Not happening')"
99
-
100
- assert_raise(ActiveRecord::SubclassNotFound) { Company.find(100) }
101
- end
102
-
103
- def test_inheritance_find
104
- assert_kind_of Firm, Company.find(1), "37signals should be a firm"
105
- assert_kind_of Firm, Firm.find(1), "37signals should be a firm"
106
- assert_kind_of Client, Company.find(2), "Summit should be a client"
107
- assert_kind_of Client, Client.find(2), "Summit should be a client"
108
- end
109
-
110
- def test_alt_inheritance_find
111
- assert_kind_of Cucumber, Vegetable.find(1)
112
- assert_kind_of Cucumber, Cucumber.find(1)
113
- assert_kind_of Cabbage, Vegetable.find(2)
114
- assert_kind_of Cabbage, Cabbage.find(2)
115
- end
116
-
117
- def test_alt_becomes_works_with_sti
118
- vegetable = Vegetable.find(1)
119
- assert_kind_of Vegetable, vegetable
120
- cabbage = vegetable.becomes(Cabbage)
121
- assert_kind_of Cabbage, cabbage
122
- end
123
-
124
- def test_becomes_and_change_tracking_for_inheritance_columns
125
- cucumber = Vegetable.find(1)
126
- cabbage = cucumber.becomes!(Cabbage)
127
- assert_equal ['Cucumber', 'Cabbage'], cabbage.custom_type_change
128
- end
129
-
130
- def test_alt_becomes_bang_resets_inheritance_type_column
131
- vegetable = Vegetable.create!(name: "Red Pepper")
132
- assert_nil vegetable.custom_type
133
-
134
- cabbage = vegetable.becomes!(Cabbage)
135
- assert_equal "Cabbage", cabbage.custom_type
136
-
137
- vegetable = cabbage.becomes!(Vegetable)
138
- assert_nil cabbage.custom_type
139
- end
140
-
141
- def test_inheritance_find_all
142
- companies = Company.all.merge!(:order => 'id').to_a
143
- assert_kind_of Firm, companies[0], "37signals should be a firm"
144
- assert_kind_of Client, companies[1], "Summit should be a client"
145
- end
146
-
147
- def test_alt_inheritance_find_all
148
- companies = Vegetable.all.merge!(:order => 'id').to_a
149
- assert_kind_of Cucumber, companies[0]
150
- assert_kind_of Cabbage, companies[1]
151
- end
152
-
153
- def test_inheritance_save
154
- firm = Firm.new
155
- firm.name = "Next Angle"
156
- firm.save
157
-
158
- next_angle = Company.find(firm.id)
159
- assert_kind_of Firm, next_angle, "Next Angle should be a firm"
160
- end
161
-
162
- def test_alt_inheritance_save
163
- cabbage = Cabbage.new(:name => 'Savoy')
164
- cabbage.save!
165
-
166
- savoy = Vegetable.find(cabbage.id)
167
- assert_kind_of Cabbage, savoy
168
- end
169
-
170
- def test_inheritance_new_with_default_class
171
- company = Company.new
172
- assert_equal Company, company.class
173
- end
174
-
175
- def test_inheritance_new_with_base_class
176
- company = Company.new(:type => 'Company')
177
- assert_equal Company, company.class
178
- end
179
-
180
- def test_inheritance_new_with_subclass
181
- firm = Company.new(:type => 'Firm')
182
- assert_equal Firm, firm.class
183
- end
184
-
185
- def test_new_with_abstract_class
186
- e = assert_raises(NotImplementedError) do
187
- AbstractCompany.new
188
- end
189
- assert_equal("AbstractCompany is an abstract class and cannot be instantiated.", e.message)
190
- end
191
-
192
- def test_new_with_ar_base
193
- e = assert_raises(NotImplementedError) do
194
- ActiveRecord::Base.new
195
- end
196
- assert_equal("ActiveRecord::Base is an abstract class and cannot be instantiated.", e.message)
197
- end
198
-
199
- def test_new_with_invalid_type
200
- assert_raise(ActiveRecord::SubclassNotFound) { Company.new(:type => 'InvalidType') }
201
- end
202
-
203
- def test_new_with_unrelated_type
204
- assert_raise(ActiveRecord::SubclassNotFound) { Company.new(:type => 'Account') }
205
- end
206
-
207
- def test_new_with_complex_inheritance
208
- assert_nothing_raised { Client.new(type: 'VerySpecialClient') }
209
- end
210
-
211
- def test_new_with_autoload_paths
212
- path = File.expand_path('../../models/autoloadable', __FILE__)
213
- ActiveSupport::Dependencies.autoload_paths << path
214
-
215
- firm = Company.new(:type => 'ExtraFirm')
216
- assert_equal ExtraFirm, firm.class
217
- ensure
218
- ActiveSupport::Dependencies.autoload_paths.reject! { |p| p == path }
219
- ActiveSupport::Dependencies.clear
220
- end
221
-
222
- def test_inheritance_condition
223
- assert_equal 11, Company.count
224
- assert_equal 2, Firm.count
225
- assert_equal 5, Client.count
226
- end
227
-
228
- def test_alt_inheritance_condition
229
- assert_equal 4, Vegetable.count
230
- assert_equal 1, Cucumber.count
231
- assert_equal 3, Cabbage.count
232
- end
233
-
234
- def test_finding_incorrect_type_data
235
- assert_raise(ActiveRecord::RecordNotFound) { Firm.find(2) }
236
- assert_nothing_raised { Firm.find(1) }
237
- end
238
-
239
- def test_alt_finding_incorrect_type_data
240
- assert_raise(ActiveRecord::RecordNotFound) { Cucumber.find(2) }
241
- assert_nothing_raised { Cucumber.find(1) }
242
- end
243
-
244
- def test_update_all_within_inheritance
245
- Client.update_all "name = 'I am a client'"
246
- assert_equal "I am a client", Client.first.name
247
- # Order by added as otherwise Oracle tests were failing because of different order of results
248
- assert_equal "37signals", Firm.all.merge!(:order => "id").to_a.first.name
249
- end
250
-
251
- def test_alt_update_all_within_inheritance
252
- Cabbage.update_all "name = 'the cabbage'"
253
- assert_equal "the cabbage", Cabbage.first.name
254
- assert_equal ["my cucumber"], Cucumber.all.map(&:name).uniq
255
- end
256
-
257
- def test_destroy_all_within_inheritance
258
- Client.destroy_all
259
- assert_equal 0, Client.count
260
- assert_equal 2, Firm.count
261
- end
262
-
263
- def test_alt_destroy_all_within_inheritance
264
- Cabbage.destroy_all
265
- assert_equal 0, Cabbage.count
266
- assert_equal 1, Cucumber.count
267
- end
268
-
269
- def test_find_first_within_inheritance
270
- assert_kind_of Firm, Company.all.merge!(:where => "name = '37signals'").first
271
- assert_kind_of Firm, Firm.all.merge!(:where => "name = '37signals'").first
272
- assert_nil Client.all.merge!(:where => "name = '37signals'").first
273
- end
274
-
275
- def test_alt_find_first_within_inheritance
276
- assert_kind_of Cabbage, Vegetable.all.merge!(:where => "name = 'his cabbage'").first
277
- assert_kind_of Cabbage, Cabbage.all.merge!(:where => "name = 'his cabbage'").first
278
- assert_nil Cucumber.all.merge!(:where => "name = 'his cabbage'").first
279
- end
280
-
281
- def test_complex_inheritance
282
- very_special_client = VerySpecialClient.create("name" => "veryspecial")
283
- assert_equal very_special_client, VerySpecialClient.where("name = 'veryspecial'").first
284
- assert_equal very_special_client, SpecialClient.all.merge!(:where => "name = 'veryspecial'").first
285
- assert_equal very_special_client, Company.all.merge!(:where => "name = 'veryspecial'").first
286
- assert_equal very_special_client, Client.all.merge!(:where => "name = 'veryspecial'").first
287
- assert_equal 1, Client.all.merge!(:where => "name = 'Summit'").to_a.size
288
- assert_equal very_special_client, Client.find(very_special_client.id)
289
- end
290
-
291
- def test_alt_complex_inheritance
292
- king_cole = KingCole.create("name" => "uniform heads")
293
- assert_equal king_cole, KingCole.where("name = 'uniform heads'").first
294
- assert_equal king_cole, GreenCabbage.all.merge!(:where => "name = 'uniform heads'").first
295
- assert_equal king_cole, Cabbage.all.merge!(:where => "name = 'uniform heads'").first
296
- assert_equal king_cole, Vegetable.all.merge!(:where => "name = 'uniform heads'").first
297
- assert_equal 1, Cabbage.all.merge!(:where => "name = 'his cabbage'").to_a.size
298
- assert_equal king_cole, Cabbage.find(king_cole.id)
299
- end
300
-
301
- def test_eager_load_belongs_to_something_inherited
302
- account = Account.all.merge!(:includes => :firm).find(1)
303
- assert account.association(:firm).loaded?, "association was not eager loaded"
304
- end
305
-
306
- def test_alt_eager_loading
307
- cabbage = RedCabbage.all.merge!(:includes => :seller).find(4)
308
- assert cabbage.association(:seller).loaded?, "association was not eager loaded"
309
- end
310
-
311
- def test_eager_load_belongs_to_primary_key_quoting
312
- con = Account.connection
313
- assert_sql(/#{con.quote_table_name('companies')}.#{con.quote_column_name('id')} IN \(1\)/) do
314
- Account.all.merge!(:includes => :firm).find(1)
315
- end
316
- end
317
-
318
- def test_inherits_custom_primary_key
319
- assert_equal Subscriber.primary_key, SpecialSubscriber.primary_key
320
- end
321
-
322
- def test_inheritance_without_mapping
323
- assert_kind_of SpecialSubscriber, SpecialSubscriber.find("webster132")
324
- assert_nothing_raised { s = SpecialSubscriber.new("name" => "And breaaaaathe!"); s.id = 'roger'; s.save }
325
- end
326
-
327
- def test_scope_inherited_properly
328
- assert_nothing_raised { Company.of_first_firm }
329
- assert_nothing_raised { Client.of_first_firm }
330
- end
331
- end
332
-
333
- class InheritanceComputeTypeTest < ActiveRecord::TestCase
334
- fixtures :companies
335
-
336
- def setup
337
- ActiveSupport::Dependencies.log_activity = true
338
- end
339
-
340
- teardown do
341
- ActiveSupport::Dependencies.log_activity = false
342
- self.class.const_remove :FirmOnTheFly rescue nil
343
- Firm.const_remove :FirmOnTheFly rescue nil
344
- end
345
-
346
- def test_instantiation_doesnt_try_to_require_corresponding_file
347
- ActiveRecord::Base.store_full_sti_class = false
348
- foo = Firm.first.clone
349
- foo.type = 'FirmOnTheFly'
350
- foo.save!
351
-
352
- # Should fail without FirmOnTheFly in the type condition.
353
- assert_raise(ActiveRecord::RecordNotFound) { Firm.find(foo.id) }
354
-
355
- # Nest FirmOnTheFly in the test case where Dependencies won't see it.
356
- self.class.const_set :FirmOnTheFly, Class.new(Firm)
357
- assert_raise(ActiveRecord::SubclassNotFound) { Firm.find(foo.id) }
358
-
359
- # Nest FirmOnTheFly in Firm where Dependencies will see it.
360
- # This is analogous to nesting models in a migration.
361
- Firm.const_set :FirmOnTheFly, Class.new(Firm)
362
-
363
- # And instantiate will find the existing constant rather than trying
364
- # to require firm_on_the_fly.
365
- assert_nothing_raised { assert_kind_of Firm::FirmOnTheFly, Firm.find(foo.id) }
366
- ensure
367
- ActiveRecord::Base.store_full_sti_class = true
368
- end
369
-
370
- def test_sti_type_from_attributes_disabled_in_non_sti_class
371
- phone = Shop::Product::Type.new(name: 'Phone')
372
- product = Shop::Product.new(:type => phone)
373
- assert product.save
374
- end
375
- end
1
+ require 'cases/helper'
2
+ require 'models/company'
3
+ require 'models/person'
4
+ require 'models/post'
5
+ require 'models/project'
6
+ require 'models/subscriber'
7
+ require 'models/vegetables'
8
+ require 'models/shop'
9
+
10
+ class InheritanceTest < ActiveRecord::TestCase
11
+ fixtures :companies, :projects, :subscribers, :accounts, :vegetables
12
+
13
+ def test_class_with_store_full_sti_class_returns_full_name
14
+ old = ActiveRecord::Base.store_full_sti_class
15
+ ActiveRecord::Base.store_full_sti_class = true
16
+ assert_equal 'Namespaced::Company', Namespaced::Company.sti_name
17
+ ensure
18
+ ActiveRecord::Base.store_full_sti_class = old
19
+ end
20
+
21
+ def test_class_with_blank_sti_name
22
+ company = Company.first
23
+ company = company.dup
24
+ company.extend(Module.new {
25
+ def _read_attribute(name)
26
+ return ' ' if name == 'type'
27
+ super
28
+ end
29
+ })
30
+ company.save!
31
+ company = Company.all.to_a.find { |x| x.id == company.id }
32
+ assert_equal ' ', company.type
33
+ end
34
+
35
+ def test_class_without_store_full_sti_class_returns_demodulized_name
36
+ old = ActiveRecord::Base.store_full_sti_class
37
+ ActiveRecord::Base.store_full_sti_class = false
38
+ assert_equal 'Company', Namespaced::Company.sti_name
39
+ ensure
40
+ ActiveRecord::Base.store_full_sti_class = old
41
+ end
42
+
43
+ def test_should_store_demodulized_class_name_with_store_full_sti_class_option_disabled
44
+ old = ActiveRecord::Base.store_full_sti_class
45
+ ActiveRecord::Base.store_full_sti_class = false
46
+ item = Namespaced::Company.new
47
+ assert_equal 'Company', item[:type]
48
+ ensure
49
+ ActiveRecord::Base.store_full_sti_class = old
50
+ end
51
+
52
+ def test_should_store_full_class_name_with_store_full_sti_class_option_enabled
53
+ old = ActiveRecord::Base.store_full_sti_class
54
+ ActiveRecord::Base.store_full_sti_class = true
55
+ item = Namespaced::Company.new
56
+ assert_equal 'Namespaced::Company', item[:type]
57
+ ensure
58
+ ActiveRecord::Base.store_full_sti_class = old
59
+ end
60
+
61
+ def test_different_namespace_subclass_should_load_correctly_with_store_full_sti_class_option
62
+ old = ActiveRecord::Base.store_full_sti_class
63
+ ActiveRecord::Base.store_full_sti_class = true
64
+ item = Namespaced::Company.create :name => "Wolverine 2"
65
+ assert_not_nil Company.find(item.id)
66
+ assert_not_nil Namespaced::Company.find(item.id)
67
+ ensure
68
+ ActiveRecord::Base.store_full_sti_class = old
69
+ end
70
+
71
+ def test_company_descends_from_active_record
72
+ assert !ActiveRecord::Base.descends_from_active_record?
73
+ assert AbstractCompany.descends_from_active_record?, 'AbstractCompany should descend from ActiveRecord::Base'
74
+ assert Company.descends_from_active_record?, 'Company should descend from ActiveRecord::Base'
75
+ assert !Class.new(Company).descends_from_active_record?, 'Company subclass should not descend from ActiveRecord::Base'
76
+ end
77
+
78
+ def test_inheritance_base_class
79
+ assert_equal Post, Post.base_class
80
+ assert_equal Post, SpecialPost.base_class
81
+ assert_equal Post, StiPost.base_class
82
+ assert_equal SubStiPost, SubStiPost.base_class
83
+ end
84
+
85
+ def test_abstract_inheritance_base_class
86
+ assert_equal LoosePerson, LoosePerson.base_class
87
+ assert_equal LooseDescendant, LooseDescendant.base_class
88
+ assert_equal TightPerson, TightPerson.base_class
89
+ assert_equal TightPerson, TightDescendant.base_class
90
+ end
91
+
92
+ def test_base_class_activerecord_error
93
+ klass = Class.new { include ActiveRecord::Inheritance }
94
+ assert_raise(ActiveRecord::ActiveRecordError) { klass.base_class }
95
+ end
96
+
97
+ def test_a_bad_type_column
98
+ Company.connection.insert "INSERT INTO companies (id, #{QUOTED_TYPE}, name) VALUES(100, 'bad_class!', 'Not happening')"
99
+
100
+ assert_raise(ActiveRecord::SubclassNotFound) { Company.find(100) }
101
+ end
102
+
103
+ def test_inheritance_find
104
+ assert_kind_of Firm, Company.find(1), "37signals should be a firm"
105
+ assert_kind_of Firm, Firm.find(1), "37signals should be a firm"
106
+ assert_kind_of Client, Company.find(2), "Summit should be a client"
107
+ assert_kind_of Client, Client.find(2), "Summit should be a client"
108
+ end
109
+
110
+ def test_alt_inheritance_find
111
+ assert_kind_of Cucumber, Vegetable.find(1)
112
+ assert_kind_of Cucumber, Cucumber.find(1)
113
+ assert_kind_of Cabbage, Vegetable.find(2)
114
+ assert_kind_of Cabbage, Cabbage.find(2)
115
+ end
116
+
117
+ def test_alt_becomes_works_with_sti
118
+ vegetable = Vegetable.find(1)
119
+ assert_kind_of Vegetable, vegetable
120
+ cabbage = vegetable.becomes(Cabbage)
121
+ assert_kind_of Cabbage, cabbage
122
+ end
123
+
124
+ def test_becomes_and_change_tracking_for_inheritance_columns
125
+ cucumber = Vegetable.find(1)
126
+ cabbage = cucumber.becomes!(Cabbage)
127
+ assert_equal ['Cucumber', 'Cabbage'], cabbage.custom_type_change
128
+ end
129
+
130
+ def test_alt_becomes_bang_resets_inheritance_type_column
131
+ vegetable = Vegetable.create!(name: "Red Pepper")
132
+ assert_nil vegetable.custom_type
133
+
134
+ cabbage = vegetable.becomes!(Cabbage)
135
+ assert_equal "Cabbage", cabbage.custom_type
136
+
137
+ vegetable = cabbage.becomes!(Vegetable)
138
+ assert_nil cabbage.custom_type
139
+ end
140
+
141
+ def test_inheritance_find_all
142
+ companies = Company.all.merge!(:order => 'id').to_a
143
+ assert_kind_of Firm, companies[0], "37signals should be a firm"
144
+ assert_kind_of Client, companies[1], "Summit should be a client"
145
+ end
146
+
147
+ def test_alt_inheritance_find_all
148
+ companies = Vegetable.all.merge!(:order => 'id').to_a
149
+ assert_kind_of Cucumber, companies[0]
150
+ assert_kind_of Cabbage, companies[1]
151
+ end
152
+
153
+ def test_inheritance_save
154
+ firm = Firm.new
155
+ firm.name = "Next Angle"
156
+ firm.save
157
+
158
+ next_angle = Company.find(firm.id)
159
+ assert_kind_of Firm, next_angle, "Next Angle should be a firm"
160
+ end
161
+
162
+ def test_alt_inheritance_save
163
+ cabbage = Cabbage.new(:name => 'Savoy')
164
+ cabbage.save!
165
+
166
+ savoy = Vegetable.find(cabbage.id)
167
+ assert_kind_of Cabbage, savoy
168
+ end
169
+
170
+ def test_inheritance_new_with_default_class
171
+ company = Company.new
172
+ assert_equal Company, company.class
173
+ end
174
+
175
+ def test_inheritance_new_with_base_class
176
+ company = Company.new(:type => 'Company')
177
+ assert_equal Company, company.class
178
+ end
179
+
180
+ def test_inheritance_new_with_subclass
181
+ firm = Company.new(:type => 'Firm')
182
+ assert_equal Firm, firm.class
183
+ end
184
+
185
+ def test_new_with_abstract_class
186
+ e = assert_raises(NotImplementedError) do
187
+ AbstractCompany.new
188
+ end
189
+ assert_equal("AbstractCompany is an abstract class and cannot be instantiated.", e.message)
190
+ end
191
+
192
+ def test_new_with_ar_base
193
+ e = assert_raises(NotImplementedError) do
194
+ ActiveRecord::Base.new
195
+ end
196
+ assert_equal("ActiveRecord::Base is an abstract class and cannot be instantiated.", e.message)
197
+ end
198
+
199
+ def test_new_with_invalid_type
200
+ assert_raise(ActiveRecord::SubclassNotFound) { Company.new(:type => 'InvalidType') }
201
+ end
202
+
203
+ def test_new_with_unrelated_type
204
+ assert_raise(ActiveRecord::SubclassNotFound) { Company.new(:type => 'Account') }
205
+ end
206
+
207
+ def test_new_with_complex_inheritance
208
+ assert_nothing_raised { Client.new(type: 'VerySpecialClient') }
209
+ end
210
+
211
+ def test_new_with_autoload_paths
212
+ path = File.expand_path('../../models/autoloadable', __FILE__)
213
+ ActiveSupport::Dependencies.autoload_paths << path
214
+
215
+ firm = Company.new(:type => 'ExtraFirm')
216
+ assert_equal ExtraFirm, firm.class
217
+ ensure
218
+ ActiveSupport::Dependencies.autoload_paths.reject! { |p| p == path }
219
+ ActiveSupport::Dependencies.clear
220
+ end
221
+
222
+ def test_inheritance_condition
223
+ assert_equal 11, Company.count
224
+ assert_equal 2, Firm.count
225
+ assert_equal 5, Client.count
226
+ end
227
+
228
+ def test_alt_inheritance_condition
229
+ assert_equal 4, Vegetable.count
230
+ assert_equal 1, Cucumber.count
231
+ assert_equal 3, Cabbage.count
232
+ end
233
+
234
+ def test_finding_incorrect_type_data
235
+ assert_raise(ActiveRecord::RecordNotFound) { Firm.find(2) }
236
+ assert_nothing_raised { Firm.find(1) }
237
+ end
238
+
239
+ def test_alt_finding_incorrect_type_data
240
+ assert_raise(ActiveRecord::RecordNotFound) { Cucumber.find(2) }
241
+ assert_nothing_raised { Cucumber.find(1) }
242
+ end
243
+
244
+ def test_update_all_within_inheritance
245
+ Client.update_all "name = 'I am a client'"
246
+ assert_equal "I am a client", Client.first.name
247
+ # Order by added as otherwise Oracle tests were failing because of different order of results
248
+ assert_equal "37signals", Firm.all.merge!(:order => "id").to_a.first.name
249
+ end
250
+
251
+ def test_alt_update_all_within_inheritance
252
+ Cabbage.update_all "name = 'the cabbage'"
253
+ assert_equal "the cabbage", Cabbage.first.name
254
+ assert_equal ["my cucumber"], Cucumber.all.map(&:name).uniq
255
+ end
256
+
257
+ def test_destroy_all_within_inheritance
258
+ Client.destroy_all
259
+ assert_equal 0, Client.count
260
+ assert_equal 2, Firm.count
261
+ end
262
+
263
+ def test_alt_destroy_all_within_inheritance
264
+ Cabbage.destroy_all
265
+ assert_equal 0, Cabbage.count
266
+ assert_equal 1, Cucumber.count
267
+ end
268
+
269
+ def test_find_first_within_inheritance
270
+ assert_kind_of Firm, Company.all.merge!(:where => "name = '37signals'").first
271
+ assert_kind_of Firm, Firm.all.merge!(:where => "name = '37signals'").first
272
+ assert_nil Client.all.merge!(:where => "name = '37signals'").first
273
+ end
274
+
275
+ def test_alt_find_first_within_inheritance
276
+ assert_kind_of Cabbage, Vegetable.all.merge!(:where => "name = 'his cabbage'").first
277
+ assert_kind_of Cabbage, Cabbage.all.merge!(:where => "name = 'his cabbage'").first
278
+ assert_nil Cucumber.all.merge!(:where => "name = 'his cabbage'").first
279
+ end
280
+
281
+ def test_complex_inheritance
282
+ very_special_client = VerySpecialClient.create("name" => "veryspecial")
283
+ assert_equal very_special_client, VerySpecialClient.where("name = 'veryspecial'").first
284
+ assert_equal very_special_client, SpecialClient.all.merge!(:where => "name = 'veryspecial'").first
285
+ assert_equal very_special_client, Company.all.merge!(:where => "name = 'veryspecial'").first
286
+ assert_equal very_special_client, Client.all.merge!(:where => "name = 'veryspecial'").first
287
+ assert_equal 1, Client.all.merge!(:where => "name = 'Summit'").to_a.size
288
+ assert_equal very_special_client, Client.find(very_special_client.id)
289
+ end
290
+
291
+ def test_alt_complex_inheritance
292
+ king_cole = KingCole.create("name" => "uniform heads")
293
+ assert_equal king_cole, KingCole.where("name = 'uniform heads'").first
294
+ assert_equal king_cole, GreenCabbage.all.merge!(:where => "name = 'uniform heads'").first
295
+ assert_equal king_cole, Cabbage.all.merge!(:where => "name = 'uniform heads'").first
296
+ assert_equal king_cole, Vegetable.all.merge!(:where => "name = 'uniform heads'").first
297
+ assert_equal 1, Cabbage.all.merge!(:where => "name = 'his cabbage'").to_a.size
298
+ assert_equal king_cole, Cabbage.find(king_cole.id)
299
+ end
300
+
301
+ def test_eager_load_belongs_to_something_inherited
302
+ account = Account.all.merge!(:includes => :firm).find(1)
303
+ assert account.association(:firm).loaded?, "association was not eager loaded"
304
+ end
305
+
306
+ def test_alt_eager_loading
307
+ cabbage = RedCabbage.all.merge!(:includes => :seller).find(4)
308
+ assert cabbage.association(:seller).loaded?, "association was not eager loaded"
309
+ end
310
+
311
+ def test_eager_load_belongs_to_primary_key_quoting
312
+ con = Account.connection
313
+ assert_sql(/#{con.quote_table_name('companies')}.#{con.quote_column_name('id')} IN \(1\)/) do
314
+ Account.all.merge!(:includes => :firm).find(1)
315
+ end
316
+ end
317
+
318
+ def test_inherits_custom_primary_key
319
+ assert_equal Subscriber.primary_key, SpecialSubscriber.primary_key
320
+ end
321
+
322
+ def test_inheritance_without_mapping
323
+ assert_kind_of SpecialSubscriber, SpecialSubscriber.find("webster132")
324
+ assert_nothing_raised { s = SpecialSubscriber.new("name" => "And breaaaaathe!"); s.id = 'roger'; s.save }
325
+ end
326
+
327
+ def test_scope_inherited_properly
328
+ assert_nothing_raised { Company.of_first_firm }
329
+ assert_nothing_raised { Client.of_first_firm }
330
+ end
331
+ end
332
+
333
+ class InheritanceComputeTypeTest < ActiveRecord::TestCase
334
+ fixtures :companies
335
+
336
+ def setup
337
+ ActiveSupport::Dependencies.log_activity = true
338
+ end
339
+
340
+ teardown do
341
+ ActiveSupport::Dependencies.log_activity = false
342
+ self.class.const_remove :FirmOnTheFly rescue nil
343
+ Firm.const_remove :FirmOnTheFly rescue nil
344
+ end
345
+
346
+ def test_instantiation_doesnt_try_to_require_corresponding_file
347
+ ActiveRecord::Base.store_full_sti_class = false
348
+ foo = Firm.first.clone
349
+ foo.type = 'FirmOnTheFly'
350
+ foo.save!
351
+
352
+ # Should fail without FirmOnTheFly in the type condition.
353
+ assert_raise(ActiveRecord::RecordNotFound) { Firm.find(foo.id) }
354
+
355
+ # Nest FirmOnTheFly in the test case where Dependencies won't see it.
356
+ self.class.const_set :FirmOnTheFly, Class.new(Firm)
357
+ assert_raise(ActiveRecord::SubclassNotFound) { Firm.find(foo.id) }
358
+
359
+ # Nest FirmOnTheFly in Firm where Dependencies will see it.
360
+ # This is analogous to nesting models in a migration.
361
+ Firm.const_set :FirmOnTheFly, Class.new(Firm)
362
+
363
+ # And instantiate will find the existing constant rather than trying
364
+ # to require firm_on_the_fly.
365
+ assert_nothing_raised { assert_kind_of Firm::FirmOnTheFly, Firm.find(foo.id) }
366
+ ensure
367
+ ActiveRecord::Base.store_full_sti_class = true
368
+ end
369
+
370
+ def test_sti_type_from_attributes_disabled_in_non_sti_class
371
+ phone = Shop::Product::Type.new(name: 'Phone')
372
+ product = Shop::Product.new(:type => phone)
373
+ assert product.save
374
+ end
375
+ end