fixture_replacement 3.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|