activerecord 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (311) hide show
  1. data/CHANGELOG +4928 -3
  2. data/README +45 -46
  3. data/RUNNING_UNIT_TESTS +8 -11
  4. data/Rakefile +247 -0
  5. data/install.rb +8 -38
  6. data/lib/active_record/aggregations.rb +64 -49
  7. data/lib/active_record/associations/association_collection.rb +217 -47
  8. data/lib/active_record/associations/association_proxy.rb +159 -0
  9. data/lib/active_record/associations/belongs_to_association.rb +56 -0
  10. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +50 -0
  11. data/lib/active_record/associations/has_and_belongs_to_many_association.rb +155 -37
  12. data/lib/active_record/associations/has_many_association.rb +145 -75
  13. data/lib/active_record/associations/has_many_through_association.rb +283 -0
  14. data/lib/active_record/associations/has_one_association.rb +96 -0
  15. data/lib/active_record/associations.rb +1537 -304
  16. data/lib/active_record/attribute_methods.rb +328 -0
  17. data/lib/active_record/base.rb +2001 -588
  18. data/lib/active_record/calculations.rb +269 -0
  19. data/lib/active_record/callbacks.rb +169 -165
  20. data/lib/active_record/connection_adapters/abstract/connection_specification.rb +308 -0
  21. data/lib/active_record/connection_adapters/abstract/database_statements.rb +171 -0
  22. data/lib/active_record/connection_adapters/abstract/query_cache.rb +87 -0
  23. data/lib/active_record/connection_adapters/abstract/quoting.rb +69 -0
  24. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +472 -0
  25. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +306 -0
  26. data/lib/active_record/connection_adapters/abstract_adapter.rb +125 -279
  27. data/lib/active_record/connection_adapters/mysql_adapter.rb +442 -77
  28. data/lib/active_record/connection_adapters/postgresql_adapter.rb +805 -135
  29. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +34 -0
  30. data/lib/active_record/connection_adapters/sqlite_adapter.rb +353 -69
  31. data/lib/active_record/fixtures.rb +946 -100
  32. data/lib/active_record/locking/optimistic.rb +144 -0
  33. data/lib/active_record/locking/pessimistic.rb +77 -0
  34. data/lib/active_record/migration.rb +417 -0
  35. data/lib/active_record/observer.rb +142 -32
  36. data/lib/active_record/query_cache.rb +23 -0
  37. data/lib/active_record/reflection.rb +163 -70
  38. data/lib/active_record/schema.rb +58 -0
  39. data/lib/active_record/schema_dumper.rb +171 -0
  40. data/lib/active_record/serialization.rb +98 -0
  41. data/lib/active_record/serializers/json_serializer.rb +71 -0
  42. data/lib/active_record/serializers/xml_serializer.rb +315 -0
  43. data/lib/active_record/timestamp.rb +41 -0
  44. data/lib/active_record/transactions.rb +87 -57
  45. data/lib/active_record/validations.rb +909 -122
  46. data/lib/active_record/vendor/db2.rb +362 -0
  47. data/lib/active_record/vendor/mysql.rb +126 -29
  48. data/lib/active_record/version.rb +9 -0
  49. data/lib/active_record.rb +35 -7
  50. data/lib/activerecord.rb +1 -0
  51. data/test/aaa_create_tables_test.rb +72 -0
  52. data/test/abstract_unit.rb +73 -5
  53. data/test/active_schema_test_mysql.rb +43 -0
  54. data/test/adapter_test.rb +105 -0
  55. data/test/adapter_test_sqlserver.rb +95 -0
  56. data/test/aggregations_test.rb +110 -16
  57. data/test/all.sh +2 -2
  58. data/test/ar_schema_test.rb +33 -0
  59. data/test/association_inheritance_reload.rb +14 -0
  60. data/test/associations/ar_joins_test.rb +0 -0
  61. data/test/associations/callbacks_test.rb +147 -0
  62. data/test/associations/cascaded_eager_loading_test.rb +110 -0
  63. data/test/associations/eager_singularization_test.rb +145 -0
  64. data/test/associations/eager_test.rb +442 -0
  65. data/test/associations/extension_test.rb +47 -0
  66. data/test/associations/inner_join_association_test.rb +88 -0
  67. data/test/associations/join_model_test.rb +553 -0
  68. data/test/associations_test.rb +1930 -267
  69. data/test/attribute_methods_test.rb +146 -0
  70. data/test/base_test.rb +1316 -84
  71. data/test/binary_test.rb +32 -0
  72. data/test/calculations_test.rb +251 -0
  73. data/test/callbacks_test.rb +400 -0
  74. data/test/class_inheritable_attributes_test.rb +3 -4
  75. data/test/column_alias_test.rb +17 -0
  76. data/test/connection_test_firebird.rb +8 -0
  77. data/test/connection_test_mysql.rb +30 -0
  78. data/test/connections/native_db2/connection.rb +25 -0
  79. data/test/connections/native_firebird/connection.rb +26 -0
  80. data/test/connections/native_frontbase/connection.rb +27 -0
  81. data/test/connections/native_mysql/connection.rb +21 -18
  82. data/test/connections/native_openbase/connection.rb +21 -0
  83. data/test/connections/native_oracle/connection.rb +27 -0
  84. data/test/connections/native_postgresql/connection.rb +17 -18
  85. data/test/connections/native_sqlite/connection.rb +17 -16
  86. data/test/connections/native_sqlite3/connection.rb +25 -0
  87. data/test/connections/native_sqlite3/in_memory_connection.rb +18 -0
  88. data/test/connections/native_sybase/connection.rb +23 -0
  89. data/test/copy_table_test_sqlite.rb +69 -0
  90. data/test/datatype_test_postgresql.rb +203 -0
  91. data/test/date_time_test.rb +37 -0
  92. data/test/default_test_firebird.rb +16 -0
  93. data/test/defaults_test.rb +67 -0
  94. data/test/deprecated_finder_test.rb +30 -0
  95. data/test/finder_test.rb +607 -32
  96. data/test/fixtures/accounts.yml +28 -0
  97. data/test/fixtures/all/developers.yml +0 -0
  98. data/test/fixtures/all/people.csv +0 -0
  99. data/test/fixtures/all/tasks.yml +0 -0
  100. data/test/fixtures/author.rb +107 -0
  101. data/test/fixtures/author_favorites.yml +4 -0
  102. data/test/fixtures/authors.yml +7 -0
  103. data/test/fixtures/bad_fixtures/attr_with_numeric_first_char +1 -0
  104. data/test/fixtures/bad_fixtures/attr_with_spaces +1 -0
  105. data/test/fixtures/bad_fixtures/blank_line +3 -0
  106. data/test/fixtures/bad_fixtures/duplicate_attributes +3 -0
  107. data/test/fixtures/bad_fixtures/missing_value +1 -0
  108. data/test/fixtures/binaries.yml +132 -0
  109. data/test/fixtures/binary.rb +2 -0
  110. data/test/fixtures/book.rb +4 -0
  111. data/test/fixtures/books.yml +7 -0
  112. data/test/fixtures/categories/special_categories.yml +9 -0
  113. data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
  114. data/test/fixtures/categories.yml +14 -0
  115. data/test/fixtures/categories_ordered.yml +7 -0
  116. data/test/fixtures/categories_posts.yml +23 -0
  117. data/test/fixtures/categorization.rb +5 -0
  118. data/test/fixtures/categorizations.yml +17 -0
  119. data/test/fixtures/category.rb +26 -0
  120. data/test/fixtures/citation.rb +6 -0
  121. data/test/fixtures/comment.rb +23 -0
  122. data/test/fixtures/comments.yml +59 -0
  123. data/test/fixtures/companies.yml +55 -0
  124. data/test/fixtures/company.rb +81 -4
  125. data/test/fixtures/company_in_module.rb +32 -6
  126. data/test/fixtures/computer.rb +4 -0
  127. data/test/fixtures/computers.yml +4 -0
  128. data/test/fixtures/contact.rb +16 -0
  129. data/test/fixtures/courses.yml +7 -0
  130. data/test/fixtures/customer.rb +28 -3
  131. data/test/fixtures/customers.yml +17 -0
  132. data/test/fixtures/db_definitions/db2.drop.sql +33 -0
  133. data/test/fixtures/db_definitions/db2.sql +235 -0
  134. data/test/fixtures/db_definitions/db22.drop.sql +2 -0
  135. data/test/fixtures/db_definitions/db22.sql +5 -0
  136. data/test/fixtures/db_definitions/firebird.drop.sql +65 -0
  137. data/test/fixtures/db_definitions/firebird.sql +310 -0
  138. data/test/fixtures/db_definitions/firebird2.drop.sql +2 -0
  139. data/test/fixtures/db_definitions/firebird2.sql +6 -0
  140. data/test/fixtures/db_definitions/frontbase.drop.sql +33 -0
  141. data/test/fixtures/db_definitions/frontbase.sql +273 -0
  142. data/test/fixtures/db_definitions/frontbase2.drop.sql +1 -0
  143. data/test/fixtures/db_definitions/frontbase2.sql +4 -0
  144. data/test/fixtures/db_definitions/openbase.drop.sql +2 -0
  145. data/test/fixtures/db_definitions/openbase.sql +318 -0
  146. data/test/fixtures/db_definitions/openbase2.drop.sql +2 -0
  147. data/test/fixtures/db_definitions/openbase2.sql +7 -0
  148. data/test/fixtures/db_definitions/oracle.drop.sql +67 -0
  149. data/test/fixtures/db_definitions/oracle.sql +330 -0
  150. data/test/fixtures/db_definitions/oracle2.drop.sql +2 -0
  151. data/test/fixtures/db_definitions/oracle2.sql +6 -0
  152. data/test/fixtures/db_definitions/postgresql.drop.sql +44 -0
  153. data/test/fixtures/db_definitions/postgresql.sql +217 -38
  154. data/test/fixtures/db_definitions/postgresql2.drop.sql +2 -0
  155. data/test/fixtures/db_definitions/postgresql2.sql +2 -2
  156. data/test/fixtures/db_definitions/schema.rb +354 -0
  157. data/test/fixtures/db_definitions/schema2.rb +11 -0
  158. data/test/fixtures/db_definitions/sqlite.drop.sql +33 -0
  159. data/test/fixtures/db_definitions/sqlite.sql +139 -5
  160. data/test/fixtures/db_definitions/sqlite2.drop.sql +2 -0
  161. data/test/fixtures/db_definitions/sqlite2.sql +1 -0
  162. data/test/fixtures/db_definitions/sybase.drop.sql +35 -0
  163. data/test/fixtures/db_definitions/sybase.sql +222 -0
  164. data/test/fixtures/db_definitions/sybase2.drop.sql +4 -0
  165. data/test/fixtures/db_definitions/sybase2.sql +5 -0
  166. data/test/fixtures/developer.rb +70 -6
  167. data/test/fixtures/developers.yml +21 -0
  168. data/test/fixtures/developers_projects/david_action_controller +2 -1
  169. data/test/fixtures/developers_projects/david_active_record +2 -1
  170. data/test/fixtures/developers_projects.yml +17 -0
  171. data/test/fixtures/edge.rb +5 -0
  172. data/test/fixtures/edges.yml +6 -0
  173. data/test/fixtures/entrants.yml +14 -0
  174. data/test/fixtures/example.log +1 -0
  175. data/test/fixtures/fk_test_has_fk.yml +3 -0
  176. data/test/fixtures/fk_test_has_pk.yml +2 -0
  177. data/test/fixtures/flowers.jpg +0 -0
  178. data/test/fixtures/funny_jokes.yml +10 -0
  179. data/test/fixtures/item.rb +7 -0
  180. data/test/fixtures/items.yml +4 -0
  181. data/test/fixtures/joke.rb +3 -0
  182. data/test/fixtures/keyboard.rb +3 -0
  183. data/test/fixtures/legacy_thing.rb +3 -0
  184. data/test/fixtures/legacy_things.yml +3 -0
  185. data/test/fixtures/matey.rb +4 -0
  186. data/test/fixtures/mateys.yml +4 -0
  187. data/test/fixtures/migrations/1_people_have_last_names.rb +9 -0
  188. data/test/fixtures/migrations/2_we_need_reminders.rb +12 -0
  189. data/test/fixtures/migrations/3_innocent_jointable.rb +12 -0
  190. data/test/fixtures/migrations_with_decimal/1_give_me_big_numbers.rb +15 -0
  191. data/test/fixtures/migrations_with_duplicate/1_people_have_last_names.rb +9 -0
  192. data/test/fixtures/migrations_with_duplicate/2_we_need_reminders.rb +12 -0
  193. data/test/fixtures/migrations_with_duplicate/3_foo.rb +7 -0
  194. data/test/fixtures/migrations_with_duplicate/3_innocent_jointable.rb +12 -0
  195. data/test/fixtures/migrations_with_missing_versions/1000_people_have_middle_names.rb +9 -0
  196. data/test/fixtures/migrations_with_missing_versions/1_people_have_last_names.rb +9 -0
  197. data/test/fixtures/migrations_with_missing_versions/3_we_need_reminders.rb +12 -0
  198. data/test/fixtures/migrations_with_missing_versions/4_innocent_jointable.rb +12 -0
  199. data/test/fixtures/minimalistic.rb +2 -0
  200. data/test/fixtures/minimalistics.yml +2 -0
  201. data/test/fixtures/mixed_case_monkey.rb +3 -0
  202. data/test/fixtures/mixed_case_monkeys.yml +6 -0
  203. data/test/fixtures/mixins.yml +29 -0
  204. data/test/fixtures/movies.yml +7 -0
  205. data/test/fixtures/naked/csv/accounts.csv +1 -0
  206. data/test/fixtures/naked/yml/accounts.yml +1 -0
  207. data/test/fixtures/naked/yml/companies.yml +1 -0
  208. data/test/fixtures/naked/yml/courses.yml +1 -0
  209. data/test/fixtures/order.rb +4 -0
  210. data/test/fixtures/parrot.rb +13 -0
  211. data/test/fixtures/parrots.yml +27 -0
  212. data/test/fixtures/parrots_pirates.yml +7 -0
  213. data/test/fixtures/people.yml +3 -0
  214. data/test/fixtures/person.rb +4 -0
  215. data/test/fixtures/pirate.rb +5 -0
  216. data/test/fixtures/pirates.yml +9 -0
  217. data/test/fixtures/post.rb +59 -0
  218. data/test/fixtures/posts.yml +48 -0
  219. data/test/fixtures/project.rb +27 -2
  220. data/test/fixtures/projects.yml +7 -0
  221. data/test/fixtures/reader.rb +4 -0
  222. data/test/fixtures/readers.yml +4 -0
  223. data/test/fixtures/reply.rb +18 -2
  224. data/test/fixtures/reserved_words/distinct.yml +5 -0
  225. data/test/fixtures/reserved_words/distincts_selects.yml +11 -0
  226. data/test/fixtures/reserved_words/group.yml +14 -0
  227. data/test/fixtures/reserved_words/select.yml +8 -0
  228. data/test/fixtures/reserved_words/values.yml +7 -0
  229. data/test/fixtures/ship.rb +3 -0
  230. data/test/fixtures/ships.yml +5 -0
  231. data/test/fixtures/subject.rb +4 -0
  232. data/test/fixtures/subscriber.rb +4 -3
  233. data/test/fixtures/tag.rb +7 -0
  234. data/test/fixtures/tagging.rb +10 -0
  235. data/test/fixtures/taggings.yml +25 -0
  236. data/test/fixtures/tags.yml +7 -0
  237. data/test/fixtures/task.rb +3 -0
  238. data/test/fixtures/tasks.yml +7 -0
  239. data/test/fixtures/topic.rb +20 -3
  240. data/test/fixtures/topics.yml +22 -0
  241. data/test/fixtures/treasure.rb +4 -0
  242. data/test/fixtures/treasures.yml +10 -0
  243. data/test/fixtures/vertex.rb +9 -0
  244. data/test/fixtures/vertices.yml +4 -0
  245. data/test/fixtures_test.rb +574 -8
  246. data/test/inheritance_test.rb +113 -27
  247. data/test/json_serialization_test.rb +180 -0
  248. data/test/lifecycle_test.rb +56 -29
  249. data/test/locking_test.rb +273 -0
  250. data/test/method_scoping_test.rb +416 -0
  251. data/test/migration_test.rb +933 -0
  252. data/test/migration_test_firebird.rb +124 -0
  253. data/test/mixin_test.rb +95 -0
  254. data/test/modules_test.rb +23 -10
  255. data/test/multiple_db_test.rb +17 -3
  256. data/test/pk_test.rb +59 -15
  257. data/test/query_cache_test.rb +104 -0
  258. data/test/readonly_test.rb +107 -0
  259. data/test/reflection_test.rb +124 -27
  260. data/test/reserved_word_test_mysql.rb +177 -0
  261. data/test/schema_authorization_test_postgresql.rb +75 -0
  262. data/test/schema_dumper_test.rb +131 -0
  263. data/test/schema_test_postgresql.rb +64 -0
  264. data/test/serialization_test.rb +47 -0
  265. data/test/synonym_test_oracle.rb +17 -0
  266. data/test/table_name_test_sqlserver.rb +23 -0
  267. data/test/threaded_connections_test.rb +48 -0
  268. data/test/transactions_test.rb +227 -29
  269. data/test/unconnected_test.rb +14 -6
  270. data/test/validations_test.rb +1293 -32
  271. data/test/xml_serialization_test.rb +202 -0
  272. metadata +347 -143
  273. data/dev-utils/eval_debugger.rb +0 -9
  274. data/examples/associations.rb +0 -87
  275. data/examples/shared_setup.rb +0 -15
  276. data/examples/validation.rb +0 -88
  277. data/lib/active_record/deprecated_associations.rb +0 -70
  278. data/lib/active_record/support/class_attribute_accessors.rb +0 -43
  279. data/lib/active_record/support/class_inheritable_attributes.rb +0 -37
  280. data/lib/active_record/support/clean_logger.rb +0 -10
  281. data/lib/active_record/support/inflector.rb +0 -70
  282. data/lib/active_record/vendor/simple.rb +0 -702
  283. data/lib/active_record/wrappers/yaml_wrapper.rb +0 -15
  284. data/lib/active_record/wrappings.rb +0 -59
  285. data/rakefile +0 -122
  286. data/test/deprecated_associations_test.rb +0 -336
  287. data/test/fixtures/accounts/signals37 +0 -3
  288. data/test/fixtures/accounts/unknown +0 -2
  289. data/test/fixtures/companies/first_client +0 -6
  290. data/test/fixtures/companies/first_firm +0 -4
  291. data/test/fixtures/companies/second_client +0 -6
  292. data/test/fixtures/courses/java +0 -2
  293. data/test/fixtures/courses/ruby +0 -2
  294. data/test/fixtures/customers/david +0 -6
  295. data/test/fixtures/db_definitions/mysql.sql +0 -96
  296. data/test/fixtures/db_definitions/mysql2.sql +0 -4
  297. data/test/fixtures/developers/david +0 -2
  298. data/test/fixtures/developers/jamis +0 -2
  299. data/test/fixtures/entrants/first +0 -3
  300. data/test/fixtures/entrants/second +0 -3
  301. data/test/fixtures/entrants/third +0 -3
  302. data/test/fixtures/fixture_database.sqlite +0 -0
  303. data/test/fixtures/fixture_database_2.sqlite +0 -0
  304. data/test/fixtures/movies/first +0 -2
  305. data/test/fixtures/movies/second +0 -2
  306. data/test/fixtures/projects/action_controller +0 -2
  307. data/test/fixtures/projects/active_record +0 -2
  308. data/test/fixtures/topics/first +0 -9
  309. data/test/fixtures/topics/second +0 -8
  310. data/test/inflector_test.rb +0 -104
  311. data/test/thread_safety_test.rb +0 -33
