pickle 0.1.23 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +32 -0
- data/Todo.txt +1 -2
- data/VERSION +1 -1
- data/features/generator/generators.feature +4 -5
- data/features/pickle/create_from_active_record.feature +17 -1
- data/features/pickle/create_from_factory_girl.feature +9 -2
- data/features/step_definitions/email_steps.rb +5 -4
- data/features/step_definitions/generator_steps.rb +2 -2
- data/features/step_definitions/pickle_steps.rb +23 -12
- data/features/support/email.rb +21 -0
- data/lib/pickle/path.rb +9 -8
- data/lib/pickle/session.rb +8 -3
- data/lib/pickle/session/parser.rb +10 -0
- data/pickle.gemspec +4 -2
- data/rails_generators/pickle/pickle_generator.rb +1 -0
- data/rails_generators/pickle/templates/email.rb +21 -0
- data/rails_generators/pickle/templates/email_steps.rb +5 -4
- data/rails_generators/pickle/templates/pickle_steps.rb +23 -12
- data/spec/lib/pickle_path_spec.rb +64 -49
- data/spec/lib/pickle_session_spec.rb +29 -0
- metadata +4 -2
data/History.txt
CHANGED
@@ -1,3 +1,35 @@
|
|
1
|
+
== 0.2.0 - 24 Nov 2009
|
2
|
+
|
3
|
+
* 4 major improvements
|
4
|
+
* Added support for finding models using tables
|
5
|
+
Example:
|
6
|
+
Then the following users should exist:
|
7
|
+
| name |
|
8
|
+
| Fred |
|
9
|
+
| Ethel |
|
10
|
+
And the 1st user should be male
|
11
|
+
And the 2nd user should be female
|
12
|
+
|
13
|
+
* tables now support pickle refs in cells (see features/pickle/create_from_factory_girl.rb#37)
|
14
|
+
|
15
|
+
* features/support/email.rb adds an email helper for mapping names to email addresses (similar to NavigationHelper in paths.rb)
|
16
|
+
|
17
|
+
* Added ability for path_to_pickle to handle arbitrary segments
|
18
|
+
Example:
|
19
|
+
path_to_pickle('account', 'the enquiry') => account_enquiry_path(<enquiry>)
|
20
|
+
|
21
|
+
* 2 minor improvements
|
22
|
+
* fail faster in pickle steps when a pickle ref can't be found, by using model! in most places
|
23
|
+
|
24
|
+
* generated pickle steps are less picky about possessives so that pickle mappings accepted in more places
|
25
|
+
e.g. when you have
|
26
|
+
config.map 'my', 'I', 'myself', :to => 'user: "me"'
|
27
|
+
you can now do
|
28
|
+
Given I exist
|
29
|
+
...
|
30
|
+
Then the project should be one of my assigned projects
|
31
|
+
|
32
|
+
|
1
33
|
== 0.1.23 - 22 Nov 2009
|
2
34
|
|
3
35
|
* 1 major improvement
|
data/Todo.txt
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
*
|
1
|
+
* cleanup path_to_pickle and paths.rb (maybe have poly_pickle_path with same semantics as polymorphic_path, but accepting pickle refs)
|
2
2
|
* fix problem with save_and_open_emails
|
3
3
|
* Translations
|
4
|
-
* Investigate using Treetop for pre-parsing
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
@@ -1,13 +1,9 @@
|
|
1
|
+
@gen
|
1
2
|
Feature: allow pickle to generate steps
|
2
3
|
In order to get going with pickle
|
3
4
|
As a dev
|
4
5
|
I want to be able to generate steps
|
5
6
|
|
6
|
-
# Do we care anymore?
|
7
|
-
# Scenario: cucumber is not yet installed
|
8
|
-
# When I run "script/generate pickle"
|
9
|
-
# Then I should see "try running script/generate cucumber"
|
10
|
-
|
11
7
|
Scenario: script/generate pickle on fresh cuke install
|
12
8
|
Given cucumber has been freshly generated
|
13
9
|
When I run "script/generate pickle"
|
@@ -32,6 +28,7 @@ Feature: allow pickle to generate steps
|
|
32
28
|
And the file features/support/pickle.rb should match /require 'pickle\/email\/world'/
|
33
29
|
And the file features/step_definitions/pickle_steps.rb should be identical to the local step_definitions/pickle_steps.rb
|
34
30
|
And the file features/step_definitions/email_steps.rb should be identical to the local step_definitions/email_steps.rb
|
31
|
+
And the file features/support/email.rb should be identical to the local support/email.rb
|
35
32
|
|
36
33
|
Scenario: script/generate pickle path email on fresh cuke install
|
37
34
|
Given cucumber has been freshly generated
|
@@ -44,6 +41,7 @@ Feature: allow pickle to generate steps
|
|
44
41
|
And the file features/step_definitions/pickle_steps.rb should be identical to the local step_definitions/pickle_steps.rb
|
45
42
|
And the file features/support/paths.rb should be identical to the local support/paths.rb
|
46
43
|
And the file features/step_definitions/email_steps.rb should be identical to the local step_definitions/email_steps.rb
|
44
|
+
And the file features/support/email.rb should be identical to the local support/email.rb
|
47
45
|
|
48
46
|
Scenario: regenerating pickle
|
49
47
|
Given cucumber has been freshly generated
|
@@ -58,3 +56,4 @@ Feature: allow pickle to generate steps
|
|
58
56
|
But the file features/support/pickle.rb should not match /require 'pickle\/world'.*require 'pickle\/world'/
|
59
57
|
And the file features/support/pickle.rb should not match /require 'pickle\/path\/world'.*require 'pickle\/path\/world'/
|
60
58
|
And the file features/support/pickle.rb should not match /require 'pickle\/email\/world'.*require 'pickle\/email\/world'/
|
59
|
+
And the file features/support/email.rb should be identical to the local support/email.rb
|
@@ -24,4 +24,20 @@ Feature: I can easily create models from my blueprints
|
|
24
24
|
And another user exists with name: "Ethel", attitude_score: -1.46
|
25
25
|
Then 2 users should exist
|
26
26
|
And the 1st user should be a positive person
|
27
|
-
And the 2nd user should not be a positive person
|
27
|
+
And the 2nd user should not be a positive person
|
28
|
+
|
29
|
+
Scenario: create and find using tables
|
30
|
+
Given the following users exist:
|
31
|
+
| name | status |
|
32
|
+
| Jim | married |
|
33
|
+
| Ethel | in a relationship with x |
|
34
|
+
Then the following users should exist:
|
35
|
+
| name |
|
36
|
+
| Jim |
|
37
|
+
| Ethel |
|
38
|
+
And the following users should exist:
|
39
|
+
| status |
|
40
|
+
| married |
|
41
|
+
| in a relationship with x |
|
42
|
+
And the 1st user should be the 3rd user
|
43
|
+
And the 2nd user should be the last user
|
@@ -39,8 +39,15 @@ Feature: I can easily create models from my factories
|
|
39
39
|
And a tine exists with fork: the fork
|
40
40
|
|
41
41
|
Then a tine should exist with fork: the fork
|
42
|
-
|
43
|
-
|
42
|
+
|
43
|
+
Scenario: create a tine with fork refs in a table
|
44
|
+
Given 2 forks exist
|
45
|
+
And the following tines exist:
|
46
|
+
| fork |
|
47
|
+
| the 1st fork |
|
48
|
+
| the 2nd fork |
|
49
|
+
Then the 1st tine should be in the 1st fork's tines
|
50
|
+
And the 2nd tine should be in the 2nd fork's tines
|
44
51
|
|
45
52
|
Scenario: I create fork via a mapping
|
46
53
|
Given killah fork exists
|
@@ -1,4 +1,6 @@
|
|
1
1
|
# this file generated by script/generate pickle email
|
2
|
+
#
|
3
|
+
# add email mappings in features/support/email.rb
|
2
4
|
|
3
5
|
ActionMailer::Base.delivery_method = :test
|
4
6
|
ActionMailer::Base.perform_deliveries = true
|
@@ -7,6 +9,7 @@ Before do
|
|
7
9
|
ActionMailer::Base.deliveries.clear
|
8
10
|
end
|
9
11
|
|
12
|
+
# Clear the deliveries array, useful if your background sends email that you want to ignore
|
10
13
|
Given(/^all emails? (?:have|has) been delivered$/) do
|
11
14
|
ActionMailer::Base.deliveries.clear
|
12
15
|
end
|
@@ -16,8 +19,7 @@ Given(/^(\d)+ emails? should be delivered$/) do |count|
|
|
16
19
|
end
|
17
20
|
|
18
21
|
Then(/^(\d)+ emails? should be delivered to (.*)$/) do |count, to|
|
19
|
-
to
|
20
|
-
emails("to: \"#{to}\"").size.should == count.to_i
|
22
|
+
emails("to: \"#{email_for(to)}\"").size.should == count.to_i
|
21
23
|
end
|
22
24
|
|
23
25
|
Then(/^(\d)+ emails? should be delivered with #{capture_fields}$/) do |count, fields|
|
@@ -25,8 +27,7 @@ Then(/^(\d)+ emails? should be delivered with #{capture_fields}$/) do |count, fi
|
|
25
27
|
end
|
26
28
|
|
27
29
|
Then(/^#{capture_email} should be delivered to (.+)$/) do |email_ref, to|
|
28
|
-
to
|
29
|
-
email(email_ref, "to: \"#{to}\"").should_not be_nil
|
30
|
+
email(email_ref, "to: \"#{email_for(to)}\"").should_not be_nil
|
30
31
|
end
|
31
32
|
|
32
33
|
Then(/^#{capture_email} should have #{capture_fields}$/) do |email_ref, fields|
|
@@ -11,14 +11,14 @@ Given(/^(\d+) #{capture_plural_factory} exist(?: with #{capture_fields})?$/) do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
# create models from a table
|
14
|
-
Given
|
14
|
+
Given(/^the following #{capture_plural_factory} exists?:?$/) do |plural_factory, table|
|
15
15
|
name = plural_factory.singularize
|
16
16
|
table.hashes.each { |hash| create_model(name, hash) }
|
17
17
|
end
|
18
18
|
|
19
19
|
# find a model
|
20
20
|
Then(/^#{capture_model} should exist(?: with #{capture_fields})?$/) do |name, fields|
|
21
|
-
find_model(name, fields)
|
21
|
+
find_model!(name, fields)
|
22
22
|
end
|
23
23
|
|
24
24
|
# not find a model
|
@@ -26,37 +26,48 @@ Then(/^#{capture_model} should not exist(?: with #{capture_fields})?$/) do |name
|
|
26
26
|
find_model(name, fields).should be_nil
|
27
27
|
end
|
28
28
|
|
29
|
+
# find models with a table
|
30
|
+
Then(/^the following #{capture_plural_factory} should exists?:?$/) do |plural_factory, table|
|
31
|
+
name = plural_factory.singularize
|
32
|
+
table.hashes.each { |hash| find_model!(name, hash)}
|
33
|
+
end
|
34
|
+
|
29
35
|
# find exactly n models
|
30
36
|
Then(/^(\d+) #{capture_plural_factory} should exist(?: with #{capture_fields})?$/) do |count, plural_factory, fields|
|
31
37
|
find_models(plural_factory.singularize, fields).size.should == count.to_i
|
32
38
|
end
|
33
39
|
|
40
|
+
# assert equality of models
|
41
|
+
Then(/^#{capture_model} should be #{capture_model}$/) do |a, b|
|
42
|
+
model!(a).should == model!(b)
|
43
|
+
end
|
44
|
+
|
34
45
|
# assert model is in another model's has_many assoc
|
35
|
-
Then(/^#{capture_model} should be (?:in|one of|amongst) #{capture_model}'s (\w+)$/) do |target, owner, association|
|
36
|
-
model(owner).send(association).should include(model(target))
|
46
|
+
Then(/^#{capture_model} should be (?:in|one of|amongst) #{capture_model}(?:'s)? (\w+)$/) do |target, owner, association|
|
47
|
+
model!(owner).send(association).should include(model!(target))
|
37
48
|
end
|
38
49
|
|
39
50
|
# assert model is not in another model's has_many assoc
|
40
|
-
Then(/^#{capture_model} should not be (?:in|one of|amongst) #{capture_model}'s (\w+)$/) do |target, owner, association|
|
41
|
-
model(owner).send(association).should_not include(model(target))
|
51
|
+
Then(/^#{capture_model} should not be (?:in|one of|amongst) #{capture_model}(?:'s)? (\w+)$/) do |target, owner, association|
|
52
|
+
model!(owner).send(association).should_not include(model!(target))
|
42
53
|
end
|
43
54
|
|
44
55
|
# assert model is another model's has_one/belongs_to assoc
|
45
|
-
Then(/^#{capture_model} should be #{capture_model}'s (\w+)$/) do |target, owner, association|
|
46
|
-
model(owner).send(association).should == model(target)
|
56
|
+
Then(/^#{capture_model} should be #{capture_model}(?:'s)? (\w+)$/) do |target, owner, association|
|
57
|
+
model!(owner).send(association).should == model!(target)
|
47
58
|
end
|
48
59
|
|
49
60
|
# assert model is not another model's has_one/belongs_to assoc
|
50
|
-
Then(/^#{capture_model} should not be #{capture_model}'s (\w+)$/) do |target, owner, association|
|
51
|
-
model(owner).send(association).should_not == model(target)
|
61
|
+
Then(/^#{capture_model} should not be #{capture_model}(?:'s)? (\w+)$/) do |target, owner, association|
|
62
|
+
model!(owner).send(association).should_not == model!(target)
|
52
63
|
end
|
53
64
|
|
54
65
|
# assert model.predicate?
|
55
66
|
Then(/^#{capture_model} should (?:be|have) (?:an? )?#{capture_predicate}$/) do |name, predicate|
|
56
|
-
model(name).should send("be_#{predicate.gsub(' ', '_')}")
|
67
|
+
model!(name).should send("be_#{predicate.gsub(' ', '_')}")
|
57
68
|
end
|
58
69
|
|
59
70
|
# assert not model.predicate?
|
60
71
|
Then(/^#{capture_model} should not (?:be|have) (?:an? )?#{capture_predicate}$/) do |name, predicate|
|
61
|
-
model(name).should_not send("be_#{predicate.gsub(' ', '_')}")
|
72
|
+
model!(name).should_not send("be_#{predicate.gsub(' ', '_')}")
|
62
73
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module EmailHelpers
|
2
|
+
# Maps a name to an email address. Used by email_steps
|
3
|
+
|
4
|
+
def email_for(to)
|
5
|
+
case to
|
6
|
+
|
7
|
+
# add your own name => email address mappings here
|
8
|
+
|
9
|
+
when /^#{capture_model}$/
|
10
|
+
model($1).email
|
11
|
+
|
12
|
+
when /^"(.*)"$/
|
13
|
+
$1
|
14
|
+
|
15
|
+
else
|
16
|
+
to
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
World(EmailHelpers)
|
data/lib/pickle/path.rb
CHANGED
@@ -13,31 +13,32 @@ module Pickle
|
|
13
13
|
# path_to_pickle 'the user', :extra => 'new comment' # => /users/3/comments/new
|
14
14
|
def path_to_pickle(*pickle_names)
|
15
15
|
options = pickle_names.extract_options!
|
16
|
-
|
16
|
+
resources = pickle_names.map{|n| model(n) || n.to_sym}
|
17
17
|
if options[:extra]
|
18
18
|
parts = options[:extra].underscore.gsub(' ','_').split("_")
|
19
|
-
find_pickle_path_using_action_segment_combinations(
|
19
|
+
find_pickle_path_using_action_segment_combinations(resources, parts)
|
20
20
|
else
|
21
|
-
|
21
|
+
pickle_path_for_resources_action_segment(resources, options[:action], options[:segment])
|
22
22
|
end or raise "Could not figure out a path for #{pickle_names.inspect} #{options.inspect}"
|
23
23
|
end
|
24
24
|
|
25
25
|
protected
|
26
|
-
def find_pickle_path_using_action_segment_combinations(
|
26
|
+
def find_pickle_path_using_action_segment_combinations(resources, parts)
|
27
27
|
path = nil
|
28
28
|
(0..parts.length).each do |idx|
|
29
29
|
action = parts.slice(0, idx).join('_')
|
30
30
|
segment = parts.slice(idx, parts.length).join('_')
|
31
|
-
path =
|
31
|
+
path = pickle_path_for_resources_action_segment(resources, action, segment) and break
|
32
32
|
end
|
33
33
|
path
|
34
34
|
end
|
35
35
|
|
36
|
-
def
|
36
|
+
def pickle_path_for_resources_action_segment(resources, action, segment)
|
37
37
|
action.blank? or action = action.downcase.gsub(' ','_')
|
38
38
|
segment.blank? or segment = segment.downcase.gsub(' ','_')
|
39
|
-
|
40
|
-
|
39
|
+
resource_names = resources.map{|s| s.is_a?(Symbol) ? s.to_s : s.class.name.underscore}.join("_")
|
40
|
+
models = resources.reject{|s| s.is_a?(Symbol)}
|
41
|
+
parts = [action, resource_names, segment].reject(&:blank?)
|
41
42
|
send("#{parts.join('_')}_path", *models) rescue nil
|
42
43
|
end
|
43
44
|
end
|
data/lib/pickle/session.rb
CHANGED
@@ -23,7 +23,7 @@ module Pickle
|
|
23
23
|
def create_model(a_model_name, fields = nil)
|
24
24
|
factory, label = *parse_model(a_model_name)
|
25
25
|
raise ArgumentError, "Can't create with an ordinal (e.g. 1st user)" if label.is_a?(Integer)
|
26
|
-
fields = fields.
|
26
|
+
fields = fields.is_a?(Hash) ? parse_hash(fields) : parse_fields(fields)
|
27
27
|
record = pickle_config.factories[factory].create(fields)
|
28
28
|
store_model(factory, label, record)
|
29
29
|
end
|
@@ -32,11 +32,16 @@ module Pickle
|
|
32
32
|
factory, name = *parse_model(a_model_name)
|
33
33
|
raise ArgumentError, "Can't find a model with an ordinal (e.g. 1st user)" if name.is_a?(Integer)
|
34
34
|
model_class = pickle_config.factories[factory].klass
|
35
|
-
|
35
|
+
fields = fields.is_a?(Hash) ? parse_hash(fields) : parse_fields(fields)
|
36
|
+
if record = model_class.find(:first, :conditions => convert_models_to_attributes(model_class, fields))
|
36
37
|
store_model(factory, name, record)
|
37
38
|
end
|
38
39
|
end
|
39
40
|
|
41
|
+
def find_model!(a_model_name, fields = nil)
|
42
|
+
find_model(a_model_name, fields) or raise "Can't find pickle model: '#{name}' in this scenario"
|
43
|
+
end
|
44
|
+
|
40
45
|
def find_models(factory, fields = nil)
|
41
46
|
models_by_index(factory).clear
|
42
47
|
model_class = pickle_config.factories[factory].klass
|
@@ -53,7 +58,7 @@ module Pickle
|
|
53
58
|
elsif name_or_index.is_a?(Integer)
|
54
59
|
models_by_index(factory)[name_or_index]
|
55
60
|
else
|
56
|
-
models_by_name(factory)[name_or_index] or raise "model: #{name}
|
61
|
+
models_by_name(factory)[name_or_index] or raise "Can't find pickle model: '#{name}' in this scenario"
|
57
62
|
end
|
58
63
|
end
|
59
64
|
|
@@ -19,6 +19,16 @@ module Pickle
|
|
19
19
|
parse_field_without_model(field)
|
20
20
|
end
|
21
21
|
end
|
22
|
+
|
23
|
+
def parse_hash(hash)
|
24
|
+
hash.inject({}) do |parsed, (key, val)|
|
25
|
+
if session && val =~ /^#{capture_model}$/
|
26
|
+
parsed.merge(key => session.model($1))
|
27
|
+
else
|
28
|
+
parsed.merge(key => val)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
22
32
|
end
|
23
33
|
end
|
24
34
|
end
|
data/pickle.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{pickle}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.2.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Ian White"]
|
12
|
-
s.date = %q{2009-11-
|
12
|
+
s.date = %q{2009-11-24}
|
13
13
|
s.description = %q{Easy model creation and reference in your cucumber features}
|
14
14
|
s.email = %q{ian.w.white@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -41,6 +41,7 @@ Gem::Specification.new do |s|
|
|
41
41
|
"features/step_definitions/generator_steps.rb",
|
42
42
|
"features/step_definitions/path_steps.rb",
|
43
43
|
"features/step_definitions/pickle_steps.rb",
|
44
|
+
"features/support/email.rb",
|
44
45
|
"features/support/env.rb",
|
45
46
|
"features/support/paths.rb",
|
46
47
|
"features/support/pickle.rb",
|
@@ -63,6 +64,7 @@ Gem::Specification.new do |s|
|
|
63
64
|
"lib/pickle/world.rb",
|
64
65
|
"pickle.gemspec",
|
65
66
|
"rails_generators/pickle/pickle_generator.rb",
|
67
|
+
"rails_generators/pickle/templates/email.rb",
|
66
68
|
"rails_generators/pickle/templates/email_steps.rb",
|
67
69
|
"rails_generators/pickle/templates/paths.rb",
|
68
70
|
"rails_generators/pickle/templates/pickle.rb",
|
@@ -30,6 +30,7 @@ class PickleGenerator < Rails::Generator::Base
|
|
30
30
|
if @generate_email_steps
|
31
31
|
pickle_assigns[:pickle_email] = true
|
32
32
|
m.template 'email_steps.rb', File.join('features/step_definitions', 'email_steps.rb')
|
33
|
+
m.template 'email.rb', File.join('features/support', 'email.rb')
|
33
34
|
end
|
34
35
|
|
35
36
|
m.template 'pickle_steps.rb', File.join('features/step_definitions', 'pickle_steps.rb')
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module EmailHelpers
|
2
|
+
# Maps a name to an email address. Used by email_steps
|
3
|
+
|
4
|
+
def email_for(to)
|
5
|
+
case to
|
6
|
+
|
7
|
+
# add your own name => email address mappings here
|
8
|
+
|
9
|
+
when /^#{capture_model}$/
|
10
|
+
model($1).email
|
11
|
+
|
12
|
+
when /^"(.*)"$/
|
13
|
+
$1
|
14
|
+
|
15
|
+
else
|
16
|
+
to
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
World(EmailHelpers)
|
@@ -1,4 +1,6 @@
|
|
1
1
|
# this file generated by script/generate pickle email
|
2
|
+
#
|
3
|
+
# add email mappings in features/support/email.rb
|
2
4
|
|
3
5
|
ActionMailer::Base.delivery_method = :test
|
4
6
|
ActionMailer::Base.perform_deliveries = true
|
@@ -7,6 +9,7 @@ Before do
|
|
7
9
|
ActionMailer::Base.deliveries.clear
|
8
10
|
end
|
9
11
|
|
12
|
+
# Clear the deliveries array, useful if your background sends email that you want to ignore
|
10
13
|
Given(/^all emails? (?:have|has) been delivered$/) do
|
11
14
|
ActionMailer::Base.deliveries.clear
|
12
15
|
end
|
@@ -16,8 +19,7 @@ Given(/^(\d)+ emails? should be delivered$/) do |count|
|
|
16
19
|
end
|
17
20
|
|
18
21
|
Then(/^(\d)+ emails? should be delivered to (.*)$/) do |count, to|
|
19
|
-
to
|
20
|
-
emails("to: \"#{to}\"").size.should == count.to_i
|
22
|
+
emails("to: \"#{email_for(to)}\"").size.should == count.to_i
|
21
23
|
end
|
22
24
|
|
23
25
|
Then(/^(\d)+ emails? should be delivered with #{capture_fields}$/) do |count, fields|
|
@@ -25,8 +27,7 @@ Then(/^(\d)+ emails? should be delivered with #{capture_fields}$/) do |count, fi
|
|
25
27
|
end
|
26
28
|
|
27
29
|
Then(/^#{capture_email} should be delivered to (.+)$/) do |email_ref, to|
|
28
|
-
to
|
29
|
-
email(email_ref, "to: \"#{to}\"").should_not be_nil
|
30
|
+
email(email_ref, "to: \"#{email_for(to)}\"").should_not be_nil
|
30
31
|
end
|
31
32
|
|
32
33
|
Then(/^#{capture_email} should have #{capture_fields}$/) do |email_ref, fields|
|
@@ -11,14 +11,14 @@ Given(/^(\d+) #{capture_plural_factory} exist(?: with #{capture_fields})?$/) do
|
|
11
11
|
end
|
12
12
|
|
13
13
|
# create models from a table
|
14
|
-
Given
|
14
|
+
Given(/^the following #{capture_plural_factory} exists?:?$/) do |plural_factory, table|
|
15
15
|
name = plural_factory.singularize
|
16
16
|
table.hashes.each { |hash| create_model(name, hash) }
|
17
17
|
end
|
18
18
|
|
19
19
|
# find a model
|
20
20
|
Then(/^#{capture_model} should exist(?: with #{capture_fields})?$/) do |name, fields|
|
21
|
-
find_model(name, fields)
|
21
|
+
find_model!(name, fields)
|
22
22
|
end
|
23
23
|
|
24
24
|
# not find a model
|
@@ -26,37 +26,48 @@ Then(/^#{capture_model} should not exist(?: with #{capture_fields})?$/) do |name
|
|
26
26
|
find_model(name, fields).should be_nil
|
27
27
|
end
|
28
28
|
|
29
|
+
# find models with a table
|
30
|
+
Then(/^the following #{capture_plural_factory} should exists?:?$/) do |plural_factory, table|
|
31
|
+
name = plural_factory.singularize
|
32
|
+
table.hashes.each { |hash| find_model!(name, hash)}
|
33
|
+
end
|
34
|
+
|
29
35
|
# find exactly n models
|
30
36
|
Then(/^(\d+) #{capture_plural_factory} should exist(?: with #{capture_fields})?$/) do |count, plural_factory, fields|
|
31
37
|
find_models(plural_factory.singularize, fields).size.should == count.to_i
|
32
38
|
end
|
33
39
|
|
40
|
+
# assert equality of models
|
41
|
+
Then(/^#{capture_model} should be #{capture_model}$/) do |a, b|
|
42
|
+
model!(a).should == model!(b)
|
43
|
+
end
|
44
|
+
|
34
45
|
# assert model is in another model's has_many assoc
|
35
|
-
Then(/^#{capture_model} should be (?:in|one of|amongst) #{capture_model}'s (\w+)$/) do |target, owner, association|
|
36
|
-
model(owner).send(association).should include(model(target))
|
46
|
+
Then(/^#{capture_model} should be (?:in|one of|amongst) #{capture_model}(?:'s)? (\w+)$/) do |target, owner, association|
|
47
|
+
model!(owner).send(association).should include(model!(target))
|
37
48
|
end
|
38
49
|
|
39
50
|
# assert model is not in another model's has_many assoc
|
40
|
-
Then(/^#{capture_model} should not be (?:in|one of|amongst) #{capture_model}'s (\w+)$/) do |target, owner, association|
|
41
|
-
model(owner).send(association).should_not include(model(target))
|
51
|
+
Then(/^#{capture_model} should not be (?:in|one of|amongst) #{capture_model}(?:'s)? (\w+)$/) do |target, owner, association|
|
52
|
+
model!(owner).send(association).should_not include(model!(target))
|
42
53
|
end
|
43
54
|
|
44
55
|
# assert model is another model's has_one/belongs_to assoc
|
45
|
-
Then(/^#{capture_model} should be #{capture_model}'s (\w+)$/) do |target, owner, association|
|
46
|
-
model(owner).send(association).should == model(target)
|
56
|
+
Then(/^#{capture_model} should be #{capture_model}(?:'s)? (\w+)$/) do |target, owner, association|
|
57
|
+
model!(owner).send(association).should == model!(target)
|
47
58
|
end
|
48
59
|
|
49
60
|
# assert model is not another model's has_one/belongs_to assoc
|
50
|
-
Then(/^#{capture_model} should not be #{capture_model}'s (\w+)$/) do |target, owner, association|
|
51
|
-
model(owner).send(association).should_not == model(target)
|
61
|
+
Then(/^#{capture_model} should not be #{capture_model}(?:'s)? (\w+)$/) do |target, owner, association|
|
62
|
+
model!(owner).send(association).should_not == model!(target)
|
52
63
|
end
|
53
64
|
|
54
65
|
# assert model.predicate?
|
55
66
|
Then(/^#{capture_model} should (?:be|have) (?:an? )?#{capture_predicate}$/) do |name, predicate|
|
56
|
-
model(name).should send("be_#{predicate.gsub(' ', '_')}")
|
67
|
+
model!(name).should send("be_#{predicate.gsub(' ', '_')}")
|
57
68
|
end
|
58
69
|
|
59
70
|
# assert not model.predicate?
|
60
71
|
Then(/^#{capture_model} should not (?:be|have) (?:an? )?#{capture_predicate}$/) do |name, predicate|
|
61
|
-
model(name).should_not send("be_#{predicate.gsub(' ', '_')}")
|
72
|
+
model!(name).should_not send("be_#{predicate.gsub(' ', '_')}")
|
62
73
|
end
|
@@ -5,72 +5,87 @@ describe Pickle::Path do
|
|
5
5
|
|
6
6
|
describe "#path_to_pickle, when the model doesn't exist" do
|
7
7
|
before do
|
8
|
-
stub!(:model
|
8
|
+
stub!(:model).and_return(nil)
|
9
9
|
end
|
10
10
|
it "('that user', :extra => 'new comment') should raise the error raised by model!" do
|
11
|
-
lambda { path_to_pickle "that user", "new comment" }.should raise_error("
|
11
|
+
lambda { path_to_pickle "that user", "new comment" }.should raise_error(RuntimeError, 'Could not figure out a path for ["that user", "new comment"] {}')
|
12
12
|
end
|
13
13
|
|
14
14
|
end
|
15
15
|
|
16
16
|
describe "#path_to_pickle" do
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
should_receive(:model!).with('a user')
|
22
|
-
should_receive(:model!).with('the user: "fred"')
|
23
|
-
stub!(:user_user_path).and_return('the path')
|
24
|
-
path_to_pickle 'a user', 'the user: "fred"'
|
25
|
-
end
|
17
|
+
describe "when model returns a user" do
|
18
|
+
before do
|
19
|
+
stub!(:model).and_return(@user = mock_model(User))
|
20
|
+
end
|
26
21
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
22
|
+
it "('a user', 'the user: \"fred\"') should retrieve 'a user', and 'the user: \"fred\"' models" do
|
23
|
+
should_receive(:model).with('a user')
|
24
|
+
should_receive(:model).with('the user: "fred"')
|
25
|
+
stub!(:user_user_path).and_return('the path')
|
26
|
+
path_to_pickle('a user', 'the user: "fred"').should == 'the path'
|
27
|
+
end
|
31
28
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
29
|
+
it "('a user', :action => 'foo') should return foo_user_path(<user>)" do
|
30
|
+
should_receive(:foo_user_path).with(@user).and_return('the path')
|
31
|
+
path_to_pickle('a user', :action => 'foo').should == 'the path'
|
32
|
+
end
|
36
33
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
34
|
+
it "('a user', :action => 'foo') should raise informative error if foo_user_path not defined" do
|
35
|
+
should_receive(:foo_user_path).with(@user).and_raise(NoMethodError)
|
36
|
+
lambda { path_to_pickle('a user', :action => 'foo') }.should raise_error(Exception, /Could not figure out a path for/)
|
37
|
+
end
|
41
38
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
39
|
+
it "('a user', :segment => 'foo') should return user_foo_path(<user>)" do
|
40
|
+
should_receive(:user_foo_path).with(@user).and_return('the path')
|
41
|
+
path_to_pickle('a user', :segment => 'foo').should == 'the path'
|
42
|
+
end
|
46
43
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
44
|
+
it "('a user', :segment => 'foo') should raise informative error if foo_user_path not defined" do
|
45
|
+
should_receive(:user_foo_path).with(@user).and_raise(NoMethodError)
|
46
|
+
lambda { path_to_pickle('a user', :segment => 'foo') }.should raise_error(Exception, /Could not figure out a path for/)
|
47
|
+
end
|
51
48
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
49
|
+
it "('a user', :action => 'new', :segment => 'comment') should return new_user_comment_path(<user>)" do
|
50
|
+
should_receive(:new_user_comment_path).with(@user).and_return('the path')
|
51
|
+
path_to_pickle('a user', :segment => 'comment', :action => 'new').should == 'the path'
|
52
|
+
end
|
56
53
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
54
|
+
it "('a user', :action => 'new', :segment => 'comment') should raise informative error if new_user_comment_path not defined" do
|
55
|
+
should_receive(:new_user_comment_path).with(@user).and_raise(NoMethodError)
|
56
|
+
lambda { path_to_pickle('a user', :action => 'new', :segment => 'comment') }.should raise_error(Exception, /Could not figure out a path for/)
|
57
|
+
end
|
61
58
|
|
62
|
-
|
63
|
-
|
64
|
-
|
59
|
+
it "('a user', :extra => 'new comment') should return new_user_comment_path(<user>)" do
|
60
|
+
should_receive(:new_user_comment_path).with(@user).and_return('the path')
|
61
|
+
path_to_pickle('a user', :extra => 'new comment').should == 'the path'
|
62
|
+
end
|
63
|
+
|
64
|
+
it "('a user', :extra => 'new comment') should raise informative error if new_user_comment_path not defined" do
|
65
|
+
should_receive(:new_user_comment_path).with(@user).and_raise(NoMethodError)
|
66
|
+
lambda { path_to_pickle('a user', :extra => 'new comment') }.should raise_error(Exception, /Could not figure out a path for/)
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "(private API)" do
|
70
|
+
it "('a user', :extra => 'new ish comment') should try combinations of 'new', 'ish', 'comment'" do
|
71
|
+
should_receive(:pickle_path_for_resources_action_segment).with([@user], '', 'new_ish_comment').once
|
72
|
+
should_receive(:pickle_path_for_resources_action_segment).with([@user], 'new', 'ish_comment').once
|
73
|
+
should_receive(:pickle_path_for_resources_action_segment).with([@user], 'new_ish', 'comment').once
|
74
|
+
should_receive(:pickle_path_for_resources_action_segment).with([@user], 'new_ish_comment', '').once
|
75
|
+
lambda { path_to_pickle('a user', :extra => 'new ish comment') }.should raise_error(Exception, /Could not figure out a path for/)
|
76
|
+
end
|
77
|
+
end
|
65
78
|
end
|
66
79
|
|
67
|
-
describe "
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
80
|
+
describe "when args is a list of pickle and non pickle models" do
|
81
|
+
before do
|
82
|
+
stub!(:model).with("account").and_return(nil)
|
83
|
+
stub!(:model).with("the user").and_return(@user = mock_model(User))
|
84
|
+
end
|
85
|
+
|
86
|
+
it "('account', 'the user') should return account_user_path(<user>)" do
|
87
|
+
should_receive(:account_user_path).with(@user).and_return("the path")
|
88
|
+
path_to_pickle('account', 'the user').should == 'the path'
|
74
89
|
end
|
75
90
|
end
|
76
91
|
end
|
@@ -188,6 +188,35 @@ describe Pickle::Session do
|
|
188
188
|
|
189
189
|
it_should_behave_like "after storing a single user"
|
190
190
|
end
|
191
|
+
|
192
|
+
describe "with hash" do
|
193
|
+
def do_create_model
|
194
|
+
find_model('a user', {'foo' => 'bar'})
|
195
|
+
end
|
196
|
+
|
197
|
+
it "should call User.find('user', {'foo' => 'bar'})" do
|
198
|
+
User.should_receive(:find).with(:first, :conditions => {'foo' => 'bar'}).and_return(@user)
|
199
|
+
do_create_model
|
200
|
+
end
|
201
|
+
|
202
|
+
describe "after find," do
|
203
|
+
before { do_find_model }
|
204
|
+
|
205
|
+
it_should_behave_like "after storing a single user"
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
describe "#find_model!" do
|
211
|
+
it "should call find_model" do
|
212
|
+
should_receive(:find_model).with('name', 'fields').and_return(mock('User'))
|
213
|
+
find_model!('name', 'fields')
|
214
|
+
end
|
215
|
+
|
216
|
+
it "should call raise error if find_model returns nil" do
|
217
|
+
should_receive(:find_model).with('name', 'fields').and_return(nil)
|
218
|
+
lambda { find_model!('name', 'fields') }.should raise_error
|
219
|
+
end
|
191
220
|
end
|
192
221
|
|
193
222
|
describe "#find_models" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pickle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ian White
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-11-
|
12
|
+
date: 2009-11-24 00:00:00 +00:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -47,6 +47,7 @@ files:
|
|
47
47
|
- features/step_definitions/generator_steps.rb
|
48
48
|
- features/step_definitions/path_steps.rb
|
49
49
|
- features/step_definitions/pickle_steps.rb
|
50
|
+
- features/support/email.rb
|
50
51
|
- features/support/env.rb
|
51
52
|
- features/support/paths.rb
|
52
53
|
- features/support/pickle.rb
|
@@ -69,6 +70,7 @@ files:
|
|
69
70
|
- lib/pickle/world.rb
|
70
71
|
- pickle.gemspec
|
71
72
|
- rails_generators/pickle/pickle_generator.rb
|
73
|
+
- rails_generators/pickle/templates/email.rb
|
72
74
|
- rails_generators/pickle/templates/email_steps.rb
|
73
75
|
- rails_generators/pickle/templates/paths.rb
|
74
76
|
- rails_generators/pickle/templates/pickle.rb
|