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,656 @@
1
+ require "cases/helper"
2
+ require 'models/post'
3
+ require 'models/binary'
4
+ require 'models/topic'
5
+ require 'models/computer'
6
+ require 'models/developer'
7
+ require 'models/company'
8
+ require 'models/task'
9
+ require 'models/reply'
10
+ require 'models/joke'
11
+ require 'models/course'
12
+ require 'models/category'
13
+ require 'models/parrot'
14
+ require 'models/pirate'
15
+ require 'models/treasure'
16
+ require 'models/matey'
17
+ require 'models/ship'
18
+ require 'models/book'
19
+
20
+ class FixturesTest < ActiveRecord::TestCase
21
+ self.use_instantiated_fixtures = true
22
+ self.use_transactional_fixtures = false
23
+
24
+ fixtures :topics, :developers, :accounts, :tasks, :categories, :funny_jokes, :binaries
25
+
26
+ FIXTURES = %w( accounts binaries companies customers
27
+ developers developers_projects entrants
28
+ movies projects subscribers topics tasks )
29
+ MATCH_ATTRIBUTE_NAME = /[a-zA-Z][-_\w]*/
30
+
31
+ def test_clean_fixtures
32
+ FIXTURES.each do |name|
33
+ fixtures = nil
34
+ assert_nothing_raised { fixtures = create_fixtures(name) }
35
+ assert_kind_of(Fixtures, fixtures)
36
+ fixtures.each { |name, fixture|
37
+ fixture.each { |key, value|
38
+ assert_match(MATCH_ATTRIBUTE_NAME, key)
39
+ }
40
+ }
41
+ end
42
+ end
43
+
44
+ def test_multiple_clean_fixtures
45
+ fixtures_array = nil
46
+ assert_nothing_raised { fixtures_array = create_fixtures(*FIXTURES) }
47
+ assert_kind_of(Array, fixtures_array)
48
+ fixtures_array.each { |fixtures| assert_kind_of(Fixtures, fixtures) }
49
+ end
50
+
51
+ def test_attributes
52
+ topics = create_fixtures("topics")
53
+ assert_equal("The First Topic", topics["first"]["title"])
54
+ assert_nil(topics["second"]["author_email_address"])
55
+ end
56
+
57
+ def test_inserts
58
+ topics = create_fixtures("topics")
59
+ first_row = ActiveRecord::Base.connection.select_one("SELECT * FROM topics WHERE author_name = 'David'")
60
+ assert_equal("The First Topic", first_row["title"])
61
+
62
+ second_row = ActiveRecord::Base.connection.select_one("SELECT * FROM topics WHERE author_name = 'Mary'")
63
+ assert_nil(second_row["author_email_address"])
64
+ end
65
+
66
+ if ActiveRecord::Base.connection.supports_migrations?
67
+ def test_inserts_with_pre_and_suffix
68
+ # Reset cache to make finds on the new table work
69
+ Fixtures.reset_cache
70
+
71
+ ActiveRecord::Base.connection.create_table :prefix_topics_suffix do |t|
72
+ t.column :title, :string
73
+ t.column :author_name, :string
74
+ t.column :author_email_address, :string
75
+ t.column :written_on, :datetime
76
+ t.column :bonus_time, :time
77
+ t.column :last_read, :date
78
+ t.column :content, :string
79
+ t.column :approved, :boolean, :default => true
80
+ t.column :replies_count, :integer, :default => 0
81
+ t.column :parent_id, :integer
82
+ t.column :type, :string, :limit => 50
83
+ end
84
+
85
+ # Store existing prefix/suffix
86
+ old_prefix = ActiveRecord::Base.table_name_prefix
87
+ old_suffix = ActiveRecord::Base.table_name_suffix
88
+
89
+ # Set a prefix/suffix we can test against
90
+ ActiveRecord::Base.table_name_prefix = 'prefix_'
91
+ ActiveRecord::Base.table_name_suffix = '_suffix'
92
+
93
+ topics = create_fixtures("topics")
94
+
95
+ first_row = ActiveRecord::Base.connection.select_one("SELECT * FROM prefix_topics_suffix WHERE author_name = 'David'")
96
+ assert_equal("The First Topic", first_row["title"])
97
+
98
+ second_row = ActiveRecord::Base.connection.select_one("SELECT * FROM prefix_topics_suffix WHERE author_name = 'Mary'")
99
+ assert_nil(second_row["author_email_address"])
100
+
101
+ # This checks for a caching problem which causes a bug in the fixtures
102
+ # class-level configuration helper.
103
+ assert_not_nil topics, "Fixture data inserted, but fixture objects not returned from create"
104
+ ensure
105
+ # Restore prefix/suffix to its previous values
106
+ ActiveRecord::Base.table_name_prefix = old_prefix
107
+ ActiveRecord::Base.table_name_suffix = old_suffix
108
+
109
+ ActiveRecord::Base.connection.drop_table :prefix_topics_suffix rescue nil
110
+ end
111
+ end
112
+
113
+ def test_insert_with_datetime
114
+ topics = create_fixtures("tasks")
115
+ first = Task.find(1)
116
+ assert first
117
+ end
118
+
119
+ def test_logger_level_invariant
120
+ level = ActiveRecord::Base.logger.level
121
+ create_fixtures('topics')
122
+ assert_equal level, ActiveRecord::Base.logger.level
123
+ end
124
+
125
+ def test_instantiation
126
+ topics = create_fixtures("topics")
127
+ assert_kind_of Topic, topics["first"].find
128
+ end
129
+
130
+ def test_complete_instantiation
131
+ assert_equal 4, @topics.size
132
+ assert_equal "The First Topic", @first.title
133
+ end
134
+
135
+ def test_fixtures_from_root_yml_with_instantiation
136
+ # assert_equal 2, @accounts.size
137
+ assert_equal 50, @unknown.credit_limit
138
+ end
139
+
140
+ def test_erb_in_fixtures
141
+ assert_equal 11, @developers.size
142
+ assert_equal "fixture_5", @dev_5.name
143
+ end
144
+
145
+ def test_empty_yaml_fixture
146
+ assert_not_nil Fixtures.new( Account.connection, "accounts", 'Account', FIXTURES_ROOT + "/naked/yml/accounts")
147
+ end
148
+
149
+ def test_empty_yaml_fixture_with_a_comment_in_it
150
+ assert_not_nil Fixtures.new( Account.connection, "companies", 'Company', FIXTURES_ROOT + "/naked/yml/companies")
151
+ end
152
+
153
+ def test_dirty_dirty_yaml_file
154
+ assert_raise(Fixture::FormatError) do
155
+ Fixtures.new( Account.connection, "courses", 'Course', FIXTURES_ROOT + "/naked/yml/courses")
156
+ end
157
+ end
158
+
159
+ def test_empty_csv_fixtures
160
+ assert_not_nil Fixtures.new( Account.connection, "accounts", 'Account', FIXTURES_ROOT + "/naked/csv/accounts")
161
+ end
162
+
163
+ def test_omap_fixtures
164
+ assert_nothing_raised do
165
+ fixtures = Fixtures.new(Account.connection, 'categories', 'Category', FIXTURES_ROOT + "/categories_ordered")
166
+
167
+ i = 0
168
+ fixtures.each do |name, fixture|
169
+ assert_equal "fixture_no_#{i}", name
170
+ assert_equal "Category #{i}", fixture['name']
171
+ i += 1
172
+ end
173
+ end
174
+ end
175
+
176
+ def test_yml_file_in_subdirectory
177
+ assert_equal(categories(:sub_special_1).name, "A special category in a subdir file")
178
+ assert_equal(categories(:sub_special_1).class, SpecialCategory)
179
+ end
180
+
181
+ def test_subsubdir_file_with_arbitrary_name
182
+ assert_equal(categories(:sub_special_3).name, "A special category in an arbitrarily named subsubdir file")
183
+ assert_equal(categories(:sub_special_3).class, SpecialCategory)
184
+ end
185
+
186
+ def test_binary_in_fixtures
187
+ assert_equal 1, @binaries.size
188
+ data = File.open(ASSETS_ROOT + "/flowers.jpg", 'rb') { |f| f.read }
189
+ data.force_encoding('ASCII-8BIT') if data.respond_to?(:force_encoding)
190
+ data.freeze
191
+ assert_equal data, @flowers.data
192
+ end
193
+ end
194
+
195
+ if Account.connection.respond_to?(:reset_pk_sequence!)
196
+ class FixturesResetPkSequenceTest < ActiveRecord::TestCase
197
+ fixtures :accounts
198
+ fixtures :companies
199
+
200
+ def setup
201
+ @instances = [Account.new(:credit_limit => 50), Company.new(:name => 'RoR Consulting')]
202
+ Fixtures.reset_cache # make sure tables get reinitialized
203
+ end
204
+
205
+ def test_resets_to_min_pk_with_specified_pk_and_sequence
206
+ @instances.each do |instance|
207
+ model = instance.class
208
+ model.delete_all
209
+ model.connection.reset_pk_sequence!(model.table_name, model.primary_key, model.sequence_name)
210
+
211
+ instance.save!
212
+ assert_equal 1, instance.id, "Sequence reset for #{model.table_name} failed."
213
+ end
214
+ end
215
+
216
+ def test_resets_to_min_pk_with_default_pk_and_sequence
217
+ @instances.each do |instance|
218
+ model = instance.class
219
+ model.delete_all
220
+ model.connection.reset_pk_sequence!(model.table_name)
221
+
222
+ instance.save!
223
+ assert_equal 1, instance.id, "Sequence reset for #{model.table_name} failed."
224
+ end
225
+ end
226
+
227
+ def test_create_fixtures_resets_sequences_when_not_cached
228
+ @instances.each do |instance|
229
+ max_id = create_fixtures(instance.class.table_name).inject(0) do |max_id, (name, fixture)|
230
+ fixture_id = fixture['id'].to_i
231
+ fixture_id > max_id ? fixture_id : max_id
232
+ end
233
+
234
+ # Clone the last fixture to check that it gets the next greatest id.
235
+ instance.save!
236
+ assert_equal max_id + 1, instance.id, "Sequence reset for #{instance.class.table_name} failed."
237
+ end
238
+ end
239
+ end
240
+ end
241
+
242
+ class FixturesWithoutInstantiationTest < ActiveRecord::TestCase
243
+ self.use_instantiated_fixtures = false
244
+ fixtures :topics, :developers, :accounts
245
+
246
+ def test_without_complete_instantiation
247
+ assert_nil @first
248
+ assert_nil @topics
249
+ assert_nil @developers
250
+ assert_nil @accounts
251
+ end
252
+
253
+ def test_fixtures_from_root_yml_without_instantiation
254
+ assert_nil @unknown
255
+ end
256
+
257
+ def test_accessor_methods
258
+ assert_equal "The First Topic", topics(:first).title
259
+ assert_equal "Jamis", developers(:jamis).name
260
+ assert_equal 50, accounts(:signals37).credit_limit
261
+ end
262
+
263
+ def test_accessor_methods_with_multiple_args
264
+ assert_equal 2, topics(:first, :second).size
265
+ assert_raise(StandardError) { topics([:first, :second]) }
266
+ end
267
+
268
+ def test_reloading_fixtures_through_accessor_methods
269
+ assert_equal "The First Topic", topics(:first).title
270
+ @loaded_fixtures['topics']['first'].expects(:find).returns(stub(:title => "Fresh Topic!"))
271
+ assert_equal "Fresh Topic!", topics(:first, true).title
272
+ end
273
+ end
274
+
275
+ class FixturesWithoutInstanceInstantiationTest < ActiveRecord::TestCase
276
+ self.use_instantiated_fixtures = true
277
+ self.use_instantiated_fixtures = :no_instances
278
+
279
+ fixtures :topics, :developers, :accounts
280
+
281
+ def test_without_instance_instantiation
282
+ assert_nil @first
283
+ assert_not_nil @topics
284
+ assert_not_nil @developers
285
+ assert_not_nil @accounts
286
+ end
287
+ end
288
+
289
+ class TransactionalFixturesTest < ActiveRecord::TestCase
290
+ self.use_instantiated_fixtures = true
291
+ self.use_transactional_fixtures = true
292
+
293
+ fixtures :topics
294
+
295
+ def test_destroy
296
+ assert_not_nil @first
297
+ @first.destroy
298
+ end
299
+
300
+ def test_destroy_just_kidding
301
+ assert_not_nil @first
302
+ end
303
+ end
304
+
305
+ class MultipleFixturesTest < ActiveRecord::TestCase
306
+ fixtures :topics
307
+ fixtures :developers, :accounts
308
+
309
+ def test_fixture_table_names
310
+ assert_equal %w(topics developers accounts), fixture_table_names
311
+ end
312
+ end
313
+
314
+ class SetupTest < ActiveRecord::TestCase
315
+ # fixtures :topics
316
+
317
+ def setup
318
+ @first = true
319
+ end
320
+
321
+ def test_nothing
322
+ end
323
+ end
324
+
325
+ class SetupSubclassTest < SetupTest
326
+ def setup
327
+ super
328
+ @second = true
329
+ end
330
+
331
+ def test_subclassing_should_preserve_setups
332
+ assert @first
333
+ assert @second
334
+ end
335
+ end
336
+
337
+
338
+ class OverlappingFixturesTest < ActiveRecord::TestCase
339
+ fixtures :topics, :developers
340
+ fixtures :developers, :accounts
341
+
342
+ def test_fixture_table_names
343
+ assert_equal %w(topics developers accounts), fixture_table_names
344
+ end
345
+ end
346
+
347
+ class ForeignKeyFixturesTest < ActiveRecord::TestCase
348
+ fixtures :fk_test_has_pk, :fk_test_has_fk
349
+
350
+ # if foreign keys are implemented and fixtures
351
+ # are not deleted in reverse order then this test
352
+ # case will raise StatementInvalid
353
+
354
+ def test_number1
355
+ assert true
356
+ end
357
+
358
+ def test_number2
359
+ assert true
360
+ end
361
+ end
362
+
363
+ class CheckSetTableNameFixturesTest < ActiveRecord::TestCase
364
+ set_fixture_class :funny_jokes => 'Joke'
365
+ fixtures :funny_jokes
366
+ # Set to false to blow away fixtures cache and ensure our fixtures are loaded
367
+ # and thus takes into account our set_fixture_class
368
+ self.use_transactional_fixtures = false
369
+
370
+ def test_table_method
371
+ assert_kind_of Joke, funny_jokes(:a_joke)
372
+ end
373
+ end
374
+
375
+ class FixtureNameIsNotTableNameFixturesTest < ActiveRecord::TestCase
376
+ set_fixture_class :items => Book
377
+ fixtures :items
378
+ # Set to false to blow away fixtures cache and ensure our fixtures are loaded
379
+ # and thus takes into account our set_fixture_class
380
+ self.use_transactional_fixtures = false
381
+
382
+ def test_named_accessor
383
+ assert_kind_of Book, items(:dvd)
384
+ end
385
+ end
386
+
387
+ class FixtureNameIsNotTableNameMultipleFixturesTest < ActiveRecord::TestCase
388
+ set_fixture_class :items => Book, :funny_jokes => Joke
389
+ fixtures :items, :funny_jokes
390
+ # Set to false to blow away fixtures cache and ensure our fixtures are loaded
391
+ # and thus takes into account our set_fixture_class
392
+ self.use_transactional_fixtures = false
393
+
394
+ def test_named_accessor_of_differently_named_fixture
395
+ assert_kind_of Book, items(:dvd)
396
+ end
397
+
398
+ def test_named_accessor_of_same_named_fixture
399
+ assert_kind_of Joke, funny_jokes(:a_joke)
400
+ end
401
+ end
402
+
403
+ class CustomConnectionFixturesTest < ActiveRecord::TestCase
404
+ set_fixture_class :courses => Course
405
+ fixtures :courses
406
+ # Set to false to blow away fixtures cache and ensure our fixtures are loaded
407
+ # and thus takes into account our set_fixture_class
408
+ self.use_transactional_fixtures = false
409
+
410
+ def test_connection
411
+ assert_kind_of Course, courses(:ruby)
412
+ assert_equal Course.connection, courses(:ruby).connection
413
+ end
414
+ end
415
+
416
+ class InvalidTableNameFixturesTest < ActiveRecord::TestCase
417
+ fixtures :funny_jokes
418
+ # Set to false to blow away fixtures cache and ensure our fixtures are loaded
419
+ # and thus takes into account our lack of set_fixture_class
420
+ self.use_transactional_fixtures = false
421
+
422
+ def test_raises_error
423
+ assert_raise FixtureClassNotFound do
424
+ funny_jokes(:a_joke)
425
+ end
426
+ end
427
+ end
428
+
429
+ class CheckEscapedYamlFixturesTest < ActiveRecord::TestCase
430
+ set_fixture_class :funny_jokes => 'Joke'
431
+ fixtures :funny_jokes
432
+ # Set to false to blow away fixtures cache and ensure our fixtures are loaded
433
+ # and thus takes into account our set_fixture_class
434
+ self.use_transactional_fixtures = false
435
+
436
+ def test_proper_escaped_fixture
437
+ assert_equal "The \\n Aristocrats\nAte the candy\n", funny_jokes(:another_joke).name
438
+ end
439
+ end
440
+
441
+ class DevelopersProject; end
442
+ class ManyToManyFixturesWithClassDefined < ActiveRecord::TestCase
443
+ fixtures :developers_projects
444
+
445
+ def test_this_should_run_cleanly
446
+ assert true
447
+ end
448
+ end
449
+
450
+ class FixturesBrokenRollbackTest < ActiveRecord::TestCase
451
+ def blank_setup; end
452
+ alias_method :ar_setup_fixtures, :setup_fixtures
453
+ alias_method :setup_fixtures, :blank_setup
454
+ alias_method :setup, :blank_setup
455
+
456
+ def blank_teardown; end
457
+ alias_method :ar_teardown_fixtures, :teardown_fixtures
458
+ alias_method :teardown_fixtures, :blank_teardown
459
+ alias_method :teardown, :blank_teardown
460
+
461
+ def test_no_rollback_in_teardown_unless_transaction_active
462
+ assert_equal 0, ActiveRecord::Base.connection.open_transactions
463
+ assert_raise(RuntimeError) { ar_setup_fixtures }
464
+ assert_equal 0, ActiveRecord::Base.connection.open_transactions
465
+ assert_nothing_raised { ar_teardown_fixtures }
466
+ assert_equal 0, ActiveRecord::Base.connection.open_transactions
467
+ end
468
+
469
+ private
470
+ def load_fixtures
471
+ raise 'argh'
472
+ end
473
+ end
474
+
475
+ class LoadAllFixturesTest < ActiveRecord::TestCase
476
+ self.fixture_path = FIXTURES_ROOT + "/all"
477
+ fixtures :all
478
+
479
+ def test_all_there
480
+ assert_equal %w(developers people tasks), fixture_table_names.sort
481
+ end
482
+ end
483
+
484
+ class FasterFixturesTest < ActiveRecord::TestCase
485
+ fixtures :categories, :authors
486
+
487
+ def load_extra_fixture(name)
488
+ fixture = create_fixtures(name)
489
+ assert fixture.is_a?(Fixtures)
490
+ @loaded_fixtures[fixture.table_name] = fixture
491
+ end
492
+
493
+ def test_cache
494
+ assert Fixtures.fixture_is_cached?(ActiveRecord::Base.connection, 'categories')
495
+ assert Fixtures.fixture_is_cached?(ActiveRecord::Base.connection, 'authors')
496
+
497
+ assert_no_queries do
498
+ create_fixtures('categories')
499
+ create_fixtures('authors')
500
+ end
501
+
502
+ load_extra_fixture('posts')
503
+ assert Fixtures.fixture_is_cached?(ActiveRecord::Base.connection, 'posts')
504
+ self.class.setup_fixture_accessors('posts')
505
+ assert_equal 'Welcome to the weblog', posts(:welcome).title
506
+ end
507
+ end
508
+
509
+ class FoxyFixturesTest < ActiveRecord::TestCase
510
+ fixtures :parrots, :parrots_pirates, :pirates, :treasures, :mateys, :ships, :computers, :developers
511
+
512
+ def test_identifies_strings
513
+ assert_equal(Fixtures.identify("foo"), Fixtures.identify("foo"))
514
+ assert_not_equal(Fixtures.identify("foo"), Fixtures.identify("FOO"))
515
+ end
516
+
517
+ def test_identifies_symbols
518
+ assert_equal(Fixtures.identify(:foo), Fixtures.identify(:foo))
519
+ end
520
+
521
+ def test_identifies_consistently
522
+ assert_equal 207281424, Fixtures.identify(:ruby)
523
+ assert_equal 1066363776, Fixtures.identify(:sapphire_2)
524
+ end
525
+
526
+ TIMESTAMP_COLUMNS = %w(created_at created_on updated_at updated_on)
527
+
528
+ def test_populates_timestamp_columns
529
+ TIMESTAMP_COLUMNS.each do |property|
530
+ assert_not_nil(parrots(:george).send(property), "should set #{property}")
531
+ end
532
+ end
533
+
534
+ def test_does_not_populate_timestamp_columns_if_model_has_set_record_timestamps_to_false
535
+ TIMESTAMP_COLUMNS.each do |property|
536
+ assert_nil(ships(:black_pearl).send(property), "should not set #{property}")
537
+ end
538
+ end
539
+
540
+ def test_populates_all_columns_with_the_same_time
541
+ last = nil
542
+
543
+ TIMESTAMP_COLUMNS.each do |property|
544
+ current = parrots(:george).send(property)
545
+ last ||= current
546
+
547
+ assert_equal(last, current)
548
+ last = current
549
+ end
550
+ end
551
+
552
+ def test_only_populates_columns_that_exist
553
+ assert_not_nil(pirates(:blackbeard).created_on)
554
+ assert_not_nil(pirates(:blackbeard).updated_on)
555
+ end
556
+
557
+ def test_preserves_existing_fixture_data
558
+ assert_equal(2.weeks.ago.to_date, pirates(:redbeard).created_on.to_date)
559
+ assert_equal(2.weeks.ago.to_date, pirates(:redbeard).updated_on.to_date)
560
+ end
561
+
562
+ def test_generates_unique_ids
563
+ assert_not_nil(parrots(:george).id)
564
+ assert_not_equal(parrots(:george).id, parrots(:louis).id)
565
+ end
566
+
567
+ def test_automatically_sets_primary_key
568
+ assert_not_nil(ships(:black_pearl))
569
+ end
570
+
571
+ def test_preserves_existing_primary_key
572
+ assert_equal(2, ships(:interceptor).id)
573
+ end
574
+
575
+ def test_resolves_belongs_to_symbols
576
+ assert_equal(parrots(:george), pirates(:blackbeard).parrot)
577
+ end
578
+
579
+ def test_ignores_belongs_to_symbols_if_association_and_foreign_key_are_named_the_same
580
+ assert_equal(developers(:david), computers(:workstation).developer)
581
+ end
582
+
583
+ def test_supports_join_tables
584
+ assert(pirates(:blackbeard).parrots.include?(parrots(:george)))
585
+ assert(pirates(:blackbeard).parrots.include?(parrots(:louis)))
586
+ assert(parrots(:george).pirates.include?(pirates(:blackbeard)))
587
+ end
588
+
589
+ def test_supports_inline_habtm
590
+ assert(parrots(:george).treasures.include?(treasures(:diamond)))
591
+ assert(parrots(:george).treasures.include?(treasures(:sapphire)))
592
+ assert(!parrots(:george).treasures.include?(treasures(:ruby)))
593
+ end
594
+
595
+ def test_supports_inline_habtm_with_specified_id
596
+ assert(parrots(:polly).treasures.include?(treasures(:ruby)))
597
+ assert(parrots(:polly).treasures.include?(treasures(:sapphire)))
598
+ assert(!parrots(:polly).treasures.include?(treasures(:diamond)))
599
+ end
600
+
601
+ def test_supports_yaml_arrays
602
+ assert(parrots(:louis).treasures.include?(treasures(:diamond)))
603
+ assert(parrots(:louis).treasures.include?(treasures(:sapphire)))
604
+ end
605
+
606
+ def test_strips_DEFAULTS_key
607
+ assert_raise(StandardError) { parrots(:DEFAULTS) }
608
+
609
+ # this lets us do YAML defaults and not have an extra fixture entry
610
+ %w(sapphire ruby).each { |t| assert(parrots(:davey).treasures.include?(treasures(t))) }
611
+ end
612
+
613
+ def test_supports_label_interpolation
614
+ assert_equal("frederick", parrots(:frederick).name)
615
+ end
616
+
617
+ def test_supports_polymorphic_belongs_to
618
+ assert_equal(pirates(:redbeard), treasures(:sapphire).looter)
619
+ assert_equal(parrots(:louis), treasures(:ruby).looter)
620
+ end
621
+
622
+ def test_only_generates_a_pk_if_necessary
623
+ m = Matey.find(:first)
624
+ m.pirate = pirates(:blackbeard)
625
+ m.target = pirates(:redbeard)
626
+ end
627
+
628
+ def test_supports_sti
629
+ assert_kind_of DeadParrot, parrots(:polly)
630
+ assert_equal pirates(:blackbeard), parrots(:polly).killer
631
+ end
632
+ end
633
+
634
+ class ActiveSupportSubclassWithFixturesTest < ActiveRecord::TestCase
635
+ fixtures :parrots
636
+
637
+ # This seemingly useless assertion catches a bug that caused the fixtures
638
+ # setup code call nil[]
639
+ def test_foo
640
+ assert_equal parrots(:louis), Parrot.find_by_name("King Louis")
641
+ end
642
+ end
643
+
644
+ class FixtureLoadingTest < ActiveRecord::TestCase
645
+ def test_logs_message_for_failed_dependency_load
646
+ ActiveRecord::TestCase.expects(:require_dependency).with(:does_not_exist).raises(LoadError)
647
+ ActiveRecord::Base.logger.expects(:warn)
648
+ ActiveRecord::TestCase.try_to_load_dependency(:does_not_exist)
649
+ end
650
+
651
+ def test_does_not_logs_message_for_successful_dependency_load
652
+ ActiveRecord::TestCase.expects(:require_dependency).with(:works_out_fine)
653
+ ActiveRecord::Base.logger.expects(:warn).never
654
+ ActiveRecord::TestCase.try_to_load_dependency(:works_out_fine)
655
+ end
656
+ end