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,124 +0,0 @@
1
- require "cases/helper"
2
- require 'models/course'
3
-
4
- class FirebirdMigrationTest < ActiveRecord::TestCase
5
- self.use_transactional_fixtures = false
6
-
7
- def setup
8
- # using Course connection for tests -- need a db that doesn't already have a BOOLEAN domain
9
- @connection = Course.connection
10
- @fireruby_connection = @connection.instance_variable_get(:@connection)
11
- end
12
-
13
- def teardown
14
- @connection.drop_table :foo rescue nil
15
- @connection.execute("DROP DOMAIN D_BOOLEAN") rescue nil
16
- end
17
-
18
- def test_create_table_with_custom_sequence_name
19
- assert_nothing_raised do
20
- @connection.create_table(:foo, :sequence => 'foo_custom_seq') do |f|
21
- f.column :bar, :string
22
- end
23
- end
24
- assert !sequence_exists?('foo_seq')
25
- assert sequence_exists?('foo_custom_seq')
26
-
27
- assert_nothing_raised { @connection.drop_table(:foo, :sequence => 'foo_custom_seq') }
28
- assert !sequence_exists?('foo_custom_seq')
29
- ensure
30
- FireRuby::Generator.new('foo_custom_seq', @fireruby_connection).drop rescue nil
31
- end
32
-
33
- def test_create_table_without_sequence
34
- assert_nothing_raised do
35
- @connection.create_table(:foo, :sequence => false) do |f|
36
- f.column :bar, :string
37
- end
38
- end
39
- assert !sequence_exists?('foo_seq')
40
- assert_nothing_raised { @connection.drop_table :foo }
41
-
42
- assert_nothing_raised do
43
- @connection.create_table(:foo, :id => false) do |f|
44
- f.column :bar, :string
45
- end
46
- end
47
- assert !sequence_exists?('foo_seq')
48
- assert_nothing_raised { @connection.drop_table :foo }
49
- end
50
-
51
- def test_create_table_with_boolean_column
52
- assert !boolean_domain_exists?
53
- assert_nothing_raised do
54
- @connection.create_table :foo do |f|
55
- f.column :bar, :string
56
- f.column :baz, :boolean
57
- end
58
- end
59
- assert boolean_domain_exists?
60
- end
61
-
62
- def test_add_boolean_column
63
- assert !boolean_domain_exists?
64
- @connection.create_table :foo do |f|
65
- f.column :bar, :string
66
- end
67
-
68
- assert_nothing_raised { @connection.add_column :foo, :baz, :boolean }
69
- assert boolean_domain_exists?
70
- assert_equal :boolean, @connection.columns(:foo).find { |c| c.name == "baz" }.type
71
- end
72
-
73
- def test_change_column_to_boolean
74
- assert !boolean_domain_exists?
75
- # Manually create table with a SMALLINT column, which can be changed to a BOOLEAN
76
- @connection.execute "CREATE TABLE foo (bar SMALLINT)"
77
- assert_equal :integer, @connection.columns(:foo).find { |c| c.name == "bar" }.type
78
-
79
- assert_nothing_raised { @connection.change_column :foo, :bar, :boolean }
80
- assert boolean_domain_exists?
81
- assert_equal :boolean, @connection.columns(:foo).find { |c| c.name == "bar" }.type
82
- end
83
-
84
- def test_rename_table_with_data_and_index
85
- @connection.create_table :foo do |f|
86
- f.column :baz, :string, :limit => 50
87
- end
88
- 100.times { |i| @connection.execute "INSERT INTO foo VALUES (GEN_ID(foo_seq, 1), 'record #{i+1}')" }
89
- @connection.add_index :foo, :baz
90
-
91
- assert_nothing_raised { @connection.rename_table :foo, :bar }
92
- assert !@connection.tables.include?("foo")
93
- assert @connection.tables.include?("bar")
94
- assert_equal "index_bar_on_baz", @connection.indexes("bar").first.name
95
- assert_equal 100, FireRuby::Generator.new("bar_seq", @fireruby_connection).last
96
- assert_equal 100, @connection.select_one("SELECT COUNT(*) FROM bar")["count"]
97
- ensure
98
- @connection.drop_table :bar rescue nil
99
- end
100
-
101
- def test_renaming_table_with_fk_constraint_raises_error
102
- @connection.create_table :parent do |p|
103
- p.column :name, :string
104
- end
105
- @connection.create_table :child do |c|
106
- c.column :parent_id, :integer
107
- end
108
- @connection.execute "ALTER TABLE child ADD CONSTRAINT fk_child_parent FOREIGN KEY(parent_id) REFERENCES parent(id)"
109
- assert_raise(ActiveRecord::ActiveRecordError) { @connection.rename_table :child, :descendant }
110
- ensure
111
- @connection.drop_table :child rescue nil
112
- @connection.drop_table :descendant rescue nil
113
- @connection.drop_table :parent rescue nil
114
- end
115
-
116
- private
117
- def boolean_domain_exists?
118
- !@connection.select_one("SELECT 1 FROM rdb$fields WHERE rdb$field_name = 'D_BOOLEAN'").nil?
119
- end
120
-
121
- def sequence_exists?(sequence_name)
122
- FireRuby::Generator.exists?(sequence_name, @fireruby_connection)
123
- end
124
- end
@@ -1,96 +0,0 @@
1
- require "cases/helper"
2
-
3
- class Mixin < ActiveRecord::Base
4
- end
5
-
6
- # Let us control what Time.now returns for the TouchTest suite
7
- class Time
8
- @@forced_now_time = nil
9
- cattr_accessor :forced_now_time
10
-
11
- class << self
12
- def now_with_forcing
13
- if @@forced_now_time
14
- @@forced_now_time
15
- else
16
- now_without_forcing
17
- end
18
- end
19
- alias_method_chain :now, :forcing
20
- end
21
- end
22
-
23
-
24
- class TouchTest < ActiveRecord::TestCase
25
- fixtures :mixins
26
-
27
- def setup
28
- Time.forced_now_time = Time.now
29
- end
30
-
31
- def teardown
32
- Time.forced_now_time = nil
33
- end
34
-
35
- def test_time_mocking
36
- five_minutes_ago = 5.minutes.ago
37
- Time.forced_now_time = five_minutes_ago
38
- assert_equal five_minutes_ago, Time.now
39
-
40
- Time.forced_now_time = nil
41
- assert_not_equal five_minutes_ago, Time.now
42
- end
43
-
44
- def test_update
45
- stamped = Mixin.new
46
-
47
- assert_nil stamped.updated_at
48
- assert_nil stamped.created_at
49
- stamped.save
50
- assert_equal Time.now, stamped.updated_at
51
- assert_equal Time.now, stamped.created_at
52
- end
53
-
54
- def test_create
55
- obj = Mixin.create
56
- assert_equal Time.now, obj.updated_at
57
- assert_equal Time.now, obj.created_at
58
- end
59
-
60
- def test_many_updates
61
- stamped = Mixin.new
62
-
63
- assert_nil stamped.updated_at
64
- assert_nil stamped.created_at
65
- stamped.save
66
- assert_equal Time.now, stamped.created_at
67
- assert_equal Time.now, stamped.updated_at
68
-
69
- old_updated_at = stamped.updated_at
70
-
71
- Time.forced_now_time = 5.minutes.from_now
72
- stamped.lft_will_change!
73
- stamped.save
74
-
75
- assert_equal Time.now, stamped.updated_at
76
- assert_equal old_updated_at, stamped.created_at
77
- end
78
-
79
- def test_create_turned_off
80
- Mixin.record_timestamps = false
81
-
82
- mixin = Mixin.new
83
-
84
- assert_nil mixin.updated_at
85
- mixin.save
86
- assert_nil mixin.updated_at
87
-
88
- # Make sure Mixin.record_timestamps gets reset, even if this test fails,
89
- # so that other tests do not fail because Mixin.record_timestamps == false
90
- rescue Exception => e
91
- raise e
92
- ensure
93
- Mixin.record_timestamps = true
94
- end
95
-
96
- end
@@ -1,109 +0,0 @@
1
- require "cases/helper"
2
- require 'models/company_in_module'
3
-
4
- class ModulesTest < ActiveRecord::TestCase
5
- fixtures :accounts, :companies, :projects, :developers
6
-
7
- def setup
8
- # need to make sure Object::Firm and Object::Client are not defined,
9
- # so that constantize will not be able to cheat when having to load namespaced classes
10
- @undefined_consts = {}
11
-
12
- [:Firm, :Client].each do |const|
13
- @undefined_consts.merge! const => Object.send(:remove_const, const) if Object.const_defined?(const)
14
- end
15
- end
16
-
17
- def teardown
18
- # reinstate the constants that we undefined in the setup
19
- @undefined_consts.each do |constant, value|
20
- Object.send :const_set, constant, value unless value.nil?
21
- end
22
- end
23
-
24
- def test_module_spanning_associations
25
- firm = MyApplication::Business::Firm.find(:first)
26
- assert !firm.clients.empty?, "Firm should have clients"
27
- assert_nil firm.class.table_name.match('::'), "Firm shouldn't have the module appear in its table name"
28
- end
29
-
30
- def test_module_spanning_has_and_belongs_to_many_associations
31
- project = MyApplication::Business::Project.find(:first)
32
- project.developers << MyApplication::Business::Developer.create("name" => "John")
33
- assert "John", project.developers.last.name
34
- end
35
-
36
- def test_associations_spanning_cross_modules
37
- account = MyApplication::Billing::Account.find(:first, :order => 'id')
38
- assert_kind_of MyApplication::Business::Firm, account.firm
39
- assert_kind_of MyApplication::Billing::Firm, account.qualified_billing_firm
40
- assert_kind_of MyApplication::Billing::Firm, account.unqualified_billing_firm
41
- assert_kind_of MyApplication::Billing::Nested::Firm, account.nested_qualified_billing_firm
42
- assert_kind_of MyApplication::Billing::Nested::Firm, account.nested_unqualified_billing_firm
43
- end
44
-
45
- def test_find_account_and_include_company
46
- account = MyApplication::Billing::Account.find(1, :include => :firm)
47
- assert_kind_of MyApplication::Business::Firm, account.instance_variable_get('@firm')
48
- assert_kind_of MyApplication::Business::Firm, account.firm
49
- end
50
-
51
- def test_table_name
52
- assert_equal 'accounts', MyApplication::Billing::Account.table_name, 'table_name for ActiveRecord model in module'
53
- assert_equal 'companies', MyApplication::Business::Client.table_name, 'table_name for ActiveRecord model subclass'
54
- assert_equal 'company_contacts', MyApplication::Business::Client::Contact.table_name, 'table_name for ActiveRecord model enclosed by another ActiveRecord model'
55
- end
56
-
57
- def test_assign_ids
58
- firm = MyApplication::Business::Firm.first
59
-
60
- assert_nothing_raised NameError, "Should be able to resolve all class constants via reflection" do
61
- firm.client_ids = [MyApplication::Business::Client.first.id]
62
- end
63
- end
64
-
65
- # need to add an eager loading condition to force the eager loading model into
66
- # the old join model, to test that. See http://dev.rubyonrails.org/ticket/9640
67
- def test_eager_loading_in_modules
68
- clients = []
69
-
70
- assert_nothing_raised NameError, "Should be able to resolve all class constants via reflection" do
71
- clients << MyApplication::Business::Client.find(3, :include => {:firm => :account}, :conditions => 'accounts.id IS NOT NULL')
72
- clients << MyApplication::Business::Client.find(3, :include => {:firm => :account})
73
- end
74
-
75
- clients.each do |client|
76
- assert_no_queries do
77
- assert_not_nil(client.firm.account)
78
- end
79
- end
80
- end
81
-
82
- def test_module_table_name_prefix
83
- assert_equal 'prefixed_companies', MyApplication::Business::Prefixed::Company.table_name, 'inferred table_name for ActiveRecord model in module with table_name_prefix'
84
- assert_equal 'prefixed_companies', MyApplication::Business::Prefixed::Nested::Company.table_name, 'table_name for ActiveRecord model in nested module with a parent table_name_prefix'
85
- assert_equal 'companies', MyApplication::Business::Prefixed::Firm.table_name, 'explicit table_name for ActiveRecord model in module with table_name_prefix should not be prefixed'
86
- end
87
-
88
- def test_module_table_name_prefix_with_global_prefix
89
- classes = [ MyApplication::Business::Company,
90
- MyApplication::Business::Firm,
91
- MyApplication::Business::Client,
92
- MyApplication::Business::Client::Contact,
93
- MyApplication::Business::Developer,
94
- MyApplication::Business::Project,
95
- MyApplication::Business::Prefixed::Company,
96
- MyApplication::Business::Prefixed::Nested::Company,
97
- MyApplication::Billing::Account ]
98
-
99
- ActiveRecord::Base.table_name_prefix = 'global_'
100
- classes.each(&:reset_table_name)
101
- assert_equal 'global_companies', MyApplication::Business::Company.table_name, 'inferred table_name for ActiveRecord model in module without table_name_prefix'
102
- assert_equal 'prefixed_companies', MyApplication::Business::Prefixed::Company.table_name, 'inferred table_name for ActiveRecord model in module with table_name_prefix'
103
- assert_equal 'prefixed_companies', MyApplication::Business::Prefixed::Nested::Company.table_name, 'table_name for ActiveRecord model in nested module with a parent table_name_prefix'
104
- assert_equal 'companies', MyApplication::Business::Prefixed::Firm.table_name, 'explicit table_name for ActiveRecord model in module with table_name_prefix should not be prefixed'
105
- ensure
106
- ActiveRecord::Base.table_name_prefix = ''
107
- classes.each(&:reset_table_name)
108
- end
109
- end
@@ -1,85 +0,0 @@
1
- require "cases/helper"
2
- require 'models/entrant'
3
-
4
- # So we can test whether Course.connection survives a reload.
5
- require_dependency 'models/course'
6
-
7
- class MultipleDbTest < ActiveRecord::TestCase
8
- self.use_transactional_fixtures = false
9
-
10
- def setup
11
- @courses = create_fixtures("courses") { Course.retrieve_connection }
12
- @entrants = create_fixtures("entrants")
13
- end
14
-
15
- def test_connected
16
- assert_not_nil Entrant.connection
17
- assert_not_nil Course.connection
18
- end
19
-
20
- def test_proper_connection
21
- assert_not_equal(Entrant.connection, Course.connection)
22
- assert_equal(Entrant.connection, Entrant.retrieve_connection)
23
- assert_equal(Course.connection, Course.retrieve_connection)
24
- assert_equal(ActiveRecord::Base.connection, Entrant.connection)
25
- end
26
-
27
- def test_find
28
- c1 = Course.find(1)
29
- assert_equal "Ruby Development", c1.name
30
- c2 = Course.find(2)
31
- assert_equal "Java Development", c2.name
32
- e1 = Entrant.find(1)
33
- assert_equal "Ruby Developer", e1.name
34
- e2 = Entrant.find(2)
35
- assert_equal "Ruby Guru", e2.name
36
- e3 = Entrant.find(3)
37
- assert_equal "Java Lover", e3.name
38
- end
39
-
40
- def test_associations
41
- c1 = Course.find(1)
42
- assert_equal 2, c1.entrants.count
43
- e1 = Entrant.find(1)
44
- assert_equal e1.course.id, c1.id
45
- c2 = Course.find(2)
46
- assert_equal 1, c2.entrants.count
47
- e3 = Entrant.find(3)
48
- assert_equal e3.course.id, c2.id
49
- end
50
-
51
- def test_course_connection_should_survive_dependency_reload
52
- assert Course.connection
53
-
54
- ActiveSupport::Dependencies.clear
55
- Object.send(:remove_const, :Course)
56
- require_dependency 'models/course'
57
-
58
- assert Course.connection
59
- end
60
-
61
- def test_transactions_across_databases
62
- c1 = Course.find(1)
63
- e1 = Entrant.find(1)
64
-
65
- begin
66
- Course.transaction do
67
- Entrant.transaction do
68
- c1.name = "Typo"
69
- e1.name = "Typo"
70
- c1.save
71
- e1.save
72
- raise "No I messed up."
73
- end
74
- end
75
- rescue
76
- # Yup caught it
77
- end
78
-
79
- assert_equal "Typo", c1.name
80
- assert_equal "Typo", e1.name
81
-
82
- assert_equal "Ruby Development", Course.find(1).name
83
- assert_equal "Ruby Developer", Entrant.find(1).name
84
- end
85
- end
@@ -1,372 +0,0 @@
1
- require "cases/helper"
2
- require 'models/post'
3
- require 'models/topic'
4
- require 'models/comment'
5
- require 'models/reply'
6
- require 'models/author'
7
- require 'models/developer'
8
-
9
- class NamedScopeTest < ActiveRecord::TestCase
10
- fixtures :posts, :authors, :topics, :comments, :author_addresses
11
-
12
- def test_named_scope_with_STI
13
- assert_equal 5,Post.with_type_self.count
14
- assert_equal 1,SpecialPost.with_type_self.count
15
- end
16
-
17
- def test_implements_enumerable
18
- assert !Topic.find(:all).empty?
19
-
20
- assert_equal Topic.find(:all), Topic.base
21
- assert_equal Topic.find(:all), Topic.base.to_a
22
- assert_equal Topic.find(:first), Topic.base.first
23
- assert_equal Topic.find(:all), Topic.base.map { |i| i }
24
- end
25
-
26
- def test_found_items_are_cached
27
- Topic.columns
28
- all_posts = Topic.base
29
-
30
- assert_queries(1) do
31
- all_posts.collect
32
- all_posts.collect
33
- end
34
- end
35
-
36
- def test_reload_expires_cache_of_found_items
37
- all_posts = Topic.base
38
- all_posts.inspect
39
-
40
- new_post = Topic.create!
41
- assert !all_posts.include?(new_post)
42
- assert all_posts.reload.include?(new_post)
43
- end
44
-
45
- def test_delegates_finds_and_calculations_to_the_base_class
46
- assert !Topic.find(:all).empty?
47
-
48
- assert_equal Topic.find(:all), Topic.base.find(:all)
49
- assert_equal Topic.find(:first), Topic.base.find(:first)
50
- assert_equal Topic.count, Topic.base.count
51
- assert_equal Topic.average(:replies_count), Topic.base.average(:replies_count)
52
- end
53
-
54
- def test_scope_should_respond_to_own_methods_and_methods_of_the_proxy
55
- assert Topic.approved.respond_to?(:proxy_found)
56
- assert Topic.approved.respond_to?(:count)
57
- assert Topic.approved.respond_to?(:length)
58
- end
59
-
60
- def test_respond_to_respects_include_private_parameter
61
- assert !Topic.approved.respond_to?(:load_found)
62
- assert Topic.approved.respond_to?(:load_found, true)
63
- end
64
-
65
- def test_subclasses_inherit_scopes
66
- assert Topic.scopes.include?(:base)
67
-
68
- assert Reply.scopes.include?(:base)
69
- assert_equal Reply.find(:all), Reply.base
70
- end
71
-
72
- def test_scopes_with_options_limit_finds_to_those_matching_the_criteria_specified
73
- assert !Topic.find(:all, :conditions => {:approved => true}).empty?
74
-
75
- assert_equal Topic.find(:all, :conditions => {:approved => true}), Topic.approved
76
- assert_equal Topic.count(:conditions => {:approved => true}), Topic.approved.count
77
- end
78
-
79
- def test_scopes_with_string_name_can_be_composed
80
- # NOTE that scopes defined with a string as a name worked on their own
81
- # but when called on another scope the other scope was completely replaced
82
- assert_equal Topic.replied.approved, Topic.replied.approved_as_string
83
- end
84
-
85
- def test_scopes_can_be_specified_with_deep_hash_conditions
86
- assert_equal Topic.replied.approved, Topic.replied.approved_as_hash_condition
87
- end
88
-
89
- def test_scopes_are_composable
90
- assert_equal (approved = Topic.find(:all, :conditions => {:approved => true})), Topic.approved
91
- assert_equal (replied = Topic.find(:all, :conditions => 'replies_count > 0')), Topic.replied
92
- assert !(approved == replied)
93
- assert !(approved & replied).empty?
94
-
95
- assert_equal approved & replied, Topic.approved.replied
96
- end
97
-
98
- def test_procedural_scopes
99
- topics_written_before_the_third = Topic.find(:all, :conditions => ['written_on < ?', topics(:third).written_on])
100
- topics_written_before_the_second = Topic.find(:all, :conditions => ['written_on < ?', topics(:second).written_on])
101
- assert_not_equal topics_written_before_the_second, topics_written_before_the_third
102
-
103
- assert_equal topics_written_before_the_third, Topic.written_before(topics(:third).written_on)
104
- assert_equal topics_written_before_the_second, Topic.written_before(topics(:second).written_on)
105
- end
106
-
107
- def test_procedural_scopes_returning_nil
108
- all_topics = Topic.find(:all)
109
-
110
- assert_equal all_topics, Topic.written_before(nil)
111
- end
112
-
113
- def test_scopes_with_joins
114
- address = author_addresses(:david_address)
115
- posts_with_authors_at_address = Post.find(
116
- :all, :joins => 'JOIN authors ON authors.id = posts.author_id',
117
- :conditions => [ 'authors.author_address_id = ?', address.id ]
118
- )
119
- assert_equal posts_with_authors_at_address, Post.with_authors_at_address(address)
120
- end
121
-
122
- def test_scopes_with_joins_respects_custom_select
123
- address = author_addresses(:david_address)
124
- posts_with_authors_at_address_titles = Post.find(:all,
125
- :select => 'title',
126
- :joins => 'JOIN authors ON authors.id = posts.author_id',
127
- :conditions => [ 'authors.author_address_id = ?', address.id ]
128
- )
129
- assert_equal posts_with_authors_at_address_titles, Post.with_authors_at_address(address).find(:all, :select => 'title')
130
- end
131
-
132
- def test_extensions
133
- assert_equal 1, Topic.anonymous_extension.one
134
- assert_equal 2, Topic.named_extension.two
135
- end
136
-
137
- def test_multiple_extensions
138
- assert_equal 2, Topic.multiple_extensions.extension_two
139
- assert_equal 1, Topic.multiple_extensions.extension_one
140
- end
141
-
142
- def test_has_many_associations_have_access_to_named_scopes
143
- assert_not_equal Post.containing_the_letter_a, authors(:david).posts
144
- assert !Post.containing_the_letter_a.empty?
145
-
146
- assert_equal authors(:david).posts & Post.containing_the_letter_a, authors(:david).posts.containing_the_letter_a
147
- end
148
-
149
- def test_nested_named_scopes_doesnt_duplicate_conditions_on_child_scopes
150
- comments_scope = posts(:welcome).comments.send(:construct_sql)
151
- named_scope_sql_conditions = posts(:welcome).comments.containing_the_letter_e.send(:current_scoped_methods)[:find][:conditions]
152
- assert_no_match /#{comments_scope}.*#{comments_scope}/i, named_scope_sql_conditions
153
- end
154
-
155
- def test_has_many_through_associations_have_access_to_named_scopes
156
- assert_not_equal Comment.containing_the_letter_e, authors(:david).comments
157
- assert !Comment.containing_the_letter_e.empty?
158
-
159
- assert_equal authors(:david).comments & Comment.containing_the_letter_e, authors(:david).comments.containing_the_letter_e
160
- end
161
-
162
- def test_named_scopes_honor_current_scopes_from_when_defined
163
- assert !Post.ranked_by_comments.limit(5).empty?
164
- assert !authors(:david).posts.ranked_by_comments.limit(5).empty?
165
- assert_not_equal Post.ranked_by_comments.limit(5), authors(:david).posts.ranked_by_comments.limit(5)
166
- assert_not_equal Post.top(5), authors(:david).posts.top(5)
167
- assert_equal authors(:david).posts.ranked_by_comments.limit(5), authors(:david).posts.top(5)
168
- assert_equal Post.ranked_by_comments.limit(5), Post.top(5)
169
- end
170
-
171
- def test_active_records_have_scope_named__all__
172
- assert !Topic.find(:all).empty?
173
-
174
- assert_equal Topic.find(:all), Topic.base
175
- end
176
-
177
- def test_active_records_have_scope_named__scoped__
178
- assert !Topic.find(:all, scope = {:conditions => "content LIKE '%Have%'"}).empty?
179
-
180
- assert_equal Topic.find(:all, scope), Topic.scoped(scope)
181
- end
182
-
183
- def test_proxy_options
184
- expected_proxy_options = { :conditions => { :approved => true } }
185
- assert_equal expected_proxy_options, Topic.approved.proxy_options
186
- end
187
-
188
- def test_first_and_last_should_support_find_options
189
- assert_equal Topic.base.first(:order => 'title'), Topic.base.find(:first, :order => 'title')
190
- assert_equal Topic.base.last(:order => 'title'), Topic.base.find(:last, :order => 'title')
191
- end
192
-
193
- def test_first_and_last_should_allow_integers_for_limit
194
- assert_equal Topic.base.first(2), Topic.base.to_a.first(2)
195
- assert_equal Topic.base.last(2), Topic.base.to_a.last(2)
196
- end
197
-
198
- def test_first_and_last_should_not_use_query_when_results_are_loaded
199
- topics = Topic.base
200
- topics.reload # force load
201
- assert_no_queries do
202
- topics.first
203
- topics.last
204
- end
205
- end
206
-
207
- def test_first_and_last_find_options_should_use_query_when_results_are_loaded
208
- topics = Topic.base
209
- topics.reload # force load
210
- assert_queries(2) do
211
- topics.first(:order => 'title')
212
- topics.last(:order => 'title')
213
- end
214
- end
215
-
216
- def test_empty_should_not_load_results
217
- topics = Topic.base
218
- assert_queries(2) do
219
- topics.empty? # use count query
220
- topics.collect # force load
221
- topics.empty? # use loaded (no query)
222
- end
223
- end
224
-
225
- def test_any_should_not_load_results
226
- topics = Topic.base
227
- assert_queries(2) do
228
- topics.any? # use count query
229
- topics.collect # force load
230
- topics.any? # use loaded (no query)
231
- end
232
- end
233
-
234
- def test_any_should_call_proxy_found_if_using_a_block
235
- topics = Topic.base
236
- assert_queries(1) do
237
- topics.expects(:empty?).never
238
- topics.any? { true }
239
- end
240
- end
241
-
242
- def test_any_should_not_fire_query_if_named_scope_loaded
243
- topics = Topic.base
244
- topics.collect # force load
245
- assert_no_queries { assert topics.any? }
246
- end
247
-
248
- def test_should_build_with_proxy_options
249
- topic = Topic.approved.build({})
250
- assert topic.approved
251
- end
252
-
253
- def test_should_build_new_with_proxy_options
254
- topic = Topic.approved.new
255
- assert topic.approved
256
- end
257
-
258
- def test_should_create_with_proxy_options
259
- topic = Topic.approved.create({})
260
- assert topic.approved
261
- end
262
-
263
- def test_should_create_with_bang_with_proxy_options
264
- topic = Topic.approved.create!({})
265
- assert topic.approved
266
- end
267
-
268
- def test_should_build_with_proxy_options_chained
269
- topic = Topic.approved.by_lifo.build({})
270
- assert topic.approved
271
- assert_equal 'lifo', topic.author_name
272
- end
273
-
274
- def test_find_all_should_behave_like_select
275
- assert_equal Topic.base.select(&:approved), Topic.base.find_all(&:approved)
276
- end
277
-
278
- def test_rand_should_select_a_random_object_from_proxy
279
- assert Topic.approved.sample.is_a?(Topic)
280
- end
281
-
282
- def test_should_use_where_in_query_for_named_scope
283
- assert_equal Developer.find_all_by_name('Jamis').to_set, Developer.find_all_by_id(Developer.jamises).to_set
284
- end
285
-
286
- def test_size_should_use_count_when_results_are_not_loaded
287
- topics = Topic.base
288
- assert_queries(1) do
289
- assert_sql(/COUNT/i) { topics.size }
290
- end
291
- end
292
-
293
- def test_size_should_use_length_when_results_are_loaded
294
- topics = Topic.base
295
- topics.reload # force load
296
- assert_no_queries do
297
- topics.size # use loaded (no query)
298
- end
299
- end
300
-
301
- def test_chaining_with_duplicate_joins
302
- join = "INNER JOIN comments ON comments.post_id = posts.id"
303
- post = Post.find(1)
304
- assert_equal post.comments.size, Post.scoped(:joins => join).scoped(:joins => join, :conditions => "posts.id = #{post.id}").size
305
- end
306
-
307
- def test_chaining_should_use_latest_conditions_when_creating
308
- post = Topic.rejected.new
309
- assert !post.approved?
310
-
311
- post = Topic.rejected.approved.new
312
- assert post.approved?
313
-
314
- post = Topic.approved.rejected.new
315
- assert !post.approved?
316
-
317
- post = Topic.approved.rejected.approved.new
318
- assert post.approved?
319
- end
320
-
321
- def test_chaining_should_use_latest_conditions_when_searching
322
- # Normal hash conditions
323
- assert_equal Topic.all(:conditions => {:approved => true}), Topic.rejected.approved.all
324
- assert_equal Topic.all(:conditions => {:approved => false}), Topic.approved.rejected.all
325
-
326
- # Nested hash conditions with same keys
327
- assert_equal [posts(:sti_comments)], Post.with_special_comments.with_very_special_comments.all
328
-
329
- # Nested hash conditions with different keys
330
- assert_equal [posts(:sti_comments)], Post.with_special_comments.with_post(4).all.uniq
331
- end
332
-
333
- def test_named_scopes_batch_finders
334
- assert_equal 3, Topic.approved.count
335
-
336
- assert_queries(4) do
337
- Topic.approved.find_each(:batch_size => 1) {|t| assert t.approved? }
338
- end
339
-
340
- assert_queries(2) do
341
- Topic.approved.find_in_batches(:batch_size => 2) do |group|
342
- group.each {|t| assert t.approved? }
343
- end
344
- end
345
- end
346
-
347
- def test_table_names_for_chaining_scopes_with_and_without_table_name_included
348
- assert_nothing_raised do
349
- Comment.for_first_post.for_first_author.all
350
- end
351
- end
352
- end
353
-
354
- class DynamicScopeMatchTest < ActiveRecord::TestCase
355
- def test_scoped_by_no_match
356
- assert_nil ActiveRecord::DynamicScopeMatch.match("not_scoped_at_all")
357
- end
358
-
359
- def test_scoped_by
360
- match = ActiveRecord::DynamicScopeMatch.match("scoped_by_age_and_sex_and_location")
361
- assert_not_nil match
362
- assert match.scope?
363
- assert_equal %w(age sex location), match.attribute_names
364
- end
365
- end
366
-
367
- class DynamicScopeTest < ActiveRecord::TestCase
368
- def test_dynamic_scope
369
- assert_equal Post.scoped_by_author_id(1).find(1), Post.find(1)
370
- assert_equal Post.scoped_by_author_id_and_title(1, "Welcome to the weblog").first, Post.find(:first, :conditions => { :author_id => 1, :title => "Welcome to the weblog"})
371
- end
372
- end