spbtv_pickle 0.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +10 -0
  5. data/Gemfile +3 -0
  6. data/Gemfile.lock.development +158 -0
  7. data/History.txt +499 -0
  8. data/License.txt +20 -0
  9. data/README.md +566 -0
  10. data/Rakefile +20 -0
  11. data/Rakefile.d/cucumber.rake +27 -0
  12. data/Rakefile.d/release.rake +44 -0
  13. data/Rakefile.d/rspec.rake +3 -0
  14. data/Rakefile.d/yard.rake +5 -0
  15. data/Todo.txt +3 -0
  16. data/autotest/discover.rb +9 -0
  17. data/features/app/app.rb +128 -0
  18. data/features/app/blueprints.rb +6 -0
  19. data/features/app/fabricators.rb +6 -0
  20. data/features/app/factories.rb +25 -0
  21. data/features/app/views/notifier/email.erb +1 -0
  22. data/features/app/views/notifier/user_email.erb +6 -0
  23. data/features/email/email.feature +64 -0
  24. data/features/generator/generators.feature +59 -0
  25. data/features/path/models_page.feature +44 -0
  26. data/features/path/named_route_page.feature +10 -0
  27. data/features/pickle/create_from_active_record.feature +83 -0
  28. data/features/pickle/create_from_fabrication.feature +46 -0
  29. data/features/pickle/create_from_factory_girl.feature +66 -0
  30. data/features/pickle/create_from_machinist.feature +46 -0
  31. data/features/step_definitions/email_steps.rb +1 -0
  32. data/features/step_definitions/extra_email_steps.rb +12 -0
  33. data/features/step_definitions/fork_steps.rb +4 -0
  34. data/features/step_definitions/generator_steps.rb +52 -0
  35. data/features/step_definitions/path_steps.rb +14 -0
  36. data/features/step_definitions/pickle_steps.rb +1 -0
  37. data/features/step_definitions/raise_error_steps.rb +7 -0
  38. data/features/support/email.rb +1 -0
  39. data/features/support/env.rb +14 -0
  40. data/features/support/paths.rb +47 -0
  41. data/features/support/pickle.rb +27 -0
  42. data/features/support/pickle_app.rb +4 -0
  43. data/init.rb +0 -0
  44. data/lib/generators/pickle_generator.rb +44 -0
  45. data/lib/pickle.rb +26 -0
  46. data/lib/pickle/adapter.rb +183 -0
  47. data/lib/pickle/adapters/active_record.rb +67 -0
  48. data/lib/pickle/adapters/data_mapper.rb +42 -0
  49. data/lib/pickle/adapters/mongoid.rb +54 -0
  50. data/lib/pickle/config.rb +49 -0
  51. data/lib/pickle/email.rb +87 -0
  52. data/lib/pickle/email/parser.rb +18 -0
  53. data/lib/pickle/email/world.rb +13 -0
  54. data/lib/pickle/parser.rb +65 -0
  55. data/lib/pickle/parser/matchers.rb +87 -0
  56. data/lib/pickle/path.rb +45 -0
  57. data/lib/pickle/path/world.rb +5 -0
  58. data/lib/pickle/session.rb +244 -0
  59. data/lib/pickle/session/parser.rb +34 -0
  60. data/lib/pickle/version.rb +3 -0
  61. data/lib/pickle/world.rb +14 -0
  62. data/lib/spbtv_pickle.rb +1 -0
  63. data/rails_generators/pickle/pickle_generator.rb +31 -0
  64. data/rails_generators/pickle/templates/email.rb +21 -0
  65. data/rails_generators/pickle/templates/email_steps.rb +65 -0
  66. data/rails_generators/pickle/templates/paths.rb +47 -0
  67. data/rails_generators/pickle/templates/pickle.rb +29 -0
  68. data/rails_generators/pickle/templates/pickle_steps.rb +105 -0
  69. data/spbtv_pickle.gemspec +38 -0
  70. data/spec/pickle/adapter_spec.rb +203 -0
  71. data/spec/pickle/config_spec.rb +112 -0
  72. data/spec/pickle/email/parser_spec.rb +51 -0
  73. data/spec/pickle/email_spec.rb +187 -0
  74. data/spec/pickle/parser/matchers_spec.rb +70 -0
  75. data/spec/pickle/parser_spec.rb +165 -0
  76. data/spec/pickle/path_spec.rb +120 -0
  77. data/spec/pickle/session_spec.rb +448 -0
  78. data/spec/pickle_spec.rb +24 -0
  79. data/spec/spec_helper.rb +78 -0
  80. metadata +370 -0
