activerecord_csi 2.3.5.p6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. data/CHANGELOG +5858 -0
  2. data/README +351 -0
  3. data/RUNNING_UNIT_TESTS +36 -0
  4. data/Rakefile +270 -0
  5. data/examples/associations.png +0 -0
  6. data/examples/performance.rb +162 -0
  7. data/install.rb +30 -0
  8. data/lib/active_record/aggregations.rb +261 -0
  9. data/lib/active_record/association_preload.rb +389 -0
  10. data/lib/active_record/associations/association_collection.rb +475 -0
  11. data/lib/active_record/associations/association_proxy.rb +278 -0
  12. data/lib/active_record/associations/belongs_to_association.rb +76 -0
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +53 -0
  14. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +143 -0
  15. data/lib/active_record/associations/has_many_association.rb +122 -0
  16. data/lib/active_record/associations/has_many_through_association.rb +266 -0
  17. data/lib/active_record/associations/has_one_association.rb +133 -0
  18. data/lib/active_record/associations/has_one_through_association.rb +37 -0
  19. data/lib/active_record/associations.rb +2241 -0
  20. data/lib/active_record/attribute_methods.rb +388 -0
  21. data/lib/active_record/autosave_association.rb +364 -0
  22. data/lib/active_record/base.rb +3171 -0
  23. data/lib/active_record/batches.rb +81 -0
  24. data/lib/active_record/calculations.rb +311 -0
  25. data/lib/active_record/callbacks.rb +360 -0
  26. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +371 -0
  27. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +139 -0
  28. data/lib/active_record/connection_adapters/abstract/database_statements.rb +289 -0
  29. data/lib/active_record/connection_adapters/abstract/query_cache.rb +94 -0
  30. data/lib/active_record/connection_adapters/abstract/quoting.rb +69 -0
  31. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +722 -0
  32. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +434 -0
  33. data/lib/active_record/connection_adapters/abstract_adapter.rb +241 -0
  34. data/lib/active_record/connection_adapters/mysql_adapter.rb +630 -0
  35. data/lib/active_record/connection_adapters/postgresql_adapter.rb +1113 -0
  36. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +34 -0
  37. data/lib/active_record/connection_adapters/sqlite_adapter.rb +453 -0
  38. data/lib/active_record/dirty.rb +183 -0
  39. data/lib/active_record/dynamic_finder_match.rb +41 -0
  40. data/lib/active_record/dynamic_scope_match.rb +25 -0
  41. data/lib/active_record/fixtures.rb +996 -0
  42. data/lib/active_record/i18n_interpolation_deprecation.rb +26 -0
  43. data/lib/active_record/locale/en.yml +58 -0
  44. data/lib/active_record/locking/optimistic.rb +148 -0
  45. data/lib/active_record/locking/pessimistic.rb +55 -0
  46. data/lib/active_record/migration.rb +566 -0
  47. data/lib/active_record/named_scope.rb +192 -0
  48. data/lib/active_record/nested_attributes.rb +392 -0
  49. data/lib/active_record/observer.rb +197 -0
  50. data/lib/active_record/query_cache.rb +33 -0
  51. data/lib/active_record/reflection.rb +320 -0
  52. data/lib/active_record/schema.rb +51 -0
  53. data/lib/active_record/schema_dumper.rb +182 -0
  54. data/lib/active_record/serialization.rb +101 -0
  55. data/lib/active_record/serializers/json_serializer.rb +91 -0
  56. data/lib/active_record/serializers/xml_serializer.rb +357 -0
  57. data/lib/active_record/session_store.rb +326 -0
  58. data/lib/active_record/test_case.rb +66 -0
  59. data/lib/active_record/timestamp.rb +71 -0
  60. data/lib/active_record/transactions.rb +235 -0
  61. data/lib/active_record/validations.rb +1135 -0
  62. data/lib/active_record/version.rb +9 -0
  63. data/lib/active_record.rb +84 -0
  64. data/lib/activerecord.rb +2 -0
  65. data/test/assets/example.log +1 -0
  66. data/test/assets/flowers.jpg +0 -0
  67. data/test/cases/aaa_create_tables_test.rb +24 -0
  68. data/test/cases/active_schema_test_mysql.rb +100 -0
  69. data/test/cases/active_schema_test_postgresql.rb +24 -0
  70. data/test/cases/adapter_test.rb +145 -0
  71. data/test/cases/aggregations_test.rb +167 -0
  72. data/test/cases/ar_schema_test.rb +32 -0
  73. data/test/cases/associations/belongs_to_associations_test.rb +425 -0
  74. data/test/cases/associations/callbacks_test.rb +161 -0
  75. data/test/cases/associations/cascaded_eager_loading_test.rb +131 -0
  76. data/test/cases/associations/eager_load_includes_full_sti_class_test.rb +36 -0
  77. data/test/cases/associations/eager_load_nested_include_test.rb +130 -0
  78. data/test/cases/associations/eager_singularization_test.rb +145 -0
  79. data/test/cases/associations/eager_test.rb +834 -0
  80. data/test/cases/associations/extension_test.rb +62 -0
  81. data/test/cases/associations/habtm_join_table_test.rb +56 -0
  82. data/test/cases/associations/has_and_belongs_to_many_associations_test.rb +822 -0
  83. data/test/cases/associations/has_many_associations_test.rb +1134 -0
  84. data/test/cases/associations/has_many_through_associations_test.rb +346 -0
  85. data/test/cases/associations/has_one_associations_test.rb +330 -0
  86. data/test/cases/associations/has_one_through_associations_test.rb +209 -0
  87. data/test/cases/associations/inner_join_association_test.rb +93 -0
  88. data/test/cases/associations/join_model_test.rb +712 -0
  89. data/test/cases/associations_test.rb +262 -0
  90. data/test/cases/attribute_methods_test.rb +305 -0
  91. data/test/cases/autosave_association_test.rb +1142 -0
  92. data/test/cases/base_test.rb +2154 -0
  93. data/test/cases/batches_test.rb +61 -0
  94. data/test/cases/binary_test.rb +30 -0
  95. data/test/cases/calculations_test.rb +348 -0
  96. data/test/cases/callbacks_observers_test.rb +38 -0
  97. data/test/cases/callbacks_test.rb +438 -0
  98. data/test/cases/class_inheritable_attributes_test.rb +32 -0
  99. data/test/cases/column_alias_test.rb +17 -0
  100. data/test/cases/column_definition_test.rb +70 -0
  101. data/test/cases/connection_pool_test.rb +25 -0
  102. data/test/cases/connection_test_firebird.rb +8 -0
  103. data/test/cases/connection_test_mysql.rb +64 -0
  104. data/test/cases/copy_table_test_sqlite.rb +80 -0
  105. data/test/cases/database_statements_test.rb +12 -0
  106. data/test/cases/datatype_test_postgresql.rb +204 -0
  107. data/test/cases/date_time_test.rb +37 -0
  108. data/test/cases/default_test_firebird.rb +16 -0
  109. data/test/cases/defaults_test.rb +111 -0
  110. data/test/cases/deprecated_finder_test.rb +30 -0
  111. data/test/cases/dirty_test.rb +316 -0
  112. data/test/cases/finder_respond_to_test.rb +76 -0
  113. data/test/cases/finder_test.rb +1066 -0
  114. data/test/cases/fixtures_test.rb +656 -0
  115. data/test/cases/helper.rb +68 -0
  116. data/test/cases/i18n_test.rb +46 -0
  117. data/test/cases/inheritance_test.rb +262 -0
  118. data/test/cases/invalid_date_test.rb +24 -0
  119. data/test/cases/json_serialization_test.rb +205 -0
  120. data/test/cases/lifecycle_test.rb +193 -0
  121. data/test/cases/locking_test.rb +304 -0
  122. data/test/cases/method_scoping_test.rb +704 -0
  123. data/test/cases/migration_test.rb +1523 -0
  124. data/test/cases/migration_test_firebird.rb +124 -0
  125. data/test/cases/mixin_test.rb +96 -0
  126. data/test/cases/modules_test.rb +81 -0
  127. data/test/cases/multiple_db_test.rb +85 -0
  128. data/test/cases/named_scope_test.rb +361 -0
  129. data/test/cases/nested_attributes_test.rb +581 -0
  130. data/test/cases/pk_test.rb +119 -0
  131. data/test/cases/pooled_connections_test.rb +103 -0
  132. data/test/cases/query_cache_test.rb +123 -0
  133. data/test/cases/readonly_test.rb +107 -0
  134. data/test/cases/reflection_test.rb +194 -0
  135. data/test/cases/reload_models_test.rb +22 -0
  136. data/test/cases/repair_helper.rb +50 -0
  137. data/test/cases/reserved_word_test_mysql.rb +176 -0
  138. data/test/cases/sanitize_test.rb +25 -0
  139. data/test/cases/schema_authorization_test_postgresql.rb +75 -0
  140. data/test/cases/schema_dumper_test.rb +211 -0
  141. data/test/cases/schema_test_postgresql.rb +178 -0
  142. data/test/cases/serialization_test.rb +47 -0
  143. data/test/cases/synonym_test_oracle.rb +17 -0
  144. data/test/cases/timestamp_test.rb +75 -0
  145. data/test/cases/transactions_test.rb +522 -0
  146. data/test/cases/unconnected_test.rb +32 -0
  147. data/test/cases/validations_i18n_test.rb +955 -0
  148. data/test/cases/validations_test.rb +1640 -0
  149. data/test/cases/xml_serialization_test.rb +240 -0
  150. data/test/config.rb +5 -0
  151. data/test/connections/jdbc_jdbcderby/connection.rb +18 -0
  152. data/test/connections/jdbc_jdbch2/connection.rb +18 -0
  153. data/test/connections/jdbc_jdbchsqldb/connection.rb +18 -0
  154. data/test/connections/jdbc_jdbcmysql/connection.rb +26 -0
  155. data/test/connections/jdbc_jdbcpostgresql/connection.rb +26 -0
  156. data/test/connections/jdbc_jdbcsqlite3/connection.rb +25 -0
  157. data/test/connections/native_db2/connection.rb +25 -0
  158. data/test/connections/native_firebird/connection.rb +26 -0
  159. data/test/connections/native_frontbase/connection.rb +27 -0
  160. data/test/connections/native_mysql/connection.rb +25 -0
  161. data/test/connections/native_openbase/connection.rb +21 -0
  162. data/test/connections/native_oracle/connection.rb +27 -0
  163. data/test/connections/native_postgresql/connection.rb +25 -0
  164. data/test/connections/native_sqlite/connection.rb +25 -0
  165. data/test/connections/native_sqlite3/connection.rb +25 -0
  166. data/test/connections/native_sqlite3/in_memory_connection.rb +18 -0
  167. data/test/connections/native_sybase/connection.rb +23 -0
  168. data/test/fixtures/accounts.yml +29 -0
  169. data/test/fixtures/all/developers.yml +0 -0
  170. data/test/fixtures/all/people.csv +0 -0
  171. data/test/fixtures/all/tasks.yml +0 -0
  172. data/test/fixtures/author_addresses.yml +5 -0
  173. data/test/fixtures/author_favorites.yml +4 -0
  174. data/test/fixtures/authors.yml +9 -0
  175. data/test/fixtures/binaries.yml +132 -0
  176. data/test/fixtures/books.yml +7 -0
  177. data/test/fixtures/categories/special_categories.yml +9 -0
  178. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
  179. data/test/fixtures/categories.yml +14 -0
  180. data/test/fixtures/categories_ordered.yml +7 -0
  181. data/test/fixtures/categories_posts.yml +23 -0
  182. data/test/fixtures/categorizations.yml +17 -0
  183. data/test/fixtures/clubs.yml +6 -0
  184. data/test/fixtures/comments.yml +59 -0
  185. data/test/fixtures/companies.yml +56 -0
  186. data/test/fixtures/computers.yml +4 -0
  187. data/test/fixtures/courses.yml +7 -0
  188. data/test/fixtures/customers.yml +26 -0
  189. data/test/fixtures/developers.yml +21 -0
  190. data/test/fixtures/developers_projects.yml +17 -0
  191. data/test/fixtures/edges.yml +6 -0
  192. data/test/fixtures/entrants.yml +14 -0
  193. data/test/fixtures/fixture_database.sqlite3 +0 -0
  194. data/test/fixtures/fixture_database_2.sqlite3 +0 -0
  195. data/test/fixtures/fk_test_has_fk.yml +3 -0
  196. data/test/fixtures/fk_test_has_pk.yml +2 -0
  197. data/test/fixtures/funny_jokes.yml +10 -0
  198. data/test/fixtures/items.yml +4 -0
  199. data/test/fixtures/jobs.yml +7 -0
  200. data/test/fixtures/legacy_things.yml +3 -0
  201. data/test/fixtures/mateys.yml +4 -0
  202. data/test/fixtures/member_types.yml +6 -0
  203. data/test/fixtures/members.yml +6 -0
  204. data/test/fixtures/memberships.yml +20 -0
  205. data/test/fixtures/minimalistics.yml +2 -0
  206. data/test/fixtures/mixed_case_monkeys.yml +6 -0
  207. data/test/fixtures/mixins.yml +29 -0
  208. data/test/fixtures/movies.yml +7 -0
  209. data/test/fixtures/naked/csv/accounts.csv +1 -0
  210. data/test/fixtures/naked/yml/accounts.yml +1 -0
  211. data/test/fixtures/naked/yml/companies.yml +1 -0
  212. data/test/fixtures/naked/yml/courses.yml +1 -0
  213. data/test/fixtures/organizations.yml +5 -0
  214. data/test/fixtures/owners.yml +7 -0
  215. data/test/fixtures/parrots.yml +27 -0
  216. data/test/fixtures/parrots_pirates.yml +7 -0
  217. data/test/fixtures/people.yml +15 -0
  218. data/test/fixtures/pets.yml +14 -0
  219. data/test/fixtures/pirates.yml +9 -0
  220. data/test/fixtures/posts.yml +52 -0
  221. data/test/fixtures/price_estimates.yml +7 -0
  222. data/test/fixtures/projects.yml +7 -0
  223. data/test/fixtures/readers.yml +9 -0
  224. data/test/fixtures/references.yml +17 -0
  225. data/test/fixtures/reserved_words/distinct.yml +5 -0
  226. data/test/fixtures/reserved_words/distincts_selects.yml +11 -0
  227. data/test/fixtures/reserved_words/group.yml +14 -0
  228. data/test/fixtures/reserved_words/select.yml +8 -0
  229. data/test/fixtures/reserved_words/values.yml +7 -0
  230. data/test/fixtures/ships.yml +5 -0
  231. data/test/fixtures/sponsors.yml +9 -0
  232. data/test/fixtures/subscribers.yml +7 -0
  233. data/test/fixtures/subscriptions.yml +12 -0
  234. data/test/fixtures/taggings.yml +28 -0
  235. data/test/fixtures/tags.yml +7 -0
  236. data/test/fixtures/tasks.yml +7 -0
  237. data/test/fixtures/topics.yml +42 -0
  238. data/test/fixtures/toys.yml +4 -0
  239. data/test/fixtures/treasures.yml +10 -0
  240. data/test/fixtures/vertices.yml +4 -0
  241. data/test/fixtures/warehouse-things.yml +3 -0
  242. data/test/migrations/broken/100_migration_that_raises_exception.rb +10 -0
  243. data/test/migrations/decimal/1_give_me_big_numbers.rb +15 -0
  244. data/test/migrations/duplicate/1_people_have_last_names.rb +9 -0
  245. data/test/migrations/duplicate/2_we_need_reminders.rb +12 -0
  246. data/test/migrations/duplicate/3_foo.rb +7 -0
  247. data/test/migrations/duplicate/3_innocent_jointable.rb +12 -0
  248. data/test/migrations/duplicate_names/20080507052938_chunky.rb +7 -0
  249. data/test/migrations/duplicate_names/20080507053028_chunky.rb +7 -0
  250. data/test/migrations/interleaved/pass_1/3_innocent_jointable.rb +12 -0
  251. data/test/migrations/interleaved/pass_2/1_people_have_last_names.rb +9 -0
  252. data/test/migrations/interleaved/pass_2/3_innocent_jointable.rb +12 -0
  253. data/test/migrations/interleaved/pass_3/1_people_have_last_names.rb +9 -0
  254. data/test/migrations/interleaved/pass_3/2_i_raise_on_down.rb +8 -0
  255. data/test/migrations/interleaved/pass_3/3_innocent_jointable.rb +12 -0
  256. data/test/migrations/missing/1000_people_have_middle_names.rb +9 -0
  257. data/test/migrations/missing/1_people_have_last_names.rb +9 -0
  258. data/test/migrations/missing/3_we_need_reminders.rb +12 -0
  259. data/test/migrations/missing/4_innocent_jointable.rb +12 -0
  260. data/test/migrations/valid/1_people_have_last_names.rb +9 -0
  261. data/test/migrations/valid/2_we_need_reminders.rb +12 -0
  262. data/test/migrations/valid/3_innocent_jointable.rb +12 -0
  263. data/test/models/author.rb +146 -0
  264. data/test/models/auto_id.rb +4 -0
  265. data/test/models/binary.rb +2 -0
  266. data/test/models/bird.rb +3 -0
  267. data/test/models/book.rb +4 -0
  268. data/test/models/categorization.rb +5 -0
  269. data/test/models/category.rb +34 -0
  270. data/test/models/citation.rb +6 -0
  271. data/test/models/club.rb +13 -0
  272. data/test/models/column_name.rb +3 -0
  273. data/test/models/comment.rb +29 -0
  274. data/test/models/company.rb +171 -0
  275. data/test/models/company_in_module.rb +61 -0
  276. data/test/models/computer.rb +3 -0
  277. data/test/models/contact.rb +16 -0
  278. data/test/models/contract.rb +5 -0
  279. data/test/models/course.rb +3 -0
  280. data/test/models/customer.rb +73 -0
  281. data/test/models/default.rb +2 -0
  282. data/test/models/developer.rb +101 -0
  283. data/test/models/edge.rb +5 -0
  284. data/test/models/entrant.rb +3 -0
  285. data/test/models/essay.rb +3 -0
  286. data/test/models/event.rb +3 -0
  287. data/test/models/guid.rb +2 -0
  288. data/test/models/item.rb +7 -0
  289. data/test/models/job.rb +5 -0
  290. data/test/models/joke.rb +3 -0
  291. data/test/models/keyboard.rb +3 -0
  292. data/test/models/legacy_thing.rb +3 -0
  293. data/test/models/matey.rb +4 -0
  294. data/test/models/member.rb +12 -0
  295. data/test/models/member_detail.rb +5 -0
  296. data/test/models/member_type.rb +3 -0
  297. data/test/models/membership.rb +9 -0
  298. data/test/models/minimalistic.rb +2 -0
  299. data/test/models/mixed_case_monkey.rb +3 -0
  300. data/test/models/movie.rb +5 -0
  301. data/test/models/order.rb +4 -0
  302. data/test/models/organization.rb +6 -0
  303. data/test/models/owner.rb +5 -0
  304. data/test/models/parrot.rb +16 -0
  305. data/test/models/person.rb +16 -0
  306. data/test/models/pet.rb +5 -0
  307. data/test/models/pirate.rb +70 -0
  308. data/test/models/post.rb +100 -0
  309. data/test/models/price_estimate.rb +3 -0
  310. data/test/models/project.rb +30 -0
  311. data/test/models/reader.rb +4 -0
  312. data/test/models/reference.rb +4 -0
  313. data/test/models/reply.rb +46 -0
  314. data/test/models/ship.rb +10 -0
  315. data/test/models/ship_part.rb +5 -0
  316. data/test/models/sponsor.rb +4 -0
  317. data/test/models/subject.rb +4 -0
  318. data/test/models/subscriber.rb +8 -0
  319. data/test/models/subscription.rb +4 -0
  320. data/test/models/tag.rb +7 -0
  321. data/test/models/tagging.rb +10 -0
  322. data/test/models/task.rb +3 -0
  323. data/test/models/topic.rb +80 -0
  324. data/test/models/toy.rb +6 -0
  325. data/test/models/treasure.rb +8 -0
  326. data/test/models/vertex.rb +9 -0
  327. data/test/models/warehouse_thing.rb +5 -0
  328. data/test/schema/mysql_specific_schema.rb +24 -0
  329. data/test/schema/postgresql_specific_schema.rb +114 -0
  330. data/test/schema/schema.rb +493 -0
  331. data/test/schema/schema2.rb +6 -0
  332. data/test/schema/sqlite_specific_schema.rb +25 -0
  333. metadata +420 -0
