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,360 +0,0 @@
1
- require "cases/helper"
2
- require 'models/post'
3
- require 'models/person'
4
- require 'models/reference'
5
- require 'models/job'
6
- require 'models/reader'
7
- require 'models/comment'
8
- require 'models/tag'
9
- require 'models/tagging'
10
- require 'models/author'
11
- require 'models/owner'
12
- require 'models/pet'
13
- require 'models/toy'
14
- require 'models/contract'
15
- require 'models/company'
16
- require 'models/developer'
17
-
18
- class HasManyThroughAssociationsTest < ActiveRecord::TestCase
19
- fixtures :posts, :readers, :people, :comments, :authors, :owners, :pets, :toys,
20
- :companies
21
-
22
- def test_associate_existing
23
- assert_queries(2) { posts(:thinking);people(:david) }
24
-
25
- posts(:thinking).people
26
-
27
- assert_queries(1) do
28
- posts(:thinking).people << people(:david)
29
- end
30
-
31
- assert_queries(1) do
32
- assert posts(:thinking).people.include?(people(:david))
33
- end
34
-
35
- assert posts(:thinking).reload.people(true).include?(people(:david))
36
- end
37
-
38
- def test_associating_new
39
- assert_queries(1) { posts(:thinking) }
40
- new_person = nil # so block binding catches it
41
-
42
- assert_queries(0) do
43
- new_person = Person.new :first_name => 'bob'
44
- end
45
-
46
- # Associating new records always saves them
47
- # Thus, 1 query for the new person record, 1 query for the new join table record
48
- assert_queries(2) do
49
- posts(:thinking).people << new_person
50
- end
51
-
52
- assert_queries(1) do
53
- assert posts(:thinking).people.include?(new_person)
54
- end
55
-
56
- assert posts(:thinking).reload.people(true).include?(new_person)
57
- end
58
-
59
- def test_associate_new_by_building
60
- assert_queries(1) { posts(:thinking) }
61
-
62
- assert_queries(0) do
63
- posts(:thinking).people.build(:first_name=>"Bob")
64
- posts(:thinking).people.new(:first_name=>"Ted")
65
- end
66
-
67
- # Should only need to load the association once
68
- assert_queries(1) do
69
- assert posts(:thinking).people.collect(&:first_name).include?("Bob")
70
- assert posts(:thinking).people.collect(&:first_name).include?("Ted")
71
- end
72
-
73
- # 2 queries for each new record (1 to save the record itself, 1 for the join model)
74
- # * 2 new records = 4
75
- # + 1 query to save the actual post = 5
76
- assert_queries(5) do
77
- posts(:thinking).body += '-changed'
78
- posts(:thinking).save
79
- end
80
-
81
- assert posts(:thinking).reload.people(true).collect(&:first_name).include?("Bob")
82
- assert posts(:thinking).reload.people(true).collect(&:first_name).include?("Ted")
83
- end
84
-
85
- def test_delete_association
86
- assert_queries(2){posts(:welcome);people(:michael); }
87
-
88
- assert_queries(1) do
89
- posts(:welcome).people.delete(people(:michael))
90
- end
91
-
92
- assert_queries(1) do
93
- assert posts(:welcome).people.empty?
94
- end
95
-
96
- assert posts(:welcome).reload.people(true).empty?
97
- end
98
-
99
- def test_destroy_association
100
- assert_difference "Person.count", -1 do
101
- posts(:welcome).people.destroy(people(:michael))
102
- end
103
-
104
- assert posts(:welcome).reload.people.empty?
105
- assert posts(:welcome).people(true).empty?
106
- end
107
-
108
- def test_destroy_all
109
- assert_difference "Person.count", -1 do
110
- posts(:welcome).people.destroy_all
111
- end
112
-
113
- assert posts(:welcome).reload.people.empty?
114
- assert posts(:welcome).people(true).empty?
115
- end
116
-
117
- def test_replace_association
118
- assert_queries(4){posts(:welcome);people(:david);people(:michael); posts(:welcome).people(true)}
119
-
120
- # 1 query to delete the existing reader (michael)
121
- # 1 query to associate the new reader (david)
122
- assert_queries(2) do
123
- posts(:welcome).people = [people(:david)]
124
- end
125
-
126
- assert_queries(0){
127
- assert posts(:welcome).people.include?(people(:david))
128
- assert !posts(:welcome).people.include?(people(:michael))
129
- }
130
-
131
- assert posts(:welcome).reload.people(true).include?(people(:david))
132
- assert !posts(:welcome).reload.people(true).include?(people(:michael))
133
- end
134
-
135
- def test_replace_order_is_preserved
136
- posts(:welcome).people.clear
137
- posts(:welcome).people = [people(:david), people(:michael)]
138
- assert_equal [people(:david).id, people(:michael).id], posts(:welcome).readers.all(:order => 'id').map(&:person_id)
139
-
140
- # Test the inverse order in case the first success was a coincidence
141
- posts(:welcome).people.clear
142
- posts(:welcome).people = [people(:michael), people(:david)]
143
- assert_equal [people(:michael).id, people(:david).id], posts(:welcome).readers.all(:order => 'id').map(&:person_id)
144
- end
145
-
146
- def test_replace_by_id_order_is_preserved
147
- posts(:welcome).people.clear
148
- posts(:welcome).person_ids = [people(:david).id, people(:michael).id]
149
- assert_equal [people(:david).id, people(:michael).id], posts(:welcome).readers.all(:order => 'id').map(&:person_id)
150
-
151
- # Test the inverse order in case the first success was a coincidence
152
- posts(:welcome).people.clear
153
- posts(:welcome).person_ids = [people(:michael).id, people(:david).id]
154
- assert_equal [people(:michael).id, people(:david).id], posts(:welcome).readers.all(:order => 'id').map(&:person_id)
155
- end
156
-
157
- def test_associate_with_create
158
- assert_queries(1) { posts(:thinking) }
159
-
160
- # 1 query for the new record, 1 for the join table record
161
- # No need to update the actual collection yet!
162
- assert_queries(2) do
163
- posts(:thinking).people.create(:first_name=>"Jeb")
164
- end
165
-
166
- # *Now* we actually need the collection so it's loaded
167
- assert_queries(1) do
168
- assert posts(:thinking).people.collect(&:first_name).include?("Jeb")
169
- end
170
-
171
- assert posts(:thinking).reload.people(true).collect(&:first_name).include?("Jeb")
172
- end
173
-
174
- def test_associate_with_create_and_no_options
175
- peeps = posts(:thinking).people.count
176
- posts(:thinking).people.create(:first_name => 'foo')
177
- assert_equal peeps + 1, posts(:thinking).people.count
178
- end
179
-
180
- def test_associate_with_create_exclamation_and_no_options
181
- peeps = posts(:thinking).people.count
182
- posts(:thinking).people.create!(:first_name => 'foo')
183
- assert_equal peeps + 1, posts(:thinking).people.count
184
- end
185
-
186
- def test_associate_with_create_and_invalid_options
187
- peeps = companies(:first_firm).developers.count
188
- assert_nothing_raised { companies(:first_firm).developers.create(:name => '0') }
189
- assert_equal peeps, companies(:first_firm).developers.count
190
- end
191
-
192
- def test_associate_with_create_and_valid_options
193
- peeps = companies(:first_firm).developers.count
194
- assert_nothing_raised { companies(:first_firm).developers.create(:name => 'developer') }
195
- assert_equal peeps + 1, companies(:first_firm).developers.count
196
- end
197
-
198
- def test_associate_with_create_bang_and_invalid_options
199
- peeps = companies(:first_firm).developers.count
200
- assert_raises(ActiveRecord::RecordInvalid) { companies(:first_firm).developers.create!(:name => '0') }
201
- assert_equal peeps, companies(:first_firm).developers.count
202
- end
203
-
204
- def test_associate_with_create_bang_and_valid_options
205
- peeps = companies(:first_firm).developers.count
206
- assert_nothing_raised { companies(:first_firm).developers.create!(:name => 'developer') }
207
- assert_equal peeps + 1, companies(:first_firm).developers.count
208
- end
209
-
210
- def test_clear_associations
211
- assert_queries(2) { posts(:welcome);posts(:welcome).people(true) }
212
-
213
- assert_queries(1) do
214
- posts(:welcome).people.clear
215
- end
216
-
217
- assert_queries(0) do
218
- assert posts(:welcome).people.empty?
219
- end
220
-
221
- assert posts(:welcome).reload.people(true).empty?
222
- end
223
-
224
- def test_association_callback_ordering
225
- Post.reset_log
226
- log = Post.log
227
- post = posts(:thinking)
228
-
229
- post.people_with_callbacks << people(:michael)
230
- assert_equal [
231
- [:added, :before, "Michael"],
232
- [:added, :after, "Michael"]
233
- ], log.last(2)
234
-
235
- post.people_with_callbacks.push(people(:david), Person.create!(:first_name => "Bob"), Person.new(:first_name => "Lary"))
236
- assert_equal [
237
- [:added, :before, "David"],
238
- [:added, :after, "David"],
239
- [:added, :before, "Bob"],
240
- [:added, :after, "Bob"],
241
- [:added, :before, "Lary"],
242
- [:added, :after, "Lary"]
243
- ],log.last(6)
244
-
245
- post.people_with_callbacks.build(:first_name => "Ted")
246
- assert_equal [
247
- [:added, :before, "Ted"],
248
- [:added, :after, "Ted"]
249
- ], log.last(2)
250
-
251
- post.people_with_callbacks.create(:first_name => "Sam")
252
- assert_equal [
253
- [:added, :before, "Sam"],
254
- [:added, :after, "Sam"]
255
- ], log.last(2)
256
-
257
- post.people_with_callbacks = [people(:michael),people(:david), Person.new(:first_name => "Julian"), Person.create!(:first_name => "Roger")]
258
- assert_equal (%w(Ted Bob Sam Lary) * 2).sort, log[-12..-5].collect(&:last).sort
259
- assert_equal [
260
- [:added, :before, "Julian"],
261
- [:added, :after, "Julian"],
262
- [:added, :before, "Roger"],
263
- [:added, :after, "Roger"]
264
- ], log.last(4)
265
-
266
- post.people_with_callbacks.clear
267
- assert_equal (%w(Michael David Julian Roger) * 2).sort, log.last(8).collect(&:last).sort
268
- end
269
-
270
- def test_dynamic_find_should_respect_association_include
271
- # SQL error in sort clause if :include is not included
272
- # due to Unknown column 'comments.id'
273
- assert Person.find(1).posts_with_comments_sorted_by_comment_id.find_by_title('Welcome to the weblog')
274
- end
275
-
276
- def test_count_with_include_should_alias_join_table
277
- assert_equal 2, people(:michael).posts.count(:include => :readers)
278
- end
279
-
280
- def test_inner_join_with_quoted_table_name
281
- assert_equal 2, people(:michael).jobs.size
282
- end
283
-
284
- def test_get_ids
285
- assert_equal [posts(:welcome).id, posts(:authorless).id].sort, people(:michael).post_ids.sort
286
- end
287
-
288
- def test_get_ids_for_loaded_associations
289
- person = people(:michael)
290
- person.posts(true)
291
- assert_queries(0) do
292
- person.post_ids
293
- person.post_ids
294
- end
295
- end
296
-
297
- def test_get_ids_for_unloaded_associations_does_not_load_them
298
- person = people(:michael)
299
- assert !person.posts.loaded?
300
- assert_equal [posts(:welcome).id, posts(:authorless).id].sort, person.post_ids.sort
301
- assert !person.posts.loaded?
302
- end
303
-
304
- def test_association_proxy_transaction_method_starts_transaction_in_association_class
305
- Tag.expects(:transaction)
306
- Post.find(:first).tags.transaction do
307
- # nothing
308
- end
309
- end
310
-
311
- def test_has_many_association_through_a_belongs_to_association_where_the_association_doesnt_exist
312
- author = authors(:mary)
313
- post = Post.create!(:title => "TITLE", :body => "BODY")
314
- assert_equal [], post.author_favorites
315
- end
316
-
317
- def test_has_many_association_through_a_belongs_to_association
318
- author = authors(:mary)
319
- post = Post.create!(:author => author, :title => "TITLE", :body => "BODY")
320
- author.author_favorites.create(:favorite_author_id => 1)
321
- author.author_favorites.create(:favorite_author_id => 2)
322
- author.author_favorites.create(:favorite_author_id => 3)
323
- assert_equal post.author.author_favorites, post.author_favorites
324
- end
325
-
326
- def test_has_many_association_through_a_has_many_association_with_nonstandard_primary_keys
327
- assert_equal 1, owners(:blackbeard).toys.count
328
- end
329
-
330
- def test_find_on_has_many_association_collection_with_include_and_conditions
331
- post_with_no_comments = people(:michael).posts_with_no_comments.first
332
- assert_equal post_with_no_comments, posts(:authorless)
333
- end
334
-
335
- def test_has_many_through_has_one_reflection
336
- assert_equal [comments(:eager_sti_on_associations_vs_comment)], authors(:david).very_special_comments
337
- end
338
-
339
- def test_modifying_has_many_through_has_one_reflection_should_raise
340
- [
341
- lambda { authors(:david).very_special_comments = [VerySpecialComment.create!(:body => "Gorp!", :post_id => 1011), VerySpecialComment.create!(:body => "Eep!", :post_id => 1012)] },
342
- lambda { authors(:david).very_special_comments << VerySpecialComment.create!(:body => "Hoohah!", :post_id => 1013) },
343
- lambda { authors(:david).very_special_comments.delete(authors(:david).very_special_comments.first) },
344
- ].each {|block| assert_raise(ActiveRecord::HasManyThroughCantAssociateThroughHasOneOrManyReflection, &block) }
345
- end
346
-
347
- def test_include_method_in_association_through_should_return_true_for_instance_added_with_build
348
- person = Person.new
349
- reference = person.references.build
350
- job = reference.build_job
351
- assert person.jobs.include?(job)
352
- end
353
-
354
- def test_include_method_in_association_through_should_return_true_for_instance_added_with_nested_builds
355
- author = Author.new
356
- post = author.posts.build
357
- comment = post.comments.build
358
- assert author.comments.include?(comment)
359
- end
360
- end
@@ -1,330 +0,0 @@
1
- require "cases/helper"
2
- require 'models/developer'
3
- require 'models/project'
4
- require 'models/company'
5
-
6
- class HasOneAssociationsTest < ActiveRecord::TestCase
7
- fixtures :accounts, :companies, :developers, :projects, :developers_projects
8
-
9
- def setup
10
- Account.destroyed_account_ids.clear
11
- end
12
-
13
- def test_has_one
14
- assert_equal companies(:first_firm).account, Account.find(1)
15
- assert_equal Account.find(1).credit_limit, companies(:first_firm).account.credit_limit
16
- end
17
-
18
- def test_has_one_cache_nils
19
- firm = companies(:another_firm)
20
- assert_queries(1) { assert_nil firm.account }
21
- assert_queries(0) { assert_nil firm.account }
22
-
23
- firms = Firm.find(:all, :include => :account)
24
- assert_queries(0) { firms.each(&:account) }
25
- end
26
-
27
- def test_with_select
28
- assert_equal Firm.find(1).account_with_select.attributes.size, 2
29
- assert_equal Firm.find(1, :include => :account_with_select).account_with_select.attributes.size, 2
30
- end
31
-
32
- def test_finding_using_primary_key
33
- firm = companies(:first_firm)
34
- assert_equal Account.find_by_firm_id(firm.id), firm.account
35
- firm.firm_id = companies(:rails_core).id
36
- assert_equal accounts(:rails_core_account), firm.account_using_primary_key
37
- end
38
-
39
- def test_update_with_foreign_and_primary_keys
40
- firm = companies(:first_firm)
41
- account = firm.account_using_foreign_and_primary_keys
42
- assert_equal Account.find_by_firm_name(firm.name), account
43
- firm.save
44
- firm.reload
45
- assert_equal account, firm.account_using_foreign_and_primary_keys
46
- end
47
-
48
- def test_can_marshal_has_one_association_with_nil_target
49
- firm = Firm.new
50
- assert_nothing_raised do
51
- assert_equal firm.attributes, Marshal.load(Marshal.dump(firm)).attributes
52
- end
53
-
54
- firm.account
55
- assert_nothing_raised do
56
- assert_equal firm.attributes, Marshal.load(Marshal.dump(firm)).attributes
57
- end
58
- end
59
-
60
- def test_proxy_assignment
61
- company = companies(:first_firm)
62
- assert_nothing_raised { company.account = company.account }
63
- end
64
-
65
- def test_triple_equality
66
- assert Account === companies(:first_firm).account
67
- assert companies(:first_firm).account === Account
68
- end
69
-
70
- def test_type_mismatch
71
- assert_raise(ActiveRecord::AssociationTypeMismatch) { companies(:first_firm).account = 1 }
72
- assert_raise(ActiveRecord::AssociationTypeMismatch) { companies(:first_firm).account = Project.find(1) }
73
- end
74
-
75
- def test_natural_assignment
76
- apple = Firm.create("name" => "Apple")
77
- citibank = Account.create("credit_limit" => 10)
78
- apple.account = citibank
79
- assert_equal apple.id, citibank.firm_id
80
- end
81
-
82
- def test_natural_assignment_to_nil
83
- old_account_id = companies(:first_firm).account.id
84
- companies(:first_firm).account = nil
85
- companies(:first_firm).save
86
- assert_nil companies(:first_firm).account
87
- # account is dependent, therefore is destroyed when reference to owner is lost
88
- assert_raise(ActiveRecord::RecordNotFound) { Account.find(old_account_id) }
89
- end
90
-
91
- def test_nullification_on_association_change
92
- firm = companies(:rails_core)
93
- old_account_id = firm.account.id
94
- firm.account = Account.new
95
- # account is dependent with nullify, therefore its firm_id should be nil
96
- assert_nil Account.find(old_account_id).firm_id
97
- end
98
-
99
- def test_association_changecalls_delete
100
- companies(:first_firm).deletable_account = Account.new
101
- assert_equal [], Account.destroyed_account_ids[companies(:first_firm).id]
102
- end
103
-
104
- def test_association_change_calls_destroy
105
- companies(:first_firm).account = Account.new
106
- assert_equal [companies(:first_firm).id], Account.destroyed_account_ids[companies(:first_firm).id]
107
- end
108
-
109
- def test_natural_assignment_to_already_associated_record
110
- company = companies(:first_firm)
111
- account = accounts(:signals37)
112
- assert_equal company.account, account
113
- company.account = account
114
- company.reload
115
- account.reload
116
- assert_equal company.account, account
117
- end
118
-
119
- def test_assignment_without_replacement
120
- apple = Firm.create("name" => "Apple")
121
- citibank = Account.create("credit_limit" => 10)
122
- apple.account = citibank
123
- assert_equal apple.id, citibank.firm_id
124
-
125
- hsbc = apple.build_account({ :credit_limit => 20}, false)
126
- assert_equal apple.id, hsbc.firm_id
127
- hsbc.save
128
- assert_equal apple.id, citibank.firm_id
129
-
130
- nykredit = apple.create_account({ :credit_limit => 30}, false)
131
- assert_equal apple.id, nykredit.firm_id
132
- assert_equal apple.id, citibank.firm_id
133
- assert_equal apple.id, hsbc.firm_id
134
- end
135
-
136
- def test_assignment_without_replacement_on_create
137
- apple = Firm.create("name" => "Apple")
138
- citibank = Account.create("credit_limit" => 10)
139
- apple.account = citibank
140
- assert_equal apple.id, citibank.firm_id
141
-
142
- hsbc = apple.create_account({:credit_limit => 10}, false)
143
- assert_equal apple.id, hsbc.firm_id
144
- hsbc.save
145
- assert_equal apple.id, citibank.firm_id
146
- end
147
-
148
- def test_dependence
149
- num_accounts = Account.count
150
-
151
- firm = Firm.find(1)
152
- assert !firm.account.nil?
153
- account_id = firm.account.id
154
- assert_equal [], Account.destroyed_account_ids[firm.id]
155
-
156
- firm.destroy
157
- assert_equal num_accounts - 1, Account.count
158
- assert_equal [account_id], Account.destroyed_account_ids[firm.id]
159
- end
160
-
161
- def test_exclusive_dependence
162
- num_accounts = Account.count
163
-
164
- firm = ExclusivelyDependentFirm.find(9)
165
- assert !firm.account.nil?
166
- account_id = firm.account.id
167
- assert_equal [], Account.destroyed_account_ids[firm.id]
168
-
169
- firm.destroy
170
- assert_equal num_accounts - 1, Account.count
171
- assert_equal [], Account.destroyed_account_ids[firm.id]
172
- end
173
-
174
- def test_dependence_with_nil_associate
175
- firm = DependentFirm.new(:name => 'nullify')
176
- firm.save!
177
- assert_nothing_raised { firm.destroy }
178
- end
179
-
180
- def test_succesful_build_association
181
- firm = Firm.new("name" => "GlobalMegaCorp")
182
- firm.save
183
-
184
- account = firm.build_account("credit_limit" => 1000)
185
- assert account.save
186
- assert_equal account, firm.account
187
- end
188
-
189
- def test_failing_build_association
190
- firm = Firm.new("name" => "GlobalMegaCorp")
191
- firm.save
192
-
193
- account = firm.build_account
194
- assert !account.save
195
- assert_equal "can't be empty", account.errors.on("credit_limit")
196
- end
197
-
198
- def test_build_association_twice_without_saving_affects_nothing
199
- count_of_account = Account.count
200
- firm = Firm.find(:first)
201
- account1 = firm.build_account("credit_limit" => 1000)
202
- account2 = firm.build_account("credit_limit" => 2000)
203
-
204
- assert_equal count_of_account, Account.count
205
- end
206
-
207
- def test_create_association
208
- firm = Firm.create(:name => "GlobalMegaCorp")
209
- account = firm.create_account(:credit_limit => 1000)
210
- assert_equal account, firm.reload.account
211
- end
212
-
213
- def test_build
214
- firm = Firm.new("name" => "GlobalMegaCorp")
215
- firm.save
216
-
217
- firm.account = account = Account.new("credit_limit" => 1000)
218
- assert_equal account, firm.account
219
- assert account.save
220
- assert_equal account, firm.account
221
- end
222
-
223
- def test_failing_build_association
224
- firm = Firm.new("name" => "GlobalMegaCorp")
225
- firm.save
226
-
227
- firm.account = account = Account.new
228
- assert_equal account, firm.account
229
- assert !account.save
230
- assert_equal account, firm.account
231
- assert_equal "can't be empty", account.errors.on("credit_limit")
232
- end
233
-
234
- def test_create
235
- firm = Firm.new("name" => "GlobalMegaCorp")
236
- firm.save
237
- firm.account = account = Account.create("credit_limit" => 1000)
238
- assert_equal account, firm.account
239
- end
240
-
241
- def test_create_before_save
242
- firm = Firm.new("name" => "GlobalMegaCorp")
243
- firm.account = account = Account.create("credit_limit" => 1000)
244
- assert_equal account, firm.account
245
- end
246
-
247
- def test_dependence_with_missing_association
248
- Account.destroy_all
249
- firm = Firm.find(1)
250
- assert firm.account.nil?
251
- firm.destroy
252
- end
253
-
254
- def test_dependence_with_missing_association_and_nullify
255
- Account.destroy_all
256
- firm = DependentFirm.find(:first)
257
- assert firm.account.nil?
258
- firm.destroy
259
- end
260
-
261
- def test_finding_with_interpolated_condition
262
- firm = Firm.find(:first)
263
- superior = firm.clients.create(:name => 'SuperiorCo')
264
- superior.rating = 10
265
- superior.save
266
- assert_equal 10, firm.clients_with_interpolated_conditions.first.rating
267
- end
268
-
269
- def test_assignment_before_child_saved
270
- firm = Firm.find(1)
271
- firm.account = a = Account.new("credit_limit" => 1000)
272
- assert !a.new_record?
273
- assert_equal a, firm.account
274
- assert_equal a, firm.account
275
- assert_equal a, firm.account(true)
276
- end
277
-
278
- def test_save_still_works_after_accessing_nil_has_one
279
- jp = Company.new :name => 'Jaded Pixel'
280
- jp.dummy_account.nil?
281
-
282
- assert_nothing_raised do
283
- jp.save!
284
- end
285
- end
286
-
287
- def test_cant_save_readonly_association
288
- assert_raise(ActiveRecord::ReadOnlyRecord) { companies(:first_firm).readonly_account.save! }
289
- assert companies(:first_firm).readonly_account.readonly?
290
- end
291
-
292
- def test_has_one_proxy_should_not_respond_to_private_methods
293
- assert_raise(NoMethodError) { accounts(:signals37).private_method }
294
- assert_raise(NoMethodError) { companies(:first_firm).account.private_method }
295
- end
296
-
297
- def test_has_one_proxy_should_respond_to_private_methods_via_send
298
- accounts(:signals37).send(:private_method)
299
- companies(:first_firm).account.send(:private_method)
300
- end
301
-
302
- def test_save_of_record_with_loaded_has_one
303
- @firm = companies(:first_firm)
304
- assert_not_nil @firm.account
305
-
306
- assert_nothing_raised do
307
- Firm.find(@firm.id).save!
308
- Firm.find(@firm.id, :include => :account).save!
309
- end
310
-
311
- @firm.account.destroy
312
-
313
- assert_nothing_raised do
314
- Firm.find(@firm.id).save!
315
- Firm.find(@firm.id, :include => :account).save!
316
- end
317
- end
318
-
319
- def test_build_respects_hash_condition
320
- account = companies(:first_firm).build_account_limit_500_with_hash_conditions
321
- assert account.save
322
- assert_equal 500, account.credit_limit
323
- end
324
-
325
- def test_create_respects_hash_condition
326
- account = companies(:first_firm).create_account_limit_500_with_hash_conditions
327
- assert !account.new_record?
328
- assert_equal 500, account.credit_limit
329
- end
330
- end