@@ -0,0 +1,34 @@
1
+ module Pickle
2
+ module Session
3
+ # add ability to parse model names as fields, using a session
4
+ module Parser
5
+ def self.included(parser_class)
6
+ parser_class.alias_method_chain :parse_field, :model
7
+ end
8
+
9
+ attr_accessor :session
10
+
11
+ def match_field
12
+ "(?:\\w+: (?:#{match_model}|#{match_value}))"
13
+ end
14
+
15
+ def parse_field_with_model(field)
16
+ if session && field =~ /^(\w+): #{capture_model}$/
17
+ {$1 => session.model!($2)}
18
+ else
19
+ parse_field_without_model(field)
20
+ end
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
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,3 @@
1
+ module Pickle
2
+ VERSION = "0.5.1"
3
+ end
@@ -0,0 +1,14 @@
1
+ require 'pickle'
2
+
3
+ # auto require for active record, datamapper and mongoid
4
+ require 'pickle/adapters/active_record' if defined?(ActiveRecord::Base)
5
+ require 'pickle/adapters/data_mapper' if defined?(DataMapper::Resource)
6
+ require 'pickle/adapters/mongoid' if defined?(Mongoid::Document)
7
+
8
+ # make cucumber world pickle aware
9
+ World(Pickle::Session)
10
+
11
+ # shortcuts to regexps for use in step definition regexps
12
+ class << self
13
+ delegate :capture_model, :capture_fields, :capture_factory, :capture_plural_factory, :capture_predicate, :capture_value, :to => 'Pickle.parser'
14
+ end
@@ -0,0 +1 @@
1
+ require_relative 'pickle'
@@ -0,0 +1,31 @@
1
+ class PickleGenerator < Rails::Generator::Base
2
+ def initialize(args, options)
3
+ super(args, options)
4
+ @generate_email_steps = args.include?('email')
5
+ @generate_path_steps = args.include?('path')
6
+ end
7
+
8
+ def manifest
9
+ record do |m|
10
+ m.directory File.join('features/step_definitions')
11
+ m.directory File.join('features/support')
12
+
13
+ current_pickle = File.exists?('features/support/pickle.rb') ? File.read('features/support/pickle.rb') : ''
14
+ pickle_assigns = {:pickle_path => false, :pickle_email => false}
15
+
16
+ if @generate_path_steps
17
+ pickle_assigns[:pickle_path] = true
18
+ m.template 'paths.rb', File.join('features/support', 'paths.rb')
19
+ end
20
+
21
+ if @generate_email_steps
22
+ pickle_assigns[:pickle_email] = true
23
+ m.template 'email_steps.rb', File.join('features/step_definitions', 'email_steps.rb')
24
+ m.template 'email.rb', File.join('features/support', 'email.rb')
25
+ end
26
+
27
+ m.template 'pickle_steps.rb', File.join('features/step_definitions', 'pickle_steps.rb')
28
+ m.template 'pickle.rb', File.join('features/support', 'pickle.rb'), :assigns => pickle_assigns
29
+ end
30
+ end
31
+ 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)
@@ -0,0 +1,65 @@
1
+ # this file generated by script/generate pickle email
2
+ #
3
+ # add email mappings in features/support/email.rb
4
+
5
+ ActionMailer::Base.delivery_method = :test
6
+ ActionMailer::Base.perform_deliveries = true
7
+
8
+ Before do
9
+ ActionMailer::Base.deliveries.clear
10
+ end
11
+
12
+ # Clear the deliveries array, useful if your background sends email that you want to ignore
13
+ Given(/^all emails? (?:have|has) been delivered$/) do
14
+ ActionMailer::Base.deliveries.clear
15
+ end
16
+
17
+ Given(/^(\d)+ emails? should be delivered$/) do |count|
18
+ expect(emails.size).to eq(count.to_i)
19
+ end
20
+
21
+ When(/^(?:I|they) follow "([^"]*?)" in #{capture_email}$/) do |link, email_ref|
22
+ visit_in_email(email(email_ref), link)
23
+ end
24
+
25
+ When(/^(?:I|they) click the first link in #{capture_email}$/) do |email_ref|
26
+ click_first_link_in_email(email(email_ref))
27
+ end
28
+
29
+ Then(/^(\d)+ emails? should be delivered to (.*)$/) do |count, to|
30
+ actual = emails("to: \"#{email_for(to)}\"").size
31
+ expect(actual).to eq(count.to_i), "Expected #{count} emails but encountered #{actual} delivered to #{to}"
32
+ end
33
+
34
+ Then(/^(\d)+ emails? should be delivered with #{capture_fields}$/) do |count, fields|
35
+ actual = emails(fields).size
36
+ expect(actual).to eq(count.to_i), "Expected #{count} emails but encountered #{actual} to be delivered with #{fields}"
37
+ end
38
+
39
+ Then(/^#{capture_email} should be delivered to (.+)$/) do |email_ref, to|
40
+ expect(email(email_ref, "to: \"#{email_for(to)}\"")).not_to be_nil, "Failed to find #{email_ref} delivered to: #{to}"
41
+ end
42
+
43
+ Then(/^#{capture_email} should not be delivered to (.+)$/) do |email_ref, to|
44
+ expect(email(email_ref, "to: \"#{email_for(to)}\"")).to be_nil, "Unexpectedly found #{email_ref} delivered to: #{to}"
45
+ end
46
+
47
+ Then(/^#{capture_email} should have #{capture_fields}$/) do |email_ref, fields|
48
+ expect(email(email_ref, fields)).not_to be_nil, "Failed to find #{fields} in #{email_ref}"
49
+ end
50
+
51
+ Then(/^#{capture_email} should contain "(.*)"$/) do |email_ref, text|
52
+ expect(email(email_ref).body).to match(/#{text}/), "Failed to find \"#{text}\" in #{email_ref}"
53
+ end
54
+
55
+ Then(/^#{capture_email} should not contain "(.*)"$/) do |email_ref, text|
56
+ expect(email(email_ref).body).not_to match(/#{text}/), "Unexpectedly found \"#{text}\" in #{email_ref}"
57
+ end
58
+
59
+ Then(/^#{capture_email} should link to (.+)$/) do |email_ref, page|
60
+ expect(email(email_ref).body).to match(/#{path_to(page)}/), "Failed to find link to #{page} in #{email_ref}"
61
+ end
62
+
63
+ Then(/^show me the emails?$/) do
64
+ save_and_open_emails
65
+ end
@@ -0,0 +1,47 @@
1
+ module NavigationHelpers
2
+ # Maps a name to a path. Used by the
3
+ #
4
+ # When /^I go to (.+)$/ do |page_name|
5
+ #
6
+ # step definition in web_steps.rb
7
+ #
8
+ def path_to(page_name)
9
+ case page_name
10
+
11
+ when /the home\s?page/
12
+ '/'
13
+
14
+ # the following are examples using path_to_pickle
15
+
16
+ when /^#{capture_model}(?:'s)? page$/ # eg. the forum's page
17
+ path_to_pickle $1
18
+
19
+ when /^#{capture_model}(?:'s)? #{capture_model}(?:'s)? page$/ # eg. the forum's post's page
20
+ path_to_pickle $1, $2
21
+
22
+ when /^#{capture_model}(?:'s)? #{capture_model}'s (.+?) page$/ # eg. the forum's post's comments page
23
+ path_to_pickle $1, $2, :extra => $3 # or the forum's post's edit page
24
+
25
+ when /^#{capture_model}(?:'s)? (.+?) page$/ # eg. the forum's posts page
26
+ path_to_pickle $1, :extra => $2 # or the forum's edit page
27
+
28
+ # Add more mappings here.
29
+ # Here is an example that pulls values out of the Regexp:
30
+ #
31
+ # when /^(.*)'s profile page$/i
32
+ # user_profile_path(User.find_by_login($1))
33
+
34
+ else
35
+ begin
36
+ page_name =~ /the (.*) page/
37
+ path_components = $1.split(/\s+/)
38
+ self.send(path_components.push('path').join('_').to_sym)
39
+ rescue Object => e
40
+ raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
41
+ "Now, go and add a mapping in #{__FILE__}"
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ World(NavigationHelpers)
@@ -0,0 +1,29 @@
1
+ # this file generated by script/generate pickle [paths] [email]
2
+ #
3
+ # Make sure that you are loading your factory of choice in your cucumber environment
4
+ #
5
+ # For machinist add: features/support/machinist.rb
6
+ #
7
+ # require 'machinist/active_record' # or your chosen adaptor
8
+ # require File.dirname(__FILE__) + '/../../spec/blueprints' # or wherever your blueprints are
9
+ #
10
+ # For FactoryGirl add: features/support/factory_girl.rb
11
+ #
12
+ # require 'factory_girl'
13
+ # require File.dirname(__FILE__) + '/../../spec/factories' # or wherever your factories are
14
+ #
15
+ # For Fabrication, just include it in the adapter list when configuring pickle as explained below.
16
+ #
17
+ # You may also need to add gem dependencies on your factory of choice in <tt>config/environments/cucumber.rb</tt>
18
+
19
+ require 'pickle/world'
20
+ # Example of configuring pickle:
21
+ #
22
+ # Pickle.configure do |config|
23
+ # config.adapters = [:machinist]
24
+ # config.map 'I', 'myself', 'me', 'my', :to => 'user: "me"'
25
+ # end
26
+ <%- if pickle_path -%>require 'pickle/path/world'
27
+ <%- end -%>
28
+ <%- if pickle_email -%>require 'pickle/email/world'
29
+ <%- end -%>
@@ -0,0 +1,105 @@
1
+ # this file generated by script/generate pickle
2
+
3
+ # create a model
4
+ Given(/^#{capture_model} exists?(?: with #{capture_fields})?$/) do |name, fields|
5
+ create_model(name, fields)
6
+ end
7
+
8
+ # create n models
9
+ Given(/^(\d+) #{capture_plural_factory} exist(?: with #{capture_fields})?$/) do |count, plural_factory, fields|
10
+ create_models(count, plural_factory.singularize, fields)
11
+ end
12
+
13
+ # create models from a table
14
+ Given(/^the following #{capture_plural_factory} exists?:?$/) do |plural_factory, table|
15
+ create_models_from_table(plural_factory, table)
16
+ end
17
+
18
+ # find a model
19
+ Then(/^#{capture_model} should exist(?: with #{capture_fields})?$/) do |name, fields|
20
+ find_model!(name, fields)
21
+ end
22
+
23
+ # not find a model
24
+ Then(/^#{capture_model} should not exist(?: with #{capture_fields})?$/) do |name, fields|
25
+ expect(find_model(name, fields)).to be_nil
26
+ end
27
+
28
+ # find models with a table
29
+ Then(/^the following #{capture_plural_factory} should exist:?$/) do |plural_factory, table|
30
+ expect(find_models_from_table(plural_factory, table)).not_to be_any(&:nil?)
31
+ end
32
+
33
+ # not find models with a table
34
+ Then(/^the following #{capture_plural_factory} should not exists?:?$/) do |plural_factory, table|
35
+ find_models_from_table(plural_factory, table).should be_all(&:nil?)
36
+ end
37
+
38
+ # find exactly n models
39
+ Then(/^(\d+) #{capture_plural_factory} should exist(?: with #{capture_fields})?$/) do |count, plural_factory, fields|
40
+ expect(find_models(plural_factory.singularize, fields).size).to eq(count.to_i)
41
+ end
42
+
43
+ # assert equality of models
44
+ Then(/^#{capture_model} should be #{capture_model}$/) do |a, b|
45
+ expect(model!(a)).to eq(model!(b))
46
+ end
47
+
48
+ # assert model is in another model's has_many assoc
49
+ Then(/^#{capture_model} should be (?:in|one of|amongst) #{capture_model}(?:'s)? (\w+)$/) do |target, owner, association|
50
+ expect(model!(owner).send(association)).to include(model!(target))
51
+ end
52
+
53
+ # assert model is not in another model's has_many assoc
54
+ Then(/^#{capture_model} should not be (?:in|one of|amongst) #{capture_model}(?:'s)? (\w+)$/) do |target, owner, association|
55
+ expect(model!(owner).send(association)).not_to include(model!(target))
56
+ end
57
+
58
+ # assert model is another model's has_one/belongs_to assoc
59
+ Then(/^#{capture_model} should be #{capture_model}(?:'s)? (\w+)$/) do |target, owner, association|
60
+ expect(model!(owner).send(association)).to eq(model!(target))
61
+ end
62
+
63
+ # assert model is not another model's has_one/belongs_to assoc
64
+ Then(/^#{capture_model} should not be #{capture_model}(?:'s)? (\w+)$/) do |target, owner, association|
65
+ expect(model!(owner).send(association)).not_to eq(model!(target))
66
+ end
67
+
68
+ # assert model.predicate?
69
+ Then(/^#{capture_model} should (?:be|have) (?:an? )?#{capture_predicate}$/) do |name, predicate|
70
+ if model!(name).respond_to?("has_#{predicate.gsub(' ', '_')}")
71
+ expect(model!(name)).to send("have_#{predicate.gsub(' ', '_')}")
72
+ else
73
+ expect(model!(name)).to send("be_#{predicate.gsub(' ', '_')}")
74
+ end
75
+ end
76
+
77
+ # assert not model.predicate?
78
+ Then(/^#{capture_model} should not (?:be|have) (?:an? )?#{capture_predicate}$/) do |name, predicate|
79
+ if model!(name).respond_to?("has_#{predicate.gsub(' ', '_')}")
80
+ expect(model!(name)).not_to send("have_#{predicate.gsub(' ', '_')}")
81
+ else
82
+ expect(model!(name)).not_to send("be_#{predicate.gsub(' ', '_')}")
83
+ end
84
+ end
85
+
86
+ # expect(model.attribute).to eq(value)
87
+ # expect(model.attribute).not_to eq(value)
88
+ Then(/^#{capture_model}'s (\w+) (should(?: not)?) be #{capture_value}$/) do |name, attribute, expectation, expected|
89
+ actual_value = model(name).send(attribute)
90
+ expectation = expectation.gsub("should", "to").gsub(" ", "_")
91
+
92
+ case expected
93
+ when 'nil', 'true', 'false'
94
+ expect(actual_value).send(expectation, eq(eval(expected)))
95
+ when /^[+-]?[0-9_]+(\.\d+)?$/
96
+ expect(actual_value).send(expectation, eq(expected.to_f))
97
+ else
98
+ expect(actual_value.to_s).send(expectation, eq(eval(expected)))
99
+ end
100
+ end
101
+
102
+ # assert size of association
103
+ Then /^#{capture_model} should have (\d+) (\w+)$/ do |name, size, association|
104
+ expect(model!(name).send(association).size).to eq(size.to_i)
105
+ end
@@ -0,0 +1,38 @@
1
+ $:.push File.expand_path("../lib", __FILE__)
2
+ require "pickle/version"
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "spbtv_pickle"
6
+ s.version = Pickle::VERSION.dup
7
+ s.platform = Gem::Platform::RUBY
8
+ s.licenses = ["MIT"]
9
+ s.authors = ["Ian White", "James Le Cuirot"]
10
+ s.description = "Easy model creation and reference in your cucumber features"
11
+ s.summary = "Easy model creation and reference in your cucumber features."
12
+ s.email = ["ian.w.white@gmail.com", "chewi@aura-online.co.uk"]
13
+ s.homepage = "https://github.com/ianwhite/pickle"
14
+
15
+ s.rubyforge_project = "pickle"
16
+ s.required_rubygems_version = ">= 1.3.6"
17
+
18
+ s.files = `git ls-files`.split("\n")
19
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_dependency "cucumber", ">=0.8"
23
+ s.add_dependency "rake"
24
+
25
+ s.add_development_dependency "rack"
26
+ s.add_development_dependency "bundler"
27
+ s.add_development_dependency "git"
28
+ s.add_development_dependency "yard"
29
+ s.add_development_dependency "rspec-rails", "~>3.0"
30
+ s.add_development_dependency "rails", "~>3.1.0"
31
+ s.add_development_dependency "cucumber-rails"
32
+ s.add_development_dependency "factory_girl"
33
+ s.add_development_dependency "fabrication", '~> 2.0'
34
+ s.add_development_dependency "machinist", "~>2.0"
35
+ s.add_development_dependency "database_cleaner"
36
+ s.add_development_dependency "capybara"
37
+ s.add_development_dependency "sqlite3"
38
+ end
@@ -0,0 +1,203 @@
1
+ require 'spec_helper'
2
+
3
+ require 'active_record'
4
+ require 'factory_girl'
5
+ require 'fabrication'
6
+ require 'machinist/active_record'
7
+ require 'pickle/adapters/active_record'
8
+
9
+ describe Pickle::Adapter do
10
+ it ".factories should raise NotImplementedError" do
11
+ expect { Pickle::Adapter.factories }.to raise_error(NotImplementedError)
12
+ end
13
+
14
+ it "#create should raise NotImplementedError" do
15
+ expect { Pickle::Adapter.new.create }.to raise_error(NotImplementedError)
16
+ end
17
+
18
+ describe "adapters: " do
19
+ around do |example|
20
+ begin
21
+ class One < ActiveRecord::Base; end
22
+ class One::Two < ActiveRecord::Base; end
23
+ class Three < ActiveRecord::Base; end
24
+ example.run
25
+ ensure
26
+ Object.send :remove_const, :One
27
+ Object.send :remove_const, :Three
28
+ end
29
+ end
30
+
31
+ describe 'ActiveRecord' do
32
+ describe 'with class stubs' do
33
+ before do
34
+ allow(Pickle::Adapter::Orm).to receive(:model_classes).and_return([One, One::Two, Three])
35
+ end
36
+
37
+ it ".factories should create one for each active record class" do
38
+ expect(Pickle::Adapter::Orm).to receive(:new).with(One).once
39
+ expect(Pickle::Adapter::Orm).to receive(:new).with(One::Two).once
40
+ expect(Pickle::Adapter::Orm).to receive(:new).with(Three).once
41
+ expect(Pickle::Adapter::Orm.factories.length).to eq(3)
42
+ end
43
+
44
+ describe ".new(Class)" do
45
+ before do
46
+ @factory = Pickle::Adapter::Orm.new(One::Two)
47
+ end
48
+
49
+ it "should have underscored (s/_) name of Class as #name" do
50
+ expect(@factory.name).to eq('one_two')
51
+ end
52
+
53
+ it "#create(attrs) should call Class.create!(attrs)" do
54
+ expect(One::Two).to receive(:create!).with({:key => "val"})
55
+ @factory.create(:key => "val")
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ describe 'FactoryGirl' do
62
+ before do
63
+ allow(Pickle::Adapter::FactoryGirl).to receive(:model_classes).and_return([One, One::Two, Three])
64
+
65
+ if defined? ::FactoryGirl
66
+ @orig_factories = ::FactoryGirl.factories.dup
67
+ ::FactoryGirl.factories.clear
68
+ ::FactoryGirl::Syntax::Default::DSL.new.factory(:one, :class => One) {}
69
+ ::FactoryGirl::Syntax::Default::DSL.new.factory(:two, :class => One::Two) {}
70
+ @factory1 = ::FactoryGirl.factories[:one]
71
+ @factory2 = ::FactoryGirl.factories[:two]
72
+ else
73
+ @orig_factories, Factory.factories = Factory.factories, {}
74
+ Factory.define(:one, :class => One) {}
75
+ Factory.define(:two, :class => One::Two) {}
76
+ @factory1 = Factory.factories[:one]
77
+ @factory2 = Factory.factories[:two]
78
+ end
79
+ end
80
+
81
+ after do
82
+ if defined? ::FactoryGirl
83
+ ::FactoryGirl.factories.clear
84
+ @orig_factories.each {|f| ::FactoryGirl.factories.add(f) }
85
+ else
86
+ Factory.factories = @orig_factories
87
+ end
88
+ end
89
+
90
+ it ".factories should create one for each factory" do
91
+ expect(Pickle::Adapter::FactoryGirl).to receive(:new).with(@factory1, @factory1.name).once
92
+ expect(Pickle::Adapter::FactoryGirl).to receive(:new).with(@factory2, @factory2.name).once
93
+ Pickle::Adapter::FactoryGirl.factories
94
+ end
95
+
96
+ describe ".new(factory, factory_name)" do
97
+ before do
98
+ @factory = Pickle::Adapter::FactoryGirl.new(@factory1, @factory1.name)
99
+ end
100
+
101
+ it "should have name of factory_name" do
102
+ expect(@factory.name).to eq('one')
103
+ end
104
+
105
+ it "should have klass of build_class" do
106
+ expect(@factory.klass).to eq(One)
107
+ end
108
+
109
+ unless defined? ::FactoryGirl
110
+ it "#create(attrs) should call Factory(<:key>, attrs)" do
111
+ expect(Factory).to receive(:create).with("one", {:key => "val"})
112
+ @factory.create(:key => "val")
113
+ end
114
+ end
115
+ end
116
+ end
117
+
118
+ describe 'Fabrication' do
119
+ before do
120
+ @schematic1 = [:one, Fabrication::Schematic::Definition.new(One)]
121
+ @schematic2 = [:two, Fabrication::Schematic::Definition.new(One::Two)]
122
+ allow(::Fabrication.manager).to receive(:schematics).and_return(Hash[[@schematic1, @schematic2]])
123
+ end
124
+
125
+ it '.factories should create one for each fabricator' do
126
+ expect(Pickle::Adapter::Fabrication).to receive(:new).with(@schematic1)
127
+ expect(Pickle::Adapter::Fabrication).to receive(:new).with(@schematic2)
128
+
129
+ Pickle::Adapter::Fabrication.factories
130
+ end
131
+
132
+ describe ".new" do
133
+ before do
134
+ @factory = Pickle::Adapter::Fabrication.new(@schematic1)
135
+ end
136
+
137
+ it ".new should have name of schematic name" do
138
+ expect(@factory.name).to eq('one')
139
+ end
140
+
141
+ it "should have klass of build_class" do
142
+ expect(@factory.klass).to eq(One)
143
+ end
144
+ end
145
+
146
+ describe ".create" do
147
+ it "returns the fabricated instance" do
148
+ @factory = Pickle::Adapter::Fabrication.new(@schematic1)
149
+ expect(Fabricate).to receive(:create).
150
+ with(@factory.name.to_sym, {:attribute => 'value'})
151
+ @factory.create({:attribute => 'value'})
152
+ end
153
+ end
154
+ end
155
+
156
+ describe 'Machinist' do
157
+ before do
158
+ allow(Pickle::Adapter::Machinist).to receive(:model_classes).and_return([One, One::Two, Three])
159
+
160
+ One.blueprint {}
161
+ Three.blueprint {}
162
+ Three.blueprint(:special) {}
163
+ end
164
+
165
+ it ".factories should create one for each master blueprint, and special case" do
166
+ expect(Pickle::Adapter::Machinist).to receive(:new).with(One, :master).once
167
+ expect(Pickle::Adapter::Machinist).to receive(:new).with(Three, :master).once
168
+ expect(Pickle::Adapter::Machinist).to receive(:new).with(Three, :special).once
169
+ Pickle::Adapter::Machinist.factories
170
+ end
171
+
172
+ describe ".new(Class, :master)" do
173
+ before do
174
+ @factory = Pickle::Adapter::Machinist.new(One, :master)
175
+ end
176
+
177
+ it "should have underscored (s/_) name of Class as #name" do
178
+ expect(@factory.name).to eq('one')
179
+ end
180
+
181
+ it "#create(attrs) should call Class.make!(:master, attrs)" do
182
+ expect(One).to receive(:make!).with(:master, {:key => "val"})
183
+ @factory.create(:key => "val")
184
+ end
185
+ end
186
+
187
+ describe ".new(Class, :special)" do
188
+ before do
189
+ @factory = Pickle::Adapter::Machinist.new(Three, :special)
190
+ end
191
+
192
+ it "should have 'special_<Class name>' as #name" do
193
+ expect(@factory.name).to eq('special_three')
194
+ end
195
+
196
+ it "#create(attrs) should call Class.make!(:special, attrs)" do
197
+ expect(Three).to receive(:make!).with(:special, {:key => "val"})
198
+ @factory.create(:key => "val")
199
+ end
200
+ end
201
+ end
202
+ end
203
+ end