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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (463) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +4 -1
  3. data/LICENSE +1 -1
  4. data/MANIFEST +14 -14
  5. data/README +225 -225
  6. data/ext/Makefile.nt32 +181 -181
  7. data/ext/Makefile.nt32.191 +212 -212
  8. data/ext/extconf.rb +291 -291
  9. data/ext/ibm_db.c +11887 -11884
  10. data/ext/ruby_ibm_db.h +241 -241
  11. data/ext/ruby_ibm_db_cli.c +866 -866
  12. data/ext/ruby_ibm_db_cli.h +500 -500
  13. data/init.rb +41 -41
  14. data/lib/IBM_DB.rb +27 -27
  15. data/lib/active_record/connection_adapters/ibm_db_adapter.rb +3177 -3177
  16. data/lib/active_record/connection_adapters/ibmdb_adapter.rb +1 -1
  17. data/lib/active_record/vendor/db2-i5-zOS.yaml +328 -328
  18. data/lib/mswin32/ibm_db.rb +122 -122
  19. data/lib/mswin32/rb21x/i386/ibm_db.so +0 -0
  20. data/lib/mswin32/rb22x/i386/ibm_db.so +0 -0
  21. data/lib/mswin32/rb23x/i386/ibm_db.so +0 -0
  22. data/test/active_record/connection_adapters/fake_adapter.rb +46 -46
  23. data/test/assets/example.log +1 -1
  24. data/test/assets/test.txt +1 -1
  25. data/test/cases/adapter_test.rb +276 -261
  26. data/test/cases/aggregations_test.rb +158 -158
  27. data/test/cases/ar_schema_test.rb +161 -161
  28. data/test/cases/associations/association_scope_test.rb +21 -21
  29. data/test/cases/associations/belongs_to_associations_test.rb +1029 -1029
  30. data/test/cases/associations/callbacks_test.rb +192 -192
  31. data/test/cases/associations/cascaded_eager_loading_test.rb +188 -188
  32. data/test/cases/associations/deprecated_counter_cache_on_has_many_through_test.rb +26 -26
  33. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -36
  34. data/test/cases/associations/eager_load_nested_include_test.rb +128 -128
  35. data/test/cases/associations/eager_singularization_test.rb +148 -148
  36. data/test/cases/associations/eager_test.rb +1429 -1411
  37. data/test/cases/associations/extension_test.rb +82 -82
  38. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +972 -932
  39. data/test/cases/associations/has_many_associations_test.rb +2182 -2162
  40. data/test/cases/associations/has_many_through_associations_test.rb +1204 -1204
  41. data/test/cases/associations/has_one_associations_test.rb +610 -610
  42. data/test/cases/associations/has_one_through_associations_test.rb +380 -380
  43. data/test/cases/associations/inner_join_association_test.rb +139 -139
  44. data/test/cases/associations/inverse_associations_test.rb +706 -693
  45. data/test/cases/associations/join_model_test.rb +754 -754
  46. data/test/cases/associations/nested_through_associations_test.rb +579 -579
  47. data/test/cases/associations/required_test.rb +82 -82
  48. data/test/cases/associations_test.rb +380 -380
  49. data/test/cases/attribute_decorators_test.rb +125 -125
  50. data/test/cases/attribute_methods/read_test.rb +60 -60
  51. data/test/cases/attribute_methods/serialization_test.rb +29 -29
  52. data/test/cases/attribute_methods_test.rb +952 -952
  53. data/test/cases/attribute_set_test.rb +210 -200
  54. data/test/cases/attribute_test.rb +180 -180
  55. data/test/cases/attributes_test.rb +136 -136
  56. data/test/cases/autosave_association_test.rb +1595 -1595
  57. data/test/cases/base_test.rb +1664 -1638
  58. data/test/cases/batches_test.rb +212 -212
  59. data/test/cases/binary_test.rb +52 -52
  60. data/test/cases/bind_parameter_test.rb +100 -100
  61. data/test/cases/calculations_test.rb +646 -646
  62. data/test/cases/callbacks_test.rb +543 -543
  63. data/test/cases/clone_test.rb +40 -40
  64. data/test/cases/coders/yaml_column_test.rb +63 -63
  65. data/test/cases/column_alias_test.rb +17 -17
  66. data/test/cases/column_definition_test.rb +123 -123
  67. data/test/cases/connection_adapters/adapter_leasing_test.rb +54 -54
  68. data/test/cases/connection_adapters/connection_handler_test.rb +53 -53
  69. data/test/cases/connection_adapters/connection_specification_test.rb +12 -12
  70. data/test/cases/connection_adapters/merge_and_resolve_default_url_config_test.rb +293 -293
  71. data/test/cases/connection_adapters/mysql_type_lookup_test.rb +65 -65
  72. data/test/cases/connection_adapters/quoting_test.rb +13 -13
  73. data/test/cases/connection_adapters/schema_cache_test.rb +56 -56
  74. data/test/cases/connection_adapters/type_lookup_test.rb +110 -110
  75. data/test/cases/connection_management_test.rb +122 -122
  76. data/test/cases/connection_pool_test.rb +346 -346
  77. data/test/cases/connection_specification/resolver_test.rb +116 -116
  78. data/test/cases/core_test.rb +112 -112
  79. data/test/cases/counter_cache_test.rb +209 -209
  80. data/test/cases/custom_locking_test.rb +17 -17
  81. data/test/cases/database_statements_test.rb +19 -19
  82. data/test/cases/date_time_test.rb +61 -61
  83. data/test/cases/defaults_test.rb +223 -223
  84. data/test/cases/dirty_test.rb +785 -775
  85. data/test/cases/disconnected_test.rb +28 -28
  86. data/test/cases/dup_test.rb +157 -157
  87. data/test/cases/enum_test.rb +290 -290
  88. data/test/cases/explain_subscriber_test.rb +64 -64
  89. data/test/cases/explain_test.rb +76 -76
  90. data/test/cases/finder_respond_to_test.rb +60 -60
  91. data/test/cases/finder_test.rb +1169 -1166
  92. data/test/cases/fixture_set/file_test.rb +138 -138
  93. data/test/cases/fixtures_test.rb +908 -897
  94. data/test/cases/forbidden_attributes_protection_test.rb +99 -99
  95. data/test/cases/habtm_destroy_order_test.rb +61 -61
  96. data/test/cases/helper.rb +210 -210
  97. data/test/cases/hot_compatibility_test.rb +54 -54
  98. data/test/cases/i18n_test.rb +45 -45
  99. data/test/cases/inheritance_test.rb +375 -375
  100. data/test/cases/integration_test.rb +139 -139
  101. data/test/cases/invalid_connection_test.rb +22 -22
  102. data/test/cases/invalid_date_test.rb +32 -32
  103. data/test/cases/invertible_migration_test.rb +295 -295
  104. data/test/cases/json_serialization_test.rb +302 -302
  105. data/test/cases/locking_test.rb +477 -477
  106. data/test/cases/log_subscriber_test.rb +136 -136
  107. data/test/cases/migration/change_schema_test - Copy.rb +448 -448
  108. data/test/cases/migration/change_schema_test.rb +512 -472
  109. data/test/cases/migration/change_table_test.rb +224 -224
  110. data/test/cases/migration/column_attributes_test.rb +192 -192
  111. data/test/cases/migration/column_positioning_test.rb +56 -56
  112. data/test/cases/migration/columns_test.rb +304 -304
  113. data/test/cases/migration/command_recorder_test.rb +305 -305
  114. data/test/cases/migration/create_join_table_test.rb +148 -148
  115. data/test/cases/migration/foreign_key_test - Changed.rb +325 -325
  116. data/test/cases/migration/foreign_key_test.rb +328 -360
  117. data/test/cases/migration/helper.rb +39 -39
  118. data/test/cases/migration/index_test.rb +216 -216
  119. data/test/cases/migration/logger_test.rb +36 -36
  120. data/test/cases/migration/pending_migrations_test.rb +53 -53
  121. data/test/cases/migration/references_foreign_key_test.rb +169 -214
  122. data/test/cases/migration/references_index_test.rb +101 -101
  123. data/test/cases/migration/references_statements_test.rb +116 -116
  124. data/test/cases/migration/rename_table_test.rb +93 -93
  125. data/test/cases/migration/table_and_index_test.rb +24 -24
  126. data/test/cases/migration_test.rb +959 -959
  127. data/test/cases/migrator_test.rb +388 -388
  128. data/test/cases/mixin_test.rb +70 -70
  129. data/test/cases/modules_test.rb +173 -173
  130. data/test/cases/multiparameter_attributes_test.rb +350 -350
  131. data/test/cases/multiple_db_test.rb +115 -115
  132. data/test/cases/nested_attributes_test.rb +1070 -1057
  133. data/test/cases/nested_attributes_with_callbacks_test.rb +144 -144
  134. data/test/cases/persistence_test.rb +909 -909
  135. data/test/cases/pooled_connections_test.rb +81 -81
  136. data/test/cases/primary_keys_test.rb +237 -237
  137. data/test/cases/query_cache_test.rb +326 -326
  138. data/test/cases/quoting_test.rb +156 -156
  139. data/test/cases/readonly_test.rb +118 -118
  140. data/test/cases/reaper_test.rb +85 -85
  141. data/test/cases/reflection_test.rb +463 -454
  142. data/test/cases/relation/delegation_test.rb +68 -68
  143. data/test/cases/relation/merging_test.rb +161 -161
  144. data/test/cases/relation/mutation_test.rb +165 -165
  145. data/test/cases/relation/predicate_builder_test.rb +14 -14
  146. data/test/cases/relation/where_chain_test.rb +181 -181
  147. data/test/cases/relation/where_test.rb +300 -300
  148. data/test/cases/relation/where_test2.rb +36 -36
  149. data/test/cases/relation_test.rb +319 -297
  150. data/test/cases/relations_test.rb +1815 -1815
  151. data/test/cases/reload_models_test.rb +22 -22
  152. data/test/cases/result_test.rb +80 -80
  153. data/test/cases/sanitize_test.rb +83 -83
  154. data/test/cases/schema_dumper_test.rb +463 -463
  155. data/test/cases/scoping/default_scoping_test.rb +454 -454
  156. data/test/cases/scoping/named_scoping_test.rb +524 -524
  157. data/test/cases/scoping/relation_scoping_test.rb +357 -357
  158. data/test/cases/serialization_test.rb +104 -104
  159. data/test/cases/serialized_attribute_test.rb +277 -277
  160. data/test/cases/statement_cache_test.rb +98 -98
  161. data/test/cases/store_test.rb +194 -194
  162. data/test/cases/tasks/database_tasks_test.rb +398 -396
  163. data/test/cases/tasks/mysql_rake_test.rb +324 -311
  164. data/test/cases/tasks/postgresql_rake_test.rb +250 -245
  165. data/test/cases/tasks/sqlite_rake_test.rb +193 -193
  166. data/test/cases/test_case.rb +123 -123
  167. data/test/cases/timestamp_test.rb +467 -468
  168. data/test/cases/transaction_callbacks_test.rb +452 -452
  169. data/test/cases/transaction_isolation_test.rb +106 -106
  170. data/test/cases/transactions_test.rb +817 -817
  171. data/test/cases/type/decimal_test.rb +56 -51
  172. data/test/cases/type/integer_test.rb +121 -121
  173. data/test/cases/type/string_test.rb +36 -36
  174. data/test/cases/type/type_map_test.rb +177 -177
  175. data/test/cases/type/unsigned_integer_test.rb +18 -18
  176. data/test/cases/types_test.rb +141 -141
  177. data/test/cases/unconnected_test.rb +33 -33
  178. data/test/cases/validations/association_validation_test.rb +86 -86
  179. data/test/cases/validations/i18n_generate_message_validation_test.rb +84 -84
  180. data/test/cases/validations/i18n_validation_test.rb +90 -90
  181. data/test/cases/validations/length_validation_test.rb +47 -47
  182. data/test/cases/validations/presence_validation_test.rb +68 -68
  183. data/test/cases/validations/uniqueness_validation_test.rb +457 -434
  184. data/test/cases/validations_repair_helper.rb +23 -23
  185. data/test/cases/validations_test.rb +165 -165
  186. data/test/cases/view_test.rb +119 -113
  187. data/test/cases/xml_serialization_test.rb +457 -457
  188. data/test/cases/yaml_serialization_test.rb +126 -86
  189. data/test/config.rb +5 -5
  190. data/test/config.yml +154 -154
  191. data/test/connections/native_ibm_db/connection.rb +43 -43
  192. data/test/fixtures/accounts.yml +29 -29
  193. data/test/fixtures/admin/accounts.yml +2 -2
  194. data/test/fixtures/admin/randomly_named_a9.yml +7 -7
  195. data/test/fixtures/admin/randomly_named_b0.yml +7 -7
  196. data/test/fixtures/admin/users.yml +10 -10
  197. data/test/fixtures/author_addresses.yml +17 -17
  198. data/test/fixtures/author_favorites.yml +3 -3
  199. data/test/fixtures/authors.yml +23 -23
  200. data/test/fixtures/binaries.yml +133 -133
  201. data/test/fixtures/books.yml +11 -11
  202. data/test/fixtures/bulbs.yml +5 -5
  203. data/test/fixtures/cars.yml +9 -9
  204. data/test/fixtures/categories.yml +19 -19
  205. data/test/fixtures/categories/special_categories.yml +9 -9
  206. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -4
  207. data/test/fixtures/categories_ordered.yml +7 -7
  208. data/test/fixtures/categories_posts.yml +31 -31
  209. data/test/fixtures/categorizations.yml +23 -23
  210. data/test/fixtures/clubs.yml +8 -8
  211. data/test/fixtures/collections.yml +3 -3
  212. data/test/fixtures/colleges.yml +3 -3
  213. data/test/fixtures/comments.yml +65 -65
  214. data/test/fixtures/companies.yml +67 -67
  215. data/test/fixtures/computers.yml +10 -10
  216. data/test/fixtures/courses.yml +8 -8
  217. data/test/fixtures/customers.yml +25 -25
  218. data/test/fixtures/dashboards.yml +6 -6
  219. data/test/fixtures/developers.yml +21 -21
  220. data/test/fixtures/developers_projects.yml +16 -16
  221. data/test/fixtures/dog_lovers.yml +7 -7
  222. data/test/fixtures/dogs.yml +4 -4
  223. data/test/fixtures/doubloons.yml +3 -3
  224. data/test/fixtures/edges.yml +5 -5
  225. data/test/fixtures/entrants.yml +14 -14
  226. data/test/fixtures/essays.yml +6 -6
  227. data/test/fixtures/faces.yml +11 -11
  228. data/test/fixtures/fk_test_has_fk.yml +3 -3
  229. data/test/fixtures/fk_test_has_pk.yml +1 -1
  230. data/test/fixtures/friendships.yml +4 -4
  231. data/test/fixtures/funny_jokes.yml +10 -10
  232. data/test/fixtures/interests.yml +33 -33
  233. data/test/fixtures/items.yml +3 -3
  234. data/test/fixtures/jobs.yml +7 -7
  235. data/test/fixtures/legacy_things.yml +3 -3
  236. data/test/fixtures/mateys.yml +4 -4
  237. data/test/fixtures/member_details.yml +8 -8
  238. data/test/fixtures/member_types.yml +6 -6
  239. data/test/fixtures/members.yml +11 -11
  240. data/test/fixtures/memberships.yml +34 -34
  241. data/test/fixtures/men.yml +5 -5
  242. data/test/fixtures/minimalistics.yml +2 -2
  243. data/test/fixtures/minivans.yml +5 -5
  244. data/test/fixtures/mixed_case_monkeys.yml +6 -6
  245. data/test/fixtures/mixins.yml +29 -29
  246. data/test/fixtures/movies.yml +7 -7
  247. data/test/fixtures/naked/csv/accounts.csv +1 -1
  248. data/test/fixtures/naked/yml/accounts.yml +1 -1
  249. data/test/fixtures/naked/yml/companies.yml +1 -1
  250. data/test/fixtures/naked/yml/courses.yml +1 -1
  251. data/test/fixtures/organizations.yml +5 -5
  252. data/test/fixtures/other_topics.yml +42 -42
  253. data/test/fixtures/owners.yml +9 -9
  254. data/test/fixtures/parrots.yml +27 -27
  255. data/test/fixtures/parrots_pirates.yml +7 -7
  256. data/test/fixtures/people.yml +24 -24
  257. data/test/fixtures/peoples_treasures.yml +3 -3
  258. data/test/fixtures/pets.yml +19 -19
  259. data/test/fixtures/pirates.yml +12 -12
  260. data/test/fixtures/posts.yml +80 -80
  261. data/test/fixtures/price_estimates.yml +7 -7
  262. data/test/fixtures/products.yml +4 -4
  263. data/test/fixtures/projects.yml +7 -7
  264. data/test/fixtures/randomly_named_a9.yml +7 -7
  265. data/test/fixtures/ratings.yml +14 -14
  266. data/test/fixtures/readers.yml +11 -11
  267. data/test/fixtures/references.yml +17 -17
  268. data/test/fixtures/reserved_words/distinct.yml +5 -5
  269. data/test/fixtures/reserved_words/distinct_select.yml +11 -11
  270. data/test/fixtures/reserved_words/group.yml +14 -14
  271. data/test/fixtures/reserved_words/select.yml +8 -8
  272. data/test/fixtures/reserved_words/values.yml +7 -7
  273. data/test/fixtures/ships.yml +6 -6
  274. data/test/fixtures/speedometers.yml +8 -8
  275. data/test/fixtures/sponsors.yml +12 -12
  276. data/test/fixtures/string_key_objects.yml +7 -7
  277. data/test/fixtures/subscribers.yml +10 -10
  278. data/test/fixtures/subscriptions.yml +12 -12
  279. data/test/fixtures/taggings.yml +78 -78
  280. data/test/fixtures/tags.yml +11 -11
  281. data/test/fixtures/tasks.yml +7 -7
  282. data/test/fixtures/teapots.yml +3 -3
  283. data/test/fixtures/to_be_linked/accounts.yml +2 -2
  284. data/test/fixtures/to_be_linked/users.yml +10 -10
  285. data/test/fixtures/topics.yml +49 -49
  286. data/test/fixtures/toys.yml +14 -14
  287. data/test/fixtures/traffic_lights.yml +9 -9
  288. data/test/fixtures/treasures.yml +10 -10
  289. data/test/fixtures/uuid_children.yml +3 -3
  290. data/test/fixtures/uuid_parents.yml +2 -2
  291. data/test/fixtures/variants.yml +4 -4
  292. data/test/fixtures/vegetables.yml +19 -19
  293. data/test/fixtures/vertices.yml +3 -3
  294. data/test/fixtures/warehouse_things.yml +2 -2
  295. data/test/fixtures/zines.yml +5 -5
  296. data/test/ibm_db_test.rb +24 -24
  297. data/test/migrations/10_urban/9_add_expressions.rb +11 -11
  298. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -15
  299. data/test/migrations/magic/1_currencies_have_symbols.rb +12 -12
  300. data/test/migrations/missing/1000_people_have_middle_names.rb +8 -8
  301. data/test/migrations/missing/1_people_have_last_names.rb +8 -8
  302. data/test/migrations/missing/3_we_need_reminders.rb +11 -11
  303. data/test/migrations/missing/4_innocent_jointable.rb +11 -11
  304. data/test/migrations/rename/1_we_need_things.rb +10 -10
  305. data/test/migrations/rename/2_rename_things.rb +8 -8
  306. data/test/migrations/to_copy/1_people_have_hobbies.rb +9 -9
  307. data/test/migrations/to_copy/2_people_have_descriptions.rb +9 -9
  308. data/test/migrations/to_copy2/1_create_articles.rb +7 -7
  309. data/test/migrations/to_copy2/2_create_comments.rb +7 -7
  310. data/test/migrations/to_copy_with_name_collision/1_people_have_hobbies.rb +9 -9
  311. data/test/migrations/to_copy_with_timestamps/20090101010101_people_have_hobbies.rb +9 -9
  312. data/test/migrations/to_copy_with_timestamps/20090101010202_people_have_descriptions.rb +9 -9
  313. data/test/migrations/to_copy_with_timestamps2/20090101010101_create_articles.rb +7 -7
  314. data/test/migrations/to_copy_with_timestamps2/20090101010202_create_comments.rb +7 -7
  315. data/test/migrations/valid/1_valid_people_have_last_names.rb +9 -9
  316. data/test/migrations/valid/2_we_need_reminders.rb +11 -11
  317. data/test/migrations/valid/3_innocent_jointable.rb +11 -11
  318. data/test/migrations/valid_with_subdirectories/1_valid_people_have_last_names.rb +9 -9
  319. data/test/migrations/valid_with_subdirectories/sub/2_we_need_reminders.rb +11 -11
  320. data/test/migrations/valid_with_subdirectories/sub1/3_innocent_jointable.rb +11 -11
  321. data/test/migrations/valid_with_timestamps/20100101010101_valid_with_timestamps_people_have_last_names.rb +9 -9
  322. data/test/migrations/valid_with_timestamps/20100201010101_valid_with_timestamps_we_need_reminders.rb +12 -12
  323. data/test/migrations/valid_with_timestamps/20100301010101_valid_with_timestamps_innocent_jointable.rb +12 -12
  324. data/test/migrations/version_check/20131219224947_migration_version_check.rb +8 -8
  325. data/test/models/admin.rb +4 -4
  326. data/test/models/admin/account.rb +2 -2
  327. data/test/models/admin/randomly_named_c1.rb +3 -3
  328. data/test/models/admin/user.rb +40 -40
  329. data/test/models/aircraft.rb +4 -4
  330. data/test/models/arunit2_model.rb +3 -3
  331. data/test/models/author.rb +212 -212
  332. data/test/models/auto_id.rb +4 -4
  333. data/test/models/autoloadable/extra_firm.rb +2 -2
  334. data/test/models/binary.rb +1 -1
  335. data/test/models/bird.rb +12 -12
  336. data/test/models/book.rb +18 -18
  337. data/test/models/boolean.rb +2 -2
  338. data/test/models/bulb.rb +51 -51
  339. data/test/models/cake_designer.rb +3 -3
  340. data/test/models/car.rb +26 -26
  341. data/test/models/carrier.rb +2 -2
  342. data/test/models/categorization.rb +19 -19
  343. data/test/models/category.rb +35 -35
  344. data/test/models/chef.rb +7 -3
  345. data/test/models/citation.rb +3 -3
  346. data/test/models/club.rb +23 -23
  347. data/test/models/college.rb +10 -10
  348. data/test/models/column.rb +3 -3
  349. data/test/models/column_name.rb +3 -3
  350. data/test/models/comment.rb +64 -64
  351. data/test/models/company.rb +228 -225
  352. data/test/models/company_in_module.rb +98 -98
  353. data/test/models/computer.rb +3 -3
  354. data/test/models/contact.rb +41 -41
  355. data/test/models/contract.rb +20 -20
  356. data/test/models/country.rb +7 -7
  357. data/test/models/course.rb +6 -6
  358. data/test/models/customer.rb +77 -77
  359. data/test/models/customer_carrier.rb +14 -14
  360. data/test/models/dashboard.rb +3 -3
  361. data/test/models/default.rb +2 -2
  362. data/test/models/department.rb +4 -4
  363. data/test/models/developer.rb +255 -252
  364. data/test/models/dog.rb +5 -5
  365. data/test/models/dog_lover.rb +5 -5
  366. data/test/models/doubloon.rb +12 -12
  367. data/test/models/drink_designer.rb +3 -3
  368. data/test/models/edge.rb +5 -5
  369. data/test/models/electron.rb +5 -5
  370. data/test/models/engine.rb +4 -4
  371. data/test/models/entrant.rb +3 -3
  372. data/test/models/essay.rb +5 -5
  373. data/test/models/event.rb +2 -2
  374. data/test/models/eye.rb +37 -37
  375. data/test/models/face.rb +9 -9
  376. data/test/models/friendship.rb +6 -6
  377. data/test/models/guid.rb +1 -1
  378. data/test/models/hotel.rb +9 -6
  379. data/test/models/image.rb +3 -3
  380. data/test/models/interest.rb +5 -5
  381. data/test/models/invoice.rb +4 -4
  382. data/test/models/item.rb +7 -7
  383. data/test/models/job.rb +7 -7
  384. data/test/models/joke.rb +7 -7
  385. data/test/models/keyboard.rb +3 -3
  386. data/test/models/legacy_thing.rb +3 -3
  387. data/test/models/lesson.rb +11 -11
  388. data/test/models/line_item.rb +3 -3
  389. data/test/models/liquid.rb +4 -4
  390. data/test/models/man.rb +11 -11
  391. data/test/models/matey.rb +4 -4
  392. data/test/models/member.rb +41 -41
  393. data/test/models/member_detail.rb +7 -7
  394. data/test/models/member_type.rb +3 -3
  395. data/test/models/membership.rb +35 -35
  396. data/test/models/minimalistic.rb +2 -2
  397. data/test/models/minivan.rb +9 -9
  398. data/test/models/mixed_case_monkey.rb +3 -3
  399. data/test/models/molecule.rb +6 -6
  400. data/test/models/movie.rb +5 -5
  401. data/test/models/order.rb +4 -4
  402. data/test/models/organization.rb +14 -14
  403. data/test/models/owner.rb +34 -34
  404. data/test/models/parrot.rb +29 -29
  405. data/test/models/person.rb +143 -143
  406. data/test/models/personal_legacy_thing.rb +4 -4
  407. data/test/models/pet.rb +15 -15
  408. data/test/models/pirate.rb +92 -92
  409. data/test/models/possession.rb +3 -3
  410. data/test/models/post.rb +264 -264
  411. data/test/models/price_estimate.rb +4 -4
  412. data/test/models/professor.rb +5 -5
  413. data/test/models/project.rb +31 -29
  414. data/test/models/publisher.rb +2 -2
  415. data/test/models/publisher/article.rb +4 -4
  416. data/test/models/publisher/magazine.rb +3 -3
  417. data/test/models/randomly_named_c1.rb +3 -3
  418. data/test/models/rating.rb +4 -4
  419. data/test/models/reader.rb +23 -23
  420. data/test/models/record.rb +2 -2
  421. data/test/models/reference.rb +22 -22
  422. data/test/models/reply.rb +61 -61
  423. data/test/models/ship.rb +33 -33
  424. data/test/models/ship_part.rb +7 -7
  425. data/test/models/shop.rb +17 -17
  426. data/test/models/shop_account.rb +6 -6
  427. data/test/models/speedometer.rb +6 -6
  428. data/test/models/sponsor.rb +7 -7
  429. data/test/models/string_key_object.rb +3 -3
  430. data/test/models/student.rb +4 -4
  431. data/test/models/subject.rb +16 -16
  432. data/test/models/subscriber.rb +8 -8
  433. data/test/models/subscription.rb +4 -4
  434. data/test/models/tag.rb +7 -7
  435. data/test/models/tagging.rb +13 -13
  436. data/test/models/task.rb +5 -5
  437. data/test/models/topic.rb +124 -124
  438. data/test/models/toy.rb +6 -6
  439. data/test/models/traffic_light.rb +4 -4
  440. data/test/models/treasure.rb +14 -14
  441. data/test/models/treaty.rb +7 -7
  442. data/test/models/tyre.rb +11 -11
  443. data/test/models/uuid_child.rb +3 -3
  444. data/test/models/uuid_parent.rb +3 -3
  445. data/test/models/vegetables.rb +24 -24
  446. data/test/models/vehicle.rb +6 -6
  447. data/test/models/vertex.rb +9 -9
  448. data/test/models/warehouse_thing.rb +5 -5
  449. data/test/models/wheel.rb +3 -3
  450. data/test/models/without_table.rb +3 -3
  451. data/test/models/zine.rb +3 -3
  452. data/test/schema/mysql2_specific_schema.rb +58 -58
  453. data/test/schema/mysql_specific_schema.rb +70 -70
  454. data/test/schema/oracle_specific_schema.rb +43 -43
  455. data/test/schema/postgresql_specific_schema.rb +202 -202
  456. data/test/schema/schema.rb +952 -938
  457. data/test/schema/sqlite_specific_schema.rb +21 -21
  458. data/test/support/config.rb +43 -43
  459. data/test/support/connection.rb +22 -22
  460. data/test/support/connection_helper.rb +14 -14
  461. data/test/support/ddl_helper.rb +8 -8
  462. data/test/support/schema_dumping_helper.rb +20 -20
  463. metadata +2 -2
