ibm_db 4.0.0-x86-mingw32 → 5.1.0-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (576) hide show
  1. checksums.yaml +5 -5
  2. data/MANIFEST +14 -14
  3. data/README +208 -208
  4. data/ext/Makefile +269 -0
  5. data/ext/Makefile.nt32 +181 -181
  6. data/ext/Makefile.nt32.191 +212 -212
  7. data/ext/extconf.rb +322 -291
  8. data/ext/gil_release_version.h +3 -0
  9. data/ext/ibm_db-i386-mingw32.def +2 -0
  10. data/ext/ibm_db.c +11879 -11887
  11. data/ext/ibm_db.o +0 -0
  12. data/ext/ibm_db.so +0 -0
  13. data/ext/mkmf.log +110 -0
  14. data/ext/ruby_ibm_db.h +241 -241
  15. data/ext/ruby_ibm_db_cli.c +866 -866
  16. data/ext/ruby_ibm_db_cli.h +500 -500
  17. data/ext/ruby_ibm_db_cli.o +0 -0
  18. data/ext/unicode_support_version.h +3 -0
  19. data/init.rb +41 -41
  20. data/lib/IBM_DB.rb +27 -27
  21. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3593 -3452
  22. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -5
  23. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  24. data/lib/mswin32/ibm_db.rb +94 -90
  25. data/lib/mswin32/rb2x/i386/ruby26/ibm_db.so +0 -0
  26. data/lib/mswin32/rb2x/i386/ruby27/ibm_db.so +0 -0
  27. data/test/active_record/connection_adapters/fake_adapter.rb +49 -49
  28. data/test/assets/example.log +1 -1
  29. data/test/assets/test.txt +1 -1
  30. data/test/cases/adapter_test.rb +351 -351
  31. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -193
  32. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -50
  33. data/test/cases/adapters/mysql2/boolean_test.rb +100 -100
  34. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -63
  35. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -54
  36. data/test/cases/adapters/mysql2/connection_test.rb +210 -210
  37. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -45
  38. data/test/cases/adapters/mysql2/enum_test.rb +26 -26
  39. data/test/cases/adapters/mysql2/explain_test.rb +21 -21
  40. data/test/cases/adapters/mysql2/json_test.rb +195 -195
  41. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -83
  42. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -152
  43. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -59
  44. data/test/cases/adapters/mysql2/schema_test.rb +126 -126
  45. data/test/cases/adapters/mysql2/sp_test.rb +36 -36
  46. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -14
  47. data/test/cases/adapters/mysql2/table_options_test.rb +42 -42
  48. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -66
  49. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -98
  50. data/test/cases/adapters/postgresql/array_test.rb +339 -339
  51. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -82
  52. data/test/cases/adapters/postgresql/bytea_test.rb +134 -134
  53. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -26
  54. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -38
  55. data/test/cases/adapters/postgresql/cidr_test.rb +25 -25
  56. data/test/cases/adapters/postgresql/citext_test.rb +78 -78
  57. data/test/cases/adapters/postgresql/collation_test.rb +53 -53
  58. data/test/cases/adapters/postgresql/composite_test.rb +132 -132
  59. data/test/cases/adapters/postgresql/connection_test.rb +257 -257
  60. data/test/cases/adapters/postgresql/datatype_test.rb +92 -92
  61. data/test/cases/adapters/postgresql/domain_test.rb +47 -47
  62. data/test/cases/adapters/postgresql/enum_test.rb +91 -91
  63. data/test/cases/adapters/postgresql/explain_test.rb +20 -20
  64. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -63
  65. data/test/cases/adapters/postgresql/full_text_test.rb +44 -44
  66. data/test/cases/adapters/postgresql/geometric_test.rb +378 -378
  67. data/test/cases/adapters/postgresql/hstore_test.rb +382 -382
  68. data/test/cases/adapters/postgresql/infinity_test.rb +69 -69
  69. data/test/cases/adapters/postgresql/integer_test.rb +25 -25
  70. data/test/cases/adapters/postgresql/json_test.rb +237 -237
  71. data/test/cases/adapters/postgresql/ltree_test.rb +53 -53
  72. data/test/cases/adapters/postgresql/money_test.rb +96 -96
  73. data/test/cases/adapters/postgresql/network_test.rb +94 -94
  74. data/test/cases/adapters/postgresql/numbers_test.rb +49 -49
  75. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -405
  76. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -22
  77. data/test/cases/adapters/postgresql/quoting_test.rb +44 -44
  78. data/test/cases/adapters/postgresql/range_test.rb +343 -343
  79. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -111
  80. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -34
  81. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -119
  82. data/test/cases/adapters/postgresql/schema_test.rb +597 -597
  83. data/test/cases/adapters/postgresql/serial_test.rb +154 -154
  84. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -41
  85. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -90
  86. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -33
  87. data/test/cases/adapters/postgresql/utils_test.rb +62 -62
  88. data/test/cases/adapters/postgresql/uuid_test.rb +294 -294
  89. data/test/cases/adapters/postgresql/xml_test.rb +54 -54
  90. data/test/cases/adapters/sqlite3/collation_test.rb +53 -53
  91. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -98
  92. data/test/cases/adapters/sqlite3/explain_test.rb +21 -21
  93. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -101
  94. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -441
  95. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -24
  96. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -20
  97. data/test/cases/aggregations_test.rb +168 -168
  98. data/test/cases/ar_schema_test.rb +146 -146
  99. data/test/cases/associations/association_scope_test.rb +16 -16
  100. data/test/cases/associations/belongs_to_associations_test.rb +1141 -1141
  101. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -41
  102. data/test/cases/associations/callbacks_test.rb +190 -190
  103. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  104. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  105. data/test/cases/associations/eager_load_nested_include_test.rb +126 -126
  106. data/test/cases/associations/eager_singularization_test.rb +148 -148
  107. data/test/cases/associations/eager_test.rb +1514 -1514
  108. data/test/cases/associations/extension_test.rb +87 -87
  109. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -1004
  110. data/test/cases/associations/has_many_associations_test.rb +2501 -2501
  111. data/test/cases/associations/has_many_through_associations_test.rb +1271 -1271
  112. data/test/cases/associations/has_one_associations_test.rb +707 -707
  113. data/test/cases/associations/has_one_through_associations_test.rb +383 -383
  114. data/test/cases/associations/inner_join_association_test.rb +139 -139
  115. data/test/cases/associations/inverse_associations_test.rb +733 -733
  116. data/test/cases/associations/join_model_test.rb +777 -777
  117. data/test/cases/associations/left_outer_join_association_test.rb +88 -88
  118. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  119. data/test/cases/associations/required_test.rb +102 -102
  120. data/test/cases/associations_test.rb +385 -385
  121. data/test/cases/attribute_decorators_test.rb +126 -125
  122. data/test/cases/attribute_methods/read_test.rb +60 -60
  123. data/test/cases/attribute_methods_test.rb +1009 -1009
  124. data/test/cases/attribute_set_test.rb +270 -270
  125. data/test/cases/attribute_test.rb +246 -246
  126. data/test/cases/attributes_test.rb +253 -253
  127. data/test/cases/autosave_association_test.rb +1708 -1708
  128. data/test/cases/base_test.rb +1713 -1713
  129. data/test/cases/batches_test.rb +489 -489
  130. data/test/cases/binary_test.rb +44 -44
  131. data/test/cases/bind_parameter_test.rb +110 -110
  132. data/test/cases/cache_key_test.rb +26 -25
  133. data/test/cases/calculations_test.rb +798 -798
  134. data/test/cases/callbacks_test.rb +636 -636
  135. data/test/cases/clone_test.rb +40 -40
  136. data/test/cases/coders/json_test.rb +15 -15
  137. data/test/cases/coders/yaml_column_test.rb +63 -63
  138. data/test/cases/collection_cache_key_test.rb +115 -115
  139. data/test/cases/column_alias_test.rb +17 -17
  140. data/test/cases/column_definition_test.rb +92 -92
  141. data/test/cases/comment_test.rb +145 -143
  142. data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -56
  143. data/test/cases/connection_adapters/connection_handler_test.rb +160 -160
  144. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  145. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -255
  146. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -69
  147. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  148. data/test/cases/connection_adapters/schema_cache_test.rb +61 -61
  149. data/test/cases/connection_adapters/type_lookup_test.rb +118 -118
  150. data/test/cases/connection_management_test.rb +112 -112
  151. data/test/cases/connection_pool_test.rb +521 -521
  152. data/test/cases/connection_specification/resolver_test.rb +131 -131
  153. data/test/cases/core_test.rb +112 -112
  154. data/test/cases/counter_cache_test.rb +214 -214
  155. data/test/cases/custom_locking_test.rb +17 -17
  156. data/test/cases/database_statements_test.rb +34 -34
  157. data/test/cases/date_test.rb +44 -44
  158. data/test/cases/date_time_precision_test.rb +107 -106
  159. data/test/cases/date_time_test.rb +61 -61
  160. data/test/cases/defaults_test.rb +219 -218
  161. data/test/cases/dirty_test.rb +763 -763
  162. data/test/cases/disconnected_test.rb +30 -30
  163. data/test/cases/dup_test.rb +157 -157
  164. data/test/cases/enum_test.rb +444 -444
  165. data/test/cases/errors_test.rb +16 -16
  166. data/test/cases/explain_subscriber_test.rb +64 -64
  167. data/test/cases/explain_test.rb +87 -87
  168. data/test/cases/finder_respond_to_test.rb +60 -60
  169. data/test/cases/finder_test.rb +1294 -1294
  170. data/test/cases/fixture_set/file_test.rb +156 -156
  171. data/test/cases/fixtures_test.rb +988 -988
  172. data/test/cases/forbidden_attributes_protection_test.rb +165 -165
  173. data/test/cases/habtm_destroy_order_test.rb +61 -61
  174. data/test/cases/helper.rb +204 -204
  175. data/test/cases/hot_compatibility_test.rb +142 -142
  176. data/test/cases/i18n_test.rb +45 -45
  177. data/test/cases/inheritance_test.rb +606 -606
  178. data/test/cases/integration_test.rb +155 -155
  179. data/test/cases/invalid_connection_test.rb +24 -24
  180. data/test/cases/invertible_migration_test.rb +387 -387
  181. data/test/cases/json_serialization_test.rb +311 -311
  182. data/test/cases/locking_test.rb +493 -493
  183. data/test/cases/log_subscriber_test.rb +225 -225
  184. data/test/cases/migration/change_schema_test.rb +458 -458
  185. data/test/cases/migration/change_table_test.rb +256 -256
  186. data/test/cases/migration/column_attributes_test.rb +176 -176
  187. data/test/cases/migration/column_positioning_test.rb +56 -56
  188. data/test/cases/migration/columns_test.rb +310 -310
  189. data/test/cases/migration/command_recorder_test.rb +350 -350
  190. data/test/cases/migration/compatibility_test.rb +118 -118
  191. data/test/cases/migration/create_join_table_test.rb +157 -157
  192. data/test/cases/migration/foreign_key_test.rb +362 -360
  193. data/test/cases/migration/helper.rb +39 -39
  194. data/test/cases/migration/index_test.rb +218 -218
  195. data/test/cases/migration/logger_test.rb +36 -36
  196. data/test/cases/migration/pending_migrations_test.rb +52 -52
  197. data/test/cases/migration/references_foreign_key_test.rb +221 -216
  198. data/test/cases/migration/references_index_test.rb +101 -101
  199. data/test/cases/migration/references_statements_test.rb +136 -136
  200. data/test/cases/migration/rename_table_test.rb +93 -93
  201. data/test/cases/migration_test.rb +1157 -1157
  202. data/test/cases/migrator_test.rb +471 -470
  203. data/test/cases/mixin_test.rb +68 -68
  204. data/test/cases/modules_test.rb +172 -172
  205. data/test/cases/multiparameter_attributes_test.rb +372 -372
  206. data/test/cases/multiple_db_test.rb +122 -122
  207. data/test/cases/nested_attributes_test.rb +1098 -1098
  208. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  209. data/test/cases/persistence_test.rb +1001 -1001
  210. data/test/cases/pooled_connections_test.rb +81 -81
  211. data/test/cases/primary_keys_test.rb +376 -376
  212. data/test/cases/query_cache_test.rb +446 -446
  213. data/test/cases/quoting_test.rb +202 -202
  214. data/test/cases/readonly_test.rb +119 -119
  215. data/test/cases/reaper_test.rb +85 -85
  216. data/test/cases/reflection_test.rb +509 -509
  217. data/test/cases/relation/delegation_test.rb +63 -63
  218. data/test/cases/relation/merging_test.rb +157 -157
  219. data/test/cases/relation/mutation_test.rb +183 -183
  220. data/test/cases/relation/or_test.rb +92 -92
  221. data/test/cases/relation/predicate_builder_test.rb +16 -16
  222. data/test/cases/relation/record_fetch_warning_test.rb +40 -40
  223. data/test/cases/relation/where_chain_test.rb +105 -105
  224. data/test/cases/relation/where_clause_test.rb +182 -182
  225. data/test/cases/relation/where_test.rb +322 -322
  226. data/test/cases/relation_test.rb +328 -328
  227. data/test/cases/relations_test.rb +2026 -2026
  228. data/test/cases/reload_models_test.rb +22 -22
  229. data/test/cases/result_test.rb +90 -90
  230. data/test/cases/sanitize_test.rb +176 -176
  231. data/test/cases/schema_dumper_test.rb +457 -457
  232. data/test/cases/schema_loading_test.rb +52 -52
  233. data/test/cases/scoping/default_scoping_test.rb +528 -528
  234. data/test/cases/scoping/named_scoping_test.rb +561 -561
  235. data/test/cases/scoping/relation_scoping_test.rb +400 -400
  236. data/test/cases/secure_token_test.rb +32 -32
  237. data/test/cases/serialization_test.rb +104 -104
  238. data/test/cases/serialized_attribute_test.rb +364 -364
  239. data/test/cases/statement_cache_test.rb +136 -136
  240. data/test/cases/store_test.rb +195 -195
  241. data/test/cases/suppressor_test.rb +63 -63
  242. data/test/cases/tasks/database_tasks_test.rb +462 -462
  243. data/test/cases/tasks/mysql_rake_test.rb +345 -345
  244. data/test/cases/tasks/postgresql_rake_test.rb +304 -304
  245. data/test/cases/tasks/sqlite_rake_test.rb +220 -220
  246. data/test/cases/test_case.rb +131 -131
  247. data/test/cases/test_fixtures_test.rb +36 -36
  248. data/test/cases/time_precision_test.rb +103 -102
  249. data/test/cases/timestamp_test.rb +501 -501
  250. data/test/cases/touch_later_test.rb +121 -121
  251. data/test/cases/transaction_callbacks_test.rb +518 -518
  252. data/test/cases/transaction_isolation_test.rb +106 -106
  253. data/test/cases/transactions_test.rb +835 -834
  254. data/test/cases/type/adapter_specific_registry_test.rb +133 -133
  255. data/test/cases/type/date_time_test.rb +14 -14
  256. data/test/cases/type/integer_test.rb +27 -27
  257. data/test/cases/type/string_test.rb +22 -22
  258. data/test/cases/type/type_map_test.rb +177 -177
  259. data/test/cases/type_test.rb +39 -39
  260. data/test/cases/types_test.rb +24 -24
  261. data/test/cases/unconnected_test.rb +33 -33
  262. data/test/cases/validations/absence_validation_test.rb +73 -73
  263. data/test/cases/validations/association_validation_test.rb +97 -97
  264. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  265. data/test/cases/validations/i18n_validation_test.rb +86 -86
  266. data/test/cases/validations/length_validation_test.rb +79 -79
  267. data/test/cases/validations/presence_validation_test.rb +103 -103
  268. data/test/cases/validations/uniqueness_validation_test.rb +548 -548
  269. data/test/cases/validations_repair_helper.rb +19 -19
  270. data/test/cases/validations_test.rb +194 -194
  271. data/test/cases/view_test.rb +216 -216
  272. data/test/cases/yaml_serialization_test.rb +121 -121
  273. data/test/config.example.yml +97 -97
  274. data/test/config.rb +5 -5
  275. data/test/connections/native_ibm_db/connection.rb +44 -0
  276. data/test/fixtures/accounts.yml +29 -29
  277. data/test/fixtures/admin/accounts.yml +2 -2
  278. data/test/fixtures/admin/users.yml +10 -10
  279. data/test/fixtures/author_addresses.yml +17 -17
  280. data/test/fixtures/author_favorites.yml +3 -3
  281. data/test/fixtures/authors.yml +23 -23
  282. data/test/fixtures/bad_posts.yml +9 -9
  283. data/test/fixtures/binaries.yml +133 -133
  284. data/test/fixtures/books.yml +31 -31
  285. data/test/fixtures/bulbs.yml +5 -5
  286. data/test/fixtures/cars.yml +9 -9
  287. data/test/fixtures/categories.yml +19 -19
  288. data/test/fixtures/categories/special_categories.yml +9 -9
  289. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  290. data/test/fixtures/categories_ordered.yml +7 -7
  291. data/test/fixtures/categories_posts.yml +31 -31
  292. data/test/fixtures/categorizations.yml +23 -23
  293. data/test/fixtures/clubs.yml +8 -8
  294. data/test/fixtures/collections.yml +3 -3
  295. data/test/fixtures/colleges.yml +3 -3
  296. data/test/fixtures/comments.yml +65 -65
  297. data/test/fixtures/companies.yml +67 -67
  298. data/test/fixtures/computers.yml +10 -10
  299. data/test/fixtures/content.yml +3 -3
  300. data/test/fixtures/content_positions.yml +3 -3
  301. data/test/fixtures/courses.yml +8 -8
  302. data/test/fixtures/customers.yml +25 -25
  303. data/test/fixtures/dashboards.yml +6 -6
  304. data/test/fixtures/dead_parrots.yml +5 -5
  305. data/test/fixtures/developers.yml +22 -22
  306. data/test/fixtures/developers_projects.yml +16 -16
  307. data/test/fixtures/dog_lovers.yml +7 -7
  308. data/test/fixtures/dogs.yml +4 -4
  309. data/test/fixtures/doubloons.yml +3 -3
  310. data/test/fixtures/edges.yml +5 -5
  311. data/test/fixtures/entrants.yml +14 -14
  312. data/test/fixtures/essays.yml +6 -6
  313. data/test/fixtures/faces.yml +11 -11
  314. data/test/fixtures/fk_test_has_fk.yml +3 -3
  315. data/test/fixtures/fk_test_has_pk.yml +1 -1
  316. data/test/fixtures/friendships.yml +4 -4
  317. data/test/fixtures/funny_jokes.yml +10 -10
  318. data/test/fixtures/interests.yml +33 -33
  319. data/test/fixtures/items.yml +3 -3
  320. data/test/fixtures/jobs.yml +7 -7
  321. data/test/fixtures/legacy_things.yml +3 -3
  322. data/test/fixtures/live_parrots.yml +4 -4
  323. data/test/fixtures/mateys.yml +4 -4
  324. data/test/fixtures/member_details.yml +8 -8
  325. data/test/fixtures/member_types.yml +6 -6
  326. data/test/fixtures/members.yml +11 -11
  327. data/test/fixtures/memberships.yml +34 -34
  328. data/test/fixtures/men.yml +5 -5
  329. data/test/fixtures/minimalistics.yml +2 -2
  330. data/test/fixtures/minivans.yml +5 -5
  331. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  332. data/test/fixtures/mixins.yml +29 -29
  333. data/test/fixtures/movies.yml +7 -7
  334. data/test/fixtures/naked/yml/accounts.yml +1 -1
  335. data/test/fixtures/naked/yml/companies.yml +1 -1
  336. data/test/fixtures/naked/yml/courses.yml +1 -1
  337. data/test/fixtures/naked/yml/parrots.yml +2 -2
  338. data/test/fixtures/naked/yml/trees.yml +3 -3
  339. data/test/fixtures/nodes.yml +29 -29
  340. data/test/fixtures/organizations.yml +5 -5
  341. data/test/fixtures/other_comments.yml +6 -6
  342. data/test/fixtures/other_dogs.yml +2 -2
  343. data/test/fixtures/other_posts.yml +7 -7
  344. data/test/fixtures/other_topics.yml +42 -42
  345. data/test/fixtures/owners.yml +9 -9
  346. data/test/fixtures/parrots.yml +27 -27
  347. data/test/fixtures/parrots_pirates.yml +7 -7
  348. data/test/fixtures/people.yml +24 -24
  349. data/test/fixtures/peoples_treasures.yml +3 -3
  350. data/test/fixtures/pets.yml +19 -19
  351. data/test/fixtures/pirates.yml +12 -15
  352. data/test/fixtures/posts.yml +80 -80
  353. data/test/fixtures/price_estimates.yml +16 -16
  354. data/test/fixtures/products.yml +4 -4
  355. data/test/fixtures/projects.yml +7 -7
  356. data/test/fixtures/ratings.yml +14 -14
  357. data/test/fixtures/readers.yml +11 -11
  358. data/test/fixtures/references.yml +17 -17
  359. data/test/fixtures/reserved_words/distinct.yml +5 -5
  360. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  361. data/test/fixtures/reserved_words/group.yml +14 -14
  362. data/test/fixtures/reserved_words/select.yml +8 -8
  363. data/test/fixtures/reserved_words/values.yml +7 -7
  364. data/test/fixtures/ships.yml +6 -6
  365. data/test/fixtures/speedometers.yml +8 -8
  366. data/test/fixtures/sponsors.yml +12 -12
  367. data/test/fixtures/string_key_objects.yml +7 -7
  368. data/test/fixtures/subscribers.yml +10 -10
  369. data/test/fixtures/subscriptions.yml +12 -12
  370. data/test/fixtures/taggings.yml +78 -78
  371. data/test/fixtures/tags.yml +11 -11
  372. data/test/fixtures/tasks.yml +7 -7
  373. data/test/fixtures/teapots.yml +3 -3
  374. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  375. data/test/fixtures/to_be_linked/users.yml +10 -10
  376. data/test/fixtures/topics.yml +49 -49
  377. data/test/fixtures/toys.yml +14 -14
  378. data/test/fixtures/traffic_lights.yml +9 -9
  379. data/test/fixtures/treasures.yml +10 -10
  380. data/test/fixtures/trees.yml +3 -3
  381. data/test/fixtures/uuid_children.yml +3 -3
  382. data/test/fixtures/uuid_parents.yml +2 -2
  383. data/test/fixtures/variants.yml +4 -4
  384. data/test/fixtures/vegetables.yml +19 -19
  385. data/test/fixtures/vertices.yml +3 -3
  386. data/test/fixtures/warehouse_things.yml +2 -2
  387. data/test/fixtures/zines.yml +5 -5
  388. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  389. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  390. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  391. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -9
  392. data/test/migrations/missing/1_people_have_last_names.rb +9 -9
  393. data/test/migrations/missing/3_we_need_reminders.rb +12 -12
  394. data/test/migrations/missing/4_innocent_jointable.rb +12 -12
  395. data/test/migrations/rename/1_we_need_things.rb +11 -11
  396. data/test/migrations/rename/2_rename_things.rb +9 -9
  397. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  398. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  399. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  400. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  401. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  402. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  403. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  404. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  405. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  406. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  407. data/test/migrations/valid/2_we_need_reminders.rb +12 -12
  408. data/test/migrations/valid/3_innocent_jointable.rb +12 -12
  409. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  410. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -12
  411. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -12
  412. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  413. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  414. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  415. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  416. data/test/models/admin.rb +5 -5
  417. data/test/models/admin/account.rb +3 -3
  418. data/test/models/admin/user.rb +40 -40
  419. data/test/models/aircraft.rb +5 -5
  420. data/test/models/arunit2_model.rb +3 -3
  421. data/test/models/author.rb +209 -209
  422. data/test/models/auto_id.rb +4 -4
  423. data/test/models/autoloadable/extra_firm.rb +2 -2
  424. data/test/models/binary.rb +2 -2
  425. data/test/models/bird.rb +12 -12
  426. data/test/models/book.rb +23 -23
  427. data/test/models/boolean.rb +2 -2
  428. data/test/models/bulb.rb +52 -52
  429. data/test/models/cake_designer.rb +3 -3
  430. data/test/models/car.rb +29 -29
  431. data/test/models/carrier.rb +2 -2
  432. data/test/models/cat.rb +10 -10
  433. data/test/models/categorization.rb +19 -19
  434. data/test/models/category.rb +35 -35
  435. data/test/models/chef.rb +8 -8
  436. data/test/models/citation.rb +3 -3
  437. data/test/models/club.rb +25 -25
  438. data/test/models/college.rb +10 -10
  439. data/test/models/column.rb +3 -3
  440. data/test/models/column_name.rb +3 -3
  441. data/test/models/comment.rb +76 -76
  442. data/test/models/company.rb +230 -230
  443. data/test/models/company_in_module.rb +98 -98
  444. data/test/models/computer.rb +3 -3
  445. data/test/models/contact.rb +41 -41
  446. data/test/models/content.rb +40 -40
  447. data/test/models/contract.rb +20 -20
  448. data/test/models/country.rb +7 -7
  449. data/test/models/course.rb +6 -6
  450. data/test/models/customer.rb +83 -83
  451. data/test/models/customer_carrier.rb +14 -14
  452. data/test/models/dashboard.rb +3 -3
  453. data/test/models/default.rb +2 -2
  454. data/test/models/department.rb +4 -4
  455. data/test/models/developer.rb +274 -274
  456. data/test/models/dog.rb +5 -5
  457. data/test/models/dog_lover.rb +5 -5
  458. data/test/models/doubloon.rb +12 -12
  459. data/test/models/drink_designer.rb +3 -3
  460. data/test/models/edge.rb +5 -5
  461. data/test/models/electron.rb +5 -5
  462. data/test/models/engine.rb +4 -4
  463. data/test/models/entrant.rb +3 -3
  464. data/test/models/essay.rb +5 -5
  465. data/test/models/event.rb +3 -3
  466. data/test/models/eye.rb +37 -37
  467. data/test/models/face.rb +9 -9
  468. data/test/models/friendship.rb +6 -6
  469. data/test/models/guid.rb +2 -2
  470. data/test/models/guitar.rb +4 -4
  471. data/test/models/hotel.rb +11 -11
  472. data/test/models/image.rb +3 -3
  473. data/test/models/interest.rb +5 -5
  474. data/test/models/invoice.rb +4 -4
  475. data/test/models/item.rb +7 -7
  476. data/test/models/job.rb +7 -7
  477. data/test/models/joke.rb +7 -7
  478. data/test/models/keyboard.rb +3 -3
  479. data/test/models/legacy_thing.rb +3 -3
  480. data/test/models/lesson.rb +11 -11
  481. data/test/models/line_item.rb +3 -3
  482. data/test/models/liquid.rb +4 -4
  483. data/test/models/man.rb +11 -11
  484. data/test/models/matey.rb +4 -4
  485. data/test/models/member.rb +42 -42
  486. data/test/models/member_detail.rb +8 -8
  487. data/test/models/member_type.rb +3 -3
  488. data/test/models/membership.rb +35 -35
  489. data/test/models/mentor.rb +2 -2
  490. data/test/models/minimalistic.rb +2 -2
  491. data/test/models/minivan.rb +9 -9
  492. data/test/models/mixed_case_monkey.rb +3 -3
  493. data/test/models/mocktail_designer.rb +2 -2
  494. data/test/models/molecule.rb +6 -6
  495. data/test/models/movie.rb +5 -5
  496. data/test/models/node.rb +5 -5
  497. data/test/models/non_primary_key.rb +2 -2
  498. data/test/models/notification.rb +3 -3
  499. data/test/models/order.rb +4 -4
  500. data/test/models/organization.rb +14 -14
  501. data/test/models/other_dog.rb +5 -5
  502. data/test/models/owner.rb +37 -37
  503. data/test/models/parrot.rb +28 -28
  504. data/test/models/person.rb +142 -142
  505. data/test/models/personal_legacy_thing.rb +4 -4
  506. data/test/models/pet.rb +18 -18
  507. data/test/models/pet_treasure.rb +6 -6
  508. data/test/models/pirate.rb +92 -92
  509. data/test/models/possession.rb +3 -3
  510. data/test/models/post.rb +273 -273
  511. data/test/models/price_estimate.rb +4 -4
  512. data/test/models/professor.rb +5 -5
  513. data/test/models/project.rb +40 -40
  514. data/test/models/publisher.rb +2 -2
  515. data/test/models/publisher/article.rb +4 -4
  516. data/test/models/publisher/magazine.rb +3 -3
  517. data/test/models/rating.rb +4 -4
  518. data/test/models/reader.rb +23 -23
  519. data/test/models/recipe.rb +3 -3
  520. data/test/models/record.rb +2 -2
  521. data/test/models/reference.rb +22 -22
  522. data/test/models/reply.rb +61 -61
  523. data/test/models/ship.rb +39 -39
  524. data/test/models/ship_part.rb +8 -8
  525. data/test/models/shop.rb +17 -17
  526. data/test/models/shop_account.rb +6 -6
  527. data/test/models/speedometer.rb +6 -6
  528. data/test/models/sponsor.rb +7 -7
  529. data/test/models/string_key_object.rb +3 -3
  530. data/test/models/student.rb +4 -4
  531. data/test/models/subject.rb +16 -16
  532. data/test/models/subscriber.rb +8 -8
  533. data/test/models/subscription.rb +4 -4
  534. data/test/models/tag.rb +13 -13
  535. data/test/models/tagging.rb +13 -13
  536. data/test/models/task.rb +5 -5
  537. data/test/models/topic.rb +118 -118
  538. data/test/models/toy.rb +6 -6
  539. data/test/models/traffic_light.rb +4 -4
  540. data/test/models/treasure.rb +14 -14
  541. data/test/models/treaty.rb +7 -7
  542. data/test/models/tree.rb +3 -3
  543. data/test/models/tuning_peg.rb +4 -4
  544. data/test/models/tyre.rb +11 -11
  545. data/test/models/user.rb +14 -14
  546. data/test/models/uuid_child.rb +3 -3
  547. data/test/models/uuid_item.rb +6 -6
  548. data/test/models/uuid_parent.rb +3 -3
  549. data/test/models/vegetables.rb +24 -24
  550. data/test/models/vehicle.rb +6 -6
  551. data/test/models/vertex.rb +9 -9
  552. data/test/models/warehouse_thing.rb +5 -5
  553. data/test/models/wheel.rb +3 -3
  554. data/test/models/without_table.rb +3 -3
  555. data/test/models/zine.rb +3 -3
  556. data/test/schema/i5/ibm_db_specific_schema.rb +137 -0
  557. data/test/schema/ids/ibm_db_specific_schema.rb +140 -0
  558. data/test/schema/luw/ibm_db_specific_schema.rb +137 -0
  559. data/test/schema/mysql2_specific_schema.rb +68 -68
  560. data/test/schema/oracle_specific_schema.rb +40 -40
  561. data/test/schema/postgresql_specific_schema.rb +114 -114
  562. data/test/schema/schema.rb +1057 -1057
  563. data/test/schema/schema.rb.original +1057 -1057
  564. data/test/schema/sqlite_specific_schema.rb +18 -18
  565. data/test/schema/zOS/ibm_db_specific_schema.rb +208 -0
  566. data/test/support/config.rb +43 -43
  567. data/test/support/connection.rb +23 -23
  568. data/test/support/connection_helper.rb +14 -14
  569. data/test/support/ddl_helper.rb +8 -8
  570. data/test/support/schema_dumping_helper.rb +20 -20
  571. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -22
  572. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -182
  573. metadata +30 -14
  574. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  575. data/test/fixtures/author_addresses.original +0 -11
  576. data/test/fixtures/authors.original +0 -17
