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,124 @@
1
+ require "cases/helper"
2
+ require 'models/course'
3
+
4
+ class FirebirdMigrationTest < ActiveRecord::TestCase
5
+ self.use_transactional_fixtures = false
6
+
7
+ def setup
8
+ # using Course connection for tests -- need a db that doesn't already have a BOOLEAN domain
9
+ @connection = Course.connection
10
+ @fireruby_connection = @connection.instance_variable_get(:@connection)
11
+ end
12
+
13
+ def teardown
14
+ @connection.drop_table :foo rescue nil
15
+ @connection.execute("DROP DOMAIN D_BOOLEAN") rescue nil
16
+ end
17
+
18
+ def test_create_table_with_custom_sequence_name
19
+ assert_nothing_raised do
20
+ @connection.create_table(:foo, :sequence => 'foo_custom_seq') do |f|
21
+ f.column :bar, :string
22
+ end
23
+ end
24
+ assert !sequence_exists?('foo_seq')
25
+ assert sequence_exists?('foo_custom_seq')
26
+
27
+ assert_nothing_raised { @connection.drop_table(:foo, :sequence => 'foo_custom_seq') }
28
+ assert !sequence_exists?('foo_custom_seq')
29
+ ensure
30
+ FireRuby::Generator.new('foo_custom_seq', @fireruby_connection).drop rescue nil
31
+ end
32
+
33
+ def test_create_table_without_sequence
34
+ assert_nothing_raised do
35
+ @connection.create_table(:foo, :sequence => false) do |f|
36
+ f.column :bar, :string
37
+ end
38
+ end
39
+ assert !sequence_exists?('foo_seq')
40
+ assert_nothing_raised { @connection.drop_table :foo }
41
+
42
+ assert_nothing_raised do
43
+ @connection.create_table(:foo, :id => false) do |f|
44
+ f.column :bar, :string
45
+ end
46
+ end
47
+ assert !sequence_exists?('foo_seq')
48
+ assert_nothing_raised { @connection.drop_table :foo }
49
+ end
50
+
51
+ def test_create_table_with_boolean_column
52
+ assert !boolean_domain_exists?
53
+ assert_nothing_raised do
54
+ @connection.create_table :foo do |f|
55
+ f.column :bar, :string
56
+ f.column :baz, :boolean
57
+ end
58
+ end
59
+ assert boolean_domain_exists?
60
+ end
61
+
62
+ def test_add_boolean_column
63
+ assert !boolean_domain_exists?
64
+ @connection.create_table :foo do |f|
65
+ f.column :bar, :string
66
+ end
67
+
68
+ assert_nothing_raised { @connection.add_column :foo, :baz, :boolean }
69
+ assert boolean_domain_exists?
70
+ assert_equal :boolean, @connection.columns(:foo).find { |c| c.name == "baz" }.type
71
+ end
72
+
73
+ def test_change_column_to_boolean
74
+ assert !boolean_domain_exists?
75
+ # Manually create table with a SMALLINT column, which can be changed to a BOOLEAN
76
+ @connection.execute "CREATE TABLE foo (bar SMALLINT)"
77
+ assert_equal :integer, @connection.columns(:foo).find { |c| c.name == "bar" }.type
78
+
79
+ assert_nothing_raised { @connection.change_column :foo, :bar, :boolean }
80
+ assert boolean_domain_exists?
81
+ assert_equal :boolean, @connection.columns(:foo).find { |c| c.name == "bar" }.type
82
+ end
83
+
84
+ def test_rename_table_with_data_and_index
85
+ @connection.create_table :foo do |f|
86
+ f.column :baz, :string, :limit => 50
87
+ end
88
+ 100.times { |i| @connection.execute "INSERT INTO foo VALUES (GEN_ID(foo_seq, 1), 'record #{i+1}')" }
89
+ @connection.add_index :foo, :baz
90
+
91
+ assert_nothing_raised { @connection.rename_table :foo, :bar }
92
+ assert !@connection.tables.include?("foo")
93
+ assert @connection.tables.include?("bar")
94
+ assert_equal "index_bar_on_baz", @connection.indexes("bar").first.name
95
+ assert_equal 100, FireRuby::Generator.new("bar_seq", @fireruby_connection).last
96
+ assert_equal 100, @connection.select_one("SELECT COUNT(*) FROM bar")["count"]
97
+ ensure
98
+ @connection.drop_table :bar rescue nil
99
+ end
100
+
101
+ def test_renaming_table_with_fk_constraint_raises_error
102
+ @connection.create_table :parent do |p|
103
+ p.column :name, :string
104
+ end
105
+ @connection.create_table :child do |c|
106
+ c.column :parent_id, :integer
107
+ end
108
+ @connection.execute "ALTER TABLE child ADD CONSTRAINT fk_child_parent FOREIGN KEY(parent_id) REFERENCES parent(id)"
109
+ assert_raise(ActiveRecord::ActiveRecordError) { @connection.rename_table :child, :descendant }
110
+ ensure
111
+ @connection.drop_table :child rescue nil
112
+ @connection.drop_table :descendant rescue nil
113
+ @connection.drop_table :parent rescue nil
114
+ end
115
+
116
+ private
117
+ def boolean_domain_exists?
118
+ !@connection.select_one("SELECT 1 FROM rdb$fields WHERE rdb$field_name = 'D_BOOLEAN'").nil?
119
+ end
120
+
121
+ def sequence_exists?(sequence_name)
122
+ FireRuby::Generator.exists?(sequence_name, @fireruby_connection)
123
+ end
124
+ end
@@ -0,0 +1,96 @@
1
+ require "cases/helper"
2
+
3
+ class Mixin < ActiveRecord::Base
4
+ end
5
+
6
+ # Let us control what Time.now returns for the TouchTest suite
7
+ class Time
8
+ @@forced_now_time = nil
9
+ cattr_accessor :forced_now_time
10
+
11
+ class << self
12
+ def now_with_forcing
13
+ if @@forced_now_time
14
+ @@forced_now_time
15
+ else
16
+ now_without_forcing
17
+ end
18
+ end
19
+ alias_method_chain :now, :forcing
20
+ end
21
+ end
22
+
23
+
24
+ class TouchTest < ActiveRecord::TestCase
25
+ fixtures :mixins
26
+
27
+ def setup
28
+ Time.forced_now_time = Time.now
29
+ end
30
+
31
+ def teardown
32
+ Time.forced_now_time = nil
33
+ end
34
+
35
+ def test_time_mocking
36
+ five_minutes_ago = 5.minutes.ago
37
+ Time.forced_now_time = five_minutes_ago
38
+ assert_equal five_minutes_ago, Time.now
39
+
40
+ Time.forced_now_time = nil
41
+ assert_not_equal five_minutes_ago, Time.now
42
+ end
43
+
44
+ def test_update
45
+ stamped = Mixin.new
46
+
47
+ assert_nil stamped.updated_at
48
+ assert_nil stamped.created_at
49
+ stamped.save
50
+ assert_equal Time.now, stamped.updated_at
51
+ assert_equal Time.now, stamped.created_at
52
+ end
53
+
54
+ def test_create
55
+ obj = Mixin.create
56
+ assert_equal Time.now, obj.updated_at
57
+ assert_equal Time.now, obj.created_at
58
+ end
59
+
60
+ def test_many_updates
61
+ stamped = Mixin.new
62
+
63
+ assert_nil stamped.updated_at
64
+ assert_nil stamped.created_at
65
+ stamped.save
66
+ assert_equal Time.now, stamped.created_at
67
+ assert_equal Time.now, stamped.updated_at
68
+
69
+ old_updated_at = stamped.updated_at
70
+
71
+ Time.forced_now_time = 5.minutes.from_now
72
+ stamped.lft_will_change!
73
+ stamped.save
74
+
75
+ assert_equal Time.now, stamped.updated_at
76
+ assert_equal old_updated_at, stamped.created_at
77
+ end
78
+
79
+ def test_create_turned_off
80
+ Mixin.record_timestamps = false
81
+
82
+ mixin = Mixin.new
83
+
84
+ assert_nil mixin.updated_at
85
+ mixin.save
86
+ assert_nil mixin.updated_at
87
+
88
+ # Make sure Mixin.record_timestamps gets reset, even if this test fails,
89
+ # so that other tests do not fail because Mixin.record_timestamps == false
90
+ rescue Exception => e
91
+ raise e
92
+ ensure
93
+ Mixin.record_timestamps = true
94
+ end
95
+
96
+ end
@@ -0,0 +1,81 @@
1
+ require "cases/helper"
2
+ require 'models/company_in_module'
3
+
4
+ class ModulesTest < ActiveRecord::TestCase
5
+ fixtures :accounts, :companies, :projects, :developers
6
+
7
+ def setup
8
+ # need to make sure Object::Firm and Object::Client are not defined,
9
+ # so that constantize will not be able to cheat when having to load namespaced classes
10
+ @undefined_consts = {}
11
+
12
+ [:Firm, :Client].each do |const|
13
+ @undefined_consts.merge! const => Object.send(:remove_const, const) if Object.const_defined?(const)
14
+ end
15
+ end
16
+
17
+ def teardown
18
+ # reinstate the constants that we undefined in the setup
19
+ @undefined_consts.each do |constant, value|
20
+ Object.send :const_set, constant, value unless value.nil?
21
+ end
22
+ end
23
+
24
+ def test_module_spanning_associations
25
+ firm = MyApplication::Business::Firm.find(:first)
26
+ assert !firm.clients.empty?, "Firm should have clients"
27
+ assert_nil firm.class.table_name.match('::'), "Firm shouldn't have the module appear in its table name"
28
+ end
29
+
30
+ def test_module_spanning_has_and_belongs_to_many_associations
31
+ project = MyApplication::Business::Project.find(:first)
32
+ project.developers << MyApplication::Business::Developer.create("name" => "John")
33
+ assert "John", project.developers.last.name
34
+ end
35
+
36
+ def test_associations_spanning_cross_modules
37
+ account = MyApplication::Billing::Account.find(:first, :order => 'id')
38
+ assert_kind_of MyApplication::Business::Firm, account.firm
39
+ assert_kind_of MyApplication::Billing::Firm, account.qualified_billing_firm
40
+ assert_kind_of MyApplication::Billing::Firm, account.unqualified_billing_firm
41
+ assert_kind_of MyApplication::Billing::Nested::Firm, account.nested_qualified_billing_firm
42
+ assert_kind_of MyApplication::Billing::Nested::Firm, account.nested_unqualified_billing_firm
43
+ end
44
+
45
+ def test_find_account_and_include_company
46
+ account = MyApplication::Billing::Account.find(1, :include => :firm)
47
+ assert_kind_of MyApplication::Business::Firm, account.instance_variable_get('@firm')
48
+ assert_kind_of MyApplication::Business::Firm, account.firm
49
+ end
50
+
51
+ def test_table_name
52
+ assert_equal 'accounts', MyApplication::Billing::Account.table_name, 'table_name for ActiveRecord model in module'
53
+ assert_equal 'companies', MyApplication::Business::Client.table_name, 'table_name for ActiveRecord model subclass'
54
+ assert_equal 'company_contacts', MyApplication::Business::Client::Contact.table_name, 'table_name for ActiveRecord model enclosed by another ActiveRecord model'
55
+ end
56
+
57
+ def test_assign_ids
58
+ firm = MyApplication::Business::Firm.first
59
+
60
+ assert_nothing_raised NameError, "Should be able to resolve all class constants via reflection" do
61
+ firm.client_ids = [MyApplication::Business::Client.first.id]
62
+ end
63
+ end
64
+
65
+ # need to add an eager loading condition to force the eager loading model into
66
+ # the old join model, to test that. See http://dev.rubyonrails.org/ticket/9640
67
+ def test_eager_loading_in_modules
68
+ clients = []
69
+
70
+ assert_nothing_raised NameError, "Should be able to resolve all class constants via reflection" do
71
+ clients << MyApplication::Business::Client.find(3, :include => {:firm => :account}, :conditions => 'accounts.id IS NOT NULL')
72
+ clients << MyApplication::Business::Client.find(3, :include => {:firm => :account})
73
+ end
74
+
75
+ clients.each do |client|
76
+ assert_no_queries do
77
+ assert_not_nil(client.firm.account)
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,85 @@
1
+ require "cases/helper"
2
+ require 'models/entrant'
3
+
4
+ # So we can test whether Course.connection survives a reload.
5
+ require_dependency 'models/course'
6
+
7
+ class MultipleDbTest < ActiveRecord::TestCase
8
+ self.use_transactional_fixtures = false
9
+
10
+ def setup
11
+ @courses = create_fixtures("courses") { Course.retrieve_connection }
12
+ @entrants = create_fixtures("entrants")
13
+ end
14
+
15
+ def test_connected
16
+ assert_not_nil Entrant.connection
17
+ assert_not_nil Course.connection
18
+ end
19
+
20
+ def test_proper_connection
21
+ assert_not_equal(Entrant.connection, Course.connection)
22
+ assert_equal(Entrant.connection, Entrant.retrieve_connection)
23
+ assert_equal(Course.connection, Course.retrieve_connection)
24
+ assert_equal(ActiveRecord::Base.connection, Entrant.connection)
25
+ end
26
+
27
+ def test_find
28
+ c1 = Course.find(1)
29
+ assert_equal "Ruby Development", c1.name
30
+ c2 = Course.find(2)
31
+ assert_equal "Java Development", c2.name
32
+ e1 = Entrant.find(1)
33
+ assert_equal "Ruby Developer", e1.name
34
+ e2 = Entrant.find(2)
35
+ assert_equal "Ruby Guru", e2.name
36
+ e3 = Entrant.find(3)
37
+ assert_equal "Java Lover", e3.name
38
+ end
39
+
40
+ def test_associations
41
+ c1 = Course.find(1)
42
+ assert_equal 2, c1.entrants.count
43
+ e1 = Entrant.find(1)
44
+ assert_equal e1.course.id, c1.id
45
+ c2 = Course.find(2)
46
+ assert_equal 1, c2.entrants.count
47
+ e3 = Entrant.find(3)
48
+ assert_equal e3.course.id, c2.id
49
+ end
50
+
51
+ def test_course_connection_should_survive_dependency_reload
52
+ assert Course.connection
53
+
54
+ ActiveSupport::Dependencies.clear
55
+ Object.send(:remove_const, :Course)
56
+ require_dependency 'models/course'
57
+
58
+ assert Course.connection
59
+ end
60
+
61
+ def test_transactions_across_databases
62
+ c1 = Course.find(1)
63
+ e1 = Entrant.find(1)
64
+
65
+ begin
66
+ Course.transaction do
67
+ Entrant.transaction do
68
+ c1.name = "Typo"
69
+ e1.name = "Typo"
70
+ c1.save
71
+ e1.save
72
+ raise "No I messed up."
73
+ end
74
+ end
75
+ rescue
76
+ # Yup caught it
77
+ end
78
+
79
+ assert_equal "Typo", c1.name
80
+ assert_equal "Typo", e1.name
81
+
82
+ assert_equal "Ruby Development", Course.find(1).name
83
+ assert_equal "Ruby Developer", Entrant.find(1).name
84
+ end
85
+ end