fixture_replacement 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/.gitignore +2 -0
  2. data/CHANGELOG.rdoc +720 -0
  3. data/GPL_LICENSE +674 -0
  4. data/MIT_LICENSE +22 -0
  5. data/README.rdoc +154 -0
  6. data/Rakefile +8 -0
  7. data/TODO.rdoc +22 -0
  8. data/VERSION +1 -0
  9. data/contributions.rdoc +48 -0
  10. data/etc/bug_reports/2007_09_28_linoj.txt +51 -0
  11. data/etc/google_analytics +6 -0
  12. data/etc/patches/2007_09_14_default_model_name_with_arguments.diff +26 -0
  13. data/etc/patches/2007_10_14_active_record_specs.diff +396 -0
  14. data/etc/patches/2007_10_14_protected_attributes.diff +26 -0
  15. data/etc/patches/2007_10_14_send_patch.diff +79 -0
  16. data/etc/patches/2007_10_14_spelling_error_in_comments.diff +13 -0
  17. data/etc/patches/2007_10_17_protected_attributes_second_go.diff +212 -0
  18. data/etc/patches/2007_10_18_README.diff +137 -0
  19. data/etc/patches/2007_10_19_readme_tweak.diff +12 -0
  20. data/etc/patches/2007_10_19_silence_migration.diff +12 -0
  21. data/etc/patches/2007_10_25_changed_classify_to_camelize.diff +38 -0
  22. data/etc/patches/2007_11_20_fixture_replacement_generator_should_not_reload_environment_or_boot.patch +13 -0
  23. data/etc/patches/2007_11_20_string_random_refactor_and_extension.patch +104 -0
  24. data/etc/patches/2007_11_20_string_random_refactor_and_extension_v2.patch +108 -0
  25. data/fixture_replacement.gemspec +126 -0
  26. data/lib/fixture_replacement.rb +16 -0
  27. data/lib/fixture_replacement/attribute_builder.rb +129 -0
  28. data/lib/fixture_replacement/class_methods.rb +45 -0
  29. data/lib/fixture_replacement/method_generator.rb +38 -0
  30. data/lib/fixture_replacement/version.rb +13 -0
  31. data/lib/fr.rb +1 -0
  32. data/philosophy_and_bugs.rdoc +128 -0
  33. data/rake_tasks/code_quality.rb +37 -0
  34. data/rake_tasks/docs.rb +59 -0
  35. data/rake_tasks/gem.rb +27 -0
  36. data/rake_tasks/specs.rb +7 -0
  37. data/rake_tasks/tests.rb +7 -0
  38. data/rake_tasks/website.rb +11 -0
  39. data/spec/fixture_replacement/attribute_builder_spec.rb +162 -0
  40. data/spec/fixture_replacement/fixture_replacement_spec.rb +96 -0
  41. data/spec/fixture_replacement/fixtures/classes.rb +78 -0
  42. data/spec/fixture_replacement/fr_spec.rb +7 -0
  43. data/spec/fixture_replacement/integration/attr_protected_attributes_spec.rb +71 -0
  44. data/spec/fixture_replacement/integration/attributes_for_with_invalid_keys_spec.rb +14 -0
  45. data/spec/fixture_replacement/integration/attributes_from_spec_without_block.rb +52 -0
  46. data/spec/fixture_replacement/integration/create_method_spec.rb +61 -0
  47. data/spec/fixture_replacement/integration/cyclic_dependency_spec.rb +32 -0
  48. data/spec/fixture_replacement/integration/default_warnings_spec.rb +29 -0
  49. data/spec/fixture_replacement/integration/extend_spec.rb +37 -0
  50. data/spec/fixture_replacement/integration/has_and_belongs_to_many_spec.rb +64 -0
  51. data/spec/fixture_replacement/integration/new_method_spec.rb +96 -0
  52. data/spec/fixture_replacement/integration/private_methods_spec.rb +43 -0
  53. data/spec/fixture_replacement/integration/public_methods_spec.rb +21 -0
  54. data/spec/fixture_replacement/integration/valid_attributes_spec.rb +41 -0
  55. data/spec/fixture_replacement/integration/validation_spec.rb +54 -0
  56. data/spec/fixture_replacement/regressions/2008_01_21_random_string_with_sti_spec.rb +71 -0
  57. data/spec/fixture_replacement/version_spec.rb +7 -0
  58. data/spec/spec.opts +1 -0
  59. data/spec/spec_helper.rb +16 -0
  60. data/spec/spec_helpers.rb +117 -0
  61. data/test/test_helper.rb +21 -0
  62. data/test/unit/user_test.rb +57 -0
  63. metadata +143 -0
