activerecord_authorails 1.0.0
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.
- data/CHANGELOG +3043 -0
- data/README +360 -0
- data/RUNNING_UNIT_TESTS +64 -0
- data/Rakefile +226 -0
- data/examples/associations.png +0 -0
- data/examples/associations.rb +87 -0
- data/examples/shared_setup.rb +15 -0
- data/examples/validation.rb +85 -0
- data/install.rb +30 -0
- data/lib/active_record.rb +85 -0
- data/lib/active_record/acts/list.rb +244 -0
- data/lib/active_record/acts/nested_set.rb +211 -0
- data/lib/active_record/acts/tree.rb +89 -0
- data/lib/active_record/aggregations.rb +191 -0
- data/lib/active_record/associations.rb +1637 -0
- data/lib/active_record/associations/association_collection.rb +190 -0
- data/lib/active_record/associations/association_proxy.rb +158 -0
- data/lib/active_record/associations/belongs_to_association.rb +56 -0
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +50 -0
- data/lib/active_record/associations/has_and_belongs_to_many_association.rb +169 -0
- data/lib/active_record/associations/has_many_association.rb +210 -0
- data/lib/active_record/associations/has_many_through_association.rb +247 -0
- data/lib/active_record/associations/has_one_association.rb +80 -0
- data/lib/active_record/attribute_methods.rb +75 -0
- data/lib/active_record/base.rb +2164 -0
- data/lib/active_record/calculations.rb +270 -0
- data/lib/active_record/callbacks.rb +367 -0
- data/lib/active_record/connection_adapters/abstract/connection_specification.rb +279 -0
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +130 -0
- data/lib/active_record/connection_adapters/abstract/quoting.rb +58 -0
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +343 -0
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +310 -0
- data/lib/active_record/connection_adapters/abstract_adapter.rb +161 -0
- data/lib/active_record/connection_adapters/db2_adapter.rb +228 -0
- data/lib/active_record/connection_adapters/firebird_adapter.rb +728 -0
- data/lib/active_record/connection_adapters/frontbase_adapter.rb +861 -0
- data/lib/active_record/connection_adapters/mysql_adapter.rb +414 -0
- data/lib/active_record/connection_adapters/openbase_adapter.rb +350 -0
- data/lib/active_record/connection_adapters/oracle_adapter.rb +689 -0
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +584 -0
- data/lib/active_record/connection_adapters/sqlite_adapter.rb +407 -0
- data/lib/active_record/connection_adapters/sqlserver_adapter.rb +591 -0
- data/lib/active_record/connection_adapters/sybase_adapter.rb +662 -0
- data/lib/active_record/deprecated_associations.rb +104 -0
- data/lib/active_record/deprecated_finders.rb +44 -0
- data/lib/active_record/fixtures.rb +628 -0
- data/lib/active_record/locking/optimistic.rb +106 -0
- data/lib/active_record/locking/pessimistic.rb +77 -0
- data/lib/active_record/migration.rb +394 -0
- data/lib/active_record/observer.rb +178 -0
- data/lib/active_record/query_cache.rb +64 -0
- data/lib/active_record/reflection.rb +222 -0
- data/lib/active_record/schema.rb +58 -0
- data/lib/active_record/schema_dumper.rb +149 -0
- data/lib/active_record/timestamp.rb +51 -0
- data/lib/active_record/transactions.rb +136 -0
- data/lib/active_record/validations.rb +843 -0
- data/lib/active_record/vendor/db2.rb +362 -0
- data/lib/active_record/vendor/mysql.rb +1214 -0
- data/lib/active_record/vendor/simple.rb +693 -0
- data/lib/active_record/version.rb +9 -0
- data/lib/active_record/wrappers/yaml_wrapper.rb +15 -0
- data/lib/active_record/wrappings.rb +58 -0
- data/lib/active_record/xml_serialization.rb +308 -0
- data/test/aaa_create_tables_test.rb +59 -0
- data/test/abstract_unit.rb +77 -0
- data/test/active_schema_test_mysql.rb +31 -0
- data/test/adapter_test.rb +87 -0
- data/test/adapter_test_sqlserver.rb +81 -0
- data/test/aggregations_test.rb +95 -0
- data/test/all.sh +8 -0
- data/test/ar_schema_test.rb +33 -0
- data/test/association_inheritance_reload.rb +14 -0
- data/test/associations/callbacks_test.rb +126 -0
- data/test/associations/cascaded_eager_loading_test.rb +138 -0
- data/test/associations/eager_test.rb +393 -0
- data/test/associations/extension_test.rb +42 -0
- data/test/associations/join_model_test.rb +497 -0
- data/test/associations_test.rb +1809 -0
- data/test/attribute_methods_test.rb +49 -0
- data/test/base_test.rb +1586 -0
- data/test/binary_test.rb +37 -0
- data/test/calculations_test.rb +219 -0
- data/test/callbacks_test.rb +377 -0
- data/test/class_inheritable_attributes_test.rb +32 -0
- data/test/column_alias_test.rb +17 -0
- data/test/connection_test_firebird.rb +8 -0
- data/test/connections/native_db2/connection.rb +25 -0
- data/test/connections/native_firebird/connection.rb +26 -0
- data/test/connections/native_frontbase/connection.rb +27 -0
- data/test/connections/native_mysql/connection.rb +24 -0
- data/test/connections/native_openbase/connection.rb +21 -0
- data/test/connections/native_oracle/connection.rb +27 -0
- data/test/connections/native_postgresql/connection.rb +23 -0
- data/test/connections/native_sqlite/connection.rb +34 -0
- data/test/connections/native_sqlite3/connection.rb +34 -0
- data/test/connections/native_sqlite3/in_memory_connection.rb +18 -0
- data/test/connections/native_sqlserver/connection.rb +23 -0
- data/test/connections/native_sqlserver_odbc/connection.rb +25 -0
- data/test/connections/native_sybase/connection.rb +23 -0
- data/test/copy_table_sqlite.rb +64 -0
- data/test/datatype_test_postgresql.rb +52 -0
- data/test/default_test_firebird.rb +16 -0
- data/test/defaults_test.rb +60 -0
- data/test/deprecated_associations_test.rb +396 -0
- data/test/deprecated_finder_test.rb +151 -0
- data/test/empty_date_time_test.rb +25 -0
- data/test/finder_test.rb +504 -0
- data/test/fixtures/accounts.yml +28 -0
- data/test/fixtures/author.rb +99 -0
- data/test/fixtures/author_favorites.yml +4 -0
- data/test/fixtures/authors.yml +7 -0
- data/test/fixtures/auto_id.rb +4 -0
- data/test/fixtures/bad_fixtures/attr_with_numeric_first_char +1 -0
- data/test/fixtures/bad_fixtures/attr_with_spaces +1 -0
- data/test/fixtures/bad_fixtures/blank_line +3 -0
- data/test/fixtures/bad_fixtures/duplicate_attributes +3 -0
- data/test/fixtures/bad_fixtures/missing_value +1 -0
- data/test/fixtures/binary.rb +2 -0
- data/test/fixtures/categories.yml +14 -0
- data/test/fixtures/categories/special_categories.yml +9 -0
- data/test/fixtures/categories/subsubdir/arbitrary_filename.yml +4 -0
- data/test/fixtures/categories_ordered.yml +7 -0
- data/test/fixtures/categories_posts.yml +23 -0
- data/test/fixtures/categorization.rb +5 -0
- data/test/fixtures/categorizations.yml +17 -0
- data/test/fixtures/category.rb +20 -0
- data/test/fixtures/column_name.rb +3 -0
- data/test/fixtures/comment.rb +23 -0
- data/test/fixtures/comments.yml +59 -0
- data/test/fixtures/companies.yml +55 -0
- data/test/fixtures/company.rb +107 -0
- data/test/fixtures/company_in_module.rb +59 -0
- data/test/fixtures/computer.rb +3 -0
- data/test/fixtures/computers.yml +4 -0
- data/test/fixtures/course.rb +3 -0
- data/test/fixtures/courses.yml +7 -0
- data/test/fixtures/customer.rb +55 -0
- data/test/fixtures/customers.yml +17 -0
- data/test/fixtures/db_definitions/db2.drop.sql +32 -0
- data/test/fixtures/db_definitions/db2.sql +231 -0
- data/test/fixtures/db_definitions/db22.drop.sql +2 -0
- data/test/fixtures/db_definitions/db22.sql +5 -0
- data/test/fixtures/db_definitions/firebird.drop.sql +63 -0
- data/test/fixtures/db_definitions/firebird.sql +304 -0
- data/test/fixtures/db_definitions/firebird2.drop.sql +2 -0
- data/test/fixtures/db_definitions/firebird2.sql +6 -0
- data/test/fixtures/db_definitions/frontbase.drop.sql +32 -0
- data/test/fixtures/db_definitions/frontbase.sql +268 -0
- data/test/fixtures/db_definitions/frontbase2.drop.sql +1 -0
- data/test/fixtures/db_definitions/frontbase2.sql +4 -0
- data/test/fixtures/db_definitions/mysql.drop.sql +32 -0
- data/test/fixtures/db_definitions/mysql.sql +234 -0
- data/test/fixtures/db_definitions/mysql2.drop.sql +2 -0
- data/test/fixtures/db_definitions/mysql2.sql +5 -0
- data/test/fixtures/db_definitions/openbase.drop.sql +2 -0
- data/test/fixtures/db_definitions/openbase.sql +302 -0
- data/test/fixtures/db_definitions/openbase2.drop.sql +2 -0
- data/test/fixtures/db_definitions/openbase2.sql +7 -0
- data/test/fixtures/db_definitions/oracle.drop.sql +65 -0
- data/test/fixtures/db_definitions/oracle.sql +325 -0
- data/test/fixtures/db_definitions/oracle2.drop.sql +2 -0
- data/test/fixtures/db_definitions/oracle2.sql +6 -0
- data/test/fixtures/db_definitions/postgresql.drop.sql +37 -0
- data/test/fixtures/db_definitions/postgresql.sql +263 -0
- data/test/fixtures/db_definitions/postgresql2.drop.sql +2 -0
- data/test/fixtures/db_definitions/postgresql2.sql +5 -0
- data/test/fixtures/db_definitions/schema.rb +60 -0
- data/test/fixtures/db_definitions/sqlite.drop.sql +32 -0
- data/test/fixtures/db_definitions/sqlite.sql +215 -0
- data/test/fixtures/db_definitions/sqlite2.drop.sql +2 -0
- data/test/fixtures/db_definitions/sqlite2.sql +5 -0
- data/test/fixtures/db_definitions/sqlserver.drop.sql +34 -0
- data/test/fixtures/db_definitions/sqlserver.sql +243 -0
- data/test/fixtures/db_definitions/sqlserver2.drop.sql +2 -0
- data/test/fixtures/db_definitions/sqlserver2.sql +5 -0
- data/test/fixtures/db_definitions/sybase.drop.sql +34 -0
- data/test/fixtures/db_definitions/sybase.sql +218 -0
- data/test/fixtures/db_definitions/sybase2.drop.sql +4 -0
- data/test/fixtures/db_definitions/sybase2.sql +5 -0
- data/test/fixtures/default.rb +2 -0
- data/test/fixtures/developer.rb +52 -0
- data/test/fixtures/developers.yml +21 -0
- data/test/fixtures/developers_projects.yml +17 -0
- data/test/fixtures/developers_projects/david_action_controller +3 -0
- data/test/fixtures/developers_projects/david_active_record +3 -0
- data/test/fixtures/developers_projects/jamis_active_record +2 -0
- data/test/fixtures/edge.rb +5 -0
- data/test/fixtures/edges.yml +6 -0
- data/test/fixtures/entrant.rb +3 -0
- data/test/fixtures/entrants.yml +14 -0
- data/test/fixtures/fk_test_has_fk.yml +3 -0
- data/test/fixtures/fk_test_has_pk.yml +2 -0
- data/test/fixtures/flowers.jpg +0 -0
- data/test/fixtures/funny_jokes.yml +10 -0
- data/test/fixtures/joke.rb +6 -0
- data/test/fixtures/keyboard.rb +3 -0
- data/test/fixtures/legacy_thing.rb +3 -0
- data/test/fixtures/legacy_things.yml +3 -0
- data/test/fixtures/migrations/1_people_have_last_names.rb +9 -0
- data/test/fixtures/migrations/2_we_need_reminders.rb +12 -0
- data/test/fixtures/migrations/3_innocent_jointable.rb +12 -0
- data/test/fixtures/migrations_with_decimal/1_give_me_big_numbers.rb +15 -0
- data/test/fixtures/migrations_with_duplicate/1_people_have_last_names.rb +9 -0
- data/test/fixtures/migrations_with_duplicate/2_we_need_reminders.rb +12 -0
- data/test/fixtures/migrations_with_duplicate/3_foo.rb +7 -0
- data/test/fixtures/migrations_with_duplicate/3_innocent_jointable.rb +12 -0
- data/test/fixtures/migrations_with_missing_versions/1000_people_have_middle_names.rb +9 -0
- data/test/fixtures/migrations_with_missing_versions/1_people_have_last_names.rb +9 -0
- data/test/fixtures/migrations_with_missing_versions/3_we_need_reminders.rb +12 -0
- data/test/fixtures/migrations_with_missing_versions/4_innocent_jointable.rb +12 -0
- data/test/fixtures/mixed_case_monkey.rb +3 -0
- data/test/fixtures/mixed_case_monkeys.yml +6 -0
- data/test/fixtures/mixin.rb +63 -0
- data/test/fixtures/mixins.yml +127 -0
- data/test/fixtures/movie.rb +5 -0
- data/test/fixtures/movies.yml +7 -0
- data/test/fixtures/naked/csv/accounts.csv +1 -0
- data/test/fixtures/naked/yml/accounts.yml +1 -0
- data/test/fixtures/naked/yml/companies.yml +1 -0
- data/test/fixtures/naked/yml/courses.yml +1 -0
- data/test/fixtures/order.rb +4 -0
- data/test/fixtures/people.yml +3 -0
- data/test/fixtures/person.rb +4 -0
- data/test/fixtures/post.rb +58 -0
- data/test/fixtures/posts.yml +48 -0
- data/test/fixtures/project.rb +27 -0
- data/test/fixtures/projects.yml +7 -0
- data/test/fixtures/reader.rb +4 -0
- data/test/fixtures/readers.yml +4 -0
- data/test/fixtures/reply.rb +37 -0
- data/test/fixtures/subject.rb +4 -0
- data/test/fixtures/subscriber.rb +6 -0
- data/test/fixtures/subscribers/first +2 -0
- data/test/fixtures/subscribers/second +2 -0
- data/test/fixtures/tag.rb +7 -0
- data/test/fixtures/tagging.rb +6 -0
- data/test/fixtures/taggings.yml +18 -0
- data/test/fixtures/tags.yml +7 -0
- data/test/fixtures/task.rb +3 -0
- data/test/fixtures/tasks.yml +7 -0
- data/test/fixtures/topic.rb +25 -0
- data/test/fixtures/topics.yml +22 -0
- data/test/fixtures/vertex.rb +9 -0
- data/test/fixtures/vertices.yml +4 -0
- data/test/fixtures_test.rb +401 -0
- data/test/inheritance_test.rb +205 -0
- data/test/lifecycle_test.rb +137 -0
- data/test/locking_test.rb +190 -0
- data/test/method_scoping_test.rb +416 -0
- data/test/migration_test.rb +768 -0
- data/test/migration_test_firebird.rb +124 -0
- data/test/mixin_nested_set_test.rb +196 -0
- data/test/mixin_test.rb +550 -0
- data/test/modules_test.rb +34 -0
- data/test/multiple_db_test.rb +60 -0
- data/test/pk_test.rb +104 -0
- data/test/readonly_test.rb +107 -0
- data/test/reflection_test.rb +159 -0
- data/test/schema_authorization_test_postgresql.rb +75 -0
- data/test/schema_dumper_test.rb +96 -0
- data/test/schema_test_postgresql.rb +64 -0
- data/test/synonym_test_oracle.rb +17 -0
- data/test/table_name_test_sqlserver.rb +23 -0
- data/test/threaded_connections_test.rb +48 -0
- data/test/transactions_test.rb +230 -0
- data/test/unconnected_test.rb +32 -0
- data/test/validations_test.rb +1097 -0
- data/test/xml_serialization_test.rb +125 -0
- metadata +365 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# i wonder what will happen here
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
qwerty
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
class Post < ActiveRecord::Base
|
|
2
|
+
belongs_to :author do
|
|
3
|
+
def greeting
|
|
4
|
+
"hello"
|
|
5
|
+
end
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
belongs_to :author_with_posts, :class_name => "Author", :foreign_key => :author_id, :include => :posts
|
|
9
|
+
|
|
10
|
+
has_many :comments, :order => "body" do
|
|
11
|
+
def find_most_recent
|
|
12
|
+
find(:first, :order => "id DESC")
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
has_one :very_special_comment
|
|
17
|
+
has_one :very_special_comment_with_post, :class_name => "VerySpecialComment", :include => :post
|
|
18
|
+
has_many :special_comments
|
|
19
|
+
|
|
20
|
+
has_and_belongs_to_many :categories
|
|
21
|
+
has_and_belongs_to_many :special_categories, :join_table => "categories_posts", :association_foreign_key => 'category_id'
|
|
22
|
+
|
|
23
|
+
has_many :taggings, :as => :taggable
|
|
24
|
+
has_many :tags, :through => :taggings, :include => :tagging do
|
|
25
|
+
def add_joins_and_select
|
|
26
|
+
find :all, :select => 'tags.*, authors.id as author_id', :include => false,
|
|
27
|
+
:joins => 'left outer join posts on taggings.taggable_id = posts.id left outer join authors on posts.author_id = authors.id'
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
has_many :funky_tags, :through => :taggings, :source => :tag
|
|
32
|
+
has_many :super_tags, :through => :taggings
|
|
33
|
+
has_one :tagging, :as => :taggable
|
|
34
|
+
|
|
35
|
+
has_many :invalid_taggings, :as => :taggable, :class_name => "Tagging", :conditions => 'taggings.id < 0'
|
|
36
|
+
has_many :invalid_tags, :through => :invalid_taggings, :source => :tag
|
|
37
|
+
|
|
38
|
+
has_many :categorizations, :foreign_key => :category_id
|
|
39
|
+
has_many :authors, :through => :categorizations
|
|
40
|
+
|
|
41
|
+
has_many :readers
|
|
42
|
+
has_many :people, :through => :readers
|
|
43
|
+
|
|
44
|
+
def self.what_are_you
|
|
45
|
+
'a post...'
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
class SpecialPost < Post; end
|
|
50
|
+
|
|
51
|
+
class StiPost < Post
|
|
52
|
+
self.abstract_class = true
|
|
53
|
+
has_one :special_comment, :class_name => "SpecialComment"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
class SubStiPost < StiPost
|
|
57
|
+
self.table_name = Post.table_name
|
|
58
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
welcome:
|
|
2
|
+
id: 1
|
|
3
|
+
author_id: 1
|
|
4
|
+
title: Welcome to the weblog
|
|
5
|
+
body: Such a lovely day
|
|
6
|
+
type: Post
|
|
7
|
+
|
|
8
|
+
thinking:
|
|
9
|
+
id: 2
|
|
10
|
+
author_id: 1
|
|
11
|
+
title: So I was thinking
|
|
12
|
+
body: Like I hopefully always am
|
|
13
|
+
type: SpecialPost
|
|
14
|
+
|
|
15
|
+
authorless:
|
|
16
|
+
id: 3
|
|
17
|
+
author_id: 0
|
|
18
|
+
title: I don't have any comments
|
|
19
|
+
body: I just don't want to
|
|
20
|
+
type: Post
|
|
21
|
+
|
|
22
|
+
sti_comments:
|
|
23
|
+
id: 4
|
|
24
|
+
author_id: 1
|
|
25
|
+
title: sti comments
|
|
26
|
+
body: hello
|
|
27
|
+
type: Post
|
|
28
|
+
|
|
29
|
+
sti_post_and_comments:
|
|
30
|
+
id: 5
|
|
31
|
+
author_id: 1
|
|
32
|
+
title: sti me
|
|
33
|
+
body: hello
|
|
34
|
+
type: StiPost
|
|
35
|
+
|
|
36
|
+
sti_habtm:
|
|
37
|
+
id: 6
|
|
38
|
+
author_id: 1
|
|
39
|
+
title: habtm sti test
|
|
40
|
+
body: hello
|
|
41
|
+
type: Post
|
|
42
|
+
|
|
43
|
+
eager_other:
|
|
44
|
+
id: 7
|
|
45
|
+
author_id: 2
|
|
46
|
+
title: eager loading with OR'd conditions
|
|
47
|
+
body: hello
|
|
48
|
+
type: Post
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
class Project < ActiveRecord::Base
|
|
2
|
+
has_and_belongs_to_many :developers, :uniq => true, :order => 'developers.name desc, developers.id desc'
|
|
3
|
+
has_and_belongs_to_many :non_unique_developers, :order => 'developers.name desc, developers.id desc', :class_name => 'Developer'
|
|
4
|
+
has_and_belongs_to_many :limited_developers, :class_name => "Developer", :limit => 1
|
|
5
|
+
has_and_belongs_to_many :developers_named_david, :class_name => "Developer", :conditions => "name = 'David'", :uniq => true
|
|
6
|
+
has_and_belongs_to_many :developers_named_david_with_hash_conditions, :class_name => "Developer", :conditions => { :name => 'David' }, :uniq => true
|
|
7
|
+
has_and_belongs_to_many :salaried_developers, :class_name => "Developer", :conditions => "salary > 0"
|
|
8
|
+
has_and_belongs_to_many :developers_with_finder_sql, :class_name => "Developer", :finder_sql => 'SELECT t.*, j.* FROM developers_projects j, developers t WHERE t.id = j.developer_id AND j.project_id = #{id}'
|
|
9
|
+
has_and_belongs_to_many :developers_by_sql, :class_name => "Developer", :delete_sql => "DELETE FROM developers_projects WHERE project_id = \#{id} AND developer_id = \#{record.id}"
|
|
10
|
+
has_and_belongs_to_many :developers_with_callbacks, :class_name => "Developer", :before_add => Proc.new {|o, r| o.developers_log << "before_adding#{r.id}"},
|
|
11
|
+
:after_add => Proc.new {|o, r| o.developers_log << "after_adding#{r.id}"},
|
|
12
|
+
:before_remove => Proc.new {|o, r| o.developers_log << "before_removing#{r.id}"},
|
|
13
|
+
:after_remove => Proc.new {|o, r| o.developers_log << "after_removing#{r.id}"}
|
|
14
|
+
|
|
15
|
+
attr_accessor :developers_log
|
|
16
|
+
|
|
17
|
+
def after_initialize
|
|
18
|
+
@developers_log = []
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
class SpecialProject < Project
|
|
24
|
+
def hello_world
|
|
25
|
+
"hello there!"
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
require 'fixtures/topic'
|
|
2
|
+
|
|
3
|
+
class Reply < Topic
|
|
4
|
+
belongs_to :topic, :foreign_key => "parent_id", :counter_cache => true
|
|
5
|
+
has_many :replies, :class_name => "SillyReply", :dependent => :destroy, :foreign_key => "parent_id"
|
|
6
|
+
|
|
7
|
+
validate :errors_on_empty_content
|
|
8
|
+
validate_on_create :title_is_wrong_create
|
|
9
|
+
|
|
10
|
+
attr_accessible :title, :author_name, :author_email_address, :written_on, :content, :last_read
|
|
11
|
+
|
|
12
|
+
def validate
|
|
13
|
+
errors.add("title", "Empty") unless attribute_present? "title"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def errors_on_empty_content
|
|
17
|
+
errors.add("content", "Empty") unless attribute_present? "content"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def validate_on_create
|
|
21
|
+
if attribute_present?("title") && attribute_present?("content") && content == "Mismatch"
|
|
22
|
+
errors.add("title", "is Content Mismatch")
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def title_is_wrong_create
|
|
27
|
+
errors.add("title", "is Wrong Create") if attribute_present?("title") && title == "Wrong Create"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def validate_on_update
|
|
31
|
+
errors.add("title", "is Wrong Update") if attribute_present?("title") && title == "Wrong Update"
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
class SillyReply < Reply
|
|
36
|
+
belongs_to :reply, :foreign_key => "parent_id", :counter_cache => :replies_count
|
|
37
|
+
end
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
class Tagging < ActiveRecord::Base
|
|
2
|
+
belongs_to :tag, :include => :tagging
|
|
3
|
+
belongs_to :super_tag, :class_name => 'Tag', :foreign_key => 'super_tag_id'
|
|
4
|
+
belongs_to :invalid_tag, :class_name => 'Tag', :foreign_key => 'tag_id'
|
|
5
|
+
belongs_to :taggable, :polymorphic => true, :counter_cache => true
|
|
6
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
welcome_general:
|
|
2
|
+
id: 1
|
|
3
|
+
tag_id: 1
|
|
4
|
+
super_tag_id: 2
|
|
5
|
+
taggable_id: 1
|
|
6
|
+
taggable_type: Post
|
|
7
|
+
|
|
8
|
+
thinking_general:
|
|
9
|
+
id: 2
|
|
10
|
+
tag_id: 1
|
|
11
|
+
taggable_id: 2
|
|
12
|
+
taggable_type: Post
|
|
13
|
+
|
|
14
|
+
fake:
|
|
15
|
+
id: 3
|
|
16
|
+
tag_id: 1
|
|
17
|
+
taggable_id: 1
|
|
18
|
+
taggable_type: FakeModel
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
class Topic < ActiveRecord::Base
|
|
2
|
+
has_many :replies, :dependent => :destroy, :foreign_key => "parent_id"
|
|
3
|
+
serialize :content
|
|
4
|
+
|
|
5
|
+
before_create :default_written_on
|
|
6
|
+
before_destroy :destroy_children
|
|
7
|
+
|
|
8
|
+
def parent
|
|
9
|
+
Topic.find(parent_id)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# trivial method for testing Array#to_xml with :methods
|
|
13
|
+
def topic_id
|
|
14
|
+
id
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
protected
|
|
18
|
+
def default_written_on
|
|
19
|
+
self.written_on = Time.now unless attribute_present?("written_on")
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def destroy_children
|
|
23
|
+
self.class.delete_all "parent_id = #{id}"
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
first:
|
|
2
|
+
id: 1
|
|
3
|
+
title: The First Topic
|
|
4
|
+
author_name: David
|
|
5
|
+
author_email_address: david@loudthinking.com
|
|
6
|
+
written_on: 2003-07-16t15:28:11.2233+01:00
|
|
7
|
+
last_read: 2004-04-15
|
|
8
|
+
bonus_time: 2005-01-30t15:28:00.00+01:00
|
|
9
|
+
content: Have a nice day
|
|
10
|
+
approved: false
|
|
11
|
+
replies_count: 1
|
|
12
|
+
|
|
13
|
+
second:
|
|
14
|
+
id: 2
|
|
15
|
+
title: The Second Topic's of the day
|
|
16
|
+
author_name: Mary
|
|
17
|
+
written_on: 2003-07-15t15:28:00.0099+01:00
|
|
18
|
+
content: Have a nice day
|
|
19
|
+
approved: true
|
|
20
|
+
replies_count: 0
|
|
21
|
+
parent_id: 1
|
|
22
|
+
type: Reply
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# This class models a vertex in a directed graph.
|
|
2
|
+
class Vertex < ActiveRecord::Base
|
|
3
|
+
has_many :sink_edges, :class_name => 'Edge', :foreign_key => 'source_id'
|
|
4
|
+
has_many :sinks, :through => :sink_edges
|
|
5
|
+
|
|
6
|
+
has_and_belongs_to_many :sources,
|
|
7
|
+
:class_name => 'Vertex', :join_table => 'edges',
|
|
8
|
+
:foreign_key => 'sink_id', :association_foreign_key => 'source_id'
|
|
9
|
+
end
|
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
require 'abstract_unit'
|
|
2
|
+
require 'fixtures/topic'
|
|
3
|
+
require 'fixtures/developer'
|
|
4
|
+
require 'fixtures/company'
|
|
5
|
+
require 'fixtures/task'
|
|
6
|
+
require 'fixtures/reply'
|
|
7
|
+
require 'fixtures/joke'
|
|
8
|
+
require 'fixtures/course'
|
|
9
|
+
require 'fixtures/category'
|
|
10
|
+
|
|
11
|
+
class FixturesTest < Test::Unit::TestCase
|
|
12
|
+
self.use_instantiated_fixtures = true
|
|
13
|
+
self.use_transactional_fixtures = false
|
|
14
|
+
|
|
15
|
+
fixtures :topics, :developers, :accounts, :tasks, :categories, :funny_jokes
|
|
16
|
+
|
|
17
|
+
FIXTURES = %w( accounts companies customers
|
|
18
|
+
developers developers_projects entrants
|
|
19
|
+
movies projects subscribers topics tasks )
|
|
20
|
+
MATCH_ATTRIBUTE_NAME = /[a-zA-Z][-_\w]*/
|
|
21
|
+
|
|
22
|
+
def test_clean_fixtures
|
|
23
|
+
FIXTURES.each do |name|
|
|
24
|
+
fixtures = nil
|
|
25
|
+
assert_nothing_raised { fixtures = create_fixtures(name) }
|
|
26
|
+
assert_kind_of(Fixtures, fixtures)
|
|
27
|
+
fixtures.each { |name, fixture|
|
|
28
|
+
fixture.each { |key, value|
|
|
29
|
+
assert_match(MATCH_ATTRIBUTE_NAME, key)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def test_multiple_clean_fixtures
|
|
36
|
+
fixtures_array = nil
|
|
37
|
+
assert_nothing_raised { fixtures_array = create_fixtures(*FIXTURES) }
|
|
38
|
+
assert_kind_of(Array, fixtures_array)
|
|
39
|
+
fixtures_array.each { |fixtures| assert_kind_of(Fixtures, fixtures) }
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_attributes
|
|
43
|
+
topics = create_fixtures("topics")
|
|
44
|
+
assert_equal("The First Topic", topics["first"]["title"])
|
|
45
|
+
assert_nil(topics["second"]["author_email_address"])
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_inserts
|
|
49
|
+
topics = create_fixtures("topics")
|
|
50
|
+
firstRow = ActiveRecord::Base.connection.select_one("SELECT * FROM topics WHERE author_name = 'David'")
|
|
51
|
+
assert_equal("The First Topic", firstRow["title"])
|
|
52
|
+
|
|
53
|
+
secondRow = ActiveRecord::Base.connection.select_one("SELECT * FROM topics WHERE author_name = 'Mary'")
|
|
54
|
+
assert_nil(secondRow["author_email_address"])
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
if ActiveRecord::Base.connection.supports_migrations?
|
|
58
|
+
def test_inserts_with_pre_and_suffix
|
|
59
|
+
ActiveRecord::Base.connection.create_table :prefix_topics_suffix do |t|
|
|
60
|
+
t.column :title, :string
|
|
61
|
+
t.column :author_name, :string
|
|
62
|
+
t.column :author_email_address, :string
|
|
63
|
+
t.column :written_on, :datetime
|
|
64
|
+
t.column :bonus_time, :time
|
|
65
|
+
t.column :last_read, :date
|
|
66
|
+
t.column :content, :string
|
|
67
|
+
t.column :approved, :boolean, :default => true
|
|
68
|
+
t.column :replies_count, :integer, :default => 0
|
|
69
|
+
t.column :parent_id, :integer
|
|
70
|
+
t.column :type, :string, :limit => 50
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Store existing prefix/suffix
|
|
74
|
+
old_prefix = ActiveRecord::Base.table_name_prefix
|
|
75
|
+
old_suffix = ActiveRecord::Base.table_name_suffix
|
|
76
|
+
|
|
77
|
+
# Set a prefix/suffix we can test against
|
|
78
|
+
ActiveRecord::Base.table_name_prefix = 'prefix_'
|
|
79
|
+
ActiveRecord::Base.table_name_suffix = '_suffix'
|
|
80
|
+
|
|
81
|
+
topics = create_fixtures("topics")
|
|
82
|
+
|
|
83
|
+
firstRow = ActiveRecord::Base.connection.select_one("SELECT * FROM prefix_topics_suffix WHERE author_name = 'David'")
|
|
84
|
+
assert_equal("The First Topic", firstRow["title"])
|
|
85
|
+
|
|
86
|
+
secondRow = ActiveRecord::Base.connection.select_one("SELECT * FROM prefix_topics_suffix WHERE author_name = 'Mary'")
|
|
87
|
+
assert_nil(secondRow["author_email_address"])
|
|
88
|
+
ensure
|
|
89
|
+
# Restore prefix/suffix to its previous values
|
|
90
|
+
ActiveRecord::Base.table_name_prefix = old_prefix
|
|
91
|
+
ActiveRecord::Base.table_name_suffix = old_suffix
|
|
92
|
+
|
|
93
|
+
ActiveRecord::Base.connection.drop_table :prefix_topics_suffix rescue nil
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def test_insert_with_datetime
|
|
98
|
+
topics = create_fixtures("tasks")
|
|
99
|
+
first = Task.find(1)
|
|
100
|
+
assert first
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def test_bad_format
|
|
105
|
+
path = File.join(File.dirname(__FILE__), 'fixtures', 'bad_fixtures')
|
|
106
|
+
Dir.entries(path).each do |file|
|
|
107
|
+
next unless File.file?(file) and file !~ Fixtures::DEFAULT_FILTER_RE
|
|
108
|
+
assert_raise(Fixture::FormatError) {
|
|
109
|
+
Fixture.new(bad_fixtures_path, file)
|
|
110
|
+
}
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def test_deprecated_yaml_extension
|
|
115
|
+
assert_raise(Fixture::FormatError) {
|
|
116
|
+
Fixtures.new(nil, 'bad_extension', 'BadExtension', File.join(File.dirname(__FILE__), 'fixtures'))
|
|
117
|
+
}
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def test_logger_level_invariant
|
|
121
|
+
level = ActiveRecord::Base.logger.level
|
|
122
|
+
create_fixtures('topics')
|
|
123
|
+
assert_equal level, ActiveRecord::Base.logger.level
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def test_instantiation
|
|
127
|
+
topics = create_fixtures("topics")
|
|
128
|
+
assert_kind_of Topic, topics["first"].find
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def test_complete_instantiation
|
|
132
|
+
assert_equal 2, @topics.size
|
|
133
|
+
assert_equal "The First Topic", @first.title
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def test_fixtures_from_root_yml_with_instantiation
|
|
137
|
+
# assert_equal 2, @accounts.size
|
|
138
|
+
assert_equal 50, @unknown.credit_limit
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def test_erb_in_fixtures
|
|
142
|
+
assert_equal 11, @developers.size
|
|
143
|
+
assert_equal "fixture_5", @dev_5.name
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def test_empty_yaml_fixture
|
|
147
|
+
assert_not_nil Fixtures.new( Account.connection, "accounts", 'Account', File.dirname(__FILE__) + "/fixtures/naked/yml/accounts")
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def test_empty_yaml_fixture_with_a_comment_in_it
|
|
151
|
+
assert_not_nil Fixtures.new( Account.connection, "companies", 'Company', File.dirname(__FILE__) + "/fixtures/naked/yml/companies")
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def test_dirty_dirty_yaml_file
|
|
155
|
+
assert_raises(Fixture::FormatError) do
|
|
156
|
+
Fixtures.new( Account.connection, "courses", 'Course', File.dirname(__FILE__) + "/fixtures/naked/yml/courses")
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def test_empty_csv_fixtures
|
|
161
|
+
assert_not_nil Fixtures.new( Account.connection, "accounts", 'Account', File.dirname(__FILE__) + "/fixtures/naked/csv/accounts")
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def test_omap_fixtures
|
|
165
|
+
assert_nothing_raised do
|
|
166
|
+
fixtures = Fixtures.new(Account.connection, 'categories', 'Category', File.dirname(__FILE__) + '/fixtures/categories_ordered')
|
|
167
|
+
|
|
168
|
+
i = 0
|
|
169
|
+
fixtures.each do |name, fixture|
|
|
170
|
+
assert_equal "fixture_no_#{i}", name
|
|
171
|
+
assert_equal "Category #{i}", fixture['name']
|
|
172
|
+
i += 1
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def test_yml_file_in_subdirectory
|
|
179
|
+
assert_equal(categories(:sub_special_1).name, "A special category in a subdir file")
|
|
180
|
+
assert_equal(categories(:sub_special_1).class, SpecialCategory)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def test_subsubdir_file_with_arbitrary_name
|
|
184
|
+
assert_equal(categories(:sub_special_3).name, "A special category in an arbitrarily named subsubdir file")
|
|
185
|
+
assert_equal(categories(:sub_special_3).class, SpecialCategory)
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
if Account.connection.respond_to?(:reset_pk_sequence!)
|
|
192
|
+
class FixturesResetPkSequenceTest < Test::Unit::TestCase
|
|
193
|
+
fixtures :accounts
|
|
194
|
+
fixtures :companies
|
|
195
|
+
|
|
196
|
+
def setup
|
|
197
|
+
@instances = [Account.new(:credit_limit => 50), Company.new(:name => 'RoR Consulting')]
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
def test_resets_to_min_pk_with_specified_pk_and_sequence
|
|
201
|
+
@instances.each do |instance|
|
|
202
|
+
model = instance.class
|
|
203
|
+
model.delete_all
|
|
204
|
+
model.connection.reset_pk_sequence!(model.table_name, model.primary_key, model.sequence_name)
|
|
205
|
+
|
|
206
|
+
instance.save!
|
|
207
|
+
assert_equal 1, instance.id, "Sequence reset for #{model.table_name} failed."
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
def test_resets_to_min_pk_with_default_pk_and_sequence
|
|
212
|
+
@instances.each do |instance|
|
|
213
|
+
model = instance.class
|
|
214
|
+
model.delete_all
|
|
215
|
+
model.connection.reset_pk_sequence!(model.table_name)
|
|
216
|
+
|
|
217
|
+
instance.save!
|
|
218
|
+
assert_equal 1, instance.id, "Sequence reset for #{model.table_name} failed."
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def test_create_fixtures_resets_sequences
|
|
223
|
+
@instances.each do |instance|
|
|
224
|
+
max_id = create_fixtures(instance.class.table_name).inject(0) do |max_id, (name, fixture)|
|
|
225
|
+
fixture_id = fixture['id'].to_i
|
|
226
|
+
fixture_id > max_id ? fixture_id : max_id
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
# Clone the last fixture to check that it gets the next greatest id.
|
|
230
|
+
instance.save!
|
|
231
|
+
assert_equal max_id + 1, instance.id, "Sequence reset for #{instance.class.table_name} failed."
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
class FixturesWithoutInstantiationTest < Test::Unit::TestCase
|
|
239
|
+
self.use_instantiated_fixtures = false
|
|
240
|
+
fixtures :topics, :developers, :accounts
|
|
241
|
+
|
|
242
|
+
def test_without_complete_instantiation
|
|
243
|
+
assert_nil @first
|
|
244
|
+
assert_nil @topics
|
|
245
|
+
assert_nil @developers
|
|
246
|
+
assert_nil @accounts
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def test_fixtures_from_root_yml_without_instantiation
|
|
250
|
+
assert_nil @unknown
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def test_accessor_methods
|
|
254
|
+
assert_equal "The First Topic", topics(:first).title
|
|
255
|
+
assert_equal "Jamis", developers(:jamis).name
|
|
256
|
+
assert_equal 50, accounts(:signals37).credit_limit
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
class FixturesWithoutInstanceInstantiationTest < Test::Unit::TestCase
|
|
262
|
+
self.use_instantiated_fixtures = true
|
|
263
|
+
self.use_instantiated_fixtures = :no_instances
|
|
264
|
+
|
|
265
|
+
fixtures :topics, :developers, :accounts
|
|
266
|
+
|
|
267
|
+
def test_without_instance_instantiation
|
|
268
|
+
assert_nil @first
|
|
269
|
+
assert_not_nil @topics
|
|
270
|
+
assert_not_nil @developers
|
|
271
|
+
assert_not_nil @accounts
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
class TransactionalFixturesTest < Test::Unit::TestCase
|
|
277
|
+
self.use_instantiated_fixtures = true
|
|
278
|
+
self.use_transactional_fixtures = true
|
|
279
|
+
|
|
280
|
+
fixtures :topics
|
|
281
|
+
|
|
282
|
+
def test_destroy
|
|
283
|
+
assert_not_nil @first
|
|
284
|
+
@first.destroy
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
def test_destroy_just_kidding
|
|
288
|
+
assert_not_nil @first
|
|
289
|
+
end
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
class MultipleFixturesTest < Test::Unit::TestCase
|
|
294
|
+
fixtures :topics
|
|
295
|
+
fixtures :developers, :accounts
|
|
296
|
+
|
|
297
|
+
def test_fixture_table_names
|
|
298
|
+
assert_equal %w(topics developers accounts), fixture_table_names
|
|
299
|
+
end
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
class OverlappingFixturesTest < Test::Unit::TestCase
|
|
304
|
+
fixtures :topics, :developers
|
|
305
|
+
fixtures :developers, :accounts
|
|
306
|
+
|
|
307
|
+
def test_fixture_table_names
|
|
308
|
+
assert_equal %w(topics developers accounts), fixture_table_names
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
class ForeignKeyFixturesTest < Test::Unit::TestCase
|
|
314
|
+
fixtures :fk_test_has_pk, :fk_test_has_fk
|
|
315
|
+
|
|
316
|
+
# if foreign keys are implemented and fixtures
|
|
317
|
+
# are not deleted in reverse order then this test
|
|
318
|
+
# case will raise StatementInvalid
|
|
319
|
+
|
|
320
|
+
def test_number1
|
|
321
|
+
assert true
|
|
322
|
+
end
|
|
323
|
+
|
|
324
|
+
def test_number2
|
|
325
|
+
assert true
|
|
326
|
+
end
|
|
327
|
+
end
|
|
328
|
+
|
|
329
|
+
class SetTableNameFixturesTest < Test::Unit::TestCase
|
|
330
|
+
set_fixture_class :funny_jokes => 'Joke'
|
|
331
|
+
fixtures :funny_jokes
|
|
332
|
+
|
|
333
|
+
def test_table_method
|
|
334
|
+
assert_kind_of Joke, funny_jokes(:a_joke)
|
|
335
|
+
end
|
|
336
|
+
end
|
|
337
|
+
|
|
338
|
+
class CustomConnectionFixturesTest < Test::Unit::TestCase
|
|
339
|
+
set_fixture_class :courses => Course
|
|
340
|
+
fixtures :courses
|
|
341
|
+
|
|
342
|
+
def test_connection
|
|
343
|
+
assert_kind_of Course, courses(:ruby)
|
|
344
|
+
assert_equal Course.connection, courses(:ruby).connection
|
|
345
|
+
end
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
class InvalidTableNameFixturesTest < Test::Unit::TestCase
|
|
349
|
+
fixtures :funny_jokes
|
|
350
|
+
|
|
351
|
+
def test_raises_error
|
|
352
|
+
assert_raises FixtureClassNotFound do
|
|
353
|
+
funny_jokes(:a_joke)
|
|
354
|
+
end
|
|
355
|
+
end
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
class CheckEscapedYamlFixturesTest < Test::Unit::TestCase
|
|
359
|
+
set_fixture_class :funny_jokes => 'Joke'
|
|
360
|
+
fixtures :funny_jokes
|
|
361
|
+
|
|
362
|
+
def test_proper_escaped_fixture
|
|
363
|
+
assert_equal "The \\n Aristocrats\nAte the candy\n", funny_jokes(:another_joke).name
|
|
364
|
+
end
|
|
365
|
+
end
|
|
366
|
+
|
|
367
|
+
class DevelopersProject; end;
|
|
368
|
+
|
|
369
|
+
class ManyToManyFixturesWithClassDefined < Test::Unit::TestCase
|
|
370
|
+
fixtures :developers_projects
|
|
371
|
+
|
|
372
|
+
def test_this_should_run_cleanly
|
|
373
|
+
assert true
|
|
374
|
+
end
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
|
|
378
|
+
class FixturesBrokenRollbackTest < Test::Unit::TestCase
|
|
379
|
+
def blank_setup; end
|
|
380
|
+
alias_method :ar_setup_with_fixtures, :setup_with_fixtures
|
|
381
|
+
alias_method :setup_with_fixtures, :blank_setup
|
|
382
|
+
alias_method :setup, :blank_setup
|
|
383
|
+
|
|
384
|
+
def blank_teardown; end
|
|
385
|
+
alias_method :ar_teardown_with_fixtures, :teardown_with_fixtures
|
|
386
|
+
alias_method :teardown_with_fixtures, :blank_teardown
|
|
387
|
+
alias_method :teardown, :blank_teardown
|
|
388
|
+
|
|
389
|
+
def test_no_rollback_in_teardown_unless_transaction_active
|
|
390
|
+
assert_equal 0, Thread.current['open_transactions']
|
|
391
|
+
assert_raise(RuntimeError) { ar_setup_with_fixtures }
|
|
392
|
+
assert_equal 0, Thread.current['open_transactions']
|
|
393
|
+
assert_nothing_raised { ar_teardown_with_fixtures }
|
|
394
|
+
assert_equal 0, Thread.current['open_transactions']
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
private
|
|
398
|
+
def load_fixtures
|
|
399
|
+
raise 'argh'
|
|
400
|
+
end
|
|
401
|
+
end
|