@@ -1,20 +1,586 @@
1
1
  require 'abstract_unit'
2
+ require 'fixtures/post'
3
+ require 'fixtures/binary'
4
+ require 'fixtures/topic'
5
+ require 'fixtures/computer'
6
+ require 'fixtures/developer'
7
+ require 'fixtures/company'
8
+ require 'fixtures/task'
9
+ require 'fixtures/reply'
10
+ require 'fixtures/joke'
11
+ require 'fixtures/course'
12
+ require 'fixtures/category'
13
+ require 'fixtures/parrot'
14
+ require 'fixtures/pirate'
15
+ require 'fixtures/treasure'
16
+ require 'fixtures/matey'
17
+ require 'fixtures/ship'
2
18
 
3
19
  class FixturesTest < Test::Unit::TestCase
4
- def setup
5
- @fixtures = create_fixtures("topics")
20
+ self.use_instantiated_fixtures = true
21
+ self.use_transactional_fixtures = false
22
+
23
+ fixtures :topics, :developers, :accounts, :tasks, :categories, :funny_jokes, :binaries
24
+
25
+ FIXTURES = %w( accounts binaries companies customers
26
+ developers developers_projects entrants
27
+ movies projects subscribers topics tasks )
28
+ MATCH_ATTRIBUTE_NAME = /[a-zA-Z][-_\w]*/
29
+
30
+ BINARY_FIXTURE_PATH = File.dirname(__FILE__) + '/fixtures/flowers.jpg'
31
+
32
+ def test_clean_fixtures
33
+ FIXTURES.each do |name|
34
+ fixtures = nil
35
+ assert_nothing_raised { fixtures = create_fixtures(name) }
36
+ assert_kind_of(Fixtures, fixtures)
37
+ fixtures.each { |name, fixture|
38
+ fixture.each { |key, value|
39
+ assert_match(MATCH_ATTRIBUTE_NAME, key)
40
+ }
41
+ }
42
+ end
43
+ end
44
+
45
+ def test_multiple_clean_fixtures
46
+ fixtures_array = nil
47
+ assert_nothing_raised { fixtures_array = create_fixtures(*FIXTURES) }
48
+ assert_kind_of(Array, fixtures_array)
49
+ fixtures_array.each { |fixtures| assert_kind_of(Fixtures, fixtures) }
6
50
  end