@@ -0,0 +1,240 @@
1
+ require "cases/helper"
2
+ require 'models/contact'
3
+ require 'models/post'
4
+ require 'models/author'
5
+ require 'models/tagging'
6
+ require 'models/comment'
7
+ require 'models/company_in_module'
8
+
9
+ class XmlSerializationTest < ActiveRecord::TestCase
10
+ def test_should_serialize_default_root
11
+ @xml = Contact.new.to_xml
12
+ assert_match %r{^<contact>}, @xml
13
+ assert_match %r{</contact>$}, @xml
14
+ end
15
+
16
+ def test_should_serialize_default_root_with_namespace
17
+ @xml = Contact.new.to_xml :namespace=>"http://xml.rubyonrails.org/contact"
18
+ assert_match %r{^<contact xmlns="http://xml.rubyonrails.org/contact">}, @xml
19
+ assert_match %r{</contact>$}, @xml
20
+ end
21
+
22
+ def test_should_serialize_custom_root
23
+ @xml = Contact.new.to_xml :root => 'xml_contact'
24
+ assert_match %r{^<xml-contact>}, @xml
25
+ assert_match %r{</xml-contact>$}, @xml
26
+ end
27
+
28
+ def test_should_allow_undasherized_tags
29
+ @xml = Contact.new.to_xml :root => 'xml_contact', :dasherize => false
30
+ assert_match %r{^<xml_contact>}, @xml
31
+ assert_match %r{</xml_contact>$}, @xml
32
+ assert_match %r{<created_at}, @xml
33
+ end
34
+
35
+ def test_should_allow_camelized_tags
36
+ @xml = Contact.new.to_xml :root => 'xml_contact', :camelize => true
37
+ assert_match %r{^<XmlContact>}, @xml
38
+ assert_match %r{</XmlContact>$}, @xml
39
+ assert_match %r{<CreatedAt}, @xml
40
+ end
41
+
42
+ def test_should_allow_skipped_types
43
+ @xml = Contact.new(:age => 25).to_xml :skip_types => true
44
+ assert %r{<age>25</age>}.match(@xml)
45
+ end
46
+
47
+ def test_should_include_yielded_additions
48
+ @xml = Contact.new.to_xml do |xml|
49
+ xml.creator "David"
50
+ end
51
+ assert_match %r{<creator>David</creator>}, @xml
52
+ end
53
+ end
54
+
55
+ class DefaultXmlSerializationTest < ActiveRecord::TestCase
56
+ def setup
57
+ @xml = Contact.new(:name => 'aaron stack', :age => 25, :avatar => 'binarydata', :created_at => Time.utc(2006, 8, 1), :awesome => false, :preferences => { :gem => 'ruby' }).to_xml
58
+ end
59
+
60
+ def test_should_serialize_string
61
+ assert_match %r{<name>aaron stack</name>}, @xml
62
+ end
63
+
64
+ def test_should_serialize_integer
65
+ assert_match %r{<age type="integer">25</age>}, @xml
66
+ end
67
+
68
+ def test_should_serialize_binary
69
+ assert_match %r{YmluYXJ5ZGF0YQ==\n</avatar>}, @xml
70
+ assert_match %r{<avatar(.*)(type="binary")}, @xml
71
+ assert_match %r{<avatar(.*)(encoding="base64")}, @xml
72
+ end
73
+
74
+ def test_should_serialize_datetime
75
+ assert_match %r{<created-at type=\"datetime\">2006-08-01T00:00:00Z</created-at>}, @xml
76
+ end
77
+
78
+ def test_should_serialize_boolean
79
+ assert_match %r{<awesome type=\"boolean\">false</awesome>}, @xml
80
+ end
81
+
82
+ def test_should_serialize_yaml
83
+ assert_match %r{<preferences type=\"yaml\">--- \n:gem: ruby\n</preferences>}, @xml
84
+ end
85
+ end
86
+
87
+ class NilXmlSerializationTest < ActiveRecord::TestCase
88
+ def setup
89
+ @xml = Contact.new.to_xml(:root => 'xml_contact')
90
+ end
91
+
92
+ def test_should_serialize_string
93
+ assert_match %r{<name nil="true"></name>}, @xml
94
+ end
95
+
96
+ def test_should_serialize_integer
97
+ assert %r{<age (.*)></age>}.match(@xml)
98
+ attributes = $1
99
+ assert_match %r{nil="true"}, attributes
100
+ assert_match %r{type="integer"}, attributes
101
+ end
102
+
103
+ def test_should_serialize_binary
104
+ assert %r{<avatar (.*)></avatar>}.match(@xml)
105
+ attributes = $1
106
+ assert_match %r{type="binary"}, attributes
107
+ assert_match %r{encoding="base64"}, attributes
108
+ assert_match %r{nil="true"}, attributes
109
+ end
110
+
111
+ def test_should_serialize_datetime
112
+ assert %r{<created-at (.*)></created-at>}.match(@xml)
113
+ attributes = $1
114
+ assert_match %r{nil="true"}, attributes
115
+ assert_match %r{type="datetime"}, attributes
116
+ end
117
+
118
+ def test_should_serialize_boolean
119
+ assert %r{<awesome (.*)></awesome>}.match(@xml)
120
+ attributes = $1
121
+ assert_match %r{type="boolean"}, attributes
122
+ assert_match %r{nil="true"}, attributes
123
+ end
124
+
125
+ def test_should_serialize_yaml
126
+ assert %r{<preferences(.*)></preferences>}.match(@xml)
127
+ attributes = $1
128
+ assert_match %r{type="yaml"}, attributes
129
+ assert_match %r{nil="true"}, attributes
130
+ end
131
+ end
132
+
133
+ class DatabaseConnectedXmlModuleSerializationTest < ActiveRecord::TestCase
134
+
135
+ fixtures :projects, :developers, :developers_projects
136
+
137
+ def test_module
138
+ project = MyApplication::Business::Project.find :first
139
+ xml = project.to_xml
140
+ assert_match %r{<my-application-business-project>}, xml
141
+ assert_match %r{</my-application-business-project>}, xml
142
+ end
143
+
144
+ def test_module_with_include
145
+ project = MyApplication::Business::Project.find :first
146
+ xml = project.to_xml :include => :developers
147
+ assert_match %r{<developer type="MyApplication::Business::Developer">}, xml
148
+ assert_match %r{</developer>}, xml
149
+ end
150
+ end
151
+
152
+ class DatabaseConnectedXmlSerializationTest < ActiveRecord::TestCase
153
+ fixtures :authors, :posts
154
+ # to_xml used to mess with the hash the user provided which
155
+ # caused the builder to be reused. This meant the document kept
156
+ # getting appended to.
157
+ def test_passing_hash_shouldnt_reuse_builder
158
+ options = {:include=>:posts}
159
+ david = authors(:david)
160
+ first_xml_size = david.to_xml(options).size
161
+ second_xml_size = david.to_xml(options).size
162
+ assert_equal first_xml_size, second_xml_size
163
+ end
164
+
165
+ def test_include_uses_association_name
166
+ xml = authors(:david).to_xml :include=>:hello_posts, :indent => 0
167
+ assert_match %r{<hello-posts type="array">}, xml
168
+ assert_match %r{<hello-post type="Post">}, xml
169
+ assert_match %r{<hello-post type="StiPost">}, xml
170
+ end
171
+
172
+ def test_included_associations_should_skip_types
173
+ xml = authors(:david).to_xml :include=>:hello_posts, :indent => 0, :skip_types => true
174
+ assert_match %r{<hello-posts>}, xml
175
+ assert_match %r{<hello-post>}, xml
176
+ assert_match %r{<hello-post>}, xml
177
+ end
178
+
179
+ def test_methods_are_called_on_object
180
+ xml = authors(:david).to_xml :methods => :label, :indent => 0
181
+ assert_match %r{<label>.*</label>}, xml
182
+ end
183
+
184
+ def test_should_not_call_methods_on_associations_that_dont_respond
185
+ xml = authors(:david).to_xml :include=>:hello_posts, :methods => :label, :indent => 2
186
+ assert !authors(:david).hello_posts.first.respond_to?(:label)
187
+ assert_match %r{^ <label>.*</label>}, xml
188
+ assert_no_match %r{^ <label>}, xml
189
+ end
190
+
191
+ def test_procs_are_called_on_object
192
+ proc = Proc.new { |options| options[:builder].tag!('nationality', 'Danish') }
193
+ xml = authors(:david).to_xml(:procs => [ proc ])
194
+ assert_match %r{<nationality>Danish</nationality>}, xml
195
+ end
196
+
197
+ def test_top_level_procs_arent_applied_to_associations
198
+ author_proc = Proc.new { |options| options[:builder].tag!('nationality', 'Danish') }
199
+ xml = authors(:david).to_xml(:procs => [ author_proc ], :include => :posts, :indent => 2)
200
+
201
+ assert_match %r{^ <nationality>Danish</nationality>}, xml
202
+ assert_no_match %r{^ {6}<nationality>Danish</nationality>}, xml
203
+ end
204
+
205
+ def test_procs_on_included_associations_are_called
206
+ posts_proc = Proc.new { |options| options[:builder].tag!('copyright', 'DHH') }
207
+ xml = authors(:david).to_xml(
208
+ :indent => 2,
209
+ :include => {
210
+ :posts => { :procs => [ posts_proc ] }
211
+ }
212
+ )
213
+
214
+ assert_no_match %r{^ <copyright>DHH</copyright>}, xml
215
+ assert_match %r{^ {6}<copyright>DHH</copyright>}, xml
216
+ end
217
+
218
+ def test_should_include_empty_has_many_as_empty_array
219
+ authors(:david).posts.delete_all
220
+ xml = authors(:david).to_xml :include=>:posts, :indent => 2
221
+
222
+ assert_equal [], Hash.from_xml(xml)['author']['posts']
223
+ assert_match %r{^ <posts type="array"/>}, xml
224
+ end
225
+
226
+ def test_should_has_many_array_elements_should_include_type_when_different_from_guessed_value
227
+ xml = authors(:david).to_xml :include=>:posts_with_comments, :indent => 2
228
+
229
+ assert Hash.from_xml(xml)
230
+ assert_match %r{^ <posts-with-comments type="array">}, xml
231
+ assert_match %r{^ <posts-with-comment type="Post">}, xml
232
+ assert_match %r{^ <posts-with-comment type="StiPost">}, xml
233
+
234
+ types = Hash.from_xml(xml)['author']['posts_with_comments'].collect {|t| t['type'] }
235
+ assert types.include?('SpecialPost')
236
+ assert types.include?('Post')
237
+ assert types.include?('StiPost')
238
+ end
239
+
240
+ end
data/test/config.rb ADDED
@@ -0,0 +1,5 @@
1
+ TEST_ROOT = File.expand_path(File.dirname(__FILE__))
2
+ ASSETS_ROOT = TEST_ROOT + "/assets"
3
+ FIXTURES_ROOT = TEST_ROOT + "/fixtures"
4
+ MIGRATIONS_ROOT = TEST_ROOT + "/migrations"
5
+ SCHEMA_ROOT = TEST_ROOT + "/schema"
@@ -0,0 +1,18 @@
1
+ print "Using Derby via JRuby, activerecord-jdbc-adapter and activerecord-jdbcderby-adapter\n"
2
+ require_dependency 'models/course'
3
+ require 'logger'
4
+ ActiveRecord::Base.logger = Logger.new("debug.log")
5
+
6
+ ActiveRecord::Base.configurations = {
7
+ 'arunit' => {
8
+ :adapter => 'jdbcderby',
9
+ :database => 'activerecord_unittest'
10
+ },
11
+ 'arunit2' => {
12
+ :adapter => 'jdbcderby',
13
+ :database => 'activerecord_unittest2'
14
+ }
15
+ }
16
+
17
+ ActiveRecord::Base.establish_connection 'arunit'
18
+ Course.establish_connection 'arunit2'
@@ -0,0 +1,18 @@
1
+ print "Using H2 via JRuby, activerecord-jdbc-adapter and activerecord-jdbch2-adapter\n"
2
+ require_dependency 'models/course'
3
+ require 'logger'
4
+ ActiveRecord::Base.logger = Logger.new("debug.log")
5
+
6
+ ActiveRecord::Base.configurations = {
7
+ 'arunit' => {
8
+ :adapter => 'jdbch2',
9
+ :database => 'activerecord_unittest'
10
+ },
11
+ 'arunit2' => {
12
+ :adapter => 'jdbch2',
13
+ :database => 'activerecord_unittest2'
14
+ }
15
+ }
16
+
17
+ ActiveRecord::Base.establish_connection 'arunit'
18
+ Course.establish_connection 'arunit2'
@@ -0,0 +1,18 @@
1
+ print "Using HSQLDB via JRuby, activerecord-jdbc-adapter and activerecord-jdbchsqldb-adapter\n"
2
+ require_dependency 'models/course'
3
+ require 'logger'
4
+ ActiveRecord::Base.logger = Logger.new("debug.log")
5
+
6
+ ActiveRecord::Base.configurations = {
7
+ 'arunit' => {
8
+ :adapter => 'jdbchsqldb',
9
+ :database => 'activerecord_unittest'
10
+ },
11
+ 'arunit2' => {
12
+ :adapter => 'jdbchsqldb',
13
+ :database => 'activerecord_unittest2'
14
+ }
15
+ }
16
+
17
+ ActiveRecord::Base.establish_connection 'arunit'
18
+ Course.establish_connection 'arunit2'
@@ -0,0 +1,26 @@
1
+ print "Using MySQL via JRuby, activerecord-jdbc-adapter and activerecord-jdbcmysql-adapter\n"
2
+ require_dependency 'models/course'
3
+ require 'logger'
4
+
5
+ ActiveRecord::Base.logger = Logger.new("debug.log")
6
+
7
+ # GRANT ALL PRIVILEGES ON activerecord_unittest.* to 'rails'@'localhost';
8
+ # GRANT ALL PRIVILEGES ON activerecord_unittest2.* to 'rails'@'localhost';
9
+
10
+ ActiveRecord::Base.configurations = {
11
+ 'arunit' => {
12
+ :adapter => 'jdbcmysql',
13
+ :username => 'rails',
14
+ :encoding => 'utf8',
15
+ :database => 'activerecord_unittest',
16
+ },
17
+ 'arunit2' => {
18
+ :adapter => 'jdbcmysql',
19
+ :username => 'rails',
20
+ :database => 'activerecord_unittest2'
21
+ }
22
+ }
23
+
24
+ ActiveRecord::Base.establish_connection 'arunit'
25
+ Course.establish_connection 'arunit2'
26
+
@@ -0,0 +1,26 @@
1
+ print "Using Postgrsql via JRuby, activerecord-jdbc-adapter and activerecord-postgresql-adapter\n"
2
+ require_dependency 'models/course'
3
+ require 'logger'
4
+
5
+ ActiveRecord::Base.logger = Logger.new("debug.log")
6
+
7
+ # createuser rails --createdb --no-superuser --no-createrole
8
+ # createdb -O rails activerecord_unittest
9
+ # createdb -O rails activerecord_unittest2
10
+
11
+ ActiveRecord::Base.configurations = {
12
+ 'arunit' => {
13
+ :adapter => 'jdbcpostgresql',
14
+ :username => ENV['USER'] || 'rails',
15
+ :database => 'activerecord_unittest'
16
+ },
17
+ 'arunit2' => {
18
+ :adapter => 'jdbcpostgresql',
19
+ :username => ENV['USER'] || 'rails',
20
+ :database => 'activerecord_unittest2'
21
+ }
22
+ }
23
+
24
+ ActiveRecord::Base.establish_connection 'arunit'
25
+ Course.establish_connection 'arunit2'
26
+
@@ -0,0 +1,25 @@
1
+ print "Using SQLite3 via JRuby, activerecord-jdbc-adapter and activerecord-jdbcsqlite3-adapter\n"
2
+ require_dependency 'models/course'
3
+ require 'logger'
4
+ ActiveRecord::Base.logger = Logger.new("debug.log")
5
+
6
+ class SqliteError < StandardError
7
+ end
8
+
9
+ BASE_DIR = FIXTURES_ROOT
10
+ sqlite_test_db = "#{BASE_DIR}/fixture_database.sqlite3"
11
+ sqlite_test_db2 = "#{BASE_DIR}/fixture_database_2.sqlite3"
12
+
13
+ def make_connection(clazz, db_file)
14
+ ActiveRecord::Base.configurations = { clazz.name => { :adapter => 'jdbcsqlite3', :database => db_file, :timeout => 5000 } }
15
+ unless File.exist?(db_file)
16
+ puts "SQLite3 database not found at #{db_file}. Rebuilding it."
17
+ sqlite_command = %Q{sqlite3 "#{db_file}" "create table a (a integer); drop table a;"}
18
+ puts "Executing '#{sqlite_command}'"
19
+ raise SqliteError.new("Seems that there is no sqlite3 executable available") unless system(sqlite_command)
20
+ end
21
+ clazz.establish_connection(clazz.name)
22
+ end
23
+
24
+ make_connection(ActiveRecord::Base, sqlite_test_db)
25
+ make_connection(Course, sqlite_test_db2)
@@ -0,0 +1,25 @@
1
+ print "Using native DB2\n"
2
+ require_dependency 'models/course'
3
+ require 'logger'
4
+
5
+ ActiveRecord::Base.logger = Logger.new("debug.log")
6
+
7
+ ActiveRecord::Base.configurations = {
8
+ 'arunit' => {
9
+ :adapter => 'db2',
10
+ :host => 'localhost',
11
+ :username => 'arunit',
12
+ :password => 'arunit',
13
+ :database => 'arunit'
14
+ },
15
+ 'arunit2' => {
16
+ :adapter => 'db2',
17
+ :host => 'localhost',
18
+ :username => 'arunit',
19
+ :password => 'arunit',
20
+ :database => 'arunit2'
21
+ }
22
+ }
23
+
24
+ ActiveRecord::Base.establish_connection 'arunit'
25
+ Course.establish_connection 'arunit2'
@@ -0,0 +1,26 @@
1
+ print "Using native Firebird\n"
2
+ require_dependency 'models/course'
3
+ require 'logger'
4
+
5
+ ActiveRecord::Base.logger = Logger.new("debug.log")
6
+
7
+ ActiveRecord::Base.configurations = {
8
+ 'arunit' => {
9
+ :adapter => 'firebird',
10
+ :host => 'localhost',
11
+ :username => 'rails',
12
+ :password => 'rails',
13
+ :database => 'activerecord_unittest',
14
+ :charset => 'UTF8'
15
+ },
16
+ 'arunit2' => {
17
+ :adapter => 'firebird',
18
+ :host => 'localhost',
19
+ :username => 'rails',
20
+ :password => 'rails',
21
+ :database => 'activerecord_unittest2'
22
+ }
23
+ }
24
+
25
+ ActiveRecord::Base.establish_connection 'arunit'
26
+ Course.establish_connection 'arunit2'
@@ -0,0 +1,27 @@
1
+ puts 'Using native Frontbase'
2
+ require_dependency 'models/course'
3
+ require 'logger'
4
+
5
+ ActiveRecord::Base.logger = Logger.new("debug.log")
6
+
7
+ ActiveRecord::Base.configurations = {
8
+ 'arunit' => {
9
+ :adapter => 'frontbase',
10
+ :host => 'localhost',
11
+ :username => 'rails',
12
+ :password => '',
13
+ :database => 'activerecord_unittest',
14
+ :session_name => "unittest-#{$$}"
15
+ },
16
+ 'arunit2' => {
17
+ :adapter => 'frontbase',
18
+ :host => 'localhost',
19
+ :username => 'rails',
20
+ :password => '',
21
+ :database => 'activerecord_unittest2',
22
+ :session_name => "unittest-#{$$}"
23
+ }
24
+ }
25
+
26
+ ActiveRecord::Base.establish_connection 'arunit'
27
+ Course.establish_connection 'arunit2'
@@ -0,0 +1,25 @@
1
+ print "Using native MySQL\n"
2
+ require_dependency 'models/course'
3
+ require 'logger'
4
+
5
+ ActiveRecord::Base.logger = Logger.new("debug.log")
6
+
7
+ # GRANT ALL PRIVILEGES ON activerecord_unittest.* to 'rails'@'localhost';
8
+ # GRANT ALL PRIVILEGES ON activerecord_unittest2.* to 'rails'@'localhost';
9
+
10
+ ActiveRecord::Base.configurations = {
11
+ 'arunit' => {
12
+ :adapter => 'mysql',
13
+ :username => 'rails',
14
+ :encoding => 'utf8',
15
+ :database => 'activerecord_unittest',
16
+ },
17
+ 'arunit2' => {
18
+ :adapter => 'mysql',
19
+ :username => 'rails',
20
+ :database => 'activerecord_unittest2'
21
+ }
22
+ }
23
+
24
+ ActiveRecord::Base.establish_connection 'arunit'
25
+ Course.establish_connection 'arunit2'
@@ -0,0 +1,21 @@
1
+ print "Using native OpenBase\n"
2
+ require_dependency 'models/course'
3
+ require 'logger'
4
+
5
+ ActiveRecord::Base.logger = Logger.new("debug.log")
6
+
7
+ ActiveRecord::Base.configurations = {
8
+ 'arunit' => {
9
+ :adapter => 'openbase',
10
+ :username => 'admin',
11
+ :database => 'activerecord_unittest',
12
+ },
13
+ 'arunit2' => {
14
+ :adapter => 'openbase',
15
+ :username => 'admin',
16
+ :database => 'activerecord_unittest2'
17
+ }
18
+ }
19
+
20
+ ActiveRecord::Base.establish_connection 'arunit'
21
+ Course.establish_connection 'arunit2'
@@ -0,0 +1,27 @@
1
+ print "Using Oracle\n"
2
+ require_dependency 'models/course'
3
+ require 'logger'
4
+
5
+ ActiveRecord::Base.logger = Logger.new STDOUT
6
+ ActiveRecord::Base.logger.level = Logger::WARN
7
+
8
+ # Set these to your database connection strings
9
+ db = ENV['ARUNIT_DB'] || 'activerecord_unittest'
10
+
11
+ ActiveRecord::Base.configurations = {
12
+ 'arunit' => {
13
+ :adapter => 'oracle',
14
+ :username => 'arunit',
15
+ :password => 'arunit',
16
+ :database => db,
17
+ },
18
+ 'arunit2' => {
19
+ :adapter => 'oracle',
20
+ :username => 'arunit2',
21
+ :password => 'arunit2',
22
+ :database => db
23
+ }
24
+ }
25
+
26
+ ActiveRecord::Base.establish_connection 'arunit'
27
+ Course.establish_connection 'arunit2'
@@ -0,0 +1,25 @@
1
+ print "Using native PostgreSQL\n"
2
+ require_dependency 'models/course'
3
+ require 'logger'
4
+
5
+ ActiveRecord::Base.logger = Logger.new("debug.log")
6
+
7
+ ActiveRecord::Base.configurations = {
8
+ 'arunit' => {
9
+ :adapter => 'postgresql',
10
+ :database => 'activerecord_unittest',
11
+ :min_messages => 'warning',
12
+ :username => 'rails_tests',
13
+ :password => 'rails_tests'
14
+ },
15
+ 'arunit2' => {
16
+ :adapter => 'postgresql',
17
+ :database => 'activerecord_unittest2',
18
+ :min_messages => 'warning',
19
+ :username => 'rails_tests',
20
+ :password => 'rails_tests'
21
+ }
22
+ }
23
+
24
+ ActiveRecord::Base.establish_connection 'arunit'
25
+ Course.establish_connection 'arunit2'
@@ -0,0 +1,25 @@
1
+ print "Using native SQlite\n"
2
+ require_dependency 'models/course'
3
+ require 'logger'
4
+ ActiveRecord::Base.logger = Logger.new("debug.log")
5
+
6
+ class SqliteError < StandardError
7
+ end
8
+
9
+ BASE_DIR = FIXTURES_ROOT
10
+ sqlite_test_db = "#{BASE_DIR}/fixture_database.sqlite"
11
+ sqlite_test_db2 = "#{BASE_DIR}/fixture_database_2.sqlite"
12
+
13
+ def make_connection(clazz, db_file)
14
+ ActiveRecord::Base.configurations = { clazz.name => { :adapter => 'sqlite', :database => db_file } }
15
+ unless File.exist?(db_file)
16
+ puts "SQLite database not found at #{db_file}. Rebuilding it."
17
+ sqlite_command = %Q{sqlite "#{db_file}" "create table a (a integer); drop table a;"}
18
+ puts "Executing '#{sqlite_command}'"
19
+ raise SqliteError.new("Seems that there is no sqlite executable available") unless system(sqlite_command)
20
+ end
21
+ clazz.establish_connection(clazz.name)
22
+ end
23
+
24
+ make_connection(ActiveRecord::Base, sqlite_test_db)
25
+ make_connection(Course, sqlite_test_db2)
@@ -0,0 +1,25 @@
1
+ print "Using native SQLite3\n"
2
+ require_dependency 'models/course'
3
+ require 'logger'
4
+ ActiveRecord::Base.logger = Logger.new("debug.log")
5
+
6
+ class SqliteError < StandardError
7
+ end
8
+
9
+ BASE_DIR = FIXTURES_ROOT
10
+ sqlite_test_db = "#{BASE_DIR}/fixture_database.sqlite3"
11
+ sqlite_test_db2 = "#{BASE_DIR}/fixture_database_2.sqlite3"
12
+
13
+ def make_connection(clazz, db_file)
14
+ ActiveRecord::Base.configurations = { clazz.name => { :adapter => 'sqlite3', :database => db_file, :timeout => 5000 } }
15
+ unless File.exist?(db_file)
16
+ puts "SQLite3 database not found at #{db_file}. Rebuilding it."
17
+ sqlite_command = %Q{sqlite3 "#{db_file}" "create table a (a integer); drop table a;"}
18
+ puts "Executing '#{sqlite_command}'"
19
+ raise SqliteError.new("Seems that there is no sqlite3 executable available") unless system(sqlite_command)
20
+ end
21
+ clazz.establish_connection(clazz.name)
22
+ end
23
+
24
+ make_connection(ActiveRecord::Base, sqlite_test_db)
25
+ make_connection(Course, sqlite_test_db2)
@@ -0,0 +1,18 @@
1
+ print "Using native SQLite3\n"
2
+ require_dependency 'models/course'
3
+ require 'logger'
4
+ ActiveRecord::Base.logger = Logger.new("debug.log")
5
+
6
+ class SqliteError < StandardError
7
+ end
8
+
9
+ def make_connection(clazz, db_definitions_file)
10
+ clazz.establish_connection(:adapter => 'sqlite3', :database => ':memory:')
11
+ File.read(SCHEMA_ROOT + "/#{db_definitions_file}").split(';').each do |command|
12
+ clazz.connection.execute(command) unless command.strip.empty?
13
+ end
14
+ end
15
+
16
+ make_connection(ActiveRecord::Base, 'sqlite.sql')
17
+ make_connection(Course, 'sqlite2.sql')
18
+ load(SCHEMA_ROOT + "/schema.rb")
@@ -0,0 +1,23 @@
1
+ print "Using native Sybase Open Client\n"
2
+ require_dependency 'models/course'
3
+ require 'logger'
4
+
5
+ ActiveRecord::Base.logger = Logger.new("debug.log")
6
+
7
+ ActiveRecord::Base.configurations = {
8
+ 'arunit' => {
9
+ :adapter => 'sybase',
10
+ :host => 'database_ASE',
11
+ :username => 'sa',
12
+ :database => 'activerecord_unittest'
13
+ },
14
+ 'arunit2' => {
15
+ :adapter => 'sybase',
16
+ :host => 'database_ASE',
17
+ :username => 'sa',
18
+ :database => 'activerecord_unittest2'
19
+ }
20
+ }
21
+
22
+ ActiveRecord::Base.establish_connection 'arunit'
23
+ Course.establish_connection 'arunit2'