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,24 +0,0 @@
1
- require 'cases/helper'
2
-
3
- class PostgresqlActiveSchemaTest < Test::Unit::TestCase
4
- def setup
5
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.class_eval do
6
- alias_method :real_execute, :execute
7
- def execute(sql, name = nil) sql end
8
- end
9
- end
10
-
11
- def teardown
12
- ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.send(:alias_method, :execute, :real_execute)
13
- end
14
-
15
- def test_create_database_with_encoding
16
- assert_equal %(CREATE DATABASE "matt" ENCODING = 'utf8'), create_database(:matt)
17
- assert_equal %(CREATE DATABASE "aimonetti" ENCODING = 'latin1'), create_database(:aimonetti, :encoding => :latin1)
18
- end
19
-
20
- private
21
- def method_missing(method_symbol, *arguments)
22
- ActiveRecord::Base.connection.send(method_symbol, *arguments)
23
- end
24
- end
@@ -1,144 +0,0 @@
1
- require "cases/helper"
2
-
3
- class AdapterTest < ActiveRecord::TestCase
4
- def setup
5
- @connection = ActiveRecord::Base.connection
6
- end
7
-
8
- def test_tables
9
- tables = @connection.tables
10
- assert tables.include?("accounts")
11
- assert tables.include?("authors")
12
- assert tables.include?("tasks")
13
- assert tables.include?("topics")
14
- end
15
-
16
- def test_table_exists?
17
- assert @connection.table_exists?("accounts")
18
- assert !@connection.table_exists?("nonexistingtable")
19
- end
20
-
21
- def test_indexes
22
- idx_name = "accounts_idx"
23
-
24
- if @connection.respond_to?(:indexes)
25
- indexes = @connection.indexes("accounts")
26
- assert indexes.empty?
27
-
28
- @connection.add_index :accounts, :firm_id, :name => idx_name
29
- indexes = @connection.indexes("accounts")
30
- assert_equal "accounts", indexes.first.table
31
- # OpenBase does not have the concept of a named index
32
- # Indexes are merely properties of columns.
33
- assert_equal idx_name, indexes.first.name unless current_adapter?(:OpenBaseAdapter)
34
- assert !indexes.first.unique
35
- assert_equal ["firm_id"], indexes.first.columns
36
- else
37
- warn "#{@connection.class} does not respond to #indexes"
38
- end
39
-
40
- ensure
41
- @connection.remove_index(:accounts, :name => idx_name) rescue nil
42
- end
43
-
44
- def test_current_database
45
- if @connection.respond_to?(:current_database)
46
- assert_equal ENV['ARUNIT_DB_NAME'] || "activerecord_unittest", @connection.current_database
47
- end
48
- end
49
-
50
- if current_adapter?(:MysqlAdapter)
51
- def test_charset
52
- assert_not_nil @connection.charset
53
- assert_not_equal 'character_set_database', @connection.charset
54
- assert_equal @connection.show_variable('character_set_database'), @connection.charset
55
- end
56
-
57
- def test_collation
58
- assert_not_nil @connection.collation
59
- assert_not_equal 'collation_database', @connection.collation
60
- assert_equal @connection.show_variable('collation_database'), @connection.collation
61
- end
62
-
63
- def test_show_nonexistent_variable_returns_nil
64
- assert_nil @connection.show_variable('foo_bar_baz')
65
- end
66
-
67
- def test_not_specifying_database_name_for_cross_database_selects
68
- begin
69
- assert_nothing_raised do
70
- ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['arunit'].except(:database))
71
- ActiveRecord::Base.connection.execute "SELECT activerecord_unittest.pirates.*, activerecord_unittest2.courses.* FROM activerecord_unittest.pirates, activerecord_unittest2.courses"
72
- end
73
- ensure
74
- ActiveRecord::Base.establish_connection 'arunit'
75
- end
76
- end
77
- end
78
-
79
- if current_adapter?(:PostgreSQLAdapter)
80
- def test_encoding
81
- assert_not_nil @connection.encoding
82
- end
83
- end
84
-
85
- def test_table_alias
86
- def @connection.test_table_alias_length() 10; end
87
- class << @connection
88
- alias_method :old_table_alias_length, :table_alias_length
89
- alias_method :table_alias_length, :test_table_alias_length
90
- end
91
-
92
- assert_equal 'posts', @connection.table_alias_for('posts')
93
- assert_equal 'posts_comm', @connection.table_alias_for('posts_comments')
94
- assert_equal 'dbo_posts', @connection.table_alias_for('dbo.posts')
95
-
96
- class << @connection
97
- remove_method :table_alias_length
98
- alias_method :table_alias_length, :old_table_alias_length
99
- end
100
- end
101
-
102
- # test resetting sequences in odd tables in postgreSQL
103
- if ActiveRecord::Base.connection.respond_to?(:reset_pk_sequence!)
104
- require 'models/movie'
105
- require 'models/subscriber'
106
-
107
- def test_reset_empty_table_with_custom_pk
108
- Movie.delete_all
109
- Movie.connection.reset_pk_sequence! 'movies'
110
- assert_equal 1, Movie.create(:name => 'fight club').id
111
- end
112
-
113
- if ActiveRecord::Base.connection.adapter_name != "FrontBase"
114
- def test_reset_table_with_non_integer_pk
115
- Subscriber.delete_all
116
- Subscriber.connection.reset_pk_sequence! 'subscribers'
117
- sub = Subscriber.new(:name => 'robert drake')
118
- sub.id = 'bob drake'
119
- assert_nothing_raised { sub.save! }
120
- end
121
- end
122
- end
123
-
124
- def test_add_limit_offset_should_sanitize_sql_injection_for_limit_without_comas
125
- sql_inject = "1 select * from schema"
126
- assert_equal " LIMIT 1", @connection.add_limit_offset!("", :limit=>sql_inject)
127
- if current_adapter?(:MysqlAdapter)
128
- assert_equal " LIMIT 7, 1", @connection.add_limit_offset!("", :limit=>sql_inject, :offset=>7)
129
- else
130
- assert_equal " LIMIT 1 OFFSET 7", @connection.add_limit_offset!("", :limit=>sql_inject, :offset=>7)
131
- end
132
- end
133
-
134
- def test_add_limit_offset_should_sanitize_sql_injection_for_limit_with_comas
135
- sql_inject = "1, 7 procedure help()"
136
- if current_adapter?(:MysqlAdapter)
137
- assert_equal " LIMIT 1,7", @connection.add_limit_offset!("", :limit=>sql_inject)
138
- assert_equal " LIMIT 7, 1", @connection.add_limit_offset!("", :limit=> '1 ; DROP TABLE USERS', :offset=>7)
139
- else
140
- assert_equal " LIMIT 1,7", @connection.add_limit_offset!("", :limit=>sql_inject)
141
- assert_equal " LIMIT 1,7 OFFSET 7", @connection.add_limit_offset!("", :limit=>sql_inject, :offset=>7)
142
- end
143
- end
144
- end
@@ -1,167 +0,0 @@
1
- require "cases/helper"
2
- require 'models/customer'
3
-
4
- class AggregationsTest < ActiveRecord::TestCase
5
- fixtures :customers
6
-
7
- def test_find_single_value_object
8
- assert_equal 50, customers(:david).balance.amount
9
- assert_kind_of Money, customers(:david).balance
10
- assert_equal 300, customers(:david).balance.exchange_to("DKK").amount
11
- end
12
-
13
- def test_find_multiple_value_object
14
- assert_equal customers(:david).address_street, customers(:david).address.street
15
- assert(
16
- customers(:david).address.close_to?(Address.new("Different Street", customers(:david).address_city, customers(:david).address_country))
17
- )
18
- end
19
-
20
- def test_change_single_value_object
21
- customers(:david).balance = Money.new(100)
22
- customers(:david).save
23
- assert_equal 100, customers(:david).reload.balance.amount
24
- end
25
-
26
- def test_immutable_value_objects
27
- customers(:david).balance = Money.new(100)
28
- assert_raise(ActiveSupport::FrozenObjectError) { customers(:david).balance.instance_eval { @amount = 20 } }
29
- end
30
-
31
- def test_inferred_mapping
32
- assert_equal "35.544623640962634", customers(:david).gps_location.latitude
33
- assert_equal "-105.9309951055148", customers(:david).gps_location.longitude
34
-
35
- customers(:david).gps_location = GpsLocation.new("39x-110")
36
-
37
- assert_equal "39", customers(:david).gps_location.latitude
38
- assert_equal "-110", customers(:david).gps_location.longitude
39
-
40
- customers(:david).save
41
-
42
- customers(:david).reload
43
-
44
- assert_equal "39", customers(:david).gps_location.latitude
45
- assert_equal "-110", customers(:david).gps_location.longitude
46
- end
47
-
48
- def test_reloaded_instance_refreshes_aggregations
49
- assert_equal "35.544623640962634", customers(:david).gps_location.latitude
50
- assert_equal "-105.9309951055148", customers(:david).gps_location.longitude
51
-
52
- Customer.update_all("gps_location = '24x113'")
53
- customers(:david).reload
54
- assert_equal '24x113', customers(:david)['gps_location']
55
-
56
- assert_equal GpsLocation.new('24x113'), customers(:david).gps_location
57
- end
58
-
59
- def test_gps_equality
60
- assert GpsLocation.new('39x110') == GpsLocation.new('39x110')
61
- end
62
-
63
- def test_gps_inequality
64
- assert GpsLocation.new('39x110') != GpsLocation.new('39x111')
65
- end
66
-
67
- def test_allow_nil_gps_is_nil
68
- assert_equal nil, customers(:zaphod).gps_location
69
- end
70
-
71
- def test_allow_nil_gps_set_to_nil
72
- customers(:david).gps_location = nil
73
- customers(:david).save
74
- customers(:david).reload
75
- assert_equal nil, customers(:david).gps_location
76
- end
77
-
78
- def test_allow_nil_set_address_attributes_to_nil
79
- customers(:zaphod).address = nil
80
- assert_equal nil, customers(:zaphod).attributes[:address_street]
81
- assert_equal nil, customers(:zaphod).attributes[:address_city]
82
- assert_equal nil, customers(:zaphod).attributes[:address_country]
83
- end
84
-
85
- def test_allow_nil_address_set_to_nil
86
- customers(:zaphod).address = nil
87
- customers(:zaphod).save
88
- customers(:zaphod).reload
89
- assert_equal nil, customers(:zaphod).address
90
- end
91
-
92
- def test_nil_raises_error_when_allow_nil_is_false
93
- assert_raise(NoMethodError) { customers(:david).balance = nil }
94
- end
95
-
96
- def test_allow_nil_address_loaded_when_only_some_attributes_are_nil
97
- customers(:zaphod).address_street = nil
98
- customers(:zaphod).save
99
- customers(:zaphod).reload
100
- assert_kind_of Address, customers(:zaphod).address
101
- assert customers(:zaphod).address.street.nil?
102
- end
103
-
104
- def test_nil_assignment_results_in_nil
105
- customers(:david).gps_location = GpsLocation.new('39x111')
106
- assert_not_equal nil, customers(:david).gps_location
107
- customers(:david).gps_location = nil
108
- assert_equal nil, customers(:david).gps_location
109
- end
110
-
111
- def test_custom_constructor
112
- assert_equal 'Barney GUMBLE', customers(:barney).fullname.to_s
113
- assert_kind_of Fullname, customers(:barney).fullname
114
- end
115
-
116
- def test_custom_converter
117
- customers(:barney).fullname = 'Barnoit Gumbleau'
118
- assert_equal 'Barnoit GUMBLEAU', customers(:barney).fullname.to_s
119
- assert_kind_of Fullname, customers(:barney).fullname
120
- end
121
- end
122
-
123
- class DeprecatedAggregationsTest < ActiveRecord::TestCase
124
- class Person < ActiveRecord::Base; end
125
-
126
- def test_conversion_block_is_deprecated
127
- assert_deprecated 'conversion block has been deprecated' do
128
- Person.composed_of(:balance, :class_name => "Money", :mapping => %w(balance amount)) { |balance| balance.to_money }
129
- end
130
- end
131
-
132
- def test_conversion_block_used_when_converter_option_is_nil
133
- assert_deprecated 'conversion block has been deprecated' do
134
- Person.composed_of(:balance, :class_name => "Money", :mapping => %w(balance amount)) { |balance| balance.to_money }
135
- end
136
- assert_raise(NoMethodError) { Person.new.balance = 5 }
137
- end
138
-
139
- def test_converter_option_overrides_conversion_block
140
- assert_deprecated 'conversion block has been deprecated' do
141
- Person.composed_of(:balance, :class_name => "Money", :mapping => %w(balance amount), :converter => Proc.new { |balance| Money.new(balance) }) { |balance| balance.to_money }
142
- end
143
-
144
- person = Person.new
145
- assert_nothing_raised { person.balance = 5 }
146
- assert_equal 5, person.balance.amount
147
- assert_kind_of Money, person.balance
148
- end
149
- end
150
-
151
- class OverridingAggregationsTest < ActiveRecord::TestCase
152
- class Name; end
153
- class DifferentName; end
154
-
155
- class Person < ActiveRecord::Base
156
- composed_of :composed_of, :mapping => %w(person_first_name first_name)
157
- end
158
-
159
- class DifferentPerson < Person
160
- composed_of :composed_of, :class_name => 'DifferentName', :mapping => %w(different_person_first_name first_name)
161
- end
162
-
163
- def test_composed_of_aggregation_redefinition_reflections_should_differ_and_not_inherited
164
- assert_not_equal Person.reflect_on_aggregation(:composed_of),
165
- DifferentPerson.reflect_on_aggregation(:composed_of)
166
- end
167
- end
@@ -1,32 +0,0 @@
1
- require "cases/helper"
2
-
3
- if ActiveRecord::Base.connection.supports_migrations?
4
-
5
- class ActiveRecordSchemaTest < ActiveRecord::TestCase
6
- self.use_transactional_fixtures = false
7
-
8
- def setup
9
- @connection = ActiveRecord::Base.connection
10
- end
11
-
12
- def teardown
13
- @connection.drop_table :fruits rescue nil
14
- end
15
-
16
- def test_schema_define
17
- ActiveRecord::Schema.define(:version => 7) do
18
- create_table :fruits do |t|
19
- t.column :color, :string
20
- t.column :fruit_size, :string # NOTE: "size" is reserved in Oracle
21
- t.column :texture, :string
22
- t.column :flavor, :string
23
- end
24
- end
25
-
26
- assert_nothing_raised { @connection.select_all "SELECT * FROM fruits" }
27
- assert_nothing_raised { @connection.select_all "SELECT * FROM schema_migrations" }
28
- assert_equal 7, ActiveRecord::Migrator::current_version
29
- end
30
- end
31
-
32
- end
@@ -1,438 +0,0 @@
1
- require "cases/helper"
2
- require 'models/developer'
3
- require 'models/project'
4
- require 'models/company'
5
- require 'models/topic'
6
- require 'models/reply'
7
- require 'models/computer'
8
- require 'models/customer'
9
- require 'models/order'
10
- require 'models/post'
11
- require 'models/author'
12
- require 'models/tag'
13
- require 'models/tagging'
14
- require 'models/comment'
15
- require 'models/sponsor'
16
- require 'models/member'
17
- require 'models/essay'
18
-
19
- class BelongsToAssociationsTest < ActiveRecord::TestCase
20
- fixtures :accounts, :companies, :developers, :projects, :topics,
21
- :developers_projects, :computers, :authors, :posts, :tags, :taggings, :comments
22
-
23
- def test_belongs_to
24
- Client.find(3).firm.name
25
- assert_equal companies(:first_firm).name, Client.find(3).firm.name
26
- assert !Client.find(3).firm.nil?, "Microsoft should have a firm"
27
- end
28
-
29
- def test_belongs_to_with_primary_key
30
- client = Client.create(:name => "Primary key client", :firm_name => companies(:first_firm).name)
31
- assert_equal companies(:first_firm).name, client.firm_with_primary_key.name
32
- end
33
-
34
- def test_belongs_to_with_primary_key_joins_on_correct_column
35
- sql = Client.send(:construct_finder_sql, :joins => :firm_with_primary_key)
36
- assert sql !~ /\.id/
37
- assert sql =~ /\.name/
38
- end
39
-
40
- def test_proxy_assignment
41
- account = Account.find(1)
42
- assert_nothing_raised { account.firm = account.firm }
43
- end
44
-
45
- def test_triple_equality
46
- assert Client.find(3).firm === Firm
47
- assert Firm === Client.find(3).firm
48
- end
49
-
50
- def test_type_mismatch
51
- assert_raise(ActiveRecord::AssociationTypeMismatch) { Account.find(1).firm = 1 }
52
- assert_raise(ActiveRecord::AssociationTypeMismatch) { Account.find(1).firm = Project.find(1) }
53
- end
54
-
55
- def test_natural_assignment
56
- apple = Firm.create("name" => "Apple")
57
- citibank = Account.create("credit_limit" => 10)
58
- citibank.firm = apple
59
- assert_equal apple.id, citibank.firm_id
60
- end
61
-
62
- def test_natural_assignment_with_primary_key
63
- apple = Firm.create("name" => "Apple")
64
- citibank = Client.create("name" => "Primary key client")
65
- citibank.firm_with_primary_key = apple
66
- assert_equal apple.name, citibank.firm_name
67
- end
68
-
69
- def test_eager_loading_with_primary_key
70
- apple = Firm.create("name" => "Apple")
71
- citibank = Client.create("name" => "Citibank", :firm_name => "Apple")
72
- citibank_result = Client.find(:first, :conditions => {:name => "Citibank"}, :include => :firm_with_primary_key)
73
- assert_not_nil citibank_result.instance_variable_get("@firm_with_primary_key")
74
- end
75
-
76
- def test_no_unexpected_aliasing
77
- first_firm = companies(:first_firm)
78
- another_firm = companies(:another_firm)
79
-
80
- citibank = Account.create("credit_limit" => 10)
81
- citibank.firm = first_firm
82
- original_proxy = citibank.firm
83
- citibank.firm = another_firm
84
-
85
- assert_equal first_firm.object_id, original_proxy.target.object_id
86
- assert_equal another_firm.object_id, citibank.firm.target.object_id
87
- end
88
-
89
- def test_creating_the_belonging_object
90
- citibank = Account.create("credit_limit" => 10)
91
- apple = citibank.create_firm("name" => "Apple")
92
- assert_equal apple, citibank.firm
93
- citibank.save
94
- citibank.reload
95
- assert_equal apple, citibank.firm
96
- end
97
-
98
- def test_creating_the_belonging_object_with_primary_key
99
- client = Client.create(:name => "Primary key client")
100
- apple = client.create_firm_with_primary_key("name" => "Apple")
101
- assert_equal apple, client.firm_with_primary_key
102
- client.save
103
- client.reload
104
- assert_equal apple, client.firm_with_primary_key
105
- end
106
-
107
- def test_building_the_belonging_object
108
- citibank = Account.create("credit_limit" => 10)
109
- apple = citibank.build_firm("name" => "Apple")
110
- citibank.save
111
- assert_equal apple.id, citibank.firm_id
112
- end
113
-
114
- def test_building_the_belonging_object_with_primary_key
115
- client = Client.create(:name => "Primary key client")
116
- apple = client.build_firm_with_primary_key("name" => "Apple")
117
- client.save
118
- assert_equal apple.name, client.firm_name
119
- end
120
-
121
- def test_natural_assignment_to_nil
122
- client = Client.find(3)
123
- client.firm = nil
124
- client.save
125
- assert_nil client.firm(true)
126
- assert_nil client.client_of
127
- end
128
-
129
- def test_natural_assignment_to_nil_with_primary_key
130
- client = Client.create(:name => "Primary key client", :firm_name => companies(:first_firm).name)
131
- client.firm_with_primary_key = nil
132
- client.save
133
- assert_nil client.firm_with_primary_key(true)
134
- assert_nil client.client_of
135
- end
136
-
137
- def test_with_different_class_name
138
- assert_equal Company.find(1).name, Company.find(3).firm_with_other_name.name
139
- assert_not_nil Company.find(3).firm_with_other_name, "Microsoft should have a firm"
140
- end
141
-
142
- def test_with_condition
143
- assert_equal Company.find(1).name, Company.find(3).firm_with_condition.name
144
- assert_not_nil Company.find(3).firm_with_condition, "Microsoft should have a firm"
145
- end
146
-
147
- def test_with_select
148
- assert_equal Company.find(2).firm_with_select.attributes.size, 1
149
- assert_equal Company.find(2, :include => :firm_with_select ).firm_with_select.attributes.size, 1
150
- end
151
-
152
- def test_belongs_to_counter
153
- debate = Topic.create("title" => "debate")
154
- assert_equal 0, debate.send(:read_attribute, "replies_count"), "No replies yet"
155
-
156
- trash = debate.replies.create("title" => "blah!", "content" => "world around!")
157
- assert_equal 1, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply created"
158
-
159
- trash.destroy
160
- assert_equal 0, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply deleted"
161
- end
162
-
163
- def test_belongs_to_with_primary_key_counter
164
- debate = Topic.create("title" => "debate")
165
- assert_equal 0, debate.send(:read_attribute, "replies_count"), "No replies yet"
166
-
167
- trash = debate.replies_with_primary_key.create("title" => "blah!", "content" => "world around!")
168
- assert_equal 1, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply created"
169
-
170
- trash.destroy
171
- assert_equal 0, Topic.find(debate.id).send(:read_attribute, "replies_count"), "First reply deleted"
172
- end
173
-
174
- def test_belongs_to_counter_with_assigning_nil
175
- p = Post.find(1)
176
- c = Comment.find(1)
177
-
178
- assert_equal p.id, c.post_id
179
- assert_equal 2, Post.find(p.id).comments.size
180
-
181
- c.post = nil
182
-
183
- assert_equal 1, Post.find(p.id).comments.size
184
- end
185
-
186
- def test_belongs_to_with_primary_key_counter_with_assigning_nil
187
- debate = Topic.create("title" => "debate")
188
- reply = Reply.create("title" => "blah!", "content" => "world around!", "parent_title" => "debate")
189
-
190
- assert_equal debate.title, reply.parent_title
191
- assert_equal 1, Topic.find(debate.id).send(:read_attribute, "replies_count")
192
-
193
- reply.topic_with_primary_key = nil
194
-
195
- assert_equal 0, Topic.find(debate.id).send(:read_attribute, "replies_count")
196
- end
197
-
198
- def test_belongs_to_counter_with_reassigning
199
- t1 = Topic.create("title" => "t1")
200
- t2 = Topic.create("title" => "t2")
201
- r1 = Reply.new("title" => "r1", "content" => "r1")
202
- r1.topic = t1
203
-
204
- assert r1.save
205
- assert_equal 1, Topic.find(t1.id).replies.size
206
- assert_equal 0, Topic.find(t2.id).replies.size
207
-
208
- r1.topic = Topic.find(t2.id)
209
-
210
- assert r1.save
211
- assert_equal 0, Topic.find(t1.id).replies.size
212
- assert_equal 1, Topic.find(t2.id).replies.size
213
-
214
- r1.topic = nil
215
-
216
- assert_equal 0, Topic.find(t1.id).replies.size
217
- assert_equal 0, Topic.find(t2.id).replies.size
218
-
219
- r1.topic = t1
220
-
221
- assert_equal 1, Topic.find(t1.id).replies.size
222
- assert_equal 0, Topic.find(t2.id).replies.size
223
-
224
- r1.destroy
225
-
226
- assert_equal 0, Topic.find(t1.id).replies.size
227
- assert_equal 0, Topic.find(t2.id).replies.size
228
- end
229
-
230
- def test_belongs_to_reassign_with_namespaced_models_and_counters
231
- t1 = Web::Topic.create("title" => "t1")
232
- t2 = Web::Topic.create("title" => "t2")
233
- r1 = Web::Reply.new("title" => "r1", "content" => "r1")
234
- r1.topic = t1
235
-
236
- assert r1.save
237
- assert_equal 1, Web::Topic.find(t1.id).replies.size
238
- assert_equal 0, Web::Topic.find(t2.id).replies.size
239
-
240
- r1.topic = Web::Topic.find(t2.id)
241
-
242
- assert r1.save
243
- assert_equal 0, Web::Topic.find(t1.id).replies.size
244
- assert_equal 1, Web::Topic.find(t2.id).replies.size
245
- end
246
-
247
- def test_belongs_to_counter_after_save
248
- topic = Topic.create!(:title => "monday night")
249
- topic.replies.create!(:title => "re: monday night", :content => "football")
250
- assert_equal 1, Topic.find(topic.id)[:replies_count]
251
-
252
- topic.save!
253
- assert_equal 1, Topic.find(topic.id)[:replies_count]
254
- end
255
-
256
- def test_belongs_to_counter_after_update_attributes
257
- topic = Topic.create!(:title => "37s")
258
- topic.replies.create!(:title => "re: 37s", :content => "rails")
259
- assert_equal 1, Topic.find(topic.id)[:replies_count]
260
-
261
- topic.update_attributes(:title => "37signals")
262
- assert_equal 1, Topic.find(topic.id)[:replies_count]
263
- end
264
-
265
- def test_assignment_before_child_saved
266
- final_cut = Client.new("name" => "Final Cut")
267
- firm = Firm.find(1)
268
- final_cut.firm = firm
269
- assert final_cut.new_record?
270
- assert final_cut.save
271
- assert !final_cut.new_record?
272
- assert !firm.new_record?
273
- assert_equal firm, final_cut.firm
274
- assert_equal firm, final_cut.firm(true)
275
- end
276
-
277
- def test_assignment_before_child_saved_with_primary_key
278
- final_cut = Client.new("name" => "Final Cut")
279
- firm = Firm.find(1)
280
- final_cut.firm_with_primary_key = firm
281
- assert final_cut.new_record?
282
- assert final_cut.save
283
- assert !final_cut.new_record?
284
- assert !firm.new_record?
285
- assert_equal firm, final_cut.firm_with_primary_key
286
- assert_equal firm, final_cut.firm_with_primary_key(true)
287
- end
288
-
289
- def test_new_record_with_foreign_key_but_no_object
290
- c = Client.new("firm_id" => 1)
291
- assert_equal Firm.find(:first), c.firm_with_basic_id
292
- end
293
-
294
- def test_forgetting_the_load_when_foreign_key_enters_late
295
- c = Client.new
296
- assert_nil c.firm_with_basic_id
297
-
298
- c.firm_id = 1
299
- assert_equal Firm.find(:first), c.firm_with_basic_id
300
- end
301
-
302
- def test_field_name_same_as_foreign_key
303
- computer = Computer.find(1)
304
- assert_not_nil computer.developer, ":foreign key == attribute didn't lock up" # '
305
- end
306
-
307
- def test_counter_cache
308
- topic = Topic.create :title => "Zoom-zoom-zoom"
309
- assert_equal 0, topic[:replies_count]
310
-
311
- reply = Reply.create(:title => "re: zoom", :content => "speedy quick!")
312
- reply.topic = topic
313
-
314
- assert_equal 1, topic.reload[:replies_count]
315
- assert_equal 1, topic.replies.size
316
-
317
- topic[:replies_count] = 15
318
- assert_equal 15, topic.replies.size
319
- end
320
-
321
- def test_custom_counter_cache
322
- reply = Reply.create(:title => "re: zoom", :content => "speedy quick!")
323
- assert_equal 0, reply[:replies_count]
324
-
325
- silly = SillyReply.create(:title => "gaga", :content => "boo-boo")
326
- silly.reply = reply
327
-
328
- assert_equal 1, reply.reload[:replies_count]
329
- assert_equal 1, reply.replies.size
330
-
331
- reply[:replies_count] = 17
332
- assert_equal 17, reply.replies.size
333
- end
334
-
335
- def test_association_assignment_sticks
336
- post = Post.find(:first)
337
-
338
- author1, author2 = Author.find(:all, :limit => 2)
339
- assert_not_nil author1
340
- assert_not_nil author2
341
-
342
- # make sure the association is loaded
343
- post.author
344
-
345
- # set the association by id, directly
346
- post.author_id = author2.id
347
-
348
- # save and reload
349
- post.save!
350
- post.reload
351
-
352
- # the author id of the post should be the id we set
353
- assert_equal post.author_id, author2.id
354
- end
355
-
356
- def test_cant_save_readonly_association
357
- assert_raise(ActiveRecord::ReadOnlyRecord) { companies(:first_client).readonly_firm.save! }
358
- assert companies(:first_client).readonly_firm.readonly?
359
- end
360
-
361
- def test_polymorphic_assignment_foreign_type_field_updating
362
- # should update when assigning a saved record
363
- sponsor = Sponsor.new
364
- member = Member.create
365
- sponsor.sponsorable = member
366
- assert_equal "Member", sponsor.sponsorable_type
367
-
368
- # should update when assigning a new record
369
- sponsor = Sponsor.new
370
- member = Member.new
371
- sponsor.sponsorable = member
372
- assert_equal "Member", sponsor.sponsorable_type
373
- end
374
-
375
- def test_polymorphic_assignment_with_primary_key_foreign_type_field_updating
376
- # should update when assigning a saved record
377
- essay = Essay.new
378
- writer = Author.create(:name => "David")
379
- essay.writer = writer
380
- assert_equal "Author", essay.writer_type
381
-
382
- # should update when assigning a new record
383
- essay = Essay.new
384
- writer = Author.new
385
- essay.writer = writer
386
- assert_equal "Author", essay.writer_type
387
- end
388
-
389
- def test_polymorphic_assignment_updates_foreign_id_field_for_new_and_saved_records
390
- sponsor = Sponsor.new
391
- saved_member = Member.create
392
- new_member = Member.new
393
-
394
- sponsor.sponsorable = saved_member
395
- assert_equal saved_member.id, sponsor.sponsorable_id
396
-
397
- sponsor.sponsorable = new_member
398
- assert_equal nil, sponsor.sponsorable_id
399
- end
400
-
401
- def test_polymorphic_assignment_with_primary_key_updates_foreign_id_field_for_new_and_saved_records
402
- essay = Essay.new
403
- saved_writer = Author.create(:name => "David")
404
- new_writer = Author.new
405
-
406
- essay.writer = saved_writer
407
- assert_equal saved_writer.name, essay.writer_id
408
-
409
- essay.writer = new_writer
410
- assert_equal nil, essay.writer_id
411
- end
412
-
413
- def test_belongs_to_proxy_should_not_respond_to_private_methods
414
- assert_raise(NoMethodError) { companies(:first_firm).private_method }
415
- assert_raise(NoMethodError) { companies(:second_client).firm.private_method }
416
- end
417
-
418
- def test_belongs_to_proxy_should_respond_to_private_methods_via_send
419
- companies(:first_firm).send(:private_method)
420
- companies(:second_client).firm.send(:private_method)
421
- end
422
-
423
- def test_save_of_record_with_loaded_belongs_to
424
- @account = companies(:first_firm).account
425
-
426
- assert_nothing_raised do
427
- Account.find(@account.id).save!
428
- Account.find(@account.id, :include => :firm).save!
429
- end
430
-
431
- @account.firm.delete
432
-
433
- assert_nothing_raised do
434
- Account.find(@account.id).save!
435
- Account.find(@account.id, :include => :firm).save!
436
- end
437
- end
438
- end