7
51
 
8
52
  def test_attributes
9
- assert_equal("The First Topic", @fixtures["first"]["title"])
10
- assert_nil(@fixtures["second"]["author_email_address"])
53
+ topics = create_fixtures("topics")
54
+ assert_equal("The First Topic", topics["first"]["title"])
55
+ assert_nil(topics["second"]["author_email_address"])
11
56
  end
12
57
 
13
58
  def test_inserts
14
- firstRow = ActiveRecord::Base.connection.select_one("SELECT * FROM topics WHERE author_name = 'David'")
15
- assert_equal("The First Topic", firstRow["title"])
59
+ topics = create_fixtures("topics")
60
+ first_row = ActiveRecord::Base.connection.select_one("SELECT * FROM topics WHERE author_name = 'David'")
61
+ assert_equal("The First Topic", first_row["title"])
62
+
63
+ second_row = ActiveRecord::Base.connection.select_one("SELECT * FROM topics WHERE author_name = 'Mary'")
64
+ assert_nil(second_row["author_email_address"])
65
+ end
66
+
67
+ if ActiveRecord::Base.connection.supports_migrations?
68
+ def test_inserts_with_pre_and_suffix
69
+ # Reset cache to make finds on the new table work
70
+ Fixtures.reset_cache
71
+
72
+ ActiveRecord::Base.connection.create_table :prefix_topics_suffix do |t|
73
+ t.column :title, :string
74
+ t.column :author_name, :string
75
+ t.column :author_email_address, :string
76
+ t.column :written_on, :datetime
77
+ t.column :bonus_time, :time
78
+ t.column :last_read, :date
79
+ t.column :content, :string
80
+ t.column :approved, :boolean, :default => true
81
+ t.column :replies_count, :integer, :default => 0
82
+ t.column :parent_id, :integer
83
+ t.column :type, :string, :limit => 50
84
+ end
85
+
86
+ # Store existing prefix/suffix
87
+ old_prefix = ActiveRecord::Base.table_name_prefix
88
+ old_suffix = ActiveRecord::Base.table_name_suffix
89
+
90
+ # Set a prefix/suffix we can test against
91
+ ActiveRecord::Base.table_name_prefix = 'prefix_'
92
+ ActiveRecord::Base.table_name_suffix = '_suffix'
93
+
94
+ topics = create_fixtures("topics")
95
+
96
+ first_row = ActiveRecord::Base.connection.select_one("SELECT * FROM prefix_topics_suffix WHERE author_name = 'David'")
97
+ assert_equal("The First Topic", first_row["title"])
98
+
99
+ second_row = ActiveRecord::Base.connection.select_one("SELECT * FROM prefix_topics_suffix WHERE author_name = 'Mary'")
100
+ assert_nil(second_row["author_email_address"])
101
+ ensure
102
+ # Restore prefix/suffix to its previous values
103
+ ActiveRecord::Base.table_name_prefix = old_prefix
104
+ ActiveRecord::Base.table_name_suffix = old_suffix
105
+
106
+ ActiveRecord::Base.connection.drop_table :prefix_topics_suffix rescue nil
107
+ end
108
+ end
109
+
110
+ def test_insert_with_datetime
111
+ topics = create_fixtures("tasks")
112
+ first = Task.find(1)
113
+ assert first
114
+ end
115
+
116
+ def test_bad_format
117
+ path = File.join(File.dirname(__FILE__), 'fixtures', 'bad_fixtures')
118
+ Dir.entries(path).each do |file|
119
+ next unless File.file?(file) and file !~ Fixtures::DEFAULT_FILTER_RE
120
+ assert_raise(Fixture::FormatError) {
121
+ Fixture.new(bad_fixtures_path, file)
122
+ }
123
+ end
124
+ end
125
+
126
+ def test_deprecated_yaml_extension
127
+ assert_raise(Fixture::FormatError) {
128
+ Fixtures.new(nil, 'bad_extension', 'BadExtension', File.join(File.dirname(__FILE__), 'fixtures'))
129
+ }
130
+ end
131
+
132
+ def test_logger_level_invariant
133
+ level = ActiveRecord::Base.logger.level
134
+ create_fixtures('topics')
135
+ assert_equal level, ActiveRecord::Base.logger.level
136
+ end
137
+
138
+ def test_instantiation
139
+ topics = create_fixtures("topics")
140
+ assert_kind_of Topic, topics["first"].find
141
+ end
142
+
143
+ def test_complete_instantiation
144
+ assert_equal 2, @topics.size
145
+ assert_equal "The First Topic", @first.title
146
+ end
147
+
148
+ def test_fixtures_from_root_yml_with_instantiation
149
+ # assert_equal 2, @accounts.size
150
+ assert_equal 50, @unknown.credit_limit
151
+ end
152
+
153
+ def test_erb_in_fixtures
154
+ assert_equal 11, @developers.size
155
+ assert_equal "fixture_5", @dev_5.name
156
+ end
157
+
158
+ def test_empty_yaml_fixture
159
+ assert_not_nil Fixtures.new( Account.connection, "accounts", 'Account', File.dirname(__FILE__) + "/fixtures/naked/yml/accounts")
160
+ end
161
+
162
+ def test_empty_yaml_fixture_with_a_comment_in_it
163
+ assert_not_nil Fixtures.new( Account.connection, "companies", 'Company', File.dirname(__FILE__) + "/fixtures/naked/yml/companies")
164
+ end
165
+
166
+ def test_dirty_dirty_yaml_file
167
+ assert_raises(Fixture::FormatError) do
168
+ Fixtures.new( Account.connection, "courses", 'Course', File.dirname(__FILE__) + "/fixtures/naked/yml/courses")
169
+ end
170
+ end
171
+
172
+ def test_empty_csv_fixtures
173
+ assert_not_nil Fixtures.new( Account.connection, "accounts", 'Account', File.dirname(__FILE__) + "/fixtures/naked/csv/accounts")
174
+ end
175
+
176
+ def test_omap_fixtures
177
+ assert_nothing_raised do
178
+ fixtures = Fixtures.new(Account.connection, 'categories', 'Category', File.dirname(__FILE__) + '/fixtures/categories_ordered')
179
+
180
+ i = 0
181
+ fixtures.each do |name, fixture|
182
+ assert_equal "fixture_no_#{i}", name
183
+ assert_equal "Category #{i}", fixture['name']
184
+ i += 1
185
+ end
186
+ end
187
+ end
188
+
189
+ def test_yml_file_in_subdirectory
190
+ assert_equal(categories(:sub_special_1).name, "A special category in a subdir file")
191
+ assert_equal(categories(:sub_special_1).class, SpecialCategory)
192
+ end
193
+
194
+ def test_subsubdir_file_with_arbitrary_name
195
+ assert_equal(categories(:sub_special_3).name, "A special category in an arbitrarily named subsubdir file")
196
+ assert_equal(categories(:sub_special_3).class, SpecialCategory)
197
+ end
198
+
199
+ def test_binary_in_fixtures
200
+ assert_equal 1, @binaries.size
201
+ data = File.open(BINARY_FIXTURE_PATH, "rb").read.freeze
202
+ assert_equal data, @flowers.data
203
+ end
204
+ end
205
+
206
+ if Account.connection.respond_to?(:reset_pk_sequence!)
207
+ class FixturesResetPkSequenceTest < Test::Unit::TestCase
208
+ fixtures :accounts
209
+ fixtures :companies
210
+
211
+ def setup
212
+ @instances = [Account.new(:credit_limit => 50), Company.new(:name => 'RoR Consulting')]
213
+ Fixtures.reset_cache # make sure tables get reinitialized
214
+ end
215
+
216
+ def test_resets_to_min_pk_with_specified_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, model.primary_key, model.sequence_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_resets_to_min_pk_with_default_pk_and_sequence
228
+ @instances.each do |instance|
229
+ model = instance.class
230
+ model.delete_all
231
+ model.connection.reset_pk_sequence!(model.table_name)
232
+
233
+ instance.save!
234
+ assert_equal 1, instance.id, "Sequence reset for #{model.table_name} failed."
235
+ end
236
+ end
237
+
238
+ def test_create_fixtures_resets_sequences_when_not_cached
239
+ @instances.each do |instance|
240
+ max_id = create_fixtures(instance.class.table_name).inject(0) do |max_id, (name, fixture)|
241
+ fixture_id = fixture['id'].to_i
242
+ fixture_id > max_id ? fixture_id : max_id
243
+ end
244
+
245
+ # Clone the last fixture to check that it gets the next greatest id.
246
+ instance.save!
247
+ assert_equal max_id + 1, instance.id, "Sequence reset for #{instance.class.table_name} failed."
248
+ end
249
+ end
250
+ end
251
+ end
252
+
253
+ class FixturesWithoutInstantiationTest < Test::Unit::TestCase
254
+ self.use_instantiated_fixtures = false
255
+ fixtures :topics, :developers, :accounts
256
+
257
+ def test_without_complete_instantiation
258
+ assert_nil @first
259
+ assert_nil @topics
260
+ assert_nil @developers
261
+ assert_nil @accounts
262
+ end
263
+
264
+ def test_fixtures_from_root_yml_without_instantiation
265
+ assert_nil @unknown
266
+ end
267
+
268
+ def test_accessor_methods
269
+ assert_equal "The First Topic", topics(:first).title
270
+ assert_equal "Jamis", developers(:jamis).name
271
+ assert_equal 50, accounts(:signals37).credit_limit
272
+ end
273
+
274
+ def test_accessor_methods_with_multiple_args
275
+ assert_equal 2, topics(:first, :second).size
276
+ assert_raise(StandardError) { topics([:first, :second]) }
277
+ end
278
+
279
+ uses_mocha 'reloading_fixtures_through_accessor_methods' do
280
+ def test_reloading_fixtures_through_accessor_methods
281
+ assert_equal "The First Topic", topics(:first).title
282
+ @loaded_fixtures['topics']['first'].expects(:find).returns(stub(:title => "Fresh Topic!"))
283
+ assert_equal "Fresh Topic!", topics(:first, true).title
284
+ end
285
+ end
286
+ end
287
+
288
+ class FixturesWithoutInstanceInstantiationTest < Test::Unit::TestCase
289
+ self.use_instantiated_fixtures = true
290
+ self.use_instantiated_fixtures = :no_instances
291
+
292
+ fixtures :topics, :developers, :accounts
293
+
294
+ def test_without_instance_instantiation
295
+ assert_nil @first
296
+ assert_not_nil @topics
297
+ assert_not_nil @developers
298
+ assert_not_nil @accounts
299
+ end
300
+ end
301
+
302
+ class TransactionalFixturesTest < Test::Unit::TestCase
303
+ self.use_instantiated_fixtures = true
304
+ self.use_transactional_fixtures = true
305
+
306
+ fixtures :topics
307
+
308
+ def test_destroy
309
+ assert_not_nil @first
310
+ @first.destroy
311
+ end
312
+
313
+ def test_destroy_just_kidding
314
+ assert_not_nil @first
315
+ end
316
+ end
317
+
318
+ class MultipleFixturesTest < Test::Unit::TestCase
319
+ fixtures :topics
320
+ fixtures :developers, :accounts
321
+
322
+ def test_fixture_table_names
323
+ assert_equal %w(topics developers accounts), fixture_table_names
324
+ end
325
+ end
326
+
327
+ class OverlappingFixturesTest < Test::Unit::TestCase
328
+ fixtures :topics, :developers
329
+ fixtures :developers, :accounts
330
+
331
+ def test_fixture_table_names
332
+ assert_equal %w(topics developers accounts), fixture_table_names
333
+ end
334
+ end
335
+
336
+ class ForeignKeyFixturesTest < Test::Unit::TestCase
337
+ fixtures :fk_test_has_pk, :fk_test_has_fk
338
+
339
+ # if foreign keys are implemented and fixtures
340
+ # are not deleted in reverse order then this test
341
+ # case will raise StatementInvalid
342
+
343
+ def test_number1
344
+ assert true
345
+ end
346
+
347
+ def test_number2
348
+ assert true
349
+ end
350
+ end
351
+
352
+ class SetTableNameFixturesTest < Test::Unit::TestCase
353
+ set_fixture_class :funny_jokes => 'Joke'
354
+ fixtures :funny_jokes
355
+
356
+ def test_table_method
357
+ assert_kind_of Joke, funny_jokes(:a_joke)
358
+ end
359
+ end
360
+
361
+ class CustomConnectionFixturesTest < Test::Unit::TestCase
362
+ set_fixture_class :courses => Course
363
+ fixtures :courses
364
+
365
+ def test_connection
366
+ assert_kind_of Course, courses(:ruby)
367
+ assert_equal Course.connection, courses(:ruby).connection
368
+ end
369
+ end
370
+
371
+ class InvalidTableNameFixturesTest < Test::Unit::TestCase
372
+ fixtures :funny_jokes
373
+
374
+ def test_raises_error
375
+ assert_raises FixtureClassNotFound do
376
+ funny_jokes(:a_joke)
377
+ end
378
+ end
379
+ end
380
+
381
+ class CheckEscapedYamlFixturesTest < Test::Unit::TestCase
382
+ set_fixture_class :funny_jokes => 'Joke'
383
+ fixtures :funny_jokes
384
+
385
+ def test_proper_escaped_fixture
386
+ assert_equal "The \\n Aristocrats\nAte the candy\n", funny_jokes(:another_joke).name
387
+ end
388
+ end
389
+
390
+ class DevelopersProject; end
391
+ class ManyToManyFixturesWithClassDefined < Test::Unit::TestCase
392
+ fixtures :developers_projects
393
+
394
+ def test_this_should_run_cleanly
395
+ assert true
396
+ end
397
+ end
398
+
399
+ class FixturesBrokenRollbackTest < Test::Unit::TestCase
400
+ def blank_setup; end
401
+ alias_method :ar_setup_with_fixtures, :setup_with_fixtures
402
+ alias_method :setup_with_fixtures, :blank_setup
403
+ alias_method :setup, :blank_setup
404
+
405
+ def blank_teardown; end
406
+ alias_method :ar_teardown_with_fixtures, :teardown_with_fixtures
407
+ alias_method :teardown_with_fixtures, :blank_teardown
408
+ alias_method :teardown, :blank_teardown
409
+
410
+ def test_no_rollback_in_teardown_unless_transaction_active
411
+ assert_equal 0, Thread.current['open_transactions']
412
+ assert_raise(RuntimeError) { ar_setup_with_fixtures }
413
+ assert_equal 0, Thread.current['open_transactions']
414
+ assert_nothing_raised { ar_teardown_with_fixtures }
415
+ assert_equal 0, Thread.current['open_transactions']
416
+ end
417
+
418
+ private
419
+ def load_fixtures
420
+ raise 'argh'
421
+ end
422
+ end
423
+
424
+ class LoadAllFixturesTest < Test::Unit::TestCase
425
+ self.fixture_path= File.join(File.dirname(__FILE__), '/fixtures/all')
426
+ fixtures :all
427
+
428
+ def test_all_there
429
+ assert_equal %w(developers people tasks), fixture_table_names.sort
430
+ end
431
+ end
432
+
433
+ class FasterFixturesTest < Test::Unit::TestCase
434
+ fixtures :categories, :authors
435
+
436
+ def load_extra_fixture(name)
437
+ fixture = create_fixtures(name)
438
+ assert fixture.is_a?(Fixtures)
439
+ @loaded_fixtures[fixture.table_name] = fixture
440
+ end
441
+
442
+ def test_cache
443
+ assert Fixtures.fixture_is_cached?(ActiveRecord::Base.connection, 'categories')
444
+ assert Fixtures.fixture_is_cached?(ActiveRecord::Base.connection, 'authors')
445
+
446
+ assert_no_queries do
447
+ create_fixtures('categories')
448
+ create_fixtures('authors')
449
+ end
450
+
451
+ load_extra_fixture('posts')
452
+ assert Fixtures.fixture_is_cached?(ActiveRecord::Base.connection, 'posts')
453
+ self.class.setup_fixture_accessors('posts')
454
+ assert_equal 'Welcome to the weblog', posts(:welcome).title
455
+ end
456
+ end
457
+
458
+ class FoxyFixturesTest < Test::Unit::TestCase
459
+ fixtures :parrots, :parrots_pirates, :pirates, :treasures, :mateys, :ships, :computers, :developers
460
+
461
+ def test_identifies_strings
462
+ assert_equal(Fixtures.identify("foo"), Fixtures.identify("foo"))
463
+ assert_not_equal(Fixtures.identify("foo"), Fixtures.identify("FOO"))
464
+ end
465
+
466
+ def test_identifies_symbols
467
+ assert_equal(Fixtures.identify(:foo), Fixtures.identify(:foo))
468
+ end
469
+
470
+ TIMESTAMP_COLUMNS = %w(created_at created_on updated_at updated_on)
471
+
472
+ def test_populates_timestamp_columns
473
+ TIMESTAMP_COLUMNS.each do |property|
474
+ assert_not_nil(parrots(:george).send(property), "should set #{property}")
475
+ end
476
+ end
477
+
478
+ def test_does_not_populate_timestamp_columns_if_model_has_set_record_timestamps_to_false
479
+ TIMESTAMP_COLUMNS.each do |property|
480
+ assert_nil(ships(:black_pearl).send(property), "should not set #{property}")
481
+ end
482
+ end
483
+
484
+ def test_populates_all_columns_with_the_same_time
485
+ last = nil
486
+
487
+ TIMESTAMP_COLUMNS.each do |property|
488
+ current = parrots(:george).send(property)
489
+ last ||= current
490
+
491
+ assert_equal(last, current)
492
+ last = current
493
+ end
494
+ end
495
+
496
+ def test_only_populates_columns_that_exist
497
+ assert_not_nil(pirates(:blackbeard).created_on)
498
+ assert_not_nil(pirates(:blackbeard).updated_on)
499
+ end
500
+
501
+ def test_preserves_existing_fixture_data
502
+ assert_equal(2.weeks.ago.to_date, pirates(:redbeard).created_on.to_date)
503
+ assert_equal(2.weeks.ago.to_date, pirates(:redbeard).updated_on.to_date)
504
+ end
505
+
506
+ def test_generates_unique_ids
507
+ assert_not_nil(parrots(:george).id)
508
+ assert_not_equal(parrots(:george).id, parrots(:louis).id)
509
+ end
510
+
511
+ def test_automatically_sets_primary_key
512
+ assert_not_nil(ships(:black_pearl))
513
+ end
514
+
515
+ def test_preserves_existing_primary_key
516
+ assert_equal(2, ships(:interceptor).id)
517
+ end
518
+
519
+ def test_resolves_belongs_to_symbols
520
+ assert_equal(parrots(:george), pirates(:blackbeard).parrot)
521
+ end
522
+
523
+ def test_ignores_belongs_to_symbols_if_association_and_foreign_key_are_named_the_same
524
+ assert_equal(developers(:david), computers(:workstation).developer)
525
+ end
526
+
527
+ def test_supports_join_tables
528
+ assert(pirates(:blackbeard).parrots.include?(parrots(:george)))
529
+ assert(pirates(:blackbeard).parrots.include?(parrots(:louis)))
530
+ assert(parrots(:george).pirates.include?(pirates(:blackbeard)))
531
+ end
532
+
533
+ def test_supports_inline_habtm
534
+ assert(parrots(:george).treasures.include?(treasures(:diamond)))
535
+ assert(parrots(:george).treasures.include?(treasures(:sapphire)))
536
+ assert(!parrots(:george).treasures.include?(treasures(:ruby)))
537
+ end
538
+
539
+ def test_supports_inline_habtm_with_specified_id
540
+ assert(parrots(:polly).treasures.include?(treasures(:ruby)))
541
+ assert(parrots(:polly).treasures.include?(treasures(:sapphire)))
542
+ assert(!parrots(:polly).treasures.include?(treasures(:diamond)))
543
+ end
544
+
545
+ def test_supports_yaml_arrays
546
+ assert(parrots(:louis).treasures.include?(treasures(:diamond)))
547
+ assert(parrots(:louis).treasures.include?(treasures(:sapphire)))
548
+ end
549
+
550
+ def test_strips_DEFAULTS_key
551
+ assert_raise(StandardError) { parrots(:DEFAULTS) }
552
+
553
+ # this lets us do YAML defaults and not have an extra fixture entry
554
+ %w(sapphire ruby).each { |t| assert(parrots(:davey).treasures.include?(treasures(t))) }
555
+ end
556
+
557
+ def test_supports_label_interpolation
558
+ assert_equal("frederick", parrots(:frederick).name)
559
+ end
560
+
561
+ def test_supports_polymorphic_belongs_to
562
+ assert_equal(pirates(:redbeard), treasures(:sapphire).looter)
563
+ assert_equal(parrots(:louis), treasures(:ruby).looter)
564
+ end
565
+
566
+ def test_only_generates_a_pk_if_necessary
567
+ m = Matey.find(:first)
568
+ m.pirate = pirates(:blackbeard)
569
+ m.target = pirates(:redbeard)
570
+ end
571
+
572
+ def test_supports_sti
573
+ assert_kind_of DeadParrot, parrots(:polly)
574
+ assert_equal pirates(:blackbeard), parrots(:polly).killer
575
+ end
576
+ end
577
+
578
+ class ActiveSupportSubclassWithFixturesTest < ActiveSupport::TestCase
579
+ fixtures :parrots
16
580
 
17
- secondRow = ActiveRecord::Base.connection.select_one("SELECT * FROM topics WHERE author_name = 'Mary'")
18
- assert_nil(secondRow["author_email_address"])
581
+ # This seemingly useless assertion catches a bug that caused the fixtures
582
+ # setup code call nil[]
583
+ def test_foo
584
+ assert_equal parrots(:louis), Parrot.find_by_name("King Louis")
19
585
  end
20
586
  end