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,68 @@
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
@@ -0,0 +1,46 @@
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
+
@@ -0,0 +1,262 @@
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
@@ -0,0 +1,24 @@
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
@@ -0,0 +1,205 @@
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_encode_all_encodable_attributes
47
+ json = @contact.to_json
48
+
49
+ assert_match %r{"name":"Konata Izumi"}, json
50
+ assert_match %r{"age":16}, json
51
+ assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
52
+ assert_match %r{"awesome":true}, json
53
+ assert_match %r{"preferences":\{"shows":"anime"\}}, json
54
+ end
55
+
56
+ def test_should_allow_attribute_filtering_with_only
57
+ json = @contact.to_json(:only => [:name, :age])
58
+
59
+ assert_match %r{"name":"Konata Izumi"}, json
60
+ assert_match %r{"age":16}, json
61
+ assert_no_match %r{"awesome":true}, json
62
+ assert !json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
63
+ assert_no_match %r{"preferences":\{"shows":"anime"\}}, json
64
+ end
65
+
66
+ def test_should_allow_attribute_filtering_with_except
67
+ json = @contact.to_json(:except => [:name, :age])
68
+
69
+ assert_no_match %r{"name":"Konata Izumi"}, json
70
+ assert_no_match %r{"age":16}, json
71
+ assert_match %r{"awesome":true}, json
72
+ assert json.include?(%("created_at":#{ActiveSupport::JSON.encode(Time.utc(2006, 8, 1))}))
73
+ assert_match %r{"preferences":\{"shows":"anime"\}}, json
74
+ end
75
+
76
+ def test_methods_are_called_on_object
77
+ # Define methods on fixture.
78
+ def @contact.label; "Has cheezburger"; end
79
+ def @contact.favorite_quote; "Constraints are liberating"; end
80
+
81
+ # Single method.
82
+ assert_match %r{"label":"Has cheezburger"}, @contact.to_json(:only => :name, :methods => :label)
83
+
84
+ # Both methods.
85
+ methods_json = @contact.to_json(:only => :name, :methods => [:label, :favorite_quote])
86
+ assert_match %r{"label":"Has cheezburger"}, methods_json
87
+ assert_match %r{"favorite_quote":"Constraints are liberating"}, methods_json
88
+ end
89
+ end
90
+
91
+ class DatabaseConnectedJsonEncodingTest < ActiveRecord::TestCase
92
+ fixtures :authors, :posts, :comments, :tags, :taggings
93
+
94
+ def setup
95
+ @david = authors(:david)
96
+ @mary = authors(:mary)
97
+ end
98
+
99
+ def test_includes_uses_association_name
100
+ json = @david.to_json(:include => :posts)
101
+
102
+ assert_match %r{"posts":\[}, json
103
+
104
+ assert_match %r{"id":1}, json
105
+ assert_match %r{"name":"David"}, json
106
+
107
+ assert_match %r{"author_id":1}, json
108
+ assert_match %r{"title":"Welcome to the weblog"}, json
109
+ assert_match %r{"body":"Such a lovely day"}, json
110
+
111
+ assert_match %r{"title":"So I was thinking"}, json
112
+ assert_match %r{"body":"Like I hopefully always am"}, json
113
+ end
114
+
115
+ def test_includes_uses_association_name_and_applies_attribute_filters
116
+ json = @david.to_json(:include => { :posts => { :only => :title } })
117
+
118
+ assert_match %r{"name":"David"}, json
119
+ assert_match %r{"posts":\[}, json
120
+
121
+ assert_match %r{"title":"Welcome to the weblog"}, json
122
+ assert_no_match %r{"body":"Such a lovely day"}, json
123
+
124
+ assert_match %r{"title":"So I was thinking"}, json
125
+ assert_no_match %r{"body":"Like I hopefully always am"}, json
126
+ end
127
+
128
+ def test_includes_fetches_second_level_associations
129
+ json = @david.to_json(:include => { :posts => { :include => { :comments => { :only => :body } } } })
130
+
131
+ assert_match %r{"name":"David"}, json
132
+ assert_match %r{"posts":\[}, json
133
+
134
+ assert_match %r{"comments":\[}, json
135
+ assert_match %r{\{"body":"Thank you again for the welcome"\}}, json
136
+ assert_match %r{\{"body":"Don't think too hard"\}}, json
137
+ assert_no_match %r{"post_id":}, json
138
+ end
139
+
140
+ def test_includes_fetches_nth_level_associations
141
+ json = @david.to_json(
142
+ :include => {
143
+ :posts => {
144
+ :include => {
145
+ :taggings => {
146
+ :include => {
147
+ :tag => { :only => :name }
148
+ }
149
+ }
150
+ }
151
+ }
152
+ })
153
+
154
+ assert_match %r{"name":"David"}, json
155
+ assert_match %r{"posts":\[}, json
156
+
157
+ assert_match %r{"taggings":\[}, json
158
+ assert_match %r{"tag":\{"name":"General"\}}, json
159
+ end
160
+
161
+ def test_should_not_call_methods_on_associations_that_dont_respond
162
+ def @david.favorite_quote; "Constraints are liberating"; end
163
+ json = @david.to_json(:include => :posts, :methods => :favorite_quote)
164
+
165
+ assert !@david.posts.first.respond_to?(:favorite_quote)
166
+ assert_match %r{"favorite_quote":"Constraints are liberating"}, json
167
+ assert_equal %r{"favorite_quote":}.match(json).size, 1
168
+ end
169
+
170
+ def test_should_allow_only_option_for_list_of_authors
171
+ authors = [@david, @mary]
172
+
173
+ assert_equal %([{"name":"David"},{"name":"Mary"}]), ActiveSupport::JSON.encode(authors, :only => :name)
174
+ end
175
+
176
+ def test_should_allow_except_option_for_list_of_authors
177
+ authors = [@david, @mary]
178
+
179
+ assert_equal %([{"id":1},{"id":2}]), ActiveSupport::JSON.encode(authors, :except => [:name, :author_address_id, :author_address_extra_id])
180
+ end
181
+
182
+ def test_should_allow_includes_for_list_of_authors
183
+ authors = [@david, @mary]
184
+ json = ActiveSupport::JSON.encode(authors,
185
+ :only => :name,
186
+ :include => {
187
+ :posts => { :only => :id }
188
+ }
189
+ )
190
+
191
+ ['"name":"David"', '"posts":[', '{"id":1}', '{"id":2}', '{"id":4}',
192
+ '{"id":5}', '{"id":6}', '"name":"Mary"', '"posts":[{"id":7}]'].each do |fragment|
193
+ assert json.include?(fragment), json
194
+ end
195
+ end
196
+
197
+ def test_should_allow_options_for_hash_of_authors
198
+ authors_hash = {
199
+ 1 => @david,
200
+ 2 => @mary
201
+ }
202
+
203
+ assert_equal %({"1":{"name":"David"}}), ActiveSupport::JSON.encode(authors_hash, :only => [1, :name])
204
+ end
205
+ end