cucumber_factory 1.7.4 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,7 +1,7 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
3
  gem 'rails', '=2.3.8'
4
- gem 'rspec', '=1.2.9'
5
- gem 'rspec-rails', '=1.2.9'
4
+ gem 'rspec', '=1.3.2'
5
+ gem 'rspec-rails', '=1.3.2'
6
6
  gem 'cucumber', '=0.9.3'
7
7
  gem 'jeweler'
data/Gemfile.lock CHANGED
@@ -39,10 +39,10 @@ GEM
39
39
  activesupport (= 2.3.8)
40
40
  rake (>= 0.8.3)
41
41
  rake (0.8.7)
42
- rspec (1.2.9)
43
- rspec-rails (1.2.9)
42
+ rspec (1.3.2)
43
+ rspec-rails (1.3.2)
44
44
  rack (>= 1.0.0)
45
- rspec (>= 1.2.9)
45
+ rspec (>= 1.3.0)
46
46
  rubyforge (2.0.4)
47
47
  json_pure (>= 1.1.7)
48
48
  term-ansicolor (1.0.5)
@@ -54,5 +54,5 @@ DEPENDENCIES
54
54
  cucumber (= 0.9.3)
55
55
  jeweler
56
56
  rails (= 2.3.8)
57
- rspec (= 1.2.9)
58
- rspec-rails (= 1.2.9)
57
+ rspec (= 1.3.2)
58
+ rspec-rails (= 1.3.2)
data/README.rdoc CHANGED
@@ -2,41 +2,61 @@
2
2
 
