pickle 0.1.23 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|