activerecord 2.3.18 → 3.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (378) hide show
  1. data/CHANGELOG +105 -34
  2. data/examples/performance.rb +3 -39
  3. data/examples/simple.rb +14 -0
  4. data/lib/active_record.rb +81 -47
  5. data/lib/active_record/aggregations.rb +1 -3
  6. data/lib/active_record/association_preload.rb +39 -54
  7. data/lib/active_record/associations.rb +262 -419
  8. data/lib/active_record/associations/association_collection.rb +85 -100
  9. data/lib/active_record/associations/association_proxy.rb +20 -18
  10. data/lib/active_record/associations/belongs_to_association.rb +8 -8
  11. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +13 -35
  12. data/lib/active_record/associations/has_many_association.rb +11 -19
  13. data/lib/active_record/associations/has_many_through_association.rb +30 -183
  14. data/lib/active_record/associations/has_one_association.rb +10 -10
  15. data/lib/active_record/associations/has_one_through_association.rb +13 -11
  16. data/lib/active_record/associations/through_association_scope.rb +153 -0
  17. data/lib/active_record/attribute_methods.rb +17 -370
  18. data/lib/active_record/attribute_methods/before_type_cast.rb +33 -0
  19. data/lib/active_record/attribute_methods/dirty.rb +87 -0
  20. data/lib/active_record/attribute_methods/primary_key.rb +44 -0
  21. data/lib/active_record/attribute_methods/query.rb +37 -0
  22. data/lib/active_record/attribute_methods/read.rb +116 -0
  23. data/lib/active_record/attribute_methods/time_zone_conversion.rb +60 -0
  24. data/lib/active_record/attribute_methods/write.rb +37 -0
  25. data/lib/active_record/autosave_association.rb +20 -41
  26. data/lib/active_record/base.rb +357 -1180
  27. data/lib/active_record/batches.rb +10 -16
  28. data/lib/active_record/callbacks.rb +66 -126
  29. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +17 -13
  30. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +5 -25
  31. data/lib/active_record/connection_adapters/abstract/database_statements.rb +4 -43
  32. data/lib/active_record/connection_adapters/abstract/query_cache.rb +3 -2
  33. data/lib/active_record/connection_adapters/abstract/quoting.rb +15 -4
  34. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +1 -1
  35. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +18 -72
  36. data/lib/active_record/connection_adapters/abstract_adapter.rb +16 -49
  37. data/lib/active_record/connection_adapters/mysql_adapter.rb +15 -27
  38. data/lib/active_record/connection_adapters/postgresql_adapter.rb +84 -46
  39. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +9 -3
  40. data/lib/active_record/connection_adapters/sqlite_adapter.rb +34 -65
  41. data/lib/active_record/fixtures.rb +21 -25
  42. data/lib/active_record/locale/en.yml +9 -27
  43. data/lib/active_record/locking/optimistic.rb +16 -48
  44. data/lib/active_record/migration.rb +59 -46
  45. data/lib/active_record/named_scope.rb +85 -92
  46. data/lib/active_record/nested_attributes.rb +18 -24
  47. data/lib/active_record/observer.rb +18 -94
  48. data/lib/active_record/railtie.rb +83 -0
  49. data/lib/active_record/railties/controller_runtime.rb +38 -0
  50. data/lib/active_record/railties/databases.rake +477 -0
  51. data/lib/active_record/railties/subscriber.rb +27 -0
  52. data/lib/active_record/reflection.rb +2 -15
  53. data/lib/active_record/relation.rb +339 -0
  54. data/lib/active_record/relation/calculations.rb +259 -0
  55. data/lib/active_record/relation/finder_methods.rb +315 -0
  56. data/lib/active_record/relation/predicate_builder.rb +46 -0
  57. data/lib/active_record/relation/query_methods.rb +218 -0
  58. data/lib/active_record/relation/spawn_methods.rb +102 -0
  59. data/lib/active_record/schema_dumper.rb +10 -6
  60. data/lib/active_record/serialization.rb +31 -74
  61. data/lib/active_record/serializers/xml_serializer.rb +33 -121
  62. data/lib/active_record/session_store.rb +1 -9
  63. data/lib/active_record/test_case.rb +1 -3
  64. data/lib/active_record/timestamp.rb +7 -5
  65. data/lib/active_record/transactions.rb +9 -9
  66. data/lib/active_record/validations.rb +51 -1100
  67. data/lib/active_record/validations/associated.rb +47 -0
  68. data/lib/active_record/validations/uniqueness.rb +181 -0
  69. data/lib/active_record/version.rb +3 -3
  70. data/lib/generators/active_record.rb +30 -0
  71. data/lib/generators/active_record/migration/migration_generator.rb +25 -0
  72. data/lib/generators/active_record/migration/templates/migration.rb +11 -0
  73. data/lib/generators/active_record/model/model_generator.rb +33 -0
  74. data/lib/generators/active_record/model/templates/migration.rb +16 -0
  75. data/lib/generators/active_record/model/templates/model.rb +5 -0
  76. data/lib/generators/active_record/observer/observer_generator.rb +15 -0
  77. data/lib/generators/active_record/observer/templates/observer.rb +2 -0
  78. data/lib/generators/active_record/session_migration/session_migration_generator.rb +24 -0
  79. data/lib/generators/active_record/session_migration/templates/migration.rb +16 -0
  80. metadata +67 -325
  81. data/RUNNING_UNIT_TESTS +0 -36
  82. data/Rakefile +0 -268
  83. data/install.rb +0 -30
  84. data/lib/active_record/calculations.rb +0 -321
  85. data/lib/active_record/connection_adapters/abstract/database_limits.rb +0 -57
  86. data/lib/active_record/dirty.rb +0 -183
  87. data/lib/active_record/serializers/json_serializer.rb +0 -91
  88. data/lib/activerecord.rb +0 -2
  89. data/test/assets/example.log +0 -1
  90. data/test/assets/flowers.jpg +0 -0
  91. data/test/cases/aaa_create_tables_test.rb +0 -24
  92. data/test/cases/active_schema_test_mysql.rb +0 -122
  93. data/test/cases/active_schema_test_postgresql.rb +0 -24
  94. data/test/cases/adapter_test.rb +0 -144
  95. data/test/cases/aggregations_test.rb +0 -167
  96. data/test/cases/ar_schema_test.rb +0 -32
  97. data/test/cases/associations/belongs_to_associations_test.rb +0 -438
  98. data/test/cases/associations/callbacks_test.rb +0 -161
  99. data/test/cases/associations/cascaded_eager_loading_test.rb +0 -131
  100. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +0 -36
  101. data/test/cases/associations/eager_load_nested_include_test.rb +0 -131
  102. data/test/cases/associations/eager_load_nested_polymorphic_include.rb +0 -19
  103. data/test/cases/associations/eager_singularization_test.rb +0 -145
  104. data/test/cases/associations/eager_test.rb +0 -852
  105. data/test/cases/associations/extension_test.rb +0 -62
  106. data/test/cases/associations/habtm_join_table_test.rb +0 -56
  107. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +0 -827
  108. data/test/cases/associations/has_many_associations_test.rb +0 -1273
  109. data/test/cases/associations/has_many_through_associations_test.rb +0 -360
  110. data/test/cases/associations/has_one_associations_test.rb +0 -330
  111. data/test/cases/associations/has_one_through_associations_test.rb +0 -209
  112. data/test/cases/associations/inner_join_association_test.rb +0 -93
  113. data/test/cases/associations/inverse_associations_test.rb +0 -566
  114. data/test/cases/associations/join_model_test.rb +0 -712
  115. data/test/cases/associations_test.rb +0 -282
  116. data/test/cases/attribute_methods_test.rb +0 -305
  117. data/test/cases/autosave_association_test.rb +0 -1218
  118. data/test/cases/base_test.rb +0 -2166
  119. data/test/cases/batches_test.rb +0 -81
  120. data/test/cases/binary_test.rb +0 -30
  121. data/test/cases/calculations_test.rb +0 -360
  122. data/test/cases/callbacks_observers_test.rb +0 -38
  123. data/test/cases/callbacks_test.rb +0 -438
  124. data/test/cases/class_inheritable_attributes_test.rb +0 -32
  125. data/test/cases/column_alias_test.rb +0 -17
  126. data/test/cases/column_definition_test.rb +0 -70
  127. data/test/cases/connection_pool_test.rb +0 -25
  128. data/test/cases/connection_test_firebird.rb +0 -8
  129. data/test/cases/connection_test_mysql.rb +0 -65
  130. data/test/cases/copy_table_test_sqlite.rb +0 -80
  131. data/test/cases/counter_cache_test.rb +0 -84
  132. data/test/cases/database_statements_test.rb +0 -12
  133. data/test/cases/datatype_test_postgresql.rb +0 -204
  134. data/test/cases/date_time_test.rb +0 -37
  135. data/test/cases/default_test_firebird.rb +0 -16
  136. data/test/cases/defaults_test.rb +0 -111
  137. data/test/cases/deprecated_finder_test.rb +0 -30
  138. data/test/cases/dirty_test.rb +0 -316
  139. data/test/cases/finder_respond_to_test.rb +0 -76
  140. data/test/cases/finder_test.rb +0 -1098
  141. data/test/cases/fixtures_test.rb +0 -661
  142. data/test/cases/helper.rb +0 -68
  143. data/test/cases/i18n_test.rb +0 -46
  144. data/test/cases/inheritance_test.rb +0 -262
  145. data/test/cases/invalid_date_test.rb +0 -24
  146. data/test/cases/json_serialization_test.rb +0 -219
  147. data/test/cases/lifecycle_test.rb +0 -193
  148. data/test/cases/locking_test.rb +0 -350
  149. data/test/cases/method_scoping_test.rb +0 -704
  150. data/test/cases/migration_test.rb +0 -1649
  151. data/test/cases/migration_test_firebird.rb +0 -124
  152. data/test/cases/mixin_test.rb +0 -96
  153. data/test/cases/modules_test.rb +0 -109
  154. data/test/cases/multiple_db_test.rb +0 -85
  155. data/test/cases/named_scope_test.rb +0 -372
  156. data/test/cases/nested_attributes_test.rb +0 -840
  157. data/test/cases/pk_test.rb +0 -119
  158. data/test/cases/pooled_connections_test.rb +0 -103
  159. data/test/cases/query_cache_test.rb +0 -129
  160. data/test/cases/readonly_test.rb +0 -107
  161. data/test/cases/reflection_test.rb +0 -234
  162. data/test/cases/reload_models_test.rb +0 -22
  163. data/test/cases/repair_helper.rb +0 -50
  164. data/test/cases/reserved_word_test_mysql.rb +0 -176
  165. data/test/cases/sanitize_test.rb +0 -25
  166. data/test/cases/schema_authorization_test_postgresql.rb +0 -75
  167. data/test/cases/schema_dumper_test.rb +0 -211
  168. data/test/cases/schema_test_postgresql.rb +0 -178
  169. data/test/cases/serialization_test.rb +0 -47
  170. data/test/cases/sp_test_mysql.rb +0 -16
  171. data/test/cases/synonym_test_oracle.rb +0 -17
  172. data/test/cases/timestamp_test.rb +0 -75
  173. data/test/cases/transactions_test.rb +0 -543
  174. data/test/cases/unconnected_test.rb +0 -32
  175. data/test/cases/validations_i18n_test.rb +0 -925
  176. data/test/cases/validations_test.rb +0 -1684
  177. data/test/cases/xml_serialization_test.rb +0 -240
  178. data/test/cases/yaml_serialization_test.rb +0 -11
  179. data/test/config.rb +0 -5
  180. data/test/connections/jdbc_jdbcderby/connection.rb +0 -18
  181. data/test/connections/jdbc_jdbch2/connection.rb +0 -18
  182. data/test/connections/jdbc_jdbchsqldb/connection.rb +0 -18
  183. data/test/connections/jdbc_jdbcmysql/connection.rb +0 -26
  184. data/test/connections/jdbc_jdbcpostgresql/connection.rb +0 -26
  185. data/test/connections/jdbc_jdbcsqlite3/connection.rb +0 -25
  186. data/test/connections/native_db2/connection.rb +0 -25
  187. data/test/connections/native_firebird/connection.rb +0 -26
  188. data/test/connections/native_frontbase/connection.rb +0 -27
  189. data/test/connections/native_mysql/connection.rb +0 -25
  190. data/test/connections/native_openbase/connection.rb +0 -21
  191. data/test/connections/native_oracle/connection.rb +0 -27
  192. data/test/connections/native_postgresql/connection.rb +0 -21
  193. data/test/connections/native_sqlite/connection.rb +0 -25
  194. data/test/connections/native_sqlite3/connection.rb +0 -25
  195. data/test/connections/native_sqlite3/in_memory_connection.rb +0 -18
  196. data/test/connections/native_sybase/connection.rb +0 -23
  197. data/test/fixtures/accounts.yml +0 -29
  198. data/test/fixtures/all/developers.yml +0 -0
  199. data/test/fixtures/all/people.csv +0 -0
  200. data/test/fixtures/all/tasks.yml +0 -0
  201. data/test/fixtures/author_addresses.yml +0 -5
  202. data/test/fixtures/author_favorites.yml +0 -4
  203. data/test/fixtures/authors.yml +0 -9
  204. data/test/fixtures/binaries.yml +0 -132
  205. data/test/fixtures/books.yml +0 -7
  206. data/test/fixtures/categories.yml +0 -14
  207. data/test/fixtures/categories/special_categories.yml +0 -9
  208. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +0 -4
  209. data/test/fixtures/categories_ordered.yml +0 -7
  210. data/test/fixtures/categories_posts.yml +0 -23
  211. data/test/fixtures/categorizations.yml +0 -17
  212. data/test/fixtures/clubs.yml +0 -6
  213. data/test/fixtures/comments.yml +0 -59
  214. data/test/fixtures/companies.yml +0 -56
  215. data/test/fixtures/computers.yml +0 -4
  216. data/test/fixtures/courses.yml +0 -7
  217. data/test/fixtures/customers.yml +0 -26
  218. data/test/fixtures/developers.yml +0 -21
  219. data/test/fixtures/developers_projects.yml +0 -17
  220. data/test/fixtures/edges.yml +0 -6
  221. data/test/fixtures/entrants.yml +0 -14
  222. data/test/fixtures/faces.yml +0 -11
  223. data/test/fixtures/fk_test_has_fk.yml +0 -3
  224. data/test/fixtures/fk_test_has_pk.yml +0 -2
  225. data/test/fixtures/funny_jokes.yml +0 -10
  226. data/test/fixtures/interests.yml +0 -33
  227. data/test/fixtures/items.yml +0 -4
  228. data/test/fixtures/jobs.yml +0 -7
  229. data/test/fixtures/legacy_things.yml +0 -3
  230. data/test/fixtures/mateys.yml +0 -4
  231. data/test/fixtures/member_types.yml +0 -6
  232. data/test/fixtures/members.yml +0 -6
  233. data/test/fixtures/memberships.yml +0 -20
  234. data/test/fixtures/men.yml +0 -5
  235. data/test/fixtures/minimalistics.yml +0 -2
  236. data/test/fixtures/mixed_case_monkeys.yml +0 -6
  237. data/test/fixtures/mixins.yml +0 -29
  238. data/test/fixtures/movies.yml +0 -7
  239. data/test/fixtures/naked/csv/accounts.csv +0 -1
  240. data/test/fixtures/naked/yml/accounts.yml +0 -1
  241. data/test/fixtures/naked/yml/companies.yml +0 -1
  242. data/test/fixtures/naked/yml/courses.yml +0 -1
  243. data/test/fixtures/organizations.yml +0 -5
  244. data/test/fixtures/owners.yml +0 -7
  245. data/test/fixtures/parrots.yml +0 -27
  246. data/test/fixtures/parrots_pirates.yml +0 -7
  247. data/test/fixtures/people.yml +0 -15
  248. data/test/fixtures/pets.yml +0 -14
  249. data/test/fixtures/pirates.yml +0 -9
  250. data/test/fixtures/polymorphic_designs.yml +0 -19
  251. data/test/fixtures/polymorphic_prices.yml +0 -19
  252. data/test/fixtures/posts.yml +0 -52
  253. data/test/fixtures/price_estimates.yml +0 -7
  254. data/test/fixtures/projects.yml +0 -7
  255. data/test/fixtures/readers.yml +0 -9
  256. data/test/fixtures/references.yml +0 -17
  257. data/test/fixtures/reserved_words/distinct.yml +0 -5
  258. data/test/fixtures/reserved_words/distincts_selects.yml +0 -11
  259. data/test/fixtures/reserved_words/group.yml +0 -14
  260. data/test/fixtures/reserved_words/select.yml +0 -8
  261. data/test/fixtures/reserved_words/values.yml +0 -7
  262. data/test/fixtures/ships.yml +0 -5
  263. data/test/fixtures/sponsors.yml +0 -9
  264. data/test/fixtures/subscribers.yml +0 -7
  265. data/test/fixtures/subscriptions.yml +0 -12
  266. data/test/fixtures/taggings.yml +0 -28
  267. data/test/fixtures/tags.yml +0 -7
  268. data/test/fixtures/tasks.yml +0 -7
  269. data/test/fixtures/tees.yml +0 -4
  270. data/test/fixtures/ties.yml +0 -4
  271. data/test/fixtures/topics.yml +0 -42
  272. data/test/fixtures/toys.yml +0 -4
  273. data/test/fixtures/treasures.yml +0 -10
  274. data/test/fixtures/vertices.yml +0 -4
  275. data/test/fixtures/warehouse-things.yml +0 -3
  276. data/test/fixtures/zines.yml +0 -5
  277. data/test/migrations/broken/100_migration_that_raises_exception.rb +0 -10
  278. data/test/migrations/decimal/1_give_me_big_numbers.rb +0 -15
  279. data/test/migrations/duplicate/1_people_have_last_names.rb +0 -9
  280. data/test/migrations/duplicate/2_we_need_reminders.rb +0 -12
  281. data/test/migrations/duplicate/3_foo.rb +0 -7
  282. data/test/migrations/duplicate/3_innocent_jointable.rb +0 -12
  283. data/test/migrations/duplicate_names/20080507052938_chunky.rb +0 -7
  284. data/test/migrations/duplicate_names/20080507053028_chunky.rb +0 -7
  285. data/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +0 -12
  286. data/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +0 -9
  287. data/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +0 -12
  288. data/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +0 -9
  289. data/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +0 -8
  290. data/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +0 -12
  291. data/test/migrations/missing/1000_people_have_middle_names.rb +0 -9
  292. data/test/migrations/missing/1_people_have_last_names.rb +0 -9
  293. data/test/migrations/missing/3_we_need_reminders.rb +0 -12
  294. data/test/migrations/missing/4_innocent_jointable.rb +0 -12
  295. data/test/migrations/valid/1_people_have_last_names.rb +0 -9
  296. data/test/migrations/valid/2_we_need_reminders.rb +0 -12
  297. data/test/migrations/valid/3_innocent_jointable.rb +0 -12
  298. data/test/models/author.rb +0 -151
  299. data/test/models/auto_id.rb +0 -4
  300. data/test/models/binary.rb +0 -2
  301. data/test/models/bird.rb +0 -9
  302. data/test/models/book.rb +0 -4
  303. data/test/models/categorization.rb +0 -5
  304. data/test/models/category.rb +0 -34
  305. data/test/models/citation.rb +0 -6
  306. data/test/models/club.rb +0 -13
  307. data/test/models/column_name.rb +0 -3
  308. data/test/models/comment.rb +0 -29
  309. data/test/models/company.rb +0 -173
  310. data/test/models/company_in_module.rb +0 -78
  311. data/test/models/computer.rb +0 -3
  312. data/test/models/contact.rb +0 -16
  313. data/test/models/contract.rb +0 -5
  314. data/test/models/course.rb +0 -3
  315. data/test/models/customer.rb +0 -73
  316. data/test/models/default.rb +0 -2
  317. data/test/models/developer.rb +0 -101
  318. data/test/models/edge.rb +0 -5
  319. data/test/models/entrant.rb +0 -3
  320. data/test/models/essay.rb +0 -3
  321. data/test/models/event.rb +0 -3
  322. data/test/models/event_author.rb +0 -8
  323. data/test/models/face.rb +0 -7
  324. data/test/models/guid.rb +0 -2
  325. data/test/models/interest.rb +0 -5
  326. data/test/models/invoice.rb +0 -4
  327. data/test/models/item.rb +0 -7
  328. data/test/models/job.rb +0 -5
  329. data/test/models/joke.rb +0 -3
  330. data/test/models/keyboard.rb +0 -3
  331. data/test/models/legacy_thing.rb +0 -3
  332. data/test/models/line_item.rb +0 -3
  333. data/test/models/man.rb +0 -9
  334. data/test/models/matey.rb +0 -4
  335. data/test/models/member.rb +0 -12
  336. data/test/models/member_detail.rb +0 -5
  337. data/test/models/member_type.rb +0 -3
  338. data/test/models/membership.rb +0 -9
  339. data/test/models/minimalistic.rb +0 -2
  340. data/test/models/mixed_case_monkey.rb +0 -3
  341. data/test/models/movie.rb +0 -5
  342. data/test/models/order.rb +0 -4
  343. data/test/models/organization.rb +0 -6
  344. data/test/models/owner.rb +0 -5
  345. data/test/models/parrot.rb +0 -22
  346. data/test/models/person.rb +0 -16
  347. data/test/models/pet.rb +0 -5
  348. data/test/models/pirate.rb +0 -80
  349. data/test/models/polymorphic_design.rb +0 -3
  350. data/test/models/polymorphic_price.rb +0 -3
  351. data/test/models/post.rb +0 -102
  352. data/test/models/price_estimate.rb +0 -3
  353. data/test/models/project.rb +0 -30
  354. data/test/models/reader.rb +0 -4
  355. data/test/models/reference.rb +0 -4
  356. data/test/models/reply.rb +0 -46
  357. data/test/models/ship.rb +0 -19
  358. data/test/models/ship_part.rb +0 -7
  359. data/test/models/sponsor.rb +0 -4
  360. data/test/models/subject.rb +0 -4
  361. data/test/models/subscriber.rb +0 -8
  362. data/test/models/subscription.rb +0 -4
  363. data/test/models/tag.rb +0 -7
  364. data/test/models/tagging.rb +0 -10
  365. data/test/models/task.rb +0 -3
  366. data/test/models/tee.rb +0 -4
  367. data/test/models/tie.rb +0 -4
  368. data/test/models/topic.rb +0 -80
  369. data/test/models/toy.rb +0 -6
  370. data/test/models/treasure.rb +0 -8
  371. data/test/models/vertex.rb +0 -9
  372. data/test/models/warehouse_thing.rb +0 -5
  373. data/test/models/zine.rb +0 -3
  374. data/test/schema/mysql_specific_schema.rb +0 -31
  375. data/test/schema/postgresql_specific_schema.rb +0 -114
  376. data/test/schema/schema.rb +0 -550
  377. data/test/schema/schema2.rb +0 -6
  378. data/test/schema/sqlite_specific_schema.rb +0 -25