@@ -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,606 +1,606 @@
1
- require 'cases/helper'
2
- require 'models/author'
3
- require 'models/company'
4
- require 'models/membership'
5
- require 'models/person'
6
- require 'models/post'
7
- require 'models/project'
8
- require 'models/subscriber'
9
- require 'models/vegetables'
10
- require 'models/shop'
11
- require 'models/sponsor'
12
-
13
- module InheritanceTestHelper
14
- def with_store_full_sti_class(&block)
15
- assign_store_full_sti_class true, &block
16
- end
17
-
18
- def without_store_full_sti_class(&block)
19
- assign_store_full_sti_class false, &block
20
- end
21
-
22
- def assign_store_full_sti_class(flag)
23
- old_store_full_sti_class = ActiveRecord::Base.store_full_sti_class
24
- ActiveRecord::Base.store_full_sti_class = flag
25
- yield
26
- ensure
27
- ActiveRecord::Base.store_full_sti_class = old_store_full_sti_class
28
- end
29
- end
30
-
31
- class InheritanceTest < ActiveRecord::TestCase
32
- include InheritanceTestHelper
33
- fixtures :companies, :projects, :subscribers, :accounts, :vegetables, :memberships
34
-
35
- def test_class_with_store_full_sti_class_returns_full_name
36
- with_store_full_sti_class do
37
- assert_equal 'Namespaced::Company', Namespaced::Company.sti_name
38
- end
39
- end
40
-
41
- def test_class_with_blank_sti_name
42
- company = Company.first
43
- company = company.dup
44
- company.extend(Module.new {
45
- def _read_attribute(name)
46
- return ' ' if name == 'type'
47
- super
48
- end
49
- })
50
- company.save!
51
- company = Company.all.to_a.find { |x| x.id == company.id }
52
- assert_equal ' ', company.type
53
- end
54
-
55
- def test_class_without_store_full_sti_class_returns_demodulized_name
56
- without_store_full_sti_class do
57
- assert_equal 'Company', Namespaced::Company.sti_name
58
- end
59
- end
60
-
61
- def test_compute_type_success
62
- assert_equal Author, ActiveRecord::Base.send(:compute_type, 'Author')
63
- end
64
-
65
- def test_compute_type_nonexistent_constant
66
- e = assert_raises NameError do
67
- ActiveRecord::Base.send :compute_type, 'NonexistentModel'
68
- end
69
- assert_equal 'uninitialized constant ActiveRecord::Base::NonexistentModel', e.message
70
- assert_equal 'ActiveRecord::Base::NonexistentModel', e.name
71
- end
72
-
73
- def test_compute_type_no_method_error
74
- ActiveSupport::Dependencies.stub(:safe_constantize, proc{ raise NoMethodError }) do
75
- assert_raises NoMethodError do
76
- ActiveRecord::Base.send :compute_type, 'InvalidModel'
77
- end
78
- end
79
- end
80
-
81
- def test_compute_type_on_undefined_method
82
- error = nil
83
- begin
84
- Class.new(Author) do
85
- alias_method :foo, :bar
86
- end
87
- rescue => e
88
- error = e
89
- end
90
-
91
- ActiveSupport::Dependencies.stub(:safe_constantize, proc{ raise e }) do
92
-
93
- exception = assert_raises NameError do
94
- ActiveRecord::Base.send :compute_type, 'InvalidModel'
95
- end
96
- assert_equal error.message, exception.message
97
- end
98
- end
99
-
100
- def test_compute_type_argument_error
101
- ActiveSupport::Dependencies.stub(:safe_constantize, proc{ raise ArgumentError }) do
102
- assert_raises ArgumentError do
103
- ActiveRecord::Base.send :compute_type, 'InvalidModel'
104
- end
105
- end
106
- end
107
-
108
- def test_should_store_demodulized_class_name_with_store_full_sti_class_option_disabled
109
- without_store_full_sti_class do
110
- item = Namespaced::Company.new
111
- assert_equal 'Company', item[:type]
112
- end
113
- end
114
-
115
- def test_should_store_full_class_name_with_store_full_sti_class_option_enabled
116
- with_store_full_sti_class do
117
- item = Namespaced::Company.new
118
- assert_equal 'Namespaced::Company', item[:type]
119
- end
120
- end
121
-
122
- def test_different_namespace_subclass_should_load_correctly_with_store_full_sti_class_option
123
- with_store_full_sti_class do
124
- item = Namespaced::Company.create name: "Wolverine 2"
125
- assert_not_nil Company.find(item.id)
126
- assert_not_nil Namespaced::Company.find(item.id)
127
- end
128
- end
129
-
130
- def test_descends_from_active_record
131
- assert !ActiveRecord::Base.descends_from_active_record?
132
-
133
- # Abstract subclass of AR::Base.
134
- assert LoosePerson.descends_from_active_record?
135
-
136
- # Concrete subclass of an abstract class.
137
- assert LooseDescendant.descends_from_active_record?
138
-
139
- # Concrete subclass of AR::Base.
140
- assert TightPerson.descends_from_active_record?
141
-
142
- # Concrete subclass of a concrete class but has no type column.
143
- assert TightDescendant.descends_from_active_record?
144
-
145
- # Concrete subclass of AR::Base.
146
- assert Post.descends_from_active_record?
147
-
148
- # Abstract subclass of a concrete class which has a type column.
149
- # This is pathological, as you'll never have Sub < Abstract < Concrete.
150
- assert !StiPost.descends_from_active_record?
151
-
152
- # Concrete subclasses an abstract class which has a type column.
153
- assert !SubStiPost.descends_from_active_record?
154
- end
155
-
156
- def test_company_descends_from_active_record
157
- assert !ActiveRecord::Base.descends_from_active_record?
158
- assert AbstractCompany.descends_from_active_record?, 'AbstractCompany should descend from ActiveRecord::Base'
159
- assert Company.descends_from_active_record?, 'Company should descend from ActiveRecord::Base'
160
- assert !Class.new(Company).descends_from_active_record?, 'Company subclass should not descend from ActiveRecord::Base'
161
- end
162
-
163
- def test_abstract_class
164
- assert !ActiveRecord::Base.abstract_class?
165
- assert LoosePerson.abstract_class?
166
- assert !LooseDescendant.abstract_class?
167
- end
168
-
169
- def test_inheritance_base_class
170
- assert_equal Post, Post.base_class
171
- assert_equal Post, SpecialPost.base_class
172
- assert_equal Post, StiPost.base_class
173
- assert_equal SubStiPost, SubStiPost.base_class
174
- end
175
-
176
- def test_abstract_inheritance_base_class
177
- assert_equal LoosePerson, LoosePerson.base_class
178
- assert_equal LooseDescendant, LooseDescendant.base_class
179
- assert_equal TightPerson, TightPerson.base_class
180
- assert_equal TightPerson, TightDescendant.base_class
181
- end
182
-
183
- def test_base_class_activerecord_error
184
- klass = Class.new { include ActiveRecord::Inheritance }
185
- assert_raise(ActiveRecord::ActiveRecordError) { klass.base_class }
186
- end
187
-
188
- def test_a_bad_type_column
189
- Company.connection.insert "INSERT INTO companies (id, #{QUOTED_TYPE}, name) VALUES(100, 'bad_class!', 'Not happening')"
190
-
191
- assert_raise(ActiveRecord::SubclassNotFound) { Company.find(100) }
192
- end
193
-
194
- def test_inheritance_find
195
- assert_kind_of Firm, Company.find(1), "37signals should be a firm"
196
- assert_kind_of Firm, Firm.find(1), "37signals should be a firm"
197
- assert_kind_of Client, Company.find(2), "Summit should be a client"
198
- assert_kind_of Client, Client.find(2), "Summit should be a client"
199
- end
200
-
201
- def test_alt_inheritance_find
202
- assert_kind_of Cucumber, Vegetable.find(1)
203
- assert_kind_of Cucumber, Cucumber.find(1)
204
- assert_kind_of Cabbage, Vegetable.find(2)
205
- assert_kind_of Cabbage, Cabbage.find(2)
206
- end
207
-
208
- def test_alt_becomes_works_with_sti
209
- vegetable = Vegetable.find(1)
210
- assert_kind_of Vegetable, vegetable
211
- cabbage = vegetable.becomes(Cabbage)
212
- assert_kind_of Cabbage, cabbage
213
- end
214
-
215
- def test_becomes_and_change_tracking_for_inheritance_columns
216
- cucumber = Vegetable.find(1)
217
- cabbage = cucumber.becomes!(Cabbage)
218
- assert_equal ['Cucumber', 'Cabbage'], cabbage.custom_type_change
219
- end
220
-
221
- def test_alt_becomes_bang_resets_inheritance_type_column
222
- vegetable = Vegetable.create!(name: "Red Pepper")
223
- assert_nil vegetable.custom_type
224
-
225
- cabbage = vegetable.becomes!(Cabbage)
226
- assert_equal "Cabbage", cabbage.custom_type
227
-
228
- vegetable = cabbage.becomes!(Vegetable)
229
- assert_nil cabbage.custom_type
230
- end
231
-
232
- def test_inheritance_find_all
233
- companies = Company.all.merge!(:order => 'id').to_a
234
- assert_kind_of Firm, companies[0], "37signals should be a firm"
235
- assert_kind_of Client, companies[1], "Summit should be a client"
236
- end
237
-
238
- def test_alt_inheritance_find_all
239
- companies = Vegetable.all.merge!(:order => 'id').to_a
240
- assert_kind_of Cucumber, companies[0]
241
- assert_kind_of Cabbage, companies[1]
242
- end
243
-
244
- def test_inheritance_save
245
- firm = Firm.new
246
- firm.name = "Next Angle"
247
- firm.save
248
-
249
- next_angle = Company.find(firm.id)
250
- assert_kind_of Firm, next_angle, "Next Angle should be a firm"
251
- end
252
-
253
- def test_alt_inheritance_save
254
- cabbage = Cabbage.new(:name => 'Savoy')
255
- cabbage.save!
256
-
257
- savoy = Vegetable.find(cabbage.id)
258
- assert_kind_of Cabbage, savoy
259
- end
260
-
261
- def test_inheritance_new_with_default_class
262
- company = Company.new
263
- assert_equal Company, company.class
264
- end
265
-
266
- def test_inheritance_new_with_base_class
267
- company = Company.new(:type => 'Company')
268
- assert_equal Company, company.class
269
- end
270
-
271
- def test_inheritance_new_with_subclass
272
- firm = Company.new(:type => 'Firm')
273
- assert_equal Firm, firm.class
274
- end
275
-
276
- def test_new_with_abstract_class
277
- e = assert_raises(NotImplementedError) do
278
- AbstractCompany.new
279
- end
280
- assert_equal("AbstractCompany is an abstract class and cannot be instantiated.", e.message)
281
- end
282
-
283
- def test_new_with_ar_base
284
- e = assert_raises(NotImplementedError) do
285
- ActiveRecord::Base.new
286
- end
287
- assert_equal("ActiveRecord::Base is an abstract class and cannot be instantiated.", e.message)
288
- end
289
-
290
- def test_new_with_invalid_type
291
- assert_raise(ActiveRecord::SubclassNotFound) { Company.new(:type => 'InvalidType') }
292
- end
293
-
294
- def test_new_with_unrelated_type
295
- assert_raise(ActiveRecord::SubclassNotFound) { Company.new(:type => 'Account') }
296
- end
297
-
298
- def test_new_with_unrelated_namespaced_type
299
- without_store_full_sti_class do
300
- e = assert_raises ActiveRecord::SubclassNotFound do
301
- Namespaced::Company.new(type: 'Firm')
302
- end
303
-
304
- assert_equal "Invalid single-table inheritance type: Namespaced::Firm is not a subclass of Namespaced::Company", e.message
305
- end
306
- end
307
-
308
- def test_new_with_complex_inheritance
309
- assert_nothing_raised { Client.new(type: 'VerySpecialClient') }
310
- end
311
-
312
- def test_new_without_storing_full_sti_class
313
- without_store_full_sti_class do
314
- item = Company.new(type: 'SpecialCo')
315
- assert_instance_of Company::SpecialCo, item
316
- end
317
- end
318
-
319
- def test_new_with_autoload_paths
320
- path = File.expand_path('../../models/autoloadable', __FILE__)
321
- ActiveSupport::Dependencies.autoload_paths << path
322
-
323
- firm = Company.new(:type => 'ExtraFirm')
324
- assert_equal ExtraFirm, firm.class
325
- ensure
326
- ActiveSupport::Dependencies.autoload_paths.reject! { |p| p == path }
327
- ActiveSupport::Dependencies.clear
328
- end
329
-
330
- def test_inheritance_condition
331
- assert_equal 11, Company.count
332
- assert_equal 2, Firm.count
333
- assert_equal 5, Client.count
334
- end
335
-
336
- def test_alt_inheritance_condition
337
- assert_equal 4, Vegetable.count
338
- assert_equal 1, Cucumber.count
339
- assert_equal 3, Cabbage.count
340
- end
341
-
342
- def test_finding_incorrect_type_data
343
- assert_raise(ActiveRecord::RecordNotFound) { Firm.find(2) }
344
- assert_nothing_raised { Firm.find(1) }
345
- end
346
-
347
- def test_alt_finding_incorrect_type_data
348
- assert_raise(ActiveRecord::RecordNotFound) { Cucumber.find(2) }
349
- assert_nothing_raised { Cucumber.find(1) }
350
- end
351
-
352
- def test_update_all_within_inheritance
353
- Client.update_all "name = 'I am a client'"
354
- assert_equal "I am a client", Client.first.name
355
- # Order by added as otherwise Oracle tests were failing because of different order of results
356
- assert_equal "37signals", Firm.all.merge!(:order => "id").to_a.first.name
357
- end
358
-
359
- def test_alt_update_all_within_inheritance
360
- Cabbage.update_all "name = 'the cabbage'"
361
- assert_equal "the cabbage", Cabbage.first.name
362
- assert_equal ["my cucumber"], Cucumber.all.map(&:name).uniq
363
- end
364
-
365
- def test_destroy_all_within_inheritance
366
- Client.destroy_all
367
- assert_equal 0, Client.count
368
- assert_equal 2, Firm.count
369
- end
370
-
371
- def test_alt_destroy_all_within_inheritance
372
- Cabbage.destroy_all
373
- assert_equal 0, Cabbage.count
374
- assert_equal 1, Cucumber.count
375
- end
376
-
377
- def test_find_first_within_inheritance
378
- assert_kind_of Firm, Company.all.merge!(:where => "name = '37signals'").first
379
- assert_kind_of Firm, Firm.all.merge!(:where => "name = '37signals'").first
380
- assert_nil Client.all.merge!(:where => "name = '37signals'").first
381
- end
382
-
383
- def test_alt_find_first_within_inheritance
384
- assert_kind_of Cabbage, Vegetable.all.merge!(:where => "name = 'his cabbage'").first
385
- assert_kind_of Cabbage, Cabbage.all.merge!(:where => "name = 'his cabbage'").first
386
- assert_nil Cucumber.all.merge!(:where => "name = 'his cabbage'").first
387
- end
388
-
389
- def test_complex_inheritance
390
- very_special_client = VerySpecialClient.create("name" => "veryspecial")
391
- assert_equal very_special_client, VerySpecialClient.where("name = 'veryspecial'").first
392
- assert_equal very_special_client, SpecialClient.all.merge!(:where => "name = 'veryspecial'").first
393
- assert_equal very_special_client, Company.all.merge!(:where => "name = 'veryspecial'").first
394
- assert_equal very_special_client, Client.all.merge!(:where => "name = 'veryspecial'").first
395
- assert_equal 1, Client.all.merge!(:where => "name = 'Summit'").to_a.size
396
- assert_equal very_special_client, Client.find(very_special_client.id)
397
- end
398
-
399
- def test_alt_complex_inheritance
400
- king_cole = KingCole.create("name" => "uniform heads")
401
- assert_equal king_cole, KingCole.where("name = 'uniform heads'").first
402
- assert_equal king_cole, GreenCabbage.all.merge!(:where => "name = 'uniform heads'").first
403
- assert_equal king_cole, Cabbage.all.merge!(:where => "name = 'uniform heads'").first
404
- assert_equal king_cole, Vegetable.all.merge!(:where => "name = 'uniform heads'").first
405
- assert_equal 1, Cabbage.all.merge!(:where => "name = 'his cabbage'").to_a.size
406
- assert_equal king_cole, Cabbage.find(king_cole.id)
407
- end
408
-
409
- def test_eager_load_belongs_to_something_inherited
410
- account = Account.all.merge!(:includes => :firm).find(1)
411
- assert account.association(:firm).loaded?, "association was not eager loaded"
412
- end
413
-
414
- def test_alt_eager_loading
415
- cabbage = RedCabbage.all.merge!(:includes => :seller).find(4)
416
- assert cabbage.association(:seller).loaded?, "association was not eager loaded"
417
- end
418
-
419
- def test_eager_load_belongs_to_primary_key_quoting
420
- con = Account.connection
421
- assert_sql(/#{con.quote_table_name('companies')}.#{con.quote_column_name('id')} = 1/) do
422
- Account.all.merge!(:includes => :firm).find(1)
423
- end
424
- end
425
-
426
- def test_inherits_custom_primary_key
427
- assert_equal Subscriber.primary_key, SpecialSubscriber.primary_key
428
- end
429
-
430
- def test_inheritance_without_mapping
431
- assert_kind_of SpecialSubscriber, SpecialSubscriber.find("webster132")
432
- assert_nothing_raised { s = SpecialSubscriber.new("name" => "And breaaaaathe!"); s.id = 'roger'; s.save }
433
- end
434
-
435
- def test_scope_inherited_properly
436
- assert_nothing_raised { Company.of_first_firm }
437
- assert_nothing_raised { Client.of_first_firm }
438
- end
439
-
440
- def test_inheritance_with_default_scope
441
- assert_equal 1, SelectedMembership.count(:all)
442
- end
443
- end
444
-
445
- class InheritanceComputeTypeTest < ActiveRecord::TestCase
446
- include InheritanceTestHelper
447
- fixtures :companies
448
-
449
- teardown do
450
- self.class.const_remove :FirmOnTheFly rescue nil
451
- Firm.const_remove :FirmOnTheFly rescue nil
452
- end
453
-
454
- def test_instantiation_doesnt_try_to_require_corresponding_file
455
- without_store_full_sti_class do
456
- foo = Firm.first.clone
457
- foo.type = 'FirmOnTheFly'
458
- foo.save!
459
-
460
- # Should fail without FirmOnTheFly in the type condition.
461
- assert_raise(ActiveRecord::RecordNotFound) { Firm.find(foo.id) }
462
-
463
- # Nest FirmOnTheFly in the test case where Dependencies won't see it.
464
- self.class.const_set :FirmOnTheFly, Class.new(Firm)
465
- assert_raise(ActiveRecord::SubclassNotFound) { Firm.find(foo.id) }
466
-
467
- # Nest FirmOnTheFly in Firm where Dependencies will see it.
468
- # This is analogous to nesting models in a migration.
469
- Firm.const_set :FirmOnTheFly, Class.new(Firm)
470
-
471
- # And instantiate will find the existing constant rather than trying
472
- # to require firm_on_the_fly.
473
- assert_nothing_raised { assert_kind_of Firm::FirmOnTheFly, Firm.find(foo.id) }
474
- end
475
- end
476
-
477
- def test_sti_type_from_attributes_disabled_in_non_sti_class
478
- phone = Shop::Product::Type.new(name: 'Phone')
479
- product = Shop::Product.new(:type => phone)
480
- assert product.save
481
- end
482
-
483
- def test_inheritance_new_with_subclass_as_default
484
- original_type = Company.columns_hash["type"].default
485
- ActiveRecord::Base.connection.change_column_default :companies, :type, 'Firm'
486
- Company.reset_column_information
487
-
488
- firm = Company.new # without arguments
489
- assert_equal 'Firm', firm.type
490
- assert_instance_of Firm, firm
491
-
492
- firm = Company.new(firm_name: 'Shri Hans Plastic') # with arguments
493
- assert_equal 'Firm', firm.type
494
- assert_instance_of Firm, firm
495
-
496
- client = Client.new
497
- assert_equal 'Client', client.type
498
- assert_instance_of Client, client
499
-
500
- firm = Company.new(type: 'Client') # overwrite the default type
501
- assert_equal 'Client', firm.type
502
- assert_instance_of Client, firm
503
- ensure
504
- ActiveRecord::Base.connection.change_column_default :companies, :type, original_type
505
- Company.reset_column_information
506
- end
507
- end
508
-
509
- class InheritanceAttributeTest < ActiveRecord::TestCase
510
-
511
- class Company < ActiveRecord::Base
512
- self.table_name = 'companies'
513
- attribute :type, :string, default: "InheritanceAttributeTest::Startup"
514
- end
515
-
516
- class Startup < Company
517
- end
518
-
519
- class Empire < Company
520
- end
521
-
522
- def test_inheritance_new_with_subclass_as_default
523
- startup = Company.new # without arguments
524
- assert_equal 'InheritanceAttributeTest::Startup', startup.type
525
- assert_instance_of Startup, startup
526
-
527
- empire = Company.new(type: 'InheritanceAttributeTest::Empire') # without arguments
528
- assert_equal 'InheritanceAttributeTest::Empire', empire.type
529
- assert_instance_of Empire, empire
530
- end
531
- end
532
-
533
- class InheritanceAttributeMappingTest < ActiveRecord::TestCase
534
- setup do
535
- @old_registry = ActiveRecord::Type.registry
536
- ActiveRecord::Type.registry = ActiveRecord::Type::AdapterSpecificRegistry.new
537
- ActiveRecord::Type.register :omg_sti, InheritanceAttributeMappingTest::OmgStiType
538
- Company.delete_all
539
- Sponsor.delete_all
540
- end
541
-
542
- teardown do
543
- ActiveRecord::Type.registry = @old_registry
544
- end
545
-
546
- class OmgStiType < ActiveRecord::Type::String
547
- def cast_value(value)
548
- if value =~ /\Aomg_(.+)\z/
549
- $1.classify
550
- else
551
- value
552
- end
553
- end
554
-
555
- def serialize(value)
556
- if value
557
- "omg_%s" % value.underscore
558
- end
559
- end
560
- end
561
-
562
- class Company < ActiveRecord::Base
563
- self.table_name = 'companies'
564
- attribute :type, :omg_sti
565
- end
566
-
567
- class Startup < Company; end
568
- class Empire < Company; end
569
-
570
- class Sponsor < ActiveRecord::Base
571
- self.table_name = 'sponsors'
572
- attribute :sponsorable_type, :omg_sti
573
-
574
- belongs_to :sponsorable, polymorphic: true
575
- end
576
-
577
- def test_sti_with_custom_type
578
- Startup.create! name: 'a Startup'
579
- Empire.create! name: 'an Empire'
580
-
581
- assert_equal [["a Startup", "omg_inheritance_attribute_mapping_test/startup"],
582
- ["an Empire", "omg_inheritance_attribute_mapping_test/empire"]], ActiveRecord::Base.connection.select_rows('SELECT name, type FROM companies').sort
583
- assert_equal [["a Startup", "InheritanceAttributeMappingTest::Startup"],
584
- ["an Empire", "InheritanceAttributeMappingTest::Empire"]], Company.all.map { |a| [a.name, a.type] }.sort
585
-
586
- startup = Startup.first
587
- startup.becomes! Empire
588
- startup.save!
589
-
590
- assert_equal [["a Startup", "omg_inheritance_attribute_mapping_test/empire"],
591
- ["an Empire", "omg_inheritance_attribute_mapping_test/empire"]], ActiveRecord::Base.connection.select_rows('SELECT name, type FROM companies').sort
592
-
593
- assert_equal [["a Startup", "InheritanceAttributeMappingTest::Empire"],
594
- ["an Empire", "InheritanceAttributeMappingTest::Empire"]], Company.all.map { |a| [a.name, a.type] }.sort
595
- end
596
-
597
- def test_polymorphic_associations_custom_type
598
- startup = Startup.create! name: 'a Startup'
599
- sponsor = Sponsor.create! sponsorable: startup
600
-
601
- assert_equal ["omg_inheritance_attribute_mapping_test/company"], ActiveRecord::Base.connection.select_values('SELECT sponsorable_type FROM sponsors')
602
-
603
- sponsor = Sponsor.first
604
- assert_equal startup, sponsor.sponsorable
605
- end
606
- end
1
+ require 'cases/helper'
2
+ require 'models/author'
3
+ require 'models/company'
4
+ require 'models/membership'
5
+ require 'models/person'
6
+ require 'models/post'
7
+ require 'models/project'
8
+ require 'models/subscriber'
9
+ require 'models/vegetables'
10
+ require 'models/shop'
11
+ require 'models/sponsor'
12
+
13
+ module InheritanceTestHelper
14
+ def with_store_full_sti_class(&block)
15
+ assign_store_full_sti_class true, &block
16
+ end
17
+
18
+ def without_store_full_sti_class(&block)
19
+ assign_store_full_sti_class false, &block
20
+ end
21
+
22
+ def assign_store_full_sti_class(flag)
23
+ old_store_full_sti_class = ActiveRecord::Base.store_full_sti_class
24
+ ActiveRecord::Base.store_full_sti_class = flag
25
+ yield
26
+ ensure
27
+ ActiveRecord::Base.store_full_sti_class = old_store_full_sti_class
28
+ end
29
+ end
30
+
31
+ class InheritanceTest < ActiveRecord::TestCase
32
+ include InheritanceTestHelper
33
+ fixtures :companies, :projects, :subscribers, :accounts, :vegetables, :memberships
34
+
35
+ def test_class_with_store_full_sti_class_returns_full_name
36
+ with_store_full_sti_class do
37
+ assert_equal 'Namespaced::Company', Namespaced::Company.sti_name
38
+ end
39
+ end
40
+
41
+ def test_class_with_blank_sti_name
42
+ company = Company.first
43
+ company = company.dup
44
+ company.extend(Module.new {
45
+ def _read_attribute(name)
46
+ return ' ' if name == 'type'
47
+ super
48
+ end
49
+ })
50
+ company.save!
51
+ company = Company.all.to_a.find { |x| x.id == company.id }
52
+ assert_equal ' ', company.type
53
+ end
54
+
55
+ def test_class_without_store_full_sti_class_returns_demodulized_name
56
+ without_store_full_sti_class do
57
+ assert_equal 'Company', Namespaced::Company.sti_name
58
+ end
59
+ end
60
+
61
+ def test_compute_type_success
62
+ assert_equal Author, ActiveRecord::Base.send(:compute_type, 'Author')
63
+ end
64
+
65
+ def test_compute_type_nonexistent_constant
66
+ e = assert_raises NameError do
67
+ ActiveRecord::Base.send :compute_type, 'NonexistentModel'
68
+ end
69
+ assert_equal 'uninitialized constant ActiveRecord::Base::NonexistentModel', e.message
70
+ assert_equal 'ActiveRecord::Base::NonexistentModel', e.name
71
+ end
72
+
73
+ def test_compute_type_no_method_error
74
+ ActiveSupport::Dependencies.stub(:safe_constantize, proc{ raise NoMethodError }) do
75
+ assert_raises NoMethodError do
76
+ ActiveRecord::Base.send :compute_type, 'InvalidModel'
77
+ end
78
+ end
79
+ end
80
+
81
+ def test_compute_type_on_undefined_method
82
+ error = nil
83
+ begin
84
+ Class.new(Author) do
85
+ alias_method :foo, :bar
86
+ end
87
+ rescue => e
88
+ error = e
89
+ end
90
+
91
+ ActiveSupport::Dependencies.stub(:safe_constantize, proc{ raise e }) do
92
+
93
+ exception = assert_raises NameError do
94
+ ActiveRecord::Base.send :compute_type, 'InvalidModel'
95
+ end
96
+ assert_equal error.message, exception.message
97
+ end
98
+ end
99
+
100
+ def test_compute_type_argument_error
101
+ ActiveSupport::Dependencies.stub(:safe_constantize, proc{ raise ArgumentError }) do
102
+ assert_raises ArgumentError do
103
+ ActiveRecord::Base.send :compute_type, 'InvalidModel'
104
+ end
105
+ end
106
+ end
107
+
108
+ def test_should_store_demodulized_class_name_with_store_full_sti_class_option_disabled
109
+ without_store_full_sti_class do
110
+ item = Namespaced::Company.new
111
+ assert_equal 'Company', item[:type]
112
+ end
113
+ end
114
+
115
+ def test_should_store_full_class_name_with_store_full_sti_class_option_enabled
116
+ with_store_full_sti_class do
117
+ item = Namespaced::Company.new
118
+ assert_equal 'Namespaced::Company', item[:type]
119
+ end
120
+ end
121
+
122
+ def test_different_namespace_subclass_should_load_correctly_with_store_full_sti_class_option
123
+ with_store_full_sti_class do
124
+ item = Namespaced::Company.create name: "Wolverine 2"
125
+ assert_not_nil Company.find(item.id)
126
+ assert_not_nil Namespaced::Company.find(item.id)
127
+ end
128
+ end
129
+
130
+ def test_descends_from_active_record
131
+ assert !ActiveRecord::Base.descends_from_active_record?
132
+
133
+ # Abstract subclass of AR::Base.
134
+ assert LoosePerson.descends_from_active_record?
135
+
136
+ # Concrete subclass of an abstract class.
137
+ assert LooseDescendant.descends_from_active_record?
138
+
139
+ # Concrete subclass of AR::Base.
140
+ assert TightPerson.descends_from_active_record?
141
+
142
+ # Concrete subclass of a concrete class but has no type column.
143
+ assert TightDescendant.descends_from_active_record?
144
+
145
+ # Concrete subclass of AR::Base.
146
+ assert Post.descends_from_active_record?
147
+
148
+ # Abstract subclass of a concrete class which has a type column.
149
+ # This is pathological, as you'll never have Sub < Abstract < Concrete.
150
+ assert !StiPost.descends_from_active_record?
151
+
152
+ # Concrete subclasses an abstract class which has a type column.
153
+ assert !SubStiPost.descends_from_active_record?
154
+ end
155
+
156
+ def test_company_descends_from_active_record
157
+ assert !ActiveRecord::Base.descends_from_active_record?
158
+ assert AbstractCompany.descends_from_active_record?, 'AbstractCompany should descend from ActiveRecord::Base'
159
+ assert Company.descends_from_active_record?, 'Company should descend from ActiveRecord::Base'
160
+ assert !Class.new(Company).descends_from_active_record?, 'Company subclass should not descend from ActiveRecord::Base'
161
+ end
162
+
163
+ def test_abstract_class
164
+ assert !ActiveRecord::Base.abstract_class?
165
+ assert LoosePerson.abstract_class?
166
+ assert !LooseDescendant.abstract_class?
167
+ end
168
+
169
+ def test_inheritance_base_class
170
+ assert_equal Post, Post.base_class
171
+ assert_equal Post, SpecialPost.base_class
172
+ assert_equal Post, StiPost.base_class
173
+ assert_equal SubStiPost, SubStiPost.base_class
174
+ end
175
+
176
+ def test_abstract_inheritance_base_class
177
+ assert_equal LoosePerson, LoosePerson.base_class
178
+ assert_equal LooseDescendant, LooseDescendant.base_class
179
+ assert_equal TightPerson, TightPerson.base_class
180
+ assert_equal TightPerson, TightDescendant.base_class
181
+ end
182
+
183
+ def test_base_class_activerecord_error
184
+ klass = Class.new { include ActiveRecord::Inheritance }
185
+ assert_raise(ActiveRecord::ActiveRecordError) { klass.base_class }
186
+ end
187
+
188
+ def test_a_bad_type_column
189
+ Company.connection.insert "INSERT INTO companies (id, #{QUOTED_TYPE}, name) VALUES(100, 'bad_class!', 'Not happening')"
190
+
191
+ assert_raise(ActiveRecord::SubclassNotFound) { Company.find(100) }
192
+ end
193
+
194
+ def test_inheritance_find
195
+ assert_kind_of Firm, Company.find(1), "37signals should be a firm"
196
+ assert_kind_of Firm, Firm.find(1), "37signals should be a firm"
197
+ assert_kind_of Client, Company.find(2), "Summit should be a client"
198
+ assert_kind_of Client, Client.find(2), "Summit should be a client"
199
+ end
200
+
201
+ def test_alt_inheritance_find
202
+ assert_kind_of Cucumber, Vegetable.find(1)
203
+ assert_kind_of Cucumber, Cucumber.find(1)
204
+ assert_kind_of Cabbage, Vegetable.find(2)
205
+ assert_kind_of Cabbage, Cabbage.find(2)
206
+ end
207
+
208
+ def test_alt_becomes_works_with_sti
209
+ vegetable = Vegetable.find(1)
210
+ assert_kind_of Vegetable, vegetable
211
+ cabbage = vegetable.becomes(Cabbage)
212
+ assert_kind_of Cabbage, cabbage
213
+ end
214
+
215
+ def test_becomes_and_change_tracking_for_inheritance_columns
216
+ cucumber = Vegetable.find(1)
217
+ cabbage = cucumber.becomes!(Cabbage)
218
+ assert_equal ['Cucumber', 'Cabbage'], cabbage.custom_type_change
219
+ end
220
+
221
+ def test_alt_becomes_bang_resets_inheritance_type_column
222
+ vegetable = Vegetable.create!(name: "Red Pepper")
223
+ assert_nil vegetable.custom_type
224
+
225
+ cabbage = vegetable.becomes!(Cabbage)
226
+ assert_equal "Cabbage", cabbage.custom_type
227
+
228
+ vegetable = cabbage.becomes!(Vegetable)
229
+ assert_nil cabbage.custom_type
230
+ end
231
+
232
+ def test_inheritance_find_all
233
+ companies = Company.all.merge!(:order => 'id').to_a
234
+ assert_kind_of Firm, companies[0], "37signals should be a firm"
235
+ assert_kind_of Client, companies[1], "Summit should be a client"
236
+ end
237
+
238
+ def test_alt_inheritance_find_all
239
+ companies = Vegetable.all.merge!(:order => 'id').to_a
240
+ assert_kind_of Cucumber, companies[0]
241
+ assert_kind_of Cabbage, companies[1]
242
+ end
243
+
244
+ def test_inheritance_save
245
+ firm = Firm.new
246
+ firm.name = "Next Angle"
247
+ firm.save
248
+
249
+ next_angle = Company.find(firm.id)
250
+ assert_kind_of Firm, next_angle, "Next Angle should be a firm"
251
+ end
252
+
253
+ def test_alt_inheritance_save
254
+ cabbage = Cabbage.new(:name => 'Savoy')
255
+ cabbage.save!
256
+
257
+ savoy = Vegetable.find(cabbage.id)
258
+ assert_kind_of Cabbage, savoy
259
+ end
260
+
261
+ def test_inheritance_new_with_default_class
262
+ company = Company.new
263
+ assert_equal Company, company.class
264
+ end
265
+
266
+ def test_inheritance_new_with_base_class
267
+ company = Company.new(:type => 'Company')
268
+ assert_equal Company, company.class
269
+ end
270
+
271
+ def test_inheritance_new_with_subclass
272
+ firm = Company.new(:type => 'Firm')
273
+ assert_equal Firm, firm.class
274
+ end
275
+
276
+ def test_new_with_abstract_class
277
+ e = assert_raises(NotImplementedError) do
278
+ AbstractCompany.new
279
+ end
280
+ assert_equal("AbstractCompany is an abstract class and cannot be instantiated.", e.message)
281
+ end
282
+
283
+ def test_new_with_ar_base
284
+ e = assert_raises(NotImplementedError) do
285
+ ActiveRecord::Base.new
286
+ end
287
+ assert_equal("ActiveRecord::Base is an abstract class and cannot be instantiated.", e.message)
288
+ end
289
+
290
+ def test_new_with_invalid_type
291
+ assert_raise(ActiveRecord::SubclassNotFound) { Company.new(:type => 'InvalidType') }
292
+ end
293
+
294
+ def test_new_with_unrelated_type
295
+ assert_raise(ActiveRecord::SubclassNotFound) { Company.new(:type => 'Account') }
296
+ end
297
+
298
+ def test_new_with_unrelated_namespaced_type
299
+ without_store_full_sti_class do
300
+ e = assert_raises ActiveRecord::SubclassNotFound do
301
+ Namespaced::Company.new(type: 'Firm')
302
+ end
303
+
304
+ assert_equal "Invalid single-table inheritance type: Namespaced::Firm is not a subclass of Namespaced::Company", e.message
305
+ end
306
+ end
307
+
308
+ def test_new_with_complex_inheritance
309
+ assert_nothing_raised { Client.new(type: 'VerySpecialClient') }
310
+ end
311
+
312
+ def test_new_without_storing_full_sti_class
313
+ without_store_full_sti_class do
314
+ item = Company.new(type: 'SpecialCo')
315
+ assert_instance_of Company::SpecialCo, item
316
+ end
317
+ end
318
+
319
+ def test_new_with_autoload_paths
320
+ path = File.expand_path('../../models/autoloadable', __FILE__)
321
+ ActiveSupport::Dependencies.autoload_paths << path
322
+
323
+ firm = Company.new(:type => 'ExtraFirm')
324
+ assert_equal ExtraFirm, firm.class
325
+ ensure
326
+ ActiveSupport::Dependencies.autoload_paths.reject! { |p| p == path }
327
+ ActiveSupport::Dependencies.clear
328
+ end
329
+
330
+ def test_inheritance_condition
331
+ assert_equal 11, Company.count
332
+ assert_equal 2, Firm.count
333
+ assert_equal 5, Client.count
334
+ end
335
+
336
+ def test_alt_inheritance_condition
337
+ assert_equal 4, Vegetable.count
338
+ assert_equal 1, Cucumber.count
339
+ assert_equal 3, Cabbage.count
340
+ end
341
+
342
+ def test_finding_incorrect_type_data
343
+ assert_raise(ActiveRecord::RecordNotFound) { Firm.find(2) }
344
+ assert_nothing_raised { Firm.find(1) }
345
+ end
346
+
347
+ def test_alt_finding_incorrect_type_data
348
+ assert_raise(ActiveRecord::RecordNotFound) { Cucumber.find(2) }
349
+ assert_nothing_raised { Cucumber.find(1) }
350
+ end
351
+
352
+ def test_update_all_within_inheritance
353
+ Client.update_all "name = 'I am a client'"
354
+ assert_equal "I am a client", Client.first.name
355
+ # Order by added as otherwise Oracle tests were failing because of different order of results
356
+ assert_equal "37signals", Firm.all.merge!(:order => "id").to_a.first.name
357
+ end
358
+
359
+ def test_alt_update_all_within_inheritance
360
+ Cabbage.update_all "name = 'the cabbage'"
361
+ assert_equal "the cabbage", Cabbage.first.name
362
+ assert_equal ["my cucumber"], Cucumber.all.map(&:name).uniq
363
+ end
364
+
365
+ def test_destroy_all_within_inheritance
366
+ Client.destroy_all
367
+ assert_equal 0, Client.count
368
+ assert_equal 2, Firm.count
369
+ end
370
+
371
+ def test_alt_destroy_all_within_inheritance
372
+ Cabbage.destroy_all
373
+ assert_equal 0, Cabbage.count
374
+ assert_equal 1, Cucumber.count
375
+ end
376
+
377
+ def test_find_first_within_inheritance
378
+ assert_kind_of Firm, Company.all.merge!(:where => "name = '37signals'").first
379
+ assert_kind_of Firm, Firm.all.merge!(:where => "name = '37signals'").first
380
+ assert_nil Client.all.merge!(:where => "name = '37signals'").first
381
+ end
382
+
383
+ def test_alt_find_first_within_inheritance
384
+ assert_kind_of Cabbage, Vegetable.all.merge!(:where => "name = 'his cabbage'").first
385
+ assert_kind_of Cabbage, Cabbage.all.merge!(:where => "name = 'his cabbage'").first
386
+ assert_nil Cucumber.all.merge!(:where => "name = 'his cabbage'").first
387
+ end
388
+
389
+ def test_complex_inheritance
390
+ very_special_client = VerySpecialClient.create("name" => "veryspecial")
391
+ assert_equal very_special_client, VerySpecialClient.where("name = 'veryspecial'").first
392
+ assert_equal very_special_client, SpecialClient.all.merge!(:where => "name = 'veryspecial'").first
393
+ assert_equal very_special_client, Company.all.merge!(:where => "name = 'veryspecial'").first
394
+ assert_equal very_special_client, Client.all.merge!(:where => "name = 'veryspecial'").first
395
+ assert_equal 1, Client.all.merge!(:where => "name = 'Summit'").to_a.size
396
+ assert_equal very_special_client, Client.find(very_special_client.id)
397
+ end
398
+
399
+ def test_alt_complex_inheritance
400
+ king_cole = KingCole.create("name" => "uniform heads")
401
+ assert_equal king_cole, KingCole.where("name = 'uniform heads'").first
402
+ assert_equal king_cole, GreenCabbage.all.merge!(:where => "name = 'uniform heads'").first
403
+ assert_equal king_cole, Cabbage.all.merge!(:where => "name = 'uniform heads'").first
404
+ assert_equal king_cole, Vegetable.all.merge!(:where => "name = 'uniform heads'").first
405
+ assert_equal 1, Cabbage.all.merge!(:where => "name = 'his cabbage'").to_a.size
406
+ assert_equal king_cole, Cabbage.find(king_cole.id)
407
+ end
408
+
409
+ def test_eager_load_belongs_to_something_inherited
410
+ account = Account.all.merge!(:includes => :firm).find(1)
411
+ assert account.association(:firm).loaded?, "association was not eager loaded"
412
+ end
413
+
414
+ def test_alt_eager_loading
415
+ cabbage = RedCabbage.all.merge!(:includes => :seller).find(4)
416
+ assert cabbage.association(:seller).loaded?, "association was not eager loaded"
417
+ end
418
+
419
+ def test_eager_load_belongs_to_primary_key_quoting
420
+ con = Account.connection
421
+ assert_sql(/#{con.quote_table_name('companies')}.#{con.quote_column_name('id')} = 1/) do
422
+ Account.all.merge!(:includes => :firm).find(1)
423
+ end
424
+ end
425
+
426
+ def test_inherits_custom_primary_key
427
+ assert_equal Subscriber.primary_key, SpecialSubscriber.primary_key
428
+ end
429
+
430
+ def test_inheritance_without_mapping
431
+ assert_kind_of SpecialSubscriber, SpecialSubscriber.find("webster132")
432
+ assert_nothing_raised { s = SpecialSubscriber.new("name" => "And breaaaaathe!"); s.id = 'roger'; s.save }
433
+ end
434
+
435
+ def test_scope_inherited_properly
436
+ assert_nothing_raised { Company.of_first_firm }
437
+ assert_nothing_raised { Client.of_first_firm }
438
+ end
439
+
440
+ def test_inheritance_with_default_scope
441
+ assert_equal 1, SelectedMembership.count(:all)
442
+ end
443
+ end
444
+
445
+ class InheritanceComputeTypeTest < ActiveRecord::TestCase
446
+ include InheritanceTestHelper
447
+ fixtures :companies
448
+
449
+ teardown do
450
+ self.class.const_remove :FirmOnTheFly rescue nil
451
+ Firm.const_remove :FirmOnTheFly rescue nil
452
+ end
453
+
454
+ def test_instantiation_doesnt_try_to_require_corresponding_file
455
+ without_store_full_sti_class do
456
+ foo = Firm.first.clone
457
+ foo.type = 'FirmOnTheFly'
458
+ foo.save!
459
+
460
+ # Should fail without FirmOnTheFly in the type condition.
461
+ assert_raise(ActiveRecord::RecordNotFound) { Firm.find(foo.id) }
462
+
463
+ # Nest FirmOnTheFly in the test case where Dependencies won't see it.
464
+ self.class.const_set :FirmOnTheFly, Class.new(Firm)
465
+ assert_raise(ActiveRecord::SubclassNotFound) { Firm.find(foo.id) }
466
+
467
+ # Nest FirmOnTheFly in Firm where Dependencies will see it.
468
+ # This is analogous to nesting models in a migration.
469
+ Firm.const_set :FirmOnTheFly, Class.new(Firm)
470
+
471
+ # And instantiate will find the existing constant rather than trying
472
+ # to require firm_on_the_fly.
473
+ assert_nothing_raised { assert_kind_of Firm::FirmOnTheFly, Firm.find(foo.id) }
474
+ end
475
+ end
476
+
477
+ def test_sti_type_from_attributes_disabled_in_non_sti_class
478
+ phone = Shop::Product::Type.new(name: 'Phone')
479
+ product = Shop::Product.new(:type => phone)
480
+ assert product.save
481
+ end
482
+
483
+ def test_inheritance_new_with_subclass_as_default
484
+ original_type = Company.columns_hash["type"].default
485
+ ActiveRecord::Base.connection.change_column_default :companies, :type, 'Firm'
486
+ Company.reset_column_information
487
+
488
+ firm = Company.new # without arguments
489
+ assert_equal 'Firm', firm.type
490
+ assert_instance_of Firm, firm
491
+
492
+ firm = Company.new(firm_name: 'Shri Hans Plastic') # with arguments
493
+ assert_equal 'Firm', firm.type
494
+ assert_instance_of Firm, firm
495
+
496
+ client = Client.new
497
+ assert_equal 'Client', client.type
498
+ assert_instance_of Client, client
499
+
500
+ firm = Company.new(type: 'Client') # overwrite the default type
501
+ assert_equal 'Client', firm.type
502
+ assert_instance_of Client, firm
503
+ ensure
504
+ ActiveRecord::Base.connection.change_column_default :companies, :type, original_type
505
+ Company.reset_column_information
506
+ end
507
+ end
508
+
509
+ class InheritanceAttributeTest < ActiveRecord::TestCase
510
+
511
+ class Company < ActiveRecord::Base
512
+ self.table_name = 'companies'
513
+ attribute :type, :string, default: "InheritanceAttributeTest::Startup"
514
+ end
515
+
516
+ class Startup < Company
517
+ end
518
+
519
+ class Empire < Company
520
+ end
521
+
522
+ def test_inheritance_new_with_subclass_as_default
523
+ startup = Company.new # without arguments
524
+ assert_equal 'InheritanceAttributeTest::Startup', startup.type
525
+ assert_instance_of Startup, startup
526
+
527
+ empire = Company.new(type: 'InheritanceAttributeTest::Empire') # without arguments
528
+ assert_equal 'InheritanceAttributeTest::Empire', empire.type
529
+ assert_instance_of Empire, empire
530
+ end
531
+ end
532
+
533
+ class InheritanceAttributeMappingTest < ActiveRecord::TestCase
534
+ setup do
535
+ @old_registry = ActiveRecord::Type.registry
536
+ ActiveRecord::Type.registry = ActiveRecord::Type::AdapterSpecificRegistry.new
537
+ ActiveRecord::Type.register :omg_sti, InheritanceAttributeMappingTest::OmgStiType
538
+ Company.delete_all
539
+ Sponsor.delete_all
540
+ end
541
+
542
+ teardown do
543
+ ActiveRecord::Type.registry = @old_registry
544
+ end
545
+
546
+ class OmgStiType < ActiveRecord::Type::String
547
+ def cast_value(value)
548
+ if value =~ /\Aomg_(.+)\z/
549
+ $1.classify
550
+ else
551
+ value
552
+ end
553
+ end
554
+
555
+ def serialize(value)
556
+ if value
557
+ "omg_%s" % value.underscore
558
+ end
559
+ end
560
+ end
561
+
562
+ class Company < ActiveRecord::Base
563
+ self.table_name = 'companies'
564
+ attribute :type, :omg_sti
565
+ end
566
+
567
+ class Startup < Company; end
568
+ class Empire < Company; end
569
+
570
+ class Sponsor < ActiveRecord::Base
571
+ self.table_name = 'sponsors'
572
+ attribute :sponsorable_type, :omg_sti
573
+
574
+ belongs_to :sponsorable, polymorphic: true
575
+ end
576
+
577
+ def test_sti_with_custom_type
578
+ Startup.create! name: 'a Startup'
579
+ Empire.create! name: 'an Empire'
580
+
581
+ assert_equal [["a Startup", "omg_inheritance_attribute_mapping_test/startup"],
582
+ ["an Empire", "omg_inheritance_attribute_mapping_test/empire"]], ActiveRecord::Base.connection.select_rows('SELECT name, type FROM companies').sort
583
+ assert_equal [["a Startup", "InheritanceAttributeMappingTest::Startup"],
584
+ ["an Empire", "InheritanceAttributeMappingTest::Empire"]], Company.all.map { |a| [a.name, a.type] }.sort
585
+
586
+ startup = Startup.first
587
+ startup.becomes! Empire
588
+ startup.save!
589
+
590
+ assert_equal [["a Startup", "omg_inheritance_attribute_mapping_test/empire"],
591
+ ["an Empire", "omg_inheritance_attribute_mapping_test/empire"]], ActiveRecord::Base.connection.select_rows('SELECT name, type FROM companies').sort
592
+
593
+ assert_equal [["a Startup", "InheritanceAttributeMappingTest::Empire"],
594
+ ["an Empire", "InheritanceAttributeMappingTest::Empire"]], Company.all.map { |a| [a.name, a.type] }.sort
595
+ end
596
+
597
+ def test_polymorphic_associations_custom_type
598
+ startup = Startup.create! name: 'a Startup'
599
+ sponsor = Sponsor.create! sponsorable: startup
600
+
601
+ assert_equal ["omg_inheritance_attribute_mapping_test/company"], ActiveRecord::Base.connection.select_values('SELECT sponsorable_type FROM sponsors')
602
+
603
+ sponsor = Sponsor.first
604
+ assert_equal startup, sponsor.sponsorable
605
+ end
606
+ end