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,80 @@
1
+ require "cases/helper"
2
+
3
+ class CopyTableTest < ActiveRecord::TestCase
4
+ fixtures :companies, :comments
5
+
6
+ def setup
7
+ @connection = ActiveRecord::Base.connection
8
+ class << @connection
9
+ public :copy_table, :table_structure, :indexes
10
+ end
11
+ end
12
+
13
+ def test_copy_table(from = 'customers', to = 'customers2', options = {})
14
+ assert_nothing_raised {copy_table(from, to, options)}
15
+ assert_equal row_count(from), row_count(to)
16
+
17
+ if block_given?
18
+ yield from, to, options
19
+ else
20
+ assert_equal column_names(from), column_names(to)
21
+ end
22
+
23
+ @connection.drop_table(to) rescue nil
24
+ end
25
+
26
+ def test_copy_table_renaming_column
27
+ test_copy_table('customers', 'customers2',
28
+ :rename => {'name' => 'person_name'}) do |from, to, options|
29
+ expected = column_values(from, 'name')
30
+ assert expected.any?, 'only nils in resultset; real values are needed'
31
+ assert_equal expected, column_values(to, 'person_name')
32
+ end
33
+ end
34
+
35
+ def test_copy_table_with_index
36
+ test_copy_table('comments', 'comments_with_index') do
37
+ @connection.add_index('comments_with_index', ['post_id', 'type'])
38
+ test_copy_table('comments_with_index', 'comments_with_index2') do
39
+ assert_equal table_indexes_without_name('comments_with_index'),
40
+ table_indexes_without_name('comments_with_index2')
41
+ end
42
+ end
43
+ end
44
+
45
+ def test_copy_table_without_primary_key
46
+ test_copy_table('developers_projects', 'programmers_projects')
47
+ end
48
+
49
+ def test_copy_table_with_id_col_that_is_not_primary_key
50
+ test_copy_table('goofy_string_id', 'goofy_string_id2') do |from, to, options|
51
+ original_id = @connection.columns('goofy_string_id').detect{|col| col.name == 'id' }
52
+ copied_id = @connection.columns('goofy_string_id2').detect{|col| col.name == 'id' }
53
+ assert_equal original_id.type, copied_id.type
54
+ assert_equal original_id.sql_type, copied_id.sql_type
55
+ assert_equal original_id.limit, copied_id.limit
56
+ assert_equal original_id.primary, copied_id.primary
57
+ end
58
+ end
59
+
60
+ protected
61
+ def copy_table(from, to, options = {})
62
+ @connection.copy_table(from, to, {:temporary => true}.merge(options))
63
+ end
64
+
65
+ def column_names(table)
66
+ @connection.table_structure(table).map {|column| column['name']}
67
+ end
68
+
69
+ def column_values(table, column)
70
+ @connection.select_all("SELECT #{column} FROM #{table} ORDER BY id").map {|row| row[column]}
71
+ end
72
+
73
+ def table_indexes_without_name(table)
74
+ @connection.indexes('comments_with_index').delete(:name)
75
+ end
76
+
77
+ def row_count(table)
78
+ @connection.select_one("SELECT COUNT(*) AS count FROM #{table}")['count']
79
+ end
80
+ end
@@ -0,0 +1,12 @@
1
+ require "cases/helper"
2
+
3
+ class DatabaseStatementsTest < ActiveRecord::TestCase
4
+ def setup
5
+ @connection = ActiveRecord::Base.connection
6
+ end
7
+
8
+ def test_insert_should_return_the_inserted_id
9
+ id = @connection.insert("INSERT INTO accounts (firm_id,credit_limit) VALUES (42,5000)")
10
+ assert_not_nil id
11
+ end
12
+ end
@@ -0,0 +1,204 @@
1
+ require "cases/helper"
2
+
3
+ class PostgresqlArray < ActiveRecord::Base
4
+ end
5
+
6
+ class PostgresqlMoney < ActiveRecord::Base
7
+ end
8
+
9
+ class PostgresqlNumber < ActiveRecord::Base
10
+ end
11
+
12
+ class PostgresqlTime < ActiveRecord::Base
13
+ end
14
+
15
+ class PostgresqlNetworkAddress < ActiveRecord::Base
16
+ end
17
+
18
+ class PostgresqlBitString < ActiveRecord::Base
19
+ end
20
+
21
+ class PostgresqlOid < ActiveRecord::Base
22
+ end
23
+
24
+ class PostgresqlDataTypeTest < ActiveRecord::TestCase
25
+ self.use_transactional_fixtures = false
26
+
27
+ def setup
28
+ @connection = ActiveRecord::Base.connection
29
+ @connection.execute("set lc_monetary = 'C'")
30
+
31
+ @connection.execute("INSERT INTO postgresql_arrays (commission_by_quarter, nicknames) VALUES ( '{35000,21000,18000,17000}', '{foo,bar,baz}' )")
32
+ @first_array = PostgresqlArray.find(1)
33
+
34
+ @connection.execute("INSERT INTO postgresql_moneys (wealth) VALUES ('567.89'::money)")
35
+ @connection.execute("INSERT INTO postgresql_moneys (wealth) VALUES ('-567.89'::money)")
36
+ @first_money = PostgresqlMoney.find(1)
37
+ @second_money = PostgresqlMoney.find(2)
38
+
39
+ @connection.execute("INSERT INTO postgresql_numbers (single, double) VALUES (123.456, 123456.789)")
40
+ @first_number = PostgresqlNumber.find(1)
41
+
42
+ @connection.execute("INSERT INTO postgresql_times (time_interval) VALUES ('1 year 2 days ago')")
43
+ @first_time = PostgresqlTime.find(1)
44
+
45
+ @connection.execute("INSERT INTO postgresql_network_addresses (cidr_address, inet_address, mac_address) VALUES('192.168.0/24', '172.16.1.254/32', '01:23:45:67:89:0a')")
46
+ @first_network_address = PostgresqlNetworkAddress.find(1)
47
+
48
+ @connection.execute("INSERT INTO postgresql_bit_strings (bit_string, bit_string_varying) VALUES (B'00010101', X'15')")
49
+ @first_bit_string = PostgresqlBitString.find(1)
50
+
51
+ @connection.execute("INSERT INTO postgresql_oids (obj_id) VALUES (1234)")
52
+ @first_oid = PostgresqlOid.find(1)
53
+ end
54
+
55
+ def test_data_type_of_array_types
56
+ assert_equal :string, @first_array.column_for_attribute(:commission_by_quarter).type
57
+ assert_equal :string, @first_array.column_for_attribute(:nicknames).type
58
+ end
59
+
60
+ def test_data_type_of_money_types
61
+ assert_equal :decimal, @first_money.column_for_attribute(:wealth).type
62
+ end
63
+
64
+ def test_data_type_of_number_types
65
+ assert_equal :float, @first_number.column_for_attribute(:single).type
66
+ assert_equal :float, @first_number.column_for_attribute(:double).type
67
+ end
68
+
69
+ def test_data_type_of_time_types
70
+ assert_equal :string, @first_time.column_for_attribute(:time_interval).type
71
+ end
72
+
73
+ def test_data_type_of_network_address_types
74
+ assert_equal :string, @first_network_address.column_for_attribute(:cidr_address).type
75
+ assert_equal :string, @first_network_address.column_for_attribute(:inet_address).type
76
+ assert_equal :string, @first_network_address.column_for_attribute(:mac_address).type
77
+ end
78
+
79
+ def test_data_type_of_bit_string_types
80
+ assert_equal :string, @first_bit_string.column_for_attribute(:bit_string).type
81
+ assert_equal :string, @first_bit_string.column_for_attribute(:bit_string_varying).type
82
+ end
83
+
84
+ def test_data_type_of_oid_types
85
+ assert_equal :integer, @first_oid.column_for_attribute(:obj_id).type
86
+ end
87
+
88
+ def test_array_values
89
+ assert_equal '{35000,21000,18000,17000}', @first_array.commission_by_quarter
90
+ assert_equal '{foo,bar,baz}', @first_array.nicknames
91
+ end
92
+
93
+ def test_money_values
94
+ assert_equal 567.89, @first_money.wealth
95
+ assert_equal -567.89, @second_money.wealth
96
+ end
97
+
98
+ def test_number_values
99
+ assert_equal 123.456, @first_number.single
100
+ assert_equal 123456.789, @first_number.double
101
+ end
102
+
103
+ def test_time_values
104
+ assert_equal '-1 years -2 days', @first_time.time_interval
105
+ end
106
+
107
+ def test_network_address_values
108
+ assert_equal '192.168.0.0/24', @first_network_address.cidr_address
109
+ assert_equal '172.16.1.254', @first_network_address.inet_address
110
+ assert_equal '01:23:45:67:89:0a', @first_network_address.mac_address
111
+ end
112
+
113
+ def test_bit_string_values
114
+ assert_equal '00010101', @first_bit_string.bit_string
115
+ assert_equal '00010101', @first_bit_string.bit_string_varying
116
+ end
117
+
118
+ def test_oid_values
119
+ assert_equal 1234, @first_oid.obj_id
120
+ end
121
+
122
+ def test_update_integer_array
123
+ new_value = '{32800,95000,29350,17000}'
124
+ assert @first_array.commission_by_quarter = new_value
125
+ assert @first_array.save
126
+ assert @first_array.reload
127
+ assert_equal @first_array.commission_by_quarter, new_value
128
+ assert @first_array.commission_by_quarter = new_value
129
+ assert @first_array.save
130
+ assert @first_array.reload
131
+ assert_equal @first_array.commission_by_quarter, new_value
132
+ end
133
+
134
+ def test_update_text_array
135
+ new_value = '{robby,robert,rob,robbie}'
136
+ assert @first_array.nicknames = new_value
137
+ assert @first_array.save
138
+ assert @first_array.reload
139
+ assert_equal @first_array.nicknames, new_value
140
+ assert @first_array.nicknames = new_value
141
+ assert @first_array.save
142
+ assert @first_array.reload
143
+ assert_equal @first_array.nicknames, new_value
144
+ end
145
+
146
+ def test_update_money
147
+ new_value = BigDecimal.new('123.45')
148
+ assert @first_money.wealth = new_value
149
+ assert @first_money.save
150
+ assert @first_money.reload
151
+ assert_equal new_value, @first_money.wealth
152
+ end
153
+
154
+ def test_update_number
155
+ new_single = 789.012
156
+ new_double = 789012.345
157
+ assert @first_number.single = new_single
158
+ assert @first_number.double = new_double
159
+ assert @first_number.save
160
+ assert @first_number.reload
161
+ assert_equal @first_number.single, new_single
162
+ assert_equal @first_number.double, new_double
163
+ end
164
+
165
+ def test_update_time
166
+ assert @first_time.time_interval = '2 years 3 minutes'
167
+ assert @first_time.save
168
+ assert @first_time.reload
169
+ assert_equal @first_time.time_interval, '2 years 00:03:00'
170
+ end
171
+
172
+ def test_update_network_address
173
+ new_cidr_address = '10.1.2.3/32'
174
+ new_inet_address = '10.0.0.0/8'
175
+ new_mac_address = 'bc:de:f0:12:34:56'
176
+ assert @first_network_address.cidr_address = new_cidr_address
177
+ assert @first_network_address.inet_address = new_inet_address
178
+ assert @first_network_address.mac_address = new_mac_address
179
+ assert @first_network_address.save
180
+ assert @first_network_address.reload
181
+ assert_equal @first_network_address.cidr_address, new_cidr_address
182
+ assert_equal @first_network_address.inet_address, new_inet_address
183
+ assert_equal @first_network_address.mac_address, new_mac_address
184
+ end
185
+
186
+ def test_update_bit_string
187
+ new_bit_string = '11111111'
188
+ new_bit_string_varying = 'FF'
189
+ assert @first_bit_string.bit_string = new_bit_string
190
+ assert @first_bit_string.bit_string_varying = new_bit_string_varying
191
+ assert @first_bit_string.save
192
+ assert @first_bit_string.reload
193
+ assert_equal @first_bit_string.bit_string, new_bit_string
194
+ assert_equal @first_bit_string.bit_string, @first_bit_string.bit_string_varying
195
+ end
196
+
197
+ def test_update_oid
198
+ new_value = 567890
199
+ assert @first_oid.obj_id = new_value
200
+ assert @first_oid.save
201
+ assert @first_oid.reload
202
+ assert_equal @first_oid.obj_id, new_value
203
+ end
204
+ end
@@ -0,0 +1,37 @@
1
+ require "cases/helper"
2
+ require 'models/topic'
3
+ require 'models/task'
4
+
5
+ class DateTimeTest < ActiveRecord::TestCase
6
+ def test_saves_both_date_and_time
7
+ time_values = [1807, 2, 10, 15, 30, 45]
8
+ now = DateTime.civil(*time_values)
9
+
10
+ task = Task.new
11
+ task.starting = now
12
+ task.save!
13
+
14
+ # check against Time.local_time, since some platforms will return a Time instead of a DateTime
15
+ assert_equal Time.local_time(*time_values), Task.find(task.id).starting
16
+ end
17
+
18
+ def test_assign_empty_date_time
19
+ task = Task.new
20
+ task.starting = ''
21
+ task.ending = nil
22
+ assert_nil task.starting
23
+ assert_nil task.ending
24
+ end
25
+
26
+ def test_assign_empty_date
27
+ topic = Topic.new
28
+ topic.last_read = ''
29
+ assert_nil topic.last_read
30
+ end
31
+
32
+ def test_assign_empty_time
33
+ topic = Topic.new
34
+ topic.bonus_time = ''
35
+ assert_nil topic.bonus_time
36
+ end
37
+ end
@@ -0,0 +1,16 @@
1
+ require "cases/helper"
2
+ require 'models/default'
3
+
4
+ class DefaultTest < ActiveRecord::TestCase
5
+ def test_default_timestamp
6
+ default = Default.new
7
+ assert_instance_of(Time, default.default_timestamp)
8
+ assert_equal(:datetime, default.column_for_attribute(:default_timestamp).type)
9
+
10
+ # Variance should be small; increase if required -- e.g., if test db is on
11
+ # remote host and clocks aren't synchronized.
12
+ t1 = Time.new
13
+ accepted_variance = 1.0
14
+ assert_in_delta(t1.to_f, default.default_timestamp.to_f, accepted_variance)
15
+ end
16
+ end
@@ -0,0 +1,111 @@
1
+ require "cases/helper"
2
+ require 'models/default'
3
+ require 'models/entrant'
4
+
5
+ class DefaultTest < ActiveRecord::TestCase
6
+ def test_nil_defaults_for_not_null_columns
7
+ column_defaults =
8
+ if current_adapter?(:MysqlAdapter) && (Mysql.client_version < 50051 || (50100..50122).include?(Mysql.client_version))
9
+ { 'id' => nil, 'name' => '', 'course_id' => nil }
10
+ else
11
+ { 'id' => nil, 'name' => nil, 'course_id' => nil }
12
+ end
13
+
14
+ column_defaults.each do |name, default|
15
+ column = Entrant.columns_hash[name]
16
+ assert !column.null, "#{name} column should be NOT NULL"
17
+ assert_equal default, column.default, "#{name} column should be DEFAULT #{default.inspect}"
18
+ end
19
+ end
20
+
21
+ if current_adapter?(:PostgreSQLAdapter, :FirebirdAdapter, :OpenBaseAdapter, :OracleAdapter)
22
+ def test_default_integers
23
+ default = Default.new
24
+ assert_instance_of Fixnum, default.positive_integer
25
+ assert_equal 1, default.positive_integer
26
+ assert_instance_of Fixnum, default.negative_integer
27
+ assert_equal -1, default.negative_integer
28
+ assert_instance_of BigDecimal, default.decimal_number
29
+ assert_equal BigDecimal.new("2.78"), default.decimal_number
30
+ end
31
+ end
32
+
33
+ if current_adapter?(:PostgreSQLAdapter)
34
+ def test_multiline_default_text
35
+ # older postgres versions represent the default with escapes ("\\012" for a newline)
36
+ assert ( "--- []\n\n" == Default.columns_hash['multiline_default'].default ||
37
+ "--- []\\012\\012" == Default.columns_hash['multiline_default'].default)
38
+ end
39
+ end
40
+ end
41
+
42
+ if current_adapter?(:MysqlAdapter)
43
+ class DefaultsTestWithoutTransactionalFixtures < ActiveRecord::TestCase
44
+ # ActiveRecord::Base#create! (and #save and other related methods) will
45
+ # open a new transaction. When in transactional fixtures mode, this will
46
+ # cause ActiveRecord to create a new savepoint. However, since MySQL doesn't
47
+ # support DDL transactions, creating a table will result in any created
48
+ # savepoints to be automatically released. This in turn causes the savepoint
49
+ # release code in AbstractAdapter#transaction to fail.
50
+ #
51
+ # We don't want that to happen, so we disable transactional fixtures here.
52
+ self.use_transactional_fixtures = false
53
+
54
+ # MySQL 5 and higher is quirky with not null text/blob columns.
55
+ # With MySQL Text/blob columns cannot have defaults. If the column is not
56
+ # null MySQL will report that the column has a null default
57
+ # but it behaves as though the column had a default of ''
58
+ def test_mysql_text_not_null_defaults
59
+ klass = Class.new(ActiveRecord::Base)
60
+ klass.table_name = 'test_mysql_text_not_null_defaults'
61
+ klass.connection.create_table klass.table_name do |t|
62
+ t.column :non_null_text, :text, :null => false
63
+ t.column :non_null_blob, :blob, :null => false
64
+ t.column :null_text, :text, :null => true
65
+ t.column :null_blob, :blob, :null => true
66
+ end
67
+ assert_equal '', klass.columns_hash['non_null_blob'].default
68
+ assert_equal '', klass.columns_hash['non_null_text'].default
69
+
70
+ assert_equal nil, klass.columns_hash['null_blob'].default
71
+ assert_equal nil, klass.columns_hash['null_text'].default
72
+
73
+ assert_nothing_raised do
74
+ instance = klass.create!
75
+ assert_equal '', instance.non_null_text
76
+ assert_equal '', instance.non_null_blob
77
+ assert_nil instance.null_text
78
+ assert_nil instance.null_blob
79
+ end
80
+ ensure
81
+ klass.connection.drop_table(klass.table_name) rescue nil
82
+ end
83
+
84
+ # MySQL uses an implicit default 0 rather than NULL unless in strict mode.
85
+ # We use an implicit NULL so schema.rb is compatible with other databases.
86
+ def test_mysql_integer_not_null_defaults
87
+ klass = Class.new(ActiveRecord::Base)
88
+ klass.table_name = 'test_integer_not_null_default_zero'
89
+ klass.connection.create_table klass.table_name do |t|
90
+ t.column :zero, :integer, :null => false, :default => 0
91
+ t.column :omit, :integer, :null => false
92
+ end
93
+
94
+ assert_equal 0, klass.columns_hash['zero'].default
95
+ assert !klass.columns_hash['zero'].null
96
+ # 0 in MySQL 4, nil in 5.
97
+ assert [0, nil].include?(klass.columns_hash['omit'].default)
98
+ assert !klass.columns_hash['omit'].null
99
+
100
+ assert_raise(ActiveRecord::StatementInvalid) { klass.create! }
101
+
102
+ assert_nothing_raised do
103
+ instance = klass.create!(:omit => 1)
104
+ assert_equal 0, instance.zero
105
+ assert_equal 1, instance.omit
106
+ end
107
+ ensure
108
+ klass.connection.drop_table(klass.table_name) rescue nil
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,30 @@
1
+ require "cases/helper"
2
+ require 'models/entrant'
3
+
4
+ class DeprecatedFinderTest < ActiveRecord::TestCase
5
+ fixtures :entrants
6
+
7
+ def test_deprecated_find_all_was_removed
8
+ assert_raise(NoMethodError) { Entrant.find_all }
9
+ end
10
+
11
+ def test_deprecated_find_first_was_removed
12
+ assert_raise(NoMethodError) { Entrant.find_first }
13
+ end
14
+
15
+ def test_deprecated_find_on_conditions_was_removed
16
+ assert_raise(NoMethodError) { Entrant.find_on_conditions }
17
+ end
18
+
19
+ def test_count
20
+ assert_equal(0, Entrant.count(:conditions => "id > 3"))
21
+ assert_equal(1, Entrant.count(:conditions => ["id > ?", 2]))
22
+ assert_equal(2, Entrant.count(:conditions => ["id > ?", 1]))
23
+ end
24
+
25
+ def test_count_by_sql
26
+ assert_equal(0, Entrant.count_by_sql("SELECT COUNT(*) FROM entrants WHERE id > 3"))
27
+ assert_equal(1, Entrant.count_by_sql(["SELECT COUNT(*) FROM entrants WHERE id > ?", 2]))
28
+ assert_equal(2, Entrant.count_by_sql(["SELECT COUNT(*) FROM entrants WHERE id > ?", 1]))
29
+ end
30
+ end