ibm_db 3.0.5-x86-mingw32 → 4.0.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 (586) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -0
  3. data/LICENSE +1 -1
  4. data/MANIFEST +14 -14
  5. data/ParameterizedQueries README +6 -6
  6. data/README +208 -225
  7. data/ext/Makefile.nt32 +181 -181
  8. data/ext/Makefile.nt32.191 +212 -212
  9. data/ext/extconf.rb +291 -291
  10. data/ext/ibm_db.c +11887 -11887
  11. data/ext/ruby_ibm_db.h +241 -241
  12. data/ext/ruby_ibm_db_cli.c +866 -866
  13. data/ext/ruby_ibm_db_cli.h +500 -500
  14. data/init.rb +41 -41
  15. data/lib/IBM_DB.rb +27 -27
  16. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3452 -3177
  17. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +5 -2
  18. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  19. data/lib/mswin32/ibm_db.rb +91 -123
  20. data/lib/mswin32/rb2x/i386/ibm_db.so +0 -0
  21. data/test/active_record/connection_adapters/fake_adapter.rb +49 -46
  22. data/test/assets/example.log +1 -1
  23. data/test/assets/test.txt +1 -1
  24. data/test/cases/adapter_test.rb +351 -276
  25. data/test/cases/adapters/mysql2/active_schema_test.rb +193 -0
  26. data/test/cases/adapters/mysql2/bind_parameter_test.rb +50 -0
  27. data/test/cases/adapters/mysql2/boolean_test.rb +100 -0
  28. data/test/cases/adapters/mysql2/case_sensitivity_test.rb +63 -0
  29. data/test/cases/adapters/mysql2/charset_collation_test.rb +54 -0
  30. data/test/cases/adapters/mysql2/connection_test.rb +210 -0
  31. data/test/cases/adapters/mysql2/datetime_precision_quoting_test.rb +45 -0
  32. data/test/cases/adapters/mysql2/enum_test.rb +26 -0
  33. data/test/cases/adapters/mysql2/explain_test.rb +21 -0
  34. data/test/cases/adapters/mysql2/json_test.rb +195 -0
  35. data/test/cases/adapters/mysql2/mysql2_adapter_test.rb +83 -0
  36. data/test/cases/adapters/mysql2/reserved_word_test.rb +152 -0
  37. data/test/cases/adapters/mysql2/schema_migrations_test.rb +59 -0
  38. data/test/cases/adapters/mysql2/schema_test.rb +126 -0
  39. data/test/cases/adapters/mysql2/sp_test.rb +36 -0
  40. data/test/cases/adapters/mysql2/sql_types_test.rb +14 -0
  41. data/test/cases/adapters/mysql2/table_options_test.rb +42 -0
  42. data/test/cases/adapters/mysql2/unsigned_type_test.rb +66 -0
  43. data/test/cases/adapters/postgresql/active_schema_test.rb +98 -0
  44. data/test/cases/adapters/postgresql/array_test.rb +339 -0
  45. data/test/cases/adapters/postgresql/bit_string_test.rb +82 -0
  46. data/test/cases/adapters/postgresql/bytea_test.rb +134 -0
  47. data/test/cases/adapters/postgresql/case_insensitive_test.rb +26 -0
  48. data/test/cases/adapters/postgresql/change_schema_test.rb +38 -0
  49. data/test/cases/adapters/postgresql/cidr_test.rb +25 -0
  50. data/test/cases/adapters/postgresql/citext_test.rb +78 -0
  51. data/test/cases/adapters/postgresql/collation_test.rb +53 -0
  52. data/test/cases/adapters/postgresql/composite_test.rb +132 -0
  53. data/test/cases/adapters/postgresql/connection_test.rb +257 -0
  54. data/test/cases/adapters/postgresql/datatype_test.rb +92 -0
  55. data/test/cases/adapters/postgresql/domain_test.rb +47 -0
  56. data/test/cases/adapters/postgresql/enum_test.rb +91 -0
  57. data/test/cases/adapters/postgresql/explain_test.rb +20 -0
  58. data/test/cases/adapters/postgresql/extension_migration_test.rb +63 -0
  59. data/test/cases/adapters/postgresql/full_text_test.rb +44 -0
  60. data/test/cases/adapters/postgresql/geometric_test.rb +378 -0
  61. data/test/cases/adapters/postgresql/hstore_test.rb +382 -0
  62. data/test/cases/adapters/postgresql/infinity_test.rb +69 -0
  63. data/test/cases/adapters/postgresql/integer_test.rb +25 -0
  64. data/test/cases/adapters/postgresql/json_test.rb +237 -0
  65. data/test/cases/adapters/postgresql/ltree_test.rb +53 -0
  66. data/test/cases/adapters/postgresql/money_test.rb +96 -0
  67. data/test/cases/adapters/postgresql/network_test.rb +94 -0
  68. data/test/cases/adapters/postgresql/numbers_test.rb +49 -0
  69. data/test/cases/adapters/postgresql/postgresql_adapter_test.rb +405 -0
  70. data/test/cases/adapters/postgresql/prepared_statements_test.rb +22 -0
  71. data/test/cases/adapters/postgresql/quoting_test.rb +44 -0
  72. data/test/cases/adapters/postgresql/range_test.rb +343 -0
  73. data/test/cases/adapters/postgresql/referential_integrity_test.rb +111 -0
  74. data/test/cases/adapters/postgresql/rename_table_test.rb +34 -0
  75. data/test/cases/adapters/postgresql/schema_authorization_test.rb +119 -0
  76. data/test/cases/adapters/postgresql/schema_test.rb +597 -0
  77. data/test/cases/adapters/postgresql/serial_test.rb +154 -0
  78. data/test/cases/adapters/postgresql/statement_pool_test.rb +41 -0
  79. data/test/cases/adapters/postgresql/timestamp_test.rb +90 -0
  80. data/test/cases/adapters/postgresql/type_lookup_test.rb +33 -0
  81. data/test/cases/adapters/postgresql/utils_test.rb +62 -0
  82. data/test/cases/adapters/postgresql/uuid_test.rb +294 -0
  83. data/test/cases/adapters/postgresql/xml_test.rb +54 -0
  84. data/test/cases/adapters/sqlite3/collation_test.rb +53 -0
  85. data/test/cases/adapters/sqlite3/copy_table_test.rb +98 -0
  86. data/test/cases/adapters/sqlite3/explain_test.rb +21 -0
  87. data/test/cases/adapters/sqlite3/quoting_test.rb +101 -0
  88. data/test/cases/adapters/sqlite3/sqlite3_adapter_test.rb +441 -0
  89. data/test/cases/adapters/sqlite3/sqlite3_create_folder_test.rb +24 -0
  90. data/test/cases/adapters/sqlite3/statement_pool_test.rb +20 -0
  91. data/test/cases/aggregations_test.rb +168 -158
  92. data/test/cases/ar_schema_test.rb +146 -161
  93. data/test/cases/associations/association_scope_test.rb +16 -21
  94. data/test/cases/associations/belongs_to_associations_test.rb +1141 -1029
  95. data/test/cases/associations/bidirectional_destroy_dependencies_test.rb +41 -0
  96. data/test/cases/associations/callbacks_test.rb +190 -192
  97. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  98. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  99. data/test/cases/associations/eager_load_nested_include_test.rb +126 -128
  100. data/test/cases/associations/eager_singularization_test.rb +148 -148
  101. data/test/cases/associations/eager_test.rb +1514 -1429
  102. data/test/cases/associations/extension_test.rb +87 -82
  103. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +1004 -972
  104. data/test/cases/associations/has_many_associations_test.rb +2501 -2182
  105. data/test/cases/associations/has_many_through_associations_test.rb +1271 -1204
  106. data/test/cases/associations/has_one_associations_test.rb +707 -610
  107. data/test/cases/associations/has_one_through_associations_test.rb +383 -380
  108. data/test/cases/associations/inner_join_association_test.rb +139 -139
  109. data/test/cases/associations/inverse_associations_test.rb +733 -706
  110. data/test/cases/associations/join_model_test.rb +777 -754
  111. data/test/cases/associations/left_outer_join_association_test.rb +88 -0
  112. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  113. data/test/cases/associations/required_test.rb +102 -82
  114. data/test/cases/associations_test.rb +385 -380
  115. data/test/cases/attribute_decorators_test.rb +125 -125
  116. data/test/cases/attribute_methods/read_test.rb +60 -60
  117. data/test/cases/attribute_methods_test.rb +1009 -952
  118. data/test/cases/attribute_set_test.rb +270 -210
  119. data/test/cases/attribute_test.rb +246 -180
  120. data/test/cases/attributes_test.rb +253 -136
  121. data/test/cases/autosave_association_test.rb +1708 -1595
  122. data/test/cases/base_test.rb +1713 -1664
  123. data/test/cases/batches_test.rb +489 -212
  124. data/test/cases/binary_test.rb +44 -52
  125. data/test/cases/bind_parameter_test.rb +110 -100
  126. data/test/cases/cache_key_test.rb +25 -0
  127. data/test/cases/calculations_test.rb +798 -646
  128. data/test/cases/callbacks_test.rb +636 -543
  129. data/test/cases/clone_test.rb +40 -40
  130. data/test/cases/coders/json_test.rb +15 -0
  131. data/test/cases/coders/yaml_column_test.rb +63 -63
  132. data/test/cases/collection_cache_key_test.rb +115 -0
  133. data/test/cases/column_alias_test.rb +17 -17
  134. data/test/cases/column_definition_test.rb +92 -123
  135. data/test/cases/comment_test.rb +143 -0
  136. data/test/cases/connection_adapters/adapter_leasing_test.rb +56 -54
  137. data/test/cases/connection_adapters/connection_handler_test.rb +160 -53
  138. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  139. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +255 -293
  140. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +69 -65
  141. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  142. data/test/cases/connection_adapters/schema_cache_test.rb +61 -56
  143. data/test/cases/connection_adapters/type_lookup_test.rb +118 -110
  144. data/test/cases/connection_management_test.rb +112 -122
  145. data/test/cases/connection_pool_test.rb +521 -346
  146. data/test/cases/connection_specification/resolver_test.rb +131 -116
  147. data/test/cases/core_test.rb +112 -112
  148. data/test/cases/counter_cache_test.rb +214 -209
  149. data/test/cases/custom_locking_test.rb +17 -17
  150. data/test/cases/database_statements_test.rb +34 -19
  151. data/test/cases/{invalid_date_test.rb → date_test.rb} +44 -32
  152. data/test/cases/date_time_precision_test.rb +106 -0
  153. data/test/cases/date_time_test.rb +61 -61
  154. data/test/cases/defaults_test.rb +218 -223
  155. data/test/cases/dirty_test.rb +763 -785
  156. data/test/cases/disconnected_test.rb +30 -28
  157. data/test/cases/dup_test.rb +157 -157
  158. data/test/cases/enum_test.rb +444 -290
  159. data/test/cases/errors_test.rb +16 -0
  160. data/test/cases/explain_subscriber_test.rb +64 -64
  161. data/test/cases/explain_test.rb +87 -76
  162. data/test/cases/finder_respond_to_test.rb +60 -60
  163. data/test/cases/finder_test.rb +1294 -1169
  164. data/test/cases/fixture_set/file_test.rb +156 -138
  165. data/test/cases/fixtures_test.rb +988 -908
  166. data/test/cases/forbidden_attributes_protection_test.rb +165 -99
  167. data/test/cases/habtm_destroy_order_test.rb +61 -61
  168. data/test/cases/helper.rb +204 -210
  169. data/test/cases/hot_compatibility_test.rb +142 -54
  170. data/test/cases/i18n_test.rb +45 -45
  171. data/test/cases/inheritance_test.rb +606 -375
  172. data/test/cases/integration_test.rb +155 -139
  173. data/test/cases/invalid_connection_test.rb +24 -22
  174. data/test/cases/invertible_migration_test.rb +387 -295
  175. data/test/cases/json_serialization_test.rb +311 -302
  176. data/test/cases/locking_test.rb +493 -477
  177. data/test/cases/log_subscriber_test.rb +225 -136
  178. data/test/cases/migration/change_schema_test.rb +458 -512
  179. data/test/cases/migration/change_table_test.rb +256 -224
  180. data/test/cases/migration/column_attributes_test.rb +176 -192
  181. data/test/cases/migration/column_positioning_test.rb +56 -56
  182. data/test/cases/migration/columns_test.rb +310 -304
  183. data/test/cases/migration/command_recorder_test.rb +350 -305
  184. data/test/cases/migration/compatibility_test.rb +118 -0
  185. data/test/cases/migration/create_join_table_test.rb +157 -148
  186. data/test/cases/migration/foreign_key_test.rb +360 -328
  187. data/test/cases/migration/helper.rb +39 -39
  188. data/test/cases/migration/index_test.rb +218 -216
  189. data/test/cases/migration/logger_test.rb +36 -36
  190. data/test/cases/migration/pending_migrations_test.rb +52 -53
  191. data/test/cases/migration/references_foreign_key_test.rb +216 -169
  192. data/test/cases/migration/references_index_test.rb +101 -101
  193. data/test/cases/migration/references_statements_test.rb +136 -116
  194. data/test/cases/migration/rename_table_test.rb +93 -93
  195. data/test/cases/migration_test.rb +1157 -959
  196. data/test/cases/migrator_test.rb +470 -388
  197. data/test/cases/mixin_test.rb +68 -70
  198. data/test/cases/modules_test.rb +172 -173
  199. data/test/cases/multiparameter_attributes_test.rb +372 -350
  200. data/test/cases/multiple_db_test.rb +122 -115
  201. data/test/cases/nested_attributes_test.rb +1098 -1070
  202. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  203. data/test/cases/persistence_test.rb +1001 -909
  204. data/test/cases/pooled_connections_test.rb +81 -81
  205. data/test/cases/primary_keys_test.rb +376 -237
  206. data/test/cases/query_cache_test.rb +446 -326
  207. data/test/cases/quoting_test.rb +202 -156
  208. data/test/cases/readonly_test.rb +119 -118
  209. data/test/cases/reaper_test.rb +85 -85
  210. data/test/cases/reflection_test.rb +509 -463
  211. data/test/cases/relation/delegation_test.rb +63 -68
  212. data/test/cases/relation/merging_test.rb +157 -161
  213. data/test/cases/relation/mutation_test.rb +183 -165
  214. data/test/cases/relation/or_test.rb +92 -0
  215. data/test/cases/relation/predicate_builder_test.rb +16 -14
  216. data/test/cases/relation/record_fetch_warning_test.rb +40 -0
  217. data/test/cases/relation/where_chain_test.rb +105 -181
  218. data/test/cases/relation/where_clause_test.rb +182 -0
  219. data/test/cases/relation/where_test.rb +322 -300
  220. data/test/cases/relation_test.rb +328 -319
  221. data/test/cases/relations_test.rb +2026 -1815
  222. data/test/cases/reload_models_test.rb +22 -22
  223. data/test/cases/result_test.rb +90 -80
  224. data/test/cases/sanitize_test.rb +176 -83
  225. data/test/cases/schema_dumper_test.rb +457 -463
  226. data/test/cases/schema_loading_test.rb +52 -0
  227. data/test/cases/scoping/default_scoping_test.rb +528 -454
  228. data/test/cases/scoping/named_scoping_test.rb +561 -524
  229. data/test/cases/scoping/relation_scoping_test.rb +400 -357
  230. data/test/cases/secure_token_test.rb +32 -0
  231. data/test/cases/serialization_test.rb +104 -104
  232. data/test/cases/serialized_attribute_test.rb +364 -277
  233. data/test/cases/statement_cache_test.rb +136 -98
  234. data/test/cases/store_test.rb +195 -194
  235. data/test/cases/suppressor_test.rb +63 -0
  236. data/test/cases/tasks/database_tasks_test.rb +462 -398
  237. data/test/cases/tasks/mysql_rake_test.rb +345 -324
  238. data/test/cases/tasks/postgresql_rake_test.rb +304 -250
  239. data/test/cases/tasks/sqlite_rake_test.rb +220 -193
  240. data/test/cases/test_case.rb +131 -123
  241. data/test/cases/test_fixtures_test.rb +36 -0
  242. data/test/cases/time_precision_test.rb +102 -0
  243. data/test/cases/timestamp_test.rb +501 -467
  244. data/test/cases/touch_later_test.rb +121 -0
  245. data/test/cases/transaction_callbacks_test.rb +518 -452
  246. data/test/cases/transaction_isolation_test.rb +106 -106
  247. data/test/cases/transactions_test.rb +834 -817
  248. data/test/cases/type/adapter_specific_registry_test.rb +133 -0
  249. data/test/cases/type/date_time_test.rb +14 -0
  250. data/test/cases/type/integer_test.rb +27 -121
  251. data/test/cases/type/string_test.rb +22 -36
  252. data/test/cases/type/type_map_test.rb +177 -177
  253. data/test/cases/type_test.rb +39 -0
  254. data/test/cases/types_test.rb +24 -141
  255. data/test/cases/unconnected_test.rb +33 -33
  256. data/test/cases/validations/absence_validation_test.rb +73 -0
  257. data/test/cases/validations/association_validation_test.rb +97 -86
  258. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  259. data/test/cases/validations/i18n_validation_test.rb +86 -90
  260. data/test/cases/validations/length_validation_test.rb +79 -47
  261. data/test/cases/validations/presence_validation_test.rb +103 -68
  262. data/test/cases/validations/uniqueness_validation_test.rb +548 -457
  263. data/test/cases/validations_repair_helper.rb +19 -23
  264. data/test/cases/validations_test.rb +194 -165
  265. data/test/cases/view_test.rb +216 -119
  266. data/test/cases/yaml_serialization_test.rb +121 -126
  267. data/test/config.example.yml +97 -0
  268. data/test/config.rb +5 -5
  269. data/test/fixtures/accounts.yml +29 -29
  270. data/test/fixtures/admin/accounts.yml +2 -2
  271. data/test/fixtures/admin/users.yml +10 -10
  272. data/test/fixtures/author_addresses.original +11 -0
  273. data/test/fixtures/author_addresses.yml +17 -17
  274. data/test/fixtures/author_favorites.yml +3 -3
  275. data/test/fixtures/authors.original +17 -0
  276. data/test/fixtures/authors.yml +23 -23
  277. data/test/fixtures/bad_posts.yml +9 -0
  278. data/test/fixtures/binaries.yml +133 -133
  279. data/test/fixtures/books.yml +31 -11
  280. data/test/fixtures/bulbs.yml +5 -5
  281. data/test/fixtures/cars.yml +9 -9
  282. data/test/fixtures/categories.yml +19 -19
  283. data/test/fixtures/categories/special_categories.yml +9 -9
  284. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  285. data/test/fixtures/categories_ordered.yml +7 -7
  286. data/test/fixtures/categories_posts.yml +31 -31
  287. data/test/fixtures/categorizations.yml +23 -23
  288. data/test/fixtures/clubs.yml +8 -8
  289. data/test/fixtures/collections.yml +3 -3
  290. data/test/fixtures/colleges.yml +3 -3
  291. data/test/fixtures/comments.yml +65 -65
  292. data/test/fixtures/companies.yml +67 -67
  293. data/test/fixtures/computers.yml +10 -10
  294. data/test/fixtures/content.yml +3 -0
  295. data/test/fixtures/content_positions.yml +3 -0
  296. data/test/fixtures/courses.yml +8 -8
  297. data/test/fixtures/customers.yml +25 -25
  298. data/test/fixtures/dashboards.yml +6 -6
  299. data/test/fixtures/dead_parrots.yml +5 -0
  300. data/test/fixtures/developers.yml +22 -22
  301. data/test/fixtures/developers_projects.yml +16 -16
  302. data/test/fixtures/dog_lovers.yml +7 -7
  303. data/test/fixtures/dogs.yml +4 -4
  304. data/test/fixtures/doubloons.yml +3 -3
  305. data/test/fixtures/edges.yml +5 -5
  306. data/test/fixtures/entrants.yml +14 -14
  307. data/test/fixtures/essays.yml +6 -6
  308. data/test/fixtures/faces.yml +11 -11
  309. data/test/fixtures/fk_test_has_fk.yml +3 -3
  310. data/test/fixtures/fk_test_has_pk.yml +1 -1
  311. data/test/fixtures/friendships.yml +4 -4
  312. data/test/fixtures/funny_jokes.yml +10 -10
  313. data/test/fixtures/interests.yml +33 -33
  314. data/test/fixtures/items.yml +3 -3
  315. data/test/fixtures/jobs.yml +7 -7
  316. data/test/fixtures/legacy_things.yml +3 -3
  317. data/test/fixtures/live_parrots.yml +4 -0
  318. data/test/fixtures/mateys.yml +4 -4
  319. data/test/fixtures/member_details.yml +8 -8
  320. data/test/fixtures/member_types.yml +6 -6
  321. data/test/fixtures/members.yml +11 -11
  322. data/test/fixtures/memberships.yml +34 -34
  323. data/test/fixtures/men.yml +5 -5
  324. data/test/fixtures/minimalistics.yml +2 -2
  325. data/test/fixtures/minivans.yml +5 -5
  326. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  327. data/test/fixtures/mixins.yml +29 -29
  328. data/test/fixtures/movies.yml +7 -7
  329. data/test/fixtures/naked/yml/accounts.yml +1 -1
  330. data/test/fixtures/naked/yml/companies.yml +1 -1
  331. data/test/fixtures/naked/yml/courses.yml +1 -1
  332. data/test/fixtures/naked/yml/parrots.yml +2 -0
  333. data/test/fixtures/naked/yml/trees.yml +3 -0
  334. data/test/fixtures/nodes.yml +29 -0
  335. data/test/fixtures/organizations.yml +5 -5
  336. data/test/fixtures/other_comments.yml +6 -0
  337. data/test/fixtures/other_dogs.yml +2 -0
  338. data/test/fixtures/other_posts.yml +7 -0
  339. data/test/fixtures/other_topics.yml +42 -42
  340. data/test/fixtures/owners.yml +9 -9
  341. data/test/fixtures/parrots.yml +27 -27
  342. data/test/fixtures/parrots_pirates.yml +7 -7
  343. data/test/fixtures/people.yml +24 -24
  344. data/test/fixtures/peoples_treasures.yml +3 -3
  345. data/test/fixtures/pets.yml +19 -19
  346. data/test/fixtures/pirates.yml +15 -12
  347. data/test/fixtures/posts.yml +80 -80
  348. data/test/fixtures/price_estimates.yml +16 -7
  349. data/test/fixtures/products.yml +4 -4
  350. data/test/fixtures/projects.yml +7 -7
  351. data/test/fixtures/ratings.yml +14 -14
  352. data/test/fixtures/readers.yml +11 -11
  353. data/test/fixtures/references.yml +17 -17
  354. data/test/fixtures/reserved_words/distinct.yml +5 -5
  355. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  356. data/test/fixtures/reserved_words/group.yml +14 -14
  357. data/test/fixtures/reserved_words/select.yml +8 -8
  358. data/test/fixtures/reserved_words/values.yml +7 -7
  359. data/test/fixtures/ships.yml +6 -6
  360. data/test/fixtures/speedometers.yml +8 -8
  361. data/test/fixtures/sponsors.yml +12 -12
  362. data/test/fixtures/string_key_objects.yml +7 -7
  363. data/test/fixtures/subscribers.yml +10 -10
  364. data/test/fixtures/subscriptions.yml +12 -12
  365. data/test/fixtures/taggings.yml +78 -78
  366. data/test/fixtures/tags.yml +11 -11
  367. data/test/fixtures/tasks.yml +7 -7
  368. data/test/fixtures/teapots.yml +3 -3
  369. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  370. data/test/fixtures/to_be_linked/users.yml +10 -10
  371. data/test/fixtures/topics.yml +49 -49
  372. data/test/fixtures/toys.yml +14 -14
  373. data/test/fixtures/traffic_lights.yml +9 -9
  374. data/test/fixtures/treasures.yml +10 -10
  375. data/test/fixtures/trees.yml +3 -0
  376. data/test/fixtures/uuid_children.yml +3 -3
  377. data/test/fixtures/uuid_parents.yml +2 -2
  378. data/test/fixtures/variants.yml +4 -4
  379. data/test/fixtures/vegetables.yml +19 -19
  380. data/test/fixtures/vertices.yml +3 -3
  381. data/test/fixtures/warehouse_things.yml +2 -2
  382. data/test/fixtures/zines.yml +5 -5
  383. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  384. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  385. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  386. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -9
  387. data/test/migrations/missing/1_people_have_last_names.rb +9 -9
  388. data/test/migrations/missing/3_we_need_reminders.rb +12 -12
  389. data/test/migrations/missing/4_innocent_jointable.rb +12 -12
  390. data/test/migrations/rename/1_we_need_things.rb +11 -11
  391. data/test/migrations/rename/2_rename_things.rb +9 -9
  392. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  393. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  394. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  395. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  396. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  397. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  398. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  399. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  400. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  401. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  402. data/test/migrations/valid/2_we_need_reminders.rb +12 -12
  403. data/test/migrations/valid/3_innocent_jointable.rb +12 -12
  404. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  405. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +12 -12
  406. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +12 -12
  407. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  408. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  409. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  410. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  411. data/test/models/admin.rb +5 -5
  412. data/test/models/admin/account.rb +3 -3
  413. data/test/models/admin/randomly_named_c1.rb +6 -2
  414. data/test/models/admin/user.rb +40 -40
  415. data/test/models/aircraft.rb +5 -4
  416. data/test/models/arunit2_model.rb +3 -3
  417. data/test/models/author.rb +209 -212
  418. data/test/models/auto_id.rb +4 -4
  419. data/test/models/autoloadable/extra_firm.rb +2 -2
  420. data/test/models/binary.rb +2 -2
  421. data/test/models/bird.rb +12 -12
  422. data/test/models/book.rb +23 -18
  423. data/test/models/boolean.rb +2 -2
  424. data/test/models/bulb.rb +52 -51
  425. data/test/models/cake_designer.rb +3 -3
  426. data/test/models/car.rb +29 -26
  427. data/test/models/carrier.rb +2 -2
  428. data/test/models/cat.rb +10 -0
  429. data/test/models/categorization.rb +19 -19
  430. data/test/models/category.rb +35 -35
  431. data/test/models/chef.rb +8 -7
  432. data/test/models/citation.rb +3 -3
  433. data/test/models/club.rb +25 -23
  434. data/test/models/college.rb +10 -10
  435. data/test/models/column.rb +3 -3
  436. data/test/models/column_name.rb +3 -3
  437. data/test/models/comment.rb +76 -64
  438. data/test/models/company.rb +230 -228
  439. data/test/models/company_in_module.rb +98 -98
  440. data/test/models/computer.rb +3 -3
  441. data/test/models/contact.rb +41 -41
  442. data/test/models/content.rb +40 -0
  443. data/test/models/contract.rb +20 -20
  444. data/test/models/country.rb +7 -7
  445. data/test/models/course.rb +6 -6
  446. data/test/models/customer.rb +83 -77
  447. data/test/models/customer_carrier.rb +14 -14
  448. data/test/models/dashboard.rb +3 -3
  449. data/test/models/default.rb +2 -2
  450. data/test/models/department.rb +4 -4
  451. data/test/models/developer.rb +274 -255
  452. data/test/models/dog.rb +5 -5
  453. data/test/models/dog_lover.rb +5 -5
  454. data/test/models/doubloon.rb +12 -12
  455. data/test/models/drink_designer.rb +3 -3
  456. data/test/models/edge.rb +5 -5
  457. data/test/models/electron.rb +5 -5
  458. data/test/models/engine.rb +4 -4
  459. data/test/models/entrant.rb +3 -3
  460. data/test/models/essay.rb +5 -5
  461. data/test/models/event.rb +3 -3
  462. data/test/models/eye.rb +37 -37
  463. data/test/models/face.rb +9 -9
  464. data/test/models/friendship.rb +6 -6
  465. data/test/models/guid.rb +2 -2
  466. data/test/models/guitar.rb +4 -0
  467. data/test/models/hotel.rb +11 -9
  468. data/test/models/image.rb +3 -3
  469. data/test/models/interest.rb +5 -5
  470. data/test/models/invoice.rb +4 -4
  471. data/test/models/item.rb +7 -7
  472. data/test/models/job.rb +7 -7
  473. data/test/models/joke.rb +7 -7
  474. data/test/models/keyboard.rb +3 -3
  475. data/test/models/legacy_thing.rb +3 -3
  476. data/test/models/lesson.rb +11 -11
  477. data/test/models/line_item.rb +3 -3
  478. data/test/models/liquid.rb +4 -4
  479. data/test/models/man.rb +11 -11
  480. data/test/models/matey.rb +4 -4
  481. data/test/models/member.rb +42 -41
  482. data/test/models/member_detail.rb +8 -7
  483. data/test/models/member_type.rb +3 -3
  484. data/test/models/membership.rb +35 -35
  485. data/test/models/mentor.rb +3 -0
  486. data/test/models/minimalistic.rb +2 -2
  487. data/test/models/minivan.rb +9 -9
  488. data/test/models/mixed_case_monkey.rb +3 -3
  489. data/test/models/mocktail_designer.rb +2 -0
  490. data/test/models/molecule.rb +6 -6
  491. data/test/models/movie.rb +5 -5
  492. data/test/models/node.rb +5 -0
  493. data/test/models/non_primary_key.rb +2 -0
  494. data/test/models/notification.rb +3 -0
  495. data/test/models/order.rb +4 -4
  496. data/test/models/organization.rb +14 -14
  497. data/test/models/other_dog.rb +5 -0
  498. data/test/models/owner.rb +37 -34
  499. data/test/models/parrot.rb +28 -29
  500. data/test/models/person.rb +142 -143
  501. data/test/models/personal_legacy_thing.rb +4 -4
  502. data/test/models/pet.rb +18 -15
  503. data/test/models/pet_treasure.rb +6 -0
  504. data/test/models/pirate.rb +92 -92
  505. data/test/models/possession.rb +3 -3
  506. data/test/models/post.rb +273 -264
  507. data/test/models/price_estimate.rb +4 -4
  508. data/test/models/professor.rb +5 -5
  509. data/test/models/project.rb +40 -31
  510. data/test/models/publisher.rb +2 -2
  511. data/test/models/publisher/article.rb +4 -4
  512. data/test/models/publisher/magazine.rb +3 -3
  513. data/test/models/randomly_named_c1.rb +1 -1
  514. data/test/models/rating.rb +4 -4
  515. data/test/models/reader.rb +23 -23
  516. data/test/models/recipe.rb +3 -0
  517. data/test/models/record.rb +2 -2
  518. data/test/models/reference.rb +22 -22
  519. data/test/models/reply.rb +61 -61
  520. data/test/models/ship.rb +39 -33
  521. data/test/models/ship_part.rb +8 -8
  522. data/test/models/shop.rb +17 -17
  523. data/test/models/shop_account.rb +6 -6
  524. data/test/models/speedometer.rb +6 -6
  525. data/test/models/sponsor.rb +7 -7
  526. data/test/models/string_key_object.rb +3 -3
  527. data/test/models/student.rb +4 -4
  528. data/test/models/subject.rb +16 -16
  529. data/test/models/subscriber.rb +8 -8
  530. data/test/models/subscription.rb +4 -4
  531. data/test/models/tag.rb +13 -7
  532. data/test/models/tagging.rb +13 -13
  533. data/test/models/task.rb +5 -5
  534. data/test/models/topic.rb +118 -124
  535. data/test/models/toy.rb +6 -6
  536. data/test/models/traffic_light.rb +4 -4
  537. data/test/models/treasure.rb +14 -14
  538. data/test/models/treaty.rb +7 -7
  539. data/test/models/tree.rb +3 -0
  540. data/test/models/tuning_peg.rb +4 -0
  541. data/test/models/tyre.rb +11 -11
  542. data/test/models/user.rb +14 -0
  543. data/test/models/uuid_child.rb +3 -3
  544. data/test/models/uuid_item.rb +6 -0
  545. data/test/models/uuid_parent.rb +3 -3
  546. data/test/models/vegetables.rb +24 -24
  547. data/test/models/vehicle.rb +6 -6
  548. data/test/models/vertex.rb +9 -9
  549. data/test/models/warehouse_thing.rb +5 -5
  550. data/test/models/wheel.rb +3 -3
  551. data/test/models/without_table.rb +3 -3
  552. data/test/models/zine.rb +3 -3
  553. data/test/schema/mysql2_specific_schema.rb +68 -58
  554. data/test/schema/oracle_specific_schema.rb +40 -43
  555. data/test/schema/postgresql_specific_schema.rb +114 -202
  556. data/test/schema/schema.rb +1057 -952
  557. data/test/schema/schema.rb.original +1057 -0
  558. data/test/schema/sqlite_specific_schema.rb +18 -22
  559. data/test/support/config.rb +43 -43
  560. data/test/support/connection.rb +23 -22
  561. data/test/support/connection_helper.rb +14 -14
  562. data/test/support/ddl_helper.rb +8 -8
  563. data/test/support/schema_dumping_helper.rb +20 -20
  564. data/test/support/yaml_compatibility_fixtures/rails_4_1.yml +22 -0
  565. data/test/support/yaml_compatibility_fixtures/rails_4_2_0.yml +182 -0
  566. metadata +129 -28
  567. data/lib/mswin32/rb19x/ibm_db.so +0 -0
  568. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  569. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  570. data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
  571. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +0 -26
  572. data/test/cases/attribute_methods/serialization_test.rb +0 -29
  573. data/test/cases/migration/change_schema_test - Copy.rb +0 -448
  574. data/test/cases/migration/foreign_key_test - Changed.rb +0 -325
  575. data/test/cases/migration/table_and_index_test.rb +0 -24
  576. data/test/cases/relation/where_test2.rb +0 -36
  577. data/test/cases/type/decimal_test.rb +0 -56
  578. data/test/cases/type/unsigned_integer_test.rb +0 -18
  579. data/test/cases/xml_serialization_test.rb +0 -457
  580. data/test/connections/native_ibm_db/connection.rb +0 -44
  581. data/test/fixtures/naked/csv/accounts.csv +0 -1
  582. data/test/schema/i5/ibm_db_specific_schema.rb +0 -137
  583. data/test/schema/ids/ibm_db_specific_schema.rb +0 -140
  584. data/test/schema/luw/ibm_db_specific_schema.rb +0 -137
  585. data/test/schema/mysql_specific_schema.rb +0 -70
  586. data/test/schema/zOS/ibm_db_specific_schema.rb +0 -208