3
3
  Cucumber Factory allows you to create ActiveRecord objects directly from your {Cucumber}[http://cukes.info/] features. No step definitions required.
4
4
 
5
+
5
6
  == Examples
6
7
 
7
8
  The following will call {Movie.make}[http://github.com/notahat/machinist], {Factory.create(:movie)}[http://github.com/thoughtbot/factory_girl], Movie.create! or Movie.new, depending on what's available:
9
+
8
10
  Given there is a movie
9
11
 
10
12
  To create a new record with attributes set, you can say:
11
- Given there is a movie with the title "Sunshine" and the year "2007"
12
-
13
- The following will also store the created record in <tt>@sunshine</tt>:
14
- Given "Sunshine" is a movie with the title "Sunshine" and the year "2007"
15
13
 
16
- To set associations you can refer to other records by name:
17
- Given "Before Sunrise" is a movie
18
- And "Before Sunset" is a movie with the prequel "Before Sunrise"
19
-
20
- You can also refer to the last created object of a kind by saying "above":
21
- Given there is a movie with the title "Before Sunrise"
22
- And "Before Sunset" is a movie with the prequel above
14
+ Given there is a movie with the title "Sunshine" and the year "2007"
23
15
 
24
16
  Boolean attributes can be set by appending "which", "that" or "who" at the end:
17
+
25
18
  Given there is a movie which is awesome
26
19
  And there is a movie with the name "Sunshine" that is not a comedy
27
20
  And there is a director who is popular
28
21
 
29
22
  Instead of "and" you can also use "but" and commas to join sentences:
23
+
30
24
  Given there is a movie which is awesome, popular and successful but not science fiction
31
25
  And there is a director with the income "500000" but with the account balance "-30000"
32
26
 
33
- == Factory support
27
+
28
+ == Setting associations
29
+
30
+ You can set <tt>belongs_to</tt> associations by referring to the last created record of a kind by saying "above":
31
+
32
+ Given there is a movie with the title "Before Sunrise"
33
+ And there is a movie with the prequel above
34
+
35
+ The example above also shows how to set <tt>has_many</tt> associations - you simply set the <tt>belongs_to</tt> association on the other side.
36
+
37
+ You can also set associations by referring to any string attribute used previously:
38
+
39
+ Given there is a movie with the title "Before Sunrise"
40
+ And there is a movie with the title "Limitless"
41
+ And there is a movie with the prequel "Before Sunrise"
42
+
43
+ You can also explicitly give a record a name and use it to set a <tt>belongs_to</tt> association below:
44
+
45
+ Given "Before Sunrise" is a movie
46
+ And there is a movie with the title "Limitless"
47
+ And there is a movie with the prequel "Before Sunrise"
48
+
49
+ Note that in the example above, "Before Sunrise" is only a name you can use to refer to the record. The name is not actually used for the movie title, or any other attribute value.
50
+
51
+
52
+ == Fixture factory support
34
53
 
35
54
  {Machinist blueprints}[http://github.com/notahat/machinist] and {factory_girl factories}[http://github.com/thoughtbot/factory_girl] will be used when available.
36
55
 
37
56
  You can use named Machinist blueprint such as <tt>Movie.blueprint(:comedy)</tt> like this:
38
57
 
39
- Given a movie (comedy) with the title "Groundhog Day"
58
+ Given there is a movie (comedy) with the title "Groundhog Day"
59
+
40
60
 
41
61
  == Overriding factory steps
42
62
 
@@ -50,18 +70,23 @@ If you want to override a factory step with your own version, just do so:
50
70
 
51
71
  Custom steps will always be preferred over factory steps. Also Cucumber will not raise a warning about ambiguous steps if the only other matching step is a factory step.
52
72
 
73
+
53
74
  == Installation and setup
54
75
 
55
76
  Cucumber Factory is a gem, which you can install with
77
+
56
78
  sudo gem install cucumber_factory
57
79
 
58
80
  In Rails 2, add the following to your <tt>environment.rb</tt>:
81
+
59
82
  config.gem 'cucumber_factory'
60
83
 
61
84
  In Rails 3, add the following to your <tt>Gemfile</tt>:
85
+
62
86
  gem 'cucumber_factory'
63
87
 
64
88
  Finally, create a file <tt>features/step_definitions/factory_steps.rb</tt>, which just says
89
+
65
90
  Cucumber::Factory.add_steps(self)
66
91
 
67
92
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.7.4
1
+ 1.8.0
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{cucumber_factory}
8
- s.version = "1.7.4"
8
+ s.version = "1.8.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Henning Koch"]
12
- s.date = %q{2010-12-02}
12
+ s.date = %q{2011-06-12}
13
13
  s.description = %q{Cucumber Factory allows you to create ActiveRecord models from your Cucumber features without writing step definitions for each model.}
14
14
  s.email = %q{github@makandra.de}
15
15
  s.extra_rdoc_files = [
@@ -65,32 +65,32 @@ Gem::Specification.new do |s|
65
65
  s.rubygems_version = %q{1.3.7}
66
66
  s.summary = %q{Create records from Cucumber features without writing step definitions.}
67
67
  s.test_files = [
68
- "spec/app_root/app/controllers/application_controller.rb",
69
- "spec/app_root/app/models/job_offer.rb",
70
- "spec/app_root/app/models/machinist_model.rb",
68
+ "spec/runtime_ext_spec.rb",
69
+ "spec/steps_spec.rb",
70
+ "spec/spec_helper.rb",
71
+ "spec/factory_spec.rb",
72
+ "spec/app_root/db/migrate/003_create_payments.rb",
73
+ "spec/app_root/db/migrate/001_create_movies.rb",
74
+ "spec/app_root/db/migrate/004_create_actors.rb",
75
+ "spec/app_root/db/migrate/002_create_users.rb",
71
76
  "spec/app_root/app/models/movie.rb",
77
+ "spec/app_root/app/models/machinist_model.rb",
72
78
  "spec/app_root/app/models/opera.rb",
73
- "spec/app_root/app/models/payment.rb",
74
- "spec/app_root/app/models/plain_ruby_class.rb",
79
+ "spec/app_root/app/models/job_offer.rb",
75
80
  "spec/app_root/app/models/user.rb",
76
81
  "spec/app_root/app/models/people/actor.rb",
82
+ "spec/app_root/app/models/payment.rb",
83
+ "spec/app_root/app/models/plain_ruby_class.rb",
84
+ "spec/app_root/app/controllers/application_controller.rb",
85
+ "spec/app_root/lib/console_with_fixtures.rb",
77
86
  "spec/app_root/config/boot.rb",
78
87
  "spec/app_root/config/environment.rb",
88
+ "spec/app_root/config/routes.rb",
79
89
  "spec/app_root/config/environments/in_memory.rb",
80
- "spec/app_root/config/environments/mysql.rb",
81
- "spec/app_root/config/environments/postgresql.rb",
82
90
  "spec/app_root/config/environments/sqlite.rb",
91
+ "spec/app_root/config/environments/postgresql.rb",
83
92
  "spec/app_root/config/environments/sqlite3.rb",
84
- "spec/app_root/config/routes.rb",
85
- "spec/app_root/db/migrate/001_create_movies.rb",
86
- "spec/app_root/db/migrate/002_create_users.rb",
87
- "spec/app_root/db/migrate/003_create_payments.rb",
88
- "spec/app_root/db/migrate/004_create_actors.rb",
89
- "spec/app_root/lib/console_with_fixtures.rb",
90
- "spec/spec_helper.rb",
91
- "spec/factory_spec.rb",
92
- "spec/runtime_ext_spec.rb",
93
- "spec/steps_spec.rb"
93
+ "spec/app_root/config/environments/mysql.rb"
94
94
  ]
95
95
 
96
96
  if s.respond_to? :specification_version then
@@ -1,115 +1,139 @@
1
- module Cucumber
2
- module Factory
3
- class << self
4
-
5
- ATTRIBUTES_PATTERN = '( with the .+?)?( (?:which|who|that) is .+?)?'
6
-
7
- # List of Cucumber step definitions created by #add_steps
8
- attr_reader :step_definitions
9
-
10
- def add_steps(main)
11
- @step_definitions = []
12
- steps.each do |step|
13
- @step_definitions << (main.instance_eval do
14
- Given(step[:pattern], &step[:action])
15
- end)
16
- end
17
- end
18
-
19
- def steps
20
- # we cannot use vararg blocks here in Ruby 1.8, as explained by Aslak: http://www.ruby-forum.com/topic/182927
21
- [ { :pattern => /^"([^\"]*)" is an? (.+?)( \(.+?\))?#{ATTRIBUTES_PATTERN}?$/,
22
- :action => lambda { |a1, a2, a3, a4, a5| Cucumber::Factory.parse_named_creation(self, a1, a2, a3, a4, a5) } },
23
- { :pattern => /^there is an? (.+?)( \(.+?\))?#{ATTRIBUTES_PATTERN}$/,
24
- :action => lambda { |a1, a2, a3, a4| Cucumber::Factory.parse_creation(self, a1, a2, a3, a4) } } ]
25
- end
26
-
27
- def parse_named_creation(world, name, raw_model, raw_variant, raw_attributes, raw_boolean_attributes)
28
- record = parse_creation(world, raw_model, raw_variant, raw_attributes, raw_boolean_attributes)
29
- variable = variable_name_from_prose(name)
30
- world.instance_variable_set variable, record
31
- end
32
-
33
- def parse_creation(world, raw_model, raw_variant, raw_attributes, raw_boolean_attributes)
34
- model_class = model_class_from_prose(raw_model)
35
- attributes = {}
36
- if raw_attributes.try(:strip).present?
37
- raw_attributes.scan(/(?:the|and|with|but|,| )+(.*?) ("([^\"]*)"|above)/).each do |fragment|
38
- attribute = attribute_name_from_prose(fragment[0])
39
- value_type = fragment[1] # 'above' or a quoted string
40
- value = fragment[2] # the value string without quotes
41
- attributes[attribute] = attribute_value(world, model_class, attribute, value_type, value)
42
- end
43
- end
44
- if raw_boolean_attributes.try(:strip).present?
45
- raw_boolean_attributes.scan(/(?:which|who|that|is| )*(not )?(.+?)(?: and | but |,|$)+/).each do |fragment|
46
- flag = !fragment[0] # if not ain't there, this is true
47
- attribute = attribute_name_from_prose(fragment[1])
48
- attributes[attribute] = flag
49
- end
50
- end
51
- variant = raw_variant.present? && /\((.*?)\)/.match(raw_variant)[1].downcase.gsub(" ", "_")
52
- create_record(model_class, variant, attributes)
53
- end
54
-
55
- private
56
-
57
- def attribute_value(world, model_class, attribute, value_type, value)
58
- association = model_class.respond_to?(:reflect_on_association) ? model_class.reflect_on_association(attribute) : nil
59
- if association.present?
60
- if value_type == "above"
61
- # Don't use class.last, in sqlite that is not always the last inserted element
62
- value = association.klass.find(:last, :order => "id") or raise "There is no last #{attribute}"
63
- else
64
- value = world.instance_variable_get(variable_name_from_prose(value))
65
- end
66
- else
67
- value = world.Transform(value)
68
- end
69
- value
70
- end
71
-
72
- def attribute_name_from_prose(prose)
73
- prose.downcase.gsub(" ", "_").to_sym
74
- end
75
-
76
- def model_class_from_prose(prose)
77
- # don't use \w which depends on the system locale
78
- prose.gsub(/[^A-Za-z0-9_\/]+/, "_").camelize.constantize
79
- end
80
-
81
- def variable_name_from_prose(prose)
82
- # don't use \w which depends on the system locale
83
- name = prose.downcase.gsub(/[^A-Za-z0-9_]+/, '_')
84
- name = name.gsub(/^_+/, '').gsub(/_+$/, '')
85
- name = "_#{name}" unless name.length >= 0 && name =~ /^[a-z]/
86
- :"@#{name}"
87
- end
88
-
89
- def factory_girl_factory_name(name)
90
- name.to_s.underscore.to_sym
91
- end
92
-
93
- def create_record(model_class, variant, attributes)
94
- fg_factory_name = factory_girl_factory_name(variant || model_class)
95
- if defined?(::Factory) && factory = ::Factory.factories[fg_factory_name]
96
- ::Factory.create(fg_factory_name, attributes)
97
- elsif model_class.respond_to?(:make) # Machinist blueprint
98
- if variant.present?
99
- model_class.make(variant.to_sym, attributes)
100
- else
101
- model_class.make(attributes)
102
- end
103
- elsif model_class.respond_to?(:create!) # Plain ActiveRecord
104
- model = model_class.new
105
- model.send(:attributes=, attributes, false) # ignore attr_accessible
106
- model.save!
107
- model
108
- else
109
- model_class.new(attributes)
110
- end
111
- end
112
-
113
- end
114
- end
115
- end
1
+ module Cucumber
2
+ class Factory
3
+
4
+ ATTRIBUTES_PATTERN = '( with the .+?)?( (?:which|who|that) is .+?)?'
5
+
6
+ NAMED_RECORDS_VARIABLE = :'@named_cucumber_factory_records'
7
+
8
+ CLEAR_NAMED_RECORDS_STEP_DESCRIPTOR = {
9
+ :kind => :Before,
10
+ :block => lambda { instance_variable_set(NAMED_RECORDS_VARIABLE, {}) }
11
+ }
12
+
13
+ NAMED_CREATION_STEP_DESCRIPTOR = {
14
+ :kind => :Given,
15
+ :pattern => /^"([^\"]*)" is an? (.+?)( \(.+?\))?#{ATTRIBUTES_PATTERN}?$/,
16
+ # we cannot use vararg blocks here in Ruby 1.8, as explained by Aslak: http://www.ruby-forum.com/topic/182927
17
+ :block => lambda { |a1, a2, a3, a4, a5| Cucumber::Factory.send(:parse_named_creation, self, a1, a2, a3, a4, a5) }
18
+ }
19
+
20
+ CREATION_STEP_DESCRIPTOR = {
21
+ :kind => :Given,
22
+ :pattern => /^there is an? (.+?)( \(.+?\))?#{ATTRIBUTES_PATTERN}$/,
23
+ # we cannot use vararg blocks here in Ruby 1.8, as explained by Aslak: http://www.ruby-forum.com/topic/182927
24
+ :block => lambda { |a1, a2, a3, a4| Cucumber::Factory.send(:parse_creation, self, a1, a2, a3, a4) }
25
+ }
26
+
27
+ class << self
28
+
29
+ attr_reader :step_definitions
30
+
31
+ def add_steps(main)
32
+ add_step(main, CREATION_STEP_DESCRIPTOR)
33
+ add_step(main, NAMED_CREATION_STEP_DESCRIPTOR)
34
+ add_step(main, CLEAR_NAMED_RECORDS_STEP_DESCRIPTOR)
35
+ end
36
+
37
+ private
38
+
39
+ def add_step(main, descriptor)
40
+ @step_definitions ||= []
41
+ step_definition = main.instance_eval { send(descriptor[:kind], *[descriptor[:pattern]].compact, &descriptor[:block]) }
42
+ @step_definitions << step_definition
43
+ end
44
+
45
+ def get_named_record(world, name)
46
+ world.instance_variable_get(NAMED_RECORDS_VARIABLE)[name]
47
+ end
48
+
49
+ def set_named_record(world, name, record)
50
+ world.instance_variable_get(NAMED_RECORDS_VARIABLE)[name] = record
51
+ end
52
+
53
+ def parse_named_creation(world, name, raw_model, raw_variant, raw_attributes, raw_boolean_attributes)
54
+ record = parse_creation(world, raw_model, raw_variant, raw_attributes, raw_boolean_attributes)
55
+ set_named_record(world, name, record)
56
+ end
57
+
58
+ def parse_creation(world, raw_model, raw_variant, raw_attributes, raw_boolean_attributes)
59
+ model_class = model_class_from_prose(raw_model)
60
+ attributes = {}
61
+ if raw_attributes.try(:strip).present?
62
+ raw_attributes.scan(/(?:the|and|with|but|,| )+(.*?) ("([^\"]*)"|above)/).each do |fragment|
63
+ attribute = attribute_name_from_prose(fragment[0])
64
+ value_type = fragment[1] # 'above' or a quoted string
65
+ value = fragment[2] # the value string without quotes
66
+ attributes[attribute] = attribute_value(world, model_class, attribute, value_type, value)
67
+ end
68
+ end
69
+ if raw_boolean_attributes.try(:strip).present?
70
+ raw_boolean_attributes.scan(/(?:which|who|that|is| )*(not )?(.+?)(?: and | but |,|$)+/).each do |fragment|
71
+ flag = !fragment[0] # if the word 'not' didn't match above, this expression is true
72
+ attribute = attribute_name_from_prose(fragment[1])
73
+ attributes[attribute] = flag
74
+ end
75
+ end
76
+ variant = raw_variant.present? && /\((.*?)\)/.match(raw_variant)[1].downcase.gsub(" ", "_")
77
+ record = create_record(model_class, variant, attributes)
78
+ remember_record_names(world, record, attributes)
79
+ record
80
+ end
81
+
82
+ def attribute_value(world, model_class, attribute, value_type, value)
83
+ association = model_class.respond_to?(:reflect_on_association) ? model_class.reflect_on_association(attribute) : nil
84
+ if association.present?
85
+ if value_type == "above"
86
+ # Don't use class.last, in sqlite that is not always the last inserted element
87
+ value = association.klass.find(:last, :order => "id") or raise "There is no last #{attribute}"
88
+ else
89
+ value = get_named_record(world, value)
90
+ end
91
+ else
92
+ value = world.Transform(value)
93
+ end
94
+ value
95
+ end
96
+
97
+ def attribute_name_from_prose(prose)
98
+ prose.downcase.gsub(" ", "_").to_sym
99
+ end
100
+
101
+ def model_class_from_prose(prose)
102
+ # don't use \w which depends on the system locale
103
+ prose.gsub(/[^A-Za-z0-9_\/]+/, "_").camelize.constantize
104
+ end
105
+
106
+ def factory_girl_factory_name(name)
107
+ name.to_s.underscore.to_sym
108
+ end
109
+
110
+ def create_record(model_class, variant, attributes)
111
+ fg_factory_name = factory_girl_factory_name(variant || model_class)
112
+ if defined?(::Factory) && factory = ::Factory.factories[fg_factory_name]
113
+ ::Factory.create(fg_factory_name, attributes)
114
+ elsif model_class.respond_to?(:make) # Machinist blueprint
115
+ if variant.present?
116
+ model_class.make(variant.to_sym, attributes)
117
+ else
118
+ model_class.make(attributes)
119
+ end
120
+ elsif model_class.respond_to?(:create!) # Plain ActiveRecord
121
+ model = model_class.new
122
+ model.send(:attributes=, attributes, false) # ignore attr_accessible
123
+ model.save!
124
+ model
125
+ else
126
+ model_class.new(attributes)
127
+ end
128
+ end
129
+
130
+ def remember_record_names(world, record, attributes)
131
+ string_values = attributes.values.select { |v| v.is_a?(String) }
132
+ for string_value in string_values
133
+ set_named_record(world, string_value, record)
134
+ end
135
+ end
136
+
137
+ end
138
+ end
139
+ end
data/spec/factory_spec.rb CHANGED
@@ -2,41 +2,19 @@ require File.dirname(__FILE__) + '/spec_helper'
2
2
 
3
3
  describe Cucumber::Factory do
4
4
 
5
- describe 'add_steps' do
6
-
7
- it "should add Given rules to the world" do
8
- world = mock('world').as_null_object
9
- world.should_receive(:Given).exactly(2).times
10
- Cucumber::Factory.add_steps(world)
11
- end
12
-
13
- end
14
-
5
+ subject { Cucumber::Factory }
6
+
15
7
  describe 'model_class_from_prose' do
16
8
 
17
9
  it "should return the class matching a natural language expression" do
18
- Cucumber::Factory.send(:model_class_from_prose, "movie").should == Movie
19
- Cucumber::Factory.send(:model_class_from_prose, "job offer").should == JobOffer
10
+ subject.send(:model_class_from_prose, "movie").should == Movie
11
+ subject.send(:model_class_from_prose, "job offer").should == JobOffer
20
12
  end
21
13
 
22
14
  it "should allow namespaced models" do
23
- Cucumber::Factory.send(:model_class_from_prose, "people/actor").should == People::Actor
15
+ subject.send(:model_class_from_prose, "people/actor").should == People::Actor
24
16
  end
25
17
 
26
18
  end
27
19
 
28
- describe 'variable_name_from_prose' do
29
-
30
- it "should translate natural language to instance variable names" do
31
- Cucumber::Factory.send(:variable_name_from_prose, "movie").should == :'@movie'
32
- Cucumber::Factory.send(:variable_name_from_prose, "Some Movie").should == :'@some_movie'
33
- end
34
-
35
- it "should make sure the generated instance variable names are legal" do
36
- Cucumber::Factory.send(:variable_name_from_prose, "1973").should == :'@_1973'
37
- Cucumber::Factory.send(:variable_name_from_prose, "%$§").should == :'@_'
38
- end
39
-
40
- end
41
-
42
20
  end
data/spec/spec_helper.rb CHANGED
@@ -22,12 +22,13 @@ end
22
22
  def prepare_cucumber_example
23
23
  @runtime = Cucumber::Runtime.new
24
24
  language = @runtime.load_programming_language('rb')
25
- scenario = stub('scenario', :language => 'en')
25
+ scenario = stub('scenario', :language => 'en', :accept_hook? => true)
26
26
  language.send(:begin_scenario, scenario)
27
27
  @world = language.current_world
28
28
  @main = Object.new
29
29
  @main.extend(Cucumber::RbSupport::RbDsl)
30
30
  Cucumber::Factory.add_steps(@main)
31
+ @runtime.before(scenario)
31
32
  end
32
33
 
33
34
  def invoke_cucumber_step(step)
data/spec/steps_spec.rb CHANGED
@@ -79,36 +79,40 @@ describe 'steps provided by cucumber_factory' do
79
79
  it "should create records with attributes" do
80
80
  movie = Movie.new
81
81
  Movie.stub(:new => movie)
82
- movie.should_receive(:"attributes=").with({ :title => "Sunshine", :year => "2007" }, false)
82
+ movie.should_receive(:attributes=).with({ :title => "Sunshine", :year => "2007" }, false)
83
83
  invoke_cucumber_step('there is a movie with the title "Sunshine" and the year "2007"')
84
84
  end
85
85
 
86
86
  it "should allow to join attribute lists with 'and's, commas and 'but's" do
87
87
  movie = Movie.new
88
88
  Movie.stub(:new => movie)
89
- movie.should_receive(:"attributes=").with({ :title => "Sunshine", :year => "2007", :box_office_result => "32000000" }, false)
89
+ movie.should_receive(:attributes=).with({ :title => "Sunshine", :year => "2007", :box_office_result => "32000000" }, false)
90
90
  invoke_cucumber_step('there is a movie with the title "Sunshine", the year "2007" but with the box office result "32000000"')
91
91
  end
92
92
 
93
93
  it "should apply Cucumber transforms to attribute values" do
94
94
  movie = Movie.new
95
95
  Movie.stub(:new => movie)
96
- @world.should_receive(:Transform).with("value").and_return("transformed value")
97
- movie.should_receive(:"attributes=").with({ :title => "transformed value" }, false)
96
+ @main.instance_eval do
97
+ Transform /^(value)$/ do |value|
98
+ 'transformed value'
99
+ end
100
+ end
101
+ movie.should_receive(:attributes=).with({ :title => "transformed value" }, false)
98
102
  invoke_cucumber_step('there is a movie with the title "value"')
99
103
  end
100
104
 
101
105
  it "should create records with attributes containing spaces" do
102
106
  movie = Movie.new
103
107
  Movie.stub(:new => movie)
104
- movie.should_receive(:"attributes=").with({ :box_office_result => "99999999" }, false)
108
+ movie.should_receive(:attributes=).with({ :box_office_result => "99999999" }, false)
105
109
  invoke_cucumber_step('there is a movie with the box office result "99999999"')
106
110
  end
107
111
 
108
112
  it "should create records with attributes containing uppercase characters" do
109
113
  user = User.new
110
114
  User.stub(:new => user)
111
- user.should_receive(:"attributes=").with({ :name => "Susanne" }, false)
115
+ user.should_receive(:attributes=).with({ :name => "Susanne" }, false)
112
116
  invoke_cucumber_step('there is a User with the Name "Susanne"')
113
117
  end
114
118
 
@@ -119,18 +123,23 @@ describe 'steps provided by cucumber_factory' do
119
123
  payment.comment.should == 'Thanks for lending'
120
124
  end
121
125
 
122
- it "should set instance variables in the world" do
123
- invoke_cucumber_step('"Sunshine" is a movie with the title "Sunshine" and the year "2007"')
124
- @world.instance_variable_get(:'@sunshine').title.should == "Sunshine"
126
+ it "should allow to name records and set a belongs_to association to that record by refering to that name" do
127
+ invoke_cucumber_step('"Some Prequel" is a movie with the title "Before Sunrise"')
128
+ invoke_cucumber_step('there is a movie with the title "Before Sunset" and the prequel "Some Prequel"')
129
+ movie = Movie.find_by_title!('Before Sunset')
130
+ prequel = Movie.find_by_title!('Before Sunrise')
131
+ movie.prequel.should == prequel
125
132
  end
126
133
 
127
- it "should understand pointers to instance variables" do
128
- invoke_cucumber_step('"Before Sunrise" is a movie with the title "Before Sunrise"')
129
- invoke_cucumber_step('"Before Sunset" is a movie with the title "Before Sunset" and the prequel "Before Sunrise"')
130
- @world.instance_variable_get(:'@before_sunset').prequel.title.should == "Before Sunrise"
134
+ it "should allow to set a belongs_to association to a previously created record by refering to any string attribute of that record" do
135
+ invoke_cucumber_step('there is a movie with the title "Before Sunrise"')
136
+ invoke_cucumber_step('there is a movie with the title "Before Sunset" and the prequel "Before Sunrise"')
137
+ movie = Movie.find_by_title!('Before Sunset')
138
+ prequel = Movie.find_by_title!('Before Sunrise')
139
+ movie.prequel.should == prequel
131
140
  end
132
141
 
133
- it "should allow to point to a previously created record through 'above'" do
142
+ it "should allow to set a belongs_to association to a previously created record by saying 'above'" do
134
143
  invoke_cucumber_step('there is a user with the name "Jane"')
135
144
  invoke_cucumber_step('there is a movie with the title "Before Sunrise"')
136
145
  invoke_cucumber_step('there is a movie with the title "Before Sunset" and the reviewer above and the prequel above')
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cucumber_factory
3
3
  version: !ruby/object:Gem::Version
4
- hash: 3
4
+ hash: 55
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
- - 7
9
- - 4
10
- version: 1.7.4
8
+ - 8
9
+ - 0
10
+ version: 1.8.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Henning Koch
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-12-02 00:00:00 +01:00
18
+ date: 2011-06-12 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies: []
21
21
 
@@ -105,29 +105,29 @@ signing_key:
105
105
  specification_version: 3
106
106
  summary: Create records from Cucumber features without writing step definitions.
107
107
  test_files:
108
- - spec/app_root/app/controllers/application_controller.rb
109
- - spec/app_root/app/models/job_offer.rb
110
- - spec/app_root/app/models/machinist_model.rb
108
+ - spec/runtime_ext_spec.rb
109
+ - spec/steps_spec.rb
110
+ - spec/spec_helper.rb
111
+ - spec/factory_spec.rb
112
+ - spec/app_root/db/migrate/003_create_payments.rb
113
+ - spec/app_root/db/migrate/001_create_movies.rb
114
+ - spec/app_root/db/migrate/004_create_actors.rb
115
+ - spec/app_root/db/migrate/002_create_users.rb
111
116
  - spec/app_root/app/models/movie.rb
117
+ - spec/app_root/app/models/machinist_model.rb
112
118
  - spec/app_root/app/models/opera.rb
113
- - spec/app_root/app/models/payment.rb
114
- - spec/app_root/app/models/plain_ruby_class.rb
119
+ - spec/app_root/app/models/job_offer.rb
115
120
  - spec/app_root/app/models/user.rb
116
121
  - spec/app_root/app/models/people/actor.rb
122
+ - spec/app_root/app/models/payment.rb
123
+ - spec/app_root/app/models/plain_ruby_class.rb
124
+ - spec/app_root/app/controllers/application_controller.rb
125
+ - spec/app_root/lib/console_with_fixtures.rb
117
126
  - spec/app_root/config/boot.rb
118
127
  - spec/app_root/config/environment.rb
128
+ - spec/app_root/config/routes.rb
119
129
  - spec/app_root/config/environments/in_memory.rb
120
- - spec/app_root/config/environments/mysql.rb
121
- - spec/app_root/config/environments/postgresql.rb
122
130
  - spec/app_root/config/environments/sqlite.rb
131
+ - spec/app_root/config/environments/postgresql.rb
123
132
  - spec/app_root/config/environments/sqlite3.rb
124
- - spec/app_root/config/routes.rb
125
- - spec/app_root/db/migrate/001_create_movies.rb
126
- - spec/app_root/db/migrate/002_create_users.rb
127
- - spec/app_root/db/migrate/003_create_payments.rb
128
- - spec/app_root/db/migrate/004_create_actors.rb
129
- - spec/app_root/lib/console_with_fixtures.rb
130
- - spec/spec_helper.rb
131
- - spec/factory_spec.rb
132
- - spec/runtime_ext_spec.rb
133
- - spec/steps_spec.rb
133
+ - spec/app_root/config/environments/mysql.rb