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,68 +0,0 @@
1
- $:.unshift(File.dirname(__FILE__) + '/../../lib')
2
- $:.unshift(File.dirname(__FILE__) + '/../../../activesupport/lib')
3
-
4
- require 'config'
5
-
6
- require 'rubygems'
7
- require 'test/unit'
8
- require 'stringio'
9
-
10
- require 'active_record'
11
- require 'active_record/test_case'
12
- require 'active_record/fixtures'
13
- require 'connection'
14
-
15
- require 'cases/repair_helper'
16
-
17
- # Show backtraces for deprecated behavior for quicker cleanup.
18
- ActiveSupport::Deprecation.debug = true
19
-
20
- # Quote "type" if it's a reserved word for the current connection.
21
- QUOTED_TYPE = ActiveRecord::Base.connection.quote_column_name('type')
22
-
23
- def current_adapter?(*types)
24
- types.any? do |type|
25
- ActiveRecord::ConnectionAdapters.const_defined?(type) &&
26
- ActiveRecord::Base.connection.is_a?(ActiveRecord::ConnectionAdapters.const_get(type))
27
- end
28
- end
29
-
30
- ActiveRecord::Base.connection.class.class_eval do
31
- IGNORED_SQL = [/^PRAGMA/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/, /^SELECT @@ROWCOUNT/, /^SAVEPOINT/, /^ROLLBACK TO SAVEPOINT/, /^RELEASE SAVEPOINT/, /SHOW FIELDS/]
32
-
33
- def execute_with_query_record(sql, name = nil, &block)
34
- $queries_executed ||= []
35
- $queries_executed << sql unless IGNORED_SQL.any? { |r| sql =~ r }
36
- execute_without_query_record(sql, name, &block)
37
- end
38
-
39
- alias_method_chain :execute, :query_record
40
- end
41
-
42
- # Make with_scope public for tests
43
- class << ActiveRecord::Base
44
- public :with_scope, :with_exclusive_scope
45
- end
46
-
47
- unless ENV['FIXTURE_DEBUG']
48
- module ActiveRecord::TestFixtures::ClassMethods
49
- def try_to_load_dependency_with_silence(*args)
50
- ActiveRecord::Base.logger.silence { try_to_load_dependency_without_silence(*args)}
51
- end
52
-
53
- alias_method_chain :try_to_load_dependency, :silence
54
- end
55
- end
56
-
57
- class ActiveSupport::TestCase
58
- include ActiveRecord::TestFixtures
59
- include ActiveRecord::Testing::RepairHelper
60
-
61
- self.fixture_path = FIXTURES_ROOT
62
- self.use_instantiated_fixtures = false
63
- self.use_transactional_fixtures = true
64
-
65
- def create_fixtures(*table_names, &block)
66
- Fixtures.create_fixtures(ActiveSupport::TestCase.fixture_path, table_names, {}, &block)
67
- end
68
- end
@@ -1,46 +0,0 @@
1
- require "cases/helper"
2
- require 'models/topic'
3
- require 'models/reply'
4
-
5
- class ActiveRecordI18nTests < Test::Unit::TestCase
6
-
7
- def setup
8
- I18n.backend = I18n::Backend::Simple.new
9
- end
10
-
11
- def test_translated_model_attributes
12
- I18n.backend.store_translations 'en', :activerecord => {:attributes => {:topic => {:title => 'topic title attribute'} } }
13
- assert_equal 'topic title attribute', Topic.human_attribute_name('title')
14
- end
15
-
16
- def test_translated_model_attributes_with_symbols
17
- I18n.backend.store_translations 'en', :activerecord => {:attributes => {:topic => {:title => 'topic title attribute'} } }
18
- assert_equal 'topic title attribute', Topic.human_attribute_name(:title)
19
- end
20
-
21
- def test_translated_model_attributes_with_sti
22
- I18n.backend.store_translations 'en', :activerecord => {:attributes => {:reply => {:title => 'reply title attribute'} } }
23
- assert_equal 'reply title attribute', Reply.human_attribute_name('title')
24
- end
25
-
26
- def test_translated_model_attributes_with_sti_fallback
27
- I18n.backend.store_translations 'en', :activerecord => {:attributes => {:topic => {:title => 'topic title attribute'} } }
28
- assert_equal 'topic title attribute', Reply.human_attribute_name('title')
29
- end
30
-
31
- def test_translated_model_names
32
- I18n.backend.store_translations 'en', :activerecord => {:models => {:topic => 'topic model'} }
33
- assert_equal 'topic model', Topic.human_name
34
- end
35
-
36
- def test_translated_model_names_with_sti
37
- I18n.backend.store_translations 'en', :activerecord => {:models => {:reply => 'reply model'} }
38
- assert_equal 'reply model', Reply.human_name
39
- end
40
-
41
- def test_translated_model_names_with_sti_fallback
42
- I18n.backend.store_translations 'en', :activerecord => {:models => {:topic => 'topic model'} }
43
- assert_equal 'topic model', Reply.human_name
44
- end
45
- end
46
-
@@ -1,262 +0,0 @@
1
- require "cases/helper"
2
- require 'models/company'
3
- require 'models/project'
4
- require 'models/subscriber'
5
-
6
- class InheritanceTest < ActiveRecord::TestCase
7
- fixtures :companies, :projects, :subscribers, :accounts
8
-
9
- def test_class_with_store_full_sti_class_returns_full_name
10
- old = ActiveRecord::Base.store_full_sti_class
11
- ActiveRecord::Base.store_full_sti_class = true
12
- assert_equal 'Namespaced::Company', Namespaced::Company.sti_name
13
- ensure
14
- ActiveRecord::Base.store_full_sti_class = old
15
- end
16
-
17
- def test_class_without_store_full_sti_class_returns_demodulized_name
18
- old = ActiveRecord::Base.store_full_sti_class
19
- ActiveRecord::Base.store_full_sti_class = false
20
- assert_equal 'Company', Namespaced::Company.sti_name
21
- ensure
22
- ActiveRecord::Base.store_full_sti_class = old
23
- end
24
-
25
- def test_should_store_demodulized_class_name_with_store_full_sti_class_option_disabled
26
- old = ActiveRecord::Base.store_full_sti_class
27
- ActiveRecord::Base.store_full_sti_class = false
28
- item = Namespaced::Company.new
29
- assert_equal 'Company', item[:type]
30
- ensure
31
- ActiveRecord::Base.store_full_sti_class = old
32
- end
33
-
34
- def test_should_store_full_class_name_with_store_full_sti_class_option_enabled
35
- old = ActiveRecord::Base.store_full_sti_class
36
- ActiveRecord::Base.store_full_sti_class = true
37
- item = Namespaced::Company.new
38
- assert_equal 'Namespaced::Company', item[:type]
39
- ensure
40
- ActiveRecord::Base.store_full_sti_class = old
41
- end
42
-
43
- def test_different_namespace_subclass_should_load_correctly_with_store_full_sti_class_option
44
- old = ActiveRecord::Base.store_full_sti_class
45
- ActiveRecord::Base.store_full_sti_class = true
46
- item = Namespaced::Company.create :name => "Wolverine 2"
47
- assert_not_nil Company.find(item.id)
48
- assert_not_nil Namespaced::Company.find(item.id)
49
- ensure
50
- ActiveRecord::Base.store_full_sti_class = old
51
- end
52
-
53
- def test_company_descends_from_active_record
54
- assert_raise(NoMethodError) { ActiveRecord::Base.descends_from_active_record? }
55
- assert AbstractCompany.descends_from_active_record?, 'AbstractCompany should descend from ActiveRecord::Base'
56
- assert Company.descends_from_active_record?, 'Company should descend from ActiveRecord::Base'
57
- assert !Class.new(Company).descends_from_active_record?, 'Company subclass should not descend from ActiveRecord::Base'
58
- end
59
-
60
- def test_a_bad_type_column
61
- #SQLServer need to turn Identity Insert On before manually inserting into the Identity column
62
- if current_adapter?(:SybaseAdapter)
63
- Company.connection.execute "SET IDENTITY_INSERT companies ON"
64
- end
65
- Company.connection.insert "INSERT INTO companies (id, #{QUOTED_TYPE}, name) VALUES(100, 'bad_class!', 'Not happening')"
66
-
67
- #We then need to turn it back Off before continuing.
68
- if current_adapter?(:SybaseAdapter)
69
- Company.connection.execute "SET IDENTITY_INSERT companies OFF"
70
- end
71
- assert_raise(ActiveRecord::SubclassNotFound) { Company.find(100) }
72
- end
73
-
74
- def test_inheritance_find
75
- assert Company.find(1).kind_of?(Firm), "37signals should be a firm"
76
- assert Firm.find(1).kind_of?(Firm), "37signals should be a firm"
77
- assert Company.find(2).kind_of?(Client), "Summit should be a client"
78
- assert Client.find(2).kind_of?(Client), "Summit should be a client"
79
- end
80
-
81
- def test_alt_inheritance_find
82
- switch_to_alt_inheritance_column
83
- test_inheritance_find
84
- switch_to_default_inheritance_column
85
- end
86
-
87
- def test_inheritance_find_all
88
- companies = Company.find(:all, :order => 'id')
89
- assert companies[0].kind_of?(Firm), "37signals should be a firm"
90
- assert companies[1].kind_of?(Client), "Summit should be a client"
91
- end
92
-
93
- def test_alt_inheritance_find_all
94
- switch_to_alt_inheritance_column
95
- test_inheritance_find_all
96
- switch_to_default_inheritance_column
97
- end
98
-
99
- def test_inheritance_save
100
- firm = Firm.new
101
- firm.name = "Next Angle"
102
- firm.save
103
-
104
- next_angle = Company.find(firm.id)
105
- assert next_angle.kind_of?(Firm), "Next Angle should be a firm"
106
- end
107
-
108
- def test_alt_inheritance_save
109
- switch_to_alt_inheritance_column
110
- test_inheritance_save
111
- switch_to_default_inheritance_column
112
- end
113
-
114
- def test_inheritance_condition
115
- assert_equal 9, Company.count
116
- assert_equal 2, Firm.count
117
- assert_equal 3, Client.count
118
- end
119
-
120
- def test_alt_inheritance_condition
121
- switch_to_alt_inheritance_column
122
- test_inheritance_condition
123
- switch_to_default_inheritance_column
124
- end
125
-
126
- def test_finding_incorrect_type_data
127
- assert_raise(ActiveRecord::RecordNotFound) { Firm.find(2) }
128
- assert_nothing_raised { Firm.find(1) }
129
- end
130
-
131
- def test_alt_finding_incorrect_type_data
132
- switch_to_alt_inheritance_column
133
- test_finding_incorrect_type_data
134
- switch_to_default_inheritance_column
135
- end
136
-
137
- def test_update_all_within_inheritance
138
- Client.update_all "name = 'I am a client'"
139
- assert_equal "I am a client", Client.find(:all).first.name
140
- assert_equal "37signals", Firm.find(:all).first.name
141
- end
142
-
143
- def test_alt_update_all_within_inheritance
144
- switch_to_alt_inheritance_column
145
- test_update_all_within_inheritance
146
- switch_to_default_inheritance_column
147
- end
148
-
149
- def test_destroy_all_within_inheritance
150
- Client.destroy_all
151
- assert_equal 0, Client.count
152
- assert_equal 2, Firm.count
153
- end
154
-
155
- def test_alt_destroy_all_within_inheritance
156
- switch_to_alt_inheritance_column
157
- test_destroy_all_within_inheritance
158
- switch_to_default_inheritance_column
159
- end
160
-
161
- def test_find_first_within_inheritance
162
- assert_kind_of Firm, Company.find(:first, :conditions => "name = '37signals'")
163
- assert_kind_of Firm, Firm.find(:first, :conditions => "name = '37signals'")
164
- assert_nil Client.find(:first, :conditions => "name = '37signals'")
165
- end
166
-
167
- def test_alt_find_first_within_inheritance
168
- switch_to_alt_inheritance_column
169
- test_find_first_within_inheritance
170
- switch_to_default_inheritance_column
171
- end
172
-
173
- def test_complex_inheritance
174
- very_special_client = VerySpecialClient.create("name" => "veryspecial")
175
- assert_equal very_special_client, VerySpecialClient.find(:first, :conditions => "name = 'veryspecial'")
176
- assert_equal very_special_client, SpecialClient.find(:first, :conditions => "name = 'veryspecial'")
177
- assert_equal very_special_client, Company.find(:first, :conditions => "name = 'veryspecial'")
178
- assert_equal very_special_client, Client.find(:first, :conditions => "name = 'veryspecial'")
179
- assert_equal 1, Client.find(:all, :conditions => "name = 'Summit'").size
180
- assert_equal very_special_client, Client.find(very_special_client.id)
181
- end
182
-
183
- def test_alt_complex_inheritance
184
- switch_to_alt_inheritance_column
185
- test_complex_inheritance
186
- switch_to_default_inheritance_column
187
- end
188
-
189
- def test_eager_load_belongs_to_something_inherited
190
- account = Account.find(1, :include => :firm)
191
- assert_not_nil account.instance_variable_get("@firm"), "nil proves eager load failed"
192
- end
193
-
194
- def test_eager_load_belongs_to_primary_key_quoting
195
- con = Account.connection
196
- assert_sql(/\(#{con.quote_table_name('companies')}.#{con.quote_column_name('id')} = 1\)/) do
197
- Account.find(1, :include => :firm)
198
- end
199
- end
200
-
201
- def test_alt_eager_loading
202
- switch_to_alt_inheritance_column
203
- test_eager_load_belongs_to_something_inherited
204
- switch_to_default_inheritance_column
205
- end
206
-
207
- def test_inheritance_without_mapping
208
- assert_kind_of SpecialSubscriber, SpecialSubscriber.find("webster132")
209
- assert_nothing_raised { s = SpecialSubscriber.new("name" => "And breaaaaathe!"); s.id = 'roger'; s.save }
210
- end
211
-
212
- private
213
- def switch_to_alt_inheritance_column
214
- # we don't want misleading test results, so get rid of the values in the type column
215
- Company.find(:all, :order => 'id').each do |c|
216
- c['type'] = nil
217
- c.save
218
- end
219
- [ Company, Firm, Client].each { |klass| klass.reset_column_information }
220
- Company.set_inheritance_column('ruby_type')
221
- end
222
- def switch_to_default_inheritance_column
223
- [ Company, Firm, Client].each { |klass| klass.reset_column_information }
224
- Company.set_inheritance_column('type')
225
- end
226
- end
227
-
228
-
229
- class InheritanceComputeTypeTest < ActiveRecord::TestCase
230
- fixtures :companies
231
-
232
- def setup
233
- ActiveSupport::Dependencies.log_activity = true
234
- end
235
-
236
- def teardown
237
- ActiveSupport::Dependencies.log_activity = false
238
- self.class.const_remove :FirmOnTheFly rescue nil
239
- Firm.const_remove :FirmOnTheFly rescue nil
240
- end
241
-
242
- def test_instantiation_doesnt_try_to_require_corresponding_file
243
- foo = Firm.find(:first).clone
244
- foo.ruby_type = foo.type = 'FirmOnTheFly'
245
- foo.save!
246
-
247
- # Should fail without FirmOnTheFly in the type condition.
248
- assert_raise(ActiveRecord::RecordNotFound) { Firm.find(foo.id) }
249
-
250
- # Nest FirmOnTheFly in the test case where Dependencies won't see it.
251
- self.class.const_set :FirmOnTheFly, Class.new(Firm)
252
- assert_raise(ActiveRecord::SubclassNotFound) { Firm.find(foo.id) }
253
-
254
- # Nest FirmOnTheFly in Firm where Dependencies will see it.
255
- # This is analogous to nesting models in a migration.
256
- Firm.const_set :FirmOnTheFly, Class.new(Firm)
257
-
258
- # And instantiate will find the existing constant rather than trying
259
- # to require firm_on_the_fly.
260
- assert_nothing_raised { assert_kind_of Firm::FirmOnTheFly, Firm.find(foo.id) }
261
- end
262
- end
@@ -1,24 +0,0 @@
1
- require 'cases/helper'
2
- require 'models/topic'
3
-
4
- class InvalidDateTest < Test::Unit::TestCase
5
- def test_assign_valid_dates
6
- valid_dates = [[2007, 11, 30], [1993, 2, 28], [2008, 2, 29]]
7
-
8
- invalid_dates = [[2007, 11, 31], [1993, 2, 29], [2007, 2, 29]]
9
-
10
- topic = Topic.new
11
-
12
- valid_dates.each do |date_src|
13
- topic = Topic.new("last_read(1i)" => date_src[0].to_s, "last_read(2i)" => date_src[1].to_s, "last_read(3i)" => date_src[2].to_s)
14
- assert_equal(topic.last_read, Date.new(*date_src))
15
- end
16
-
17
- invalid_dates.each do |date_src|
18
- assert_nothing_raised do
19
- topic = Topic.new({"last_read(1i)" => date_src[0].to_s, "last_read(2i)" => date_src[1].to_s, "last_read(3i)" => date_src[2].to_s})
20
- assert_equal(topic.last_read, Time.local(*date_src).to_date, "The date should be modified according to the behaviour of the Time object")
21
- end
22
- end
23
- end
24
- end
@@ -1,219 +0,0 @@
1
- require "cases/helper"
2
- require 'models/contact'
3
- require 'models/post'
4
- require 'models/author'
5
- require 'models/tagging'
6
- require 'models/tag'
7
- require 'models/comment'
8
-
9
- class JsonSerializationTest < ActiveRecord::TestCase
10
- class NamespacedContact < Contact
11
- column :name, :string
12
- end
13
-
14
- def setup
15
- @contact = Contact.new(
16
- :name => 'Konata Izumi',
17
- :age => 16,
18
- :avatar => 'binarydata',
19
- :created_at => Time.utc(2006, 8, 1),
20
- :awesome => true,
21
- :preferences => { :shows => 'anime' }
22
- )
23
- end
24
-
25
- def test_should_demodulize_root_in_json
26
- NamespacedContact.include_root_in_json = true
27
- @contact = NamespacedContact.new :name => 'whatever'
28
- json = @contact.to_json
29
- assert_match %r{^\{"namespaced_contact":\{}, json
30
- end
31
-
32
- def test_should_include_root_in_json
33
- Contact.include_root_in_json = true
34
- json = @contact.to_json
35
-
36
- assert_match %r{^\{"contact":\{}, json
37
- assert_match %r{"name":"Konata Izumi"}, json
38
- assert_match %r{"age":16}, json
39
- assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
40
- assert_match %r{"awesome":true}, json
41
- assert_match %r{"preferences":\{"shows":"anime"\}}, json
42
- ensure
43
- Contact.include_root_in_json = false
44
- end
45
-
46
- def test_should_include_root_in_json
47
- Contact.include_root_in_json = true
48
- json = @contact.to_json(:root => 'json_contact')
49
-
50
- assert_match %r{^\{"json_contact":\{}, json
51
- assert_match %r{"name":"Konata Izumi"}, json
52
- assert_match %r{"age":16}, json
53
- assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
54
- assert_match %r{"awesome":true}, json
55
- assert_match %r{"preferences":\{"shows":"anime"\}}, json
56
- ensure
57
- Contact.include_root_in_json = false
58
- end
59
-
60
- def test_should_encode_all_encodable_attributes
61
- json = @contact.to_json
62
-
63
- assert_match %r{"name":"Konata Izumi"}, json
64
- assert_match %r{"age":16}, json
65
- assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
66
- assert_match %r{"awesome":true}, json
67
- assert_match %r{"preferences":\{"shows":"anime"\}}, json
68
- end
69
-
70
- def test_should_allow_attribute_filtering_with_only
71
- json = @contact.to_json(:only => [:name, :age])
72
-
73
- assert_match %r{"name":"Konata Izumi"}, json
74
- assert_match %r{"age":16}, json
75
- assert_no_match %r{"awesome":true}, json
76
- assert !json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
77
- assert_no_match %r{"preferences":\{"shows":"anime"\}}, json
78
- end
79
-
80
- def test_should_allow_attribute_filtering_with_except
81
- json = @contact.to_json(:except => [:name, :age])
82
-
83
- assert_no_match %r{"name":"Konata Izumi"}, json
84
- assert_no_match %r{"age":16}, json
85
- assert_match %r{"awesome":true}, json
86
- assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
87
- assert_match %r{"preferences":\{"shows":"anime"\}}, json
88
- end
89
-
90
- def test_methods_are_called_on_object
91
- # Define methods on fixture.
92
- def @contact.label; "Has cheezburger"; end
93
- def @contact.favorite_quote; "Constraints are liberating"; end
94
-
95
- # Single method.
96
- assert_match %r{"label":"Has cheezburger"}, @contact.to_json(:only => :name, :methods => :label)
97
-
98
- # Both methods.
99
- methods_json = @contact.to_json(:only => :name, :methods => [:label, :favorite_quote])
100
- assert_match %r{"label":"Has cheezburger"}, methods_json
101
- assert_match %r{"favorite_quote":"Constraints are liberating"}, methods_json
102
- end
103
- end
104
-
105
- class DatabaseConnectedJsonEncodingTest < ActiveRecord::TestCase
106
- fixtures :authors, :posts, :comments, :tags, :taggings
107
-
108
- def setup
109
- @david = authors(:david)
110
- @mary = authors(:mary)
111
- end
112
-
113
- def test_includes_uses_association_name
114
- json = @david.to_json(:include => :posts)
115
-
116
- assert_match %r{"posts":\[}, json
117
-
118
- assert_match %r{"id":1}, json
119
- assert_match %r{"name":"David"}, json
120
-
121
- assert_match %r{"author_id":1}, json
122
- assert_match %r{"title":"Welcome to the weblog"}, json
123
- assert_match %r{"body":"Such a lovely day"}, json
124
-
125
- assert_match %r{"title":"So I was thinking"}, json
126
- assert_match %r{"body":"Like I hopefully always am"}, json
127
- end
128
-
129
- def test_includes_uses_association_name_and_applies_attribute_filters
130
- json = @david.to_json(:include => { :posts => { :only => :title } })
131
-
132
- assert_match %r{"name":"David"}, json
133
- assert_match %r{"posts":\[}, json
134
-
135
- assert_match %r{"title":"Welcome to the weblog"}, json
136
- assert_no_match %r{"body":"Such a lovely day"}, json
137
-
138
- assert_match %r{"title":"So I was thinking"}, json
139
- assert_no_match %r{"body":"Like I hopefully always am"}, json
140
- end
141
-
142
- def test_includes_fetches_second_level_associations
143
- json = @david.to_json(:include => { :posts => { :include => { :comments => { :only => :body } } } })
144
-
145
- assert_match %r{"name":"David"}, json
146
- assert_match %r{"posts":\[}, json
147
-
148
- assert_match %r{"comments":\[}, json
149
- assert_match %r{\{"body":"Thank you again for the welcome"\}}, json
150
- assert_match %r{\{"body":"Don't think too hard"\}}, json
151
- assert_no_match %r{"post_id":}, json
152
- end
153
-
154
- def test_includes_fetches_nth_level_associations
155
- json = @david.to_json(
156
- :include => {
157
- :posts => {
158
- :include => {
159
- :taggings => {
160
- :include => {
161
- :tag => { :only => :name }
162
- }
163
- }
164
- }
165
- }
166
- })
167
-
168
- assert_match %r{"name":"David"}, json
169
- assert_match %r{"posts":\[}, json
170
-
171
- assert_match %r{"taggings":\[}, json
172
- assert_match %r{"tag":\{"name":"General"\}}, json
173
- end
174
-
175
- def test_should_not_call_methods_on_associations_that_dont_respond
176
- def @david.favorite_quote; "Constraints are liberating"; end
177
- json = @david.to_json(:include => :posts, :methods => :favorite_quote)
178
-
179
- assert !@david.posts.first.respond_to?(:favorite_quote)
180
- assert_match %r{"favorite_quote":"Constraints are liberating"}, json
181
- assert_equal %r{"favorite_quote":}.match(json).size, 1
182
- end
183
-
184
- def test_should_allow_only_option_for_list_of_authors
185
- authors = [@david, @mary]
186
-
187
- assert_equal %([{"name":"David"},{"name":"Mary"}]), ActiveSupport::JSON.encode(authors, :only => :name)
188
- end
189
-
190
- def test_should_allow_except_option_for_list_of_authors
191
- authors = [@david, @mary]
192
-
193
- assert_equal %([{"id":1},{"id":2}]), ActiveSupport::JSON.encode(authors, :except => [:name, :author_address_id, :author_address_extra_id])
194
- end
195
-
196
- def test_should_allow_includes_for_list_of_authors
197
- authors = [@david, @mary]
198
- json = ActiveSupport::JSON.encode(authors,
199
- :only => :name,
200
- :include => {
201
- :posts => { :only => :id }
202
- }
203
- )
204
-
205
- ['"name":"David"', '"posts":[', '{"id":1}', '{"id":2}', '{"id":4}',
206
- '{"id":5}', '{"id":6}', '"name":"Mary"', '"posts":[{"id":7}]'].each do |fragment|
207
- assert json.include?(fragment), json
208
- end
209
- end
210
-
211
- def test_should_allow_options_for_hash_of_authors
212
- authors_hash = {
213
- 1 => @david,
214
- 2 => @mary
215
- }
216
-
217
- assert_equal %({"1":{"name":"David"}}), ActiveSupport::JSON.encode(authors_hash, :only => [1, :name])
218
- end
219
- end