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.
- data/.gitignore +2 -0
- data/CHANGELOG.rdoc +720 -0
- data/GPL_LICENSE +674 -0
- data/MIT_LICENSE +22 -0
- data/README.rdoc +154 -0
- data/Rakefile +8 -0
- data/TODO.rdoc +22 -0
- data/VERSION +1 -0
- data/contributions.rdoc +48 -0
- data/etc/bug_reports/2007_09_28_linoj.txt +51 -0
- data/etc/google_analytics +6 -0
- data/etc/patches/2007_09_14_default_model_name_with_arguments.diff +26 -0
- data/etc/patches/2007_10_14_active_record_specs.diff +396 -0
- data/etc/patches/2007_10_14_protected_attributes.diff +26 -0
- data/etc/patches/2007_10_14_send_patch.diff +79 -0
- data/etc/patches/2007_10_14_spelling_error_in_comments.diff +13 -0
- data/etc/patches/2007_10_17_protected_attributes_second_go.diff +212 -0
- data/etc/patches/2007_10_18_README.diff +137 -0
- data/etc/patches/2007_10_19_readme_tweak.diff +12 -0
- data/etc/patches/2007_10_19_silence_migration.diff +12 -0
- data/etc/patches/2007_10_25_changed_classify_to_camelize.diff +38 -0
- data/etc/patches/2007_11_20_fixture_replacement_generator_should_not_reload_environment_or_boot.patch +13 -0
- data/etc/patches/2007_11_20_string_random_refactor_and_extension.patch +104 -0
- data/etc/patches/2007_11_20_string_random_refactor_and_extension_v2.patch +108 -0
- data/fixture_replacement.gemspec +126 -0
- data/lib/fixture_replacement.rb +16 -0
- data/lib/fixture_replacement/attribute_builder.rb +129 -0
- data/lib/fixture_replacement/class_methods.rb +45 -0
- data/lib/fixture_replacement/method_generator.rb +38 -0
- data/lib/fixture_replacement/version.rb +13 -0
- data/lib/fr.rb +1 -0
- data/philosophy_and_bugs.rdoc +128 -0
- data/rake_tasks/code_quality.rb +37 -0
- data/rake_tasks/docs.rb +59 -0
- data/rake_tasks/gem.rb +27 -0
- data/rake_tasks/specs.rb +7 -0
- data/rake_tasks/tests.rb +7 -0
- data/rake_tasks/website.rb +11 -0
- data/spec/fixture_replacement/attribute_builder_spec.rb +162 -0
- data/spec/fixture_replacement/fixture_replacement_spec.rb +96 -0
- data/spec/fixture_replacement/fixtures/classes.rb +78 -0
- data/spec/fixture_replacement/fr_spec.rb +7 -0
- data/spec/fixture_replacement/integration/attr_protected_attributes_spec.rb +71 -0
- data/spec/fixture_replacement/integration/attributes_for_with_invalid_keys_spec.rb +14 -0
- data/spec/fixture_replacement/integration/attributes_from_spec_without_block.rb +52 -0
- data/spec/fixture_replacement/integration/create_method_spec.rb +61 -0
- data/spec/fixture_replacement/integration/cyclic_dependency_spec.rb +32 -0
- data/spec/fixture_replacement/integration/default_warnings_spec.rb +29 -0
- data/spec/fixture_replacement/integration/extend_spec.rb +37 -0
- data/spec/fixture_replacement/integration/has_and_belongs_to_many_spec.rb +64 -0
- data/spec/fixture_replacement/integration/new_method_spec.rb +96 -0
- data/spec/fixture_replacement/integration/private_methods_spec.rb +43 -0
- data/spec/fixture_replacement/integration/public_methods_spec.rb +21 -0
- data/spec/fixture_replacement/integration/valid_attributes_spec.rb +41 -0
- data/spec/fixture_replacement/integration/validation_spec.rb +54 -0
- data/spec/fixture_replacement/regressions/2008_01_21_random_string_with_sti_spec.rb +71 -0
- data/spec/fixture_replacement/version_spec.rb +7 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/spec_helpers.rb +117 -0
- data/test/test_helper.rb +21 -0
- data/test/unit/user_test.rb +57 -0
- metadata +143 -0
data/MIT_LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2008-2009 Scott Taylor (smtlaissezfaire) <scott@railsnewbie.com>
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person
|
4
|
+
obtaining a copy of this software and associated documentation
|
5
|
+
files (the "Software"), to deal in the Software without
|
6
|
+
restriction, including without limitation the rights to use,
|
7
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
copies of the Software, and to permit persons to whom the
|
9
|
+
Software is furnished to do so, subject to the following
|
10
|
+
conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
17
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
19
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
20
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
21
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
22
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
= FixtureReplacement (version 3.0.1)
|
2
|
+
|
3
|
+
== What is FixtureReplacement
|
4
|
+
|
5
|
+
FixtureReplacement is a Rails[http://rubyonrails.org/] plugin that provides a simple way to
|
6
|
+
quickly populate your test database with model objects without having to manage multiple,
|
7
|
+
brittle fixture files. You can easily set up complex object graphs (with models which
|
8
|
+
reference other models) and add new objects on the fly.
|
9
|
+
|
10
|
+
Not only can FixtureReplacement make your test data easier to maintain, it can also help
|
11
|
+
to make your tests and specs much more readable and intention-revealing by allowing you
|
12
|
+
to omit extraneous details and focus only on the attributes that are important for a
|
13
|
+
particular behaviour. It works well with both RSpec[http://rspec.rubyforge.org/] and
|
14
|
+
Test::Unit[http://www.ruby-doc.org/stdlib/libdoc/test/unit/rdoc/classes/Test/Unit.html].
|
15
|
+
|
16
|
+
== What's new since 2.0:
|
17
|
+
|
18
|
+
* default_* is gone in favor of new_*.
|
19
|
+
* Cyclic dependencies are no longer an issue. The "overrides hash" (the hash passed to new_* or create_*) can now be processed.
|
20
|
+
|
21
|
+
See CHANGELOG.rdoc + test suite for further changes.
|
22
|
+
|
23
|
+
== Installation
|
24
|
+
|
25
|
+
Install the plugin:
|
26
|
+
|
27
|
+
git://github.com/smtlaissezfaire/fixturereplacement.git
|
28
|
+
|
29
|
+
=== Using it with RSpec
|
30
|
+
|
31
|
+
Add the following to your <tt>spec/spec_helper.rb</tt> file, in the configuration section:
|
32
|
+
|
33
|
+
Spec::Runner.configure do |config|
|
34
|
+
config.include FixtureReplacement
|
35
|
+
end
|
36
|
+
|
37
|
+
=== Using it with Test::Unit
|
38
|
+
|
39
|
+
Add the following to your <tt>test/test_helper.rb</tt> file:
|
40
|
+
|
41
|
+
class Test::Unit::TestCase
|
42
|
+
include FixtureReplacement
|
43
|
+
end
|
44
|
+
|
45
|
+
== How to use FixtureReplacement
|
46
|
+
|
47
|
+
=== Defining default attributes
|
48
|
+
|
49
|
+
At the heart of FixtureReplacement is the <tt>db/example_data.rb</tt> file where you
|
50
|
+
define the default attributes for each of your test models. This example shows the default
|
51
|
+
attributes for a user:
|
52
|
+
|
53
|
+
module FixtureReplacement
|
54
|
+
|
55
|
+
attributes_for :user do |u|
|
56
|
+
password = random_string
|
57
|
+
|
58
|
+
u.value = "a value",
|
59
|
+
u.other = "other value",
|
60
|
+
u.another = random_string, # random string 10 characters long
|
61
|
+
u.one_more = random_string(15), # 15 characters long
|
62
|
+
u.password = password,
|
63
|
+
u.password_confirmation = password,
|
64
|
+
u.associated_object = new_bar # expects attributes_for :bar to be setup
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
Note that:
|
70
|
+
|
71
|
+
- A 'random_string' method is provided for attributes whose exact value isn't important; this means you can
|
72
|
+
create multiple, unique model instances
|
73
|
+
- you can perform arbitrary set-up and execute any Ruby code prior to returning the hash
|
74
|
+
(as shown here where a <tt>password</tt> is generated and then used for both the <tt>:password</tt> and
|
75
|
+
<tt>:password_confirmation</tt> attributes)
|
76
|
+
- a <tt>new_modelname</tt> method is automatically provided that allows you to set up dependent
|
77
|
+
model objects (in this case an instance of the <tt>Bar</tt> model)
|
78
|
+
|
79
|
+
=== Available methods
|
80
|
+
|
81
|
+
Based on the above definition FixtureReplacement makes the following methods available:
|
82
|
+
|
83
|
+
- <tt>random_string</tt>: generates a random string as shown above
|
84
|
+
- <tt>new_user</tt>: equivalent to <tt>User.new</tt> with the attributes for the user.
|
85
|
+
- <tt>create_user</tt>: equivalent to <tt>User.create!</tt> with the user's attributes.
|
86
|
+
- <tt>valid_user_attributes</tt>: returns a hash of the user's attributes including associations, specified in db/example_data.rb.
|
87
|
+
|
88
|
+
=== Overriding attributes
|
89
|
+
|
90
|
+
Overrides of specific attributes can be performed as follows:
|
91
|
+
|
92
|
+
new_user(:thing => "overridden")
|
93
|
+
create_user(:thing => "overridden")
|
94
|
+
|
95
|
+
Overrides can also be used with associations:
|
96
|
+
|
97
|
+
scott = create_user(:username => "scott")
|
98
|
+
post = create_post(:user => scott)
|
99
|
+
|
100
|
+
|
101
|
+
=== attr_protected / attr_accessible
|
102
|
+
|
103
|
+
In the case that the model has an attr_protected field, FixtureReplacement
|
104
|
+
will assign the field as if it wasn't protected, which is convenient for testing:
|
105
|
+
|
106
|
+
class User < ActiveRecord::Base
|
107
|
+
attr_protected :admin_status
|
108
|
+
end
|
109
|
+
|
110
|
+
user = create_user(:username => "scott", :admin_status => true)
|
111
|
+
user.admin_status # => true
|
112
|
+
|
113
|
+
=== Validate your fixtures (thanks Fixjour)
|
114
|
+
|
115
|
+
Validate your fixture definitions after including it in the spec helper or test helper:
|
116
|
+
|
117
|
+
==== spec_helper.rb:
|
118
|
+
|
119
|
+
Spec::Runner.configuration do |config|
|
120
|
+
config.include FixtureReplacement
|
121
|
+
end
|
122
|
+
|
123
|
+
FixtureReplacement.validate!
|
124
|
+
|
125
|
+
==== test_helper.rb
|
126
|
+
|
127
|
+
class Test::Unit::TestCase
|
128
|
+
include FixtureReplacement
|
129
|
+
end
|
130
|
+
|
131
|
+
FixtureReplacement.validate!
|
132
|
+
|
133
|
+
=== Using FixtureReplacement within <tt>script/console</tt>
|
134
|
+
|
135
|
+
$ ./script/console
|
136
|
+
Loading development environment
|
137
|
+
>> include FR
|
138
|
+
=> Object
|
139
|
+
>> create_user
|
140
|
+
=> #<User id: 1, crypted_password: "521faec1c095..." ...>
|
141
|
+
|
142
|
+
= Philosophy & Disadvantages
|
143
|
+
|
144
|
+
See philosophy_and_bugs.rdoc
|
145
|
+
|
146
|
+
= Contributors, Contributions, & BUGS
|
147
|
+
|
148
|
+
See contributions.rdoc
|
149
|
+
|
150
|
+
== License
|
151
|
+
|
152
|
+
This software is dual licensed under the MIT and the GPLv3 Licenses (it's your pick).
|
153
|
+
|
154
|
+
Copyright 2007-2009 Scott Taylor / smtlaissezfaire[http://github.com/smtlaissezfaire] (scott@railsnewbie.com)
|
data/Rakefile
ADDED
data/TODO.rdoc
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
|
2
|
+
== Bugs
|
3
|
+
|
4
|
+
- Allow 'extend FixtureReplacement' as well as 'include FixtureReplacement'
|
5
|
+
- Two levels down of inherited fixture bug
|
6
|
+
|
7
|
+
== Features
|
8
|
+
|
9
|
+
- Validate fixtures. Steal any other good ideas from FactoryGirl, Fixjour, Machinist, etc.
|
10
|
+
- Support SEQUEL & Datamapper. Make it ORM independent
|
11
|
+
|
12
|
+
== Code Cleanup
|
13
|
+
|
14
|
+
- Remove ugly method_added hack
|
15
|
+
|
16
|
+
== ETC
|
17
|
+
|
18
|
+
- Store old version 2 README
|
19
|
+
- Update website info
|
20
|
+
- Update with github info
|
21
|
+
- Register Lighthouse project
|
22
|
+
- Remove TODOs from Rubyforge tracker (http://rubyforge.org/tracker/?group_id=4556)
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
3.0.1
|
data/contributions.rdoc
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
= Bugs & Contributing Code
|
2
|
+
|
3
|
+
If you would like to change how this software works, report a bug, or request a feature, use
|
4
|
+
the github issue tracker[http://github.com/smtlaissezfaire/fixturereplacement/issues].
|
5
|
+
|
6
|
+
== Running the Specs/Tests for FixtureReplacement
|
7
|
+
|
8
|
+
You will need rspec (version 1.0.8 or later) to run the specs, as well as the sqlite3-ruby gem
|
9
|
+
(and sqlite3 installed):
|
10
|
+
|
11
|
+
% gem install rspec sqlite3-ruby
|
12
|
+
|
13
|
+
cd into the fixture_replacement plugin directory:
|
14
|
+
|
15
|
+
% cd vendor/plugins/fixture_replacement
|
16
|
+
|
17
|
+
Then run with <tt>rake</tt>
|
18
|
+
|
19
|
+
% rake
|
20
|
+
|
21
|
+
There are also some tests for test/unit. These mainly serve as regressions, but you are free
|
22
|
+
to run them as well.
|
23
|
+
|
24
|
+
== Test Coverage
|
25
|
+
|
26
|
+
specdocs[http://replacefixtures.rubyforge.org/specdoc.html], rcov[http://replacefixtures.rubyforge.org/rcov/index.html], flog[http://replacefixtures.rubyforge.org/flog.txt]
|
27
|
+
|
28
|
+
= Patches, Contributions:
|
29
|
+
|
30
|
+
Thanks to the following for making this software better:
|
31
|
+
|
32
|
+
- Greg Bluvshteyn (http://www.m001.net), for bugging me about the naming, and making the wonderful suggestion to use the plugin in the console.
|
33
|
+
- Simon Peter Nicholls
|
34
|
+
- default_* methods can take a hash (applied in rev. 11)
|
35
|
+
- Wincent Colaiuta (http://wincent.com/) - Huge Thanks
|
36
|
+
- patch for spelling error in comments (applied in revision 31)
|
37
|
+
- patch for specs with sqlite3 (applied in revision 35)
|
38
|
+
- patch to ignore attr_protected in mass assignment (applied in revision 57)
|
39
|
+
- Most of this README Documentation (applied in revision 62)
|
40
|
+
- patch: silencing sqlite3 in memory creation of table output (applied in revision 72)
|
41
|
+
- doc patch: typo fix in readme
|
42
|
+
- Carl Porth
|
43
|
+
- patch: classify should be camelize (applied in revision 74)
|
44
|
+
- LinoJ, JW, Matthew Bass, Andy Watts, Dave Spurr
|
45
|
+
- bug reports
|
46
|
+
- Bryan Helmkamp: Feedback on back associating models.
|
47
|
+
- Pat Nakajima: Wonderful ideas from Fixjour. Elimination of default_* methods in favor
|
48
|
+
of new_* methods. validation of new instances.
|
@@ -0,0 +1,51 @@
|
|
1
|
+
Hi Scott,
|
2
|
+
|
3
|
+
I'm wondering if you have insight into this or if I should go ask somewhere else.
|
4
|
+
|
5
|
+
I installed 2 plug-in today,
|
6
|
+
first fixture_replacement plugin
|
7
|
+
and been using it successfully
|
8
|
+
|
9
|
+
Then I installed validates_email_format_of plugin
|
10
|
+
http://code.dunae.ca/validates_email_format_of
|
11
|
+
|
12
|
+
and added this to my User model
|
13
|
+
validates_email_format_of :email
|
14
|
+
|
15
|
+
then script/server wont start
|
16
|
+
When I comment out this line, it's fine
|
17
|
+
|
18
|
+
Here's the error:
|
19
|
+
|
20
|
+
$ script/server
|
21
|
+
=> Booting Mongrel (use 'script/server webrick' to force WEBrick)
|
22
|
+
=> Rails application starting on http://0.0.0.0:3000
|
23
|
+
=> Call with -d to detach
|
24
|
+
=> Ctrl-C to shutdown server
|
25
|
+
** Starting Mongrel listening at 0.0.0.0:3000
|
26
|
+
** Starting Rails with development environment...
|
27
|
+
Exiting
|
28
|
+
/Users/jonathan/rails/reviewramp/vendor/plugins/fixture_replacement/init.rb:9:in `evaluate': Error in FixtureReplacement Plugin: undefined method `validates_email_format_of' for #<Class:0x241cc68> (RuntimeError)
|
29
|
+
from ./script/../config/../vendor/rails/railties/lib/rails/plugin/loader.rb:107:in `evaluate'
|
30
|
+
from /Users/jonathan/rails/reviewramp/vendor/rails/activesupport/lib/active_support/core_ext/kernel/reporting.rb:11:in `silence_warnings'
|
31
|
+
from ./script/../config/../vendor/rails/railties/lib/rails/plugin/loader.rb:107:in `evaluate'
|
32
|
+
from ./script/../config/../vendor/rails/railties/lib/rails/plugin/loader.rb:24:in `load'
|
33
|
+
from /Users/jonathan/rails/reviewramp/vendor/rails/railties/lib/initializer.rb:183:in `load_plugins'
|
34
|
+
from ./script/../config/../vendor/rails/railties/lib/rails/plugin/locator.rb:16:in `each'
|
35
|
+
from ./script/../config/../vendor/rails/railties/lib/rails/plugin/locator.rb:16:in `each'
|
36
|
+
from /Users/jonathan/rails/reviewramp/vendor/rails/railties/lib/initializer.rb:182:in `load_plugins'
|
37
|
+
... 31 levels...
|
38
|
+
from /Users/jonathan/rails/reviewramp/vendor/rails/activesupport/lib/active_support/dependencies.rb:495:in `require'
|
39
|
+
from /Users/jonathan/rails/reviewramp/vendor/rails/railties/lib/commands/server.rb:39
|
40
|
+
from script/server:3:in `require'
|
41
|
+
from script/server:3
|
42
|
+
|
43
|
+
|
44
|
+
I havent tried it in a different project (without fixture_replacement) but looks like yours is getting the blame... :)
|
45
|
+
|
46
|
+
(I'm on Rails Edge)
|
47
|
+
|
48
|
+
-- linoj
|
49
|
+
|
50
|
+
|
51
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
Index: lib/fixture_replacement/fixture_replacement.rb
|
2
|
+
===================================================================
|
3
|
+
--- lib/fixture_replacement/fixture_replacement.rb (revision 1151)
|
4
|
+
+++ lib/fixture_replacement/fixture_replacement.rb (working copy)
|
5
|
+
@@ -40,7 +40,8 @@
|
6
|
+
def merge_unevaluated_method(obj, method_for_instantiation, hash={})
|
7
|
+
hash.each do |key, value|
|
8
|
+
if value.kind_of?(::FixtureReplacement::DelayedEvaluationProc)
|
9
|
+
- hash[key] = obj.send("#{method_for_instantiation}_#{value.call}")
|
10
|
+
+ model_name, args = value.call
|
11
|
+
+ hash[key] = obj.send("#{method_for_instantiation}_#{model_name}", args)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
@@ -63,9 +64,9 @@
|
16
|
+
default_method = "default_#{model_name}".to_sym
|
17
|
+
|
18
|
+
fixture_module.module_eval do
|
19
|
+
- define_method(default_method) do
|
20
|
+
+ define_method(default_method) do |*args|
|
21
|
+
::FixtureReplacement::DelayedEvaluationProc.new do
|
22
|
+
- model_as_string
|
23
|
+
+ [model_as_string, args[0]]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,396 @@
|
|
1
|
+
Index: spec/fixture_replacement/fixture_replacement_spec.rb
|
2
|
+
===================================================================
|
3
|
+
--- spec/fixture_replacement/fixture_replacement_spec.rb (revision 31)
|
4
|
+
+++ spec/fixture_replacement/fixture_replacement_spec.rb (working copy)
|
5
|
+
@@ -1,53 +1,52 @@
|
6
|
+
-
|
7
|
+
require File.dirname(__FILE__) + "/../spec_helper"
|
8
|
+
+require 'activesupport'
|
9
|
+
+require 'activerecord'
|
10
|
+
|
11
|
+
-# It would be better if these things were actual mocks/stubs
|
12
|
+
-# of ActiveRecord Classes.
|
13
|
+
-class ARBase
|
14
|
+
- class << self
|
15
|
+
- def create!(h={})
|
16
|
+
- obj = new(h)
|
17
|
+
- obj.save!
|
18
|
+
- obj
|
19
|
+
- end
|
20
|
+
+ActiveRecord::Base.establish_connection :adapter => 'sqlite3', :database => ':memory:'
|
21
|
+
+class User < ActiveRecord::Base
|
22
|
+
+ belongs_to :gender
|
23
|
+
+ attr_accessor :saved
|
24
|
+
+ def save!
|
25
|
+
+ @saved = true
|
26
|
+
end
|
27
|
+
+end
|
28
|
+
+class Gender < ActiveRecord::Base
|
29
|
+
+ attr_accessor :saved
|
30
|
+
+ def save!
|
31
|
+
+ @saved = true
|
32
|
+
+ end
|
33
|
+
+end
|
34
|
+
+class Alien < ActiveRecord::Base
|
35
|
+
+ belongs_to :gender
|
36
|
+
+end
|
37
|
+
|
38
|
+
- def initialize(hash={})
|
39
|
+
- @hash = hash
|
40
|
+
+ActiveRecord::Schema.define do
|
41
|
+
+ create_table :users do |t|
|
42
|
+
+ t.string :key
|
43
|
+
+ t.string :other_key
|
44
|
+
+ t.integer :gender_id
|
45
|
+
end
|
46
|
+
-
|
47
|
+
- attr_reader :hash
|
48
|
+
-
|
49
|
+
- def gender # this would be a has_many call in rails
|
50
|
+
- 17
|
51
|
+
+ create_table :genders do |t|
|
52
|
+
+ t.string :sex
|
53
|
+
end
|
54
|
+
-
|
55
|
+
- def save!
|
56
|
+
- @saved = true
|
57
|
+
+ create_table :aliens do |t|
|
58
|
+
+ t.integer :gender_id
|
59
|
+
end
|
60
|
+
-
|
61
|
+
- def saved?
|
62
|
+
- @saved || false
|
63
|
+
- end
|
64
|
+
-
|
65
|
+
end
|
66
|
+
|
67
|
+
-class User < ARBase; end
|
68
|
+
-class Gender < ARBase; end
|
69
|
+
-class Alien < ARBase; end
|
70
|
+
+include FixtureReplacement
|
71
|
+
|
72
|
+
-
|
73
|
+
module FixtureReplacement
|
74
|
+
describe Generator, "creation" do
|
75
|
+
before :each do
|
76
|
+
@generator = Generator.new("user")
|
77
|
+
end
|
78
|
+
|
79
|
+
- it "should take a lowecase-model name as it's paramaters" do
|
80
|
+
+ it "should take a lowercase-model name as its paramaters" do
|
81
|
+
@generator.model_name.should == "user"
|
82
|
+
end
|
83
|
+
|
84
|
+
- it "should be able to take tell the name of model in string" do
|
85
|
+
+ it "should be able to take tell the name of model in string" do
|
86
|
+
@generator.model_name.to_s.should == "user"
|
87
|
+
end
|
88
|
+
|
89
|
+
@@ -84,16 +83,11 @@
|
90
|
+
FixtureReplacement.module_eval do
|
91
|
+
def user_attributes
|
92
|
+
{
|
93
|
+
- :key => :val
|
94
|
+
+ :key => "val"
|
95
|
+
}
|
96
|
+
end
|
97
|
+
end
|
98
|
+
@generator = Generator.new("user")
|
99
|
+
-
|
100
|
+
- @class = Class.new do
|
101
|
+
- include FixtureReplacement
|
102
|
+
- end
|
103
|
+
- @instance = @class.new
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should generate the method default_user in the module" do
|
107
|
+
@@ -103,45 +97,34 @@
|
108
|
+
|
109
|
+
it "should return a ::FixtureReplacement::DelayedEvaluationProc" do
|
110
|
+
@generator.generate_default_method
|
111
|
+
- @instance.default_user.class.should == ::FixtureReplacement::DelayedEvaluationProc
|
112
|
+
+ default_user.class.should == ::FixtureReplacement::DelayedEvaluationProc
|
113
|
+
end
|
114
|
+
|
115
|
+
it %(should return the special proc, which in turn should return an array
|
116
|
+
of the name of the model ('user') if no params were given) do
|
117
|
+
@generator.generate_default_method
|
118
|
+
- @instance.default_user.call.should == ["user"]
|
119
|
+
+ default_user.call.should == ["user"]
|
120
|
+
end
|
121
|
+
|
122
|
+
it %(should return the special proc, which in turn should return an array
|
123
|
+
of the name of the model ('user') and the params given) do
|
124
|
+
@generator.generate_default_method
|
125
|
+
- @instance.default_user({:some => :hash}).call.should == ["user", {:some => :hash}]
|
126
|
+
+ default_user({:key => "hash"}).call.should == ["user", {:key => "hash"}]
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe Generator, "generate_create_method for User when user_attributes is defined (and valid)" do
|
131
|
+
- before :each do
|
132
|
+
- User.class_eval do
|
133
|
+
- def save!
|
134
|
+
- @saved = true
|
135
|
+
- end
|
136
|
+
- end
|
137
|
+
-
|
138
|
+
+ before :each do
|
139
|
+
FixtureReplacement.module_eval do
|
140
|
+
def user_attributes
|
141
|
+
{
|
142
|
+
- :key => :val
|
143
|
+
+ :key => "val"
|
144
|
+
}
|
145
|
+
end
|
146
|
+
end
|
147
|
+
@generator = Generator.new("user")
|
148
|
+
@generator.generate_new_method
|
149
|
+
@generator.generate_create_method
|
150
|
+
-
|
151
|
+
- @class = Class.new do
|
152
|
+
- include FixtureReplacement
|
153
|
+
- end
|
154
|
+
- @instance = @class.new
|
155
|
+
end
|
156
|
+
|
157
|
+
it "should generate the method create_user in the module" do
|
158
|
+
@@ -150,38 +133,32 @@
|
159
|
+
|
160
|
+
it "should generate the method create_user which takes one parameter - a hash" do
|
161
|
+
@generator.generate_create_method
|
162
|
+
- @instance.create_user({:key => :value})
|
163
|
+
+ create_user({:key => "value"})
|
164
|
+
end
|
165
|
+
|
166
|
+
it "should return a user" do
|
167
|
+
@generator.generate_create_method
|
168
|
+
- @instance.create_user.should be_a_kind_of(User)
|
169
|
+
+ create_user.should be_a_kind_of(User)
|
170
|
+
end
|
171
|
+
|
172
|
+
- it "should return a user which has been saved (with create!)" do
|
173
|
+
+ it "should return a user which has been saved (with save!)" do
|
174
|
+
@generator.generate_create_method
|
175
|
+
- @instance.create_user.should be_saved
|
176
|
+
+ create_user.saved.should == true
|
177
|
+
end
|
178
|
+
|
179
|
+
it "should overwrite the hash parameters given" do
|
180
|
+
@generator.generate_create_method
|
181
|
+
- @instance.create_user(:key => :value).hash.should == {:key => :value}
|
182
|
+
+ create_user(:key => "value").key.should == "value"
|
183
|
+
end
|
184
|
+
|
185
|
+
it "should not overwrite the default hash parameters, if none are given" do
|
186
|
+
@generator.generate_create_method
|
187
|
+
- @instance.create_user.hash.should == {:key => :val}
|
188
|
+
+ create_user.key.should == "val"
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
describe Generator, "generate_create_method for User when user_attributes is defined (and valid)" do
|
193
|
+
before :each do
|
194
|
+
- User.class_eval do
|
195
|
+
- def save!
|
196
|
+
- @saved = true
|
197
|
+
- end
|
198
|
+
- end
|
199
|
+
-
|
200
|
+
FixtureReplacement.module_eval do
|
201
|
+
def user_attributes
|
202
|
+
{
|
203
|
+
@@ -203,60 +180,40 @@
|
204
|
+
@generator = Generator.new("user")
|
205
|
+
@generator.generate_new_method
|
206
|
+
@generator.generate_create_method
|
207
|
+
-
|
208
|
+
- @class = Class.new do
|
209
|
+
- include FixtureReplacement
|
210
|
+
- end
|
211
|
+
- @instance = @class.new
|
212
|
+
end
|
213
|
+
|
214
|
+
it "should save the associated join models which have a default_* method (if it is not overwritten)" do
|
215
|
+
- created_user = @instance.create_user
|
216
|
+
- created_gender = created_user.hash[:gender]
|
217
|
+
- created_gender.hash.should == {:sex => "Male"}
|
218
|
+
+ created_gender = create_user.gender
|
219
|
+
+ created_gender.sex.should == "Male"
|
220
|
+
end
|
221
|
+
|
222
|
+
it "should not save the associated join model, but not as the default_* method (in the case that it is overwritten)" do
|
223
|
+
- created_user = @instance.create_user(:gender => Gender.create!(:sex => "Female"))
|
224
|
+
- created_gender = created_user.hash[:gender]
|
225
|
+
- created_gender.hash.should == {:sex => "Female"}
|
226
|
+
+ created_user = create_user(:gender => Gender.create!(:sex => "Female"))
|
227
|
+
+ created_gender = created_user.gender
|
228
|
+
+ created_gender.sex.should == "Female"
|
229
|
+
end
|
230
|
+
|
231
|
+
- it "should call Gender.create! when the default_gender method is evaluated by default_gender" do
|
232
|
+
- gender = Gender.new
|
233
|
+
- Gender.should_receive(:create!).and_return gender
|
234
|
+
- @instance.create_user
|
235
|
+
+ it "should call Gender.save! when the default_gender method is evaluated by default_gender" do
|
236
|
+
+ create_user.gender.saved.should == true
|
237
|
+
end
|
238
|
+
|
239
|
+
- it "should not call Gender.create! if the default_gender is overwritten by another value (say, a string)" do
|
240
|
+
- Gender.should_not_receive(:create!)
|
241
|
+
- @instance.create_user(:gender => "a string")
|
242
|
+
+ it "should not call Gender.save! if the default_gender is overwritten by another value" do
|
243
|
+
+ create_user(:gender => Gender.new).gender.saved.should_not == true
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
describe Generator, "generate_create_method for User when user_attributes is defined, but not valid" do
|
248
|
+
- before :each do
|
249
|
+
- User.class_eval do
|
250
|
+
- def save!
|
251
|
+
- @saved = true
|
252
|
+
- end
|
253
|
+
- end
|
254
|
+
-
|
255
|
+
+ before :each do
|
256
|
+
FixtureReplacement.module_eval do
|
257
|
+
def user_attributes
|
258
|
+
{
|
259
|
+
- :key => :val
|
260
|
+
+ :key => "val"
|
261
|
+
}
|
262
|
+
end
|
263
|
+
end
|
264
|
+
@generator = Generator.new("user")
|
265
|
+
@generator.generate_new_method
|
266
|
+
@generator.generate_create_method
|
267
|
+
-
|
268
|
+
- @class = Class.new do
|
269
|
+
- include FixtureReplacement
|
270
|
+
- end
|
271
|
+
- @instance = @class.new
|
272
|
+
end
|
273
|
+
|
274
|
+
it "should generate the method create_user in the module" do
|
275
|
+
@@ -265,22 +222,9 @@
|
276
|
+
|
277
|
+
it "should generate the method create_user which takes one parameter - a hash" do
|
278
|
+
@generator.generate_create_method
|
279
|
+
- @instance.create_user({:key => :value})
|
280
|
+
+ create_user({:key => "value"})
|
281
|
+
end
|
282
|
+
|
283
|
+
- it "should raise an error with a user which has been saved (with create!)" do
|
284
|
+
- User.class_eval do
|
285
|
+
- def save!
|
286
|
+
- raise
|
287
|
+
- end
|
288
|
+
- end
|
289
|
+
-
|
290
|
+
- @generator.generate_create_method
|
291
|
+
- lambda {
|
292
|
+
- @instance.create_user
|
293
|
+
- }.should raise_error
|
294
|
+
- end
|
295
|
+
-
|
296
|
+
end
|
297
|
+
|
298
|
+
describe Generator, "generate_new_method for User when user_attributes is defined" do
|
299
|
+
@@ -290,7 +234,7 @@
|
300
|
+
FixtureReplacement.module_eval do
|
301
|
+
def user_attributes
|
302
|
+
{
|
303
|
+
- :key => :val
|
304
|
+
+ :key => "val"
|
305
|
+
}
|
306
|
+
end
|
307
|
+
|
308
|
+
@@ -302,12 +246,6 @@
|
309
|
+
end
|
310
|
+
@generator = Generator.new("user")
|
311
|
+
@generator.generate_new_method
|
312
|
+
-
|
313
|
+
- @class = Class.new do
|
314
|
+
- include FixtureReplacement
|
315
|
+
- end
|
316
|
+
- @instance = @class.new
|
317
|
+
-
|
318
|
+
end
|
319
|
+
|
320
|
+
it "should respond to new_user in the module" do
|
321
|
+
@@ -316,19 +254,21 @@
|
322
|
+
|
323
|
+
it "should return a new User object" do
|
324
|
+
User.stub!(:new).and_return @user
|
325
|
+
- @instance.new_user.should == @user
|
326
|
+
+ new_user.should == @user
|
327
|
+
end
|
328
|
+
|
329
|
+
it "should return a new User object with the keys given in user_attributes" do
|
330
|
+
- @instance.new_user.hash.should == {:key => :val}
|
331
|
+
+ new_user.key.should == "val"
|
332
|
+
end
|
333
|
+
|
334
|
+
it "should over-write the User's hash with any hash given to new_user" do
|
335
|
+
- @instance.new_user(:key => :other_value).hash.should == {:key => :other_value}
|
336
|
+
+ new_user(:key => "other_value").key.should == "other_value"
|
337
|
+
end
|
338
|
+
|
339
|
+
it "should add any hash key-value pairs which weren't previously given in user_attributes" do
|
340
|
+
- @instance.new_user(:other_key => :other_value).hash.should == {:key => :val, :other_key => :other_value}
|
341
|
+
+ u = new_user(:other_key => "other_value")
|
342
|
+
+ u.key.should == "val"
|
343
|
+
+ u.other_key.should == "other_value"
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
347
|
+
@@ -365,39 +305,30 @@
|
348
|
+
|
349
|
+
@generator = Generator.new("alien")
|
350
|
+
@generator.generate_new_method
|
351
|
+
-
|
352
|
+
- @class = Class.new do
|
353
|
+
- include FixtureReplacement
|
354
|
+
- end
|
355
|
+
- @instance = @class.new
|
356
|
+
end
|
357
|
+
|
358
|
+
it "should evaluate any of the default_* methods before returning (if no over-writing key is given)" do
|
359
|
+
- new_user = @instance.new_user
|
360
|
+
- new_gender = new_user.hash[:gender]
|
361
|
+
- new_gender.hash.should == {:sex => "Male"}
|
362
|
+
+ new_gender = new_user.gender
|
363
|
+
+ new_gender.sex.should == "Male"
|
364
|
+
end
|
365
|
+
|
366
|
+
it %(should evaluate any of the default_* methods before returning, with the hash params given to default_* method) do
|
367
|
+
- new_alien = @instance.new_alien
|
368
|
+
- new_gender = new_alien.hash[:gender]
|
369
|
+
- new_gender.hash.should == {:sex => "unknown"}
|
370
|
+
+ new_gender = new_alien.gender
|
371
|
+
+ new_gender.sex.should == "unknown"
|
372
|
+
end
|
373
|
+
|
374
|
+
it "should call Gender.save! when the default_gender method is evaluated by default_gender" do
|
375
|
+
- Gender.should_receive(:create!)
|
376
|
+
- @instance.new_user
|
377
|
+
+ new_user.gender.saved.should == true
|
378
|
+
end
|
379
|
+
|
380
|
+
- it "should not call Gender.new if the default_gender is overwritten by another value (say, a string)" do
|
381
|
+
- Gender.should_not_receive(:create!)
|
382
|
+
- @instance.new_user(:gender => "a string")
|
383
|
+
+ it "should not call Gender.new if the default_gender is overwritten by another value" do
|
384
|
+
+ new_user(:gender => Gender.new).gender.saved.should_not == true
|
385
|
+
end
|
386
|
+
|
387
|
+
it "should be able to overwrite a default_* method" do
|
388
|
+
- new_user = @instance.new_user(:gender => Gender.create!(:sex => "Female"))
|
389
|
+
- created_gender = new_user.hash[:gender]
|
390
|
+
- created_gender.hash.should == {:sex => "Female"}
|
391
|
+
+ new_user = new_user(:gender => Gender.create!(:sex => "Female"))
|
392
|
+
+ created_gender = new_user.gender
|
393
|
+
+ created_gender.sex.should == "Female"
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|