@@ -1,138 +1,138 @@
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
+ 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,897 +1,908 @@
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_omap_fixtures
221
- assert_nothing_raised do
222
- fixtures = ActiveRecord::FixtureSet.new(Account.connection, 'categories', Category, FIXTURES_ROOT + "/categories_ordered")
223
-
224
- fixtures.each.with_index do |(name, fixture), i|
225
- assert_equal "fixture_no_#{i}", name
226
- assert_equal "Category #{i}", fixture['name']
227
- end
228
- end
229
- end
230
-
231
- def test_yml_file_in_subdirectory
232
- assert_equal(categories(:sub_special_1).name, "A special category in a subdir file")
233
- assert_equal(categories(:sub_special_1).class, SpecialCategory)
234
- end
235
-
236
- def test_subsubdir_file_with_arbitrary_name
237
- assert_equal(categories(:sub_special_3).name, "A special category in an arbitrarily named subsubdir file")
238
- assert_equal(categories(:sub_special_3).class, SpecialCategory)
239
- end
240
-
241
- def test_binary_in_fixtures
242
- data = File.open(ASSETS_ROOT + "/flowers.jpg", 'rb') { |f| f.read }
243
- data.force_encoding('ASCII-8BIT')
244
- data.freeze
245
- assert_equal data, @flowers.data
246
- end
247
-
248
- def test_serialized_fixtures
249
- assert_equal ["Green", "Red", "Orange"], traffic_lights(:uk).state
250
- end
251
-
252
- def test_fixtures_are_set_up_with_database_env_variable
253
- db_url_tmp = ENV['DATABASE_URL']
254
- ENV['DATABASE_URL'] = "sqlite3::memory:"
255
- ActiveRecord::Base.stubs(:configurations).returns({})
256
- test_case = Class.new(ActiveRecord::TestCase) do
257
- fixtures :accounts
258
-
259
- def test_fixtures
260
- assert accounts(:signals37)
261
- end
262
- end
263
-
264
- result = test_case.new(:test_fixtures).run
265
-
266
- assert result.passed?, "Expected #{result.name} to pass:\n#{result}"
267
- ensure
268
- ENV['DATABASE_URL'] = db_url_tmp
269
- end
270
- end
271
-
272
- class HasManyThroughFixture < ActiveSupport::TestCase
273
- def make_model(name)
274
- Class.new(ActiveRecord::Base) { define_singleton_method(:name) { name } }
275
- end
276
-
277
- def test_has_many_through_with_default_table_name
278
- pt = make_model "ParrotTreasure"
279
- parrot = make_model "Parrot"
280
- treasure = make_model "Treasure"
281
-
282
- pt.table_name = "parrots_treasures"
283
- pt.belongs_to :parrot, :anonymous_class => parrot
284
- pt.belongs_to :treasure, :anonymous_class => treasure
285
-
286
- parrot.has_many :parrot_treasures, :anonymous_class => pt
287
- parrot.has_many :treasures, :through => :parrot_treasures
288
-
289
- parrots = File.join FIXTURES_ROOT, 'parrots'
290
-
291
- fs = ActiveRecord::FixtureSet.new parrot.connection, "parrots", parrot, parrots
292
- rows = fs.table_rows
293
- assert_equal load_has_and_belongs_to_many['parrots_treasures'], rows['parrots_treasures']
294
- end
295
-
296
- def test_has_many_through_with_renamed_table
297
- pt = make_model "ParrotTreasure"
298
- parrot = make_model "Parrot"
299
- treasure = make_model "Treasure"
300
-
301
- pt.belongs_to :parrot, :anonymous_class => parrot
302
- pt.belongs_to :treasure, :anonymous_class => treasure
303
-
304
- parrot.has_many :parrot_treasures, :anonymous_class => pt
305
- parrot.has_many :treasures, :through => :parrot_treasures
306
-
307
- parrots = File.join FIXTURES_ROOT, 'parrots'
308
-
309
- fs = ActiveRecord::FixtureSet.new parrot.connection, "parrots", parrot, parrots
310
- rows = fs.table_rows
311
- assert_equal load_has_and_belongs_to_many['parrots_treasures'], rows['parrot_treasures']
312
- end
313
-
314
- def load_has_and_belongs_to_many
315
- parrot = make_model "Parrot"
316
- parrot.has_and_belongs_to_many :treasures
317
-
318
- parrots = File.join FIXTURES_ROOT, 'parrots'
319
-
320
- fs = ActiveRecord::FixtureSet.new parrot.connection, "parrots", parrot, parrots
321
- fs.table_rows
322
- end
323
- end
324
-
325
- if Account.connection.respond_to?(:reset_pk_sequence!)
326
- class FixturesResetPkSequenceTest < ActiveRecord::TestCase
327
- fixtures :accounts
328
- fixtures :companies
329
-
330
- def setup
331
- @instances = [Account.new(:credit_limit => 50), Company.new(:name => 'RoR Consulting'), Course.new(name: 'Test')]
332
- ActiveRecord::FixtureSet.reset_cache # make sure tables get reinitialized
333
- end
334
-
335
- def test_resets_to_min_pk_with_specified_pk_and_sequence
336
- @instances.each do |instance|
337
- model = instance.class
338
- model.delete_all
339
- model.connection.reset_pk_sequence!(model.table_name, model.primary_key, model.sequence_name)
340
-
341
- instance.save!
342
- assert_equal 1, instance.id, "Sequence reset for #{model.table_name} failed."
343
- end
344
- end
345
-
346
- def test_resets_to_min_pk_with_default_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)
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_create_fixtures_resets_sequences_when_not_cached
358
- @instances.each do |instance|
359
- max_id = create_fixtures(instance.class.table_name).first.fixtures.inject(0) do |_max_id, (_, fixture)|
360
- fixture_id = fixture['id'].to_i
361
- fixture_id > _max_id ? fixture_id : _max_id
362
- end
363
-
364
- # Clone the last fixture to check that it gets the next greatest id.
365
- instance.save!
366
- assert_equal max_id + 1, instance.id, "Sequence reset for #{instance.class.table_name} failed."
367
- end
368
- end
369
- end
370
- end
371
-
372
- class FixturesWithoutInstantiationTest < ActiveRecord::TestCase
373
- self.use_instantiated_fixtures = false
374
- fixtures :topics, :developers, :accounts
375
-
376
- def test_without_complete_instantiation
377
- assert !defined?(@first)
378
- assert !defined?(@topics)
379
- assert !defined?(@developers)
380
- assert !defined?(@accounts)
381
- end
382
-
383
- def test_fixtures_from_root_yml_without_instantiation
384
- assert !defined?(@unknown), "@unknown is not defined"
385
- end
386
-
387
- def test_visibility_of_accessor_method
388
- assert_equal false, respond_to?(:topics, false), "should be private method"
389
- assert_equal true, respond_to?(:topics, true), "confirm to respond surely"
390
- end
391
-
392
- def test_accessor_methods
393
- assert_equal "The First Topic", topics(:first).title
394
- assert_equal "Jamis", developers(:jamis).name
395
- assert_equal 50, accounts(:signals37).credit_limit
396
- end
397
-
398
- def test_accessor_methods_with_multiple_args
399
- assert_equal 2, topics(:first, :second).size
400
- assert_raise(StandardError) { topics([:first, :second]) }
401
- end
402
-
403
- def test_reloading_fixtures_through_accessor_methods
404
- assert_equal "The First Topic", topics(:first).title
405
- @loaded_fixtures['topics']['first'].expects(:find).returns(stub(:title => "Fresh Topic!"))
406
- assert_equal "Fresh Topic!", topics(:first, true).title
407
- end
408
- end
409
-
410
- class FixturesWithoutInstanceInstantiationTest < ActiveRecord::TestCase
411
- self.use_instantiated_fixtures = true
412
- self.use_instantiated_fixtures = :no_instances
413
-
414
- fixtures :topics, :developers, :accounts
415
-
416
- def test_without_instance_instantiation
417
- assert !defined?(@first), "@first is not defined"
418
- end
419
- end
420
-
421
- class TransactionalFixturesTest < ActiveRecord::TestCase
422
- self.use_instantiated_fixtures = true
423
- self.use_transactional_fixtures = true
424
-
425
- fixtures :topics
426
-
427
- def test_destroy
428
- assert_not_nil @first
429
- @first.destroy
430
- end
431
-
432
- def test_destroy_just_kidding
433
- assert_not_nil @first
434
- end
435
- end
436
-
437
- class MultipleFixturesTest < ActiveRecord::TestCase
438
- fixtures :topics
439
- fixtures :developers, :accounts
440
-
441
- def test_fixture_table_names
442
- assert_equal %w(topics developers accounts), fixture_table_names
443
- end
444
- end
445
-
446
- class SetupTest < ActiveRecord::TestCase
447
- # fixtures :topics
448
-
449
- def setup
450
- @first = true
451
- end
452
-
453
- def test_nothing
454
- end
455
- end
456
-
457
- class SetupSubclassTest < SetupTest
458
- def setup
459
- super
460
- @second = true
461
- end
462
-
463
- def test_subclassing_should_preserve_setups
464
- assert @first
465
- assert @second
466
- end
467
- end
468
-
469
-
470
- class OverlappingFixturesTest < ActiveRecord::TestCase
471
- fixtures :topics, :developers
472
- fixtures :developers, :accounts
473
-
474
- def test_fixture_table_names
475
- assert_equal %w(topics developers accounts), fixture_table_names
476
- end
477
- end
478
-
479
- class ForeignKeyFixturesTest < ActiveRecord::TestCase
480
- fixtures :fk_test_has_pk, :fk_test_has_fk
481
-
482
- # if foreign keys are implemented and fixtures
483
- # are not deleted in reverse order then this test
484
- # case will raise StatementInvalid
485
-
486
- def test_number1
487
- assert true
488
- end
489
-
490
- def test_number2
491
- assert true
492
- end
493
- end
494
-
495
- class OverRideFixtureMethodTest < ActiveRecord::TestCase
496
- fixtures :topics
497
-
498
- def topics(name)
499
- topic = super
500
- topic.title = 'omg'
501
- topic
502
- end
503
-
504
- def test_fixture_methods_can_be_overridden
505
- x = topics :first
506
- assert_equal 'omg', x.title
507
- end
508
- end
509
-
510
- class CheckSetTableNameFixturesTest < ActiveRecord::TestCase
511
- set_fixture_class :funny_jokes => Joke
512
- fixtures :funny_jokes
513
- # Set to false to blow away fixtures cache and ensure our fixtures are loaded
514
- # and thus takes into account our set_fixture_class
515
- self.use_transactional_fixtures = false
516
-
517
- def test_table_method
518
- assert_kind_of Joke, funny_jokes(:a_joke)
519
- end
520
- end
521
-
522
- class FixtureNameIsNotTableNameFixturesTest < ActiveRecord::TestCase
523
- set_fixture_class :items => Book
524
- fixtures :items
525
- # Set to false to blow away fixtures cache and ensure our fixtures are loaded
526
- # and thus takes into account our set_fixture_class
527
- self.use_transactional_fixtures = false
528
-
529
- def test_named_accessor
530
- assert_kind_of Book, items(:dvd)
531
- end
532
- end
533
-
534
- class FixtureNameIsNotTableNameMultipleFixturesTest < ActiveRecord::TestCase
535
- set_fixture_class :items => Book, :funny_jokes => Joke
536
- fixtures :items, :funny_jokes
537
- # Set to false to blow away fixtures cache and ensure our fixtures are loaded
538
- # and thus takes into account our set_fixture_class
539
- self.use_transactional_fixtures = false
540
-
541
- def test_named_accessor_of_differently_named_fixture
542
- assert_kind_of Book, items(:dvd)
543
- end
544
-
545
- def test_named_accessor_of_same_named_fixture
546
- assert_kind_of Joke, funny_jokes(:a_joke)
547
- end
548
- end
549
-
550
- class CustomConnectionFixturesTest < ActiveRecord::TestCase
551
- set_fixture_class :courses => Course
552
- fixtures :courses
553
- self.use_transactional_fixtures = false
554
-
555
- def test_leaky_destroy
556
- assert_nothing_raised { courses(:ruby) }
557
- courses(:ruby).destroy
558
- end
559
-
560
- def test_it_twice_in_whatever_order_to_check_for_fixture_leakage
561
- test_leaky_destroy
562
- end
563
- end
564
-
565
- class TransactionalFixturesOnCustomConnectionTest < ActiveRecord::TestCase
566
- set_fixture_class :courses => Course
567
- fixtures :courses
568
- self.use_transactional_fixtures = true
569
-
570
- def test_leaky_destroy
571
- assert_nothing_raised { courses(:ruby) }
572
- courses(:ruby).destroy
573
- end
574
-
575
- def test_it_twice_in_whatever_order_to_check_for_fixture_leakage
576
- test_leaky_destroy
577
- end
578
- end
579
-
580
- class InvalidTableNameFixturesTest < ActiveRecord::TestCase
581
- fixtures :funny_jokes
582
- # Set to false to blow away fixtures cache and ensure our fixtures are loaded
583
- # and thus takes into account our lack of set_fixture_class
584
- self.use_transactional_fixtures = false
585
-
586
- def test_raises_error
587
- assert_raise ActiveRecord::FixtureClassNotFound do
588
- funny_jokes(:a_joke)
589
- end
590
- end
591
- end
592
-
593
- class CheckEscapedYamlFixturesTest < ActiveRecord::TestCase
594
- set_fixture_class :funny_jokes => Joke
595
- fixtures :funny_jokes
596
- # Set to false to blow away fixtures cache and ensure our fixtures are loaded
597
- # and thus takes into account our set_fixture_class
598
- self.use_transactional_fixtures = false
599
-
600
- def test_proper_escaped_fixture
601
- assert_equal "The \\n Aristocrats\nAte the candy\n", funny_jokes(:another_joke).name
602
- end
603
- end
604
-
605
- class DevelopersProject; end
606
- class ManyToManyFixturesWithClassDefined < ActiveRecord::TestCase
607
- fixtures :developers_projects
608
-
609
- def test_this_should_run_cleanly
610
- assert true
611
- end
612
- end
613
-
614
- class FixturesBrokenRollbackTest < ActiveRecord::TestCase
615
- def blank_setup
616
- @fixture_connections = [ActiveRecord::Base.connection]
617
- end
618
- alias_method :ar_setup_fixtures, :setup_fixtures
619
- alias_method :setup_fixtures, :blank_setup
620
- alias_method :setup, :blank_setup
621
-
622
- def blank_teardown; end
623
- alias_method :ar_teardown_fixtures, :teardown_fixtures
624
- alias_method :teardown_fixtures, :blank_teardown
625
- alias_method :teardown, :blank_teardown
626
-
627
- def test_no_rollback_in_teardown_unless_transaction_active
628
- assert_equal 0, ActiveRecord::Base.connection.open_transactions
629
- assert_raise(RuntimeError) { ar_setup_fixtures }
630
- assert_equal 0, ActiveRecord::Base.connection.open_transactions
631
- assert_nothing_raised { ar_teardown_fixtures }
632
- assert_equal 0, ActiveRecord::Base.connection.open_transactions
633
- end
634
-
635
- private
636
- def load_fixtures(config)
637
- raise 'argh'
638
- end
639
- end
640
-
641
- class LoadAllFixturesTest < ActiveRecord::TestCase
642
- def test_all_there
643
- self.class.fixture_path = FIXTURES_ROOT + "/all"
644
- self.class.fixtures :all
645
-
646
- if File.symlink? FIXTURES_ROOT + "/all/admin"
647
- assert_equal %w(admin/accounts admin/users developers people tasks), fixture_table_names.sort
648
- end
649
- ensure
650
- ActiveRecord::FixtureSet.reset_cache
651
- end
652
- end
653
-
654
- class LoadAllFixturesWithPathnameTest < ActiveRecord::TestCase
655
- def test_all_there
656
- self.class.fixture_path = Pathname.new(FIXTURES_ROOT).join('all')
657
- self.class.fixtures :all
658
-
659
- if File.symlink? FIXTURES_ROOT + "/all/admin"
660
- assert_equal %w(admin/accounts admin/users developers people tasks), fixture_table_names.sort
661
- end
662
- ensure
663
- ActiveRecord::FixtureSet.reset_cache
664
- end
665
- end
666
-
667
- class FasterFixturesTest < ActiveRecord::TestCase
668
- self.use_transactional_fixtures = false
669
- fixtures :categories, :authors
670
-
671
- def load_extra_fixture(name)
672
- fixture = create_fixtures(name).first
673
- assert fixture.is_a?(ActiveRecord::FixtureSet)
674
- @loaded_fixtures[fixture.table_name] = fixture
675
- end
676
-
677
- def test_cache
678
- assert ActiveRecord::FixtureSet.fixture_is_cached?(ActiveRecord::Base.connection, 'categories')
679
- assert ActiveRecord::FixtureSet.fixture_is_cached?(ActiveRecord::Base.connection, 'authors')
680
-
681
- assert_no_queries do
682
- create_fixtures('categories')
683
- create_fixtures('authors')
684
- end
685
-
686
- load_extra_fixture('posts')
687
- assert ActiveRecord::FixtureSet.fixture_is_cached?(ActiveRecord::Base.connection, 'posts')
688
- self.class.setup_fixture_accessors :posts
689
- assert_equal 'Welcome to the weblog', posts(:welcome).title
690
- end
691
- end
692
-
693
- class FoxyFixturesTest < ActiveRecord::TestCase
694
- fixtures :parrots, :parrots_pirates, :pirates, :treasures, :mateys, :ships, :computers, :developers, :"admin/accounts", :"admin/users"
695
-
696
- if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL'
697
- require 'models/uuid_parent'
698
- require 'models/uuid_child'
699
- fixtures :uuid_parents, :uuid_children
700
- end
701
-
702
- def test_identifies_strings
703
- assert_equal(ActiveRecord::FixtureSet.identify("foo"), ActiveRecord::FixtureSet.identify("foo"))
704
- assert_not_equal(ActiveRecord::FixtureSet.identify("foo"), ActiveRecord::FixtureSet.identify("FOO"))
705
- end
706
-
707
- def test_identifies_symbols
708
- assert_equal(ActiveRecord::FixtureSet.identify(:foo), ActiveRecord::FixtureSet.identify(:foo))
709
- end
710
-
711
- def test_identifies_consistently
712
- assert_equal 207281424, ActiveRecord::FixtureSet.identify(:ruby)
713
- assert_equal 1066363776, ActiveRecord::FixtureSet.identify(:sapphire_2)
714
-
715
- assert_equal 'f92b6bda-0d0d-5fe1-9124-502b18badded', ActiveRecord::FixtureSet.identify(:daddy, :uuid)
716
- assert_equal 'b4b10018-ad47-595d-b42f-d8bdaa6d01bf', ActiveRecord::FixtureSet.identify(:sonny, :uuid)
717
- end
718
-
719
- TIMESTAMP_COLUMNS = %w(created_at created_on updated_at updated_on)
720
-
721
- def test_populates_timestamp_columns
722
- TIMESTAMP_COLUMNS.each do |property|
723
- assert_not_nil(parrots(:george).send(property), "should set #{property}")
724
- end
725
- end
726
-
727
- def test_does_not_populate_timestamp_columns_if_model_has_set_record_timestamps_to_false
728
- TIMESTAMP_COLUMNS.each do |property|
729
- assert_nil(ships(:black_pearl).send(property), "should not set #{property}")
730
- end
731
- end
732
-
733
- def test_populates_all_columns_with_the_same_time
734
- last = nil
735
-
736
- TIMESTAMP_COLUMNS.each do |property|
737
- current = parrots(:george).send(property)
738
- last ||= current
739
-
740
- assert_equal(last, current)
741
- last = current
742
- end
743
- end
744
-
745
- def test_only_populates_columns_that_exist
746
- assert_not_nil(pirates(:blackbeard).created_on)
747
- assert_not_nil(pirates(:blackbeard).updated_on)
748
- end
749
-
750
- def test_preserves_existing_fixture_data
751
- assert_equal(2.weeks.ago.to_date, pirates(:redbeard).created_on.to_date)
752
- assert_equal(2.weeks.ago.to_date, pirates(:redbeard).updated_on.to_date)
753
- end
754
-
755
- def test_generates_unique_ids
756
- assert_not_nil(parrots(:george).id)
757
- assert_not_equal(parrots(:george).id, parrots(:louis).id)
758
- end
759
-
760
- def test_automatically_sets_primary_key
761
- assert_not_nil(ships(:black_pearl))
762
- end
763
-
764
- def test_preserves_existing_primary_key
765
- assert_equal(2, ships(:interceptor).id)
766
- end
767
-
768
- def test_resolves_belongs_to_symbols
769
- assert_equal(parrots(:george), pirates(:blackbeard).parrot)
770
- end
771
-
772
- def test_ignores_belongs_to_symbols_if_association_and_foreign_key_are_named_the_same
773
- assert_equal(developers(:david), computers(:workstation).developer)
774
- end
775
-
776
- def test_supports_join_tables
777
- assert(pirates(:blackbeard).parrots.include?(parrots(:george)))
778
- assert(pirates(:blackbeard).parrots.include?(parrots(:louis)))
779
- assert(parrots(:george).pirates.include?(pirates(:blackbeard)))
780
- end
781
-
782
- def test_supports_inline_habtm
783
- assert(parrots(:george).treasures.include?(treasures(:diamond)))
784
- assert(parrots(:george).treasures.include?(treasures(:sapphire)))
785
- assert(!parrots(:george).treasures.include?(treasures(:ruby)))
786
- end
787
-
788
- def test_supports_inline_habtm_with_specified_id
789
- assert(parrots(:polly).treasures.include?(treasures(:ruby)))
790
- assert(parrots(:polly).treasures.include?(treasures(:sapphire)))
791
- assert(!parrots(:polly).treasures.include?(treasures(:diamond)))
792
- end
793
-
794
- def test_supports_yaml_arrays
795
- assert(parrots(:louis).treasures.include?(treasures(:diamond)))
796
- assert(parrots(:louis).treasures.include?(treasures(:sapphire)))
797
- end
798
-
799
- def test_strips_DEFAULTS_key
800
- assert_raise(StandardError) { parrots(:DEFAULTS) }
801
-
802
- # this lets us do YAML defaults and not have an extra fixture entry
803
- %w(sapphire ruby).each { |t| assert(parrots(:davey).treasures.include?(treasures(t))) }
804
- end
805
-
806
- def test_supports_label_interpolation
807
- assert_equal("frederick", parrots(:frederick).name)
808
- end
809
-
810
- def test_supports_label_string_interpolation
811
- assert_equal("X marks the spot!", pirates(:mark).catchphrase)
812
- end
813
-
814
- def test_supports_polymorphic_belongs_to
815
- assert_equal(pirates(:redbeard), treasures(:sapphire).looter)
816
- assert_equal(parrots(:louis), treasures(:ruby).looter)
817
- end
818
-
819
- def test_only_generates_a_pk_if_necessary
820
- m = Matey.first
821
- m.pirate = pirates(:blackbeard)
822
- m.target = pirates(:redbeard)
823
- end
824
-
825
- def test_supports_sti
826
- assert_kind_of DeadParrot, parrots(:polly)
827
- assert_equal pirates(:blackbeard), parrots(:polly).killer
828
- end
829
-
830
- def test_namespaced_models
831
- assert admin_accounts(:signals37).users.include?(admin_users(:david))
832
- assert_equal 2, admin_accounts(:signals37).users.size
833
- end
834
- end
835
-
836
- class ActiveSupportSubclassWithFixturesTest < ActiveRecord::TestCase
837
- fixtures :parrots
838
-
839
- # This seemingly useless assertion catches a bug that caused the fixtures
840
- # setup code call nil[]
841
- def test_foo
842
- assert_equal parrots(:louis), Parrot.find_by_name("King Louis")
843
- end
844
- end
845
-
846
- class CustomNameForFixtureOrModelTest < ActiveRecord::TestCase
847
- ActiveRecord::FixtureSet.reset_cache
848
-
849
- set_fixture_class :randomly_named_a9 =>
850
- ClassNameThatDoesNotFollowCONVENTIONS,
851
- :'admin/randomly_named_a9' =>
852
- Admin::ClassNameThatDoesNotFollowCONVENTIONS,
853
- 'admin/randomly_named_b0' =>
854
- Admin::ClassNameThatDoesNotFollowCONVENTIONS
855
-
856
- fixtures :randomly_named_a9, 'admin/randomly_named_a9',
857
- :'admin/randomly_named_b0'
858
-
859
- def test_named_accessor_for_randomly_named_fixture_and_class
860
- assert_kind_of ClassNameThatDoesNotFollowCONVENTIONS,
861
- randomly_named_a9(:first_instance)
862
- end
863
-
864
- def test_named_accessor_for_randomly_named_namespaced_fixture_and_class
865
- assert_kind_of Admin::ClassNameThatDoesNotFollowCONVENTIONS,
866
- admin_randomly_named_a9(:first_instance)
867
- assert_kind_of Admin::ClassNameThatDoesNotFollowCONVENTIONS,
868
- admin_randomly_named_b0(:second_instance)
869
- end
870
-
871
- def test_table_name_is_defined_in_the_model
872
- assert_equal 'randomly_named_table', ActiveRecord::FixtureSet::all_loaded_fixtures["admin/randomly_named_a9"].table_name
873
- assert_equal 'randomly_named_table', Admin::ClassNameThatDoesNotFollowCONVENTIONS.table_name
874
- end
875
- end
876
-
877
- class FixturesWithDefaultScopeTest < ActiveRecord::TestCase
878
- fixtures :bulbs
879
-
880
- test "inserts fixtures excluded by a default scope" do
881
- assert_equal 1, Bulb.count
882
- assert_equal 2, Bulb.unscoped.count
883
- end
884
-
885
- test "allows access to fixtures excluded by a default scope" do
886
- assert_equal "special", bulbs(:special).name
887
- end
888
- end
889
-
890
- class FixturesWithAbstractBelongsTo < ActiveRecord::TestCase
891
- fixtures :pirates, :doubloons
892
-
893
- test "creates fixtures with belongs_to associations defined in abstract base classes" do
894
- assert_not_nil doubloons(:blackbeards_doubloon)
895
- assert_equal pirates(:blackbeard), doubloons(:blackbeards_doubloon).pirate
896
- end
897
- 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/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