@@ -1,661 +0,0 @@
1
- require "cases/helper"
2
- require 'models/post'
3
- require 'models/binary'
4
- require 'models/topic'
5
- require 'models/computer'
6
- require 'models/developer'
7
- require 'models/company'
8
- require 'models/task'
9
- require 'models/reply'
10
- require 'models/joke'
11
- require 'models/course'
12
- require 'models/category'
13
- require 'models/parrot'
14
- require 'models/pirate'
15
- require 'models/treasure'
16
- require 'models/matey'
17
- require 'models/ship'
18
- require 'models/book'
19
-
20
- class FixturesTest < ActiveRecord::TestCase
21
- self.use_instantiated_fixtures = true
22
- self.use_transactional_fixtures = false
23
-
24
- fixtures :topics, :developers, :accounts, :tasks, :categories, :funny_jokes, :binaries
25
-
26
- FIXTURES = %w( accounts binaries companies customers
27
- developers developers_projects entrants
28
- movies projects subscribers topics tasks )
29
- MATCH_ATTRIBUTE_NAME = /[a-zA-Z][-_\w]*/
30
-
31
- def test_clean_fixtures
32
- FIXTURES.each do |name|
33
- fixtures = nil
34
- assert_nothing_raised { fixtures = create_fixtures(name) }
35
- assert_kind_of(Fixtures, fixtures)
36
- fixtures.each { |name, fixture|
37
- fixture.each { |key, value|
38
- assert_match(MATCH_ATTRIBUTE_NAME, key)
39
- }
40
- }
41
- end
42
- end
43
-
44
- def test_multiple_clean_fixtures
45
- fixtures_array = nil
46
- assert_nothing_raised { fixtures_array = create_fixtures(*FIXTURES) }
47
- assert_kind_of(Array, fixtures_array)
48
- fixtures_array.each { |fixtures| assert_kind_of(Fixtures, fixtures) }
49
- end
50
-
51
- def test_attributes
52
- topics = create_fixtures("topics")
53
- assert_equal("The First Topic", topics["first"]["title"])
54
- assert_nil(topics["second"]["author_email_address"])
55
- end
56
-
57
- def test_inserts
58
- topics = create_fixtures("topics")
59
- first_row = ActiveRecord::Base.connection.select_one("SELECT * FROM topics WHERE author_name = 'David'")
60
- assert_equal("The First Topic", first_row["title"])
61
-
62
- second_row = ActiveRecord::Base.connection.select_one("SELECT * FROM topics WHERE author_name = 'Mary'")
63
- assert_nil(second_row["author_email_address"])
64
- end
65
-
66
- if ActiveRecord::Base.connection.supports_migrations?
67
- def test_inserts_with_pre_and_suffix
68
- # Reset cache to make finds on the new table work
69
- Fixtures.reset_cache
70
-
71
- ActiveRecord::Base.connection.create_table :prefix_topics_suffix do |t|
72
- t.column :title, :string
73
- t.column :author_name, :string
74
- t.column :author_email_address, :string
75
- t.column :written_on, :datetime
76
- t.column :bonus_time, :time
77
- t.column :last_read, :date
78
- t.column :content, :string
79
- t.column :approved, :boolean, :default => true
80
- t.column :replies_count, :integer, :default => 0
81
- t.column :parent_id, :integer
82
- t.column :type, :string, :limit => 50
83
- end
84
-
85
- # Store existing prefix/suffix
86
- old_prefix = ActiveRecord::Base.table_name_prefix
87
- old_suffix = ActiveRecord::Base.table_name_suffix
88
-
89
- # Set a prefix/suffix we can test against
90
- ActiveRecord::Base.table_name_prefix = 'prefix_'
91
- ActiveRecord::Base.table_name_suffix = '_suffix'
92
-
93
- topics = create_fixtures("topics")
94
-
95
- first_row = ActiveRecord::Base.connection.select_one("SELECT * FROM prefix_topics_suffix WHERE author_name = 'David'")
96
- assert_equal("The First Topic", first_row["title"])
97
-
98
- second_row = ActiveRecord::Base.connection.select_one("SELECT * FROM prefix_topics_suffix WHERE author_name = 'Mary'")
99
- assert_nil(second_row["author_email_address"])
100
-
101
- # This checks for a caching problem which causes a bug in the fixtures
102
- # class-level configuration helper.
103
- assert_not_nil topics, "Fixture data inserted, but fixture objects not returned from create"
104
- ensure
105
- # Restore prefix/suffix to its previous values
106
- ActiveRecord::Base.table_name_prefix = old_prefix
107
- ActiveRecord::Base.table_name_suffix = old_suffix
108
-
109
- ActiveRecord::Base.connection.drop_table :prefix_topics_suffix rescue nil
110
- end
111
- end
112
-
113
- def test_insert_with_datetime
114
- topics = create_fixtures("tasks")
115
- first = Task.find(1)
116
- assert first
117
- end
118
-
119
- def test_logger_level_invariant
120
- level = ActiveRecord::Base.logger.level
121
- create_fixtures('topics')
122
- assert_equal level, ActiveRecord::Base.logger.level
123
- end
124
-
125
- def test_instantiation
126
- topics = create_fixtures("topics")
127
- assert_kind_of Topic, topics["first"].find
128
- end
129
-
130
- def test_complete_instantiation
131
- assert_equal 4, @topics.size
132
- assert_equal "The First Topic", @first.title
133
- end
134
-
135
- def test_fixtures_from_root_yml_with_instantiation
136
- # assert_equal 2, @accounts.size
137
- assert_equal 50, @unknown.credit_limit
138
- end
139
-
140
- def test_erb_in_fixtures
141
- assert_equal 11, @developers.size
142
- assert_equal "fixture_5", @dev_5.name
143
- end
144
-
145
- def test_empty_yaml_fixture
146
- assert_not_nil Fixtures.new( Account.connection, "accounts", 'Account', FIXTURES_ROOT + "/naked/yml/accounts")
147
- end
148
-
149
- def test_empty_yaml_fixture_with_a_comment_in_it
150
- assert_not_nil Fixtures.new( Account.connection, "companies", 'Company', FIXTURES_ROOT + "/naked/yml/companies")
151
- end
152
-
153
- def test_dirty_dirty_yaml_file
154
- assert_raise(Fixture::FormatError) do
155
- Fixtures.new( Account.connection, "courses", 'Course', FIXTURES_ROOT + "/naked/yml/courses")
156
- end
157
- end
158
-
159
- def test_empty_csv_fixtures
160
- assert_not_nil Fixtures.new( Account.connection, "accounts", 'Account', FIXTURES_ROOT + "/naked/csv/accounts")
161
- end
162
-
163
- def test_omap_fixtures
164
- assert_nothing_raised do
165
- fixtures = Fixtures.new(Account.connection, 'categories', 'Category', FIXTURES_ROOT + "/categories_ordered")
166
-
167
- i = 0
168
- fixtures.each do |name, fixture|
169
- assert_equal "fixture_no_#{i}", name
170
- assert_equal "Category #{i}", fixture['name']
171
- i += 1
172
- end
173
- end
174
- end
175
-
176
- def test_yml_file_in_subdirectory
177
- assert_equal(categories(:sub_special_1).name, "A special category in a subdir file")
178
- assert_equal(categories(:sub_special_1).class, SpecialCategory)
179
- end
180
-
181
- def test_subsubdir_file_with_arbitrary_name
182
- assert_equal(categories(:sub_special_3).name, "A special category in an arbitrarily named subsubdir file")
183
- assert_equal(categories(:sub_special_3).class, SpecialCategory)
184
- end
185
-
186
- def test_binary_in_fixtures
187
- assert_equal 1, @binaries.size
188
- data = File.open(ASSETS_ROOT + "/flowers.jpg", 'rb') { |f| f.read }
189
- data.force_encoding('ASCII-8BIT') if data.respond_to?(:force_encoding)
190
- data.freeze
191
- assert_equal data, @flowers.data
192
- end
193
- end
194
-
195
- if Account.connection.respond_to?(:reset_pk_sequence!)
196
- class FixturesResetPkSequenceTest < ActiveRecord::TestCase
197
- fixtures :accounts
198
- fixtures :companies
199
-
200
- def setup
201
- @instances = [Account.new(:credit_limit => 50), Company.new(:name => 'RoR Consulting')]
202
- Fixtures.reset_cache # make sure tables get reinitialized
203
- end
204
-
205
- def test_resets_to_min_pk_with_specified_pk_and_sequence
206
- @instances.each do |instance|
207
- model = instance.class
208
- model.delete_all
209
- model.connection.reset_pk_sequence!(model.table_name, model.primary_key, model.sequence_name)
210
-
211
- instance.save!
212
- assert_equal 1, instance.id, "Sequence reset for #{model.table_name} failed."
213
- end
214
- end
215
-
216
- def test_resets_to_min_pk_with_default_pk_and_sequence
217
- @instances.each do |instance|
218
- model = instance.class
219
- model.delete_all
220
- model.connection.reset_pk_sequence!(model.table_name)
221
-
222
- instance.save!
223
- assert_equal 1, instance.id, "Sequence reset for #{model.table_name} failed."
224
- end
225
- end
226
-
227
- def test_create_fixtures_resets_sequences_when_not_cached
228
- @instances.each do |instance|
229
- max_id = create_fixtures(instance.class.table_name).inject(0) do |max_id, (name, fixture)|
230
- fixture_id = fixture['id'].to_i
231
- fixture_id > max_id ? fixture_id : max_id
232
- end
233
-
234
- # Clone the last fixture to check that it gets the next greatest id.
235
- instance.save!
236
- assert_equal max_id + 1, instance.id, "Sequence reset for #{instance.class.table_name} failed."
237
- end
238
- end
239
- end
240
- end
241
-
242
- class FixturesWithoutInstantiationTest < ActiveRecord::TestCase
243
- self.use_instantiated_fixtures = false
244
- fixtures :topics, :developers, :accounts
245
-
246
- def test_without_complete_instantiation
247
- assert_nil @first
248
- assert_nil @topics
249
- assert_nil @developers
250
- assert_nil @accounts
251
- end
252
-
253
- def test_fixtures_from_root_yml_without_instantiation
254
- assert_nil @unknown
255
- end
256
-
257
- def test_visibility_of_accessor_method
258
- assert_equal false, respond_to?(:topics, false), "should be private method"
259
- assert_equal true, respond_to?(:topics, true), "confirm to respond surely"
260
- end
261
-
262
- def test_accessor_methods
263
- assert_equal "The First Topic", topics(:first).title
264
- assert_equal "Jamis", developers(:jamis).name
265
- assert_equal 50, accounts(:signals37).credit_limit
266
- end
267
-
268
- def test_accessor_methods_with_multiple_args
269
- assert_equal 2, topics(:first, :second).size
270
- assert_raise(StandardError) { topics([:first, :second]) }
271
- end
272
-
273
- def test_reloading_fixtures_through_accessor_methods
274
- assert_equal "The First Topic", topics(:first).title
275
- @loaded_fixtures['topics']['first'].expects(:find).returns(stub(:title => "Fresh Topic!"))
276
- assert_equal "Fresh Topic!", topics(:first, true).title
277
- end
278
- end
279
-
280
- class FixturesWithoutInstanceInstantiationTest < ActiveRecord::TestCase
281
- self.use_instantiated_fixtures = true
282
- self.use_instantiated_fixtures = :no_instances
283
-
284
- fixtures :topics, :developers, :accounts
285
-
286
- def test_without_instance_instantiation
287
- assert_nil @first
288
- assert_not_nil @topics
289
- assert_not_nil @developers
290
- assert_not_nil @accounts
291
- end
292
- end
293
-
294
- class TransactionalFixturesTest < ActiveRecord::TestCase
295
- self.use_instantiated_fixtures = true
296
- self.use_transactional_fixtures = true
297
-
298
- fixtures :topics
299
-
300
- def test_destroy
301
- assert_not_nil @first
302
- @first.destroy
303
- end
304
-
305
- def test_destroy_just_kidding
306
- assert_not_nil @first
307
- end
308
- end
309
-
310
- class MultipleFixturesTest < ActiveRecord::TestCase
311
- fixtures :topics
312
- fixtures :developers, :accounts
313
-
314
- def test_fixture_table_names
315
- assert_equal %w(topics developers accounts), fixture_table_names
316
- end
317
- end
318
-
319
- class SetupTest < ActiveRecord::TestCase
320
- # fixtures :topics
321
-
322
- def setup
323
- @first = true
324
- end
325
-
326
- def test_nothing
327
- end
328
- end
329
-
330
- class SetupSubclassTest < SetupTest
331
- def setup
332
- super
333
- @second = true
334
- end
335
-
336
- def test_subclassing_should_preserve_setups
337
- assert @first
338
- assert @second
339
- end
340
- end
341
-
342
-
343
- class OverlappingFixturesTest < ActiveRecord::TestCase
344
- fixtures :topics, :developers
345
- fixtures :developers, :accounts
346
-
347
- def test_fixture_table_names
348
- assert_equal %w(topics developers accounts), fixture_table_names
349
- end
350
- end
351
-
352
- class ForeignKeyFixturesTest < ActiveRecord::TestCase
353
- fixtures :fk_test_has_pk, :fk_test_has_fk
354
-
355
- # if foreign keys are implemented and fixtures
356
- # are not deleted in reverse order then this test
357
- # case will raise StatementInvalid
358
-
359
- def test_number1
360
- assert true
361
- end
362
-
363
- def test_number2
364
- assert true
365
- end
366
- end
367
-
368
- class CheckSetTableNameFixturesTest < ActiveRecord::TestCase
369
- set_fixture_class :funny_jokes => 'Joke'
370
- fixtures :funny_jokes
371
- # Set to false to blow away fixtures cache and ensure our fixtures are loaded
372
- # and thus takes into account our set_fixture_class
373
- self.use_transactional_fixtures = false
374
-
375
- def test_table_method
376
- assert_kind_of Joke, funny_jokes(:a_joke)
377
- end
378
- end
379
-
380
- class FixtureNameIsNotTableNameFixturesTest < ActiveRecord::TestCase
381
- set_fixture_class :items => Book
382
- fixtures :items
383
- # Set to false to blow away fixtures cache and ensure our fixtures are loaded
384
- # and thus takes into account our set_fixture_class
385
- self.use_transactional_fixtures = false
386
-
387
- def test_named_accessor
388
- assert_kind_of Book, items(:dvd)
389
- end
390
- end
391
-
392
- class FixtureNameIsNotTableNameMultipleFixturesTest < ActiveRecord::TestCase
393
- set_fixture_class :items => Book, :funny_jokes => Joke
394
- fixtures :items, :funny_jokes
395
- # Set to false to blow away fixtures cache and ensure our fixtures are loaded
396
- # and thus takes into account our set_fixture_class
397
- self.use_transactional_fixtures = false
398
-
399
- def test_named_accessor_of_differently_named_fixture
400
- assert_kind_of Book, items(:dvd)
401
- end
402
-
403
- def test_named_accessor_of_same_named_fixture
404
- assert_kind_of Joke, funny_jokes(:a_joke)
405
- end
406
- end
407
-
408
- class CustomConnectionFixturesTest < ActiveRecord::TestCase
409
- set_fixture_class :courses => Course
410
- fixtures :courses
411
- # Set to false to blow away fixtures cache and ensure our fixtures are loaded
412
- # and thus takes into account our set_fixture_class
413
- self.use_transactional_fixtures = false
414
-
415
- def test_connection
416
- assert_kind_of Course, courses(:ruby)
417
- assert_equal Course.connection, courses(:ruby).connection
418
- end
419
- end
420
-
421
- class InvalidTableNameFixturesTest < ActiveRecord::TestCase
422
- fixtures :funny_jokes
423
- # Set to false to blow away fixtures cache and ensure our fixtures are loaded
424
- # and thus takes into account our lack of set_fixture_class
425
- self.use_transactional_fixtures = false
426
-
427
- def test_raises_error
428
- assert_raise FixtureClassNotFound do
429
- funny_jokes(:a_joke)
430
- end
431
- end
432
- end
433
-
434
- class CheckEscapedYamlFixturesTest < ActiveRecord::TestCase
435
- set_fixture_class :funny_jokes => 'Joke'
436
- fixtures :funny_jokes
437
- # Set to false to blow away fixtures cache and ensure our fixtures are loaded
438
- # and thus takes into account our set_fixture_class
439
- self.use_transactional_fixtures = false
440
-
441
- def test_proper_escaped_fixture
442
- assert_equal "The \\n Aristocrats\nAte the candy\n", funny_jokes(:another_joke).name
443
- end
444
- end
445
-
446
- class DevelopersProject; end
447
- class ManyToManyFixturesWithClassDefined < ActiveRecord::TestCase
448
- fixtures :developers_projects
449
-
450
- def test_this_should_run_cleanly
451
- assert true
452
- end
453
- end
454
-
455
- class FixturesBrokenRollbackTest < ActiveRecord::TestCase
456
- def blank_setup; end
457
- alias_method :ar_setup_fixtures, :setup_fixtures
458
- alias_method :setup_fixtures, :blank_setup
459
- alias_method :setup, :blank_setup
460
-
461
- def blank_teardown; end
462
- alias_method :ar_teardown_fixtures, :teardown_fixtures
463
- alias_method :teardown_fixtures, :blank_teardown
464
- alias_method :teardown, :blank_teardown
465
-
466
- def test_no_rollback_in_teardown_unless_transaction_active
467
- assert_equal 0, ActiveRecord::Base.connection.open_transactions
468
- assert_raise(RuntimeError) { ar_setup_fixtures }
469
- assert_equal 0, ActiveRecord::Base.connection.open_transactions
470
- assert_nothing_raised { ar_teardown_fixtures }
471
- assert_equal 0, ActiveRecord::Base.connection.open_transactions
472
- end
473
-
474
- private
475
- def load_fixtures
476
- raise 'argh'
477
- end
478
- end
479
-
480
- class LoadAllFixturesTest < ActiveRecord::TestCase
481
- self.fixture_path = FIXTURES_ROOT + "/all"
482
- fixtures :all
483
-
484
- def test_all_there
485
- assert_equal %w(developers people tasks), fixture_table_names.sort
486
- end
487
- end
488
-
489
- class FasterFixturesTest < ActiveRecord::TestCase
490
- fixtures :categories, :authors
491
-
492
- def load_extra_fixture(name)
493
- fixture = create_fixtures(name)
494
- assert fixture.is_a?(Fixtures)
495
- @loaded_fixtures[fixture.table_name] = fixture
496
- end
497
-
498
- def test_cache
499
- assert Fixtures.fixture_is_cached?(ActiveRecord::Base.connection, 'categories')
500
- assert Fixtures.fixture_is_cached?(ActiveRecord::Base.connection, 'authors')
501
-
502
- assert_no_queries do
503
- create_fixtures('categories')
504
- create_fixtures('authors')
505
- end
506
-
507
- load_extra_fixture('posts')
508
- assert Fixtures.fixture_is_cached?(ActiveRecord::Base.connection, 'posts')
509
- self.class.setup_fixture_accessors('posts')
510
- assert_equal 'Welcome to the weblog', posts(:welcome).title
511
- end
512
- end
513
-
514
- class FoxyFixturesTest < ActiveRecord::TestCase
515
- fixtures :parrots, :parrots_pirates, :pirates, :treasures, :mateys, :ships, :computers, :developers
516
-
517
- def test_identifies_strings
518
- assert_equal(Fixtures.identify("foo"), Fixtures.identify("foo"))
519
- assert_not_equal(Fixtures.identify("foo"), Fixtures.identify("FOO"))
520
- end
521
-
522
- def test_identifies_symbols
523
- assert_equal(Fixtures.identify(:foo), Fixtures.identify(:foo))
524
- end
525
-
526
- def test_identifies_consistently
527
- assert_equal 207281424, Fixtures.identify(:ruby)
528
- assert_equal 1066363776, Fixtures.identify(:sapphire_2)
529
- end
530
-
531
- TIMESTAMP_COLUMNS = %w(created_at created_on updated_at updated_on)
532
-
533
- def test_populates_timestamp_columns
534
- TIMESTAMP_COLUMNS.each do |property|
535
- assert_not_nil(parrots(:george).send(property), "should set #{property}")
536
- end
537
- end
538
-
539
- def test_does_not_populate_timestamp_columns_if_model_has_set_record_timestamps_to_false
540
- TIMESTAMP_COLUMNS.each do |property|
541
- assert_nil(ships(:black_pearl).send(property), "should not set #{property}")
542
- end
543
- end
544
-
545
- def test_populates_all_columns_with_the_same_time
546
- last = nil
547
-
548
- TIMESTAMP_COLUMNS.each do |property|
549
- current = parrots(:george).send(property)
550
- last ||= current
551
-
552
- assert_equal(last, current)
553
- last = current
554
- end
555
- end
556
-
557
- def test_only_populates_columns_that_exist
558
- assert_not_nil(pirates(:blackbeard).created_on)
559
- assert_not_nil(pirates(:blackbeard).updated_on)
560
- end
561
-
562
- def test_preserves_existing_fixture_data
563
- assert_equal(2.weeks.ago.to_date, pirates(:redbeard).created_on.to_date)
564
- assert_equal(2.weeks.ago.to_date, pirates(:redbeard).updated_on.to_date)
565
- end
566
-
567
- def test_generates_unique_ids
568
- assert_not_nil(parrots(:george).id)
569
- assert_not_equal(parrots(:george).id, parrots(:louis).id)
570
- end
571
-
572
- def test_automatically_sets_primary_key
573
- assert_not_nil(ships(:black_pearl))
574
- end
575
-
576
- def test_preserves_existing_primary_key
577
- assert_equal(2, ships(:interceptor).id)
578
- end
579
-
580
- def test_resolves_belongs_to_symbols
581
- assert_equal(parrots(:george), pirates(:blackbeard).parrot)
582
- end
583
-
584
- def test_ignores_belongs_to_symbols_if_association_and_foreign_key_are_named_the_same
585
- assert_equal(developers(:david), computers(:workstation).developer)
586
- end
587
-
588
- def test_supports_join_tables
589
- assert(pirates(:blackbeard).parrots.include?(parrots(:george)))
590
- assert(pirates(:blackbeard).parrots.include?(parrots(:louis)))
591
- assert(parrots(:george).pirates.include?(pirates(:blackbeard)))
592
- end
593
-
594
- def test_supports_inline_habtm
595
- assert(parrots(:george).treasures.include?(treasures(:diamond)))
596
- assert(parrots(:george).treasures.include?(treasures(:sapphire)))
597
- assert(!parrots(:george).treasures.include?(treasures(:ruby)))
598
- end
599
-
600
- def test_supports_inline_habtm_with_specified_id
601
- assert(parrots(:polly).treasures.include?(treasures(:ruby)))
602
- assert(parrots(:polly).treasures.include?(treasures(:sapphire)))
603
- assert(!parrots(:polly).treasures.include?(treasures(:diamond)))
604
- end
605
-
606
- def test_supports_yaml_arrays
607
- assert(parrots(:louis).treasures.include?(treasures(:diamond)))
608
- assert(parrots(:louis).treasures.include?(treasures(:sapphire)))
609
- end
610
-
611
- def test_strips_DEFAULTS_key
612
- assert_raise(StandardError) { parrots(:DEFAULTS) }
613
-
614
- # this lets us do YAML defaults and not have an extra fixture entry
615
- %w(sapphire ruby).each { |t| assert(parrots(:davey).treasures.include?(treasures(t))) }
616
- end
617
-
618
- def test_supports_label_interpolation
619
- assert_equal("frederick", parrots(:frederick).name)
620
- end
621
-
622
- def test_supports_polymorphic_belongs_to
623
- assert_equal(pirates(:redbeard), treasures(:sapphire).looter)
624
- assert_equal(parrots(:louis), treasures(:ruby).looter)
625
- end
626
-
627
- def test_only_generates_a_pk_if_necessary
628
- m = Matey.find(:first)
629
- m.pirate = pirates(:blackbeard)
630
- m.target = pirates(:redbeard)
631
- end
632
-
633
- def test_supports_sti
634
- assert_kind_of DeadParrot, parrots(:polly)
635
- assert_equal pirates(:blackbeard), parrots(:polly).killer
636
- end
637
- end
638
-
639
- class ActiveSupportSubclassWithFixturesTest < ActiveRecord::TestCase
640
- fixtures :parrots
641
-
642
- # This seemingly useless assertion catches a bug that caused the fixtures
643
- # setup code call nil[]
644
- def test_foo
645
- assert_equal parrots(:louis), Parrot.find_by_name("King Louis")
646
- end
647
- end
648
-
649
- class FixtureLoadingTest < ActiveRecord::TestCase
650
- def test_logs_message_for_failed_dependency_load
651
- ActiveRecord::TestCase.expects(:require_dependency).with(:does_not_exist).raises(LoadError)
652
- ActiveRecord::Base.logger.expects(:warn)
653
- ActiveRecord::TestCase.try_to_load_dependency(:does_not_exist)
654
- end
655
-
656
- def test_does_not_logs_message_for_successful_dependency_load
657
- ActiveRecord::TestCase.expects(:require_dependency).with(:works_out_fine)
658
- ActiveRecord::Base.logger.expects(:warn).never
659
- ActiveRecord::TestCase.try_to_load_dependency(:works_out_fine)
660
- end
661
- end