fixture_replacement 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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