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,119 +0,0 @@
1
- require "cases/helper"
2
- require 'models/topic'
3
- require 'models/reply'
4
- require 'models/subscriber'
5
- require 'models/movie'
6
- require 'models/keyboard'
7
- require 'models/mixed_case_monkey'
8
-
9
- class PrimaryKeysTest < ActiveRecord::TestCase
10
- fixtures :topics, :subscribers, :movies, :mixed_case_monkeys
11
-
12
- def test_integer_key
13
- topic = Topic.find(1)
14
- assert_equal(topics(:first).author_name, topic.author_name)
15
- topic = Topic.find(2)
16
- assert_equal(topics(:second).author_name, topic.author_name)
17
-
18
- topic = Topic.new
19
- topic.title = "New Topic"
20
- assert_equal(nil, topic.id)
21
- assert_nothing_raised { topic.save! }
22
- id = topic.id
23
-
24
- topicReloaded = Topic.find(id)
25
- assert_equal("New Topic", topicReloaded.title)
26
- end
27
-
28
- def test_customized_primary_key_auto_assigns_on_save
29
- Keyboard.delete_all
30
- keyboard = Keyboard.new(:name => 'HHKB')
31
- assert_nothing_raised { keyboard.save! }
32
- assert_equal keyboard.id, Keyboard.find_by_name('HHKB').id
33
- end
34
-
35
- def test_customized_primary_key_can_be_get_before_saving
36
- keyboard = Keyboard.new
37
- assert_nil keyboard.id
38
- assert_nothing_raised { assert_nil keyboard.key_number }
39
- end
40
-
41
- def test_customized_string_primary_key_settable_before_save
42
- subscriber = Subscriber.new
43
- assert_nothing_raised { subscriber.id = 'webster123' }
44
- assert_equal 'webster123', subscriber.id
45
- assert_equal 'webster123', subscriber.nick
46
- end
47
-
48
- def test_string_key
49
- subscriber = Subscriber.find(subscribers(:first).nick)
50
- assert_equal(subscribers(:first).name, subscriber.name)
51
- subscriber = Subscriber.find(subscribers(:second).nick)
52
- assert_equal(subscribers(:second).name, subscriber.name)
53
-
54
- subscriber = Subscriber.new
55
- subscriber.id = "jdoe"
56
- assert_equal("jdoe", subscriber.id)
57
- subscriber.name = "John Doe"
58
- assert_nothing_raised { subscriber.save! }
59
- assert_equal("jdoe", subscriber.id)
60
-
61
- subscriberReloaded = Subscriber.find("jdoe")
62
- assert_equal("John Doe", subscriberReloaded.name)
63
- end
64
-
65
- def test_find_with_more_than_one_string_key
66
- assert_equal 2, Subscriber.find(subscribers(:first).nick, subscribers(:second).nick).length
67
- end
68
-
69
- def test_primary_key_prefix
70
- ActiveRecord::Base.primary_key_prefix_type = :table_name
71
- Topic.reset_primary_key
72
- assert_equal "topicid", Topic.primary_key
73
-
74
- ActiveRecord::Base.primary_key_prefix_type = :table_name_with_underscore
75
- Topic.reset_primary_key
76
- assert_equal "topic_id", Topic.primary_key
77
-
78
- ActiveRecord::Base.primary_key_prefix_type = nil
79
- Topic.reset_primary_key
80
- assert_equal "id", Topic.primary_key
81
- end
82
-
83
- def test_delete_should_quote_pkey
84
- assert_nothing_raised { MixedCaseMonkey.delete(1) }
85
- end
86
- def test_update_counters_should_quote_pkey_and_quote_counter_columns
87
- assert_nothing_raised { MixedCaseMonkey.update_counters(1, :fleaCount => 99) }
88
- end
89
- def test_find_with_one_id_should_quote_pkey
90
- assert_nothing_raised { MixedCaseMonkey.find(1) }
91
- end
92
- def test_find_with_multiple_ids_should_quote_pkey
93
- assert_nothing_raised { MixedCaseMonkey.find([1,2]) }
94
- end
95
- def test_instance_update_should_quote_pkey
96
- assert_nothing_raised { MixedCaseMonkey.find(1).save }
97
- end
98
- def test_instance_destroy_should_quote_pkey
99
- assert_nothing_raised { MixedCaseMonkey.find(1).destroy }
100
- end
101
-
102
- def test_supports_primary_key
103
- assert_nothing_raised NoMethodError do
104
- ActiveRecord::Base.connection.supports_primary_key?
105
- end
106
- end
107
-
108
- def test_primary_key_returns_value_if_it_exists
109
- if ActiveRecord::Base.connection.supports_primary_key?
110
- assert_equal 'id', ActiveRecord::Base.connection.primary_key('developers')
111
- end
112
- end
113
-
114
- def test_primary_key_returns_nil_if_it_does_not_exist
115
- if ActiveRecord::Base.connection.supports_primary_key?
116
- assert_nil ActiveRecord::Base.connection.primary_key('developers_projects')
117
- end
118
- end
119
- end
@@ -1,103 +0,0 @@
1
- require "cases/helper"
2
-
3
- class PooledConnectionsTest < ActiveRecord::TestCase
4
- def setup
5
- super
6
- @connection = ActiveRecord::Base.remove_connection
7
- end
8
-
9
- def teardown
10
- ActiveRecord::Base.clear_all_connections!
11
- ActiveRecord::Base.establish_connection(@connection)
12
- super
13
- end
14
-
15
- def checkout_connections
16
- ActiveRecord::Base.establish_connection(@connection.merge({:pool => 2, :wait_timeout => 0.3}))
17
- @connections = []
18
- @timed_out = 0
19
-
20
- 4.times do
21
- Thread.new do
22
- begin
23
- @connections << ActiveRecord::Base.connection_pool.checkout
24
- rescue ActiveRecord::ConnectionTimeoutError
25
- @timed_out += 1
26
- end
27
- end.join
28
- end
29
- end
30
-
31
- # Will deadlock due to lack of Monitor timeouts in 1.9
32
- if RUBY_VERSION < '1.9'
33
- def test_pooled_connection_checkout
34
- checkout_connections
35
- assert_equal @connections.length, 2
36
- assert_equal @timed_out, 2
37
- end
38
- end
39
-
40
- def checkout_checkin_connections(pool_size, threads)
41
- ActiveRecord::Base.establish_connection(@connection.merge({:pool => pool_size, :wait_timeout => 0.5}))
42
- @connection_count = 0
43
- @timed_out = 0
44
- threads.times do
45
- Thread.new do
46
- begin
47
- conn = ActiveRecord::Base.connection_pool.checkout
48
- sleep 0.1
49
- ActiveRecord::Base.connection_pool.checkin conn
50
- @connection_count += 1
51
- rescue ActiveRecord::ConnectionTimeoutError
52
- @timed_out += 1
53
- end
54
- end.join
55
- end
56
- end
57
-
58
- def test_pooled_connection_checkin_one
59
- checkout_checkin_connections 1, 2
60
- assert_equal 2, @connection_count
61
- assert_equal 0, @timed_out
62
- end
63
-
64
- def test_pooled_connection_checkin_two
65
- checkout_checkin_connections 2, 3
66
- assert_equal 3, @connection_count
67
- assert_equal 0, @timed_out
68
- end
69
-
70
- def test_pooled_connection_checkout_existing_first
71
- ActiveRecord::Base.establish_connection(@connection.merge({:pool => 1}))
72
- conn_pool = ActiveRecord::Base.connection_pool
73
- conn = conn_pool.checkout
74
- conn_pool.checkin(conn)
75
- conn = conn_pool.checkout
76
- assert ActiveRecord::ConnectionAdapters::AbstractAdapter === conn
77
- conn_pool.checkin(conn)
78
- end
79
-
80
- def test_not_connected_defined_connection_returns_false
81
- ActiveRecord::Base.establish_connection(@connection)
82
- assert ! ActiveRecord::Base.connected?
83
- end
84
-
85
- def test_undefined_connection_returns_false
86
- old_handler = ActiveRecord::Base.connection_handler
87
- ActiveRecord::Base.connection_handler = ActiveRecord::ConnectionAdapters::ConnectionHandler.new
88
- assert_equal false, ActiveRecord::Base.connected?
89
- ensure
90
- ActiveRecord::Base.connection_handler = old_handler
91
- end
92
- end unless %w(FrontBase).include? ActiveRecord::Base.connection.adapter_name
93
-
94
- class AllowConcurrencyDeprecatedTest < ActiveRecord::TestCase
95
- def test_allow_concurrency_is_deprecated
96
- assert_deprecated('ActiveRecord::Base.allow_concurrency') do
97
- ActiveRecord::Base.allow_concurrency
98
- end
99
- assert_deprecated('ActiveRecord::Base.allow_concurrency=') do
100
- ActiveRecord::Base.allow_concurrency = true
101
- end
102
- end
103
- end
@@ -1,129 +0,0 @@
1
- require "cases/helper"
2
- require 'models/topic'
3
- require 'models/reply'
4
- require 'models/task'
5
- require 'models/course'
6
- require 'models/category'
7
- require 'models/post'
8
-
9
-
10
- class QueryCacheTest < ActiveRecord::TestCase
11
- fixtures :tasks, :topics, :categories, :posts, :categories_posts
12
-
13
- def test_find_queries
14
- assert_queries(2) { Task.find(1); Task.find(1) }
15
- end
16
-
17
- def test_find_queries_with_cache
18
- Task.cache do
19
- assert_queries(1) { Task.find(1); Task.find(1) }
20
- end
21
- end
22
-
23
- def test_count_queries_with_cache
24
- Task.cache do
25
- assert_queries(1) { Task.count; Task.count }
26
- end
27
- end
28
-
29
- def test_query_cache_dups_results_correctly
30
- Task.cache do
31
- now = Time.now.utc
32
- task = Task.find 1
33
- assert_not_equal now, task.starting
34
- task.starting = now
35
- task.reload
36
- assert_not_equal now, task.starting
37
- end
38
- end
39
-
40
- def test_cache_is_flat
41
- Task.cache do
42
- Topic.columns # don't count this query
43
- assert_queries(1) { Topic.find(1); Topic.find(1); }
44
- end
45
-
46
- ActiveRecord::Base.cache do
47
- assert_queries(1) { Task.find(1); Task.find(1) }
48
- end
49
- end
50
-
51
- def test_cache_does_not_wrap_string_results_in_arrays
52
- require 'sqlite3/version' if current_adapter?(:SQLite3Adapter)
53
-
54
- Task.cache do
55
- if current_adapter?(:SQLite3Adapter) && SQLite3::Version::VERSION > '1.2.5'
56
- assert_instance_of Fixnum, Task.connection.select_value("SELECT count(*) AS count_all FROM tasks")
57
- else
58
- assert_instance_of String, Task.connection.select_value("SELECT count(*) AS count_all FROM tasks")
59
- end
60
- end
61
- end
62
- end
63
-
64
- class QueryCacheExpiryTest < ActiveRecord::TestCase
65
- fixtures :tasks, :posts, :categories, :categories_posts
66
-
67
- def test_find
68
- Task.connection.expects(:clear_query_cache).times(1)
69
-
70
- assert !Task.connection.query_cache_enabled
71
- Task.cache do
72
- assert Task.connection.query_cache_enabled
73
- Task.find(1)
74
-
75
- Task.uncached do
76
- assert !Task.connection.query_cache_enabled
77
- Task.find(1)
78
- end
79
-
80
- assert Task.connection.query_cache_enabled
81
- end
82
- assert !Task.connection.query_cache_enabled
83
- end
84
-
85
- def test_update
86
- Task.connection.expects(:clear_query_cache).times(2)
87
-
88
- Task.cache do
89
- task = Task.find(1)
90
- task.starting = Time.now.utc
91
- task.save!
92
- end
93
- end
94
-
95
- def test_destroy
96
- Task.connection.expects(:clear_query_cache).times(2)
97
-
98
- Task.cache do
99
- Task.find(1).destroy
100
- end
101
- end
102
-
103
- def test_insert
104
- ActiveRecord::Base.connection.expects(:clear_query_cache).times(2)
105
-
106
- Task.cache do
107
- Task.create!
108
- end
109
- end
110
-
111
- def test_cache_is_expired_by_habtm_update
112
- ActiveRecord::Base.connection.expects(:clear_query_cache).times(2)
113
- ActiveRecord::Base.cache do
114
- c = Category.find(:first)
115
- p = Post.find(:first)
116
- p.categories << c
117
- end
118
- end
119
-
120
- def test_cache_is_expired_by_habtm_delete
121
- ActiveRecord::Base.connection.expects(:clear_query_cache).times(2)
122
- ActiveRecord::Base.cache do
123
- c = Category.find(1)
124
- p = Post.find(1)
125
- assert p.categories.any?
126
- p.categories.delete_all
127
- end
128
- end
129
- end
@@ -1,107 +0,0 @@
1
- require "cases/helper"
2
- require 'models/post'
3
- require 'models/comment'
4
- require 'models/developer'
5
- require 'models/project'
6
- require 'models/reader'
7
- require 'models/person'
8
-
9
- # Dummy class methods to test implicit association scoping.
10
- def Comment.foo() find :first end
11
- def Project.foo() find :first end
12
-
13
-
14
- class ReadOnlyTest < ActiveRecord::TestCase
15
- fixtures :posts, :comments, :developers, :projects, :developers_projects
16
-
17
- def test_cant_save_readonly_record
18
- dev = Developer.find(1)
19
- assert !dev.readonly?
20
-
21
- dev.readonly!
22
- assert dev.readonly?
23
-
24
- assert_nothing_raised do
25
- dev.name = 'Luscious forbidden fruit.'
26
- assert !dev.save
27
- dev.name = 'Forbidden.'
28
- end
29
- assert_raise(ActiveRecord::ReadOnlyRecord) { dev.save }
30
- assert_raise(ActiveRecord::ReadOnlyRecord) { dev.save! }
31
- end
32
-
33
-
34
- def test_find_with_readonly_option
35
- Developer.find(:all).each { |d| assert !d.readonly? }
36
- Developer.find(:all, :readonly => false).each { |d| assert !d.readonly? }
37
- Developer.find(:all, :readonly => true).each { |d| assert d.readonly? }
38
- end
39
-
40
-
41
- def test_find_with_joins_option_implies_readonly
42
- # Blank joins don't count.
43
- Developer.find(:all, :joins => ' ').each { |d| assert !d.readonly? }
44
- Developer.find(:all, :joins => ' ', :readonly => false).each { |d| assert !d.readonly? }
45
-
46
- # Others do.
47
- Developer.find(:all, :joins => ', projects').each { |d| assert d.readonly? }
48
- Developer.find(:all, :joins => ', projects', :readonly => false).each { |d| assert !d.readonly? }
49
- end
50
-
51
-
52
- def test_habtm_find_readonly
53
- dev = Developer.find(1)
54
- assert !dev.projects.empty?
55
- assert dev.projects.all?(&:readonly?)
56
- assert dev.projects.find(:all).all?(&:readonly?)
57
- assert dev.projects.find(:all, :readonly => true).all?(&:readonly?)
58
- end
59
-
60
- def test_has_many_find_readonly
61
- post = Post.find(1)
62
- assert !post.comments.empty?
63
- assert !post.comments.any?(&:readonly?)
64
- assert !post.comments.find(:all).any?(&:readonly?)
65
- assert post.comments.find(:all, :readonly => true).all?(&:readonly?)
66
- end
67
-
68
- def test_has_many_with_through_is_not_implicitly_marked_readonly
69
- assert people = Post.find(1).people
70
- assert !people.any?(&:readonly?)
71
- end
72
-
73
- def test_readonly_scoping
74
- Post.with_scope(:find => { :conditions => '1=1' }) do
75
- assert !Post.find(1).readonly?
76
- assert Post.find(1, :readonly => true).readonly?
77
- assert !Post.find(1, :readonly => false).readonly?
78
- end
79
-
80
- Post.with_scope(:find => { :joins => ' ' }) do
81
- assert !Post.find(1).readonly?
82
- assert Post.find(1, :readonly => true).readonly?
83
- assert !Post.find(1, :readonly => false).readonly?
84
- end
85
-
86
- # Oracle barfs on this because the join includes unqualified and
87
- # conflicting column names
88
- unless current_adapter?(:OracleAdapter)
89
- Post.with_scope(:find => { :joins => ', developers' }) do
90
- assert Post.find(1).readonly?
91
- assert Post.find(1, :readonly => true).readonly?
92
- assert !Post.find(1, :readonly => false).readonly?
93
- end
94
- end
95
-
96
- Post.with_scope(:find => { :readonly => true }) do
97
- assert Post.find(1).readonly?
98
- assert Post.find(1, :readonly => true).readonly?
99
- assert !Post.find(1, :readonly => false).readonly?
100
- end
101
- end
102
-
103
- def test_association_collection_method_missing_scoping_not_readonly
104
- assert !Developer.find(1).projects.foo.readonly?
105
- assert !Post.find(1).comments.foo.readonly?
106
- end
107
- end