@@ -1,138 +1,156 @@
1
- require 'cases/helper'
2
- require 'tempfile'
3
-
4
- module ActiveRecord
5
- class FixtureSet
6
- class FileTest < ActiveRecord::TestCase
7
- def test_open
8
- fh = File.open(::File.join(FIXTURES_ROOT, "accounts.yml"))
9
- assert_equal 6, fh.to_a.length
10
- end
11
-
12
- def test_open_with_block
13
- called = false
14
- File.open(::File.join(FIXTURES_ROOT, "accounts.yml")) do |fh|
15
- called = true
16
- assert_equal 6, fh.to_a.length
17
- end
18
- assert called, 'block called'
19
- end
20
-
21
- def test_names
22
- File.open(::File.join(FIXTURES_ROOT, "accounts.yml")) do |fh|
23
- assert_equal ["signals37",
24
- "unknown",
25
- "rails_core_account",
26
- "last_account",
27
- "rails_core_account_2",
28
- "odegy_account"].sort, fh.to_a.map(&:first).sort
29
- end
30
- end
31
-
32
- def test_values
33
- File.open(::File.join(FIXTURES_ROOT, "accounts.yml")) do |fh|
34
- assert_equal [1,2,3,4,5,6].sort, fh.to_a.map(&:last).map { |x|
35
- x['id']
36
- }.sort
37
- end
38
- end
39
-
40
- def test_erb_processing
41
- File.open(::File.join(FIXTURES_ROOT, "developers.yml")) do |fh|
42
- devs = Array.new(8) { |i| "dev_#{i + 3}" }
43
- assert_equal [], devs - fh.to_a.map(&:first)
44
- end
45
- end
46
-
47
- def test_empty_file
48
- tmp_yaml ['empty', 'yml'], '' do |t|
49
- assert_equal [], File.open(t.path) { |fh| fh.to_a }
50
- end
51
- end
52
-
53
- # A valid YAML file is not necessarily a value Fixture file. Make sure
54
- # an exception is raised if the format is not valid Fixture format.
55
- def test_wrong_fixture_format_string
56
- tmp_yaml ['empty', 'yml'], 'qwerty' do |t|
57
- assert_raises(ActiveRecord::Fixture::FormatError) do
58
- File.open(t.path) { |fh| fh.to_a }
59
- end
60
- end
61
- end
62
-
63
- def test_wrong_fixture_format_nested
64
- tmp_yaml ['empty', 'yml'], 'one: two' do |t|
65
- assert_raises(ActiveRecord::Fixture::FormatError) do
66
- File.open(t.path) { |fh| fh.to_a }
67
- end
68
- end
69
- end
70
-
71
- def test_render_context_helper
72
- ActiveRecord::FixtureSet.context_class.class_eval do
73
- def fixture_helper
74
- "Fixture helper"
75
- end
76
- end
77
- yaml = "one:\n name: <%= fixture_helper %>\n"
78
- tmp_yaml ['curious', 'yml'], yaml do |t|
79
- golden =
80
- [["one", {"name" => "Fixture helper"}]]
81
- assert_equal golden, File.open(t.path) { |fh| fh.to_a }
82
- end
83
- ActiveRecord::FixtureSet.context_class.class_eval do
84
- remove_method :fixture_helper
85
- end
86
- end
87
-
88
- def test_render_context_lookup_scope
89
- yaml = <<END
90
- one:
91
- ActiveRecord: <%= defined? ActiveRecord %>
92
- ActiveRecord_FixtureSet: <%= defined? ActiveRecord::FixtureSet %>
93
- FixtureSet: <%= defined? FixtureSet %>
94
- ActiveRecord_FixtureSet_File: <%= defined? ActiveRecord::FixtureSet::File %>
95
- File: <%= File.name %>
96
- END
97
-
98
- golden = [['one', {
99
- 'ActiveRecord' => 'constant',
100
- 'ActiveRecord_FixtureSet' => 'constant',
101
- 'FixtureSet' => nil,
102
- 'ActiveRecord_FixtureSet_File' => 'constant',
103
- 'File' => 'File'
104
- }]]
105
-
106
- tmp_yaml ['curious', 'yml'], yaml do |t|
107
- assert_equal golden, File.open(t.path) { |fh| fh.to_a }
108
- end
109
- end
110
-
111
- # Make sure that each fixture gets its own rendering context so that
112
- # fixtures are independent.
113
- def test_independent_render_contexts
114
- yaml1 = "<% def leaked_method; 'leak'; end %>\n"
115
- yaml2 = "one:\n name: <%= leaked_method %>\n"
116
- tmp_yaml ['leaky', 'yml'], yaml1 do |t1|
117
- tmp_yaml ['curious', 'yml'], yaml2 do |t2|
118
- File.open(t1.path) { |fh| fh.to_a }
119
- assert_raises(NameError) do
120
- File.open(t2.path) { |fh| fh.to_a }
121
- end
122
- end
123
- end
124
- end
125
-
126
- private
127
- def tmp_yaml(name, contents)
128
- t = Tempfile.new name
129
- t.binmode
130
- t.write contents
131
- t.close
132
- yield t
133
- ensure
134
- t.close true
135
- end
136
- end
137
- end
138
- end
1
+ require 'cases/helper'
2
+ require 'tempfile'
3
+
4
+ module ActiveRecord
5
+ class FixtureSet
6
+ class FileTest < ActiveRecord::TestCase
7
+ def test_open
8
+ fh = File.open(::File.join(FIXTURES_ROOT, "accounts.yml"))
9
+ assert_equal 6, fh.to_a.length
10
+ end
11
+
12
+ def test_open_with_block
13
+ called = false
14
+ File.open(::File.join(FIXTURES_ROOT, "accounts.yml")) do |fh|
15
+ called = true
16
+ assert_equal 6, fh.to_a.length
17
+ end
18
+ assert called, 'block called'
19
+ end
20
+
21
+ def test_names
22
+ File.open(::File.join(FIXTURES_ROOT, "accounts.yml")) do |fh|
23
+ assert_equal ["signals37",
24
+ "unknown",
25
+ "rails_core_account",
26
+ "last_account",
27
+ "rails_core_account_2",
28
+ "odegy_account"].sort, fh.to_a.map(&:first).sort
29
+ end
30
+ end
31
+
32
+ def test_values
33
+ File.open(::File.join(FIXTURES_ROOT, "accounts.yml")) do |fh|
34
+ assert_equal [1,2,3,4,5,6].sort, fh.to_a.map(&:last).map { |x|
35
+ x['id']
36
+ }.sort
37
+ end
38
+ end
39
+
40
+ def test_erb_processing
41
+ File.open(::File.join(FIXTURES_ROOT, "developers.yml")) do |fh|
42
+ devs = Array.new(8) { |i| "dev_#{i + 3}" }
43
+ assert_equal [], devs - fh.to_a.map(&:first)
44
+ end
45
+ end
46
+
47
+ def test_empty_file
48
+ tmp_yaml ['empty', 'yml'], '' do |t|
49
+ assert_equal [], File.open(t.path) { |fh| fh.to_a }
50
+ end
51
+ end
52
+
53
+ # A valid YAML file is not necessarily a value Fixture file. Make sure
54
+ # an exception is raised if the format is not valid Fixture format.
55
+ def test_wrong_fixture_format_string
56
+ tmp_yaml ['empty', 'yml'], 'qwerty' do |t|
57
+ assert_raises(ActiveRecord::Fixture::FormatError) do
58
+ File.open(t.path) { |fh| fh.to_a }
59
+ end
60
+ end
61
+ end
62
+
63
+ def test_wrong_fixture_format_nested
64
+ tmp_yaml ['empty', 'yml'], 'one: two' do |t|
65
+ assert_raises(ActiveRecord::Fixture::FormatError) do
66
+ File.open(t.path) { |fh| fh.to_a }
67
+ end
68
+ end
69
+ end
70
+
71
+ def test_render_context_helper
72
+ ActiveRecord::FixtureSet.context_class.class_eval do
73
+ def fixture_helper
74
+ "Fixture helper"
75
+ end
76
+ end
77
+ yaml = "one:\n name: <%= fixture_helper %>\n"
78
+ tmp_yaml ['curious', 'yml'], yaml do |t|
79
+ golden =
80
+ [["one", {"name" => "Fixture helper"}]]
81
+ assert_equal golden, File.open(t.path) { |fh| fh.to_a }
82
+ end
83
+ ActiveRecord::FixtureSet.context_class.class_eval do
84
+ remove_method :fixture_helper
85
+ end
86
+ end
87
+
88
+ def test_render_context_lookup_scope
89
+ yaml = <<END
90
+ one:
91
+ ActiveRecord: <%= defined? ActiveRecord %>
92
+ ActiveRecord_FixtureSet: <%= defined? ActiveRecord::FixtureSet %>
93
+ FixtureSet: <%= defined? FixtureSet %>
94
+ ActiveRecord_FixtureSet_File: <%= defined? ActiveRecord::FixtureSet::File %>
95
+ File: <%= File.name %>
96
+ END
97
+
98
+ golden = [['one', {
99
+ 'ActiveRecord' => 'constant',
100
+ 'ActiveRecord_FixtureSet' => 'constant',
101
+ 'FixtureSet' => nil,
102
+ 'ActiveRecord_FixtureSet_File' => 'constant',
103
+ 'File' => 'File'
104
+ }]]
105
+
106
+ tmp_yaml ['curious', 'yml'], yaml do |t|
107
+ assert_equal golden, File.open(t.path) { |fh| fh.to_a }
108
+ end
109
+ end
110
+
111
+ # Make sure that each fixture gets its own rendering context so that
112
+ # fixtures are independent.
113
+ def test_independent_render_contexts
114
+ yaml1 = "<% def leaked_method; 'leak'; end %>\n"
115
+ yaml2 = "one:\n name: <%= leaked_method %>\n"
116
+ tmp_yaml ['leaky', 'yml'], yaml1 do |t1|
117
+ tmp_yaml ['curious', 'yml'], yaml2 do |t2|
118
+ File.open(t1.path) { |fh| fh.to_a }
119
+ assert_raises(NameError) do
120
+ File.open(t2.path) { |fh| fh.to_a }
121
+ end
122
+ end
123
+ end
124
+ end
125
+
126
+ def test_removes_fixture_config_row
127
+ File.open(::File.join(FIXTURES_ROOT, 'other_posts.yml')) do |fh|
128
+ assert_equal(['second_welcome'], fh.each.map { |name, _| name })
129
+ end
130
+ end
131
+
132
+ def test_extracts_model_class_from_config_row
133
+ File.open(::File.join(FIXTURES_ROOT, 'other_posts.yml')) do |fh|
134
+ assert_equal 'Post', fh.model_class
135
+ end
136
+ end
137
+
138
+ def test_erb_filename
139
+ filename = 'filename.yaml'
140
+ erb = File.new(filename).send(:prepare_erb, "<% Rails.env %>\n")
141
+ assert_equal erb.filename, filename
142
+ end
143
+
144
+ private
145
+ def tmp_yaml(name, contents)
146
+ t = Tempfile.new name
147
+ t.binmode
148
+ t.write contents
149
+ t.close
150
+ yield t
151
+ ensure
152
+ t.close true
153
+ end
154
+ end
155
+ end
156
+ end
@@ -1,908 +1,988 @@
1
- require 'cases/helper'
2
- require 'models/admin'
3
- require 'models/admin/account'
4
- require 'models/admin/randomly_named_c1'
5
- require 'models/admin/user'
6
- require 'models/binary'
7
- require 'models/book'
8
- require 'models/bulb'
9
- require 'models/category'
10
- require 'models/company'
11
- require 'models/computer'
12
- require 'models/course'
13
- require 'models/developer'
14
- require 'models/computer'
15
- require 'models/joke'
16
- require 'models/matey'
17
- require 'models/parrot'
18
- require 'models/pirate'
19
- require 'models/doubloon'
20
- require 'models/post'
21
- require 'models/randomly_named_c1'
22
- require 'models/reply'
23
- require 'models/ship'
24
- require 'models/task'
25
- require 'models/topic'
26
- require 'models/traffic_light'
27
- require 'models/treasure'
28
- require 'tempfile'
29
-
30
- class FixturesTest < ActiveRecord::TestCase
31
- self.use_instantiated_fixtures = true
32
- self.use_transactional_fixtures = false
33
-
34
- # other_topics fixture should not be included here
35
- fixtures :topics, :developers, :accounts, :tasks, :categories, :funny_jokes, :binaries, :traffic_lights, :author_addresses
36
-
37
- FIXTURES = %w( accounts binaries companies customers
38
- developers developers_projects entrants
39
- movies projects subscribers topics tasks )
40
- MATCH_ATTRIBUTE_NAME = /[a-zA-Z][-\w]*/
41
-
42
- def test_clean_fixtures
43
- FIXTURES.each do |name|
44
- fixtures = nil
45
- assert_nothing_raised { fixtures = create_fixtures(name).first }
46
- assert_kind_of(ActiveRecord::FixtureSet, fixtures)
47
- fixtures.each { |_name, fixture|
48
- fixture.each { |key, value|
49
- assert_match(MATCH_ATTRIBUTE_NAME, key)
50
- }
51
- }
52
- end
53
- end
54
-
55
- def test_broken_yaml_exception
56
- badyaml = Tempfile.new ['foo', '.yml']
57
- badyaml.write 'a: : '
58
- badyaml.flush
59
-
60
- dir = File.dirname badyaml.path
61
- name = File.basename badyaml.path, '.yml'
62
- assert_raises(ActiveRecord::Fixture::FormatError) do
63
- ActiveRecord::FixtureSet.create_fixtures(dir, name)
64
- end
65
- ensure
66
- badyaml.close
67
- badyaml.unlink
68
- end
69
-
70
- def test_create_fixtures
71
- fixtures = ActiveRecord::FixtureSet.create_fixtures(FIXTURES_ROOT, "parrots")
72
- assert Parrot.find_by_name('Curious George'), 'George is not in the database'
73
- assert fixtures.detect { |f| f.name == 'parrots' }, "no fixtures named 'parrots' in #{fixtures.map(&:name).inspect}"
74
- end
75
-
76
- def test_multiple_clean_fixtures
77
- fixtures_array = nil
78
- assert_nothing_raised { fixtures_array = create_fixtures(*FIXTURES) }
79
- assert_kind_of(Array, fixtures_array)
80
- fixtures_array.each { |fixtures| assert_kind_of(ActiveRecord::FixtureSet, fixtures) }
81
- end
82
-
83
- def test_create_symbol_fixtures
84
- fixtures = ActiveRecord::FixtureSet.create_fixtures(FIXTURES_ROOT, :collections, :collections => Course) { Course.connection }
85
-
86
- assert Course.find_by_name('Collection'), 'course is not in the database'
87
- assert fixtures.detect { |f| f.name == 'collections' }, "no fixtures named 'collections' in #{fixtures.map(&:name).inspect}"
88
- end
89
-
90
- def test_attributes
91
- topics = create_fixtures("topics").first
92
- assert_equal("The First Topic", topics["first"]["title"])
93
- assert_nil(topics["second"]["author_email_address"])
94
- end
95
-
96
- def test_inserts
97
- create_fixtures("topics")
98
- first_row = ActiveRecord::Base.connection.select_one("SELECT * FROM topics WHERE author_name = 'David'")
99
- assert_equal("The First Topic", first_row["title"])
100
-
101
- second_row = ActiveRecord::Base.connection.select_one("SELECT * FROM topics WHERE author_name = 'Mary'")
102
- assert_nil(second_row["author_email_address"])
103
- end
104
-
105
- if ActiveRecord::Base.connection.supports_migrations?
106
- def test_inserts_with_pre_and_suffix
107
- # Reset cache to make finds on the new table work
108
- ActiveRecord::FixtureSet.reset_cache
109
-
110
- ActiveRecord::Base.connection.create_table :prefix_other_topics_suffix do |t|
111
- t.column :title, :string
112
- t.column :author_name, :string
113
- t.column :author_email_address, :string
114
- t.column :written_on, :datetime
115
- t.column :bonus_time, :time
116
- t.column :last_read, :date
117
- t.column :content, :string
118
- t.column :approved, :boolean, :default => true
119
- t.column :replies_count, :integer, :default => 0
120
- t.column :parent_id, :integer
121
- t.column :type, :string, :limit => 50
122
- end
123
-
124
- # Store existing prefix/suffix
125
- old_prefix = ActiveRecord::Base.table_name_prefix
126
- old_suffix = ActiveRecord::Base.table_name_suffix
127
-
128
- # Set a prefix/suffix we can test against
129
- ActiveRecord::Base.table_name_prefix = 'prefix_'
130
- ActiveRecord::Base.table_name_suffix = '_suffix'
131
-
132
- other_topic_klass = Class.new(ActiveRecord::Base) do
133
- def self.name
134
- "OtherTopic"
135
- end
136
- end
137
-
138
- topics = [create_fixtures("other_topics")].flatten.first
139
-
140
- # This checks for a caching problem which causes a bug in the fixtures
141
- # class-level configuration helper.
142
- assert_not_nil topics, "Fixture data inserted, but fixture objects not returned from create"
143
-
144
- first_row = ActiveRecord::Base.connection.select_one("SELECT * FROM prefix_other_topics_suffix WHERE author_name = 'David'")
145
- assert_not_nil first_row, "The prefix_other_topics_suffix table appears to be empty despite create_fixtures: the row with author_name = 'David' was not found"
146
- assert_equal("The First Topic", first_row["title"])
147
-
148
- second_row = ActiveRecord::Base.connection.select_one("SELECT * FROM prefix_other_topics_suffix WHERE author_name = 'Mary'")
149
- assert_nil(second_row["author_email_address"])
150
-
151
- assert_equal :prefix_other_topics_suffix, topics.table_name.to_sym
152
- # This assertion should preferably be the last in the list, because calling
153
- # other_topic_klass.table_name sets a class-level instance variable
154
- assert_equal :prefix_other_topics_suffix, other_topic_klass.table_name.to_sym
155
-
156
- ensure
157
- # Restore prefix/suffix to its previous values
158
- ActiveRecord::Base.table_name_prefix = old_prefix
159
- ActiveRecord::Base.table_name_suffix = old_suffix
160
-
161
- ActiveRecord::Base.connection.drop_table :prefix_other_topics_suffix rescue nil
162
- end
163
- end
164
-
165
- def test_insert_with_datetime
166
- create_fixtures("tasks")
167
- first = Task.find(1)
168
- assert first
169
- end
170
-
171
- def test_logger_level_invariant
172
- level = ActiveRecord::Base.logger.level
173
- create_fixtures('topics')
174
- assert_equal level, ActiveRecord::Base.logger.level
175
- end
176
-
177
- def test_instantiation
178
- topics = create_fixtures("topics").first
179
- assert_kind_of Topic, topics["first"].find
180
- end
181
-
182
- def test_complete_instantiation
183
- assert_equal "The First Topic", @first.title
184
- end
185
-
186
- def test_fixtures_from_root_yml_with_instantiation
187
- # assert_equal 2, @accounts.size
188
- assert_equal 50, @unknown.credit_limit
189
- end
190
-
191
- def test_erb_in_fixtures
192
- assert_equal "fixture_5", @dev_5.name
193
- end
194
-
195
- def test_empty_yaml_fixture
196
- assert_not_nil ActiveRecord::FixtureSet.new( Account.connection, "accounts", Account, FIXTURES_ROOT + "/naked/yml/accounts")
197
- end
198
-
199
- def test_empty_yaml_fixture_with_a_comment_in_it
200
- assert_not_nil ActiveRecord::FixtureSet.new( Account.connection, "companies", Company, FIXTURES_ROOT + "/naked/yml/companies")
201
- end
202
-
203
- def test_nonexistent_fixture_file
204
- nonexistent_fixture_path = FIXTURES_ROOT + "/imnothere"
205
-
206
- #sanity check to make sure that this file never exists
207
- assert Dir[nonexistent_fixture_path+"*"].empty?
208
-
209
- assert_raise(Errno::ENOENT) do
210
- ActiveRecord::FixtureSet.new( Account.connection, "companies", Company, nonexistent_fixture_path)
211
- end
212
- end
213
-
214
- def test_dirty_dirty_yaml_file
215
- assert_raise(ActiveRecord::Fixture::FormatError) do
216
- ActiveRecord::FixtureSet.new( Account.connection, "courses", Course, FIXTURES_ROOT + "/naked/yml/courses")
217
- end
218
- end
219
-
220
- def test_yaml_file_with_invalid_column
221
- e = assert_raise(ActiveRecord::Fixture::FixtureError) do
222
- ActiveRecord::FixtureSet.create_fixtures(FIXTURES_ROOT + "/naked/yml", "parrots")
223
- end
224
- assert_equal(%(table "parrots" has no column named "arrr".), e.message)
225
- end
226
-
227
- def test_yaml_file_with_symbol_columns
228
- ActiveRecord::FixtureSet.create_fixtures(FIXTURES_ROOT + "/naked/yml", "trees")
229
- end
230
-
231
- def test_omap_fixtures
232
- assert_nothing_raised do
233
- fixtures = ActiveRecord::FixtureSet.new(Account.connection, 'categories', Category, FIXTURES_ROOT + "/categories_ordered")
234
-
235
- fixtures.each.with_index do |(name, fixture), i|
236
- assert_equal "fixture_no_#{i}", name
237
- assert_equal "Category #{i}", fixture['name']
238
- end
239
- end
240
- end
241
-
242
- def test_yml_file_in_subdirectory
243
- assert_equal(categories(:sub_special_1).name, "A special category in a subdir file")
244
- assert_equal(categories(:sub_special_1).class, SpecialCategory)
245
- end
246
-
247
- def test_subsubdir_file_with_arbitrary_name
248
- assert_equal(categories(:sub_special_3).name, "A special category in an arbitrarily named subsubdir file")
249
- assert_equal(categories(:sub_special_3).class, SpecialCategory)
250
- end
251
-
252
- def test_binary_in_fixtures
253
- data = File.open(ASSETS_ROOT + "/flowers.jpg", 'rb') { |f| f.read }
254
- data.force_encoding('ASCII-8BIT')
255
- data.freeze
256
- assert_equal data, @flowers.data
257
- end
258
-
259
- def test_serialized_fixtures
260
- assert_equal ["Green", "Red", "Orange"], traffic_lights(:uk).state
261
- end
262
-
263
- def test_fixtures_are_set_up_with_database_env_variable
264
- db_url_tmp = ENV['DATABASE_URL']
265
- ENV['DATABASE_URL'] = "sqlite3::memory:"
266
- ActiveRecord::Base.stubs(:configurations).returns({})
267
- test_case = Class.new(ActiveRecord::TestCase) do
268
- fixtures :accounts
269
-
270
- def test_fixtures
271
- assert accounts(:signals37)
272
- end
273
- end
274
-
275
- result = test_case.new(:test_fixtures).run
276
-
277
- assert result.passed?, "Expected #{result.name} to pass:\n#{result}"
278
- ensure
279
- ENV['DATABASE_URL'] = db_url_tmp
280
- end
281
- end
282
-
283
- class HasManyThroughFixture < ActiveSupport::TestCase
284
- def make_model(name)
285
- Class.new(ActiveRecord::Base) { define_singleton_method(:name) { name } }
286
- end
287
-
288
- def test_has_many_through_with_default_table_name
289
- pt = make_model "ParrotTreasure"
290
- parrot = make_model "Parrot"
291
- treasure = make_model "Treasure"
292
-
293
- pt.table_name = "parrots_treasures"
294
- pt.belongs_to :parrot, :anonymous_class => parrot
295
- pt.belongs_to :treasure, :anonymous_class => treasure
296
-
297
- parrot.has_many :parrot_treasures, :anonymous_class => pt
298
- parrot.has_many :treasures, :through => :parrot_treasures
299
-
300
- parrots = File.join FIXTURES_ROOT, 'parrots'
301
-
302
- fs = ActiveRecord::FixtureSet.new parrot.connection, "parrots", parrot, parrots
303
- rows = fs.table_rows
304
- assert_equal load_has_and_belongs_to_many['parrots_treasures'], rows['parrots_treasures']
305
- end
306
-
307
- def test_has_many_through_with_renamed_table
308
- pt = make_model "ParrotTreasure"
309
- parrot = make_model "Parrot"
310
- treasure = make_model "Treasure"
311
-
312
- pt.belongs_to :parrot, :anonymous_class => parrot
313
- pt.belongs_to :treasure, :anonymous_class => treasure
314
-
315
- parrot.has_many :parrot_treasures, :anonymous_class => pt
316
- parrot.has_many :treasures, :through => :parrot_treasures
317
-
318
- parrots = File.join FIXTURES_ROOT, 'parrots'
319
-
320
- fs = ActiveRecord::FixtureSet.new parrot.connection, "parrots", parrot, parrots
321
- rows = fs.table_rows
322
- assert_equal load_has_and_belongs_to_many['parrots_treasures'], rows['parrot_treasures']
323
- end
324
-
325
- def load_has_and_belongs_to_many
326
- parrot = make_model "Parrot"
327
- parrot.has_and_belongs_to_many :treasures
328
-
329
- parrots = File.join FIXTURES_ROOT, 'parrots'
330
-
331
- fs = ActiveRecord::FixtureSet.new parrot.connection, "parrots", parrot, parrots
332
- fs.table_rows
333
- end
334
- end
335
-
336
- if Account.connection.respond_to?(:reset_pk_sequence!)
337
- class FixturesResetPkSequenceTest < ActiveRecord::TestCase
338
- fixtures :accounts
339
- fixtures :companies
340
-
341
- def setup
342
- @instances = [Account.new(:credit_limit => 50), Company.new(:name => 'RoR Consulting'), Course.new(name: 'Test')]
343
- ActiveRecord::FixtureSet.reset_cache # make sure tables get reinitialized
344
- end
345
-
346
- def test_resets_to_min_pk_with_specified_pk_and_sequence
347
- @instances.each do |instance|
348
- model = instance.class
349
- model.delete_all
350
- model.connection.reset_pk_sequence!(model.table_name, model.primary_key, model.sequence_name)
351
-
352
- instance.save!
353
- assert_equal 1, instance.id, "Sequence reset for #{model.table_name} failed."
354
- end
355
- end
356
-
357
- def test_resets_to_min_pk_with_default_pk_and_sequence
358
- @instances.each do |instance|
359
- model = instance.class
360
- model.delete_all
361
- model.connection.reset_pk_sequence!(model.table_name)
362
-
363
- instance.save!
364
- assert_equal 1, instance.id, "Sequence reset for #{model.table_name} failed."
365
- end
366
- end
367
-
368
- def test_create_fixtures_resets_sequences_when_not_cached
369
- @instances.each do |instance|
370
- max_id = create_fixtures(instance.class.table_name).first.fixtures.inject(0) do |_max_id, (_, fixture)|
371
- fixture_id = fixture['id'].to_i
372
- fixture_id > _max_id ? fixture_id : _max_id
373
- end
374
-
375
- # Clone the last fixture to check that it gets the next greatest id.
376
- instance.save!
377
- assert_equal max_id + 1, instance.id, "Sequence reset for #{instance.class.table_name} failed."
378
- end
379
- end
380
- end
381
- end
382
-
383
- class FixturesWithoutInstantiationTest < ActiveRecord::TestCase
384
- self.use_instantiated_fixtures = false
385
- fixtures :topics, :developers, :accounts
386
-
387
- def test_without_complete_instantiation
388
- assert !defined?(@first)
389
- assert !defined?(@topics)
390
- assert !defined?(@developers)
391
- assert !defined?(@accounts)
392
- end
393
-
394
- def test_fixtures_from_root_yml_without_instantiation
395
- assert !defined?(@unknown), "@unknown is not defined"
396
- end
397
-
398
- def test_visibility_of_accessor_method
399
- assert_equal false, respond_to?(:topics, false), "should be private method"
400
- assert_equal true, respond_to?(:topics, true), "confirm to respond surely"
401
- end
402
-
403
- def test_accessor_methods
404
- assert_equal "The First Topic", topics(:first).title
405
- assert_equal "Jamis", developers(:jamis).name
406
- assert_equal 50, accounts(:signals37).credit_limit
407
- end
408
-
409
- def test_accessor_methods_with_multiple_args
410
- assert_equal 2, topics(:first, :second).size
411
- assert_raise(StandardError) { topics([:first, :second]) }
412
- end
413
-
414
- def test_reloading_fixtures_through_accessor_methods
415
- assert_equal "The First Topic", topics(:first).title
416
- @loaded_fixtures['topics']['first'].expects(:find).returns(stub(:title => "Fresh Topic!"))
417
- assert_equal "Fresh Topic!", topics(:first, true).title
418
- end
419
- end
420
-
421
- class FixturesWithoutInstanceInstantiationTest < ActiveRecord::TestCase
422
- self.use_instantiated_fixtures = true
423
- self.use_instantiated_fixtures = :no_instances
424
-
425
- fixtures :topics, :developers, :accounts
426
-
427
- def test_without_instance_instantiation
428
- assert !defined?(@first), "@first is not defined"
429
- end
430
- end
431
-
432
- class TransactionalFixturesTest < ActiveRecord::TestCase
433
- self.use_instantiated_fixtures = true
434
- self.use_transactional_fixtures = true
435
-
436
- fixtures :topics
437
-
438
- def test_destroy
439
- assert_not_nil @first
440
- @first.destroy
441
- end
442
-
443
- def test_destroy_just_kidding
444
- assert_not_nil @first
445
- end
446
- end
447
-
448
- class MultipleFixturesTest < ActiveRecord::TestCase
449
- fixtures :topics
450
- fixtures :developers, :accounts
451
-
452
- def test_fixture_table_names
453
- assert_equal %w(topics developers accounts), fixture_table_names
454
- end
455
- end
456
-
457
- class SetupTest < ActiveRecord::TestCase
458
- # fixtures :topics
459
-
460
- def setup
461
- @first = true
462
- end
463
-
464
- def test_nothing
465
- end
466
- end
467
-
468
- class SetupSubclassTest < SetupTest
469
- def setup
470
- super
471
- @second = true
472
- end
473
-
474
- def test_subclassing_should_preserve_setups
475
- assert @first
476
- assert @second
477
- end
478
- end
479
-
480
-
481
- class OverlappingFixturesTest < ActiveRecord::TestCase
482
- fixtures :topics, :developers
483
- fixtures :developers, :accounts
484
-
485
- def test_fixture_table_names
486
- assert_equal %w(topics developers accounts), fixture_table_names
487
- end
488
- end
489
-
490
- class ForeignKeyFixturesTest < ActiveRecord::TestCase
491
- fixtures :fk_test_has_pk, :fk_test_has_fk
492
-
493
- # if foreign keys are implemented and fixtures
494
- # are not deleted in reverse order then this test
495
- # case will raise StatementInvalid
496
-
497
- def test_number1
498
- assert true
499
- end
500
-
501
- def test_number2
502
- assert true
503
- end
504
- end
505
-
506
- class OverRideFixtureMethodTest < ActiveRecord::TestCase
507
- fixtures :topics
508
-
509
- def topics(name)
510
- topic = super
511
- topic.title = 'omg'
512
- topic
513
- end
514
-
515
- def test_fixture_methods_can_be_overridden
516
- x = topics :first
517
- assert_equal 'omg', x.title
518
- end
519
- end
520
-
521
- class CheckSetTableNameFixturesTest < ActiveRecord::TestCase
522
- set_fixture_class :funny_jokes => Joke
523
- fixtures :funny_jokes
524
- # Set to false to blow away fixtures cache and ensure our fixtures are loaded
525
- # and thus takes into account our set_fixture_class
526
- self.use_transactional_fixtures = false
527
-
528
- def test_table_method
529
- assert_kind_of Joke, funny_jokes(:a_joke)
530
- end
531
- end
532
-
533
- class FixtureNameIsNotTableNameFixturesTest < ActiveRecord::TestCase
534
- set_fixture_class :items => Book
535
- fixtures :items
536
- # Set to false to blow away fixtures cache and ensure our fixtures are loaded
537
- # and thus takes into account our set_fixture_class
538
- self.use_transactional_fixtures = false
539
-
540
- def test_named_accessor
541
- assert_kind_of Book, items(:dvd)
542
- end
543
- end
544
-
545
- class FixtureNameIsNotTableNameMultipleFixturesTest < ActiveRecord::TestCase
546
- set_fixture_class :items => Book, :funny_jokes => Joke
547
- fixtures :items, :funny_jokes
548
- # Set to false to blow away fixtures cache and ensure our fixtures are loaded
549
- # and thus takes into account our set_fixture_class
550
- self.use_transactional_fixtures = false
551
-
552
- def test_named_accessor_of_differently_named_fixture
553
- assert_kind_of Book, items(:dvd)
554
- end
555
-
556
- def test_named_accessor_of_same_named_fixture
557
- assert_kind_of Joke, funny_jokes(:a_joke)
558
- end
559
- end
560
-
561
- class CustomConnectionFixturesTest < ActiveRecord::TestCase
562
- set_fixture_class :courses => Course
563
- fixtures :courses
564
- self.use_transactional_fixtures = false
565
-
566
- def test_leaky_destroy
567
- assert_nothing_raised { courses(:ruby) }
568
- courses(:ruby).destroy
569
- end
570
-
571
- def test_it_twice_in_whatever_order_to_check_for_fixture_leakage
572
- test_leaky_destroy
573
- end
574
- end
575
-
576
- class TransactionalFixturesOnCustomConnectionTest < ActiveRecord::TestCase
577
- set_fixture_class :courses => Course
578
- fixtures :courses
579
- self.use_transactional_fixtures = true
580
-
581
- def test_leaky_destroy
582
- assert_nothing_raised { courses(:ruby) }
583
- courses(:ruby).destroy
584
- end
585
-
586
- def test_it_twice_in_whatever_order_to_check_for_fixture_leakage
587
- test_leaky_destroy
588
- end
589
- end
590
-
591
- class InvalidTableNameFixturesTest < ActiveRecord::TestCase
592
- fixtures :funny_jokes
593
- # Set to false to blow away fixtures cache and ensure our fixtures are loaded
594
- # and thus takes into account our lack of set_fixture_class
595
- self.use_transactional_fixtures = false
596
-
597
- def test_raises_error
598
- assert_raise ActiveRecord::FixtureClassNotFound do
599
- funny_jokes(:a_joke)
600
- end
601
- end
602
- end
603
-
604
- class CheckEscapedYamlFixturesTest < ActiveRecord::TestCase
605
- set_fixture_class :funny_jokes => Joke
606
- fixtures :funny_jokes
607
- # Set to false to blow away fixtures cache and ensure our fixtures are loaded
608
- # and thus takes into account our set_fixture_class
609
- self.use_transactional_fixtures = false
610
-
611
- def test_proper_escaped_fixture
612
- assert_equal "The \\n Aristocrats\nAte the candy\n", funny_jokes(:another_joke).name
613
- end
614
- end
615
-
616
- class DevelopersProject; end
617
- class ManyToManyFixturesWithClassDefined < ActiveRecord::TestCase
618
- fixtures :developers_projects
619
-
620
- def test_this_should_run_cleanly
621
- assert true
622
- end
623
- end
624
-
625
- class FixturesBrokenRollbackTest < ActiveRecord::TestCase
626
- def blank_setup
627
- @fixture_connections = [ActiveRecord::Base.connection]
628
- end
629
- alias_method :ar_setup_fixtures, :setup_fixtures
630
- alias_method :setup_fixtures, :blank_setup
631
- alias_method :setup, :blank_setup
632
-
633
- def blank_teardown; end
634
- alias_method :ar_teardown_fixtures, :teardown_fixtures
635
- alias_method :teardown_fixtures, :blank_teardown
636
- alias_method :teardown, :blank_teardown
637
-
638
- def test_no_rollback_in_teardown_unless_transaction_active
639
- assert_equal 0, ActiveRecord::Base.connection.open_transactions
640
- assert_raise(RuntimeError) { ar_setup_fixtures }
641
- assert_equal 0, ActiveRecord::Base.connection.open_transactions
642
- assert_nothing_raised { ar_teardown_fixtures }
643
- assert_equal 0, ActiveRecord::Base.connection.open_transactions
644
- end
645
-
646
- private
647
- def load_fixtures(config)
648
- raise 'argh'
649
- end
650
- end
651
-
652
- class LoadAllFixturesTest < ActiveRecord::TestCase
653
- def test_all_there
654
- self.class.fixture_path = FIXTURES_ROOT + "/all"
655
- self.class.fixtures :all
656
-
657
- if File.symlink? FIXTURES_ROOT + "/all/admin"
658
- assert_equal %w(admin/accounts admin/users developers people tasks), fixture_table_names.sort
659
- end
660
- ensure
661
- ActiveRecord::FixtureSet.reset_cache
662
- end
663
- end
664
-
665
- class LoadAllFixturesWithPathnameTest < ActiveRecord::TestCase
666
- def test_all_there
667
- self.class.fixture_path = Pathname.new(FIXTURES_ROOT).join('all')
668
- self.class.fixtures :all
669
-
670
- if File.symlink? FIXTURES_ROOT + "/all/admin"
671
- assert_equal %w(admin/accounts admin/users developers people tasks), fixture_table_names.sort
672
- end
673
- ensure
674
- ActiveRecord::FixtureSet.reset_cache
675
- end
676
- end
677
-
678
- class FasterFixturesTest < ActiveRecord::TestCase
679
- self.use_transactional_fixtures = false
680
- fixtures :categories, :authors
681
-
682
- def load_extra_fixture(name)
683
- fixture = create_fixtures(name).first
684
- assert fixture.is_a?(ActiveRecord::FixtureSet)
685
- @loaded_fixtures[fixture.table_name] = fixture
686
- end
687
-
688
- def test_cache
689
- assert ActiveRecord::FixtureSet.fixture_is_cached?(ActiveRecord::Base.connection, 'categories')
690
- assert ActiveRecord::FixtureSet.fixture_is_cached?(ActiveRecord::Base.connection, 'authors')
691
-
692
- assert_no_queries do
693
- create_fixtures('categories')
694
- create_fixtures('authors')
695
- end
696
-
697
- load_extra_fixture('posts')
698
- assert ActiveRecord::FixtureSet.fixture_is_cached?(ActiveRecord::Base.connection, 'posts')
699
- self.class.setup_fixture_accessors :posts
700
- assert_equal 'Welcome to the weblog', posts(:welcome).title
701
- end
702
- end
703
-
704
- class FoxyFixturesTest < ActiveRecord::TestCase
705
- fixtures :parrots, :parrots_pirates, :pirates, :treasures, :mateys, :ships, :computers, :developers, :"admin/accounts", :"admin/users"
706
-
707
- if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
708
- require 'models/uuid_parent'
709
- require 'models/uuid_child'
710
- fixtures :uuid_parents, :uuid_children
711
- end
712
-
713
- def test_identifies_strings
714
- assert_equal(ActiveRecord::FixtureSet.identify("foo"), ActiveRecord::FixtureSet.identify("foo"))
715
- assert_not_equal(ActiveRecord::FixtureSet.identify("foo"), ActiveRecord::FixtureSet.identify("FOO"))
716
- end
717
-
718
- def test_identifies_symbols
719
- assert_equal(ActiveRecord::FixtureSet.identify(:foo), ActiveRecord::FixtureSet.identify(:foo))
720
- end
721
-
722
- def test_identifies_consistently
723
- assert_equal 207281424, ActiveRecord::FixtureSet.identify(:ruby)
724
- assert_equal 1066363776, ActiveRecord::FixtureSet.identify(:sapphire_2)
725
-
726
- assert_equal 'f92b6bda-0d0d-5fe1-9124-502b18badded', ActiveRecord::FixtureSet.identify(:daddy, :uuid)
727
- assert_equal 'b4b10018-ad47-595d-b42f-d8bdaa6d01bf', ActiveRecord::FixtureSet.identify(:sonny, :uuid)
728
- end
729
-
730
- TIMESTAMP_COLUMNS = %w(created_at created_on updated_at updated_on)
731
-
732
- def test_populates_timestamp_columns
733
- TIMESTAMP_COLUMNS.each do |property|
734
- assert_not_nil(parrots(:george).send(property), "should set #{property}")
735
- end
736
- end
737
-
738
- def test_does_not_populate_timestamp_columns_if_model_has_set_record_timestamps_to_false
739
- TIMESTAMP_COLUMNS.each do |property|
740
- assert_nil(ships(:black_pearl).send(property), "should not set #{property}")
741
- end
742
- end
743
-
744
- def test_populates_all_columns_with_the_same_time
745
- last = nil
746
-
747
- TIMESTAMP_COLUMNS.each do |property|
748
- current = parrots(:george).send(property)
749
- last ||= current
750
-
751
- assert_equal(last, current)
752
- last = current
753
- end
754
- end
755
-
756
- def test_only_populates_columns_that_exist
757
- assert_not_nil(pirates(:blackbeard).created_on)
758
- assert_not_nil(pirates(:blackbeard).updated_on)
759
- end
760
-
761
- def test_preserves_existing_fixture_data
762
- assert_equal(2.weeks.ago.to_date, pirates(:redbeard).created_on.to_date)
763
- assert_equal(2.weeks.ago.to_date, pirates(:redbeard).updated_on.to_date)
764
- end
765
-
766
- def test_generates_unique_ids
767
- assert_not_nil(parrots(:george).id)
768
- assert_not_equal(parrots(:george).id, parrots(:louis).id)
769
- end
770
-
771
- def test_automatically_sets_primary_key
772
- assert_not_nil(ships(:black_pearl))
773
- end
774
-
775
- def test_preserves_existing_primary_key
776
- assert_equal(2, ships(:interceptor).id)
777
- end
778
-
779
- def test_resolves_belongs_to_symbols
780
- assert_equal(parrots(:george), pirates(:blackbeard).parrot)
781
- end
782
-
783
- def test_ignores_belongs_to_symbols_if_association_and_foreign_key_are_named_the_same
784
- assert_equal(developers(:david), computers(:workstation).developer)
785
- end
786
-
787
- def test_supports_join_tables
788
- assert(pirates(:blackbeard).parrots.include?(parrots(:george)))
789
- assert(pirates(:blackbeard).parrots.include?(parrots(:louis)))
790
- assert(parrots(:george).pirates.include?(pirates(:blackbeard)))
791
- end
792
-
793
- def test_supports_inline_habtm
794
- assert(parrots(:george).treasures.include?(treasures(:diamond)))
795
- assert(parrots(:george).treasures.include?(treasures(:sapphire)))
796
- assert(!parrots(:george).treasures.include?(treasures(:ruby)))
797
- end
798
-
799
- def test_supports_inline_habtm_with_specified_id
800
- assert(parrots(:polly).treasures.include?(treasures(:ruby)))
801
- assert(parrots(:polly).treasures.include?(treasures(:sapphire)))
802
- assert(!parrots(:polly).treasures.include?(treasures(:diamond)))
803
- end
804
-
805
- def test_supports_yaml_arrays
806
- assert(parrots(:louis).treasures.include?(treasures(:diamond)))
807
- assert(parrots(:louis).treasures.include?(treasures(:sapphire)))
808
- end
809
-
810
- def test_strips_DEFAULTS_key
811
- assert_raise(StandardError) { parrots(:DEFAULTS) }
812
-
813
- # this lets us do YAML defaults and not have an extra fixture entry
814
- %w(sapphire ruby).each { |t| assert(parrots(:davey).treasures.include?(treasures(t))) }
815
- end
816
-
817
- def test_supports_label_interpolation
818
- assert_equal("frederick", parrots(:frederick).name)
819
- end
820
-
821
- def test_supports_label_string_interpolation
822
- assert_equal("X marks the spot!", pirates(:mark).catchphrase)
823
- end
824
-
825
- def test_supports_polymorphic_belongs_to
826
- assert_equal(pirates(:redbeard), treasures(:sapphire).looter)
827
- assert_equal(parrots(:louis), treasures(:ruby).looter)
828
- end
829
-
830
- def test_only_generates_a_pk_if_necessary
831
- m = Matey.first
832
- m.pirate = pirates(:blackbeard)
833
- m.target = pirates(:redbeard)
834
- end
835
-
836
- def test_supports_sti
837
- assert_kind_of DeadParrot, parrots(:polly)
838
- assert_equal pirates(:blackbeard), parrots(:polly).killer
839
- end
840
-
841
- def test_namespaced_models
842
- assert admin_accounts(:signals37).users.include?(admin_users(:david))
843
- assert_equal 2, admin_accounts(:signals37).users.size
844
- end
845
- end
846
-
847
- class ActiveSupportSubclassWithFixturesTest < ActiveRecord::TestCase
848
- fixtures :parrots
849
-
850
- # This seemingly useless assertion catches a bug that caused the fixtures
851
- # setup code call nil[]
852
- def test_foo
853
- assert_equal parrots(:louis), Parrot.find_by_name("King Louis")
854
- end
855
- end
856
-
857
- class CustomNameForFixtureOrModelTest < ActiveRecord::TestCase
858
- ActiveRecord::FixtureSet.reset_cache
859
-
860
- set_fixture_class :randomly_named_a9 =>
861
- ClassNameThatDoesNotFollowCONVENTIONS,
862
- :'admin/randomly_named_a9' =>
863
- Admin::ClassNameThatDoesNotFollowCONVENTIONS,
864
- 'admin/randomly_named_b0' =>
865
- Admin::ClassNameThatDoesNotFollowCONVENTIONS
866
-
867
- fixtures :randomly_named_a9, 'admin/randomly_named_a9',
868
- :'admin/randomly_named_b0'
869
-
870
- def test_named_accessor_for_randomly_named_fixture_and_class
871
- assert_kind_of ClassNameThatDoesNotFollowCONVENTIONS,
872
- randomly_named_a9(:first_instance)
873
- end
874
-
875
- def test_named_accessor_for_randomly_named_namespaced_fixture_and_class
876
- assert_kind_of Admin::ClassNameThatDoesNotFollowCONVENTIONS,
877
- admin_randomly_named_a9(:first_instance)
878
- assert_kind_of Admin::ClassNameThatDoesNotFollowCONVENTIONS,
879
- admin_randomly_named_b0(:second_instance)
880
- end
881
-
882
- def test_table_name_is_defined_in_the_model
883
- assert_equal 'randomly_named_table', ActiveRecord::FixtureSet::all_loaded_fixtures["admin/randomly_named_a9"].table_name
884
- assert_equal 'randomly_named_table', Admin::ClassNameThatDoesNotFollowCONVENTIONS.table_name
885
- end
886
- end
887
-
888
- class FixturesWithDefaultScopeTest < ActiveRecord::TestCase
889
- fixtures :bulbs
890
-
891
- test "inserts fixtures excluded by a default scope" do
892
- assert_equal 1, Bulb.count
893
- assert_equal 2, Bulb.unscoped.count
894
- end
895
-
896
- test "allows access to fixtures excluded by a default scope" do
897
- assert_equal "special", bulbs(:special).name
898
- end
899
- end
900
-
901
- class FixturesWithAbstractBelongsTo < ActiveRecord::TestCase
902
- fixtures :pirates, :doubloons
903
-
904
- test "creates fixtures with belongs_to associations defined in abstract base classes" do
905
- assert_not_nil doubloons(:blackbeards_doubloon)
906
- assert_equal pirates(:blackbeard), doubloons(:blackbeards_doubloon).pirate
907
- end
908
- end
1
+ require 'cases/helper'
2
+ require 'models/admin'
3
+ require 'models/admin/account'
4
+ require 'models/admin/randomly_named_c1'
5
+ require 'models/admin/user'
6
+ require 'models/binary'
7
+ require 'models/book'
8
+ require 'models/bulb'
9
+ require 'models/category'
10
+ require 'models/comment'
11
+ require 'models/company'
12
+ require 'models/computer'
13
+ require 'models/course'
14
+ require 'models/developer'
15
+ require "models/dog"
16
+ require 'models/doubloon'
17
+ require 'models/joke'
18
+ require 'models/matey'
19
+ require "models/other_dog"
20
+ require 'models/parrot'
21
+ require 'models/pirate'
22
+ require 'models/post'
23
+ require 'models/randomly_named_c1'
24
+ require 'models/reply'
25
+ require 'models/ship'
26
+ require 'models/task'
27
+ require 'models/topic'
28
+ require 'models/traffic_light'
29
+ require 'models/treasure'
30
+ require 'tempfile'
31
+
32
+ class FixturesTest < ActiveRecord::TestCase
33
+ self.use_instantiated_fixtures = true
34
+ self.use_transactional_tests = false
35
+
36
+ # other_topics fixture should not be included here
37
+ fixtures :topics, :developers, :accounts, :tasks, :categories, :funny_jokes, :binaries, :traffic_lights
38
+
39
+ FIXTURES = %w( accounts binaries companies customers
40
+ developers developers_projects entrants
41
+ movies projects subscribers topics tasks )
42
+ MATCH_ATTRIBUTE_NAME = /[a-zA-Z][-\w]*/
43
+
44
+ def test_clean_fixtures
45
+ FIXTURES.each do |name|
46
+ fixtures = nil
47
+ assert_nothing_raised { fixtures = create_fixtures(name).first }
48
+ assert_kind_of(ActiveRecord::FixtureSet, fixtures)
49
+ fixtures.each { |_name, fixture|
50
+ fixture.each { |key, value|
51
+ assert_match(MATCH_ATTRIBUTE_NAME, key)
52
+ }
53
+ }
54
+ end
55
+ end
56
+
57
+ def test_broken_yaml_exception
58
+ badyaml = Tempfile.new ['foo', '.yml']
59
+ badyaml.write 'a: : '
60
+ badyaml.flush
61
+
62
+ dir = File.dirname badyaml.path
63
+ name = File.basename badyaml.path, '.yml'
64
+ assert_raises(ActiveRecord::Fixture::FormatError) do
65
+ ActiveRecord::FixtureSet.create_fixtures(dir, name)
66
+ end
67
+ ensure
68
+ badyaml.close
69
+ badyaml.unlink
70
+ end
71
+
72
+ def test_create_fixtures
73
+ fixtures = ActiveRecord::FixtureSet.create_fixtures(FIXTURES_ROOT, "parrots")
74
+ assert Parrot.find_by_name('Curious George'), 'George is not in the database'
75
+ assert fixtures.detect { |f| f.name == 'parrots' }, "no fixtures named 'parrots' in #{fixtures.map(&:name).inspect}"
76
+ end
77
+
78
+ def test_multiple_clean_fixtures
79
+ fixtures_array = nil
80
+ assert_nothing_raised { fixtures_array = create_fixtures(*FIXTURES) }
81
+ assert_kind_of(Array, fixtures_array)
82
+ fixtures_array.each { |fixtures| assert_kind_of(ActiveRecord::FixtureSet, fixtures) }
83
+ end
84
+
85
+ def test_create_symbol_fixtures
86
+ fixtures = ActiveRecord::FixtureSet.create_fixtures(FIXTURES_ROOT, :collections, :collections => Course) { Course.connection }
87
+
88
+ assert Course.find_by_name('Collection'), 'course is not in the database'
89
+ assert fixtures.detect { |f| f.name == 'collections' }, "no fixtures named 'collections' in #{fixtures.map(&:name).inspect}"
90
+ end
91
+
92
+ def test_attributes
93
+ topics = create_fixtures("topics").first
94
+ assert_equal("The First Topic", topics["first"]["title"])
95
+ assert_nil(topics["second"]["author_email_address"])
96
+ end
97
+
98
+ def test_inserts
99
+ create_fixtures("topics")
100
+ first_row = ActiveRecord::Base.connection.select_one("SELECT * FROM topics WHERE author_name = 'David'")
101
+ assert_equal("The First Topic", first_row["title"])
102
+
103
+ second_row = ActiveRecord::Base.connection.select_one("SELECT * FROM topics WHERE author_name = 'Mary'")
104
+ assert_nil(second_row["author_email_address"])
105
+ end
106
+
107
+ if ActiveRecord::Base.connection.supports_migrations?
108
+ def test_inserts_with_pre_and_suffix
109
+ # Reset cache to make finds on the new table work
110
+ ActiveRecord::FixtureSet.reset_cache
111
+
112
+ ActiveRecord::Base.connection.create_table :prefix_other_topics_suffix do |t|
113
+ t.column :title, :string
114
+ t.column :author_name, :string
115
+ t.column :author_email_address, :string
116
+ t.column :written_on, :datetime
117
+ t.column :bonus_time, :time
118
+ t.column :last_read, :date
119
+ t.column :content, :string
120
+ t.column :approved, :boolean, :default => true
121
+ t.column :replies_count, :integer, :default => 0
122
+ t.column :parent_id, :integer
123
+ t.column :type, :string, :limit => 50
124
+ end
125
+
126
+ # Store existing prefix/suffix
127
+ old_prefix = ActiveRecord::Base.table_name_prefix
128
+ old_suffix = ActiveRecord::Base.table_name_suffix
129
+
130
+ # Set a prefix/suffix we can test against
131
+ ActiveRecord::Base.table_name_prefix = 'prefix_'
132
+ ActiveRecord::Base.table_name_suffix = '_suffix'
133
+
134
+ other_topic_klass = Class.new(ActiveRecord::Base) do
135
+ def self.name
136
+ "OtherTopic"
137
+ end
138
+ end
139
+
140
+ topics = [create_fixtures("other_topics")].flatten.first
141
+
142
+ # This checks for a caching problem which causes a bug in the fixtures
143
+ # class-level configuration helper.
144
+ assert_not_nil topics, "Fixture data inserted, but fixture objects not returned from create"
145
+
146
+ first_row = ActiveRecord::Base.connection.select_one("SELECT * FROM prefix_other_topics_suffix WHERE author_name = 'David'")
147
+ assert_not_nil first_row, "The prefix_other_topics_suffix table appears to be empty despite create_fixtures: the row with author_name = 'David' was not found"
148
+ assert_equal("The First Topic", first_row["title"])
149
+
150
+ second_row = ActiveRecord::Base.connection.select_one("SELECT * FROM prefix_other_topics_suffix WHERE author_name = 'Mary'")
151
+ assert_nil(second_row["author_email_address"])
152
+
153
+ assert_equal :prefix_other_topics_suffix, topics.table_name.to_sym
154
+ # This assertion should preferably be the last in the list, because calling
155
+ # other_topic_klass.table_name sets a class-level instance variable
156
+ assert_equal :prefix_other_topics_suffix, other_topic_klass.table_name.to_sym
157
+
158
+ ensure
159
+ # Restore prefix/suffix to its previous values
160
+ ActiveRecord::Base.table_name_prefix = old_prefix
161
+ ActiveRecord::Base.table_name_suffix = old_suffix
162
+
163
+ ActiveRecord::Base.connection.drop_table :prefix_other_topics_suffix rescue nil
164
+ end
165
+ end
166
+
167
+ def test_insert_with_datetime
168
+ create_fixtures("tasks")
169
+ first = Task.find(1)
170
+ assert first
171
+ end
172
+
173
+ def test_logger_level_invariant
174
+ level = ActiveRecord::Base.logger.level
175
+ create_fixtures('topics')
176
+ assert_equal level, ActiveRecord::Base.logger.level
177
+ end
178
+
179
+ def test_instantiation
180
+ topics = create_fixtures("topics").first
181
+ assert_kind_of Topic, topics["first"].find
182
+ end
183
+
184
+ def test_complete_instantiation
185
+ assert_equal "The First Topic", @first.title
186
+ end
187
+
188
+ def test_fixtures_from_root_yml_with_instantiation
189
+ assert_equal 50, @unknown.credit_limit
190
+ end
191
+
192
+ def test_erb_in_fixtures
193
+ assert_equal "fixture_5", @dev_5.name
194
+ end
195
+
196
+ def test_empty_yaml_fixture
197
+ assert_not_nil ActiveRecord::FixtureSet.new( Account.connection, "accounts", Account, FIXTURES_ROOT + "/naked/yml/accounts")
198
+ end
199
+
200
+ def test_empty_yaml_fixture_with_a_comment_in_it
201
+ assert_not_nil ActiveRecord::FixtureSet.new( Account.connection, "companies", Company, FIXTURES_ROOT + "/naked/yml/companies")
202
+ end
203
+
204
+ def test_nonexistent_fixture_file
205
+ nonexistent_fixture_path = FIXTURES_ROOT + "/imnothere"
206
+
207
+ #sanity check to make sure that this file never exists
208
+ assert Dir[nonexistent_fixture_path+"*"].empty?
209
+
210
+ assert_raise(Errno::ENOENT) do
211
+ ActiveRecord::FixtureSet.new( Account.connection, "companies", Company, nonexistent_fixture_path)
212
+ end
213
+ end
214
+
215
+ def test_dirty_dirty_yaml_file
216
+ assert_raise(ActiveRecord::Fixture::FormatError) do
217
+ ActiveRecord::FixtureSet.new( Account.connection, "courses", Course, FIXTURES_ROOT + "/naked/yml/courses")
218
+ end
219
+ end
220
+
221
+ def test_yaml_file_with_invalid_column
222
+ e = assert_raise(ActiveRecord::Fixture::FixtureError) do
223
+ ActiveRecord::FixtureSet.create_fixtures(FIXTURES_ROOT + "/naked/yml", "parrots")
224
+ end
225
+ assert_equal(%(table "parrots" has no column named "arrr".), e.message)
226
+ end
227
+
228
+ def test_yaml_file_with_symbol_columns
229
+ ActiveRecord::FixtureSet.create_fixtures(FIXTURES_ROOT + "/naked/yml", "trees")
230
+ end
231
+
232
+ def test_omap_fixtures
233
+ assert_nothing_raised do
234
+ fixtures = ActiveRecord::FixtureSet.new(Account.connection, 'categories', Category, FIXTURES_ROOT + "/categories_ordered")
235
+
236
+ fixtures.each.with_index do |(name, fixture), i|
237
+ assert_equal "fixture_no_#{i}", name
238
+ assert_equal "Category #{i}", fixture['name']
239
+ end
240
+ end
241
+ end
242
+
243
+ def test_yml_file_in_subdirectory
244
+ assert_equal(categories(:sub_special_1).name, "A special category in a subdir file")
245
+ assert_equal(categories(:sub_special_1).class, SpecialCategory)
246
+ end
247
+
248
+ def test_subsubdir_file_with_arbitrary_name
249
+ assert_equal(categories(:sub_special_3).name, "A special category in an arbitrarily named subsubdir file")
250
+ assert_equal(categories(:sub_special_3).class, SpecialCategory)
251
+ end
252
+
253
+ def test_binary_in_fixtures
254
+ data = File.open(ASSETS_ROOT + "/flowers.jpg", 'rb') { |f| f.read }
255
+ data.force_encoding('ASCII-8BIT')
256
+ data.freeze
257
+ assert_equal data, @flowers.data
258
+ end
259
+
260
+ def test_serialized_fixtures
261
+ assert_equal ["Green", "Red", "Orange"], traffic_lights(:uk).state
262
+ end
263
+
264
+ def test_fixtures_are_set_up_with_database_env_variable
265
+ db_url_tmp = ENV['DATABASE_URL']
266
+ ENV['DATABASE_URL'] = "sqlite3::memory:"
267
+ ActiveRecord::Base.stub(:configurations, {}) do
268
+ test_case = Class.new(ActiveRecord::TestCase) do
269
+ fixtures :accounts
270
+
271
+ def test_fixtures
272
+ assert accounts(:signals37)
273
+ end
274
+ end
275
+
276
+ result = test_case.new(:test_fixtures).run
277
+
278
+ assert result.passed?, "Expected #{result.name} to pass:\n#{result}"
279
+ end
280
+ ensure
281
+ ENV['DATABASE_URL'] = db_url_tmp
282
+ end
283
+ end
284
+
285
+ class HasManyThroughFixture < ActiveSupport::TestCase
286
+ def make_model(name)
287
+ Class.new(ActiveRecord::Base) { define_singleton_method(:name) { name } }
288
+ end
289
+
290
+ def test_has_many_through_with_default_table_name
291
+ pt = make_model "ParrotTreasure"
292
+ parrot = make_model "Parrot"
293
+ treasure = make_model "Treasure"
294
+
295
+ pt.table_name = "parrots_treasures"
296
+ pt.belongs_to :parrot, :anonymous_class => parrot
297
+ pt.belongs_to :treasure, :anonymous_class => treasure
298
+
299
+ parrot.has_many :parrot_treasures, :anonymous_class => pt
300
+ parrot.has_many :treasures, :through => :parrot_treasures
301
+
302
+ parrots = File.join FIXTURES_ROOT, 'parrots'
303
+
304
+ fs = ActiveRecord::FixtureSet.new parrot.connection, "parrots", parrot, parrots
305
+ rows = fs.table_rows
306
+ assert_equal load_has_and_belongs_to_many['parrots_treasures'], rows['parrots_treasures']
307
+ end
308
+
309
+ def test_has_many_through_with_renamed_table
310
+ pt = make_model "ParrotTreasure"
311
+ parrot = make_model "Parrot"
312
+ treasure = make_model "Treasure"
313
+
314
+ pt.belongs_to :parrot, :anonymous_class => parrot
315
+ pt.belongs_to :treasure, :anonymous_class => treasure
316
+
317
+ parrot.has_many :parrot_treasures, :anonymous_class => pt
318
+ parrot.has_many :treasures, :through => :parrot_treasures
319
+
320
+ parrots = File.join FIXTURES_ROOT, 'parrots'
321
+
322
+ fs = ActiveRecord::FixtureSet.new parrot.connection, "parrots", parrot, parrots
323
+ rows = fs.table_rows
324
+ assert_equal load_has_and_belongs_to_many['parrots_treasures'], rows['parrot_treasures']
325
+ end
326
+
327
+ def load_has_and_belongs_to_many
328
+ parrot = make_model "Parrot"
329
+ parrot.has_and_belongs_to_many :treasures
330
+
331
+ parrots = File.join FIXTURES_ROOT, 'parrots'
332
+
333
+ fs = ActiveRecord::FixtureSet.new parrot.connection, "parrots", parrot, parrots
334
+ fs.table_rows
335
+ end
336
+ end
337
+
338
+ if Account.connection.respond_to?(:reset_pk_sequence!)
339
+ class FixturesResetPkSequenceTest < ActiveRecord::TestCase
340
+ fixtures :accounts
341
+ fixtures :companies
342
+
343
+ def setup
344
+ @instances = [Account.new(:credit_limit => 50), Company.new(:name => 'RoR Consulting'), Course.new(name: 'Test')]
345
+ ActiveRecord::FixtureSet.reset_cache # make sure tables get reinitialized
346
+ end
347
+
348
+ def test_resets_to_min_pk_with_specified_pk_and_sequence
349
+ @instances.each do |instance|
350
+ model = instance.class
351
+ model.delete_all
352
+ model.connection.reset_pk_sequence!(model.table_name, model.primary_key, model.sequence_name)
353
+
354
+ instance.save!
355
+ assert_equal 1, instance.id, "Sequence reset for #{model.table_name} failed."
356
+ end
357
+ end
358
+
359
+ def test_resets_to_min_pk_with_default_pk_and_sequence
360
+ @instances.each do |instance|
361
+ model = instance.class
362
+ model.delete_all
363
+ model.connection.reset_pk_sequence!(model.table_name)
364
+
365
+ instance.save!
366
+ assert_equal 1, instance.id, "Sequence reset for #{model.table_name} failed."
367
+ end
368
+ end
369
+
370
+ def test_create_fixtures_resets_sequences_when_not_cached
371
+ @instances.each do |instance|
372
+ max_id = create_fixtures(instance.class.table_name).first.fixtures.inject(0) do |_max_id, (_, fixture)|
373
+ fixture_id = fixture['id'].to_i
374
+ fixture_id > _max_id ? fixture_id : _max_id
375
+ end
376
+
377
+ # Clone the last fixture to check that it gets the next greatest id.
378
+ instance.save!
379
+ assert_equal max_id + 1, instance.id, "Sequence reset for #{instance.class.table_name} failed."
380
+ end
381
+ end
382
+ end
383
+ end
384
+
385
+ class FixturesWithoutInstantiationTest < ActiveRecord::TestCase
386
+ self.use_instantiated_fixtures = false
387
+ fixtures :topics, :developers, :accounts
388
+
389
+ def test_without_complete_instantiation
390
+ assert !defined?(@first)
391
+ assert !defined?(@topics)
392
+ assert !defined?(@developers)
393
+ assert !defined?(@accounts)
394
+ end
395
+
396
+ def test_fixtures_from_root_yml_without_instantiation
397
+ assert !defined?(@unknown), "@unknown is not defined"
398
+ end
399
+
400
+ def test_visibility_of_accessor_method
401
+ assert_equal false, respond_to?(:topics, false), "should be private method"
402
+ assert_equal true, respond_to?(:topics, true), "confirm to respond surely"
403
+ end
404
+
405
+ def test_accessor_methods
406
+ assert_equal "The First Topic", topics(:first).title
407
+ assert_equal "Jamis", developers(:jamis).name
408
+ assert_equal 50, accounts(:signals37).credit_limit
409
+ end
410
+
411
+ def test_accessor_methods_with_multiple_args
412
+ assert_equal 2, topics(:first, :second).size
413
+ assert_raise(StandardError) { topics([:first, :second]) }
414
+ end
415
+
416
+ def test_reloading_fixtures_through_accessor_methods
417
+ topic = Struct.new(:title)
418
+ assert_equal "The First Topic", topics(:first).title
419
+ assert_called(@loaded_fixtures['topics']['first'], :find, returns: topic.new("Fresh Topic!")) do
420
+ assert_equal "Fresh Topic!", topics(:first, true).title
421
+ end
422
+ end
423
+ end
424
+
425
+ class FixturesWithoutInstanceInstantiationTest < ActiveRecord::TestCase
426
+ self.use_instantiated_fixtures = true
427
+ self.use_instantiated_fixtures = :no_instances
428
+
429
+ fixtures :topics, :developers, :accounts
430
+
431
+ def test_without_instance_instantiation
432
+ assert !defined?(@first), "@first is not defined"
433
+ end
434
+ end
435
+
436
+ class TransactionalFixturesTest < ActiveRecord::TestCase
437
+ self.use_instantiated_fixtures = true
438
+ self.use_transactional_tests = true
439
+
440
+ fixtures :topics
441
+
442
+ def test_destroy
443
+ assert_not_nil @first
444
+ @first.destroy
445
+ end
446
+
447
+ def test_destroy_just_kidding
448
+ assert_not_nil @first
449
+ end
450
+ end
451
+
452
+ class MultipleFixturesTest < ActiveRecord::TestCase
453
+ fixtures :topics
454
+ fixtures :developers, :accounts
455
+
456
+ def test_fixture_table_names
457
+ assert_equal %w(topics developers accounts), fixture_table_names
458
+ end
459
+ end
460
+
461
+ class SetupTest < ActiveRecord::TestCase
462
+ # fixtures :topics
463
+
464
+ def setup
465
+ @first = true
466
+ end
467
+
468
+ def test_nothing
469
+ end
470
+ end
471
+
472
+ class SetupSubclassTest < SetupTest
473
+ def setup
474
+ super
475
+ @second = true
476
+ end
477
+
478
+ def test_subclassing_should_preserve_setups
479
+ assert @first
480
+ assert @second
481
+ end
482
+ end
483
+
484
+ class OverlappingFixturesTest < ActiveRecord::TestCase
485
+ fixtures :topics, :developers
486
+ fixtures :developers, :accounts
487
+
488
+ def test_fixture_table_names
489
+ assert_equal %w(topics developers accounts), fixture_table_names
490
+ end
491
+ end
492
+
493
+ class ForeignKeyFixturesTest < ActiveRecord::TestCase
494
+ fixtures :fk_test_has_pk, :fk_test_has_fk
495
+
496
+ # if foreign keys are implemented and fixtures
497
+ # are not deleted in reverse order then this test
498
+ # case will raise StatementInvalid
499
+
500
+ def test_number1
501
+ assert true
502
+ end
503
+
504
+ def test_number2
505
+ assert true
506
+ end
507
+ end
508
+
509
+ class OverRideFixtureMethodTest < ActiveRecord::TestCase
510
+ fixtures :topics
511
+
512
+ def topics(name)
513
+ topic = super
514
+ topic.title = 'omg'
515
+ topic
516
+ end
517
+
518
+ def test_fixture_methods_can_be_overridden
519
+ x = topics :first
520
+ assert_equal 'omg', x.title
521
+ end
522
+ end
523
+
524
+ class FixtureWithSetModelClassTest < ActiveRecord::TestCase
525
+ fixtures :other_posts, :other_comments
526
+
527
+ # Set to false to blow away fixtures cache and ensure our fixtures are loaded
528
+ # and thus takes into account the +set_model_class+.
529
+ self.use_transactional_tests = false
530
+
531
+ def test_uses_fixture_class_defined_in_yaml
532
+ assert_kind_of Post, other_posts(:second_welcome)
533
+ end
534
+
535
+ def test_loads_the_associations_to_fixtures_with_set_model_class
536
+ post = other_posts(:second_welcome)
537
+ comment = other_comments(:second_greetings)
538
+ assert_equal [comment], post.comments
539
+ assert_equal post, comment.post
540
+ end
541
+ end
542
+
543
+ class SetFixtureClassPrevailsTest < ActiveRecord::TestCase
544
+ set_fixture_class bad_posts: Post
545
+ fixtures :bad_posts
546
+
547
+ # Set to false to blow away fixtures cache and ensure our fixtures are loaded
548
+ # and thus takes into account the +set_model_class+.
549
+ self.use_transactional_tests = false
550
+
551
+ def test_uses_set_fixture_class
552
+ assert_kind_of Post, bad_posts(:bad_welcome)
553
+ end
554
+ end
555
+
556
+ class CheckSetTableNameFixturesTest < ActiveRecord::TestCase
557
+ set_fixture_class :funny_jokes => Joke
558
+ fixtures :funny_jokes
559
+ # Set to false to blow away fixtures cache and ensure our fixtures are loaded
560
+ # and thus takes into account our set_fixture_class
561
+ self.use_transactional_tests = false
562
+
563
+ def test_table_method
564
+ assert_kind_of Joke, funny_jokes(:a_joke)
565
+ end
566
+ end
567
+
568
+ class FixtureNameIsNotTableNameFixturesTest < ActiveRecord::TestCase
569
+ set_fixture_class :items => Book
570
+ fixtures :items
571
+ # Set to false to blow away fixtures cache and ensure our fixtures are loaded
572
+ # and thus takes into account our set_fixture_class
573
+ self.use_transactional_tests = false
574
+
575
+ def test_named_accessor
576
+ assert_kind_of Book, items(:dvd)
577
+ end
578
+ end
579
+
580
+ class FixtureNameIsNotTableNameMultipleFixturesTest < ActiveRecord::TestCase
581
+ set_fixture_class :items => Book, :funny_jokes => Joke
582
+ fixtures :items, :funny_jokes
583
+ # Set to false to blow away fixtures cache and ensure our fixtures are loaded
584
+ # and thus takes into account our set_fixture_class
585
+ self.use_transactional_tests = false
586
+
587
+ def test_named_accessor_of_differently_named_fixture
588
+ assert_kind_of Book, items(:dvd)
589
+ end
590
+
591
+ def test_named_accessor_of_same_named_fixture
592
+ assert_kind_of Joke, funny_jokes(:a_joke)
593
+ end
594
+ end
595
+
596
+ class CustomConnectionFixturesTest < ActiveRecord::TestCase
597
+ set_fixture_class :courses => Course
598
+ fixtures :courses
599
+ self.use_transactional_tests = false
600
+
601
+ def test_leaky_destroy
602
+ assert_nothing_raised { courses(:ruby) }
603
+ courses(:ruby).destroy
604
+ end
605
+
606
+ def test_it_twice_in_whatever_order_to_check_for_fixture_leakage
607
+ test_leaky_destroy
608
+ end
609
+ end
610
+
611
+ class TransactionalFixturesOnCustomConnectionTest < ActiveRecord::TestCase
612
+ set_fixture_class :courses => Course
613
+ fixtures :courses
614
+ self.use_transactional_tests = true
615
+
616
+ def test_leaky_destroy
617
+ assert_nothing_raised { courses(:ruby) }
618
+ courses(:ruby).destroy
619
+ end
620
+
621
+ def test_it_twice_in_whatever_order_to_check_for_fixture_leakage
622
+ test_leaky_destroy
623
+ end
624
+ end
625
+
626
+ class InvalidTableNameFixturesTest < ActiveRecord::TestCase
627
+ fixtures :funny_jokes
628
+ # Set to false to blow away fixtures cache and ensure our fixtures are loaded
629
+ # and thus takes into account our lack of set_fixture_class
630
+ self.use_transactional_tests = false
631
+
632
+ def test_raises_error
633
+ assert_raise ActiveRecord::FixtureClassNotFound do
634
+ funny_jokes(:a_joke)
635
+ end
636
+ end
637
+ end
638
+
639
+ class CheckEscapedYamlFixturesTest < ActiveRecord::TestCase
640
+ set_fixture_class :funny_jokes => Joke
641
+ fixtures :funny_jokes
642
+ # Set to false to blow away fixtures cache and ensure our fixtures are loaded
643
+ # and thus takes into account our set_fixture_class
644
+ self.use_transactional_tests = false
645
+
646
+ def test_proper_escaped_fixture
647
+ assert_equal "The \\n Aristocrats\nAte the candy\n", funny_jokes(:another_joke).name
648
+ end
649
+ end
650
+
651
+ class DevelopersProject; end
652
+ class ManyToManyFixturesWithClassDefined < ActiveRecord::TestCase
653
+ fixtures :developers_projects
654
+
655
+ def test_this_should_run_cleanly
656
+ assert true
657
+ end
658
+ end
659
+
660
+ class FixturesBrokenRollbackTest < ActiveRecord::TestCase
661
+ def blank_setup
662
+ @fixture_connections = [ActiveRecord::Base.connection]
663
+ end
664
+ alias_method :ar_setup_fixtures, :setup_fixtures
665
+ alias_method :setup_fixtures, :blank_setup
666
+ alias_method :setup, :blank_setup
667
+
668
+ def blank_teardown; end
669
+ alias_method :ar_teardown_fixtures, :teardown_fixtures
670
+ alias_method :teardown_fixtures, :blank_teardown
671
+ alias_method :teardown, :blank_teardown
672
+
673
+ def test_no_rollback_in_teardown_unless_transaction_active
674
+ assert_equal 0, ActiveRecord::Base.connection.open_transactions
675
+ assert_raise(RuntimeError) { ar_setup_fixtures }
676
+ assert_equal 0, ActiveRecord::Base.connection.open_transactions
677
+ assert_nothing_raised { ar_teardown_fixtures }
678
+ assert_equal 0, ActiveRecord::Base.connection.open_transactions
679
+ end
680
+
681
+ private
682
+ def load_fixtures(config)
683
+ raise 'argh'
684
+ end
685
+ end
686
+
687
+ class LoadAllFixturesTest < ActiveRecord::TestCase
688
+ def test_all_there
689
+ self.class.fixture_path = FIXTURES_ROOT + "/all"
690
+ self.class.fixtures :all
691
+
692
+ if File.symlink? FIXTURES_ROOT + "/all/admin"
693
+ assert_equal %w(admin/accounts admin/users developers people tasks), fixture_table_names.sort
694
+ end
695
+ ensure
696
+ ActiveRecord::FixtureSet.reset_cache
697
+ end
698
+ end
699
+
700
+ class LoadAllFixturesWithPathnameTest < ActiveRecord::TestCase
701
+ def test_all_there
702
+ self.class.fixture_path = Pathname.new(FIXTURES_ROOT).join('all')
703
+ self.class.fixtures :all
704
+
705
+ if File.symlink? FIXTURES_ROOT + "/all/admin"
706
+ assert_equal %w(admin/accounts admin/users developers people tasks), fixture_table_names.sort
707
+ end
708
+ ensure
709
+ ActiveRecord::FixtureSet.reset_cache
710
+ end
711
+ end
712
+
713
+ class FasterFixturesTest < ActiveRecord::TestCase
714
+ self.use_transactional_tests = false
715
+ fixtures :categories, :authors
716
+
717
+ def load_extra_fixture(name)
718
+ fixture = create_fixtures(name).first
719
+ assert fixture.is_a?(ActiveRecord::FixtureSet)
720
+ @loaded_fixtures[fixture.table_name] = fixture
721
+ end
722
+
723
+ def test_cache
724
+ assert ActiveRecord::FixtureSet.fixture_is_cached?(ActiveRecord::Base.connection, 'categories')
725
+ assert ActiveRecord::FixtureSet.fixture_is_cached?(ActiveRecord::Base.connection, 'authors')
726
+
727
+ assert_no_queries do
728
+ create_fixtures('categories')
729
+ create_fixtures('authors')
730
+ end
731
+
732
+ load_extra_fixture('posts')
733
+ assert ActiveRecord::FixtureSet.fixture_is_cached?(ActiveRecord::Base.connection, 'posts')
734
+ self.class.setup_fixture_accessors :posts
735
+ assert_equal 'Welcome to the weblog', posts(:welcome).title
736
+ end
737
+ end
738
+
739
+ class FoxyFixturesTest < ActiveRecord::TestCase
740
+ fixtures :parrots, :parrots_pirates, :pirates, :treasures, :mateys, :ships, :computers,
741
+ :developers, :"admin/accounts", :"admin/users", :live_parrots, :dead_parrots, :books
742
+
743
+ if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
744
+ require 'models/uuid_parent'
745
+ require 'models/uuid_child'
746
+ fixtures :uuid_parents, :uuid_children
747
+ end
748
+
749
+ def test_identifies_strings
750
+ assert_equal(ActiveRecord::FixtureSet.identify("foo"), ActiveRecord::FixtureSet.identify("foo"))
751
+ assert_not_equal(ActiveRecord::FixtureSet.identify("foo"), ActiveRecord::FixtureSet.identify("FOO"))
752
+ end
753
+
754
+ def test_identifies_symbols
755
+ assert_equal(ActiveRecord::FixtureSet.identify(:foo), ActiveRecord::FixtureSet.identify(:foo))
756
+ end
757
+
758
+ def test_identifies_consistently
759
+ assert_equal 207281424, ActiveRecord::FixtureSet.identify(:ruby)
760
+ assert_equal 1066363776, ActiveRecord::FixtureSet.identify(:sapphire_2)
761
+
762
+ assert_equal 'f92b6bda-0d0d-5fe1-9124-502b18badded', ActiveRecord::FixtureSet.identify(:daddy, :uuid)
763
+ assert_equal 'b4b10018-ad47-595d-b42f-d8bdaa6d01bf', ActiveRecord::FixtureSet.identify(:sonny, :uuid)
764
+ end
765
+
766
+ TIMESTAMP_COLUMNS = %w(created_at created_on updated_at updated_on)
767
+
768
+ def test_populates_timestamp_columns
769
+ TIMESTAMP_COLUMNS.each do |property|
770
+ assert_not_nil(parrots(:george).send(property), "should set #{property}")
771
+ end
772
+ end
773
+
774
+ def test_does_not_populate_timestamp_columns_if_model_has_set_record_timestamps_to_false
775
+ TIMESTAMP_COLUMNS.each do |property|
776
+ assert_nil(ships(:black_pearl).send(property), "should not set #{property}")
777
+ end
778
+ end
779
+
780
+ def test_populates_all_columns_with_the_same_time
781
+ last = nil
782
+
783
+ TIMESTAMP_COLUMNS.each do |property|
784
+ current = parrots(:george).send(property)
785
+ last ||= current
786
+
787
+ assert_equal(last, current)
788
+ last = current
789
+ end
790
+ end
791
+
792
+ def test_only_populates_columns_that_exist
793
+ assert_not_nil(pirates(:blackbeard).created_on)
794
+ assert_not_nil(pirates(:blackbeard).updated_on)
795
+ end
796
+
797
+ def test_preserves_existing_fixture_data
798
+ assert_equal(2.weeks.ago.to_date, pirates(:redbeard).created_on.to_date)
799
+ assert_equal(2.weeks.ago.to_date, pirates(:redbeard).updated_on.to_date)
800
+ end
801
+
802
+ def test_generates_unique_ids
803
+ assert_not_nil(parrots(:george).id)
804
+ assert_not_equal(parrots(:george).id, parrots(:louis).id)
805
+ end
806
+
807
+ def test_automatically_sets_primary_key
808
+ assert_not_nil(ships(:black_pearl))
809
+ end
810
+
811
+ def test_preserves_existing_primary_key
812
+ assert_equal(2, ships(:interceptor).id)
813
+ end
814
+
815
+ def test_resolves_belongs_to_symbols
816
+ assert_equal(parrots(:george), pirates(:blackbeard).parrot)
817
+ end
818
+
819
+ def test_ignores_belongs_to_symbols_if_association_and_foreign_key_are_named_the_same
820
+ assert_equal(developers(:david), computers(:workstation).developer)
821
+ end
822
+
823
+ def test_supports_join_tables
824
+ assert(pirates(:blackbeard).parrots.include?(parrots(:george)))
825
+ assert(pirates(:blackbeard).parrots.include?(parrots(:louis)))
826
+ assert(parrots(:george).pirates.include?(pirates(:blackbeard)))
827
+ end
828
+
829
+ def test_supports_inline_habtm
830
+ assert(parrots(:george).treasures.include?(treasures(:diamond)))
831
+ assert(parrots(:george).treasures.include?(treasures(:sapphire)))
832
+ assert(!parrots(:george).treasures.include?(treasures(:ruby)))
833
+ end
834
+
835
+ def test_supports_inline_habtm_with_specified_id
836
+ assert(parrots(:polly).treasures.include?(treasures(:ruby)))
837
+ assert(parrots(:polly).treasures.include?(treasures(:sapphire)))
838
+ assert(!parrots(:polly).treasures.include?(treasures(:diamond)))
839
+ end
840
+
841
+ def test_supports_yaml_arrays
842
+ assert(parrots(:louis).treasures.include?(treasures(:diamond)))
843
+ assert(parrots(:louis).treasures.include?(treasures(:sapphire)))
844
+ end
845
+
846
+ def test_strips_DEFAULTS_key
847
+ assert_raise(StandardError) { parrots(:DEFAULTS) }
848
+
849
+ # this lets us do YAML defaults and not have an extra fixture entry
850
+ %w(sapphire ruby).each { |t| assert(parrots(:davey).treasures.include?(treasures(t))) }
851
+ end
852
+
853
+ def test_supports_label_interpolation
854
+ assert_equal("frederick", parrots(:frederick).name)
855
+ end
856
+
857
+ def test_supports_label_string_interpolation
858
+ assert_equal("X marks the spot!", pirates(:mark).catchphrase)
859
+ end
860
+
861
+ def test_supports_label_interpolation_for_integer_label
862
+ assert_equal("#1 pirate!", pirates(1).catchphrase)
863
+ end
864
+
865
+ def test_supports_polymorphic_belongs_to
866
+ assert_equal(pirates(:redbeard), treasures(:sapphire).looter)
867
+ assert_equal(parrots(:louis), treasures(:ruby).looter)
868
+ end
869
+
870
+ def test_only_generates_a_pk_if_necessary
871
+ m = Matey.first
872
+ m.pirate = pirates(:blackbeard)
873
+ m.target = pirates(:redbeard)
874
+ end
875
+
876
+ def test_supports_sti
877
+ assert_kind_of DeadParrot, parrots(:polly)
878
+ assert_equal pirates(:blackbeard), parrots(:polly).killer
879
+ end
880
+
881
+ def test_supports_sti_with_respective_files
882
+ assert_kind_of LiveParrot, live_parrots(:dusty)
883
+ assert_kind_of DeadParrot, dead_parrots(:deadbird)
884
+ assert_equal pirates(:blackbeard), dead_parrots(:deadbird).killer
885
+ end
886
+
887
+ def test_namespaced_models
888
+ assert admin_accounts(:signals37).users.include?(admin_users(:david))
889
+ assert_equal 2, admin_accounts(:signals37).users.size
890
+ end
891
+
892
+ def test_resolves_enums
893
+ assert books(:awdr).published?
894
+ assert books(:awdr).read?
895
+ assert books(:rfr).proposed?
896
+ assert books(:ddd).published?
897
+ end
898
+ end
899
+
900
+ class ActiveSupportSubclassWithFixturesTest < ActiveRecord::TestCase
901
+ fixtures :parrots
902
+
903
+ # This seemingly useless assertion catches a bug that caused the fixtures
904
+ # setup code call nil[]
905
+ def test_foo
906
+ assert_equal parrots(:louis), Parrot.find_by_name("King Louis")
907
+ end
908
+ end
909
+
910
+ class CustomNameForFixtureOrModelTest < ActiveRecord::TestCase
911
+ ActiveRecord::FixtureSet.reset_cache
912
+
913
+ set_fixture_class :randomly_named_a9 =>
914
+ ClassNameThatDoesNotFollowCONVENTIONS,
915
+ :'admin/randomly_named_a9' =>
916
+ Admin::ClassNameThatDoesNotFollowCONVENTIONS1,
917
+ 'admin/randomly_named_b0' =>
918
+ Admin::ClassNameThatDoesNotFollowCONVENTIONS2
919
+
920
+ fixtures :randomly_named_a9, 'admin/randomly_named_a9',
921
+ :'admin/randomly_named_b0'
922
+
923
+ def test_named_accessor_for_randomly_named_fixture_and_class
924
+ assert_kind_of ClassNameThatDoesNotFollowCONVENTIONS,
925
+ randomly_named_a9(:first_instance)
926
+ end
927
+
928
+ def test_named_accessor_for_randomly_named_namespaced_fixture_and_class
929
+ assert_kind_of Admin::ClassNameThatDoesNotFollowCONVENTIONS1,
930
+ admin_randomly_named_a9(:first_instance)
931
+ assert_kind_of Admin::ClassNameThatDoesNotFollowCONVENTIONS2,
932
+ admin_randomly_named_b0(:second_instance)
933
+ end
934
+
935
+ def test_table_name_is_defined_in_the_model
936
+ assert_equal 'randomly_named_table2', ActiveRecord::FixtureSet::all_loaded_fixtures["admin/randomly_named_a9"].table_name
937
+ assert_equal 'randomly_named_table2', Admin::ClassNameThatDoesNotFollowCONVENTIONS1.table_name
938
+ end
939
+ end
940
+
941
+ class FixturesWithDefaultScopeTest < ActiveRecord::TestCase
942
+ fixtures :bulbs
943
+
944
+ test "inserts fixtures excluded by a default scope" do
945
+ assert_equal 1, Bulb.count
946
+ assert_equal 2, Bulb.unscoped.count
947
+ end
948
+
949
+ test "allows access to fixtures excluded by a default scope" do
950
+ assert_equal "special", bulbs(:special).name
951
+ end
952
+ end
953
+
954
+ class FixturesWithAbstractBelongsTo < ActiveRecord::TestCase
955
+ fixtures :pirates, :doubloons
956
+
957
+ test "creates fixtures with belongs_to associations defined in abstract base classes" do
958
+ assert_not_nil doubloons(:blackbeards_doubloon)
959
+ assert_equal pirates(:blackbeard), doubloons(:blackbeards_doubloon).pirate
960
+ end
961
+ end
962
+
963
+ class FixtureClassNamesTest < ActiveRecord::TestCase
964
+ def setup
965
+ @saved_cache = self.fixture_class_names.dup
966
+ end
967
+
968
+ def teardown
969
+ self.fixture_class_names.replace(@saved_cache)
970
+ end
971
+
972
+ test "fixture_class_names returns nil for unregistered identifier" do
973
+ assert_nil self.fixture_class_names['unregistered_identifier']
974
+ end
975
+ end
976
+
977
+ class SameNameDifferentDatabaseFixturesTest < ActiveRecord::TestCase
978
+ fixtures :dogs, :other_dogs
979
+
980
+ test "fixtures are properly loaded" do
981
+ # Force loading the fixtures again to reproduce issue
982
+ ActiveRecord::FixtureSet.reset_cache
983
+ create_fixtures("dogs", "other_dogs")
984
+
985
+ assert_kind_of Dog, dogs(:sophie)
986
+ assert_kind_of OtherDog, other_dogs(:lassie)
987
+ end
988
+ end