@@ -0,0 +1,96 @@
1
+ require File.dirname(__FILE__) + "/../spec_helper"
2
+
3
+ describe FixtureReplacement do
4
+ describe "random_string" do
5
+ before do
6
+ @fr = FixtureReplacement
7
+ end
8
+
9
+ it "should not be the same as another randomly generated string" do
10
+ @fr.random_string.should_not == @fr.random_string
11
+ end
12
+
13
+ it "should by default be 10 characters long" do
14
+ @fr.random_string.size.should == 10
15
+ end
16
+
17
+ it "should be able to specify the length of the random string" do
18
+ @fr.random_string(100).size.should == 100
19
+ end
20
+
21
+ it "should only generate lowercase letters" do
22
+ s = @fr.random_string(100)
23
+ s.upcase.should == s.swapcase
24
+ end
25
+ end
26
+
27
+ describe "requiring the fixtures file" do
28
+ before do
29
+ FixtureReplacement.stub!(:load)
30
+ end
31
+
32
+ it "should require db/example_data" do
33
+ FixtureReplacement.stub!(:rails_root).and_return "/foo/bar"
34
+ FixtureReplacement.should_receive(:load).with("/foo/bar/db/example_data.rb")
35
+
36
+ FixtureReplacement.load_example_data
37
+ end
38
+
39
+ it "should use the correct rails root" do
40
+ FixtureReplacement.stub!(:rails_root).and_return "/rails/root"
41
+ FixtureReplacement.should_receive(:load).with("/rails/root/db/example_data.rb")
42
+
43
+ FixtureReplacement.load_example_data
44
+ end
45
+
46
+ it "should not blow up if the file is not found" do
47
+ FixtureReplacement.stub!(:load).and_raise LoadError
48
+
49
+ lambda {
50
+ FixtureReplacement.load_example_data
51
+ }.should_not raise_error
52
+ end
53
+ end
54
+
55
+ describe "rails_root" do
56
+ def use_rails_root(rails_root, &block)
57
+ silence_warnings do
58
+ Object.const_set(:RAILS_ROOT, rails_root)
59
+ end
60
+ block.call
61
+ ensure
62
+ Object.send :remove_const, :RAILS_ROOT
63
+ end
64
+
65
+ it "should be the RAILS_ROOT constant if given" do
66
+ use_rails_root "/rails/root" do
67
+ FR.rails_root.should == "/rails/root"
68
+ end
69
+ end
70
+
71
+ it "should use the correct RAILS_ROOT" do
72
+ use_rails_root "/foo/bar" do
73
+ FR.rails_root.should == "/foo/bar"
74
+ end
75
+ end
76
+
77
+ it "should be '.' if not defined" do
78
+ FR.rails_root.should == "."
79
+ end
80
+ end
81
+
82
+ describe "reload!" do
83
+ it "should call load on the main fixture replacement file" do
84
+ file_path = File.expand_path(File.dirname(__FILE__) + "/../../lib/fixture_replacement.rb")
85
+ FixtureReplacement.should_receive(:load).with(file_path)
86
+
87
+ FixtureReplacement.reload!
88
+ end
89
+ end
90
+
91
+ describe "method_added" do
92
+ it "should be private" do
93
+ FixtureReplacement.should_not respond_to(:method_added)
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,78 @@
1
+ unless defined?(User)
2
+ class User < ActiveRecord::Base
3
+ belongs_to :gender
4
+ end
5
+
6
+ class Member < ActiveRecord::Base; end
7
+
8
+ class Post < ActiveRecord::Base
9
+ has_many :comments
10
+ end
11
+
12
+ class Comment < ActiveRecord::Base
13
+ belongs_to :post
14
+ end
15
+
16
+ class Player < ActiveRecord::Base
17
+ end
18
+
19
+ class Alien < ActiveRecord::Base
20
+ belongs_to :gender
21
+ end
22
+
23
+ class Admin < ActiveRecord::Base
24
+ attr_protected :admin_status
25
+ end
26
+
27
+ class Gender < ActiveRecord::Base; end
28
+ class Actress < ActiveRecord::Base; end
29
+
30
+ class Item < ActiveRecord::Base
31
+ belongs_to :category
32
+ end
33
+
34
+ class Writing < Item; end
35
+
36
+ class Category < ActiveRecord::Base
37
+ has_many :items
38
+ end
39
+
40
+ class Subscriber < ActiveRecord::Base
41
+ has_and_belongs_to_many :subscriptions
42
+ end
43
+
44
+ class Subscription < ActiveRecord::Base
45
+ has_and_belongs_to_many :subscribers
46
+ end
47
+
48
+ class Event < ActiveRecord::Base
49
+ has_one :schedule
50
+ end
51
+
52
+ class Schedule < ActiveRecord::Base
53
+ belongs_to :event
54
+ end
55
+
56
+ class Foo; end
57
+ class Bar; end
58
+
59
+ class NoValidation < ActiveRecord::Base
60
+ end
61
+
62
+ class ValidateName < ActiveRecord::Base
63
+ validates_presence_of :name
64
+ end
65
+
66
+ class ValidateNameTwo < ActiveRecord::Base
67
+ validates_presence_of :name
68
+ end
69
+
70
+ class AddressWithValidCity < ActiveRecord::Base
71
+ validates_presence_of :city
72
+ end
73
+
74
+ class AddressWithValidCityAndState < ActiveRecord::Base
75
+ validates_presence_of :city
76
+ validates_presence_of :state
77
+ end
78
+ end
@@ -0,0 +1,7 @@
1
+ require File.dirname(__FILE__) + "/../spec_helper"
2
+
3
+ describe FR do
4
+ it "should alias FixtureReplacement" do
5
+ FR.should equal(FixtureReplacement)
6
+ end
7
+ end
@@ -0,0 +1,71 @@
1
+ require File.dirname(__FILE__) + "/../../spec_helper"
2
+
3
+ module FixtureReplacement
4
+ describe "create_user with attr_protected attributes" do
5
+ before :each do
6
+ @obj = use_module do
7
+ attributes_for :admin do |u|
8
+ u.admin_status = true
9
+ u.name = "Scott"
10
+ end
11
+ end
12
+ end
13
+
14
+ it "should not complain when an apparent mass assignment has happened with default values" do
15
+ lambda {
16
+ @obj.create_admin
17
+ }.should_not raise_error
18
+ end
19
+
20
+ it "should not be a new record" do
21
+ @obj.create_admin.should_not be_a_new_record
22
+ end
23
+
24
+ it "should have admin_status equal to the default value (when it has not been overwritten)" do
25
+ @obj.create_admin.admin_status.should == true
26
+ end
27
+
28
+ it "should have admin_status equal to the overwritten value" do
29
+ @obj.create_admin(:admin_status => false).admin_status.should be_false
30
+ end
31
+
32
+ it "should have the other attributes assigned when the attr_value has been overwritten" do
33
+ @obj.create_admin(:admin_status => false).name.should == "Scott"
34
+ end
35
+
36
+ it "should have the other attributes assigned even when the attr_value has not been overwritten" do
37
+ @obj.create_admin.name.should == "Scott"
38
+ end
39
+ end
40
+
41
+ describe "new_user with attr_protected attributes" do
42
+ before :each do
43
+ @obj = use_module do |s|
44
+ attributes_for :admin do |s|
45
+ s.admin_status = true
46
+ s.name = "Scott"
47
+ end
48
+ end
49
+ end
50
+
51
+ it "should return a new Admin with new_admin" do
52
+ @obj.new_admin.should be_a_kind_of(Admin)
53
+ end
54
+
55
+ it "should have admin_status equal to the default value (when it has not been overwritten)" do
56
+ @obj.new_admin.admin_status.should == true
57
+ end
58
+
59
+ it "should have admin_status equal to the overwritten value" do
60
+ @obj.new_admin(:admin_status => false).admin_status.should be_false
61
+ end
62
+
63
+ it "should have the other attributes assigned when the attr_value has been overwritten" do
64
+ @obj.new_admin(:admin_status => false).name.should == "Scott"
65
+ end
66
+
67
+ it "should have the other attributes assigned even when the attr_value has not been overwritten" do
68
+ @obj.new_admin.name.should == "Scott"
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,14 @@
1
+ require File.dirname(__FILE__) + "/../../spec_helper"
2
+
3
+ module FixtureReplacement
4
+ describe "keys passed to attributes for" do
5
+ it "should raise an invalid key error when an invalid key is passed" do
6
+ lambda {
7
+ use_module do
8
+ attributes_for :user, :class_name => "foo"
9
+ end
10
+ }.should raise_error(FixtureReplacement::AttributeBuilder::InvalidKeyError,
11
+ ":class_name is not a valid option to attributes_for. Valid keys are: [:from, :class]")
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,52 @@
1
+ require File.dirname(__FILE__) + "/../../spec_helper"
2
+
3
+ module FixtureReplacement
4
+ describe AttributeBuilder do
5
+ include FixtureReplacementControllerHelper
6
+
7
+ before :each do
8
+ @obj = use_module do
9
+ attributes_for :user do |u|
10
+ u.username = random_string
11
+ u.key = random_string
12
+ end
13
+
14
+ attributes_for :scott, :from => :user
15
+
16
+ attributes_for :foo, :class => User
17
+
18
+ attributes_for :admin do |a|
19
+ a.admin_status = true
20
+ end
21
+ end
22
+ end
23
+
24
+ models = "user", "foo", "scott"
25
+
26
+ models.each do |model|
27
+ it "should have the new_#{model} method as a (module) method on the module" do
28
+ @obj.should respond_to("new_#{model}")
29
+ end
30
+
31
+ it "should have the new_#{model} method as a private method in the test case" do
32
+ @obj.private_methods.should include("new_#{model}")
33
+ end
34
+
35
+ it "should have the create_#{model} method as a private method in the test case" do
36
+ @obj.private_methods.should include("create_#{model}")
37
+ end
38
+
39
+ it "should have the create_#{model} method as a (module) method on the module" do
40
+ @obj.should respond_to("create_#{model}")
41
+ end
42
+ end
43
+
44
+ it "should have the username as a string (for User) for new_user" do
45
+ @obj.new_user.username.class.should == String
46
+ end
47
+
48
+ it "should have the username as a string (for User) for create_user" do
49
+ @obj.create_user.username.class.should == String
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,61 @@
1
+ require File.dirname(__FILE__) + "/../../spec_helper"
2
+
3
+ module FixtureReplacement
4
+ describe "the create_* method" do
5
+ it "should be a user for attributes_for :user" do
6
+ obj = use_module do
7
+ attributes_for :user
8
+ end
9
+
10
+ obj.create_user.should be_a_kind_of(User)
11
+ end
12
+
13
+ it "should use the given class" do
14
+ obj = use_module do
15
+ attributes_for :foo, :class => User
16
+ end
17
+
18
+ obj.create_foo.should be_a_kind_of(User)
19
+ end
20
+
21
+ it "should find the correct class name" do
22
+ obj = use_module do
23
+ attributes_for :admin
24
+ end
25
+
26
+ obj.create_admin.should be_a_kind_of(Admin)
27
+ end
28
+
29
+ it "should over-write the User's hash with any hash given to create_user" do
30
+ obj = use_module do
31
+ attributes_for :user do |u|
32
+ u.key = "val"
33
+ end
34
+ end
35
+
36
+ obj.create_user(:key => "other_value").key.should == "other_value"
37
+ end
38
+
39
+ it "should add any hash key-value pairs which weren't previously given in user_attributes" do
40
+ obj = use_module do
41
+ attributes_for :user do |u|
42
+ u.key = "val"
43
+ end
44
+ end
45
+
46
+ user = obj.create_user(:other_key => "other_value")
47
+ user.key.should == "val"
48
+ user.other_key.should == "other_value"
49
+ end
50
+
51
+ it "should not be saved to the database" do
52
+ obj = use_module do
53
+ attributes_for :user do |u|
54
+ u.key = "val"
55
+ end
56
+ end
57
+
58
+ obj.create_user.should_not be_a_new_record
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,32 @@
1
+ require File.dirname(__FILE__) + "/../../spec_helper"
2
+
3
+ describe "cyclic dependencies" do
4
+ before do
5
+ @mod = use_module do
6
+ attributes_for :event do |e, hash|
7
+ e.schedule = new_schedule(:event => e) unless hash[:schedule]
8
+ end
9
+
10
+ attributes_for :schedule do |s, hash|
11
+ s.event = new_event(:schedule => s) unless hash[:event]
12
+ end
13
+ end
14
+ end
15
+
16
+ it "should allow them" do
17
+ @mod.new_event.should be_a_kind_of(Event)
18
+ end
19
+
20
+ it "should associate an event with a schedule" do
21
+ @mod.new_event.schedule.should be_a_kind_of(Schedule)
22
+ end
23
+
24
+ it "should associate a schedule with an event" do
25
+ @mod.new_schedule.event.should be_a_kind_of(Event)
26
+ end
27
+
28
+ it "should back associate" do
29
+ schedule = @mod.new_schedule
30
+ schedule.event.schedule.should == schedule
31
+ end
32
+ end
@@ -0,0 +1,29 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../spec_helper")
2
+
3
+ describe "default_* warnings" do
4
+ before do
5
+ @mod = use_module do
6
+ attributes_for :post
7
+
8
+ attributes_for :comment
9
+ end
10
+ end
11
+
12
+ it "should warn when using default_" do
13
+ Kernel.should_receive(:warn).with("default_post has been deprecated. Please replace instances of default_post with the new_post method")
14
+ @mod.default_post
15
+ end
16
+
17
+ it "should use the correct builder name" do
18
+ Kernel.should_receive(:warn).with("default_comment has been deprecated. Please replace instances of default_comment with the new_comment method")
19
+ @mod.default_comment
20
+ end
21
+
22
+ it "should return a new instance" do
23
+ Kernel.stub!(:warn).and_return nil
24
+
25
+ post = @mod.default_post
26
+ post.should be_a_kind_of(Post)
27
+ post.should be_a_new_record
28
+ end
29
+ end