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,234 +0,0 @@
1
- require "cases/helper"
2
- require 'models/topic'
3
- require 'models/customer'
4
- require 'models/company'
5
- require 'models/company_in_module'
6
- require 'models/subscriber'
7
- require 'models/ship'
8
- require 'models/pirate'
9
-
10
- class ReflectionTest < ActiveRecord::TestCase
11
- include ActiveRecord::Reflection
12
-
13
- fixtures :topics, :customers, :companies, :subscribers
14
-
15
- def setup
16
- @first = Topic.find(1)
17
- end
18
-
19
- def test_column_null_not_null
20
- subscriber = Subscriber.find(:first)
21
- assert subscriber.column_for_attribute("name").null
22
- assert !subscriber.column_for_attribute("nick").null
23
- end
24
-
25
- def test_read_attribute_names
26
- assert_equal(
27
- %w( id title author_name author_email_address bonus_time written_on last_read content group approved replies_count parent_id parent_title type ).sort,
28
- @first.attribute_names
29
- )
30
- end
31
-
32
- def test_columns
33
- assert_equal 14, Topic.columns.length
34
- end
35
-
36
- def test_columns_are_returned_in_the_order_they_were_declared
37
- column_names = Topic.columns.map { |column| column.name }
38
- assert_equal %w(id title author_name author_email_address written_on bonus_time last_read content approved replies_count parent_id parent_title type group), column_names
39
- end
40
-
41
- def test_content_columns
42
- content_columns = Topic.content_columns
43
- content_column_names = content_columns.map {|column| column.name}
44
- assert_equal 10, content_columns.length
45
- assert_equal %w(title author_name author_email_address written_on bonus_time last_read content group approved parent_title).sort, content_column_names.sort
46
- end
47
-
48
- def test_column_string_type_and_limit
49
- assert_equal :string, @first.column_for_attribute("title").type
50
- assert_equal 255, @first.column_for_attribute("title").limit
51
- end
52
-
53
- def test_column_null_not_null
54
- subscriber = Subscriber.find(:first)
55
- assert subscriber.column_for_attribute("name").null
56
- assert !subscriber.column_for_attribute("nick").null
57
- end
58
-
59
- def test_human_name_for_column
60
- assert_equal "Author name", @first.column_for_attribute("author_name").human_name
61
- end
62
-
63
- def test_integer_columns
64
- assert_equal :integer, @first.column_for_attribute("id").type
65
- end
66
-
67
- def test_reflection_klass_for_nested_class_name
68
- reflection = MacroReflection.new(nil, nil, { :class_name => 'MyApplication::Business::Company' }, nil)
69
- assert_nothing_raised do
70
- assert_equal MyApplication::Business::Company, reflection.klass
71
- end
72
- end
73
-
74
- def test_aggregation_reflection
75
- reflection_for_address = AggregateReflection.new(
76
- :composed_of, :address, { :mapping => [ %w(address_street street), %w(address_city city), %w(address_country country) ] }, Customer
77
- )
78
-
79
- reflection_for_balance = AggregateReflection.new(
80
- :composed_of, :balance, { :class_name => "Money", :mapping => %w(balance amount) }, Customer
81
- )
82
-
83
- reflection_for_gps_location = AggregateReflection.new(
84
- :composed_of, :gps_location, { }, Customer
85
- )
86
-
87
- assert Customer.reflect_on_all_aggregations.include?(reflection_for_gps_location)
88
- assert Customer.reflect_on_all_aggregations.include?(reflection_for_balance)
89
- assert Customer.reflect_on_all_aggregations.include?(reflection_for_address)
90
-
91
- assert_equal reflection_for_address, Customer.reflect_on_aggregation(:address)
92
-
93
- assert_equal Address, Customer.reflect_on_aggregation(:address).klass
94
-
95
- assert_equal Money, Customer.reflect_on_aggregation(:balance).klass
96
- end
97
-
98
- def test_reflect_on_all_autosave_associations
99
- expected = Pirate.reflect_on_all_associations.select { |r| r.options[:autosave] }
100
- received = Pirate.reflect_on_all_autosave_associations
101
-
102
- assert !received.empty?
103
- assert_not_equal Pirate.reflect_on_all_associations.length, received.length
104
- assert_equal expected, received
105
- end
106
-
107
- def test_has_many_reflection
108
- reflection_for_clients = AssociationReflection.new(:has_many, :clients, { :order => "id", :dependent => :destroy }, Firm)
109
-
110
- assert_equal reflection_for_clients, Firm.reflect_on_association(:clients)
111
-
112
- assert_equal Client, Firm.reflect_on_association(:clients).klass
113
- assert_equal 'companies', Firm.reflect_on_association(:clients).table_name
114
-
115
- assert_equal Client, Firm.reflect_on_association(:clients_of_firm).klass
116
- assert_equal 'companies', Firm.reflect_on_association(:clients_of_firm).table_name
117
- end
118
-
119
- def test_has_one_reflection
120
- reflection_for_account = AssociationReflection.new(:has_one, :account, { :foreign_key => "firm_id", :dependent => :destroy }, Firm)
121
- assert_equal reflection_for_account, Firm.reflect_on_association(:account)
122
-
123
- assert_equal Account, Firm.reflect_on_association(:account).klass
124
- assert_equal 'accounts', Firm.reflect_on_association(:account).table_name
125
- end
126
-
127
- def test_belongs_to_inferred_foreign_key_from_assoc_name
128
- Company.belongs_to :foo
129
- assert_equal "foo_id", Company.reflect_on_association(:foo).primary_key_name
130
- Company.belongs_to :bar, :class_name => "Xyzzy"
131
- assert_equal "bar_id", Company.reflect_on_association(:bar).primary_key_name
132
- Company.belongs_to :baz, :class_name => "Xyzzy", :foreign_key => "xyzzy_id"
133
- assert_equal "xyzzy_id", Company.reflect_on_association(:baz).primary_key_name
134
- end
135
-
136
- def test_association_reflection_in_modules
137
- assert_reflection MyApplication::Business::Firm,
138
- :clients_of_firm,
139
- :klass => MyApplication::Business::Client,
140
- :class_name => 'Client',
141
- :table_name => 'companies'
142
-
143
- assert_reflection MyApplication::Billing::Account,
144
- :firm,
145
- :klass => MyApplication::Business::Firm,
146
- :class_name => 'MyApplication::Business::Firm',
147
- :table_name => 'companies'
148
-
149
- assert_reflection MyApplication::Billing::Account,
150
- :qualified_billing_firm,
151
- :klass => MyApplication::Billing::Firm,
152
- :class_name => 'MyApplication::Billing::Firm',
153
- :table_name => 'companies'
154
-
155
- assert_reflection MyApplication::Billing::Account,
156
- :unqualified_billing_firm,
157
- :klass => MyApplication::Billing::Firm,
158
- :class_name => 'Firm',
159
- :table_name => 'companies'
160
-
161
- assert_reflection MyApplication::Billing::Account,
162
- :nested_qualified_billing_firm,
163
- :klass => MyApplication::Billing::Nested::Firm,
164
- :class_name => 'MyApplication::Billing::Nested::Firm',
165
- :table_name => 'companies'
166
-
167
- assert_reflection MyApplication::Billing::Account,
168
- :nested_unqualified_billing_firm,
169
- :klass => MyApplication::Billing::Nested::Firm,
170
- :class_name => 'Nested::Firm',
171
- :table_name => 'companies'
172
- end
173
-
174
- def test_reflection_of_all_associations
175
- # FIXME these assertions bust a lot
176
- assert_equal 36, Firm.reflect_on_all_associations.size
177
- assert_equal 26, Firm.reflect_on_all_associations(:has_many).size
178
- assert_equal 10, Firm.reflect_on_all_associations(:has_one).size
179
- assert_equal 0, Firm.reflect_on_all_associations(:belongs_to).size
180
- end
181
-
182
- def test_reflection_should_not_raise_error_when_compared_to_other_object
183
- assert_nothing_raised { Firm.reflections[:clients] == Object.new }
184
- end
185
-
186
- def test_has_many_through_reflection
187
- assert_kind_of ThroughReflection, Subscriber.reflect_on_association(:books)
188
- end
189
-
190
- def test_collection_association
191
- assert Pirate.reflect_on_association(:birds).collection?
192
- assert Pirate.reflect_on_association(:parrots).collection?
193
-
194
- assert !Pirate.reflect_on_association(:ship).collection?
195
- assert !Ship.reflect_on_association(:pirate).collection?
196
- end
197
-
198
- def test_default_association_validation
199
- assert AssociationReflection.new(:has_many, :clients, {}, Firm).validate?
200
-
201
- assert !AssociationReflection.new(:has_one, :client, {}, Firm).validate?
202
- assert !AssociationReflection.new(:belongs_to, :client, {}, Firm).validate?
203
- assert !AssociationReflection.new(:has_and_belongs_to_many, :clients, {}, Firm).validate?
204
- end
205
-
206
- def test_always_validate_association_if_explicit
207
- assert AssociationReflection.new(:has_one, :client, { :validate => true }, Firm).validate?
208
- assert AssociationReflection.new(:belongs_to, :client, { :validate => true }, Firm).validate?
209
- assert AssociationReflection.new(:has_many, :clients, { :validate => true }, Firm).validate?
210
- assert AssociationReflection.new(:has_and_belongs_to_many, :clients, { :validate => true }, Firm).validate?
211
- end
212
-
213
- def test_validate_association_if_autosave
214
- assert AssociationReflection.new(:has_one, :client, { :autosave => true }, Firm).validate?
215
- assert AssociationReflection.new(:belongs_to, :client, { :autosave => true }, Firm).validate?
216
- assert AssociationReflection.new(:has_many, :clients, { :autosave => true }, Firm).validate?
217
- assert AssociationReflection.new(:has_and_belongs_to_many, :clients, { :autosave => true }, Firm).validate?
218
- end
219
-
220
- def test_never_validate_association_if_explicit
221
- assert !AssociationReflection.new(:has_one, :client, { :autosave => true, :validate => false }, Firm).validate?
222
- assert !AssociationReflection.new(:belongs_to, :client, { :autosave => true, :validate => false }, Firm).validate?
223
- assert !AssociationReflection.new(:has_many, :clients, { :autosave => true, :validate => false }, Firm).validate?
224
- assert !AssociationReflection.new(:has_and_belongs_to_many, :clients, { :autosave => true, :validate => false }, Firm).validate?
225
- end
226
-
227
- private
228
- def assert_reflection(klass, association, options)
229
- assert reflection = klass.reflect_on_association(association)
230
- options.each do |method, value|
231
- assert_equal(value, reflection.send(method))
232
- end
233
- end
234
- end
@@ -1,22 +0,0 @@
1
- require "cases/helper"
2
- require 'models/owner'
3
- require 'models/pet'
4
-
5
- class ReloadModelsTest < ActiveRecord::TestCase
6
- fixtures :pets
7
-
8
- def test_has_one_with_reload
9
- pet = Pet.find_by_name('parrot')
10
- pet.owner = Owner.find_by_name('ashley')
11
-
12
- # Reload the class Owner, simulating auto-reloading of model classes in a
13
- # development environment. Note that meanwhile the class Pet is not
14
- # reloaded, simulating a class that is present in a plugin.
15
- Object.class_eval { remove_const :Owner }
16
- Kernel.load(File.expand_path(File.join(File.dirname(__FILE__), "../models/owner.rb")))
17
-
18
- pet = Pet.find_by_name('parrot')
19
- pet.owner = Owner.find_by_name('ashley')
20
- assert_equal pet.owner, Owner.find_by_name('ashley')
21
- end
22
- end
@@ -1,50 +0,0 @@
1
- module ActiveRecord
2
- module Testing
3
- module RepairHelper
4
- def self.included(base)
5
- base.class_eval do
6
- extend ClassMethods
7
- end
8
- end
9
-
10
- module Toolbox
11
- def self.record_validations(*model_classes)
12
- model_classes.inject({}) do |repair, klass|
13
- repair[klass] ||= {}
14
- [:validate, :validate_on_create, :validate_on_update].each do |callback|
15
- the_callback = klass.instance_variable_get("@#{callback.to_s}_callbacks")
16
- repair[klass][callback] = (the_callback.nil? ? nil : the_callback.dup)
17
- end
18
- repair
19
- end
20
- end
21
-
22
- def self.reset_validations(recorded)
23
- recorded.each do |klass, repairs|
24
- [:validate, :validate_on_create, :validate_on_update].each do |callback|
25
- klass.instance_variable_set("@#{callback.to_s}_callbacks", repairs[callback])
26
- end
27
- end
28
- end
29
- end
30
-
31
- module ClassMethods
32
- def repair_validations(*model_classes)
33
- setup do
34
- @validation_repairs = ActiveRecord::Testing::RepairHelper::Toolbox.record_validations(*model_classes)
35
- end
36
- teardown do
37
- ActiveRecord::Testing::RepairHelper::Toolbox.reset_validations(@validation_repairs)
38
- end
39
- end
40
- end
41
-
42
- def repair_validations(*model_classes, &block)
43
- validation_repairs = ActiveRecord::Testing::RepairHelper::Toolbox.record_validations(*model_classes)
44
- return block.call
45
- ensure
46
- ActiveRecord::Testing::RepairHelper::Toolbox.reset_validations(validation_repairs)
47
- end
48
- end
49
- end
50
- end
@@ -1,176 +0,0 @@
1
- require "cases/helper"
2
-
3
- class Group < ActiveRecord::Base
4
- Group.table_name = 'group'
5
- belongs_to :select, :class_name => 'Select'
6
- has_one :values
7
- end
8
-
9
- class Select < ActiveRecord::Base
10
- Select.table_name = 'select'
11
- has_many :groups
12
- end
13
-
14
- class Values < ActiveRecord::Base
15
- Values.table_name = 'values'
16
- end
17
-
18
- class Distinct < ActiveRecord::Base
19
- Distinct.table_name = 'distinct'
20
- has_and_belongs_to_many :selects
21
- has_many :values, :through => :groups
22
- end
23
-
24
- # a suite of tests to ensure the ConnectionAdapters#MysqlAdapter can handle tables with
25
- # reserved word names (ie: group, order, values, etc...)
26
- class MysqlReservedWordTest < ActiveRecord::TestCase
27
- def setup
28
- @connection = ActiveRecord::Base.connection
29
-
30
- # we call execute directly here (and do similar below) because ActiveRecord::Base#create_table()
31
- # will fail with these table names if these test cases fail
32
-
33
- create_tables_directly 'group'=>'id int auto_increment primary key, `order` varchar(255), select_id int',
34
- 'select'=>'id int auto_increment primary key',
35
- 'values'=>'id int auto_increment primary key, group_id int',
36
- 'distinct'=>'id int auto_increment primary key',
37
- 'distincts_selects'=>'distinct_id int, select_id int'
38
- end
39
-
40
- def teardown
41
- drop_tables_directly ['group', 'select', 'values', 'distinct', 'distincts_selects', 'order']
42
- end
43
-
44
- # create tables with reserved-word names and columns
45
- def test_create_tables
46
- assert_nothing_raised {
47
- @connection.create_table :order do |t|
48
- t.column :group, :string
49
- end
50
- }
51
- end
52
-
53
- # rename tables with reserved-word names
54
- def test_rename_tables
55
- assert_nothing_raised { @connection.rename_table(:group, :order) }
56
- end
57
-
58
- # alter column with a reserved-word name in a table with a reserved-word name
59
- def test_change_columns
60
- assert_nothing_raised { @connection.change_column_default(:group, :order, 'whatever') }
61
- #the quoting here will reveal any double quoting issues in change_column's interaction with the column method in the adapter
62
- assert_nothing_raised { @connection.change_column('group', 'order', :Int, :default => 0) }
63
- assert_nothing_raised { @connection.rename_column(:group, :order, :values) }
64
- end
65
-
66
- # dump structure of table with reserved word name
67
- def test_structure_dump
68
- assert_nothing_raised { @connection.structure_dump }
69
- end
70
-
71
- # introspect table with reserved word name
72
- def test_introspect
73
- assert_nothing_raised { @connection.columns(:group) }
74
- assert_nothing_raised { @connection.indexes(:group) }
75
- end
76
-
77
- #fixtures
78
- self.use_instantiated_fixtures = true
79
- self.use_transactional_fixtures = false
80
-
81
- #fixtures :group
82
-
83
- def test_fixtures
84
- f = create_test_fixtures :select, :distinct, :group, :values, :distincts_selects
85
-
86
- assert_nothing_raised {
87
- f.each do |x|
88
- x.delete_existing_fixtures
89
- end
90
- }
91
-
92
- assert_nothing_raised {
93
- f.each do |x|
94
- x.insert_fixtures
95
- end
96
- }
97
- end
98
-
99
- #activerecord model class with reserved-word table name
100
- def test_activerecord_model
101
- create_test_fixtures :select, :distinct, :group, :values, :distincts_selects
102
- x = nil
103
- assert_nothing_raised { x = Group.new }
104
- x.order = 'x'
105
- assert_nothing_raised { x.save }
106
- x.order = 'y'
107
- assert_nothing_raised { x.save }
108
- assert_nothing_raised { y = Group.find_by_order('y') }
109
- assert_nothing_raised { y = Group.find(1) }
110
- x = Group.find(1)
111
- end
112
-
113
- # has_one association with reserved-word table name
114
- def test_has_one_associations
115
- create_test_fixtures :select, :distinct, :group, :values, :distincts_selects
116
- v = nil
117
- assert_nothing_raised { v = Group.find(1).values }
118
- assert_equal v.id, 2
119
- end
120
-
121
- # belongs_to association with reserved-word table name
122
- def test_belongs_to_associations
123
- create_test_fixtures :select, :distinct, :group, :values, :distincts_selects
124
- gs = nil
125
- assert_nothing_raised { gs = Select.find(2).groups }
126
- assert_equal gs.length, 2
127
- assert(gs.collect{|x| x.id}.sort == [2, 3])
128
- end
129
-
130
- # has_and_belongs_to_many with reserved-word table name
131
- def test_has_and_belongs_to_many
132
- create_test_fixtures :select, :distinct, :group, :values, :distincts_selects
133
- s = nil
134
- assert_nothing_raised { s = Distinct.find(1).selects }
135
- assert_equal s.length, 2
136
- assert(s.collect{|x|x.id}.sort == [1, 2])
137
- end
138
-
139
- # activerecord model introspection with reserved-word table and column names
140
- def test_activerecord_introspection
141
- assert_nothing_raised { Group.table_exists? }
142
- assert_nothing_raised { Group.columns }
143
- end
144
-
145
- # Calculations
146
- def test_calculations_work_with_reserved_words
147
- assert_nothing_raised { Group.count }
148
- end
149
-
150
- def test_associations_work_with_reserved_words
151
- assert_nothing_raised { Select.find(:all, :include => [:groups]) }
152
- end
153
-
154
- #the following functions were added to DRY test cases
155
-
156
- private
157
- # custom fixture loader, uses Fixtures#create_fixtures and appends base_path to the current file's path
158
- def create_test_fixtures(*fixture_names)
159
- Fixtures.create_fixtures(FIXTURES_ROOT + "/reserved_words", fixture_names)
160
- end
161
-
162
- # custom drop table, uses execute on connection to drop a table if it exists. note: escapes table_name
163
- def drop_tables_directly(table_names, connection = @connection)
164
- table_names.each do |name|
165
- connection.execute("DROP TABLE IF EXISTS `#{name}`")
166
- end
167
- end
168
-
169
- # custom create table, uses execute on connection to create a table, note: escapes table_name, does NOT escape columns
170
- def create_tables_directly (tables, connection = @connection)
171
- tables.each do |table_name, column_properties|
172
- connection.execute("CREATE TABLE `#{table_name}` ( #{column_properties} )")
173
- end
174
- end
175
-
176
- end